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()
442 struct cosa_data *cosa = cosa_cards+nr_cards; in cosa_probe() local
445 memset(cosa, 0, sizeof(struct cosa_data)); in cosa_probe()
472 cosa->dma = dma; in cosa_probe()
473 cosa->datareg = base; in cosa_probe()
474 cosa->statusreg = is_8bit(cosa)?base+1:base+2; in cosa_probe()
475 spin_lock_init(&cosa->lock); in cosa_probe()
477 if (!request_region(base, is_8bit(cosa)?2:4,"cosa")) in cosa_probe()
480 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { in cosa_probe()
487 if (!strncmp(cosa->id_string, "SRP", 3)) in cosa_probe()
488 cosa->type = "srp"; in cosa_probe()
489 else if (!strncmp(cosa->id_string, "COSA", 4)) in cosa_probe()
490 cosa->type = is_8bit(cosa)? "cosa8": "cosa16"; in cosa_probe()
500 release_region(base, is_8bit(cosa)?2:4); in cosa_probe()
501 if (!request_region(base, is_8bit(cosa)?2:4, cosa->type)) { in cosa_probe()
518 cosa_putstatus(cosa, SR_TX_INT_ENA); in cosa_probe()
522 cosa_putstatus(cosa, 0); in cosa_probe()
524 cosa_getdata8(cosa); in cosa_probe()
528 irq, cosa->datareg); in cosa_probe()
534 cosa->datareg); in cosa_probe()
539 cosa->irq = irq; in cosa_probe()
540 cosa->num = nr_cards; in cosa_probe()
541 cosa->usage = 0; in cosa_probe()
542 cosa->nchannels = 2; /* FIXME: how to determine this? */ in cosa_probe()
544 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) { in cosa_probe()
548 if (request_dma(cosa->dma, cosa->type)) { in cosa_probe()
553 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL|GFP_DMA); in cosa_probe()
554 if (!cosa->bouncebuf) { in cosa_probe()
558 sprintf(cosa->name, "cosa%d", cosa->num); in cosa_probe()
561 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); in cosa_probe()
562 if (!cosa->chan) { in cosa_probe()
567 for (i = 0; i < cosa->nchannels; i++) { in cosa_probe()
568 struct channel_data *chan = &cosa->chan[i]; in cosa_probe()
570 chan->cosa = cosa; in cosa_probe()
572 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); in cosa_probe()
588 chan->netdev->base_addr = chan->cosa->datareg; in cosa_probe()
589 chan->netdev->irq = chan->cosa->irq; in cosa_probe()
590 chan->netdev->dma = chan->cosa->dma; in cosa_probe()
601 cosa->num, cosa->id_string, cosa->type, in cosa_probe()
602 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); in cosa_probe()
608 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_probe()
609 free_netdev(cosa->chan[i].netdev); in cosa_probe()
611 kfree(cosa->chan); in cosa_probe()
613 kfree(cosa->bouncebuf); in cosa_probe()
615 free_dma(cosa->dma); in cosa_probe()
617 free_irq(cosa->irq, cosa); in cosa_probe()
619 release_region(cosa->datareg,is_8bit(cosa)?2:4); in cosa_probe()
620 pr_notice("cosa%d: allocating resources failed\n", cosa->num); in cosa_probe()
641 if (!(chan->cosa->firmware_status & COSA_FW_START)) { in cosa_net_open()
643 chan->cosa->name, chan->cosa->firmware_status); in cosa_net_open()
646 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
650 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
657 chan->cosa->usage++; in cosa_net_open()
658 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
662 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
664 chan->cosa->usage--; in cosa_net_open()
665 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
690 if (test_bit(RXBIT, &chan->cosa->rxtx)) { in cosa_net_timeout()
697 cosa_kick(chan->cosa); in cosa_net_timeout()
713 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_close()
723 chan->cosa->usage--; in cosa_net_close()
724 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_close()
757 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; in cosa_net_rx_done()
788 struct cosa_data *cosa = chan->cosa; in cosa_read() local
791 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_read()
793 cosa->name, cosa->firmware_status); in cosa_read()
807 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
811 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
813 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
818 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
827 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
862 struct cosa_data *cosa = chan->cosa; in cosa_write() local
866 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_write()
868 cosa->name, cosa->firmware_status); in cosa_write()
891 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
895 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
897 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
903 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
911 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
935 struct cosa_data *cosa; in cosa_open() local
947 cosa = cosa_cards+n; in cosa_open()
950 & ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels) { in cosa_open()
954 chan = cosa->chan + n; in cosa_open()
958 spin_lock_irqsave(&cosa->lock, flags); in cosa_open()
961 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
965 cosa->usage++; in cosa_open()
971 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
980 struct cosa_data *cosa; in cosa_release() local
983 cosa = channel->cosa; in cosa_release()
984 spin_lock_irqsave(&cosa->lock, flags); in cosa_release()
985 cosa->usage--; in cosa_release()
987 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_release()
1010 static inline int cosa_reset(struct cosa_data *cosa) in cosa_reset() argument
1013 if (cosa->usage > 1) in cosa_reset()
1015 cosa->num, cosa->usage); in cosa_reset()
1016 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START); in cosa_reset()
1017 if (cosa_reset_and_read_id(cosa, idstring) < 0) { in cosa_reset()
1018 pr_notice("cosa%d: reset failed\n", cosa->num); in cosa_reset()
1021 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring); in cosa_reset()
1022 cosa->firmware_status |= COSA_FW_RESET; in cosa_reset()
1027 static inline int cosa_download(struct cosa_data *cosa, void __user *arg) in cosa_download() argument
1032 if (cosa->usage > 1) in cosa_download()
1034 cosa->name, cosa->usage); in cosa_download()
1035 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_download()
1037 cosa->name, cosa->firmware_status); in cosa_download()
1051 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_DOWNLOAD); in cosa_download()
1053 i = download(cosa, d.code, d.len, d.addr); in cosa_download()
1056 cosa->num, i); in cosa_download()
1060 cosa->num, d.len, d.addr); in cosa_download()
1061 cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD; in cosa_download()
1066 static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg) in cosa_readmem() argument
1071 if (cosa->usage > 1) in cosa_readmem()
1073 cosa->num, cosa->usage); in cosa_readmem()
1074 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_readmem()
1076 cosa->name, cosa->firmware_status); in cosa_readmem()
1084 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_readmem()
1086 i = readmem(cosa, d.code, d.len, d.addr); in cosa_readmem()
1088 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i); in cosa_readmem()
1092 cosa->num, d.len, d.addr); in cosa_readmem()
1093 cosa->firmware_status |= COSA_FW_RESET; in cosa_readmem()
1098 static inline int cosa_start(struct cosa_data *cosa, int address) in cosa_start() argument
1102 if (cosa->usage > 1) in cosa_start()
1104 cosa->num, cosa->usage); in cosa_start()
1106 if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD)) in cosa_start()
1109 cosa->name, cosa->firmware_status); in cosa_start()
1112 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_start()
1113 if ((i=startmicrocode(cosa, address)) < 0) { in cosa_start()
1115 cosa->num, address, i); in cosa_start()
1118 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address); in cosa_start()
1119 cosa->startaddr = address; in cosa_start()
1120 cosa->firmware_status |= COSA_FW_START; in cosa_start()
1125 static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string) in cosa_getidstr() argument
1127 int l = strlen(cosa->id_string)+1; in cosa_getidstr()
1128 if (copy_to_user(string, cosa->id_string, l)) in cosa_getidstr()
1134 static inline int cosa_gettype(struct cosa_data *cosa, char __user *string) in cosa_gettype() argument
1136 int l = strlen(cosa->type)+1; in cosa_gettype()
1137 if (copy_to_user(string, cosa->type, l)) in cosa_gettype()
1142 static int cosa_ioctl_common(struct cosa_data *cosa, in cosa_ioctl_common() argument
1150 return cosa_reset(cosa); in cosa_ioctl_common()
1154 return cosa_start(cosa, arg); in cosa_ioctl_common()
1159 return cosa_download(cosa, argp); in cosa_ioctl_common()
1163 return cosa_readmem(cosa, argp); in cosa_ioctl_common()
1165 return cosa_gettype(cosa, argp); in cosa_ioctl_common()
1167 return cosa_getidstr(cosa, argp); in cosa_ioctl_common()
1171 return cosa->nchannels; in cosa_ioctl_common()
1175 if (is_8bit(cosa)) in cosa_ioctl_common()
1179 cosa->busmaster = arg; in cosa_ioctl_common()
1182 return cosa->busmaster; in cosa_ioctl_common()
1191 rv = cosa_ioctl_common(chan->cosa, chan, cmd, in cosa_net_ioctl()
1202 struct cosa_data *cosa; in cosa_chardev_ioctl() local
1206 cosa = channel->cosa; in cosa_chardev_ioctl()
1207 ret = cosa_ioctl_common(cosa, channel, cmd, arg); in cosa_chardev_ioctl()
1221 struct cosa_data *cosa = chan->cosa; in cosa_enable_rx() local
1223 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) in cosa_enable_rx()
1224 put_driver_status(cosa); in cosa_enable_rx()
1229 struct cosa_data *cosa = chan->cosa; in cosa_disable_rx() local
1231 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) in cosa_disable_rx()
1232 put_driver_status(cosa); in cosa_disable_rx()
1243 struct cosa_data *cosa = chan->cosa; in cosa_start_tx() local
1249 chan->cosa->num, chan->num, len); in cosa_start_tx()
1254 spin_lock_irqsave(&cosa->lock, flags); in cosa_start_tx()
1259 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_start_tx()
1262 set_bit(chan->num, &cosa->txbitmap); in cosa_start_tx()
1263 put_driver_status(cosa); in cosa_start_tx()
1268 static void put_driver_status(struct cosa_data *cosa) in put_driver_status() argument
1273 spin_lock_irqsave(&cosa->lock, flags); in put_driver_status()
1275 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status()
1276 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status()
1277 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status()
1279 if (!cosa->rxtx) { in put_driver_status()
1280 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status()
1281 if (!cosa->enabled) { in put_driver_status()
1282 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status()
1284 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status()
1286 cosa->enabled = 1; in put_driver_status()
1288 } else if (cosa->enabled) { in put_driver_status()
1289 cosa->enabled = 0; in put_driver_status()
1290 cosa_putstatus(cosa, 0); in put_driver_status()
1292 debug_status_out(cosa, 0); in put_driver_status()
1295 cosa_putdata8(cosa, status); in put_driver_status()
1297 debug_data_cmd(cosa, status); in put_driver_status()
1300 spin_unlock_irqrestore(&cosa->lock, flags); in put_driver_status()
1303 static void put_driver_status_nolock(struct cosa_data *cosa) in put_driver_status_nolock() argument
1307 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status_nolock()
1308 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status_nolock()
1309 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status_nolock()
1312 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status_nolock()
1313 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1315 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1317 cosa->enabled = 1; in put_driver_status_nolock()
1319 cosa_putstatus(cosa, 0); in put_driver_status_nolock()
1321 debug_status_out(cosa, 0); in put_driver_status_nolock()
1323 cosa->enabled = 0; in put_driver_status_nolock()
1325 cosa_putdata8(cosa, status); in put_driver_status_nolock()
1327 debug_data_cmd(cosa, status); in put_driver_status_nolock()
1336 static void cosa_kick(struct cosa_data *cosa) in cosa_kick() argument
1341 if (test_bit(RXBIT, &cosa->rxtx)) in cosa_kick()
1343 if (test_bit(TXBIT, &cosa->rxtx)) in cosa_kick()
1346 pr_info("%s: %s timeout - restarting\n", cosa->name, s); in cosa_kick()
1347 spin_lock_irqsave(&cosa->lock, flags); in cosa_kick()
1348 cosa->rxtx = 0; in cosa_kick()
1351 disable_dma(cosa->dma); in cosa_kick()
1352 clear_dma_ff(cosa->dma); in cosa_kick()
1357 cosa_putstatus(cosa, 0); in cosa_kick()
1359 (void) cosa_getdata8(cosa); in cosa_kick()
1361 cosa_putdata8(cosa, 0); in cosa_kick()
1363 put_driver_status_nolock(cosa); in cosa_kick()
1364 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_kick()
1398 static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address) in download() argument
1402 if (put_wait_data(cosa, 'w') == -1) return -1; in download()
1403 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;} in download()
1404 if (get_wait_data(cosa) != '=') return -3; in download()
1406 if (puthexnumber(cosa, address) < 0) return -4; in download()
1407 if (put_wait_data(cosa, ' ') == -1) return -10; in download()
1408 if (get_wait_data(cosa) != ' ') return -11; in download()
1409 if (get_wait_data(cosa) != '=') return -12; in download()
1411 if (puthexnumber(cosa, address+length-1) < 0) return -13; in download()
1412 if (put_wait_data(cosa, ' ') == -1) return -18; in download()
1413 if (get_wait_data(cosa) != ' ') return -19; in download()
1423 if (put_wait_data(cosa, c) == -1) in download()
1428 if (get_wait_data(cosa) != '\r') return -21; in download()
1429 if (get_wait_data(cosa) != '\n') return -22; in download()
1430 if (get_wait_data(cosa) != '.') return -23; in download()
1432 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num); in download()
1443 static int startmicrocode(struct cosa_data *cosa, int address) in startmicrocode() argument
1445 if (put_wait_data(cosa, 'g') == -1) return -1; in startmicrocode()
1446 if (get_wait_data(cosa) != 'g') return -2; in startmicrocode()
1447 if (get_wait_data(cosa) != '=') return -3; in startmicrocode()
1449 if (puthexnumber(cosa, address) < 0) return -4; in startmicrocode()
1450 if (put_wait_data(cosa, '\r') == -1) return -5; in startmicrocode()
1452 if (get_wait_data(cosa) != '\r') return -6; in startmicrocode()
1453 if (get_wait_data(cosa) != '\r') return -7; in startmicrocode()
1454 if (get_wait_data(cosa) != '\n') return -8; in startmicrocode()
1455 if (get_wait_data(cosa) != '\r') return -9; in startmicrocode()
1456 if (get_wait_data(cosa) != '\n') return -10; in startmicrocode()
1458 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num); in startmicrocode()
1472 static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address) in readmem() argument
1474 if (put_wait_data(cosa, 'r') == -1) return -1; in readmem()
1475 if ((get_wait_data(cosa)) != 'r') return -2; in readmem()
1476 if ((get_wait_data(cosa)) != '=') return -3; in readmem()
1478 if (puthexnumber(cosa, address) < 0) return -4; in readmem()
1479 if (put_wait_data(cosa, ' ') == -1) return -5; in readmem()
1480 if (get_wait_data(cosa) != ' ') return -6; in readmem()
1481 if (get_wait_data(cosa) != '=') return -7; in readmem()
1483 if (puthexnumber(cosa, address+length-1) < 0) return -8; in readmem()
1484 if (put_wait_data(cosa, ' ') == -1) return -9; in readmem()
1485 if (get_wait_data(cosa) != ' ') return -10; in readmem()
1490 if ((i=get_wait_data(cosa)) == -1) { in readmem()
1504 if (get_wait_data(cosa) != '\r') return -21; in readmem()
1505 if (get_wait_data(cosa) != '\n') return -22; in readmem()
1506 if (get_wait_data(cosa) != '.') return -23; in readmem()
1508 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()
1538 if ((curr = get_wait_data(cosa)) == -1) { in cosa_reset_and_read_id()
1560 static int get_wait_data(struct cosa_data *cosa) in get_wait_data() argument
1566 if (cosa_getstatus(cosa) & SR_RX_RDY) { in get_wait_data()
1568 r = cosa_getdata8(cosa); in get_wait_data()
1579 cosa_getstatus(cosa)); in get_wait_data()
1588 static int put_wait_data(struct cosa_data *cosa, int data) in put_wait_data() argument
1593 if (cosa_getstatus(cosa) & SR_TX_RDY) { in put_wait_data()
1594 cosa_putdata8(cosa, data); in put_wait_data()
1606 cosa->num, cosa_getstatus(cosa)); in put_wait_data()
1616 static int puthexnumber(struct cosa_data *cosa, int number) in puthexnumber() argument
1624 if (put_wait_data(cosa, temp[i]) == -1) { in puthexnumber()
1626 cosa->num, i); in puthexnumber()
1629 if (get_wait_data(cosa) != temp[i]) { in puthexnumber()
1631 cosa->num, i); in puthexnumber()
1672 static inline void tx_interrupt(struct cosa_data *cosa, int status) in tx_interrupt() argument
1676 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status); in tx_interrupt()
1678 spin_lock_irqsave(&cosa->lock, flags); in tx_interrupt()
1679 set_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1680 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1683 if (!cosa->txbitmap) { in tx_interrupt()
1685 cosa->name); in tx_interrupt()
1686 put_driver_status_nolock(cosa); in tx_interrupt()
1687 clear_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1688 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1692 cosa->txchan++; in tx_interrupt()
1694 if (cosa->txchan >= cosa->nchannels) in tx_interrupt()
1695 cosa->txchan = 0; in tx_interrupt()
1696 if (!(cosa->txbitmap & (1<<cosa->txchan))) in tx_interrupt()
1698 if (~status & (1 << (cosa->txchan+DRIVER_TXMAP_SHIFT))) in tx_interrupt()
1701 if (i > cosa->nchannels) { in tx_interrupt()
1706 cosa->name, cosa->txchan); in tx_interrupt()
1712 cosa->txsize = cosa->chan[cosa->txchan].txsize; in tx_interrupt()
1713 if (cosa_dma_able(cosa->chan+cosa->txchan, in tx_interrupt()
1714 cosa->chan[cosa->txchan].txbuf, cosa->txsize)) { in tx_interrupt()
1715 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; in tx_interrupt()
1717 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1718 cosa->txsize); in tx_interrupt()
1719 cosa->txbuf = cosa->bouncebuf; in tx_interrupt()
1723 if (is_8bit(cosa)) { in tx_interrupt()
1724 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1725 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1726 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1727 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1729 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1730 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1731 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1732 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1734 cosa_getdata8(cosa); in tx_interrupt()
1736 set_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1737 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1740 clear_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1741 cosa_putstatus(cosa, 0); in tx_interrupt()
1742 cosa_putdata8(cosa, cosa->txsize&0xff); in tx_interrupt()
1744 debug_status_out(cosa, 0); in tx_interrupt()
1745 debug_data_out(cosa, cosa->txsize&0xff); in tx_interrupt()
1749 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1750 cosa_putdata16(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1751 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1753 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1754 debug_data_out(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1755 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1756 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1757 debug_status_out(cosa, 0); in tx_interrupt()
1759 cosa_getdata8(cosa); in tx_interrupt()
1761 cosa_putstatus(cosa, 0); in tx_interrupt()
1764 if (cosa->busmaster) { in tx_interrupt()
1765 unsigned long addr = virt_to_bus(cosa->txbuf); in tx_interrupt()
1768 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()
1784 cosa_putdata16(cosa, addr &0xffff); in tx_interrupt()
1786 set_dma_mode(cosa->dma, DMA_MODE_CASCADE); in tx_interrupt()
1787 enable_dma(cosa->dma); in tx_interrupt()
1792 disable_dma(cosa->dma); in tx_interrupt()
1793 clear_dma_ff(cosa->dma); in tx_interrupt()
1794 set_dma_mode(cosa->dma, DMA_MODE_WRITE); in tx_interrupt()
1795 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf)); in tx_interrupt()
1796 set_dma_count(cosa->dma, cosa->txsize); in tx_interrupt()
1797 enable_dma(cosa->dma); in tx_interrupt()
1800 cosa_putstatus(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1802 debug_status_out(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1804 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1807 static inline void rx_interrupt(struct cosa_data *cosa, int status) in rx_interrupt() argument
1811 pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num); in rx_interrupt()
1814 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1815 set_bit(RXBIT, &cosa->rxtx); in rx_interrupt()
1817 if (is_8bit(cosa)) { in rx_interrupt()
1818 if (!test_bit(IRQBIT, &cosa->rxtx)) { in rx_interrupt()
1819 set_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1820 put_driver_status_nolock(cosa); in rx_interrupt()
1821 cosa->rxsize = cosa_getdata8(cosa) <<8; in rx_interrupt()
1823 debug_data_in(cosa, cosa->rxsize >> 8); in rx_interrupt()
1825 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1828 clear_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1829 cosa->rxsize |= cosa_getdata8(cosa) & 0xff; in rx_interrupt()
1831 debug_data_in(cosa, cosa->rxsize & 0xff); in rx_interrupt()
1835 cosa->num, cosa->rxsize); in rx_interrupt()
1839 cosa->rxsize = cosa_getdata16(cosa); in rx_interrupt()
1841 debug_data_in(cosa, cosa->rxsize); in rx_interrupt()
1845 cosa->num, cosa->rxsize); in rx_interrupt()
1848 if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) { in rx_interrupt()
1850 cosa->name, cosa->rxsize); in rx_interrupt()
1851 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1854 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13); in rx_interrupt()
1855 cosa->rxsize &= 0x1fff; in rx_interrupt()
1856 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1858 cosa->rxbuf = NULL; in rx_interrupt()
1859 if (cosa->rxchan->setup_rx) in rx_interrupt()
1860 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize); in rx_interrupt()
1862 if (!cosa->rxbuf) { in rx_interrupt()
1865 cosa->num, cosa->rxchan->num); in rx_interrupt()
1866 cosa->rxbuf = cosa->bouncebuf; in rx_interrupt()
1871 disable_dma(cosa->dma); in rx_interrupt()
1872 clear_dma_ff(cosa->dma); in rx_interrupt()
1873 set_dma_mode(cosa->dma, DMA_MODE_READ); in rx_interrupt()
1874 if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff)) { in rx_interrupt()
1875 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf)); in rx_interrupt()
1877 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf)); in rx_interrupt()
1879 set_dma_count(cosa->dma, (cosa->rxsize&0x1fff)); in rx_interrupt()
1880 enable_dma(cosa->dma); in rx_interrupt()
1882 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1883 cosa_putstatus(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1884 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1885 cosa_putdata8(cosa, DRIVER_RX_READY); in rx_interrupt()
1887 debug_status_out(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1888 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1889 debug_data_cmd(cosa, DRIVER_RX_READY); in rx_interrupt()
1891 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1894 static inline void eot_interrupt(struct cosa_data *cosa, int status) in eot_interrupt() argument
1897 spin_lock_irqsave(&cosa->lock, flags); in eot_interrupt()
1899 disable_dma(cosa->dma); in eot_interrupt()
1900 clear_dma_ff(cosa->dma); in eot_interrupt()
1902 if (test_bit(TXBIT, &cosa->rxtx)) { in eot_interrupt()
1903 struct channel_data *chan = cosa->chan+cosa->txchan; in eot_interrupt()
1905 if (chan->tx_done(chan, cosa->txsize)) in eot_interrupt()
1906 clear_bit(chan->num, &cosa->txbitmap); in eot_interrupt()
1907 } else if (test_bit(RXBIT, &cosa->rxtx)) { in eot_interrupt()
1912 cosa->num, cosa->rxchan->num, cosa->rxsize); in eot_interrupt()
1913 for (i=0; i<cosa->rxsize; i++) in eot_interrupt()
1914 pr_cont(" %02x", cosa->rxbuf[i]&0xff); in eot_interrupt()
1919 if (cosa->rxbuf == cosa->bouncebuf) in eot_interrupt()
1921 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize)) in eot_interrupt()
1922 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize); in eot_interrupt()
1923 if (cosa->rxchan->rx_done) in eot_interrupt()
1924 if (cosa->rxchan->rx_done(cosa->rxchan)) in eot_interrupt()
1925 clear_bit(cosa->rxchan->num, &cosa->rxbitmap); in eot_interrupt()
1927 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num); in eot_interrupt()
1936 cosa->rxtx = 0; in eot_interrupt()
1937 put_driver_status_nolock(cosa); in eot_interrupt()
1938 spin_unlock_irqrestore(&cosa->lock, flags); in eot_interrupt()
1945 struct cosa_data *cosa = cosa_; in cosa_interrupt() local
1947 status = cosa_getstatus(cosa); in cosa_interrupt()
1949 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff); in cosa_interrupt()
1952 debug_status_in(cosa, status); in cosa_interrupt()
1956 tx_interrupt(cosa, status); in cosa_interrupt()
1959 rx_interrupt(cosa, status); in cosa_interrupt()
1962 eot_interrupt(cosa, status); in cosa_interrupt()
1971 cosa->num, status & 0xff, count); in cosa_interrupt()
1976 cosa->name, count); in cosa_interrupt()
1978 pr_info("%s: returning from IRQ\n", cosa->name); in cosa_interrupt()
1992 static void debug_status_in(struct cosa_data *cosa, int status) in debug_status_in() argument
2010 cosa->name, in debug_status_in()
2018 static void debug_status_out(struct cosa_data *cosa, int status) in debug_status_out() argument
2021 cosa->name, in debug_status_out()
2031 static void debug_data_in(struct cosa_data *cosa, int data) in debug_data_in() argument
2033 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data); in debug_data_in()
2036 static void debug_data_out(struct cosa_data *cosa, int data) in debug_data_out() argument
2038 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data); in debug_data_out()
2041 static void debug_data_cmd(struct cosa_data *cosa, int data) in debug_data_cmd() argument
2044 cosa->name, data, in debug_data_cmd()