2 Written 1997-1998 by Donald Becker.
4 This software may be used and distributed according to the terms
5 of the GNU General Public License, incorporated herein by reference.
7 This driver is for the 3Com ISA EtherLink XL "Corkscrew" 3c515 ethercard.
9 The author may be reached as becker@scyld.com, or C/O
10 Scyld Computing Corporation
11 410 Severn Ave., Suite 210
15 2000/2/2- Added support for kernel-level ISAPnP
16 by Stephen Frost <sfrost@snowman.net> and Alessandro Zummo
17 Cleaned up for 2.3.x/softnet by Jeff Garzik and Alan Cox.
19 2001/11/17 - Added ethtool support (jgarzik)
21 2002/10/28 - Locking updates for 2.5 (alan@redhat.com)
25 #define DRV_NAME "3c515"
26 #define DRV_VERSION "0.99t-ac"
27 #define DRV_RELDATE "28-Oct-2002"
29 static char *version
=
30 DRV_NAME
".c:v" DRV_VERSION
" " DRV_RELDATE
" becker@scyld.com and others\n";
34 /* "Knobs" that adjust features and parameters. */
35 /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
36 Setting to > 1512 effectively disables this feature. */
37 static int rx_copybreak
= 200;
39 /* Allow setting MTU to a larger size, bypassing the normal ethernet setup. */
40 static const int mtu
= 1500;
42 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
43 static int max_interrupt_work
= 20;
45 /* Enable the automatic media selection code -- usually set. */
48 /* Allow the use of fragment bus master transfers instead of only
49 programmed-I/O for Vortex cards. Full-bus-master transfers are always
50 enabled by default on Boomerang cards. If VORTEX_BUS_MASTER is defined,
51 the feature may be turned on using 'options'. */
52 #define VORTEX_BUS_MASTER
54 /* A few values that may be tweaked. */
55 /* Keep the ring sizes a power of two for efficiency. */
56 #define TX_RING_SIZE 16
57 #define RX_RING_SIZE 16
58 #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */
60 #include <linux/module.h>
61 #include <linux/isapnp.h>
62 #include <linux/kernel.h>
63 #include <linux/netdevice.h>
64 #include <linux/string.h>
65 #include <linux/errno.h>
67 #include <linux/ioport.h>
68 #include <linux/slab.h>
69 #include <linux/skbuff.h>
70 #include <linux/etherdevice.h>
71 #include <linux/interrupt.h>
72 #include <linux/timer.h>
73 #include <linux/ethtool.h>
74 #include <linux/bitops.h>
76 #include <asm/uaccess.h>
81 #include <linux/delay.h>
85 MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
86 MODULE_DESCRIPTION("3Com 3c515 Corkscrew driver");
87 MODULE_LICENSE("GPL");
88 MODULE_VERSION(DRV_VERSION
);
90 /* "Knobs" for adjusting internal parameters. */
91 /* Put out somewhat more debugging messages. (0 - no msg, 1 minimal msgs). */
92 #define DRIVER_DEBUG 1
93 /* Some values here only for performance evaluation and path-coverage
95 static int rx_nocopy
, rx_copy
, queued_packet
;
97 /* Number of times to check to see if the Tx FIFO has space, used in some
99 #define WAIT_TX_AVAIL 200
101 /* Operational parameter that usually are not changed. */
102 #define TX_TIMEOUT 40 /* Time in jiffies before concluding Tx hung */
104 /* The size here is somewhat misleading: the Corkscrew also uses the ISA
105 aliased registers at <base>+0x400.
107 #define CORKSCREW_TOTAL_SIZE 0x20
110 static int corkscrew_debug
= DRIVER_DEBUG
;
112 static int corkscrew_debug
= 1;
115 #define CORKSCREW_ID 10
120 I. Board Compatibility
122 This device driver is designed for the 3Com 3c515 ISA Fast EtherLink XL,
123 3Com's ISA bus adapter for Fast Ethernet. Due to the unique I/O port layout,
124 it's not practical to integrate this driver with the other EtherLink drivers.
126 II. Board-specific settings
128 The Corkscrew has an EEPROM for configuration, but no special settings are
131 III. Driver operation
133 The 3c515 series use an interface that's very similar to the 3c900 "Boomerang"
134 PCI cards, with the bus master interface extensively modified to work with
137 The card is capable of full-bus-master transfers with separate
138 lists of transmit and receive descriptors, similar to the AMD LANCE/PCnet,
139 DEC Tulip and Intel Speedo3.
141 This driver uses a "RX_COPYBREAK" scheme rather than a fixed intermediate
142 receive buffer. This scheme allocates full-sized skbuffs as receive
143 buffers. The value RX_COPYBREAK is used as the copying breakpoint: it is
144 chosen to trade-off the memory wasted by passing the full-sized skbuff to
145 the queue layer for all frames vs. the copying cost of copying a frame to a
146 correctly-sized skbuff.
149 IIIC. Synchronization
150 The driver runs as two independent, single-threaded flows of control. One
151 is the send-packet routine, which enforces single-threaded use by the netif
152 layer. The other thread is the interrupt handler, which is single
153 threaded by the hardware and other software.
157 Thanks to Terry Murphy of 3Com for providing documentation and a development
160 The names "Vortex", "Boomerang" and "Corkscrew" are the internal 3Com
161 project names. I use these names to eliminate confusion -- 3Com product
162 numbers and names are very similar and often confused.
164 The new chips support both ethernet (1.5K) and FDDI (4.5K) frame sizes!
165 This driver only supports ethernet frames because of the recent MTU limit
166 of 1.5K, but the changes to support 4.5K are minimal.
169 /* Operational definitions.
170 These are not used by other compilation units and thus are not
171 exported in a ".h" file.
173 First the windows. There are eight register windows, with the command
174 and status registers available in each.
176 #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
178 #define EL3_STATUS 0x0e
180 /* The top five bits written to EL3_CMD are a command, the lower
181 11 bits are the parameter, if applicable.
182 Note that 11 parameters bits was fine for ethernet, but the new chips
183 can handle FDDI length frames (~4500 octets) and now parameters count
184 32-bit 'Dwords' rather than octets. */
187 TotalReset
= 0 << 11, SelectWindow
= 1 << 11, StartCoax
= 2 << 11,
188 RxDisable
= 3 << 11, RxEnable
= 4 << 11, RxReset
= 5 << 11,
189 UpStall
= 6 << 11, UpUnstall
= (6 << 11) + 1, DownStall
= (6 << 11) + 2,
190 DownUnstall
= (6 << 11) + 3, RxDiscard
= 8 << 11, TxEnable
= 9 << 11,
191 TxDisable
= 10 << 11, TxReset
= 11 << 11, FakeIntr
= 12 << 11,
192 AckIntr
= 13 << 11, SetIntrEnb
= 14 << 11, SetStatusEnb
= 15 << 11,
193 SetRxFilter
= 16 << 11, SetRxThreshold
= 17 << 11,
194 SetTxThreshold
= 18 << 11, SetTxStart
= 19 << 11, StartDMAUp
= 20 << 11,
195 StartDMADown
= (20 << 11) + 1, StatsEnable
= 21 << 11,
196 StatsDisable
= 22 << 11, StopCoax
= 23 << 11,
199 /* The SetRxFilter command accepts the following classes: */
201 RxStation
= 1, RxMulticast
= 2, RxBroadcast
= 4, RxProm
= 8
204 /* Bits in the general status register. */
205 enum corkscrew_status
{
206 IntLatch
= 0x0001, AdapterFailure
= 0x0002, TxComplete
= 0x0004,
207 TxAvailable
= 0x0008, RxComplete
= 0x0010, RxEarly
= 0x0020,
208 IntReq
= 0x0040, StatsFull
= 0x0080,
209 DMADone
= 1 << 8, DownComplete
= 1 << 9, UpComplete
= 1 << 10,
210 DMAInProgress
= 1 << 11, /* DMA controller is still busy. */
211 CmdInProgress
= 1 << 12, /* EL3_CMD is still busy. */
214 /* Register window 1 offsets, the window used in normal operation.
215 On the Corkscrew this window is always mapped at offsets 0x10-0x1f. */
217 TX_FIFO
= 0x10, RX_FIFO
= 0x10, RxErrors
= 0x14,
218 RxStatus
= 0x18, Timer
= 0x1A, TxStatus
= 0x1B,
219 TxFree
= 0x1C, /* Remaining free bytes in Tx buffer. */
223 #if defined(CORKSCREW)
224 Wn0EepromCmd
= 0x200A, /* Corkscrew EEPROM command register. */
225 Wn0EepromData
= 0x200C, /* Corkscrew EEPROM results register. */
227 Wn0EepromCmd
= 10, /* Window 0: EEPROM command register. */
228 Wn0EepromData
= 12, /* Window 0: EEPROM results register. */
231 enum Win0_EEPROM_bits
{
232 EEPROM_Read
= 0x80, EEPROM_WRITE
= 0x40, EEPROM_ERASE
= 0xC0,
233 EEPROM_EWENB
= 0x30, /* Enable erasing/writing for 10 msec. */
234 EEPROM_EWDIS
= 0x00, /* Disable EWENB before 10 msec timeout. */
237 /* EEPROM locations. */
239 PhysAddr01
= 0, PhysAddr23
= 1, PhysAddr45
= 2, ModelID
= 3,
243 enum Window3
{ /* Window 3: MAC/config bits. */
244 Wn3_Config
= 0, Wn3_MAC_Ctrl
= 6, Wn3_Options
= 8,
251 Ram_split_shift
= 16,
252 Ram_split
= 3 << Ram_split_shift
,
254 Xcvr
= 7 << Xcvr_shift
,
255 Autoselect
= 0x1000000,
259 Wn4_NetDiag
= 6, Wn4_Media
= 10, /* Window 4: Xcvr/media bits. */
261 enum Win4_Media_bits
{
262 Media_SQE
= 0x0008, /* Enable SQE error counting for AUI. */
263 Media_10TP
= 0x00C0, /* Enable link beat and jabber for 10baseT. */
264 Media_Lnk
= 0x0080, /* Enable just link beat for 100TX/100FX. */
265 Media_LnkBeat
= 0x0800,
267 enum Window7
{ /* Window 7: Bus Master control. */
268 Wn7_MasterAddr
= 0, Wn7_MasterLen
= 6, Wn7_MasterStatus
= 12,
271 /* Boomerang-style bus master control registers. Note ISA aliases! */
273 PktStatus
= 0x400, DownListPtr
= 0x404, FragAddr
= 0x408, FragLen
=
275 TxFreeThreshold
= 0x40f, UpPktStatus
= 0x410, UpListPtr
= 0x418,
278 /* The Rx and Tx descriptor lists.
279 Caution Alpha hackers: these types are 32 bits! Note also the 8 byte
280 alignment contraint on tx_ring[] and rx_ring[]. */
281 struct boom_rx_desc
{
288 /* Values for the Rx status entry. */
289 enum rx_desc_status
{
290 RxDComplete
= 0x00008000, RxDError
= 0x4000,
291 /* See boomerang_rx() for actual error bits */
294 struct boom_tx_desc
{
301 struct corkscrew_private
{
302 const char *product_name
;
303 struct list_head list
;
304 struct net_device
*our_dev
;
305 /* The Rx and Tx rings are here to keep them quad-word-aligned. */
306 struct boom_rx_desc rx_ring
[RX_RING_SIZE
];
307 struct boom_tx_desc tx_ring
[TX_RING_SIZE
];
308 /* The addresses of transmit- and receive-in-place skbuffs. */
309 struct sk_buff
*rx_skbuff
[RX_RING_SIZE
];
310 struct sk_buff
*tx_skbuff
[TX_RING_SIZE
];
311 unsigned int cur_rx
, cur_tx
; /* The next free ring entry */
312 unsigned int dirty_rx
, dirty_tx
;/* The ring entries to be free()ed. */
313 struct net_device_stats stats
;
314 struct sk_buff
*tx_skb
; /* Packet being eaten by bus master ctrl. */
315 struct timer_list timer
; /* Media selection timer. */
316 int capabilities
; /* Adapter capabilities word. */
317 int options
; /* User-settable misc. driver options. */
318 int last_rx_packets
; /* For media autoselection. */
319 unsigned int available_media
:8, /* From Wn3_Options */
320 media_override
:3, /* Passed-in media type. */
321 default_media
:3, /* Read from the EEPROM. */
322 full_duplex
:1, autoselect
:1, bus_master
:1, /* Vortex can only do a fragment bus-m. */
323 full_bus_master_tx
:1, full_bus_master_rx
:1, /* Boomerang */
329 /* The action to take with a media selection timer tick.
330 Note that we deviate from the 3Com order by checking 10base2 before AUI.
333 XCVR_10baseT
= 0, XCVR_AUI
, XCVR_10baseTOnly
, XCVR_10base2
, XCVR_100baseTx
,
334 XCVR_100baseFx
, XCVR_MII
= 6, XCVR_Default
= 8,
337 static struct media_table
{
339 unsigned int media_bits
:16, /* Bits to set in Wn4_Media register. */
340 mask
:8, /* The transceiver-present bit in Wn3_Config. */
341 next
:8; /* The media type to try next. */
342 short wait
; /* Time before we check media status. */
344 { "10baseT", Media_10TP
, 0x08, XCVR_10base2
, (14 * HZ
) / 10 },
345 { "10Mbs AUI", Media_SQE
, 0x20, XCVR_Default
, (1 * HZ
) / 10},
346 { "undefined", 0, 0x80, XCVR_10baseT
, 10000},
347 { "10base2", 0, 0x10, XCVR_AUI
, (1 * HZ
) / 10},
348 { "100baseTX", Media_Lnk
, 0x02, XCVR_100baseFx
, (14 * HZ
) / 10},
349 { "100baseFX", Media_Lnk
, 0x04, XCVR_MII
, (14 * HZ
) / 10},
350 { "MII", 0, 0x40, XCVR_10baseT
, 3 * HZ
},
351 { "undefined", 0, 0x01, XCVR_10baseT
, 10000},
352 { "Default", 0, 0xFF, XCVR_10baseT
, 10000},
356 static struct isapnp_device_id corkscrew_isapnp_adapters
[] = {
357 { ISAPNP_ANY_ID
, ISAPNP_ANY_ID
,
358 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5051),
359 (long) "3Com Fast EtherLink ISA" },
360 { } /* terminate list */
363 MODULE_DEVICE_TABLE(isapnp
, corkscrew_isapnp_adapters
);
366 #endif /* __ISAPNP__ */
368 static struct net_device
*corkscrew_scan(int unit
);
369 static int corkscrew_setup(struct net_device
*dev
, int ioaddr
,
370 struct pnp_dev
*idev
, int card_number
);
371 static int corkscrew_open(struct net_device
*dev
);
372 static void corkscrew_timer(unsigned long arg
);
373 static int corkscrew_start_xmit(struct sk_buff
*skb
,
374 struct net_device
*dev
);
375 static int corkscrew_rx(struct net_device
*dev
);
376 static void corkscrew_timeout(struct net_device
*dev
);
377 static int boomerang_rx(struct net_device
*dev
);
378 static irqreturn_t
corkscrew_interrupt(int irq
, void *dev_id
);
379 static int corkscrew_close(struct net_device
*dev
);
380 static void update_stats(int addr
, struct net_device
*dev
);
381 static struct net_device_stats
*corkscrew_get_stats(struct net_device
*dev
);
382 static void set_rx_mode(struct net_device
*dev
);
383 static const struct ethtool_ops netdev_ethtool_ops
;
387 Unfortunately maximizing the shared code between the integrated and
388 module version of the driver results in a complicated set of initialization
390 init_module() -- modules / tc59x_init() -- built-in
391 The wrappers for corkscrew_scan()
392 corkscrew_scan() The common routine that scans for PCI and EISA cards
393 corkscrew_found_device() Allocate a device structure when we find a card.
394 Different versions exist for modules and built-in.
395 corkscrew_probe1() Fill in the device structure -- this is separated
396 so that the modules code can put it in dev->init.
398 /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
399 /* Note: this is the only limit on the number of cards supported!! */
400 static int options
[MAX_UNITS
] = { -1, -1, -1, -1, -1, -1, -1, -1, };
403 static int debug
= -1;
405 module_param(debug
, int, 0);
406 module_param_array(options
, int, NULL
, 0);
407 module_param(rx_copybreak
, int, 0);
408 module_param(max_interrupt_work
, int, 0);
409 MODULE_PARM_DESC(debug
, "3c515 debug level (0-6)");
410 MODULE_PARM_DESC(options
, "3c515: Bits 0-2: media type, bit 3: full duplex, bit 4: bus mastering");
411 MODULE_PARM_DESC(rx_copybreak
, "3c515 copy breakpoint for copy-only-tiny-frames");
412 MODULE_PARM_DESC(max_interrupt_work
, "3c515 maximum events handled per interrupt");
414 /* A list of all installed Vortex devices, for removing the driver module. */
415 /* we will need locking (and refcounting) if we ever use it for more */
416 static LIST_HEAD(root_corkscrew_dev
);
418 int init_module(void)
422 corkscrew_debug
= debug
;
425 while (corkscrew_scan(-1))
427 return found
? 0 : -ENODEV
;
431 struct net_device
*tc515_probe(int unit
)
433 struct net_device
*dev
= corkscrew_scan(unit
);
437 return ERR_PTR(-ENODEV
);
439 if (corkscrew_debug
> 0 && !printed
) {
446 #endif /* not MODULE */
448 static int check_device(unsigned ioaddr
)
452 if (!request_region(ioaddr
, CORKSCREW_TOTAL_SIZE
, "3c515"))
454 /* Check the resource configuration for a matching ioaddr. */
455 if ((inw(ioaddr
+ 0x2002) & 0x1f0) != (ioaddr
& 0x1f0)) {
456 release_region(ioaddr
, CORKSCREW_TOTAL_SIZE
);
459 /* Verify by reading the device ID from the EEPROM. */
460 outw(EEPROM_Read
+ 7, ioaddr
+ Wn0EepromCmd
);
461 /* Pause for at least 162 us. for the read to take place. */
462 for (timer
= 4; timer
>= 0; timer
--) {
464 if ((inw(ioaddr
+ Wn0EepromCmd
) & 0x0200) == 0)
467 if (inw(ioaddr
+ Wn0EepromData
) != 0x6d50) {
468 release_region(ioaddr
, CORKSCREW_TOTAL_SIZE
);
474 static void cleanup_card(struct net_device
*dev
)
476 struct corkscrew_private
*vp
= netdev_priv(dev
);
477 list_del_init(&vp
->list
);
480 outw(TotalReset
, dev
->base_addr
+ EL3_CMD
);
481 release_region(dev
->base_addr
, CORKSCREW_TOTAL_SIZE
);
483 pnp_device_detach(to_pnp_dev(vp
->dev
));
486 static struct net_device
*corkscrew_scan(int unit
)
488 struct net_device
*dev
;
489 static int cards_found
= 0;
494 static int pnp_cards
;
497 dev
= alloc_etherdev(sizeof(struct corkscrew_private
));
499 return ERR_PTR(-ENOMEM
);
502 sprintf(dev
->name
, "eth%d", unit
);
503 netdev_boot_setup_check(dev
);
509 for(i
=0; corkscrew_isapnp_adapters
[i
].vendor
!= 0; i
++) {
510 struct pnp_dev
*idev
= NULL
;
512 while((idev
= pnp_find_dev(NULL
,
513 corkscrew_isapnp_adapters
[i
].vendor
,
514 corkscrew_isapnp_adapters
[i
].function
,
517 if (pnp_device_attach(idev
) < 0)
519 if (pnp_activate_dev(idev
) < 0) {
520 printk("pnp activate failed (out of resources?)\n");
521 pnp_device_detach(idev
);
524 if (!pnp_port_valid(idev
, 0) || !pnp_irq_valid(idev
, 0)) {
525 pnp_device_detach(idev
);
528 ioaddr
= pnp_port_start(idev
, 0);
529 irq
= pnp_irq(idev
, 0);
530 if (!check_device(ioaddr
)) {
531 pnp_device_detach(idev
);
535 printk ("ISAPNP reports %s at i/o 0x%x, irq %d\n",
536 (char*) corkscrew_isapnp_adapters
[i
].driver_data
, ioaddr
, irq
);
537 printk(KERN_INFO
"3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
538 inl(ioaddr
+ 0x2002), inw(ioaddr
+ 0x2000));
539 /* irq = inw(ioaddr + 0x2002) & 15; */ /* Use the irq from isapnp */
540 SET_NETDEV_DEV(dev
, &idev
->dev
);
542 err
= corkscrew_setup(dev
, ioaddr
, idev
, cards_found
++);
549 #endif /* __ISAPNP__ */
551 /* Check all locations on the ISA bus -- evil! */
552 for (ioaddr
= 0x100; ioaddr
< 0x400; ioaddr
+= 0x20) {
553 if (!check_device(ioaddr
))
556 printk(KERN_INFO
"3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
557 inl(ioaddr
+ 0x2002), inw(ioaddr
+ 0x2000));
558 err
= corkscrew_setup(dev
, ioaddr
, NULL
, cards_found
++);
567 static int corkscrew_setup(struct net_device
*dev
, int ioaddr
,
568 struct pnp_dev
*idev
, int card_number
)
570 struct corkscrew_private
*vp
= netdev_priv(dev
);
571 unsigned int eeprom
[0x40], checksum
= 0; /* EEPROM contents */
574 DECLARE_MAC_BUF(mac
);
577 irq
= pnp_irq(idev
, 0);
578 vp
->dev
= &idev
->dev
;
580 irq
= inw(ioaddr
+ 0x2002) & 15;
583 dev
->base_addr
= ioaddr
;
585 dev
->dma
= inw(ioaddr
+ 0x2000) & 7;
586 vp
->product_name
= "3c515";
587 vp
->options
= dev
->mem_start
;
591 if (card_number
>= MAX_UNITS
)
594 vp
->options
= options
[card_number
];
597 if (vp
->options
>= 0) {
598 vp
->media_override
= vp
->options
& 7;
599 if (vp
->media_override
== 2)
600 vp
->media_override
= 0;
601 vp
->full_duplex
= (vp
->options
& 8) ? 1 : 0;
602 vp
->bus_master
= (vp
->options
& 16) ? 1 : 0;
604 vp
->media_override
= 7;
609 list_add(&vp
->list
, &root_corkscrew_dev
);
612 printk(KERN_INFO
"%s: 3Com %s at %#3x,", dev
->name
, vp
->product_name
, ioaddr
);
614 spin_lock_init(&vp
->lock
);
616 /* Read the station address from the EEPROM. */
618 for (i
= 0; i
< 0x18; i
++) {
619 __be16
*phys_addr
= (__be16
*) dev
->dev_addr
;
621 outw(EEPROM_Read
+ i
, ioaddr
+ Wn0EepromCmd
);
622 /* Pause for at least 162 us. for the read to take place. */
623 for (timer
= 4; timer
>= 0; timer
--) {
625 if ((inw(ioaddr
+ Wn0EepromCmd
) & 0x0200) == 0)
628 eeprom
[i
] = inw(ioaddr
+ Wn0EepromData
);
629 checksum
^= eeprom
[i
];
631 phys_addr
[i
] = htons(eeprom
[i
]);
633 checksum
= (checksum
^ (checksum
>> 8)) & 0xff;
634 if (checksum
!= 0x00)
635 printk(" ***INVALID CHECKSUM %4.4x*** ", checksum
);
636 printk(" %s", print_mac(mac
, dev
->dev_addr
));
637 if (eeprom
[16] == 0x11c7) { /* Corkscrew */
638 if (request_dma(dev
->dma
, "3c515")) {
639 printk(", DMA %d allocation failed", dev
->dma
);
642 printk(", DMA %d", dev
->dma
);
644 printk(", IRQ %d\n", dev
->irq
);
645 /* Tell them about an invalid IRQ. */
646 if (corkscrew_debug
&& (dev
->irq
<= 0 || dev
->irq
> 15))
647 printk(KERN_WARNING
" *** Warning: this IRQ is unlikely to work! ***\n");
650 char *ram_split
[] = { "5:3", "3:1", "1:1", "3:5" };
653 vp
->available_media
= inw(ioaddr
+ Wn3_Options
);
654 config
= inl(ioaddr
+ Wn3_Config
);
655 if (corkscrew_debug
> 1)
656 printk(KERN_INFO
" Internal config register is %4.4x, transceivers %#x.\n",
657 config
, inw(ioaddr
+ Wn3_Options
));
658 printk(KERN_INFO
" %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
659 8 << config
& Ram_size
,
660 config
& Ram_width
? "word" : "byte",
661 ram_split
[(config
& Ram_split
) >> Ram_split_shift
],
662 config
& Autoselect
? "autoselect/" : "",
663 media_tbl
[(config
& Xcvr
) >> Xcvr_shift
].name
);
664 vp
->default_media
= (config
& Xcvr
) >> Xcvr_shift
;
665 vp
->autoselect
= config
& Autoselect
? 1 : 0;
666 dev
->if_port
= vp
->default_media
;
668 if (vp
->media_override
!= 7) {
669 printk(KERN_INFO
" Media override to transceiver type %d (%s).\n",
671 media_tbl
[vp
->media_override
].name
);
672 dev
->if_port
= vp
->media_override
;
675 vp
->capabilities
= eeprom
[16];
676 vp
->full_bus_master_tx
= (vp
->capabilities
& 0x20) ? 1 : 0;
677 /* Rx is broken at 10mbps, so we always disable it. */
678 /* vp->full_bus_master_rx = 0; */
679 vp
->full_bus_master_rx
= (vp
->capabilities
& 0x20) ? 1 : 0;
681 /* The 3c51x-specific entries in the device structure. */
682 dev
->open
= &corkscrew_open
;
683 dev
->hard_start_xmit
= &corkscrew_start_xmit
;
684 dev
->tx_timeout
= &corkscrew_timeout
;
685 dev
->watchdog_timeo
= (400 * HZ
) / 1000;
686 dev
->stop
= &corkscrew_close
;
687 dev
->get_stats
= &corkscrew_get_stats
;
688 dev
->set_multicast_list
= &set_rx_mode
;
689 dev
->ethtool_ops
= &netdev_ethtool_ops
;
691 return register_netdev(dev
);
695 static int corkscrew_open(struct net_device
*dev
)
697 int ioaddr
= dev
->base_addr
;
698 struct corkscrew_private
*vp
= netdev_priv(dev
);
702 /* Before initializing select the active media port. */
705 outb(0x20, ioaddr
+ Wn3_MAC_Ctrl
); /* Set the full-duplex bit. */
706 config
= inl(ioaddr
+ Wn3_Config
);
708 if (vp
->media_override
!= 7) {
709 if (corkscrew_debug
> 1)
710 printk(KERN_INFO
"%s: Media override to transceiver %d (%s).\n",
711 dev
->name
, vp
->media_override
,
712 media_tbl
[vp
->media_override
].name
);
713 dev
->if_port
= vp
->media_override
;
714 } else if (vp
->autoselect
) {
715 /* Find first available media type, starting with 100baseTx. */
717 while (!(vp
->available_media
& media_tbl
[dev
->if_port
].mask
))
718 dev
->if_port
= media_tbl
[dev
->if_port
].next
;
720 if (corkscrew_debug
> 1)
721 printk("%s: Initial media type %s.\n",
722 dev
->name
, media_tbl
[dev
->if_port
].name
);
724 init_timer(&vp
->timer
);
725 vp
->timer
.expires
= jiffies
+ media_tbl
[dev
->if_port
].wait
;
726 vp
->timer
.data
= (unsigned long) dev
;
727 vp
->timer
.function
= &corkscrew_timer
; /* timer handler */
728 add_timer(&vp
->timer
);
730 dev
->if_port
= vp
->default_media
;
732 config
= (config
& ~Xcvr
) | (dev
->if_port
<< Xcvr_shift
);
733 outl(config
, ioaddr
+ Wn3_Config
);
735 if (corkscrew_debug
> 1) {
736 printk("%s: corkscrew_open() InternalConfig %8.8x.\n",
740 outw(TxReset
, ioaddr
+ EL3_CMD
);
741 for (i
= 20; i
>= 0; i
--)
742 if (!(inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
745 outw(RxReset
, ioaddr
+ EL3_CMD
);
746 /* Wait a few ticks for the RxReset command to complete. */
747 for (i
= 20; i
>= 0; i
--)
748 if (!(inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
751 outw(SetStatusEnb
| 0x00, ioaddr
+ EL3_CMD
);
753 /* Use the now-standard shared IRQ implementation. */
754 if (vp
->capabilities
== 0x11c7) {
755 /* Corkscrew: Cannot share ISA resources. */
758 || request_irq(dev
->irq
, &corkscrew_interrupt
, 0,
759 vp
->product_name
, dev
)) return -EAGAIN
;
760 enable_dma(dev
->dma
);
761 set_dma_mode(dev
->dma
, DMA_MODE_CASCADE
);
762 } else if (request_irq(dev
->irq
, &corkscrew_interrupt
, IRQF_SHARED
,
763 vp
->product_name
, dev
)) {
767 if (corkscrew_debug
> 1) {
769 printk("%s: corkscrew_open() irq %d media status %4.4x.\n",
770 dev
->name
, dev
->irq
, inw(ioaddr
+ Wn4_Media
));
773 /* Set the station address and mask in window 2 each time opened. */
775 for (i
= 0; i
< 6; i
++)
776 outb(dev
->dev_addr
[i
], ioaddr
+ i
);
777 for (; i
< 12; i
+= 2)
780 if (dev
->if_port
== 3)
781 /* Start the thinnet transceiver. We should really wait 50ms... */
782 outw(StartCoax
, ioaddr
+ EL3_CMD
);
784 outw((inw(ioaddr
+ Wn4_Media
) & ~(Media_10TP
| Media_SQE
)) |
785 media_tbl
[dev
->if_port
].media_bits
, ioaddr
+ Wn4_Media
);
787 /* Switch to the stats window, and clear all stats by reading. */
788 outw(StatsDisable
, ioaddr
+ EL3_CMD
);
790 for (i
= 0; i
< 10; i
++)
794 /* New: On the Vortex we must also clear the BadSSD counter. */
797 /* ..and on the Boomerang we enable the extra statistics bits. */
798 outw(0x0040, ioaddr
+ Wn4_NetDiag
);
800 /* Switch to register set 7 for normal use. */
803 if (vp
->full_bus_master_rx
) { /* Boomerang bus master. */
804 vp
->cur_rx
= vp
->dirty_rx
= 0;
805 if (corkscrew_debug
> 2)
806 printk("%s: Filling in the Rx ring.\n",
808 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
810 if (i
< (RX_RING_SIZE
- 1))
811 vp
->rx_ring
[i
].next
=
812 isa_virt_to_bus(&vp
->rx_ring
[i
+ 1]);
814 vp
->rx_ring
[i
].next
= 0;
815 vp
->rx_ring
[i
].status
= 0; /* Clear complete bit. */
816 vp
->rx_ring
[i
].length
= PKT_BUF_SZ
| 0x80000000;
817 skb
= dev_alloc_skb(PKT_BUF_SZ
);
818 vp
->rx_skbuff
[i
] = skb
;
820 break; /* Bad news! */
821 skb
->dev
= dev
; /* Mark as being used by this device. */
822 skb_reserve(skb
, 2); /* Align IP on 16 byte boundaries */
823 vp
->rx_ring
[i
].addr
= isa_virt_to_bus(skb
->data
);
825 vp
->rx_ring
[i
- 1].next
= isa_virt_to_bus(&vp
->rx_ring
[0]); /* Wrap the ring. */
826 outl(isa_virt_to_bus(&vp
->rx_ring
[0]), ioaddr
+ UpListPtr
);
828 if (vp
->full_bus_master_tx
) { /* Boomerang bus master Tx. */
829 vp
->cur_tx
= vp
->dirty_tx
= 0;
830 outb(PKT_BUF_SZ
>> 8, ioaddr
+ TxFreeThreshold
); /* Room for a packet. */
831 /* Clear the Tx ring. */
832 for (i
= 0; i
< TX_RING_SIZE
; i
++)
833 vp
->tx_skbuff
[i
] = NULL
;
834 outl(0, ioaddr
+ DownListPtr
);
836 /* Set receiver mode: presumably accept b-case and phys addr only. */
838 outw(StatsEnable
, ioaddr
+ EL3_CMD
); /* Turn on statistics. */
840 netif_start_queue(dev
);
842 outw(RxEnable
, ioaddr
+ EL3_CMD
); /* Enable the receiver. */
843 outw(TxEnable
, ioaddr
+ EL3_CMD
); /* Enable transmitter. */
844 /* Allow status bits to be seen. */
845 outw(SetStatusEnb
| AdapterFailure
| IntReq
| StatsFull
|
846 (vp
->full_bus_master_tx
? DownComplete
: TxAvailable
) |
847 (vp
->full_bus_master_rx
? UpComplete
: RxComplete
) |
848 (vp
->bus_master
? DMADone
: 0), ioaddr
+ EL3_CMD
);
849 /* Ack all pending events, and set active indicator mask. */
850 outw(AckIntr
| IntLatch
| TxAvailable
| RxEarly
| IntReq
,
852 outw(SetIntrEnb
| IntLatch
| TxAvailable
| RxComplete
| StatsFull
853 | (vp
->bus_master
? DMADone
: 0) | UpComplete
| DownComplete
,
859 static void corkscrew_timer(unsigned long data
)
862 struct net_device
*dev
= (struct net_device
*) data
;
863 struct corkscrew_private
*vp
= netdev_priv(dev
);
864 int ioaddr
= dev
->base_addr
;
868 if (corkscrew_debug
> 1)
869 printk("%s: Media selection timer tick happened, %s.\n",
870 dev
->name
, media_tbl
[dev
->if_port
].name
);
872 spin_lock_irqsave(&vp
->lock
, flags
);
875 int old_window
= inw(ioaddr
+ EL3_CMD
) >> 13;
878 media_status
= inw(ioaddr
+ Wn4_Media
);
879 switch (dev
->if_port
) {
882 case 5: /* 10baseT, 100baseTX, 100baseFX */
883 if (media_status
& Media_LnkBeat
) {
885 if (corkscrew_debug
> 1)
886 printk("%s: Media %s has link beat, %x.\n",
888 media_tbl
[dev
->if_port
].name
,
890 } else if (corkscrew_debug
> 1)
891 printk("%s: Media %s is has no link beat, %x.\n",
893 media_tbl
[dev
->if_port
].name
,
897 default: /* Other media types handled by Tx timeouts. */
898 if (corkscrew_debug
> 1)
899 printk("%s: Media %s is has no indication, %x.\n",
901 media_tbl
[dev
->if_port
].name
,
910 media_tbl
[dev
->if_port
].next
;
912 while (!(vp
->available_media
& media_tbl
[dev
->if_port
].mask
));
914 if (dev
->if_port
== 8) { /* Go back to default. */
915 dev
->if_port
= vp
->default_media
;
916 if (corkscrew_debug
> 1)
917 printk("%s: Media selection failing, using default %s port.\n",
919 media_tbl
[dev
->if_port
].name
);
921 if (corkscrew_debug
> 1)
922 printk("%s: Media selection failed, now trying %s port.\n",
924 media_tbl
[dev
->if_port
].name
);
925 vp
->timer
.expires
= jiffies
+ media_tbl
[dev
->if_port
].wait
;
926 add_timer(&vp
->timer
);
928 outw((media_status
& ~(Media_10TP
| Media_SQE
)) |
929 media_tbl
[dev
->if_port
].media_bits
,
933 config
= inl(ioaddr
+ Wn3_Config
);
934 config
= (config
& ~Xcvr
) | (dev
->if_port
<< Xcvr_shift
);
935 outl(config
, ioaddr
+ Wn3_Config
);
937 outw(dev
->if_port
== 3 ? StartCoax
: StopCoax
,
940 EL3WINDOW(old_window
);
943 spin_unlock_irqrestore(&vp
->lock
, flags
);
944 if (corkscrew_debug
> 1)
945 printk("%s: Media selection timer finished, %s.\n",
946 dev
->name
, media_tbl
[dev
->if_port
].name
);
948 #endif /* AUTOMEDIA */
952 static void corkscrew_timeout(struct net_device
*dev
)
955 struct corkscrew_private
*vp
= netdev_priv(dev
);
956 int ioaddr
= dev
->base_addr
;
959 "%s: transmit timed out, tx_status %2.2x status %4.4x.\n",
960 dev
->name
, inb(ioaddr
+ TxStatus
),
961 inw(ioaddr
+ EL3_STATUS
));
962 /* Slight code bloat to be user friendly. */
963 if ((inb(ioaddr
+ TxStatus
) & 0x88) == 0x88)
965 "%s: Transmitter encountered 16 collisions -- network"
966 " network cable problem?\n", dev
->name
);
967 #ifndef final_version
968 printk(" Flags; bus-master %d, full %d; dirty %d current %d.\n",
969 vp
->full_bus_master_tx
, vp
->tx_full
, vp
->dirty_tx
,
971 printk(" Down list %8.8x vs. %p.\n", inl(ioaddr
+ DownListPtr
),
973 for (i
= 0; i
< TX_RING_SIZE
; i
++) {
974 printk(" %d: %p length %8.8x status %8.8x\n", i
,
976 vp
->tx_ring
[i
].length
, vp
->tx_ring
[i
].status
);
979 /* Issue TX_RESET and TX_START commands. */
980 outw(TxReset
, ioaddr
+ EL3_CMD
);
981 for (i
= 20; i
>= 0; i
--)
982 if (!(inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
984 outw(TxEnable
, ioaddr
+ EL3_CMD
);
985 dev
->trans_start
= jiffies
;
986 vp
->stats
.tx_errors
++;
987 vp
->stats
.tx_dropped
++;
988 netif_wake_queue(dev
);
991 static int corkscrew_start_xmit(struct sk_buff
*skb
,
992 struct net_device
*dev
)
994 struct corkscrew_private
*vp
= netdev_priv(dev
);
995 int ioaddr
= dev
->base_addr
;
997 /* Block a timer-based transmit from overlapping. */
999 netif_stop_queue(dev
);
1001 if (vp
->full_bus_master_tx
) { /* BOOMERANG bus-master */
1002 /* Calculate the next Tx descriptor entry. */
1003 int entry
= vp
->cur_tx
% TX_RING_SIZE
;
1004 struct boom_tx_desc
*prev_entry
;
1005 unsigned long flags
;
1008 if (vp
->tx_full
) /* No room to transmit with */
1010 if (vp
->cur_tx
!= 0)
1011 prev_entry
= &vp
->tx_ring
[(vp
->cur_tx
- 1) % TX_RING_SIZE
];
1014 if (corkscrew_debug
> 3)
1015 printk("%s: Trying to send a packet, Tx index %d.\n",
1016 dev
->name
, vp
->cur_tx
);
1017 /* vp->tx_full = 1; */
1018 vp
->tx_skbuff
[entry
] = skb
;
1019 vp
->tx_ring
[entry
].next
= 0;
1020 vp
->tx_ring
[entry
].addr
= isa_virt_to_bus(skb
->data
);
1021 vp
->tx_ring
[entry
].length
= skb
->len
| 0x80000000;
1022 vp
->tx_ring
[entry
].status
= skb
->len
| 0x80000000;
1024 spin_lock_irqsave(&vp
->lock
, flags
);
1025 outw(DownStall
, ioaddr
+ EL3_CMD
);
1026 /* Wait for the stall to complete. */
1027 for (i
= 20; i
>= 0; i
--)
1028 if ((inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
) == 0)
1031 prev_entry
->next
= isa_virt_to_bus(&vp
->tx_ring
[entry
]);
1032 if (inl(ioaddr
+ DownListPtr
) == 0) {
1033 outl(isa_virt_to_bus(&vp
->tx_ring
[entry
]),
1034 ioaddr
+ DownListPtr
);
1037 outw(DownUnstall
, ioaddr
+ EL3_CMD
);
1038 spin_unlock_irqrestore(&vp
->lock
, flags
);
1041 if (vp
->cur_tx
- vp
->dirty_tx
> TX_RING_SIZE
- 1)
1043 else { /* Clear previous interrupt enable. */
1045 prev_entry
->status
&= ~0x80000000;
1046 netif_wake_queue(dev
);
1048 dev
->trans_start
= jiffies
;
1051 /* Put out the doubleword header... */
1052 outl(skb
->len
, ioaddr
+ TX_FIFO
);
1053 vp
->stats
.tx_bytes
+= skb
->len
;
1054 #ifdef VORTEX_BUS_MASTER
1055 if (vp
->bus_master
) {
1056 /* Set the bus-master controller to transfer the packet. */
1057 outl((int) (skb
->data
), ioaddr
+ Wn7_MasterAddr
);
1058 outw((skb
->len
+ 3) & ~3, ioaddr
+ Wn7_MasterLen
);
1060 outw(StartDMADown
, ioaddr
+ EL3_CMD
);
1061 /* queue will be woken at the DMADone interrupt. */
1063 /* ... and the packet rounded to a doubleword. */
1064 outsl(ioaddr
+ TX_FIFO
, skb
->data
, (skb
->len
+ 3) >> 2);
1066 if (inw(ioaddr
+ TxFree
) > 1536) {
1067 netif_wake_queue(dev
);
1069 /* Interrupt us when the FIFO has room for max-sized packet. */
1070 outw(SetTxThreshold
+ (1536 >> 2),
1074 /* ... and the packet rounded to a doubleword. */
1075 outsl(ioaddr
+ TX_FIFO
, skb
->data
, (skb
->len
+ 3) >> 2);
1077 if (inw(ioaddr
+ TxFree
) > 1536) {
1078 netif_wake_queue(dev
);
1080 /* Interrupt us when the FIFO has room for max-sized packet. */
1081 outw(SetTxThreshold
+ (1536 >> 2), ioaddr
+ EL3_CMD
);
1082 #endif /* bus master */
1084 dev
->trans_start
= jiffies
;
1086 /* Clear the Tx status stack. */
1091 while (--i
> 0 && (tx_status
= inb(ioaddr
+ TxStatus
)) > 0) {
1092 if (tx_status
& 0x3C) { /* A Tx-disabling error occurred. */
1093 if (corkscrew_debug
> 2)
1094 printk("%s: Tx error, status %2.2x.\n",
1095 dev
->name
, tx_status
);
1096 if (tx_status
& 0x04)
1097 vp
->stats
.tx_fifo_errors
++;
1098 if (tx_status
& 0x38)
1099 vp
->stats
.tx_aborted_errors
++;
1100 if (tx_status
& 0x30) {
1102 outw(TxReset
, ioaddr
+ EL3_CMD
);
1103 for (j
= 20; j
>= 0; j
--)
1104 if (!(inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
1107 outw(TxEnable
, ioaddr
+ EL3_CMD
);
1109 outb(0x00, ioaddr
+ TxStatus
); /* Pop the status stack. */
1115 /* The interrupt handler does all of the Rx thread work and cleans up
1116 after the Tx thread. */
1118 static irqreturn_t
corkscrew_interrupt(int irq
, void *dev_id
)
1120 /* Use the now-standard shared IRQ implementation. */
1121 struct net_device
*dev
= dev_id
;
1122 struct corkscrew_private
*lp
= netdev_priv(dev
);
1125 int i
= max_interrupt_work
;
1127 ioaddr
= dev
->base_addr
;
1128 latency
= inb(ioaddr
+ Timer
);
1130 spin_lock(&lp
->lock
);
1132 status
= inw(ioaddr
+ EL3_STATUS
);
1134 if (corkscrew_debug
> 4)
1135 printk("%s: interrupt, status %4.4x, timer %d.\n",
1136 dev
->name
, status
, latency
);
1137 if ((status
& 0xE000) != 0xE000) {
1138 static int donedidthis
;
1139 /* Some interrupt controllers store a bogus interrupt from boot-time.
1140 Ignore a single early interrupt, but don't hang the machine for
1141 other interrupt problems. */
1142 if (donedidthis
++ > 100) {
1143 printk(KERN_ERR
"%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n",
1144 dev
->name
, status
, netif_running(dev
));
1145 free_irq(dev
->irq
, dev
);
1151 if (corkscrew_debug
> 5)
1152 printk("%s: In interrupt loop, status %4.4x.\n",
1154 if (status
& RxComplete
)
1157 if (status
& TxAvailable
) {
1158 if (corkscrew_debug
> 5)
1159 printk(" TX room bit was handled.\n");
1160 /* There's room in the FIFO for a full-sized packet. */
1161 outw(AckIntr
| TxAvailable
, ioaddr
+ EL3_CMD
);
1162 netif_wake_queue(dev
);
1164 if (status
& DownComplete
) {
1165 unsigned int dirty_tx
= lp
->dirty_tx
;
1167 while (lp
->cur_tx
- dirty_tx
> 0) {
1168 int entry
= dirty_tx
% TX_RING_SIZE
;
1169 if (inl(ioaddr
+ DownListPtr
) == isa_virt_to_bus(&lp
->tx_ring
[entry
]))
1170 break; /* It still hasn't been processed. */
1171 if (lp
->tx_skbuff
[entry
]) {
1172 dev_kfree_skb_irq(lp
->tx_skbuff
[entry
]);
1173 lp
->tx_skbuff
[entry
] = NULL
;
1177 lp
->dirty_tx
= dirty_tx
;
1178 outw(AckIntr
| DownComplete
, ioaddr
+ EL3_CMD
);
1179 if (lp
->tx_full
&& (lp
->cur_tx
- dirty_tx
<= TX_RING_SIZE
- 1)) {
1181 netif_wake_queue(dev
);
1184 #ifdef VORTEX_BUS_MASTER
1185 if (status
& DMADone
) {
1186 outw(0x1000, ioaddr
+ Wn7_MasterStatus
); /* Ack the event. */
1187 dev_kfree_skb_irq(lp
->tx_skb
); /* Release the transferred buffer */
1188 netif_wake_queue(dev
);
1191 if (status
& UpComplete
) {
1193 outw(AckIntr
| UpComplete
, ioaddr
+ EL3_CMD
);
1195 if (status
& (AdapterFailure
| RxEarly
| StatsFull
)) {
1196 /* Handle all uncommon interrupts at once. */
1197 if (status
& RxEarly
) { /* Rx early is unused. */
1199 outw(AckIntr
| RxEarly
, ioaddr
+ EL3_CMD
);
1201 if (status
& StatsFull
) { /* Empty statistics. */
1202 static int DoneDidThat
;
1203 if (corkscrew_debug
> 4)
1204 printk("%s: Updating stats.\n", dev
->name
);
1205 update_stats(ioaddr
, dev
);
1206 /* DEBUG HACK: Disable statistics as an interrupt source. */
1207 /* This occurs when we have the wrong media type! */
1208 if (DoneDidThat
== 0 && inw(ioaddr
+ EL3_STATUS
) & StatsFull
) {
1210 printk("%s: Updating stats failed, disabling stats as an"
1211 " interrupt source.\n", dev
->name
);
1212 for (win
= 0; win
< 8; win
++) {
1214 printk("\n Vortex window %d:", win
);
1215 for (reg
= 0; reg
< 16; reg
++)
1216 printk(" %2.2x", inb(ioaddr
+ reg
));
1219 outw(SetIntrEnb
| TxAvailable
|
1220 RxComplete
| AdapterFailure
|
1221 UpComplete
| DownComplete
|
1222 TxComplete
, ioaddr
+ EL3_CMD
);
1226 if (status
& AdapterFailure
) {
1227 /* Adapter failure requires Rx reset and reinit. */
1228 outw(RxReset
, ioaddr
+ EL3_CMD
);
1229 /* Set the Rx filter to the current state. */
1231 outw(RxEnable
, ioaddr
+ EL3_CMD
); /* Re-enable the receiver. */
1232 outw(AckIntr
| AdapterFailure
,
1238 printk(KERN_ERR
"%s: Too much work in interrupt, status %4.4x. "
1239 "Disabling functions (%4.4x).\n", dev
->name
,
1240 status
, SetStatusEnb
| ((~status
) & 0x7FE));
1241 /* Disable all pending interrupts. */
1242 outw(SetStatusEnb
| ((~status
) & 0x7FE), ioaddr
+ EL3_CMD
);
1243 outw(AckIntr
| 0x7FF, ioaddr
+ EL3_CMD
);
1246 /* Acknowledge the IRQ. */
1247 outw(AckIntr
| IntReq
| IntLatch
, ioaddr
+ EL3_CMD
);
1249 } while ((status
= inw(ioaddr
+ EL3_STATUS
)) & (IntLatch
| RxComplete
));
1251 spin_unlock(&lp
->lock
);
1253 if (corkscrew_debug
> 4)
1254 printk("%s: exiting interrupt, status %4.4x.\n", dev
->name
, status
);
1258 static int corkscrew_rx(struct net_device
*dev
)
1260 struct corkscrew_private
*vp
= netdev_priv(dev
);
1261 int ioaddr
= dev
->base_addr
;
1265 if (corkscrew_debug
> 5)
1266 printk(" In rx_packet(), status %4.4x, rx_status %4.4x.\n",
1267 inw(ioaddr
+ EL3_STATUS
), inw(ioaddr
+ RxStatus
));
1268 while ((rx_status
= inw(ioaddr
+ RxStatus
)) > 0) {
1269 if (rx_status
& 0x4000) { /* Error, update stats. */
1270 unsigned char rx_error
= inb(ioaddr
+ RxErrors
);
1271 if (corkscrew_debug
> 2)
1272 printk(" Rx error: status %2.2x.\n",
1274 vp
->stats
.rx_errors
++;
1275 if (rx_error
& 0x01)
1276 vp
->stats
.rx_over_errors
++;
1277 if (rx_error
& 0x02)
1278 vp
->stats
.rx_length_errors
++;
1279 if (rx_error
& 0x04)
1280 vp
->stats
.rx_frame_errors
++;
1281 if (rx_error
& 0x08)
1282 vp
->stats
.rx_crc_errors
++;
1283 if (rx_error
& 0x10)
1284 vp
->stats
.rx_length_errors
++;
1286 /* The packet length: up to 4.5K!. */
1287 short pkt_len
= rx_status
& 0x1fff;
1288 struct sk_buff
*skb
;
1290 skb
= dev_alloc_skb(pkt_len
+ 5 + 2);
1291 if (corkscrew_debug
> 4)
1292 printk("Receiving packet size %d status %4.4x.\n",
1293 pkt_len
, rx_status
);
1295 skb_reserve(skb
, 2); /* Align IP on 16 byte boundaries */
1296 /* 'skb_put()' points to the start of sk_buff data area. */
1297 insl(ioaddr
+ RX_FIFO
,
1298 skb_put(skb
, pkt_len
),
1299 (pkt_len
+ 3) >> 2);
1300 outw(RxDiscard
, ioaddr
+ EL3_CMD
); /* Pop top Rx packet. */
1301 skb
->protocol
= eth_type_trans(skb
, dev
);
1303 dev
->last_rx
= jiffies
;
1304 vp
->stats
.rx_packets
++;
1305 vp
->stats
.rx_bytes
+= pkt_len
;
1306 /* Wait a limited time to go to next packet. */
1307 for (i
= 200; i
>= 0; i
--)
1308 if (! (inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
1311 } else if (corkscrew_debug
)
1312 printk("%s: Couldn't allocate a sk_buff of size %d.\n", dev
->name
, pkt_len
);
1314 outw(RxDiscard
, ioaddr
+ EL3_CMD
);
1315 vp
->stats
.rx_dropped
++;
1316 /* Wait a limited time to skip this packet. */
1317 for (i
= 200; i
>= 0; i
--)
1318 if (!(inw(ioaddr
+ EL3_STATUS
) & CmdInProgress
))
1324 static int boomerang_rx(struct net_device
*dev
)
1326 struct corkscrew_private
*vp
= netdev_priv(dev
);
1327 int entry
= vp
->cur_rx
% RX_RING_SIZE
;
1328 int ioaddr
= dev
->base_addr
;
1331 if (corkscrew_debug
> 5)
1332 printk(" In boomerang_rx(), status %4.4x, rx_status %4.4x.\n",
1333 inw(ioaddr
+ EL3_STATUS
), inw(ioaddr
+ RxStatus
));
1334 while ((rx_status
= vp
->rx_ring
[entry
].status
) & RxDComplete
) {
1335 if (rx_status
& RxDError
) { /* Error, update stats. */
1336 unsigned char rx_error
= rx_status
>> 16;
1337 if (corkscrew_debug
> 2)
1338 printk(" Rx error: status %2.2x.\n",
1340 vp
->stats
.rx_errors
++;
1341 if (rx_error
& 0x01)
1342 vp
->stats
.rx_over_errors
++;
1343 if (rx_error
& 0x02)
1344 vp
->stats
.rx_length_errors
++;
1345 if (rx_error
& 0x04)
1346 vp
->stats
.rx_frame_errors
++;
1347 if (rx_error
& 0x08)
1348 vp
->stats
.rx_crc_errors
++;
1349 if (rx_error
& 0x10)
1350 vp
->stats
.rx_length_errors
++;
1352 /* The packet length: up to 4.5K!. */
1353 short pkt_len
= rx_status
& 0x1fff;
1354 struct sk_buff
*skb
;
1356 vp
->stats
.rx_bytes
+= pkt_len
;
1357 if (corkscrew_debug
> 4)
1358 printk("Receiving packet size %d status %4.4x.\n",
1359 pkt_len
, rx_status
);
1361 /* Check if the packet is long enough to just accept without
1362 copying to a properly sized skbuff. */
1363 if (pkt_len
< rx_copybreak
1364 && (skb
= dev_alloc_skb(pkt_len
+ 4)) != NULL
) {
1365 skb_reserve(skb
, 2); /* Align IP on 16 byte boundaries */
1366 /* 'skb_put()' points to the start of sk_buff data area. */
1367 memcpy(skb_put(skb
, pkt_len
),
1368 isa_bus_to_virt(vp
->rx_ring
[entry
].
1373 /* Pass up the skbuff already on the Rx ring. */
1374 skb
= vp
->rx_skbuff
[entry
];
1375 vp
->rx_skbuff
[entry
] = NULL
;
1376 temp
= skb_put(skb
, pkt_len
);
1377 /* Remove this checking code for final release. */
1378 if (isa_bus_to_virt(vp
->rx_ring
[entry
].addr
) != temp
)
1379 printk("%s: Warning -- the skbuff addresses do not match"
1380 " in boomerang_rx: %p vs. %p / %p.\n",
1382 isa_bus_to_virt(vp
->
1388 skb
->protocol
= eth_type_trans(skb
, dev
);
1390 dev
->last_rx
= jiffies
;
1391 vp
->stats
.rx_packets
++;
1393 entry
= (++vp
->cur_rx
) % RX_RING_SIZE
;
1395 /* Refill the Rx ring buffers. */
1396 for (; vp
->cur_rx
- vp
->dirty_rx
> 0; vp
->dirty_rx
++) {
1397 struct sk_buff
*skb
;
1398 entry
= vp
->dirty_rx
% RX_RING_SIZE
;
1399 if (vp
->rx_skbuff
[entry
] == NULL
) {
1400 skb
= dev_alloc_skb(PKT_BUF_SZ
);
1402 break; /* Bad news! */
1403 skb
->dev
= dev
; /* Mark as being used by this device. */
1404 skb_reserve(skb
, 2); /* Align IP on 16 byte boundaries */
1405 vp
->rx_ring
[entry
].addr
= isa_virt_to_bus(skb
->data
);
1406 vp
->rx_skbuff
[entry
] = skb
;
1408 vp
->rx_ring
[entry
].status
= 0; /* Clear complete bit. */
1413 static int corkscrew_close(struct net_device
*dev
)
1415 struct corkscrew_private
*vp
= netdev_priv(dev
);
1416 int ioaddr
= dev
->base_addr
;
1419 netif_stop_queue(dev
);
1421 if (corkscrew_debug
> 1) {
1422 printk("%s: corkscrew_close() status %4.4x, Tx status %2.2x.\n",
1423 dev
->name
, inw(ioaddr
+ EL3_STATUS
),
1424 inb(ioaddr
+ TxStatus
));
1425 printk("%s: corkscrew close stats: rx_nocopy %d rx_copy %d"
1426 " tx_queued %d.\n", dev
->name
, rx_nocopy
, rx_copy
,
1430 del_timer(&vp
->timer
);
1432 /* Turn off statistics ASAP. We update lp->stats below. */
1433 outw(StatsDisable
, ioaddr
+ EL3_CMD
);
1435 /* Disable the receiver and transmitter. */
1436 outw(RxDisable
, ioaddr
+ EL3_CMD
);
1437 outw(TxDisable
, ioaddr
+ EL3_CMD
);
1439 if (dev
->if_port
== XCVR_10base2
)
1440 /* Turn off thinnet power. Green! */
1441 outw(StopCoax
, ioaddr
+ EL3_CMD
);
1443 free_irq(dev
->irq
, dev
);
1445 outw(SetIntrEnb
| 0x0000, ioaddr
+ EL3_CMD
);
1447 update_stats(ioaddr
, dev
);
1448 if (vp
->full_bus_master_rx
) { /* Free Boomerang bus master Rx buffers. */
1449 outl(0, ioaddr
+ UpListPtr
);
1450 for (i
= 0; i
< RX_RING_SIZE
; i
++)
1451 if (vp
->rx_skbuff
[i
]) {
1452 dev_kfree_skb(vp
->rx_skbuff
[i
]);
1453 vp
->rx_skbuff
[i
] = NULL
;
1456 if (vp
->full_bus_master_tx
) { /* Free Boomerang bus master Tx buffers. */
1457 outl(0, ioaddr
+ DownListPtr
);
1458 for (i
= 0; i
< TX_RING_SIZE
; i
++)
1459 if (vp
->tx_skbuff
[i
]) {
1460 dev_kfree_skb(vp
->tx_skbuff
[i
]);
1461 vp
->tx_skbuff
[i
] = NULL
;
1468 static struct net_device_stats
*corkscrew_get_stats(struct net_device
*dev
)
1470 struct corkscrew_private
*vp
= netdev_priv(dev
);
1471 unsigned long flags
;
1473 if (netif_running(dev
)) {
1474 spin_lock_irqsave(&vp
->lock
, flags
);
1475 update_stats(dev
->base_addr
, dev
);
1476 spin_unlock_irqrestore(&vp
->lock
, flags
);
1481 /* Update statistics.
1482 Unlike with the EL3 we need not worry about interrupts changing
1483 the window setting from underneath us, but we must still guard
1484 against a race condition with a StatsUpdate interrupt updating the
1485 table. This is done by checking that the ASM (!) code generated uses
1486 atomic updates with '+='.
1488 static void update_stats(int ioaddr
, struct net_device
*dev
)
1490 struct corkscrew_private
*vp
= netdev_priv(dev
);
1492 /* Unlike the 3c5x9 we need not turn off stats updates while reading. */
1493 /* Switch to the stats window, and read everything. */
1495 vp
->stats
.tx_carrier_errors
+= inb(ioaddr
+ 0);
1496 vp
->stats
.tx_heartbeat_errors
+= inb(ioaddr
+ 1);
1497 /* Multiple collisions. */ inb(ioaddr
+ 2);
1498 vp
->stats
.collisions
+= inb(ioaddr
+ 3);
1499 vp
->stats
.tx_window_errors
+= inb(ioaddr
+ 4);
1500 vp
->stats
.rx_fifo_errors
+= inb(ioaddr
+ 5);
1501 vp
->stats
.tx_packets
+= inb(ioaddr
+ 6);
1502 vp
->stats
.tx_packets
+= (inb(ioaddr
+ 9) & 0x30) << 4;
1503 /* Rx packets */ inb(ioaddr
+ 7);
1504 /* Must read to clear */
1505 /* Tx deferrals */ inb(ioaddr
+ 8);
1506 /* Don't bother with register 9, an extension of registers 6&7.
1507 If we do use the 6&7 values the atomic update assumption above
1509 inw(ioaddr
+ 10); /* Total Rx and Tx octets. */
1511 /* New: On the Vortex we must also clear the BadSSD counter. */
1515 /* We change back to window 7 (not 1) with the Vortex. */
1520 /* This new version of set_rx_mode() supports v1.4 kernels.
1521 The Vortex chip has no documented multicast filter, so the only
1522 multicast setting is to receive all multicast frames. At least
1523 the chip has a very clean way to set the mode, unlike many others. */
1524 static void set_rx_mode(struct net_device
*dev
)
1526 int ioaddr
= dev
->base_addr
;
1529 if (dev
->flags
& IFF_PROMISC
) {
1530 if (corkscrew_debug
> 3)
1531 printk("%s: Setting promiscuous mode.\n",
1533 new_mode
= SetRxFilter
| RxStation
| RxMulticast
| RxBroadcast
| RxProm
;
1534 } else if ((dev
->mc_list
) || (dev
->flags
& IFF_ALLMULTI
)) {
1535 new_mode
= SetRxFilter
| RxStation
| RxMulticast
| RxBroadcast
;
1537 new_mode
= SetRxFilter
| RxStation
| RxBroadcast
;
1539 outw(new_mode
, ioaddr
+ EL3_CMD
);
1542 static void netdev_get_drvinfo(struct net_device
*dev
,
1543 struct ethtool_drvinfo
*info
)
1545 strcpy(info
->driver
, DRV_NAME
);
1546 strcpy(info
->version
, DRV_VERSION
);
1547 sprintf(info
->bus_info
, "ISA 0x%lx", dev
->base_addr
);
1550 static u32
netdev_get_msglevel(struct net_device
*dev
)
1552 return corkscrew_debug
;
1555 static void netdev_set_msglevel(struct net_device
*dev
, u32 level
)
1557 corkscrew_debug
= level
;
1560 static const struct ethtool_ops netdev_ethtool_ops
= {
1561 .get_drvinfo
= netdev_get_drvinfo
,
1562 .get_msglevel
= netdev_get_msglevel
,
1563 .set_msglevel
= netdev_set_msglevel
,
1568 void cleanup_module(void)
1570 while (!list_empty(&root_corkscrew_dev
)) {
1571 struct net_device
*dev
;
1572 struct corkscrew_private
*vp
;
1574 vp
= list_entry(root_corkscrew_dev
.next
,
1575 struct corkscrew_private
, list
);
1577 unregister_netdev(dev
);
1586 * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c515.c"