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

嵌入式Linux

开发平台:

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