Lines Matching refs:cosa

100 	struct cosa_data *cosa;	/* Pointer to the per-card structure */  member
247 #define is_8bit(cosa) (!(cosa->datareg & 0x08)) argument
249 #define cosa_getstatus(cosa) (cosa_inb(cosa->statusreg)) argument
250 #define cosa_putstatus(cosa, stat) (cosa_outb(stat, cosa->statusreg)) argument
251 #define cosa_getdata16(cosa) (cosa_inw(cosa->datareg)) argument
252 #define cosa_getdata8(cosa) (cosa_inb(cosa->datareg)) argument
253 #define cosa_putdata16(cosa, dt) (cosa_outw(dt, cosa->datareg)) argument
254 #define cosa_putdata8(cosa, dt) (cosa_outb(dt, cosa->datareg)) argument
263 static void cosa_kick(struct cosa_data *cosa);
310 static int cosa_start(struct cosa_data *cosa, int address);
311 static int cosa_reset(struct cosa_data *cosa);
312 static int cosa_download(struct cosa_data *cosa, void __user *a);
313 static int cosa_readmem(struct cosa_data *cosa, void __user *a);
316 static int download(struct cosa_data *cosa, const char __user *data, int addr, int len);
317 static int startmicrocode(struct cosa_data *cosa, int address);
318 static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);
319 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
322 static int get_wait_data(struct cosa_data *cosa);
323 static int put_wait_data(struct cosa_data *cosa, int data);
324 static int puthexnumber(struct cosa_data *cosa, int number);
325 static void put_driver_status(struct cosa_data *cosa);
326 static void put_driver_status_nolock(struct cosa_data *cosa);
329 static irqreturn_t cosa_interrupt(int irq, void *cosa);
333 static void debug_data_in(struct cosa_data *cosa, int data);
334 static void debug_data_out(struct cosa_data *cosa, int data);
335 static void debug_data_cmd(struct cosa_data *cosa, int data);
336 static void debug_status_in(struct cosa_data *cosa, int status);
337 static void debug_status_out(struct cosa_data *cosa, int status);
394 struct cosa_data *cosa; in cosa_exit() local
401 for (cosa = cosa_cards; nr_cards--; cosa++) { in cosa_exit()
403 for (i = 0; i < cosa->nchannels; i++) { in cosa_exit()
405 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_exit()
406 free_netdev(cosa->chan[i].netdev); in cosa_exit()
409 kfree(cosa->chan); in cosa_exit()
410 kfree(cosa->bouncebuf); in cosa_exit()
411 free_irq(cosa->irq, cosa); in cosa_exit()
412 free_dma(cosa->dma); in cosa_exit()
413 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); in cosa_exit()
429 struct cosa_data *cosa = cosa_cards+nr_cards; in cosa_probe() local
432 memset(cosa, 0, sizeof(struct cosa_data)); in cosa_probe()
459 cosa->dma = dma; in cosa_probe()
460 cosa->datareg = base; in cosa_probe()
461 cosa->statusreg = is_8bit(cosa)?base+1:base+2; in cosa_probe()
462 spin_lock_init(&cosa->lock); in cosa_probe()
464 if (!request_region(base, is_8bit(cosa)?2:4,"cosa")) in cosa_probe()
467 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { in cosa_probe()
474 if (!strncmp(cosa->id_string, "SRP", 3)) in cosa_probe()
475 cosa->type = "srp"; in cosa_probe()
476 else if (!strncmp(cosa->id_string, "COSA", 4)) in cosa_probe()
477 cosa->type = is_8bit(cosa)? "cosa8": "cosa16"; in cosa_probe()
487 release_region(base, is_8bit(cosa)?2:4); in cosa_probe()
488 if (!request_region(base, is_8bit(cosa)?2:4, cosa->type)) { in cosa_probe()
505 cosa_putstatus(cosa, SR_TX_INT_ENA); in cosa_probe()
509 cosa_putstatus(cosa, 0); in cosa_probe()
511 cosa_getdata8(cosa); in cosa_probe()
515 irq, cosa->datareg); in cosa_probe()
521 cosa->datareg); in cosa_probe()
526 cosa->irq = irq; in cosa_probe()
527 cosa->num = nr_cards; in cosa_probe()
528 cosa->usage = 0; in cosa_probe()
529 cosa->nchannels = 2; /* FIXME: how to determine this? */ in cosa_probe()
531 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) { in cosa_probe()
535 if (request_dma(cosa->dma, cosa->type)) { in cosa_probe()
540 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL|GFP_DMA); in cosa_probe()
541 if (!cosa->bouncebuf) { in cosa_probe()
545 sprintf(cosa->name, "cosa%d", cosa->num); in cosa_probe()
548 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); in cosa_probe()
549 if (!cosa->chan) { in cosa_probe()
554 for (i = 0; i < cosa->nchannels; i++) { in cosa_probe()
555 struct channel_data *chan = &cosa->chan[i]; in cosa_probe()
557 chan->cosa = cosa; in cosa_probe()
559 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); in cosa_probe()
575 chan->netdev->base_addr = chan->cosa->datareg; in cosa_probe()
576 chan->netdev->irq = chan->cosa->irq; in cosa_probe()
577 chan->netdev->dma = chan->cosa->dma; in cosa_probe()
588 cosa->num, cosa->id_string, cosa->type, in cosa_probe()
589 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); in cosa_probe()
595 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_probe()
596 free_netdev(cosa->chan[i].netdev); in cosa_probe()
598 kfree(cosa->chan); in cosa_probe()
600 kfree(cosa->bouncebuf); in cosa_probe()
602 free_dma(cosa->dma); in cosa_probe()
604 free_irq(cosa->irq, cosa); in cosa_probe()
606 release_region(cosa->datareg,is_8bit(cosa)?2:4); in cosa_probe()
607 pr_notice("cosa%d: allocating resources failed\n", cosa->num); in cosa_probe()
628 if (!(chan->cosa->firmware_status & COSA_FW_START)) { in cosa_net_open()
630 chan->cosa->name, chan->cosa->firmware_status); in cosa_net_open()
633 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
637 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
644 chan->cosa->usage++; in cosa_net_open()
645 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
649 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
651 chan->cosa->usage--; in cosa_net_open()
652 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
677 if (test_bit(RXBIT, &chan->cosa->rxtx)) { in cosa_net_timeout()
684 cosa_kick(chan->cosa); in cosa_net_timeout()
700 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_close()
710 chan->cosa->usage--; in cosa_net_close()
711 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_close()
744 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; in cosa_net_rx_done()
775 struct cosa_data *cosa = chan->cosa; in cosa_read() local
778 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_read()
780 cosa->name, cosa->firmware_status); in cosa_read()
794 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
798 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
800 spin_lock_irqsave(&cosa->lock, flags); in cosa_read()
805 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
814 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_read()
849 struct cosa_data *cosa = chan->cosa; in cosa_write() local
853 if (!(cosa->firmware_status & COSA_FW_START)) { in cosa_write()
855 cosa->name, cosa->firmware_status); in cosa_write()
878 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
882 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
884 spin_lock_irqsave(&cosa->lock, flags); in cosa_write()
890 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
899 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_write()
923 struct cosa_data *cosa; in cosa_open() local
935 cosa = cosa_cards+n; in cosa_open()
938 & ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels) { in cosa_open()
942 chan = cosa->chan + n; in cosa_open()
946 spin_lock_irqsave(&cosa->lock, flags); in cosa_open()
949 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
953 cosa->usage++; in cosa_open()
959 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_open()
968 struct cosa_data *cosa; in cosa_release() local
971 cosa = channel->cosa; in cosa_release()
972 spin_lock_irqsave(&cosa->lock, flags); in cosa_release()
973 cosa->usage--; in cosa_release()
975 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_release()
998 static inline int cosa_reset(struct cosa_data *cosa) in cosa_reset() argument
1001 if (cosa->usage > 1) in cosa_reset()
1003 cosa->num, cosa->usage); in cosa_reset()
1004 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START); in cosa_reset()
1005 if (cosa_reset_and_read_id(cosa, idstring) < 0) { in cosa_reset()
1006 pr_notice("cosa%d: reset failed\n", cosa->num); in cosa_reset()
1009 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring); in cosa_reset()
1010 cosa->firmware_status |= COSA_FW_RESET; in cosa_reset()
1015 static inline int cosa_download(struct cosa_data *cosa, void __user *arg) in cosa_download() argument
1020 if (cosa->usage > 1) in cosa_download()
1022 cosa->name, cosa->usage); in cosa_download()
1023 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_download()
1025 cosa->name, cosa->firmware_status); in cosa_download()
1039 cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_DOWNLOAD); in cosa_download()
1041 i = download(cosa, d.code, d.len, d.addr); in cosa_download()
1044 cosa->num, i); in cosa_download()
1048 cosa->num, d.len, d.addr); in cosa_download()
1049 cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD; in cosa_download()
1054 static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg) in cosa_readmem() argument
1059 if (cosa->usage > 1) in cosa_readmem()
1061 cosa->num, cosa->usage); in cosa_readmem()
1062 if (!(cosa->firmware_status & COSA_FW_RESET)) { in cosa_readmem()
1064 cosa->name, cosa->firmware_status); in cosa_readmem()
1072 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_readmem()
1074 i = readmem(cosa, d.code, d.len, d.addr); in cosa_readmem()
1076 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i); in cosa_readmem()
1080 cosa->num, d.len, d.addr); in cosa_readmem()
1081 cosa->firmware_status |= COSA_FW_RESET; in cosa_readmem()
1086 static inline int cosa_start(struct cosa_data *cosa, int address) in cosa_start() argument
1090 if (cosa->usage > 1) in cosa_start()
1092 cosa->num, cosa->usage); in cosa_start()
1094 if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD)) in cosa_start()
1097 cosa->name, cosa->firmware_status); in cosa_start()
1100 cosa->firmware_status &= ~COSA_FW_RESET; in cosa_start()
1101 if ((i=startmicrocode(cosa, address)) < 0) { in cosa_start()
1103 cosa->num, address, i); in cosa_start()
1106 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address); in cosa_start()
1107 cosa->startaddr = address; in cosa_start()
1108 cosa->firmware_status |= COSA_FW_START; in cosa_start()
1113 static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string) in cosa_getidstr() argument
1115 int l = strlen(cosa->id_string)+1; in cosa_getidstr()
1116 if (copy_to_user(string, cosa->id_string, l)) in cosa_getidstr()
1122 static inline int cosa_gettype(struct cosa_data *cosa, char __user *string) in cosa_gettype() argument
1124 int l = strlen(cosa->type)+1; in cosa_gettype()
1125 if (copy_to_user(string, cosa->type, l)) in cosa_gettype()
1130 static int cosa_ioctl_common(struct cosa_data *cosa, in cosa_ioctl_common() argument
1138 return cosa_reset(cosa); in cosa_ioctl_common()
1142 return cosa_start(cosa, arg); in cosa_ioctl_common()
1147 return cosa_download(cosa, argp); in cosa_ioctl_common()
1151 return cosa_readmem(cosa, argp); in cosa_ioctl_common()
1153 return cosa_gettype(cosa, argp); in cosa_ioctl_common()
1155 return cosa_getidstr(cosa, argp); in cosa_ioctl_common()
1159 return cosa->nchannels; in cosa_ioctl_common()
1163 if (is_8bit(cosa)) in cosa_ioctl_common()
1167 cosa->busmaster = arg; in cosa_ioctl_common()
1170 return cosa->busmaster; in cosa_ioctl_common()
1179 rv = cosa_ioctl_common(chan->cosa, chan, cmd, in cosa_net_ioctl()
1190 struct cosa_data *cosa; in cosa_chardev_ioctl() local
1194 cosa = channel->cosa; in cosa_chardev_ioctl()
1195 ret = cosa_ioctl_common(cosa, channel, cmd, arg); in cosa_chardev_ioctl()
1209 struct cosa_data *cosa = chan->cosa; in cosa_enable_rx() local
1211 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) in cosa_enable_rx()
1212 put_driver_status(cosa); in cosa_enable_rx()
1217 struct cosa_data *cosa = chan->cosa; in cosa_disable_rx() local
1219 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) in cosa_disable_rx()
1220 put_driver_status(cosa); in cosa_disable_rx()
1231 struct cosa_data *cosa = chan->cosa; in cosa_start_tx() local
1237 chan->cosa->num, chan->num, len); in cosa_start_tx()
1242 spin_lock_irqsave(&cosa->lock, flags); in cosa_start_tx()
1247 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_start_tx()
1250 set_bit(chan->num, &cosa->txbitmap); in cosa_start_tx()
1251 put_driver_status(cosa); in cosa_start_tx()
1256 static void put_driver_status(struct cosa_data *cosa) in put_driver_status() argument
1261 spin_lock_irqsave(&cosa->lock, flags); in put_driver_status()
1263 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status()
1264 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status()
1265 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status()
1267 if (!cosa->rxtx) { in put_driver_status()
1268 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status()
1269 if (!cosa->enabled) { in put_driver_status()
1270 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status()
1272 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status()
1274 cosa->enabled = 1; in put_driver_status()
1276 } else if (cosa->enabled) { in put_driver_status()
1277 cosa->enabled = 0; in put_driver_status()
1278 cosa_putstatus(cosa, 0); in put_driver_status()
1280 debug_status_out(cosa, 0); in put_driver_status()
1283 cosa_putdata8(cosa, status); in put_driver_status()
1285 debug_data_cmd(cosa, status); in put_driver_status()
1288 spin_unlock_irqrestore(&cosa->lock, flags); in put_driver_status()
1291 static void put_driver_status_nolock(struct cosa_data *cosa) in put_driver_status_nolock() argument
1295 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) in put_driver_status_nolock()
1296 | (cosa->txbitmap ? DRIVER_TX_READY : 0) in put_driver_status_nolock()
1297 | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT) in put_driver_status_nolock()
1300 if (cosa->rxbitmap|cosa->txbitmap) { in put_driver_status_nolock()
1301 cosa_putstatus(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1303 debug_status_out(cosa, SR_RX_INT_ENA); in put_driver_status_nolock()
1305 cosa->enabled = 1; in put_driver_status_nolock()
1307 cosa_putstatus(cosa, 0); in put_driver_status_nolock()
1309 debug_status_out(cosa, 0); in put_driver_status_nolock()
1311 cosa->enabled = 0; in put_driver_status_nolock()
1313 cosa_putdata8(cosa, status); in put_driver_status_nolock()
1315 debug_data_cmd(cosa, status); in put_driver_status_nolock()
1324 static void cosa_kick(struct cosa_data *cosa) in cosa_kick() argument
1329 if (test_bit(RXBIT, &cosa->rxtx)) in cosa_kick()
1331 if (test_bit(TXBIT, &cosa->rxtx)) in cosa_kick()
1334 pr_info("%s: %s timeout - restarting\n", cosa->name, s); in cosa_kick()
1335 spin_lock_irqsave(&cosa->lock, flags); in cosa_kick()
1336 cosa->rxtx = 0; in cosa_kick()
1339 disable_dma(cosa->dma); in cosa_kick()
1340 clear_dma_ff(cosa->dma); in cosa_kick()
1345 cosa_putstatus(cosa, 0); in cosa_kick()
1347 (void) cosa_getdata8(cosa); in cosa_kick()
1349 cosa_putdata8(cosa, 0); in cosa_kick()
1351 put_driver_status_nolock(cosa); in cosa_kick()
1352 spin_unlock_irqrestore(&cosa->lock, flags); in cosa_kick()
1386 static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address) in download() argument
1390 if (put_wait_data(cosa, 'w') == -1) return -1; in download()
1391 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;} in download()
1392 if (get_wait_data(cosa) != '=') return -3; in download()
1394 if (puthexnumber(cosa, address) < 0) return -4; in download()
1395 if (put_wait_data(cosa, ' ') == -1) return -10; in download()
1396 if (get_wait_data(cosa) != ' ') return -11; in download()
1397 if (get_wait_data(cosa) != '=') return -12; in download()
1399 if (puthexnumber(cosa, address+length-1) < 0) return -13; in download()
1400 if (put_wait_data(cosa, ' ') == -1) return -18; in download()
1401 if (get_wait_data(cosa) != ' ') return -19; in download()
1411 if (put_wait_data(cosa, c) == -1) in download()
1416 if (get_wait_data(cosa) != '\r') return -21; in download()
1417 if (get_wait_data(cosa) != '\n') return -22; in download()
1418 if (get_wait_data(cosa) != '.') return -23; in download()
1420 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num); in download()
1431 static int startmicrocode(struct cosa_data *cosa, int address) in startmicrocode() argument
1433 if (put_wait_data(cosa, 'g') == -1) return -1; in startmicrocode()
1434 if (get_wait_data(cosa) != 'g') return -2; in startmicrocode()
1435 if (get_wait_data(cosa) != '=') return -3; in startmicrocode()
1437 if (puthexnumber(cosa, address) < 0) return -4; in startmicrocode()
1438 if (put_wait_data(cosa, '\r') == -1) return -5; in startmicrocode()
1440 if (get_wait_data(cosa) != '\r') return -6; in startmicrocode()
1441 if (get_wait_data(cosa) != '\r') return -7; in startmicrocode()
1442 if (get_wait_data(cosa) != '\n') return -8; in startmicrocode()
1443 if (get_wait_data(cosa) != '\r') return -9; in startmicrocode()
1444 if (get_wait_data(cosa) != '\n') return -10; in startmicrocode()
1446 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num); in startmicrocode()
1460 static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address) in readmem() argument
1462 if (put_wait_data(cosa, 'r') == -1) return -1; in readmem()
1463 if ((get_wait_data(cosa)) != 'r') return -2; in readmem()
1464 if ((get_wait_data(cosa)) != '=') return -3; in readmem()
1466 if (puthexnumber(cosa, address) < 0) return -4; in readmem()
1467 if (put_wait_data(cosa, ' ') == -1) return -5; in readmem()
1468 if (get_wait_data(cosa) != ' ') return -6; in readmem()
1469 if (get_wait_data(cosa) != '=') return -7; in readmem()
1471 if (puthexnumber(cosa, address+length-1) < 0) return -8; in readmem()
1472 if (put_wait_data(cosa, ' ') == -1) return -9; in readmem()
1473 if (get_wait_data(cosa) != ' ') return -10; in readmem()
1478 if ((i=get_wait_data(cosa)) == -1) { in readmem()
1492 if (get_wait_data(cosa) != '\r') return -21; in readmem()
1493 if (get_wait_data(cosa) != '\n') return -22; in readmem()
1494 if (get_wait_data(cosa) != '.') return -23; in readmem()
1496 printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num); in readmem()
1505 static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring) in cosa_reset_and_read_id() argument
1510 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1511 cosa_getdata8(cosa); in cosa_reset_and_read_id()
1512 cosa_putstatus(cosa, SR_RST); in cosa_reset_and_read_id()
1515 cosa_putstatus(cosa, 0); in cosa_reset_and_read_id()
1526 if ((curr = get_wait_data(cosa)) == -1) { in cosa_reset_and_read_id()
1548 static int get_wait_data(struct cosa_data *cosa) in get_wait_data() argument
1554 if (cosa_getstatus(cosa) & SR_RX_RDY) { in get_wait_data()
1556 r = cosa_getdata8(cosa); in get_wait_data()
1567 cosa_getstatus(cosa)); in get_wait_data()
1576 static int put_wait_data(struct cosa_data *cosa, int data) in put_wait_data() argument
1581 if (cosa_getstatus(cosa) & SR_TX_RDY) { in put_wait_data()
1582 cosa_putdata8(cosa, data); in put_wait_data()
1594 cosa->num, cosa_getstatus(cosa)); in put_wait_data()
1604 static int puthexnumber(struct cosa_data *cosa, int number) in puthexnumber() argument
1612 if (put_wait_data(cosa, temp[i]) == -1) { in puthexnumber()
1614 cosa->num, i); in puthexnumber()
1617 if (get_wait_data(cosa) != temp[i]) { in puthexnumber()
1619 cosa->num, i); in puthexnumber()
1660 static inline void tx_interrupt(struct cosa_data *cosa, int status) in tx_interrupt() argument
1664 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status); in tx_interrupt()
1666 spin_lock_irqsave(&cosa->lock, flags); in tx_interrupt()
1667 set_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1668 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1671 if (!cosa->txbitmap) { in tx_interrupt()
1673 cosa->name); in tx_interrupt()
1674 put_driver_status_nolock(cosa); in tx_interrupt()
1675 clear_bit(TXBIT, &cosa->rxtx); in tx_interrupt()
1676 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1680 cosa->txchan++; in tx_interrupt()
1682 if (cosa->txchan >= cosa->nchannels) in tx_interrupt()
1683 cosa->txchan = 0; in tx_interrupt()
1684 if (!(cosa->txbitmap & (1<<cosa->txchan))) in tx_interrupt()
1686 if (~status & (1 << (cosa->txchan+DRIVER_TXMAP_SHIFT))) in tx_interrupt()
1689 if (i > cosa->nchannels) { in tx_interrupt()
1694 cosa->name, cosa->txchan); in tx_interrupt()
1700 cosa->txsize = cosa->chan[cosa->txchan].txsize; in tx_interrupt()
1701 if (cosa_dma_able(cosa->chan+cosa->txchan, in tx_interrupt()
1702 cosa->chan[cosa->txchan].txbuf, cosa->txsize)) { in tx_interrupt()
1703 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; in tx_interrupt()
1705 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1706 cosa->txsize); in tx_interrupt()
1707 cosa->txbuf = cosa->bouncebuf; in tx_interrupt()
1711 if (is_8bit(cosa)) { in tx_interrupt()
1712 if (!test_bit(IRQBIT, &cosa->rxtx)) { in tx_interrupt()
1713 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1714 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1715 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1717 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1718 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0)| in tx_interrupt()
1719 ((cosa->txsize >> 8) & 0x1f)); in tx_interrupt()
1720 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1722 cosa_getdata8(cosa); in tx_interrupt()
1724 set_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1725 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1728 clear_bit(IRQBIT, &cosa->rxtx); in tx_interrupt()
1729 cosa_putstatus(cosa, 0); in tx_interrupt()
1730 cosa_putdata8(cosa, cosa->txsize&0xff); in tx_interrupt()
1732 debug_status_out(cosa, 0); in tx_interrupt()
1733 debug_data_out(cosa, cosa->txsize&0xff); in tx_interrupt()
1737 cosa_putstatus(cosa, SR_TX_INT_ENA); in tx_interrupt()
1738 cosa_putdata16(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1739 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1741 debug_status_out(cosa, SR_TX_INT_ENA); in tx_interrupt()
1742 debug_data_out(cosa, ((cosa->txchan<<13) & 0xe000) in tx_interrupt()
1743 | (cosa->txsize & 0x1fff)); in tx_interrupt()
1744 debug_data_in(cosa, cosa_getdata8(cosa)); in tx_interrupt()
1745 debug_status_out(cosa, 0); in tx_interrupt()
1747 cosa_getdata8(cosa); in tx_interrupt()
1749 cosa_putstatus(cosa, 0); in tx_interrupt()
1752 if (cosa->busmaster) { in tx_interrupt()
1753 unsigned long addr = virt_to_bus(cosa->txbuf); in tx_interrupt()
1756 while (!(cosa_getstatus(cosa)&SR_TX_RDY)) { in tx_interrupt()
1761 pr_info("status %x\n", cosa_getstatus(cosa)); in tx_interrupt()
1763 cosa_putdata16(cosa, (addr >> 16)&0xffff); in tx_interrupt()
1766 while (!(cosa_getstatus(cosa)&SR_TX_RDY)) { in tx_interrupt()
1772 cosa_putdata16(cosa, addr &0xffff); in tx_interrupt()
1774 set_dma_mode(cosa->dma, DMA_MODE_CASCADE); in tx_interrupt()
1775 enable_dma(cosa->dma); in tx_interrupt()
1780 disable_dma(cosa->dma); in tx_interrupt()
1781 clear_dma_ff(cosa->dma); in tx_interrupt()
1782 set_dma_mode(cosa->dma, DMA_MODE_WRITE); in tx_interrupt()
1783 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf)); in tx_interrupt()
1784 set_dma_count(cosa->dma, cosa->txsize); in tx_interrupt()
1785 enable_dma(cosa->dma); in tx_interrupt()
1788 cosa_putstatus(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1790 debug_status_out(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA); in tx_interrupt()
1792 spin_unlock_irqrestore(&cosa->lock, flags); in tx_interrupt()
1795 static inline void rx_interrupt(struct cosa_data *cosa, int status) in rx_interrupt() argument
1799 pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num); in rx_interrupt()
1802 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1803 set_bit(RXBIT, &cosa->rxtx); in rx_interrupt()
1805 if (is_8bit(cosa)) { in rx_interrupt()
1806 if (!test_bit(IRQBIT, &cosa->rxtx)) { in rx_interrupt()
1807 set_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1808 put_driver_status_nolock(cosa); in rx_interrupt()
1809 cosa->rxsize = cosa_getdata8(cosa) <<8; in rx_interrupt()
1811 debug_data_in(cosa, cosa->rxsize >> 8); in rx_interrupt()
1813 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1816 clear_bit(IRQBIT, &cosa->rxtx); in rx_interrupt()
1817 cosa->rxsize |= cosa_getdata8(cosa) & 0xff; in rx_interrupt()
1819 debug_data_in(cosa, cosa->rxsize & 0xff); in rx_interrupt()
1823 cosa->num, cosa->rxsize); in rx_interrupt()
1827 cosa->rxsize = cosa_getdata16(cosa); in rx_interrupt()
1829 debug_data_in(cosa, cosa->rxsize); in rx_interrupt()
1833 cosa->num, cosa->rxsize); in rx_interrupt()
1836 if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) { in rx_interrupt()
1838 cosa->name, cosa->rxsize); in rx_interrupt()
1839 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1842 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13); in rx_interrupt()
1843 cosa->rxsize &= 0x1fff; in rx_interrupt()
1844 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1846 cosa->rxbuf = NULL; in rx_interrupt()
1847 if (cosa->rxchan->setup_rx) in rx_interrupt()
1848 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize); in rx_interrupt()
1850 if (!cosa->rxbuf) { in rx_interrupt()
1853 cosa->num, cosa->rxchan->num); in rx_interrupt()
1854 cosa->rxbuf = cosa->bouncebuf; in rx_interrupt()
1859 disable_dma(cosa->dma); in rx_interrupt()
1860 clear_dma_ff(cosa->dma); in rx_interrupt()
1861 set_dma_mode(cosa->dma, DMA_MODE_READ); in rx_interrupt()
1862 if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff)) { in rx_interrupt()
1863 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf)); in rx_interrupt()
1865 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf)); in rx_interrupt()
1867 set_dma_count(cosa->dma, (cosa->rxsize&0x1fff)); in rx_interrupt()
1868 enable_dma(cosa->dma); in rx_interrupt()
1870 spin_lock_irqsave(&cosa->lock, flags); in rx_interrupt()
1871 cosa_putstatus(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1872 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1873 cosa_putdata8(cosa, DRIVER_RX_READY); in rx_interrupt()
1875 debug_status_out(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA); in rx_interrupt()
1876 if (!is_8bit(cosa) && (status & SR_TX_RDY)) in rx_interrupt()
1877 debug_data_cmd(cosa, DRIVER_RX_READY); in rx_interrupt()
1879 spin_unlock_irqrestore(&cosa->lock, flags); in rx_interrupt()
1882 static inline void eot_interrupt(struct cosa_data *cosa, int status) in eot_interrupt() argument
1885 spin_lock_irqsave(&cosa->lock, flags); in eot_interrupt()
1887 disable_dma(cosa->dma); in eot_interrupt()
1888 clear_dma_ff(cosa->dma); in eot_interrupt()
1890 if (test_bit(TXBIT, &cosa->rxtx)) { in eot_interrupt()
1891 struct channel_data *chan = cosa->chan+cosa->txchan; in eot_interrupt()
1893 if (chan->tx_done(chan, cosa->txsize)) in eot_interrupt()
1894 clear_bit(chan->num, &cosa->txbitmap); in eot_interrupt()
1895 } else if (test_bit(RXBIT, &cosa->rxtx)) { in eot_interrupt()
1900 cosa->num, cosa->rxchan->num, cosa->rxsize); in eot_interrupt()
1901 for (i=0; i<cosa->rxsize; i++) in eot_interrupt()
1902 pr_cont(" %02x", cosa->rxbuf[i]&0xff); in eot_interrupt()
1907 if (cosa->rxbuf == cosa->bouncebuf) in eot_interrupt()
1909 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize)) in eot_interrupt()
1910 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize); in eot_interrupt()
1911 if (cosa->rxchan->rx_done) in eot_interrupt()
1912 if (cosa->rxchan->rx_done(cosa->rxchan)) in eot_interrupt()
1913 clear_bit(cosa->rxchan->num, &cosa->rxbitmap); in eot_interrupt()
1915 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num); in eot_interrupt()
1924 cosa->rxtx = 0; in eot_interrupt()
1925 put_driver_status_nolock(cosa); in eot_interrupt()
1926 spin_unlock_irqrestore(&cosa->lock, flags); in eot_interrupt()
1933 struct cosa_data *cosa = cosa_; in cosa_interrupt() local
1935 status = cosa_getstatus(cosa); in cosa_interrupt()
1937 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff); in cosa_interrupt()
1940 debug_status_in(cosa, status); in cosa_interrupt()
1944 tx_interrupt(cosa, status); in cosa_interrupt()
1947 rx_interrupt(cosa, status); in cosa_interrupt()
1950 eot_interrupt(cosa, status); in cosa_interrupt()
1959 cosa->num, status & 0xff, count); in cosa_interrupt()
1964 cosa->name, count); in cosa_interrupt()
1966 pr_info("%s: returning from IRQ\n", cosa->name); in cosa_interrupt()
1980 static void debug_status_in(struct cosa_data *cosa, int status) in debug_status_in() argument
1998 cosa->name, in debug_status_in()
2006 static void debug_status_out(struct cosa_data *cosa, int status) in debug_status_out() argument
2009 cosa->name, in debug_status_out()
2019 static void debug_data_in(struct cosa_data *cosa, int data) in debug_data_in() argument
2021 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data); in debug_data_in()
2024 static void debug_data_out(struct cosa_data *cosa, int data) in debug_data_out() argument
2026 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data); in debug_data_out()
2029 static void debug_data_cmd(struct cosa_data *cosa, int data) in debug_data_cmd() argument
2032 cosa->name, data, in debug_data_cmd()