[contrib] Allow Network Protocol header to display in rom-o-matic
[gpxe.git] / src / drivers / net / tulip.c
blobaf30ec646e6219d9f69e51142c04b99286358d05
1 /* -*- Mode:C; c-basic-offset:4; -*- */
3 /*
4 Tulip and clone Etherboot Driver
6 By Marty Connor (mdc@etherboot.org)
7 Copyright (C) 2001 Entity Cyber, Inc.
9 This software may be used and distributed according to the terms
10 of the GNU Public License, incorporated herein by reference.
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.
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.
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
33 Adapted by Ken Yap from
34 FreeBSD netboot DEC 21143 driver
35 Author: David Sharp
36 date: Nov/98
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
46 FILE_LICENCE ( GPL_ANY );
48 /*********************************************************************/
49 /* Revision History */
50 /*********************************************************************/
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.
107 /*********************************************************************/
108 /* Declarations */
109 /*********************************************************************/
111 #include "etherboot.h"
112 #include "nic.h"
114 #include <gpxe/ethernet.h>
115 #include <gpxe/pci.h>
117 /* User settable parameters */
119 #undef TULIP_DEBUG
120 #undef TULIP_DEBUG_WHERE
121 #ifdef TULIP_DEBUG
122 static int tulip_debug = 2; /* 1 normal messages, 0 quiet .. 7 verbose. */
123 #endif
125 #define TX_TIME_OUT 2*TICKS_PER_SEC
127 /* helpful macros if on a big_endian machine for changing byte order.
128 not strictly needed on Intel */
129 #define get_unaligned(ptr) (*(ptr))
130 #define put_unaligned(val, ptr) ((void)( *(ptr) = (val) ))
131 #define get_u16(ptr) (*(u16 *)(ptr))
132 #define virt_to_le32desc(addr) virt_to_bus(addr)
134 #define TULIP_IOTYPE PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0
135 #define TULIP_SIZE 0x80
137 /* This is a mysterious value that can be written to CSR11 in the 21040 (only)
138 to support a pre-NWay full-duplex signaling mechanism using short frames.
139 No one knows what it should be, but if left at its default value some
140 10base2(!) packets trigger a full-duplex-request interrupt. */
141 #define FULL_DUPLEX_MAGIC 0x6969
143 static const int csr0 = 0x01A00000 | 0x8000;
145 /* The possible media types that can be set in options[] are: */
146 #define MEDIA_MASK 31
147 static const char * const medianame[32] = {
148 "10baseT", "10base2", "AUI", "100baseTx",
149 "10baseT-FDX", "100baseTx-FDX", "100baseT4", "100baseFx",
150 "100baseFx-FDX", "MII 10baseT", "MII 10baseT-FDX", "MII",
151 "10baseT(forced)", "MII 100baseTx", "MII 100baseTx-FDX", "MII 100baseT4",
152 "MII 100baseFx-HDX", "MII 100baseFx-FDX", "Home-PNA 1Mbps", "Invalid-19",
155 /* This much match tulip_tbl[]! Note 21142 == 21143. */
156 enum tulip_chips {
157 DC21040=0, DC21041=1, DC21140=2, DC21142=3, DC21143=3,
158 LC82C168, MX98713, MX98715, MX98725, AX88141, AX88140, PNIC2, COMET,
159 COMPEX9881, I21145, XIRCOM, SGThomson, /*Ramesh Chander*/
162 enum pci_id_flags_bits {
163 /* Set PCI command register bits before calling probe1(). */
164 PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
165 /* Read and map the single following PCI BAR. */
166 PCI_ADDR0=0<<4, PCI_ADDR1=1<<4, PCI_ADDR2=2<<4, PCI_ADDR3=3<<4,
167 PCI_ADDR_64BITS=0x100, PCI_NO_ACPI_WAKE=0x200, PCI_NO_MIN_LATENCY=0x400,
168 PCI_UNUSED_IRQ=0x800,
171 struct pci_id_info {
172 char *name;
173 struct match_info {
174 u32 pci, pci_mask, subsystem, subsystem_mask;
175 u32 revision, revision_mask; /* Only 8 bits. */
176 } id;
177 enum pci_id_flags_bits pci_flags;
178 int io_size; /* Needed for I/O region check or ioremap(). */
179 int drv_flags; /* Driver use, intended as capability flags. */
182 static const struct pci_id_info pci_id_tbl[] = {
183 { "Digital DC21040 Tulip", { 0x00021011, 0xffffffff, 0, 0, 0, 0 },
184 TULIP_IOTYPE, 0x80, DC21040 },
185 { "Digital DC21041 Tulip", { 0x00141011, 0xffffffff, 0, 0, 0, 0 },
186 TULIP_IOTYPE, 0x80, DC21041 },
187 { "Digital DS21140A Tulip", { 0x00091011, 0xffffffff, 0,0, 0x20,0xf0 },
188 TULIP_IOTYPE, 0x80, DC21140 },
189 { "Digital DS21140 Tulip", { 0x00091011, 0xffffffff, 0, 0, 0, 0 },
190 TULIP_IOTYPE, 0x80, DC21140 },
191 { "Digital DS21143 Tulip", { 0x00191011, 0xffffffff, 0,0, 65,0xff },
192 TULIP_IOTYPE, TULIP_SIZE, DC21142 },
193 { "Digital DS21142 Tulip", { 0x00191011, 0xffffffff, 0, 0, 0, 0 },
194 TULIP_IOTYPE, TULIP_SIZE, DC21142 },
195 { "Kingston KNE110tx (PNIC)", { 0x000211AD, 0xffffffff, 0xf0022646, 0xffffffff, 0, 0 },
196 TULIP_IOTYPE, 256, LC82C168 },
197 { "Lite-On 82c168 PNIC", { 0x000211AD, 0xffffffff, 0, 0, 0, 0 },
198 TULIP_IOTYPE, 256, LC82C168 },
199 { "Macronix 98713 PMAC", { 0x051210d9, 0xffffffff, 0, 0, 0, 0 },
200 TULIP_IOTYPE, 256, MX98713 },
201 { "Macronix 98715 PMAC", { 0x053110d9, 0xffffffff, 0, 0, 0, 0 },
202 TULIP_IOTYPE, 256, MX98715 },
203 { "Macronix 98725 PMAC", { 0x053110d9, 0xffffffff, 0, 0, 0, 0 },
204 TULIP_IOTYPE, 256, MX98725 },
205 { "ASIX AX88141", { 0x1400125B, 0xffffffff, 0,0, 0x10, 0xf0 },
206 TULIP_IOTYPE, 128, AX88141 },
207 { "ASIX AX88140", { 0x1400125B, 0xffffffff, 0, 0, 0, 0 },
208 TULIP_IOTYPE, 128, AX88140 },
209 { "Lite-On LC82C115 PNIC-II", { 0xc11511AD, 0xffffffff, 0, 0, 0, 0 },
210 TULIP_IOTYPE, 256, PNIC2 },
211 { "ADMtek AN981 Comet", { 0x09811317, 0xffffffff, 0, 0, 0, 0 },
212 TULIP_IOTYPE, 256, COMET },
213 { "ADMTek AN983 Comet", { 0x12161113, 0xffffffff, 0, 0, 0, 0 },
214 TULIP_IOTYPE, 256, COMET },
215 { "ADMTek Comet AN983b", { 0x95111317, 0xffffffff, 0, 0, 0, 0 },
216 TULIP_IOTYPE, 256, COMET },
217 { "ADMtek Centaur-P", { 0x09851317, 0xffffffff, 0, 0, 0, 0 },
218 TULIP_IOTYPE, 256, COMET },
219 { "ADMtek Centaur-C", { 0x19851317, 0xffffffff, 0, 0, 0, 0 },
220 TULIP_IOTYPE, 256, COMET },
221 { "Compex RL100-TX", { 0x988111F6, 0xffffffff, 0, 0, 0, 0 },
222 TULIP_IOTYPE, 128, COMPEX9881 },
223 { "Intel 21145 Tulip", { 0x00398086, 0xffffffff, 0, 0, 0, 0 },
224 TULIP_IOTYPE, 128, I21145 },
225 { "Xircom Tulip clone", { 0x0003115d, 0xffffffff, 0, 0, 0, 0 },
226 TULIP_IOTYPE, 128, XIRCOM },
227 { "Davicom DM9102", { 0x91021282, 0xffffffff, 0, 0, 0, 0 },
228 TULIP_IOTYPE, 0x80, DC21140 },
229 { "Davicom DM9100", { 0x91001282, 0xffffffff, 0, 0, 0, 0 },
230 TULIP_IOTYPE, 0x80, DC21140 },
231 { "Macronix mxic-98715 (EN1217)", { 0x12171113, 0xffffffff, 0, 0, 0, 0 },
232 TULIP_IOTYPE, 256, MX98715 },
233 { "3Com 3cSOHO100B-TX (ADMtek Centuar)", { 0x930010b7, 0xffffffff, 0, 0, 0, 0 },
234 TULIP_IOTYPE, TULIP_SIZE, COMET },
235 { "SG Thomson STE10/100A", { 0x2774104a, 0xffffffff, 0, 0, 0, 0 },
236 TULIP_IOTYPE, 256, COMET }, /*Ramesh Chander*/
237 { 0, { 0, 0, 0, 0, 0, 0 }, 0, 0, 0 },
240 enum tbl_flag {
241 HAS_MII=1, HAS_MEDIA_TABLE=2, CSR12_IN_SROM=4, ALWAYS_CHECK_MII=8,
242 HAS_PWRDWN=0x10, MC_HASH_ONLY=0x20, /* Hash-only multicast filter. */
243 HAS_PNICNWAY=0x80, HAS_NWAY=0x40, /* Uses internal NWay xcvr. */
244 HAS_INTR_MITIGATION=0x100, IS_ASIX=0x200, HAS_8023X=0x400,
247 /* Note: this table must match enum tulip_chips above. */
248 static struct tulip_chip_table {
249 char *chip_name;
250 int flags;
251 } tulip_tbl[] = {
252 { "Digital DC21040 Tulip", 0},
253 { "Digital DC21041 Tulip", HAS_MEDIA_TABLE | HAS_NWAY },
254 { "Digital DS21140 Tulip", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
255 { "Digital DS21143 Tulip", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
256 | HAS_PWRDWN | HAS_NWAY | HAS_INTR_MITIGATION },
257 { "Lite-On 82c168 PNIC", HAS_MII | HAS_PNICNWAY },
258 { "Macronix 98713 PMAC", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
259 { "Macronix 98715 PMAC", HAS_MEDIA_TABLE },
260 { "Macronix 98725 PMAC", HAS_MEDIA_TABLE },
261 { "ASIX AX88140", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM
262 | MC_HASH_ONLY | IS_ASIX },
263 { "ASIX AX88141", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM | MC_HASH_ONLY
264 | IS_ASIX },
265 { "Lite-On PNIC-II", HAS_MII | HAS_NWAY | HAS_8023X },
266 { "ADMtek Comet", HAS_MII | MC_HASH_ONLY },
267 { "Compex 9881 PMAC", HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM },
268 { "Intel DS21145 Tulip", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
269 | HAS_PWRDWN | HAS_NWAY },
270 { "Xircom tulip work-alike", HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII
271 | HAS_PWRDWN | HAS_NWAY },
272 { "SGThomson STE10/100A", HAS_MII | MC_HASH_ONLY }, /*Ramesh Chander*/
273 { 0, 0 },
276 /* A full-duplex map for media types. */
277 enum MediaIs {
278 MediaIsFD = 1, MediaAlwaysFD=2, MediaIsMII=4, MediaIsFx=8,
279 MediaIs100=16};
281 static const char media_cap[32] =
282 {0,0,0,16, 3,19,16,24, 27,4,7,5, 0,20,23,20, 20,31,0,0, };
283 static u8 t21040_csr13[] = {2,0x0C,8,4, 4,0,0,0, 0,0,0,0, 4,0,0,0};
285 /* 21041 transceiver register settings: 10-T, 10-2, AUI, 10-T, 10T-FD */
286 static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
287 static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
288 static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
290 /* not used
291 static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, };
293 static u16 t21142_csr14[] = { 0xFFFF, 0x0705, 0x0705, 0x0000, 0x7F3D, };
294 /* not used
295 static u16 t21142_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
298 /* Offsets to the Command and Status Registers, "CSRs". All accesses
299 must be longword instructions and quadword aligned. */
300 enum tulip_offsets {
301 CSR0=0, CSR1=0x08, CSR2=0x10, CSR3=0x18, CSR4=0x20, CSR5=0x28,
302 CSR6=0x30, CSR7=0x38, CSR8=0x40, CSR9=0x48, CSR10=0x50, CSR11=0x58,
303 CSR12=0x60, CSR13=0x68, CSR14=0x70, CSR15=0x78, CSR16=0x80, CSR20=0xA0
306 /* The bits in the CSR5 status registers, mostly interrupt sources. */
307 enum status_bits {
308 TimerInt=0x800, TPLnkFail=0x1000, TPLnkPass=0x10,
309 NormalIntr=0x10000, AbnormalIntr=0x8000,
310 RxJabber=0x200, RxDied=0x100, RxNoBuf=0x80, RxIntr=0x40,
311 TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02, TxIntr=0x01,
314 /* The configuration bits in CSR6. */
315 enum csr6_mode_bits {
316 TxOn=0x2000, RxOn=0x0002, FullDuplex=0x0200,
317 AcceptBroadcast=0x0100, AcceptAllMulticast=0x0080,
318 AcceptAllPhys=0x0040, AcceptRunt=0x0008,
322 enum desc_status_bits {
323 DescOwnded=0x80000000, RxDescFatalErr=0x8000, RxWholePkt=0x0300,
326 struct medialeaf {
327 u8 type;
328 u8 media;
329 unsigned char *leafdata;
332 struct mediatable {
333 u16 defaultmedia;
334 u8 leafcount, csr12dir; /* General purpose pin directions. */
335 unsigned has_mii:1, has_nonmii:1, has_reset:6;
336 u32 csr15dir, csr15val; /* 21143 NWay setting. */
337 struct medialeaf mleaf[0];
340 struct mediainfo {
341 struct mediainfo *next;
342 int info_type;
343 int index;
344 unsigned char *info;
347 /* EEPROM Address width definitions */
348 #define EEPROM_ADDRLEN 6
349 #define EEPROM_SIZE 128 /* 2 << EEPROM_ADDRLEN */
351 /* The EEPROM commands include the alway-set leading bit. */
352 #define EE_WRITE_CMD (5 << addr_len)
353 #define EE_READ_CMD (6 << addr_len)
354 #define EE_ERASE_CMD (7 << addr_len)
356 /* EEPROM_Ctrl bits. */
357 #define EE_SHIFT_CLK 0x02 /* EEPROM shift clock. */
358 #define EE_CS 0x01 /* EEPROM chip select. */
359 #define EE_DATA_WRITE 0x04 /* EEPROM chip data in. */
360 #define EE_WRITE_0 0x01
361 #define EE_WRITE_1 0x05
362 #define EE_DATA_READ 0x08 /* EEPROM chip data out. */
363 #define EE_ENB (0x4800 | EE_CS)
365 /* Delay between EEPROM clock transitions. Even at 33Mhz current PCI
366 implementations don't overrun the EEPROM clock. We add a bus
367 turn-around to insure that this remains true. */
368 #define eeprom_delay() inl(ee_addr)
370 /* Size of transmit and receive buffers */
371 #define BUFLEN 1536
373 /* Ring-wrap flag in length field, use for last ring entry.
374 0x01000000 means chain on buffer2 address,
375 0x02000000 means use the ring start address in CSR2/3.
376 Note: Some work-alike chips do not function correctly in chained mode.
377 The ASIX chip works only in chained mode.
378 Thus we indicate ring mode, but always write the 'next' field for
379 chained mode as well. */
380 #define DESC_RING_WRAP 0x02000000
382 /* transmit and receive descriptor format */
383 struct tulip_rx_desc {
384 volatile u32 status;
385 u32 length;
386 u32 buffer1, buffer2;
389 struct tulip_tx_desc {
390 volatile u32 status;
391 u32 length;
392 u32 buffer1, buffer2;
395 /*********************************************************************/
396 /* Global Storage */
397 /*********************************************************************/
399 static u32 ioaddr;
401 struct tulip_private {
402 int cur_rx;
403 int chip_id; /* index into tulip_tbl[] */
404 int pci_id_idx; /* index into pci_id_tbl[] */
405 int revision;
406 int flags;
407 unsigned short vendor_id; /* PCI card vendor code */
408 unsigned short dev_id; /* PCI card device code */
409 unsigned char ehdr[ETH_HLEN]; /* buffer for ethernet header */
410 const char *nic_name;
411 unsigned int csr0, csr6; /* Current CSR0, CSR6 settings. */
412 unsigned int if_port;
413 unsigned int full_duplex; /* Full-duplex operation requested. */
414 unsigned int full_duplex_lock;
415 unsigned int medialock; /* Do not sense media type. */
416 unsigned int mediasense; /* Media sensing in progress. */
417 unsigned int nway, nwayset; /* 21143 internal NWay. */
418 unsigned int default_port;
419 unsigned char eeprom[EEPROM_SIZE]; /* Serial EEPROM contents. */
420 u8 media_table_storage[(sizeof(struct mediatable) + 32*sizeof(struct medialeaf))];
421 u16 sym_advertise, mii_advertise; /* NWay to-advertise. */
422 struct mediatable *mtable;
423 u16 lpar; /* 21143 Link partner ability. */
424 u16 advertising[4]; /* MII advertise, from SROM table. */
425 signed char phys[4], mii_cnt; /* MII device addresses. */
426 int cur_index; /* Current media index. */
427 int saved_if_port;
430 /* Note: transmit and receive buffers must be longword aligned and
431 longword divisable */
433 #define TX_RING_SIZE 2
434 #define RX_RING_SIZE 4
435 struct {
436 struct tulip_tx_desc tx_ring[TX_RING_SIZE];
437 unsigned char txb[BUFLEN];
438 struct tulip_rx_desc rx_ring[RX_RING_SIZE];
439 unsigned char rxb[RX_RING_SIZE * BUFLEN];
440 struct tulip_private tpx;
441 } tulip_bss __shared __attribute__ ((aligned(4)));
442 #define tx_ring tulip_bss.tx_ring
443 #define txb tulip_bss.txb
444 #define rx_ring tulip_bss.rx_ring
445 #define rxb tulip_bss.rxb
447 static struct tulip_private *tp;
449 /* Known cards that have old-style EEPROMs.
450 Writing this table is described at
451 http://cesdis.gsfc.nasa.gov/linux/drivers/tulip-drivers/tulip-media.html */
452 static struct fixups {
453 char *name;
454 unsigned char addr0, addr1, addr2;
455 u16 newtable[32]; /* Max length below. */
456 } eeprom_fixups[] = {
457 {"Asante", 0, 0, 0x94, {0x1e00, 0x0000, 0x0800, 0x0100, 0x018c,
458 0x0000, 0x0000, 0xe078, 0x0001, 0x0050, 0x0018 }},
459 {"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x041f,
460 0x0000, 0x009E, /* 10baseT */
461 0x0004, 0x009E, /* 10baseT-FD */
462 0x0903, 0x006D, /* 100baseTx */
463 0x0905, 0x006D, /* 100baseTx-FD */ }},
464 {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x063f,
465 0x0107, 0x8021, /* 100baseFx */
466 0x0108, 0x8021, /* 100baseFx-FD */
467 0x0100, 0x009E, /* 10baseT */
468 0x0104, 0x009E, /* 10baseT-FD */
469 0x0103, 0x006D, /* 100baseTx */
470 0x0105, 0x006D, /* 100baseTx-FD */ }},
471 {"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0513,
472 0x1001, 0x009E, /* 10base2, CSR12 0x10*/
473 0x0000, 0x009E, /* 10baseT */
474 0x0004, 0x009E, /* 10baseT-FD */
475 0x0303, 0x006D, /* 100baseTx, CSR12 0x03 */
476 0x0305, 0x006D, /* 100baseTx-FD CSR12 0x03 */}},
477 {"Accton EN1207", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x051F,
478 0x1B01, 0x0000, /* 10base2, CSR12 0x1B */
479 0x0B00, 0x009E, /* 10baseT, CSR12 0x0B */
480 0x0B04, 0x009E, /* 10baseT-FD,CSR12 0x0B */
481 0x1B03, 0x006D, /* 100baseTx, CSR12 0x1B */
482 0x1B05, 0x006D, /* 100baseTx-FD CSR12 0x1B */
484 {0, 0, 0, 0, {}}};
486 static const char * block_name[] = {"21140 non-MII", "21140 MII PHY",
487 "21142 Serial PHY", "21142 MII PHY", "21143 SYM PHY", "21143 reset method"};
490 /*********************************************************************/
491 /* Function Prototypes */
492 /*********************************************************************/
493 static int mdio_read(struct nic *nic, int phy_id, int location);
494 static void mdio_write(struct nic *nic, int phy_id, int location, int value);
495 static int read_eeprom(unsigned long ioaddr, int location, int addr_len);
496 static void parse_eeprom(struct nic *nic);
497 static int tulip_probe(struct nic *nic,struct pci_device *pci);
498 static void tulip_init_ring(struct nic *nic);
499 static void tulip_reset(struct nic *nic);
500 static void tulip_transmit(struct nic *nic, const char *d, unsigned int t,
501 unsigned int s, const char *p);
502 static int tulip_poll(struct nic *nic, int retrieve);
503 static void tulip_disable(struct nic *nic);
504 static void nway_start(struct nic *nic);
505 static void pnic_do_nway(struct nic *nic);
506 static void select_media(struct nic *nic, int startup);
507 static void init_media(struct nic *nic);
508 static void start_link(struct nic *nic);
509 static int tulip_check_duplex(struct nic *nic);
511 static void tulip_wait(unsigned int nticks);
513 #ifdef TULIP_DEBUG_WHERE
514 static void whereami(const char *str);
515 #endif
517 #ifdef TULIP_DEBUG
518 static void tulip_more(void);
519 #endif
522 /*********************************************************************/
523 /* Utility Routines */
524 /*********************************************************************/
526 #ifdef TULIP_DEBUG_WHERE
527 static void whereami (const char *str, struct pci_device *pci)
529 printf("%s: %s\n", tp->nic_name, str);
530 /* sleep(2); */
532 #endif
534 #ifdef TULIP_DEBUG
535 static void tulip_more(void)
537 printf("\n\n-- more --");
538 while (!iskey())
539 /* wait */;
540 getchar();
541 printf("\n\n");
543 #endif /* TULIP_DEBUG */
545 static void tulip_wait(unsigned int nticks)
547 unsigned int to = currticks() + nticks;
548 while (currticks() < to)
549 /* wait */ ;
553 /*********************************************************************/
554 /* Media Descriptor Code */
555 /*********************************************************************/
557 /* MII transceiver control section.
558 Read and write the MII registers using software-generated serial
559 MDIO protocol. See the MII specifications or DP83840A data sheet
560 for details. */
562 /* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
563 met by back-to-back PCI I/O cycles, but we insert a delay to avoid
564 "overclocking" issues or future 66Mhz PCI. */
565 #define mdio_delay() inl(mdio_addr)
567 /* Read and write the MII registers using software-generated serial
568 MDIO protocol. It is just different enough from the EEPROM protocol
569 to not share code. The maxium data clock rate is 2.5 Mhz. */
570 #define MDIO_SHIFT_CLK 0x10000
571 #define MDIO_DATA_WRITE0 0x00000
572 #define MDIO_DATA_WRITE1 0x20000
573 #define MDIO_ENB 0x00000 /* Ignore the 0x02000 databook setting. */
574 #define MDIO_ENB_IN 0x40000
575 #define MDIO_DATA_READ 0x80000
577 /* MII transceiver control section.
578 Read and write the MII registers using software-generated serial
579 MDIO protocol. See the MII specifications or DP83840A data sheet
580 for details. */
582 int mdio_read(struct nic *nic __unused, int phy_id, int location)
584 int i;
585 int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
586 int retval = 0;
587 long mdio_addr = ioaddr + CSR9;
589 #ifdef TULIP_DEBUG_WHERE
590 whereami("mdio_read\n");
591 #endif
593 if (tp->chip_id == LC82C168) {
594 int i = 1000;
595 outl(0x60020000 + (phy_id<<23) + (location<<18), ioaddr + 0xA0);
596 inl(ioaddr + 0xA0);
597 inl(ioaddr + 0xA0);
598 while (--i > 0)
599 if ( ! ((retval = inl(ioaddr + 0xA0)) & 0x80000000))
600 return retval & 0xffff;
601 return 0xffff;
604 if (tp->chip_id == COMET) {
605 if (phy_id == 1) {
606 if (location < 7)
607 return inl(ioaddr + 0xB4 + (location<<2));
608 else if (location == 17)
609 return inl(ioaddr + 0xD0);
610 else if (location >= 29 && location <= 31)
611 return inl(ioaddr + 0xD4 + ((location-29)<<2));
613 return 0xffff;
616 /* Establish sync by sending at least 32 logic ones. */
617 for (i = 32; i >= 0; i--) {
618 outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
619 mdio_delay();
620 outl(MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
621 mdio_delay();
623 /* Shift the read command bits out. */
624 for (i = 15; i >= 0; i--) {
625 int dataval = (read_cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
627 outl(MDIO_ENB | dataval, mdio_addr);
628 mdio_delay();
629 outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
630 mdio_delay();
632 /* Read the two transition, 16 data, and wire-idle bits. */
633 for (i = 19; i > 0; i--) {
634 outl(MDIO_ENB_IN, mdio_addr);
635 mdio_delay();
636 retval = (retval << 1) | ((inl(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
637 outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
638 mdio_delay();
640 return (retval>>1) & 0xffff;
643 void mdio_write(struct nic *nic __unused, int phy_id, int location, int value)
645 int i;
646 int cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
647 long mdio_addr = ioaddr + CSR9;
649 #ifdef TULIP_DEBUG_WHERE
650 whereami("mdio_write\n");
651 #endif
653 if (tp->chip_id == LC82C168) {
654 int i = 1000;
655 outl(cmd, ioaddr + 0xA0);
657 if ( ! (inl(ioaddr + 0xA0) & 0x80000000))
658 break;
659 while (--i > 0);
660 return;
663 if (tp->chip_id == COMET) {
664 if (phy_id != 1)
665 return;
666 if (location < 7)
667 outl(value, ioaddr + 0xB4 + (location<<2));
668 else if (location == 17)
669 outl(value, ioaddr + 0xD0);
670 else if (location >= 29 && location <= 31)
671 outl(value, ioaddr + 0xD4 + ((location-29)<<2));
672 return;
675 /* Establish sync by sending 32 logic ones. */
676 for (i = 32; i >= 0; i--) {
677 outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
678 mdio_delay();
679 outl(MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
680 mdio_delay();
682 /* Shift the command bits out. */
683 for (i = 31; i >= 0; i--) {
684 int dataval = (cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
685 outl(MDIO_ENB | dataval, mdio_addr);
686 mdio_delay();
687 outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
688 mdio_delay();
690 /* Clear out extra bits. */
691 for (i = 2; i > 0; i--) {
692 outl(MDIO_ENB_IN, mdio_addr);
693 mdio_delay();
694 outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
695 mdio_delay();
700 /*********************************************************************/
701 /* EEPROM Reading Code */
702 /*********************************************************************/
703 /* EEPROM routines adapted from the Linux Tulip Code */
704 /* Reading a serial EEPROM is a "bit" grungy, but we work our way
705 through:->.
707 static int read_eeprom(unsigned long ioaddr, int location, int addr_len)
709 int i;
710 unsigned short retval = 0;
711 long ee_addr = ioaddr + CSR9;
712 int read_cmd = location | EE_READ_CMD;
714 #ifdef TULIP_DEBUG_WHERE
715 whereami("read_eeprom\n");
716 #endif
718 outl(EE_ENB & ~EE_CS, ee_addr);
719 outl(EE_ENB, ee_addr);
721 /* Shift the read command bits out. */
722 for (i = 4 + addr_len; i >= 0; i--) {
723 short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
724 outl(EE_ENB | dataval, ee_addr);
725 eeprom_delay();
726 outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
727 eeprom_delay();
729 outl(EE_ENB, ee_addr);
731 for (i = 16; i > 0; i--) {
732 outl(EE_ENB | EE_SHIFT_CLK, ee_addr);
733 eeprom_delay();
734 retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);
735 outl(EE_ENB, ee_addr);
736 eeprom_delay();
739 /* Terminate the EEPROM access. */
740 outl(EE_ENB & ~EE_CS, ee_addr);
741 return retval;
745 /*********************************************************************/
746 /* EEPROM Parsing Code */
747 /*********************************************************************/
748 static void parse_eeprom(struct nic *nic)
750 unsigned char *p, *ee_data = tp->eeprom;
751 int new_advertise = 0;
752 int i;
754 #ifdef TULIP_DEBUG_WHERE
755 whereami("parse_eeprom\n");
756 #endif
758 tp->mtable = 0;
759 /* Detect an old-style (SA only) EEPROM layout:
760 memcmp(ee_data, ee_data+16, 8). */
761 for (i = 0; i < 8; i ++)
762 if (ee_data[i] != ee_data[16+i])
763 break;
764 if (i >= 8) {
765 /* Do a fix-up based on the vendor half of the station address. */
766 for (i = 0; eeprom_fixups[i].name; i++) {
767 if (nic->node_addr[0] == eeprom_fixups[i].addr0
768 && nic->node_addr[1] == eeprom_fixups[i].addr1
769 && nic->node_addr[2] == eeprom_fixups[i].addr2) {
770 if (nic->node_addr[2] == 0xE8 && ee_data[0x1a] == 0x55)
771 i++; /* An Accton EN1207, not an outlaw Maxtech. */
772 memcpy(ee_data + 26, eeprom_fixups[i].newtable,
773 sizeof(eeprom_fixups[i].newtable));
774 #ifdef TULIP_DEBUG
775 printf("%s: Old format EEPROM on '%s' board.\n%s: Using substitute media control info.\n",
776 tp->nic_name, eeprom_fixups[i].name, tp->nic_name);
777 #endif
778 break;
781 if (eeprom_fixups[i].name == NULL) { /* No fixup found. */
782 #ifdef TULIP_DEBUG
783 printf("%s: Old style EEPROM with no media selection information.\n",
784 tp->nic_name);
785 #endif
786 return;
790 if (ee_data[19] > 1) {
791 #ifdef TULIP_DEBUG
792 printf("%s: Multiport cards (%d ports) may not work correctly.\n",
793 tp->nic_name, ee_data[19]);
794 #endif
797 p = (void *)ee_data + ee_data[27];
799 if (ee_data[27] == 0) { /* No valid media table. */
800 #ifdef TULIP_DEBUG
801 if (tulip_debug > 1) {
802 printf("%s: No Valid Media Table. ee_data[27] = %hhX\n",
803 tp->nic_name, ee_data[27]);
805 #endif
806 } else if (tp->chip_id == DC21041) {
807 int media = get_u16(p);
808 int count = p[2];
809 p += 3;
811 printf("%s: 21041 Media table, default media %hX (%s).\n",
812 tp->nic_name, media,
813 media & 0x0800 ? "Autosense" : medianame[media & 15]);
814 for (i = 0; i < count; i++) {
815 unsigned char media_block = *p++;
816 int media_code = media_block & MEDIA_MASK;
817 if (media_block & 0x40)
818 p += 6;
819 switch(media_code) {
820 case 0: new_advertise |= 0x0020; break;
821 case 4: new_advertise |= 0x0040; break;
823 printf("%s: 21041 media #%d, %s.\n",
824 tp->nic_name, media_code, medianame[media_code]);
826 } else {
827 unsigned char csr12dir = 0;
828 int count;
829 struct mediatable *mtable;
830 u16 media = get_u16(p);
832 p += 2;
833 if (tp->flags & CSR12_IN_SROM)
834 csr12dir = *p++;
835 count = *p++;
837 tp->mtable = mtable = (struct mediatable *)&tp->media_table_storage[0];
839 mtable->defaultmedia = media;
840 mtable->leafcount = count;
841 mtable->csr12dir = csr12dir;
842 mtable->has_nonmii = mtable->has_mii = mtable->has_reset = 0;
843 mtable->csr15dir = mtable->csr15val = 0;
845 printf("%s: EEPROM default media type %s.\n", tp->nic_name,
846 media & 0x0800 ? "Autosense" : medianame[media & MEDIA_MASK]);
848 for (i = 0; i < count; i++) {
849 struct medialeaf *leaf = &mtable->mleaf[i];
851 if ((p[0] & 0x80) == 0) { /* 21140 Compact block. */
852 leaf->type = 0;
853 leaf->media = p[0] & 0x3f;
854 leaf->leafdata = p;
855 if ((p[2] & 0x61) == 0x01) /* Bogus, but Znyx boards do it. */
856 mtable->has_mii = 1;
857 p += 4;
858 } else {
859 switch(leaf->type = p[1]) {
860 case 5:
861 mtable->has_reset = i;
862 leaf->media = p[2] & 0x0f;
863 break;
864 case 1: case 3:
865 mtable->has_mii = 1;
866 leaf->media = 11;
867 break;
868 case 2:
869 if ((p[2] & 0x3f) == 0) {
870 u32 base15 = (p[2] & 0x40) ? get_u16(p + 7) : 0x0008;
871 u16 *p1 = (u16 *)(p + (p[2] & 0x40 ? 9 : 3));
872 mtable->csr15dir = (get_unaligned(p1 + 0)<<16) + base15;
873 mtable->csr15val = (get_unaligned(p1 + 1)<<16) + base15;
875 /* Fall through. */
876 case 0: case 4:
877 mtable->has_nonmii = 1;
878 leaf->media = p[2] & MEDIA_MASK;
879 switch (leaf->media) {
880 case 0: new_advertise |= 0x0020; break;
881 case 4: new_advertise |= 0x0040; break;
882 case 3: new_advertise |= 0x0080; break;
883 case 5: new_advertise |= 0x0100; break;
884 case 6: new_advertise |= 0x0200; break;
886 break;
887 default:
888 leaf->media = 19;
890 leaf->leafdata = p + 2;
891 p += (p[0] & 0x3f) + 1;
893 #ifdef TULIP_DEBUG
894 if (tulip_debug > 1 && leaf->media == 11) {
895 unsigned char *bp = leaf->leafdata;
896 printf("%s: MII interface PHY %d, setup/reset sequences %d/%d long, capabilities %hhX %hhX.\n",
897 tp->nic_name, bp[0], bp[1], bp[2 + bp[1]*2],
898 bp[5 + bp[2 + bp[1]*2]*2], bp[4 + bp[2 + bp[1]*2]*2]);
900 #endif
901 printf("%s: Index #%d - Media %s (#%d) described "
902 "by a %s (%d) block.\n",
903 tp->nic_name, i, medianame[leaf->media], leaf->media,
904 leaf->type < 6 ? block_name[leaf->type] : "UNKNOWN",
905 leaf->type);
907 if (new_advertise)
908 tp->sym_advertise = new_advertise;
913 /*********************************************************************/
914 /* tulip_init_ring - setup the tx and rx descriptors */
915 /*********************************************************************/
916 static void tulip_init_ring(struct nic *nic __unused)
918 int i;
920 #ifdef TULIP_DEBUG_WHERE
921 whereami("tulip_init_ring\n");
922 #endif
924 tp->cur_rx = 0;
926 for (i = 0; i < RX_RING_SIZE; i++) {
927 rx_ring[i].status = cpu_to_le32(0x80000000);
928 rx_ring[i].length = cpu_to_le32(BUFLEN);
929 rx_ring[i].buffer1 = virt_to_le32desc(&rxb[i * BUFLEN]);
930 rx_ring[i].buffer2 = virt_to_le32desc(&rx_ring[i+1]);
932 /* Mark the last entry as wrapping the ring. */
933 rx_ring[i-1].length = cpu_to_le32(DESC_RING_WRAP | BUFLEN);
934 rx_ring[i-1].buffer2 = virt_to_le32desc(&rx_ring[0]);
936 /* We only use 1 transmit buffer, but we use 2 descriptors so
937 transmit engines have somewhere to point to if they feel the need */
939 tx_ring[0].status = 0x00000000;
940 tx_ring[0].buffer1 = virt_to_le32desc(&txb[0]);
941 tx_ring[0].buffer2 = virt_to_le32desc(&tx_ring[1]);
943 /* this descriptor should never get used, since it will never be owned
944 by the machine (status will always == 0) */
945 tx_ring[1].status = 0x00000000;
946 tx_ring[1].buffer1 = virt_to_le32desc(&txb[0]);
947 tx_ring[1].buffer2 = virt_to_le32desc(&tx_ring[0]);
949 /* Mark the last entry as wrapping the ring, though this should never happen */
950 tx_ring[1].length = cpu_to_le32(DESC_RING_WRAP | BUFLEN);
954 static void set_rx_mode(struct nic *nic __unused) {
955 int csr6 = inl(ioaddr + CSR6) & ~0x00D5;
957 tp->csr6 &= ~0x00D5;
959 /* !IFF_PROMISC */
960 tp->csr6 |= AcceptAllMulticast;
961 csr6 |= AcceptAllMulticast;
963 outl(csr6, ioaddr + CSR6);
969 /*********************************************************************/
970 /* eth_reset - Reset adapter */
971 /*********************************************************************/
972 static void tulip_reset(struct nic *nic)
974 int i;
975 unsigned long to;
977 #ifdef TULIP_DEBUG_WHERE
978 whereami("tulip_reset\n");
979 #endif
981 /* Stop Tx and RX */
982 outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
984 /* On some chip revs we must set the MII/SYM port before the reset!? */
985 if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii)) {
986 outl(0x814C0000, ioaddr + CSR6);
989 /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
990 outl(0x00000001, ioaddr + CSR0);
991 tulip_wait(1);
993 /* turn off reset and set cache align=16lword, burst=unlimit */
994 outl(tp->csr0, ioaddr + CSR0);
996 /* Wait the specified 50 PCI cycles after a reset */
997 tulip_wait(1);
999 /* set up transmit and receive descriptors */
1000 tulip_init_ring(nic);
1002 if (tp->chip_id == PNIC2) {
1003 u32 addr_high = (nic->node_addr[1]<<8) + (nic->node_addr[0]<<0);
1004 /* This address setting does not appear to impact chip operation?? */
1005 outl((nic->node_addr[5]<<8) + nic->node_addr[4] +
1006 (nic->node_addr[3]<<24) + (nic->node_addr[2]<<16),
1007 ioaddr + 0xB0);
1008 outl(addr_high + (addr_high<<16), ioaddr + 0xB8);
1011 /* MC_HASH_ONLY boards don't support setup packets */
1012 if (tp->flags & MC_HASH_ONLY) {
1013 u32 addr_low = cpu_to_le32(get_unaligned((u32 *)nic->node_addr));
1014 u32 addr_high = cpu_to_le32(get_unaligned((u16 *)(nic->node_addr+4)));
1016 /* clear multicast hash filters and setup MAC address filters */
1017 if (tp->flags & IS_ASIX) {
1018 outl(0, ioaddr + CSR13);
1019 outl(addr_low, ioaddr + CSR14);
1020 outl(1, ioaddr + CSR13);
1021 outl(addr_high, ioaddr + CSR14);
1022 outl(2, ioaddr + CSR13);
1023 outl(0, ioaddr + CSR14);
1024 outl(3, ioaddr + CSR13);
1025 outl(0, ioaddr + CSR14);
1026 } else if (tp->chip_id == COMET) {
1027 outl(addr_low, ioaddr + 0xA4);
1028 outl(addr_high, ioaddr + 0xA8);
1029 outl(0, ioaddr + 0xAC);
1030 outl(0, ioaddr + 0xB0);
1032 } else {
1033 /* for other boards we send a setup packet to initialize
1034 the filters */
1035 u32 tx_flags = 0x08000000 | 192;
1037 /* construct perfect filter frame with mac address as first match
1038 and broadcast address for all others */
1039 for (i=0; i<192; i++)
1040 txb[i] = 0xFF;
1041 txb[0] = nic->node_addr[0];
1042 txb[1] = nic->node_addr[1];
1043 txb[4] = nic->node_addr[2];
1044 txb[5] = nic->node_addr[3];
1045 txb[8] = nic->node_addr[4];
1046 txb[9] = nic->node_addr[5];
1048 tx_ring[0].length = cpu_to_le32(tx_flags);
1049 tx_ring[0].buffer1 = virt_to_le32desc(&txb[0]);
1050 tx_ring[0].status = cpu_to_le32(0x80000000);
1053 /* Point to rx and tx descriptors */
1054 outl(virt_to_le32desc(&rx_ring[0]), ioaddr + CSR3);
1055 outl(virt_to_le32desc(&tx_ring[0]), ioaddr + CSR4);
1057 init_media(nic);
1059 /* set the chip's operating mode (but don't turn on xmit and recv yet) */
1060 outl((tp->csr6 & ~0x00002002), ioaddr + CSR6);
1062 /* send setup packet for cards that support it */
1063 if (!(tp->flags & MC_HASH_ONLY)) {
1064 /* enable transmit wait for completion */
1065 outl(tp->csr6 | 0x00002000, ioaddr + CSR6);
1066 /* immediate transmit demand */
1067 outl(0, ioaddr + CSR1);
1069 to = currticks() + TX_TIME_OUT;
1070 while ((tx_ring[0].status & 0x80000000) && (currticks() < to))
1071 /* wait */ ;
1073 if (currticks() >= to) {
1074 printf ("%s: TX Setup Timeout.\n", tp->nic_name);
1078 if (tp->chip_id == LC82C168)
1079 tulip_check_duplex(nic);
1081 set_rx_mode(nic);
1083 /* enable transmit and receive */
1084 outl(tp->csr6 | 0x00002002, ioaddr + CSR6);
1088 /*********************************************************************/
1089 /* eth_transmit - Transmit a frame */
1090 /*********************************************************************/
1091 static void tulip_transmit(struct nic *nic, const char *d, unsigned int t,
1092 unsigned int s, const char *p)
1094 u16 nstype;
1095 u32 to;
1096 u32 csr6 = inl(ioaddr + CSR6);
1098 #ifdef TULIP_DEBUG_WHERE
1099 whereami("tulip_transmit\n");
1100 #endif
1102 /* Disable Tx */
1103 outl(csr6 & ~0x00002000, ioaddr + CSR6);
1105 memcpy(txb, d, ETH_ALEN);
1106 memcpy(txb + ETH_ALEN, nic->node_addr, ETH_ALEN);
1107 nstype = htons((u16) t);
1108 memcpy(txb + 2 * ETH_ALEN, (u8 *)&nstype, 2);
1109 memcpy(txb + ETH_HLEN, p, s);
1111 s += ETH_HLEN;
1112 s &= 0x0FFF;
1114 /* pad to minimum packet size */
1115 while (s < ETH_ZLEN)
1116 txb[s++] = '\0';
1118 #ifdef TULIP_DEBUG
1119 if (tulip_debug > 1)
1120 printf("%s: sending %d bytes ethtype %hX\n", tp->nic_name, s, t);
1121 #endif
1123 /* setup the transmit descriptor */
1124 /* 0x60000000 = no interrupt on completion */
1125 tx_ring[0].length = cpu_to_le32(0x60000000 | s);
1126 tx_ring[0].status = cpu_to_le32(0x80000000);
1128 /* Point to transmit descriptor */
1129 outl(virt_to_le32desc(&tx_ring[0]), ioaddr + CSR4);
1131 /* Enable Tx */
1132 outl(csr6 | 0x00002000, ioaddr + CSR6);
1133 /* immediate transmit demand */
1134 outl(0, ioaddr + CSR1);
1136 to = currticks() + TX_TIME_OUT;
1137 while ((tx_ring[0].status & 0x80000000) && (currticks() < to))
1138 /* wait */ ;
1140 if (currticks() >= to) {
1141 printf ("TX Timeout!\n");
1144 /* Disable Tx */
1145 outl(csr6 & ~0x00002000, ioaddr + CSR6);
1148 /*********************************************************************/
1149 /* eth_poll - Wait for a frame */
1150 /*********************************************************************/
1151 static int tulip_poll(struct nic *nic, int retrieve)
1154 #ifdef TULIP_DEBUG_WHERE
1155 whereami("tulip_poll\n");
1156 #endif
1158 /* no packet waiting. packet still owned by NIC */
1159 if (rx_ring[tp->cur_rx].status & 0x80000000)
1160 return 0;
1162 if ( ! retrieve ) return 1;
1164 #ifdef TULIP_DEBUG_WHERE
1165 whereami("tulip_poll got one\n");
1166 #endif
1168 nic->packetlen = (rx_ring[tp->cur_rx].status & 0x3FFF0000) >> 16;
1170 /* if we get a corrupted packet. throw it away and move on */
1171 if (rx_ring[tp->cur_rx].status & 0x00008000) {
1172 /* return the descriptor and buffer to receive ring */
1173 rx_ring[tp->cur_rx].status = 0x80000000;
1174 tp->cur_rx = (tp->cur_rx + 1) % RX_RING_SIZE;
1175 return 0;
1178 /* copy packet to working buffer */
1179 memcpy(nic->packet, rxb + tp->cur_rx * BUFLEN, nic->packetlen);
1181 /* return the descriptor and buffer to receive ring */
1182 rx_ring[tp->cur_rx].status = 0x80000000;
1183 tp->cur_rx = (tp->cur_rx + 1) % RX_RING_SIZE;
1185 return 1;
1188 /*********************************************************************/
1189 /* eth_disable - Disable the interface */
1190 /*********************************************************************/
1191 static void tulip_disable ( struct nic *nic ) {
1193 #ifdef TULIP_DEBUG_WHERE
1194 whereami("tulip_disable\n");
1195 #endif
1197 tulip_reset(nic);
1199 /* disable interrupts */
1200 outl(0x00000000, ioaddr + CSR7);
1202 /* Stop the chip's Tx and Rx processes. */
1203 outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
1205 /* Clear the missed-packet counter. */
1206 inl(ioaddr + CSR8);
1209 /*********************************************************************/
1210 /*IRQ - Enable, Disable, or Force interrupts */
1211 /*********************************************************************/
1212 static void tulip_irq(struct nic *nic __unused, irq_action_t action __unused)
1214 switch ( action ) {
1215 case DISABLE :
1216 break;
1217 case ENABLE :
1218 break;
1219 case FORCE :
1220 break;
1224 static struct nic_operations tulip_operations = {
1225 .connect = dummy_connect,
1226 .poll = tulip_poll,
1227 .transmit = tulip_transmit,
1228 .irq = tulip_irq,
1232 /*********************************************************************/
1233 /* eth_probe - Look for an adapter */
1234 /*********************************************************************/
1235 static int tulip_probe ( struct nic *nic, struct pci_device *pci ) {
1237 u32 i;
1238 u8 chip_rev;
1239 u8 ee_data[EEPROM_SIZE];
1240 unsigned short sum;
1241 int chip_idx;
1242 static unsigned char last_phys_addr[ETH_ALEN] = {0x00, 'L', 'i', 'n', 'u', 'x'};
1244 if (pci->ioaddr == 0)
1245 return 0;
1247 ioaddr = pci->ioaddr;
1248 nic->ioaddr = pci->ioaddr & ~3;
1249 nic->irqno = 0;
1251 /* point to private storage */
1252 tp = &tulip_bss.tpx;
1254 tp->vendor_id = pci->vendor;
1255 tp->dev_id = pci->device;
1256 tp->nic_name = pci->driver_name;
1258 tp->if_port = 0;
1259 tp->default_port = 0;
1261 adjust_pci_device(pci);
1263 /* disable interrupts */
1264 outl(0x00000000, ioaddr + CSR7);
1266 /* Stop the chip's Tx and Rx processes. */
1267 outl(inl(ioaddr + CSR6) & ~0x00002002, ioaddr + CSR6);
1269 /* Clear the missed-packet counter. */
1270 inl(ioaddr + CSR8);
1272 printf("\n"); /* so we start on a fresh line */
1273 #ifdef TULIP_DEBUG_WHERE
1274 whereami("tulip_probe\n");
1275 #endif
1277 #ifdef TULIP_DEBUG
1278 if (tulip_debug > 1)
1279 printf ("%s: Looking for Tulip Chip: Vendor=%hX Device=%hX\n", tp->nic_name,
1280 tp->vendor, tp->dev_id);
1281 #endif
1283 /* Figure out which chip we're dealing with */
1284 i = 0;
1285 chip_idx = -1;
1287 while (pci_id_tbl[i].name) {
1288 if ( (((u32) tp->dev_id << 16) | tp->vendor_id) ==
1289 (pci_id_tbl[i].id.pci & pci_id_tbl[i].id.pci_mask) ) {
1290 chip_idx = pci_id_tbl[i].drv_flags;
1291 break;
1293 i++;
1296 if (chip_idx == -1) {
1297 printf ("%s: Unknown Tulip Chip: Vendor=%hX Device=%hX\n", tp->nic_name,
1298 tp->vendor_id, tp->dev_id);
1299 return 0;
1302 tp->pci_id_idx = i;
1303 tp->flags = tulip_tbl[chip_idx].flags;
1305 #ifdef TULIP_DEBUG
1306 if (tulip_debug > 1) {
1307 printf ("%s: tp->pci_id_idx == %d, name == %s\n", tp->nic_name,
1308 tp->pci_id_idx, pci_id_tbl[tp->pci_id_idx].name);
1309 printf ("%s: chip_idx == %d, name == %s\n", tp->nic_name, chip_idx,
1310 tulip_tbl[chip_idx].chip_name);
1312 #endif
1314 /* Bring the 21041/21143 out of sleep mode.
1315 Caution: Snooze mode does not work with some boards! */
1316 if (tp->flags & HAS_PWRDWN)
1317 pci_write_config_dword(pci, 0x40, 0x00000000);
1319 if (inl(ioaddr + CSR5) == 0xFFFFFFFF) {
1320 printf("%s: The Tulip chip at %X is not functioning.\n",
1321 tp->nic_name, (unsigned int) ioaddr);
1322 return 0;
1325 pci_read_config_byte(pci, PCI_REVISION, &chip_rev);
1327 printf("%s: [chip: %s] rev %d at %hX\n", tp->nic_name,
1328 tulip_tbl[chip_idx].chip_name, chip_rev, (unsigned int) ioaddr);
1329 printf("%s: Vendor=%hX Device=%hX", tp->nic_name, tp->vendor_id, tp->dev_id);
1331 if (chip_idx == DC21041 && inl(ioaddr + CSR9) & 0x8000) {
1332 printf(" 21040 compatible mode.");
1333 chip_idx = DC21040;
1336 printf("\n");
1338 /* The SROM/EEPROM interface varies dramatically. */
1339 sum = 0;
1340 if (chip_idx == DC21040) {
1341 outl(0, ioaddr + CSR9); /* Reset the pointer with a dummy write. */
1342 for (i = 0; i < ETH_ALEN; i++) {
1343 int value, boguscnt = 100000;
1345 value = inl(ioaddr + CSR9);
1346 while (value < 0 && --boguscnt > 0);
1347 nic->node_addr[i] = value;
1348 sum += value & 0xff;
1350 } else if (chip_idx == LC82C168) {
1351 for (i = 0; i < 3; i++) {
1352 int value, boguscnt = 100000;
1353 outl(0x600 | i, ioaddr + 0x98);
1355 value = inl(ioaddr + CSR9);
1356 while (value < 0 && --boguscnt > 0);
1357 put_unaligned(le16_to_cpu(value), ((u16*)nic->node_addr) + i);
1358 sum += value & 0xffff;
1360 } else if (chip_idx == COMET) {
1361 /* No need to read the EEPROM. */
1362 put_unaligned(inl(ioaddr + 0xA4), (u32 *)nic->node_addr);
1363 put_unaligned(inl(ioaddr + 0xA8), (u16 *)(nic->node_addr + 4));
1364 for (i = 0; i < ETH_ALEN; i ++)
1365 sum += nic->node_addr[i];
1366 } else {
1367 /* A serial EEPROM interface, we read now and sort it out later. */
1368 int sa_offset = 0;
1369 int ee_addr_size = read_eeprom(ioaddr, 0xff, 8) & 0x40000 ? 8 : 6;
1371 for (i = 0; i < sizeof(ee_data)/2; i++)
1372 ((u16 *)ee_data)[i] =
1373 le16_to_cpu(read_eeprom(ioaddr, i, ee_addr_size));
1375 /* DEC now has a specification (see Notes) but early board makers
1376 just put the address in the first EEPROM locations. */
1377 /* This does memcmp(eedata, eedata+16, 8) */
1378 for (i = 0; i < 8; i ++)
1379 if (ee_data[i] != ee_data[16+i])
1380 sa_offset = 20;
1381 if (ee_data[0] == 0xff && ee_data[1] == 0xff && ee_data[2] == 0) {
1382 sa_offset = 2; /* Grrr, damn Matrox boards. */
1384 for (i = 0; i < ETH_ALEN; i ++) {
1385 nic->node_addr[i] = ee_data[i + sa_offset];
1386 sum += ee_data[i + sa_offset];
1389 /* Lite-On boards have the address byte-swapped. */
1390 if ((nic->node_addr[0] == 0xA0 || nic->node_addr[0] == 0xC0)
1391 && nic->node_addr[1] == 0x00)
1392 for (i = 0; i < ETH_ALEN; i+=2) {
1393 char tmp = nic->node_addr[i];
1394 nic->node_addr[i] = nic->node_addr[i+1];
1395 nic->node_addr[i+1] = tmp;
1398 if (sum == 0 || sum == ETH_ALEN*0xff) {
1399 printf("%s: EEPROM not present!\n", tp->nic_name);
1400 for (i = 0; i < ETH_ALEN-1; i++)
1401 nic->node_addr[i] = last_phys_addr[i];
1402 nic->node_addr[i] = last_phys_addr[i] + 1;
1405 for (i = 0; i < ETH_ALEN; i++)
1406 last_phys_addr[i] = nic->node_addr[i];
1408 DBG ( "%s: %s at ioaddr %hX\n", tp->nic_name, eth_ntoa ( nic->node_addr ),
1409 (unsigned int) ioaddr );
1411 tp->chip_id = chip_idx;
1412 tp->revision = chip_rev;
1413 tp->csr0 = csr0;
1415 /* BugFixes: The 21143-TD hangs with PCI Write-and-Invalidate cycles.
1416 And the ASIX must have a burst limit or horrible things happen. */
1417 if (chip_idx == DC21143 && chip_rev == 65)
1418 tp->csr0 &= ~0x01000000;
1419 else if (tp->flags & IS_ASIX)
1420 tp->csr0 |= 0x2000;
1422 if (media_cap[tp->default_port] & MediaIsMII) {
1423 static const u16 media2advert[] = { 0x20, 0x40, 0x03e0, 0x60,
1424 0x80, 0x100, 0x200 };
1425 tp->mii_advertise = media2advert[tp->default_port - 9];
1426 tp->mii_advertise |= (tp->flags & HAS_8023X); /* Matching bits! */
1429 /* This is logically part of the probe routine, but too complex
1430 to write inline. */
1431 if (tp->flags & HAS_MEDIA_TABLE) {
1432 memcpy(tp->eeprom, ee_data, sizeof(tp->eeprom));
1433 parse_eeprom(nic);
1436 start_link(nic);
1438 /* reset the device and make ready for tx and rx of packets */
1439 tulip_reset(nic);
1440 nic->nic_op = &tulip_operations;
1442 /* give the board a chance to reset before returning */
1443 tulip_wait(4*TICKS_PER_SEC);
1445 return 1;
1448 static void start_link(struct nic *nic)
1450 int i;
1452 #ifdef TULIP_DEBUG_WHERE
1453 whereami("start_link\n");
1454 #endif
1456 if ((tp->flags & ALWAYS_CHECK_MII) ||
1457 (tp->mtable && tp->mtable->has_mii) ||
1458 ( ! tp->mtable && (tp->flags & HAS_MII))) {
1459 unsigned int phy, phy_idx;
1460 if (tp->mtable && tp->mtable->has_mii) {
1461 for (i = 0; i < tp->mtable->leafcount; i++)
1462 if (tp->mtable->mleaf[i].media == 11) {
1463 tp->cur_index = i;
1464 tp->saved_if_port = tp->if_port;
1465 select_media(nic, 2);
1466 tp->if_port = tp->saved_if_port;
1467 break;
1471 /* Find the connected MII xcvrs. */
1472 for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
1473 phy++) {
1474 int mii_status = mdio_read(nic, phy, 1);
1475 if ((mii_status & 0x8301) == 0x8001 ||
1476 ((mii_status & 0x8000) == 0 && (mii_status & 0x7800) != 0)) {
1477 int mii_reg0 = mdio_read(nic, phy, 0);
1478 int mii_advert = mdio_read(nic, phy, 4);
1479 int to_advert;
1481 if (tp->mii_advertise)
1482 to_advert = tp->mii_advertise;
1483 else if (tp->advertising[phy_idx])
1484 to_advert = tp->advertising[phy_idx];
1485 else /* Leave unchanged. */
1486 tp->mii_advertise = to_advert = mii_advert;
1488 tp->phys[phy_idx++] = phy;
1489 printf("%s: MII transceiver %d config %hX status %hX advertising %hX.\n",
1490 tp->nic_name, phy, mii_reg0, mii_status, mii_advert);
1491 /* Fixup for DLink with miswired PHY. */
1492 if (mii_advert != to_advert) {
1493 printf("%s: Advertising %hX on PHY %d previously advertising %hX.\n",
1494 tp->nic_name, to_advert, phy, mii_advert);
1495 mdio_write(nic, phy, 4, to_advert);
1497 /* Enable autonegotiation: some boards default to off. */
1498 mdio_write(nic, phy, 0, mii_reg0 |
1499 (tp->full_duplex ? 0x1100 : 0x1000) |
1500 (media_cap[tp->default_port]&MediaIs100 ? 0x2000:0));
1503 tp->mii_cnt = phy_idx;
1504 if (tp->mtable && tp->mtable->has_mii && phy_idx == 0) {
1505 printf("%s: ***WARNING***: No MII transceiver found!\n",
1506 tp->nic_name);
1507 tp->phys[0] = 1;
1511 /* Reset the xcvr interface and turn on heartbeat. */
1512 switch (tp->chip_id) {
1513 case DC21040:
1514 outl(0x00000000, ioaddr + CSR13);
1515 outl(0x00000004, ioaddr + CSR13);
1516 break;
1517 case DC21041:
1518 /* This is nway_start(). */
1519 if (tp->sym_advertise == 0)
1520 tp->sym_advertise = 0x0061;
1521 outl(0x00000000, ioaddr + CSR13);
1522 outl(0xFFFFFFFF, ioaddr + CSR14);
1523 outl(0x00000008, ioaddr + CSR15); /* Listen on AUI also. */
1524 outl(inl(ioaddr + CSR6) | 0x0200, ioaddr + CSR6);
1525 outl(0x0000EF01, ioaddr + CSR13);
1526 break;
1527 case DC21140: default:
1528 if (tp->mtable)
1529 outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
1530 break;
1531 case DC21142:
1532 case PNIC2:
1533 if (tp->mii_cnt || media_cap[tp->if_port] & MediaIsMII) {
1534 outl(0x82020000, ioaddr + CSR6);
1535 outl(0x0000, ioaddr + CSR13);
1536 outl(0x0000, ioaddr + CSR14);
1537 outl(0x820E0000, ioaddr + CSR6);
1538 } else
1539 nway_start(nic);
1540 break;
1541 case LC82C168:
1542 if ( ! tp->mii_cnt) {
1543 tp->nway = 1;
1544 tp->nwayset = 0;
1545 outl(0x00420000, ioaddr + CSR6);
1546 outl(0x30, ioaddr + CSR12);
1547 outl(0x0001F078, ioaddr + 0xB8);
1548 outl(0x0201F078, ioaddr + 0xB8); /* Turn on autonegotiation. */
1550 break;
1551 case MX98713: case COMPEX9881:
1552 outl(0x00000000, ioaddr + CSR6);
1553 outl(0x000711C0, ioaddr + CSR14); /* Turn on NWay. */
1554 outl(0x00000001, ioaddr + CSR13);
1555 break;
1556 case MX98715: case MX98725:
1557 outl(0x01a80000, ioaddr + CSR6);
1558 outl(0xFFFFFFFF, ioaddr + CSR14);
1559 outl(0x00001000, ioaddr + CSR12);
1560 break;
1561 case COMET:
1562 /* No initialization necessary. */
1563 break;
1567 static void nway_start(struct nic *nic __unused)
1569 int csr14 = ((tp->sym_advertise & 0x0780) << 9) |
1570 ((tp->sym_advertise&0x0020)<<1) | 0xffbf;
1572 #ifdef TULIP_DEBUG_WHERE
1573 whereami("nway_start\n");
1574 #endif
1576 tp->if_port = 0;
1577 tp->nway = tp->mediasense = 1;
1578 tp->nwayset = tp->lpar = 0;
1579 if (tp->chip_id == PNIC2) {
1580 tp->csr6 = 0x01000000 | (tp->sym_advertise & 0x0040 ? 0x0200 : 0);
1581 return;
1583 #ifdef TULIP_DEBUG
1584 if (tulip_debug > 1)
1585 printf("%s: Restarting internal NWay autonegotiation, %X.\n",
1586 tp->nic_name, csr14);
1587 #endif
1588 outl(0x0001, ioaddr + CSR13);
1589 outl(csr14, ioaddr + CSR14);
1590 tp->csr6 = 0x82420000 | (tp->sym_advertise & 0x0040 ? 0x0200 : 0);
1591 outl(tp->csr6, ioaddr + CSR6);
1592 if (tp->mtable && tp->mtable->csr15dir) {
1593 outl(tp->mtable->csr15dir, ioaddr + CSR15);
1594 outl(tp->mtable->csr15val, ioaddr + CSR15);
1595 } else if (tp->chip_id != PNIC2)
1596 outw(0x0008, ioaddr + CSR15);
1597 if (tp->chip_id == DC21041) /* Trigger NWAY. */
1598 outl(0xEF01, ioaddr + CSR12);
1599 else
1600 outl(0x1301, ioaddr + CSR12);
1603 static void init_media(struct nic *nic)
1605 int i;
1607 #ifdef TULIP_DEBUG_WHERE
1608 whereami("init_media\n");
1609 #endif
1611 tp->saved_if_port = tp->if_port;
1612 if (tp->if_port == 0)
1613 tp->if_port = tp->default_port;
1615 /* Allow selecting a default media. */
1616 i = 0;
1617 if (tp->mtable == NULL)
1618 goto media_picked;
1619 if (tp->if_port) {
1620 int looking_for = media_cap[tp->if_port] & MediaIsMII ? 11 :
1621 (tp->if_port == 12 ? 0 : tp->if_port);
1622 for (i = 0; i < tp->mtable->leafcount; i++)
1623 if (tp->mtable->mleaf[i].media == looking_for) {
1624 printf("%s: Using user-specified media %s.\n",
1625 tp->nic_name, medianame[tp->if_port]);
1626 goto media_picked;
1629 if ((tp->mtable->defaultmedia & 0x0800) == 0) {
1630 int looking_for = tp->mtable->defaultmedia & 15;
1631 for (i = 0; i < tp->mtable->leafcount; i++)
1632 if (tp->mtable->mleaf[i].media == looking_for) {
1633 printf("%s: Using EEPROM-set media %s.\n",
1634 tp->nic_name, medianame[looking_for]);
1635 goto media_picked;
1638 /* Start sensing first non-full-duplex media. */
1639 for (i = tp->mtable->leafcount - 1;
1640 (media_cap[tp->mtable->mleaf[i].media] & MediaAlwaysFD) && i > 0; i--)
1642 media_picked:
1644 tp->csr6 = 0;
1645 tp->cur_index = i;
1646 tp->nwayset = 0;
1648 if (tp->if_port) {
1649 if (tp->chip_id == DC21143 && media_cap[tp->if_port] & MediaIsMII) {
1650 /* We must reset the media CSRs when we force-select MII mode. */
1651 outl(0x0000, ioaddr + CSR13);
1652 outl(0x0000, ioaddr + CSR14);
1653 outl(0x0008, ioaddr + CSR15);
1655 select_media(nic, 1);
1656 return;
1658 switch(tp->chip_id) {
1659 case DC21041:
1660 /* tp->nway = 1;*/
1661 nway_start(nic);
1662 break;
1663 case DC21142:
1664 if (tp->mii_cnt) {
1665 select_media(nic, 1);
1666 #ifdef TULIP_DEBUG
1667 if (tulip_debug > 1)
1668 printf("%s: Using MII transceiver %d, status %hX.\n",
1669 tp->nic_name, tp->phys[0], mdio_read(nic, tp->phys[0], 1));
1670 #endif
1671 outl(0x82020000, ioaddr + CSR6);
1672 tp->csr6 = 0x820E0000;
1673 tp->if_port = 11;
1674 outl(0x0000, ioaddr + CSR13);
1675 outl(0x0000, ioaddr + CSR14);
1676 } else
1677 nway_start(nic);
1678 break;
1679 case PNIC2:
1680 nway_start(nic);
1681 break;
1682 case LC82C168:
1683 if (tp->mii_cnt) {
1684 tp->if_port = 11;
1685 tp->csr6 = 0x814C0000 | (tp->full_duplex ? 0x0200 : 0);
1686 outl(0x0001, ioaddr + CSR15);
1687 } else if (inl(ioaddr + CSR5) & TPLnkPass)
1688 pnic_do_nway(nic);
1689 else {
1690 /* Start with 10mbps to do autonegotiation. */
1691 outl(0x32, ioaddr + CSR12);
1692 tp->csr6 = 0x00420000;
1693 outl(0x0001B078, ioaddr + 0xB8);
1694 outl(0x0201B078, ioaddr + 0xB8);
1696 break;
1697 case MX98713: case COMPEX9881:
1698 tp->if_port = 0;
1699 tp->csr6 = 0x01880000 | (tp->full_duplex ? 0x0200 : 0);
1700 outl(0x0f370000 | inw(ioaddr + 0x80), ioaddr + 0x80);
1701 break;
1702 case MX98715: case MX98725:
1703 /* Provided by BOLO, Macronix - 12/10/1998. */
1704 tp->if_port = 0;
1705 tp->csr6 = 0x01a80200;
1706 outl(0x0f370000 | inw(ioaddr + 0x80), ioaddr + 0x80);
1707 outl(0x11000 | inw(ioaddr + 0xa0), ioaddr + 0xa0);
1708 break;
1709 case COMET:
1710 /* Enable automatic Tx underrun recovery */
1711 outl(inl(ioaddr + 0x88) | 1, ioaddr + 0x88);
1712 tp->if_port = 0;
1713 tp->csr6 = 0x00040000;
1714 break;
1715 case AX88140: case AX88141:
1716 tp->csr6 = tp->mii_cnt ? 0x00040100 : 0x00000100;
1717 break;
1718 default:
1719 select_media(nic, 1);
1723 static void pnic_do_nway(struct nic *nic __unused)
1725 u32 phy_reg = inl(ioaddr + 0xB8);
1726 u32 new_csr6 = tp->csr6 & ~0x40C40200;
1728 #ifdef TULIP_DEBUG_WHERE
1729 whereami("pnic_do_nway\n");
1730 #endif
1732 if (phy_reg & 0x78000000) { /* Ignore baseT4 */
1733 if (phy_reg & 0x20000000) tp->if_port = 5;
1734 else if (phy_reg & 0x40000000) tp->if_port = 3;
1735 else if (phy_reg & 0x10000000) tp->if_port = 4;
1736 else if (phy_reg & 0x08000000) tp->if_port = 0;
1737 tp->nwayset = 1;
1738 new_csr6 = (tp->if_port & 1) ? 0x01860000 : 0x00420000;
1739 outl(0x32 | (tp->if_port & 1), ioaddr + CSR12);
1740 if (tp->if_port & 1)
1741 outl(0x1F868, ioaddr + 0xB8);
1742 if (phy_reg & 0x30000000) {
1743 tp->full_duplex = 1;
1744 new_csr6 |= 0x00000200;
1746 #ifdef TULIP_DEBUG
1747 if (tulip_debug > 1)
1748 printf("%s: PNIC autonegotiated status %X, %s.\n",
1749 tp->nic_name, phy_reg, medianame[tp->if_port]);
1750 #endif
1751 if (tp->csr6 != new_csr6) {
1752 tp->csr6 = new_csr6;
1753 outl(tp->csr6 | 0x0002, ioaddr + CSR6); /* Restart Tx */
1754 outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1759 /* Set up the transceiver control registers for the selected media type. */
1760 static void select_media(struct nic *nic, int startup)
1762 struct mediatable *mtable = tp->mtable;
1763 u32 new_csr6;
1764 int i;
1766 #ifdef TULIP_DEBUG_WHERE
1767 whereami("select_media\n");
1768 #endif
1770 if (mtable) {
1771 struct medialeaf *mleaf = &mtable->mleaf[tp->cur_index];
1772 unsigned char *p = mleaf->leafdata;
1773 switch (mleaf->type) {
1774 case 0: /* 21140 non-MII xcvr. */
1775 #ifdef TULIP_DEBUG
1776 if (tulip_debug > 1)
1777 printf("%s: Using a 21140 non-MII transceiver"
1778 " with control setting %hhX.\n",
1779 tp->nic_name, p[1]);
1780 #endif
1781 tp->if_port = p[0];
1782 if (startup)
1783 outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1784 outl(p[1], ioaddr + CSR12);
1785 new_csr6 = 0x02000000 | ((p[2] & 0x71) << 18);
1786 break;
1787 case 2: case 4: {
1788 u16 setup[5];
1789 u32 csr13val, csr14val, csr15dir, csr15val;
1790 for (i = 0; i < 5; i++)
1791 setup[i] = get_u16(&p[i*2 + 1]);
1793 tp->if_port = p[0] & 15;
1794 if (media_cap[tp->if_port] & MediaAlwaysFD)
1795 tp->full_duplex = 1;
1797 if (startup && mtable->has_reset) {
1798 struct medialeaf *rleaf = &mtable->mleaf[mtable->has_reset];
1799 unsigned char *rst = rleaf->leafdata;
1800 #ifdef TULIP_DEBUG
1801 if (tulip_debug > 1)
1802 printf("%s: Resetting the transceiver.\n",
1803 tp->nic_name);
1804 #endif
1805 for (i = 0; i < rst[0]; i++)
1806 outl(get_u16(rst + 1 + (i<<1)) << 16, ioaddr + CSR15);
1808 #ifdef TULIP_DEBUG
1809 if (tulip_debug > 1)
1810 printf("%s: 21143 non-MII %s transceiver control "
1811 "%hX/%hX.\n",
1812 tp->nic_name, medianame[tp->if_port], setup[0], setup[1]);
1813 #endif
1814 if (p[0] & 0x40) { /* SIA (CSR13-15) setup values are provided. */
1815 csr13val = setup[0];
1816 csr14val = setup[1];
1817 csr15dir = (setup[3]<<16) | setup[2];
1818 csr15val = (setup[4]<<16) | setup[2];
1819 outl(0, ioaddr + CSR13);
1820 outl(csr14val, ioaddr + CSR14);
1821 outl(csr15dir, ioaddr + CSR15); /* Direction */
1822 outl(csr15val, ioaddr + CSR15); /* Data */
1823 outl(csr13val, ioaddr + CSR13);
1824 } else {
1825 csr13val = 1;
1826 csr14val = 0x0003FF7F;
1827 csr15dir = (setup[0]<<16) | 0x0008;
1828 csr15val = (setup[1]<<16) | 0x0008;
1829 if (tp->if_port <= 4)
1830 csr14val = t21142_csr14[tp->if_port];
1831 if (startup) {
1832 outl(0, ioaddr + CSR13);
1833 outl(csr14val, ioaddr + CSR14);
1835 outl(csr15dir, ioaddr + CSR15); /* Direction */
1836 outl(csr15val, ioaddr + CSR15); /* Data */
1837 if (startup) outl(csr13val, ioaddr + CSR13);
1839 #ifdef TULIP_DEBUG
1840 if (tulip_debug > 1)
1841 printf("%s: Setting CSR15 to %X/%X.\n",
1842 tp->nic_name, csr15dir, csr15val);
1843 #endif
1844 if (mleaf->type == 4)
1845 new_csr6 = 0x82020000 | ((setup[2] & 0x71) << 18);
1846 else
1847 new_csr6 = 0x82420000;
1848 break;
1850 case 1: case 3: {
1851 int phy_num = p[0];
1852 int init_length = p[1];
1853 u16 *misc_info;
1855 tp->if_port = 11;
1856 new_csr6 = 0x020E0000;
1857 if (mleaf->type == 3) { /* 21142 */
1858 u16 *init_sequence = (u16*)(p+2);
1859 u16 *reset_sequence = &((u16*)(p+3))[init_length];
1860 int reset_length = p[2 + init_length*2];
1861 misc_info = reset_sequence + reset_length;
1862 if (startup)
1863 for (i = 0; i < reset_length; i++)
1864 outl(get_u16(&reset_sequence[i]) << 16, ioaddr + CSR15);
1865 for (i = 0; i < init_length; i++)
1866 outl(get_u16(&init_sequence[i]) << 16, ioaddr + CSR15);
1867 } else {
1868 u8 *init_sequence = p + 2;
1869 u8 *reset_sequence = p + 3 + init_length;
1870 int reset_length = p[2 + init_length];
1871 misc_info = (u16*)(reset_sequence + reset_length);
1872 if (startup) {
1873 outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1874 for (i = 0; i < reset_length; i++)
1875 outl(reset_sequence[i], ioaddr + CSR12);
1877 for (i = 0; i < init_length; i++)
1878 outl(init_sequence[i], ioaddr + CSR12);
1880 tp->advertising[phy_num] = get_u16(&misc_info[1]) | 1;
1881 if (startup < 2) {
1882 if (tp->mii_advertise == 0)
1883 tp->mii_advertise = tp->advertising[phy_num];
1884 #ifdef TULIP_DEBUG
1885 if (tulip_debug > 1)
1886 printf("%s: Advertising %hX on MII %d.\n",
1887 tp->nic_name, tp->mii_advertise, tp->phys[phy_num]);
1888 #endif
1889 mdio_write(nic, tp->phys[phy_num], 4, tp->mii_advertise);
1891 break;
1893 default:
1894 printf("%s: Invalid media table selection %d.\n",
1895 tp->nic_name, mleaf->type);
1896 new_csr6 = 0x020E0000;
1898 #ifdef TULIP_DEBUG
1899 if (tulip_debug > 1)
1900 printf("%s: Using media type %s, CSR12 is %hhX.\n",
1901 tp->nic_name, medianame[tp->if_port],
1902 inl(ioaddr + CSR12) & 0xff);
1903 #endif
1904 } else if (tp->chip_id == DC21041) {
1905 int port = tp->if_port <= 4 ? tp->if_port : 0;
1906 #ifdef TULIP_DEBUG
1907 if (tulip_debug > 1)
1908 printf("%s: 21041 using media %s, CSR12 is %hX.\n",
1909 tp->nic_name, medianame[port == 3 ? 12: port],
1910 inl(ioaddr + CSR12));
1911 #endif
1912 outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1913 outl(t21041_csr14[port], ioaddr + CSR14);
1914 outl(t21041_csr15[port], ioaddr + CSR15);
1915 outl(t21041_csr13[port], ioaddr + CSR13);
1916 new_csr6 = 0x80020000;
1917 } else if (tp->chip_id == LC82C168) {
1918 if (startup && ! tp->medialock)
1919 tp->if_port = tp->mii_cnt ? 11 : 0;
1920 #ifdef TULIP_DEBUG
1921 if (tulip_debug > 1)
1922 printf("%s: PNIC PHY status is %hX, media %s.\n",
1923 tp->nic_name, inl(ioaddr + 0xB8), medianame[tp->if_port]);
1924 #endif
1925 if (tp->mii_cnt) {
1926 new_csr6 = 0x810C0000;
1927 outl(0x0001, ioaddr + CSR15);
1928 outl(0x0201B07A, ioaddr + 0xB8);
1929 } else if (startup) {
1930 /* Start with 10mbps to do autonegotiation. */
1931 outl(0x32, ioaddr + CSR12);
1932 new_csr6 = 0x00420000;
1933 outl(0x0001B078, ioaddr + 0xB8);
1934 outl(0x0201B078, ioaddr + 0xB8);
1935 } else if (tp->if_port == 3 || tp->if_port == 5) {
1936 outl(0x33, ioaddr + CSR12);
1937 new_csr6 = 0x01860000;
1938 /* Trigger autonegotiation. */
1939 outl(startup ? 0x0201F868 : 0x0001F868, ioaddr + 0xB8);
1940 } else {
1941 outl(0x32, ioaddr + CSR12);
1942 new_csr6 = 0x00420000;
1943 outl(0x1F078, ioaddr + 0xB8);
1945 } else if (tp->chip_id == DC21040) { /* 21040 */
1946 /* Turn on the xcvr interface. */
1947 #ifdef TULIP_DEBUG
1948 int csr12 = inl(ioaddr + CSR12);
1949 if (tulip_debug > 1)
1950 printf("%s: 21040 media type is %s, CSR12 is %hhX.\n",
1951 tp->nic_name, medianame[tp->if_port], csr12);
1952 #endif
1953 if (media_cap[tp->if_port] & MediaAlwaysFD)
1954 tp->full_duplex = 1;
1955 new_csr6 = 0x20000;
1956 /* Set the full duplux match frame. */
1957 outl(FULL_DUPLEX_MAGIC, ioaddr + CSR11);
1958 outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1959 if (t21040_csr13[tp->if_port] & 8) {
1960 outl(0x0705, ioaddr + CSR14);
1961 outl(0x0006, ioaddr + CSR15);
1962 } else {
1963 outl(0xffff, ioaddr + CSR14);
1964 outl(0x0000, ioaddr + CSR15);
1966 outl(0x8f01 | t21040_csr13[tp->if_port], ioaddr + CSR13);
1967 } else { /* Unknown chip type with no media table. */
1968 if (tp->default_port == 0)
1969 tp->if_port = tp->mii_cnt ? 11 : 3;
1970 if (media_cap[tp->if_port] & MediaIsMII) {
1971 new_csr6 = 0x020E0000;
1972 } else if (media_cap[tp->if_port] & MediaIsFx) {
1973 new_csr6 = 0x028600000;
1974 } else
1975 new_csr6 = 0x038600000;
1976 #ifdef TULIP_DEBUG
1977 if (tulip_debug > 1)
1978 printf("%s: No media description table, assuming "
1979 "%s transceiver, CSR12 %hhX.\n",
1980 tp->nic_name, medianame[tp->if_port],
1981 inl(ioaddr + CSR12));
1982 #endif
1985 tp->csr6 = new_csr6 | (tp->csr6 & 0xfdff) | (tp->full_duplex ? 0x0200 : 0);
1986 return;
1990 Check the MII negotiated duplex and change the CSR6 setting if
1991 required.
1992 Return 0 if everything is OK.
1993 Return < 0 if the transceiver is missing or has no link beat.
1995 static int tulip_check_duplex(struct nic *nic)
1997 unsigned int bmsr, lpa, negotiated, new_csr6;
1999 bmsr = mdio_read(nic, tp->phys[0], 1);
2000 lpa = mdio_read(nic, tp->phys[0], 5);
2002 #ifdef TULIP_DEBUG
2003 if (tulip_debug > 1)
2004 printf("%s: MII status %#x, Link partner report "
2005 "%#x.\n", tp->nic_name, bmsr, lpa);
2006 #endif
2008 if (bmsr == 0xffff)
2009 return -2;
2010 if ((bmsr & 4) == 0) {
2011 int new_bmsr = mdio_read(nic, tp->phys[0], 1);
2012 if ((new_bmsr & 4) == 0) {
2013 #ifdef TULIP_DEBUG
2014 if (tulip_debug > 1)
2015 printf("%s: No link beat on the MII interface,"
2016 " status %#x.\n", tp->nic_name,
2017 new_bmsr);
2018 #endif
2019 return -1;
2022 tp->full_duplex = lpa & 0x140;
2024 new_csr6 = tp->csr6;
2025 negotiated = lpa & tp->advertising[0];
2027 if(negotiated & 0x380) new_csr6 &= ~0x400000;
2028 else new_csr6 |= 0x400000;
2029 if (tp->full_duplex) new_csr6 |= 0x200;
2030 else new_csr6 &= ~0x200;
2032 if (new_csr6 != tp->csr6) {
2033 tp->csr6 = new_csr6;
2035 #ifdef TULIP_DEBUG
2036 if (tulip_debug > 0)
2037 printf("%s: Setting %s-duplex based on MII"
2038 "#%d link partner capability of %#x.\n",
2039 tp->nic_name,
2040 tp->full_duplex ? "full" : "half",
2041 tp->phys[0], lpa);
2042 #endif
2043 return 1;
2046 return 0;
2049 static struct pci_device_id tulip_nics[] = {
2050 PCI_ROM(0x1011, 0x0002, "dc21040", "Digital Tulip", 0),
2051 PCI_ROM(0x1011, 0x0009, "ds21140", "Digital Tulip Fast", 0),
2052 PCI_ROM(0x1011, 0x0014, "dc21041", "Digital Tulip+", 0),
2053 PCI_ROM(0x1011, 0x0019, "ds21142", "Digital Tulip 21142", 0),
2054 PCI_ROM(0x10b7, 0x9300, "3csoho100b-tx","3ComSOHO100B-TX", 0),
2055 PCI_ROM(0x10b9, 0x5261, "ali1563", "ALi 1563 integrated ethernet", 0),
2056 PCI_ROM(0x10d9, 0x0512, "mx98713", "Macronix MX987x3", 0),
2057 PCI_ROM(0x10d9, 0x0531, "mx98715", "Macronix MX987x5", 0),
2058 PCI_ROM(0x1113, 0x1217, "mxic-98715", "Macronix MX987x5", 0),
2059 PCI_ROM(0x11ad, 0xc115, "lc82c115", "LinkSys LNE100TX", 0),
2060 PCI_ROM(0x11ad, 0x0002, "82c168", "Netgear FA310TX", 0),
2061 PCI_ROM(0x1282, 0x9100, "dm9100", "Davicom 9100", 0),
2062 PCI_ROM(0x1282, 0x9102, "dm9102", "Davicom 9102", 0),
2063 PCI_ROM(0x1282, 0x9009, "dm9009", "Davicom 9009", 0),
2064 PCI_ROM(0x1282, 0x9132, "dm9132", "Davicom 9132", 0),
2065 PCI_ROM(0x1317, 0x0985, "centaur-p", "ADMtek Centaur-P", 0),
2066 PCI_ROM(0x1317, 0x0981, "an981", "ADMtek AN981 Comet", 0), /* ADMTek Centaur-P (stmicro) */
2067 PCI_ROM(0x1113, 0x1216, "an983", "ADMTek AN983 Comet", 0),
2068 PCI_ROM(0x1317, 0x9511, "an983b", "ADMTek Comet 983b", 0),
2069 PCI_ROM(0x1317, 0x1985, "centaur-c", "ADMTek Centaur-C", 0),
2070 PCI_ROM(0x8086, 0x0039, "intel21145", "Intel Tulip", 0),
2071 PCI_ROM(0x125b, 0x1400, "ax88140", "ASIX AX88140", 0),
2072 PCI_ROM(0x11f6, 0x9881, "rl100tx", "Compex RL100-TX", 0),
2073 PCI_ROM(0x115d, 0x0003, "xircomtulip", "Xircom Tulip", 0),
2074 PCI_ROM(0x104a, 0x0981, "tulip-0981", "Tulip 0x104a 0x0981", 0),
2075 PCI_ROM(0x104a, 0x2774, "SGThomson-STE10100A", "Tulip 0x104a 0x2774", 0), /*Modified by Ramesh Chander*/
2076 PCI_ROM(0x1113, 0x9511, "tulip-9511", "Tulip 0x1113 0x9511", 0),
2077 PCI_ROM(0x1186, 0x1561, "tulip-1561", "Tulip 0x1186 0x1561", 0),
2078 PCI_ROM(0x1259, 0xa120, "tulip-a120", "Tulip 0x1259 0xa120", 0),
2079 PCI_ROM(0x13d1, 0xab02, "tulip-ab02", "Tulip 0x13d1 0xab02", 0),
2080 PCI_ROM(0x13d1, 0xab03, "tulip-ab03", "Tulip 0x13d1 0xab03", 0),
2081 PCI_ROM(0x13d1, 0xab08, "tulip-ab08", "Tulip 0x13d1 0xab08", 0),
2082 PCI_ROM(0x14f1, 0x1803, "lanfinity", "Conexant LANfinity", 0),
2083 PCI_ROM(0x1626, 0x8410, "tulip-8410", "Tulip 0x1626 0x8410", 0),
2084 PCI_ROM(0x1737, 0xab08, "tulip-1737-ab08","Tulip 0x1737 0xab08", 0),
2085 PCI_ROM(0x1737, 0xab09, "tulip-ab09", "Tulip 0x1737 0xab09", 0),
2088 PCI_DRIVER ( tulip_driver, tulip_nics, PCI_NO_CLASS );
2090 DRIVER ( "Tulip", nic_driver, pci_driver, tulip_driver,
2091 tulip_probe, tulip_disable );
2094 * Local variables:
2095 * c-basic-offset: 8
2096 * c-indent-level: 8
2097 * tab-width: 8
2098 * End: