OSDN Git Service

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