au1k_ir.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:20k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Alchemy Semi Au1000 IrDA driver
  4.  *
  5.  * Copyright 2001 MontaVista Software Inc.
  6.  * Author: MontaVista Software, Inc.
  7.  *          ppopov@mvista.com or source@mvista.com
  8.  *
  9.  * ########################################################################
  10.  *
  11.  *  This program is free software; you can distribute it and/or modify it
  12.  *  under the terms of the GNU General Public License (Version 2) as
  13.  *  published by the Free Software Foundation.
  14.  *
  15.  *  This program is distributed in the hope it will be useful, but WITHOUT
  16.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  18.  *  for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License along
  21.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  22.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  23.  *
  24.  * ########################################################################
  25.  *
  26.  * 
  27.  */
  28. #ifndef __mips__
  29. #error This driver only works with MIPS architectures!
  30. #endif
  31. #include <linux/config.h>
  32. #include <linux/module.h>
  33. #include <linux/types.h>
  34. #include <linux/init.h>
  35. #include <linux/errno.h>
  36. #include <linux/netdevice.h>
  37. #include <linux/slab.h>
  38. #include <linux/rtnetlink.h>
  39. #include <linux/interrupt.h>
  40. #include <linux/pm.h>
  41. #include <asm/irq.h>
  42. #include <asm/bitops.h>
  43. #include <asm/io.h>
  44. #include <asm/au1000.h>
  45. #include <asm/pb1000.h>
  46. #include <net/irda/irda.h>
  47. #include <net/irda/irmod.h>
  48. #include <net/irda/wrapper.h>
  49. #include <net/irda/irda_device.h>
  50. #include "net/irda/au1000_ircc.h"
  51. static int au1k_irda_net_init(struct net_device *);
  52. static int au1k_irda_start(struct net_device *);
  53. static int au1k_irda_stop(struct net_device *dev);
  54. static int au1k_irda_hard_xmit(struct sk_buff *, struct net_device *);
  55. static int au1k_irda_rx(struct net_device *);
  56. static void au1k_irda_interrupt(int, void *, struct pt_regs *);
  57. static void au1k_tx_timeout(struct net_device *);
  58. static struct net_device_stats *au1k_irda_stats(struct net_device *);
  59. static int au1k_irda_ioctl(struct net_device *, struct ifreq *, int);
  60. static int au1k_irda_set_speed(struct net_device *dev, int speed);
  61. static void *dma_alloc(size_t, dma_addr_t *);
  62. static void dma_free(void *, size_t);
  63. static int qos_mtt_bits = 0x07;  /* 1 ms or more */
  64. static struct net_device *ir_devs[NUM_IR_IFF];
  65. static char version[] __devinitdata =
  66.     "au1k_ircc:1.0 ppopov@mvista.comn";
  67. #define RUN_AT(x) (jiffies + (x))
  68. /*
  69.  * IrDA peripheral bug. You have to read the register
  70.  * twice to get the right value.
  71.  */
  72. u32 read_ir_reg(u32 addr) 
  73. readl(addr);
  74. return readl(addr);
  75. }
  76. /*
  77.  * Buffer allocation/deallocation routines. The buffer descriptor returned
  78.  * has the virtual and dma address of a buffer suitable for 
  79.  * both, receive and transmit operations.
  80.  */
  81. static db_dest_t *GetFreeDB(struct au1k_private *aup)
  82. {
  83. db_dest_t *pDB;
  84. pDB = aup->pDBfree;
  85. if (pDB) {
  86. aup->pDBfree = pDB->pnext;
  87. }
  88. return pDB;
  89. }
  90. static void ReleaseDB(struct au1k_private *aup, db_dest_t *pDB)
  91. {
  92. db_dest_t *pDBfree = aup->pDBfree;
  93. if (pDBfree)
  94. pDBfree->pnext = pDB;
  95. aup->pDBfree = pDB;
  96. }
  97. /*
  98.   DMA memory allocation, derived from pci_alloc_consistent.
  99.   However, the Au1000 data cache is coherent (when programmed
  100.   so), therefore we return KSEG0 address, not KSEG1.
  101. */
  102. static void *dma_alloc(size_t size, dma_addr_t * dma_handle)
  103. {
  104. void *ret;
  105. int gfp = GFP_ATOMIC | GFP_DMA;
  106. ret = (void *) __get_free_pages(gfp, get_order(size));
  107. if (ret != NULL) {
  108. memset(ret, 0, size);
  109. *dma_handle = virt_to_bus(ret);
  110. ret = KSEG0ADDR(ret);
  111. }
  112. return ret;
  113. }
  114. static void dma_free(void *vaddr, size_t size)
  115. {
  116. vaddr = KSEG0ADDR(vaddr);
  117. free_pages((unsigned long) vaddr, get_order(size));
  118. }
  119. static void 
  120. setup_hw_rings(struct au1k_private *aup, u32 rx_base, u32 tx_base)
  121. {
  122. int i;
  123. for (i=0; i<NUM_IR_DESC; i++) {
  124. aup->rx_ring[i] = (volatile ring_dest_t *) 
  125. (rx_base + sizeof(ring_dest_t)*i);
  126. }
  127. for (i=0; i<NUM_IR_DESC; i++) {
  128. aup->tx_ring[i] = (volatile ring_dest_t *) 
  129. (tx_base + sizeof(ring_dest_t)*i);
  130. }
  131. }
  132. /* 
  133.  * Device has already been stopped at this point.
  134.  */
  135. static void au1k_irda_net_uninit(struct net_device *dev)
  136. {
  137. dev->hard_start_xmit = NULL;
  138. dev->open            = NULL;
  139. dev->stop            = NULL;
  140. dev->do_ioctl        = NULL;
  141. dev->get_stats       = NULL;
  142. dev->priv            = NULL;
  143. }
  144. static int au1k_irda_init(void)
  145. {
  146. static unsigned version_printed = 0;
  147. struct net_device *dev;
  148. int err;
  149. if (version_printed++ == 0) printk(version);
  150. rtnl_lock();
  151. dev = dev_alloc("irda%d", &err);
  152. if (dev) {
  153. dev->irq = AU1000_IRDA_RX_INT; /* TX has its own interrupt */
  154. dev->init = au1k_irda_net_init;
  155. dev->uninit = au1k_irda_net_uninit;
  156. err = register_netdevice(dev);
  157. if (err)
  158. kfree(dev);
  159. else
  160. ir_devs[0] = dev;
  161. printk(KERN_INFO "IrDA: Registered device %sn", dev->name);
  162. }
  163. rtnl_unlock();
  164. return err;
  165. }
  166. static int au1k_irda_init_iobuf(iobuff_t *io, int size)
  167. {
  168. io->head = kmalloc(size, GFP_KERNEL);
  169. if (io->head != NULL) {
  170. io->truesize = size;
  171. io->in_frame = FALSE;
  172. io->state    = OUTSIDE_FRAME;
  173. io->data     = io->head;
  174. }
  175. return io->head ? 0 : -ENOMEM;
  176. }
  177. static int au1k_irda_net_init(struct net_device *dev)
  178. {
  179. struct au1k_private *aup = NULL;
  180. int i, retval = 0, err;
  181. db_dest_t *pDB, *pDBfree;
  182. unsigned long temp;
  183. dev->priv = kmalloc(sizeof(struct au1k_private), GFP_KERNEL);
  184. if (dev->priv == NULL) {
  185. retval = -ENOMEM;
  186. goto out;
  187. }
  188. memset(dev->priv, 0, sizeof(struct au1k_private));
  189. aup = dev->priv;
  190. err = au1k_irda_init_iobuf(&aup->rx_buff, 14384);
  191. if (err)
  192. goto out;
  193. dev->open = au1k_irda_start;
  194. dev->hard_start_xmit = au1k_irda_hard_xmit;
  195. dev->stop = au1k_irda_stop;
  196. dev->get_stats = au1k_irda_stats;
  197. dev->do_ioctl = au1k_irda_ioctl;
  198. dev->tx_timeout = au1k_tx_timeout;
  199. irda_device_setup(dev);
  200. irda_init_max_qos_capabilies(&aup->qos);
  201. /* The only value we must override it the baudrate */
  202. aup->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
  203. IR_115200|IR_576000 |(IR_4000000 << 8);
  204. aup->qos.min_turn_time.bits = qos_mtt_bits;
  205. irda_qos_bits_to_value(&aup->qos);
  206. /* Tx ring follows rx ring + 512 bytes */
  207. /* we need a 1k aligned buffer */
  208. aup->rx_ring[0] = (ring_dest_t *)
  209. dma_alloc(2*MAX_NUM_IR_DESC*(sizeof(ring_dest_t)), &temp);
  210. /* allocate the data buffers */
  211. aup->db[0].vaddr = 
  212. (void *)dma_alloc(MAX_BUF_SIZE * 2*NUM_IR_DESC, &temp);
  213. if (!aup->db[0].vaddr || !aup->rx_ring[0]) {
  214. retval = -ENOMEM;
  215. goto out;
  216. }
  217. setup_hw_rings(aup, (u32)aup->rx_ring[0], (u32)aup->rx_ring[0] + 512);
  218. pDBfree = NULL;
  219. pDB = aup->db;
  220. for (i=0; i<(2*NUM_IR_DESC); i++) {
  221. pDB->pnext = pDBfree;
  222. pDBfree = pDB;
  223. pDB->vaddr = 
  224. (u32 *)((unsigned)aup->db[0].vaddr + MAX_BUF_SIZE*i);
  225. pDB->dma_addr = (dma_addr_t)virt_to_bus(pDB->vaddr);
  226. pDB++;
  227. }
  228. aup->pDBfree = pDBfree;
  229. /* attach a data buffer to each descriptor */
  230. for (i=0; i<NUM_IR_DESC; i++) {
  231. pDB = GetFreeDB(aup);
  232. if (!pDB) goto out;
  233. aup->rx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
  234. aup->rx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
  235. aup->rx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
  236. aup->rx_ring[i]->addr_3 = (u8)((pDB->dma_addr>>24) & 0xff);
  237. aup->rx_db_inuse[i] = pDB;
  238. }
  239. for (i=0; i<NUM_IR_DESC; i++) {
  240. pDB = GetFreeDB(aup);
  241. if (!pDB) goto out;
  242. aup->tx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
  243. aup->tx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
  244. aup->tx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
  245. aup->tx_ring[i]->addr_3 = (u8)((pDB->dma_addr>>24) & 0xff);
  246. aup->tx_ring[i]->count_0 = 0;
  247. aup->tx_ring[i]->count_1 = 0;
  248. aup->tx_ring[i]->flags = 0;
  249. aup->tx_db_inuse[i] = pDB;
  250. }
  251. return 0;
  252. out:
  253. if (aup->db[0].vaddr) 
  254. dma_free((void *)aup->db[0].vaddr, 
  255. MAX_BUF_SIZE * 2*NUM_IR_DESC);
  256. if (aup->rx_ring[0])
  257. kfree((void *)aup->rx_ring[0]);
  258. if (aup->rx_buff.head)
  259. kfree(aup->rx_buff.head);
  260. if (dev->priv != NULL)
  261. kfree(dev->priv);
  262. unregister_netdevice(dev);
  263. printk(KERN_ERR "%s: au1k_init_module failed.  Returns %dn",
  264.        dev->name, retval);
  265. return retval;
  266. }
  267. static int au1k_init(struct net_device *dev)
  268. {
  269. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  270. int i;
  271. u32 control;
  272. u32 ring_address;
  273. /* bring the device out of reset */
  274. control = 0xe; /* coherent, clock enable, one half system clock */
  275.   
  276. #ifndef CONFIG_CPU_LITTLE_ENDIAN
  277. control |= 1;
  278. #endif
  279. aup->tx_head = 0;
  280. aup->tx_tail = 0;
  281. aup->rx_head = 0;
  282. for (i=0; i<NUM_IR_DESC; i++) {
  283. aup->rx_ring[i]->flags = AU_OWN;
  284. }
  285. writel(control, IR_INTERFACE_CONFIG);
  286. au_sync_delay(10);
  287. writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE); /* disable PHY */
  288. au_sync_delay(1);
  289. writel(MAX_BUF_SIZE, IR_MAX_PKT_LEN);
  290. ring_address = (u32)virt_to_phys((void *)aup->rx_ring[0]);
  291. writel(ring_address >> 26, IR_RING_BASE_ADDR_H);
  292. writel((ring_address >> 10) & 0xffff, IR_RING_BASE_ADDR_L);
  293. writel(RING_SIZE_64<<8 | RING_SIZE_64<<12, IR_RING_SIZE);
  294. writel(1<<2 | IR_ONE_PIN, IR_CONFIG_2); /* 48MHz */
  295. writel(0, IR_RING_ADDR_CMPR);
  296. au1k_irda_set_speed(dev, 9600);
  297. return 0;
  298. }
  299. static int au1k_irda_start(struct net_device *dev)
  300. {
  301. int retval;
  302. char hwname[32];
  303. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  304. MOD_INC_USE_COUNT;
  305. if ((retval = au1k_init(dev))) {
  306. printk(KERN_ERR "%s: error in au1k_initn", dev->name);
  307. MOD_DEC_USE_COUNT;
  308. return retval;
  309. }
  310. if ((retval = request_irq(AU1000_IRDA_TX_INT, &au1k_irda_interrupt, 
  311. 0, dev->name, dev))) {
  312. printk(KERN_ERR "%s: unable to get IRQ %dn", 
  313. dev->name, dev->irq);
  314. MOD_DEC_USE_COUNT;
  315. return retval;
  316. }
  317. if ((retval = request_irq(AU1000_IRDA_RX_INT, &au1k_irda_interrupt, 
  318. 0, dev->name, dev))) {
  319. free_irq(AU1000_IRDA_TX_INT, dev);
  320. printk(KERN_ERR "%s: unable to get IRQ %dn", 
  321. dev->name, dev->irq);
  322. MOD_DEC_USE_COUNT;
  323. return retval;
  324. }
  325. /* Give self a hardware name */
  326. sprintf(hwname, "Au1000 SIR/FIR");
  327. aup->irlap = irlap_open(dev, &aup->qos, hwname);
  328. netif_start_queue(dev);
  329. writel(read_ir_reg(IR_CONFIG_2) | 1<<8, IR_CONFIG_2); /* int enable */
  330. aup->timer.expires = RUN_AT((3*HZ)); 
  331. aup->timer.data = (unsigned long)dev;
  332. return 0;
  333. }
  334. static int au1k_irda_stop(struct net_device *dev)
  335. {
  336. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  337. /* disable interrupts */
  338. writel(read_ir_reg(IR_CONFIG_2) & ~(1<<8), IR_CONFIG_2);
  339. writel(0, IR_CONFIG_1); 
  340. writel(0, IR_INTERFACE_CONFIG); /* disable clock */
  341. au_sync();
  342. if (aup->irlap) {
  343. irlap_close(aup->irlap);
  344. aup->irlap = NULL;
  345. }
  346. netif_stop_queue(dev);
  347. del_timer(&aup->timer);
  348. /* disable the interrupt */
  349. free_irq(AU1000_IRDA_TX_INT, dev);
  350. free_irq(AU1000_IRDA_RX_INT, dev);
  351. MOD_DEC_USE_COUNT;
  352. return 0;
  353. }
  354. static void __exit au1k_irda_exit(void)
  355. {
  356. struct net_device *dev = ir_devs[0];
  357. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  358. if (!dev) {
  359. printk(KERN_ERR "au1k_ircc no dev foundn");
  360. return;
  361. }
  362. if (aup->db[0].vaddr)  {
  363. dma_free((void *)aup->db[0].vaddr, 
  364. MAX_BUF_SIZE * 2*NUM_IR_DESC);
  365. aup->db[0].vaddr = 0;
  366. }
  367. if (aup->rx_ring[0]) {
  368. dma_free((void *)aup->rx_ring[0], 
  369. 2*MAX_NUM_IR_DESC*(sizeof(ring_dest_t)));
  370. aup->rx_ring[0] = 0;
  371. }
  372. rtnl_lock();
  373. unregister_netdevice(dev);
  374. rtnl_unlock();
  375. ir_devs[0] = 0;
  376. }
  377. static inline void 
  378. update_tx_stats(struct net_device *dev, u32 status, u32 pkt_len)
  379. {
  380. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  381. struct net_device_stats *ps = &aup->stats;
  382. ps->tx_packets++;
  383. ps->tx_bytes += pkt_len;
  384. if (status & IR_TX_ERROR) {
  385. ps->tx_errors++;
  386. ps->tx_aborted_errors++;
  387. }
  388. }
  389. static void au1k_tx_ack(struct net_device *dev)
  390. {
  391. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  392. volatile ring_dest_t *ptxd;
  393. ptxd = aup->tx_ring[aup->tx_tail];
  394. while (!(ptxd->flags & AU_OWN) && (aup->tx_tail != aup->tx_head)) {
  395. update_tx_stats(dev, ptxd->flags, 
  396. ptxd->count_1<<8 | ptxd->count_0);
  397. ptxd->count_0 = 0;
  398. ptxd->count_1 = 0;
  399. au_sync();
  400. aup->tx_tail = (aup->tx_tail + 1) & (NUM_IR_DESC - 1);
  401. ptxd = aup->tx_ring[aup->tx_tail];
  402. if (aup->tx_full) {
  403. aup->tx_full = 0;
  404. netif_wake_queue(dev);
  405. }
  406. }
  407. if (aup->tx_tail == aup->tx_head) {
  408. if (aup->newspeed) {
  409. au1k_irda_set_speed(dev, aup->newspeed);
  410. aup->newspeed = 0;
  411. }
  412. else {
  413. writel(read_ir_reg(IR_CONFIG_1) & ~IR_TX_ENABLE, 
  414. IR_CONFIG_1); 
  415. au_sync();
  416. writel(read_ir_reg(IR_CONFIG_1) | IR_RX_ENABLE, 
  417. IR_CONFIG_1); 
  418. writel(0, IR_RING_PROMPT);
  419. au_sync();
  420. }
  421. }
  422. }
  423. /*
  424.  * Au1000 transmit routine.
  425.  */
  426. static int au1k_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
  427. {
  428. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  429. int speed = irda_get_next_speed(skb);
  430. volatile ring_dest_t *ptxd;
  431. u32 len;
  432. u32 flags;
  433. db_dest_t *pDB;
  434. if (speed != aup->speed && speed != -1) {
  435. aup->newspeed = speed;
  436. }
  437. if ((skb->len == 0) && (aup->newspeed)) {
  438. if (aup->tx_tail == aup->tx_head) {
  439. au1k_irda_set_speed(dev, speed);
  440. aup->newspeed = 0;
  441. }
  442. dev_kfree_skb(skb);
  443. return 0;
  444. }
  445. ptxd = aup->tx_ring[aup->tx_head];
  446. flags = ptxd->flags;
  447. if (flags & AU_OWN) {
  448. printk(KERN_INFO "%s: tx_fulln", dev->name);
  449. netif_stop_queue(dev);
  450. aup->tx_full = 1;
  451. return 1;
  452. }
  453. else if (((aup->tx_head + 1) & (NUM_IR_DESC - 1)) == aup->tx_tail) {
  454. printk(KERN_INFO "%s: tx_fulln", dev->name);
  455. netif_stop_queue(dev);
  456. aup->tx_full = 1;
  457. return 1;
  458. }
  459. pDB = aup->tx_db_inuse[aup->tx_head];
  460. #if 0
  461. if (read_ir_reg(IR_RX_BYTE_CNT) != 0) {
  462. printk("tx warning: rx byte cnt %xn", 
  463. read_ir_reg(IR_RX_BYTE_CNT));
  464. }
  465. #endif
  466. if (aup->speed == 4000000) {
  467. /* FIR */
  468. memcpy((void *)pDB->vaddr, skb->data, skb->len);
  469. ptxd->count_0 = skb->len & 0xff;
  470. ptxd->count_1 = (skb->len >> 8) & 0xff;
  471. }
  472. else {
  473. /* SIR */
  474. len = async_wrap_skb(skb, (u8 *)pDB->vaddr, MAX_BUF_SIZE);
  475. ptxd->count_0 = len & 0xff;
  476. ptxd->count_1 = (len >> 8) & 0xff;
  477. ptxd->flags |= IR_DIS_CRC;
  478. }
  479. ptxd->flags |= AU_OWN;
  480. au_sync();
  481. writel(read_ir_reg(IR_CONFIG_1) | IR_TX_ENABLE, IR_CONFIG_1); 
  482. writel(0, IR_RING_PROMPT);
  483. au_sync();
  484. dev_kfree_skb(skb);
  485. aup->tx_head = (aup->tx_head + 1) & (NUM_IR_DESC - 1);
  486. dev->trans_start = jiffies;
  487. return 0;
  488. }
  489. static inline void 
  490. update_rx_stats(struct net_device *dev, u32 status, u32 count)
  491. {
  492. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  493. struct net_device_stats *ps = &aup->stats;
  494. ps->rx_packets++;
  495. if (status & IR_RX_ERROR) {
  496. ps->rx_errors++;
  497. if (status & (IR_PHY_ERROR|IR_FIFO_OVER))
  498. ps->rx_missed_errors++;
  499. if (status & IR_MAX_LEN)
  500. ps->rx_length_errors++;
  501. if (status & IR_CRC_ERROR)
  502. ps->rx_crc_errors++;
  503. }
  504. else 
  505. ps->rx_bytes += count;
  506. }
  507. /*
  508.  * Au1000 receive routine.
  509.  */
  510. static int au1k_irda_rx(struct net_device *dev)
  511. {
  512. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  513. struct sk_buff *skb;
  514. volatile ring_dest_t *prxd;
  515. u32 flags, count;
  516. db_dest_t *pDB;
  517. prxd = aup->rx_ring[aup->rx_head];
  518. flags = prxd->flags;
  519. while (!(flags & AU_OWN))  {
  520. pDB = aup->rx_db_inuse[aup->rx_head];
  521. count = prxd->count_1<<8 | prxd->count_0;
  522. if (!(flags & IR_RX_ERROR))  {
  523. /* good frame */
  524. update_rx_stats(dev, flags, count);
  525. skb=alloc_skb(count+1,GFP_ATOMIC);
  526. if (skb == NULL) {
  527. aup->stats.rx_dropped++;
  528. continue;
  529. }
  530. skb_reserve(skb, 1);
  531. if (aup->speed == 4000000)
  532. skb_put(skb, count);
  533. else
  534. skb_put(skb, count-2);
  535. memcpy(skb->data, (void *)pDB->vaddr, count-2);
  536. skb->dev = dev;
  537. skb->mac.raw = skb->data;
  538. skb->protocol = htons(ETH_P_IRDA);
  539. netif_rx(skb);
  540. prxd->count_0 = 0;
  541. prxd->count_1 = 0;
  542. }
  543. prxd->flags |= AU_OWN;
  544. aup->rx_head = (aup->rx_head + 1) & (NUM_IR_DESC - 1);
  545. writel(0, IR_RING_PROMPT);
  546. au_sync();
  547. /* next descriptor */
  548. prxd = aup->rx_ring[aup->rx_head];
  549. flags = prxd->flags;
  550. dev->last_rx = jiffies;
  551. }
  552. return 0;
  553. }
  554. void au1k_irda_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  555. {
  556. struct net_device *dev = (struct net_device *) dev_id;
  557. if (dev == NULL) {
  558. printk(KERN_ERR "%s: isr: null dev ptrn", dev->name);
  559. return;
  560. }
  561. writel(0, IR_INT_CLEAR); /* ack irda interrupts */
  562. au1k_irda_rx(dev);
  563. au1k_tx_ack(dev);
  564. }
  565. /*
  566.  * The Tx ring has been full longer than the watchdog timeout
  567.  * value. The transmitter must be hung?
  568.  */
  569. static void au1k_tx_timeout(struct net_device *dev)
  570. {
  571. u32 speed;
  572. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  573. printk(KERN_ERR "%s: tx timeoutn", dev->name);
  574. speed = aup->speed;
  575. aup->speed = 0;
  576. au1k_irda_set_speed(dev, speed);
  577. aup->tx_full = 0;
  578. netif_wake_queue(dev);
  579. }
  580. /*
  581.  * Set the IrDA communications speed.
  582.  */
  583. static int 
  584. au1k_irda_set_speed(struct net_device *dev, int speed)
  585. {
  586. unsigned long flags;
  587. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  588. u32 control;
  589. int ret = 0, timeout = 10, i;
  590. volatile ring_dest_t *ptxd;
  591. if (speed == aup->speed)
  592. return ret;
  593. save_flags(flags);
  594. cli();
  595. /* disable PHY first */
  596. writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE);
  597. /* disable RX/TX */
  598. writel(read_ir_reg(IR_CONFIG_1) & ~(IR_RX_ENABLE|IR_TX_ENABLE), 
  599. IR_CONFIG_1);
  600. au_sync_delay(1);
  601. while (read_ir_reg(IR_ENABLE) & (IR_RX_STATUS | IR_TX_STATUS)) {
  602. mdelay(1);
  603. if (!timeout--) {
  604. printk(KERN_ERR "%s: rx/tx disable timeoutn",
  605. dev->name);
  606. break;
  607. }
  608. }
  609. /* disable DMA */
  610. writel(read_ir_reg(IR_CONFIG_1) & ~IR_DMA_ENABLE, IR_CONFIG_1);
  611. au_sync_delay(1);
  612. /* 
  613.  *  After we disable tx/rx. the index pointers
  614.    * go back to zero.
  615.  */
  616. aup->tx_head = aup->tx_tail = aup->rx_head = 0;
  617. for (i=0; i<NUM_IR_DESC; i++) {
  618. ptxd = aup->tx_ring[i];
  619. ptxd->flags = 0;
  620. ptxd->count_0 = 0;
  621. ptxd->count_1 = 0;
  622. }
  623. for (i=0; i<NUM_IR_DESC; i++) {
  624. ptxd = aup->rx_ring[i];
  625. ptxd->count_0 = 0;
  626. ptxd->count_1 = 0;
  627. ptxd->flags = AU_OWN;
  628. }
  629. if (speed == 4000000)
  630. writel(1<<13, CPLD_AUX1);
  631. else
  632. writel(readl(CPLD_AUX1) & ~(1<<13), CPLD_AUX1);
  633. switch (speed) {
  634. case 9600:
  635. writel(11<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
  636. writel(IR_SIR_MODE, IR_CONFIG_1); 
  637. break;
  638. case 19200:
  639. writel(5<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
  640. writel(IR_SIR_MODE, IR_CONFIG_1); 
  641. break;
  642. case 38400:
  643. writel(2<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
  644. writel(IR_SIR_MODE, IR_CONFIG_1); 
  645. break;
  646. case 57600:
  647. writel(1<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
  648. writel(IR_SIR_MODE, IR_CONFIG_1); 
  649. break;
  650. case 115200: 
  651. writel(12<<5, IR_WRITE_PHY_CONFIG); 
  652. writel(IR_SIR_MODE, IR_CONFIG_1); 
  653. break;
  654. case 4000000:
  655. writel(0xF, IR_WRITE_PHY_CONFIG);
  656. writel(IR_FIR|IR_DMA_ENABLE|IR_RX_ENABLE, IR_CONFIG_1); 
  657. break;
  658. default:
  659. printk(KERN_ERR "%s unsupported speed %xn", dev->name, speed);
  660. ret = -EINVAL;
  661. break;
  662. }
  663. aup->speed = speed;
  664. writel(read_ir_reg(IR_ENABLE) | 0x8000, IR_ENABLE);
  665. au_sync();
  666. control = read_ir_reg(IR_ENABLE);
  667. writel(0, IR_RING_PROMPT);
  668. au_sync();
  669. if (control & (1<<14)) {
  670. printk(KERN_ERR "%s: configuration errorn", dev->name);
  671. }
  672. else {
  673. if (control & (1<<11))
  674. printk(KERN_INFO "%s Valid SIR confign", dev->name);
  675. if (control & (1<<12))
  676. printk(KERN_INFO "%s Valid MIR confign", dev->name);
  677. if (control & (1<<13))
  678. printk(KERN_INFO "%s Valid FIR confign", dev->name);
  679. if (control & (1<<10))
  680. printk(KERN_INFO "%s TX enabledn", dev->name);
  681. if (control & (1<<9))
  682. printk(KERN_INFO "%s RX enabledn", dev->name);
  683. }
  684. restore_flags(flags);
  685. return ret;
  686. }
  687. static int 
  688. au1k_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
  689. {
  690. struct if_irda_req *rq = (struct if_irda_req *)ifreq;
  691. struct au1k_private *aup = dev->priv;
  692. int ret = -EOPNOTSUPP;
  693. switch (cmd) {
  694. case SIOCSBANDWIDTH:
  695. if (capable(CAP_NET_ADMIN)) {
  696. /*
  697.  * We are unable to set the speed if the
  698.  * device is not running.
  699.  */
  700. if (aup->open)
  701. ret = au1k_irda_set_speed(dev,
  702. rq->ifr_baudrate);
  703. else {
  704. printk(KERN_ERR "%s ioctl: !netif_runningn",
  705. dev->name);
  706. ret = 0;
  707. }
  708. }
  709. break;
  710. case SIOCSMEDIABUSY:
  711. ret = -EPERM;
  712. if (capable(CAP_NET_ADMIN)) {
  713. irda_device_set_media_busy(dev, TRUE);
  714. ret = 0;
  715. }
  716. break;
  717. case SIOCGRECEIVING:
  718. rq->ifr_receiving = 0;
  719. break;
  720. default:
  721. break;
  722. }
  723. return ret;
  724. }
  725. static struct net_device_stats *au1k_irda_stats(struct net_device *dev)
  726. {
  727. struct au1k_private *aup = (struct au1k_private *) dev->priv;
  728. return &aup->stats;
  729. }
  730. #ifdef MODULE
  731. MODULE_AUTHOR("Pete Popov <ppopov@mvista.com>");
  732. MODULE_DESCRIPTION("Au1000 IrDA Device Driver");
  733. module_init(au1k_irda_init);
  734. module_exit(au1k_irda_exit);
  735. #endif /* MODULE */