|
|
1.1 root 1: /* tulip.c: A DEC 21040-family ethernet driver for Linux. */
2: /*
3: Written 1994-1998 by Donald Becker.
4:
5: This software may be used and distributed according to the terms
6: of the GNU Public License, incorporated herein by reference.
7:
8: This driver is for the Digital "Tulip" ethernet adapter interface.
9: It should work with most DEC 21*4*-based chips/ethercards, as well as
10: PNIC and MXIC chips.
11:
12: The author may be reached as [email protected], or C/O
13: Center of Excellence in Space Data and Information Sciences
14: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
15:
16: Support and updates available at
17: http://cesdis.gsfc.nasa.gov/linux/drivers/tulip.html
18: */
19:
20: #define SMP_CHECK
21: static const char version[] = "tulip.c:v0.89H 5/23/98 [email protected]\n";
22:
23: /* A few user-configurable values. */
24:
25: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
26: static int max_interrupt_work = 25;
27:
28: #define MAX_UNITS 8
29: /* Used to pass the full-duplex flag, etc. */
30: static int full_duplex[MAX_UNITS] = {0, };
31: static int options[MAX_UNITS] = {0, };
32: static int mtu[MAX_UNITS] = {0, }; /* Jumbo MTU for interfaces. */
33:
34: /* The possible media types that can be set in options[] are: */
35: static const char * const medianame[] = {
36: "10baseT", "10base2", "AUI", "100baseTx",
37: "10baseT-FD", "100baseTx-FD", "100baseT4", "100baseFx",
38: "100baseFx-FD", "MII 10baseT", "MII 10baseT-FD", "MII",
39: "10baseT(forced)", "MII 100baseTx", "MII 100baseTx-FD", "MII 100baseT4",
40: };
41:
42: /* Set if the PCI BIOS detects the chips on a multiport board backwards. */
43: #ifdef REVERSE_PROBE_ORDER
44: static int reverse_probe = 1;
45: #else
46: static int reverse_probe = 0;
47: #endif
48:
49: /* Keep the ring sizes a power of two for efficiency.
50: Making the Tx ring too large decreases the effectiveness of channel
51: bonding and packet priority.
52: There are no ill effects from too-large receive rings. */
53: #define TX_RING_SIZE 16
54: #define RX_RING_SIZE 32
55:
56: /* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
57: #ifdef __alpha__
58: static int rx_copybreak = 1518;
59: #else
60: static int rx_copybreak = 100;
61: #endif
62:
63: /* Operational parameters that usually are not changed. */
64: /* Time in jiffies before concluding the transmitter is hung. */
65: #define TX_TIMEOUT (4*HZ)
66:
67: #include <linux/config.h>
68: #ifdef MODULE
69: #ifdef MODVERSIONS
70: #include <linux/modversions.h>
71: #endif
72: #include <linux/module.h>
73: #include <linux/version.h>
74: #else
75: #define MOD_INC_USE_COUNT
76: #define MOD_DEC_USE_COUNT
77: #endif
78:
79: #include <linux/kernel.h>
80: #include <linux/sched.h>
81: #include <linux/string.h>
82: #include <linux/timer.h>
83: #include <linux/ptrace.h>
84: #include <linux/errno.h>
85: #include <linux/ioport.h>
86: #include <linux/malloc.h>
87: #include <linux/interrupt.h>
88: #include <linux/pci.h>
89: #include <linux/bios32.h>
90: #include <asm/processor.h> /* Processor type for cache alignment. */
91: #include <asm/bitops.h>
92: #include <asm/io.h>
93: #include <asm/dma.h>
94:
95: #include <linux/netdevice.h>
96: #include <linux/etherdevice.h>
97: #include <linux/skbuff.h>
98:
99: /* Kernel compatibility defines, common to David Hind's PCMCIA package.
100: This is only in the support-all-kernels source code. */
101: #include <linux/version.h> /* Evil, but neccessary */
102:
103: #if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10300
104: #define RUN_AT(x) (x) /* What to put in timer->expires. */
105: #define DEV_ALLOC_SKB(len) alloc_skb(len, GFP_ATOMIC)
106: #define virt_to_bus(addr) ((unsigned long)addr)
107: #define bus_to_virt(addr) ((void*)addr)
108:
109: #else /* 1.3.0 and later */
110: #define RUN_AT(x) (jiffies + (x))
111: #define DEV_ALLOC_SKB(len) dev_alloc_skb(len + 2)
112: #endif
113:
114: #if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10338
115: #ifdef MODULE
116: #if !defined(CONFIG_MODVERSIONS) && !defined(__NO_VERSION__)
117: char kernel_version[] = UTS_RELEASE;
118: #endif
119: #else
120: #undef MOD_INC_USE_COUNT
121: #define MOD_INC_USE_COUNT
122: #undef MOD_DEC_USE_COUNT
123: #define MOD_DEC_USE_COUNT
124: #endif
125: #endif /* 1.3.38 */
126:
127: #if (LINUX_VERSION_CODE >= 0x10344)
128: #define NEW_MULTICAST
129: #include <linux/delay.h>
130: #endif
131: #if (LINUX_VERSION_CODE >= 0x20100)
132: char kernel_version[] = UTS_RELEASE;
133: #endif
134: #ifdef SA_SHIRQ
135: #define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
136: #else
137: #define IRQ(irq, dev_id, pt_regs) (irq, pt_regs)
138: #endif
139:
140: #if (LINUX_VERSION_CODE < 0x20123)
141: #define hard_smp_processor_id() smp_processor_id()
142: #define test_and_set_bit(val, addr) set_bit(val, addr)
143: #endif
144:
145: /* This my implementation of shared IRQs, now only used for 1.2.13. */
146: #ifdef HAVE_SHARED_IRQ
147: #define USE_SHARED_IRQ
148: #include <linux/shared_irq.h>
149: #endif
150:
151: /* The total size is unusually large: The 21040 aligns each of its 16
152: longword-wide registers on a quadword boundary. */
153: #define TULIP_TOTAL_SIZE 0x80
154:
155: #ifdef HAVE_DEVLIST
156: struct netdev_entry tulip_drv =
157: {"Tulip", tulip_pci_probe, TULIP_TOTAL_SIZE, NULL};
158: #endif
159:
160: #ifdef TULIP_DEBUG
161: int tulip_debug = TULIP_DEBUG;
162: #else
163: int tulip_debug = 1;
164: #endif
165:
166: /*
167: Theory of Operation
168:
169: I. Board Compatibility
170:
171: This device driver is designed for the DECchip "Tulip", Digital's
172: single-chip ethernet controllers for PCI. Supported members of the family
173: are the 21040, 21041, 21140, 21140A, 21142, and 21143. These chips are used on
174: many PCI boards including the SMC EtherPower series.
175:
176:
177: II. Board-specific settings
178:
179: PCI bus devices are configured by the system at boot time, so no jumpers
180: need to be set on the board. The system BIOS preferably should assign the
181: PCI INTA signal to an otherwise unused system IRQ line.
182: Note: Kernel versions earlier than 1.3.73 do not support shared PCI
183: interrupt lines.
184:
185: III. Driver operation
186:
187: IIIa. Ring buffers
188:
189: The Tulip can use either ring buffers or lists of Tx and Rx descriptors.
190: This driver uses statically allocated rings of Rx and Tx descriptors, set at
191: compile time by RX/TX_RING_SIZE. This version of the driver allocates skbuffs
192: for the Rx ring buffers at open() time and passes the skb->data field to the
193: Tulip as receive data buffers. When an incoming frame is less than
194: RX_COPYBREAK bytes long, a fresh skbuff is allocated and the frame is
195: copied to the new skbuff. When the incoming frame is larger, the skbuff is
196: passed directly up the protocol stack and replaced by a newly allocated
197: skbuff.
198:
199: The RX_COPYBREAK value is chosen to trade-off the memory wasted by
200: using a full-sized skbuff for small frames vs. the copying costs of larger
201: frames. For small frames the copying cost is negligible (esp. considering
202: that we are pre-loading the cache with immediately useful header
203: information). For large frames the copying cost is non-trivial, and the
204: larger copy might flush the cache of useful data. A subtle aspect of this
205: choice is that the Tulip only receives into longword aligned buffers, thus
206: the IP header at offset 14 isn't longword aligned for further processing.
207: Copied frames are put into the new skbuff at an offset of "+2", thus copying
208: has the beneficial effect of aligning the IP header and preloading the
209: cache.
210:
211: IIIC. Synchronization
212: The driver runs as two independent, single-threaded flows of control. One
213: is the send-packet routine, which enforces single-threaded use by the
214: dev->tbusy flag. The other thread is the interrupt handler, which is single
215: threaded by the hardware and other software.
216:
217: The send packet thread has partial control over the Tx ring and 'dev->tbusy'
218: flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
219: queue slot is empty, it clears the tbusy flag when finished otherwise it sets
220: the 'tp->tx_full' flag.
221:
222: The interrupt handler has exclusive control over the Rx ring and records stats
223: from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so
224: we can't avoid the interrupt overhead by having the Tx routine reap the Tx
225: stats.) After reaping the stats, it marks the queue entry as empty by setting
226: the 'base' to zero. Iff the 'tp->tx_full' flag is set, it clears both the
227: tx_full and tbusy flags.
228:
229: IV. Notes
230:
231: Thanks to Duke Kamstra of SMC for providing an EtherPower board.
232:
233: IVb. References
234:
235: http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
236: http://www.digital.com (search for current 21*4* datasheets and "21X4 SROM")
237: http://www.national.com/pf/DP/DP83840.html
238:
239: IVc. Errata
240:
241: The DEC databook doesn't document which Rx filter settings accept broadcast
242: packets. Nor does it document how to configure the part to configure the
243: serial subsystem for normal (vs. loopback) operation or how to have it
244: autoswitch between internal 10baseT, SIA and AUI transceivers.
245:
246: The 21040 databook claims that CSR13, CSR14, and CSR15 should each be the last
247: register of the set CSR12-15 written. Hmmm, now how is that possible? */
248:
249:
250: /* A few values that may be tweaked. */
251: #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
252:
253: /* This is a mysterious value that can be written to CSR11 in the 21040 (only)
254: to support a pre-NWay full-duplex signaling mechanism using short frames.
255: No one knows what it should be, but if left at its default value some
256: 10base2(!) packets trigger a full-duplex-request interrupt. */
257: #define FULL_DUPLEX_MAGIC 0x6969
258:
259: #ifndef PCI_VENDOR_ID_DEC /* Now defined in linux/pci.h */
260: #define PCI_VENDOR_ID_DEC 0x1011
261: #define PCI_DEVICE_ID_TULIP 0x0002 /* 21040. */
262: #define PCI_DEVICE_ID_TULIP_FAST 0x0009 /* 21140. */
263: #endif
264:
265: #ifndef PCI_DEVICE_ID_DEC_TULIP_PLUS
266: #define PCI_DEVICE_ID_DEC_TULIP_PLUS 0x0014 /* 21041. */
267: #endif
268: #ifndef PCI_DEVICE_ID_DEC_TULIP_21142
269: #define PCI_DEVICE_ID_DEC_TULIP_21142 0x0019
270: #endif
271:
272: #ifndef PCI_VENDOR_ID_LITEON
273: #define PCI_VENDOR_ID_LITEON 0x11AD
274: #endif
275:
276: #ifndef PCI_VENDOR_ID_MXIC
277: #define PCI_VENDOR_ID_MXIC 0x10d9
278: #define PCI_DEVICE_ID_MX98713 0x0512
279: #define PCI_DEVICE_ID_MX98715 0x0531
280: #define PCI_DEVICE_ID_MX98725 0x0531
281: #endif
282:
283: /* The rest of these values should never change. */
284:
285: static void tulip_timer(unsigned long data);
286: static void t21142_timer(unsigned long data);
287: static void mxic_timer(unsigned long data);
288: static void pnic_timer(unsigned long data);
289:
290: /* A table describing the chip types. */
291: enum tbl_flag { HAS_MII=1, HAS_MEDIA_TABLE = 2, CSR12_IN_SROM = 4,};
292: static struct tulip_chip_table {
293: int vendor_id, device_id;
294: char *chip_name;
295: int io_size;
296: int valid_intrs; /* CSR7 interrupt enable settings */
297: int flags;
298: void (*media_timer)(unsigned long data);
299: } tulip_tbl[] = {
300: { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
301: "Digital DC21040 Tulip", 128, 0x0001ebef, 0, tulip_timer },
302: { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
303: "Digital DC21041 Tulip", 128, 0x0001ebef, HAS_MEDIA_TABLE, tulip_timer },
304: { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
305: "Digital DS21140 Tulip", 128, 0x0001ebef,
306: HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM,
307: tulip_timer },
308: { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_21142,
309: "Digital DS21142/3 Tulip", 256, 0x0801fbff,
310: HAS_MII | HAS_MEDIA_TABLE, t21142_timer },
311: { PCI_VENDOR_ID_LITEON, 0x0002,
312: "Lite-On 82c168 PNIC", 256, 0x0001ebef, HAS_MII, pnic_timer },
313: { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98713,
314: "Macronix 98713 PMAC", 128, 0x0001ebef,
315: HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM, tulip_timer /* Tulip-like! */ },
316: { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98715,
317: "Macronix 98715 PMAC", 256, 0x0001ebef, HAS_MEDIA_TABLE, mxic_timer },
318: { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98725,
319: "Macronix 98725 PMAC", 256, 0x0001ebef, HAS_MEDIA_TABLE, mxic_timer },
320: { 0x125B, 0x1400, "ASIX AX88140", 128, 0x0001fbff,
321: HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM, tulip_timer },
322: {0, 0, 0, 0},
323: };
324: /* This matches the table above. */
325: enum chips { DC21040=0, DC21041=1, DC21140=2, DC21142=3, DC21143=3,
326: LC82C168, MX98713, MX98715, MX98725};
327:
328: /* A full-duplex map for media types. */
329: enum MediaIs {MediaIsFD = 1, MediaAlwaysFD=2, MediaIsMII=4, MediaIsFx=8,
330: MediaIs100=16};
331: static const char media_cap[] =
332: {0,0,0,16, 3,19,16,24, 27,4,7,5, 0,20,23,20 };
333: /* 21041 transceiver register settings: 10-T, 10-2, AUI, 10-T, 10T-FD*/
334: static u16 t21041_csr13[] = { 0xEF05, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
335: static u16 t21041_csr14[] = { 0x7F3F, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
336: static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
337:
338: static u16 t21142_csr13[] = { 0x0001, 0x0009, 0x0009, 0x0000, 0x0001, };
339: static u16 t21142_csr14[] = { 0xFFFF, 0x0705, 0x0705, 0x0000, 0x7F3D, };
340: static u16 t21142_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
341:
342: /* Offsets to the Command and Status Registers, "CSRs". All accesses
343: must be longword instructions and quadword aligned. */
344: enum tulip_offsets {
345: CSR0=0, CSR1=0x08, CSR2=0x10, CSR3=0x18, CSR4=0x20, CSR5=0x28,
346: CSR6=0x30, CSR7=0x38, CSR8=0x40, CSR9=0x48, CSR10=0x50, CSR11=0x58,
347: CSR12=0x60, CSR13=0x68, CSR14=0x70, CSR15=0x78 };
348:
349: /* The bits in the CSR5 status registers, mostly interrupt sources. */
350: enum status_bits {
351: TimerInt=0x800, TPLnkFail=0x1000, TPLnkPass=0x10,
352: NormalIntr=0x10000, AbnormalIntr=0x8000,
353: RxJabber=0x200, RxDied=0x100, RxNoBuf=0x80, RxIntr=0x40,
354: TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02, TxIntr=0x01,
355: };
356:
357: /* The Tulip Rx and Tx buffer descriptors. */
358: struct tulip_rx_desc {
359: s32 status;
360: s32 length;
361: u32 buffer1, buffer2;
362: };
363:
364: struct tulip_tx_desc {
365: s32 status;
366: s32 length;
367: u32 buffer1, buffer2; /* We use only buffer 1. */
368: };
369:
370: struct medialeaf {
371: u8 type;
372: u8 media;
373: unsigned char *leafdata;
374: };
375:
376: struct mediatable {
377: u16 defaultmedia;
378: u8 leafcount, csr12dir; /* General purpose pin directions. */
379: unsigned has_mii:1, has_nonmii:1;
380: struct medialeaf mleaf[0];
381: };
382:
383: struct mediainfo {
384: struct mediainfo *next;
385: int info_type;
386: int index;
387: unsigned char *info;
388: };
389:
390: struct tulip_private {
391: char devname[8]; /* Used only for kernel debugging. */
392: const char *product_name;
393: struct device *next_module;
394: struct tulip_rx_desc rx_ring[RX_RING_SIZE];
395: struct tulip_tx_desc tx_ring[TX_RING_SIZE];
396: /* The saved address of a sent-in-place packet/buffer, for skfree(). */
397: struct sk_buff* tx_skbuff[TX_RING_SIZE];
398: /* The addresses of receive-in-place skbuffs. */
399: struct sk_buff* rx_skbuff[RX_RING_SIZE];
400: char *rx_buffs; /* Address of temporary Rx buffers. */
401: u32 setup_frame[48]; /* Pseudo-Tx frame to init address table. */
402: int chip_id;
403: int revision;
404: #if LINUX_VERSION_CODE > 0x20139
405: struct net_device_stats stats;
406: #else
407: struct enet_statistics stats;
408: #endif
409: struct timer_list timer; /* Media selection timer. */
410: int interrupt; /* In-interrupt flag. */
411: #ifdef SMP_CHECK
412: int smp_proc_id; /* Which processor in IRQ handler. */
413: #endif
414: unsigned int cur_rx, cur_tx; /* The next free ring entry */
415: unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
416: unsigned int tx_full:1; /* The Tx queue is full. */
417: unsigned int full_duplex:1; /* Full-duplex operation requested. */
418: unsigned int full_duplex_lock:1;
419: unsigned int fake_addr:1; /* Multiport board faked address. */
420: unsigned int default_port:4; /* Last dev->if_port value. */
421: unsigned int media2:4; /* Secondary monitored media port. */
422: unsigned int medialock:1; /* Don't sense media type. */
423: unsigned int mediasense:1; /* Media sensing in progress. */
424: unsigned int csr6; /* Current CSR6 control settings. */
425: unsigned char eeprom[128]; /* Serial EEPROM contents. */
426: u16 to_advertise; /* NWay capabilities advertised. */
427: u16 advertising[4];
428: signed char phys[4], mii_cnt; /* MII device addresses. */
429: struct mediatable *mtable;
430: int cur_index; /* Current media index. */
431: unsigned char pci_bus, pci_dev_fn;
432: int pad0, pad1; /* Used for 8-byte alignment */
433: };
434:
435: static struct device *tulip_probe1(int pci_bus, int pci_devfn,
436: struct device *dev,
437: int chip_id, int options);
438: static void parse_eeprom(struct device *dev);
439: static int read_eeprom(long ioaddr, int location);
440: static int mdio_read(struct device *dev, int phy_id, int location);
441: static void mdio_write(struct device *dev, int phy_id, int location, int value);
442: static void select_media(struct device *dev, int startup);
443: static int tulip_open(struct device *dev);
444: static void tulip_timer(unsigned long data);
445: static void tulip_tx_timeout(struct device *dev);
446: static void tulip_init_ring(struct device *dev);
447: static int tulip_start_xmit(struct sk_buff *skb, struct device *dev);
448: static int tulip_rx(struct device *dev);
449: static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs);
450: static int tulip_close(struct device *dev);
451: static struct enet_statistics *tulip_get_stats(struct device *dev);
452: #ifdef HAVE_PRIVATE_IOCTL
453: static int private_ioctl(struct device *dev, struct ifreq *rq, int cmd);
454: #endif
455: #ifdef NEW_MULTICAST
456: static void set_rx_mode(struct device *dev);
457: #else
458: static void set_rx_mode(struct device *dev, int num_addrs, void *addrs);
459: #endif
460:
461:
462:
463: /* A list of all installed Tulip devices, for removing the driver module. */
464: static struct device *root_tulip_dev = NULL;
465:
466: /* This 21040 probe no longer uses a large fixed contiguous Rx buffer region,
467: but now receives directly into full-sized skbuffs that are allocated
468: at open() time.
469: This allows the probe routine to use the old driver initialization
470: interface. */
471:
472: int tulip_probe(struct device *dev)
473: {
474: int cards_found = 0;
475: static int pci_index = 0; /* Static, for multiple probe calls. */
476: unsigned char pci_bus, pci_device_fn;
477:
478: /* Ideally we would detect all network cards in slot order. That would
479: be best done a central PCI probe dispatch, which wouldn't work
480: well with the current structure. So instead we detect just the
481: Tulip cards in slot order. */
482:
483: #if LINUX_VERSION_CODE >= 0x20155
484: if (! pci_present())
485: return -ENODEV;
486: #else
487: if (! pcibios_present())
488: return -ENODEV;
489: #endif
490: for (;pci_index < 0xff; pci_index++) {
491: u16 vendor, device, pci_command, new_command;
492: u32 pci_ioaddr;
493: int chip_idx = 0;
494:
495: if (pcibios_find_class
496: (PCI_CLASS_NETWORK_ETHERNET << 8,
497: reverse_probe ? 0xfe - pci_index : pci_index,
498: &pci_bus, &pci_device_fn) != PCIBIOS_SUCCESSFUL)
499: if (reverse_probe)
500: continue;
501: else
502: break;
503: pcibios_read_config_word(pci_bus, pci_device_fn,
504: PCI_VENDOR_ID, &vendor);
505: pcibios_read_config_word(pci_bus, pci_device_fn,
506: PCI_DEVICE_ID, &device);
507:
508: for (chip_idx = 0; tulip_tbl[chip_idx].chip_name; chip_idx++)
509: if (vendor == tulip_tbl[chip_idx].vendor_id &&
510: device == tulip_tbl[chip_idx].device_id)
511: break;
512: if (tulip_tbl[chip_idx].chip_name == 0) {
513: if (vendor == PCI_VENDOR_ID_DEC ||
514: vendor == PCI_VENDOR_ID_LITEON)
515: printk(KERN_INFO "Unknown Tulip-style PCI ethernet chip type"
516: " %4.4x %4.4x"" detected: not configured.\n",
517: vendor, device);
518: continue;
519: }
520: #if LINUX_VERSION_CODE >= 0x20155
521: pci_ioaddr = pci_find_slot(pci_bus, pci_device_fn)->base_address[0];
522: #else
523: pcibios_read_config_dword(pci_bus, pci_device_fn, PCI_BASE_ADDRESS_0,
524: &pci_ioaddr);
525: #endif
526: /* Remove I/O space marker in bit 0. */
527: pci_ioaddr &= ~3;
528:
529: if (tulip_debug > 2)
530: printk(KERN_DEBUG "Found %s at I/O %#x.\n",
531: tulip_tbl[chip_idx].chip_name, pci_ioaddr);
532:
533: if (check_region(pci_ioaddr, tulip_tbl[chip_idx].io_size))
534: continue;
535:
536: pcibios_read_config_word(pci_bus, pci_device_fn,
537: PCI_COMMAND, &pci_command);
538: new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
539: if (pci_command != new_command) {
540: printk(KERN_INFO " The PCI BIOS has not enabled this"
541: " device! Updating PCI command %4.4x->%4.4x.\n",
542: pci_command, new_command);
543: pcibios_write_config_word(pci_bus, pci_device_fn,
544: PCI_COMMAND, new_command);
545: }
546:
547: dev = tulip_probe1(pci_bus, pci_device_fn, dev, chip_idx, cards_found);
548:
549: /* Get and check the bus-master and latency values. */
550: if (dev) {
551: unsigned char pci_latency;
552: pcibios_read_config_byte(pci_bus, pci_device_fn,
553: PCI_LATENCY_TIMER, &pci_latency);
554: if (pci_latency < 10) {
555: printk(KERN_INFO " PCI latency timer (CFLT) is "
556: "unreasonably low at %d. Setting to 64 clocks.\n",
557: pci_latency);
558: pcibios_write_config_byte(pci_bus, pci_device_fn,
559: PCI_LATENCY_TIMER, 64);
560: } else if (tulip_debug > 1)
561: printk(KERN_INFO " PCI latency timer (CFLT) is %#x, "
562: " PCI command is %4.4x.\n",
563: pci_latency, new_command);
564: /* Bring the 21143 out power-down mode. */
565: if (device == PCI_DEVICE_ID_DEC_TULIP_21142)
566: pcibios_write_config_dword(pci_bus, pci_device_fn,
567: 0x40, 0x40000000);
568: dev = 0;
569: cards_found++;
570: }
571: }
572:
573: return cards_found ? 0 : -ENODEV;
574: }
575:
576: static struct device *tulip_probe1(int pci_bus, int pci_device_fn,
577: struct device *dev,
578: int chip_id, int board_idx)
579: {
580: static int did_version = 0; /* Already printed version info. */
581: struct tulip_private *tp;
582: long ioaddr;
583: int irq;
584: /* See note below on the multiport cards. */
585: static unsigned char last_phys_addr[6] = {0x00, 'L', 'i', 'n', 'u', 'x'};
586: static int last_irq = 0;
587: static int multiport_cnt = 0; /* For four-port boards w/one EEPROM */
588: int i;
589: unsigned short sum;
590:
591: if (tulip_debug > 0 && did_version++ == 0)
592: printk(KERN_INFO "%s", version);
593:
594: dev = init_etherdev(dev, 0);
595:
596: #if LINUX_VERSION_CODE >= 0x20155
597: irq = pci_find_slot(pci_bus, pci_device_fn)->irq;
598: ioaddr = pci_find_slot(pci_bus, pci_device_fn)->base_address[0];
599: #else
600: {
601: u8 pci_irq_line;
602: u32 pci_ioaddr;
603: pcibios_read_config_byte(pci_bus, pci_device_fn,
604: PCI_INTERRUPT_LINE, &pci_irq_line);
605: pcibios_read_config_dword(pci_bus, pci_device_fn, PCI_BASE_ADDRESS_0,
606: &pci_ioaddr);
607: irq = pci_irq_line;
608: ioaddr = pci_ioaddr;
609: }
610: #endif
611: /* Remove I/O space marker in bit 0. */
612: ioaddr &= ~3;
613:
614: printk(KERN_INFO "%s: %s at %#3lx,",
615: dev->name, tulip_tbl[chip_id].chip_name, ioaddr);
616:
617: /* Stop the chip's Tx and Rx processes. */
618: outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6);
619: /* Clear the missed-packet counter. */
620: (volatile int)inl(ioaddr + CSR8);
621:
622: if (chip_id == DC21041) {
623: if (inl(ioaddr + CSR9) & 0x8000) {
624: printk(" 21040 compatible mode,");
625: chip_id = DC21040;
626: } else {
627: printk(" 21041 mode,");
628: }
629: }
630:
631: /* The station address ROM is read byte serially. The register must
632: be polled, waiting for the value to be read bit serially from the
633: EEPROM.
634: */
635: sum = 0;
636: if (chip_id == DC21040) {
637: outl(0, ioaddr + CSR9); /* Reset the pointer with a dummy write. */
638: for (i = 0; i < 6; i++) {
639: int value, boguscnt = 100000;
640: do
641: value = inl(ioaddr + CSR9);
642: while (value < 0 && --boguscnt > 0);
643: dev->dev_addr[i] = value;
644: sum += value & 0xff;
645: }
646: } else if (chip_id == LC82C168) {
647: for (i = 0; i < 3; i++) {
648: int value, boguscnt = 100000;
649: outl(0x600 | i, ioaddr + 0x98);
650: do
651: value = inl(ioaddr + CSR9);
652: while (value < 0 && --boguscnt > 0);
653: ((u16*)dev->dev_addr)[i] = value;
654: sum += value & 0xffff;
655: }
656: } else { /* Must be a new chip, with a serial EEPROM interface. */
657: /* We read the whole EEPROM, and sort it out later. DEC has a
658: specification _Digital Semiconductor 21X4 Serial ROM Format_
659: but early vendor boards just put the address in the first six
660: EEPROM locations. */
661: unsigned char ee_data[128];
662: int sa_offset = 0;
663:
664: for (i = 0; i < sizeof(ee_data)/2; i++)
665: ((u16 *)ee_data)[i] = read_eeprom(ioaddr, i);
666:
667: /* Detect the simple EEPROM format by the duplicated station addr. */
668: for (i = 0; i < 8; i ++)
669: if (ee_data[i] != ee_data[16+i])
670: sa_offset = 20;
671: if (ee_data[0] == 0xff && ee_data[1] == 0xff && ee_data[2] == 0) {
672: sa_offset = 2; /* Grrr, damn Matrox boards. */
673: multiport_cnt = 4;
674: }
675: for (i = 0; i < 6; i ++) {
676: dev->dev_addr[i] = ee_data[i + sa_offset];
677: sum += ee_data[i + sa_offset];
678: }
679: }
680: /* Lite-On boards have the address byte-swapped. */
681: if (dev->dev_addr[0] == 0xA0 && dev->dev_addr[1] == 0x00)
682: for (i = 0; i < 6; i+=2) {
683: char tmp = dev->dev_addr[i];
684: dev->dev_addr[i] = dev->dev_addr[i+1];
685: dev->dev_addr[i+1] = tmp;
686: }
687: /* On the Zynx 315 Etherarray and other multiport boards only the
688: first Tulip has an EEPROM.
689: The addresses of the subsequent ports are derived from the first.
690: Many PCI BIOSes also incorrectly report the IRQ line, so we correct
691: that here as well. */
692: if (sum == 0 || sum == 6*0xff) {
693: printk(" EEPROM not present,");
694: for (i = 0; i < 5; i++)
695: dev->dev_addr[i] = last_phys_addr[i];
696: dev->dev_addr[i] = last_phys_addr[i] + 1;
697: #if defined(__i386__) /* This BIOS bug doesn't exist on Alphas. */
698: irq = last_irq;
699: #endif
700: }
701:
702: for (i = 0; i < 6; i++)
703: printk(" %2.2x", last_phys_addr[i] = dev->dev_addr[i]);
704: printk(", IRQ %d.\n", irq);
705: last_irq = irq;
706:
707: /* We do a request_region() only to register /proc/ioports info. */
708: /* Note that proper size is tulip_tbl[chip_id].chip_name, but... */
709: request_region(ioaddr, TULIP_TOTAL_SIZE, dev->name);
710:
711: dev->base_addr = ioaddr;
712: dev->irq = irq;
713:
714: /* Make certain the data structures are quadword aligned. */
715: tp = (void *)(((long)kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA) + 7) & ~7);
716: memset(tp, 0, sizeof(*tp));
717: dev->priv = tp;
718:
719: tp->next_module = root_tulip_dev;
720: root_tulip_dev = dev;
721:
722: tp->pci_bus = pci_bus;
723: tp->pci_dev_fn = pci_device_fn;
724: tp->chip_id = chip_id;
725:
726: #ifdef TULIP_FULL_DUPLEX
727: tp->full_duplex = 1;
728: tp->full_duplex_lock = 1;
729: #endif
730: #ifdef TULIP_DEFAULT_MEDIA
731: tp->default_port = TULIP_DEFAULT_MEDIA;
732: #endif
733: #ifdef TULIP_NO_MEDIA_SWITCH
734: tp->medialock = 1;
735: #endif
736:
737: /* The lower four bits are the media type. */
738: if (board_idx >= 0 && board_idx < MAX_UNITS) {
739: tp->default_port = options[board_idx] & 15;
740: if ((options[board_idx] & 0x90) || full_duplex[board_idx] > 0)
741: tp->full_duplex = 1;
742: if (mtu[board_idx] > 0)
743: dev->mtu = mtu[board_idx];
744: }
745: if (dev->mem_start)
746: tp->default_port = dev->mem_start;
747: if (tp->default_port) {
748: tp->medialock = 1;
749: if (media_cap[tp->default_port] & MediaAlwaysFD)
750: tp->full_duplex = 1;
751: }
752: if (tp->full_duplex)
753: tp->full_duplex_lock = 1;
754:
755: /* This is logically part of probe1(), but too complex to write inline. */
756: if (tulip_tbl[chip_id].flags & HAS_MEDIA_TABLE)
757: parse_eeprom(dev);
758:
759: if (media_cap[tp->default_port] & MediaIsMII) {
760: u16 media2advert[] = { 0x20, 0x40, 0x03e0, 0x60, 0x80, 0x100, 0x200 };
761: tp->to_advertise = media2advert[tp->default_port - 9];
762: } else
763: tp->to_advertise = 0x03e1;
764:
765: if ((tp->mtable && tp->mtable->has_mii) ||
766: ( ! tp->mtable && (tulip_tbl[tp->chip_id].flags & HAS_MII))) {
767: int phy, phy_idx;
768: /* Find the connected MII xcvrs.
769: Doing this in open() would allow detecting external xcvrs later,
770: but takes much time. */
771: for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
772: phy++) {
773: int mii_status = mdio_read(dev, phy, 1);
774: if (mii_status != 0xffff && mii_status != 0x0000) {
775: int mii_reg0 = mdio_read(dev, phy, 0);
776: int reg4 = ((mii_status>>6) & tp->to_advertise) | 1;
777: tp->phys[phy_idx] = phy;
778: tp->advertising[phy_idx++] = reg4;
779: printk(KERN_INFO "%s: MII transceiver found at MDIO address "
780: "%d, config %4.4x status %4.4x.\n",
781: dev->name, phy, mii_reg0, mii_status);
782: if (1 || (media_cap[tp->default_port] & MediaIsMII)) {
783: printk(KERN_DEBUG "%s: Advertising %4.4x on PHY %d,"
784: " previously advertising %4.4x.\n",
785: dev->name, reg4, phy, mdio_read(dev, phy, 4));
786: mdio_write(dev, phy, 4, reg4);
787: }
788: /* Enable autonegotiation: some boards default to off. */
789: mdio_write(dev, phy, 0, mii_reg0 |
790: (tp->full_duplex ? 0x1100 : 0x1000) |
791: (media_cap[tp->default_port]&MediaIs100 ? 0x2000:0));
792: }
793: }
794: tp->mii_cnt = phy_idx;
795: if (tp->mtable && tp->mtable->has_mii && phy_idx == 0) {
796: printk(KERN_INFO "%s: ***WARNING***: No MII transceiver found!\n",
797: dev->name);
798: tp->phys[0] = 1;
799: }
800: }
801:
802: /* The Tulip-specific entries in the device structure. */
803: dev->open = &tulip_open;
804: dev->hard_start_xmit = &tulip_start_xmit;
805: dev->stop = &tulip_close;
806: dev->get_stats = &tulip_get_stats;
807: #ifdef HAVE_PRIVATE_IOCTL
808: dev->do_ioctl = &private_ioctl;
809: #endif
810: #ifdef HAVE_MULTICAST
811: dev->set_multicast_list = &set_rx_mode;
812: #endif
813:
814: /* Reset the xcvr interface and turn on heartbeat. */
815: switch (chip_id) {
816: case DC21041:
817: outl(0x00000000, ioaddr + CSR13);
818: outl(0xFFFFFFFF, ioaddr + CSR14);
819: outl(0x00000008, ioaddr + CSR15); /* Listen on AUI also. */
820: outl(inl(ioaddr + CSR6) | 0x0200, ioaddr + CSR6);
821: outl(0x0000EF05, ioaddr + CSR13);
822: break;
823: case DC21040:
824: outl(0x00000000, ioaddr + CSR13);
825: outl(0x00000004, ioaddr + CSR13);
826: break;
827: case DC21140: default:
828: if (tp->mtable)
829: outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
830: break;
831: case DC21142:
832: outl(0x82420200, ioaddr + CSR6);
833: outl(0x0001, ioaddr + CSR13);
834: outl(0x0003FFFF, ioaddr + CSR14);
835: outl(0x0008, ioaddr + CSR15);
836: outl(0x0001, ioaddr + CSR13);
837: outl(0x1301, ioaddr + CSR12); /* Start NWay. */
838: break;
839: case LC82C168:
840: if ( ! tp->mii_cnt) {
841: outl(0x00420000, ioaddr + CSR6);
842: outl(0x30, ioaddr + CSR12);
843: outl(0x0001F078, ioaddr + 0xB8);
844: outl(0x0201F078, ioaddr + 0xB8); /* Turn on autonegotiation. */
845: }
846: break;
847: case MX98713: case MX98715: case MX98725:
848: outl(0x00000000, ioaddr + CSR6);
849: outl(0x000711C0, ioaddr + CSR14); /* Turn on NWay. */
850: outl(0x00000001, ioaddr + CSR13);
851: break;
852: }
853:
854: return dev;
855: }
856:
857: /* Serial EEPROM section. */
858: /* The main routine to parse the very complicated SROM structure.
859: Search www.digital.com for "21X4 SROM" to get details.
860: This code is very complex, and will require changes to support
861: additional cards, so I'll be verbose about what is going on.
862: */
863:
864: /* Known cards that have old-style EEPROMs. */
865: static struct fixups {
866: char *name;
867: unsigned char addr0, addr1, addr2;
868: u16 newtable[32]; /* Max length below. */
869: } eeprom_fixups[] = {
870: {"Asante", 0, 0, 0x94, {0x1e00, 0x0000, 0x0800, 0x0100, 0x018c,
871: 0x0000, 0x0000, 0xe078, 0x0001, 0x0050, 0x0018 }},
872: {"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x021f,
873: 0x0000, 0x009E, /* 10baseT */
874: 0x0903, 0x006D, /* 100baseTx */ }},
875: {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x033f,
876: 0x0107, 0x8021, /* 100baseFx */
877: 0x0108, 0x8021, /* 100baseFx-FD */
878: 0x0103, 0x006D, /* 100baseTx */ }},
879: {"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0313,
880: 0x1001, 0x009E, /* 10base2, CSR12 0x10*/
881: 0x0000, 0x009E, /* 10baseT */
882: 0x0303, 0x006D, /* 100baseTx, CSR12 0x03 */ }},
883: {"Accton EN1207", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x031F,
884: 0x1B01, 0x0000, /* 10base2, CSR12 0x1B */
885: 0x1B03, 0x006D, /* 100baseTx, CSR12 0x1B */
886: 0x0B00, 0x009E, /* 10baseT, CSR12 0x0B */
887: }},
888: {0, 0, 0, 0, {}}};
889:
890: static const char * block_name[] = {"21140 non-MII", "21140 MII PHY",
891: "21142 Serial PHY", "21142 MII PHY", "21143 SYM PHY", "21143 reset method"};
892:
893: #define EEPROM_SIZE 128
894: #if defined(__i386__)
895: #define get_u16(ptr) (*(u16 *)(ptr))
896: #else
897: #define get_u16(ptr) (((u8*)(ptr))[0] + (((u8*)(ptr))[1]<<8))
898: #endif
899:
900: static void parse_eeprom(struct device *dev)
901: {
902: /* The last media info list parsed, for multiport boards. */
903: static struct mediatable *last_mediatable = NULL;
904: static unsigned char *last_ee_data = NULL;
905: static int controller_index = 0;
906: struct tulip_private *tp = (struct tulip_private *)dev->priv;
907: long ioaddr = dev->base_addr;
908: unsigned char *ee_data = tp->eeprom;
909: int i;
910:
911: tp->mtable = 0;
912: for (i = 0; i < EEPROM_SIZE/2; i++)
913: ((u16 *)ee_data)[i] = read_eeprom(ioaddr, i);
914:
915: /* Detect an old-style (SA only) EEPROM layout:
916: memcmp(eedata, eedata+16, 8). */
917: for (i = 0; i < 8; i ++)
918: if (ee_data[i] != ee_data[16+i])
919: break;
920: if (i >= 8) {
921: if (ee_data[0] == 0xff) {
922: if (last_mediatable) {
923: controller_index++;
924: printk(KERN_INFO "%s: Controller %d of multiport board.\n",
925: dev->name, controller_index);
926: tp->mtable = last_mediatable;
927: ee_data = last_ee_data;
928: goto subsequent_board;
929: } else
930: printk(KERN_INFO "%s: Missing EEPROM, this interface may "
931: "not work correctly!\n",
932: dev->name);
933: return;
934: }
935: /* Do a fix-up based on the vendor half of the station address prefix. */
936: for (i = 0; eeprom_fixups[i].name; i++) {
937: if (dev->dev_addr[0] == eeprom_fixups[i].addr0
938: && dev->dev_addr[1] == eeprom_fixups[i].addr1
939: && dev->dev_addr[2] == eeprom_fixups[i].addr2) {
940: if (dev->dev_addr[2] == 0xE8 && ee_data[0x1a] == 0x55)
941: i++; /* An Accton EN1207, not an outlaw Maxtech. */
942: memcpy(ee_data + 26, eeprom_fixups[i].newtable,
943: sizeof(eeprom_fixups[i].newtable));
944: printk(KERN_INFO "%s: Old format EEPROM on '%s' board. Using"
945: " substitute media control info.\n",
946: dev->name, eeprom_fixups[i].name);
947: break;
948: }
949: }
950: if (eeprom_fixups[i].name == NULL) { /* No fixup found. */
951: printk(KERN_INFO "%s: Old style EEPROM -- no media selection information.\n",
952: dev->name);
953: return;
954: }
955: }
956: if (tulip_debug > 1) {
957: printk(KERN_DEBUG "read_eeprom:");
958: for (i = 0; i < 64; i++) {
959: printk("%s%4.4x", (i & 7) == 0 ? "\n" KERN_DEBUG : " ",
960: read_eeprom(ioaddr, i));
961: }
962: printk("\n");
963: }
964:
965: controller_index = 0;
966: if (ee_data[19] > 1) { /* Multiport board. */
967: last_ee_data = ee_data;
968: }
969: subsequent_board:
970:
971: if (ee_data[27] == 0) { /* No valid media table. */
972: } else if (tp->chip_id == DC21041) {
973: unsigned char *p = (void *)ee_data + ee_data[27 + controller_index*3];
974: short media;
975: int count;
976:
977: media = get_u16(p);
978: p += 2;
979: count = *p++;
980:
981: printk(KERN_INFO "%s:21041 Media information at %d, default media "
982: "%4.4x (%s).\n", dev->name, ee_data[27], media,
983: media & 0x0800 ? "Autosense" : medianame[media & 15]);
984: for (i = 0; i < count; i++) {
985: unsigned char media_code = *p++;
986: u16 csrvals[3];
987: int idx;
988: for (idx = 0; idx < 3; idx++) {
989: csrvals[idx] = get_u16(p);
990: p += 2;
991: }
992: if (media_code & 0x40) {
993: printk(KERN_INFO "%s: 21041 media %2.2x (%s),"
994: " csr13 %4.4x csr14 %4.4x csr15 %4.4x.\n",
995: dev->name, media_code & 15, medianame[media_code & 15],
996: csrvals[0], csrvals[1], csrvals[2]);
997: } else
998: printk(KERN_INFO "%s: 21041 media #%d, %s.\n",
999: dev->name, media_code & 15, medianame[media_code & 15]);
1000: }
1001: } else {
1002: unsigned char *p = (void *)ee_data + ee_data[27];
1003: unsigned char csr12dir = 0;
1004: int count;
1005: struct mediatable *mtable;
1006: u16 media = get_u16(p);
1007:
1008: p += 2;
1009: if (tulip_tbl[tp->chip_id].flags & CSR12_IN_SROM)
1010: csr12dir = *p++;
1011: count = *p++;
1012: mtable = (struct mediatable *)
1013: kmalloc(sizeof(struct mediatable) + count*sizeof(struct medialeaf),
1014: GFP_KERNEL);
1015: if (mtable == NULL)
1016: return; /* Horrible, impossible failure. */
1017: last_mediatable = tp->mtable = mtable;
1018: mtable->defaultmedia = media;
1019: mtable->leafcount = count;
1020: mtable->csr12dir = csr12dir;
1021: mtable->has_nonmii = mtable->has_mii = 0;
1022:
1023: printk(KERN_INFO "%s: EEPROM default media type %s.\n", dev->name,
1024: media & 0x0800 ? "Autosense" : medianame[media & 15]);
1025: for (i = 0; i < count; i++) {
1026: struct medialeaf *leaf = &mtable->mleaf[i];
1027:
1028: if ((p[0] & 0x80) == 0) { /* 21140 Compact block. */
1029: leaf->type = 0;
1030: leaf->media = p[0] & 0x3f;
1031: leaf->leafdata = p;
1032: if ((p[2] & 0x61) == 0x01) /* Bogus, but Znyx boards do it. */
1033: mtable->has_mii = 1;
1034: p += 4;
1035: } else {
1036: leaf->type = p[1];
1037: if (p[1] & 1) {
1038: mtable->has_mii = 1;
1039: leaf->media = 11;
1040: } else {
1041: mtable->has_nonmii = 1;
1042: leaf->media = p[2] & 0x0f;
1043: }
1044: leaf->leafdata = p + 2;
1045: p += (p[0] & 0x3f) + 1;
1046: }
1047: if (tulip_debug > 1 && leaf->media == 11) {
1048: unsigned char *bp = leaf->leafdata;
1049: printk(KERN_INFO "%s: MII interface PHY %d, setup/reset "
1050: "sequences %d/%d long, capabilities %2.2x %2.2x.\n",
1051: dev->name, bp[0], bp[1], bp[1 + bp[1]*2],
1052: bp[5 + bp[2 + bp[1]*2]*2], bp[4 + bp[2 + bp[1]*2]*2]);
1053: }
1054: printk(KERN_INFO "%s: Index #%d - Media %s (#%d) described "
1055: "by a %s (%d) block.\n",
1056: dev->name, i, medianame[leaf->media], leaf->media,
1057: block_name[leaf->type], leaf->type);
1058: }
1059: }
1060: }
1061: /* Reading a serial EEPROM is a "bit" grungy, but we work our way through:->.*/
1062:
1063: /* EEPROM_Ctrl bits. */
1064: #define EE_SHIFT_CLK 0x02 /* EEPROM shift clock. */
1065: #define EE_CS 0x01 /* EEPROM chip select. */
1066: #define EE_DATA_WRITE 0x04 /* EEPROM chip data in. */
1067: #define EE_WRITE_0 0x01
1068: #define EE_WRITE_1 0x05
1069: #define EE_DATA_READ 0x08 /* EEPROM chip data out. */
1070: #define EE_ENB (0x4800 | EE_CS)
1071:
1072: /* Delay between EEPROM clock transitions.
1073: The 1.2 code is a "nasty" timing loop, but PC compatible machines are
1074: *supposed* to delay an ISA-compatible period for the SLOW_DOWN_IO macro. */
1075: #ifdef _LINUX_DELAY_H
1076: #define eeprom_delay(nanosec) udelay((nanosec + 999)/1000)
1077: #else
1078: #define eeprom_delay(nanosec) do { int _i = 3; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
1079: #endif
1080:
1081: /* The EEPROM commands include the alway-set leading bit. */
1082: #define EE_WRITE_CMD (5 << 6)
1083: #define EE_READ_CMD (6 << 6)
1084: #define EE_ERASE_CMD (7 << 6)
1085:
1086: static int read_eeprom(long ioaddr, int location)
1087: {
1088: int i;
1089: unsigned short retval = 0;
1090: long ee_addr = ioaddr + CSR9;
1091: int read_cmd = location | EE_READ_CMD;
1092:
1093: outl(EE_ENB & ~EE_CS, ee_addr);
1094: outl(EE_ENB, ee_addr);
1095:
1096: /* Shift the read command bits out. */
1097: for (i = 10; i >= 0; i--) {
1098: short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
1099: outl(EE_ENB | dataval, ee_addr);
1100: eeprom_delay(100);
1101: outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
1102: eeprom_delay(150);
1103: outl(EE_ENB | dataval, ee_addr); /* Finish EEPROM a clock tick. */
1104: eeprom_delay(250);
1105: }
1106: outl(EE_ENB, ee_addr);
1107:
1108: for (i = 16; i > 0; i--) {
1109: outl(EE_ENB | EE_SHIFT_CLK, ee_addr);
1110: eeprom_delay(100);
1111: retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);
1112: outl(EE_ENB, ee_addr);
1113: eeprom_delay(100);
1114: }
1115:
1116: /* Terminate the EEPROM access. */
1117: outl(EE_ENB & ~EE_CS, ee_addr);
1118: return retval;
1119: }
1120:
1121: /* MII transceiver control section.
1122: Read and write the MII registers using software-generated serial
1123: MDIO protocol. See the MII specifications or DP83840A data sheet
1124: for details. */
1125:
1126: /* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
1127: met by back-to-back PCI I/O cycles, but we insert a delay to avoid
1128: "overclocking" issues or future 66Mhz PCI. */
1129: #define mdio_delay() inl(mdio_addr)
1130:
1131: /* Read and write the MII registers using software-generated serial
1132: MDIO protocol. It is just different enough from the EEPROM protocol
1133: to not share code. The maxium data clock rate is 2.5 Mhz. */
1134: #define MDIO_SHIFT_CLK 0x10000
1135: #define MDIO_DATA_WRITE0 0x00000
1136: #define MDIO_DATA_WRITE1 0x20000
1137: #define MDIO_ENB 0x00000 /* Ignore the 0x02000 databook setting. */
1138: #define MDIO_ENB_IN 0x40000
1139: #define MDIO_DATA_READ 0x80000
1140:
1141: static int mdio_read(struct device *dev, int phy_id, int location)
1142: {
1143: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1144: int i;
1145: int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
1146: int retval = 0;
1147: long mdio_addr = dev->base_addr + CSR9;
1148:
1149: if (tp->chip_id == LC82C168) {
1150: long ioaddr = dev->base_addr;
1151: int i = 1000;
1152: outl(0x60020000 + (phy_id<<23) + (location<<18), ioaddr + 0xA0);
1153: while (--i > 0)
1154: if ( ! ((retval = inl(ioaddr + 0xA0)) & 0x80000000))
1155: return retval & 0xffff;
1156: return 0xffff;
1157: }
1158:
1159: /* Establish sync by sending at least 32 logic ones. */
1160: for (i = 32; i >= 0; i--) {
1161: outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
1162: mdio_delay();
1163: outl(MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
1164: mdio_delay();
1165: }
1166: /* Shift the read command bits out. */
1167: for (i = 15; i >= 0; i--) {
1168: int dataval = (read_cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
1169:
1170: outl(MDIO_ENB | dataval, mdio_addr);
1171: mdio_delay();
1172: outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
1173: mdio_delay();
1174: }
1175: /* Read the two transition, 16 data, and wire-idle bits. */
1176: for (i = 19; i > 0; i--) {
1177: outl(MDIO_ENB_IN, mdio_addr);
1178: mdio_delay();
1179: retval = (retval << 1) | ((inl(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
1180: outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
1181: mdio_delay();
1182: }
1183: return (retval>>1) & 0xffff;
1184: }
1185:
1186: static void mdio_write(struct device *dev, int phy_id, int location, int value)
1187: {
1188: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1189: int i;
1190: int cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
1191: long mdio_addr = dev->base_addr + CSR9;
1192:
1193: if (tp->chip_id == LC82C168) {
1194: long ioaddr = dev->base_addr;
1195: int i = 1000;
1196: outl(cmd, ioaddr + 0xA0);
1197: do
1198: if ( ! (inl(ioaddr + 0xA0) & 0x80000000))
1199: break;
1200: while (--i > 0);
1201: return;
1202: }
1203:
1204: /* Establish sync by sending 32 logic ones. */
1205: for (i = 32; i >= 0; i--) {
1206: outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
1207: mdio_delay();
1208: outl(MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
1209: mdio_delay();
1210: }
1211: /* Shift the command bits out. */
1212: for (i = 31; i >= 0; i--) {
1213: int dataval = (cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
1214: outl(MDIO_ENB | dataval, mdio_addr);
1215: mdio_delay();
1216: outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
1217: mdio_delay();
1218: }
1219: /* Clear out extra bits. */
1220: for (i = 2; i > 0; i--) {
1221: outl(MDIO_ENB_IN, mdio_addr);
1222: mdio_delay();
1223: outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
1224: mdio_delay();
1225: }
1226: return;
1227: }
1228:
1229:
1230: static int
1231: tulip_open(struct device *dev)
1232: {
1233: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1234: long ioaddr = dev->base_addr;
1235: int i = 0;
1236:
1237: /* On some chip revs we must set the MII/SYM port before the reset!? */
1238: if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii))
1239: outl(0x00040000, ioaddr + CSR6);
1240:
1241: /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
1242: outl(0x00000001, ioaddr + CSR0);
1243: #ifdef _LINUX_DELAY_H
1244: udelay(2);
1245: #else
1246: SLOW_DOWN_IO;
1247: #endif
1248: /* Deassert reset.
1249: 486: Set 8 longword cache alignment, 8 longword burst.
1250: 586: Set 16 longword cache alignment, no burst limit.
1251: Cache alignment bits 15:14 Burst length 13:8
1252: 0000 No alignment 0x00000000 unlimited 0800 8 longwords
1253: 4000 8 longwords 0100 1 longword 1000 16 longwords
1254: 8000 16 longwords 0200 2 longwords 2000 32 longwords
1255: C000 32 longwords 0400 4 longwords
1256: Wait the specified 50 PCI cycles after a reset by initializing
1257: Tx and Rx queues and the address filter list. */
1258: #if defined(__alpha__)
1259: /* ToDo: Alpha setting could be better. */
1260: outl(0x01A00000 | 0xE000, ioaddr + CSR0);
1261: #elif defined(__powerpc__)
1262: outl(0x01A00080 | 0x8000, ioaddr + CSR0);
1263: #elif defined(__i386__)
1264: #if defined(MODULE)
1265: /* When a module we don't have 'x86' to check. */
1266: outl(0x01A00000 | 0x4800, ioaddr + CSR0);
1267: #else
1268: #if (LINUX_VERSION_CODE > 0x2014c)
1269: #define x86 boot_cpu_data.x86
1270: #endif
1271: outl(0x01A00000 | (x86 <= 4 ? 0x4800 : 0x8000), ioaddr + CSR0);
1272: if (x86 <= 4)
1273: printk(KERN_INFO "%s: This is a 386/486 PCI system, setting cache "
1274: "alignment to %x.\n", dev->name,
1275: 0x01A00000 | (x86 <= 4 ? 0x4800 : 0x8000));
1276: #endif
1277: #else
1278: outl(0x01A00000 | 0x4800, ioaddr + CSR0);
1279: #warning Processor architecture undefined!
1280: #endif
1281:
1282: #ifdef SA_SHIRQ
1283: if (request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev)) {
1284: return -EAGAIN;
1285: }
1286: #else
1287: if (irq2dev_map[dev->irq] != NULL
1288: || (irq2dev_map[dev->irq] = dev) == NULL
1289: || dev->irq == 0
1290: || request_irq(dev->irq, &tulip_interrupt, 0,
1291: tulip_tbl[tp->chip_id].chip_name)) {
1292: return -EAGAIN;
1293: }
1294: #endif
1295:
1296: if (tulip_debug > 1)
1297: printk(KERN_DEBUG "%s: tulip_open() irq %d.\n", dev->name, dev->irq);
1298:
1299: MOD_INC_USE_COUNT;
1300:
1301: tulip_init_ring(dev);
1302:
1303: /* This is set_rx_mode(), but without starting the transmitter. */
1304: /* Fill the whole address filter table with our physical address. */
1305: {
1306: u16 *eaddrs = (u16 *)dev->dev_addr;
1307: u32 *setup_frm = tp->setup_frame, i;
1308:
1309: /* You must add the broadcast address when doing perfect filtering! */
1310: *setup_frm++ = 0xffff;
1311: *setup_frm++ = 0xffff;
1312: *setup_frm++ = 0xffff;
1313: /* Fill the rest of the accept table with our physical address. */
1314: for (i = 1; i < 16; i++) {
1315: *setup_frm++ = eaddrs[0];
1316: *setup_frm++ = eaddrs[1];
1317: *setup_frm++ = eaddrs[2];
1318: }
1319: /* Put the setup frame on the Tx list. */
1320: tp->tx_ring[0].length = 0x08000000 | 192;
1321: tp->tx_ring[0].buffer1 = virt_to_bus(tp->setup_frame);
1322: tp->tx_ring[0].status = 0x80000000;
1323:
1324: tp->cur_tx++;
1325: }
1326:
1327: outl(virt_to_bus(tp->rx_ring), ioaddr + CSR3);
1328: outl(virt_to_bus(tp->tx_ring), ioaddr + CSR4);
1329:
1330: if (dev->if_port == 0)
1331: dev->if_port = tp->default_port;
1332: if (tp->chip_id == DC21041 && dev->if_port > 4)
1333: /* Invalid: Select initial TP, autosense, autonegotiate. */
1334: dev->if_port = 4;
1335:
1336: /* Allow selecting a default media. */
1337: if (tp->mtable == NULL)
1338: goto media_picked;
1339: if (dev->if_port) {
1340: int looking_for = media_cap[dev->if_port] & MediaIsMII ? 11 :
1341: (dev->if_port == 12 ? 0 : dev->if_port);
1342: for (i = 0; i < tp->mtable->leafcount; i++)
1343: if (tp->mtable->mleaf[i].media == looking_for) {
1344: printk(KERN_INFO "%s: Using user-specified media %s.\n",
1345: dev->name, medianame[dev->if_port]);
1346: goto media_picked;
1347: }
1348: }
1349: if ((tp->mtable->defaultmedia & 0x0800) == 0)
1350: for (i = 0; i < tp->mtable->leafcount; i++)
1351: if (tp->mtable->mleaf[i].media == (tp->mtable->defaultmedia & 15)) {
1352: printk(KERN_INFO "%s: Using EEPROM-set media %s.\n",
1353: dev->name, medianame[tp->mtable->mleaf[i].media]);
1354: goto media_picked;
1355: }
1356: /* Start sensing first non-full-duplex media. */
1357: for (i = tp->mtable->leafcount - 1;
1358: (media_cap[tp->mtable->mleaf[i].media] & MediaAlwaysFD) && i > 0; i--)
1359: ;
1360: media_picked:
1361:
1362: tp->csr6 = 0;
1363: tp->cur_index = i;
1364: if (dev->if_port == 0 && tp->chip_id == DC21142) {
1365: tp->csr6 = 0x82420200;
1366: outl(0x0003FFFF, ioaddr + CSR14);
1367: outl(0x0008, ioaddr + CSR15);
1368: outl(0x0001, ioaddr + CSR13);
1369: outl(0x1301, ioaddr + CSR12);
1370: } else if (tp->chip_id == LC82C168 && tp->mii_cnt && ! tp->medialock) {
1371: dev->if_port = 11;
1372: tp->csr6 = 0x816C0000 | (tp->full_duplex ? 0x0200 : 0);
1373: outl(0x0001, ioaddr + CSR15);
1374: } else
1375: select_media(dev, 1);
1376:
1377: /* Start the chip's Tx to process setup frame. */
1378: outl(tp->csr6, ioaddr + CSR6);
1379: outl(tp->csr6 | 0x2000, ioaddr + CSR6);
1380:
1381: dev->tbusy = 0;
1382: tp->interrupt = 0;
1383: dev->start = 1;
1384:
1385: /* Enable interrupts by setting the interrupt mask. */
1386: outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR5);
1387: outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7);
1388: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1389: outl(0, ioaddr + CSR2); /* Rx poll demand */
1390:
1391: if (tulip_debug > 2) {
1392: printk(KERN_DEBUG "%s: Done tulip_open(), CSR0 %8.8x, CSR5 %8.8x CSR6 %8.8x.\n",
1393: dev->name, inl(ioaddr + CSR0), inl(ioaddr + CSR5),
1394: inl(ioaddr + CSR6));
1395: }
1396: /* Set the timer to switch to check for link beat and perhaps switch
1397: to an alternate media type. */
1398: init_timer(&tp->timer);
1399: tp->timer.expires = RUN_AT(5*HZ);
1400: tp->timer.data = (unsigned long)dev;
1401: tp->timer.function = tulip_tbl[tp->chip_id].media_timer;
1402: add_timer(&tp->timer);
1403:
1404: return 0;
1405: }
1406:
1407: /* Set up the transceiver control registers for the selected media type. */
1408: static void select_media(struct device *dev, int startup)
1409: {
1410: long ioaddr = dev->base_addr;
1411: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1412: struct mediatable *mtable = tp->mtable;
1413: u32 new_csr6;
1414: int check_mii =0, i;
1415:
1416: if (mtable) {
1417: struct medialeaf *mleaf = &mtable->mleaf[tp->cur_index];
1418: unsigned char *p = mleaf->leafdata;
1419: switch (mleaf->type) {
1420: case 0: /* 21140 non-MII xcvr. */
1421: if (tulip_debug > 1)
1422: printk(KERN_DEBUG "%s: Using a 21140 non-MII transceiver"
1423: " with control setting %2.2x.\n",
1424: dev->name, p[1]);
1425: dev->if_port = p[0];
1426: if (startup)
1427: outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1428: outl(p[1], ioaddr + CSR12);
1429: new_csr6 = 0x02000000 | ((p[2] & 0x71) << 18);
1430: break;
1431: case 2: case 4: {
1432: u16 setup[3];
1433: for (i = 0; i < 3; i++)
1434: setup[i] = get_u16(&p[i*2 + 1]);
1435:
1436: dev->if_port = p[0] & 15;
1437: if (tulip_debug > 1)
1438: printk(KERN_DEBUG "%s: 21142 non-MII %s transceiver control %4.4x/%4.4x.\n",
1439: dev->name, medianame[dev->if_port], setup[0], setup[1]);
1440: if (p[0] & 0x40) { /* SIA (CSR13-15) setup values are provided. */
1441: outl(0, ioaddr + CSR13);
1442: outl(setup[1], ioaddr + CSR14);
1443: outl(setup[2], ioaddr + CSR15);
1444: outl(setup[0], ioaddr + CSR13);
1445: for (i = 0; i < 3; i++) /* Re-fill setup[] */
1446: setup[i] = get_u16(&p[i*2 + 7]);
1447: } else if (dev->if_port <= 4) {
1448: outl(0, ioaddr + CSR13);
1449: outl(t21142_csr14[dev->if_port], ioaddr + CSR14);
1450: outl(t21142_csr15[dev->if_port], ioaddr + CSR15);
1451: outl(t21142_csr13[dev->if_port], ioaddr + CSR13);
1452: } else {
1453: outl(0, ioaddr + CSR14);
1454: outl(8, ioaddr + CSR15);
1455: outl(0, ioaddr + CSR13);
1456: }
1457: outl(setup[0]<<16, ioaddr + CSR15); /* Direction */
1458: outl(setup[1]<<16, ioaddr + CSR15); /* Data */
1459: if (mleaf->type == 4)
1460: new_csr6 = 0x82020000 | ((setup[2] & 0x71) << 18);
1461: else
1462: new_csr6 = 0x82420000;
1463: break;
1464: }
1465: case 1: case 3: {
1466: int phy_num = p[0];
1467: int init_length = p[1];
1468: u16 *misc_info;
1469: u16 to_advertise;
1470:
1471: dev->if_port = 11;
1472: check_mii = 1;
1473: new_csr6 = 0x020E0000;
1474: if (mleaf->type == 3) { /* 21142 */
1475: u16 *init_sequence = (u16*)(p+2);
1476: u16 *reset_sequence = &((u16*)(p+3))[init_length];
1477: int reset_length = p[2 + init_length*2];
1478: misc_info = reset_sequence + reset_length;
1479: if (startup)
1480: for (i = 0; i < reset_length; i++)
1481: outl(get_u16(&reset_sequence[i]) << 16, ioaddr + CSR15);
1482: for (i = 0; i < init_length; i++)
1483: outl(get_u16(&init_sequence[i]) << 16, ioaddr + CSR15);
1484: } else {
1485: u8 *init_sequence = p + 2;
1486: u8 *reset_sequence = p + 3 + init_length;
1487: int reset_length = p[2 + init_length];
1488: misc_info = (u16*)(reset_sequence + reset_length);
1489: if (startup) {
1490: outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
1491: for (i = 0; i < reset_length; i++)
1492: outl(reset_sequence[i], ioaddr + CSR12);
1493: }
1494: for (i = 0; i < init_length; i++)
1495: outl(init_sequence[i], ioaddr + CSR12);
1496: }
1497: to_advertise = (get_u16(&misc_info[1]) & tp->to_advertise) | 1;
1498: tp->advertising[phy_num] = to_advertise;
1499: if (tulip_debug > 1 || 1)
1500: printk(KERN_DEBUG "%s: Advertising %4.4x on PHY %d (%d).\n",
1501: dev->name, to_advertise, phy_num, tp->phys[phy_num]);
1502: /* Bogus: put in by a committee? */
1503: mdio_write(dev, tp->phys[phy_num], 4, to_advertise);
1504: break;
1505: }
1506: default:
1507: new_csr6 = 0x020E0000;
1508: }
1509: if (tulip_debug > 1)
1510: printk(KERN_DEBUG "%s: Using media type %s, CSR12 is %2.2x.\n",
1511: dev->name, medianame[dev->if_port],
1512: inl(ioaddr + CSR12) & 0xff);
1513: } else if (tp->chip_id == DC21041) {
1514: if (tulip_debug > 1)
1515: printk(KERN_DEBUG "%s: 21041 using media %s, CSR12 is %4.4x.\n",
1516: dev->name, medianame[dev->if_port & 15],
1517: inl(ioaddr + CSR12) & 0xffff);
1518: outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1519: outl(t21041_csr14[dev->if_port], ioaddr + CSR14);
1520: outl(t21041_csr15[dev->if_port], ioaddr + CSR15);
1521: outl(t21041_csr13[dev->if_port], ioaddr + CSR13);
1522: new_csr6 = 0x80020000;
1523: } else if (tp->chip_id == LC82C168) {
1524: if (startup && ! tp->medialock)
1525: dev->if_port = tp->mii_cnt ? 11 : 0;
1526: if (tulip_debug > 1)
1527: printk(KERN_DEBUG "%s: PNIC PHY status is %3.3x, CSR12 %4.4x,"
1528: " media %s.\n",
1529: dev->name, inl(ioaddr + 0xB8), inl(ioaddr + CSR12),
1530: medianame[dev->if_port]);
1531: if (tp->mii_cnt) {
1532: new_csr6 = 0x812C0000;
1533: outl(0x0001, ioaddr + CSR15);
1534: outl(0x0201B07A, ioaddr + 0xB8);
1535: } else if (startup) {
1536: /* Start with 10mbps to do autonegotiation. */
1537: outl(0x32, ioaddr + CSR12);
1538: new_csr6 = 0x00420000;
1539: outl(0x0001B078, ioaddr + 0xB8);
1540: outl(0x0201B078, ioaddr + 0xB8);
1541: } else if (dev->if_port == 3 || dev->if_port == 5) {
1542: outl(0x33, ioaddr + CSR12);
1543: new_csr6 = 0x01860000;
1544: if (startup)
1545: outl(0x0201F868, ioaddr + 0xB8); /* Trigger autonegotiation. */
1546: else
1547: outl(0x1F868, ioaddr + 0xB8);
1548: } else {
1549: outl(0x32, ioaddr + CSR12);
1550: new_csr6 = 0x00420000;
1551: outl(0x1F078, ioaddr + 0xB8);
1552: }
1553: } else if (tp->chip_id == DC21040) { /* 21040 */
1554: /* Turn on the xcvr interface. */
1555: int csr12 = inl(ioaddr + CSR12);
1556: if (tulip_debug > 1)
1557: printk(KERN_DEBUG "%s: 21040 media type is %s, CSR12 is %2.2x.\n",
1558: dev->name, dev->if_port ? "AUI" : "10baseT", csr12);
1559: new_csr6 = (dev->if_port ? 0x01860000 : 0x00420000);
1560: /* Set the full duplux match frame. */
1561: outl(FULL_DUPLEX_MAGIC, ioaddr + CSR11);
1562: outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
1563: outl(dev->if_port ? 0x0000000C : 0x00000004, ioaddr + CSR13);
1564: } else { /* Unknown chip type with no media table. */
1565: if (tp->default_port == 0)
1566: if (tp->mii_cnt) {
1567: dev->if_port = 11;
1568: } else
1569: dev->if_port = 3;
1570: if (media_cap[dev->if_port] & MediaIsMII) {
1571: new_csr6 = 0x020E0000;
1572: } else if (media_cap[dev->if_port] & MediaIsFx) {
1573: new_csr6 = 0x028600000;
1574: } else
1575: new_csr6 = 0x038600000;
1576: if (tulip_debug > 1)
1577: printk(KERN_DEBUG "%s: No media description table, assuming "
1578: "%s transceiver, CSR12 %2.2x.\n",
1579: dev->name, medianame[dev->if_port],
1580: inl(ioaddr + CSR12));
1581: }
1582:
1583: tp->csr6 = new_csr6 | (tp->csr6 & 0xfdff) | (tp->full_duplex ? 0x0200 : 0);
1584: return;
1585: }
1586:
1587: static void tulip_timer(unsigned long data)
1588: {
1589: struct device *dev = (struct device *)data;
1590: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1591: long ioaddr = dev->base_addr;
1592: u32 csr12 = inl(ioaddr + CSR12);
1593: int next_tick = 0;
1594:
1595: if (tulip_debug > 3) {
1596: printk(KERN_DEBUG "%s: Media selection tick, status %8.8x mode %8.8x "
1597: "SIA %8.8x %8.8x %8.8x %8.8x.\n",
1598: dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR6),
1599: csr12, inl(ioaddr + CSR13),
1600: inl(ioaddr + CSR14), inl(ioaddr + CSR15));
1601: }
1602: switch (tp->chip_id) {
1603: case DC21040:
1604: if (csr12 & 0x0002) { /* Network error */
1605: printk(KERN_INFO "%s: No 10baseT link beat found, switching to %s media.\n",
1606: dev->name, dev->if_port ? "10baseT" : "AUI");
1607: dev->if_port ^= 1;
1608: outl(dev->if_port ? 0x0000000C : 0x00000004, ioaddr + CSR13);
1609: dev->trans_start = jiffies;
1610: }
1611: break;
1612: case DC21041:
1613: if (tulip_debug > 2)
1614: printk(KERN_DEBUG "%s: 21041 media tick CSR12 %8.8x.\n",
1615: dev->name, csr12);
1616: switch (dev->if_port) {
1617: case 0: case 3: case 4:
1618: if (csr12 & 0x0004) { /*LnkFail */
1619: /* 10baseT is dead. Check for activity on alternate port. */
1620: tp->mediasense = 1;
1621: if (csr12 & 0x0200)
1622: dev->if_port = 2;
1623: else
1624: dev->if_port = 1;
1625: printk(KERN_INFO "%s: No 21041 10baseT link beat, Media switched to %s.\n",
1626: dev->name, medianame[dev->if_port]);
1627: outl(0, ioaddr + CSR13); /* Reset */
1628: outl(t21041_csr14[dev->if_port], ioaddr + CSR14);
1629: outl(t21041_csr15[dev->if_port], ioaddr + CSR15);
1630: outl(t21041_csr13[dev->if_port], ioaddr + CSR13);
1631: next_tick = 10*HZ; /* 2.4 sec. */
1632: } else
1633: next_tick = 30*HZ;
1634: break;
1635: case 1: /* 10base2 */
1636: case 2: /* AUI */
1637: if (csr12 & 0x0100) {
1638: next_tick = (30*HZ); /* 30 sec. */
1639: tp->mediasense = 0;
1640: } else if ((csr12 & 0x0004) == 0) {
1641: printk(KERN_INFO "%s: 21041 media switched to 10baseT.\n", dev->name);
1642: dev->if_port = 0;
1643: select_media(dev, 0);
1644: next_tick = (24*HZ)/10; /* 2.4 sec. */
1645: } else if (tp->mediasense || (csr12 & 0x0002)) {
1646: dev->if_port = 3 - dev->if_port; /* Swap ports. */
1647: select_media(dev, 0);
1648: next_tick = 20*HZ;
1649: } else {
1650: next_tick = 20*HZ;
1651: }
1652: break;
1653: }
1654: break;
1655: case DC21140: case DC21142: case MX98713: default: {
1656: struct medialeaf *mleaf;
1657: unsigned char *p;
1658: if (tp->mtable == NULL) { /* No EEPROM info, use generic code. */
1659: /* Not much that can be done.
1660: Assume this a generic MII or SYM transceiver. */
1661: next_tick = 60*HZ;
1662: if (tulip_debug > 2)
1663: printk(KERN_DEBUG "%s: network media monitor CSR6 %8.8x "
1664: "CSR12 0x%2.2x.\n",
1665: dev->name, inl(ioaddr + CSR6), csr12 & 0xff);
1666: break;
1667: }
1668: mleaf = &tp->mtable->mleaf[tp->cur_index];
1669: p = mleaf->leafdata;
1670: switch (mleaf->type) {
1671: case 0: case 4: {
1672: /* Type 0 serial or 4 SYM transceiver. Check the link beat bit. */
1673: int offset = mleaf->type == 4 ? 5 : 2;
1674: s8 bitnum = p[offset];
1675: if (p[offset+1] & 0x80) {
1676: if (tulip_debug > 1)
1677: printk(KERN_DEBUG"%s: Transceiver monitor tick "
1678: "CSR12=%#2.2x, no media sense.\n",
1679: dev->name, csr12);
1680: if (mleaf->type == 4) {
1681: if (mleaf->media == 3 && (csr12 & 0x02))
1682: goto select_next_media;
1683: }
1684: break;
1685: }
1686: if (tulip_debug > 2)
1687: printk(KERN_DEBUG "%s: Transceiver monitor tick: CSR12=%#2.2x"
1688: " bit %d is %d, expecting %d.\n",
1689: dev->name, csr12, (bitnum >> 1) & 7,
1690: (csr12 & (1 << ((bitnum >> 1) & 7))) != 0,
1691: (bitnum >= 0));
1692: /* Check that the specified bit has the proper value. */
1693: if ((bitnum < 0) !=
1694: ((csr12 & (1 << ((bitnum >> 1) & 7))) != 0)) {
1695: if (tulip_debug > 1)
1696: printk(KERN_DEBUG "%s: Link beat detected for %s.\n", dev->name,
1697: medianame[mleaf->media]);
1698: if ((p[2] & 0x61) == 0x01) /* Bogus Znyx board. */
1699: goto actually_mii;
1700: break;
1701: }
1702: if (tp->medialock)
1703: break;
1704: select_next_media:
1705: if (--tp->cur_index < 0) {
1706: /* We start again, but should instead look for default. */
1707: tp->cur_index = tp->mtable->leafcount - 1;
1708: }
1709: dev->if_port = tp->mtable->mleaf[tp->cur_index].media;
1710: if (media_cap[dev->if_port] & MediaIsFD)
1711: goto select_next_media; /* Skip FD entries. */
1712: if (tulip_debug > 1)
1713: printk(KERN_DEBUG "%s: No link beat on media %s,"
1714: " trying transceiver type %s.\n",
1715: dev->name, medianame[mleaf->media & 15],
1716: medianame[tp->mtable->mleaf[tp->cur_index].media]);
1717: select_media(dev, 0);
1718: /* Restart the transmit process. */
1719: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
1720: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1721: next_tick = (24*HZ)/10;
1722: break;
1723: }
1724: case 1: case 3: { /* 21140, 21142 MII */
1725: int mii_reg1, mii_reg5;
1726: actually_mii:
1727: mii_reg1 = mdio_read(dev, tp->phys[0], 1);
1728: mii_reg5 = mdio_read(dev, tp->phys[0], 5);
1729: if (tulip_debug > 1)
1730: printk(KERN_INFO "%s: MII status %4.4x, Link partner report "
1731: "%4.4x, CSR12 %2.2x, %cD.\n",
1732: dev->name, mii_reg1, mii_reg5, csr12,
1733: tp->full_duplex ? 'F' : 'H');
1734: if (mii_reg1 != 0xffff && (mii_reg1 & 0x0004) == 0) {
1735: int new_reg1 = mdio_read(dev, tp->phys[0], 1);
1736: if ((new_reg1 & 0x0004) == 0) {
1737: printk(KERN_INFO "%s: No link beat on the MII interface,"
1738: " status then %4.4x now %4.4x.\n",
1739: dev->name, mii_reg1, new_reg1);
1740: if (tp->mtable && tp->mtable->has_nonmii)
1741: goto select_next_media;
1742: }
1743: }
1744: if (mii_reg5 == 0xffff || mii_reg5 == 0x0000)
1745: ; /* No MII device or no link partner report */
1746: else if (tp->full_duplex_lock)
1747: ;
1748: else {
1749: int negotiated = mii_reg5 & tp->advertising[0];
1750: int duplex = ((negotiated & 0x0100) != 0
1751: || (negotiated & 0x00C0) == 0x0040);
1752: /* 100baseTx-FD or 10T-FD, but not 100-HD */
1753: if (tp->full_duplex != duplex) {
1754: tp->full_duplex = duplex;
1755: if (tp->full_duplex)
1756: tp->csr6 |= 0x0200;
1757: else
1758: tp->csr6 &= ~0x0200;
1759: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
1760: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1761: if (tulip_debug > 0) /* Gurppp, should be >1 */
1762: printk(KERN_INFO "%s: Setting %s-duplex based on MII"
1763: " Xcvr #%d parter capability of %4.4x.\n",
1764: dev->name, tp->full_duplex ? "full" : "half",
1765: tp->phys[0], mii_reg5);
1766: }
1767: }
1768: next_tick = 60*HZ;
1769: break;
1770: }
1771: case 2: /* 21142 serial block has no link beat. */
1772: default:
1773: break;
1774: }
1775: }
1776: break;
1777: }
1778: if (next_tick) {
1779: tp->timer.expires = RUN_AT(next_tick);
1780: add_timer(&tp->timer);
1781: }
1782: }
1783:
1784: /* Handle the 21143 uniquely: do autoselect with NWay, not the EEPROM list
1785: of available transceivers. */
1786: static void t21142_timer(unsigned long data)
1787: {
1788: struct device *dev = (struct device *)data;
1789: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1790: long ioaddr = dev->base_addr;
1791: int csr12 = inl(ioaddr + CSR12);
1792: int next_tick = 60*HZ;
1793: int new_csr6 = 0;
1794:
1795: if (tulip_debug > 1)
1796: printk(KERN_INFO"%s: 21142 negotiation status %8.8x, %s.\n",
1797: dev->name, csr12, medianame[dev->if_port]);
1798: if (dev->if_port == 3) {
1799: if (csr12 & 2) { /* No 100mbps link beat, revert to 10mbps. */
1800: new_csr6 = 0x82420200;
1801: outl(new_csr6, ioaddr + CSR6);
1802: outl(0x0000, ioaddr + CSR13);
1803: outl(0x0003FFFF, ioaddr + CSR14);
1804: outl(0x0008, ioaddr + CSR15);
1805: outl(0x0001, ioaddr + CSR13);
1806: outl(0x1301, ioaddr + CSR12); /* Start NWay. */
1807: }
1808: } else if ((csr12 & 0x7000) != 0x5000) {
1809: /* Negotiation failed. Search media types. */
1810: if (tulip_debug > 1)
1811: printk(KERN_INFO"%s: 21142 negotiation failed, status %8.8x.\n",
1812: dev->name, csr12);
1813: if (!(csr12 & 4)) { /* 10mbps link beat good. */
1814: new_csr6 = 0x82420000;
1815: dev->if_port = 0;
1816: outl(0, ioaddr + CSR13);
1817: outl(0x0003FFFF, ioaddr + CSR14);
1818: outl(t21142_csr15[dev->if_port], ioaddr + CSR15);
1819: outl(t21142_csr13[dev->if_port], ioaddr + CSR13);
1820: } else if (csr12 & 0x100) {
1821: new_csr6 = 0x82420200;
1822: dev->if_port = 2;
1823: outl(0, ioaddr + CSR13);
1824: outl(0x0003FFFF, ioaddr + CSR14);
1825: outl(0x0008, ioaddr + CSR15);
1826: outl(0x0001, ioaddr + CSR13);
1827: } else {
1828: /* Select 100mbps port to check for link beat. */
1829: new_csr6 = 0x83860000;
1830: dev->if_port = 3;
1831: outl(0, ioaddr + CSR13);
1832: outl(0x0003FF7F, ioaddr + CSR14);
1833: outl(8, ioaddr + CSR15);
1834: outl(1, ioaddr + CSR13);
1835: }
1836: if (tulip_debug > 1)
1837: printk(KERN_INFO"%s: Testing new 21142 media %s.\n",
1838: dev->name, medianame[dev->if_port]);
1839: if (new_csr6 != (tp->csr6 & ~0x00D5)) {
1840: tp->csr6 &= 0x00D5;
1841: tp->csr6 |= new_csr6;
1842: outl(0x0301, ioaddr + CSR12);
1843: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
1844: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1845: }
1846: }
1847: tp->timer.expires = RUN_AT(next_tick);
1848: add_timer(&tp->timer);
1849: }
1850:
1851: static void t21142_lnk_change( struct device *dev)
1852: {
1853: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1854: long ioaddr = dev->base_addr;
1855: int csr12 = inl(ioaddr + CSR12);
1856:
1857: if (tulip_debug > 1)
1858: printk(KERN_INFO"%s: 21142 link status interrupt %8.8x, CSR5 %x.\n",
1859: dev->name, csr12, inl(ioaddr + CSR5));
1860:
1861: if ((csr12 & 0x7000) == 0x5000) {
1862: if (csr12 & 0x01800000) {
1863: /* Switch to 100mbps mode. */
1864: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
1865: if (csr12 & 0x01000000) {
1866: dev->if_port = 5;
1867: tp->csr6 = 0x83860200;
1868: } else {
1869: dev->if_port = 3;
1870: tp->csr6 = 0x83860000;
1871: }
1872: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1873: } /* Else 10baseT-FD is handled automatically. */
1874: } else if (dev->if_port == 3) {
1875: if (!(csr12 & 2))
1876: printk(KERN_INFO"%s: 21142 100baseTx link beat good.\n",
1877: dev->name);
1878: else
1879: dev->if_port = 0;
1880: } else if (dev->if_port == 0) {
1881: if (!(csr12 & 4))
1882: printk(KERN_INFO"%s: 21142 10baseT link beat good.\n",
1883: dev->name);
1884: } else if (!(csr12 & 4)) { /* 10mbps link beat good. */
1885: printk(KERN_INFO"%s: 21142 10mpbs sensed media.\n",
1886: dev->name);
1887: dev->if_port = 0;
1888: } else { /* 100mbps link beat good. */
1889: printk(KERN_INFO"%s: 21142 100baseTx sensed media.\n",
1890: dev->name);
1891: dev->if_port = 3;
1892: tp->csr6 = 0x83860000;
1893: outl(0x0003FF7F, ioaddr + CSR14);
1894: outl(0x0301, ioaddr + CSR12);
1895: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
1896: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1897: }
1898: }
1899:
1900:
1901: static void mxic_timer(unsigned long data)
1902: {
1903: struct device *dev = (struct device *)data;
1904: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1905: long ioaddr = dev->base_addr;
1906: int next_tick = 60*HZ;
1907:
1908: if (tulip_debug > 3) {
1909: printk(KERN_INFO"%s: MXIC negotiation status %8.8x.\n", dev->name,
1910: inl(ioaddr + CSR12));
1911: }
1912: if (next_tick) {
1913: tp->timer.expires = RUN_AT(next_tick);
1914: add_timer(&tp->timer);
1915: }
1916: }
1917:
1918: static void pnic_timer(unsigned long data)
1919: {
1920: struct device *dev = (struct device *)data;
1921: struct tulip_private *tp = (struct tulip_private *)dev->priv;
1922: long ioaddr = dev->base_addr;
1923: int csr12 = inl(ioaddr + CSR12);
1924: int next_tick = 60*HZ;
1925: int new_csr6 = tp->csr6 & ~0x40C40200;
1926:
1927: if (media_cap[dev->if_port] & MediaIsMII) {
1928: int negotiated = mdio_read(dev, tp->phys[0], 5) & tp->advertising[0];
1929:
1930: if (tulip_debug > 1)
1931: printk(KERN_DEBUG "%s: LC82C168 negotiated capability %8.8x, "
1932: "CSR5 %8.8x.\n",
1933: dev->name, negotiated, inl(ioaddr + CSR5));
1934:
1935: if (negotiated & 0x0380) /* 10 vs 100mbps */
1936: new_csr6 |= 0x812E0000;
1937: else
1938: new_csr6 |= 0x816E0000;
1939: if (((negotiated & 0x0300) == 0x0100) /* Duplex */
1940: || (negotiated & 0x00C0) == 0x0040
1941: || tp->full_duplex_lock) {
1942: tp->full_duplex = 1;
1943: new_csr6 |= 0x0200;
1944: }
1945: if (tulip_debug > 1)
1946: printk(KERN_DEBUG "%s: LC82C168 MII PHY status %4.4x, Link "
1947: "partner report %4.4x, csr6 %8.8x/%8.8x.\n",
1948: dev->name, mdio_read(dev, tp->phys[0], 1), negotiated,
1949: tp->csr6, inl(ioaddr + CSR6));
1950: } else {
1951: int phy_reg = inl(ioaddr + 0xB8);
1952: int csr5 = inl(ioaddr + CSR5);
1953:
1954: if (tulip_debug > 1)
1955: printk(KERN_DEBUG "%s: LC82C168 phy status %8.8x, CSR5 %8.8x.\n",
1956: dev->name, phy_reg, csr5);
1957:
1958: if (phy_reg & 0x04000000) { /* Remote link fault */
1959: /*outl(0x0201F078, ioaddr + 0xB8);*/
1960: next_tick = 3*HZ;
1961: }
1962: if (inl(ioaddr + CSR5) & TPLnkFail) { /* 100baseTx link beat */
1963: if (tulip_debug > 1)
1964: printk(KERN_DEBUG "%s: %s link beat failed, CSR12 %4.4x, "
1965: "CSR5 %8.8x, PHY %3.3x.\n",
1966: dev->name, medianame[dev->if_port], csr12,
1967: inl(ioaddr + CSR5), inl(ioaddr + 0xB8));
1968: if (tp->medialock) {
1969: } else if (dev->if_port == 0) {
1970: dev->if_port = 3;
1971: outl(0x33, ioaddr + CSR12);
1972: new_csr6 = 0x01860000;
1973: outl(0x1F868, ioaddr + 0xB8);
1974: } else {
1975: dev->if_port = 0;
1976: outl(0x32, ioaddr + CSR12);
1977: new_csr6 = 0x00420000;
1978: outl(0x1F078, ioaddr + 0xB8);
1979: }
1980: new_csr6 |= (tp->csr6 & 0xfdff);
1981: next_tick = 3*HZ;
1982: } else
1983: new_csr6 = tp->csr6;
1984: if (tp->full_duplex_lock || (phy_reg & 0x30000000) != 0) {
1985: tp->full_duplex = 1;
1986: new_csr6 |= 0x00000200;
1987: }
1988: }
1989: if (tp->csr6 != new_csr6) {
1990: tp->csr6 = new_csr6;
1991: outl(tp->csr6 | 0x0002, ioaddr + CSR6); /* Restart Tx */
1992: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
1993: dev->trans_start = jiffies;
1994: if (tulip_debug > 0) /* Gurppp, should be >1 */
1995: printk(KERN_INFO "%s: Changing PNIC configuration to %s-duplex, "
1996: "CSR6 %8.8x.\n",
1997: dev->name, tp->full_duplex ? "full" : "half", new_csr6);
1998: }
1999: tp->timer.expires = RUN_AT(next_tick);
2000: add_timer(&tp->timer);
2001: }
2002:
2003: static void tulip_tx_timeout(struct device *dev)
2004: {
2005: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2006: long ioaddr = dev->base_addr;
2007:
2008: if (media_cap[dev->if_port] & MediaIsMII) {
2009: /* Do nothing -- the media monitor should handle this. */
2010: if (tulip_debug > 1)
2011: printk(KERN_WARNING "%s: Transmit timeout using MII device.\n",
2012: dev->name);
2013: dev->trans_start = jiffies;
2014: return;
2015: } else if (tp->chip_id == DC21040) {
2016: if (inl(ioaddr + CSR12) & 0x0002) {
2017: printk(KERN_INFO "%s: transmit timed out, switching to %s media.\n",
2018: dev->name, dev->if_port ? "10baseT" : "AUI");
2019: dev->if_port ^= 1;
2020: outl(dev->if_port ? 0x0000000C : 0x00000004, ioaddr + CSR13);
2021: }
2022: dev->trans_start = jiffies;
2023: return;
2024: } else if (tp->chip_id == DC21041) {
2025: u32 csr12 = inl(ioaddr + CSR12);
2026:
2027: printk(KERN_WARNING "%s: 21041 transmit timed out, status %8.8x, CSR12 %8.8x,"
2028: " CSR13 %8.8x, CSR14 %8.8x, resetting...\n",
2029: dev->name, inl(ioaddr + CSR5), csr12,
2030: inl(ioaddr + CSR13), inl(ioaddr + CSR14));
2031: tp->mediasense = 1;
2032: if (dev->if_port == 1 || dev->if_port == 2)
2033: if (csr12 & 0x0004) {
2034: dev->if_port = 2 - dev->if_port;
2035: } else
2036: dev->if_port = 0;
2037: else
2038: dev->if_port = 1;
2039: select_media(dev, 0);
2040: tp->stats.tx_errors++;
2041: dev->trans_start = jiffies;
2042: return;
2043: } else if (tp->chip_id == DC21140 || tp->chip_id == DC21142
2044: || tp->chip_id == MX98713) {
2045: /* Stop the transmit process. */
2046: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
2047: printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, "
2048: "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
2049: dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12),
2050: inl(ioaddr + CSR13), inl(ioaddr + CSR14), inl(ioaddr + CSR15));
2051: if (tp->mtable) {
2052: if (--tp->cur_index < 0) {
2053: /* We start again, but should instead look for default. */
2054: tp->cur_index = tp->mtable->leafcount - 1;
2055: }
2056: select_media(dev, 0);
2057: printk(KERN_WARNING "%s: transmit timed out, switching to %s media.\n",
2058: dev->name, dev->if_port ? "100baseTx" : "10baseT");
2059: }
2060: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
2061: tp->stats.tx_errors++;
2062: dev->trans_start = jiffies;
2063: return;
2064: } else
2065: printk(KERN_WARNING "%s: transmit timed out, status %8.8x, CSR12 %8.8x,"
2066: " resetting...\n",
2067: dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12));
2068: #ifdef way_too_many_messages
2069: printk(" Rx ring %8.8x: ", (int)tp->rx_ring);
2070: for (i = 0; i < RX_RING_SIZE; i++)
2071: printk(" %8.8x", (unsigned int)tp->rx_ring[i].status);
2072: printk("\n Tx ring %8.8x: ", (int)tp->tx_ring);
2073: for (i = 0; i < TX_RING_SIZE; i++)
2074: printk(" %8.8x", (unsigned int)tp->tx_ring[i].status);
2075: printk("\n");
2076: #endif
2077:
2078: /* Perhaps we should reinitialize the hardware here. */
2079: dev->if_port = 0;
2080: /* Stop and restart the chip's Tx processes . */
2081: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
2082: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
2083: /* Trigger an immediate transmit demand. */
2084: outl(0, ioaddr + CSR1);
2085:
2086: dev->trans_start = jiffies;
2087: tp->stats.tx_errors++;
2088: return;
2089: }
2090:
2091:
2092: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
2093: static void
2094: tulip_init_ring(struct device *dev)
2095: {
2096: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2097: int i;
2098:
2099: tp->tx_full = 0;
2100: tp->cur_rx = tp->cur_tx = 0;
2101: tp->dirty_rx = tp->dirty_tx = 0;
2102:
2103: for (i = 0; i < RX_RING_SIZE; i++) {
2104: tp->rx_ring[i].status = 0x80000000; /* Owned by Tulip chip */
2105: tp->rx_ring[i].length = PKT_BUF_SZ;
2106: {
2107: /* Note the receive buffer must be longword aligned.
2108: dev_alloc_skb() provides 16 byte alignment. But do *not*
2109: use skb_reserve() to align the IP header! */
2110: struct sk_buff *skb;
2111: skb = DEV_ALLOC_SKB(PKT_BUF_SZ);
2112: tp->rx_skbuff[i] = skb;
2113: if (skb == NULL)
2114: break; /* Bad news! */
2115: skb->dev = dev; /* Mark as being used by this device. */
2116: #if LINUX_VERSION_CODE > 0x10300
2117: tp->rx_ring[i].buffer1 = virt_to_bus(skb->tail);
2118: #else
2119: tp->rx_ring[i].buffer1 = virt_to_bus(skb->data);
2120: #endif
2121: }
2122: tp->rx_ring[i].buffer2 = virt_to_bus(&tp->rx_ring[i+1]);
2123: }
2124: /* Mark the last entry as wrapping the ring. */
2125: tp->rx_ring[i-1].length = PKT_BUF_SZ | 0x02000000;
2126: tp->rx_ring[i-1].buffer2 = virt_to_bus(&tp->rx_ring[0]);
2127:
2128: /* The Tx buffer descriptor is filled in as needed, but we
2129: do need to clear the ownership bit. */
2130: for (i = 0; i < TX_RING_SIZE; i++) {
2131: tp->tx_skbuff[i] = 0;
2132: tp->tx_ring[i].status = 0x00000000;
2133: tp->tx_ring[i].buffer2 = virt_to_bus(&tp->tx_ring[i+1]);
2134: }
2135: tp->tx_ring[i-1].buffer2 = virt_to_bus(&tp->tx_ring[0]);
2136: }
2137:
2138: static int
2139: tulip_start_xmit(struct sk_buff *skb, struct device *dev)
2140: {
2141: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2142: int entry;
2143: u32 flag;
2144:
2145: /* Block a timer-based transmit from overlapping. This could better be
2146: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
2147: if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
2148: if (jiffies - dev->trans_start < TX_TIMEOUT)
2149: return 1;
2150: tulip_tx_timeout(dev);
2151: return 1;
2152: }
2153:
2154: /* Caution: the write order is important here, set the base address
2155: with the "ownership" bits last. */
2156:
2157: /* Calculate the next Tx descriptor entry. */
2158: entry = tp->cur_tx % TX_RING_SIZE;
2159:
2160: tp->tx_skbuff[entry] = skb;
2161: tp->tx_ring[entry].buffer1 = virt_to_bus(skb->data);
2162:
2163: if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
2164: flag = 0x60000000; /* No interrupt */
2165: dev->tbusy = 0;
2166: } else if (tp->cur_tx - tp->dirty_tx == TX_RING_SIZE/2) {
2167: flag = 0xe0000000; /* Tx-done intr. */
2168: dev->tbusy = 0;
2169: } else if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE - 2) {
2170: flag = 0x60000000; /* No Tx-done intr. */
2171: dev->tbusy = 0;
2172: } else {
2173: /* Leave room for set_rx_mode() to fill entries. */
2174: flag = 0xe0000000; /* Tx-done intr. */
2175: tp->tx_full = 1;
2176: }
2177: if (entry == TX_RING_SIZE-1)
2178: flag |= 0xe2000000;
2179:
2180: tp->tx_ring[entry].length = skb->len | flag;
2181: tp->tx_ring[entry].status = 0x80000000; /* Pass ownership to the chip. */
2182: tp->cur_tx++;
2183: /* Trigger an immediate transmit demand. */
2184: outl(0, dev->base_addr + CSR1);
2185:
2186: dev->trans_start = jiffies;
2187:
2188: return 0;
2189: }
2190:
2191: /* The interrupt handler does all of the Rx thread work and cleans up
2192: after the Tx thread. */
2193: static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs)
2194: {
2195: #ifdef SA_SHIRQ /* Use the now-standard shared IRQ implementation. */
2196: struct device *dev = (struct device *)dev_instance;
2197: #else
2198: struct device *dev = (struct device *)(irq2dev_map[irq]);
2199: #endif
2200:
2201: struct tulip_private *tp;
2202: long ioaddr;
2203: int csr5, work_budget = max_interrupt_work;
2204:
2205: if (dev == NULL) {
2206: printk (KERN_ERR" tulip_interrupt(): irq %d for unknown device.\n",
2207: irq);
2208: return;
2209: }
2210:
2211: ioaddr = dev->base_addr;
2212: tp = (struct tulip_private *)dev->priv;
2213: if (test_and_set_bit(0, (void*)&tp->interrupt)) {
2214: #ifdef SMP_CHECK
2215: printk(KERN_ERR "%s: Re-entering the interrupt handler with proc %d,"
2216: " proc %d already handling.\n", dev->name,
2217: tp->smp_proc_id, hard_smp_processor_id());
2218: #else
2219: printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
2220: #endif
2221: return;
2222: }
2223: dev->interrupt = 1;
2224: #ifdef SMP_CHECK
2225: tp->smp_proc_id = hard_smp_processor_id();
2226: #endif
2227:
2228: do {
2229: csr5 = inl(ioaddr + CSR5);
2230: /* Acknowledge all of the current interrupt sources ASAP. */
2231: outl(csr5 & 0x0001ffff, ioaddr + CSR5);
2232:
2233: if (tulip_debug > 4)
2234: printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n",
2235: dev->name, csr5, inl(dev->base_addr + CSR5));
2236:
2237: if ((csr5 & (NormalIntr|AbnormalIntr)) == 0)
2238: break;
2239:
2240: if (csr5 & (RxIntr | RxNoBuf))
2241: work_budget -= tulip_rx(dev);
2242:
2243: if (csr5 & (TxNoBuf | TxDied | TxIntr)) {
2244: unsigned int dirty_tx;
2245:
2246: for (dirty_tx = tp->dirty_tx; tp->cur_tx - dirty_tx > 0;
2247: dirty_tx++) {
2248: int entry = dirty_tx % TX_RING_SIZE;
2249: int status = tp->tx_ring[entry].status;
2250:
2251: if (status < 0)
2252: break; /* It still hasn't been Txed */
2253: /* Check for Rx filter setup frames. */
2254: if (tp->tx_skbuff[entry] == NULL)
2255: continue;
2256:
2257: if (status & 0x8000) {
2258: /* There was an major error, log it. */
2259: #ifndef final_version
2260: if (tulip_debug > 1)
2261: printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
2262: dev->name, status);
2263: #endif
2264: tp->stats.tx_errors++;
2265: if (status & 0x4104) tp->stats.tx_aborted_errors++;
2266: if (status & 0x0C00) tp->stats.tx_carrier_errors++;
2267: if (status & 0x0200) tp->stats.tx_window_errors++;
2268: if (status & 0x0002) tp->stats.tx_fifo_errors++;
2269: if ((status & 0x0080) && tp->full_duplex == 0)
2270: tp->stats.tx_heartbeat_errors++;
2271: #ifdef ETHER_STATS
2272: if (status & 0x0100) tp->stats.collisions16++;
2273: #endif
2274: } else {
2275: #ifdef ETHER_STATS
2276: if (status & 0x0001) tp->stats.tx_deferred++;
2277: #endif
2278: #if LINUX_VERSION_CODE > 0x20127
2279: tp->stats.tx_bytes += tp->tx_ring[entry].length & 0x7ff;
2280: #endif
2281: tp->stats.collisions += (status >> 3) & 15;
2282: tp->stats.tx_packets++;
2283: }
2284:
2285: /* Free the original skb. */
2286: #if (LINUX_VERSION_CODE > 0x20155)
2287: dev_kfree_skb(tp->tx_skbuff[entry]);
2288: #else
2289: dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE);
2290: #endif
2291: tp->tx_skbuff[entry] = 0;
2292: }
2293:
2294: #ifndef final_version
2295: if (tp->cur_tx - dirty_tx > TX_RING_SIZE) {
2296: printk(KERN_ERR "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
2297: dev->name, dirty_tx, tp->cur_tx, tp->tx_full);
2298: dirty_tx += TX_RING_SIZE;
2299: }
2300: #endif
2301:
2302: if (tp->tx_full && dev->tbusy
2303: && tp->cur_tx - dirty_tx < TX_RING_SIZE - 2) {
2304: /* The ring is no longer full, clear tbusy. */
2305: tp->tx_full = 0;
2306: dev->tbusy = 0;
2307: mark_bh(NET_BH);
2308: }
2309:
2310: tp->dirty_tx = dirty_tx;
2311: if (csr5 & TxDied) {
2312: if (tulip_debug > 1)
2313: printk(KERN_WARNING "%s: The transmitter stopped!"
2314: " CSR5 is %x, CSR6 %x.\n",
2315: dev->name, csr5, inl(ioaddr + CSR6));
2316: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
2317: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
2318: }
2319: }
2320:
2321: /* Log errors. */
2322: if (csr5 & AbnormalIntr) { /* Abnormal error summary bit. */
2323: if (csr5 & TxJabber) tp->stats.tx_errors++;
2324: if (csr5 & TxFIFOUnderflow) {
2325: if ((tp->csr6 & 0xC000) != 0xC000)
2326: tp->csr6 += 0x4000; /* Bump up the Tx threshold */
2327: else
2328: tp->csr6 |= 0x00200000; /* Store-n-forward. */
2329: /* Restart the transmit process. */
2330: outl(tp->csr6 | 0x0002, ioaddr + CSR6);
2331: outl(tp->csr6 | 0x2002, ioaddr + CSR6);
2332: }
2333: if (csr5 & RxDied) { /* Missed a Rx frame. */
2334: tp->stats.rx_errors++;
2335: tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
2336: }
2337: if (csr5 & TimerInt) {
2338: printk(KERN_ERR "%s: Something Wicked happened! %8.8x.\n",
2339: dev->name, csr5);
2340: /* Hmmmmm, it's not clear what to do here. */
2341: }
2342: if (csr5 & (TPLnkPass | TPLnkFail | 0x08000000)
2343: && tp->chip_id == DC21142) {
2344: if (tulip_debug > 1)
2345: printk(KERN_INFO"%s: 21142 link change, CSR5 = %8.8x.\n",
2346: dev->name, csr5);
2347: t21142_lnk_change(dev);
2348: }
2349: /* Clear all error sources, included undocumented ones! */
2350: outl(0x0800f7ba, ioaddr + CSR5);
2351: }
2352: if (--work_budget < 0) {
2353: if (tulip_debug > 1)
2354: printk(KERN_WARNING "%s: Too much work at interrupt, "
2355: "csr5=0x%8.8x.\n", dev->name, csr5);
2356: /* Acknowledge all interrupt sources. */
2357: outl(0x8001ffff, ioaddr + CSR5);
2358: #ifdef notdef
2359: /* Clear all but standard interrupt sources. */
2360: outl((~csr5) & 0x0001ebef, ioaddr + CSR7);
2361: #endif
2362: break;
2363: }
2364: } while (1);
2365:
2366: if (tulip_debug > 3)
2367: printk(KERN_DEBUG "%s: exiting interrupt, csr5=%#4.4x.\n",
2368: dev->name, inl(ioaddr + CSR5));
2369:
2370: dev->interrupt = 0;
2371: clear_bit(0, (void*)&tp->interrupt);
2372: return;
2373: }
2374:
2375: static int
2376: tulip_rx(struct device *dev)
2377: {
2378: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2379: int entry = tp->cur_rx % RX_RING_SIZE;
2380: int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
2381: int work_done = 0;
2382:
2383: if (tulip_debug > 4)
2384: printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
2385: tp->rx_ring[entry].status);
2386: /* If we own the next entry, it's a new packet. Send it up. */
2387: while (tp->rx_ring[entry].status >= 0) {
2388: s32 status = tp->rx_ring[entry].status;
2389:
2390: if (--rx_work_limit < 0)
2391: break;
2392: if ((status & 0x0300) != 0x0300) {
2393: if ((status & 0xffff) != 0x7fff) { /* Ingore earlier buffers. */
2394: if (tulip_debug > 1)
2395: printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
2396: "multiple buffers, status %8.8x!\n",
2397: dev->name, status);
2398: tp->stats.rx_length_errors++;
2399: }
2400: } else if (status & 0x8000) {
2401: /* There was a fatal error. */
2402: if (tulip_debug > 2)
2403: printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
2404: dev->name, status);
2405: tp->stats.rx_errors++; /* end of a packet.*/
2406: if (status & 0x0890) tp->stats.rx_length_errors++;
2407: if (status & 0x0004) tp->stats.rx_frame_errors++;
2408: if (status & 0x0002) tp->stats.rx_crc_errors++;
2409: if (status & 0x0001) tp->stats.rx_fifo_errors++;
2410: } else {
2411: /* Omit the four octet CRC from the length. */
2412: short pkt_len = ((status >> 16) & 0x7FF) - 4;
2413: struct sk_buff *skb;
2414:
2415: /* Check if the packet is long enough to just accept without
2416: copying to a properly sized skbuff. */
2417: if (pkt_len < rx_copybreak
2418: && (skb = DEV_ALLOC_SKB(pkt_len+2)) != NULL) {
2419: skb->dev = dev;
2420: skb_reserve(skb, 2); /* 16 byte align the IP header */
2421: #if LINUX_VERSION_CODE < 0x10300
2422: memcpy(skb->data, tp->rx_ring[entry].buffer1, pkt_len);
2423: #elif LINUX_VERSION_CODE < 0x20200 || defined(__alpha__)
2424: memcpy(skb_put(skb, pkt_len),
2425: bus_to_virt(tp->rx_ring[entry].buffer1), pkt_len);
2426: #else
2427: #warning Code untested
2428: eth_copy_and_sum(skb, bus_to_virt(tp->rx_ring[entry].buffer1),
2429: pkt_len, 0);
2430: skb_put(skb, pkt_len);
2431: #endif
2432: work_done++;
2433: } else { /* Pass up the skb already on the Rx ring. */
2434: skb = tp->rx_skbuff[entry];
2435: tp->rx_skbuff[entry] = NULL;
2436: #ifndef final_version
2437: {
2438: void *temp = skb_put(skb, pkt_len);
2439: if (bus_to_virt(tp->rx_ring[entry].buffer1) != temp)
2440: printk(KERN_ERR "%s: Internal consistency error! The "
2441: "skbuff addresses do not match in tulip_rx:"
2442: " %p vs. %p / %p.\n", dev->name,
2443: bus_to_virt(tp->rx_ring[entry].buffer1),
2444: skb->head, temp);
2445: }
2446: #else
2447: skb_put(skb, pkt_len);
2448: #endif
2449: }
2450: #if LINUX_VERSION_CODE > 0x10300
2451: skb->protocol = eth_type_trans(skb, dev);
2452: #else
2453: skb->len = pkt_len;
2454: #endif
2455: netif_rx(skb);
2456: dev->last_rx = jiffies;
2457: tp->stats.rx_packets++;
2458: #if LINUX_VERSION_CODE > 0x20127
2459: tp->stats.rx_bytes += pkt_len;
2460: #endif
2461: }
2462: entry = (++tp->cur_rx) % RX_RING_SIZE;
2463: }
2464:
2465: /* Refill the Rx ring buffers. */
2466: for (; tp->cur_rx - tp->dirty_rx > 0; tp->dirty_rx++) {
2467: entry = tp->dirty_rx % RX_RING_SIZE;
2468: if (tp->rx_skbuff[entry] == NULL) {
2469: struct sk_buff *skb;
2470: skb = tp->rx_skbuff[entry] = DEV_ALLOC_SKB(PKT_BUF_SZ);
2471: if (skb == NULL)
2472: break;
2473: skb->dev = dev; /* Mark as being used by this device. */
2474: #if LINUX_VERSION_CODE > 0x10300
2475: tp->rx_ring[entry].buffer1 = virt_to_bus(skb->tail);
2476: #else
2477: tp->rx_ring[entry].buffer1 = virt_to_bus(skb->data);
2478: #endif
2479: work_done++;
2480: }
2481: tp->rx_ring[entry].status = 0x80000000;
2482: }
2483:
2484: return work_done;
2485: }
2486:
2487: static int
2488: tulip_close(struct device *dev)
2489: {
2490: long ioaddr = dev->base_addr;
2491: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2492: int i;
2493:
2494: dev->start = 0;
2495: dev->tbusy = 1;
2496:
2497: if (tulip_debug > 1)
2498: printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
2499: dev->name, inl(ioaddr + CSR5));
2500:
2501: /* Disable interrupts by clearing the interrupt mask. */
2502: outl(0x00000000, ioaddr + CSR7);
2503: /* Stop the chip's Tx and Rx processes. */
2504: outl(inl(ioaddr + CSR6) & ~0x2002, ioaddr + CSR6);
2505: /* 21040 -- Leave the card in 10baseT state. */
2506: if (tp->chip_id == DC21040)
2507: outl(0x00000004, ioaddr + CSR13);
2508:
2509: tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
2510:
2511: del_timer(&tp->timer);
2512:
2513: #ifdef SA_SHIRQ
2514: free_irq(dev->irq, dev);
2515: #else
2516: free_irq(dev->irq);
2517: irq2dev_map[dev->irq] = 0;
2518: #endif
2519:
2520: /* Free all the skbuffs in the Rx queue. */
2521: for (i = 0; i < RX_RING_SIZE; i++) {
2522: struct sk_buff *skb = tp->rx_skbuff[i];
2523: tp->rx_skbuff[i] = 0;
2524: tp->rx_ring[i].status = 0; /* Not owned by Tulip chip. */
2525: tp->rx_ring[i].length = 0;
2526: tp->rx_ring[i].buffer1 = 0xBADF00D0; /* An invalid address. */
2527: if (skb) {
2528: #if LINUX_VERSION_CODE < 0x20100
2529: skb->free = 1;
2530: #endif
2531: #if (LINUX_VERSION_CODE > 0x20155)
2532: dev_kfree_skb(skb);
2533: #else
2534: dev_kfree_skb(skb, FREE_WRITE);
2535: #endif
2536: }
2537: }
2538: for (i = 0; i < TX_RING_SIZE; i++) {
2539: if (tp->tx_skbuff[i])
2540: #if (LINUX_VERSION_CODE > 0x20155)
2541: dev_kfree_skb(tp->tx_skbuff[i]);
2542: #else
2543: dev_kfree_skb(tp->tx_skbuff[i], FREE_WRITE);
2544: #endif
2545: tp->tx_skbuff[i] = 0;
2546: }
2547:
2548:
2549: MOD_DEC_USE_COUNT;
2550:
2551: return 0;
2552: }
2553:
2554: static struct enet_statistics *
2555: tulip_get_stats(struct device *dev)
2556: {
2557: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2558: long ioaddr = dev->base_addr;
2559:
2560: if (dev->start)
2561: tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
2562:
2563: return &tp->stats;
2564: }
2565:
2566: #ifdef HAVE_PRIVATE_IOCTL
2567: /* Provide ioctl() calls to examine the MII xcvr state. */
2568: static int private_ioctl(struct device *dev, struct ifreq *rq, int cmd)
2569: {
2570: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2571: long ioaddr = dev->base_addr;
2572: u16 *data = (u16 *)&rq->ifr_data;
2573: int phy = tp->phys[0] & 0x1f;
2574: long flags;
2575:
2576: switch(cmd) {
2577: case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
2578: if (tp->mtable && tp->mtable->has_mii)
2579: data[0] = phy;
2580: else if (tp->chip_id == DC21142)
2581: data[0] = 32;
2582: else
2583: return -ENODEV;
2584: return 0;
2585: case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
2586: if (data[0] == 32) { /* 21142 pseudo-MII */
2587: int csr12 = inl(ioaddr + CSR12);
2588: int csr14 = inl(ioaddr + CSR14);
2589: switch (data[1]) {
2590: case 0: {
2591: data[3] = ((csr14<<13)&0x4000) + ((csr14<<5)&0x1000);
2592: break; }
2593: case 1:
2594: data[3] = 0x7848 + ((csr12&0x7000) == 0x5000 ? 0x20 : 0)
2595: + (csr12&0x06 ? 0x04 : 0);
2596: break;
2597: case 4: {
2598: int csr14 = inl(ioaddr + CSR14);
2599: data[3] = ((csr14>>9)&0x0380) + ((csr14>>1)&0x20) + 1;
2600: break;
2601: }
2602: case 5: data[3] = inl(ioaddr + CSR12) >> 16; break;
2603: default: data[3] = 0; break;
2604: }
2605: } else {
2606: save_flags(flags);
2607: cli();
2608: data[3] = mdio_read(dev, data[0] & 0x1f, data[1] & 0x1f);
2609: restore_flags(flags);
2610: }
2611: return 0;
2612: case SIOCDEVPRIVATE+2: /* Write the specified MII register */
2613: if (!suser())
2614: return -EPERM;
2615: if (data[0] == 32) { /* 21142 pseudo-MII */
2616: } else {
2617: save_flags(flags);
2618: cli();
2619: mdio_write(dev, data[0] & 0x1f, data[1] & 0x1f, data[2]);
2620: restore_flags(flags);
2621: }
2622: return 0;
2623: default:
2624: return -EOPNOTSUPP;
2625: }
2626:
2627: return -EOPNOTSUPP;
2628: }
2629: #endif /* HAVE_PRIVATE_IOCTL */
2630:
2631: /* Set or clear the multicast filter for this adaptor.
2632: Note that we only use exclusion around actually queueing the
2633: new frame, not around filling tp->setup_frame. This is non-deterministic
2634: when re-entered but still correct. */
2635:
2636: /* The little-endian AUTODIN32 ethernet CRC calculation.
2637: N.B. Do not use for bulk data, use a table-based routine instead.
2638: This is common code and should be moved to net/core/crc.c */
2639: static unsigned const ethernet_polynomial_le = 0xedb88320U;
2640: static inline unsigned ether_crc_le(int length, unsigned char *data)
2641: {
2642: unsigned int crc = 0xffffffff; /* Initial value. */
2643: while(--length >= 0) {
2644: unsigned char current_octet = *data++;
2645: int bit;
2646: for (bit = 8; --bit >= 0; current_octet >>= 1) {
2647: if ((crc ^ current_octet) & 1) {
2648: crc >>= 1;
2649: crc ^= ethernet_polynomial_le;
2650: } else
2651: crc >>= 1;
2652: }
2653: }
2654: return crc;
2655: }
2656:
2657: #ifdef NEW_MULTICAST
2658: static void set_rx_mode(struct device *dev)
2659: #else
2660: static void set_rx_mode(struct device *dev, int num_addrs, void *addrs)
2661: #endif
2662: {
2663: long ioaddr = dev->base_addr;
2664: int csr6 = inl(ioaddr + CSR6) & ~0x00D5;
2665: struct tulip_private *tp = (struct tulip_private *)dev->priv;
2666:
2667: tp->csr6 &= ~0x00D5;
2668: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
2669: outl(csr6 | 0x00C0, ioaddr + CSR6);
2670: /* Unconditionally log net taps. */
2671: printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name);
2672: tp->csr6 |= 0xC0;
2673: } else if ((dev->mc_count > 1000) || (dev->flags & IFF_ALLMULTI)) {
2674: /* Too many to filter perfectly -- accept all multicasts. */
2675: outl(csr6 | 0x0080, ioaddr + CSR6);
2676: tp->csr6 |= 0x80;
2677: } else {
2678: u32 *setup_frm = tp->setup_frame;
2679: struct dev_mc_list *mclist;
2680: u16 *eaddrs;
2681: u32 tx_flags;
2682: int i;
2683:
2684: if (dev->mc_count > 14) { /* Must use a multicast hash table. */
2685: u16 hash_table[32];
2686: memset(hash_table, 0, sizeof(hash_table));
2687: /* This should work on big-endian machines as well. */
2688: for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
2689: i++, mclist = mclist->next)
2690: set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x1ff,
2691: hash_table);
2692: /* Copy the hash table to the setup frame.
2693: NOTE that only the LOW SHORTWORD of setup_frame[] is valid! */
2694: for (i = 0; i < 32; i++)
2695: *setup_frm++ = hash_table[i];
2696: setup_frm += 7;
2697: tx_flags = 0x08400000 | 192;
2698: /* Too clever: i > 15 for fall-though. */
2699: } else {
2700: /* We have <= 15 addresses so we can use the wonderful
2701: 16 address perfect filtering of the Tulip. */
2702: for (i = 0, mclist = dev->mc_list; i < dev->mc_count;
2703: i++, mclist = mclist->next) {
2704: /* Note that only the low shortword of setup_frame[] is valid!
2705: This code may require tweaking for non-x86 architectures! */
2706: eaddrs = (u16 *)mclist->dmi_addr;
2707: *setup_frm++ = *eaddrs++;
2708: *setup_frm++ = *eaddrs++;
2709: *setup_frm++ = *eaddrs++;
2710: }
2711: /* Fill the rest of the table with our physical address.
2712: Once again, only the low shortword or setup_frame[] is valid! */
2713: *setup_frm++ = 0xffff;
2714: *setup_frm++ = 0xffff;
2715: *setup_frm++ = 0xffff;
2716: tx_flags = 0x08000000 | 192;
2717: }
2718: eaddrs = (u16 *)dev->dev_addr;
2719: do {
2720: *setup_frm++ = eaddrs[0];
2721: *setup_frm++ = eaddrs[1];
2722: *setup_frm++ = eaddrs[2];
2723: } while (++i < 15);
2724: /* Now add this frame to the Tx list. */
2725: if (tp->cur_tx - tp->dirty_tx > TX_RING_SIZE - 2) {
2726: /* Same setup recently queued, we need not add it. */
2727: } else {
2728: unsigned long flags;
2729: unsigned int entry;
2730:
2731: save_flags(flags); cli();
2732: entry = tp->cur_tx++ % TX_RING_SIZE;
2733:
2734: if (entry != 0) {
2735: /* Avoid a chip errata by prefixing a dummy entry. */
2736: tp->tx_skbuff[entry] = 0;
2737: tp->tx_ring[entry].length =
2738: (entry == TX_RING_SIZE-1) ? 0x02000000 : 0;
2739: tp->tx_ring[entry].buffer1 = 0;
2740: tp->tx_ring[entry].status = 0x80000000;
2741: entry = tp->cur_tx++ % TX_RING_SIZE;
2742: }
2743:
2744: tp->tx_skbuff[entry] = 0;
2745: /* Put the setup frame on the Tx list. */
2746: if (entry == TX_RING_SIZE-1)
2747: tx_flags |= 0x02000000; /* Wrap ring. */
2748: tp->tx_ring[entry].length = tx_flags;
2749: tp->tx_ring[entry].buffer1 = virt_to_bus(tp->setup_frame);
2750: tp->tx_ring[entry].status = 0x80000000;
2751: if (tp->cur_tx - tp->dirty_tx >= TX_RING_SIZE - 2) {
2752: dev->tbusy = 1;
2753: tp->tx_full = 1;
2754: }
2755: restore_flags(flags);
2756: /* Trigger an immediate transmit demand. */
2757: outl(0, ioaddr + CSR1);
2758: }
2759: outl(csr6 | 0x0000, ioaddr + CSR6);
2760: }
2761: }
2762:
2763: #ifdef CARDBUS
2764:
2765: #include <pcmcia/driver_ops.h>
2766:
2767: static dev_node_t *tulip_attach(dev_locator_t *loc)
2768: {
2769: u16 dev_id;
2770: u32 io;
2771: u8 bus, devfn;
2772: struct device *dev;
2773:
2774: if (loc->bus != LOC_PCI) return NULL;
2775: bus = loc->b.pci.bus; devfn = loc->b.pci.devfn;
2776: printk(KERN_INFO "tulip_attach(bus %d, function %d)\n", bus, devfn);
2777: pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io);
2778: pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id);
2779: io &= ~3;
2780: dev = tulip_probe1(bus, devfn, NULL, DC21142, -1);
2781: if (dev) {
2782: dev_node_t *node = kmalloc(sizeof(dev_node_t), GFP_KERNEL);
2783: strcpy(node->dev_name, dev->name);
2784: node->major = node->minor = 0;
2785: node->next = NULL;
2786: MOD_INC_USE_COUNT;
2787: return node;
2788: }
2789: return NULL;
2790: }
2791:
2792: static void tulip_detach(dev_node_t *node)
2793: {
2794: struct device **devp, **next;
2795: printk(KERN_INFO "tulip_detach(%s)\n", node->dev_name);
2796: for (devp = &root_tulip_dev; *devp; devp = next) {
2797: next = &((struct tulip_private *)(*devp)->priv)->next_module;
2798: if (strcmp((*devp)->name, node->dev_name) == 0) break;
2799: }
2800: if (*devp) {
2801: unregister_netdev(*devp);
2802: kfree(*devp);
2803: *devp = *next;
2804: kfree(node);
2805: MOD_DEC_USE_COUNT;
2806: }
2807: }
2808:
2809: struct driver_operations tulip_ops = {
2810: "tulip_cb", tulip_attach, NULL, NULL, tulip_detach
2811: };
2812:
2813: #endif /* Cardbus support */
2814:
2815:
2816: #ifdef MODULE
2817: #if LINUX_VERSION_CODE > 0x20118
2818: MODULE_AUTHOR("Donald Becker <[email protected]>");
2819: MODULE_DESCRIPTION("Digital 21*4* Tulip ethernet driver");
2820: MODULE_PARM(debug, "i");
2821: MODULE_PARM(max_interrupt_work, "i");
2822: MODULE_PARM(reverse_probe, "i");
2823: MODULE_PARM(rx_copybreak, "i");
2824: MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
2825: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
2826: #endif
2827:
2828: /* An additional parameter that may be passed in... */
2829: static int debug = -1;
2830:
2831: int
2832: init_module(void)
2833: {
2834: if (debug >= 0)
2835: tulip_debug = debug;
2836:
2837: #ifdef CARDBUS
2838: register_driver(&tulip_ops);
2839: return 0;
2840: #else
2841: return tulip_probe(NULL);
2842: #endif
2843: }
2844:
2845: void
2846: cleanup_module(void)
2847: {
2848: struct device *next_dev;
2849:
2850: #ifdef CARDBUS
2851: unregister_driver(&tulip_ops);
2852: #endif
2853:
2854: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
2855: while (root_tulip_dev) {
2856: next_dev = ((struct tulip_private *)root_tulip_dev->priv)->next_module;
2857: unregister_netdev(root_tulip_dev);
2858: release_region(root_tulip_dev->base_addr, TULIP_TOTAL_SIZE);
2859: kfree(root_tulip_dev);
2860: root_tulip_dev = next_dev;
2861: }
2862: }
2863:
2864: #endif /* MODULE */
2865:
2866: /*
2867: * Local variables:
2868: * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c tulip.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
2869: * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c tulip.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
2870: * c-indent-level: 4
2871: * c-basic-offset: 4
2872: * tab-width: 4
2873: * End:
2874: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.