1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74#include <common.h>
75#include <malloc.h>
76#include <net.h>
77#include <netdev.h>
78#include <asm/io.h>
79#include <pci.h>
80
81#define RTL_TIMEOUT 100000
82
83#define ETH_FRAME_LEN 1514
84#define ETH_ALEN 6
85#define ETH_ZLEN 60
86
87
88
89#define TX_FIFO_THRESH 256
90#define RX_FIFO_THRESH 4
91#define RX_DMA_BURST 4
92#define TX_DMA_BURST 4
93#define NUM_TX_DESC 4
94#define TX_BUF_SIZE ETH_FRAME_LEN
95#define RX_BUF_LEN_IDX 0
96#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
97
98#define DEBUG_TX 0
99#define DEBUG_RX 0
100
101#define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)dev->priv, a)
102#define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)dev->priv, a)
103
104
105enum RTL8139_registers {
106 MAC0=0,
107 MAR0=8,
108 TxStatus0=0x10,
109 TxAddr0=0x20,
110 RxBuf=0x30, RxEarlyCnt=0x34, RxEarlyStatus=0x36,
111 ChipCmd=0x37, RxBufPtr=0x38, RxBufAddr=0x3A,
112 IntrMask=0x3C, IntrStatus=0x3E,
113 TxConfig=0x40, RxConfig=0x44,
114 Timer=0x48,
115 RxMissed=0x4C,
116 Cfg9346=0x50, Config0=0x51, Config1=0x52,
117 TimerIntrReg=0x54,
118 MediaStatus=0x58,
119 Config3=0x59,
120 MultiIntr=0x5C,
121 RevisionID=0x5E,
122 TxSummary=0x60,
123 MII_BMCR=0x62, MII_BMSR=0x64, NWayAdvert=0x66, NWayLPAR=0x68,
124 NWayExpansion=0x6A,
125 DisconnectCnt=0x6C, FalseCarrierCnt=0x6E,
126 NWayTestReg=0x70,
127 RxCnt=0x72,
128 CSCR=0x74,
129 PhyParm1=0x78,TwisterParm=0x7c,PhyParm2=0x80,
130
131
132};
133
134enum ChipCmdBits {
135 CmdReset=0x10, CmdRxEnb=0x08, CmdTxEnb=0x04, RxBufEmpty=0x01, };
136
137
138enum IntrStatusBits {
139 PCIErr=0x8000, PCSTimeout=0x4000, CableLenChange= 0x2000,
140 RxFIFOOver=0x40, RxUnderrun=0x20, RxOverflow=0x10,
141 TxErr=0x08, TxOK=0x04, RxErr=0x02, RxOK=0x01,
142};
143enum TxStatusBits {
144 TxHostOwns=0x2000, TxUnderrun=0x4000, TxStatOK=0x8000,
145 TxOutOfWindow=0x20000000, TxAborted=0x40000000,
146 TxCarrierLost=0x80000000,
147};
148enum RxStatusBits {
149 RxMulticast=0x8000, RxPhysical=0x4000, RxBroadcast=0x2000,
150 RxBadSymbol=0x0020, RxRunt=0x0010, RxTooLong=0x0008, RxCRCErr=0x0004,
151 RxBadAlign=0x0002, RxStatusOK=0x0001,
152};
153
154enum MediaStatusBits {
155 MSRTxFlowEnable=0x80, MSRRxFlowEnable=0x40, MSRSpeed10=0x08,
156 MSRLinkFail=0x04, MSRRxPauseFlag=0x02, MSRTxPauseFlag=0x01,
157};
158
159enum MIIBMCRBits {
160 BMCRReset=0x8000, BMCRSpeed100=0x2000, BMCRNWayEnable=0x1000,
161 BMCRRestartNWay=0x0200, BMCRDuplex=0x0100,
162};
163
164enum CSCRBits {
165 CSCR_LinkOKBit=0x0400, CSCR_LinkChangeBit=0x0800,
166 CSCR_LinkStatusBits=0x0f000, CSCR_LinkDownOffCmd=0x003c0,
167 CSCR_LinkDownCmd=0x0f3c0,
168};
169
170
171enum rx_mode_bits {
172 RxCfgWrap=0x80,
173 AcceptErr=0x20, AcceptRunt=0x10, AcceptBroadcast=0x08,
174 AcceptMulticast=0x04, AcceptMyPhys=0x02, AcceptAllPhys=0x01,
175};
176
177static int ioaddr;
178static unsigned int cur_rx,cur_tx;
179
180
181static unsigned char tx_buffer[TX_BUF_SIZE] __attribute__((aligned(4)));
182static unsigned char rx_ring[RX_BUF_LEN+16] __attribute__((aligned(4)));
183
184static int rtl8139_probe(struct eth_device *dev, bd_t *bis);
185static int read_eeprom(int location, int addr_len);
186static void rtl_reset(struct eth_device *dev);
187static int rtl_transmit(struct eth_device *dev, void *packet, int length);
188static int rtl_poll(struct eth_device *dev);
189static void rtl_disable(struct eth_device *dev);
190#ifdef CONFIG_MCAST_TFTP
191static int rtl_bcast_addr(struct eth_device *dev, const u8 *bcast_mac, u8 set)
192{
193 return (0);
194}
195#endif
196
197static struct pci_device_id supported[] = {
198 {PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139},
199 {PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_8139},
200 {}
201};
202
203int rtl8139_initialize(bd_t *bis)
204{
205 pci_dev_t devno;
206 int card_number = 0;
207 struct eth_device *dev;
208 u32 iobase;
209 int idx=0;
210
211 while(1){
212
213 if ((devno = pci_find_devices(supported, idx++)) < 0)
214 break;
215
216 pci_read_config_dword(devno, PCI_BASE_ADDRESS_1, &iobase);
217 iobase &= ~0xf;
218
219 debug ("rtl8139: REALTEK RTL8139 @0x%x\n", iobase);
220
221 dev = (struct eth_device *)malloc(sizeof *dev);
222 if (!dev) {
223 printf("Can not allocate memory of rtl8139\n");
224 break;
225 }
226 memset(dev, 0, sizeof(*dev));
227
228 sprintf (dev->name, "RTL8139#%d", card_number);
229
230 dev->priv = (void *) devno;
231 dev->iobase = (int)bus_to_phys(iobase);
232 dev->init = rtl8139_probe;
233 dev->halt = rtl_disable;
234 dev->send = rtl_transmit;
235 dev->recv = rtl_poll;
236#ifdef CONFIG_MCAST_TFTP
237 dev->mcast = rtl_bcast_addr;
238#endif
239
240 eth_register (dev);
241
242 card_number++;
243
244 pci_write_config_byte (devno, PCI_LATENCY_TIMER, 0x20);
245
246 udelay (10 * 1000);
247 }
248
249 return card_number;
250}
251
252static int rtl8139_probe(struct eth_device *dev, bd_t *bis)
253{
254 int i;
255 int addr_len;
256 unsigned short *ap = (unsigned short *)dev->enetaddr;
257
258 ioaddr = dev->iobase;
259
260
261 outb(0x00, ioaddr + Config1);
262
263 addr_len = read_eeprom(0,8) == 0x8129 ? 8 : 6;
264 for (i = 0; i < 3; i++)
265 *ap++ = le16_to_cpu (read_eeprom(i + 7, addr_len));
266
267 rtl_reset(dev);
268
269 if (inb(ioaddr + MediaStatus) & MSRLinkFail) {
270 printf("Cable not connected or other link failure\n");
271 return -1 ;
272 }
273
274 return 0;
275}
276
277
278
279
280#define EE_SHIFT_CLK 0x04
281#define EE_CS 0x08
282#define EE_DATA_WRITE 0x02
283#define EE_WRITE_0 0x00
284#define EE_WRITE_1 0x02
285#define EE_DATA_READ 0x01
286#define EE_ENB (0x80 | EE_CS)
287
288
289
290
291
292
293#define eeprom_delay() inl(ee_addr)
294
295
296#define EE_WRITE_CMD (5)
297#define EE_READ_CMD (6)
298#define EE_ERASE_CMD (7)
299
300static int read_eeprom(int location, int addr_len)
301{
302 int i;
303 unsigned int retval = 0;
304 long ee_addr = ioaddr + Cfg9346;
305 int read_cmd = location | (EE_READ_CMD << addr_len);
306
307 outb(EE_ENB & ~EE_CS, ee_addr);
308 outb(EE_ENB, ee_addr);
309 eeprom_delay();
310
311
312 for (i = 4 + addr_len; i >= 0; i--) {
313 int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
314 outb(EE_ENB | dataval, ee_addr);
315 eeprom_delay();
316 outb(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
317 eeprom_delay();
318 }
319 outb(EE_ENB, ee_addr);
320 eeprom_delay();
321
322 for (i = 16; i > 0; i--) {
323 outb(EE_ENB | EE_SHIFT_CLK, ee_addr);
324 eeprom_delay();
325 retval = (retval << 1) | ((inb(ee_addr) & EE_DATA_READ) ? 1 : 0);
326 outb(EE_ENB, ee_addr);
327 eeprom_delay();
328 }
329
330
331 outb(~EE_CS, ee_addr);
332 eeprom_delay();
333 return retval;
334}
335
336static const unsigned int rtl8139_rx_config =
337 (RX_BUF_LEN_IDX << 11) |
338 (RX_FIFO_THRESH << 13) |
339 (RX_DMA_BURST << 8);
340
341static void set_rx_mode(struct eth_device *dev) {
342 unsigned int mc_filter[2];
343 int rx_mode;
344
345 rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
346 mc_filter[1] = mc_filter[0] = 0xffffffff;
347
348 outl(rtl8139_rx_config | rx_mode, ioaddr + RxConfig);
349
350 outl(mc_filter[0], ioaddr + MAR0 + 0);
351 outl(mc_filter[1], ioaddr + MAR0 + 4);
352}
353
354static void rtl_reset(struct eth_device *dev)
355{
356 int i;
357
358 outb(CmdReset, ioaddr + ChipCmd);
359
360 cur_rx = 0;
361 cur_tx = 0;
362
363
364 for (i=0; i<100; ++i){
365 if ((inb(ioaddr + ChipCmd) & CmdReset) == 0) break;
366 udelay (100);
367 }
368
369
370 for (i = 0; i < ETH_ALEN; i++)
371 outb(dev->enetaddr[i], ioaddr + MAC0 + i);
372
373
374 outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
375 outl((RX_FIFO_THRESH<<13) | (RX_BUF_LEN_IDX<<11) | (RX_DMA_BURST<<8),
376 ioaddr + RxConfig);
377 outl((TX_DMA_BURST<<8)|0x03000000, ioaddr + TxConfig);
378
379
380
381
382
383
384
385
386
387 debug_cond(DEBUG_RX,
388 "rx ring address is %lX\n",(unsigned long)rx_ring);
389 flush_cache((unsigned long)rx_ring, RX_BUF_LEN);
390 outl(phys_to_bus((int)rx_ring), ioaddr + RxBuf);
391
392
393
394
395
396 outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
397
398 outl(rtl8139_rx_config, ioaddr + RxConfig);
399
400
401 outl(0, ioaddr + RxMissed);
402
403
404 set_rx_mode(dev);
405
406
407 outw(0, ioaddr + IntrMask);
408}
409
410static int rtl_transmit(struct eth_device *dev, void *packet, int length)
411{
412 unsigned int status;
413 unsigned long txstatus;
414 unsigned int len = length;
415 int i = 0;
416
417 ioaddr = dev->iobase;
418
419 memcpy((char *)tx_buffer, (char *)packet, (int)length);
420
421 debug_cond(DEBUG_TX, "sending %d bytes\n", len);
422
423
424
425 while (len < ETH_ZLEN) {
426 tx_buffer[len++] = '\0';
427 }
428
429 flush_cache((unsigned long)tx_buffer, length);
430 outl(phys_to_bus((int)tx_buffer), ioaddr + TxAddr0 + cur_tx*4);
431 outl(((TX_FIFO_THRESH<<11) & 0x003f0000) | len,
432 ioaddr + TxStatus0 + cur_tx*4);
433
434 do {
435 status = inw(ioaddr + IntrStatus);
436
437
438
439 outw(status & (TxOK | TxErr | PCIErr), ioaddr + IntrStatus);
440 if ((status & (TxOK | TxErr | PCIErr)) != 0) break;
441 udelay(10);
442 } while (i++ < RTL_TIMEOUT);
443
444 txstatus = inl(ioaddr + TxStatus0 + cur_tx*4);
445
446 if (status & TxOK) {
447 cur_tx = (cur_tx + 1) % NUM_TX_DESC;
448
449 debug_cond(DEBUG_TX,
450 "tx done, status %hX txstatus %lX\n",
451 status, txstatus);
452
453 return length;
454 } else {
455
456 debug_cond(DEBUG_TX,
457 "tx timeout/error (%d usecs), status %hX txstatus %lX\n",
458 10*i, status, txstatus);
459
460 rtl_reset(dev);
461
462 return 0;
463 }
464}
465
466static int rtl_poll(struct eth_device *dev)
467{
468 unsigned int status;
469 unsigned int ring_offs;
470 unsigned int rx_size, rx_status;
471 int length=0;
472
473 ioaddr = dev->iobase;
474
475 if (inb(ioaddr + ChipCmd) & RxBufEmpty) {
476 return 0;
477 }
478
479 status = inw(ioaddr + IntrStatus);
480
481 outw(status & ~(RxFIFOOver | RxOverflow | RxOK), ioaddr + IntrStatus);
482
483 debug_cond(DEBUG_RX, "rtl_poll: int %hX ", status);
484
485 ring_offs = cur_rx % RX_BUF_LEN;
486
487 rx_status = le32_to_cpu(*(unsigned int *)(rx_ring + ring_offs));
488 rx_size = rx_status >> 16;
489 rx_status &= 0xffff;
490
491 if ((rx_status & (RxBadSymbol|RxRunt|RxTooLong|RxCRCErr|RxBadAlign)) ||
492 (rx_size < ETH_ZLEN) || (rx_size > ETH_FRAME_LEN + 4)) {
493 printf("rx error %hX\n", rx_status);
494 rtl_reset(dev);
495 return 0;
496 }
497
498
499 length = rx_size - 4;
500 if (ring_offs+4+rx_size-4 > RX_BUF_LEN) {
501 int semi_count = RX_BUF_LEN - ring_offs - 4;
502 unsigned char rxdata[RX_BUF_LEN];
503
504 memcpy(rxdata, rx_ring + ring_offs + 4, semi_count);
505 memcpy(&(rxdata[semi_count]), rx_ring, rx_size-4-semi_count);
506
507 NetReceive(rxdata, length);
508 debug_cond(DEBUG_RX, "rx packet %d+%d bytes",
509 semi_count, rx_size-4-semi_count);
510 } else {
511 NetReceive(rx_ring + ring_offs + 4, length);
512 debug_cond(DEBUG_RX, "rx packet %d bytes", rx_size-4);
513 }
514 flush_cache((unsigned long)rx_ring, RX_BUF_LEN);
515
516 cur_rx = (cur_rx + rx_size + 4 + 3) & ~3;
517 outw(cur_rx - 16, ioaddr + RxBufPtr);
518
519
520
521 outw(status & (RxFIFOOver | RxOverflow | RxOK), ioaddr + IntrStatus);
522 return length;
523}
524
525static void rtl_disable(struct eth_device *dev)
526{
527 int i;
528
529 ioaddr = dev->iobase;
530
531
532 outb(CmdReset, ioaddr + ChipCmd);
533
534
535 for (i=0; i<100; ++i){
536 if ((inb(ioaddr + ChipCmd) & CmdReset) == 0) break;
537 udelay (100);
538 }
539}
540