Lines Matching refs:cosa
98 struct cosa_data *cosa; /* Pointer to the per-card structure */ member
241 #define is_8bit(cosa) (!((cosa)->datareg & 0x08)) argument
243 #define cosa_getstatus(cosa) (cosa_inb((cosa)->statusreg)) argument
244 #define cosa_putstatus(cosa, stat) (cosa_outb(stat, (cosa)->statusreg)) argument
245 #define cosa_getdata16(cosa) (cosa_inw((cosa)->datareg)) argument
246 #define cosa_getdata8(cosa) (cosa_inb((cosa)->datareg)) argument
247 #define cosa_putdata16(cosa, dt) (cosa_outw(dt, (cosa)->datareg)) argument
248 #define cosa_putdata8(cosa, dt) (cosa_outb(dt, (cosa)->datareg)) argument
257 static void cosa_kick(struct cosa_data *cosa);
303 static int cosa_start(struct cosa_data *cosa, int address);
304 static int cosa_reset(struct cosa_data *cosa);
305 static int cosa_download(struct cosa_data *cosa, void __user *a);
306 static int cosa_readmem(struct cosa_data *cosa, void __user *a);
309 static int download(struct cosa_data *cosa, const char __user *data, int addr, int len);
310 static int startmicrocode(struct cosa_data *cosa, int address);
311 static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);
312 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
315 static int get_wait_data(struct cosa_data *cosa);
316 static int put_wait_data(struct cosa_data *cosa, int data);
317 static int puthexnumber(struct cosa_data *cosa, int number);
318 static void put_driver_status(struct cosa_data *cosa);
319 static void put_driver_status_nolock(struct cosa_data *cosa);
322 static irqreturn_t cosa_interrupt(int irq, void *cosa);
326 static void debug_data_in(struct cosa_data *cosa, int data);
327 static void debug_data_out(struct cosa_data *cosa, int data);
328 static void debug_data_cmd(struct cosa_data *cosa, int data);
329 static void debug_status_in(struct cosa_data *cosa, int status);
330 static void debug_status_out(struct cosa_data *cosa, int status);
388 struct cosa_data *cosa; in cosa_exit() local
395 for (cosa = cosa_cards; nr_cards--; cosa++) { in cosa_exit()
397 for (i = 0; i < cosa->nchannels; i++) { in cosa_exit()
399 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_exit()
400 free_netdev(cosa->chan[i].netdev); in cosa_exit()
403 kfree(cosa->chan); in cosa_exit()
404 kfree(cosa->bouncebuf); in cosa_exit()
405 free_irq(cosa->irq, cosa); in cosa_exit()
406 free_dma(cosa->dma); in cosa_exit()
407 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); in cosa_exit()
423 struct cosa_data *cosa = cosa_cards + nr_cards; in cosa_probe() local
426 memset(cosa, 0, sizeof(struct cosa_data)); in cosa_probe()
455 cosa->dma = dma; in cosa_probe()
456 cosa->datareg = base; in cosa_probe()
457 cosa->statusreg = is_8bit(cosa) ? base + 1 : base + 2; in cosa_probe()
458 spin_lock_init(&cosa->lock); in cosa_probe()
460 if (!request_region(base, is_8bit(cosa) ? 2 : 4, "cosa")) in cosa_probe()
463 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { in cosa_probe()
470 if (!strncmp(cosa->id_string, "SRP", 3)) { in cosa_probe()
471 cosa->type = "srp"; in cosa_probe()
472 } else if (!strncmp(cosa->id_string, "COSA", 4)) { in cosa_probe()
473 cosa->type = is_8bit(cosa) ? "cosa8" : "cosa16"; in cosa_probe()
483 release_region(base, is_8bit(cosa) ? 2 : 4); in cosa_probe()
484 if (!request_region(base, is_8bit(cosa) ? 2 : 4, cosa->type)) { in cosa_probe()
500 cosa_putstatus(cosa, SR_TX_INT_ENA); in cosa_probe()
504 cosa_putstatus(cosa, 0); in cosa_probe()
506 cosa_getdata8(cosa); in cosa_probe()
510 irq, cosa->datareg); in cosa_probe()
516 cosa->datareg); in cosa_probe()
521 cosa->irq = irq; in cosa_probe()
522 cosa->num = nr_cards; in cosa_probe()
523 cosa->usage = 0; in cosa_probe()
524 cosa->nchannels = 2; /* FIXME: how to determine this? */ in cosa_probe()
526 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) { in cosa_probe()
530 if (request_dma(cosa->dma, cosa->type)) { in cosa_probe()
535 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL | GFP_DMA); in cosa_probe()
536 if (!cosa->bouncebuf) { in cosa_probe()
540 sprintf(cosa->name, "cosa%d", cosa->num); in cosa_probe()
543 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); in cosa_probe()
544 if (!cosa->chan) { in cosa_probe()
549 for (i = 0; i < cosa->nchannels; i++) { in cosa_probe()
550 struct channel_data *chan = &cosa->chan[i]; in cosa_probe()
552 chan->cosa = cosa; in cosa_probe()
554 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); in cosa_probe()
571 chan->netdev->base_addr = chan->cosa->datareg; in cosa_probe()
572 chan->netdev->irq = chan->cosa->irq; in cosa_probe()
573 chan->netdev->dma = chan->cosa->dma; in cosa_probe()
584 cosa->num, cosa->id_string, cosa->type, in cosa_probe()
585 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); in cosa_probe()
591 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_probe()
592 free_netdev(cosa->chan[i].netdev); in cosa_probe()
594 kfree(cosa->chan); in cosa_probe()
596 kfree(cosa->bouncebuf); in cosa_probe()
598 free_dma(cosa->dma); in cosa_probe()
600 free_irq(cosa->irq, cosa); in cosa_probe()
602 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); in cosa_probe()
603 pr_notice("cosa%d: allocating resources failed\n", cosa->num); in cosa_probe()
623 if (!(chan->cosa->firmware_status & COSA_FW_START)) { in cosa_net_open()
625 chan->cosa->name, chan->cosa->firmware_status); in cosa_net_open()
628 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
632 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
639 chan->cosa->usage++; in cosa_net_open()
640 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
644 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
646 chan->cosa->usage--; in cosa_net_open()
647 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
672 if (test_bit(RXBIT, &chan->cosa->rxtx)) { in cosa_net_timeout()
679 cosa_kick(chan->cosa); in cosa_net_timeout()
695 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_close()
705 chan->cosa->usage--; in cosa_net_close()
706 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_close()
738 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; in cosa_net_rx_done()
769 struct cosa_data *cosa = chan->cosa; in cosa_read() local
772 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_read()
774 cosa->name, cosa->firmware_status); in cosa_read()
788 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
792 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
794 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
799 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
808 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
842 struct cosa_data *cosa = chan->cosa; in cosa_write() local
846 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_write()
848 cosa->name, cosa->firmware_status); in cosa_write()
871 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
875 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
877 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
883 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
892 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
916 struct cosa_data *cosa; in cosa_open() local
928 cosa = cosa_cards + n; in cosa_open()
931 if (n >= cosa->nchannels) { in cosa_open()
935 chan = cosa->chan + n; in cosa_open()
939 spin_lock_irqsave(&cosa->lock, flags); in cosa_open()
942 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
946 cosa->usage++; in cosa_open()
952 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
961 struct cosa_data *cosa; in cosa_release() local
964 cosa = channel->cosa; in cosa_release()
965 spin_lock_irqsave(&cosa->lock, flags); in cosa_release()
966 cosa->usage--; in cosa_release()
968 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_release()
989 static inline int cosa_reset(struct cosa_data *cosa) in cosa_reset() argument
993 if (cosa->usage > 1) in cosa_reset()
995 cosa->num, cosa->usage); in cosa_reset()
996 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_START); in cosa_reset()
997 if (cosa_reset_and_read_id(cosa, idstring) < 0) { in cosa_reset()
998 pr_notice("cosa%d: reset failed\n", cosa->num); in cosa_reset()
1001 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring); in cosa_reset()
1002 cosa->firmware_status |= COSA_FW_RESET; in cosa_reset()
1007 static inline int cosa_download(struct cosa_data *cosa, void __user *arg) in cosa_download() argument
1012 if (cosa->usage > 1) in cosa_download()
1014 cosa->name, cosa->usage); in cosa_download()
1015 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_download()
1017 cosa->name, cosa->firmware_status); in cosa_download()
1030 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_DOWNLOAD); in cosa_download()
1032 i = download(cosa, d.code, d.len, d.addr); in cosa_download()
1035 cosa->num, i); in cosa_download()
1039 cosa->num, d.len, d.addr); in cosa_download()
1040 cosa->firmware_status |= COSA_FW_RESET | COSA_FW_DOWNLOAD; in cosa_download()
1045 static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg) in cosa_readmem() argument
1050 if (cosa->usage > 1) in cosa_readmem()
1052 cosa->num, cosa->usage); in cosa_readmem()
1053 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_readmem()
1055 cosa->name, cosa->firmware_status); in cosa_readmem()
1063 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_readmem()
1065 i = readmem(cosa, d.code, d.len, d.addr); in cosa_readmem()
1067 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i); in cosa_readmem()
1071 cosa->num, d.len, d.addr); in cosa_readmem()
1072 cosa->firmware_status |= COSA_FW_RESET; in cosa_readmem()
1077 static inline int cosa_start(struct cosa_data *cosa, int address) in cosa_start() argument
1081 if (cosa->usage > 1) in cosa_start()
1083 cosa->num, cosa->usage); in cosa_start()
1085 if ((cosa->firmware_status & (COSA_FW_RESET | COSA_FW_DOWNLOAD)) in cosa_start()
1088 cosa->name, cosa->firmware_status); in cosa_start()
1091 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_start()
1092 i = startmicrocode(cosa, address); in cosa_start()
1095 cosa->num, address, i); in cosa_start()
1098 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address); in cosa_start()
1099 cosa->startaddr = address; in cosa_start()
1100 cosa->firmware_status |= COSA_FW_START; in cosa_start()
1105 static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string) in cosa_getidstr() argument
1107 int l = strlen(cosa->id_string) + 1; in cosa_getidstr()
1109 if (copy_to_user(string, cosa->id_string, l)) in cosa_getidstr()
1115 static inline int cosa_gettype(struct cosa_data *cosa, char __user *string) in cosa_gettype() argument
1117 int l = strlen(cosa->type) + 1; in cosa_gettype()
1119 if (copy_to_user(string, cosa->type, l)) in cosa_gettype()
1124 static int cosa_ioctl_common(struct cosa_data *cosa, in cosa_ioctl_common() argument
1134 return cosa_reset(cosa); in cosa_ioctl_common()
1138 return cosa_start(cosa, arg); in cosa_ioctl_common()
1143 return cosa_download(cosa, argp); in cosa_ioctl_common()
1147 return cosa_readmem(cosa, argp); in cosa_ioctl_common()
1149 return cosa_gettype(cosa, argp); in cosa_ioctl_common()
1151 return cosa_getidstr(cosa, argp); in cosa_ioctl_common()
1155 return cosa->nchannels; in cosa_ioctl_common()
1159 if (is_8bit(cosa)) in cosa_ioctl_common()
1163 cosa->busmaster = arg; in cosa_ioctl_common()
1166 return cosa->busmaster; in cosa_ioctl_common()
1175 struct cosa_data *cosa; in cosa_chardev_ioctl() local
1179 cosa = channel->cosa; in cosa_chardev_ioctl()
1180 ret = cosa_ioctl_common(cosa, channel, cmd, arg); in cosa_chardev_ioctl()
1192 struct cosa_data *cosa = chan->cosa; in cosa_enable_rx() local
1194 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) in cosa_enable_rx()
1195 put_driver_status(cosa); in cosa_enable_rx()
1200 struct cosa_data *cosa = chan->cosa; in cosa_disable_rx() local
1202 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) in cosa_disable_rx()
1203 put_driver_status(cosa); in cosa_disable_rx()
1213 struct cosa_data *cosa = chan->cosa; in cosa_start_tx() local
1219 chan->cosa->num, chan->num, len); in cosa_start_tx()
1224 spin_lock_irqsave(&cosa->lock, flags); in cosa_start_tx()
1229 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_start_tx()
1232 set_bit(chan->num, &cosa->txbitmap); in cosa_start_tx()
1233 put_driver_status(cosa); in cosa_start_tx()
1238 static void put_driver_status(struct cosa_data *cosa) in put_driver_status() argument
1243 spin_lock_irqsave(&cosa->lock, flags); in put_driver_status()
1245 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status()
1246 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status()
1247 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT) in put_driver_status()
1249 if (!cosa->rxtx) { in put_driver_status()
1250 if (cosa->rxbitmap | cosa->txbitmap) { in put_driver_status()
1251 if (!cosa->enabled) { in put_driver_status()
1252 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status()
1254 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status()
1256 cosa->enabled = 1; in put_driver_status()
1258 } else if (cosa->enabled) { in put_driver_status()
1259 cosa->enabled = 0; in put_driver_status()
1260 cosa_putstatus(cosa, 0); in put_driver_status()
1262 debug_status_out(cosa, 0); in put_driver_status()
1265 cosa_putdata8(cosa, status); in put_driver_status()
1267 debug_data_cmd(cosa, status); in put_driver_status()
1270 spin_unlock_irqrestore(&cosa->lock, flags); in put_driver_status()
1273 static void put_driver_status_nolock(struct cosa_data *cosa) in put_driver_status_nolock() argument
1277 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status_nolock()
1278 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status_nolock()
1279 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT) in put_driver_status_nolock()
1282 if (cosa->rxbitmap | cosa->txbitmap) { in put_driver_status_nolock()
1283 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1285 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1287 cosa->enabled = 1; in put_driver_status_nolock()
1289 cosa_putstatus(cosa, 0); in put_driver_status_nolock()
1291 debug_status_out(cosa, 0); in put_driver_status_nolock()
1293 cosa->enabled = 0; in put_driver_status_nolock()
1295 cosa_putdata8(cosa, status); in put_driver_status_nolock()
1297 debug_data_cmd(cosa, status); in put_driver_status_nolock()
1305 static void cosa_kick(struct cosa_data *cosa) in cosa_kick() argument
1310 if (test_bit(RXBIT, &cosa->rxtx)) in cosa_kick()
1312 if (test_bit(TXBIT, &cosa->rxtx)) in cosa_kick()
1315 pr_info("%s: %s timeout - restarting\n", cosa->name, s); in cosa_kick()
1316 spin_lock_irqsave(&cosa->lock, flags); in cosa_kick()
1317 cosa->rxtx = 0; in cosa_kick()
1320 disable_dma(cosa->dma); in cosa_kick()
1321 clear_dma_ff(cosa->dma); in cosa_kick()
1326 cosa_putstatus(cosa, 0); in cosa_kick()
1328 (void)cosa_getdata8(cosa); in cosa_kick()
1330 cosa_putdata8(cosa, 0); in cosa_kick()
1332 put_driver_status_nolock(cosa); in cosa_kick()
1333 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_kick()
1365 static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address) in download() argument
1369 if (put_wait_data(cosa, 'w') == -1) in download()
1371 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;} in download()
1372 if (get_wait_data(cosa) != '=') in download()
1375 if (puthexnumber(cosa, address) < 0) in download()
1377 if (put_wait_data(cosa, ' ') == -1) in download()
1379 if (get_wait_data(cosa) != ' ') in download()
1381 if (get_wait_data(cosa) != '=') in download()
1384 if (puthexnumber(cosa, address + length - 1) < 0) in download()
1386 if (put_wait_data(cosa, ' ') == -1) in download()
1388 if (get_wait_data(cosa) != ' ') in download()
1399 if (put_wait_data(cosa, c) == -1) in download()
1404 if (get_wait_data(cosa) != '\r') in download()
1406 if (get_wait_data(cosa) != '\n') in download()
1408 if (get_wait_data(cosa) != '.') in download()
1411 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num); in download()
1420 static int startmicrocode(struct cosa_data *cosa, int address) in startmicrocode() argument
1422 if (put_wait_data(cosa, 'g') == -1) in startmicrocode()
1424 if (get_wait_data(cosa) != 'g') in startmicrocode()
1426 if (get_wait_data(cosa) != '=') in startmicrocode()
1429 if (puthexnumber(cosa, address) < 0) in startmicrocode()
1431 if (put_wait_data(cosa, '\r') == -1) in startmicrocode()
1434 if (get_wait_data(cosa) != '\r') in startmicrocode()
1436 if (get_wait_data(cosa) != '\r') in startmicrocode()
1438 if (get_wait_data(cosa) != '\n') in startmicrocode()
1440 if (get_wait_data(cosa) != '\r') in startmicrocode()
1442 if (get_wait_data(cosa) != '\n') in startmicrocode()
1445 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num); in startmicrocode()
1458 static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address) in readmem() argument
1460 if (put_wait_data(cosa, 'r') == -1) in readmem()
1462 if ((get_wait_data(cosa)) != 'r') in readmem()
1464 if ((get_wait_data(cosa)) != '=') in readmem()
1467 if (puthexnumber(cosa, address) < 0) in readmem()
1469 if (put_wait_data(cosa, ' ') == -1) in readmem()
1471 if (get_wait_data(cosa) != ' ') in readmem()
1473 if (get_wait_data(cosa) != '=') in readmem()
1476 if (puthexnumber(cosa, address + length - 1) < 0) in readmem()
1478 if (put_wait_data(cosa, ' ') == -1) in readmem()
1480 if (get_wait_data(cosa) != ' ') in readmem()
1487 i = get_wait_data(cosa); in readmem()
1502 if (get_wait_data(cosa) != '\r') in readmem()
1504 if (get_wait_data(cosa) != '\n') in readmem()
1506 if (get_wait_data(cosa) != '.') in readmem()
1509 printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num); in readmem()
1517 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring) in cosa_reset_and_read_id() argument
1522 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1523 cosa_getdata8(cosa); in cosa_reset_and_read_id()
1524 cosa_putstatus(cosa, SR_RST); in cosa_reset_and_read_id()
1527 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1537 curr = get_wait_data(cosa); in cosa_reset_and_read_id()
1558 static int get_wait_data(struct cosa_data *cosa) in get_wait_data() argument
1564 if (cosa_getstatus(cosa) & SR_RX_RDY) { in get_wait_data()
1567 r = cosa_getdata8(cosa); in get_wait_data()
1578 cosa_getstatus(cosa)); in get_wait_data()
1586 static int put_wait_data(struct cosa_data *cosa, int data) in put_wait_data() argument
1592 if (cosa_getstatus(cosa) & SR_TX_RDY) { in put_wait_data()
1593 cosa_putdata8(cosa, data); in put_wait_data()
1605 cosa->num, cosa_getstatus(cosa)); in put_wait_data()
1614 static int puthexnumber(struct cosa_data *cosa, int number) in puthexnumber() argument
1622 if (put_wait_data(cosa, temp[i]) == -1) { in puthexnumber()
1624 cosa->num, i); in puthexnumber()
1627 if (get_wait_data(cosa) != temp[i]) { in puthexnumber()
1629 cosa->num, i); in puthexnumber()
1667 static inline void tx_interrupt(struct cosa_data *cosa, int status) in tx_interrupt() argument
1671 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status); in tx_interrupt()
1673 spin_lock_irqsave(&cosa->lock, flags); in tx_interrupt()
1674 set_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1675 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1679 if (!cosa->txbitmap) { in tx_interrupt()
1681 cosa->name); in tx_interrupt()
1682 put_driver_status_nolock(cosa); in tx_interrupt()
1683 clear_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1684 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1688 cosa->txchan++; in tx_interrupt()
1690 if (cosa->txchan >= cosa->nchannels) in tx_interrupt()
1691 cosa->txchan = 0; in tx_interrupt()
1692 if (!(cosa->txbitmap & (1 << cosa->txchan))) in tx_interrupt()
1695 (1 << (cosa->txchan + DRIVER_TXMAP_SHIFT))) in tx_interrupt()
1698 if (i > cosa->nchannels) { in tx_interrupt()
1703 cosa->name, cosa->txchan); in tx_interrupt()
1709 cosa->txsize = cosa->chan[cosa->txchan].txsize; in tx_interrupt()
1710 if (cosa_dma_able(cosa->chan + cosa->txchan, in tx_interrupt()
1711 cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1712 cosa->txsize)) { in tx_interrupt()
1713 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; in tx_interrupt()
1715 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1716 cosa->txsize); in tx_interrupt()
1717 cosa->txbuf = cosa->bouncebuf; in tx_interrupt()
1721 if (is_8bit(cosa)) { in tx_interrupt()
1722 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1723 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1724 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0) | in tx_interrupt()
1725 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1727 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1728 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0) | in tx_interrupt()
1729 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1730 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1732 cosa_getdata8(cosa); in tx_interrupt()
1734 set_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1735 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1738 clear_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1739 cosa_putstatus(cosa, 0); in tx_interrupt()
1740 cosa_putdata8(cosa, cosa->txsize & 0xff); in tx_interrupt()
1742 debug_status_out(cosa, 0); in tx_interrupt()
1743 debug_data_out(cosa, cosa->txsize & 0xff); in tx_interrupt()
1747 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1748 cosa_putdata16(cosa, ((cosa->txchan << 13) & 0xe000) in tx_interrupt()
1749 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1751 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1752 debug_data_out(cosa, ((cosa->txchan << 13) & 0xe000) | in tx_interrupt()
1753 (cosa->txsize & 0x1fff)); in tx_interrupt()
1754 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1755 debug_status_out(cosa, 0); in tx_interrupt()
1757 cosa_getdata8(cosa); in tx_interrupt()
1759 cosa_putstatus(cosa, 0); in tx_interrupt()
1762 if (cosa->busmaster) { in tx_interrupt()
1763 unsigned long addr = virt_to_bus(cosa->txbuf); in tx_interrupt()
1767 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) { in tx_interrupt()
1773 pr_info("status %x\n", cosa_getstatus(cosa)); in tx_interrupt()
1775 cosa_putdata16(cosa, (addr >> 16) & 0xffff); in tx_interrupt()
1778 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
1899 spin_lock_irqsave(&cosa->lock, flags); in eot_interrupt()
1901 disable_dma(cosa->dma); in eot_interrupt()
1902 clear_dma_ff(cosa->dma); in eot_interrupt()
1904 if (test_bit(TXBIT, &cosa->rxtx)) { in eot_interrupt()
1905 struct channel_data *chan = cosa->chan + cosa->txchan; in eot_interrupt()
1908 if (chan->tx_done(chan, cosa->txsize)) in eot_interrupt()
1909 clear_bit(chan->num, &cosa->txbitmap); in eot_interrupt()
1910 } else if (test_bit(RXBIT, &cosa->rxtx)) { in eot_interrupt()
1916 cosa->num, cosa->rxchan->num, cosa->rxsize); in eot_interrupt()
1917 for (i = 0; i < cosa->rxsize; i++) in eot_interrupt()
1918 pr_cont(" %02x", cosa->rxbuf[i]&0xff); in eot_interrupt()
1923 if (cosa->rxbuf == cosa->bouncebuf) in eot_interrupt()
1925 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize)) in eot_interrupt()
1926 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize); in eot_interrupt()
1927 if (cosa->rxchan->rx_done) in eot_interrupt()
1928 if (cosa->rxchan->rx_done(cosa->rxchan)) in eot_interrupt()
1929 clear_bit(cosa->rxchan->num, &cosa->rxbitmap); in eot_interrupt()
1931 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num); in eot_interrupt()
1939 cosa->rxtx = 0; in eot_interrupt()
1940 put_driver_status_nolock(cosa); in eot_interrupt()
1941 spin_unlock_irqrestore(&cosa->lock, flags); in eot_interrupt()
1948 struct cosa_data *cosa = cosa_; in cosa_interrupt() local
1950 status = cosa_getstatus(cosa); in cosa_interrupt()
1952 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff); in cosa_interrupt()
1955 debug_status_in(cosa, status); in cosa_interrupt()
1959 tx_interrupt(cosa, status); in cosa_interrupt()
1962 rx_interrupt(cosa, status); in cosa_interrupt()
1965 eot_interrupt(cosa, status); in cosa_interrupt()
1974 cosa->num, status & 0xff, count); in cosa_interrupt()
1979 cosa->name, count); in cosa_interrupt()
1981 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
2012 cosa->name, in debug_status_in()
2020 static void debug_status_out(struct cosa_data *cosa, int status) in debug_status_out() argument
2023 cosa->name, in debug_status_out()
2033 static void debug_data_in(struct cosa_data *cosa, int data) in debug_data_in() argument
2035 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data); in debug_data_in()
2038 static void debug_data_out(struct cosa_data *cosa, int data) in debug_data_out() argument
2040 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data); in debug_data_out()
2043 static void debug_data_cmd(struct cosa_data *cosa, int data) in debug_data_cmd() argument
2046 cosa->name, data, in debug_data_cmd()