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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Amiga Linux/68k A2065 Ethernet Driver
  3.  *
  4.  * (C) Copyright 1995 by Geert Uytterhoeven <geert@linux-m68k.org>
  5.  *
  6.  * Fixes and tips by:
  7.  * - Janos Farkas (CHEXUM@sparta.banki.hu)
  8.  * - Jes Degn Soerensen (jds@kom.auc.dk)
  9.  * - Matt Domsch (Matt_Domsch@dell.com)
  10.  *
  11.  * ----------------------------------------------------------------------------
  12.  *
  13.  * This program is based on
  14.  *
  15.  * ariadne.?: Amiga Linux/68k Ariadne Ethernet Driver
  16.  * (C) Copyright 1995 by Geert Uytterhoeven,
  17.  *                                            Peter De Schrijver
  18.  *
  19.  * lance.c: An AMD LANCE ethernet driver for linux.
  20.  * Written 1993-94 by Donald Becker.
  21.  *
  22.  * Am79C960: PCnet(tm)-ISA Single-Chip Ethernet Controller
  23.  * Advanced Micro Devices
  24.  * Publication #16907, Rev. B, Amendment/0, May 1994
  25.  *
  26.  * ----------------------------------------------------------------------------
  27.  *
  28.  * This file is subject to the terms and conditions of the GNU General Public
  29.  * License.  See the file COPYING in the main directory of the Linux
  30.  * distribution for more details.
  31.  *
  32.  * ----------------------------------------------------------------------------
  33.  *
  34.  * The A2065 is a Zorro-II board made by Commodore/Ameristar. It contains:
  35.  *
  36.  * - an Am7990 Local Area Network Controller for Ethernet (LANCE) with
  37.  *   both 10BASE-2 (thin coax) and AUI (DB-15) connectors
  38.  */
  39. #include <linux/module.h>
  40. #include <linux/stddef.h>
  41. #include <linux/kernel.h>
  42. #include <linux/sched.h>
  43. #include <linux/interrupt.h>
  44. #include <linux/ptrace.h>
  45. #include <linux/ioport.h>
  46. #include <linux/slab.h>
  47. #include <linux/string.h>
  48. #include <linux/config.h>
  49. #include <linux/init.h>
  50. #include <linux/crc32.h>
  51. #include <asm/bitops.h>
  52. #include <asm/irq.h>
  53. #include <linux/errno.h>
  54. #include <asm/amigaints.h>
  55. #include <asm/amigahw.h>
  56. #include <linux/zorro.h>
  57. #include <linux/netdevice.h>
  58. #include <linux/etherdevice.h>
  59. #include <linux/skbuff.h>
  60. #include "a2065.h"
  61. /*
  62.  * Transmit/Receive Ring Definitions
  63.  */
  64. #define LANCE_LOG_TX_BUFFERS (2)
  65. #define LANCE_LOG_RX_BUFFERS (4)
  66. #define TX_RING_SIZE (1<<LANCE_LOG_TX_BUFFERS)
  67. #define RX_RING_SIZE (1<<LANCE_LOG_RX_BUFFERS)
  68. #define TX_RING_MOD_MASK (TX_RING_SIZE-1)
  69. #define RX_RING_MOD_MASK (RX_RING_SIZE-1)
  70. #define PKT_BUF_SIZE (1544)
  71. #define RX_BUFF_SIZE            PKT_BUF_SIZE
  72. #define TX_BUFF_SIZE            PKT_BUF_SIZE
  73. /*
  74.  * Layout of the Lance's RAM Buffer
  75.  */
  76. struct lance_init_block {
  77. unsigned short mode; /* Pre-set mode (reg. 15) */
  78. unsigned char phys_addr[6];     /* Physical ethernet address */
  79. unsigned filter[2]; /* Multicast filter. */
  80. /* Receive and transmit ring base, along with extra bits. */
  81. unsigned short rx_ptr; /* receive descriptor addr */
  82. unsigned short rx_len; /* receive len and high addr */
  83. unsigned short tx_ptr; /* transmit descriptor addr */
  84. unsigned short tx_len; /* transmit len and high addr */
  85.     
  86. /* The Tx and Rx ring entries must aligned on 8-byte boundaries. */
  87. struct lance_rx_desc brx_ring[RX_RING_SIZE];
  88. struct lance_tx_desc btx_ring[TX_RING_SIZE];
  89. char   rx_buf [RX_RING_SIZE][RX_BUFF_SIZE];
  90. char   tx_buf [TX_RING_SIZE][TX_BUFF_SIZE];
  91. };
  92. /*
  93.  * Private Device Data
  94.  */
  95. struct lance_private {
  96. char *name;
  97. volatile struct lance_regs *ll;
  98. volatile struct lance_init_block *init_block;     /* Hosts view */
  99. volatile struct lance_init_block *lance_init_block; /* Lance view */
  100. int rx_new, tx_new;
  101. int rx_old, tx_old;
  102.     
  103. int lance_log_rx_bufs, lance_log_tx_bufs;
  104. int rx_ring_mod_mask, tx_ring_mod_mask;
  105. struct net_device_stats stats;
  106. int tpe;       /* cable-selection is TPE */
  107. int auto_select;       /* cable-selection by carrier */
  108. unsigned short busmaster_regval;
  109. #ifdef CONFIG_SUNLANCE
  110. struct Linux_SBus_DMA *ledma; /* if set this points to ledma and arch=4m */
  111. int burst_sizes;       /* ledma SBus burst sizes */
  112. #endif
  113. struct timer_list         multicast_timer;
  114. struct net_device *dev; /* Backpointer */
  115. struct lance_private *next_module;
  116. };
  117. #ifdef MODULE
  118. static struct lance_private *root_a2065_dev;
  119. #endif
  120. #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?
  121. lp->tx_old+lp->tx_ring_mod_mask-lp->tx_new:
  122. lp->tx_old - lp->tx_new-1)
  123. #define LANCE_ADDR(x) ((int)(x) & ~0xff000000)
  124. /* Load the CSR registers */
  125. static void load_csrs (struct lance_private *lp)
  126. {
  127. volatile struct lance_regs *ll = lp->ll;
  128. volatile struct lance_init_block *aib = lp->lance_init_block;
  129. int leptr;
  130. leptr = LANCE_ADDR (aib);
  131. ll->rap = LE_CSR1;
  132. ll->rdp = (leptr & 0xFFFF);
  133. ll->rap = LE_CSR2;
  134. ll->rdp = leptr >> 16;
  135. ll->rap = LE_CSR3;
  136. ll->rdp = lp->busmaster_regval;
  137. /* Point back to csr0 */
  138. ll->rap = LE_CSR0;
  139. }
  140. #define ZERO 0
  141. /* Setup the Lance Rx and Tx rings */
  142. static void lance_init_ring (struct net_device *dev)
  143. {
  144. struct lance_private *lp = (struct lance_private *) dev->priv;
  145. volatile struct lance_init_block *ib = lp->init_block;
  146. volatile struct lance_init_block *aib; /* for LANCE_ADDR computations */
  147. int leptr;
  148. int i;
  149. aib = lp->lance_init_block;
  150. /* Lock out other processes while setting up hardware */
  151. netif_stop_queue(dev);
  152. lp->rx_new = lp->tx_new = 0;
  153. lp->rx_old = lp->tx_old = 0;
  154. ib->mode = 0;
  155. /* Copy the ethernet address to the lance init block
  156.  * Note that on the sparc you need to swap the ethernet address.
  157.  */
  158. ib->phys_addr [0] = dev->dev_addr [1];
  159. ib->phys_addr [1] = dev->dev_addr [0];
  160. ib->phys_addr [2] = dev->dev_addr [3];
  161. ib->phys_addr [3] = dev->dev_addr [2];
  162. ib->phys_addr [4] = dev->dev_addr [5];
  163. ib->phys_addr [5] = dev->dev_addr [4];
  164. if (ZERO)
  165. printk ("TX rings:n");
  166.     
  167. /* Setup the Tx ring entries */
  168. for (i = 0; i <= (1<<lp->lance_log_tx_bufs); i++) {
  169. leptr = LANCE_ADDR(&aib->tx_buf[i][0]);
  170. ib->btx_ring [i].tmd0      = leptr;
  171. ib->btx_ring [i].tmd1_hadr = leptr >> 16;
  172. ib->btx_ring [i].tmd1_bits = 0;
  173. ib->btx_ring [i].length    = 0xf000; /* The ones required by tmd2 */
  174. ib->btx_ring [i].misc      = 0;
  175. if (i < 3)
  176. if (ZERO) printk ("%d: 0x%8.8xn", i, leptr);
  177. }
  178. /* Setup the Rx ring entries */
  179. if (ZERO)
  180. printk ("RX rings:n");
  181. for (i = 0; i < (1<<lp->lance_log_rx_bufs); i++) {
  182. leptr = LANCE_ADDR(&aib->rx_buf[i][0]);
  183. ib->brx_ring [i].rmd0      = leptr;
  184. ib->brx_ring [i].rmd1_hadr = leptr >> 16;
  185. ib->brx_ring [i].rmd1_bits = LE_R1_OWN;
  186. ib->brx_ring [i].length    = -RX_BUFF_SIZE | 0xf000;
  187. ib->brx_ring [i].mblength  = 0;
  188. if (i < 3 && ZERO)
  189. printk ("%d: 0x%8.8xn", i, leptr);
  190. }
  191. /* Setup the initialization block */
  192.     
  193. /* Setup rx descriptor pointer */
  194. leptr = LANCE_ADDR(&aib->brx_ring);
  195. ib->rx_len = (lp->lance_log_rx_bufs << 13) | (leptr >> 16);
  196. ib->rx_ptr = leptr;
  197. if (ZERO)
  198. printk ("RX ptr: %8.8xn", leptr);
  199.     
  200. /* Setup tx descriptor pointer */
  201. leptr = LANCE_ADDR(&aib->btx_ring);
  202. ib->tx_len = (lp->lance_log_tx_bufs << 13) | (leptr >> 16);
  203. ib->tx_ptr = leptr;
  204. if (ZERO)
  205. printk ("TX ptr: %8.8xn", leptr);
  206. /* Clear the multicast filter */
  207. ib->filter [0] = 0;
  208. ib->filter [1] = 0;
  209. }
  210. static int init_restart_lance (struct lance_private *lp)
  211. {
  212. volatile struct lance_regs *ll = lp->ll;
  213. int i;
  214. ll->rap = LE_CSR0;
  215. ll->rdp = LE_C0_INIT;
  216. /* Wait for the lance to complete initialization */
  217. for (i = 0; (i < 100) && !(ll->rdp & (LE_C0_ERR | LE_C0_IDON)); i++)
  218. barrier();
  219. if ((i == 100) || (ll->rdp & LE_C0_ERR)) {
  220. printk ("LANCE unopened after %d ticks, csr0=%4.4x.n", i, ll->rdp);
  221. return -EIO;
  222. }
  223. /* Clear IDON by writing a "1", enable interrupts and start lance */
  224. ll->rdp = LE_C0_IDON;
  225. ll->rdp = LE_C0_INEA | LE_C0_STRT;
  226. return 0;
  227. }
  228. static int lance_rx (struct net_device *dev)
  229. {
  230. struct lance_private *lp = (struct lance_private *) dev->priv;
  231. volatile struct lance_init_block *ib = lp->init_block;
  232. volatile struct lance_regs *ll = lp->ll;
  233. volatile struct lance_rx_desc *rd;
  234. unsigned char bits;
  235. int len = 0; /* XXX shut up gcc warnings */
  236. struct sk_buff *skb = 0; /* XXX shut up gcc warnings */
  237. #ifdef TEST_HITS
  238. printk ("[");
  239. for (i = 0; i < RX_RING_SIZE; i++) {
  240. if (i == lp->rx_new)
  241. printk ("%s",
  242. ib->brx_ring [i].rmd1_bits & LE_R1_OWN ? "_" : "X");
  243. else
  244. printk ("%s",
  245. ib->brx_ring [i].rmd1_bits & LE_R1_OWN ? "." : "1");
  246. }
  247. printk ("]");
  248. #endif
  249.     
  250. ll->rdp = LE_C0_RINT|LE_C0_INEA;
  251. for (rd = &ib->brx_ring [lp->rx_new];
  252.      !((bits = rd->rmd1_bits) & LE_R1_OWN);
  253.      rd = &ib->brx_ring [lp->rx_new]) {
  254. /* We got an incomplete frame? */
  255. if ((bits & LE_R1_POK) != LE_R1_POK) {
  256. lp->stats.rx_over_errors++;
  257. lp->stats.rx_errors++;
  258. continue;
  259. } else if (bits & LE_R1_ERR) {
  260. /* Count only the end frame as a rx error,
  261.  * not the beginning
  262.  */
  263. if (bits & LE_R1_BUF) lp->stats.rx_fifo_errors++;
  264. if (bits & LE_R1_CRC) lp->stats.rx_crc_errors++;
  265. if (bits & LE_R1_OFL) lp->stats.rx_over_errors++;
  266. if (bits & LE_R1_FRA) lp->stats.rx_frame_errors++;
  267. if (bits & LE_R1_EOP) lp->stats.rx_errors++;
  268. } else {
  269. len = (rd->mblength & 0xfff) - 4;
  270. skb = dev_alloc_skb (len+2);
  271. if (skb == 0) {
  272. printk ("%s: Memory squeeze, deferring packet.n",
  273. dev->name);
  274. lp->stats.rx_dropped++;
  275. rd->mblength = 0;
  276. rd->rmd1_bits = LE_R1_OWN;
  277. lp->rx_new = (lp->rx_new + 1) & lp->rx_ring_mod_mask;
  278. return 0;
  279. }
  280.     
  281. skb->dev = dev;
  282. skb_reserve (skb, 2); /* 16 byte align */
  283. skb_put (skb, len); /* make room */
  284. eth_copy_and_sum(skb,
  285.  (unsigned char *)&(ib->rx_buf [lp->rx_new][0]),
  286.  len, 0);
  287. skb->protocol = eth_type_trans (skb, dev);
  288. netif_rx (skb);
  289. dev->last_rx = jiffies;
  290. lp->stats.rx_packets++;
  291. lp->stats.rx_bytes += len;
  292. }
  293. /* Return the packet to the pool */
  294. rd->mblength = 0;
  295. rd->rmd1_bits = LE_R1_OWN;
  296. lp->rx_new = (lp->rx_new + 1) & lp->rx_ring_mod_mask;
  297. }
  298. return 0;
  299. }
  300. static int lance_tx (struct net_device *dev)
  301. {
  302. struct lance_private *lp = (struct lance_private *) dev->priv;
  303. volatile struct lance_init_block *ib = lp->init_block;
  304. volatile struct lance_regs *ll = lp->ll;
  305. volatile struct lance_tx_desc *td;
  306. int i, j;
  307. int status;
  308. /* csr0 is 2f3 */
  309. ll->rdp = LE_C0_TINT | LE_C0_INEA;
  310. /* csr0 is 73 */
  311. j = lp->tx_old;
  312. for (i = j; i != lp->tx_new; i = j) {
  313. td = &ib->btx_ring [i];
  314. /* If we hit a packet not owned by us, stop */
  315. if (td->tmd1_bits & LE_T1_OWN)
  316. break;
  317. if (td->tmd1_bits & LE_T1_ERR) {
  318. status = td->misc;
  319.     
  320. lp->stats.tx_errors++;
  321. if (status & LE_T3_RTY)  lp->stats.tx_aborted_errors++;
  322. if (status & LE_T3_LCOL) lp->stats.tx_window_errors++;
  323. if (status & LE_T3_CLOS) {
  324. lp->stats.tx_carrier_errors++;
  325. if (lp->auto_select) {
  326. lp->tpe = 1 - lp->tpe;
  327. printk("%s: Carrier Lost, trying %sn",
  328.        dev->name, lp->tpe?"TPE":"AUI");
  329. /* Stop the lance */
  330. ll->rap = LE_CSR0;
  331. ll->rdp = LE_C0_STOP;
  332. lance_init_ring (dev);
  333. load_csrs (lp);
  334. init_restart_lance (lp);
  335. return 0;
  336. }
  337. }
  338. /* buffer errors and underflows turn off the transmitter */
  339. /* Restart the adapter */
  340. if (status & (LE_T3_BUF|LE_T3_UFL)) {
  341. lp->stats.tx_fifo_errors++;
  342. printk ("%s: Tx: ERR_BUF|ERR_UFL, restartingn",
  343. dev->name);
  344. /* Stop the lance */
  345. ll->rap = LE_CSR0;
  346. ll->rdp = LE_C0_STOP;
  347. lance_init_ring (dev);
  348. load_csrs (lp);
  349. init_restart_lance (lp);
  350. return 0;
  351. }
  352. } else if ((td->tmd1_bits & LE_T1_POK) == LE_T1_POK) {
  353. /*
  354.  * So we don't count the packet more than once.
  355.  */
  356. td->tmd1_bits &= ~(LE_T1_POK);
  357. /* One collision before packet was sent. */
  358. if (td->tmd1_bits & LE_T1_EONE)
  359. lp->stats.collisions++;
  360. /* More than one collision, be optimistic. */
  361. if (td->tmd1_bits & LE_T1_EMORE)
  362. lp->stats.collisions += 2;
  363. lp->stats.tx_packets++;
  364. }
  365. j = (j + 1) & lp->tx_ring_mod_mask;
  366. }
  367. lp->tx_old = j;
  368. ll->rdp = LE_C0_TINT | LE_C0_INEA;
  369. return 0;
  370. }
  371. static void lance_interrupt (int irq, void *dev_id, struct pt_regs *regs)
  372. {
  373. struct net_device *dev;
  374. struct lance_private *lp;
  375. volatile struct lance_regs *ll;
  376. int csr0;
  377. dev = (struct net_device *) dev_id;
  378. lp = (struct lance_private *) dev->priv;
  379. ll = lp->ll;
  380. ll->rap = LE_CSR0; /* LANCE Controller Status */
  381. csr0 = ll->rdp;
  382. if (!(csr0 & LE_C0_INTR)) /* Check if any interrupt has */
  383. return; /* been generated by the Lance. */
  384. /* Acknowledge all the interrupt sources ASAP */
  385. ll->rdp = csr0 & ~(LE_C0_INEA|LE_C0_TDMD|LE_C0_STOP|LE_C0_STRT|
  386.    LE_C0_INIT);
  387. if ((csr0 & LE_C0_ERR)) {
  388. /* Clear the error condition */
  389. ll->rdp = LE_C0_BABL|LE_C0_ERR|LE_C0_MISS|LE_C0_INEA;
  390. }
  391.     
  392. if (csr0 & LE_C0_RINT)
  393. lance_rx (dev);
  394. if (csr0 & LE_C0_TINT)
  395. lance_tx (dev);
  396. /* Log misc errors. */
  397. if (csr0 & LE_C0_BABL)
  398. lp->stats.tx_errors++;       /* Tx babble. */
  399. if (csr0 & LE_C0_MISS)
  400. lp->stats.rx_errors++;       /* Missed a Rx frame. */
  401. if (csr0 & LE_C0_MERR) {
  402. printk("%s: Bus master arbitration failure, status %4.4x.n", dev->name, csr0);
  403. /* Restart the chip. */
  404. ll->rdp = LE_C0_STRT;
  405. }
  406. if (netif_queue_stopped(dev) && TX_BUFFS_AVAIL > 0)
  407. netif_wake_queue(dev);
  408. ll->rap = LE_CSR0;
  409. ll->rdp = LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_MERR|
  410. LE_C0_IDON|LE_C0_INEA;
  411. }
  412. struct net_device *last_dev = 0;
  413. static int lance_open (struct net_device *dev)
  414. {
  415. struct lance_private *lp = (struct lance_private *)dev->priv;
  416. volatile struct lance_regs *ll = lp->ll;
  417. int ret;
  418. last_dev = dev;
  419. /* Stop the Lance */
  420. ll->rap = LE_CSR0;
  421. ll->rdp = LE_C0_STOP;
  422. /* Install the Interrupt handler */
  423. ret = request_irq(IRQ_AMIGA_PORTS, lance_interrupt, SA_SHIRQ,
  424.   dev->name, dev);
  425. if (ret) return ret;
  426. load_csrs (lp);
  427. lance_init_ring (dev);
  428. netif_start_queue(dev);
  429. return init_restart_lance (lp);
  430. }
  431. static int lance_close (struct net_device *dev)
  432. {
  433. struct lance_private *lp = (struct lance_private *) dev->priv;
  434. volatile struct lance_regs *ll = lp->ll;
  435. netif_stop_queue(dev);
  436. del_timer_sync(&lp->multicast_timer);
  437. /* Stop the card */
  438. ll->rap = LE_CSR0;
  439. ll->rdp = LE_C0_STOP;
  440. free_irq(IRQ_AMIGA_PORTS, dev);
  441. return 0;
  442. }
  443. static inline int lance_reset (struct net_device *dev)
  444. {
  445. struct lance_private *lp = (struct lance_private *)dev->priv;
  446. volatile struct lance_regs *ll = lp->ll;
  447. int status;
  448.     
  449. /* Stop the lance */
  450. ll->rap = LE_CSR0;
  451. ll->rdp = LE_C0_STOP;
  452. load_csrs (lp);
  453. lance_init_ring (dev);
  454. dev->trans_start = jiffies;
  455. netif_start_queue(dev);
  456. status = init_restart_lance (lp);
  457. #ifdef DEBUG_DRIVER
  458. printk ("Lance restart=%dn", status);
  459. #endif
  460. return status;
  461. }
  462. static void lance_tx_timeout(struct net_device *dev)
  463. {
  464. struct lance_private *lp = (struct lance_private *) dev->priv;
  465. volatile struct lance_regs *ll = lp->ll;
  466. printk(KERN_ERR "%s: transmit timed out, status %04x, resetn",
  467.        dev->name, ll->rdp);
  468. lance_reset(dev);
  469. netif_wake_queue(dev);
  470. }
  471. static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
  472. {
  473. struct lance_private *lp = (struct lance_private *)dev->priv;
  474. volatile struct lance_regs *ll = lp->ll;
  475. volatile struct lance_init_block *ib = lp->init_block;
  476. int entry, skblen, len;
  477. int status = 0;
  478. static int outs;
  479. unsigned long flags;
  480. skblen = skb->len;
  481. save_flags(flags);
  482. cli();
  483. if (!TX_BUFFS_AVAIL){
  484. restore_flags(flags);
  485. return -1;
  486. }
  487. #ifdef DEBUG_DRIVER
  488. /* dump the packet */
  489. {
  490. int i;
  491. for (i = 0; i < 64; i++) {
  492. if ((i % 16) == 0)
  493. printk ("n");
  494. printk ("%2.2x ", skb->data [i]);
  495. }
  496. }
  497. #endif
  498. len = (skblen <= ETH_ZLEN) ? ETH_ZLEN : skblen;
  499. entry = lp->tx_new & lp->tx_ring_mod_mask;
  500. ib->btx_ring [entry].length = (-len) | 0xf000;
  501. ib->btx_ring [entry].misc = 0;
  502.     
  503. memcpy ((char *)&ib->tx_buf [entry][0], skb->data, skblen);
  504. /* Clear the slack of the packet, do I need this? */
  505. if (len != skblen)
  506. memset ((char *) &ib->tx_buf [entry][skblen], 0, len - skblen);
  507.     
  508. /* Now, give the packet to the lance */
  509. ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN);
  510. lp->tx_new = (lp->tx_new+1) & lp->tx_ring_mod_mask;
  511. outs++;
  512. if (TX_BUFFS_AVAIL <= 0)
  513. netif_stop_queue(dev);
  514. /* Kick the lance: transmit now */
  515. ll->rdp = LE_C0_INEA | LE_C0_TDMD;
  516. dev->trans_start = jiffies;
  517. dev_kfree_skb (skb);
  518.     
  519. restore_flags(flags);
  520. return status;
  521. }
  522. static struct net_device_stats *lance_get_stats (struct net_device *dev)
  523. {
  524. struct lance_private *lp = (struct lance_private *) dev->priv;
  525. return &lp->stats;
  526. }
  527. /* taken from the depca driver */
  528. static void lance_load_multicast (struct net_device *dev)
  529. {
  530. struct lance_private *lp = (struct lance_private *) dev->priv;
  531. volatile struct lance_init_block *ib = lp->init_block;
  532. volatile u16 *mcast_table = (u16 *)&ib->filter;
  533. struct dev_mc_list *dmi=dev->mc_list;
  534. char *addrs;
  535. int i;
  536. u32 crc;
  537. /* set all multicast bits */
  538. if (dev->flags & IFF_ALLMULTI){ 
  539. ib->filter [0] = 0xffffffff;
  540. ib->filter [1] = 0xffffffff;
  541. return;
  542. }
  543. /* clear the multicast filter */
  544. ib->filter [0] = 0;
  545. ib->filter [1] = 0;
  546. /* Add addresses */
  547. for (i = 0; i < dev->mc_count; i++){
  548. addrs = dmi->dmi_addr;
  549. dmi   = dmi->next;
  550. /* multicast address? */
  551. if (!(*addrs & 1))
  552. continue;
  553. crc = ether_crc_le(6, addrs);
  554. crc = crc >> 26;
  555. mcast_table [crc >> 4] |= 1 << (crc & 0xf);
  556. }
  557. return;
  558. }
  559. static void lance_set_multicast (struct net_device *dev)
  560. {
  561. struct lance_private *lp = (struct lance_private *) dev->priv;
  562. volatile struct lance_init_block *ib = lp->init_block;
  563. volatile struct lance_regs *ll = lp->ll;
  564. if (!netif_running(dev))
  565. return;
  566. if (lp->tx_old != lp->tx_new) {
  567. mod_timer(&lp->multicast_timer, jiffies + 4);
  568. netif_wake_queue(dev);
  569. return;
  570. }
  571. netif_stop_queue(dev);
  572. ll->rap = LE_CSR0;
  573. ll->rdp = LE_C0_STOP;
  574. lance_init_ring (dev);
  575. if (dev->flags & IFF_PROMISC) {
  576. ib->mode |= LE_MO_PROM;
  577. } else {
  578. ib->mode &= ~LE_MO_PROM;
  579. lance_load_multicast (dev);
  580. }
  581. load_csrs (lp);
  582. init_restart_lance (lp);
  583. netif_wake_queue(dev);
  584. }
  585. static int __init a2065_probe(void)
  586. {
  587. struct zorro_dev *z = NULL;
  588. struct net_device *dev;
  589. struct lance_private *priv;
  590. int res = -ENODEV;
  591. while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
  592. unsigned long board, base_addr, mem_start;
  593. struct resource *r1, *r2;
  594. int is_cbm;
  595. if (z->id == ZORRO_PROD_CBM_A2065_1 ||
  596.     z->id == ZORRO_PROD_CBM_A2065_2)
  597. is_cbm = 1;
  598. else if (z->id == ZORRO_PROD_AMERISTAR_A2065)
  599. is_cbm = 0;
  600. else
  601. continue;
  602. board = z->resource.start;
  603. base_addr = board+A2065_LANCE;
  604. mem_start = board+A2065_RAM;
  605. r1 = request_mem_region(base_addr, sizeof(struct lance_regs),
  606. "Am7990");
  607. if (!r1) continue;
  608. r2 = request_mem_region(mem_start, A2065_RAM_SIZE, "RAM");
  609. if (!r2) {
  610. release_resource(r1);
  611. continue;
  612. }
  613. dev = init_etherdev(NULL, sizeof(struct lance_private));
  614. if (dev == NULL) {
  615. release_resource(r1);
  616. release_resource(r2);
  617. return -ENOMEM;
  618. }
  619. SET_MODULE_OWNER(dev);
  620. priv = dev->priv;
  621. r1->name = dev->name;
  622. r2->name = dev->name;
  623. priv->dev = dev;
  624. dev->dev_addr[0] = 0x00;
  625. if (is_cbm) { /* Commodore */
  626. dev->dev_addr[1] = 0x80;
  627. dev->dev_addr[2] = 0x10;
  628. } else { /* Ameristar */
  629. dev->dev_addr[1] = 0x00;
  630. dev->dev_addr[2] = 0x9f;
  631. }
  632. dev->dev_addr[3] = (z->rom.er_SerialNumber>>16) & 0xff;
  633. dev->dev_addr[4] = (z->rom.er_SerialNumber>>8) & 0xff;
  634. dev->dev_addr[5] = z->rom.er_SerialNumber & 0xff;
  635. printk("%s: A2065 at 0x%08lx, Ethernet Address "
  636.        "%02x:%02x:%02x:%02x:%02x:%02xn", dev->name, board,
  637.        dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
  638.        dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
  639. dev->base_addr = ZTWO_VADDR(base_addr);
  640. dev->mem_start = ZTWO_VADDR(mem_start);
  641. dev->mem_end = dev->mem_start+A2065_RAM_SIZE;
  642. priv->ll = (volatile struct lance_regs *)dev->base_addr;
  643. priv->init_block = (struct lance_init_block *)dev->mem_start;
  644. priv->lance_init_block = (struct lance_init_block *)A2065_RAM;
  645. priv->auto_select = 0;
  646. priv->busmaster_regval = LE_C3_BSWP;
  647. priv->lance_log_rx_bufs = LANCE_LOG_RX_BUFFERS;
  648. priv->lance_log_tx_bufs = LANCE_LOG_TX_BUFFERS;
  649. priv->rx_ring_mod_mask = RX_RING_MOD_MASK;
  650. priv->tx_ring_mod_mask = TX_RING_MOD_MASK;
  651. dev->open = &lance_open;
  652. dev->stop = &lance_close;
  653. dev->hard_start_xmit = &lance_start_xmit;
  654. dev->tx_timeout = &lance_tx_timeout;
  655. dev->watchdog_timeo = 5*HZ;
  656. dev->get_stats = &lance_get_stats;
  657. dev->set_multicast_list = &lance_set_multicast;
  658. dev->dma = 0;
  659. #ifdef MODULE
  660. priv->next_module = root_a2065_dev;
  661. root_a2065_dev = priv;
  662. #endif
  663. ether_setup(dev);
  664. init_timer(&priv->multicast_timer);
  665. priv->multicast_timer.data = (unsigned long) dev;
  666. priv->multicast_timer.function =
  667. (void (*)(unsigned long)) &lance_set_multicast;
  668. res = 0;
  669. }
  670. return res;
  671. }
  672. static void __exit a2065_cleanup(void)
  673. {
  674. #ifdef MODULE
  675. struct lance_private *next;
  676. struct net_device *dev;
  677. while (root_a2065_dev) {
  678. next = root_a2065_dev->next_module;
  679. dev = root_a2065_dev->dev;
  680. unregister_netdev(dev);
  681. release_mem_region(ZTWO_PADDR(dev->base_addr),
  682.    sizeof(struct lance_regs));
  683. release_mem_region(ZTWO_PADDR(dev->mem_start), A2065_RAM_SIZE);
  684. kfree(dev);
  685. root_a2065_dev = next;
  686. }
  687. #endif
  688. }
  689. module_init(a2065_probe);
  690. module_exit(a2065_cleanup);
  691. MODULE_LICENSE("GPL");