iPXE
tulip.c
Go to the documentation of this file.
1 /* -*- Mode:C; c-basic-offset:4; -*- */
2 
3 /*
4  Tulip and clone Etherboot Driver
5 
6  By Marty Connor (mdc@etherboot.org)
7  Copyright (C) 2001 Entity Cyber, Inc.
8 
9  This software may be used and distributed according to the terms
10  of the GNU Public License, incorporated herein by reference.
11 
12  As of April 2001 this driver should support most tulip cards that
13  the Linux tulip driver supports because Donald Becker's Linux media
14  detection code is now included.
15 
16  Based on Ken Yap's Tulip Etherboot Driver and Donald Becker's
17  Linux Tulip Driver. Supports N-Way speed auto-configuration on
18  MX98715, MX98715A and MX98725. Support inexpensive PCI 10/100 cards
19  based on the Macronix MX987x5 chip, such as the SOHOware Fast
20  model SFA110A, and the LinkSYS model LNE100TX. The NetGear
21  model FA310X, based on the LC82C168 chip is supported.
22  The TRENDnet TE100-PCIA NIC which uses a genuine Intel 21143-PD
23  chipset is supported. Also, Davicom DM9102's.
24 
25  Documentation and source code used:
26  Source for Etherboot driver at
27  http://etherboot.sourceforge.net/
28  MX98715A Data Sheet and MX98715A Application Note
29  on http://www.macronix.com/ (PDF format files)
30  Source for Linux tulip driver at
31  http://cesdis.gsfc.nasa.gov/linux/drivers/tulip.html
32 
33  Adapted by Ken Yap from
34  FreeBSD netboot DEC 21143 driver
35  Author: David Sharp
36  date: Nov/98
37 
38  Some code fragments were taken from verious places, Ken Yap's
39  etherboot, FreeBSD's if_de.c, and various Linux related files.
40  DEC's manuals for the 21143 and SROM format were very helpful.
41  The Linux de driver development page has a number of links to
42  useful related information. Have a look at:
43  ftp://cesdis.gsfc.nasa.gov/pub/linux/drivers/tulip-devel.html
44 */
45 
46 FILE_LICENCE ( GPL_ANY );
47 
48 /*********************************************************************/
49 /* Revision History */
50 /*********************************************************************/
51 
52 /*
53  08 Feb 2005 Ramesh Chander chhabaramesh at yahoo.co.in added table entries
54  for SGThomson STE10/100A
55  07 Sep 2003 timlegge Multicast Support Added
56  11 Apr 2001 mdc [patch to etherboot 4.7.24]
57  Major rewrite to include Linux tulip driver media detection
58  code. This driver should support a lot more cards now.
59  16 Jul 2000 mdc 0.75b11
60  Added support for ADMtek 0985 Centaur-P, a "Comet" tulip clone
61  which is used on the LinkSYS LNE100TX v4.x cards. We already
62  support LNE100TX v2.0 cards, which use a different controller.
63  04 Jul 2000 jam ?
64  Added test of status after receiving a packet from the card.
65  Also uncommented the tulip_disable routine. Stray packets
66  seemed to be causing problems.
67  27 Apr 2000 njl ?
68  29 Feb 2000 mdc 0.75b7
69  Increased reset delay to 3 seconds because Macronix cards seem to
70  need more reset time before card comes back to a usable state.
71  26 Feb 2000 mdc 0.75b6
72  Added a 1 second delay after initializing the transmitter because
73  some cards seem to need the time or they drop the first packet
74  transmitted.
75  23 Feb 2000 mdc 0.75b5
76  removed udelay code and used currticks() for more reliable delay
77  code in reset pause and sanity timeouts. Added function prototypes
78  and TX debugging code.
79  21 Feb 2000 mdc patch to Etherboot 4.4.3
80  Incorporated patches from Bob Edwards and Paul Mackerras of
81  Linuxcare's OZLabs to deal with inefficiencies in tulip_transmit
82  and udelay. We now wait for packet transmission to complete
83  (or sanity timeout).
84  04 Feb 2000 Robert.Edwards@anu.edu.au patch to Etherboot 4.4.2
85  patch to tulip.c that implements the automatic selection of the MII
86  interface on cards using the Intel/DEC 21143 reference design, in
87  particular, the TRENDnet TE100-PCIA NIC which uses a genuine Intel
88  21143-PD chipset.
89  11 Jan 2000 mdc 0.75b4
90  Added support for NetGear FA310TX card based on the LC82C168
91  chip. This should also support Lite-On LC82C168 boards.
92  Added simple MII support. Re-arranged code to better modularize
93  initializations.
94  04 Dec 1999 mdc 0.75b3
95  Added preliminary support for LNE100TX PCI cards. Should work for
96  PNIC2 cards. No MII support, but single interface (RJ45) tulip
97  cards seem to not care.
98  03 Dec 1999 mdc 0.75b2
99  Renamed from mx987x5 to tulip, merged in original tulip init code
100  from tulip.c to support other tulip compatible cards.
101  02 Dec 1999 mdc 0.75b1
102  Released Beta MX987x5 Driver for code review and testing to netboot
103  and thinguin mailing lists.
104 */
105 
106 
107 /*********************************************************************/
108 /* Declarations */
109 /*********************************************************************/
110 
111 #include "etherboot.h"
112 #include "nic.h"
113 
114 #include <ipxe/ethernet.h>
115 #include <ipxe/pci.h>
116 
117 /* User settable parameters */
118 
119 #define TX_TIME_OUT 2*TICKS_PER_SEC
120 
121 /* helpful macros if on a big_endian machine for changing byte order.
122  not strictly needed on Intel */
123 #define get_unaligned(ptr) (*(ptr))
124 #define put_unaligned(val, ptr) ((void)( *(ptr) = (val) ))
125 #define get_u16(ptr) (*(u16 *)(ptr))
126 #define virt_to_le32desc(addr) virt_to_bus(addr)
127 
128 #define TULIP_IOTYPE PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0
129 #define TULIP_SIZE 0x80
130 
131 /* This is a mysterious value that can be written to CSR11 in the 21040 (only)
132  to support a pre-NWay full-duplex signaling mechanism using short frames.
133  No one knows what it should be, but if left at its default value some
134  10base2(!) packets trigger a full-duplex-request interrupt. */
135 #define FULL_DUPLEX_MAGIC 0x6969
136 
137 static const int csr0 = 0x01A00000 | 0x8000;
138 
139 /* The possible media types that can be set in options[] are: */
140 #define MEDIA_MASK 31
141 static const char * const medianame[32] = {
142  "10baseT", "10base2", "AUI", "100baseTx",
143  "10baseT-FDX", "100baseTx-FDX", "100baseT4", "100baseFx",
144  "100baseFx-FDX", "MII 10baseT", "MII 10baseT-FDX", "MII",
145  "10baseT(forced)", "MII 100baseTx", "MII 100baseTx-FDX", "MII 100baseT4",
146  "MII 100baseFx-HDX", "MII 100baseFx-FDX", "Home-PNA 1Mbps", "Invalid-19",
147 };
148 
149 /* This much match tulip_tbl[]! Note 21142 == 21143. */
153  COMPEX9881, I21145, XIRCOM, SGThomson, /*Ramesh Chander*/
154 };
155 
157  /* Set PCI command register bits before calling probe1(). */
159  /* Read and map the single following PCI BAR. */
160  PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4,
163 };
164 
165 struct pci_id_info {
166  char *name;
167  struct match_info {
169  u32 revision, revision_mask; /* Only 8 bits. */
170  } id;
172  int io_size; /* Needed for I/O region check or ioremap(). */
173  int drv_flags; /* Driver use, intended as capability flags. */
174 };
175 
176 static const struct pci_id_info pci_id_tbl[] = {
177  { "Digital DC21040 Tulip", { 0x00021011, 0xffffffff, 0, 0, 0, 0 },
178  TULIP_IOTYPE, 0x80, DC21040 },
179  { "Digital DC21041 Tulip", { 0x00141011, 0xffffffff, 0, 0, 0, 0 },
180  TULIP_IOTYPE, 0x80, DC21041 },
181  { "Digital DS21140A Tulip", { 0x00091011, 0xffffffff, 0,0, 0x20,0xf0 },
182  TULIP_IOTYPE, 0x80, DC21140 },
183  { "Digital DS21140 Tulip", { 0x00091011, 0xffffffff, 0, 0, 0, 0 },
184  TULIP_IOTYPE, 0x80, DC21140 },
185  { "Digital DS21143 Tulip", { 0x00191011, 0xffffffff, 0,0, 65,0xff },
187  { "Digital DS21142 Tulip", { 0x00191011, 0xffffffff, 0, 0, 0, 0 },
189  { "Kingston KNE110tx (PNIC)", { 0x000211AD, 0xffffffff, 0xf0022646, 0xffffffff, 0, 0 },
190  TULIP_IOTYPE, 256, LC82C168 },
191  { "Lite-On 82c168 PNIC", { 0x000211AD, 0xffffffff, 0, 0, 0, 0 },
192  TULIP_IOTYPE, 256, LC82C168 },
193  { "Macronix 98713 PMAC", { 0x051210d9, 0xffffffff, 0, 0, 0, 0 },
194  TULIP_IOTYPE, 256, MX98713 },
195  { "Macronix 98715 PMAC", { 0x053110d9, 0xffffffff, 0, 0, 0, 0 },
196  TULIP_IOTYPE, 256, MX98715 },
197  { "Macronix 98725 PMAC", { 0x053110d9, 0xffffffff, 0, 0, 0, 0 },
198  TULIP_IOTYPE, 256, MX98725 },
199  { "ASIX AX88141", { 0x1400125B, 0xffffffff, 0,0, 0x10, 0xf0 },
200  TULIP_IOTYPE, 128, AX88141 },
201  { "ASIX AX88140", { 0x1400125B, 0xffffffff, 0, 0, 0, 0 },
202  TULIP_IOTYPE, 128, AX88140 },
203  { "Lite-On LC82C115 PNIC-II", { 0xc11511AD, 0xffffffff, 0, 0, 0, 0 },
204  TULIP_IOTYPE, 256, PNIC2 },
205  { "ADMtek AN981 Comet", { 0x09811317, 0xffffffff, 0, 0, 0, 0 },
206  TULIP_IOTYPE, 256, COMET },
207  { "ADMTek AN983 Comet", { 0x12161113, 0xffffffff, 0, 0, 0, 0 },
208  TULIP_IOTYPE, 256, COMET },
209  { "ADMTek Comet AN983b", { 0x95111317, 0xffffffff, 0, 0, 0, 0 },
210  TULIP_IOTYPE, 256, COMET },
211  { "ADMtek Centaur-P", { 0x09851317, 0xffffffff, 0, 0, 0, 0 },
212  TULIP_IOTYPE, 256, COMET },
213  { "ADMtek Centaur-C", { 0x19851317, 0xffffffff, 0, 0, 0, 0 },
214  TULIP_IOTYPE, 256, COMET },
215  { "Compex RL100-TX", { 0x988111F6, 0xffffffff, 0, 0, 0, 0 },
216  TULIP_IOTYPE, 128, COMPEX9881 },
217  { "Intel 21145 Tulip", { 0x00398086, 0xffffffff, 0, 0, 0, 0 },
218  TULIP_IOTYPE, 128, I21145 },
219  { "Xircom Tulip clone", { 0x0003115d, 0xffffffff, 0, 0, 0, 0 },
220  TULIP_IOTYPE, 128, XIRCOM },
221  { "Davicom DM9102", { 0x91021282, 0xffffffff, 0, 0, 0, 0 },
222  TULIP_IOTYPE, 0x80, DC21140 },
223  { "Davicom DM9100", { 0x91001282, 0xffffffff, 0, 0, 0, 0 },
224  TULIP_IOTYPE, 0x80, DC21140 },
225  { "Macronix mxic-98715 (EN1217)", { 0x12171113, 0xffffffff, 0, 0, 0, 0 },
226  TULIP_IOTYPE, 256, MX98715 },
227  { "3Com 3cSOHO100B-TX (ADMtek Centuar)", { 0x930010b7, 0xffffffff, 0, 0, 0, 0 },
229  { "SG Thomson STE10/100A", { 0x2774104a, 0xffffffff, 0, 0, 0, 0 },
230  TULIP_IOTYPE, 256, COMET }, /*Ramesh Chander*/
231  { NULL, { 0, 0, 0, 0, 0, 0 }, 0, 0, 0 },
232 };
233 
234 enum tbl_flag {
236  HAS_PWRDWN=0x10, MC_HASH_ONLY=0x20, /* Hash-only multicast filter. */
237  HAS_PNICNWAY=0x80, HAS_NWAY=0x40, /* Uses internal NWay xcvr. */
238  HAS_INTR_MITIGATION=0x100, IS_ASIX=0x200, HAS_8023X=0x400,
239 };
240 
241 /* Note: this table must match enum tulip_chips above. */
242 static struct tulip_chip_table {
243  char *chip_name;
244  int flags;
245 } tulip_tbl[] = {
246  { "Digital DC21040 Tulip", 0},
247  { "Digital DC21041 Tulip", HAS_MEDIA_TABLE | HAS_NWAY },
248  { "Digital DS21140 Tulip", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
249  { "Digital DS21143 Tulip", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
251  { "Lite-On 82c168 PNIC", HAS_MII | HAS_PNICNWAY },
252  { "Macronix 98713 PMAC", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
253  { "Macronix 98715 PMAC", HAS_MEDIA_TABLE },
254  { "Macronix 98725 PMAC", HAS_MEDIA_TABLE },
255  { "ASIX AX88140", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM
256  | MC_HASH_ONLY | IS_ASIX },
257  { "ASIX AX88141", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM | MC_HASH_ONLY
258  | IS_ASIX },
259  { "Lite-On PNIC-II", HAS_MII | HAS_NWAY | HAS_8023X },
260  { "ADMtek Comet", HAS_MII | MC_HASH_ONLY },
261  { "Compex 9881 PMAC", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
262  { "Intel DS21145 Tulip", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
263  | HAS_PWRDWN | HAS_NWAY },
264  { "Xircom tulip work-alike", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
265  | HAS_PWRDWN | HAS_NWAY },
266  { "SGThomson STE10/100A", HAS_MII | MC_HASH_ONLY }, /*Ramesh Chander*/
267  { NULL, 0 },
268 };
269 
270 /* A full-duplex map for media types. */
271 enum MediaIs {
274 
275 static const char media_cap[32] =
276 {0,0,0,16, 3,19,16,24, 27,4,7,5, 0,20,23,20, 20,31,0,0, };
277 static u8 t21040_csr13[] = {2,0x0C,8,4, 4,0,0,0, 0,0,0,0, 4,0,0,0};
278 
279 /* 21041 transceiver register settings: 10-T, 10-2, AUI, 10-T, 10T-FD */
280 static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
281 static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
282 static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
283 
284 /* not used
285 static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, };
286 */
287 static u16 t21142_csr14[] = { 0xFFFF, 0x0705, 0x0705, 0x0000, 0x7F3D, };
288 /* not used
289 static u16 t21142_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
290 */
291 
292 /* Offsets to the Command and Status Registers, "CSRs". All accesses
293  must be longword instructions and quadword aligned. */
295  CSR0=0, CSR1=0x08, CSR2=0x10, CSR3=0x18, CSR4=0x20, CSR5=0x28,
296  CSR6=0x30, CSR7=0x38, CSR8=0x40, CSR9=0x48, CSR10=0x50, CSR11=0x58,
297  CSR12=0x60, CSR13=0x68, CSR14=0x70, CSR15=0x78, CSR16=0x80, CSR20=0xA0
298 };
299 
300 /* The bits in the CSR5 status registers, mostly interrupt sources. */
302  TimerInt=0x800, TPLnkFail=0x1000, TPLnkPass=0x10,
303  NormalIntr=0x10000, AbnormalIntr=0x8000,
304  RxJabber=0x200, RxDied=0x100, RxNoBuf=0x80, RxIntr=0x40,
305  TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02, TxIntr=0x01,
306 };
307 
308 /* The configuration bits in CSR6. */
310  TxOn=0x2000, RxOn=0x0002, FullDuplex=0x0200,
312  AcceptAllPhys=0x0040, AcceptRunt=0x0008,
313 };
314 
315 
317  DescOwnded=0x80000000, RxDescFatalErr=0x8000, RxWholePkt=0x0300,
318 };
319 
320 struct medialeaf {
323  unsigned char *leafdata;
324 };
325 
326 struct mediatable {
328  u8 leafcount, csr12dir; /* General purpose pin directions. */
329  unsigned has_mii:1, has_nonmii:1, has_reset:6;
330  u32 csr15dir, csr15val; /* 21143 NWay setting. */
331  struct medialeaf mleaf[0];
332 };
333 
334 struct mediainfo {
335  struct mediainfo *next;
337  int index;
338  unsigned char *info;
339 };
340 
341 /* EEPROM Address width definitions */
342 #define EEPROM_ADDRLEN 6
343 #define EEPROM_SIZE 128 /* 2 << EEPROM_ADDRLEN */
344 
345 /* The EEPROM commands include the alway-set leading bit. */
346 #define EE_WRITE_CMD (5 << addr_len)
347 #define EE_READ_CMD (6 << addr_len)
348 #define EE_ERASE_CMD (7 << addr_len)
349 
350 /* EEPROM_Ctrl bits. */
351 #define EE_SHIFT_CLK 0x02 /* EEPROM shift clock. */
352 #define EE_CS 0x01 /* EEPROM chip select. */
353 #define EE_DATA_WRITE 0x04 /* EEPROM chip data in. */
354 #define EE_WRITE_0 0x01
355 #define EE_WRITE_1 0x05
356 #define EE_DATA_READ 0x08 /* EEPROM chip data out. */
357 #define EE_ENB (0x4800 | EE_CS)
358 
359 /* Delay between EEPROM clock transitions. Even at 33Mhz current PCI
360  implementations don't overrun the EEPROM clock. We add a bus
361  turn-around to insure that this remains true. */
362 #define eeprom_delay() inl(ee_addr)
363 
364 /* Size of transmit and receive buffers */
365 #define BUFLEN 1536
366 
367 /* Ring-wrap flag in length field, use for last ring entry.
368  0x01000000 means chain on buffer2 address,
369  0x02000000 means use the ring start address in CSR2/3.
370  Note: Some work-alike chips do not function correctly in chained mode.
371  The ASIX chip works only in chained mode.
372  Thus we indicate ring mode, but always write the 'next' field for
373  chained mode as well. */
374 #define DESC_RING_WRAP 0x02000000
375 
376 /* transmit and receive descriptor format */
378  volatile u32 status;
381 };
382 
384  volatile u32 status;
387 };
388 
389 /*********************************************************************/
390 /* Global Storage */
391 /*********************************************************************/
392 
393 static u32 ioaddr;
394 
396  int cur_rx;
397  int chip_id; /* index into tulip_tbl[] */
398  int pci_id_idx; /* index into pci_id_tbl[] */
399  int revision;
400  int flags;
401  unsigned short vendor_id; /* PCI card vendor code */
402  unsigned short dev_id; /* PCI card device code */
403  unsigned char ehdr[ETH_HLEN]; /* buffer for ethernet header */
404  const char *nic_name;
405  unsigned int csr0, csr6; /* Current CSR0, CSR6 settings. */
406  unsigned int if_port;
407  unsigned int full_duplex; /* Full-duplex operation requested. */
408  unsigned int full_duplex_lock;
409  unsigned int medialock; /* Do not sense media type. */
410  unsigned int mediasense; /* Media sensing in progress. */
411  unsigned int nway, nwayset; /* 21143 internal NWay. */
412  unsigned int default_port;
413  unsigned char eeprom[EEPROM_SIZE]; /* Serial EEPROM contents. */
414  u8 media_table_storage[(sizeof(struct mediatable) + 32*sizeof(struct medialeaf))];
415  u16 sym_advertise, mii_advertise; /* NWay to-advertise. */
417  u16 lpar; /* 21143 Link partner ability. */
418  u16 advertising[4]; /* MII advertise, from SROM table. */
419  signed char phys[4], mii_cnt; /* MII device addresses. */
420  int cur_index; /* Current media index. */
422 };
423 
424 /* Note: transmit and receive buffers must be longword aligned and
425  longword divisable */
426 
427 #define TX_RING_SIZE 2
428 #define RX_RING_SIZE 4
429 struct tulip_bss {
431  unsigned char txb[BUFLEN];
433  unsigned char rxb[RX_RING_SIZE * BUFLEN];
435 };
436 #define tulip_bss NIC_FAKE_BSS ( struct tulip_bss )
437 #define tx_ring tulip_bss.tx_ring
438 #define txb tulip_bss.txb
439 #define rx_ring tulip_bss.rx_ring
440 #define rxb tulip_bss.rxb
441 
442 static struct tulip_private *tp;
443 
444 /* Known cards that have old-style EEPROMs.
445  Writing this table is described at
446  http://cesdis.gsfc.nasa.gov/linux/drivers/tulip-drivers/tulip-media.html */
447 static struct fixups {
448  char *name;
449  unsigned char addr0, addr1, addr2;
450  u16 newtable[32]; /* Max length below. */
451 } eeprom_fixups[] = {
452  {"Asante", 0, 0, 0x94, {0x1e00, 0x0000, 0x0800, 0x0100, 0x018c,
453  0x0000, 0x0000, 0xe078, 0x0001, 0x0050, 0x0018 }},
454  {"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x041f,
455  0x0000, 0x009E, /* 10baseT */
456  0x0004, 0x009E, /* 10baseT-FD */
457  0x0903, 0x006D, /* 100baseTx */
458  0x0905, 0x006D, /* 100baseTx-FD */ }},
459  {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x063f,
460  0x0107, 0x8021, /* 100baseFx */
461  0x0108, 0x8021, /* 100baseFx-FD */
462  0x0100, 0x009E, /* 10baseT */
463  0x0104, 0x009E, /* 10baseT-FD */
464  0x0103, 0x006D, /* 100baseTx */
465  0x0105, 0x006D, /* 100baseTx-FD */ }},
466  {"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0513,
467  0x1001, 0x009E, /* 10base2, CSR12 0x10*/
468  0x0000, 0x009E, /* 10baseT */
469  0x0004, 0x009E, /* 10baseT-FD */
470  0x0303, 0x006D, /* 100baseTx, CSR12 0x03 */
471  0x0305, 0x006D, /* 100baseTx-FD CSR12 0x03 */}},
472  {"Accton EN1207", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x051F,
473  0x1B01, 0x0000, /* 10base2, CSR12 0x1B */
474  0x0B00, 0x009E, /* 10baseT, CSR12 0x0B */
475  0x0B04, 0x009E, /* 10baseT-FD,CSR12 0x0B */
476  0x1B03, 0x006D, /* 100baseTx, CSR12 0x1B */
477  0x1B05, 0x006D, /* 100baseTx-FD CSR12 0x1B */
478  }},
479  {NULL, 0, 0, 0, {}}};
480 
481 static const char * block_name[] = {"21140 non-MII", "21140 MII PHY",
482  "21142 Serial PHY", "21142 MII PHY", "21143 SYM PHY", "21143 reset method"};
483 
484 
485 /*********************************************************************/
486 /* Function Prototypes */
487 /*********************************************************************/
488 static int mdio_read(struct nic *nic, int phy_id, int location);
489 static void mdio_write(struct nic *nic, int phy_id, int location, int value);
490 static int read_eeprom(unsigned long ioaddr, int location, int addr_len);
491 static void parse_eeprom(struct nic *nic);
492 static int tulip_probe(struct nic *nic,struct pci_device *pci);
493 static void tulip_init_ring(struct nic *nic);
494 static void tulip_reset(struct nic *nic);
495 static void tulip_transmit(struct nic *nic, const char *d, unsigned int t,
496  unsigned int s, const char *p);
497 static int tulip_poll(struct nic *nic, int retrieve);
498 static void tulip_disable(struct nic *nic, void *hwdev);
499 static void nway_start(struct nic *nic);
500 static void pnic_do_nway(struct nic *nic);
501 static void select_media(struct nic *nic, int startup);
502 static void init_media(struct nic *nic);
503 static void start_link(struct nic *nic);
504 static int tulip_check_duplex(struct nic *nic);
505 
506 static void tulip_wait(unsigned int nticks);
507 
508 
509 /*********************************************************************/
510 /* Utility Routines */
511 /*********************************************************************/
512 
513 static void whereami (const char *str)
514 {
515  DBGP("%s\n", str);
516  /* sleep(2); */
517 }
518 
519 static void tulip_wait(unsigned int nticks)
520 {
521  unsigned int to = currticks() + nticks;
522  while (currticks() < to)
523  /* wait */ ;
524 }
525 
526 
527 /*********************************************************************/
528 /* Media Descriptor Code */
529 /*********************************************************************/
530 
531 /* MII transceiver control section.
532  Read and write the MII registers using software-generated serial
533  MDIO protocol. See the MII specifications or DP83840A data sheet
534  for details. */
535 
536 /* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
537  met by back-to-back PCI I/O cycles, but we insert a delay to avoid
538  "overclocking" issues or future 66Mhz PCI. */
539 #define mdio_delay() inl(mdio_addr)
540 
541 /* Read and write the MII registers using software-generated serial
542  MDIO protocol. It is just different enough from the EEPROM protocol
543  to not share code. The maxium data clock rate is 2.5 Mhz. */
544 #define MDIO_SHIFT_CLK 0x10000
545 #define MDIO_DATA_WRITE0 0x00000
546 #define MDIO_DATA_WRITE1 0x20000
547 #define MDIO_ENB 0x00000 /* Ignore the 0x02000 databook setting. */
548 #define MDIO_ENB_IN 0x40000
549 #define MDIO_DATA_READ 0x80000
550 
551 /* MII transceiver control section.
552  Read and write the MII registers using software-generated serial
553  MDIO protocol. See the MII specifications or DP83840A data sheet
554  for details. */
555 
556 int mdio_read(struct nic *nic __unused, int phy_id, int location)
557 {
558  int i;
559  int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
560  int retval = 0;
561  long mdio_addr = ioaddr + CSR9;
562 
563  whereami("mdio_read\n");
564 
565  if (tp->chip_id == LC82C168) {
566  int i = 1000;
567  outl(0x60020000 + (phy_id<<23) + (location<<18), ioaddr + 0xA0);
568  inl(ioaddr + 0xA0);
569  inl(ioaddr + 0xA0);
570  while (--i > 0)
571  if ( ! ((retval = inl(ioaddr + 0xA0)) & 0x80000000))
572  return retval & 0xffff;
573  return 0xffff;
574  }
575 
576  if (tp->chip_id == COMET) {
577  if (phy_id == 1) {
578  if (location < 7)
579  return inl(ioaddr + 0xB4 + (location<<2));
580  else if (location == 17)
581  return inl(ioaddr + 0xD0);
582  else if (location >= 29 && location <= 31)
583  return inl(ioaddr + 0xD4 + ((location-29)<<2));
584  }
585  return 0xffff;
586  }
587 
588  /* Establish sync by sending at least 32 logic ones. */
589  for (i = 32; i >= 0; i--) {
590  outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
591  mdio_delay();
593  mdio_delay();
594  }
595  /* Shift the read command bits out. */
596  for (i = 15; i >= 0; i--) {
597  int dataval = (read_cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
598 
599  outl(MDIO_ENB | dataval, mdio_addr);
600  mdio_delay();
601  outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
602  mdio_delay();
603  }
604  /* Read the two transition, 16 data, and wire-idle bits. */
605  for (i = 19; i > 0; i--) {
606  outl(MDIO_ENB_IN, mdio_addr);
607  mdio_delay();
608  retval = (retval << 1) | ((inl(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
609  outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
610  mdio_delay();
611  }
612  return (retval>>1) & 0xffff;
613 }
614 
615 void mdio_write(struct nic *nic __unused, int phy_id, int location, int value)
616 {
617  int i;
618  int cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
619  long mdio_addr = ioaddr + CSR9;
620 
621  whereami("mdio_write\n");
622 
623  if (tp->chip_id == LC82C168) {
624  int i = 1000;
625  outl(cmd, ioaddr + 0xA0);
626  do
627  if ( ! (inl(ioaddr + 0xA0) & 0x80000000))
628  break;
629  while (--i > 0);
630  return;
631  }
632 
633  if (tp->chip_id == COMET) {
634  if (phy_id != 1)
635  return;
636  if (location < 7)
637  outl(value, ioaddr + 0xB4 + (location<<2));
638  else if (location == 17)
639  outl(value, ioaddr + 0xD0);
640  else if (location >= 29 && location <= 31)
641  outl(value, ioaddr + 0xD4 + ((location-29)<<2));
642  return;
643  }
644 
645  /* Establish sync by sending 32 logic ones. */
646  for (i = 32; i >= 0; i--) {
647  outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
648  mdio_delay();
650  mdio_delay();
651  }
652  /* Shift the command bits out. */
653  for (i = 31; i >= 0; i--) {
654  int dataval = (cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
655  outl(MDIO_ENB | dataval, mdio_addr);
656  mdio_delay();
657  outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
658  mdio_delay();
659  }
660  /* Clear out extra bits. */
661  for (i = 2; i > 0; i--) {
662  outl(MDIO_ENB_IN, mdio_addr);
663  mdio_delay();
664  outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
665  mdio_delay();
666  }
667 }
668 
669 
670 /*********************************************************************/
671 /* EEPROM Reading Code */
672 /*********************************************************************/
673 /* EEPROM routines adapted from the Linux Tulip Code */
674 /* Reading a serial EEPROM is a "bit" grungy, but we work our way
675  through:->.
676 */
677 static int read_eeprom(unsigned long ioaddr, int location, int addr_len)
678 {
679  int i;
680  unsigned short retval = 0;
681  long ee_addr = ioaddr + CSR9;
682  int read_cmd = location | EE_READ_CMD;
683 
684  whereami("read_eeprom\n");
685 
686  outl(EE_ENB & ~EE_CS, ee_addr);
687  outl(EE_ENB, ee_addr);
688 
689  /* Shift the read command bits out. */
690  for (i = 4 + addr_len; i >= 0; i--) {
691  short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
692  outl(EE_ENB | dataval, ee_addr);
693  eeprom_delay();
694  outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
695  eeprom_delay();
696  }
697  outl(EE_ENB, ee_addr);
698 
699  for (i = 16; i > 0; i--) {
700  outl(EE_ENB | EE_SHIFT_CLK, ee_addr);
701  eeprom_delay();
702  retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);
703  outl(EE_ENB, ee_addr);
704  eeprom_delay();
705  }
706 
707  /* Terminate the EEPROM access. */
708  outl(EE_ENB & ~EE_CS, ee_addr);
709  return retval;
710 }
711 
712 
713 /*********************************************************************/
714 /* EEPROM Parsing Code */
715 /*********************************************************************/
716 static void parse_eeprom(struct nic *nic)
717 {
718  unsigned char *p, *ee_data = tp->eeprom;
719  int new_advertise = 0;
720  int i;
721 
722  whereami("parse_eeprom\n");
723 
724  tp->mtable = NULL;
725  /* Detect an old-style (SA only) EEPROM layout:
726  memcmp(ee_data, ee_data+16, 8). */
727  for (i = 0; i < 8; i ++)
728  if (ee_data[i] != ee_data[16+i])
729  break;
730  if (i >= 8) {
731  /* Do a fix-up based on the vendor half of the station address. */
732  for (i = 0; eeprom_fixups[i].name; i++) {
733  if (nic->node_addr[0] == eeprom_fixups[i].addr0
734  && nic->node_addr[1] == eeprom_fixups[i].addr1
735  && nic->node_addr[2] == eeprom_fixups[i].addr2) {
736  if (nic->node_addr[2] == 0xE8 && ee_data[0x1a] == 0x55)
737  i++; /* An Accton EN1207, not an outlaw Maxtech. */
738  memcpy(ee_data + 26, eeprom_fixups[i].newtable,
739  sizeof(eeprom_fixups[i].newtable));
740  DBG("%s: Old format EEPROM on '%s' board.\n%s: Using substitute media control info.\n",
742  break;
743  }
744  }
745  if (eeprom_fixups[i].name == NULL) { /* No fixup found. */
746  DBG("%s: Old style EEPROM with no media selection information.\n",
747  tp->nic_name);
748  return;
749  }
750  }
751 
752  if (ee_data[19] > 1) {
753  DBG("%s: Multiport cards (%d ports) may not work correctly.\n",
754  tp->nic_name, ee_data[19]);
755  }
756 
757  p = (void *)ee_data + ee_data[27];
758 
759  if (ee_data[27] == 0) { /* No valid media table. */
760  DBG2("%s: No Valid Media Table. ee_data[27] = %hhX\n",
761  tp->nic_name, ee_data[27]);
762  } else if (tp->chip_id == DC21041) {
763  int media = get_u16(p);
764  int count = p[2];
765  p += 3;
766 
767  DBG("%s: 21041 Media table, default media %hX (%s).\n",
768  tp->nic_name, media,
769  media & 0x0800 ? "Autosense" : medianame[media & 15]);
770  for (i = 0; i < count; i++) {
771  unsigned char media_block = *p++;
772  int media_code = media_block & MEDIA_MASK;
773  if (media_block & 0x40)
774  p += 6;
775  switch(media_code) {
776  case 0: new_advertise |= 0x0020; break;
777  case 4: new_advertise |= 0x0040; break;
778  }
779  DBG("%s: 21041 media #%d, %s.\n",
780  tp->nic_name, media_code, medianame[media_code]);
781  }
782  } else {
783  unsigned char csr12dir = 0;
784  int count;
785  struct mediatable *mtable;
786  u16 media = get_u16(p);
787 
788  p += 2;
789  if (tp->flags & CSR12_IN_SROM)
790  csr12dir = *p++;
791  count = *p++;
792 
793  tp->mtable = mtable = (struct mediatable *)&tp->media_table_storage[0];
794 
795  mtable->defaultmedia = media;
796  mtable->leafcount = count;
797  mtable->csr12dir = csr12dir;
798  mtable->has_nonmii = mtable->has_mii = mtable->has_reset = 0;
799  mtable->csr15dir = mtable->csr15val = 0;
800 
801  DBG("%s: EEPROM default media type %s.\n", tp->nic_name,
802  media & 0x0800 ? "Autosense" : medianame[media & MEDIA_MASK]);
803 
804  for (i = 0; i < count; i++) {
805  struct medialeaf *leaf = &mtable->mleaf[i];
806 
807  if ((p[0] & 0x80) == 0) { /* 21140 Compact block. */
808  leaf->type = 0;
809  leaf->media = p[0] & 0x3f;
810  leaf->leafdata = p;
811  if ((p[2] & 0x61) == 0x01) /* Bogus, but Znyx boards do it. */
812  mtable->has_mii = 1;
813  p += 4;
814  } else {
815  switch(leaf->type = p[1]) {
816  case 5:
817  mtable->has_reset = i;
818  leaf->media = p[2] & 0x0f;
819  break;
820  case 1: case 3:
821  mtable->has_mii = 1;
822  leaf->media = 11;
823  break;
824  case 2:
825  if ((p[2] & 0x3f) == 0) {
826  u32 base15 = (p[2] & 0x40) ? get_u16(p + 7) : 0x0008;
827  u16 *p1 = (u16 *)(p + (p[2] & 0x40 ? 9 : 3));
828  mtable->csr15dir = (get_unaligned(p1 + 0)<<16) + base15;
829  mtable->csr15val = (get_unaligned(p1 + 1)<<16) + base15;
830  }
831  /* Fall through. */
832  case 0: case 4:
833  mtable->has_nonmii = 1;
834  leaf->media = p[2] & MEDIA_MASK;
835  switch (leaf->media) {
836  case 0: new_advertise |= 0x0020; break;
837  case 4: new_advertise |= 0x0040; break;
838  case 3: new_advertise |= 0x0080; break;
839  case 5: new_advertise |= 0x0100; break;
840  case 6: new_advertise |= 0x0200; break;
841  }
842  break;
843  default:
844  leaf->media = 19;
845  }
846  leaf->leafdata = p + 2;
847  p += (p[0] & 0x3f) + 1;
848  }
849  if (leaf->media == 11) {
850  unsigned char *bp = leaf->leafdata;
851  DBG2("%s: MII interface PHY %d, setup/reset sequences %d/%d long, capabilities %hhX %hhX.\n",
852  tp->nic_name, bp[0], bp[1], bp[2 + bp[1]*2],
853  bp[5 + bp[2 + bp[1]*2]*2], bp[4 + bp[2 + bp[1]*2]*2]);
854  }
855  DBG("%s: Index #%d - Media %s (#%d) described "
856  "by a %s (%d) block.\n",
857  tp->nic_name, i, medianame[leaf->media], leaf->media,
858  leaf->type < 6 ? block_name[leaf->type] : "UNKNOWN",
859  leaf->type);
860  }
861  if (new_advertise)
862  tp->sym_advertise = new_advertise;
863  }
864 }
865 
866 
867 /*********************************************************************/
868 /* tulip_init_ring - setup the tx and rx descriptors */
869 /*********************************************************************/
870 static void tulip_init_ring(struct nic *nic __unused)
871 {
872  int i;
873 
874  whereami("tulip_init_ring\n");
875 
876  tp->cur_rx = 0;
877 
878  for (i = 0; i < RX_RING_SIZE; i++) {
879  rx_ring[i].status = cpu_to_le32(0x80000000);
880  rx_ring[i].length = cpu_to_le32(BUFLEN);
881  rx_ring[i].buffer1 = virt_to_le32desc(&rxb[i * BUFLEN]);
882  rx_ring[i].buffer2 = virt_to_le32desc(&rx_ring[i+1]);
883  }
884  /* Mark the last entry as wrapping the ring. */
885  rx_ring[i-1].length = cpu_to_le32(DESC_RING_WRAP | BUFLEN);
886  rx_ring[i-1].buffer2 = virt_to_le32desc(&rx_ring[0]);
887 
888  /* We only use 1 transmit buffer, but we use 2 descriptors so
889  transmit engines have somewhere to point to if they feel the need */
890 
891  tx_ring[0].status = 0x00000000;
892  tx_ring[0].buffer1 = virt_to_le32desc(&txb[0]);
893  tx_ring[0].buffer2 = virt_to_le32desc(&tx_ring[1]);
894 
895  /* this descriptor should never get used, since it will never be owned
896  by the machine (status will always == 0) */
897  tx_ring[1].status = 0x00000000;
898  tx_ring[1].buffer1 = virt_to_le32desc(&txb[0]);
899  tx_ring[1].buffer2 = virt_to_le32desc(&tx_ring[0]);
900 
901  /* Mark the last entry as wrapping the ring, though this should never happen */
902  tx_ring[1].length = cpu_to_le32(DESC_RING_WRAP | BUFLEN);
903 }
904 
905 
906 static void set_rx_mode(struct nic *nic __unused) {
907  int csr6 = inl(ioaddr + CSR6) & ~0x00D5;
908 
909  tp->csr6 &= ~0x00D5;
910 
911  /* !IFF_PROMISC */
913  csr6 |= AcceptAllMulticast;
914 
915  outl(csr6, ioaddr + CSR6);
916 
917 
918 
919 }
920 
921 /*********************************************************************/
922 /* eth_reset - Reset adapter */
923 /*********************************************************************/
924 static void tulip_reset(struct nic *nic)
925 {
926  int i;
927  unsigned long to;
928 
929  whereami("tulip_reset\n");
930 
931  /* Stop Tx and RX */
932  outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
933 
934  /* On some chip revs we must set the MII/SYM port before the reset!? */
935  if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii)) {
936  outl(0x814C0000, ioaddr + CSR6);
937  }
938 
939  /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
940  outl(0x00000001, ioaddr + CSR0);
941  tulip_wait(1);
942 
943  /* turn off reset and set cache align=16lword, burst=unlimit */
944  outl(tp->csr0, ioaddr + CSR0);
945 
946  /* Wait the specified 50 PCI cycles after a reset */
947  tulip_wait(1);
948 
949  /* set up transmit and receive descriptors */
951 
952  if (tp->chip_id == PNIC2) {
953  u32 addr_high = (nic->node_addr[1]<<8) + (nic->node_addr[0]<<0);
954  /* This address setting does not appear to impact chip operation?? */
955  outl((nic->node_addr[5]<<8) + nic->node_addr[4] +
956  (nic->node_addr[3]<<24) + (nic->node_addr[2]<<16),
957  ioaddr + 0xB0);
958  outl(addr_high + (addr_high<<16), ioaddr + 0xB8);
959  }
960 
961  /* MC_HASH_ONLY boards don't support setup packets */
962  if (tp->flags & MC_HASH_ONLY) {
963  u32 addr_low = cpu_to_le32(get_unaligned((u32 *)nic->node_addr));
964  u32 addr_high = cpu_to_le32(get_unaligned((u16 *)(nic->node_addr+4)));
965 
966  /* clear multicast hash filters and setup MAC address filters */
967  if (tp->flags & IS_ASIX) {
968  outl(0, ioaddr + CSR13);
969  outl(addr_low, ioaddr + CSR14);
970  outl(1, ioaddr + CSR13);
971  outl(addr_high, ioaddr + CSR14);
972  outl(2, ioaddr + CSR13);
973  outl(0, ioaddr + CSR14);
974  outl(3, ioaddr + CSR13);
975  outl(0, ioaddr + CSR14);
976  } else if (tp->chip_id == COMET) {
977  outl(addr_low, ioaddr + 0xA4);
978  outl(addr_high, ioaddr + 0xA8);
979  outl(0, ioaddr + 0xAC);
980  outl(0, ioaddr + 0xB0);
981  }
982  } else {
983  /* for other boards we send a setup packet to initialize
984  the filters */
985  u32 tx_flags = 0x08000000 | 192;
986 
987  /* construct perfect filter frame with mac address as first match
988  and broadcast address for all others */
989  for (i=0; i<192; i++)
990  txb[i] = 0xFF;
991  txb[0] = nic->node_addr[0];
992  txb[1] = nic->node_addr[1];
993  txb[4] = nic->node_addr[2];
994  txb[5] = nic->node_addr[3];
995  txb[8] = nic->node_addr[4];
996  txb[9] = nic->node_addr[5];
997 
998  tx_ring[0].length = cpu_to_le32(tx_flags);
999  tx_ring[0].buffer1 = virt_to_le32desc(&txb[0]);
1000  tx_ring[0].status = cpu_to_le32(0x80000000);
1001  }
1002 
1003  /* Point to rx and tx descriptors */
1006 
1007  init_media(nic);
1008 
1009  /* set the chip's operating mode (but don't turn on xmit and recv yet) */
1010  outl((tp->csr6 & ~0x00002002), ioaddr + CSR6);
1011 
1012  /* send setup packet for cards that support it */
1013  if (!(tp->flags & MC_HASH_ONLY)) {
1014  /* enable transmit wait for completion */
1015  outl(tp->csr6 | 0x00002000, ioaddr + CSR6);
1016  /* immediate transmit demand */
1017  outl(0, ioaddr + CSR1);
1018 
1019  to = currticks() + TX_TIME_OUT;
1020  while ((tx_ring[0].status & 0x80000000) && (currticks() < to))
1021  /* wait */ ;
1022 
1023  if (currticks() >= to) {
1024  DBG ("%s: TX Setup Timeout.\n", tp->nic_name);
1025  }
1026  }
1027 
1028  if (tp->chip_id == LC82C168)
1030 
1031  set_rx_mode(nic);
1032 
1033  /* enable transmit and receive */
1034  outl(tp->csr6 | 0x00002002, ioaddr + CSR6);
1035 }
1036 
1037 
1038 /*********************************************************************/
1039 /* eth_transmit - Transmit a frame */
1040 /*********************************************************************/
1041 static void tulip_transmit(struct nic *nic, const char *d, unsigned int t,
1042  unsigned int s, const char *p)
1043 {
1044  u16 nstype;
1045  u32 to;
1046  u32 csr6 = inl(ioaddr + CSR6);
1047 
1048  whereami("tulip_transmit\n");
1049 
1050  /* Disable Tx */
1051  outl(csr6 & ~0x00002000, ioaddr + CSR6);
1052 
1053  memcpy(txb, d, ETH_ALEN);
1055  nstype = htons((u16) t);
1056  memcpy(txb + 2 * ETH_ALEN, (u8 *)&nstype, 2);
1057  memcpy(txb + ETH_HLEN, p, s);
1058 
1059  s += ETH_HLEN;
1060  s &= 0x0FFF;
1061 
1062  /* pad to minimum packet size */
1063  while (s < ETH_ZLEN)
1064  txb[s++] = '\0';
1065 
1066  DBG2("%s: sending %d bytes ethtype %hX\n", tp->nic_name, s, t);
1067 
1068  /* setup the transmit descriptor */
1069  /* 0x60000000 = no interrupt on completion */
1070  tx_ring[0].length = cpu_to_le32(0x60000000 | s);
1071  tx_ring[0].status = cpu_to_le32(0x80000000);
1072 
1073  /* Point to transmit descriptor */
1075 
1076  /* Enable Tx */
1077  outl(csr6 | 0x00002000, ioaddr + CSR6);
1078  /* immediate transmit demand */
1079  outl(0, ioaddr + CSR1);
1080 
1081  to = currticks() + TX_TIME_OUT;
1082  while ((tx_ring[0].status & 0x80000000) && (currticks() < to))
1083  /* wait */ ;
1084 
1085  if (currticks() >= to) {
1086  DBG ("TX Timeout!\n");
1087  }
1088 
1089  /* Disable Tx */
1090  outl(csr6 & ~0x00002000, ioaddr + CSR6);
1091 }
1092 
1093 /*********************************************************************/
1094 /* eth_poll - Wait for a frame */
1095 /*********************************************************************/
1096 static int tulip_poll(struct nic *nic, int retrieve)
1097 {
1098 
1099  whereami("tulip_poll\n");
1100 
1101  /* no packet waiting. packet still owned by NIC */
1102  if (rx_ring[tp->cur_rx].status & 0x80000000)
1103  return 0;
1104 
1105  if ( ! retrieve ) return 1;
1106 
1107  whereami("tulip_poll got one\n");
1108 
1109  nic->packetlen = (rx_ring[tp->cur_rx].status & 0x3FFF0000) >> 16;
1110 
1111  /* if we get a corrupted packet. throw it away and move on */
1112  if (rx_ring[tp->cur_rx].status & 0x00008000) {
1113  /* return the descriptor and buffer to receive ring */
1114  rx_ring[tp->cur_rx].status = 0x80000000;
1115  tp->cur_rx = (tp->cur_rx + 1) % RX_RING_SIZE;
1116  return 0;
1117  }
1118 
1119  /* copy packet to working buffer */
1121 
1122  /* return the descriptor and buffer to receive ring */
1123  rx_ring[tp->cur_rx].status = 0x80000000;
1124  tp->cur_rx = (tp->cur_rx + 1) % RX_RING_SIZE;
1125 
1126  return 1;
1127 }
1128 
1129 /*********************************************************************/
1130 /* eth_disable - Disable the interface */
1131 /*********************************************************************/
1132 static void tulip_disable ( struct nic *nic, void *hwdev __unused ) {
1133 
1134  whereami("tulip_disable\n");
1135 
1136  tulip_reset(nic);
1137 
1138  /* disable interrupts */
1139  outl(0x00000000, ioaddr + CSR7);
1140 
1141  /* Stop the chip's Tx and Rx processes. */
1142  outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
1143 
1144  /* Clear the missed-packet counter. */
1145  inl(ioaddr + CSR8);
1146 }
1147 
1148 /*********************************************************************/
1149 /*IRQ - Enable, Disable, or Force interrupts */
1150 /*********************************************************************/
1151 static void tulip_irq(struct nic *nic __unused, irq_action_t action __unused)
1152 {
1153  switch ( action ) {
1154  case DISABLE :
1155  break;
1156  case ENABLE :
1157  break;
1158  case FORCE :
1159  break;
1160  }
1161 }
1162 
1165  .poll = tulip_poll,
1166  .transmit = tulip_transmit,
1167  .irq = tulip_irq,
1168 
1169 };
1170 
1171 /*********************************************************************/
1172 /* eth_probe - Look for an adapter */
1173 /*********************************************************************/
1174 static int tulip_probe ( struct nic *nic, struct pci_device *pci ) {
1175 
1176  u32 i;
1177  u8 chip_rev;
1179  unsigned short sum;
1180  int chip_idx;
1181  static unsigned char last_phys_addr[ETH_ALEN] = {0x00, 'L', 'i', 'n', 'u', 'x'};
1182 
1183  if (pci->ioaddr == 0)
1184  return 0;
1185 
1186  ioaddr = pci->ioaddr;
1187  nic->ioaddr = pci->ioaddr & ~3;
1188  nic->irqno = 0;
1189 
1190  /* point to private storage */
1191  tp = &tulip_bss.tpx;
1192 
1193  tp->vendor_id = pci->vendor;
1194  tp->dev_id = pci->device;
1195  tp->nic_name = pci->id->name;
1196 
1197  tp->if_port = 0;
1198  tp->default_port = 0;
1199 
1200  adjust_pci_device(pci);
1201 
1202  /* disable interrupts */
1203  outl(0x00000000, ioaddr + CSR7);
1204 
1205  /* Stop the chip's Tx and Rx processes. */
1206  outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
1207 
1208  /* Clear the missed-packet counter. */
1209  inl(ioaddr + CSR8);
1210 
1211  DBG("\n"); /* so we start on a fresh line */
1212  whereami("tulip_probe\n");
1213 
1214  DBG2 ("%s: Looking for Tulip Chip: Vendor=%hX Device=%hX\n", tp->nic_name,
1215  tp->vendor_id, tp->dev_id);
1216 
1217  /* Figure out which chip we're dealing with */
1218  i = 0;
1219  chip_idx = -1;
1220 
1221  while (pci_id_tbl[i].name) {
1222  if ( (((u32) tp->dev_id << 16) | tp->vendor_id) ==
1223  (pci_id_tbl[i].id.pci & pci_id_tbl[i].id.pci_mask) ) {
1225  break;
1226  }
1227  i++;
1228  }
1229 
1230  if (chip_idx == -1) {
1231  DBG ("%s: Unknown Tulip Chip: Vendor=%hX Device=%hX\n", tp->nic_name,
1232  tp->vendor_id, tp->dev_id);
1233  return 0;
1234  }
1235 
1236  tp->pci_id_idx = i;
1238 
1239  DBG2 ("%s: tp->pci_id_idx == %d, name == %s\n", tp->nic_name,
1241  DBG2 ("%s: chip_idx == %d, name == %s\n", tp->nic_name, chip_idx,
1243 
1244  /* Bring the 21041/21143 out of sleep mode.
1245  Caution: Snooze mode does not work with some boards! */
1246  if (tp->flags & HAS_PWRDWN)
1247  pci_write_config_dword(pci, 0x40, 0x00000000);
1248 
1249  if (inl(ioaddr + CSR5) == 0xFFFFFFFF) {
1250  DBG("%s: The Tulip chip at %X is not functioning.\n",
1251  tp->nic_name, (unsigned int) ioaddr);
1252  return 0;
1253  }
1254 
1255  pci_read_config_byte(pci, PCI_REVISION, &chip_rev);
1256 
1257  DBG("%s: [chip: %s] rev %d at %hX\n", tp->nic_name,
1258  tulip_tbl[chip_idx].chip_name, chip_rev, (unsigned int) ioaddr);
1259  DBG("%s: Vendor=%hX Device=%hX", tp->nic_name, tp->vendor_id, tp->dev_id);
1260 
1261  if (chip_idx == DC21041 && inl(ioaddr + CSR9) & 0x8000) {
1262  DBG(" 21040 compatible mode.");
1263  chip_idx = DC21040;
1264  }
1265 
1266  DBG("\n");
1267 
1268  /* The SROM/EEPROM interface varies dramatically. */
1269  sum = 0;
1270  if (chip_idx == DC21040) {
1271  outl(0, ioaddr + CSR9); /* Reset the pointer with a dummy write. */
1272  for (i = 0; i < ETH_ALEN; i++) {
1273  int value, boguscnt = 100000;
1274  do
1275  value = inl(ioaddr + CSR9);
1276  while (value < 0 && --boguscnt > 0);
1277  nic->node_addr[i] = value;
1278  sum += value & 0xff;
1279  }
1280  } else if (chip_idx == LC82C168) {
1281  for (i = 0; i < 3; i++) {
1282  int value, boguscnt = 100000;
1283  outl(0x600 | i, ioaddr + 0x98);
1284  do
1285  value = inl(ioaddr + CSR9);
1286  while (value < 0 && --boguscnt > 0);
1288  sum += value & 0xffff;
1289  }
1290  } else if (chip_idx == COMET) {
1291  /* No need to read the EEPROM. */
1292  put_unaligned(inl(ioaddr + 0xA4), (u32 *)nic->node_addr);
1293  put_unaligned(inl(ioaddr + 0xA8), (u16 *)(nic->node_addr + 4));
1294  for (i = 0; i < ETH_ALEN; i ++)
1295  sum += nic->node_addr[i];
1296  } else {
1297  /* A serial EEPROM interface, we read now and sort it out later. */
1298  int sa_offset = 0;
1299  int ee_addr_size = read_eeprom(ioaddr, 0xff, 8) & 0x40000 ? 8 : 6;
1300 
1301  for (i = 0; i < sizeof(ee_data)/2; i++)
1302  ((u16 *)ee_data)[i] =
1303  le16_to_cpu(read_eeprom(ioaddr, i, ee_addr_size));
1304 
1305  /* DEC now has a specification (see Notes) but early board makers
1306  just put the address in the first EEPROM locations. */
1307  /* This does memcmp(eedata, eedata+16, 8) */
1308  for (i = 0; i < 8; i ++)
1309  if (ee_data[i] != ee_data[16+i])
1310  sa_offset = 20;
1311  if (ee_data[0] == 0xff && ee_data[1] == 0xff && ee_data[2] == 0) {
1312  sa_offset = 2; /* Grrr, damn Matrox boards. */
1313  }
1314  for (i = 0; i < ETH_ALEN; i ++) {
1315  nic->node_addr[i] = ee_data[i + sa_offset];
1316  sum += ee_data[i + sa_offset];
1317  }
1318  }
1319  /* Lite-On boards have the address byte-swapped. */
1320  if ((nic->node_addr[0] == 0xA0 || nic->node_addr[0] == 0xC0)
1321  && nic->node_addr[1] == 0x00)
1322  for (i = 0; i < ETH_ALEN; i+=2) {
1323  char tmp = nic->node_addr[i];
1324  nic->node_addr[i] = nic->node_addr[i+1];
1325  nic->node_addr[i+1] = tmp;
1326  }
1327 
1328  if (sum == 0 || sum == ETH_ALEN*0xff) {
1329  DBG("%s: EEPROM not present!\n", tp->nic_name);
1330  for (i = 0; i < ETH_ALEN-1; i++)
1331  nic->node_addr[i] = last_phys_addr[i];
1332  nic->node_addr[i] = last_phys_addr[i] + 1;
1333  }
1334 
1335  for (i = 0; i < ETH_ALEN; i++)
1336  last_phys_addr[i] = nic->node_addr[i];
1337 
1338  DBG ( "%s: %s at ioaddr %hX\n", tp->nic_name, eth_ntoa ( nic->node_addr ),
1339  (unsigned int) ioaddr );
1340 
1341  tp->chip_id = chip_idx;
1342  tp->revision = chip_rev;
1343  tp->csr0 = csr0;
1344 
1345  /* BugFixes: The 21143-TD hangs with PCI Write-and-Invalidate cycles.
1346  And the ASIX must have a burst limit or horrible things happen. */
1347  if (chip_idx == DC21143 && chip_rev == 65)
1348  tp->csr0 &= ~0x01000000;
1349  else if (tp->flags & IS_ASIX)
1350  tp->csr0 |= 0x2000;
1351 
1352  if (media_cap[tp->default_port] & MediaIsMII) {
1353  static const u16 media2advert[] = { 0x20, 0x40, 0x03e0, 0x60,
1354  0x80, 0x100, 0x200 };
1355  tp->mii_advertise = media2advert[tp->default_port - 9];
1356  tp->mii_advertise |= (tp->flags & HAS_8023X); /* Matching bits! */
1357  }
1358 
1359  /* This is logically part of the probe routine, but too complex
1360  to write inline. */
1361  if (tp->flags & HAS_MEDIA_TABLE) {
1362  memcpy(tp->eeprom, ee_data, sizeof(tp->eeprom));
1363  parse_eeprom(nic);
1364  }
1365 
1366  start_link(nic);
1367 
1368  /* reset the device and make ready for tx and rx of packets */
1369  tulip_reset(nic);
1371 
1372  /* give the board a chance to reset before returning */
1374 
1375  return 1;
1376 }
1377 
1378 static void start_link(struct nic *nic)
1379 {
1380  int i;
1381 
1382  whereami("start_link\n");
1383 
1384  if ((tp->flags & ALWAYS_CHECK_MII) ||
1385  (tp->mtable && tp->mtable->has_mii) ||
1386  ( ! tp->mtable && (tp->flags & HAS_MII))) {
1387  unsigned int phy, phy_idx;
1388  if (tp->mtable && tp->mtable->has_mii) {
1389  for (i = 0; i < tp->mtable->leafcount; i++)
1390  if (tp->mtable->mleaf[i].media == 11) {
1391  tp->cur_index = i;
1392  tp->saved_if_port = tp->if_port;
1393  select_media(nic, 2);
1394  tp->if_port = tp->saved_if_port;
1395  break;
1396  }
1397  }
1398 
1399  /* Find the connected MII xcvrs. */
1400  for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
1401  phy++) {
1402  int mii_status = mdio_read(nic, phy, 1);
1403  if ((mii_status & 0x8301) == 0x8001 ||
1404  ((mii_status & 0x8000) == 0 && (mii_status & 0x7800) != 0)) {
1405  int mii_reg0 = mdio_read(nic, phy, 0);
1406  int mii_advert = mdio_read(nic, phy, 4);
1407  int to_advert;
1408 
1409  if (tp->mii_advertise)
1410  to_advert = tp->mii_advertise;
1411  else if (tp->advertising[phy_idx])
1412  to_advert = tp->advertising[phy_idx];
1413  else /* Leave unchanged. */
1414  tp->mii_advertise = to_advert = mii_advert;
1415 
1416  tp->phys[phy_idx++] = phy;
1417  DBG("%s: MII transceiver %d config %hX status %hX advertising %hX.\n",
1418  tp->nic_name, phy, mii_reg0, mii_status, mii_advert);
1419  /* Fixup for DLink with miswired PHY. */
1420  if (mii_advert != to_advert) {
1421  DBG("%s: Advertising %hX on PHY %d previously advertising %hX.\n",
1422  tp->nic_name, to_advert, phy, mii_advert);
1423  mdio_write(nic, phy, 4, to_advert);
1424  }
1425  /* Enable autonegotiation: some boards default to off. */
1426  mdio_write(nic, phy, 0, mii_reg0 |
1427  (tp->full_duplex ? 0x1100 : 0x1000) |
1428  (media_cap[tp->default_port]&MediaIs100 ? 0x2000:0));
1429  }
1430  }
1431  tp->mii_cnt = phy_idx;
1432  if (tp->mtable && tp->mtable->has_mii && phy_idx == 0) {
1433  DBG("%s: ***WARNING***: No MII transceiver found!\n",
1434  tp->nic_name);
1435  tp->phys[0] = 1;
1436  }
1437  }
1438 
1439  /* Reset the xcvr interface and turn on heartbeat. */
1440  switch (tp->chip_id) {
1441  case DC21040:
1442  outl(0x00000000, ioaddr + CSR13);
1443  outl(0x00000004, ioaddr + CSR13);
1444  break;
1445  case DC21041:
1446  /* This is nway_start(). */
1447  if (tp->sym_advertise == 0)
1448  tp->sym_advertise = 0x0061;
1449  outl(0x00000000, ioaddr + CSR13);
1450  outl(0xFFFFFFFF, ioaddr + CSR14);
1451  outl(0x00000008, ioaddr + CSR15); /* Listen on AUI also. */
1452  outl(inl(ioaddr + CSR6) | 0x0200, ioaddr + CSR6);
1453  outl(0x0000EF01, ioaddr + CSR13);
1454  break;
1455  case DC21140: default:
1456  if (tp->mtable)
1457  outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
1458  break;
1459  case DC21142:
1460  case PNIC2:
1461  if (tp->mii_cnt || media_cap[tp->if_port] & MediaIsMII) {
1462  outl(0x82020000, ioaddr + CSR6);
1463  outl(0x0000, ioaddr + CSR13);
1464  outl(0x0000, ioaddr + CSR14);
1465  outl(0x820E0000, ioaddr + CSR6);
1466  } else
1467  nway_start(nic);
1468  break;
1469  case LC82C168:
1470  if ( ! tp->mii_cnt) {
1471  tp->nway = 1;
1472  tp->nwayset = 0;
1473  outl(0x00420000, ioaddr + CSR6);
1474  outl(0x30, ioaddr + CSR12);
1475  outl(0x0001F078, ioaddr + 0xB8);
1476  outl(0x0201F078, ioaddr + 0xB8); /* Turn on autonegotiation. */
1477  }
1478  break;
1479  case MX98713: case COMPEX9881:
1480  outl(0x00000000, ioaddr + CSR6);
1481  outl(0x000711C0, ioaddr + CSR14); /* Turn on NWay. */
1482  outl(0x00000001, ioaddr + CSR13);
1483  break;
1484  case MX98715: case MX98725:
1485  outl(0x01a80000, ioaddr + CSR6);
1486  outl(0xFFFFFFFF, ioaddr + CSR14);
1487  outl(0x00001000, ioaddr + CSR12);
1488  break;
1489  case COMET:
1490  /* No initialization necessary. */
1491  break;
1492  }
1493 }
1494 
1495 static void nway_start(struct nic *nic __unused)
1496 {
1497  int csr14 = ((tp->sym_advertise & 0x0780) << 9) |
1498  ((tp->sym_advertise&0x0020)<<1) | 0xffbf;
1499 
1500  whereami("nway_start\n");
1501 
1502  tp->if_port = 0;
1503  tp->nway = tp->mediasense = 1;
1504  tp->nwayset = tp->lpar = 0;
1505  if (tp->chip_id == PNIC2) {
1506  tp->csr6 = 0x01000000 | (tp->sym_advertise & 0x0040 ? 0x0200 : 0);
1507  return;
1508  }
1509  DBG2("%s: Restarting internal NWay autonegotiation, %X.\n",
1510  tp->nic_name, csr14);
1511  outl(0x0001, ioaddr + CSR13);
1512  outl(csr14, ioaddr + CSR14);
1513  tp->csr6 = 0x82420000 | (tp->sym_advertise & 0x0040 ? 0x0200 : 0);
1514  outl(tp->csr6, ioaddr + CSR6);
1515  if (tp->mtable && tp->mtable->csr15dir) {
1518  } else if (tp->chip_id != PNIC2)
1519  outw(0x0008, ioaddr + CSR15);
1520  if (tp->chip_id == DC21041) /* Trigger NWAY. */
1521  outl(0xEF01, ioaddr + CSR12);
1522  else
1523  outl(0x1301, ioaddr + CSR12);
1524 }
1525 
1526 static void init_media(struct nic *nic)
1527 {
1528  int i;
1529 
1530  whereami("init_media\n");
1531 
1532  tp->saved_if_port = tp->if_port;
1533  if (tp->if_port == 0)
1534  tp->if_port = tp->default_port;
1535 
1536  /* Allow selecting a default media. */
1537  i = 0;
1538  if (tp->mtable == NULL)
1539  goto media_picked;
1540  if (tp->if_port) {
1541  int looking_for = media_cap[tp->if_port] & MediaIsMII ? 11 :
1542  (tp->if_port == 12 ? 0 : tp->if_port);
1543  for (i = 0; i < tp->mtable->leafcount; i++)
1544  if (tp->mtable->mleaf[i].media == looking_for) {
1545  DBG("%s: Using user-specified media %s.\n",
1547  goto media_picked;
1548  }
1549  }
1550  if ((tp->mtable->defaultmedia & 0x0800) == 0) {
1551  int looking_for = tp->mtable->defaultmedia & 15;
1552  for (i = 0; i < tp->mtable->leafcount; i++)
1553  if (tp->mtable->mleaf[i].media == looking_for) {
1554  DBG("%s: Using EEPROM-set media %s.\n",
1555  tp->nic_name, medianame[looking_for]);
1556  goto media_picked;
1557  }
1558  }
1559  /* Start sensing first non-full-duplex media. */
1560  for (i = tp->mtable->leafcount - 1;
1561  (media_cap[tp->mtable->mleaf[i].media] & MediaAlwaysFD) && i > 0; i--)
1562  ;
1563  media_picked:
1564 
1565  tp->csr6 = 0;
1566  tp->cur_index = i;
1567  tp->nwayset = 0;
1568 
1569  if (tp->if_port) {
1570  if (tp->chip_id == DC21143 && media_cap[tp->if_port] & MediaIsMII) {
1571  /* We must reset the media CSRs when we force-select MII mode. */
1572  outl(0x0000, ioaddr + CSR13);
1573  outl(0x0000, ioaddr + CSR14);
1574  outl(0x0008, ioaddr + CSR15);
1575  }
1576  select_media(nic, 1);
1577  return;
1578  }
1579  switch(tp->chip_id) {
1580  case DC21041:
1581  /* tp->nway = 1;*/
1582  nway_start(nic);
1583  break;
1584  case DC21142:
1585  if (tp->mii_cnt) {
1586  select_media(nic, 1);
1587  DBG2("%s: Using MII transceiver %d, status %hX.\n",
1588  tp->nic_name, tp->phys[0], mdio_read(nic, tp->phys[0], 1));
1589  outl(0x82020000, ioaddr + CSR6);
1590  tp->csr6 = 0x820E0000;
1591  tp->if_port = 11;
1592  outl(0x0000, ioaddr + CSR13);
1593  outl(0x0000, ioaddr + CSR14);
1594  } else
1595  nway_start(nic);
1596  break;
1597  case PNIC2:
1598  nway_start(nic);
1599  break;
1600  case LC82C168:
1601  if (tp->mii_cnt) {
1602  tp->if_port = 11;
1603  tp->csr6 = 0x814C0000 | (tp->full_duplex ? 0x0200 : 0);
1604  outl(0x0001, ioaddr + CSR15);
1605  } else if (inl(ioaddr + CSR5) & TPLnkPass)
1606  pnic_do_nway(nic);
1607  else {
1608  /* Start with 10mbps to do autonegotiation. */
1609  outl(0x32, ioaddr + CSR12);
1610  tp->csr6 = 0x00420000;
1611  outl(0x0001B078, ioaddr + 0xB8);
1612  outl(0x0201B078, ioaddr + 0xB8);
1613  }
1614  break;
1615  case MX98713: case COMPEX9881:
1616  tp->if_port = 0;
1617  tp->csr6 = 0x01880000 | (tp->full_duplex ? 0x0200 : 0);
1618  outl(0x0f370000 | inw(ioaddr + 0x80), ioaddr + 0x80);
1619  break;
1620  case MX98715: case MX98725:
1621  /* Provided by BOLO, Macronix - 12/10/1998. */
1622  tp->if_port = 0;
1623  tp->csr6 = 0x01a80200;
1624  outl(0x0f370000 | inw(ioaddr + 0x80), ioaddr + 0x80);
1625  outl(0x11000 | inw(ioaddr + 0xa0), ioaddr + 0xa0);
1626  break;
1627  case COMET:
1628  /* Enable automatic Tx underrun recovery */
1629  outl(inl(ioaddr + 0x88) | 1, ioaddr + 0x88);
1630  tp->if_port = 0;
1631  tp->csr6 = 0x00040000;
1632  break;
1633  case AX88140: case AX88141:
1634  tp->csr6 = tp->mii_cnt ? 0x00040100 : 0x00000100;
1635  break;
1636  default:
1637  select_media(nic, 1);
1638  }
1639 }
1640 
1641 static void pnic_do_nway(struct nic *nic __unused)
1642 {
1643  u32 phy_reg = inl(ioaddr + 0xB8);
1644  u32 new_csr6 = tp->csr6 & ~0x40C40200;
1645 
1646  whereami("pnic_do_nway\n");
1647 
1648  if (phy_reg & 0x78000000) { /* Ignore baseT4 */
1649  if (phy_reg & 0x20000000) tp->if_port = 5;
1650  else if (phy_reg & 0x40000000) tp->if_port = 3;
1651  else if (phy_reg & 0x10000000) tp->if_port = 4;
1652  else if (phy_reg & 0x08000000) tp->if_port = 0;
1653  tp->nwayset = 1;
1654  new_csr6 = (tp->if_port & 1) ? 0x01860000 : 0x00420000;
1655  outl(0x32 | (tp->if_port & 1), ioaddr + CSR12);
1656  if (tp->if_port & 1)
1657  outl(0x1F868, ioaddr + 0xB8);
1658  if (phy_reg & 0x30000000) {
1659  tp->full_duplex = 1;
1660  new_csr6 |= 0x00000200;
1661  }
1662  DBG2("%s: PNIC autonegotiated status %X, %s.\n",
1663  tp->nic_name, phy_reg, medianame[tp->if_port]);
1664  if (tp->csr6 != new_csr6) {
1665  tp->csr6 = new_csr6;
1666  outl(tp->csr6 | 0x0002, ioaddr + CSR6); /* Restart Tx */
1667  outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1668  }
1669  }
1670 }
1671 
1672 /* Set up the transceiver control registers for the selected media type. */
1673 static void select_media(struct nic *nic, int startup)
1674 {
1675  struct mediatable *mtable = tp->mtable;
1676  u32 new_csr6;
1677  int i;
1678 
1679  whereami("select_media\n");
1680 
1681  if (mtable) {
1682  struct medialeaf *mleaf = &mtable->mleaf[tp->cur_index];
1683  unsigned char *p = mleaf->leafdata;
1684  switch (mleaf->type) {
1685  case 0: /* 21140 non-MII xcvr. */
1686  DBG2("%s: Using a 21140 non-MII transceiver"
1687  " with control setting %hhX.\n",
1688  tp->nic_name, p[1]);
1689  tp->if_port = p[0];
1690  if (startup)
1691  outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1692  outl(p[1], ioaddr + CSR12);
1693  new_csr6 = 0x02000000 | ((p[2] & 0x71) << 18);
1694  break;
1695  case 2: case 4: {
1696  u16 setup[5];
1697  u32 csr13val, csr14val, csr15dir, csr15val;
1698  for (i = 0; i < 5; i++)
1699  setup[i] = get_u16(&p[i*2 + 1]);
1700 
1701  tp->if_port = p[0] & 15;
1703  tp->full_duplex = 1;
1704 
1705  if (startup && mtable->has_reset) {
1706  struct medialeaf *rleaf = &mtable->mleaf[mtable->has_reset];
1707  unsigned char *rst = rleaf->leafdata;
1708  DBG2("%s: Resetting the transceiver.\n",
1709  tp->nic_name);
1710  for (i = 0; i < rst[0]; i++)
1711  outl(get_u16(rst + 1 + (i<<1)) << 16, ioaddr + CSR15);
1712  }
1713  DBG2("%s: 21143 non-MII %s transceiver control %hX/%hX.\n",
1714  tp->nic_name, medianame[tp->if_port], setup[0], setup[1]);
1715  if (p[0] & 0x40) { /* SIA (CSR13-15) setup values are provided. */
1716  csr13val = setup[0];
1717  csr14val = setup[1];
1718  csr15dir = (setup[3]<<16) | setup[2];
1719  csr15val = (setup[4]<<16) | setup[2];
1720  outl(0, ioaddr + CSR13);
1721  outl(csr14val, ioaddr + CSR14);
1722  outl(csr15dir, ioaddr + CSR15); /* Direction */
1723  outl(csr15val, ioaddr + CSR15); /* Data */
1724  outl(csr13val, ioaddr + CSR13);
1725  } else {
1726  csr13val = 1;
1727  csr14val = 0x0003FF7F;
1728  csr15dir = (setup[0]<<16) | 0x0008;
1729  csr15val = (setup[1]<<16) | 0x0008;
1730  if (tp->if_port <= 4)
1731  csr14val = t21142_csr14[tp->if_port];
1732  if (startup) {
1733  outl(0, ioaddr + CSR13);
1734  outl(csr14val, ioaddr + CSR14);
1735  }
1736  outl(csr15dir, ioaddr + CSR15); /* Direction */
1737  outl(csr15val, ioaddr + CSR15); /* Data */
1738  if (startup) outl(csr13val, ioaddr + CSR13);
1739  }
1740  DBG2("%s: Setting CSR15 to %X/%X.\n",
1741  tp->nic_name, csr15dir, csr15val);
1742  if (mleaf->type == 4)
1743  new_csr6 = 0x82020000 | ((setup[2] & 0x71) << 18);
1744  else
1745  new_csr6 = 0x82420000;
1746  break;
1747  }
1748  case 1: case 3: {
1749  int phy_num = p[0];
1750  int init_length = p[1];
1751  u16 *misc_info;
1752 
1753  tp->if_port = 11;
1754  new_csr6 = 0x020E0000;
1755  if (mleaf->type == 3) { /* 21142 */
1756  u16 *init_sequence = (u16*)(p+2);
1757  u16 *reset_sequence = &((u16*)(p+3))[init_length];
1758  int reset_length = p[2 + init_length*2];
1759  misc_info = reset_sequence + reset_length;
1760  if (startup)
1761  for (i = 0; i < reset_length; i++)
1762  outl(get_u16(&reset_sequence[i]) << 16, ioaddr + CSR15);
1763  for (i = 0; i < init_length; i++)
1764  outl(get_u16(&init_sequence[i]) << 16, ioaddr + CSR15);
1765  } else {
1766  u8 *init_sequence = p + 2;
1767  u8 *reset_sequence = p + 3 + init_length;
1768  int reset_length = p[2 + init_length];
1769  misc_info = (u16*)(reset_sequence + reset_length);
1770  if (startup) {
1771  outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1772  for (i = 0; i < reset_length; i++)
1773  outl(reset_sequence[i], ioaddr + CSR12);
1774  }
1775  for (i = 0; i < init_length; i++)
1776  outl(init_sequence[i], ioaddr + CSR12);
1777  }
1778  tp->advertising[phy_num] = get_u16(&misc_info[1]) | 1;
1779  if (startup < 2) {
1780  if (tp->mii_advertise == 0)
1781  tp->mii_advertise = tp->advertising[phy_num];
1782  DBG2("%s: Advertising %hX on MII %d.\n",
1783  tp->nic_name, tp->mii_advertise, tp->phys[phy_num]);
1784  mdio_write(nic, tp->phys[phy_num], 4, tp->mii_advertise);
1785  }
1786  break;
1787  }
1788  default:
1789  DBG("%s: Invalid media table selection %d.\n",
1790  tp->nic_name, mleaf->type);
1791  new_csr6 = 0x020E0000;
1792  }
1793  DBG2("%s: Using media type %s, CSR12 is %hhX.\n",
1795  inl(ioaddr + CSR12) & 0xff);
1796  } else if (tp->chip_id == DC21041) {
1797  int port = tp->if_port <= 4 ? tp->if_port : 0;
1798  DBG2("%s: 21041 using media %s, CSR12 is %hX.\n",
1799  tp->nic_name, medianame[port == 3 ? 12: port],
1800  inl(ioaddr + CSR12));
1801  outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1805  new_csr6 = 0x80020000;
1806  } else if (tp->chip_id == LC82C168) {
1807  if (startup && ! tp->medialock)
1808  tp->if_port = tp->mii_cnt ? 11 : 0;
1809  DBG2("%s: PNIC PHY status is %hX, media %s.\n",
1810  tp->nic_name, inl(ioaddr + 0xB8), medianame[tp->if_port]);
1811  if (tp->mii_cnt) {
1812  new_csr6 = 0x810C0000;
1813  outl(0x0001, ioaddr + CSR15);
1814  outl(0x0201B07A, ioaddr + 0xB8);
1815  } else if (startup) {
1816  /* Start with 10mbps to do autonegotiation. */
1817  outl(0x32, ioaddr + CSR12);
1818  new_csr6 = 0x00420000;
1819  outl(0x0001B078, ioaddr + 0xB8);
1820  outl(0x0201B078, ioaddr + 0xB8);
1821  } else if (tp->if_port == 3 || tp->if_port == 5) {
1822  outl(0x33, ioaddr + CSR12);
1823  new_csr6 = 0x01860000;
1824  /* Trigger autonegotiation. */
1825  outl(startup ? 0x0201F868 : 0x0001F868, ioaddr + 0xB8);
1826  } else {
1827  outl(0x32, ioaddr + CSR12);
1828  new_csr6 = 0x00420000;
1829  outl(0x1F078, ioaddr + 0xB8);
1830  }
1831  } else if (tp->chip_id == DC21040) { /* 21040 */
1832  /* Turn on the xcvr interface. */
1833  int csr12 = inl(ioaddr + CSR12);
1834  DBG2("%s: 21040 media type is %s, CSR12 is %hhX.\n",
1835  tp->nic_name, medianame[tp->if_port], csr12);
1837  tp->full_duplex = 1;
1838  new_csr6 = 0x20000;
1839  /* Set the full duplux match frame. */
1841  outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1842  if (t21040_csr13[tp->if_port] & 8) {
1843  outl(0x0705, ioaddr + CSR14);
1844  outl(0x0006, ioaddr + CSR15);
1845  } else {
1846  outl(0xffff, ioaddr + CSR14);
1847  outl(0x0000, ioaddr + CSR15);
1848  }
1849  outl(0x8f01 | t21040_csr13[tp->if_port], ioaddr + CSR13);
1850  } else { /* Unknown chip type with no media table. */
1851  if (tp->default_port == 0)
1852  tp->if_port = tp->mii_cnt ? 11 : 3;
1853  if (media_cap[tp->if_port] & MediaIsMII) {
1854  new_csr6 = 0x020E0000;
1855  } else if (media_cap[tp->if_port] & MediaIsFx) {
1856  new_csr6 = 0x028600000;
1857  } else
1858  new_csr6 = 0x038600000;
1859  DBG2("%s: No media description table, assuming "
1860  "%s transceiver, CSR12 %hhX.\n",
1862  inl(ioaddr + CSR12));
1863  }
1864 
1865  tp->csr6 = new_csr6 | (tp->csr6 & 0xfdff) | (tp->full_duplex ? 0x0200 : 0);
1866  return;
1867 }
1868 
1869 /*
1870  Check the MII negotiated duplex and change the CSR6 setting if
1871  required.
1872  Return 0 if everything is OK.
1873  Return < 0 if the transceiver is missing or has no link beat.
1874 */
1875 static int tulip_check_duplex(struct nic *nic)
1876 {
1877  unsigned int bmsr, lpa, negotiated, new_csr6;
1878 
1879  bmsr = mdio_read(nic, tp->phys[0], 1);
1880  lpa = mdio_read(nic, tp->phys[0], 5);
1881 
1882  DBG2("%s: MII status %#x, Link partner report %#x.\n",
1883  tp->nic_name, bmsr, lpa);
1884 
1885  if (bmsr == 0xffff)
1886  return -2;
1887  if ((bmsr & 4) == 0) {
1888  int new_bmsr = mdio_read(nic, tp->phys[0], 1);
1889  if ((new_bmsr & 4) == 0) {
1890  DBG2("%s: No link beat on the MII interface,"
1891  " status %#x.\n", tp->nic_name,
1892  new_bmsr);
1893  return -1;
1894  }
1895  }
1896  tp->full_duplex = lpa & 0x140;
1897 
1898  new_csr6 = tp->csr6;
1899  negotiated = lpa & tp->advertising[0];
1900 
1901  if(negotiated & 0x380) new_csr6 &= ~0x400000;
1902  else new_csr6 |= 0x400000;
1903  if (tp->full_duplex) new_csr6 |= 0x200;
1904  else new_csr6 &= ~0x200;
1905 
1906  if (new_csr6 != tp->csr6) {
1907  tp->csr6 = new_csr6;
1908 
1909  DBG("%s: Setting %s-duplex based on MII"
1910  "#%d link partner capability of %#x.\n",
1911  tp->nic_name,
1912  tp->full_duplex ? "full" : "half",
1913  tp->phys[0], lpa);
1914  return 1;
1915  }
1916 
1917  return 0;
1918 }
1919 
1920 static struct pci_device_id tulip_nics[] = {
1921 PCI_ROM(0x1011, 0x0002, "dc21040", "Digital Tulip", 0),
1922 PCI_ROM(0x1011, 0x0009, "ds21140", "Digital Tulip Fast", 0),
1923 PCI_ROM(0x1011, 0x0014, "dc21041", "Digital Tulip+", 0),
1924 PCI_ROM(0x1011, 0x0019, "ds21142", "Digital Tulip 21142", 0),
1925 PCI_ROM(0x104a, 0x0981, "tulip-0981", "Tulip 0x104a 0x0981", 0),
1926 PCI_ROM(0x104a, 0x2774, "SGThomson-STE10100A", "Tulip 0x104a 0x2774", 0), /*Modified by Ramesh Chander*/
1927 PCI_ROM(0x10b7, 0x9300, "3csoho100b-tx","3ComSOHO100B-TX", 0),
1928 PCI_ROM(0x10b9, 0x5261, "ali1563", "ALi 1563 integrated ethernet", 0),
1929 PCI_ROM(0x10d9, 0x0512, "mx98713", "Macronix MX987x3", 0),
1930 PCI_ROM(0x10d9, 0x0531, "mx98715", "Macronix MX987x5", 0),
1931 PCI_ROM(0x1113, 0x1216, "an983", "ADMTek AN983 Comet", 0),
1932 PCI_ROM(0x1113, 0x1217, "mxic-98715", "Macronix MX987x5", 0),
1933 PCI_ROM(0x1113, 0x9511, "tulip-9511", "Tulip 0x1113 0x9511", 0),
1934 PCI_ROM(0x115d, 0x0003, "xircomtulip", "Xircom Tulip", 0),
1935 PCI_ROM(0x1186, 0x1561, "tulip-1561", "Tulip 0x1186 0x1561", 0),
1936 PCI_ROM(0x11ad, 0x0002, "82c168", "Netgear FA310TX", 0),
1937 PCI_ROM(0x11ad, 0xc115, "lc82c115", "LinkSys LNE100TX", 0),
1938 PCI_ROM(0x11f6, 0x9881, "rl100tx", "Compex RL100-TX", 0),
1939 PCI_ROM(0x1259, 0xa120, "tulip-a120", "Tulip 0x1259 0xa120", 0),
1940 PCI_ROM(0x125b, 0x1400, "ax88140", "ASIX AX88140", 0),
1941 PCI_ROM(0x1282, 0x9009, "dm9009", "Davicom 9009", 0),
1942 PCI_ROM(0x1282, 0x9100, "dm9100", "Davicom 9100", 0),
1943 PCI_ROM(0x1282, 0x9102, "dm9102", "Davicom 9102", 0),
1944 PCI_ROM(0x1282, 0x9132, "dm9132", "Davicom 9132", 0),
1945 PCI_ROM(0x1317, 0x0981, "an981", "ADMtek AN981 Comet", 0), /* ADMTek Centaur-P (stmicro) */
1946 PCI_ROM(0x1317, 0x0985, "centaur-p", "ADMtek Centaur-P", 0),
1947 PCI_ROM(0x1317, 0x1985, "centaur-c", "ADMTek Centaur-C", 0),
1948 PCI_ROM(0x1317, 0x9511, "an983b", "ADMTek Comet 983b", 0),
1949 PCI_ROM(0x13d1, 0xab02, "tulip-ab02", "Tulip 0x13d1 0xab02", 0),
1950 PCI_ROM(0x13d1, 0xab03, "tulip-ab03", "Tulip 0x13d1 0xab03", 0),
1951 PCI_ROM(0x13d1, 0xab08, "tulip-ab08", "Tulip 0x13d1 0xab08", 0),
1952 PCI_ROM(0x14f1, 0x1803, "lanfinity", "Conexant LANfinity", 0),
1953 PCI_ROM(0x1626, 0x8410, "tulip-8410", "Tulip 0x1626 0x8410", 0),
1954 PCI_ROM(0x1737, 0xab08, "tulip-1737-ab08","Tulip 0x1737 0xab08", 0),
1955 PCI_ROM(0x1737, 0xab09, "tulip-ab09", "Tulip 0x1737 0xab09", 0),
1956 PCI_ROM(0x8086, 0x0039, "intel21145", "Intel Tulip", 0),
1957 };
1958 
1959 PCI_DRIVER ( tulip_driver, tulip_nics, PCI_NO_CLASS );
1960 
1961 DRIVER ( "Tulip", nic_driver, pci_driver, tulip_driver,
1963 
1964 /*
1965  * Local variables:
1966  * c-basic-offset: 8
1967  * c-indent-level: 8
1968  * tab-width: 8
1969  * End:
1970  */
Definition: tulip.c:295
u32 length
Definition: tulip.c:385
unsigned char irqno
Definition: nic.h:56
unsigned char txb[BUFLEN]
Definition: tulip.c:431
uint16_t u16
Definition: stdint.h:21
unsigned char rxb[RX_RING_SIZE *BUFLEN]
Definition: tulip.c:433
Definition: tulip.c:151
static u8 t21040_csr13[]
Definition: tulip.c:277
Definition: nic.h:35
const char * name
Definition: ath9k_hw.c:1984
Definition: tulip.c:304
u32 csr15val
Definition: tulip.c:330
Definition: tulip.c:304
#define BUFLEN
Definition: tulip.c:365
struct medialeaf mleaf[0]
Definition: tulip.c:331
PCI_DRIVER(tulip_driver, tulip_nics, PCI_NO_CLASS)
u8 csr12dir
Definition: tulip.c:328
#define TICKS_PER_SEC
Number of ticks per second.
Definition: timer.h:15
Definition: tulip.c:295
uint16_t inw(volatile uint16_t *io_addr)
Read 16-bit word from I/O-mapped device.
unsigned short dev_id
Definition: tulip.c:402
#define EE_CS
Definition: tulip.c:352
A PCI driver.
Definition: pci.h:251
int drv_flags
Definition: tulip.c:173
u32 buffer1
Definition: tulip.c:380
unsigned char ehdr[ETH_HLEN]
Definition: tulip.c:403
u8 media
Definition: tulip.c:322
Definition: tulip.c:152
Definition: tulip.c:297
Definition: tulip.c:152
status_bits
Definition: tulip.c:301
#define outw(data, io_addr)
Definition: io.h:319
unsigned long ioaddr
I/O address.
Definition: pci.h:225
static const char * block_name[]
Definition: tulip.c:481
Definition: tulip.c:295
#define MDIO_ENB
Definition: tulip.c:547
static int mdio_read(struct nic *nic, int phy_id, int location)
static int chip_idx
Definition: tlan.c:196
char * name
Definition: tulip.c:448
static void tulip_irq(struct nic *nic __unused, irq_action_t action __unused)
Definition: tulip.c:1151
static void select_media(struct nic *nic, int startup)
Definition: tulip.c:1673
#define TX_RING_SIZE
Definition: tulip.c:427
static void nway_start(struct nic *nic)
unsigned int default_port
Definition: tulip.c:412
Definition: tulip.c:295
int revision
Definition: tulip.c:399
#define rxb
Definition: tulip.c:440
#define MDIO_DATA_WRITE1
Definition: tulip.c:546
static struct tulip_chip_table tulip_tbl[]
struct mediatable * mtable
Definition: tulip.c:416
static const char media_cap[32]
Definition: tulip.c:275
#define EE_DATA_READ
Definition: tulip.c:356
static u16 t21041_csr14[]
Definition: tulip.c:281
static unsigned char ee_data[EEPROM_SIZE]
Definition: davicom.c:67
static const int csr0
Definition: tulip.c:137
uint16_t bp
Definition: registers.h:23
DRIVER("Tulip", nic_driver, pci_driver, tulip_driver, tulip_probe, tulip_disable, tulip_bss)
#define MEDIA_MASK
Definition: tulip.c:140
#define DESC_RING_WRAP
Definition: tulip.c:374
static u16 t21041_csr15[]
Definition: tulip.c:282
u16 advertising[4]
Definition: tulip.c:418
Definition: tulip.c:152
int io_size
Definition: tulip.c:172
Definition: tulip.c:305
int flags
Definition: tulip.c:400
Definition: tulip.c:153
unsigned has_mii
Definition: tulip.c:329
struct mediainfo * next
Definition: tulip.c:335
Definition: tulip.c:152
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:240
Definition: tulip.c:296
static void tulip_transmit(struct nic *nic, const char *d, unsigned int t, unsigned int s, const char *p)
Definition: tulip.c:1041
char * chip_name
Definition: tulip.c:243
static void whereami(const char *str)
Definition: tulip.c:513
#define RX_RING_SIZE
Definition: tulip.c:428
int dummy_connect(struct nic *nic __unused)
Definition: legacy.c:175
#define FULL_DUPLEX_MAGIC
Definition: tulip.c:135
int saved_if_port
Definition: tulip.c:421
unsigned char * info
Definition: tulip.c:338
#define eeprom_delay()
Definition: tulip.c:362
#define EE_DATA_WRITE
Definition: tulip.c:353
int chip_id
Definition: tulip.c:397
u16 lpar
Definition: tulip.c:417
Definition: tulip.c:152
Definition: tulip.c:235
eeprom
Definition: 3c90x.h:232
#define EE_READ_CMD
Definition: tulip.c:347
Definition: tulip.c:151
unsigned long tmp
Definition: linux_pci.h:64
unsigned int csr0
Definition: tulip.c:405
static u32 ioaddr
Definition: tulip.c:393
void * memcpy(void *dest, const void *src, size_t len) __nonnull
unsigned int ioaddr
Definition: nic.h:55
#define MDIO_DATA_READ
Definition: tulip.c:549
u16 newtable[32]
Definition: tulip.c:450
u8 port
Port number.
Definition: CIB_PRM.h:31
static u16 t21041_csr13[]
Definition: tulip.c:280
uint16_t device
Device ID.
Definition: pci.h:229
tbl_flag
Definition: tulip.c:234
#define ETH_HLEN
Definition: if_ether.h:9
#define DBGP(...)
Definition: compiler.h:532
const char * name
Definition: tlan.c:110
Ethernet protocol.
Definition: tulip.c:295
#define TULIP_IOTYPE
Definition: tulip.c:128
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
unsigned char eeprom[EEPROM_SIZE]
Definition: tulip.c:413
static void tulip_wait(unsigned int nticks)
Definition: tulip.c:519
static int tulip_probe(struct nic *nic, struct pci_device *pci)
Definition: tulip.c:1174
char * name
Definition: tulip.c:166
pci_id_flags_bits
Definition: sundance.c:248
u32 buffer2
Definition: tulip.c:386
#define EEPROM_SIZE
Definition: tulip.c:343
static int tulip_check_duplex(struct nic *nic)
Definition: tulip.c:1875
static unsigned int count
Number of entries.
Definition: dwmac.h:225
u8 media_table_storage[(sizeof(struct mediatable)+32 *sizeof(struct medialeaf))]
Definition: tulip.c:414
irq_action_t
Definition: nic.h:34
Definition: tulip.c:296
static struct tulip_private * tp
Definition: tulip.c:442
Definition: tulip.c:153
const char * nic_name
Definition: tulip.c:404
static void pnic_do_nway(struct nic *nic)
static struct pci_device_id tulip_nics[]
Definition: tulip.c:1920
#define cpu_to_le32(value)
Definition: byteswap.h:107
u8 leafcount
Definition: tulip.c:328
#define EE_ENB
Definition: tulip.c:357
static const struct pci_id_info pci_id_tbl[]
Definition: tulip.c:176
tulip_offsets
Definition: tulip.c:294
static void mdio_write(struct nic *nic, int phy_id, int location, int value)
unsigned int packetlen
Definition: nic.h:54
Definition: tulip.c:151
#define get_u16(ptr)
Definition: tulip.c:125
Definition: tulip.c:297
unsigned int if_port
Definition: tulip.c:406
Definition: tulip.c:152
desc_status_bits
Definition: sundance.c:215
volatile u32 status
Definition: tulip.c:384
tulip_chips
Definition: tulip.c:150
#define outl(data, io_addr)
Definition: io.h:329
u16 defaultmedia
Definition: tulip.c:327
PCI bus.
A PCI device.
Definition: pci.h:210
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
int index
Definition: tulip.c:337
u16 sym_advertise
Definition: tulip.c:415
#define put_unaligned(val, ptr)
Definition: tulip.c:124
unsigned int full_duplex_lock
Definition: tulip.c:408
static void tulip_reset(struct nic *nic)
Definition: tulip.c:924
#define TX_TIME_OUT
Definition: tulip.c:119
#define MDIO_ENB_IN
Definition: tulip.c:548
unsigned char addr2
Definition: tulip.c:449
volatile u32 status
Definition: tulip.c:378
Definition: tulip.c:310
#define ETH_ALEN
Definition: if_ether.h:8
#define ETH_ZLEN
Definition: if_ether.h:10
A PCI device ID list entry.
Definition: pci.h:174
Definition: tulip.c:310
unsigned has_nonmii
Definition: tulip.c:329
Definition: nic.h:37
Definition: tulip.c:296
#define le16_to_cpu(value)
Definition: byteswap.h:112
Definition: nic.h:49
const char * name
Name.
Definition: pci.h:176
Definition: tulip.c:295
u32 buffer2
Definition: tulip.c:380
uint16_t vendor
Vendor ID.
Definition: pci.h:227
uint8_t status
Status.
Definition: ena.h:16
static const char *const medianame[32]
Definition: tulip.c:141
struct pci_id_info::match_info id
unsigned long retval
Definition: xen.h:45
unsigned has_reset
Definition: tulip.c:329
static struct fixups eeprom_fixups[]
Definition: tulip.c:297
Definition: nic.h:36
unsigned char * packet
Definition: nic.h:53
#define MDIO_SHIFT_CLK
Definition: tulip.c:544
unsigned char * node_addr
Definition: nic.h:52
static int tulip_poll(struct nic *nic, int retrieve)
Definition: tulip.c:1096
enum pci_id_flags_bits pci_flags
Definition: tulip.c:171
static void parse_eeprom(struct nic *nic)
Definition: tulip.c:716
u32 buffer1
Definition: tulip.c:386
#define mdio_delay()
Definition: tulip.c:539
Definition: tulip.c:297
#define TULIP_SIZE
Definition: tulip.c:129
struct tulip_tx_desc tx_ring[TX_RING_SIZE]
Definition: tulip.c:430
static struct nic_operations tulip_operations
Definition: tulip.c:1163
int info_type
Definition: tulip.c:336
#define virt_to_le32desc(addr)
Definition: tulip.c:126
csr6_mode_bits
Definition: tulip.c:309
Definition: tulip.c:296
#define rx_ring
Definition: tulip.c:439
Definition: tulip.c:305
unsigned int full_duplex
Definition: tulip.c:407
FILE_LICENCE(GPL_ANY)
int cur_index
Definition: tulip.c:420
uint32_t inl(volatile uint32_t *io_addr)
Read 32-bit dword from I/O-mapped device.
static int read_eeprom(unsigned long ioaddr, int location, int addr_len)
Definition: tulip.c:677
signed char phys[4]
Definition: tulip.c:419
Definition: tulip.c:238
struct pci_device_id * id
Driver device ID.
Definition: pci.h:247
int pci_write_config_dword(struct pci_device *pci, unsigned int where, uint32_t value)
Write 32-bit dword to PCI configuration space.
static char media[]
Definition: sundance.c:85
unsigned int nwayset
Definition: tulip.c:411
#define PCI_REVISION
PCI revision.
Definition: pci.h:44
unsigned int nway
Definition: tulip.c:411
unsigned int mediasense
Definition: tulip.c:410
struct tulip_rx_desc rx_ring[RX_RING_SIZE]
Definition: tulip.c:432
unsigned int medialock
Definition: tulip.c:409
Definition: tulip.c:151
Definition: tulip.c:296
Definition: tulip.c:305
int cur_rx
Definition: tulip.c:396
static void set_rx_mode(struct nic *nic __unused)
Definition: tulip.c:906
Definition: tulip.c:152
Definition: tulip.c:296
static void start_link(struct nic *nic)
Definition: tulip.c:1378
Definition: tulip.c:151
unsigned long currticks(void)
Get current system time in ticks.
Definition: timer.c:42
signed char mii_cnt
Definition: tulip.c:419
u32 length
Definition: tulip.c:379
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
struct tulip_private tpx
Definition: tulip.c:434
struct nic_operations * nic_op
Definition: nic.h:50
unsigned int csr6
Definition: tulip.c:405
static void tulip_init_ring(struct nic *nic)
u32 csr15dir
Definition: tulip.c:330
MediaIs
Definition: tulip.c:271
Definition: tulip.c:447
#define txb
Definition: tulip.c:438
static u16 t21142_csr14[]
Definition: tulip.c:287
static struct command_descriptor read_cmd
"read" command descriptor
Definition: nvo_cmd.c:134
int(* connect)(struct nic *)
Definition: nic.h:69
#define tx_ring
Definition: tulip.c:437
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
u16 mii_advertise
Definition: tulip.c:415
unsigned char addr1
Definition: tulip.c:449
#define get_unaligned(ptr)
Definition: tulip.c:123
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:307
unsigned char * leafdata
Definition: tulip.c:323
#define htons(value)
Definition: byteswap.h:135
#define EE_SHIFT_CLK
Definition: tulip.c:351
u8 type
Definition: tulip.c:321
Definition: tulip.c:304
unsigned char addr0
Definition: tulip.c:449
uint8_t u8
Definition: stdint.h:19
int pci_id_idx
Definition: tulip.c:398
unsigned short vendor_id
Definition: tulip.c:401
uint32_t u32
Definition: stdint.h:23
void startup(void)
Start up iPXE.
Definition: init.c:69
static void tulip_disable(struct nic *nic, void *hwdev)
#define DBG2(...)
Definition: compiler.h:515
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
Definition: tulip.c:297
static void init_media(struct nic *nic)
Definition: tulip.c:1526
Definition: tulip.c:297