45 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/types.h>
51 #include <linux/netdevice.h>
56 #include <linux/rtnetlink.h>
63 #include <asm/byteorder.h>
71 #define CHIP_IO_EXTENT 8
72 #define BROKEN_DONGLE_ID
77 #define NSC_IRCC_DRIVER_NAME "nsc-ircc"
82 .suspend = nsc_ircc_suspend,
83 .resume = nsc_ircc_resume,
90 static int qos_mtt_bits = 0x07;
94 static unsigned int io[] = { ~0, ~0, ~0, ~0, ~0 };
95 static unsigned int irq[] = { 0, 0, 0, 0, 0 };
96 static unsigned int dma[] = { 0, 0, 0, 0, 0 };
111 {
"PC87108", { 0x150, 0x398, 0xea }, 0x05, 0x10, 0xf0,
112 nsc_ircc_probe_108, nsc_ircc_init_108 },
113 {
"PC87338", { 0x398, 0x15c, 0x2e }, 0x08, 0xb0, 0xf8,
114 nsc_ircc_probe_338, nsc_ircc_init_338 },
116 {
"PC8738x", { 0x164e, 0x4e, 0x2e }, 0x20, 0xf4, 0xff,
117 nsc_ircc_probe_39x, nsc_ircc_init_39x },
119 {
"PC8739x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xea, 0xff,
120 nsc_ircc_probe_39x, nsc_ircc_init_39x },
122 {
"IBM-PC8738x", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf4, 0xff,
123 nsc_ircc_probe_39x, nsc_ircc_init_39x },
125 {
"IBM-PC8394T", { 0x2e, 0x4e, 0x0 }, 0x20, 0xf9, 0xff,
126 nsc_ircc_probe_39x, nsc_ircc_init_39x },
132 static char *dongle_types[] = {
133 "Differential serial interface",
134 "Differential serial interface",
139 "Single-ended serial interface",
141 "HP HSDL-2300, HP HSDL-3600/HSDL-3610",
142 "IBM31T1100 or Temic TFDS6000/TFDS6500",
145 "HP HSDL-1100/HSDL-2100",
146 "HP HSDL-1100/HSDL-2100",
147 "Supports SIR Mode only",
148 "No dongle connected",
154 { .id =
"NSC6001", .driver_data = 0 },
155 { .id =
"HWPC224", .driver_data = 0 },
162 static struct pnp_driver nsc_ircc_pnp_driver = {
165 .id_table = nsc_ircc_pnp_table,
166 .probe = nsc_ircc_pnp_probe,
172 static int nsc_ircc_close(
struct nsc_ircc_cb *
self);
174 static void nsc_ircc_pio_receive(
struct nsc_ircc_cb *
self);
175 static int nsc_ircc_dma_receive(
struct nsc_ircc_cb *
self);
184 static int nsc_ircc_is_receiving(
struct nsc_ircc_cb *
self);
185 static int nsc_ircc_read_dongle_id (
int iobase);
186 static void nsc_ircc_init_dongle_interface (
int iobase,
int dongle_id);
193 static int pnp_registered;
194 static int pnp_succeeded;
202 static int __init nsc_ircc_init(
void)
227 for (chip = chips; chip->
name ; chip++) {
228 IRDA_DEBUG(2,
"%s(), Probing for %s ...\n", __func__,
233 cfg_base = chip->
cfg[
cfg];
240 IRDA_DEBUG(2,
"%s() no chip at 0x%03x\n", __func__, cfg_base);
246 id =
inb(cfg_base+1);
248 IRDA_DEBUG(2,
"%s() Found %s chip, revision=%d\n",
264 chip->
init(chip, &info);
266 chip->
probe(chip, &info);
268 if (nsc_ircc_open(&info) >= 0)
290 if (
io[i] < 0x2000) {
291 chip->
init(chip, &info);
293 chip->
probe(chip, &info);
295 if (nsc_ircc_open(&info) >= 0)
300 IRDA_DEBUG(2,
"%s(), Wrong chip id=0x%02x\n", __func__,
id);
320 static void __exit nsc_ircc_cleanup(
void)
326 nsc_ircc_close(dev_self[i]);
338 .ndo_open = nsc_ircc_net_open,
339 .ndo_stop = nsc_ircc_net_close,
340 .ndo_start_xmit = nsc_ircc_hard_xmit_sir,
341 .ndo_do_ioctl = nsc_ircc_net_ioctl,
345 .ndo_open = nsc_ircc_net_open,
346 .ndo_stop = nsc_ircc_net_close,
347 .ndo_start_xmit = nsc_ircc_hard_xmit_fir,
348 .ndo_do_ioctl = nsc_ircc_net_ioctl,
367 for (chip_index = 0; chip_index <
ARRAY_SIZE(dev_self); chip_index++) {
368 if (!dev_self[chip_index])
373 IRDA_ERROR(
"%s(), maximum number of supported chips reached!\n", __func__);
380 if ((nsc_ircc_setup(info)) == -1)
388 "control block!\n", __func__);
392 self = netdev_priv(dev);
397 dev_self[chip_index] =
self;
398 self->
index = chip_index;
403 self->io.irq = info->
irq;
405 self->io.dma = info->
dma;
406 self->io.fifo_size = 32;
412 __func__, self->io.fir_base);
424 self->qos.min_turn_time.bits = qos_mtt_bits;
428 self->rx_buff.truesize = 14384;
429 self->tx_buff.truesize = 14384;
435 if (self->rx_buff.head ==
NULL) {
440 memset(self->rx_buff.head, 0, self->rx_buff.truesize);
445 if (self->tx_buff.head ==
NULL) {
449 memset(self->tx_buff.head, 0, self->tx_buff.truesize);
451 self->rx_buff.in_frame =
FALSE;
453 self->tx_buff.data =
self->tx_buff.head;
454 self->rx_buff.data =
self->rx_buff.head;
457 self->tx_fifo.len =
self->tx_fifo.ptr =
self->tx_fifo.free = 0;
458 self->tx_fifo.tail =
self->tx_buff.head;
465 IRDA_ERROR(
"%s(), register_netdev() failed!\n", __func__);
471 if ((dongle_id <= 0) ||
473 dongle_id = nsc_ircc_read_dongle_id(self->io.fir_base);
476 dongle_types[dongle_id]);
479 dongle_types[dongle_id]);
482 self->io.dongle_id = dongle_id;
483 nsc_ircc_init_dongle_interface(self->io.fir_base, dongle_id);
486 self->index,
NULL, 0);
487 if (IS_ERR(self->pldev)) {
488 err = PTR_ERR(self->pldev);
491 platform_set_drvdata(self->pldev,
self);
499 self->tx_buff.head, self->tx_buff_dma);
502 self->rx_buff.head, self->rx_buff_dma);
507 dev_self[chip_index] =
NULL;
525 iobase =
self->io.fir_base;
533 IRDA_DEBUG(4,
"%s(), Releasing Region %03x\n",
534 __func__, self->io.fir_base);
537 if (self->tx_buff.head)
539 self->tx_buff.head, self->tx_buff_dma);
541 if (self->rx_buff.head)
543 self->rx_buff.head, self->rx_buff_dma);
545 dev_self[
self->index] =
NULL;
563 outb(0x00, cfg_base+1);
568 case 0x3e8:
outb(0x14, cfg_base+1);
break;
569 case 0x2e8:
outb(0x15, cfg_base+1);
break;
570 case 0x3f8:
outb(0x16, cfg_base+1);
break;
571 case 0x2f8:
outb(0x17, cfg_base+1);
break;
572 default:
IRDA_ERROR(
"%s(), invalid base_address", __func__);
577 case 3: temp = 0x01;
break;
578 case 4: temp = 0x02;
break;
579 case 5: temp = 0x03;
break;
580 case 7: temp = 0x04;
break;
581 case 9: temp = 0x05;
break;
582 case 11: temp = 0x06;
break;
583 case 15: temp = 0x07;
break;
584 default:
IRDA_ERROR(
"%s(), invalid irq", __func__);
589 case 0:
outb(0x08+temp, cfg_base+1);
break;
590 case 1:
outb(0x10+temp, cfg_base+1);
break;
591 case 3:
outb(0x18+temp, cfg_base+1);
break;
592 default:
IRDA_ERROR(
"%s(), invalid dma", __func__);
596 outb(0x03, cfg_base+1);
614 reg =
inb(cfg_base+1);
616 switch (reg & 0x03) {
631 IRDA_DEBUG(2,
"%s(), probing fir_base=0x%03x\n", __func__,
636 reg =
inb(cfg_base+1);
638 switch (reg & 0x07) {
664 IRDA_DEBUG(2,
"%s(), probing irq=%d\n", __func__, info->
irq);
667 switch ((reg >> 3) & 0x03) {
681 IRDA_DEBUG(2,
"%s(), probing dma=%d\n", __func__, info->
dma);
685 reg =
inb(cfg_base+1);
722 reg =
inb(cfg_base+1);
724 info->
enabled = (reg >> 2) & 0x01;
728 reg =
inb(cfg_base+1);
730 pnp = (reg >> 3) & 0x01;
733 outb(0x46, cfg_base);
734 reg = (
inb(cfg_base+1) & 0xfe) << 2;
736 outb(0x47, cfg_base);
737 reg |= ((
inb(cfg_base+1) & 0xfc) << 8);
743 reg =
inb(cfg_base+1);
745 switch ((reg >> 4) & 0x03) {
761 switch ((reg >> 6) & 0x03) {
793 reg =
inb(cfg_base+1);
795 info->
irq = reg >> 4;
799 reg =
inb(cfg_base+1);
801 info->
dma = (reg & 0x07) - 1;
805 reg =
inb(cfg_base+1);
836 IRDA_DEBUG(2,
"%s(): nsc_ircc_init_39x (user settings): "
837 "io=0x%04x, irq=%d, dma=%d\n",
842 outb(0x02, cfg_base+1);
848 enabled =
inb(cfg_base+1) & 0x01;
853 outb(0x01, cfg_base+1);
860 outb(0x82, cfg_base+1);
878 IRDA_DEBUG(2,
"%s(), nsc_ircc_probe_39x, base=%d\n",
886 outb(0x02, cfg_base+1);
890 reg1 =
inb(cfg_base+1);
892 reg2 =
inb(cfg_base+1);
893 info->
fir_base = (reg1 << 8) | reg2;
896 irq =
inb(cfg_base+1);
898 irqt =
inb(cfg_base+1);
902 dma1 =
inb(cfg_base+1);
904 dma2 =
inb(cfg_base+1);
908 info->
enabled = enabled =
inb(cfg_base+1) & 0x01;
911 susp = 1 - ((
inb(cfg_base+1) & 0x02) >> 1);
913 IRDA_DEBUG(2,
"%s(): io=0x%02x%02x, irq=%d (type %d), rxdma=%d, txdma=%d, enabled=%d (suspended=%d)\n", __func__, reg1,reg2,irq,irqt,dma1,dma2,enabled,susp);
919 enabled =
inb(cfg_base+1) & 0x01;
924 outb(0x01, cfg_base+1);
931 outb(0x82, cfg_base+1);
952 if (pnp_port_valid(dev, 0) &&
954 pnp_info.
fir_base = pnp_port_start(dev, 0);
956 if (pnp_irq_valid(dev, 0) &&
960 if (pnp_dma_valid(dev, 0) &&
964 IRDA_DEBUG(0,
"%s() : From PnP, found firbase 0x%03X ; irq %d ; dma %d.\n",
968 (pnp_info.
irq == -1) || (pnp_info.
dma == -1)) {
984 static int nsc_ircc_setup(
chipio_t *info)
990 switch_bank(iobase,
BANK3);
991 version =
inb(iobase+
MID);
993 IRDA_DEBUG(2,
"%s() Driver %s Found chip version %02x\n",
997 if (0x20 != (version & 0xf0)) {
1004 switch_bank(iobase,
BANK2);
1006 switch_bank(iobase,
BANK0);
1009 switch_bank(iobase,
BANK0);
1016 switch_bank(iobase,
BANK2);
1020 switch_bank(iobase,
BANK5);
1021 outb(0x02, iobase+4);
1024 switch_bank(iobase,
BANK6);
1025 outb(0x20, iobase+0);
1026 outb(0x0a, iobase+1);
1027 outb(0x0d, iobase+2);
1028 outb(0x2a, iobase+4);
1031 switch_bank(iobase,
BANK0);
1044 static int nsc_ircc_read_dongle_id (
int iobase)
1052 switch_bank(iobase,
BANK7);
1055 outb(0x00, iobase+7);
1061 dongle_id =
inb(iobase+4) & 0x0f;
1063 #ifdef BROKEN_DONGLE_ID
1064 if (dongle_id == 0x0a)
1068 switch_bank(iobase,
BANK0);
1083 static void nsc_ircc_init_dongle_interface (
int iobase,
int dongle_id)
1091 switch_bank(iobase,
BANK7);
1094 switch (dongle_id) {
1097 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1098 __func__, dongle_types[dongle_id]);
1102 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1103 __func__, dongle_types[dongle_id]);
1108 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1109 __func__, dongle_types[dongle_id]);
1112 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1113 __func__, dongle_types[dongle_id]);
1116 IRDA_DEBUG(0,
"%s(), %s is not for IrDA mode\n",
1117 __func__, dongle_types[dongle_id]);
1121 __func__, dongle_types[dongle_id]);
1124 outb(0x28, iobase+7);
1128 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1129 __func__, dongle_types[dongle_id]);
1137 outb(0x48, iobase+7);
1140 outb(0x28, iobase+7);
1144 __func__, dongle_types[dongle_id]);
1146 switch_bank(iobase,
BANK0);
1151 __func__, dongle_id);
1155 outb(0x00, iobase+4);
1168 static void nsc_ircc_change_dongle_speed(
int iobase,
int speed,
int dongle_id)
1176 switch_bank(iobase,
BANK7);
1179 switch (dongle_id) {
1182 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1183 __func__, dongle_types[dongle_id]);
1187 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1188 __func__, dongle_types[dongle_id]);
1193 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1194 __func__, dongle_types[dongle_id]);
1197 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1198 __func__, dongle_types[dongle_id]);
1201 IRDA_DEBUG(0,
"%s(), %s is not for IrDA mode\n",
1202 __func__, dongle_types[dongle_id]);
1206 __func__, dongle_types[dongle_id]);
1207 outb(0x00, iobase+4);
1209 outb(0x01, iobase+4);
1212 outb(0x01, iobase+4);
1214 if (speed == 4000000) {
1217 outb(0x81, iobase+4);
1218 outb(0x80, iobase+4);
1220 outb(0x00, iobase+4);
1224 IRDA_DEBUG(0,
"%s(), %s not defined by irda yet\n",
1225 __func__, dongle_types[dongle_id]);
1233 IRDA_DEBUG(0,
"%s(), %s is not for IrDA mode\n",
1234 __func__, dongle_types[dongle_id]);
1236 switch_bank(iobase,
BANK0);
1240 IRDA_DEBUG(0,
"%s(), invalid data_rate\n", __func__);
1261 IRDA_DEBUG(2,
"%s(), speed=%d\n", __func__, speed);
1265 iobase =
self->io.fir_base;
1268 self->io.speed = speed;
1274 switch_bank(iobase,
BANK0);
1278 switch_bank(iobase,
BANK2);
1282 case 9600:
outb(0x0c, iobase+
BGDL);
break;
1283 case 19200:
outb(0x06, iobase+
BGDL);
break;
1284 case 38400:
outb(0x03, iobase+
BGDL);
break;
1285 case 57600:
outb(0x02, iobase+
BGDL);
break;
1286 case 115200:
outb(0x01, iobase+
BGDL);
break;
1288 switch_bank(iobase,
BANK5);
1291 outb(
inb(iobase+4) | 0x04, iobase+4);
1294 IRDA_DEBUG(0,
"%s(), handling baud of 576000\n", __func__);
1298 IRDA_DEBUG(0,
"%s(), handling baud of 1152000\n", __func__);
1302 IRDA_DEBUG(0,
"%s(), handling baud of 4000000\n", __func__);
1306 IRDA_DEBUG(0,
"%s(), unknown baud rate of %d\n",
1312 switch_bank(iobase,
BANK0);
1316 nsc_ircc_change_dongle_speed(iobase, speed, self->io.dongle_id);
1319 switch_bank(iobase,
BANK0);
1330 switch_bank(iobase,
BANK2);
1334 switch_bank(iobase,
BANK0);
1335 if (speed > 115200) {
1339 nsc_ircc_dma_receive(
self);
1365 unsigned long flags;
1370 self = netdev_priv(dev);
1374 iobase =
self->io.fir_base;
1376 netif_stop_queue(dev);
1382 speed = irda_get_next_speed(skb);
1383 if ((speed != self->io.speed) && (speed != -1)) {
1390 if (self->io.direction ==
IO_RECV) {
1391 nsc_ircc_change_speed(
self, speed);
1394 netif_wake_queue(dev);
1396 self->new_speed = speed;
1402 spin_unlock_irqrestore(&self->lock, flags);
1406 self->new_speed = speed;
1412 self->tx_buff.data =
self->tx_buff.head;
1415 self->tx_buff.truesize);
1417 dev->
stats.tx_bytes +=
self->tx_buff.len;
1420 switch_bank(iobase,
BANK0);
1427 spin_unlock_irqrestore(&self->lock, flags);
1438 unsigned long flags;
1444 self = netdev_priv(dev);
1445 iobase =
self->io.fir_base;
1447 netif_stop_queue(dev);
1453 speed = irda_get_next_speed(skb);
1454 if ((speed != self->io.speed) && (speed != -1)) {
1459 if(self->tx_fifo.len == 0) {
1460 nsc_ircc_change_speed(
self, speed);
1461 netif_wake_queue(dev);
1463 self->new_speed = speed;
1473 spin_unlock_irqrestore(&self->lock, flags);
1478 self->new_speed = speed;
1486 self->tx_fifo.queue[
self->tx_fifo.free].start =
self->tx_fifo.tail;
1487 self->tx_fifo.queue[
self->tx_fifo.free].len = skb->
len;
1488 self->tx_fifo.tail += skb->
len;
1492 skb_copy_from_linear_data(skb, self->tx_fifo.queue[self->tx_fifo.free].start,
1494 self->tx_fifo.len++;
1495 self->tx_fifo.free++;
1498 if (self->tx_fifo.len == 1) {
1500 mtt = irda_get_mtt(skb);
1504 diff =
self->now.tv_usec -
self->stamp.tv_usec;
1524 switch_bank(iobase,
BANK4);
1526 outb((mtt >> 8) & 0x0f, iobase+
TMRH);
1533 switch_bank(iobase,
BANK0);
1543 switch_bank(iobase,
BANK0);
1547 nsc_ircc_dma_xmit(
self, iobase);
1552 if ((self->tx_fifo.free <
MAX_TX_WINDOW) && (self->new_speed == 0))
1553 netif_wake_queue(self->netdev);
1559 spin_unlock_irqrestore(&self->lock, flags);
1571 static void nsc_ircc_dma_xmit(
struct nsc_ircc_cb *
self,
int iobase)
1579 switch_bank(iobase,
BANK0);
1585 switch_bank(iobase,
BANK2);
1589 ((
u8 *)self->tx_fifo.queue[self->tx_fifo.ptr].start -
1590 self->tx_buff.head) + self->tx_buff_dma,
1591 self->tx_fifo.queue[self->tx_fifo.ptr].len,
1595 switch_bank(iobase,
BANK0);
1609 static int nsc_ircc_pio_write(
int iobase,
__u8 *
buf,
int len,
int fifo_size)
1619 switch_bank(iobase,
BANK0);
1621 IRDA_DEBUG(4,
"%s(), warning, FIFO not empty yet!\n",
1629 while ((fifo_size-- > 0) && (actual < len)) {
1631 outb(buf[actual++], iobase+
TXD);
1634 IRDA_DEBUG(4,
"%s(), fifo_size %d ; %d sent of %d\n",
1635 __func__, fifo_size, actual, len);
1650 static int nsc_ircc_dma_xmit_complete(
struct nsc_ircc_cb *
self)
1658 iobase =
self->io.fir_base;
1664 switch_bank(iobase,
BANK0);
1669 self->netdev->stats.tx_errors++;
1670 self->netdev->stats.tx_fifo_errors++;
1675 self->netdev->stats.tx_packets++;
1679 self->tx_fifo.ptr++;
1680 self->tx_fifo.len--;
1683 if (self->tx_fifo.len) {
1684 nsc_ircc_dma_xmit(
self, iobase);
1690 self->tx_fifo.len =
self->tx_fifo.ptr =
self->tx_fifo.free = 0;
1691 self->tx_fifo.tail =
self->tx_buff.head;
1696 if ((self->tx_fifo.free <
MAX_TX_WINDOW) && (self->new_speed == 0)) {
1699 netif_wake_queue(self->netdev);
1715 static int nsc_ircc_dma_receive(
struct nsc_ircc_cb *
self)
1720 iobase =
self->io.fir_base;
1723 self->tx_fifo.len =
self->tx_fifo.ptr =
self->tx_fifo.free = 0;
1724 self->tx_fifo.tail =
self->tx_buff.head;
1730 switch_bank(iobase,
BANK0);
1734 switch_bank(iobase,
BANK2);
1738 self->rx_buff.data =
self->rx_buff.head;
1741 switch_bank(iobase,
BANK0);
1744 self->st_fifo.len =
self->st_fifo.pending_bytes = 0;
1745 self->st_fifo.tail =
self->st_fifo.head = 0;
1747 irda_setup_dma(self->io.dma, self->rx_buff_dma, self->rx_buff.truesize,
1751 switch_bank(iobase,
BANK0);
1767 static int nsc_ircc_dma_receive_complete(
struct nsc_ircc_cb *
self,
int iobase)
1775 st_fifo = &
self->st_fifo;
1781 switch_bank(iobase,
BANK5);
1787 IRDA_DEBUG(0,
"%s(), window is full!\n", __func__);
1798 while (st_fifo->
len > 0) {
1810 self->netdev->stats.rx_errors +=
len;
1813 self->netdev->stats.rx_errors++;
1815 self->rx_buff.data +=
len;
1818 self->netdev->stats.rx_length_errors++;
1821 self->netdev->stats.rx_frame_errors++;
1824 self->netdev->stats.rx_crc_errors++;
1828 self->netdev->stats.rx_fifo_errors++;
1831 self->netdev->stats.rx_fifo_errors++;
1841 switch_bank(iobase,
BANK0);
1854 switch_bank(iobase,
BANK4);
1875 skb = dev_alloc_skb(len+1);
1878 "dropping frame.\n",
1880 self->netdev->stats.rx_dropped++;
1889 skb_reserve(skb, 1);
1892 if (self->io.speed < 4000000) {
1894 skb_copy_to_linear_data(skb,
1899 skb_copy_to_linear_data(skb,
1905 self->rx_buff.data +=
len;
1906 self->netdev->stats.rx_bytes +=
len;
1907 self->netdev->stats.rx_packets++;
1909 skb->
dev =
self->netdev;
1910 skb_reset_mac_header(skb);
1927 static void nsc_ircc_pio_receive(
struct nsc_ircc_cb *
self)
1932 iobase =
self->io.fir_base;
1938 &self->rx_buff, byte);
1948 static void nsc_ircc_sir_interrupt(
struct nsc_ircc_cb *
self,
int eir)
1955 actual = nsc_ircc_pio_write(self->io.fir_base,
1958 self->io.fifo_size);
1959 self->tx_buff.data += actual;
1960 self->tx_buff.len -= actual;
1965 if (self->tx_buff.len > 0)
1969 self->netdev->stats.tx_packets++;
1970 netif_wake_queue(self->netdev);
1983 if (self->new_speed) {
1984 IRDA_DEBUG(2,
"%s(), Changing speed!\n", __func__);
1985 self->ier = nsc_ircc_change_speed(
self,
1987 self->new_speed = 0;
1988 netif_wake_queue(self->netdev);
1991 if (self->io.speed > 115200) {
2000 nsc_ircc_pio_receive(
self);
2013 static void nsc_ircc_fir_interrupt(
struct nsc_ircc_cb *
self,
int iobase,
2023 if (nsc_ircc_dma_receive_complete(
self, iobase)) {
2031 switch_bank(iobase,
BANK4);
2035 switch_bank(iobase,
BANK0);
2039 if (self->io.direction ==
IO_XMIT) {
2040 nsc_ircc_dma_xmit(
self, iobase);
2046 if (nsc_ircc_dma_receive_complete(
self, iobase)) {
2054 if (nsc_ircc_dma_xmit_complete(
self)) {
2055 if(self->new_speed != 0) {
2063 if (irda_device_txqueue_empty(self->netdev)) {
2065 nsc_ircc_dma_receive(
self);
2069 "Tx queue lockup !\n",
2076 }
else if (eir & EIR_TXEMP_EV) {
2079 self->ier = nsc_ircc_change_speed(
self, self->new_speed);
2080 self->new_speed = 0;
2081 netif_wake_queue(self->netdev);
2101 self = netdev_priv(dev);
2103 spin_lock(&self->lock);
2105 iobase =
self->io.fir_base;
2109 switch_bank(iobase,
BANK0);
2110 self->ier =
inb(iobase+
IER);
2111 eir =
inb(iobase+
EIR) &
self->ier;
2117 if (self->io.speed > 115200)
2118 nsc_ircc_fir_interrupt(
self, iobase, eir);
2120 nsc_ircc_sir_interrupt(
self, eir);
2126 spin_unlock(&self->lock);
2136 static int nsc_ircc_is_receiving(
struct nsc_ircc_cb *
self)
2138 unsigned long flags;
2147 if (self->io.speed > 115200) {
2148 iobase =
self->io.fir_base;
2152 switch_bank(iobase,
BANK2);
2153 if ((
inb(iobase+
RXFLV) & 0x3f) != 0) {
2161 spin_unlock_irqrestore(&self->lock, flags);
2172 static int nsc_ircc_net_open(
struct net_device *dev)
2182 self = netdev_priv(dev);
2186 iobase =
self->io.fir_base;
2188 if (
request_irq(self->io.irq, nsc_ircc_interrupt, 0, dev->
name, dev)) {
2208 switch_bank(iobase,
BANK0);
2215 netif_start_queue(dev);
2218 sprintf(hwname,
"NSC-FIR @ 0x%03x", self->io.fir_base);
2224 self->irlap =
irlap_open(dev, &self->qos, hwname);
2235 static int nsc_ircc_net_close(
struct net_device *dev)
2245 self = netdev_priv(dev);
2249 netif_stop_queue(dev);
2256 iobase =
self->io.fir_base;
2264 switch_bank(iobase,
BANK0);
2286 unsigned long flags;
2291 self = netdev_priv(dev);
2295 IRDA_DEBUG(2,
"%s(), %s, (cmd=0x%X)\n", __func__, dev->
name, cmd);
2304 nsc_ircc_change_speed(
self, irq->ifr_baudrate);
2305 spin_unlock_irqrestore(&self->lock, flags);
2316 irq->ifr_receiving = nsc_ircc_is_receiving(
self);
2326 struct nsc_ircc_cb *
self = platform_get_drvdata(dev);
2328 unsigned long flags;
2329 int iobase =
self->io.fir_base;
2331 if (self->io.suspended)
2337 if (netif_running(self->netdev)) {
2344 switch_bank(iobase,
BANK0);
2350 spin_unlock_irqrestore(&self->lock, flags);
2351 free_irq(self->io.irq, self->netdev);
2354 self->io.suspended = 1;
2362 struct nsc_ircc_cb *
self = platform_get_drvdata(dev);
2363 unsigned long flags;
2365 if (!self->io.suspended)
2371 nsc_ircc_setup(&self->io);
2372 nsc_ircc_init_dongle_interface(self->io.fir_base, self->io.dongle_id);
2374 if (netif_running(self->netdev)) {
2375 if (
request_irq(self->io.irq, nsc_ircc_interrupt, 0,
2376 self->netdev->name, self->netdev)) {
2384 unregister_netdevice(self->netdev);
2387 nsc_ircc_change_speed(
self, self->io.speed);
2388 spin_unlock_irqrestore(&self->lock, flags);
2394 nsc_ircc_change_speed(
self, 9600);
2395 spin_unlock_irqrestore(&self->lock, flags);
2397 self->io.suspended = 0;