irport.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:24k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*********************************************************************
  2.  * 
  3.  * Filename:   irport.c
  4.  * Version:   1.0
  5.  * Description:   Half duplex serial port SIR driver for IrDA. 
  6.  * Status:   Experimental.
  7.  * Author:   Dag Brattli <dagb@cs.uit.no>
  8.  * Created at:   Sun Aug  3 13:49:59 1997
  9.  * Modified at:   Fri Jan 28 20:22:38 2000
  10.  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  11.  * Sources:   serial.c by Linus Torvalds 
  12.  * 
  13.  *     Copyright (c) 1997, 1998, 1999-2000 Dag Brattli, All Rights Reserved.
  14.  *     
  15.  *     This program is free software; you can redistribute it and/or 
  16.  *     modify it under the terms of the GNU General Public License as 
  17.  *     published by the Free Software Foundation; either version 2 of 
  18.  *     the License, or (at your option) any later version.
  19.  * 
  20.  *     This program is distributed in the hope that it will be useful,
  21.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23.  *     GNU General Public License for more details.
  24.  * 
  25.  *     You should have received a copy of the GNU General Public License 
  26.  *     along with this program; if not, write to the Free Software 
  27.  *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  28.  *     MA 02111-1307 USA
  29.  *
  30.  *     This driver is ment to be a small half duplex serial driver to be
  31.  *     used for IR-chipsets that has a UART (16550) compatibility mode. 
  32.  *     Eventually it will replace irtty, because of irtty has some 
  33.  *     problems that is hard to get around when we don't have control
  34.  *     over the serial driver. This driver may also be used by FIR 
  35.  *     drivers to handle SIR mode for them.
  36.  *
  37.  ********************************************************************/
  38. #include <linux/module.h>
  39. #include <linux/kernel.h>
  40. #include <linux/types.h>
  41. #include <linux/ioport.h>
  42. #include <linux/slab.h>
  43. #include <linux/string.h>
  44. #include <linux/skbuff.h>
  45. #include <linux/serial_reg.h>
  46. #include <linux/errno.h>
  47. #include <linux/init.h>
  48. #include <linux/spinlock.h>
  49. #include <linux/rtnetlink.h>
  50. #include <asm/system.h>
  51. #include <asm/bitops.h>
  52. #include <asm/io.h>
  53. #include <net/irda/irda.h>
  54. #include <net/irda/irmod.h>
  55. #include <net/irda/wrapper.h>
  56. #include <net/irda/irport.h>
  57. #define IO_EXTENT 8
  58. /* 
  59.  * Currently you'll need to set these values using insmod like this:
  60.  * insmod irport io=0x3e8 irq=11
  61.  */
  62. static unsigned int io[]  = { ~0, ~0, ~0, ~0 };
  63. static unsigned int irq[] = { 0, 0, 0, 0 };
  64. static unsigned int qos_mtt_bits = 0x03;
  65. static struct irport_cb *dev_self[] = { NULL, NULL, NULL, NULL};
  66. static char *driver_name = "irport";
  67. static void irport_write_wakeup(struct irport_cb *self);
  68. static int  irport_write(int iobase, int fifo_size, __u8 *buf, int len);
  69. static void irport_receive(struct irport_cb *self);
  70. static int  irport_net_init(struct net_device *dev);
  71. static int  irport_net_ioctl(struct net_device *dev, struct ifreq *rq, 
  72.      int cmd);
  73. static int  irport_is_receiving(struct irport_cb *self);
  74. static int  irport_set_dtr_rts(struct net_device *dev, int dtr, int rts);
  75. static int  irport_raw_write(struct net_device *dev, __u8 *buf, int len);
  76. static struct net_device_stats *irport_net_get_stats(struct net_device *dev);
  77. static int irport_change_speed_complete(struct irda_task *task);
  78. static void irport_timeout(struct net_device *dev);
  79. EXPORT_SYMBOL(irport_open);
  80. EXPORT_SYMBOL(irport_close);
  81. EXPORT_SYMBOL(irport_start);
  82. EXPORT_SYMBOL(irport_stop);
  83. EXPORT_SYMBOL(irport_interrupt);
  84. EXPORT_SYMBOL(irport_hard_xmit);
  85. EXPORT_SYMBOL(irport_timeout);
  86. EXPORT_SYMBOL(irport_change_speed);
  87. EXPORT_SYMBOL(irport_net_open);
  88. EXPORT_SYMBOL(irport_net_close);
  89. int __init irport_init(void)
  90. {
  91.   int i;
  92.   for (i=0; (io[i] < 2000) && (i < 4); i++) {
  93.   int ioaddr = io[i];
  94.   if (check_region(ioaddr, IO_EXTENT))
  95.   continue;
  96.   if (irport_open(i, io[i], irq[i]) != NULL)
  97.   return 0;
  98.   }
  99. /* 
  100.  * Maybe something failed, but we can still be usable for FIR drivers 
  101.  */
  102.   return 0;
  103. }
  104. /*
  105.  * Function irport_cleanup ()
  106.  *
  107.  *    Close all configured ports
  108.  *
  109.  */
  110. #ifdef MODULE
  111. static void irport_cleanup(void)
  112. {
  113.   int i;
  114.         IRDA_DEBUG( 4, __FUNCTION__ "()n");
  115. for (i=0; i < 4; i++) {
  116.   if (dev_self[i])
  117.   irport_close(dev_self[i]);
  118.   }
  119. }
  120. #endif /* MODULE */
  121. struct irport_cb *
  122. irport_open(int i, unsigned int iobase, unsigned int irq)
  123. {
  124. struct net_device *dev;
  125. struct irport_cb *self;
  126. void *ret;
  127. int err;
  128. IRDA_DEBUG(0, __FUNCTION__ "()n");
  129. /*
  130.  *  Allocate new instance of the driver
  131.  */
  132. self = kmalloc(sizeof(struct irport_cb), GFP_KERNEL);
  133. if (!self) {
  134. ERROR(__FUNCTION__ "(), can't allocate memory for "
  135.       "control block!n");
  136. return NULL;
  137. }
  138. memset(self, 0, sizeof(struct irport_cb));
  139. spin_lock_init(&self->lock);
  140. /* Need to store self somewhere */
  141. dev_self[i] = self;
  142. self->priv = self;
  143. self->index = i;
  144. /* Initialize IO */
  145. self->io.sir_base  = iobase;
  146.         self->io.sir_ext   = IO_EXTENT;
  147.         self->io.irq       = irq;
  148.         self->io.fifo_size = 16;
  149. /* Lock the port that we need */
  150. ret = request_region(self->io.sir_base, self->io.sir_ext, driver_name);
  151. if (!ret) { 
  152. IRDA_DEBUG(0, __FUNCTION__ "(), can't get iobase of 0x%03xn",
  153.    self->io.sir_base);
  154. return NULL;
  155. }
  156. /* Initialize QoS for this device */
  157. irda_init_max_qos_capabilies(&self->qos);
  158. self->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
  159. IR_115200;
  160. self->qos.min_turn_time.bits = qos_mtt_bits;
  161. irda_qos_bits_to_value(&self->qos);
  162. self->flags = IFF_SIR|IFF_PIO;
  163. /* Specify how much memory we want */
  164. self->rx_buff.truesize = 4000; 
  165. self->tx_buff.truesize = 4000;
  166. /* Allocate memory if needed */
  167. if (self->rx_buff.truesize > 0) {
  168. self->rx_buff.head = (__u8 *) kmalloc(self->rx_buff.truesize,
  169.       GFP_KERNEL);
  170. if (self->rx_buff.head == NULL)
  171. return NULL;
  172. memset(self->rx_buff.head, 0, self->rx_buff.truesize);
  173. }
  174. if (self->tx_buff.truesize > 0) {
  175. self->tx_buff.head = (__u8 *) kmalloc(self->tx_buff.truesize, 
  176.       GFP_KERNEL);
  177. if (self->tx_buff.head == NULL) {
  178. kfree(self->rx_buff.head);
  179. return NULL;
  180. }
  181. memset(self->tx_buff.head, 0, self->tx_buff.truesize);
  182. }
  183. self->rx_buff.in_frame = FALSE;
  184. self->rx_buff.state = OUTSIDE_FRAME;
  185. self->tx_buff.data = self->tx_buff.head;
  186. self->rx_buff.data = self->rx_buff.head;
  187. self->mode = IRDA_IRLAP;
  188. if (!(dev = dev_alloc("irda%d", &err))) {
  189. ERROR(__FUNCTION__ "(), dev_alloc() failed!n");
  190. return NULL;
  191. }
  192. self->netdev = dev;
  193. /* May be overridden by piggyback drivers */
  194.   dev->priv = (void *) self;
  195. self->interrupt    = irport_interrupt;
  196. self->change_speed = irport_change_speed;
  197. /* Override the network functions we need to use */
  198. dev->init            = irport_net_init;
  199. dev->hard_start_xmit = irport_hard_xmit;
  200. dev->tx_timeout      = irport_timeout;
  201. dev->watchdog_timeo  = HZ;  /* Allow time enough for speed change */
  202. dev->open            = irport_net_open;
  203. dev->stop            = irport_net_close;
  204. dev->get_stats      = irport_net_get_stats;
  205. dev->do_ioctl        = irport_net_ioctl;
  206. /* Make ifconfig display some details */
  207. dev->base_addr = iobase;
  208. dev->irq = irq;
  209. rtnl_lock();
  210. err = register_netdevice(dev);
  211. rtnl_unlock();
  212. if (err) {
  213. ERROR(__FUNCTION__ "(), register_netdev() failed!n");
  214. return NULL;
  215. }
  216. MESSAGE("IrDA: Registered device %sn", dev->name);
  217. return self;
  218. }
  219. int irport_close(struct irport_cb *self)
  220. {
  221. ASSERT(self != NULL, return -1;);
  222. /* We are not using any dongle anymore! */
  223. if (self->dongle)
  224. irda_device_dongle_cleanup(self->dongle);
  225. self->dongle = NULL;
  226. /* Remove netdevice */
  227. if (self->netdev) {
  228. rtnl_lock();
  229. unregister_netdevice(self->netdev);
  230. rtnl_unlock();
  231. }
  232. /* Release the IO-port that this driver is using */
  233. IRDA_DEBUG(0 , __FUNCTION__ "(), Releasing Region %03xn", 
  234.    self->io.sir_base);
  235. release_region(self->io.sir_base, self->io.sir_ext);
  236. if (self->tx_buff.head)
  237. kfree(self->tx_buff.head);
  238. if (self->rx_buff.head)
  239. kfree(self->rx_buff.head);
  240. /* Remove ourselves */
  241. dev_self[self->index] = NULL;
  242. kfree(self);
  243. return 0;
  244. }
  245. void irport_start(struct irport_cb *self)
  246. {
  247. unsigned long flags;
  248. int iobase;
  249. iobase = self->io.sir_base;
  250. irport_stop(self);
  251. spin_lock_irqsave(&self->lock, flags);
  252. /* Initialize UART */
  253. outb(UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
  254. outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
  255. /* Turn on interrups */
  256. outb(UART_IER_RLSI | UART_IER_RDI |UART_IER_THRI, iobase+UART_IER);
  257. spin_unlock_irqrestore(&self->lock, flags);
  258. }
  259. void irport_stop(struct irport_cb *self)
  260. {
  261. unsigned long flags;
  262. int iobase;
  263. iobase = self->io.sir_base;
  264. spin_lock_irqsave(&self->lock, flags);
  265. /* Reset UART */
  266. outb(0, iobase+UART_MCR);
  267. /* Turn off interrupts */
  268. outb(0, iobase+UART_IER);
  269. spin_unlock_irqrestore(&self->lock, flags);
  270. }
  271. /*
  272.  * Function irport_probe (void)
  273.  *
  274.  *    Start IO port 
  275.  *
  276.  */
  277. int irport_probe(int iobase)
  278. {
  279. IRDA_DEBUG(4, __FUNCTION__ "(), iobase=%#xn", iobase);
  280. return 0;
  281. }
  282. /*
  283.  * Function irport_change_speed (self, speed)
  284.  *
  285.  *    Set speed of IrDA port to specified baudrate
  286.  *
  287.  */
  288. void irport_change_speed(void *priv, __u32 speed)
  289. {
  290. struct irport_cb *self = (struct irport_cb *) priv;
  291. unsigned long flags;
  292. int iobase; 
  293. int fcr;    /* FIFO control reg */
  294. int lcr;    /* Line control reg */
  295. int divisor;
  296. IRDA_DEBUG(0, __FUNCTION__ "(), Setting speed to: %dn", speed);
  297. ASSERT(self != NULL, return;);
  298. iobase = self->io.sir_base;
  299. /* Update accounting for new speed */
  300. self->io.speed = speed;
  301. spin_lock_irqsave(&self->lock, flags);
  302. /* Turn off interrupts */
  303. outb(0, iobase+UART_IER); 
  304. divisor = SPEED_MAX/speed;
  305. fcr = UART_FCR_ENABLE_FIFO;
  306. /* 
  307.  * Use trigger level 1 to avoid 3 ms. timeout delay at 9600 bps, and
  308.  * almost 1,7 ms at 19200 bps. At speeds above that we can just forget
  309.  * about this timeout since it will always be fast enough. 
  310.  */
  311. if (self->io.speed < 38400)
  312. fcr |= UART_FCR_TRIGGER_1;
  313. else 
  314. fcr |= UART_FCR_TRIGGER_14;
  315.         
  316. /* IrDA ports use 8N1 */
  317. lcr = UART_LCR_WLEN8;
  318. outb(UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
  319. outb(divisor & 0xff,      iobase+UART_DLL); /* Set speed */
  320. outb(divisor >> 8,   iobase+UART_DLM);
  321. outb(lcr,   iobase+UART_LCR); /* Set 8N1 */
  322. outb(fcr,   iobase+UART_FCR); /* Enable FIFO's */
  323. /* Turn on interrups */
  324. outb(/*UART_IER_RLSI|*/UART_IER_RDI/*|UART_IER_THRI*/, iobase+UART_IER);
  325. spin_unlock_irqrestore(&self->lock, flags);
  326. }
  327. /*
  328.  * Function __irport_change_speed (instance, state, param)
  329.  *
  330.  *    State machine for changing speed of the device. We do it this way since
  331.  *    we cannot use schedule_timeout() when we are in interrupt context
  332.  */
  333. int __irport_change_speed(struct irda_task *task)
  334. {
  335. struct irport_cb *self;
  336. __u32 speed = (__u32) task->param;
  337. int ret = 0;
  338. IRDA_DEBUG(2, __FUNCTION__ "(), <%ld>n", jiffies); 
  339. self = (struct irport_cb *) task->instance;
  340. ASSERT(self != NULL, return -1;);
  341. switch (task->state) {
  342. case IRDA_TASK_INIT:
  343. case IRDA_TASK_WAIT:
  344. /* Are we ready to change speed yet? */
  345. if (self->tx_buff.len > 0) {
  346. task->state = IRDA_TASK_WAIT;
  347. /* Try again later */
  348. ret = MSECS_TO_JIFFIES(20);
  349. break;
  350. }
  351. if (self->dongle)
  352. irda_task_next_state(task, IRDA_TASK_CHILD_INIT);
  353. else
  354. irda_task_next_state(task, IRDA_TASK_CHILD_DONE);
  355. break;
  356. case IRDA_TASK_CHILD_INIT:
  357. /* Go to default speed */
  358. self->change_speed(self->priv, 9600);
  359. /* Change speed of dongle */
  360. if (irda_task_execute(self->dongle,
  361.       self->dongle->issue->change_speed, 
  362.       NULL, task, (void *) speed))
  363. {
  364. /* Dongle need more time to change its speed */
  365. irda_task_next_state(task, IRDA_TASK_CHILD_WAIT);
  366. /* Give dongle 1 sec to finish */
  367. ret = MSECS_TO_JIFFIES(1000);
  368. } else
  369. /* Child finished immediately */
  370. irda_task_next_state(task, IRDA_TASK_CHILD_DONE);
  371. break;
  372. case IRDA_TASK_CHILD_WAIT:
  373. WARNING(__FUNCTION__ 
  374. "(), changing speed of dongle timed out!n");
  375. ret = -1;
  376. break;
  377. case IRDA_TASK_CHILD_DONE:
  378. /* Finally we are ready to change the speed */
  379. self->change_speed(self->priv, speed);
  380. irda_task_next_state(task, IRDA_TASK_DONE);
  381. break;
  382. default:
  383. ERROR(__FUNCTION__ "(), unknown state %dn", task->state);
  384. irda_task_next_state(task, IRDA_TASK_DONE);
  385. ret = -1;
  386. break;
  387. }
  388. return ret;
  389. }
  390. /*
  391.  * Function irport_write_wakeup (tty)
  392.  *
  393.  *    Called by the driver when there's room for more data.  If we have
  394.  *    more packets to send, we send them here.
  395.  *
  396.  */
  397. static void irport_write_wakeup(struct irport_cb *self)
  398. {
  399. int actual = 0;
  400. int iobase;
  401. int fcr;
  402. ASSERT(self != NULL, return;);
  403. IRDA_DEBUG(4, __FUNCTION__ "()n");
  404. iobase = self->io.sir_base;
  405. /* Finished with frame?  */
  406. if (self->tx_buff.len > 0)  {
  407. /* Write data left in transmit buffer */
  408. actual = irport_write(iobase, self->io.fifo_size, 
  409.       self->tx_buff.data, self->tx_buff.len);
  410. self->tx_buff.data += actual;
  411. self->tx_buff.len  -= actual;
  412. } else {
  413. /* 
  414.  *  Now serial buffer is almost free & we can start 
  415.  *  transmission of another packet. But first we must check
  416.  *  if we need to change the speed of the hardware
  417.  */
  418. if (self->new_speed) {
  419. IRDA_DEBUG(5, __FUNCTION__ "(), Changing speed!n");
  420. irda_task_execute(self, __irport_change_speed, 
  421.   irport_change_speed_complete, 
  422.   NULL, (void *) self->new_speed);
  423. self->new_speed = 0;
  424. } else {
  425. /* Tell network layer that we want more frames */
  426. netif_wake_queue(self->netdev);
  427. }
  428. self->stats.tx_packets++;
  429. /* 
  430.  * Reset Rx FIFO to make sure that all reflected transmit data
  431.  * is discarded. This is needed for half duplex operation
  432.  */
  433. fcr = UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR;
  434. if (self->io.speed < 38400)
  435. fcr |= UART_FCR_TRIGGER_1;
  436. else 
  437. fcr |= UART_FCR_TRIGGER_14;
  438. outb(fcr, iobase+UART_FCR);
  439. /* Turn on receive interrupts */
  440. outb(UART_IER_RDI, iobase+UART_IER);
  441. }
  442. }
  443. /*
  444.  * Function irport_write (driver)
  445.  *
  446.  *    Fill Tx FIFO with transmit data
  447.  *
  448.  */
  449. static int irport_write(int iobase, int fifo_size, __u8 *buf, int len)
  450. {
  451. int actual = 0;
  452. /* Tx FIFO should be empty! */
  453. if (!(inb(iobase+UART_LSR) & UART_LSR_THRE)) {
  454. IRDA_DEBUG(0, __FUNCTION__ "(), failed, fifo not empty!n");
  455. return 0;
  456. }
  457.         
  458. /* Fill FIFO with current frame */
  459. while ((fifo_size-- > 0) && (actual < len)) {
  460. /* Transmit next byte */
  461. outb(buf[actual], iobase+UART_TX);
  462. actual++;
  463. }
  464.         
  465. return actual;
  466. }
  467. /*
  468.  * Function irport_change_speed_complete (task)
  469.  *
  470.  *    Called when the change speed operation completes
  471.  *
  472.  */
  473. static int irport_change_speed_complete(struct irda_task *task)
  474. {
  475. struct irport_cb *self;
  476. IRDA_DEBUG(0, __FUNCTION__ "()n");
  477. self = (struct irport_cb *) task->instance;
  478. ASSERT(self != NULL, return -1;);
  479. ASSERT(self->netdev != NULL, return -1;);
  480. /* Finished changing speed, so we are not busy any longer */
  481. /* Signal network layer so it can try to send the frame */
  482. netif_wake_queue(self->netdev);
  483. return 0;
  484. }
  485. /*
  486.  * Function irport_timeout (struct net_device *dev)
  487.  *
  488.  *    The networking layer thinks we timed out.
  489.  *
  490.  */
  491. static void irport_timeout(struct net_device *dev)
  492. {
  493. struct irport_cb *self;
  494. int iobase;
  495. self = (struct irport_cb *) dev->priv;
  496. iobase = self->io.sir_base;
  497. WARNING("%s: transmit timed outn", dev->name);
  498. irport_start(self);
  499. self->change_speed(self->priv, self->io.speed);
  500. dev->trans_start = jiffies;
  501. netif_wake_queue(dev);
  502. }
  503.  
  504. /*
  505.  * Function irport_hard_start_xmit (struct sk_buff *skb, struct net_device *dev)
  506.  *
  507.  *    Transmits the current frame until FIFO is full, then
  508.  *    waits until the next transmitt interrupt, and continues until the
  509.  *    frame is transmitted.
  510.  */
  511. int irport_hard_xmit(struct sk_buff *skb, struct net_device *dev)
  512. {
  513. struct irport_cb *self;
  514. unsigned long flags;
  515. int iobase;
  516. s32 speed;
  517. IRDA_DEBUG(0, __FUNCTION__ "()n");
  518. ASSERT(dev != NULL, return 0;);
  519. self = (struct irport_cb *) dev->priv;
  520. ASSERT(self != NULL, return 0;);
  521. iobase = self->io.sir_base;
  522. netif_stop_queue(dev);
  523. /* Check if we need to change the speed */
  524. speed = irda_get_next_speed(skb);
  525. if ((speed != self->io.speed) && (speed != -1)) {
  526. /* Check for empty frame */
  527. if (!skb->len) {
  528. irda_task_execute(self, __irport_change_speed, 
  529.   irport_change_speed_complete, 
  530.   NULL, (void *) speed);
  531. dev_kfree_skb(skb);
  532. return 0;
  533. } else
  534. self->new_speed = speed;
  535. }
  536. spin_lock_irqsave(&self->lock, flags);
  537. /* Init tx buffer */
  538. self->tx_buff.data = self->tx_buff.head;
  539.         /* Copy skb to tx_buff while wrapping, stuffing and making CRC */
  540. self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, 
  541.    self->tx_buff.truesize);
  542. self->stats.tx_bytes += self->tx_buff.len;
  543. /* Turn on transmit finished interrupt. Will fire immediately!  */
  544. outb(UART_IER_THRI, iobase+UART_IER); 
  545. spin_unlock_irqrestore(&self->lock, flags);
  546. dev_kfree_skb(skb);
  547. return 0;
  548. }
  549.         
  550. /*
  551.  * Function irport_receive (self)
  552.  *
  553.  *    Receive one frame from the infrared port
  554.  *
  555.  */
  556. static void irport_receive(struct irport_cb *self) 
  557. {
  558. int boguscount = 0;
  559. int iobase;
  560. ASSERT(self != NULL, return;);
  561. iobase = self->io.sir_base;
  562. /*  
  563.  * Receive all characters in Rx FIFO, unwrap and unstuff them. 
  564.          * async_unwrap_char will deliver all found frames  
  565.  */
  566. do {
  567. async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, 
  568.   inb(iobase+UART_RX));
  569. /* Make sure we don't stay here to long */
  570. if (boguscount++ > 32) {
  571. IRDA_DEBUG(2,__FUNCTION__ "(), breaking!n");
  572. break;
  573. }
  574. } while (inb(iobase+UART_LSR) & UART_LSR_DR);
  575. }
  576. /*
  577.  * Function irport_interrupt (irq, dev_id, regs)
  578.  *
  579.  *    Interrupt handler
  580.  */
  581. void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
  582. {
  583. struct net_device *dev = (struct net_device *) dev_id;
  584. struct irport_cb *self;
  585. int boguscount = 0;
  586. int iobase;
  587. int iir, lsr;
  588. if (!dev) {
  589. WARNING(__FUNCTION__ "() irq %d for unknown device.n", irq);
  590. return;
  591. }
  592. self = (struct irport_cb *) dev->priv;
  593. spin_lock(&self->lock);
  594. iobase = self->io.sir_base;
  595. iir = inb(iobase+UART_IIR) & UART_IIR_ID;
  596. while (iir) {
  597. /* Clear interrupt */
  598. lsr = inb(iobase+UART_LSR);
  599. IRDA_DEBUG(4, __FUNCTION__ 
  600.    "(), iir=%02x, lsr=%02x, iobase=%#xn", 
  601.    iir, lsr, iobase);
  602. switch (iir) {
  603. case UART_IIR_RLSI:
  604. IRDA_DEBUG(2, __FUNCTION__ "(), RLSIn");
  605. break;
  606. case UART_IIR_RDI:
  607. /* Receive interrupt */
  608. irport_receive(self);
  609. break;
  610. case UART_IIR_THRI:
  611. if (lsr & UART_LSR_THRE)
  612. /* Transmitter ready for data */
  613. irport_write_wakeup(self);
  614. break;
  615. default:
  616. IRDA_DEBUG(0, __FUNCTION__ "(), unhandled IIR=%#xn", iir);
  617. break;
  618. /* Make sure we don't stay here to long */
  619. if (boguscount++ > 100)
  620. break;
  621.           iir = inb(iobase + UART_IIR) & UART_IIR_ID;
  622. }
  623. spin_unlock(&self->lock);
  624. }
  625. static int irport_net_init(struct net_device *dev)
  626. {
  627. /* Set up to be a normal IrDA network device driver */
  628. irda_device_setup(dev);
  629. /* Insert overrides below this line! */
  630. return 0;
  631. }
  632. /*
  633.  * Function irport_net_open (dev)
  634.  *
  635.  *    Network device is taken up. Usually this is done by "ifconfig irda0 up" 
  636.  *   
  637.  */
  638. int irport_net_open(struct net_device *dev)
  639. {
  640. struct irport_cb *self;
  641. int iobase;
  642. char hwname[16];
  643. IRDA_DEBUG(0, __FUNCTION__ "()n");
  644. ASSERT(dev != NULL, return -1;);
  645. self = (struct irport_cb *) dev->priv;
  646. iobase = self->io.sir_base;
  647. if (request_irq(self->io.irq, self->interrupt, 0, dev->name, 
  648. (void *) dev)) {
  649. IRDA_DEBUG(0, __FUNCTION__ "(), unable to allocate irq=%dn",
  650.    self->io.irq);
  651. return -EAGAIN;
  652. }
  653. irport_start(self);
  654. /* Give self a hardware name */
  655. sprintf(hwname, "SIR @ 0x%03x", self->io.sir_base);
  656. /* 
  657.  * Open new IrLAP layer instance, now that everything should be
  658.  * initialized properly 
  659.  */
  660. self->irlap = irlap_open(dev, &self->qos, hwname);
  661. /* FIXME: change speed of dongle */
  662. /* Ready to play! */
  663. netif_start_queue(dev);
  664. MOD_INC_USE_COUNT;
  665. return 0;
  666. }
  667. /*
  668.  * Function irport_net_close (self)
  669.  *
  670.  *    Network device is taken down. Usually this is done by 
  671.  *    "ifconfig irda0 down" 
  672.  */
  673. int irport_net_close(struct net_device *dev)
  674. {
  675. struct irport_cb *self;
  676. int iobase;
  677. IRDA_DEBUG(4, __FUNCTION__ "()n");
  678. ASSERT(dev != NULL, return -1;);
  679. self = (struct irport_cb *) dev->priv;
  680. ASSERT(self != NULL, return -1;);
  681. iobase = self->io.sir_base;
  682. /* Stop device */
  683. netif_stop_queue(dev);
  684. /* Stop and remove instance of IrLAP */
  685. if (self->irlap)
  686. irlap_close(self->irlap);
  687. self->irlap = NULL;
  688. irport_stop(self);
  689. free_irq(self->io.irq, dev);
  690. MOD_DEC_USE_COUNT;
  691. return 0;
  692. }
  693. /*
  694.  * Function irport_wait_until_sent (self)
  695.  *
  696.  *    Delay exectution until finished transmitting
  697.  *
  698.  */
  699. #if 0
  700. void irport_wait_until_sent(struct irport_cb *self)
  701. {
  702. int iobase;
  703. iobase = self->io.sir_base;
  704. /* Wait until Tx FIFO is empty */
  705. while (!(inb(iobase+UART_LSR) & UART_LSR_THRE)) {
  706. IRDA_DEBUG(2, __FUNCTION__ "(), waiting!n");
  707. current->state = TASK_INTERRUPTIBLE;
  708. schedule_timeout(MSECS_TO_JIFFIES(60));
  709. }
  710. }
  711. #endif
  712. /*
  713.  * Function irport_is_receiving (self)
  714.  *
  715.  *    Returns true is we are currently receiving data
  716.  *
  717.  */
  718. static int irport_is_receiving(struct irport_cb *self)
  719. {
  720. return (self->rx_buff.state != OUTSIDE_FRAME);
  721. }
  722. /*
  723.  * Function irport_set_dtr_rts (tty, dtr, rts)
  724.  *
  725.  *    This function can be used by dongles etc. to set or reset the status
  726.  *    of the dtr and rts lines
  727.  */
  728. static int irport_set_dtr_rts(struct net_device *dev, int dtr, int rts)
  729. {
  730. struct irport_cb *self = dev->priv;
  731. int iobase;
  732. ASSERT(self != NULL, return -1;);
  733. iobase = self->io.sir_base;
  734. if (dtr)
  735. dtr = UART_MCR_DTR;
  736. if (rts)
  737. rts = UART_MCR_RTS;
  738. outb(dtr|rts|UART_MCR_OUT2, iobase+UART_MCR);
  739. return 0;
  740. }
  741. static int irport_raw_write(struct net_device *dev, __u8 *buf, int len)
  742. {
  743. struct irport_cb *self = (struct irport_cb *) dev->priv;
  744. int actual = 0;
  745. int iobase;
  746. ASSERT(self != NULL, return -1;);
  747. iobase = self->io.sir_base;
  748. /* Tx FIFO should be empty! */
  749. if (!(inb(iobase+UART_LSR) & UART_LSR_THRE)) {
  750. IRDA_DEBUG( 0, __FUNCTION__ "(), failed, fifo not empty!n");
  751. return -1;
  752. }
  753.         
  754. /* Fill FIFO with current frame */
  755. while (actual < len) {
  756. /* Transmit next byte */
  757. outb(buf[actual], iobase+UART_TX);
  758. actual++;
  759. }
  760. return actual;
  761. }
  762. /*
  763.  * Function irport_net_ioctl (dev, rq, cmd)
  764.  *
  765.  *    Process IOCTL commands for this device
  766.  *
  767.  */
  768. static int irport_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  769. {
  770. struct if_irda_req *irq = (struct if_irda_req *) rq;
  771. struct irport_cb *self;
  772. dongle_t *dongle;
  773. unsigned long flags;
  774. int ret = 0;
  775. ASSERT(dev != NULL, return -1;);
  776. self = dev->priv;
  777. ASSERT(self != NULL, return -1;);
  778. IRDA_DEBUG(2, __FUNCTION__ "(), %s, (cmd=0x%X)n", dev->name, cmd);
  779. /* Disable interrupts & save flags */
  780. save_flags(flags);
  781. cli();
  782. switch (cmd) {
  783. case SIOCSBANDWIDTH: /* Set bandwidth */
  784. if (!capable(CAP_NET_ADMIN))
  785. ret = -EPERM;
  786.                 else
  787. irda_task_execute(self, __irport_change_speed, NULL, 
  788.   NULL, (void *) irq->ifr_baudrate);
  789. break;
  790. case SIOCSDONGLE: /* Set dongle */
  791. if (!capable(CAP_NET_ADMIN)) {
  792. ret = -EPERM;
  793. break;
  794. }
  795. /* Initialize dongle */
  796. dongle = irda_device_dongle_init(dev, irq->ifr_dongle);
  797. if (!dongle)
  798. break;
  799. dongle->set_mode    = NULL;
  800. dongle->read        = NULL;
  801. dongle->write       = irport_raw_write;
  802. dongle->set_dtr_rts = irport_set_dtr_rts;
  803. self->dongle = dongle;
  804. /* Now initialize the dongle!  */
  805. dongle->issue->open(dongle, &self->qos);
  806. /* Reset dongle */
  807. irda_task_execute(dongle, dongle->issue->reset, NULL, NULL, 
  808.   NULL);
  809. break;
  810. case SIOCSMEDIABUSY: /* Set media busy */
  811. if (!capable(CAP_NET_ADMIN)) {
  812. ret = -EPERM;
  813. break;
  814. }
  815. irda_device_set_media_busy(self->netdev, TRUE);
  816. break;
  817. case SIOCGRECEIVING: /* Check if we are receiving right now */
  818. irq->ifr_receiving = irport_is_receiving(self);
  819. break;
  820. case SIOCSDTRRTS:
  821. if (!capable(CAP_NET_ADMIN)) {
  822. ret = -EPERM;
  823. break;
  824. }
  825. irport_set_dtr_rts(dev, irq->ifr_dtr, irq->ifr_rts);
  826. break;
  827. default:
  828. ret = -EOPNOTSUPP;
  829. }
  830. restore_flags(flags);
  831. return ret;
  832. }
  833. static struct net_device_stats *irport_net_get_stats(struct net_device *dev)
  834. {
  835. struct irport_cb *self = (struct irport_cb *) dev->priv;
  836. return &self->stats;
  837. }
  838. #ifdef MODULE
  839. MODULE_PARM(io, "1-4i");
  840. MODULE_PARM_DESC(io, "Base I/O addresses");
  841. MODULE_PARM(irq, "1-4i");
  842. MODULE_PARM_DESC(irq, "IRQ lines");
  843. MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
  844. MODULE_DESCRIPTION("Half duplex serial driver for IrDA SIR mode");
  845. MODULE_LICENSE("GPL");
  846. void cleanup_module(void)
  847. {
  848. irport_cleanup();
  849. }
  850. int init_module(void)
  851. {
  852. return irport_init();
  853. }
  854. #endif /* MODULE */