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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 2000 MontaVista Software Inc.
  3.  * Author: MontaVista Software, Inc.
  4.  *          stevel@mvista.com or source@mvista.com
  5.  *
  6.  * ########################################################################
  7.  *
  8.  *  This program is free software; you can distribute it and/or modify it
  9.  *  under the terms of the GNU General Public License (Version 2) as
  10.  *  published by the Free Software Foundation.
  11.  *
  12.  *  This program is distributed in the hope it will be useful, but WITHOUT
  13.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15.  *  for more details.
  16.  *
  17.  *  You should have received a copy of the GNU General Public License along
  18.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  19.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  20.  *
  21.  * ########################################################################
  22.  *
  23.  * Ethernet driver for the MIPS GT96100 Advanced Communication Controller.
  24.  * 
  25.  */
  26. #ifndef __mips__
  27. #error This driver only works with MIPS architectures!
  28. #endif
  29. #include <linux/module.h>
  30. #include <linux/kernel.h>
  31. #include <linux/sched.h>
  32. #include <linux/string.h>
  33. #include <linux/timer.h>
  34. #include <linux/errno.h>
  35. #include <linux/in.h>
  36. #include <linux/ioport.h>
  37. #include <linux/slab.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/pci.h>
  40. #include <linux/init.h>
  41. #include <linux/netdevice.h>
  42. #include <linux/etherdevice.h>
  43. #include <linux/skbuff.h>
  44. #include <linux/delay.h>
  45. #include <asm/irq.h>
  46. #include <asm/bitops.h>
  47. #include <asm/io.h>
  48. #include "gt96100eth.h"
  49. #ifdef GT96100_DEBUG
  50. static int gt96100_debug = GT96100_DEBUG;
  51. #else
  52. static int gt96100_debug = 3;
  53. #endif
  54. // prototypes
  55. static void *dmaalloc(size_t size, dma_addr_t * dma_handle);
  56. static void dmafree(size_t size, void *vaddr);
  57. static int gt96100_add_hash_entry(struct net_device *dev,
  58.   unsigned char *addr);
  59. static void read_mib_counters(struct gt96100_private *gp);
  60. static int read_MII(struct net_device *dev, u32 reg);
  61. static int write_MII(struct net_device *dev, u32 reg, u16 data);
  62. static void dump_MII(struct net_device *dev);
  63. static void update_stats(struct gt96100_private *gp);
  64. static void abort(struct net_device *dev, u32 abort_bits);
  65. static void hard_stop(struct net_device *dev);
  66. static void enable_ether_irq(struct net_device *dev);
  67. static void disable_ether_irq(struct net_device *dev);
  68. static int __init gt96100_probe1(struct net_device *dev, long ioaddr,
  69.  int irq, int port_num);
  70. static int gt96100_init(struct net_device *dev);
  71. static int gt96100_open(struct net_device *dev);
  72. static int gt96100_close(struct net_device *dev);
  73. static int gt96100_tx(struct sk_buff *skb, struct net_device *dev);
  74. static int gt96100_rx(struct net_device *dev, u32 status);
  75. static void gt96100_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  76. static void gt96100_tx_timeout(struct net_device *dev);
  77. static void gt96100_set_rx_mode(struct net_device *dev);
  78. static struct net_device_stats *gt96100_get_stats(struct net_device *dev);
  79. static char version[] __devinitdata =
  80.     "gt96100eth.c:0.1 stevel@mvista.comn";
  81. // FIX! Need real Ethernet addresses
  82. static unsigned char gt96100_station_addr[2][6] __devinitdata =
  83.     { {0x01, 0x02, 0x03, 0x04, 0x05, 0x06},
  84. {0x01, 0x02, 0x03, 0x04, 0x05, 0x07}
  85. };
  86. #define nibswap(x) ((((x) >> 4) & 0x0f) | (((x) << 4) & 0xf0))
  87. #define RUN_AT(x) (jiffies + (x))
  88. // For reading/writing 32-bit words from/to DMA memory
  89. #define cpu_to_dma32 cpu_to_be32
  90. #define dma32_to_cpu be32_to_cpu
  91. /*
  92.  * Base address and interupt of the GT96100 ethernet controllers
  93.  */
  94. static struct {
  95. unsigned int port;
  96. int irq;
  97. } gt96100_iflist[NUM_INTERFACES] = {
  98. {
  99. GT96100_ETH0_BASE, GT96100_ETHER0_IRQ}, {
  100. GT96100_ETH1_BASE, GT96100_ETHER1_IRQ}
  101. };
  102. /*
  103.   DMA memory allocation, derived from pci_alloc_consistent.
  104. */
  105. static void *dmaalloc(size_t size, dma_addr_t * dma_handle)
  106. {
  107. void *ret;
  108. ret =
  109.     (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
  110.       get_order(size));
  111. if (ret != NULL) {
  112. dma_cache_inv((unsigned long) ret, size);
  113. if (dma_handle != NULL)
  114. *dma_handle = virt_to_phys(ret);
  115. /* bump virtual address up to non-cached area */
  116. ret = KSEG1ADDR(ret);
  117. }
  118. return ret;
  119. }
  120. static void dmafree(size_t size, void *vaddr)
  121. {
  122. vaddr = KSEG0ADDR(vaddr);
  123. free_pages((unsigned long) vaddr, get_order(size));
  124. }
  125. static int read_MII(struct net_device *dev, u32 reg)
  126. {
  127. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  128. int timedout = 20;
  129. u32 smir = smirOpCode | (gp->phy_addr << smirPhyAdBit) |
  130.     (reg << smirRegAdBit);
  131. // wait for last operation to complete
  132. while (GT96100_READ(GT96100_ETH_SMI_REG) & smirBusy) {
  133. // snooze for 1 msec and check again
  134. #if 0
  135. current->state = TASK_INTERRUPTIBLE;
  136. schedule_timeout(10 * HZ / 10000);
  137. #else
  138. mdelay(1);
  139. #endif
  140. if (--timedout == 0) {
  141. printk(KERN_ERR "%s: read_MII busy timeout!!n",
  142.        dev->name);
  143. return -1;
  144. }
  145. }
  146. GT96100_WRITE(GT96100_ETH_SMI_REG, smir);
  147. timedout = 20;
  148. // wait for read to complete
  149. while (!(smir = GT96100_READ(GT96100_ETH_SMI_REG) & smirReadValid)) {
  150. // snooze for 1 msec and check again
  151. #if 0
  152. current->state = TASK_INTERRUPTIBLE;
  153. schedule_timeout(10 * HZ / 10000);
  154. #else
  155. mdelay(1);
  156. #endif
  157. if (--timedout == 0) {
  158. printk(KERN_ERR "%s: read_MII timeout!!n",
  159.        dev->name);
  160. return -1;
  161. }
  162. }
  163. return (int) (smir & smirDataMask);
  164. }
  165. static int write_MII(struct net_device *dev, u32 reg, u16 data)
  166. {
  167. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  168. int timedout = 20;
  169. u32 smir =
  170.     (gp->phy_addr << smirPhyAdBit) | (reg << smirRegAdBit) | data;
  171. // wait for last operation to complete
  172. while (GT96100_READ(GT96100_ETH_SMI_REG) & smirBusy) {
  173. // snooze for 1 msec and check again
  174. #if 0
  175. current->state = TASK_INTERRUPTIBLE;
  176. schedule_timeout(10 * HZ / 10000);
  177. #else
  178. mdelay(1);
  179. #endif
  180. if (--timedout == 0) {
  181. printk(KERN_ERR "%s: write_MII busy timeout!!n",
  182.        dev->name);
  183. return -1;
  184. }
  185. }
  186. GT96100_WRITE(GT96100_ETH_SMI_REG, smir);
  187. return 0;
  188. }
  189. static void dump_MII(struct net_device *dev)
  190. {
  191. int i, val;
  192. for (i = 0; i < 7; i++) {
  193. if ((val = read_MII(dev, i)) >= 0)
  194. printk("%s: MII Reg %d=%xn", dev->name, i, val);
  195. }
  196. for (i = 16; i < 21; i++) {
  197. if ((val = read_MII(dev, i)) >= 0)
  198. printk("%s: MII Reg %d=%xn", dev->name, i, val);
  199. }
  200. }
  201. static int
  202. gt96100_add_hash_entry(struct net_device *dev, unsigned char *addr)
  203. {
  204. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  205. u16 hashResult, stmp;
  206. unsigned char ctmp, hash_ea[6];
  207. u32 tblEntry, *tblEntryAddr;
  208. int i;
  209. for (i = 0; i < 6; i++) {
  210. // nibble swap
  211. ctmp = nibswap(addr[i]);
  212. // invert every nibble
  213. hash_ea[i] = ((ctmp & 1) << 3) | ((ctmp & 8) >> 3) |
  214.     ((ctmp & 2) << 1) | ((ctmp & 4) >> 1);
  215. hash_ea[i] |= ((ctmp & 0x10) << 3) | ((ctmp & 0x80) >> 3) |
  216.     ((ctmp & 0x20) << 1) | ((ctmp & 0x40) >> 1);
  217. }
  218. if (gp->hash_mode == 0) {
  219. hashResult = ((u16) hash_ea[0] & 0xfc) << 7;
  220. stmp =
  221.     ((u16) hash_ea[0] & 0x03) | (((u16) hash_ea[1] & 0x7f)
  222.  << 2);
  223. stmp ^=
  224.     (((u16) hash_ea[1] >> 7) & 0x01) | ((u16) hash_ea[2] <<
  225. 1);
  226. stmp ^= (u16) hash_ea[3] | (((u16) hash_ea[4] & 1) << 8);
  227. hashResult |= stmp;
  228. } else {
  229. return -1; // don't support hash mode 1
  230. }
  231. tblEntryAddr =
  232.     (u32 *) (&gp->hash_table[((u32) hashResult & 0x7ff) << 3]);
  233. for (i = 0; i < HASH_HOP_NUMBER; i++) {
  234. if ((*tblEntryAddr & hteValid)
  235.     && !(*tblEntryAddr & hteSkip)) {
  236. // This entry is already occupied, go to next entry
  237. tblEntryAddr += 2;
  238. } else {
  239. memset(tblEntryAddr, 0, 8);
  240. tblEntry = hteValid | hteRD;
  241. tblEntry |= (u32) addr[5] << 3;
  242. tblEntry |= (u32) addr[4] << 11;
  243. tblEntry |= (u32) addr[3] << 19;
  244. tblEntry |= ((u32) addr[2] & 0x1f) << 27;
  245. *(tblEntryAddr + 1) = cpu_to_dma32(tblEntry);
  246. tblEntry = ((u32) addr[2] >> 5) & 0x07;
  247. tblEntry |= (u32) addr[1] << 3;
  248. tblEntry |= (u32) addr[0] << 11;
  249. *tblEntryAddr = cpu_to_dma32(tblEntry);
  250. break;
  251. }
  252. }
  253. if (i >= HASH_HOP_NUMBER) {
  254. printk(KERN_ERR "%s: gt96100_add_hash_entry expired!n",
  255.        dev->name);
  256. return -1; // Couldn't find an unused entry
  257. }
  258. return 0;
  259. }
  260. static void read_mib_counters(struct gt96100_private *gp)
  261. {
  262. u32 *mib_regs = (u32 *) & gp->mib;
  263. int i;
  264. for (i = 0; i < sizeof(mib_counters_t) / sizeof(u32); i++)
  265. mib_regs[i] =
  266.     GT96100ETH_READ(gp,
  267.     GT96100_ETH_MIB_COUNT_BASE +
  268.     i * sizeof(u32));
  269. }
  270. static void update_stats(struct gt96100_private *gp)
  271. {
  272. mib_counters_t *mib = &gp->mib;
  273. struct net_device_stats *stats = &gp->stats;
  274. read_mib_counters(gp);
  275. stats->rx_packets = mib->totalFramesReceived;
  276. stats->tx_packets = mib->framesSent;
  277. stats->rx_bytes = mib->totalByteReceived;
  278. stats->tx_bytes = mib->byteSent;
  279. stats->rx_errors = mib->totalFramesReceived - mib->framesReceived;
  280. //the tx error counters are incremented by the ISR
  281. //rx_dropped incremented by gt96100_rx
  282. //tx_dropped incremented by gt96100_tx
  283. stats->multicast = mib->multicastFramesReceived;
  284. // Tx collisions incremented by ISR, so add in MIB Rx collisions
  285. stats->collisions += mib->collision + mib->lateCollision;
  286. stats->rx_length_errors = mib->oversizeFrames + mib->fragments;
  287. // The RxError condition means the Rx DMA encountered a
  288. // CPU owned descriptor, which, if things are working as
  289. // they should, means the Rx ring has overflowed.
  290. stats->rx_over_errors = mib->macRxError;
  291. stats->rx_crc_errors = mib->cRCError;
  292. }
  293. static void abort(struct net_device *dev, u32 abort_bits)
  294. {
  295. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  296. int timedout = 100; // wait up to 100 msec for hard stop to complete
  297. if (gt96100_debug > 2)
  298. printk(KERN_INFO "%s: abortn", dev->name);
  299. // Return if neither Rx or Tx abort bits are set
  300. if (!(abort_bits & (sdcmrAR | sdcmrAT)))
  301. return;
  302. // make sure only the Rx/Tx abort bits are set
  303. abort_bits &= (sdcmrAR | sdcmrAT);
  304. spin_lock(&gp->lock);
  305. // abort any Rx/Tx DMA immediately
  306. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_COMM, abort_bits);
  307. if (gt96100_debug > 2)
  308. printk(KERN_INFO "%s: abort: SDMA comm = %xn",
  309.        dev->name, GT96100ETH_READ(gp,
  310.   GT96100_ETH_SDMA_COMM));
  311. // wait for abort to complete
  312. while (GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM) & abort_bits) {
  313. // snooze for 20 msec and check again
  314. #if 0
  315. current->state = TASK_INTERRUPTIBLE;
  316. schedule_timeout(10 * HZ / 10000);
  317. #else
  318. mdelay(1);
  319. #endif
  320. if (--timedout == 0) {
  321. printk(KERN_ERR "%s: abort timeout!!n",
  322.        dev->name);
  323. break;
  324. }
  325. }
  326. if (gt96100_debug > 2)
  327. printk(KERN_INFO "%s: abort: timedout=%dn", dev->name,
  328.        timedout);
  329. spin_unlock(&gp->lock);
  330. }
  331. static void hard_stop(struct net_device *dev)
  332. {
  333. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  334. if (gt96100_debug > 2)
  335. printk(KERN_INFO "%s: hard stopn", dev->name);
  336. disable_ether_irq(dev);
  337. abort(dev, sdcmrAR | sdcmrAT);
  338. // disable port
  339. GT96100ETH_WRITE(gp, GT96100_ETH_PORT_CONFIG, 0);
  340. }
  341. static void enable_ether_irq(struct net_device *dev)
  342. {
  343. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  344. u32 intMask;
  345. // unmask interrupts
  346. GT96100ETH_WRITE(gp, GT96100_ETH_INT_MASK,
  347.  icrRxBuffer | icrTxBufferLow | icrTxEndLow |
  348.  icrRxError | icrTxErrorLow | icrRxOVR |
  349.  icrTxUdr | icrRxBufferQ0 | icrRxErrorQ0 |
  350.  icrMIIPhySTC);
  351. // now route ethernet interrupts to GT Int0 (eth0 and eth1 will be
  352. // sharing it).
  353. // FIX! The kernel's irq code should do this
  354. intMask = GT96100_READ(GT96100_INT0_HIGH_MASK);
  355. intMask |= 1 << gp->port_num;
  356. GT96100_WRITE(GT96100_INT0_HIGH_MASK, intMask);
  357. }
  358. static void disable_ether_irq(struct net_device *dev)
  359. {
  360. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  361. u32 intMask;
  362. // FIX! The kernel's irq code should do this
  363. intMask = GT96100_READ(GT96100_INT0_HIGH_MASK);
  364. intMask &= ~(1 << gp->port_num);
  365. GT96100_WRITE(GT96100_INT0_HIGH_MASK, intMask);
  366. GT96100ETH_WRITE(gp, GT96100_ETH_INT_MASK, 0);
  367. }
  368. /*
  369.  * Probe for a GT96100 ethernet controller.
  370.  */
  371. int __init gt96100_probe(struct net_device *dev)
  372. {
  373. unsigned int base_addr = dev ? dev->base_addr : 0;
  374. int i;
  375. #ifndef CONFIG_MIPS_GT96100ETH
  376. return -ENODEV;
  377. #endif
  378. if (gt96100_debug > 2)
  379. printk(KERN_INFO "%s: gt96100_proben", dev->name);
  380. if (base_addr >= KSEG0) /* Check a single specified location. */
  381. return gt96100_probe1(dev, base_addr, dev->irq, 0);
  382. else if (base_addr != 0) /* Don't probe at all. */
  383. return -ENXIO;
  384. // for (i = 0; i<NUM_INTERFACES; i++) {
  385. for (i = NUM_INTERFACES - 1; i >= 0; i--) {
  386. int base_addr = gt96100_iflist[i].port;
  387. #if 0
  388. if (check_region(base_addr, GT96100_ETH_IO_SIZE)) {
  389. printk(KERN_ERR
  390.        "%s: gt96100_probe: ioaddr 0x%lx taken?n",
  391.        dev->name, base_addr);
  392. continue;
  393. }
  394. #endif
  395. if (gt96100_probe1
  396.     (dev, base_addr, gt96100_iflist[i].irq, i) == 0)
  397. return 0;
  398. }
  399. return -ENODEV;
  400. }
  401. static int __init
  402. gt96100_probe1(struct net_device *dev, long ioaddr, int irq, int port_num)
  403. {
  404. static unsigned version_printed = 0;
  405. struct gt96100_private *gp = NULL;
  406. int i, retval;
  407. u32 cpuConfig;
  408. // FIX! probe for GT96100 by reading a suitable register
  409. if (gt96100_debug > 2)
  410. printk(KERN_INFO "gt96100_probe1: ioaddr 0x%lx, irq %dn",
  411.        ioaddr, irq);
  412. request_region(ioaddr, GT96100_ETH_IO_SIZE, "GT96100ETH");
  413. cpuConfig = GT96100_READ(GT96100_CPU_INTERF_CONFIG);
  414. if (cpuConfig & (1 << 12)) {
  415. printk(KERN_ERR
  416.        "gt96100_probe1: must be in Big Endian mode!n");
  417. retval = -ENODEV;
  418. goto free_region;
  419. }
  420. if (gt96100_debug > 2)
  421. printk(KERN_INFO
  422.        "gt96100_probe1: chip in Big Endian mode - cooln");
  423. /* Allocate a new 'dev' if needed. */
  424. if (dev == NULL)
  425. dev = init_etherdev(0, sizeof(struct gt96100_private));
  426. if (gt96100_debug && version_printed++ == 0)
  427. printk(version);
  428. if (irq < 0) {
  429. printk(KERN_ERR
  430.        "gt96100_probe1: irq unknown - probing not supportedn");
  431. retval = -ENODEV;
  432. goto free_region;
  433. }
  434. printk(KERN_INFO "%s: GT-96100 ethernet found at 0x%lx, irq %dn",
  435.        dev->name, ioaddr, irq);
  436. /* private struct aligned and zeroed by init_etherdev */
  437. /* Fill in the 'dev' fields. */
  438. dev->base_addr = ioaddr;
  439. dev->irq = irq;
  440. memcpy(dev->dev_addr, gt96100_station_addr[port_num],
  441.        sizeof(dev->dev_addr));
  442. printk(KERN_INFO "%s: HW Address ", dev->name);
  443. for (i = 0; i < sizeof(dev->dev_addr); i++) {
  444. printk("%2.2x", dev->dev_addr[i]);
  445. printk(i < 5 ? ":" : "n");
  446. }
  447. /* Initialize our private structure. */
  448. if (dev->priv == NULL) {
  449. gp =
  450.     (struct gt96100_private *) kmalloc(sizeof(*gp),
  451.        GFP_KERNEL);
  452. if (gp == NULL) {
  453. retval = -ENOMEM;
  454. goto free_region;
  455. }
  456. dev->priv = gp;
  457. }
  458. gp = dev->priv;
  459. memset(gp, 0, sizeof(*gp)); // clear it
  460. gp->port_num = port_num;
  461. gp->io_size = GT96100_ETH_IO_SIZE;
  462. gp->port_offset = port_num * GT96100_ETH_IO_SIZE;
  463. gp->phy_addr = port_num + 1;
  464. if (gt96100_debug > 2)
  465. printk(KERN_INFO "%s: gt96100_probe1, port %dn",
  466.        dev->name, gp->port_num);
  467. // Allocate Rx and Tx descriptor rings
  468. if (gp->rx_ring == NULL) {
  469. // All descriptors in ring must be 16-byte aligned
  470. gp->rx_ring = dmaalloc(sizeof(gt96100_rd_t) * RX_RING_SIZE
  471.        +
  472.        sizeof(gt96100_td_t) * TX_RING_SIZE,
  473.        &gp->rx_ring_dma);
  474. if (gp->rx_ring == NULL) {
  475. retval = -ENOMEM;
  476. goto free_region;
  477. }
  478. gp->tx_ring =
  479.     (gt96100_td_t *) (gp->rx_ring + RX_RING_SIZE);
  480. gp->tx_ring_dma =
  481.     gp->rx_ring_dma + sizeof(gt96100_rd_t) * RX_RING_SIZE;
  482. }
  483. if (gt96100_debug > 2)
  484. printk(KERN_INFO
  485.        "%s: gt96100_probe1, rx_ring=%p, tx_ring=%pn",
  486.        dev->name, gp->rx_ring, gp->tx_ring);
  487. // Allocate Rx Hash Table
  488. if (gp->hash_table == NULL) {
  489. gp->hash_table = (char *) dmaalloc(RX_HASH_TABLE_SIZE,
  490.    &gp->hash_table_dma);
  491. if (gp->hash_table == NULL) {
  492. dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE
  493. + sizeof(gt96100_td_t) * TX_RING_SIZE,
  494. gp->rx_ring);
  495. retval = -ENOMEM;
  496. goto free_region;
  497. }
  498. }
  499. if (gt96100_debug > 2)
  500. printk(KERN_INFO "%s: gt96100_probe1, hash=%pn",
  501.        dev->name, gp->hash_table);
  502. spin_lock_init(&gp->lock);
  503. dev->open = gt96100_open;
  504. dev->hard_start_xmit = gt96100_tx;
  505. dev->stop = gt96100_close;
  506. dev->get_stats = gt96100_get_stats;
  507. //dev->do_ioctl = gt96100_ioctl;
  508. dev->set_multicast_list = gt96100_set_rx_mode;
  509. dev->tx_timeout = gt96100_tx_timeout;
  510. dev->watchdog_timeo = GT96100ETH_TX_TIMEOUT;
  511. /* Fill in the fields of the device structure with ethernet values. */
  512. ether_setup(dev);
  513. return 0;
  514.       free_region:
  515. release_region(ioaddr, gp->io_size);
  516. unregister_netdev(dev);
  517. if (dev->priv != NULL)
  518. kfree(dev->priv);
  519. kfree(dev);
  520. printk(KERN_ERR "%s: gt96100_probe1 failed.  Returns %dn",
  521.        dev->name, retval);
  522. return retval;
  523. }
  524. static int gt96100_init(struct net_device *dev)
  525. {
  526. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  527. unsigned long flags;
  528. u32 phyAD, ciu;
  529. int i;
  530. if (gt96100_debug > 2)
  531. printk("%s: gt96100_init: dev=%pn", dev->name, dev);
  532. // Stop and disable Port
  533. hard_stop(dev);
  534. spin_lock_irqsave(&gp->lock, flags);
  535. // First things first, set-up hash table
  536. memset(gp->hash_table, 0, RX_HASH_TABLE_SIZE); // clear it
  537. gp->hash_mode = 0;
  538. // Add a single entry to hash table - our ethernet address
  539. gt96100_add_hash_entry(dev, dev->dev_addr);
  540. // Set-up DMA ptr to hash table
  541. GT96100ETH_WRITE(gp, GT96100_ETH_HASH_TBL_PTR, gp->hash_table_dma);
  542. if (gt96100_debug > 2)
  543. printk("%s: gt96100_init: Hash Tbl Ptr=%xn", dev->name,
  544.        GT96100ETH_READ(gp, GT96100_ETH_HASH_TBL_PTR));
  545. // Setup Tx descriptor ring
  546. for (i = 0; i < TX_RING_SIZE; i++) {
  547. gp->tx_ring[i].cmdstat = 0; // CPU owns
  548. gp->tx_ring[i].byte_cnt = 0;
  549. gp->tx_ring[i].buff_ptr = 0;
  550. gp->tx_ring[i].next =
  551.     cpu_to_dma32(gp->tx_ring_dma +
  552.  sizeof(gt96100_td_t) * (i + 1));
  553. }
  554. /* Wrap the ring. */
  555. gp->tx_ring[i - 1].next = cpu_to_dma32(gp->tx_ring_dma);
  556. // setup only the lowest priority TxCDP reg
  557. GT96100ETH_WRITE(gp, GT96100_ETH_CURR_TX_DESC_PTR0,
  558.  gp->tx_ring_dma);
  559. GT96100ETH_WRITE(gp, GT96100_ETH_CURR_TX_DESC_PTR1, 0);
  560. if (gt96100_debug > 2)
  561. printk("%s: gt96100_init: Curr Tx Desc Ptr0=%xn",
  562.        dev->name, GT96100ETH_READ(gp,
  563.   GT96100_ETH_CURR_TX_DESC_PTR0));
  564. // Setup Rx descriptor ring 
  565. for (i = 0; i < RX_RING_SIZE; i++) {
  566. dma_addr_t rx_buff_dma;
  567. gp->rx_ring[i].next =
  568.     cpu_to_dma32(gp->rx_ring_dma +
  569.  sizeof(gt96100_rd_t) * (i + 1));
  570. if (gp->rx_buff[i] == NULL)
  571. gp->rx_buff[i] =
  572.     dmaalloc(PKT_BUF_SZ, &rx_buff_dma);
  573. else
  574. rx_buff_dma = virt_to_phys(gp->rx_buff[i]);
  575. if (gp->rx_buff[i] == NULL)
  576. break;
  577. gp->rx_ring[i].buff_ptr = cpu_to_dma32(rx_buff_dma);
  578. gp->rx_ring[i].buff_cnt_sz =
  579.     cpu_to_dma32(PKT_BUF_SZ << rdBuffSzBit);
  580. // Give ownership to device, enable interrupt
  581. gp->rx_ring[i].cmdstat =
  582.     cpu_to_dma32((u32) (rxOwn | rxEI));
  583. }
  584. if (i != RX_RING_SIZE) {
  585. int j;
  586. for (j = 0; j < RX_RING_SIZE; j++) {
  587. if (gp->rx_buff[j]) {
  588. dmafree(PKT_BUF_SZ, gp->rx_buff[j]);
  589. gp->rx_buff[j] = NULL;
  590. }
  591. }
  592. printk(KERN_ERR "%s: Rx ring allocation failed.n",
  593.        dev->name);
  594. spin_unlock_irqrestore(&gp->lock, flags);
  595. return -ENOMEM;
  596. }
  597. /* Wrap the ring. */
  598. gp->rx_ring[i - 1].next = cpu_to_dma32(gp->rx_ring_dma);
  599. // Set our MII PHY device address
  600. phyAD = GT96100_READ(GT96100_ETH_PHY_ADDR_REG);
  601. phyAD &= ~(0x1f << (gp->port_num * 5));
  602. phyAD |= gp->phy_addr << (gp->port_num * 5);
  603. GT96100_WRITE(GT96100_ETH_PHY_ADDR_REG, phyAD);
  604. if (gt96100_debug > 2)
  605. printk("%s: gt96100_init: PhyAD=%xn", dev->name,
  606.        GT96100_READ(GT96100_ETH_PHY_ADDR_REG));
  607. // Clear all the RxFDP and RXCDP regs...
  608. for (i = 0; i < 4; i++) {
  609. GT96100ETH_WRITE(gp, GT96100_ETH_1ST_RX_DESC_PTR0 + i * 4,
  610.  0);
  611. GT96100ETH_WRITE(gp, GT96100_ETH_CURR_RX_DESC_PTR0 + i * 4,
  612.  0);
  613. }
  614. // and setup only the lowest priority RxFDP and RxCDP regs
  615. GT96100ETH_WRITE(gp, GT96100_ETH_1ST_RX_DESC_PTR0,
  616.  gp->rx_ring_dma);
  617. GT96100ETH_WRITE(gp, GT96100_ETH_CURR_RX_DESC_PTR0,
  618.  gp->rx_ring_dma);
  619. if (gt96100_debug > 2)
  620. printk("%s: gt96100_init: 1st/Curr Rx Desc Ptr0=%x/%xn",
  621.        dev->name, GT96100ETH_READ(gp,
  622.   GT96100_ETH_1ST_RX_DESC_PTR0),
  623.        GT96100ETH_READ(gp, GT96100_ETH_CURR_RX_DESC_PTR0));
  624. // init Rx/Tx indeces and pkt counters
  625. gp->rx_next_out = gp->tx_next_in = gp->tx_next_out = 0;
  626. gp->tx_count = 0;
  627. // setup DMA
  628. // FIX! this should be done by Kernel setup code
  629. ciu = GT96100_READ(GT96100_CIU_ARBITER_CONFIG);
  630. ciu |= (0x0c << (gp->port_num * 2)); // set Ether DMA req priority to high
  631. // FIX! setting the following bit causes the EV96100 board to hang!!!
  632. //ciu |= (1 << (24+gp->port_num));   // pull Ethernet port out of Reset???
  633. // FIX! endian mode???
  634. ciu &= ~(1 << 31); // set desc endianess to Big
  635. GT96100_WRITE(GT96100_CIU_ARBITER_CONFIG, ciu);
  636. if (gt96100_debug > 2)
  637. printk("%s: gt96100_init: CIU Config=%x/%xn", dev->name,
  638.        ciu, GT96100_READ(GT96100_CIU_ARBITER_CONFIG));
  639. // We want the Rx/Tx DMA to write/read data to/from memory in
  640. // Big Endian mode. Also set DMA Burst Size to 8 64Bit words.
  641. // FIX! endian mode???
  642. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_CONFIG,
  643.  //sdcrBLMR | sdcrBLMT |
  644.  (0xf << sdcrRCBit) | sdcrRIFB | (3 << sdcrBSZBit));
  645. if (gt96100_debug > 2)
  646. printk("%s: gt96100_init: SDMA Config=%xn", dev->name,
  647.        GT96100ETH_READ(gp, GT96100_ETH_SDMA_CONFIG));
  648. // start Rx DMA
  649. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_COMM, sdcmrERD);
  650. if (gt96100_debug > 2)
  651. printk("%s: gt96100_init: SDMA Comm=%xn", dev->name,
  652.        GT96100ETH_READ(gp, GT96100_ETH_SDMA_COMM));
  653. // enable interrupts
  654. enable_ether_irq(dev);
  655. /*
  656.  * Disable all Type-of-Service queueing. All Rx packets will be
  657.  * treated normally and will be sent to the lowest priority
  658.  * queue.
  659.  *
  660.  * Disable flow-control for now. FIX! support flow control?
  661.  */
  662. // clear all the MIB ctr regs
  663. // Enable reg clear on read. FIX! desc of this bit is inconsistent
  664. // in the GT-96100A datasheet.
  665. GT96100ETH_WRITE(gp, GT96100_ETH_PORT_CONFIG_EXT,
  666.  pcxrFCTL | pcxrFCTLen | pcxrFLP);
  667. read_mib_counters(gp);
  668. GT96100ETH_WRITE(gp, GT96100_ETH_PORT_CONFIG_EXT,
  669.  pcxrFCTL | pcxrFCTLen | pcxrFLP | pcxrMIBclrMode);
  670. if (gt96100_debug > 2)
  671. printk("%s: gt96100_init: Port Config Ext=%xn", dev->name,
  672.        GT96100ETH_READ(gp, GT96100_ETH_PORT_CONFIG_EXT));
  673. // enable this port (set hash size to 1/2K)
  674. GT96100ETH_WRITE(gp, GT96100_ETH_PORT_CONFIG, pcrEN | pcrHS);
  675. if (gt96100_debug > 2)
  676. printk("%s: gt96100_init: Port Config=%xn", dev->name,
  677.        GT96100ETH_READ(gp, GT96100_ETH_PORT_CONFIG));
  678. // we should now be receiving frames
  679. if (gt96100_debug > 2)
  680. dump_MII(dev);
  681. spin_unlock_irqrestore(&gp->lock, flags);
  682. return 0;
  683. }
  684. static int gt96100_open(struct net_device *dev)
  685. {
  686. int retval;
  687. MOD_INC_USE_COUNT;
  688. if (gt96100_debug > 2)
  689. printk("%s: gt96100_open: dev=%pn", dev->name, dev);
  690. if ((retval = request_irq(dev->irq, &gt96100_interrupt,
  691.   SA_SHIRQ, dev->name, dev))) {
  692. printk(KERN_ERR "%s: unable to get IRQ %dn", dev->name,
  693.        dev->irq);
  694. MOD_DEC_USE_COUNT;
  695. return retval;
  696. }
  697. // Initialize and startup the GT-96100 ethernet port
  698. if ((retval = gt96100_init(dev))) {
  699. printk(KERN_ERR "%s: error in gt96100_initn", dev->name);
  700. free_irq(dev->irq, dev);
  701. MOD_DEC_USE_COUNT;
  702. return retval;
  703. }
  704. netif_start_queue(dev);
  705. if (gt96100_debug > 2)
  706. printk("%s: gt96100_open: Initialization done.n",
  707.        dev->name);
  708. return 0;
  709. }
  710. static int gt96100_close(struct net_device *dev)
  711. {
  712. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  713. int i;
  714. if (gt96100_debug > 2)
  715. printk("%s: gt96100_close: dev=%pn", dev->name, dev);
  716. // stop the device
  717. if (netif_device_present(dev)) {
  718. netif_stop_queue(dev);
  719. hard_stop(dev);
  720. }
  721. // free the Rx DMA buffers
  722. for (i = 0; i < RX_RING_SIZE; i++) {
  723. if (gp->rx_buff[i]) {
  724. dmafree(PKT_BUF_SZ, gp->rx_buff[i]);
  725. gp->rx_buff[i] = NULL;
  726. }
  727. }
  728. free_irq(dev->irq, dev);
  729. MOD_DEC_USE_COUNT;
  730. return 0;
  731. }
  732. static int gt96100_tx(struct sk_buff *skb, struct net_device *dev)
  733. {
  734. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  735. unsigned long flags;
  736. int nextIn;
  737. if (gt96100_debug > 2)
  738. printk("%s: gt96100_tx: skb->len=%d, skb->data=%pn",
  739.        dev->name, skb->len, skb->data);
  740. spin_lock_irqsave(&gp->lock, flags);
  741. if (gp->tx_count >= TX_RING_SIZE) {
  742. printk(KERN_WARNING
  743.        "%s: Tx Ring full, refusing to send buffer.n",
  744.        dev->name);
  745. gp->stats.tx_dropped++;
  746. spin_unlock_irqrestore(&gp->lock, flags);
  747. return 1;
  748. }
  749. // Prepare the Descriptor at tx_next_in
  750. nextIn = gp->tx_next_in;
  751. if (dma32_to_cpu(gp->tx_ring[nextIn].cmdstat) & txOwn) {
  752. printk(KERN_ERR "%s: gt96100_tx: TxOwn bit wrong!!n",
  753.        dev->name);
  754. }
  755. gp->tx_skbuff[nextIn] = skb;
  756. gp->tx_ring[nextIn].byte_cnt =
  757.     cpu_to_dma32(skb->len << tdByteCntBit);
  758. gp->tx_ring[nextIn].buff_ptr =
  759.     cpu_to_dma32(virt_to_phys(skb->data));
  760. // Give ownership to device, set first and last desc, enable interrupt
  761. // Setting of ownership bit must be *last*!
  762. gp->tx_ring[nextIn].cmdstat =
  763.     cpu_to_dma32((u32) (txOwn | txEI | txFirst | txLast));
  764. // increment tx_next_in with wrap
  765. gp->tx_next_in = (nextIn + 1) % TX_RING_SIZE;
  766. // If count is zero, DMA should be stopped, so restart
  767. if (gp->tx_count == 0) {
  768. if (GT96100ETH_READ(gp, GT96100_ETH_PORT_STATUS) &
  769.     psrTxLow) printk(KERN_WARNING
  770.      "%s: Tx count zero but Tx queue running!n",
  771.      dev->name);
  772. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_COMM,
  773.  sdcmrERD | sdcmrTXDL);
  774. }
  775. // increment count and stop queue if full
  776. if (++gp->tx_count == TX_RING_SIZE)
  777. netif_stop_queue(dev);
  778. dev->trans_start = jiffies;
  779. spin_unlock_irqrestore(&gp->lock, flags);
  780. return 0;
  781. }
  782. static int gt96100_rx(struct net_device *dev, u32 status)
  783. {
  784. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  785. struct sk_buff *skb;
  786. int pkt_len, nextOut;
  787. gt96100_rd_t *rd;
  788. u32 cmdstat;
  789. if (gt96100_debug > 2)
  790. printk("%s: gt96100_rx: dev=%p, status = %xn",
  791.        dev->name, dev, status);
  792. // Continue until we reach the current descriptor pointer
  793. for (nextOut = gp->rx_next_out;
  794.      nextOut !=
  795.      (GT96100ETH_READ(gp, GT96100_ETH_CURR_RX_DESC_PTR0) -
  796.       gp->rx_ring_dma) / sizeof(gt96100_rd_t);
  797.      nextOut = (nextOut + 1) % RX_RING_SIZE) {
  798. rd = &gp->rx_ring[nextOut];
  799. cmdstat = dma32_to_cpu(rd->cmdstat);
  800. if (cmdstat & (u32) rxOwn) {
  801. cmdstat &= ~((u32) rxOwn);
  802. rd->cmdstat = cpu_to_dma32(cmdstat);
  803. printk(KERN_ERR
  804.        "%s: gt96100_rx: ownership bit wrong!n",
  805.        dev->name);
  806. }
  807. // must be first and last (ie only) buffer of packet
  808. if (!(cmdstat & (u32) rxFirst)
  809.     || !(cmdstat & (u32) rxLast)) {
  810. printk(KERN_ERR
  811.        "%s: gt96100_rx: desc not first and last!n",
  812.        dev->name);
  813. continue;
  814. }
  815. // drop this received pkt if there were any errors
  816. if ((cmdstat & (u32) rxErrorSummary)
  817.     || (status & icrRxErrorQ0)) {
  818. // update the detailed rx error counters that are not covered
  819. // by the MIB counters.
  820. if (cmdstat & (u32) rxOverrun)
  821. gp->stats.rx_fifo_errors++;
  822. continue;
  823. }
  824. pkt_len = dma32_to_cpu(rd->buff_cnt_sz) & rdByteCntMask;
  825. /* Create new skb. */
  826. skb = dev_alloc_skb(pkt_len + 2);
  827. if (skb == NULL) {
  828. printk(KERN_ERR
  829.        "%s: Memory squeeze, dropping packet.n",
  830.        dev->name);
  831. gp->stats.rx_dropped++;
  832. continue;
  833. }
  834. skb->dev = dev;
  835. skb_reserve(skb, 2); /* 16 byte IP header align */
  836. skb_put(skb, pkt_len); /* Make room */
  837. eth_copy_and_sum(skb, gp->rx_buff[nextOut], pkt_len, 0);
  838. skb->protocol = eth_type_trans(skb, dev);
  839. netif_rx(skb); /* pass the packet to upper layers */
  840. // now we can release ownership of this desc back to device
  841. cmdstat |= (u32) rxOwn;
  842. rd->cmdstat = cpu_to_dma32(cmdstat);
  843. dev->last_rx = jiffies;
  844. }
  845. gp->rx_next_out = nextOut;
  846. return 0;
  847. }
  848. static void gt96100_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  849. {
  850. struct net_device *dev = (struct net_device *) dev_id;
  851. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  852. u32 status;
  853. if (dev == NULL) {
  854. printk(KERN_ERR "%s: isr: null dev ptrn", dev->name);
  855. return;
  856. }
  857. status = GT96100ETH_READ(gp, GT96100_ETH_INT_CAUSE);
  858. // ACK interrupts
  859. #if 0
  860. GT96100ETH_CLRBIT(gp, GT96100_ETH_INT_CAUSE,
  861.   icrEtherIntSum | icrRxBufferQ1 | icrRxBufferQ2 |
  862.   icrRxBufferQ3 | icrRxBufferQ0 | icrTxBufferHigh |
  863.   icrTxEndHigh | icrTxBufferLow | icrTxEndLow |
  864.   icrTxErrorHigh | icrTxErrorLow | icrTxUdr);
  865. #else
  866. GT96100ETH_WRITE(gp, GT96100_ETH_INT_CAUSE, 0);
  867. #endif
  868. if ((status & icrEtherIntSum) == 0) {
  869. // not our interrupt
  870. //printk("%s: isr: no ints? icr=%x,cp0_cause=%xn",
  871. //       dev->name, status, read_32bit_cp0_register(CP0_CAUSE));
  872. return;
  873. }
  874. if (gt96100_debug > 3)
  875. printk("%s: isr: entry, icr=%xn", dev->name, status);
  876. if (status & (icrRxBufferQ1 | icrRxBufferQ2 | icrRxBufferQ3)) {
  877. printk(KERN_ERR "%s: isr: Rx intr in unused queues!?n",
  878.        dev->name);
  879. }
  880. if (status & icrRxBufferQ0) {
  881. gt96100_rx(dev, status);
  882. }
  883. if (status & (icrTxBufferHigh | icrTxEndHigh)) {
  884. printk(KERN_ERR "%s: isr: Tx intr in unused queue!?n",
  885.        dev->name);
  886. }
  887. if (status & icrMIIPhySTC) {
  888. u32 psr = GT96100ETH_READ(gp, GT96100_ETH_PORT_STATUS);
  889. printk("%s: port status:n", dev->name);
  890. printk
  891.     ("%s:     %s MBit/s, %s-duplex, flow-control %s, link is %s,n",
  892.      dev->name, psr & psrSpeed ? "100" : "10",
  893.      psr & psrDuplex ? "full" : "half",
  894.      psr & psrFctl ? "disabled" : "enabled",
  895.      psr & psrLink ? "up" : "down");
  896. printk
  897.     ("%s:     TxLowQ is %s, TxHighQ is %s, Transmitter is %sn",
  898.      dev->name, psr & psrTxLow ? "running" : "stopped",
  899.      psr & psrTxHigh ? "running" : "stopped",
  900.      psr & psrTxInProg ? "on" : "off");
  901. gp->last_psr = psr;
  902. }
  903. if (status & (icrTxBufferLow | icrTxEndLow)) {
  904. int nextOut;
  905. gt96100_td_t *td;
  906. u32 cmdstat;
  907. // Continue until we reach the current descriptor pointer
  908. for (nextOut = gp->tx_next_out;
  909.      nextOut !=
  910.      (GT96100ETH_READ(gp, GT96100_ETH_CURR_TX_DESC_PTR0) -
  911.       gp->tx_ring_dma) / sizeof(gt96100_td_t);
  912.      nextOut = (nextOut + 1) % TX_RING_SIZE) {
  913. td = &gp->tx_ring[nextOut];
  914. cmdstat = dma32_to_cpu(td->cmdstat);
  915. if (gt96100_debug > 2)
  916. printk("%s: isr: Tx desc cmdstat=%xn",
  917.        dev->name, cmdstat);
  918. if (cmdstat & (u32) txOwn) {
  919. cmdstat &= ~((u32) txOwn);
  920. td->cmdstat = cpu_to_dma32(cmdstat);
  921. printk(KERN_ERR
  922.        "%s: isr: Tx ownership bit wrong!n",
  923.        dev->name);
  924. }
  925. // increment Tx error stats
  926. if (cmdstat & (u32) txErrorSummary) {
  927. if (gt96100_debug > 2)
  928. printk
  929.     ("%s: gt96100_interrupt: Tx error, cmdstat = %xn",
  930.      dev->name, cmdstat);
  931. gp->stats.tx_errors++;
  932. if (cmdstat & (u32) txReTxLimit)
  933. gp->stats.collisions++;
  934. if (cmdstat & (u32) txUnderrun)
  935. gp->stats.tx_fifo_errors++;
  936. if (cmdstat & (u32) txLateCollision)
  937. gp->stats.tx_window_errors++;
  938. }
  939. // Wake the queue if the ring was full
  940. if (gp->tx_count == TX_RING_SIZE)
  941. netif_wake_queue(dev);
  942. // decrement tx ring buffer count
  943. if (gp->tx_count)
  944. gp->tx_count--;
  945. // free the skb
  946. if (gp->tx_skbuff[nextOut]) {
  947. if (gt96100_debug > 2)
  948. printk
  949.     ("%s: isr: good Tx, skb=%pn",
  950.      dev->name,
  951.      gp->tx_skbuff[nextOut]);
  952. dev_kfree_skb_irq(gp->tx_skbuff[nextOut]);
  953. gp->tx_skbuff[nextOut] = NULL;
  954. } else {
  955. printk(KERN_ERR "%s: isr: no skb!n",
  956.        dev->name);
  957. }
  958. }
  959. if (gp->tx_count == 0 && nextOut != gp->tx_next_in) {
  960. // FIX! this should probably be a panic
  961. printk(KERN_ERR
  962.        "%s: isr: warning! Tx queue inconsistentn",
  963.        dev->name);
  964. }
  965. gp->tx_next_out = nextOut;
  966. if ((status & icrTxEndLow) && gp->tx_count != 0) {
  967. // we must restart the DMA
  968. if (gt96100_debug > 2)
  969. printk("%s: isr: Restarting Tx DMAn",
  970.        dev->name);
  971. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_COMM,
  972.  sdcmrERD | sdcmrTXDL);
  973. }
  974. }
  975. // Now check TX errors (RX errors were handled in gt96100_rx)
  976. if (status & icrTxErrorHigh) {
  977. printk(KERN_ERR
  978.        "%s: isr: Tx resource error in unused queue!?n",
  979.        dev->name);
  980. }
  981. if (status & icrTxErrorLow) {
  982. printk(KERN_ERR "%s: isr: Tx resource errorn", dev->name);
  983. }
  984. if (status & icrTxUdr) {
  985. printk(KERN_ERR "%s: isr: Tx underrun errorn", dev->name);
  986. }
  987. if (gt96100_debug > 3)
  988. printk("%s: isr: exit, icr=%xn",
  989.        dev->name, GT96100ETH_READ(gp,
  990.   GT96100_ETH_INT_CAUSE));
  991. }
  992. /*
  993.  * The Tx ring has been full longer than the watchdog timeout
  994.  * value, meaning that the interrupt routine has not been freeing
  995.  * up space in the Tx ring buffer.
  996.  */
  997. static void gt96100_tx_timeout(struct net_device *dev)
  998. {
  999. //    struct gt96100_private *gp = (struct gt96100_private *)dev->priv;
  1000. printk(KERN_ERR "%s: gt96100_tx_timeout: dev=%pn", dev->name,
  1001.        dev);
  1002. // FIX! do something, like reset the device
  1003. }
  1004. static void gt96100_set_rx_mode(struct net_device *dev)
  1005. {
  1006. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  1007. unsigned long flags;
  1008. struct dev_mc_list *mcptr;
  1009. if (gt96100_debug > 2)
  1010. printk("%s: gt96100_set_rx_mode: dev=%p, flags=%xn",
  1011.        dev->name, dev, dev->flags);
  1012. // stop the Receiver DMA
  1013. abort(dev, sdcmrAR);
  1014. spin_lock_irqsave(&gp->lock, flags);
  1015. if (dev->flags & IFF_PROMISC)
  1016. GT96100ETH_WRITE(gp, GT96100_ETH_PORT_CONFIG,
  1017.  pcrEN | pcrHS | pcrPM);
  1018. memset(gp->hash_table, 0, RX_HASH_TABLE_SIZE); // clear hash table
  1019. // Add our ethernet address
  1020. gt96100_add_hash_entry(dev, dev->dev_addr);
  1021. if (dev->mc_count) {
  1022. for (mcptr = dev->mc_list; mcptr; mcptr = mcptr->next) {
  1023. gt96100_add_hash_entry(dev, mcptr->dmi_addr);
  1024. }
  1025. }
  1026. // restart Rx DMA
  1027. GT96100ETH_WRITE(gp, GT96100_ETH_SDMA_COMM, sdcmrERD);
  1028. spin_unlock_irqrestore(&gp->lock, flags);
  1029. }
  1030. static struct net_device_stats *gt96100_get_stats(struct net_device *dev)
  1031. {
  1032. struct gt96100_private *gp = (struct gt96100_private *) dev->priv;
  1033. unsigned long flags;
  1034. if (gt96100_debug > 2)
  1035. printk("%s: gt96100_get_stats: dev=%pn", dev->name, dev);
  1036. if (netif_device_present(dev)) {
  1037. spin_lock_irqsave(&gp->lock, flags);
  1038. update_stats(gp);
  1039. spin_unlock_irqrestore(&gp->lock, flags);
  1040. }
  1041. return &gp->stats;
  1042. }
  1043. module_init(gt96100_probe);
  1044. MODULE_LICENSE("GPL");