Lines Matching refs:cosa
113 struct cosa_data *cosa; /* Pointer to the per-card structure */ member
260 #define is_8bit(cosa) (!(cosa->datareg & 0x08)) argument
262 #define cosa_getstatus(cosa) (cosa_inb(cosa->statusreg)) argument
263 #define cosa_putstatus(cosa, stat) (cosa_outb(stat, cosa->statusreg)) argument
264 #define cosa_getdata16(cosa) (cosa_inw(cosa->datareg)) argument
265 #define cosa_getdata8(cosa) (cosa_inb(cosa->datareg)) argument
266 #define cosa_putdata16(cosa, dt) (cosa_outw(dt, cosa->datareg)) argument
267 #define cosa_putdata8(cosa, dt) (cosa_outb(dt, cosa->datareg)) argument
276 static void cosa_kick(struct cosa_data *cosa);
323 static int cosa_start(struct cosa_data *cosa, int address);
324 static int cosa_reset(struct cosa_data *cosa);
325 static int cosa_download(struct cosa_data *cosa, void __user *a);
326 static int cosa_readmem(struct cosa_data *cosa, void __user *a);
329 static int download(struct cosa_data *cosa, const char __user *data, int addr, int len);
330 static int startmicrocode(struct cosa_data *cosa, int address);
331 static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);
332 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
335 static int get_wait_data(struct cosa_data *cosa);
336 static int put_wait_data(struct cosa_data *cosa, int data);
337 static int puthexnumber(struct cosa_data *cosa, int number);
338 static void put_driver_status(struct cosa_data *cosa);
339 static void put_driver_status_nolock(struct cosa_data *cosa);
342 static irqreturn_t cosa_interrupt(int irq, void *cosa);
346 static void debug_data_in(struct cosa_data *cosa, int data);
347 static void debug_data_out(struct cosa_data *cosa, int data);
348 static void debug_data_cmd(struct cosa_data *cosa, int data);
349 static void debug_status_in(struct cosa_data *cosa, int status);
350 static void debug_status_out(struct cosa_data *cosa, int status);
407 struct cosa_data *cosa; in cosa_exit() local
414 for (cosa = cosa_cards; nr_cards--; cosa++) { in cosa_exit()
416 for (i = 0; i < cosa->nchannels; i++) { in cosa_exit()
418 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_exit()
419 free_netdev(cosa->chan[i].netdev); in cosa_exit()
422 kfree(cosa->chan); in cosa_exit()
423 kfree(cosa->bouncebuf); in cosa_exit()
424 free_irq(cosa->irq, cosa); in cosa_exit()
425 free_dma(cosa->dma); in cosa_exit()
426 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); in cosa_exit()
443 struct cosa_data *cosa = cosa_cards+nr_cards; in cosa_probe() local
446 memset(cosa, 0, sizeof(struct cosa_data)); in cosa_probe()
473 cosa->dma = dma; in cosa_probe()
474 cosa->datareg = base; in cosa_probe()
475 cosa->statusreg = is_8bit(cosa)?base+1:base+2; in cosa_probe()
476 spin_lock_init(&cosa->lock); in cosa_probe()
478 if (!request_region(base, is_8bit(cosa)?2:4,"cosa")) in cosa_probe()
481 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { in cosa_probe()
488 if (!strncmp(cosa->id_string, "SRP", 3)) in cosa_probe()
489 cosa->type = "srp"; in cosa_probe()
490 else if (!strncmp(cosa->id_string, "COSA", 4)) in cosa_probe()
491 cosa->type = is_8bit(cosa)? "cosa8": "cosa16"; in cosa_probe()
501 release_region(base, is_8bit(cosa)?2:4); in cosa_probe()
502 if (!request_region(base, is_8bit(cosa)?2:4, cosa->type)) { in cosa_probe()
519 cosa_putstatus(cosa, SR_TX_INT_ENA); in cosa_probe()
523 cosa_putstatus(cosa, 0); in cosa_probe()
525 cosa_getdata8(cosa); in cosa_probe()
529 irq, cosa->datareg); in cosa_probe()
535 cosa->datareg); in cosa_probe()
540 cosa->irq = irq; in cosa_probe()
541 cosa->num = nr_cards; in cosa_probe()
542 cosa->usage = 0; in cosa_probe()
543 cosa->nchannels = 2; /* FIXME: how to determine this? */ in cosa_probe()
545 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) { in cosa_probe()
549 if (request_dma(cosa->dma, cosa->type)) { in cosa_probe()
554 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL|GFP_DMA); in cosa_probe()
555 if (!cosa->bouncebuf) { in cosa_probe()
559 sprintf(cosa->name, "cosa%d", cosa->num); in cosa_probe()
562 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); in cosa_probe()
563 if (!cosa->chan) { in cosa_probe()
568 for (i = 0; i < cosa->nchannels; i++) { in cosa_probe()
569 struct channel_data *chan = &cosa->chan[i]; in cosa_probe()
571 chan->cosa = cosa; in cosa_probe()
573 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); in cosa_probe()
589 chan->netdev->base_addr = chan->cosa->datareg; in cosa_probe()
590 chan->netdev->irq = chan->cosa->irq; in cosa_probe()
591 chan->netdev->dma = chan->cosa->dma; in cosa_probe()
602 cosa->num, cosa->id_string, cosa->type, in cosa_probe()
603 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); in cosa_probe()
609 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_probe()
610 free_netdev(cosa->chan[i].netdev); in cosa_probe()
612 kfree(cosa->chan); in cosa_probe()
614 kfree(cosa->bouncebuf); in cosa_probe()
616 free_dma(cosa->dma); in cosa_probe()
618 free_irq(cosa->irq, cosa); in cosa_probe()
620 release_region(cosa->datareg,is_8bit(cosa)?2:4); in cosa_probe()
621 pr_notice("cosa%d: allocating resources failed\n", cosa->num); in cosa_probe()
642 if (!(chan->cosa->firmware_status & COSA_FW_START)) { in cosa_net_open()
644 chan->cosa->name, chan->cosa->firmware_status); in cosa_net_open()
647 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
651 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
658 chan->cosa->usage++; in cosa_net_open()
659 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
663 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
665 chan->cosa->usage--; in cosa_net_open()
666 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
691 if (test_bit(RXBIT, &chan->cosa->rxtx)) { in cosa_net_timeout()
698 cosa_kick(chan->cosa); in cosa_net_timeout()
714 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_close()
724 chan->cosa->usage--; in cosa_net_close()
725 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_close()
758 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; in cosa_net_rx_done()
789 struct cosa_data *cosa = chan->cosa; in cosa_read() local
792 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_read()
794 cosa->name, cosa->firmware_status); in cosa_read()
808 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
812 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
814 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
819 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
828 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
863 struct cosa_data *cosa = chan->cosa; in cosa_write() local
867 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_write()
869 cosa->name, cosa->firmware_status); in cosa_write()
892 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
896 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
898 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
904 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
912 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
936 struct cosa_data *cosa; in cosa_open() local
948 cosa = cosa_cards+n; in cosa_open()
951 & ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels) { in cosa_open()
955 chan = cosa->chan + n; in cosa_open()
959 spin_lock_irqsave(&cosa->lock, flags); in cosa_open()
962 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
966 cosa->usage++; in cosa_open()
972 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
981 struct cosa_data *cosa; in cosa_release() local
984 cosa = channel->cosa; in cosa_release()
985 spin_lock_irqsave(&cosa->lock, flags); in cosa_release()
986 cosa->usage--; in cosa_release()
988 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_release()
1011 static inline int cosa_reset(struct cosa_data *cosa) in cosa_reset() argument
1014 if (cosa->usage > 1) in cosa_reset()
1016 cosa->num, cosa->usage); in cosa_reset()
1017 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START); in cosa_reset()
1018 if (cosa_reset_and_read_id(cosa, idstring) < 0) { in cosa_reset()
1019 pr_notice("cosa%d: reset failed\n", cosa->num); in cosa_reset()
1022 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring); in cosa_reset()
1023 cosa->firmware_status |= COSA_FW_RESET; in cosa_reset()
1028 static inline int cosa_download(struct cosa_data *cosa, void __user *arg) in cosa_download() argument
1033 if (cosa->usage > 1) in cosa_download()
1035 cosa->name, cosa->usage); in cosa_download()
1036 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_download()
1038 cosa->name, cosa->firmware_status); in cosa_download()
1052 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_DOWNLOAD); in cosa_download()
1054 i = download(cosa, d.code, d.len, d.addr); in cosa_download()
1057 cosa->num, i); in cosa_download()
1061 cosa->num, d.len, d.addr); in cosa_download()
1062 cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD; in cosa_download()
1067 static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg) in cosa_readmem() argument
1072 if (cosa->usage > 1) in cosa_readmem()
1074 cosa->num, cosa->usage); in cosa_readmem()
1075 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_readmem()
1077 cosa->name, cosa->firmware_status); in cosa_readmem()
1085 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_readmem()
1087 i = readmem(cosa, d.code, d.len, d.addr); in cosa_readmem()
1089 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i); in cosa_readmem()
1093 cosa->num, d.len, d.addr); in cosa_readmem()
1094 cosa->firmware_status |= COSA_FW_RESET; in cosa_readmem()
1099 static inline int cosa_start(struct cosa_data *cosa, int address) in cosa_start() argument
1103 if (cosa->usage > 1) in cosa_start()
1105 cosa->num, cosa->usage); in cosa_start()
1107 if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD)) in cosa_start()
1110 cosa->name, cosa->firmware_status); in cosa_start()
1113 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_start()
1114 if ((i=startmicrocode(cosa, address)) < 0) { in cosa_start()
1116 cosa->num, address, i); in cosa_start()
1119 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address); in cosa_start()
1120 cosa->startaddr = address; in cosa_start()
1121 cosa->firmware_status |= COSA_FW_START; in cosa_start()
1126 static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string) in cosa_getidstr() argument
1128 int l = strlen(cosa->id_string)+1; in cosa_getidstr()
1129 if (copy_to_user(string, cosa->id_string, l)) in cosa_getidstr()
1135 static inline int cosa_gettype(struct cosa_data *cosa, char __user *string) in cosa_gettype() argument
1137 int l = strlen(cosa->type)+1; in cosa_gettype()
1138 if (copy_to_user(string, cosa->type, l)) in cosa_gettype()
1143 static int cosa_ioctl_common(struct cosa_data *cosa, in cosa_ioctl_common() argument
1151 return cosa_reset(cosa); in cosa_ioctl_common()
1155 return cosa_start(cosa, arg); in cosa_ioctl_common()
1160 return cosa_download(cosa, argp); in cosa_ioctl_common()
1164 return cosa_readmem(cosa, argp); in cosa_ioctl_common()
1166 return cosa_gettype(cosa, argp); in cosa_ioctl_common()
1168 return cosa_getidstr(cosa, argp); in cosa_ioctl_common()
1172 return cosa->nchannels; in cosa_ioctl_common()
1176 if (is_8bit(cosa)) in cosa_ioctl_common()
1180 cosa->busmaster = arg; in cosa_ioctl_common()
1183 return cosa->busmaster; in cosa_ioctl_common()
1192 rv = cosa_ioctl_common(chan->cosa, chan, cmd, in cosa_net_ioctl()
1203 struct cosa_data *cosa; in cosa_chardev_ioctl() local
1207 cosa = channel->cosa; in cosa_chardev_ioctl()
1208 ret = cosa_ioctl_common(cosa, channel, cmd, arg); in cosa_chardev_ioctl()
1222 struct cosa_data *cosa = chan->cosa; in cosa_enable_rx() local
1224 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) in cosa_enable_rx()
1225 put_driver_status(cosa); in cosa_enable_rx()
1230 struct cosa_data *cosa = chan->cosa; in cosa_disable_rx() local
1232 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) in cosa_disable_rx()
1233 put_driver_status(cosa); in cosa_disable_rx()
1244 struct cosa_data *cosa = chan->cosa; in cosa_start_tx() local
1250 chan->cosa->num, chan->num, len); in cosa_start_tx()
1255 spin_lock_irqsave(&cosa->lock, flags); in cosa_start_tx()
1260 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_start_tx()
1263 set_bit(chan->num, &cosa->txbitmap); in cosa_start_tx()
1264 put_driver_status(cosa); in cosa_start_tx()
1269 static void put_driver_status(struct cosa_data *cosa) in put_driver_status() argument
1274 spin_lock_irqsave(&cosa->lock, flags); in put_driver_status()
1276 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status()
1277 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status()
1278 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status()
1280 if (!cosa->rxtx) { in put_driver_status()
1281 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status()
1282 if (!cosa->enabled) { in put_driver_status()
1283 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status()
1285 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status()
1287 cosa->enabled = 1; in put_driver_status()
1289 } else if (cosa->enabled) { in put_driver_status()
1290 cosa->enabled = 0; in put_driver_status()
1291 cosa_putstatus(cosa, 0); in put_driver_status()
1293 debug_status_out(cosa, 0); in put_driver_status()
1296 cosa_putdata8(cosa, status); in put_driver_status()
1298 debug_data_cmd(cosa, status); in put_driver_status()
1301 spin_unlock_irqrestore(&cosa->lock, flags); in put_driver_status()
1304 static void put_driver_status_nolock(struct cosa_data *cosa) in put_driver_status_nolock() argument
1308 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status_nolock()
1309 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status_nolock()
1310 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status_nolock()
1313 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status_nolock()
1314 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1316 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1318 cosa->enabled = 1; in put_driver_status_nolock()
1320 cosa_putstatus(cosa, 0); in put_driver_status_nolock()
1322 debug_status_out(cosa, 0); in put_driver_status_nolock()
1324 cosa->enabled = 0; in put_driver_status_nolock()
1326 cosa_putdata8(cosa, status); in put_driver_status_nolock()
1328 debug_data_cmd(cosa, status); in put_driver_status_nolock()
1337 static void cosa_kick(struct cosa_data *cosa) in cosa_kick() argument
1342 if (test_bit(RXBIT, &cosa->rxtx)) in cosa_kick()
1344 if (test_bit(TXBIT, &cosa->rxtx)) in cosa_kick()
1347 pr_info("%s: %s timeout - restarting\n", cosa->name, s); in cosa_kick()
1348 spin_lock_irqsave(&cosa->lock, flags); in cosa_kick()
1349 cosa->rxtx = 0; in cosa_kick()
1352 disable_dma(cosa->dma); in cosa_kick()
1353 clear_dma_ff(cosa->dma); in cosa_kick()
1358 cosa_putstatus(cosa, 0); in cosa_kick()
1360 (void) cosa_getdata8(cosa); in cosa_kick()
1362 cosa_putdata8(cosa, 0); in cosa_kick()
1364 put_driver_status_nolock(cosa); in cosa_kick()
1365 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_kick()
1399 static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address) in download() argument
1403 if (put_wait_data(cosa, 'w') == -1) return -1; in download()
1404 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;} in download()
1405 if (get_wait_data(cosa) != '=') return -3; in download()
1407 if (puthexnumber(cosa, address) < 0) return -4; in download()
1408 if (put_wait_data(cosa, ' ') == -1) return -10; in download()
1409 if (get_wait_data(cosa) != ' ') return -11; in download()
1410 if (get_wait_data(cosa) != '=') return -12; in download()
1412 if (puthexnumber(cosa, address+length-1) < 0) return -13; in download()
1413 if (put_wait_data(cosa, ' ') == -1) return -18; in download()
1414 if (get_wait_data(cosa) != ' ') return -19; in download()
1424 if (put_wait_data(cosa, c) == -1) in download()
1429 if (get_wait_data(cosa) != '\r') return -21; in download()
1430 if (get_wait_data(cosa) != '\n') return -22; in download()
1431 if (get_wait_data(cosa) != '.') return -23; in download()
1433 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num); in download()
1444 static int startmicrocode(struct cosa_data *cosa, int address) in startmicrocode() argument
1446 if (put_wait_data(cosa, 'g') == -1) return -1; in startmicrocode()
1447 if (get_wait_data(cosa) != 'g') return -2; in startmicrocode()
1448 if (get_wait_data(cosa) != '=') return -3; in startmicrocode()
1450 if (puthexnumber(cosa, address) < 0) return -4; in startmicrocode()
1451 if (put_wait_data(cosa, '\r') == -1) return -5; in startmicrocode()
1453 if (get_wait_data(cosa) != '\r') return -6; in startmicrocode()
1454 if (get_wait_data(cosa) != '\r') return -7; in startmicrocode()
1455 if (get_wait_data(cosa) != '\n') return -8; in startmicrocode()
1456 if (get_wait_data(cosa) != '\r') return -9; in startmicrocode()
1457 if (get_wait_data(cosa) != '\n') return -10; in startmicrocode()
1459 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num); in startmicrocode()
1473 static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address) in readmem() argument
1475 if (put_wait_data(cosa, 'r') == -1) return -1; in readmem()
1476 if ((get_wait_data(cosa)) != 'r') return -2; in readmem()
1477 if ((get_wait_data(cosa)) != '=') return -3; in readmem()
1479 if (puthexnumber(cosa, address) < 0) return -4; in readmem()
1480 if (put_wait_data(cosa, ' ') == -1) return -5; in readmem()
1481 if (get_wait_data(cosa) != ' ') return -6; in readmem()
1482 if (get_wait_data(cosa) != '=') return -7; in readmem()
1484 if (puthexnumber(cosa, address+length-1) < 0) return -8; in readmem()
1485 if (put_wait_data(cosa, ' ') == -1) return -9; in readmem()
1486 if (get_wait_data(cosa) != ' ') return -10; in readmem()
1491 if ((i=get_wait_data(cosa)) == -1) { in readmem()
1505 if (get_wait_data(cosa) != '\r') return -21; in readmem()
1506 if (get_wait_data(cosa) != '\n') return -22; in readmem()
1507 if (get_wait_data(cosa) != '.') return -23; in readmem()
1509 printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num); in readmem()
1518 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring) in cosa_reset_and_read_id() argument
1523 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1524 cosa_getdata8(cosa); in cosa_reset_and_read_id()
1525 cosa_putstatus(cosa, SR_RST); in cosa_reset_and_read_id()
1528 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1539 if ((curr = get_wait_data(cosa)) == -1) { in cosa_reset_and_read_id()
1561 static int get_wait_data(struct cosa_data *cosa) in get_wait_data() argument
1567 if (cosa_getstatus(cosa) & SR_RX_RDY) { in get_wait_data()
1569 r = cosa_getdata8(cosa); in get_wait_data()
1580 cosa_getstatus(cosa)); in get_wait_data()
1589 static int put_wait_data(struct cosa_data *cosa, int data) in put_wait_data() argument
1594 if (cosa_getstatus(cosa) & SR_TX_RDY) { in put_wait_data()
1595 cosa_putdata8(cosa, data); in put_wait_data()
1607 cosa->num, cosa_getstatus(cosa)); in put_wait_data()
1617 static int puthexnumber(struct cosa_data *cosa, int number) in puthexnumber() argument
1625 if (put_wait_data(cosa, temp[i]) == -1) { in puthexnumber()
1627 cosa->num, i); in puthexnumber()
1630 if (get_wait_data(cosa) != temp[i]) { in puthexnumber()
1632 cosa->num, i); in puthexnumber()
1673 static inline void tx_interrupt(struct cosa_data *cosa, int status) in tx_interrupt() argument
1677 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status); in tx_interrupt()
1679 spin_lock_irqsave(&cosa->lock, flags); in tx_interrupt()
1680 set_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1681 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1684 if (!cosa->txbitmap) { in tx_interrupt()
1686 cosa->name); in tx_interrupt()
1687 put_driver_status_nolock(cosa); in tx_interrupt()
1688 clear_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1689 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1693 cosa->txchan++; in tx_interrupt()
1695 if (cosa->txchan >= cosa->nchannels) in tx_interrupt()
1696 cosa->txchan = 0; in tx_interrupt()
1697 if (!(cosa->txbitmap & (1<<cosa->txchan))) in tx_interrupt()
1699 if (~status & (1 << (cosa->txchan+DRIVER_TXMAP_SHIFT))) in tx_interrupt()
1702 if (i > cosa->nchannels) { in tx_interrupt()
1707 cosa->name, cosa->txchan); in tx_interrupt()
1713 cosa->txsize = cosa->chan[cosa->txchan].txsize; in tx_interrupt()
1714 if (cosa_dma_able(cosa->chan+cosa->txchan, in tx_interrupt()
1715 cosa->chan[cosa->txchan].txbuf, cosa->txsize)) { in tx_interrupt()
1716 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; in tx_interrupt()
1718 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1719 cosa->txsize); in tx_interrupt()
1720 cosa->txbuf = cosa->bouncebuf; in tx_interrupt()
1724 if (is_8bit(cosa)) { in tx_interrupt()
1725 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1726 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1727 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1728 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1730 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1731 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1732 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1733 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1735 cosa_getdata8(cosa); in tx_interrupt()
1737 set_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1738 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1741 clear_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1742 cosa_putstatus(cosa, 0); in tx_interrupt()
1743 cosa_putdata8(cosa, cosa->txsize&0xff); in tx_interrupt()
1745 debug_status_out(cosa, 0); in tx_interrupt()
1746 debug_data_out(cosa, cosa->txsize&0xff); in tx_interrupt()
1750 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1751 cosa_putdata16(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1752 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1754 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1755 debug_data_out(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1756 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1757 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1758 debug_status_out(cosa, 0); in tx_interrupt()
1760 cosa_getdata8(cosa); in tx_interrupt()
1762 cosa_putstatus(cosa, 0); in tx_interrupt()
1765 if (cosa->busmaster) { in tx_interrupt()
1766 unsigned long addr = virt_to_bus(cosa->txbuf); in tx_interrupt()
1769 while (!(cosa_getstatus(cosa)&SR_TX_RDY)) { in tx_interrupt()
1774 pr_info("status %x\n", cosa_getstatus(cosa)); in tx_interrupt()
1776 cosa_putdata16(cosa, (addr >> 16)&0xffff); in tx_interrupt()
1779 while (!(cosa_getstatus(cosa)&SR_TX_RDY)) { in tx_interrupt()
1785 cosa_putdata16(cosa, addr &0xffff); in tx_interrupt()
1787 set_dma_mode(cosa->dma, DMA_MODE_CASCADE); in tx_interrupt()
1788 enable_dma(cosa->dma); in tx_interrupt()
1793 disable_dma(cosa->dma); in tx_interrupt()
1794 clear_dma_ff(cosa->dma); in tx_interrupt()
1795 set_dma_mode(cosa->dma, DMA_MODE_WRITE); in tx_interrupt()
1796 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf)); in tx_interrupt()
1797 set_dma_count(cosa->dma, cosa->txsize); in tx_interrupt()
1798 enable_dma(cosa->dma); in tx_interrupt()
1801 cosa_putstatus(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1803 debug_status_out(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1805 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1808 static inline void rx_interrupt(struct cosa_data *cosa, int status) in rx_interrupt() argument
1812 pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num); in rx_interrupt()
1815 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1816 set_bit(RXBIT, &cosa->rxtx); in rx_interrupt()
1818 if (is_8bit(cosa)) { in rx_interrupt()
1819 if (!test_bit(IRQBIT, &cosa->rxtx)) { in rx_interrupt()
1820 set_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1821 put_driver_status_nolock(cosa); in rx_interrupt()
1822 cosa->rxsize = cosa_getdata8(cosa) <<8; in rx_interrupt()
1824 debug_data_in(cosa, cosa->rxsize >> 8); in rx_interrupt()
1826 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1829 clear_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1830 cosa->rxsize |= cosa_getdata8(cosa) & 0xff; in rx_interrupt()
1832 debug_data_in(cosa, cosa->rxsize & 0xff); in rx_interrupt()
1836 cosa->num, cosa->rxsize); in rx_interrupt()
1840 cosa->rxsize = cosa_getdata16(cosa); in rx_interrupt()
1842 debug_data_in(cosa, cosa->rxsize); in rx_interrupt()
1846 cosa->num, cosa->rxsize); in rx_interrupt()
1849 if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) { in rx_interrupt()
1851 cosa->name, cosa->rxsize); in rx_interrupt()
1852 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1855 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13); in rx_interrupt()
1856 cosa->rxsize &= 0x1fff; in rx_interrupt()
1857 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1859 cosa->rxbuf = NULL; in rx_interrupt()
1860 if (cosa->rxchan->setup_rx) in rx_interrupt()
1861 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize); in rx_interrupt()
1863 if (!cosa->rxbuf) { in rx_interrupt()
1866 cosa->num, cosa->rxchan->num); in rx_interrupt()
1867 cosa->rxbuf = cosa->bouncebuf; in rx_interrupt()
1872 disable_dma(cosa->dma); in rx_interrupt()
1873 clear_dma_ff(cosa->dma); in rx_interrupt()
1874 set_dma_mode(cosa->dma, DMA_MODE_READ); in rx_interrupt()
1875 if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff)) { in rx_interrupt()
1876 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf)); in rx_interrupt()
1878 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf)); in rx_interrupt()
1880 set_dma_count(cosa->dma, (cosa->rxsize&0x1fff)); in rx_interrupt()
1881 enable_dma(cosa->dma); in rx_interrupt()
1883 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1884 cosa_putstatus(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1885 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1886 cosa_putdata8(cosa, DRIVER_RX_READY); in rx_interrupt()
1888 debug_status_out(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1889 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1890 debug_data_cmd(cosa, DRIVER_RX_READY); in rx_interrupt()
1892 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1895 static inline void eot_interrupt(struct cosa_data *cosa, int status) in eot_interrupt() argument
1898 spin_lock_irqsave(&cosa->lock, flags); in eot_interrupt()
1900 disable_dma(cosa->dma); in eot_interrupt()
1901 clear_dma_ff(cosa->dma); in eot_interrupt()
1903 if (test_bit(TXBIT, &cosa->rxtx)) { in eot_interrupt()
1904 struct channel_data *chan = cosa->chan+cosa->txchan; in eot_interrupt()
1906 if (chan->tx_done(chan, cosa->txsize)) in eot_interrupt()
1907 clear_bit(chan->num, &cosa->txbitmap); in eot_interrupt()
1908 } else if (test_bit(RXBIT, &cosa->rxtx)) { in eot_interrupt()
1913 cosa->num, cosa->rxchan->num, cosa->rxsize); in eot_interrupt()
1914 for (i=0; i<cosa->rxsize; i++) in eot_interrupt()
1915 pr_cont(" %02x", cosa->rxbuf[i]&0xff); in eot_interrupt()
1920 if (cosa->rxbuf == cosa->bouncebuf) in eot_interrupt()
1922 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize)) in eot_interrupt()
1923 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize); in eot_interrupt()
1924 if (cosa->rxchan->rx_done) in eot_interrupt()
1925 if (cosa->rxchan->rx_done(cosa->rxchan)) in eot_interrupt()
1926 clear_bit(cosa->rxchan->num, &cosa->rxbitmap); in eot_interrupt()
1928 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num); in eot_interrupt()
1937 cosa->rxtx = 0; in eot_interrupt()
1938 put_driver_status_nolock(cosa); in eot_interrupt()
1939 spin_unlock_irqrestore(&cosa->lock, flags); in eot_interrupt()
1946 struct cosa_data *cosa = cosa_; in cosa_interrupt() local
1948 status = cosa_getstatus(cosa); in cosa_interrupt()
1950 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff); in cosa_interrupt()
1953 debug_status_in(cosa, status); in cosa_interrupt()
1957 tx_interrupt(cosa, status); in cosa_interrupt()
1960 rx_interrupt(cosa, status); in cosa_interrupt()
1963 eot_interrupt(cosa, status); in cosa_interrupt()
1972 cosa->num, status & 0xff, count); in cosa_interrupt()
1977 cosa->name, count); in cosa_interrupt()
1979 pr_info("%s: returning from IRQ\n", cosa->name); in cosa_interrupt()
1993 static void debug_status_in(struct cosa_data *cosa, int status) in debug_status_in() argument
2011 cosa->name, in debug_status_in()
2019 static void debug_status_out(struct cosa_data *cosa, int status) in debug_status_out() argument
2022 cosa->name, in debug_status_out()
2032 static void debug_data_in(struct cosa_data *cosa, int data) in debug_data_in() argument
2034 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data); in debug_data_in()
2037 static void debug_data_out(struct cosa_data *cosa, int data) in debug_data_out() argument
2039 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data); in debug_data_out()
2042 static void debug_data_cmd(struct cosa_data *cosa, int data) in debug_data_cmd() argument
2045 cosa->name, data, in debug_data_cmd()