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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2. **
  3. **  RCpci45.c  
  4. **
  5. **
  6. **
  7. **  ---------------------------------------------------------------------
  8. **  ---     Copyright (c) 1998, 1999, RedCreek Communications Inc.    ---
  9. **  ---                   All rights reserved.                        ---
  10. **  ---------------------------------------------------------------------
  11. **
  12. ** Written by Pete Popov and Brian Moyle.
  13. **
  14. ** Known Problems
  15. ** 
  16. ** None known at this time.
  17. **
  18. **  This program is free software; you can redistribute it and/or modify
  19. **  it under the terms of the GNU General Public License as published by
  20. **  the Free Software Foundation; either version 2 of the License, or
  21. **  (at your option) any later version.
  22. **  This program is distributed in the hope that it will be useful,
  23. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25. **  GNU General Public License for more details.
  26. **  You should have received a copy of the GNU General Public License
  27. **  along with this program; if not, write to the Free Software
  28. **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  29. **
  30. **  Pete Popov, Oct 2001: Fixed a few bugs to make the driver functional
  31. **  again. Note that this card is not supported or manufactured by 
  32. **  RedCreek anymore.
  33. **   
  34. **  Rasmus Andersen, December 2000: Converted to new PCI API and general
  35. **  cleanup.
  36. **
  37. **  Pete Popov, January 11,99: Fixed a couple of 2.1.x problems 
  38. **  (virt_to_bus() not called), tested it under 2.2pre5 (as a module), and 
  39. **  added a #define(s) to enable the use of the same file for both, the 2.0.x 
  40. **  kernels as well as the 2.1.x.
  41. **
  42. **  Ported to 2.1.x by Alan Cox 1998/12/9. 
  43. **
  44. **  Sometime in mid 1998, written by Pete Popov and Brian Moyle.
  45. **
  46. ***************************************************************************/
  47. #include <linux/module.h>
  48. #include <linux/kernel.h>
  49. #include <linux/sched.h>
  50. #include <linux/string.h>
  51. #include <linux/ptrace.h>
  52. #include <linux/errno.h>
  53. #include <linux/in.h>
  54. #include <linux/init.h>
  55. #include <linux/ioport.h>
  56. #include <linux/slab.h>
  57. #include <linux/interrupt.h>
  58. #include <linux/pci.h>
  59. #include <linux/timer.h>
  60. #include <asm/irq.h> /* For NR_IRQS only. */
  61. #include <asm/bitops.h>
  62. #include <asm/uaccess.h>
  63. static char version[] __initdata =
  64.     "RedCreek Communications PCI linux driver version 2.20n";
  65. #define RC_LINUX_MODULE
  66. #include "rclanmtl.h"
  67. #include "rcif.h"
  68. #define RUN_AT(x) (jiffies + (x))
  69. #define NEW_MULTICAST
  70. /* PCI/45 Configuration space values */
  71. #define RC_PCI45_VENDOR_ID  0x4916
  72. #define RC_PCI45_DEVICE_ID  0x1960
  73. #define MAX_ETHER_SIZE        1520
  74. #define MAX_NMBR_RCV_BUFFERS    96
  75. #define RC_POSTED_BUFFERS_LOW_MARK MAX_NMBR_RCV_BUFFERS-16
  76. #define BD_SIZE 3 /* Bucket Descriptor size */
  77. #define BD_LEN_OFFSET 2 /* Bucket Descriptor offset to length field */
  78. /* RedCreek LAN device Target ID */
  79. #define RC_LAN_TARGET_ID  0x10
  80. /* RedCreek's OSM default LAN receive Initiator */
  81. #define DEFAULT_RECV_INIT_CONTEXT  0xA17
  82. /* minimum msg buffer size needed by the card 
  83.  * Note that the size of this buffer is hard code in the
  84.  * ipsec card's firmware. Thus, the size MUST be a minimum
  85.  * of 16K. Otherwise the card will end up using memory
  86.  * that does not belong to it.
  87.  */
  88. #define MSG_BUF_SIZE  16384
  89. static U32 DriverControlWord;
  90. static void rc_timer (unsigned long);
  91. static int RCinit (struct net_device *);
  92. static int RCopen (struct net_device *);
  93. static int RC_xmit_packet (struct sk_buff *, struct net_device *);
  94. static void RCinterrupt (int, void *, struct pt_regs *);
  95. static int RCclose (struct net_device *dev);
  96. static struct net_device_stats *RCget_stats (struct net_device *);
  97. static int RCioctl (struct net_device *, struct ifreq *, int);
  98. static int RCconfig (struct net_device *, struct ifmap *);
  99. static void RCxmit_callback (U32, U16, PU32, struct net_device *);
  100. static void RCrecv_callback (U32, U8, U32, PU32, struct net_device *);
  101. static void RCreset_callback (U32, U32, U32, struct net_device *);
  102. static void RCreboot_callback (U32, U32, U32, struct net_device *);
  103. static int RC_allocate_and_post_buffers (struct net_device *, int);
  104. static struct pci_device_id rcpci45_pci_table[] __devinitdata = {
  105. {RC_PCI45_VENDOR_ID, RC_PCI45_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
  106. {}
  107. };
  108. MODULE_DEVICE_TABLE (pci, rcpci45_pci_table);
  109. MODULE_LICENSE("GPL");
  110. static void __devexit
  111. rcpci45_remove_one (struct pci_dev *pdev)
  112. {
  113. struct net_device *dev = pci_get_drvdata (pdev);
  114. PDPA pDpa = dev->priv;
  115. if (!dev) {
  116. printk (KERN_ERR "%s: remove non-existent devicen",
  117. dev->name);
  118. return;
  119. }
  120. RCResetIOP (dev);
  121. unregister_netdev (dev);
  122. free_irq (dev->irq, dev);
  123. iounmap ((void *) dev->base_addr);
  124. pci_release_regions (pdev);
  125. if (pDpa->msgbuf)
  126. kfree (pDpa->msgbuf);
  127. if (pDpa->pPab)
  128. kfree (pDpa->pPab);
  129. kfree (dev);
  130. pci_set_drvdata (pdev, NULL);
  131. }
  132. static int
  133. rcpci45_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
  134. {
  135. unsigned long *vaddr;
  136. PDPA pDpa;
  137. int error;
  138. static int card_idx = -1;
  139. struct net_device *dev;
  140. unsigned long pci_start, pci_len;
  141. card_idx++;
  142. /* 
  143.  * Allocate and fill new device structure. 
  144.  * We need enough for struct net_device plus DPA plus the LAN 
  145.  * API private area, which requires a minimum of 16KB.  The top 
  146.  * of the allocated area will be assigned to struct net_device; 
  147.  * the next chunk will be assigned to DPA; and finally, the rest 
  148.  * will be assigned to the the LAN API layer.
  149.  */
  150. dev = init_etherdev (NULL, sizeof (*pDpa));
  151. if (!dev) {
  152. printk (KERN_ERR
  153. "(rcpci45 driver:) init_etherdev alloc failedn");
  154. error = -ENOMEM;
  155. goto err_out;
  156. }
  157. error = pci_enable_device (pdev);
  158. if (error) {
  159. printk (KERN_ERR
  160. "(rcpci45 driver:) %d: pci enable device errorn",
  161. card_idx);
  162. goto err_out;
  163. }
  164. error = -ENOMEM;
  165. pci_start = pci_resource_start (pdev, 0);
  166. pci_len = pci_resource_len (pdev, 0);
  167. printk("pci_start %x pci_len %xn", pci_start, pci_len);
  168. pci_set_drvdata (pdev, dev);
  169. pDpa = dev->priv;
  170. pDpa->id = card_idx;
  171. pDpa->pci_addr = pci_start;
  172. if (!pci_start || !(pci_resource_flags (pdev, 0) & IORESOURCE_MEM)) {
  173. printk (KERN_ERR
  174. "(rcpci45 driver:) No PCI mem resources! Abortingn");
  175. error = -EBUSY;
  176. goto err_out_free_dev;
  177. }
  178. /*
  179.  * pDpa->msgbuf is where the card will dma the I2O 
  180.  * messages. Thus, we need contiguous physical pages of
  181.  * memory.
  182.  */
  183. pDpa->msgbuf = kmalloc (MSG_BUF_SIZE, GFP_DMA|GFP_ATOMIC|GFP_KERNEL);
  184. if (!pDpa->msgbuf) {
  185. printk (KERN_ERR "(rcpci45 driver:) 
  186. Could not allocate %d byte memory for the 
  187. private msgbuf!n", MSG_BUF_SIZE);
  188. goto err_out_free_dev;
  189. }
  190. /*
  191.  * Save the starting address of the LAN API private area.  We'll
  192.  * pass that to RCInitI2OMsgLayer().
  193.  *
  194.  */
  195. pDpa->PLanApiPA = (void *) (((long) pDpa->msgbuf + 0xff) & ~0xff);
  196. /* The adapter is accessible through memory-access read/write, not
  197.  * I/O read/write.  Thus, we need to map it to some virtual address
  198.  * area in order to access the registers as normal memory.
  199.  */
  200. error = pci_request_regions (pdev, dev->name);
  201. if (error)
  202. goto err_out_free_msgbuf;
  203. vaddr = (ulong *) ioremap (pci_start, pci_len);
  204. if (!vaddr) {
  205. printk (KERN_ERR
  206. "(rcpci45 driver:) 
  207. Unable to remap address range from %lu to %lun",
  208. pci_start, pci_start + pci_len);
  209. goto err_out_free_region;
  210. }
  211. dev->base_addr = (unsigned long) vaddr;
  212. dev->irq = pdev->irq;
  213. dev->open = &RCopen;
  214. dev->hard_start_xmit = &RC_xmit_packet;
  215. dev->stop = &RCclose;
  216. dev->get_stats = &RCget_stats;
  217. dev->do_ioctl = &RCioctl;
  218. dev->set_config = &RCconfig;
  219. return 0; /* success */
  220. err_out_free_region:
  221. pci_release_regions (pdev);
  222. err_out_free_msgbuf:
  223. kfree (pDpa->msgbuf);
  224. err_out_free_dev:
  225. unregister_netdev (dev);
  226. kfree (dev);
  227. err_out:
  228. card_idx--;
  229. return -ENODEV;
  230. }
  231. static struct pci_driver rcpci45_driver = {
  232. name: "rcpci45",
  233. id_table: rcpci45_pci_table,
  234. probe: rcpci45_init_one,
  235. remove: __devexit_p(rcpci45_remove_one),
  236. };
  237. static int __init
  238. rcpci_init_module (void)
  239. {
  240. int rc = pci_module_init (&rcpci45_driver);
  241. if (!rc)
  242. printk (KERN_ERR "%s", version);
  243. return rc;
  244. }
  245. static int
  246. RCopen (struct net_device *dev)
  247. {
  248. int post_buffers = MAX_NMBR_RCV_BUFFERS;
  249. PDPA pDpa = dev->priv;
  250. int count = 0;
  251. int requested = 0;
  252. int error;
  253. MOD_INC_USE_COUNT;
  254. if (pDpa->nexus) {
  255. /* This is not the first time RCopen is called.  Thus,
  256.  * the interface was previously opened and later closed
  257.  * by RCclose().  RCclose() does a Shutdown; to wake up
  258.  * the adapter, a reset is mandatory before we can post
  259.  * receive buffers.  However, if the adapter initiated 
  260.  * a reboot while the interface was closed -- and interrupts
  261.  * were turned off -- we need will need to reinitialize
  262.  * the adapter, rather than simply waking it up.  
  263.  */
  264. printk (KERN_INFO "Waking up adapter...n");
  265. RCResetLANCard (dev, 0, 0, 0);
  266. } else {
  267. pDpa->nexus = 1;
  268. /* 
  269.  * RCInitI2OMsgLayer is done only once, unless the
  270.  * adapter was sent a warm reboot
  271.  */
  272. error = RCInitI2OMsgLayer (dev, (PFNTXCALLBACK) RCxmit_callback,
  273.    (PFNRXCALLBACK) RCrecv_callback,
  274.    (PFNCALLBACK) RCreboot_callback);
  275. if (error) {
  276. printk (KERN_ERR "%s: Unable to init msg layer (%x)n",
  277. dev->name, error);
  278. goto err_out;
  279. }
  280. if ((error = RCGetMAC (dev, NULL))) {
  281. printk (KERN_ERR "%s: Unable to get adapter MACn",
  282. dev->name);
  283. goto err_out;
  284. }
  285. }
  286. /* Request a shared interrupt line. */
  287. error = request_irq (dev->irq, RCinterrupt, SA_SHIRQ, dev->name, dev);
  288. if (error) {
  289. printk (KERN_ERR "%s: unable to get IRQ %dn", 
  290. dev->name, dev->irq);
  291. goto err_out;
  292. }
  293. DriverControlWord |= WARM_REBOOT_CAPABLE;
  294. RCReportDriverCapability (dev, DriverControlWord);
  295. printk (KERN_INFO "%s: RedCreek Communications IPSEC VPN adaptern",
  296. dev->name);
  297. RCEnableI2OInterrupts (dev);
  298. while (post_buffers) {
  299. if (post_buffers > MAX_NMBR_POST_BUFFERS_PER_MSG)
  300. requested = MAX_NMBR_POST_BUFFERS_PER_MSG;
  301. else
  302. requested = post_buffers;
  303. count = RC_allocate_and_post_buffers (dev, requested);
  304. if (count < requested) {
  305. /*
  306.  * Check to see if we were able to post 
  307.  * any buffers at all.
  308.  */
  309. if (post_buffers == MAX_NMBR_RCV_BUFFERS) {
  310. printk (KERN_ERR "%s: 
  311. unable to allocate any buffersn", 
  312. dev->name);
  313. goto err_out_free_irq;
  314. }
  315. printk (KERN_WARNING "%s: 
  316. unable to allocate all requested buffersn", dev->name);
  317. break; /* we'll try to post more buffers later */
  318. } else
  319. post_buffers -= count;
  320. }
  321. pDpa->numOutRcvBuffers = MAX_NMBR_RCV_BUFFERS - post_buffers;
  322. pDpa->shutdown = 0; /* just in case */
  323. netif_start_queue (dev);
  324. return 0;
  325. err_out_free_irq:
  326. free_irq (dev->irq, dev);
  327. err_out:
  328. MOD_DEC_USE_COUNT;
  329. return error;
  330. }
  331. static int
  332. RC_xmit_packet (struct sk_buff *skb, struct net_device *dev)
  333. {
  334. PDPA pDpa = dev->priv;
  335. singleTCB tcb;
  336. psingleTCB ptcb = &tcb;
  337. RC_RETURN status = 0;
  338. netif_stop_queue (dev);
  339. if (pDpa->shutdown || pDpa->reboot) {
  340. printk ("RC_xmit_packet: tbusy!n");
  341. return 1;
  342. }
  343. /*
  344.  * The user is free to reuse the TCB after RCI2OSendPacket() 
  345.  * returns, since the function copies the necessary info into its 
  346.  * own private space.  Thus, our TCB can be a local structure.  
  347.  * The skb, on the other hand, will be freed up in our interrupt 
  348.  * handler.
  349.  */
  350. ptcb->bcount = 1;
  351. /* 
  352.  * we'll get the context when the adapter interrupts us to tell us that
  353.  * the transmission is done. At that time, we can free skb.
  354.  */
  355. ptcb->b.context = (U32) skb;
  356. ptcb->b.scount = 1;
  357. ptcb->b.size = skb->len;
  358. ptcb->b.addr = virt_to_bus ((void *) skb->data);
  359. if ((status = RCI2OSendPacket (dev, (U32) NULL, (PRCTCB) ptcb))
  360.     != RC_RTN_NO_ERROR) {
  361. printk ("%s: send error 0x%xn", dev->name, (uint) status);
  362. return 1;
  363. } else {
  364. dev->trans_start = jiffies;
  365. netif_wake_queue (dev);
  366. }
  367. /*
  368.  * That's it!
  369.  */
  370. return 0;
  371. }
  372. /*
  373.  * RCxmit_callback()
  374.  *
  375.  * The transmit callback routine. It's called by RCProcI2OMsgQ()
  376.  * because the adapter is done with one or more transmit buffers and
  377.  * it's returning them to us, or we asked the adapter to return the
  378.  * outstanding transmit buffers by calling RCResetLANCard() with 
  379.  * RC_RESOURCE_RETURN_PEND_TX_BUFFERS flag. 
  380.  * All we need to do is free the buffers.
  381.  */
  382. static void
  383. RCxmit_callback (U32 Status,
  384.  U16 PcktCount, PU32 BufferContext, struct net_device *dev)
  385. {
  386. struct sk_buff *skb;
  387. PDPA pDpa = dev->priv;
  388. if (!pDpa) {
  389. printk (KERN_ERR "%s: Fatal Error in xmit callback, !pDpan",
  390. dev->name);
  391. return;
  392. }
  393. if (Status != I2O_REPLY_STATUS_SUCCESS)
  394. printk (KERN_INFO "%s: xmit_callback: Status = 0x%xn", 
  395. dev->name, (uint) Status);
  396. if (pDpa->shutdown || pDpa->reboot)
  397. printk (KERN_INFO "%s: xmit callback: shutdown||rebootn",
  398. dev->name);
  399. while (PcktCount--) {
  400. skb = (struct sk_buff *) (BufferContext[0]);
  401. BufferContext++;
  402. dev_kfree_skb_irq (skb);
  403. }
  404. netif_wake_queue (dev);
  405. }
  406. static void
  407. RCreset_callback (U32 Status, U32 p1, U32 p2, struct net_device *dev)
  408. {
  409. PDPA pDpa = dev->priv;
  410. printk ("RCreset_callback Status 0x%xn", (uint) Status);
  411. /*
  412.  * Check to see why we were called.
  413.  */
  414. if (pDpa->shutdown) {
  415. printk (KERN_INFO "%s: shutting down interfacen",
  416. dev->name);
  417. pDpa->shutdown = 0;
  418. pDpa->reboot = 0;
  419. } else if (pDpa->reboot) {
  420. printk (KERN_INFO "%s: reboot, shutdown adaptern",
  421. dev->name);
  422. /*
  423.  * We don't set any of the flags in RCShutdownLANCard()
  424.  * and we don't pass a callback routine to it.
  425.  * The adapter will have already initiated the reboot by
  426.  * the time the function returns.
  427.  */
  428. RCDisableI2OInterrupts (dev);
  429. RCShutdownLANCard (dev, 0, 0, 0);
  430. printk (KERN_INFO "%s: scheduling timer...n", dev->name);
  431. init_timer (&pDpa->timer);
  432. pDpa->timer.expires = RUN_AT ((40 * HZ) / 10); /* 4 sec. */
  433. pDpa->timer.data = (unsigned long) dev;
  434. pDpa->timer.function = &rc_timer; /* timer handler */
  435. add_timer (&pDpa->timer);
  436. }
  437. }
  438. static void
  439. RCreboot_callback (U32 Status, U32 p1, U32 p2, struct net_device *dev)
  440. {
  441. PDPA pDpa = dev->priv;
  442. printk (KERN_INFO "%s: reboot: rcv buffers outstanding = %dn",
  443.  dev->name, (uint) pDpa->numOutRcvBuffers);
  444. if (pDpa->shutdown) {
  445. printk (KERN_INFO "%s: skip reboot, shutdown initiatedn",
  446. dev->name);
  447. return;
  448. }
  449. pDpa->reboot = 1;
  450. /*
  451.  * OK, we reset the adapter and ask it to return all
  452.  * outstanding transmit buffers as well as the posted
  453.  * receive buffers.  When the adapter is done returning
  454.  * those buffers, it will call our RCreset_callback() 
  455.  * routine.  In that routine, we'll call RCShutdownLANCard()
  456.  * to tell the adapter that it's OK to start the reboot and
  457.  * schedule a timer callback routine to execute 3 seconds 
  458.  * later; this routine will reinitialize the adapter at that time.
  459.  */
  460. RCResetLANCard (dev, RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
  461. RC_RESOURCE_RETURN_PEND_TX_BUFFERS, 0,
  462. (PFNCALLBACK) RCreset_callback);
  463. }
  464. int
  465. broadcast_packet (unsigned char *address)
  466. {
  467. int i;
  468. for (i = 0; i < 6; i++)
  469. if (address[i] != 0xff)
  470. return 0;
  471. return 1;
  472. }
  473. /*
  474.  * RCrecv_callback()
  475.  * 
  476.  * The receive packet callback routine.  This is called by
  477.  * RCProcI2OMsgQ() after the adapter posts buffers which have been
  478.  * filled (one ethernet packet per buffer).
  479.  */
  480. static void
  481. RCrecv_callback (U32 Status,
  482.  U8 PktCount,
  483.  U32 BucketsRemain,
  484.  PU32 PacketDescBlock, struct net_device *dev)
  485. {
  486. U32 len, count;
  487. PDPA pDpa = dev->priv;
  488. struct sk_buff *skb;
  489. singleTCB tcb;
  490. psingleTCB ptcb = &tcb;
  491. ptcb->bcount = 1;
  492. if ((pDpa->shutdown || pDpa->reboot) && !Status)
  493. printk (KERN_INFO "%s: shutdown||reboot && !Status (%d)n",
  494. dev->name, PktCount);
  495. if ((Status != I2O_REPLY_STATUS_SUCCESS) || pDpa->shutdown) {
  496. /*
  497.  * Free whatever buffers the adapter returned, but don't
  498.  * pass them to the kernel.
  499.  */
  500. if (!pDpa->shutdown && !pDpa->reboot)
  501. printk (KERN_INFO "%s: recv error status = 0x%xn",
  502. dev->name, (uint) Status);
  503. else
  504. printk (KERN_DEBUG "%s: Returning %d buffs stat 0x%xn",
  505. dev->name, PktCount, (uint) Status);
  506. /*
  507.  * TO DO: check the nature of the failure and put the 
  508.  * adapter in failed mode if it's a hard failure.  
  509.  * Send a reset to the adapter and free all outstanding memory.
  510.  */
  511. if (PacketDescBlock) {
  512. while (PktCount--) {
  513. skb = (struct sk_buff *) PacketDescBlock[0];
  514. dev_kfree_skb (skb);
  515. pDpa->numOutRcvBuffers--;
  516. /* point to next context field */
  517. PacketDescBlock += BD_SIZE;
  518. }
  519. }
  520. return;
  521. } else {
  522. while (PktCount--) {
  523. skb = (struct sk_buff *) PacketDescBlock[0];
  524. len = PacketDescBlock[2];
  525. skb->dev = dev;
  526. skb_put (skb, len); /* adjust length and tail */
  527. skb->protocol = eth_type_trans (skb, dev);
  528. netif_rx (skb); /* send the packet to the kernel */
  529. dev->last_rx = jiffies;
  530. pDpa->numOutRcvBuffers--;
  531. /* point to next context field */
  532. PacketDescBlock += BD_SIZE;
  533. }
  534. }
  535. /*
  536.  * Replenish the posted receive buffers. 
  537.  * DO NOT replenish buffers if the driver has already
  538.  * initiated a reboot or shutdown!
  539.  */
  540. if (!pDpa->shutdown && !pDpa->reboot) {
  541. count = RC_allocate_and_post_buffers (dev,
  542.       MAX_NMBR_RCV_BUFFERS -
  543.       pDpa->numOutRcvBuffers);
  544. pDpa->numOutRcvBuffers += count;
  545. }
  546. }
  547. /*
  548.  * RCinterrupt()
  549.  * 
  550.  * Interrupt handler. 
  551.  * This routine sets up a couple of pointers and calls
  552.  * RCProcI2OMsgQ(), which in turn process the message and
  553.  * calls one of our callback functions.
  554.  */
  555. static void
  556. RCinterrupt (int irq, void *dev_id, struct pt_regs *regs)
  557. {
  558. PDPA pDpa;
  559. struct net_device *dev = dev_id;
  560. pDpa = dev->priv;
  561. if (pDpa->shutdown)
  562. printk (KERN_DEBUG "%s: shutdown, service irqn",
  563. dev->name);
  564. RCProcI2OMsgQ (dev);
  565. }
  566. #define REBOOT_REINIT_RETRY_LIMIT 4
  567. static void
  568. rc_timer (unsigned long data)
  569. {
  570. struct net_device *dev = (struct net_device *) data;
  571. PDPA pDpa = dev->priv;
  572. int init_status;
  573. static int retry;
  574. int post_buffers = MAX_NMBR_RCV_BUFFERS;
  575. int count = 0;
  576. int requested = 0;
  577. if (pDpa->reboot) {
  578. init_status =
  579.     RCInitI2OMsgLayer (dev, (PFNTXCALLBACK) RCxmit_callback,
  580.        (PFNRXCALLBACK) RCrecv_callback,
  581.        (PFNCALLBACK) RCreboot_callback);
  582. switch (init_status) {
  583. case RC_RTN_NO_ERROR:
  584. pDpa->reboot = 0;
  585. pDpa->shutdown = 0; /* just in case */
  586. RCReportDriverCapability (dev, DriverControlWord);
  587. RCEnableI2OInterrupts (dev);
  588. if (!(dev->flags & IFF_UP)) {
  589. retry = 0;
  590. return;
  591. }
  592. while (post_buffers) {
  593. if (post_buffers > 
  594. MAX_NMBR_POST_BUFFERS_PER_MSG)
  595. requested = 
  596. MAX_NMBR_POST_BUFFERS_PER_MSG;
  597. else
  598. requested = post_buffers;
  599. count =
  600.     RC_allocate_and_post_buffers (dev,
  601.   requested);
  602. post_buffers -= count;
  603. if (count < requested)
  604. break;
  605. }
  606. pDpa->numOutRcvBuffers =
  607.     MAX_NMBR_RCV_BUFFERS - post_buffers;
  608. printk ("Initialization done.n");
  609. netif_wake_queue (dev);
  610. retry = 0;
  611. return;
  612. case RC_RTN_FREE_Q_EMPTY:
  613. retry++;
  614. printk (KERN_WARNING "%s inbound free q emptyn",
  615. dev->name);
  616. break;
  617. default:
  618. retry++;
  619. printk (KERN_WARNING "%s bad stat after reboot: %dn",
  620. dev->name, init_status);
  621. break;
  622. }
  623. if (retry > REBOOT_REINIT_RETRY_LIMIT) {
  624. printk (KERN_WARNING "%s unable to reinitialize adapter after rebootn", dev->name);
  625. printk (KERN_WARNING "%s decrementing driver and closing interfacen", dev->name);
  626. RCDisableI2OInterrupts (dev);
  627. dev->flags &= ~IFF_UP;
  628. MOD_DEC_USE_COUNT;
  629. } else {
  630. printk (KERN_INFO "%s: rescheduling timer...n",
  631. dev->name);
  632. init_timer (&pDpa->timer);
  633. pDpa->timer.expires = RUN_AT ((40 * HZ) / 10);
  634. pDpa->timer.data = (unsigned long) dev;
  635. pDpa->timer.function = &rc_timer;
  636. add_timer (&pDpa->timer);
  637. }
  638. } else
  639. printk (KERN_WARNING "%s: unexpected timer irqn", dev->name);
  640. }
  641. static int
  642. RCclose (struct net_device *dev)
  643. {
  644. PDPA pDpa = dev->priv;
  645. printk("RCclosen");
  646. netif_stop_queue (dev);
  647. if (pDpa->reboot) {
  648. printk (KERN_INFO "%s skipping reset -- adapter already in reboot moden", dev->name);
  649. dev->flags &= ~IFF_UP;
  650. pDpa->shutdown = 1;
  651. MOD_DEC_USE_COUNT;
  652. return 0;
  653. }
  654. pDpa->shutdown = 1;
  655. /*
  656.  * We can't allow the driver to be unloaded until the adapter returns
  657.  * all posted receive buffers.  It doesn't hurt to tell the adapter
  658.  * to return all posted receive buffers and outstanding xmit buffers,
  659.  * even if there are none.
  660.  */
  661. RCShutdownLANCard (dev, RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
  662.    RC_RESOURCE_RETURN_PEND_TX_BUFFERS, 0,
  663.    (PFNCALLBACK) RCreset_callback);
  664. dev->flags &= ~IFF_UP;
  665. MOD_DEC_USE_COUNT;
  666. return 0;
  667. }
  668. static struct net_device_stats *
  669. RCget_stats (struct net_device *dev)
  670. {
  671. RCLINKSTATS RCstats;
  672. PDPA pDpa = dev->priv;
  673. if (!pDpa) {
  674. return 0;
  675. } else if (!(dev->flags & IFF_UP)) {
  676. return 0;
  677. }
  678. memset (&RCstats, 0, sizeof (RCLINKSTATS));
  679. if ((RCGetLinkStatistics (dev, &RCstats, (void *) 0)) ==
  680.     RC_RTN_NO_ERROR) {
  681. /* total packets received    */
  682. pDpa->stats.rx_packets = RCstats.Rcv_good
  683. /* total packets transmitted    */;
  684. pDpa->stats.tx_packets = RCstats.TX_good;
  685. pDpa->stats.rx_errors = RCstats.Rcv_CRCerr + 
  686. RCstats.Rcv_alignerr + RCstats.Rcv_reserr + 
  687. RCstats.Rcv_orun + RCstats.Rcv_cdt + RCstats.Rcv_runt;
  688. pDpa->stats.tx_errors = RCstats.TX_urun + RCstats.TX_crs + 
  689. RCstats.TX_def + RCstats.TX_totcol;
  690. /*
  691.  * This needs improvement.
  692.  */
  693. pDpa->stats.rx_dropped = 0; /* no space in linux buffers   */
  694. pDpa->stats.tx_dropped = 0; /* no space available in linux */
  695. pDpa->stats.multicast = 0;  /* multicast packets received  */
  696. pDpa->stats.collisions = RCstats.TX_totcol;
  697. /* detailed rx_errors: */
  698. pDpa->stats.rx_length_errors = 0;
  699. pDpa->stats.rx_over_errors = RCstats.Rcv_orun;
  700. pDpa->stats.rx_crc_errors = RCstats.Rcv_CRCerr;
  701. pDpa->stats.rx_frame_errors = 0;
  702. pDpa->stats.rx_fifo_errors = 0;
  703. pDpa->stats.rx_missed_errors = 0;
  704. /* detailed tx_errors */
  705. pDpa->stats.tx_aborted_errors = 0;
  706. pDpa->stats.tx_carrier_errors = 0;
  707. pDpa->stats.tx_fifo_errors = 0;
  708. pDpa->stats.tx_heartbeat_errors = 0;
  709. pDpa->stats.tx_window_errors = 0;
  710. return ((struct net_device_stats *) &(pDpa->stats));
  711. }
  712. return 0;
  713. }
  714. static int
  715. RCioctl (struct net_device *dev, struct ifreq *rq, int cmd)
  716. {
  717. RCuser_struct RCuser;
  718. PDPA pDpa = dev->priv;
  719. if (!capable (CAP_NET_ADMIN))
  720. return -EPERM;
  721. switch (cmd) {
  722. case RCU_PROTOCOL_REV:
  723. /*
  724.  * Assign user protocol revision, to tell user-level
  725.  * controller program whether or not it's in sync.
  726.  */
  727. rq->ifr_ifru.ifru_data = (caddr_t) USER_PROTOCOL_REV;
  728. break;
  729. case RCU_COMMAND:
  730. {
  731. if (copy_from_user
  732.     (&RCuser, rq->ifr_data, sizeof (RCuser)))
  733. return -EFAULT;
  734. dprintk ("RCioctl: RCuser_cmd = 0x%xn", RCuser.cmd);
  735. switch (RCuser.cmd) {
  736. case RCUC_GETFWVER:
  737. RCUD_GETFWVER = &RCuser.RCUS_GETFWVER;
  738. RCGetFirmwareVer (dev,
  739.   (PU8) & RCUD_GETFWVER->
  740.   FirmString, NULL);
  741. break;
  742. case RCUC_GETINFO:
  743. RCUD_GETINFO = &RCuser.RCUS_GETINFO;
  744. RCUD_GETINFO->mem_start = dev->base_addr;
  745. RCUD_GETINFO->mem_end =
  746.     dev->base_addr + pDpa->pci_addr_len;
  747. RCUD_GETINFO->base_addr = pDpa->pci_addr;
  748. RCUD_GETINFO->irq = dev->irq;
  749. break;
  750. case RCUC_GETIPANDMASK:
  751. RCUD_GETIPANDMASK = &RCuser.RCUS_GETIPANDMASK;
  752. RCGetRavlinIPandMask (dev,
  753.       (PU32) &
  754.       RCUD_GETIPANDMASK->IpAddr,
  755.       (PU32) &
  756.       RCUD_GETIPANDMASK->
  757.       NetMask, NULL);
  758. break;
  759. case RCUC_GETLINKSTATISTICS:
  760. RCUD_GETLINKSTATISTICS =
  761.     &RCuser.RCUS_GETLINKSTATISTICS;
  762. RCGetLinkStatistics (dev,
  763.      (P_RCLINKSTATS) &
  764.      RCUD_GETLINKSTATISTICS->
  765.      StatsReturn, NULL);
  766. break;
  767. case RCUC_GETLINKSTATUS:
  768. RCUD_GETLINKSTATUS = &RCuser.RCUS_GETLINKSTATUS;
  769. RCGetLinkStatus (dev,
  770.  (PU32) & RCUD_GETLINKSTATUS->
  771.  ReturnStatus, NULL);
  772. break;
  773. case RCUC_GETMAC:
  774. RCUD_GETMAC = &RCuser.RCUS_GETMAC;
  775. RCGetMAC (dev, NULL);
  776. memcpy(RCUD_GETMAC, dev->dev_addr, 8);
  777. break;
  778. case RCUC_GETPROM:
  779. RCUD_GETPROM = &RCuser.RCUS_GETPROM;
  780. RCGetPromiscuousMode (dev,
  781.       (PU32) & RCUD_GETPROM->
  782.       PromMode, NULL);
  783. break;
  784. case RCUC_GETBROADCAST:
  785. RCUD_GETBROADCAST = &RCuser.RCUS_GETBROADCAST;
  786. RCGetBroadcastMode (dev,
  787.     (PU32) & RCUD_GETBROADCAST->
  788.     BroadcastMode, NULL);
  789. break;
  790. case RCUC_GETSPEED:
  791. if (!(dev->flags & IFF_UP)) {
  792. return -ENODATA;
  793. }
  794. RCUD_GETSPEED = &RCuser.RCUS_GETSPEED;
  795. RCGetLinkSpeed (dev,
  796. (PU32) & RCUD_GETSPEED->
  797. LinkSpeedCode, NULL);
  798. break;
  799. case RCUC_SETIPANDMASK:
  800. RCUD_SETIPANDMASK = &RCuser.RCUS_SETIPANDMASK;
  801. RCSetRavlinIPandMask (dev,
  802.       (U32) RCUD_SETIPANDMASK->
  803.       IpAddr,
  804.       (U32) RCUD_SETIPANDMASK->
  805.       NetMask);
  806. break;
  807. case RCUC_SETMAC:
  808. RCSetMAC (dev, (PU8) & RCUD_SETMAC->mac);
  809. break;
  810. case RCUC_SETSPEED:
  811. RCUD_SETSPEED = &RCuser.RCUS_SETSPEED;
  812. RCSetLinkSpeed (dev,
  813. (U16) RCUD_SETSPEED->
  814. LinkSpeedCode);
  815. break;
  816. case RCUC_SETPROM:
  817. RCUD_SETPROM = &RCuser.RCUS_SETPROM;
  818. RCSetPromiscuousMode (dev,
  819.       (U16) RCUD_SETPROM->
  820.       PromMode);
  821. break;
  822. case RCUC_SETBROADCAST:
  823. RCUD_SETBROADCAST = &RCuser.RCUS_SETBROADCAST;
  824. RCSetBroadcastMode (dev,
  825.     (U16) RCUD_SETBROADCAST->
  826.     BroadcastMode);
  827. break;
  828. default:
  829. RCUD_DEFAULT = &RCuser.RCUS_DEFAULT;
  830. RCUD_DEFAULT->rc = 0x11223344;
  831. break;
  832. }
  833. if (copy_to_user (rq->ifr_data, &RCuser, 
  834. sizeof (RCuser)))
  835. return -EFAULT;
  836. break;
  837. } /* RCU_COMMAND */
  838. default:
  839. rq->ifr_ifru.ifru_data = (caddr_t) 0x12345678;
  840. return -EINVAL;
  841. }
  842. return 0;
  843. }
  844. static int
  845. RCconfig (struct net_device *dev, struct ifmap *map)
  846. {
  847. /*
  848.  * To be completed ...
  849.  */
  850. return 0;
  851. if (dev->flags & IFF_UP) /* can't act on a running interface */
  852. return -EBUSY;
  853. /* Don't allow changing the I/O address */
  854. if (map->base_addr != dev->base_addr) {
  855. printk (KERN_WARNING "%s Change I/O address not implementedn",
  856. dev->name);
  857. return -EOPNOTSUPP;
  858. }
  859. return 0;
  860. }
  861. static void __exit
  862. rcpci_cleanup_module (void)
  863. {
  864. pci_unregister_driver (&rcpci45_driver);
  865. }
  866. module_init (rcpci_init_module);
  867. module_exit (rcpci_cleanup_module);
  868. static int
  869. RC_allocate_and_post_buffers (struct net_device *dev, int numBuffers)
  870. {
  871. int i;
  872. PU32 p;
  873. psingleB pB;
  874. struct sk_buff *skb;
  875. RC_RETURN status;
  876. U32 res;
  877. if (!numBuffers)
  878. return 0;
  879. else if (numBuffers > MAX_NMBR_POST_BUFFERS_PER_MSG) {
  880. printk (KERN_ERR "%s: Too many buffers requested!n",
  881. dev->name);
  882. numBuffers = 32;
  883. }
  884. p = (PU32) kmalloc (sizeof (U32) + numBuffers * sizeof (singleB),
  885.     GFP_DMA|GFP_ATOMIC|GFP_KERNEL);
  886. if (!p) {
  887. printk (KERN_WARNING "%s unable to allocate TCBn",
  888. dev->name);
  889. return 0;
  890. }
  891. p[0] = 0; /* Buffer Count */
  892. pB = (psingleB) ((U32) p + sizeof (U32));/* point to the first buffer */
  893. for (i = 0; i < numBuffers; i++) {
  894. skb = dev_alloc_skb (MAX_ETHER_SIZE + 2);
  895. if (!skb) {
  896. printk (KERN_WARNING 
  897. "%s: unable to allocate enough skbs!n",
  898. dev->name);
  899. if (*p != 0) { /* did we allocate any buffers */
  900. break;
  901. } else {
  902. kfree (p); /* Free the TCB */
  903. return 0;
  904. }
  905. }
  906. skb_reserve (skb, 2); /* Align IP on 16 byte boundaries */
  907. pB->context = (U32) skb;
  908. pB->scount = 1; /* segment count */
  909. pB->size = MAX_ETHER_SIZE;
  910. pB->addr = virt_to_bus ((void *) skb->data);
  911. p[0]++;
  912. pB++;
  913. }
  914. if ((status = RCPostRecvBuffers (dev, (PRCTCB) p)) != RC_RTN_NO_ERROR) {
  915. printk (KERN_WARNING "%s: Post buffer failed, error 0x%xn",
  916. dev->name, status);
  917. /* point to the first buffer */
  918. pB = (psingleB) ((U32) p + sizeof (U32));
  919. while (p[0]) {
  920. skb = (struct sk_buff *) pB->context;
  921. dev_kfree_skb (skb);
  922. p[0]--;
  923. pB++;
  924. }
  925. }
  926. res = p[0];
  927. kfree (p);
  928. return (res); /* return the number of posted buffers */
  929. }