sonic.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. /*
  2. * sonic.c
  3. *
  4. * (C) 2005 Finn Thain
  5. *
  6. * Converted to DMA API, added zero-copy buffer handling, and
  7. * (from the mac68k project) introduced dhd's support for 16-bit cards.
  8. *
  9. * (C) 1996,1998 by Thomas Bogendoerfer (tsbogend@alpha.franken.de)
  10. *
  11. * This driver is based on work from Andreas Busse, but most of
  12. * the code is rewritten.
  13. *
  14. * (C) 1995 by Andreas Busse (andy@waldorf-gmbh.de)
  15. *
  16. * Core code included by system sonic drivers
  17. *
  18. * And... partially rewritten again by David Huggins-Daines in order
  19. * to cope with screwed up Macintosh NICs that may or may not use
  20. * 16-bit DMA.
  21. *
  22. * (C) 1999 David Huggins-Daines <dhd@debian.org>
  23. *
  24. */
  25. /*
  26. * Sources: Olivetti M700-10 Risc Personal Computer hardware handbook,
  27. * National Semiconductors data sheet for the DP83932B Sonic Ethernet
  28. * controller, and the files "8390.c" and "skeleton.c" in this directory.
  29. *
  30. * Additional sources: Nat Semi data sheet for the DP83932C and Nat Semi
  31. * Application Note AN-746, the files "lance.c" and "ibmlana.c". See also
  32. * the NetBSD file "sys/arch/mac68k/dev/if_sn.c".
  33. */
  34. static unsigned int version_printed;
  35. static int sonic_debug = -1;
  36. module_param(sonic_debug, int, 0);
  37. MODULE_PARM_DESC(sonic_debug, "debug message level");
  38. static void sonic_msg_init(struct net_device *dev)
  39. {
  40. struct sonic_local *lp = netdev_priv(dev);
  41. lp->msg_enable = netif_msg_init(sonic_debug, 0);
  42. if (version_printed++ == 0)
  43. netif_dbg(lp, drv, dev, "%s", version);
  44. }
  45. /*
  46. * Open/initialize the SONIC controller.
  47. *
  48. * This routine should set everything up anew at each open, even
  49. * registers that "should" only need to be set once at boot, so that
  50. * there is non-reboot way to recover if something goes wrong.
  51. */
  52. static int sonic_open(struct net_device *dev)
  53. {
  54. struct sonic_local *lp = netdev_priv(dev);
  55. int i;
  56. netif_dbg(lp, ifup, dev, "%s: initializing sonic driver\n", __func__);
  57. spin_lock_init(&lp->lock);
  58. for (i = 0; i < SONIC_NUM_RRS; i++) {
  59. struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
  60. if (skb == NULL) {
  61. while(i > 0) { /* free any that were allocated successfully */
  62. i--;
  63. dev_kfree_skb(lp->rx_skb[i]);
  64. lp->rx_skb[i] = NULL;
  65. }
  66. printk(KERN_ERR "%s: couldn't allocate receive buffers\n",
  67. dev->name);
  68. return -ENOMEM;
  69. }
  70. /* align IP header unless DMA requires otherwise */
  71. if (SONIC_BUS_SCALE(lp->dma_bitmode) == 2)
  72. skb_reserve(skb, 2);
  73. lp->rx_skb[i] = skb;
  74. }
  75. for (i = 0; i < SONIC_NUM_RRS; i++) {
  76. dma_addr_t laddr = dma_map_single(lp->device, skb_put(lp->rx_skb[i], SONIC_RBSIZE),
  77. SONIC_RBSIZE, DMA_FROM_DEVICE);
  78. if (dma_mapping_error(lp->device, laddr)) {
  79. while(i > 0) { /* free any that were mapped successfully */
  80. i--;
  81. dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE);
  82. lp->rx_laddr[i] = (dma_addr_t)0;
  83. }
  84. for (i = 0; i < SONIC_NUM_RRS; i++) {
  85. dev_kfree_skb(lp->rx_skb[i]);
  86. lp->rx_skb[i] = NULL;
  87. }
  88. printk(KERN_ERR "%s: couldn't map rx DMA buffers\n",
  89. dev->name);
  90. return -ENOMEM;
  91. }
  92. lp->rx_laddr[i] = laddr;
  93. }
  94. /*
  95. * Initialize the SONIC
  96. */
  97. sonic_init(dev);
  98. netif_start_queue(dev);
  99. netif_dbg(lp, ifup, dev, "%s: Initialization done\n", __func__);
  100. return 0;
  101. }
  102. /* Wait for the SONIC to become idle. */
  103. static void sonic_quiesce(struct net_device *dev, u16 mask)
  104. {
  105. struct sonic_local * __maybe_unused lp = netdev_priv(dev);
  106. int i;
  107. u16 bits;
  108. for (i = 0; i < 1000; ++i) {
  109. bits = SONIC_READ(SONIC_CMD) & mask;
  110. if (!bits)
  111. return;
  112. if (irqs_disabled() || in_interrupt())
  113. udelay(20);
  114. else
  115. usleep_range(100, 200);
  116. }
  117. WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits);
  118. }
  119. /*
  120. * Close the SONIC device
  121. */
  122. static int sonic_close(struct net_device *dev)
  123. {
  124. struct sonic_local *lp = netdev_priv(dev);
  125. int i;
  126. netif_dbg(lp, ifdown, dev, "%s\n", __func__);
  127. netif_stop_queue(dev);
  128. /*
  129. * stop the SONIC, disable interrupts
  130. */
  131. SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
  132. sonic_quiesce(dev, SONIC_CR_ALL);
  133. SONIC_WRITE(SONIC_IMR, 0);
  134. SONIC_WRITE(SONIC_ISR, 0x7fff);
  135. SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
  136. /* unmap and free skbs that haven't been transmitted */
  137. for (i = 0; i < SONIC_NUM_TDS; i++) {
  138. if(lp->tx_laddr[i]) {
  139. dma_unmap_single(lp->device, lp->tx_laddr[i], lp->tx_len[i], DMA_TO_DEVICE);
  140. lp->tx_laddr[i] = (dma_addr_t)0;
  141. }
  142. if(lp->tx_skb[i]) {
  143. dev_kfree_skb(lp->tx_skb[i]);
  144. lp->tx_skb[i] = NULL;
  145. }
  146. }
  147. /* unmap and free the receive buffers */
  148. for (i = 0; i < SONIC_NUM_RRS; i++) {
  149. if(lp->rx_laddr[i]) {
  150. dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE);
  151. lp->rx_laddr[i] = (dma_addr_t)0;
  152. }
  153. if(lp->rx_skb[i]) {
  154. dev_kfree_skb(lp->rx_skb[i]);
  155. lp->rx_skb[i] = NULL;
  156. }
  157. }
  158. return 0;
  159. }
  160. static void sonic_tx_timeout(struct net_device *dev)
  161. {
  162. struct sonic_local *lp = netdev_priv(dev);
  163. int i;
  164. /*
  165. * put the Sonic into software-reset mode and
  166. * disable all interrupts before releasing DMA buffers
  167. */
  168. SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
  169. sonic_quiesce(dev, SONIC_CR_ALL);
  170. SONIC_WRITE(SONIC_IMR, 0);
  171. SONIC_WRITE(SONIC_ISR, 0x7fff);
  172. SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
  173. /* We could resend the original skbs. Easier to re-initialise. */
  174. for (i = 0; i < SONIC_NUM_TDS; i++) {
  175. if(lp->tx_laddr[i]) {
  176. dma_unmap_single(lp->device, lp->tx_laddr[i], lp->tx_len[i], DMA_TO_DEVICE);
  177. lp->tx_laddr[i] = (dma_addr_t)0;
  178. }
  179. if(lp->tx_skb[i]) {
  180. dev_kfree_skb(lp->tx_skb[i]);
  181. lp->tx_skb[i] = NULL;
  182. }
  183. }
  184. /* Try to restart the adaptor. */
  185. sonic_init(dev);
  186. lp->stats.tx_errors++;
  187. netif_trans_update(dev); /* prevent tx timeout */
  188. netif_wake_queue(dev);
  189. }
  190. /*
  191. * transmit packet
  192. *
  193. * Appends new TD during transmission thus avoiding any TX interrupts
  194. * until we run out of TDs.
  195. * This routine interacts closely with the ISR in that it may,
  196. * set tx_skb[i]
  197. * reset the status flags of the new TD
  198. * set and reset EOL flags
  199. * stop the tx queue
  200. * The ISR interacts with this routine in various ways. It may,
  201. * reset tx_skb[i]
  202. * test the EOL and status flags of the TDs
  203. * wake the tx queue
  204. * Concurrently with all of this, the SONIC is potentially writing to
  205. * the status flags of the TDs.
  206. */
  207. static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
  208. {
  209. struct sonic_local *lp = netdev_priv(dev);
  210. dma_addr_t laddr;
  211. int length;
  212. int entry;
  213. unsigned long flags;
  214. netif_dbg(lp, tx_queued, dev, "%s: skb=%p\n", __func__, skb);
  215. length = skb->len;
  216. if (length < ETH_ZLEN) {
  217. if (skb_padto(skb, ETH_ZLEN))
  218. return NETDEV_TX_OK;
  219. length = ETH_ZLEN;
  220. }
  221. /*
  222. * Map the packet data into the logical DMA address space
  223. */
  224. laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE);
  225. if (!laddr) {
  226. pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name);
  227. dev_kfree_skb_any(skb);
  228. return NETDEV_TX_OK;
  229. }
  230. spin_lock_irqsave(&lp->lock, flags);
  231. entry = lp->next_tx;
  232. sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */
  233. sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */
  234. sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */
  235. sonic_tda_put(dev, entry, SONIC_TD_FRAG_PTR_L, laddr & 0xffff);
  236. sonic_tda_put(dev, entry, SONIC_TD_FRAG_PTR_H, laddr >> 16);
  237. sonic_tda_put(dev, entry, SONIC_TD_FRAG_SIZE, length);
  238. sonic_tda_put(dev, entry, SONIC_TD_LINK,
  239. sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL);
  240. wmb();
  241. lp->tx_len[entry] = length;
  242. lp->tx_laddr[entry] = laddr;
  243. lp->tx_skb[entry] = skb;
  244. wmb();
  245. sonic_tda_put(dev, lp->eol_tx, SONIC_TD_LINK,
  246. sonic_tda_get(dev, lp->eol_tx, SONIC_TD_LINK) & ~SONIC_EOL);
  247. lp->eol_tx = entry;
  248. lp->next_tx = (entry + 1) & SONIC_TDS_MASK;
  249. if (lp->tx_skb[lp->next_tx] != NULL) {
  250. /* The ring is full, the ISR has yet to process the next TD. */
  251. netif_dbg(lp, tx_queued, dev, "%s: stopping queue\n", __func__);
  252. netif_stop_queue(dev);
  253. /* after this packet, wait for ISR to free up some TDAs */
  254. } else netif_start_queue(dev);
  255. netif_dbg(lp, tx_queued, dev, "%s: issuing Tx command\n", __func__);
  256. SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP);
  257. spin_unlock_irqrestore(&lp->lock, flags);
  258. return NETDEV_TX_OK;
  259. }
  260. /*
  261. * The typical workload of the driver:
  262. * Handle the network interface interrupts.
  263. */
  264. static irqreturn_t sonic_interrupt(int irq, void *dev_id)
  265. {
  266. struct net_device *dev = dev_id;
  267. struct sonic_local *lp = netdev_priv(dev);
  268. int status;
  269. unsigned long flags;
  270. /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt()
  271. * with sonic_send_packet() so that the two functions can share state.
  272. * Secondly, it makes sonic_interrupt() re-entrant, as that is required
  273. * by macsonic which must use two IRQs with different priority levels.
  274. */
  275. spin_lock_irqsave(&lp->lock, flags);
  276. status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
  277. if (!status) {
  278. spin_unlock_irqrestore(&lp->lock, flags);
  279. return IRQ_NONE;
  280. }
  281. do {
  282. SONIC_WRITE(SONIC_ISR, status); /* clear the interrupt(s) */
  283. if (status & SONIC_INT_PKTRX) {
  284. netif_dbg(lp, intr, dev, "%s: packet rx\n", __func__);
  285. sonic_rx(dev); /* got packet(s) */
  286. }
  287. if (status & SONIC_INT_TXDN) {
  288. int entry = lp->cur_tx;
  289. int td_status;
  290. int freed_some = 0;
  291. /* The state of a Transmit Descriptor may be inferred
  292. * from { tx_skb[entry], td_status } as follows.
  293. * { clear, clear } => the TD has never been used
  294. * { set, clear } => the TD was handed to SONIC
  295. * { set, set } => the TD was handed back
  296. * { clear, set } => the TD is available for re-use
  297. */
  298. netif_dbg(lp, intr, dev, "%s: tx done\n", __func__);
  299. while (lp->tx_skb[entry] != NULL) {
  300. if ((td_status = sonic_tda_get(dev, entry, SONIC_TD_STATUS)) == 0)
  301. break;
  302. if (td_status & SONIC_TCR_PTX) {
  303. lp->stats.tx_packets++;
  304. lp->stats.tx_bytes += sonic_tda_get(dev, entry, SONIC_TD_PKTSIZE);
  305. } else {
  306. if (td_status & (SONIC_TCR_EXD |
  307. SONIC_TCR_EXC | SONIC_TCR_BCM))
  308. lp->stats.tx_aborted_errors++;
  309. if (td_status &
  310. (SONIC_TCR_NCRS | SONIC_TCR_CRLS))
  311. lp->stats.tx_carrier_errors++;
  312. if (td_status & SONIC_TCR_OWC)
  313. lp->stats.tx_window_errors++;
  314. if (td_status & SONIC_TCR_FU)
  315. lp->stats.tx_fifo_errors++;
  316. }
  317. /* We must free the original skb */
  318. dev_kfree_skb_irq(lp->tx_skb[entry]);
  319. lp->tx_skb[entry] = NULL;
  320. /* and unmap DMA buffer */
  321. dma_unmap_single(lp->device, lp->tx_laddr[entry], lp->tx_len[entry], DMA_TO_DEVICE);
  322. lp->tx_laddr[entry] = (dma_addr_t)0;
  323. freed_some = 1;
  324. if (sonic_tda_get(dev, entry, SONIC_TD_LINK) & SONIC_EOL) {
  325. entry = (entry + 1) & SONIC_TDS_MASK;
  326. break;
  327. }
  328. entry = (entry + 1) & SONIC_TDS_MASK;
  329. }
  330. if (freed_some || lp->tx_skb[entry] == NULL)
  331. netif_wake_queue(dev); /* The ring is no longer full */
  332. lp->cur_tx = entry;
  333. }
  334. /*
  335. * check error conditions
  336. */
  337. if (status & SONIC_INT_RFO) {
  338. netif_dbg(lp, rx_err, dev, "%s: rx fifo overrun\n",
  339. __func__);
  340. }
  341. if (status & SONIC_INT_RDE) {
  342. netif_dbg(lp, rx_err, dev, "%s: rx descriptors exhausted\n",
  343. __func__);
  344. }
  345. if (status & SONIC_INT_RBAE) {
  346. netif_dbg(lp, rx_err, dev, "%s: rx buffer area exceeded\n",
  347. __func__);
  348. }
  349. /* counter overruns; all counters are 16bit wide */
  350. if (status & SONIC_INT_FAE)
  351. lp->stats.rx_frame_errors += 65536;
  352. if (status & SONIC_INT_CRC)
  353. lp->stats.rx_crc_errors += 65536;
  354. if (status & SONIC_INT_MP)
  355. lp->stats.rx_missed_errors += 65536;
  356. /* transmit error */
  357. if (status & SONIC_INT_TXER) {
  358. u16 tcr = SONIC_READ(SONIC_TCR);
  359. netif_dbg(lp, tx_err, dev, "%s: TXER intr, TCR %04x\n",
  360. __func__, tcr);
  361. if (tcr & (SONIC_TCR_EXD | SONIC_TCR_EXC |
  362. SONIC_TCR_FU | SONIC_TCR_BCM)) {
  363. /* Aborted transmission. Try again. */
  364. netif_stop_queue(dev);
  365. SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP);
  366. }
  367. }
  368. /* bus retry */
  369. if (status & SONIC_INT_BR) {
  370. printk(KERN_ERR "%s: Bus retry occurred! Device interrupt disabled.\n",
  371. dev->name);
  372. /* ... to help debug DMA problems causing endless interrupts. */
  373. /* Bounce the eth interface to turn on the interrupt again. */
  374. SONIC_WRITE(SONIC_IMR, 0);
  375. }
  376. status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
  377. } while (status);
  378. spin_unlock_irqrestore(&lp->lock, flags);
  379. return IRQ_HANDLED;
  380. }
  381. /* Return the array index corresponding to a given Receive Buffer pointer. */
  382. static int index_from_addr(struct sonic_local *lp, dma_addr_t addr,
  383. unsigned int last)
  384. {
  385. unsigned int i = last;
  386. do {
  387. i = (i + 1) & SONIC_RRS_MASK;
  388. if (addr == lp->rx_laddr[i])
  389. return i;
  390. } while (i != last);
  391. return -ENOENT;
  392. }
  393. /* Allocate and map a new skb to be used as a receive buffer. */
  394. static bool sonic_alloc_rb(struct net_device *dev, struct sonic_local *lp,
  395. struct sk_buff **new_skb, dma_addr_t *new_addr)
  396. {
  397. *new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
  398. if (!*new_skb)
  399. return false;
  400. if (SONIC_BUS_SCALE(lp->dma_bitmode) == 2)
  401. skb_reserve(*new_skb, 2);
  402. *new_addr = dma_map_single(lp->device, skb_put(*new_skb, SONIC_RBSIZE),
  403. SONIC_RBSIZE, DMA_FROM_DEVICE);
  404. if (!*new_addr) {
  405. dev_kfree_skb(*new_skb);
  406. *new_skb = NULL;
  407. return false;
  408. }
  409. return true;
  410. }
  411. /* Place a new receive resource in the Receive Resource Area and update RWP. */
  412. static void sonic_update_rra(struct net_device *dev, struct sonic_local *lp,
  413. dma_addr_t old_addr, dma_addr_t new_addr)
  414. {
  415. unsigned int entry = sonic_rr_entry(dev, SONIC_READ(SONIC_RWP));
  416. unsigned int end = sonic_rr_entry(dev, SONIC_READ(SONIC_RRP));
  417. u32 buf;
  418. /* The resources in the range [RRP, RWP) belong to the SONIC. This loop
  419. * scans the other resources in the RRA, those in the range [RWP, RRP).
  420. */
  421. do {
  422. buf = (sonic_rra_get(dev, entry, SONIC_RR_BUFADR_H) << 16) |
  423. sonic_rra_get(dev, entry, SONIC_RR_BUFADR_L);
  424. if (buf == old_addr)
  425. break;
  426. entry = (entry + 1) & SONIC_RRS_MASK;
  427. } while (entry != end);
  428. WARN_ONCE(buf != old_addr, "failed to find resource!\n");
  429. sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, new_addr >> 16);
  430. sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, new_addr & 0xffff);
  431. entry = (entry + 1) & SONIC_RRS_MASK;
  432. SONIC_WRITE(SONIC_RWP, sonic_rr_addr(dev, entry));
  433. }
  434. /*
  435. * We have a good packet(s), pass it/them up the network stack.
  436. */
  437. static void sonic_rx(struct net_device *dev)
  438. {
  439. struct sonic_local *lp = netdev_priv(dev);
  440. int entry = lp->cur_rx;
  441. int prev_entry = lp->eol_rx;
  442. bool rbe = false;
  443. while (sonic_rda_get(dev, entry, SONIC_RD_IN_USE) == 0) {
  444. u16 status = sonic_rda_get(dev, entry, SONIC_RD_STATUS);
  445. /* If the RD has LPKT set, the chip has finished with the RB */
  446. if ((status & SONIC_RCR_PRX) && (status & SONIC_RCR_LPKT)) {
  447. struct sk_buff *new_skb;
  448. dma_addr_t new_laddr;
  449. u32 addr = (sonic_rda_get(dev, entry,
  450. SONIC_RD_PKTPTR_H) << 16) |
  451. sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L);
  452. int i = index_from_addr(lp, addr, entry);
  453. if (i < 0) {
  454. WARN_ONCE(1, "failed to find buffer!\n");
  455. break;
  456. }
  457. if (sonic_alloc_rb(dev, lp, &new_skb, &new_laddr)) {
  458. struct sk_buff *used_skb = lp->rx_skb[i];
  459. int pkt_len;
  460. /* Pass the used buffer up the stack */
  461. dma_unmap_single(lp->device, addr, SONIC_RBSIZE,
  462. DMA_FROM_DEVICE);
  463. pkt_len = sonic_rda_get(dev, entry,
  464. SONIC_RD_PKTLEN);
  465. skb_trim(used_skb, pkt_len);
  466. used_skb->protocol = eth_type_trans(used_skb,
  467. dev);
  468. netif_rx(used_skb);
  469. lp->stats.rx_packets++;
  470. lp->stats.rx_bytes += pkt_len;
  471. lp->rx_skb[i] = new_skb;
  472. lp->rx_laddr[i] = new_laddr;
  473. } else {
  474. /* Failed to obtain a new buffer so re-use it */
  475. new_laddr = addr;
  476. lp->stats.rx_dropped++;
  477. }
  478. /* If RBE is already asserted when RWP advances then
  479. * it's safe to clear RBE after processing this packet.
  480. */
  481. rbe = rbe || SONIC_READ(SONIC_ISR) & SONIC_INT_RBE;
  482. sonic_update_rra(dev, lp, addr, new_laddr);
  483. }
  484. /*
  485. * give back the descriptor
  486. */
  487. sonic_rda_put(dev, entry, SONIC_RD_STATUS, 0);
  488. sonic_rda_put(dev, entry, SONIC_RD_IN_USE, 1);
  489. prev_entry = entry;
  490. entry = (entry + 1) & SONIC_RDS_MASK;
  491. }
  492. lp->cur_rx = entry;
  493. if (prev_entry != lp->eol_rx) {
  494. /* Advance the EOL flag to put descriptors back into service */
  495. sonic_rda_put(dev, prev_entry, SONIC_RD_LINK, SONIC_EOL |
  496. sonic_rda_get(dev, prev_entry, SONIC_RD_LINK));
  497. sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, ~SONIC_EOL &
  498. sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK));
  499. lp->eol_rx = prev_entry;
  500. }
  501. if (rbe)
  502. SONIC_WRITE(SONIC_ISR, SONIC_INT_RBE);
  503. /*
  504. * If any worth-while packets have been received, netif_rx()
  505. * has done a mark_bh(NET_BH) for us and will work on them
  506. * when we get to the bottom-half routine.
  507. */
  508. }
  509. /*
  510. * Get the current statistics.
  511. * This may be called with the device open or closed.
  512. */
  513. static struct net_device_stats *sonic_get_stats(struct net_device *dev)
  514. {
  515. struct sonic_local *lp = netdev_priv(dev);
  516. /* read the tally counter from the SONIC and reset them */
  517. lp->stats.rx_crc_errors += SONIC_READ(SONIC_CRCT);
  518. SONIC_WRITE(SONIC_CRCT, 0xffff);
  519. lp->stats.rx_frame_errors += SONIC_READ(SONIC_FAET);
  520. SONIC_WRITE(SONIC_FAET, 0xffff);
  521. lp->stats.rx_missed_errors += SONIC_READ(SONIC_MPT);
  522. SONIC_WRITE(SONIC_MPT, 0xffff);
  523. return &lp->stats;
  524. }
  525. /*
  526. * Set or clear the multicast filter for this adaptor.
  527. */
  528. static void sonic_multicast_list(struct net_device *dev)
  529. {
  530. struct sonic_local *lp = netdev_priv(dev);
  531. unsigned int rcr;
  532. struct netdev_hw_addr *ha;
  533. unsigned char *addr;
  534. int i;
  535. rcr = SONIC_READ(SONIC_RCR) & ~(SONIC_RCR_PRO | SONIC_RCR_AMC);
  536. rcr |= SONIC_RCR_BRD; /* accept broadcast packets */
  537. if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
  538. rcr |= SONIC_RCR_PRO;
  539. } else {
  540. if ((dev->flags & IFF_ALLMULTI) ||
  541. (netdev_mc_count(dev) > 15)) {
  542. rcr |= SONIC_RCR_AMC;
  543. } else {
  544. unsigned long flags;
  545. netif_dbg(lp, ifup, dev, "%s: mc_count %d\n", __func__,
  546. netdev_mc_count(dev));
  547. sonic_set_cam_enable(dev, 1); /* always enable our own address */
  548. i = 1;
  549. netdev_for_each_mc_addr(ha, dev) {
  550. addr = ha->addr;
  551. sonic_cda_put(dev, i, SONIC_CD_CAP0, addr[1] << 8 | addr[0]);
  552. sonic_cda_put(dev, i, SONIC_CD_CAP1, addr[3] << 8 | addr[2]);
  553. sonic_cda_put(dev, i, SONIC_CD_CAP2, addr[5] << 8 | addr[4]);
  554. sonic_set_cam_enable(dev, sonic_get_cam_enable(dev) | (1 << i));
  555. i++;
  556. }
  557. SONIC_WRITE(SONIC_CDC, 16);
  558. SONIC_WRITE(SONIC_CDP, lp->cda_laddr & 0xffff);
  559. /* LCAM and TXP commands can't be used simultaneously */
  560. spin_lock_irqsave(&lp->lock, flags);
  561. sonic_quiesce(dev, SONIC_CR_TXP);
  562. SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM);
  563. sonic_quiesce(dev, SONIC_CR_LCAM);
  564. spin_unlock_irqrestore(&lp->lock, flags);
  565. }
  566. }
  567. netif_dbg(lp, ifup, dev, "%s: setting RCR=%x\n", __func__, rcr);
  568. SONIC_WRITE(SONIC_RCR, rcr);
  569. }
  570. /*
  571. * Initialize the SONIC ethernet controller.
  572. */
  573. static int sonic_init(struct net_device *dev)
  574. {
  575. struct sonic_local *lp = netdev_priv(dev);
  576. int i;
  577. /*
  578. * put the Sonic into software-reset mode and
  579. * disable all interrupts
  580. */
  581. SONIC_WRITE(SONIC_IMR, 0);
  582. SONIC_WRITE(SONIC_ISR, 0x7fff);
  583. SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
  584. /* While in reset mode, clear CAM Enable register */
  585. SONIC_WRITE(SONIC_CE, 0);
  586. /*
  587. * clear software reset flag, disable receiver, clear and
  588. * enable interrupts, then completely initialize the SONIC
  589. */
  590. SONIC_WRITE(SONIC_CMD, 0);
  591. SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS | SONIC_CR_STP);
  592. sonic_quiesce(dev, SONIC_CR_ALL);
  593. /*
  594. * initialize the receive resource area
  595. */
  596. netif_dbg(lp, ifup, dev, "%s: initialize receive resource area\n",
  597. __func__);
  598. for (i = 0; i < SONIC_NUM_RRS; i++) {
  599. u16 bufadr_l = (unsigned long)lp->rx_laddr[i] & 0xffff;
  600. u16 bufadr_h = (unsigned long)lp->rx_laddr[i] >> 16;
  601. sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l);
  602. sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h);
  603. sonic_rra_put(dev, i, SONIC_RR_BUFSIZE_L, SONIC_RBSIZE >> 1);
  604. sonic_rra_put(dev, i, SONIC_RR_BUFSIZE_H, 0);
  605. }
  606. /* initialize all RRA registers */
  607. SONIC_WRITE(SONIC_RSA, sonic_rr_addr(dev, 0));
  608. SONIC_WRITE(SONIC_REA, sonic_rr_addr(dev, SONIC_NUM_RRS));
  609. SONIC_WRITE(SONIC_RRP, sonic_rr_addr(dev, 0));
  610. SONIC_WRITE(SONIC_RWP, sonic_rr_addr(dev, SONIC_NUM_RRS - 1));
  611. SONIC_WRITE(SONIC_URRA, lp->rra_laddr >> 16);
  612. SONIC_WRITE(SONIC_EOBC, (SONIC_RBSIZE >> 1) - (lp->dma_bitmode ? 2 : 1));
  613. /* load the resource pointers */
  614. netif_dbg(lp, ifup, dev, "%s: issuing RRRA command\n", __func__);
  615. SONIC_WRITE(SONIC_CMD, SONIC_CR_RRRA);
  616. sonic_quiesce(dev, SONIC_CR_RRRA);
  617. /*
  618. * Initialize the receive descriptors so that they
  619. * become a circular linked list, ie. let the last
  620. * descriptor point to the first again.
  621. */
  622. netif_dbg(lp, ifup, dev, "%s: initialize receive descriptors\n",
  623. __func__);
  624. for (i=0; i<SONIC_NUM_RDS; i++) {
  625. sonic_rda_put(dev, i, SONIC_RD_STATUS, 0);
  626. sonic_rda_put(dev, i, SONIC_RD_PKTLEN, 0);
  627. sonic_rda_put(dev, i, SONIC_RD_PKTPTR_L, 0);
  628. sonic_rda_put(dev, i, SONIC_RD_PKTPTR_H, 0);
  629. sonic_rda_put(dev, i, SONIC_RD_SEQNO, 0);
  630. sonic_rda_put(dev, i, SONIC_RD_IN_USE, 1);
  631. sonic_rda_put(dev, i, SONIC_RD_LINK,
  632. lp->rda_laddr +
  633. ((i+1) * SIZEOF_SONIC_RD * SONIC_BUS_SCALE(lp->dma_bitmode)));
  634. }
  635. /* fix last descriptor */
  636. sonic_rda_put(dev, SONIC_NUM_RDS - 1, SONIC_RD_LINK,
  637. (lp->rda_laddr & 0xffff) | SONIC_EOL);
  638. lp->eol_rx = SONIC_NUM_RDS - 1;
  639. lp->cur_rx = 0;
  640. SONIC_WRITE(SONIC_URDA, lp->rda_laddr >> 16);
  641. SONIC_WRITE(SONIC_CRDA, lp->rda_laddr & 0xffff);
  642. /*
  643. * initialize transmit descriptors
  644. */
  645. netif_dbg(lp, ifup, dev, "%s: initialize transmit descriptors\n",
  646. __func__);
  647. for (i = 0; i < SONIC_NUM_TDS; i++) {
  648. sonic_tda_put(dev, i, SONIC_TD_STATUS, 0);
  649. sonic_tda_put(dev, i, SONIC_TD_CONFIG, 0);
  650. sonic_tda_put(dev, i, SONIC_TD_PKTSIZE, 0);
  651. sonic_tda_put(dev, i, SONIC_TD_FRAG_COUNT, 0);
  652. sonic_tda_put(dev, i, SONIC_TD_LINK,
  653. (lp->tda_laddr & 0xffff) +
  654. (i + 1) * SIZEOF_SONIC_TD * SONIC_BUS_SCALE(lp->dma_bitmode));
  655. lp->tx_skb[i] = NULL;
  656. }
  657. /* fix last descriptor */
  658. sonic_tda_put(dev, SONIC_NUM_TDS - 1, SONIC_TD_LINK,
  659. (lp->tda_laddr & 0xffff));
  660. SONIC_WRITE(SONIC_UTDA, lp->tda_laddr >> 16);
  661. SONIC_WRITE(SONIC_CTDA, lp->tda_laddr & 0xffff);
  662. lp->cur_tx = lp->next_tx = 0;
  663. lp->eol_tx = SONIC_NUM_TDS - 1;
  664. /*
  665. * put our own address to CAM desc[0]
  666. */
  667. sonic_cda_put(dev, 0, SONIC_CD_CAP0, dev->dev_addr[1] << 8 | dev->dev_addr[0]);
  668. sonic_cda_put(dev, 0, SONIC_CD_CAP1, dev->dev_addr[3] << 8 | dev->dev_addr[2]);
  669. sonic_cda_put(dev, 0, SONIC_CD_CAP2, dev->dev_addr[5] << 8 | dev->dev_addr[4]);
  670. sonic_set_cam_enable(dev, 1);
  671. for (i = 0; i < 16; i++)
  672. sonic_cda_put(dev, i, SONIC_CD_ENTRY_POINTER, i);
  673. /*
  674. * initialize CAM registers
  675. */
  676. SONIC_WRITE(SONIC_CDP, lp->cda_laddr & 0xffff);
  677. SONIC_WRITE(SONIC_CDC, 16);
  678. /*
  679. * load the CAM
  680. */
  681. SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM);
  682. sonic_quiesce(dev, SONIC_CR_LCAM);
  683. /*
  684. * enable receiver, disable loopback
  685. * and enable all interrupts
  686. */
  687. SONIC_WRITE(SONIC_RCR, SONIC_RCR_DEFAULT);
  688. SONIC_WRITE(SONIC_TCR, SONIC_TCR_DEFAULT);
  689. SONIC_WRITE(SONIC_ISR, 0x7fff);
  690. SONIC_WRITE(SONIC_IMR, SONIC_IMR_DEFAULT);
  691. SONIC_WRITE(SONIC_CMD, SONIC_CR_RXEN);
  692. netif_dbg(lp, ifup, dev, "%s: new status=%x\n", __func__,
  693. SONIC_READ(SONIC_CMD));
  694. return 0;
  695. }
  696. MODULE_LICENSE("GPL");