]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/net/natsemi.c
imported Ka-Ro specific additions to U-Boot 2009.08 for TX28
[karo-tx-uboot.git] / drivers / net / natsemi.c
1 /*
2    natsemi.c: A U-Boot driver for the NatSemi DP8381x series.
3    Author: Mark A. Rakes (mark_rakes@vivato.net)
4
5    Adapted from an Etherboot driver written by:
6
7    Copyright (C) 2001 Entity Cyber, Inc.
8
9    This development of this Etherboot driver was funded by
10
11       Sicom Systems: http://www.sicompos.com/
12
13    Author: Marty Connor (mdc@thinguin.org)
14    Adapted from a Linux driver which was written by Donald Becker
15
16    This software may be used and distributed according to the terms
17    of the GNU Public License (GPL), incorporated herein by reference.
18
19    Original Copyright Notice:
20
21    Written/copyright 1999-2001 by Donald Becker.
22
23    This software may be used and distributed according to the terms of
24    the GNU General Public License (GPL), incorporated herein by reference.
25    Drivers based on or derived from this code fall under the GPL and must
26    retain the authorship, copyright and license notice.  This file is not
27    a complete program and may only be used when the entire operating
28    system is licensed under the GPL.  License for under other terms may be
29    available.  Contact the original author for details.
30
31    The original author may be reached as becker@scyld.com, or at
32    Scyld Computing Corporation
33    410 Severn Ave., Suite 210
34    Annapolis MD 21403
35
36    Support information and updates available at
37    http://www.scyld.com/network/netsemi.html
38
39    References:
40    http://www.scyld.com/expert/100mbps.html
41    http://www.scyld.com/expert/NWay.html
42    Datasheet is available from:
43    http://www.national.com/pf/DP/DP83815.html
44 */
45
46 /* Revision History
47  * October 2002 mar     1.0
48  *   Initial U-Boot Release.  Tested with Netgear FA311 board
49  *   and dp83815 chipset on custom board
50 */
51
52 /* Includes */
53 #include <common.h>
54 #include <malloc.h>
55 #include <net.h>
56 #include <netdev.h>
57 #include <asm/io.h>
58 #include <pci.h>
59
60 /* defines */
61 #define EEPROM_SIZE 0xb /*12 16-bit chunks, or 24 bytes*/
62
63 #define DSIZE           0x00000FFF
64 #define ETH_ALEN        6
65 #define CRC_SIZE        4
66 #define TOUT_LOOP       500000
67 #define TX_BUF_SIZE     1536
68 #define RX_BUF_SIZE     1536
69 #define NUM_RX_DESC     4       /* Number of Rx descriptor registers. */
70
71 /* Offsets to the device registers.
72    Unlike software-only systems, device drivers interact with complex hardware.
73    It's not useful to define symbolic names for every register bit in the
74    device.  */
75 enum register_offsets {
76         ChipCmd = 0x00,
77         ChipConfig      = 0x04,
78         EECtrl          = 0x08,
79         IntrMask        = 0x14,
80         IntrEnable      = 0x18,
81         TxRingPtr       = 0x20,
82         TxConfig        = 0x24,
83         RxRingPtr       = 0x30,
84         RxConfig        = 0x34,
85         ClkRun          = 0x3C,
86         RxFilterAddr    = 0x48,
87         RxFilterData    = 0x4C,
88         SiliconRev      = 0x58,
89         PCIPM           = 0x44,
90         BasicControl    = 0x80,
91         BasicStatus     = 0x84,
92         /* These are from the spec, around page 78... on a separate table. */
93         PGSEL           = 0xCC,
94         PMDCSR          = 0xE4,
95         TSTDAT          = 0xFC,
96         DSPCFG          = 0xF4,
97         SDCFG           = 0x8C
98 };
99
100 /* Bit in ChipCmd. */
101 enum ChipCmdBits {
102         ChipReset       = 0x100,
103         RxReset         = 0x20,
104         TxReset         = 0x10,
105         RxOff           = 0x08,
106         RxOn            = 0x04,
107         TxOff           = 0x02,
108         TxOn            = 0x01
109 };
110
111 enum ChipConfigBits {
112         LinkSts = 0x80000000,
113         HundSpeed       = 0x40000000,
114         FullDuplex      = 0x20000000,
115         TenPolarity     = 0x10000000,
116         AnegDone        = 0x08000000,
117         AnegEnBothBoth  = 0x0000E000,
118         AnegDis100Full  = 0x0000C000,
119         AnegEn100Both   = 0x0000A000,
120         AnegDis100Half  = 0x00008000,
121         AnegEnBothHalf  = 0x00006000,
122         AnegDis10Full   = 0x00004000,
123         AnegEn10Both    = 0x00002000,
124         DuplexMask      = 0x00008000,
125         SpeedMask       = 0x00004000,
126         AnegMask        = 0x00002000,
127         AnegDis10Half   = 0x00000000,
128         ExtPhy          = 0x00001000,
129         PhyRst          = 0x00000400,
130         PhyDis          = 0x00000200,
131         BootRomDisable  = 0x00000004,
132         BEMode          = 0x00000001,
133 };
134
135 enum TxConfig_bits {
136         TxDrthMask      = 0x3f,
137         TxFlthMask      = 0x3f00,
138         TxMxdmaMask     = 0x700000,
139         TxMxdma_512     = 0x0,
140         TxMxdma_4       = 0x100000,
141         TxMxdma_8       = 0x200000,
142         TxMxdma_16      = 0x300000,
143         TxMxdma_32      = 0x400000,
144         TxMxdma_64      = 0x500000,
145         TxMxdma_128     = 0x600000,
146         TxMxdma_256     = 0x700000,
147         TxCollRetry     = 0x800000,
148         TxAutoPad       = 0x10000000,
149         TxMacLoop       = 0x20000000,
150         TxHeartIgn      = 0x40000000,
151         TxCarrierIgn    = 0x80000000
152 };
153
154 enum RxConfig_bits {
155         RxDrthMask      = 0x3e,
156         RxMxdmaMask     = 0x700000,
157         RxMxdma_512     = 0x0,
158         RxMxdma_4       = 0x100000,
159         RxMxdma_8       = 0x200000,
160         RxMxdma_16      = 0x300000,
161         RxMxdma_32      = 0x400000,
162         RxMxdma_64      = 0x500000,
163         RxMxdma_128     = 0x600000,
164         RxMxdma_256     = 0x700000,
165         RxAcceptLong    = 0x8000000,
166         RxAcceptTx      = 0x10000000,
167         RxAcceptRunt    = 0x40000000,
168         RxAcceptErr     = 0x80000000
169 };
170
171 /* Bits in the RxMode register. */
172 enum rx_mode_bits {
173         AcceptErr       = 0x20,
174         AcceptRunt      = 0x10,
175         AcceptBroadcast = 0xC0000000,
176         AcceptMulticast = 0x00200000,
177         AcceptAllMulticast = 0x20000000,
178         AcceptAllPhys   = 0x10000000,
179         AcceptMyPhys    = 0x08000000
180 };
181
182 typedef struct _BufferDesc {
183         u32 link;
184         vu_long cmdsts;
185         u32 bufptr;
186         u32 software_use;
187 } BufferDesc;
188
189 /* Bits in network_desc.status */
190 enum desc_status_bits {
191         DescOwn = 0x80000000, DescMore = 0x40000000, DescIntr = 0x20000000,
192         DescNoCRC = 0x10000000, DescPktOK = 0x08000000,
193         DescSizeMask = 0xfff,
194
195         DescTxAbort = 0x04000000, DescTxFIFO = 0x02000000,
196         DescTxCarrier = 0x01000000, DescTxDefer = 0x00800000,
197         DescTxExcDefer = 0x00400000, DescTxOOWCol = 0x00200000,
198         DescTxExcColl = 0x00100000, DescTxCollCount = 0x000f0000,
199
200         DescRxAbort = 0x04000000, DescRxOver = 0x02000000,
201         DescRxDest = 0x01800000, DescRxLong = 0x00400000,
202         DescRxRunt = 0x00200000, DescRxInvalid = 0x00100000,
203         DescRxCRC = 0x00080000, DescRxAlign = 0x00040000,
204         DescRxLoop = 0x00020000, DesRxColl = 0x00010000,
205 };
206
207 /* Globals */
208 #ifdef NATSEMI_DEBUG
209 static int natsemi_debug = 0;   /* 1 verbose debugging, 0 normal */
210 #endif
211 static u32 SavedClkRun;
212 static unsigned int cur_rx;
213 static unsigned int advertising;
214 static unsigned int rx_config;
215 static unsigned int tx_config;
216
217 /* Note: transmit and receive buffers and descriptors must be
218    longword aligned */
219 static BufferDesc txd __attribute__ ((aligned(4)));
220 static BufferDesc rxd[NUM_RX_DESC] __attribute__ ((aligned(4)));
221
222 static unsigned char txb[TX_BUF_SIZE] __attribute__ ((aligned(4)));
223 static unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE]
224     __attribute__ ((aligned(4)));
225
226 /* Function Prototypes */
227 #if 0
228 static void write_eeprom(struct eth_device *dev, long addr, int location,
229                          short value);
230 #endif
231 static int read_eeprom(struct eth_device *dev, long addr, int location);
232 static int mdio_read(struct eth_device *dev, int phy_id, int location);
233 static int natsemi_init(struct eth_device *dev, bd_t * bis);
234 static void natsemi_reset(struct eth_device *dev);
235 static void natsemi_init_rxfilter(struct eth_device *dev);
236 static void natsemi_init_txd(struct eth_device *dev);
237 static void natsemi_init_rxd(struct eth_device *dev);
238 static void natsemi_set_rx_mode(struct eth_device *dev);
239 static void natsemi_check_duplex(struct eth_device *dev);
240 static int natsemi_send(struct eth_device *dev, volatile void *packet,
241                         int length);
242 static int natsemi_poll(struct eth_device *dev);
243 static void natsemi_disable(struct eth_device *dev);
244
245 static struct pci_device_id supported[] = {
246         {PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83815},
247         {}
248 };
249
250 #define bus_to_phys(a)  pci_mem_to_phys((pci_dev_t)dev->priv, a)
251 #define phys_to_bus(a)  pci_phys_to_mem((pci_dev_t)dev->priv, a)
252
253 static inline int
254 INW(struct eth_device *dev, u_long addr)
255 {
256         return le16_to_cpu(*(vu_short *) (addr + dev->iobase));
257 }
258
259 static int
260 INL(struct eth_device *dev, u_long addr)
261 {
262         return le32_to_cpu(*(vu_long *) (addr + dev->iobase));
263 }
264
265 static inline void
266 OUTW(struct eth_device *dev, int command, u_long addr)
267 {
268         *(vu_short *) ((addr + dev->iobase)) = cpu_to_le16(command);
269 }
270
271 static inline void
272 OUTL(struct eth_device *dev, int command, u_long addr)
273 {
274         *(vu_long *) ((addr + dev->iobase)) = cpu_to_le32(command);
275 }
276
277 /*
278  * Function: natsemi_initialize
279  *
280  * Description: Retrieves the MAC address of the card, and sets up some
281  * globals required by other routines,  and initializes the NIC, making it
282  * ready to send and receive packets.
283  *
284  * Side effects:
285  *            leaves the natsemi initialized, and ready to recieve packets.
286  *
287  * Returns:   struct eth_device *:          pointer to NIC data structure
288  */
289
290 int
291 natsemi_initialize(bd_t * bis)
292 {
293         pci_dev_t devno;
294         int card_number = 0;
295         struct eth_device *dev;
296         u32 iobase, status, chip_config;
297         int i, idx = 0;
298         int prev_eedata;
299         u32 tmp;
300
301         while (1) {
302                 /* Find PCI device(s) */
303                 if ((devno = pci_find_devices(supported, idx++)) < 0) {
304                         break;
305                 }
306
307                 pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &iobase);
308                 iobase &= ~0x3; /* bit 1: unused and bit 0: I/O Space Indicator */
309
310                 pci_write_config_dword(devno, PCI_COMMAND,
311                                        PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
312
313                 /* Check if I/O accesses and Bus Mastering are enabled. */
314                 pci_read_config_dword(devno, PCI_COMMAND, &status);
315                 if (!(status & PCI_COMMAND_MEMORY)) {
316                         printf("Error: Can not enable MEM access.\n");
317                         continue;
318                 } else if (!(status & PCI_COMMAND_MASTER)) {
319                         printf("Error: Can not enable Bus Mastering.\n");
320                         continue;
321                 }
322
323                 dev = (struct eth_device *) malloc(sizeof *dev);
324
325                 sprintf(dev->name, "dp83815#%d", card_number);
326                 dev->iobase = bus_to_phys(iobase);
327 #ifdef NATSEMI_DEBUG
328                 printf("natsemi: NatSemi ns8381[56] @ %#x\n", dev->iobase);
329 #endif
330                 dev->priv = (void *) devno;
331                 dev->init = natsemi_init;
332                 dev->halt = natsemi_disable;
333                 dev->send = natsemi_send;
334                 dev->recv = natsemi_poll;
335
336                 eth_register(dev);
337
338                 card_number++;
339
340                 /* Set the latency timer for value. */
341                 pci_write_config_byte(devno, PCI_LATENCY_TIMER, 0x20);
342
343                 udelay(10 * 1000);
344
345                 /* natsemi has a non-standard PM control register
346                  * in PCI config space.  Some boards apparently need
347                  * to be brought to D0 in this manner.  */
348                 pci_read_config_dword(devno, PCIPM, &tmp);
349                 if (tmp & (0x03 | 0x100)) {
350                         /* D0 state, disable PME assertion */
351                         u32 newtmp = tmp & ~(0x03 | 0x100);
352                         pci_write_config_dword(devno, PCIPM, newtmp);
353                 }
354
355                 printf("natsemi: EEPROM contents:\n");
356                 for (i = 0; i <= EEPROM_SIZE; i++) {
357                         short eedata = read_eeprom(dev, EECtrl, i);
358                         printf(" %04hx", eedata);
359                 }
360                 printf("\n");
361
362                 /* get MAC address */
363                 prev_eedata = read_eeprom(dev, EECtrl, 6);
364                 for (i = 0; i < 3; i++) {
365                         int eedata = read_eeprom(dev, EECtrl, i + 7);
366                         dev->enetaddr[i*2] = (eedata << 1) + (prev_eedata >> 15);
367                         dev->enetaddr[i*2+1] = eedata >> 7;
368                         prev_eedata = eedata;
369                 }
370
371                 /* Reset the chip to erase any previous misconfiguration. */
372                 OUTL(dev, ChipReset, ChipCmd);
373
374                 advertising = mdio_read(dev, 1, 4);
375                 chip_config = INL(dev, ChipConfig);
376 #ifdef NATSEMI_DEBUG
377                 printf("%s: Transceiver status %#08X advertising %#08X\n",
378                         dev->name, (int) INL(dev, BasicStatus), advertising);
379                 printf("%s: Transceiver default autoneg. %s 10%s %s duplex.\n",
380                         dev->name, chip_config & AnegMask ? "enabled, advertise" :
381                         "disabled, force", chip_config & SpeedMask ? "0" : "",
382                         chip_config & DuplexMask ? "full" : "half");
383 #endif
384                 chip_config |= AnegEnBothBoth;
385 #ifdef NATSEMI_DEBUG
386                 printf("%s: changed to autoneg. %s 10%s %s duplex.\n",
387                         dev->name, chip_config & AnegMask ? "enabled, advertise" :
388                         "disabled, force", chip_config & SpeedMask ? "0" : "",
389                         chip_config & DuplexMask ? "full" : "half");
390 #endif
391                 /*write new autoneg bits, reset phy*/
392                 OUTL(dev, (chip_config | PhyRst), ChipConfig);
393                 /*un-reset phy*/
394                 OUTL(dev, chip_config, ChipConfig);
395
396                 /* Disable PME:
397                  * The PME bit is initialized from the EEPROM contents.
398                  * PCI cards probably have PME disabled, but motherboard
399                  * implementations may have PME set to enable WakeOnLan.
400                  * With PME set the chip will scan incoming packets but
401                  * nothing will be written to memory. */
402                 SavedClkRun = INL(dev, ClkRun);
403                 OUTL(dev, SavedClkRun & ~0x100, ClkRun);
404         }
405         return card_number;
406 }
407
408 /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces.
409    The EEPROM code is for common 93c06/46 EEPROMs w/ 6bit addresses.  */
410
411 /* Delay between EEPROM clock transitions.
412    No extra delay is needed with 33MHz PCI, but future 66MHz
413    access may need a delay. */
414 #define eeprom_delay(ee_addr)   INL(dev, ee_addr)
415
416 enum EEPROM_Ctrl_Bits {
417         EE_ShiftClk = 0x04,
418         EE_DataIn = 0x01,
419         EE_ChipSelect = 0x08,
420         EE_DataOut = 0x02
421 };
422
423 #define EE_Write0 (EE_ChipSelect)
424 #define EE_Write1 (EE_ChipSelect | EE_DataIn)
425 /* The EEPROM commands include the alway-set leading bit. */
426 enum EEPROM_Cmds {
427         EE_WrEnCmd = (4 << 6), EE_WriteCmd = (5 << 6),
428         EE_ReadCmd = (6 << 6), EE_EraseCmd = (7 << 6),
429 };
430
431 #if 0
432 static void
433 write_eeprom(struct eth_device *dev, long addr, int location, short value)
434 {
435         int i;
436         int ee_addr = (typeof(ee_addr))addr;
437         short wren_cmd = EE_WrEnCmd | 0x30; /*wren is 100 + 11XXXX*/
438         short write_cmd = location | EE_WriteCmd;
439
440 #ifdef NATSEMI_DEBUG
441         printf("write_eeprom: %08x, %04hx, %04hx\n",
442                 dev->iobase + ee_addr, write_cmd, value);
443 #endif
444         /* Shift the write enable command bits out. */
445         for (i = 9; i >= 0; i--) {
446                 short cmdval = (wren_cmd & (1 << i)) ? EE_Write1 : EE_Write0;
447                 OUTL(dev, cmdval, ee_addr);
448                 eeprom_delay(ee_addr);
449                 OUTL(dev, cmdval | EE_ShiftClk, ee_addr);
450                 eeprom_delay(ee_addr);
451         }
452
453         OUTL(dev, 0, ee_addr); /*bring chip select low*/
454         OUTL(dev, EE_ShiftClk, ee_addr);
455         eeprom_delay(ee_addr);
456
457         /* Shift the write command bits out. */
458         for (i = 9; i >= 0; i--) {
459                 short cmdval = (write_cmd & (1 << i)) ? EE_Write1 : EE_Write0;
460                 OUTL(dev, cmdval, ee_addr);
461                 eeprom_delay(ee_addr);
462                 OUTL(dev, cmdval | EE_ShiftClk, ee_addr);
463                 eeprom_delay(ee_addr);
464         }
465
466         for (i = 0; i < 16; i++) {
467                 short cmdval = (value & (1 << i)) ? EE_Write1 : EE_Write0;
468                 OUTL(dev, cmdval, ee_addr);
469                 eeprom_delay(ee_addr);
470                 OUTL(dev, cmdval | EE_ShiftClk, ee_addr);
471                 eeprom_delay(ee_addr);
472         }
473
474         OUTL(dev, 0, ee_addr); /*bring chip select low*/
475         OUTL(dev, EE_ShiftClk, ee_addr);
476         for (i = 0; i < 200000; i++) {
477                 OUTL(dev, EE_Write0, ee_addr); /*poll for done*/
478                 if (INL(dev, ee_addr) & EE_DataOut) {
479                     break; /*finished*/
480                 }
481         }
482         eeprom_delay(ee_addr);
483
484         /* Terminate the EEPROM access. */
485         OUTL(dev, EE_Write0, ee_addr);
486         OUTL(dev, 0, ee_addr);
487         return;
488 }
489 #endif
490
491 static int
492 read_eeprom(struct eth_device *dev, long addr, int location)
493 {
494         int i;
495         int retval = 0;
496         int ee_addr = (typeof(ee_addr))addr;
497         int read_cmd = location | EE_ReadCmd;
498
499         OUTL(dev, EE_Write0, ee_addr);
500
501         /* Shift the read command bits out. */
502         for (i = 10; i >= 0; i--) {
503                 short dataval = (read_cmd & (1 << i)) ? EE_Write1 : EE_Write0;
504                 OUTL(dev, dataval, ee_addr);
505                 eeprom_delay(ee_addr);
506                 OUTL(dev, dataval | EE_ShiftClk, ee_addr);
507                 eeprom_delay(ee_addr);
508         }
509         OUTL(dev, EE_ChipSelect, ee_addr);
510         eeprom_delay(ee_addr);
511
512         for (i = 0; i < 16; i++) {
513                 OUTL(dev, EE_ChipSelect | EE_ShiftClk, ee_addr);
514                 eeprom_delay(ee_addr);
515                 retval |= (INL(dev, ee_addr) & EE_DataOut) ? 1 << i : 0;
516                 OUTL(dev, EE_ChipSelect, ee_addr);
517                 eeprom_delay(ee_addr);
518         }
519
520         /* Terminate the EEPROM access. */
521         OUTL(dev, EE_Write0, ee_addr);
522         OUTL(dev, 0, ee_addr);
523 #ifdef NATSEMI_DEBUG
524         if (natsemi_debug)
525                 printf("read_eeprom: %08x, %08x, retval %08x\n",
526                         dev->iobase + ee_addr, read_cmd, retval);
527 #endif
528         return retval;
529 }
530
531 /*  MII transceiver control section.
532         The 83815 series has an internal transceiver, and we present the
533         management registers as if they were MII connected. */
534
535 static int
536 mdio_read(struct eth_device *dev, int phy_id, int location)
537 {
538         if (phy_id == 1 && location < 32)
539                 return INL(dev, BasicControl+(location<<2))&0xffff;
540         else
541                 return 0xffff;
542 }
543
544 /* Function: natsemi_init
545  *
546  * Description: resets the ethernet controller chip and configures
547  *    registers and data structures required for sending and receiving packets.
548  *
549  * Arguments: struct eth_device *dev:          NIC data structure
550  *
551  * returns:     int.
552  */
553
554 static int
555 natsemi_init(struct eth_device *dev, bd_t * bis)
556 {
557
558         natsemi_reset(dev);
559
560         /* Disable PME:
561          * The PME bit is initialized from the EEPROM contents.
562          * PCI cards probably have PME disabled, but motherboard
563          * implementations may have PME set to enable WakeOnLan.
564          * With PME set the chip will scan incoming packets but
565          * nothing will be written to memory. */
566         OUTL(dev, SavedClkRun & ~0x100, ClkRun);
567
568         natsemi_init_rxfilter(dev);
569         natsemi_init_txd(dev);
570         natsemi_init_rxd(dev);
571
572         /* Configure the PCI bus bursts and FIFO thresholds. */
573         tx_config = TxAutoPad | TxCollRetry | TxMxdma_256 | (0x1002);
574         rx_config = RxMxdma_256 | 0x20;
575
576 #ifdef NATSEMI_DEBUG
577         printf("%s: Setting TxConfig Register %#08X\n", dev->name, tx_config);
578         printf("%s: Setting RxConfig Register %#08X\n", dev->name, rx_config);
579 #endif
580         OUTL(dev, tx_config, TxConfig);
581         OUTL(dev, rx_config, RxConfig);
582
583         natsemi_check_duplex(dev);
584         natsemi_set_rx_mode(dev);
585
586         OUTL(dev, (RxOn | TxOn), ChipCmd);
587         return 1;
588 }
589
590 /*
591  * Function: natsemi_reset
592  *
593  * Description: soft resets the controller chip
594  *
595  * Arguments: struct eth_device *dev:          NIC data structure
596  *
597  * Returns:   void.
598  */
599 static void
600 natsemi_reset(struct eth_device *dev)
601 {
602         OUTL(dev, ChipReset, ChipCmd);
603
604         /* On page 78 of the spec, they recommend some settings for "optimum
605            performance" to be done in sequence.  These settings optimize some
606            of the 100Mbit autodetection circuitry.  Also, we only want to do
607            this for rev C of the chip.  */
608         if (INL(dev, SiliconRev) == 0x302) {
609                 OUTW(dev, 0x0001, PGSEL);
610                 OUTW(dev, 0x189C, PMDCSR);
611                 OUTW(dev, 0x0000, TSTDAT);
612                 OUTW(dev, 0x5040, DSPCFG);
613                 OUTW(dev, 0x008C, SDCFG);
614         }
615         /* Disable interrupts using the mask. */
616         OUTL(dev, 0, IntrMask);
617         OUTL(dev, 0, IntrEnable);
618 }
619
620 /* Function: natsemi_init_rxfilter
621  *
622  * Description: sets receive filter address to our MAC address
623  *
624  * Arguments: struct eth_device *dev:          NIC data structure
625  *
626  * returns:   void.
627  */
628
629 static void
630 natsemi_init_rxfilter(struct eth_device *dev)
631 {
632         int i;
633
634         for (i = 0; i < ETH_ALEN; i += 2) {
635                 OUTL(dev, i, RxFilterAddr);
636                 OUTW(dev, dev->enetaddr[i] + (dev->enetaddr[i + 1] << 8),
637                      RxFilterData);
638         }
639 }
640
641 /*
642  * Function: natsemi_init_txd
643  *
644  * Description: initializes the Tx descriptor
645  *
646  * Arguments: struct eth_device *dev:          NIC data structure
647  *
648  * returns:   void.
649  */
650
651 static void
652 natsemi_init_txd(struct eth_device *dev)
653 {
654         txd.link = (u32) 0;
655         txd.cmdsts = (u32) 0;
656         txd.bufptr = (u32) & txb[0];
657
658         /* load Transmit Descriptor Register */
659         OUTL(dev, (u32) & txd, TxRingPtr);
660 #ifdef NATSEMI_DEBUG
661         printf("natsemi_init_txd: TX descriptor reg loaded with: %#08X\n",
662                INL(dev, TxRingPtr));
663 #endif
664 }
665
666 /* Function: natsemi_init_rxd
667  *
668  * Description: initializes the Rx descriptor ring
669  *
670  * Arguments: struct eth_device *dev:          NIC data structure
671  *
672  * Returns:   void.
673  */
674
675 static void
676 natsemi_init_rxd(struct eth_device *dev)
677 {
678         int i;
679
680         cur_rx = 0;
681
682         /* init RX descriptor */
683         for (i = 0; i < NUM_RX_DESC; i++) {
684                 rxd[i].link =
685                     cpu_to_le32((i + 1 <
686                                  NUM_RX_DESC) ? (u32) & rxd[i +
687                                                             1] : (u32) &
688                                 rxd[0]);
689                 rxd[i].cmdsts = cpu_to_le32((u32) RX_BUF_SIZE);
690                 rxd[i].bufptr = cpu_to_le32((u32) & rxb[i * RX_BUF_SIZE]);
691 #ifdef NATSEMI_DEBUG
692                 printf
693                     ("natsemi_init_rxd: rxd[%d]=%p link=%X cmdsts=%lX bufptr=%X\n",
694                         i, &rxd[i], le32_to_cpu(rxd[i].link),
695                                 rxd[i].cmdsts, rxd[i].bufptr);
696 #endif
697         }
698
699         /* load Receive Descriptor Register */
700         OUTL(dev, (u32) & rxd[0], RxRingPtr);
701
702 #ifdef NATSEMI_DEBUG
703         printf("natsemi_init_rxd: RX descriptor register loaded with: %X\n",
704                INL(dev, RxRingPtr));
705 #endif
706 }
707
708 /* Function: natsemi_set_rx_mode
709  *
710  * Description:
711  *    sets the receive mode to accept all broadcast packets and packets
712  *    with our MAC address, and reject all multicast packets.
713  *
714  * Arguments: struct eth_device *dev:          NIC data structure
715  *
716  * Returns:   void.
717  */
718
719 static void
720 natsemi_set_rx_mode(struct eth_device *dev)
721 {
722         u32 rx_mode = AcceptBroadcast | AcceptMyPhys;
723
724         OUTL(dev, rx_mode, RxFilterAddr);
725 }
726
727 static void
728 natsemi_check_duplex(struct eth_device *dev)
729 {
730         int duplex = INL(dev, ChipConfig) & FullDuplex ? 1 : 0;
731
732 #ifdef NATSEMI_DEBUG
733         printf("%s: Setting %s-duplex based on negotiated link"
734                " capability.\n", dev->name, duplex ? "full" : "half");
735 #endif
736         if (duplex) {
737                 rx_config |= RxAcceptTx;
738                 tx_config |= (TxCarrierIgn | TxHeartIgn);
739         } else {
740                 rx_config &= ~RxAcceptTx;
741                 tx_config &= ~(TxCarrierIgn | TxHeartIgn);
742         }
743         OUTL(dev, tx_config, TxConfig);
744         OUTL(dev, rx_config, RxConfig);
745 }
746
747 /* Function: natsemi_send
748  *
749  * Description: transmits a packet and waits for completion or timeout.
750  *
751  * Returns:   void.  */
752 static int
753 natsemi_send(struct eth_device *dev, volatile void *packet, int length)
754 {
755         u32 i, status = 0;
756         u32 tx_status = 0;
757         vu_long *res = (vu_long *)&tx_status;
758
759         /* Stop the transmitter */
760         OUTL(dev, TxOff, ChipCmd);
761
762 #ifdef NATSEMI_DEBUG
763         if (natsemi_debug)
764                 printf("natsemi_send: sending %d bytes\n", (int) length);
765 #endif
766
767         /* set the transmit buffer descriptor and enable Transmit State Machine */
768         txd.link = cpu_to_le32(0);
769         txd.bufptr = cpu_to_le32(phys_to_bus((u32) packet));
770         txd.cmdsts = cpu_to_le32(DescOwn | length);
771
772         /* load Transmit Descriptor Register */
773         OUTL(dev, phys_to_bus((u32) & txd), TxRingPtr);
774 #ifdef NATSEMI_DEBUG
775         if (natsemi_debug)
776             printf("natsemi_send: TX descriptor register loaded with: %#08X\n",
777              INL(dev, TxRingPtr));
778 #endif
779         /* restart the transmitter */
780         OUTL(dev, TxOn, ChipCmd);
781
782         for (i = 0;
783              (*res = le32_to_cpu(txd.cmdsts)) & DescOwn;
784              i++) {
785                 if (i >= TOUT_LOOP) {
786                         printf
787                             ("%s: tx error buffer not ready: txd.cmdsts == %#X\n",
788                              dev->name, tx_status);
789                         goto Done;
790                 }
791         }
792
793         if (!(tx_status & DescPktOK)) {
794                 printf("natsemi_send: Transmit error, Tx status %X.\n",
795                        tx_status);
796                 goto Done;
797         }
798
799         status = 1;
800       Done:
801         return status;
802 }
803
804 /* Function: natsemi_poll
805  *
806  * Description: checks for a received packet and returns it if found.
807  *
808  * Arguments: struct eth_device *dev:          NIC data structure
809  *
810  * Returns:   1 if    packet was received.
811  *            0 if no packet was received.
812  *
813  * Side effects:
814  *            Returns (copies) the packet to the array dev->packet.
815  *            Returns the length of the packet.
816  */
817
818 static int
819 natsemi_poll(struct eth_device *dev)
820 {
821         int retstat = 0;
822         int length = 0;
823         u32 rx_status = le32_to_cpu(rxd[cur_rx].cmdsts);
824
825         if (!(rx_status & (u32) DescOwn))
826                 return retstat;
827 #ifdef NATSEMI_DEBUG
828         if (natsemi_debug)
829                 printf("natsemi_poll: got a packet: cur_rx:%d, status:%X\n",
830                        cur_rx, rx_status);
831 #endif
832         length = (rx_status & DSIZE) - CRC_SIZE;
833
834         if ((rx_status & (DescMore | DescPktOK | DescRxLong)) != DescPktOK) {
835                 printf
836                     ("natsemi_poll: Corrupted packet received, buffer status = %X\n",
837                      rx_status);
838                 retstat = 0;
839         } else {                /* give packet to higher level routine */
840                 NetReceive((rxb + cur_rx * RX_BUF_SIZE), length);
841                 retstat = 1;
842         }
843
844         /* return the descriptor and buffer to receive ring */
845         rxd[cur_rx].cmdsts = cpu_to_le32(RX_BUF_SIZE);
846         rxd[cur_rx].bufptr = cpu_to_le32((u32) & rxb[cur_rx * RX_BUF_SIZE]);
847
848         if (++cur_rx == NUM_RX_DESC)
849                 cur_rx = 0;
850
851         /* re-enable the potentially idle receive state machine */
852         OUTL(dev, RxOn, ChipCmd);
853
854         return retstat;
855 }
856
857 /* Function: natsemi_disable
858  *
859  * Description: Turns off interrupts and stops Tx and Rx engines
860  *
861  * Arguments: struct eth_device *dev:          NIC data structure
862  *
863  * Returns:   void.
864  */
865
866 static void
867 natsemi_disable(struct eth_device *dev)
868 {
869         /* Disable interrupts using the mask. */
870         OUTL(dev, 0, IntrMask);
871         OUTL(dev, 0, IntrEnable);
872
873         /* Stop the chip's Tx and Rx processes. */
874         OUTL(dev, RxOff | TxOff, ChipCmd);
875
876         /* Restore PME enable bit */
877         OUTL(dev, SavedClkRun, ClkRun);
878 }