xref: /openbmc/u-boot/drivers/net/ns8382x.c (revision 9973e3c6)
1 /*
2    ns8382x.c: A U-Boot driver for the NatSemi DP8382[01].
3    ported by: Mark A. Rakes (mark_rakes@vivato.net)
4 
5    Adapted from:
6    1. an Etherboot driver for DP8381[56] written by:
7 	   Copyright (C) 2001 Entity Cyber, Inc.
8 
9 	   This development of this Etherboot driver was funded by
10 		  Sicom Systems: http://www.sicompos.com/
11 
12 	   Author: Marty Connor (mdc@thinguin.org)
13 	   Adapted from a Linux driver which was written by Donald Becker
14 
15 	   This software may be used and distributed according to the terms
16 	   of the GNU Public License (GPL), incorporated herein by reference.
17 
18    2. A Linux driver by Donald Becker, ns820.c:
19 		Written/copyright 1999-2002 by Donald Becker.
20 
21 		This software may be used and distributed according to the terms of
22 		the GNU General Public License (GPL), incorporated herein by reference.
23 		Drivers based on or derived from this code fall under the GPL and must
24 		retain the authorship, copyright and license notice.  This file is not
25 		a complete program and may only be used when the entire operating
26 		system is licensed under the GPL.  License for under other terms may be
27 		available.  Contact the original author for details.
28 
29 		The original author may be reached as becker@scyld.com, or at
30 		Scyld Computing Corporation
31 		410 Severn Ave., Suite 210
32 		Annapolis MD 21403
33 
34 		Support information and updates available at
35 		http://www.scyld.com/network/netsemi.html
36 
37    Datasheets available from:
38    http://www.national.com/pf/DP/DP83820.html
39    http://www.national.com/pf/DP/DP83821.html
40 */
41 
42 /* Revision History
43  * October 2002 mar	1.0
44  *   Initial U-Boot Release.
45  *	Tested with Netgear GA622T (83820)
46  *	and SMC9452TX (83821)
47  *	NOTE: custom boards with these chips may (likely) require
48  *	a programmed EEPROM device (if present) in order to work
49  *	correctly.
50 */
51 
52 /* Includes */
53 #include <common.h>
54 #include <malloc.h>
55 #include <net.h>
56 #include <asm/io.h>
57 #include <pci.h>
58 
59 /* defines */
60 #define DSIZE     0x00000FFF
61 #define ETH_ALEN		6
62 #define CRC_SIZE  4
63 #define TOUT_LOOP   500000
64 #define TX_BUF_SIZE    1536
65 #define RX_BUF_SIZE    1536
66 #define NUM_RX_DESC    4	/* Number of Rx descriptor registers. */
67 
68 enum register_offsets {
69 	ChipCmd = 0x00,
70 	ChipConfig = 0x04,
71 	EECtrl = 0x08,
72 	IntrMask = 0x14,
73 	IntrEnable = 0x18,
74 	TxRingPtr = 0x20,
75 	TxRingPtrHi = 0x24,
76 	TxConfig = 0x28,
77 	RxRingPtr = 0x30,
78 	RxRingPtrHi = 0x34,
79 	RxConfig = 0x38,
80 	PriQueue = 0x3C,
81 	RxFilterAddr = 0x48,
82 	RxFilterData = 0x4C,
83 	ClkRun = 0xCC,
84 	PCIPM = 0x44,
85 };
86 
87 enum ChipCmdBits {
88 	ChipReset = 0x100,
89 	RxReset = 0x20,
90 	TxReset = 0x10,
91 	RxOff = 0x08,
92 	RxOn = 0x04,
93 	TxOff = 0x02,
94 	TxOn = 0x01
95 };
96 
97 enum ChipConfigBits {
98 	LinkSts = 0x80000000,
99 	GigSpeed = 0x40000000,
100 	HundSpeed = 0x20000000,
101 	FullDuplex = 0x10000000,
102 	TBIEn = 0x01000000,
103 	Mode1000 = 0x00400000,
104 	T64En = 0x00004000,
105 	D64En = 0x00001000,
106 	M64En = 0x00000800,
107 	PhyRst = 0x00000400,
108 	PhyDis = 0x00000200,
109 	ExtStEn = 0x00000100,
110 	BEMode = 0x00000001,
111 };
112 #define SpeedStatus_Polarity ( GigSpeed | HundSpeed | FullDuplex)
113 
114 enum TxConfig_bits {
115 	TxDrthMask	= 0x000000ff,
116 	TxFlthMask	= 0x0000ff00,
117 	TxMxdmaMask	= 0x00700000,
118 	TxMxdma_8	= 0x00100000,
119 	TxMxdma_16	= 0x00200000,
120 	TxMxdma_32	= 0x00300000,
121 	TxMxdma_64	= 0x00400000,
122 	TxMxdma_128	= 0x00500000,
123 	TxMxdma_256	= 0x00600000,
124 	TxMxdma_512	= 0x00700000,
125 	TxMxdma_1024	= 0x00000000,
126 	TxCollRetry	= 0x00800000,
127 	TxAutoPad	= 0x10000000,
128 	TxMacLoop	= 0x20000000,
129 	TxHeartIgn	= 0x40000000,
130 	TxCarrierIgn	= 0x80000000
131 };
132 
133 enum RxConfig_bits {
134 	RxDrthMask	= 0x0000003e,
135 	RxMxdmaMask	= 0x00700000,
136 	RxMxdma_8	= 0x00100000,
137 	RxMxdma_16	= 0x00200000,
138 	RxMxdma_32	= 0x00300000,
139 	RxMxdma_64	= 0x00400000,
140 	RxMxdma_128	= 0x00500000,
141 	RxMxdma_256	= 0x00600000,
142 	RxMxdma_512	= 0x00700000,
143 	RxMxdma_1024	= 0x00000000,
144 	RxAcceptLenErr	= 0x04000000,
145 	RxAcceptLong	= 0x08000000,
146 	RxAcceptTx	= 0x10000000,
147 	RxStripCRC	= 0x20000000,
148 	RxAcceptRunt	= 0x40000000,
149 	RxAcceptErr	= 0x80000000,
150 };
151 
152 /* Bits in the RxMode register. */
153 enum rx_mode_bits {
154 	RxFilterEnable		= 0x80000000,
155 	AcceptAllBroadcast	= 0x40000000,
156 	AcceptAllMulticast	= 0x20000000,
157 	AcceptAllUnicast	= 0x10000000,
158 	AcceptPerfectMatch	= 0x08000000,
159 };
160 
161 typedef struct _BufferDesc {
162 	u32 link;
163 	u32 bufptr;
164 	vu_long cmdsts;
165 	u32 extsts;		/*not used here */
166 } BufferDesc;
167 
168 /* Bits in network_desc.status */
169 enum desc_status_bits {
170 	DescOwn = 0x80000000, DescMore = 0x40000000, DescIntr = 0x20000000,
171 	DescNoCRC = 0x10000000, DescPktOK = 0x08000000,
172 	DescSizeMask = 0xfff,
173 
174 	DescTxAbort = 0x04000000, DescTxFIFO = 0x02000000,
175 	DescTxCarrier = 0x01000000, DescTxDefer = 0x00800000,
176 	DescTxExcDefer = 0x00400000, DescTxOOWCol = 0x00200000,
177 	DescTxExcColl = 0x00100000, DescTxCollCount = 0x000f0000,
178 
179 	DescRxAbort = 0x04000000, DescRxOver = 0x02000000,
180 	DescRxDest = 0x01800000, DescRxLong = 0x00400000,
181 	DescRxRunt = 0x00200000, DescRxInvalid = 0x00100000,
182 	DescRxCRC = 0x00080000, DescRxAlign = 0x00040000,
183 	DescRxLoop = 0x00020000, DesRxColl = 0x00010000,
184 };
185 
186 /* Bits in MEAR */
187 enum mii_reg_bits {
188 	MDIO_ShiftClk = 0x0040,
189 	MDIO_EnbOutput = 0x0020,
190 	MDIO_Data = 0x0010,
191 };
192 
193 /* PHY Register offsets.  */
194 enum phy_reg_offsets {
195 	BMCR = 0x00,
196 	BMSR = 0x01,
197 	PHYIDR1 = 0x02,
198 	PHYIDR2 = 0x03,
199 	ANAR = 0x04,
200 	KTCR = 0x09,
201 };
202 
203 /* basic mode control register bits */
204 enum bmcr_bits {
205 	Bmcr_Reset = 0x8000,
206 	Bmcr_Loop = 0x4000,
207 	Bmcr_Speed0 = 0x2000,
208 	Bmcr_AutoNegEn = 0x1000,	/*if set ignores Duplex, Speed[01] */
209 	Bmcr_RstAutoNeg = 0x0200,
210 	Bmcr_Duplex = 0x0100,
211 	Bmcr_Speed1 = 0x0040,
212 	Bmcr_Force10H = 0x0000,
213 	Bmcr_Force10F = 0x0100,
214 	Bmcr_Force100H = 0x2000,
215 	Bmcr_Force100F = 0x2100,
216 	Bmcr_Force1000H = 0x0040,
217 	Bmcr_Force1000F = 0x0140,
218 };
219 
220 /* auto negotiation advertisement register */
221 enum anar_bits {
222 	anar_adv_100F = 0x0100,
223 	anar_adv_100H = 0x0080,
224 	anar_adv_10F = 0x0040,
225 	anar_adv_10H = 0x0020,
226 	anar_ieee_8023 = 0x0001,
227 };
228 
229 /* 1K-base T control register */
230 enum ktcr_bits {
231 	ktcr_adv_1000H = 0x0100,
232 	ktcr_adv_1000F = 0x0200,
233 };
234 
235 /* Globals */
236 static u32 SavedClkRun;
237 static unsigned int cur_rx;
238 static unsigned int rx_config;
239 static unsigned int tx_config;
240 
241 /* Note: transmit and receive buffers and descriptors must be
242    long long word aligned */
243 static BufferDesc txd __attribute__ ((aligned(8)));
244 static BufferDesc rxd[NUM_RX_DESC] __attribute__ ((aligned(8)));
245 static unsigned char txb[TX_BUF_SIZE] __attribute__ ((aligned(8)));
246 static unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE]
247     __attribute__ ((aligned(8)));
248 
249 /* Function Prototypes */
250 static int mdio_read(struct eth_device *dev, int phy_id, int addr);
251 static void mdio_write(struct eth_device *dev, int phy_id, int addr, int value);
252 static void mdio_sync(struct eth_device *dev, u32 offset);
253 static int ns8382x_init(struct eth_device *dev, bd_t * bis);
254 static void ns8382x_reset(struct eth_device *dev);
255 static void ns8382x_init_rxfilter(struct eth_device *dev);
256 static void ns8382x_init_txd(struct eth_device *dev);
257 static void ns8382x_init_rxd(struct eth_device *dev);
258 static void ns8382x_set_rx_mode(struct eth_device *dev);
259 static void ns8382x_check_duplex(struct eth_device *dev);
260 static int ns8382x_send(struct eth_device *dev, volatile void *packet,
261 			int length);
262 static int ns8382x_poll(struct eth_device *dev);
263 static void ns8382x_disable(struct eth_device *dev);
264 
265 static struct pci_device_id supported[] = {
266 	{PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83820},
267 	{}
268 };
269 
270 #define bus_to_phys(a)	pci_mem_to_phys((pci_dev_t)dev->priv, a)
271 #define phys_to_bus(a)	pci_phys_to_mem((pci_dev_t)dev->priv, a)
272 
273 static inline int
274 INW(struct eth_device *dev, u_long addr)
275 {
276 	return le16_to_cpu(*(vu_short *) (addr + dev->iobase));
277 }
278 
279 static int
280 INL(struct eth_device *dev, u_long addr)
281 {
282 	return le32_to_cpu(*(vu_long *) (addr + dev->iobase));
283 }
284 
285 static inline void
286 OUTW(struct eth_device *dev, int command, u_long addr)
287 {
288 	*(vu_short *) ((addr + dev->iobase)) = cpu_to_le16(command);
289 }
290 
291 static inline void
292 OUTL(struct eth_device *dev, int command, u_long addr)
293 {
294 	*(vu_long *) ((addr + dev->iobase)) = cpu_to_le32(command);
295 }
296 
297 /* Function: ns8382x_initialize
298  * Description: Retrieves the MAC address of the card, and sets up some
299  *  globals required by other routines, and initializes the NIC, making it
300  *  ready to send and receive packets.
301  * Side effects: initializes ns8382xs, ready to recieve packets.
302  * Returns:   int:          number of cards found
303  */
304 
305 int
306 ns8382x_initialize(bd_t * bis)
307 {
308 	pci_dev_t devno;
309 	int card_number = 0;
310 	struct eth_device *dev;
311 	u32 iobase, status;
312 	int i, idx = 0;
313 	u32 phyAddress;
314 	u32 tmp;
315 	u32 chip_config;
316 
317 	while (1) {		/* Find PCI device(s) */
318 		if ((devno = pci_find_devices(supported, idx++)) < 0)
319 			break;
320 
321 		pci_read_config_dword(devno, PCI_BASE_ADDRESS_1, &iobase);
322 		iobase &= ~0x3;	/* 1: unused and 0:I/O Space Indicator */
323 
324 #ifdef NS8382X_DEBUG
325 		printf("ns8382x: NatSemi dp8382x @ 0x%x\n", iobase);
326 #endif
327 
328 		pci_write_config_dword(devno, PCI_COMMAND,
329 				       PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
330 
331 		/* Check if I/O accesses and Bus Mastering are enabled. */
332 		pci_read_config_dword(devno, PCI_COMMAND, &status);
333 		if (!(status & PCI_COMMAND_MEMORY)) {
334 			printf("Error: Can not enable MEM access.\n");
335 			continue;
336 		} else if (!(status & PCI_COMMAND_MASTER)) {
337 			printf("Error: Can not enable Bus Mastering.\n");
338 			continue;
339 		}
340 
341 		dev = (struct eth_device *) malloc(sizeof *dev);
342 
343 		sprintf(dev->name, "dp8382x#%d", card_number);
344 		dev->iobase = bus_to_phys(iobase);
345 		dev->priv = (void *) devno;
346 		dev->init = ns8382x_init;
347 		dev->halt = ns8382x_disable;
348 		dev->send = ns8382x_send;
349 		dev->recv = ns8382x_poll;
350 
351 		/* ns8382x has a non-standard PM control register
352 		 * in PCI config space.  Some boards apparently need
353 		 * to be brought to D0 in this manner.  */
354 		pci_read_config_dword(devno, PCIPM, &tmp);
355 		if (tmp & (0x03 | 0x100)) {	/* D0 state, disable PME assertion */
356 			u32 newtmp = tmp & ~(0x03 | 0x100);
357 			pci_write_config_dword(devno, PCIPM, newtmp);
358 		}
359 
360 		/* get MAC address */
361 		for (i = 0; i < 3; i++) {
362 			u32 data;
363 			char *mac = (char *)&dev->enetaddr[i * 2];
364 
365 			OUTL(dev, i * 2, RxFilterAddr);
366 			data = INL(dev, RxFilterData);
367 			*mac++ = data;
368 			*mac++ = data >> 8;
369 		}
370 		/* get PHY address, can't be zero */
371 		for (phyAddress = 1; phyAddress < 32; phyAddress++) {
372 			u32 rev, phy1;
373 
374 			phy1 = mdio_read(dev, phyAddress, PHYIDR1);
375 			if (phy1 == 0x2000) {	/*check for 83861/91 */
376 				rev = mdio_read(dev, phyAddress, PHYIDR2);
377 				if ((rev & ~(0x000f)) == 0x00005c50 ||
378 				    (rev & ~(0x000f)) == 0x00005c60) {
379 #ifdef NS8382X_DEBUG
380 					printf("phy rev is %x\n", rev);
381 					printf("phy address is %x\n",
382 					       phyAddress);
383 #endif
384 					break;
385 				}
386 			}
387 		}
388 
389 		/* set phy to autonegotiate && advertise everything */
390 		mdio_write(dev, phyAddress, KTCR,
391 			   (ktcr_adv_1000H | ktcr_adv_1000F));
392 		mdio_write(dev, phyAddress, ANAR,
393 			   (anar_adv_100F | anar_adv_100H | anar_adv_10H |
394 			    anar_adv_10F | anar_ieee_8023));
395 		mdio_write(dev, phyAddress, BMCR, 0x0);	/*restore */
396 		mdio_write(dev, phyAddress, BMCR,
397 			   (Bmcr_AutoNegEn | Bmcr_RstAutoNeg));
398 		/* Reset the chip to erase any previous misconfiguration. */
399 		OUTL(dev, (ChipReset), ChipCmd);
400 
401 		chip_config = INL(dev, ChipConfig);
402 		/* reset the phy */
403 		OUTL(dev, (chip_config | PhyRst), ChipConfig);
404 		/* power up and initialize transceiver */
405 		OUTL(dev, (chip_config & ~(PhyDis)), ChipConfig);
406 
407 		mdio_sync(dev, EECtrl);
408 #ifdef NS8382X_DEBUG
409 		{
410 			u32 chpcfg =
411 			    INL(dev, ChipConfig) ^ SpeedStatus_Polarity;
412 
413 			printf("%s: Transceiver 10%s %s duplex.\n", dev->name,
414 			       (chpcfg & GigSpeed) ? "00" : (chpcfg & HundSpeed)
415 			       ? "0" : "",
416 			       chpcfg & FullDuplex ? "full" : "half");
417 			printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
418 			       dev->enetaddr[0], dev->enetaddr[1],
419 			       dev->enetaddr[2], dev->enetaddr[3],
420 			       dev->enetaddr[4], dev->enetaddr[5]);
421 		}
422 #endif
423 		/* Disable PME:
424 		 * The PME bit is initialized from the EEPROM contents.
425 		 * PCI cards probably have PME disabled, but motherboard
426 		 * implementations may have PME set to enable WakeOnLan.
427 		 * With PME set the chip will scan incoming packets but
428 		 * nothing will be written to memory. */
429 		SavedClkRun = INL(dev, ClkRun);
430 		OUTL(dev, SavedClkRun & ~0x100, ClkRun);
431 
432 		eth_register(dev);
433 
434 		card_number++;
435 
436 		pci_write_config_byte(devno, PCI_LATENCY_TIMER, 0x60);
437 
438 		udelay(10 * 1000);
439 	}
440 	return card_number;
441 }
442 
443 /*  MII transceiver control section.
444 	Read and write MII registers using software-generated serial MDIO
445 	protocol.  See the MII specifications or DP83840A data sheet for details.
446 
447 	The maximum data clock rate is 2.5 Mhz.  To meet minimum timing we
448 	must flush writes to the PCI bus with a PCI read. */
449 #define mdio_delay(mdio_addr) INL(dev, mdio_addr)
450 
451 #define MDIO_EnbIn  (0)
452 #define MDIO_WRITE0 (MDIO_EnbOutput)
453 #define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput)
454 
455 /* Generate the preamble required for initial synchronization and
456    a few older transceivers. */
457 static void
458 mdio_sync(struct eth_device *dev, u32 offset)
459 {
460 	int bits = 32;
461 
462 	/* Establish sync by sending at least 32 logic ones. */
463 	while (--bits >= 0) {
464 		OUTL(dev, MDIO_WRITE1, offset);
465 		mdio_delay(offset);
466 		OUTL(dev, MDIO_WRITE1 | MDIO_ShiftClk, offset);
467 		mdio_delay(offset);
468 	}
469 }
470 
471 static int
472 mdio_read(struct eth_device *dev, int phy_id, int addr)
473 {
474 	int mii_cmd = (0xf6 << 10) | (phy_id << 5) | addr;
475 	int i, retval = 0;
476 
477 	/* Shift the read command bits out. */
478 	for (i = 15; i >= 0; i--) {
479 		int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
480 
481 		OUTL(dev, dataval, EECtrl);
482 		mdio_delay(EECtrl);
483 		OUTL(dev, dataval | MDIO_ShiftClk, EECtrl);
484 		mdio_delay(EECtrl);
485 	}
486 	/* Read the two transition, 16 data, and wire-idle bits. */
487 	for (i = 19; i > 0; i--) {
488 		OUTL(dev, MDIO_EnbIn, EECtrl);
489 		mdio_delay(EECtrl);
490 		retval =
491 		    (retval << 1) | ((INL(dev, EECtrl) & MDIO_Data) ? 1 : 0);
492 		OUTL(dev, MDIO_EnbIn | MDIO_ShiftClk, EECtrl);
493 		mdio_delay(EECtrl);
494 	}
495 	return (retval >> 1) & 0xffff;
496 }
497 
498 static void
499 mdio_write(struct eth_device *dev, int phy_id, int addr, int value)
500 {
501 	int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (addr << 18) | value;
502 	int i;
503 
504 	/* Shift the command bits out. */
505 	for (i = 31; i >= 0; i--) {
506 		int dataval = (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
507 
508 		OUTL(dev, dataval, EECtrl);
509 		mdio_delay(EECtrl);
510 		OUTL(dev, dataval | MDIO_ShiftClk, EECtrl);
511 		mdio_delay(EECtrl);
512 	}
513 	/* Clear out extra bits. */
514 	for (i = 2; i > 0; i--) {
515 		OUTL(dev, MDIO_EnbIn, EECtrl);
516 		mdio_delay(EECtrl);
517 		OUTL(dev, MDIO_EnbIn | MDIO_ShiftClk, EECtrl);
518 		mdio_delay(EECtrl);
519 	}
520 	return;
521 }
522 
523 /* Function: ns8382x_init
524  * Description: resets the ethernet controller chip and configures
525  *    registers and data structures required for sending and receiving packets.
526  * Arguments: struct eth_device *dev:       NIC data structure
527  * returns:	int.
528  */
529 
530 static int
531 ns8382x_init(struct eth_device *dev, bd_t * bis)
532 {
533 	u32 config;
534 
535 	ns8382x_reset(dev);
536 
537 	/* Disable PME:
538 	 * The PME bit is initialized from the EEPROM contents.
539 	 * PCI cards probably have PME disabled, but motherboard
540 	 * implementations may have PME set to enable WakeOnLan.
541 	 * With PME set the chip will scan incoming packets but
542 	 * nothing will be written to memory. */
543 	OUTL(dev, SavedClkRun & ~0x100, ClkRun);
544 
545 	ns8382x_init_rxfilter(dev);
546 	ns8382x_init_txd(dev);
547 	ns8382x_init_rxd(dev);
548 
549 	/*set up ChipConfig */
550 	config = INL(dev, ChipConfig);
551 	/*turn off 64 bit ops && Ten-bit interface
552 	 * && big-endian mode && extended status */
553 	config &= ~(TBIEn | Mode1000 | T64En | D64En | M64En | BEMode | PhyDis | ExtStEn);
554 	OUTL(dev, config, ChipConfig);
555 
556 	/* Configure the PCI bus bursts and FIFO thresholds. */
557 	tx_config = TxCarrierIgn | TxHeartIgn | TxAutoPad
558 	    | TxCollRetry | TxMxdma_1024 | (0x1002);
559 	rx_config = RxMxdma_1024 | 0x20;
560 #ifdef NS8382X_DEBUG
561 	printf("%s: Setting TxConfig Register %#08X\n", dev->name, tx_config);
562 	printf("%s: Setting RxConfig Register %#08X\n", dev->name, rx_config);
563 #endif
564 	OUTL(dev, tx_config, TxConfig);
565 	OUTL(dev, rx_config, RxConfig);
566 
567 	/*turn off priority queueing */
568 	OUTL(dev, 0x0, PriQueue);
569 
570 	ns8382x_check_duplex(dev);
571 	ns8382x_set_rx_mode(dev);
572 
573 	OUTL(dev, (RxOn | TxOn), ChipCmd);
574 	return 1;
575 }
576 
577 /* Function: ns8382x_reset
578  * Description: soft resets the controller chip
579  * Arguments: struct eth_device *dev:          NIC data structure
580  * Returns:   void.
581  */
582 static void
583 ns8382x_reset(struct eth_device *dev)
584 {
585 	OUTL(dev, ChipReset, ChipCmd);
586 	while (INL(dev, ChipCmd))
587 		/*wait until done */ ;
588 	OUTL(dev, 0, IntrMask);
589 	OUTL(dev, 0, IntrEnable);
590 }
591 
592 /* Function: ns8382x_init_rxfilter
593  * Description: sets receive filter address to our MAC address
594  * Arguments: struct eth_device *dev:          NIC data structure
595  * returns:   void.
596  */
597 
598 static void
599 ns8382x_init_rxfilter(struct eth_device *dev)
600 {
601 	int i;
602 
603 	for (i = 0; i < ETH_ALEN; i += 2) {
604 		OUTL(dev, i, RxFilterAddr);
605 		OUTW(dev, dev->enetaddr[i] + (dev->enetaddr[i + 1] << 8),
606 		     RxFilterData);
607 	}
608 }
609 
610 /* Function: ns8382x_init_txd
611  * Description: initializes the Tx descriptor
612  * Arguments: struct eth_device *dev:          NIC data structure
613  * returns:   void.
614  */
615 
616 static void
617 ns8382x_init_txd(struct eth_device *dev)
618 {
619 	txd.link = (u32) 0;
620 	txd.bufptr = cpu_to_le32((u32) & txb[0]);
621 	txd.cmdsts = (u32) 0;
622 	txd.extsts = (u32) 0;
623 
624 	OUTL(dev, 0x0, TxRingPtrHi);
625 	OUTL(dev, phys_to_bus((u32)&txd), TxRingPtr);
626 #ifdef NS8382X_DEBUG
627 	printf("ns8382x_init_txd: TX descriptor register loaded with: %#08X (&txd: %p)\n",
628 	       INL(dev, TxRingPtr), &txd);
629 #endif
630 }
631 
632 /* Function: ns8382x_init_rxd
633  * Description: initializes the Rx descriptor ring
634  * Arguments: struct eth_device *dev:          NIC data structure
635  * Returns:   void.
636  */
637 
638 static void
639 ns8382x_init_rxd(struct eth_device *dev)
640 {
641 	int i;
642 
643 	OUTL(dev, 0x0, RxRingPtrHi);
644 
645 	cur_rx = 0;
646 	for (i = 0; i < NUM_RX_DESC; i++) {
647 		rxd[i].link =
648 		    cpu_to_le32((i + 1 <
649 				 NUM_RX_DESC) ? (u32) & rxd[i +
650 							    1] : (u32) &
651 				rxd[0]);
652 		rxd[i].extsts = cpu_to_le32((u32) 0x0);
653 		rxd[i].cmdsts = cpu_to_le32((u32) RX_BUF_SIZE);
654 		rxd[i].bufptr = cpu_to_le32((u32) & rxb[i * RX_BUF_SIZE]);
655 #ifdef NS8382X_DEBUG
656 		printf
657 		    ("ns8382x_init_rxd: rxd[%d]=%p link=%X cmdsts=%X bufptr=%X\n",
658 		     i, &rxd[i], le32_to_cpu(rxd[i].link),
659 		     le32_to_cpu(rxd[i].cmdsts), le32_to_cpu(rxd[i].bufptr));
660 #endif
661 	}
662 	OUTL(dev, phys_to_bus((u32) & rxd), RxRingPtr);
663 
664 #ifdef NS8382X_DEBUG
665 	printf("ns8382x_init_rxd: RX descriptor register loaded with: %X\n",
666 	       INL(dev, RxRingPtr));
667 #endif
668 }
669 
670 /* Function: ns8382x_set_rx_mode
671  * Description:
672  *    sets the receive mode to accept all broadcast packets and packets
673  *    with our MAC address, and reject all multicast packets.
674  * Arguments: struct eth_device *dev:          NIC data structure
675  * Returns:   void.
676  */
677 
678 static void
679 ns8382x_set_rx_mode(struct eth_device *dev)
680 {
681 	u32 rx_mode = 0x0;
682 	/*spec says RxFilterEnable has to be 0 for rest of
683 	 * this stuff to be properly configured. Linux driver
684 	 * seems to support this*/
685 /*	OUTL(dev, rx_mode, RxFilterAddr);*/
686 	rx_mode = (RxFilterEnable | AcceptAllBroadcast | AcceptPerfectMatch);
687 	OUTL(dev, rx_mode, RxFilterAddr);
688 	printf("ns8382x_set_rx_mode: set to %X\n", rx_mode);
689 	/*now we turn RxFilterEnable back on */
690 	/*rx_mode |= RxFilterEnable;
691 	OUTL(dev, rx_mode, RxFilterAddr);*/
692 }
693 
694 static void
695 ns8382x_check_duplex(struct eth_device *dev)
696 {
697 	int gig = 0;
698 	int hun = 0;
699 	int duplex = 0;
700 	int config = (INL(dev, ChipConfig) ^ SpeedStatus_Polarity);
701 
702 	duplex = (config & FullDuplex) ? 1 : 0;
703 	gig = (config & GigSpeed) ? 1 : 0;
704 	hun = (config & HundSpeed) ? 1 : 0;
705 #ifdef NS8382X_DEBUG
706 	printf("%s: Setting 10%s %s-duplex based on negotiated link"
707 	       " capability.\n", dev->name, (gig) ? "00" : (hun) ? "0" : "",
708 	       duplex ? "full" : "half");
709 #endif
710 	if (duplex) {
711 		rx_config |= RxAcceptTx;
712 		tx_config |= (TxCarrierIgn | TxHeartIgn);
713 	} else {
714 		rx_config &= ~RxAcceptTx;
715 		tx_config &= ~(TxCarrierIgn | TxHeartIgn);
716 	}
717 #ifdef NS8382X_DEBUG
718 	printf("%s: Resetting TxConfig Register %#08X\n", dev->name, tx_config);
719 	printf("%s: Resetting RxConfig Register %#08X\n", dev->name, rx_config);
720 #endif
721 	OUTL(dev, tx_config, TxConfig);
722 	OUTL(dev, rx_config, RxConfig);
723 
724 	/*if speed is 10 or 100, remove MODE1000,
725 	 * if it's 1000, then set it */
726 	config = INL(dev, ChipConfig);
727 	if (gig)
728 		config |= Mode1000;
729 	else
730 		config &= ~Mode1000;
731 
732 #ifdef NS8382X_DEBUG
733 	printf("%s: %setting Mode1000\n", dev->name, (gig) ? "S" : "Uns");
734 #endif
735 	OUTL(dev, config, ChipConfig);
736 }
737 
738 /* Function: ns8382x_send
739  * Description: transmits a packet and waits for completion or timeout.
740  * Returns:   void.  */
741 static int
742 ns8382x_send(struct eth_device *dev, volatile void *packet, int length)
743 {
744 	u32 i, status = 0;
745 	vu_long tx_stat = 0;
746 
747 	/* Stop the transmitter */
748 	OUTL(dev, TxOff, ChipCmd);
749 #ifdef NS8382X_DEBUG
750 	printf("ns8382x_send: sending %d bytes\n", (int)length);
751 #endif
752 
753 	/* set the transmit buffer descriptor and enable Transmit State Machine */
754 	txd.link = cpu_to_le32(0x0);
755 	txd.bufptr = cpu_to_le32(phys_to_bus((u32)packet));
756 	txd.extsts = cpu_to_le32(0x0);
757 	txd.cmdsts = cpu_to_le32(DescOwn | length);
758 
759 	/* load Transmit Descriptor Register */
760 	OUTL(dev, phys_to_bus((u32) & txd), TxRingPtr);
761 #ifdef NS8382X_DEBUG
762 	printf("ns8382x_send: TX descriptor register loaded with: %#08X\n",
763 	       INL(dev, TxRingPtr));
764 	printf("\ttxd.link:%X\tbufp:%X\texsts:%X\tcmdsts:%X\n",
765 	       le32_to_cpu(txd.link), le32_to_cpu(txd.bufptr),
766 	       le32_to_cpu(txd.extsts), le32_to_cpu(txd.cmdsts));
767 #endif
768 	/* restart the transmitter */
769 	OUTL(dev, TxOn, ChipCmd);
770 
771 	for (i = 0; (tx_stat = le32_to_cpu(txd.cmdsts)) & DescOwn; i++) {
772 		if (i >= TOUT_LOOP) {
773 			printf ("%s: tx error buffer not ready: txd.cmdsts %#X\n",
774 			     dev->name, tx_stat);
775 			goto Done;
776 		}
777 	}
778 
779 	if (!(tx_stat & DescPktOK)) {
780 		printf("ns8382x_send: Transmit error, Tx status %X.\n", tx_stat);
781 		goto Done;
782 	}
783 #ifdef NS8382X_DEBUG
784 	printf("ns8382x_send: tx_stat: %#08X\n", tx_stat);
785 #endif
786 
787 	status = 1;
788       Done:
789 	return status;
790 }
791 
792 /* Function: ns8382x_poll
793  * Description: checks for a received packet and returns it if found.
794  * Arguments: struct eth_device *dev:          NIC data structure
795  * Returns:   1 if    packet was received.
796  *            0 if no packet was received.
797  * Side effects:
798  *            Returns (copies) the packet to the array dev->packet.
799  *            Returns the length of the packet.
800  */
801 
802 static int
803 ns8382x_poll(struct eth_device *dev)
804 {
805 	int retstat = 0;
806 	int length = 0;
807 	vu_long rx_status = le32_to_cpu(rxd[cur_rx].cmdsts);
808 
809 	if (!(rx_status & (u32) DescOwn))
810 		return retstat;
811 #ifdef NS8382X_DEBUG
812 	printf("ns8382x_poll: got a packet: cur_rx:%u, status:%lx\n",
813 	       cur_rx, rx_status);
814 #endif
815 	length = (rx_status & DSIZE) - CRC_SIZE;
816 
817 	if ((rx_status & (DescMore | DescPktOK | DescRxLong)) != DescPktOK) {
818 		/* corrupted packet received */
819 		printf("ns8382x_poll: Corrupted packet, status:%lx\n", rx_status);
820 		retstat = 0;
821 	} else {
822 		/* give packet to higher level routine */
823 		NetReceive((rxb + cur_rx * RX_BUF_SIZE), length);
824 		retstat = 1;
825 	}
826 
827 	/* return the descriptor and buffer to receive ring */
828 	rxd[cur_rx].cmdsts = cpu_to_le32(RX_BUF_SIZE);
829 	rxd[cur_rx].bufptr = cpu_to_le32((u32) & rxb[cur_rx * RX_BUF_SIZE]);
830 
831 	if (++cur_rx == NUM_RX_DESC)
832 		cur_rx = 0;
833 
834 	/* re-enable the potentially idle receive state machine */
835 	OUTL(dev, RxOn, ChipCmd);
836 
837 	return retstat;
838 }
839 
840 /* Function: ns8382x_disable
841  * Description: Turns off interrupts and stops Tx and Rx engines
842  * Arguments: struct eth_device *dev:          NIC data structure
843  * Returns:   void.
844  */
845 
846 static void
847 ns8382x_disable(struct eth_device *dev)
848 {
849 	/* Disable interrupts using the mask. */
850 	OUTL(dev, 0, IntrMask);
851 	OUTL(dev, 0, IntrEnable);
852 
853 	/* Stop the chip's Tx and Rx processes. */
854 	OUTL(dev, (RxOff | TxOff), ChipCmd);
855 
856 	/* Restore PME enable bit */
857 	OUTL(dev, SavedClkRun, ClkRun);
858 }
859