blob: 1b5edd646a8c924c835129280d9ad964186676f6 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* de2104x.c: A Linux PCI Ethernet driver for Intel/Digital 21040/1 chips. */
2/*
3 Copyright 2001,2003 Jeff Garzik <jgarzik@pobox.com>
4
5 Copyright 1994, 1995 Digital Equipment Corporation. [de4x5.c]
6 Written/copyright 1994-2001 by Donald Becker. [tulip.c]
7
8 This software may be used and distributed according to the terms of
9 the GNU General Public License (GPL), incorporated herein by reference.
10 Drivers based on or derived from this code fall under the GPL and must
11 retain the authorship, copyright and license notice. This file is not
12 a complete program and may only be used when the entire operating
13 system is licensed under the GPL.
14
15 See the file COPYING in this distribution for more information.
16
17 TODO, in rough priority order:
18 * Support forcing media type with a module parameter,
19 like dl2k.c/sundance.c
20 * Constants (module parms?) for Rx work limit
21 * Complete reset on PciErr
22 * Jumbo frames / dev->change_mtu
23 * Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error
24 * Adjust Tx FIFO threshold and Max Tx DMA burst on Tx FIFO error
25 * Implement Tx software interrupt mitigation via
26 Tx descriptor bit
27
28 */
29
30#define DRV_NAME "de2104x"
31#define DRV_VERSION "0.7"
32#define DRV_RELDATE "Mar 17, 2004"
33
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include <linux/module.h>
35#include <linux/kernel.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/init.h>
39#include <linux/pci.h>
40#include <linux/delay.h>
41#include <linux/ethtool.h>
42#include <linux/compiler.h>
43#include <linux/rtnetlink.h>
44#include <linux/crc32.h>
45
46#include <asm/io.h>
47#include <asm/irq.h>
48#include <asm/uaccess.h>
49#include <asm/unaligned.h>
50
51/* These identify the driver base version and may not be removed. */
52static char version[] =
53KERN_INFO DRV_NAME " PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n";
54
55MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>");
56MODULE_DESCRIPTION("Intel/Digital 21040/1 series PCI Ethernet driver");
57MODULE_LICENSE("GPL");
58MODULE_VERSION(DRV_VERSION);
59
60static int debug = -1;
61module_param (debug, int, 0);
62MODULE_PARM_DESC (debug, "de2104x bitmapped message enable number");
63
64/* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
65#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) \
David S. Miller49345102007-03-29 01:39:44 -070066 || defined(CONFIG_SPARC) || defined(__ia64__) \
Linus Torvalds1da177e2005-04-16 15:20:36 -070067 || defined(__sh__) || defined(__mips__)
68static int rx_copybreak = 1518;
69#else
70static int rx_copybreak = 100;
71#endif
72module_param (rx_copybreak, int, 0);
73MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copied");
74
75#define PFX DRV_NAME ": "
76
77#define DE_DEF_MSG_ENABLE (NETIF_MSG_DRV | \
78 NETIF_MSG_PROBE | \
79 NETIF_MSG_LINK | \
80 NETIF_MSG_IFDOWN | \
81 NETIF_MSG_IFUP | \
82 NETIF_MSG_RX_ERR | \
83 NETIF_MSG_TX_ERR)
84
85#define DE_RX_RING_SIZE 64
86#define DE_TX_RING_SIZE 64
87#define DE_RING_BYTES \
88 ((sizeof(struct de_desc) * DE_RX_RING_SIZE) + \
89 (sizeof(struct de_desc) * DE_TX_RING_SIZE))
90#define NEXT_TX(N) (((N) + 1) & (DE_TX_RING_SIZE - 1))
91#define NEXT_RX(N) (((N) + 1) & (DE_RX_RING_SIZE - 1))
92#define TX_BUFFS_AVAIL(CP) \
93 (((CP)->tx_tail <= (CP)->tx_head) ? \
94 (CP)->tx_tail + (DE_TX_RING_SIZE - 1) - (CP)->tx_head : \
95 (CP)->tx_tail - (CP)->tx_head - 1)
96
97#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
98#define RX_OFFSET 2
99
100#define DE_SETUP_SKB ((struct sk_buff *) 1)
101#define DE_DUMMY_SKB ((struct sk_buff *) 2)
102#define DE_SETUP_FRAME_WORDS 96
103#define DE_EEPROM_WORDS 256
104#define DE_EEPROM_SIZE (DE_EEPROM_WORDS * sizeof(u16))
105#define DE_MAX_MEDIA 5
106
107#define DE_MEDIA_TP_AUTO 0
108#define DE_MEDIA_BNC 1
109#define DE_MEDIA_AUI 2
110#define DE_MEDIA_TP 3
111#define DE_MEDIA_TP_FD 4
112#define DE_MEDIA_INVALID DE_MAX_MEDIA
113#define DE_MEDIA_FIRST 0
114#define DE_MEDIA_LAST (DE_MAX_MEDIA - 1)
115#define DE_AUI_BNC (SUPPORTED_AUI | SUPPORTED_BNC)
116
117#define DE_TIMER_LINK (60 * HZ)
118#define DE_TIMER_NO_LINK (5 * HZ)
119
120#define DE_NUM_REGS 16
121#define DE_REGS_SIZE (DE_NUM_REGS * sizeof(u32))
122#define DE_REGS_VER 1
123
124/* Time in jiffies before concluding the transmitter is hung. */
125#define TX_TIMEOUT (6*HZ)
126
127#define DE_UNALIGNED_16(a) (u16)(get_unaligned((u16 *)(a)))
128
129/* This is a mysterious value that can be written to CSR11 in the 21040 (only)
130 to support a pre-NWay full-duplex signaling mechanism using short frames.
131 No one knows what it should be, but if left at its default value some
132 10base2(!) packets trigger a full-duplex-request interrupt. */
133#define FULL_DUPLEX_MAGIC 0x6969
134
135enum {
136 /* NIC registers */
137 BusMode = 0x00,
138 TxPoll = 0x08,
139 RxPoll = 0x10,
140 RxRingAddr = 0x18,
141 TxRingAddr = 0x20,
142 MacStatus = 0x28,
143 MacMode = 0x30,
144 IntrMask = 0x38,
145 RxMissed = 0x40,
146 ROMCmd = 0x48,
147 CSR11 = 0x58,
148 SIAStatus = 0x60,
149 CSR13 = 0x68,
150 CSR14 = 0x70,
151 CSR15 = 0x78,
152 PCIPM = 0x40,
153
154 /* BusMode bits */
155 CmdReset = (1 << 0),
156 CacheAlign16 = 0x00008000,
157 BurstLen4 = 0x00000400,
158
159 /* Rx/TxPoll bits */
160 NormalTxPoll = (1 << 0),
161 NormalRxPoll = (1 << 0),
162
163 /* Tx/Rx descriptor status bits */
164 DescOwn = (1 << 31),
165 RxError = (1 << 15),
166 RxErrLong = (1 << 7),
167 RxErrCRC = (1 << 1),
168 RxErrFIFO = (1 << 0),
169 RxErrRunt = (1 << 11),
170 RxErrFrame = (1 << 14),
171 RingEnd = (1 << 25),
172 FirstFrag = (1 << 29),
173 LastFrag = (1 << 30),
174 TxError = (1 << 15),
175 TxFIFOUnder = (1 << 1),
176 TxLinkFail = (1 << 2) | (1 << 10) | (1 << 11),
177 TxMaxCol = (1 << 8),
178 TxOWC = (1 << 9),
179 TxJabber = (1 << 14),
180 SetupFrame = (1 << 27),
181 TxSwInt = (1 << 31),
182
183 /* MacStatus bits */
184 IntrOK = (1 << 16),
185 IntrErr = (1 << 15),
186 RxIntr = (1 << 6),
187 RxEmpty = (1 << 7),
188 TxIntr = (1 << 0),
189 TxEmpty = (1 << 2),
190 PciErr = (1 << 13),
191 TxState = (1 << 22) | (1 << 21) | (1 << 20),
192 RxState = (1 << 19) | (1 << 18) | (1 << 17),
193 LinkFail = (1 << 12),
194 LinkPass = (1 << 4),
195 RxStopped = (1 << 8),
196 TxStopped = (1 << 1),
197
198 /* MacMode bits */
199 TxEnable = (1 << 13),
200 RxEnable = (1 << 1),
201 RxTx = TxEnable | RxEnable,
202 FullDuplex = (1 << 9),
203 AcceptAllMulticast = (1 << 7),
204 AcceptAllPhys = (1 << 6),
205 BOCnt = (1 << 5),
206 MacModeClear = (1<<12) | (1<<11) | (1<<10) | (1<<8) | (1<<3) |
207 RxTx | BOCnt | AcceptAllPhys | AcceptAllMulticast,
208
209 /* ROMCmd bits */
210 EE_SHIFT_CLK = 0x02, /* EEPROM shift clock. */
211 EE_CS = 0x01, /* EEPROM chip select. */
212 EE_DATA_WRITE = 0x04, /* Data from the Tulip to EEPROM. */
213 EE_WRITE_0 = 0x01,
214 EE_WRITE_1 = 0x05,
215 EE_DATA_READ = 0x08, /* Data from the EEPROM chip. */
216 EE_ENB = (0x4800 | EE_CS),
217
218 /* The EEPROM commands include the alway-set leading bit. */
219 EE_READ_CMD = 6,
220
221 /* RxMissed bits */
222 RxMissedOver = (1 << 16),
223 RxMissedMask = 0xffff,
224
225 /* SROM-related bits */
226 SROMC0InfoLeaf = 27,
227 MediaBlockMask = 0x3f,
228 MediaCustomCSRs = (1 << 6),
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400229
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 /* PCIPM bits */
231 PM_Sleep = (1 << 31),
232 PM_Snooze = (1 << 30),
233 PM_Mask = PM_Sleep | PM_Snooze,
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400234
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 /* SIAStatus bits */
236 NWayState = (1 << 14) | (1 << 13) | (1 << 12),
237 NWayRestart = (1 << 12),
238 NonselPortActive = (1 << 9),
239 LinkFailStatus = (1 << 2),
240 NetCxnErr = (1 << 1),
241};
242
243static const u32 de_intr_mask =
244 IntrOK | IntrErr | RxIntr | RxEmpty | TxIntr | TxEmpty |
245 LinkPass | LinkFail | PciErr;
246
247/*
248 * Set the programmable burst length to 4 longwords for all:
249 * DMA errors result without these values. Cache align 16 long.
250 */
251static const u32 de_bus_mode = CacheAlign16 | BurstLen4;
252
253struct de_srom_media_block {
254 u8 opts;
255 u16 csr13;
256 u16 csr14;
257 u16 csr15;
258} __attribute__((packed));
259
260struct de_srom_info_leaf {
261 u16 default_media;
262 u8 n_blocks;
263 u8 unused;
264} __attribute__((packed));
265
266struct de_desc {
Al Viroc559a5b2007-08-23 00:43:22 -0400267 __le32 opts1;
268 __le32 opts2;
269 __le32 addr1;
270 __le32 addr2;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271};
272
273struct media_info {
274 u16 type; /* DE_MEDIA_xxx */
275 u16 csr13;
276 u16 csr14;
277 u16 csr15;
278};
279
280struct ring_info {
281 struct sk_buff *skb;
282 dma_addr_t mapping;
283};
284
285struct de_private {
286 unsigned tx_head;
287 unsigned tx_tail;
288 unsigned rx_tail;
289
290 void __iomem *regs;
291 struct net_device *dev;
292 spinlock_t lock;
293
294 struct de_desc *rx_ring;
295 struct de_desc *tx_ring;
296 struct ring_info tx_skb[DE_TX_RING_SIZE];
297 struct ring_info rx_skb[DE_RX_RING_SIZE];
298 unsigned rx_buf_sz;
299 dma_addr_t ring_dma;
300
301 u32 msg_enable;
302
303 struct net_device_stats net_stats;
304
305 struct pci_dev *pdev;
306
307 u16 setup_frame[DE_SETUP_FRAME_WORDS];
308
309 u32 media_type;
310 u32 media_supported;
311 u32 media_advertise;
312 struct media_info media[DE_MAX_MEDIA];
313 struct timer_list media_timer;
314
315 u8 *ee_data;
316 unsigned board_idx;
317 unsigned de21040 : 1;
318 unsigned media_lock : 1;
319};
320
321
322static void de_set_rx_mode (struct net_device *dev);
323static void de_tx (struct de_private *de);
324static void de_clean_rings (struct de_private *de);
325static void de_media_interrupt (struct de_private *de, u32 status);
326static void de21040_media_timer (unsigned long data);
327static void de21041_media_timer (unsigned long data);
328static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media);
329
330
331static struct pci_device_id de_pci_tbl[] = {
332 { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
333 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
334 { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
335 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
336 { },
337};
338MODULE_DEVICE_TABLE(pci, de_pci_tbl);
339
340static const char * const media_name[DE_MAX_MEDIA] = {
341 "10baseT auto",
342 "BNC",
343 "AUI",
344 "10baseT-HD",
345 "10baseT-FD"
346};
347
348/* 21040 transceiver register settings:
349 * TP AUTO(unused), BNC(unused), AUI, TP, TP FD*/
350static u16 t21040_csr13[] = { 0, 0, 0x8F09, 0x8F01, 0x8F01, };
351static u16 t21040_csr14[] = { 0, 0, 0x0705, 0xFFFF, 0xFFFD, };
352static u16 t21040_csr15[] = { 0, 0, 0x0006, 0x0000, 0x0000, };
353
354/* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
355static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
356static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
357static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
358
359
360#define dr32(reg) readl(de->regs + (reg))
361#define dw32(reg,val) writel((val), de->regs + (reg))
362
363
364static void de_rx_err_acct (struct de_private *de, unsigned rx_tail,
365 u32 status, u32 len)
366{
367 if (netif_msg_rx_err (de))
368 printk (KERN_DEBUG
369 "%s: rx err, slot %d status 0x%x len %d\n",
370 de->dev->name, rx_tail, status, len);
371
372 if ((status & 0x38000300) != 0x0300) {
373 /* Ingore earlier buffers. */
374 if ((status & 0xffff) != 0x7fff) {
375 if (netif_msg_rx_err(de))
376 printk(KERN_WARNING "%s: Oversized Ethernet frame "
377 "spanned multiple buffers, status %8.8x!\n",
378 de->dev->name, status);
379 de->net_stats.rx_length_errors++;
380 }
381 } else if (status & RxError) {
382 /* There was a fatal error. */
383 de->net_stats.rx_errors++; /* end of a packet.*/
384 if (status & 0x0890) de->net_stats.rx_length_errors++;
385 if (status & RxErrCRC) de->net_stats.rx_crc_errors++;
386 if (status & RxErrFIFO) de->net_stats.rx_fifo_errors++;
387 }
388}
389
390static void de_rx (struct de_private *de)
391{
392 unsigned rx_tail = de->rx_tail;
393 unsigned rx_work = DE_RX_RING_SIZE;
394 unsigned drop = 0;
395 int rc;
396
397 while (rx_work--) {
398 u32 status, len;
399 dma_addr_t mapping;
400 struct sk_buff *skb, *copy_skb;
401 unsigned copying_skb, buflen;
402
403 skb = de->rx_skb[rx_tail].skb;
Eric Sesterhenn / snakebyte7e0b58f2006-01-26 22:02:43 +0100404 BUG_ON(!skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405 rmb();
406 status = le32_to_cpu(de->rx_ring[rx_tail].opts1);
407 if (status & DescOwn)
408 break;
409
410 len = ((status >> 16) & 0x7ff) - 4;
411 mapping = de->rx_skb[rx_tail].mapping;
412
413 if (unlikely(drop)) {
414 de->net_stats.rx_dropped++;
415 goto rx_next;
416 }
417
418 if (unlikely((status & 0x38008300) != 0x0300)) {
419 de_rx_err_acct(de, rx_tail, status, len);
420 goto rx_next;
421 }
422
423 copying_skb = (len <= rx_copybreak);
424
425 if (unlikely(netif_msg_rx_status(de)))
426 printk(KERN_DEBUG "%s: rx slot %d status 0x%x len %d copying? %d\n",
427 de->dev->name, rx_tail, status, len,
428 copying_skb);
429
430 buflen = copying_skb ? (len + RX_OFFSET) : de->rx_buf_sz;
431 copy_skb = dev_alloc_skb (buflen);
432 if (unlikely(!copy_skb)) {
433 de->net_stats.rx_dropped++;
434 drop = 1;
435 rx_work = 100;
436 goto rx_next;
437 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438
439 if (!copying_skb) {
440 pci_unmap_single(de->pdev, mapping,
441 buflen, PCI_DMA_FROMDEVICE);
442 skb_put(skb, len);
443
444 mapping =
445 de->rx_skb[rx_tail].mapping =
David S. Miller689be432005-06-28 15:25:31 -0700446 pci_map_single(de->pdev, copy_skb->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 buflen, PCI_DMA_FROMDEVICE);
448 de->rx_skb[rx_tail].skb = copy_skb;
449 } else {
450 pci_dma_sync_single_for_cpu(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
451 skb_reserve(copy_skb, RX_OFFSET);
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -0300452 skb_copy_from_linear_data(skb, skb_put(copy_skb, len),
453 len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 pci_dma_sync_single_for_device(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
455
456 /* We'll reuse the original ring buffer. */
457 skb = copy_skb;
458 }
459
460 skb->protocol = eth_type_trans (skb, de->dev);
461
462 de->net_stats.rx_packets++;
463 de->net_stats.rx_bytes += skb->len;
464 de->dev->last_rx = jiffies;
465 rc = netif_rx (skb);
466 if (rc == NET_RX_DROP)
467 drop = 1;
468
469rx_next:
470 de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
471 if (rx_tail == (DE_RX_RING_SIZE - 1))
472 de->rx_ring[rx_tail].opts2 =
473 cpu_to_le32(RingEnd | de->rx_buf_sz);
474 else
475 de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
476 de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
477 rx_tail = NEXT_RX(rx_tail);
478 }
479
480 if (!rx_work)
481 printk(KERN_WARNING "%s: rx work limit reached\n", de->dev->name);
482
483 de->rx_tail = rx_tail;
484}
485
David Howells7d12e782006-10-05 14:55:46 +0100486static irqreturn_t de_interrupt (int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487{
488 struct net_device *dev = dev_instance;
489 struct de_private *de = dev->priv;
490 u32 status;
491
492 status = dr32(MacStatus);
493 if ((!(status & (IntrOK|IntrErr))) || (status == 0xFFFF))
494 return IRQ_NONE;
495
496 if (netif_msg_intr(de))
497 printk(KERN_DEBUG "%s: intr, status %08x mode %08x desc %u/%u/%u\n",
498 dev->name, status, dr32(MacMode), de->rx_tail, de->tx_head, de->tx_tail);
499
500 dw32(MacStatus, status);
501
502 if (status & (RxIntr | RxEmpty)) {
503 de_rx(de);
504 if (status & RxEmpty)
505 dw32(RxPoll, NormalRxPoll);
506 }
507
508 spin_lock(&de->lock);
509
510 if (status & (TxIntr | TxEmpty))
511 de_tx(de);
512
513 if (status & (LinkPass | LinkFail))
514 de_media_interrupt(de, status);
515
516 spin_unlock(&de->lock);
517
518 if (status & PciErr) {
519 u16 pci_status;
520
521 pci_read_config_word(de->pdev, PCI_STATUS, &pci_status);
522 pci_write_config_word(de->pdev, PCI_STATUS, pci_status);
523 printk(KERN_ERR "%s: PCI bus error, status=%08x, PCI status=%04x\n",
524 dev->name, status, pci_status);
525 }
526
527 return IRQ_HANDLED;
528}
529
530static void de_tx (struct de_private *de)
531{
532 unsigned tx_head = de->tx_head;
533 unsigned tx_tail = de->tx_tail;
534
535 while (tx_tail != tx_head) {
536 struct sk_buff *skb;
537 u32 status;
538
539 rmb();
540 status = le32_to_cpu(de->tx_ring[tx_tail].opts1);
541 if (status & DescOwn)
542 break;
543
544 skb = de->tx_skb[tx_tail].skb;
Eric Sesterhenn / snakebyte7e0b58f2006-01-26 22:02:43 +0100545 BUG_ON(!skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 if (unlikely(skb == DE_DUMMY_SKB))
547 goto next;
548
549 if (unlikely(skb == DE_SETUP_SKB)) {
550 pci_unmap_single(de->pdev, de->tx_skb[tx_tail].mapping,
551 sizeof(de->setup_frame), PCI_DMA_TODEVICE);
552 goto next;
553 }
554
555 pci_unmap_single(de->pdev, de->tx_skb[tx_tail].mapping,
556 skb->len, PCI_DMA_TODEVICE);
557
558 if (status & LastFrag) {
559 if (status & TxError) {
560 if (netif_msg_tx_err(de))
561 printk(KERN_DEBUG "%s: tx err, status 0x%x\n",
562 de->dev->name, status);
563 de->net_stats.tx_errors++;
564 if (status & TxOWC)
565 de->net_stats.tx_window_errors++;
566 if (status & TxMaxCol)
567 de->net_stats.tx_aborted_errors++;
568 if (status & TxLinkFail)
569 de->net_stats.tx_carrier_errors++;
570 if (status & TxFIFOUnder)
571 de->net_stats.tx_fifo_errors++;
572 } else {
573 de->net_stats.tx_packets++;
574 de->net_stats.tx_bytes += skb->len;
575 if (netif_msg_tx_done(de))
576 printk(KERN_DEBUG "%s: tx done, slot %d\n", de->dev->name, tx_tail);
577 }
578 dev_kfree_skb_irq(skb);
579 }
580
581next:
582 de->tx_skb[tx_tail].skb = NULL;
583
584 tx_tail = NEXT_TX(tx_tail);
585 }
586
587 de->tx_tail = tx_tail;
588
589 if (netif_queue_stopped(de->dev) && (TX_BUFFS_AVAIL(de) > (DE_TX_RING_SIZE / 4)))
590 netif_wake_queue(de->dev);
591}
592
593static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
594{
595 struct de_private *de = dev->priv;
596 unsigned int entry, tx_free;
597 u32 mapping, len, flags = FirstFrag | LastFrag;
598 struct de_desc *txd;
599
600 spin_lock_irq(&de->lock);
601
602 tx_free = TX_BUFFS_AVAIL(de);
603 if (tx_free == 0) {
604 netif_stop_queue(dev);
605 spin_unlock_irq(&de->lock);
606 return 1;
607 }
608 tx_free--;
609
610 entry = de->tx_head;
611
612 txd = &de->tx_ring[entry];
613
614 len = skb->len;
615 mapping = pci_map_single(de->pdev, skb->data, len, PCI_DMA_TODEVICE);
616 if (entry == (DE_TX_RING_SIZE - 1))
617 flags |= RingEnd;
618 if (!tx_free || (tx_free == (DE_TX_RING_SIZE / 2)))
619 flags |= TxSwInt;
620 flags |= len;
621 txd->opts2 = cpu_to_le32(flags);
622 txd->addr1 = cpu_to_le32(mapping);
623
624 de->tx_skb[entry].skb = skb;
625 de->tx_skb[entry].mapping = mapping;
626 wmb();
627
628 txd->opts1 = cpu_to_le32(DescOwn);
629 wmb();
630
631 de->tx_head = NEXT_TX(entry);
632 if (netif_msg_tx_queued(de))
633 printk(KERN_DEBUG "%s: tx queued, slot %d, skblen %d\n",
634 dev->name, entry, skb->len);
635
636 if (tx_free == 0)
637 netif_stop_queue(dev);
638
639 spin_unlock_irq(&de->lock);
640
641 /* Trigger an immediate transmit demand. */
642 dw32(TxPoll, NormalTxPoll);
643 dev->trans_start = jiffies;
644
645 return 0;
646}
647
648/* Set or clear the multicast filter for this adaptor.
649 Note that we only use exclusion around actually queueing the
650 new frame, not around filling de->setup_frame. This is non-deterministic
651 when re-entered but still correct. */
652
653#undef set_bit_le
654#define set_bit_le(i,p) do { ((char *)(p))[(i)/8] |= (1<<((i)%8)); } while(0)
655
656static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev)
657{
658 struct de_private *de = dev->priv;
659 u16 hash_table[32];
660 struct dev_mc_list *mclist;
661 int i;
662 u16 *eaddrs;
663
664 memset(hash_table, 0, sizeof(hash_table));
665 set_bit_le(255, hash_table); /* Broadcast entry */
666 /* This should work on big-endian machines as well. */
667 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
668 i++, mclist = mclist->next) {
669 int index = ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x1ff;
670
671 set_bit_le(index, hash_table);
672
673 for (i = 0; i < 32; i++) {
674 *setup_frm++ = hash_table[i];
675 *setup_frm++ = hash_table[i];
676 }
677 setup_frm = &de->setup_frame[13*6];
678 }
679
680 /* Fill the final entry with our physical address. */
681 eaddrs = (u16 *)dev->dev_addr;
682 *setup_frm++ = eaddrs[0]; *setup_frm++ = eaddrs[0];
683 *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1];
684 *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2];
685}
686
687static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev)
688{
689 struct de_private *de = dev->priv;
690 struct dev_mc_list *mclist;
691 int i;
692 u16 *eaddrs;
693
694 /* We have <= 14 addresses so we can use the wonderful
695 16 address perfect filtering of the Tulip. */
696 for (i = 0, mclist = dev->mc_list; i < dev->mc_count;
697 i++, mclist = mclist->next) {
698 eaddrs = (u16 *)mclist->dmi_addr;
699 *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
700 *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
701 *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
702 }
703 /* Fill the unused entries with the broadcast address. */
704 memset(setup_frm, 0xff, (15-i)*12);
705 setup_frm = &de->setup_frame[15*6];
706
707 /* Fill the final entry with our physical address. */
708 eaddrs = (u16 *)dev->dev_addr;
709 *setup_frm++ = eaddrs[0]; *setup_frm++ = eaddrs[0];
710 *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1];
711 *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2];
712}
713
714
715static void __de_set_rx_mode (struct net_device *dev)
716{
717 struct de_private *de = dev->priv;
718 u32 macmode;
719 unsigned int entry;
720 u32 mapping;
721 struct de_desc *txd;
722 struct de_desc *dummy_txd = NULL;
723
724 macmode = dr32(MacMode) & ~(AcceptAllMulticast | AcceptAllPhys);
725
726 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
727 macmode |= AcceptAllMulticast | AcceptAllPhys;
728 goto out;
729 }
730
731 if ((dev->mc_count > 1000) || (dev->flags & IFF_ALLMULTI)) {
732 /* Too many to filter well -- accept all multicasts. */
733 macmode |= AcceptAllMulticast;
734 goto out;
735 }
736
737 /* Note that only the low-address shortword of setup_frame is valid!
738 The values are doubled for big-endian architectures. */
739 if (dev->mc_count > 14) /* Must use a multicast hash table. */
740 build_setup_frame_hash (de->setup_frame, dev);
741 else
742 build_setup_frame_perfect (de->setup_frame, dev);
743
744 /*
745 * Now add this frame to the Tx list.
746 */
747
748 entry = de->tx_head;
749
750 /* Avoid a chip errata by prefixing a dummy entry. */
751 if (entry != 0) {
752 de->tx_skb[entry].skb = DE_DUMMY_SKB;
753
754 dummy_txd = &de->tx_ring[entry];
755 dummy_txd->opts2 = (entry == (DE_TX_RING_SIZE - 1)) ?
756 cpu_to_le32(RingEnd) : 0;
757 dummy_txd->addr1 = 0;
758
759 /* Must set DescOwned later to avoid race with chip */
760
761 entry = NEXT_TX(entry);
762 }
763
764 de->tx_skb[entry].skb = DE_SETUP_SKB;
765 de->tx_skb[entry].mapping = mapping =
766 pci_map_single (de->pdev, de->setup_frame,
767 sizeof (de->setup_frame), PCI_DMA_TODEVICE);
768
769 /* Put the setup frame on the Tx list. */
770 txd = &de->tx_ring[entry];
771 if (entry == (DE_TX_RING_SIZE - 1))
772 txd->opts2 = cpu_to_le32(SetupFrame | RingEnd | sizeof (de->setup_frame));
773 else
774 txd->opts2 = cpu_to_le32(SetupFrame | sizeof (de->setup_frame));
775 txd->addr1 = cpu_to_le32(mapping);
776 wmb();
777
778 txd->opts1 = cpu_to_le32(DescOwn);
779 wmb();
780
781 if (dummy_txd) {
782 dummy_txd->opts1 = cpu_to_le32(DescOwn);
783 wmb();
784 }
785
786 de->tx_head = NEXT_TX(entry);
787
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 if (TX_BUFFS_AVAIL(de) == 0)
789 netif_stop_queue(dev);
790
791 /* Trigger an immediate transmit demand. */
792 dw32(TxPoll, NormalTxPoll);
793
794out:
795 if (macmode != dr32(MacMode))
796 dw32(MacMode, macmode);
797}
798
799static void de_set_rx_mode (struct net_device *dev)
800{
801 unsigned long flags;
802 struct de_private *de = dev->priv;
803
804 spin_lock_irqsave (&de->lock, flags);
805 __de_set_rx_mode(dev);
806 spin_unlock_irqrestore (&de->lock, flags);
807}
808
809static inline void de_rx_missed(struct de_private *de, u32 rx_missed)
810{
811 if (unlikely(rx_missed & RxMissedOver))
812 de->net_stats.rx_missed_errors += RxMissedMask;
813 else
814 de->net_stats.rx_missed_errors += (rx_missed & RxMissedMask);
815}
816
817static void __de_get_stats(struct de_private *de)
818{
819 u32 tmp = dr32(RxMissed); /* self-clearing */
820
821 de_rx_missed(de, tmp);
822}
823
824static struct net_device_stats *de_get_stats(struct net_device *dev)
825{
826 struct de_private *de = dev->priv;
827
828 /* The chip only need report frame silently dropped. */
829 spin_lock_irq(&de->lock);
830 if (netif_running(dev) && netif_device_present(dev))
831 __de_get_stats(de);
832 spin_unlock_irq(&de->lock);
833
834 return &de->net_stats;
835}
836
837static inline int de_is_running (struct de_private *de)
838{
839 return (dr32(MacStatus) & (RxState | TxState)) ? 1 : 0;
840}
841
842static void de_stop_rxtx (struct de_private *de)
843{
844 u32 macmode;
Grant Grundler69cac982008-03-08 18:33:16 -0700845 unsigned int i = 1300/100;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846
847 macmode = dr32(MacMode);
848 if (macmode & RxTx) {
849 dw32(MacMode, macmode & ~RxTx);
850 dr32(MacMode);
851 }
852
Grant Grundler69cac982008-03-08 18:33:16 -0700853 /* wait until in-flight frame completes.
854 * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin)
855 * Typically expect this loop to end in < 50 us on 100BT.
856 */
857 while (--i) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 if (!de_is_running(de))
859 return;
Grant Grundler69cac982008-03-08 18:33:16 -0700860 udelay(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400862
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name);
864}
865
866static inline void de_start_rxtx (struct de_private *de)
867{
868 u32 macmode;
869
870 macmode = dr32(MacMode);
871 if ((macmode & RxTx) != RxTx) {
872 dw32(MacMode, macmode | RxTx);
873 dr32(MacMode);
874 }
875}
876
877static void de_stop_hw (struct de_private *de)
878{
879
880 udelay(5);
881 dw32(IntrMask, 0);
882
883 de_stop_rxtx(de);
884
885 dw32(MacStatus, dr32(MacStatus));
886
887 udelay(10);
888
889 de->rx_tail = 0;
890 de->tx_head = de->tx_tail = 0;
891}
892
893static void de_link_up(struct de_private *de)
894{
895 if (!netif_carrier_ok(de->dev)) {
896 netif_carrier_on(de->dev);
897 if (netif_msg_link(de))
898 printk(KERN_INFO "%s: link up, media %s\n",
899 de->dev->name, media_name[de->media_type]);
900 }
901}
902
903static void de_link_down(struct de_private *de)
904{
905 if (netif_carrier_ok(de->dev)) {
906 netif_carrier_off(de->dev);
907 if (netif_msg_link(de))
908 printk(KERN_INFO "%s: link down\n", de->dev->name);
909 }
910}
911
912static void de_set_media (struct de_private *de)
913{
914 unsigned media = de->media_type;
915 u32 macmode = dr32(MacMode);
916
Ondrej Zaryf25f0f82008-02-25 18:45:46 +0100917 if (de_is_running(de))
918 printk(KERN_WARNING "%s: chip is running while changing media!\n", de->dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919
920 if (de->de21040)
921 dw32(CSR11, FULL_DUPLEX_MAGIC);
922 dw32(CSR13, 0); /* Reset phy */
923 dw32(CSR14, de->media[media].csr14);
924 dw32(CSR15, de->media[media].csr15);
925 dw32(CSR13, de->media[media].csr13);
926
927 /* must delay 10ms before writing to other registers,
928 * especially CSR6
929 */
930 mdelay(10);
931
932 if (media == DE_MEDIA_TP_FD)
933 macmode |= FullDuplex;
934 else
935 macmode &= ~FullDuplex;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400936
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937 if (netif_msg_link(de)) {
938 printk(KERN_INFO "%s: set link %s\n"
939 KERN_INFO "%s: mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n"
940 KERN_INFO "%s: set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
941 de->dev->name, media_name[media],
942 de->dev->name, dr32(MacMode), dr32(SIAStatus),
943 dr32(CSR13), dr32(CSR14), dr32(CSR15),
944 de->dev->name, macmode, de->media[media].csr13,
945 de->media[media].csr14, de->media[media].csr15);
946 }
947 if (macmode != dr32(MacMode))
948 dw32(MacMode, macmode);
949}
950
951static void de_next_media (struct de_private *de, u32 *media,
952 unsigned int n_media)
953{
954 unsigned int i;
955
956 for (i = 0; i < n_media; i++) {
957 if (de_ok_to_advertise(de, media[i])) {
958 de->media_type = media[i];
959 return;
960 }
961 }
962}
963
964static void de21040_media_timer (unsigned long data)
965{
966 struct de_private *de = (struct de_private *) data;
967 struct net_device *dev = de->dev;
968 u32 status = dr32(SIAStatus);
969 unsigned int carrier;
970 unsigned long flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400971
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 carrier = (status & NetCxnErr) ? 0 : 1;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400973
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974 if (carrier) {
975 if (de->media_type != DE_MEDIA_AUI && (status & LinkFailStatus))
976 goto no_link_yet;
977
978 de->media_timer.expires = jiffies + DE_TIMER_LINK;
979 add_timer(&de->media_timer);
980 if (!netif_carrier_ok(dev))
981 de_link_up(de);
982 else
983 if (netif_msg_timer(de))
984 printk(KERN_INFO "%s: %s link ok, status %x\n",
985 dev->name, media_name[de->media_type],
986 status);
987 return;
988 }
989
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400990 de_link_down(de);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991
992 if (de->media_lock)
993 return;
994
995 if (de->media_type == DE_MEDIA_AUI) {
996 u32 next_state = DE_MEDIA_TP;
997 de_next_media(de, &next_state, 1);
998 } else {
999 u32 next_state = DE_MEDIA_AUI;
1000 de_next_media(de, &next_state, 1);
1001 }
1002
1003 spin_lock_irqsave(&de->lock, flags);
1004 de_stop_rxtx(de);
1005 spin_unlock_irqrestore(&de->lock, flags);
1006 de_set_media(de);
1007 de_start_rxtx(de);
1008
1009no_link_yet:
1010 de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
1011 add_timer(&de->media_timer);
1012
1013 if (netif_msg_timer(de))
1014 printk(KERN_INFO "%s: no link, trying media %s, status %x\n",
1015 dev->name, media_name[de->media_type], status);
1016}
1017
1018static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media)
1019{
1020 switch (new_media) {
1021 case DE_MEDIA_TP_AUTO:
1022 if (!(de->media_advertise & ADVERTISED_Autoneg))
1023 return 0;
1024 if (!(de->media_advertise & (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full)))
1025 return 0;
1026 break;
1027 case DE_MEDIA_BNC:
1028 if (!(de->media_advertise & ADVERTISED_BNC))
1029 return 0;
1030 break;
1031 case DE_MEDIA_AUI:
1032 if (!(de->media_advertise & ADVERTISED_AUI))
1033 return 0;
1034 break;
1035 case DE_MEDIA_TP:
1036 if (!(de->media_advertise & ADVERTISED_10baseT_Half))
1037 return 0;
1038 break;
1039 case DE_MEDIA_TP_FD:
1040 if (!(de->media_advertise & ADVERTISED_10baseT_Full))
1041 return 0;
1042 break;
1043 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001044
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 return 1;
1046}
1047
1048static void de21041_media_timer (unsigned long data)
1049{
1050 struct de_private *de = (struct de_private *) data;
1051 struct net_device *dev = de->dev;
1052 u32 status = dr32(SIAStatus);
1053 unsigned int carrier;
1054 unsigned long flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001055
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 carrier = (status & NetCxnErr) ? 0 : 1;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001057
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 if (carrier) {
1059 if ((de->media_type == DE_MEDIA_TP_AUTO ||
1060 de->media_type == DE_MEDIA_TP ||
1061 de->media_type == DE_MEDIA_TP_FD) &&
1062 (status & LinkFailStatus))
1063 goto no_link_yet;
1064
1065 de->media_timer.expires = jiffies + DE_TIMER_LINK;
1066 add_timer(&de->media_timer);
1067 if (!netif_carrier_ok(dev))
1068 de_link_up(de);
1069 else
1070 if (netif_msg_timer(de))
1071 printk(KERN_INFO "%s: %s link ok, mode %x status %x\n",
1072 dev->name, media_name[de->media_type],
1073 dr32(MacMode), status);
1074 return;
1075 }
1076
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001077 de_link_down(de);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078
1079 /* if media type locked, don't switch media */
1080 if (de->media_lock)
1081 goto set_media;
1082
1083 /* if activity detected, use that as hint for new media type */
1084 if (status & NonselPortActive) {
1085 unsigned int have_media = 1;
1086
1087 /* if AUI/BNC selected, then activity is on TP port */
1088 if (de->media_type == DE_MEDIA_AUI ||
1089 de->media_type == DE_MEDIA_BNC) {
1090 if (de_ok_to_advertise(de, DE_MEDIA_TP_AUTO))
1091 de->media_type = DE_MEDIA_TP_AUTO;
1092 else
1093 have_media = 0;
1094 }
1095
1096 /* TP selected. If there is only TP and BNC, then it's BNC */
1097 else if (((de->media_supported & DE_AUI_BNC) == SUPPORTED_BNC) &&
1098 de_ok_to_advertise(de, DE_MEDIA_BNC))
1099 de->media_type = DE_MEDIA_BNC;
1100
1101 /* TP selected. If there is only TP and AUI, then it's AUI */
1102 else if (((de->media_supported & DE_AUI_BNC) == SUPPORTED_AUI) &&
1103 de_ok_to_advertise(de, DE_MEDIA_AUI))
1104 de->media_type = DE_MEDIA_AUI;
1105
1106 /* otherwise, ignore the hint */
1107 else
1108 have_media = 0;
1109
1110 if (have_media)
1111 goto set_media;
1112 }
1113
1114 /*
1115 * Absent or ambiguous activity hint, move to next advertised
1116 * media state. If de->media_type is left unchanged, this
1117 * simply resets the PHY and reloads the current media settings.
1118 */
1119 if (de->media_type == DE_MEDIA_AUI) {
1120 u32 next_states[] = { DE_MEDIA_BNC, DE_MEDIA_TP_AUTO };
1121 de_next_media(de, next_states, ARRAY_SIZE(next_states));
1122 } else if (de->media_type == DE_MEDIA_BNC) {
1123 u32 next_states[] = { DE_MEDIA_TP_AUTO, DE_MEDIA_AUI };
1124 de_next_media(de, next_states, ARRAY_SIZE(next_states));
1125 } else {
1126 u32 next_states[] = { DE_MEDIA_AUI, DE_MEDIA_BNC, DE_MEDIA_TP_AUTO };
1127 de_next_media(de, next_states, ARRAY_SIZE(next_states));
1128 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001129
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130set_media:
1131 spin_lock_irqsave(&de->lock, flags);
1132 de_stop_rxtx(de);
1133 spin_unlock_irqrestore(&de->lock, flags);
1134 de_set_media(de);
1135 de_start_rxtx(de);
1136
1137no_link_yet:
1138 de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
1139 add_timer(&de->media_timer);
1140
1141 if (netif_msg_timer(de))
1142 printk(KERN_INFO "%s: no link, trying media %s, status %x\n",
1143 dev->name, media_name[de->media_type], status);
1144}
1145
1146static void de_media_interrupt (struct de_private *de, u32 status)
1147{
1148 if (status & LinkPass) {
1149 de_link_up(de);
1150 mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK);
1151 return;
1152 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001153
Eric Sesterhenn / snakebyte7e0b58f2006-01-26 22:02:43 +01001154 BUG_ON(!(status & LinkFail));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155
1156 if (netif_carrier_ok(de->dev)) {
1157 de_link_down(de);
1158 mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK);
1159 }
1160}
1161
1162static int de_reset_mac (struct de_private *de)
1163{
1164 u32 status, tmp;
1165
1166 /*
1167 * Reset MAC. de4x5.c and tulip.c examined for "advice"
1168 * in this area.
1169 */
1170
1171 if (dr32(BusMode) == 0xffffffff)
1172 return -EBUSY;
1173
1174 /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
1175 dw32 (BusMode, CmdReset);
1176 mdelay (1);
1177
1178 dw32 (BusMode, de_bus_mode);
1179 mdelay (1);
1180
1181 for (tmp = 0; tmp < 5; tmp++) {
1182 dr32 (BusMode);
1183 mdelay (1);
1184 }
1185
1186 mdelay (1);
1187
1188 status = dr32(MacStatus);
1189 if (status & (RxState | TxState))
1190 return -EBUSY;
1191 if (status == 0xffffffff)
1192 return -ENODEV;
1193 return 0;
1194}
1195
1196static void de_adapter_wake (struct de_private *de)
1197{
1198 u32 pmctl;
1199
1200 if (de->de21040)
1201 return;
1202
1203 pci_read_config_dword(de->pdev, PCIPM, &pmctl);
1204 if (pmctl & PM_Mask) {
1205 pmctl &= ~PM_Mask;
1206 pci_write_config_dword(de->pdev, PCIPM, pmctl);
1207
1208 /* de4x5.c delays, so we do too */
1209 msleep(10);
1210 }
1211}
1212
1213static void de_adapter_sleep (struct de_private *de)
1214{
1215 u32 pmctl;
1216
1217 if (de->de21040)
1218 return;
1219
1220 pci_read_config_dword(de->pdev, PCIPM, &pmctl);
1221 pmctl |= PM_Sleep;
1222 pci_write_config_dword(de->pdev, PCIPM, pmctl);
1223}
1224
1225static int de_init_hw (struct de_private *de)
1226{
1227 struct net_device *dev = de->dev;
1228 u32 macmode;
1229 int rc;
1230
1231 de_adapter_wake(de);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001232
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 macmode = dr32(MacMode) & ~MacModeClear;
1234
1235 rc = de_reset_mac(de);
1236 if (rc)
1237 return rc;
1238
1239 de_set_media(de); /* reset phy */
1240
1241 dw32(RxRingAddr, de->ring_dma);
1242 dw32(TxRingAddr, de->ring_dma + (sizeof(struct de_desc) * DE_RX_RING_SIZE));
1243
1244 dw32(MacMode, RxTx | macmode);
1245
1246 dr32(RxMissed); /* self-clearing */
1247
1248 dw32(IntrMask, de_intr_mask);
1249
1250 de_set_rx_mode(dev);
1251
1252 return 0;
1253}
1254
1255static int de_refill_rx (struct de_private *de)
1256{
1257 unsigned i;
1258
1259 for (i = 0; i < DE_RX_RING_SIZE; i++) {
1260 struct sk_buff *skb;
1261
1262 skb = dev_alloc_skb(de->rx_buf_sz);
1263 if (!skb)
1264 goto err_out;
1265
1266 skb->dev = de->dev;
1267
1268 de->rx_skb[i].mapping = pci_map_single(de->pdev,
David S. Miller689be432005-06-28 15:25:31 -07001269 skb->data, de->rx_buf_sz, PCI_DMA_FROMDEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270 de->rx_skb[i].skb = skb;
1271
1272 de->rx_ring[i].opts1 = cpu_to_le32(DescOwn);
1273 if (i == (DE_RX_RING_SIZE - 1))
1274 de->rx_ring[i].opts2 =
1275 cpu_to_le32(RingEnd | de->rx_buf_sz);
1276 else
1277 de->rx_ring[i].opts2 = cpu_to_le32(de->rx_buf_sz);
1278 de->rx_ring[i].addr1 = cpu_to_le32(de->rx_skb[i].mapping);
1279 de->rx_ring[i].addr2 = 0;
1280 }
1281
1282 return 0;
1283
1284err_out:
1285 de_clean_rings(de);
1286 return -ENOMEM;
1287}
1288
1289static int de_init_rings (struct de_private *de)
1290{
1291 memset(de->tx_ring, 0, sizeof(struct de_desc) * DE_TX_RING_SIZE);
1292 de->tx_ring[DE_TX_RING_SIZE - 1].opts2 = cpu_to_le32(RingEnd);
1293
1294 de->rx_tail = 0;
1295 de->tx_head = de->tx_tail = 0;
1296
1297 return de_refill_rx (de);
1298}
1299
1300static int de_alloc_rings (struct de_private *de)
1301{
1302 de->rx_ring = pci_alloc_consistent(de->pdev, DE_RING_BYTES, &de->ring_dma);
1303 if (!de->rx_ring)
1304 return -ENOMEM;
1305 de->tx_ring = &de->rx_ring[DE_RX_RING_SIZE];
1306 return de_init_rings(de);
1307}
1308
1309static void de_clean_rings (struct de_private *de)
1310{
1311 unsigned i;
1312
1313 memset(de->rx_ring, 0, sizeof(struct de_desc) * DE_RX_RING_SIZE);
1314 de->rx_ring[DE_RX_RING_SIZE - 1].opts2 = cpu_to_le32(RingEnd);
1315 wmb();
1316 memset(de->tx_ring, 0, sizeof(struct de_desc) * DE_TX_RING_SIZE);
1317 de->tx_ring[DE_TX_RING_SIZE - 1].opts2 = cpu_to_le32(RingEnd);
1318 wmb();
1319
1320 for (i = 0; i < DE_RX_RING_SIZE; i++) {
1321 if (de->rx_skb[i].skb) {
1322 pci_unmap_single(de->pdev, de->rx_skb[i].mapping,
1323 de->rx_buf_sz, PCI_DMA_FROMDEVICE);
1324 dev_kfree_skb(de->rx_skb[i].skb);
1325 }
1326 }
1327
1328 for (i = 0; i < DE_TX_RING_SIZE; i++) {
1329 struct sk_buff *skb = de->tx_skb[i].skb;
1330 if ((skb) && (skb != DE_DUMMY_SKB)) {
1331 if (skb != DE_SETUP_SKB) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332 de->net_stats.tx_dropped++;
1333 pci_unmap_single(de->pdev,
1334 de->tx_skb[i].mapping,
1335 skb->len, PCI_DMA_TODEVICE);
Eric Sesterhenn5185c7c2006-03-22 22:30:34 +01001336 dev_kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 } else {
1338 pci_unmap_single(de->pdev,
1339 de->tx_skb[i].mapping,
1340 sizeof(de->setup_frame),
1341 PCI_DMA_TODEVICE);
1342 }
1343 }
1344 }
1345
1346 memset(&de->rx_skb, 0, sizeof(struct ring_info) * DE_RX_RING_SIZE);
1347 memset(&de->tx_skb, 0, sizeof(struct ring_info) * DE_TX_RING_SIZE);
1348}
1349
1350static void de_free_rings (struct de_private *de)
1351{
1352 de_clean_rings(de);
1353 pci_free_consistent(de->pdev, DE_RING_BYTES, de->rx_ring, de->ring_dma);
1354 de->rx_ring = NULL;
1355 de->tx_ring = NULL;
1356}
1357
1358static int de_open (struct net_device *dev)
1359{
1360 struct de_private *de = dev->priv;
1361 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362
1363 if (netif_msg_ifup(de))
1364 printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
1365
1366 de->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
1367
1368 rc = de_alloc_rings(de);
1369 if (rc) {
1370 printk(KERN_ERR "%s: ring allocation failure, err=%d\n",
1371 dev->name, rc);
1372 return rc;
1373 }
1374
Francois Romieu3f735b72006-03-08 22:41:15 +01001375 dw32(IntrMask, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376
Thomas Gleixner1fb9df52006-07-01 19:29:39 -07001377 rc = request_irq(dev->irq, de_interrupt, IRQF_SHARED, dev->name, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 if (rc) {
1379 printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n",
1380 dev->name, dev->irq, rc);
Francois Romieu3f735b72006-03-08 22:41:15 +01001381 goto err_out_free;
1382 }
1383
1384 rc = de_init_hw(de);
1385 if (rc) {
1386 printk(KERN_ERR "%s: h/w init failure, err=%d\n",
1387 dev->name, rc);
1388 goto err_out_free_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390
1391 netif_start_queue(dev);
1392 mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK);
1393
1394 return 0;
1395
Francois Romieu3f735b72006-03-08 22:41:15 +01001396err_out_free_irq:
1397 free_irq(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398err_out_free:
1399 de_free_rings(de);
1400 return rc;
1401}
1402
1403static int de_close (struct net_device *dev)
1404{
1405 struct de_private *de = dev->priv;
1406 unsigned long flags;
1407
1408 if (netif_msg_ifdown(de))
1409 printk(KERN_DEBUG "%s: disabling interface\n", dev->name);
1410
1411 del_timer_sync(&de->media_timer);
1412
1413 spin_lock_irqsave(&de->lock, flags);
1414 de_stop_hw(de);
1415 netif_stop_queue(dev);
1416 netif_carrier_off(dev);
1417 spin_unlock_irqrestore(&de->lock, flags);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001418
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 free_irq(dev->irq, dev);
1420
1421 de_free_rings(de);
1422 de_adapter_sleep(de);
1423 pci_disable_device(de->pdev);
1424 return 0;
1425}
1426
1427static void de_tx_timeout (struct net_device *dev)
1428{
1429 struct de_private *de = dev->priv;
1430
1431 printk(KERN_DEBUG "%s: NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
1432 dev->name, dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
1433 de->rx_tail, de->tx_head, de->tx_tail);
1434
1435 del_timer_sync(&de->media_timer);
1436
1437 disable_irq(dev->irq);
1438 spin_lock_irq(&de->lock);
1439
1440 de_stop_hw(de);
1441 netif_stop_queue(dev);
1442 netif_carrier_off(dev);
1443
1444 spin_unlock_irq(&de->lock);
1445 enable_irq(dev->irq);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001446
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 /* Update the error counts. */
1448 __de_get_stats(de);
1449
1450 synchronize_irq(dev->irq);
1451 de_clean_rings(de);
1452
Francois Romieu39bf4292006-03-08 22:45:52 +01001453 de_init_rings(de);
1454
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 de_init_hw(de);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001456
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 netif_wake_queue(dev);
1458}
1459
1460static void __de_get_regs(struct de_private *de, u8 *buf)
1461{
1462 int i;
1463 u32 *rbuf = (u32 *)buf;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001464
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 /* read all CSRs */
1466 for (i = 0; i < DE_NUM_REGS; i++)
1467 rbuf[i] = dr32(i * 8);
1468
1469 /* handle self-clearing RxMissed counter, CSR8 */
1470 de_rx_missed(de, rbuf[8]);
1471}
1472
1473static int __de_get_settings(struct de_private *de, struct ethtool_cmd *ecmd)
1474{
1475 ecmd->supported = de->media_supported;
1476 ecmd->transceiver = XCVR_INTERNAL;
1477 ecmd->phy_address = 0;
1478 ecmd->advertising = de->media_advertise;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001479
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 switch (de->media_type) {
1481 case DE_MEDIA_AUI:
1482 ecmd->port = PORT_AUI;
1483 ecmd->speed = 5;
1484 break;
1485 case DE_MEDIA_BNC:
1486 ecmd->port = PORT_BNC;
1487 ecmd->speed = 2;
1488 break;
1489 default:
1490 ecmd->port = PORT_TP;
1491 ecmd->speed = SPEED_10;
1492 break;
1493 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001494
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495 if (dr32(MacMode) & FullDuplex)
1496 ecmd->duplex = DUPLEX_FULL;
1497 else
1498 ecmd->duplex = DUPLEX_HALF;
1499
1500 if (de->media_lock)
1501 ecmd->autoneg = AUTONEG_DISABLE;
1502 else
1503 ecmd->autoneg = AUTONEG_ENABLE;
1504
1505 /* ignore maxtxpkt, maxrxpkt for now */
1506
1507 return 0;
1508}
1509
1510static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd)
1511{
1512 u32 new_media;
1513 unsigned int media_lock;
1514
1515 if (ecmd->speed != SPEED_10 && ecmd->speed != 5 && ecmd->speed != 2)
1516 return -EINVAL;
1517 if (de->de21040 && ecmd->speed == 2)
1518 return -EINVAL;
1519 if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
1520 return -EINVAL;
1521 if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI && ecmd->port != PORT_BNC)
1522 return -EINVAL;
1523 if (de->de21040 && ecmd->port == PORT_BNC)
1524 return -EINVAL;
1525 if (ecmd->transceiver != XCVR_INTERNAL)
1526 return -EINVAL;
1527 if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE)
1528 return -EINVAL;
1529 if (ecmd->advertising & ~de->media_supported)
1530 return -EINVAL;
1531 if (ecmd->autoneg == AUTONEG_ENABLE &&
1532 (!(ecmd->advertising & ADVERTISED_Autoneg)))
1533 return -EINVAL;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001534
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 switch (ecmd->port) {
1536 case PORT_AUI:
1537 new_media = DE_MEDIA_AUI;
1538 if (!(ecmd->advertising & ADVERTISED_AUI))
1539 return -EINVAL;
1540 break;
1541 case PORT_BNC:
1542 new_media = DE_MEDIA_BNC;
1543 if (!(ecmd->advertising & ADVERTISED_BNC))
1544 return -EINVAL;
1545 break;
1546 default:
1547 if (ecmd->autoneg == AUTONEG_ENABLE)
1548 new_media = DE_MEDIA_TP_AUTO;
1549 else if (ecmd->duplex == DUPLEX_FULL)
1550 new_media = DE_MEDIA_TP_FD;
1551 else
1552 new_media = DE_MEDIA_TP;
1553 if (!(ecmd->advertising & ADVERTISED_TP))
1554 return -EINVAL;
1555 if (!(ecmd->advertising & (ADVERTISED_10baseT_Full | ADVERTISED_10baseT_Half)))
1556 return -EINVAL;
1557 break;
1558 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001559
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560 media_lock = (ecmd->autoneg == AUTONEG_ENABLE) ? 0 : 1;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001561
Linus Torvalds1da177e2005-04-16 15:20:36 -07001562 if ((new_media == de->media_type) &&
1563 (media_lock == de->media_lock) &&
1564 (ecmd->advertising == de->media_advertise))
1565 return 0; /* nothing to change */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001566
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 de_link_down(de);
1568 de_stop_rxtx(de);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001569
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 de->media_type = new_media;
1571 de->media_lock = media_lock;
1572 de->media_advertise = ecmd->advertising;
1573 de_set_media(de);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001574
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575 return 0;
1576}
1577
1578static void de_get_drvinfo (struct net_device *dev,struct ethtool_drvinfo *info)
1579{
1580 struct de_private *de = dev->priv;
1581
1582 strcpy (info->driver, DRV_NAME);
1583 strcpy (info->version, DRV_VERSION);
1584 strcpy (info->bus_info, pci_name(de->pdev));
1585 info->eedump_len = DE_EEPROM_SIZE;
1586}
1587
1588static int de_get_regs_len(struct net_device *dev)
1589{
1590 return DE_REGS_SIZE;
1591}
1592
1593static int de_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1594{
1595 struct de_private *de = dev->priv;
1596 int rc;
1597
1598 spin_lock_irq(&de->lock);
1599 rc = __de_get_settings(de, ecmd);
1600 spin_unlock_irq(&de->lock);
1601
1602 return rc;
1603}
1604
1605static int de_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1606{
1607 struct de_private *de = dev->priv;
1608 int rc;
1609
1610 spin_lock_irq(&de->lock);
1611 rc = __de_set_settings(de, ecmd);
1612 spin_unlock_irq(&de->lock);
1613
1614 return rc;
1615}
1616
1617static u32 de_get_msglevel(struct net_device *dev)
1618{
1619 struct de_private *de = dev->priv;
1620
1621 return de->msg_enable;
1622}
1623
1624static void de_set_msglevel(struct net_device *dev, u32 msglvl)
1625{
1626 struct de_private *de = dev->priv;
1627
1628 de->msg_enable = msglvl;
1629}
1630
1631static int de_get_eeprom(struct net_device *dev,
1632 struct ethtool_eeprom *eeprom, u8 *data)
1633{
1634 struct de_private *de = dev->priv;
1635
1636 if (!de->ee_data)
1637 return -EOPNOTSUPP;
1638 if ((eeprom->offset != 0) || (eeprom->magic != 0) ||
1639 (eeprom->len != DE_EEPROM_SIZE))
1640 return -EINVAL;
1641 memcpy(data, de->ee_data, eeprom->len);
1642
1643 return 0;
1644}
1645
1646static int de_nway_reset(struct net_device *dev)
1647{
1648 struct de_private *de = dev->priv;
1649 u32 status;
1650
1651 if (de->media_type != DE_MEDIA_TP_AUTO)
1652 return -EINVAL;
1653 if (netif_carrier_ok(de->dev))
1654 de_link_down(de);
1655
1656 status = dr32(SIAStatus);
1657 dw32(SIAStatus, (status & ~NWayState) | NWayRestart);
1658 if (netif_msg_link(de))
1659 printk(KERN_INFO "%s: link nway restart, status %x,%x\n",
1660 de->dev->name, status, dr32(SIAStatus));
1661 return 0;
1662}
1663
1664static void de_get_regs(struct net_device *dev, struct ethtool_regs *regs,
1665 void *data)
1666{
1667 struct de_private *de = dev->priv;
1668
1669 regs->version = (DE_REGS_VER << 2) | de->de21040;
1670
1671 spin_lock_irq(&de->lock);
1672 __de_get_regs(de, data);
1673 spin_unlock_irq(&de->lock);
1674}
1675
Jeff Garzik7282d492006-09-13 14:30:00 -04001676static const struct ethtool_ops de_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677 .get_link = ethtool_op_get_link,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678 .get_drvinfo = de_get_drvinfo,
1679 .get_regs_len = de_get_regs_len,
1680 .get_settings = de_get_settings,
1681 .set_settings = de_set_settings,
1682 .get_msglevel = de_get_msglevel,
1683 .set_msglevel = de_set_msglevel,
1684 .get_eeprom = de_get_eeprom,
1685 .nway_reset = de_nway_reset,
1686 .get_regs = de_get_regs,
1687};
1688
Prarit Bhargava4c44fd02007-03-06 02:42:00 -08001689static void __devinit de21040_get_mac_address (struct de_private *de)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690{
1691 unsigned i;
1692
1693 dw32 (ROMCmd, 0); /* Reset the pointer with a dummy write. */
1694
1695 for (i = 0; i < 6; i++) {
1696 int value, boguscnt = 100000;
1697 do
1698 value = dr32(ROMCmd);
1699 while (value < 0 && --boguscnt > 0);
1700 de->dev->dev_addr[i] = value;
1701 udelay(1);
1702 if (boguscnt <= 0)
1703 printk(KERN_WARNING PFX "timeout reading 21040 MAC address byte %u\n", i);
1704 }
1705}
1706
Prarit Bhargava4c44fd02007-03-06 02:42:00 -08001707static void __devinit de21040_get_media_info(struct de_private *de)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708{
1709 unsigned int i;
1710
1711 de->media_type = DE_MEDIA_TP;
1712 de->media_supported |= SUPPORTED_TP | SUPPORTED_10baseT_Full |
1713 SUPPORTED_10baseT_Half | SUPPORTED_AUI;
1714 de->media_advertise = de->media_supported;
1715
1716 for (i = 0; i < DE_MAX_MEDIA; i++) {
1717 switch (i) {
1718 case DE_MEDIA_AUI:
1719 case DE_MEDIA_TP:
1720 case DE_MEDIA_TP_FD:
1721 de->media[i].type = i;
1722 de->media[i].csr13 = t21040_csr13[i];
1723 de->media[i].csr14 = t21040_csr14[i];
1724 de->media[i].csr15 = t21040_csr15[i];
1725 break;
1726 default:
1727 de->media[i].type = DE_MEDIA_INVALID;
1728 break;
1729 }
1730 }
1731}
1732
1733/* Note: this routine returns extra data bits for size detection. */
Helge Deller4a1d2d82006-10-06 12:12:34 -06001734static unsigned __devinit tulip_read_eeprom(void __iomem *regs, int location, int addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735{
1736 int i;
1737 unsigned retval = 0;
1738 void __iomem *ee_addr = regs + ROMCmd;
1739 int read_cmd = location | (EE_READ_CMD << addr_len);
1740
1741 writel(EE_ENB & ~EE_CS, ee_addr);
1742 writel(EE_ENB, ee_addr);
1743
1744 /* Shift the read command bits out. */
1745 for (i = 4 + addr_len; i >= 0; i--) {
1746 short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
1747 writel(EE_ENB | dataval, ee_addr);
1748 readl(ee_addr);
1749 writel(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
1750 readl(ee_addr);
1751 retval = (retval << 1) | ((readl(ee_addr) & EE_DATA_READ) ? 1 : 0);
1752 }
1753 writel(EE_ENB, ee_addr);
1754 readl(ee_addr);
1755
1756 for (i = 16; i > 0; i--) {
1757 writel(EE_ENB | EE_SHIFT_CLK, ee_addr);
1758 readl(ee_addr);
1759 retval = (retval << 1) | ((readl(ee_addr) & EE_DATA_READ) ? 1 : 0);
1760 writel(EE_ENB, ee_addr);
1761 readl(ee_addr);
1762 }
1763
1764 /* Terminate the EEPROM access. */
1765 writel(EE_ENB & ~EE_CS, ee_addr);
1766 return retval;
1767}
1768
Prarit Bhargava4c44fd02007-03-06 02:42:00 -08001769static void __devinit de21041_get_srom_info (struct de_private *de)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770{
1771 unsigned i, sa_offset = 0, ofs;
1772 u8 ee_data[DE_EEPROM_SIZE + 6] = {};
1773 unsigned ee_addr_size = tulip_read_eeprom(de->regs, 0xff, 8) & 0x40000 ? 8 : 6;
1774 struct de_srom_info_leaf *il;
1775 void *bufp;
1776
1777 /* download entire eeprom */
1778 for (i = 0; i < DE_EEPROM_WORDS; i++)
Al Viroc559a5b2007-08-23 00:43:22 -04001779 ((__le16 *)ee_data)[i] =
1780 cpu_to_le16(tulip_read_eeprom(de->regs, i, ee_addr_size));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781
1782 /* DEC now has a specification but early board makers
1783 just put the address in the first EEPROM locations. */
1784 /* This does memcmp(eedata, eedata+16, 8) */
Ralf Baechlebc053d42005-10-10 14:50:46 +01001785
1786#ifndef CONFIG_MIPS_COBALT
1787
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 for (i = 0; i < 8; i ++)
1789 if (ee_data[i] != ee_data[16+i])
1790 sa_offset = 20;
1791
Ralf Baechlebc053d42005-10-10 14:50:46 +01001792#endif
1793
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794 /* store MAC address */
1795 for (i = 0; i < 6; i ++)
1796 de->dev->dev_addr[i] = ee_data[i + sa_offset];
1797
1798 /* get offset of controller 0 info leaf. ignore 2nd byte. */
1799 ofs = ee_data[SROMC0InfoLeaf];
1800 if (ofs >= (sizeof(ee_data) - sizeof(struct de_srom_info_leaf) - sizeof(struct de_srom_media_block)))
1801 goto bad_srom;
1802
1803 /* get pointer to info leaf */
1804 il = (struct de_srom_info_leaf *) &ee_data[ofs];
1805
1806 /* paranoia checks */
1807 if (il->n_blocks == 0)
1808 goto bad_srom;
1809 if ((sizeof(ee_data) - ofs) <
1810 (sizeof(struct de_srom_info_leaf) + (sizeof(struct de_srom_media_block) * il->n_blocks)))
1811 goto bad_srom;
1812
1813 /* get default media type */
1814 switch (DE_UNALIGNED_16(&il->default_media)) {
1815 case 0x0001: de->media_type = DE_MEDIA_BNC; break;
1816 case 0x0002: de->media_type = DE_MEDIA_AUI; break;
1817 case 0x0204: de->media_type = DE_MEDIA_TP_FD; break;
1818 default: de->media_type = DE_MEDIA_TP_AUTO; break;
1819 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001820
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821 if (netif_msg_probe(de))
1822 printk(KERN_INFO "de%d: SROM leaf offset %u, default media %s\n",
1823 de->board_idx, ofs,
1824 media_name[de->media_type]);
1825
1826 /* init SIA register values to defaults */
1827 for (i = 0; i < DE_MAX_MEDIA; i++) {
1828 de->media[i].type = DE_MEDIA_INVALID;
1829 de->media[i].csr13 = 0xffff;
1830 de->media[i].csr14 = 0xffff;
1831 de->media[i].csr15 = 0xffff;
1832 }
1833
1834 /* parse media blocks to see what medias are supported,
1835 * and if any custom CSR values are provided
1836 */
1837 bufp = ((void *)il) + sizeof(*il);
1838 for (i = 0; i < il->n_blocks; i++) {
1839 struct de_srom_media_block *ib = bufp;
1840 unsigned idx;
1841
1842 /* index based on media type in media block */
1843 switch(ib->opts & MediaBlockMask) {
1844 case 0: /* 10baseT */
1845 de->media_supported |= SUPPORTED_TP | SUPPORTED_10baseT_Half
1846 | SUPPORTED_Autoneg;
1847 idx = DE_MEDIA_TP;
1848 de->media[DE_MEDIA_TP_AUTO].type = DE_MEDIA_TP_AUTO;
1849 break;
1850 case 1: /* BNC */
1851 de->media_supported |= SUPPORTED_BNC;
1852 idx = DE_MEDIA_BNC;
1853 break;
1854 case 2: /* AUI */
1855 de->media_supported |= SUPPORTED_AUI;
1856 idx = DE_MEDIA_AUI;
1857 break;
1858 case 4: /* 10baseT-FD */
1859 de->media_supported |= SUPPORTED_TP | SUPPORTED_10baseT_Full
1860 | SUPPORTED_Autoneg;
1861 idx = DE_MEDIA_TP_FD;
1862 de->media[DE_MEDIA_TP_AUTO].type = DE_MEDIA_TP_AUTO;
1863 break;
1864 default:
1865 goto bad_srom;
1866 }
1867
1868 de->media[idx].type = idx;
1869
1870 if (netif_msg_probe(de))
1871 printk(KERN_INFO "de%d: media block #%u: %s",
1872 de->board_idx, i,
1873 media_name[de->media[idx].type]);
1874
1875 bufp += sizeof (ib->opts);
1876
1877 if (ib->opts & MediaCustomCSRs) {
1878 de->media[idx].csr13 = DE_UNALIGNED_16(&ib->csr13);
1879 de->media[idx].csr14 = DE_UNALIGNED_16(&ib->csr14);
1880 de->media[idx].csr15 = DE_UNALIGNED_16(&ib->csr15);
1881 bufp += sizeof(ib->csr13) + sizeof(ib->csr14) +
1882 sizeof(ib->csr15);
1883
1884 if (netif_msg_probe(de))
1885 printk(" (%x,%x,%x)\n",
1886 de->media[idx].csr13,
1887 de->media[idx].csr14,
1888 de->media[idx].csr15);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001889
Linus Torvalds1da177e2005-04-16 15:20:36 -07001890 } else if (netif_msg_probe(de))
1891 printk("\n");
1892
1893 if (bufp > ((void *)&ee_data[DE_EEPROM_SIZE - 3]))
1894 break;
1895 }
1896
1897 de->media_advertise = de->media_supported;
1898
1899fill_defaults:
1900 /* fill in defaults, for cases where custom CSRs not used */
1901 for (i = 0; i < DE_MAX_MEDIA; i++) {
1902 if (de->media[i].csr13 == 0xffff)
1903 de->media[i].csr13 = t21041_csr13[i];
1904 if (de->media[i].csr14 == 0xffff)
1905 de->media[i].csr14 = t21041_csr14[i];
1906 if (de->media[i].csr15 == 0xffff)
1907 de->media[i].csr15 = t21041_csr15[i];
1908 }
1909
Eric Sesterhennc3a9392e2006-10-23 22:20:15 +02001910 de->ee_data = kmemdup(&ee_data[0], DE_EEPROM_SIZE, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001911
1912 return;
1913
1914bad_srom:
1915 /* for error cases, it's ok to assume we support all these */
1916 for (i = 0; i < DE_MAX_MEDIA; i++)
1917 de->media[i].type = i;
1918 de->media_supported =
1919 SUPPORTED_10baseT_Half |
1920 SUPPORTED_10baseT_Full |
1921 SUPPORTED_Autoneg |
1922 SUPPORTED_TP |
1923 SUPPORTED_AUI |
1924 SUPPORTED_BNC;
1925 goto fill_defaults;
1926}
1927
Helge Deller4a1d2d82006-10-06 12:12:34 -06001928static int __devinit de_init_one (struct pci_dev *pdev,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001929 const struct pci_device_id *ent)
1930{
1931 struct net_device *dev;
1932 struct de_private *de;
1933 int rc;
1934 void __iomem *regs;
Jeff Garzikafc70972005-08-31 06:11:16 -04001935 unsigned long pciaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 static int board_idx = -1;
Joe Perches0795af52007-10-03 17:59:30 -07001937 DECLARE_MAC_BUF(mac);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001938
1939 board_idx++;
1940
1941#ifndef MODULE
1942 if (board_idx == 0)
1943 printk("%s", version);
1944#endif
1945
1946 /* allocate a new ethernet device structure, and fill in defaults */
1947 dev = alloc_etherdev(sizeof(struct de_private));
1948 if (!dev)
1949 return -ENOMEM;
1950
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 SET_NETDEV_DEV(dev, &pdev->dev);
1952 dev->open = de_open;
1953 dev->stop = de_close;
1954 dev->set_multicast_list = de_set_rx_mode;
1955 dev->hard_start_xmit = de_start_xmit;
1956 dev->get_stats = de_get_stats;
1957 dev->ethtool_ops = &de_ethtool_ops;
1958 dev->tx_timeout = de_tx_timeout;
1959 dev->watchdog_timeo = TX_TIMEOUT;
1960
1961 de = dev->priv;
1962 de->de21040 = ent->driver_data == 0 ? 1 : 0;
1963 de->pdev = pdev;
1964 de->dev = dev;
1965 de->msg_enable = (debug < 0 ? DE_DEF_MSG_ENABLE : debug);
1966 de->board_idx = board_idx;
1967 spin_lock_init (&de->lock);
1968 init_timer(&de->media_timer);
1969 if (de->de21040)
1970 de->media_timer.function = de21040_media_timer;
1971 else
1972 de->media_timer.function = de21041_media_timer;
1973 de->media_timer.data = (unsigned long) de;
1974
1975 netif_carrier_off(dev);
1976 netif_stop_queue(dev);
1977
1978 /* wake up device, assign resources */
1979 rc = pci_enable_device(pdev);
1980 if (rc)
1981 goto err_out_free;
1982
1983 /* reserve PCI resources to ensure driver atomicity */
1984 rc = pci_request_regions(pdev, DRV_NAME);
1985 if (rc)
1986 goto err_out_disable;
1987
1988 /* check for invalid IRQ value */
1989 if (pdev->irq < 2) {
1990 rc = -EIO;
1991 printk(KERN_ERR PFX "invalid irq (%d) for pci dev %s\n",
1992 pdev->irq, pci_name(pdev));
1993 goto err_out_res;
1994 }
1995
1996 dev->irq = pdev->irq;
1997
1998 /* obtain and check validity of PCI I/O address */
1999 pciaddr = pci_resource_start(pdev, 1);
2000 if (!pciaddr) {
2001 rc = -EIO;
2002 printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n",
2003 pci_name(pdev));
2004 goto err_out_res;
2005 }
2006 if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) {
2007 rc = -EIO;
Greg Kroah-Hartman7c7459d2006-06-12 15:13:08 -07002008 printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n",
2009 (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 goto err_out_res;
2011 }
2012
2013 /* remap CSR registers */
2014 regs = ioremap_nocache(pciaddr, DE_REGS_SIZE);
2015 if (!regs) {
2016 rc = -EIO;
Greg Kroah-Hartman7c7459d2006-06-12 15:13:08 -07002017 printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n",
2018 (unsigned long long)pci_resource_len(pdev, 1),
2019 pciaddr, pci_name(pdev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020 goto err_out_res;
2021 }
2022 dev->base_addr = (unsigned long) regs;
2023 de->regs = regs;
2024
2025 de_adapter_wake(de);
2026
2027 /* make sure hardware is not running */
2028 rc = de_reset_mac(de);
2029 if (rc) {
2030 printk(KERN_ERR PFX "Cannot reset MAC, pci dev %s\n",
2031 pci_name(pdev));
2032 goto err_out_iomap;
2033 }
2034
2035 /* get MAC address, initialize default media type and
2036 * get list of supported media
2037 */
2038 if (de->de21040) {
2039 de21040_get_mac_address(de);
2040 de21040_get_media_info(de);
2041 } else {
2042 de21041_get_srom_info(de);
2043 }
2044
2045 /* register new network interface with kernel */
2046 rc = register_netdev(dev);
2047 if (rc)
2048 goto err_out_iomap;
2049
2050 /* print info about board and interface just registered */
Joe Perches0795af52007-10-03 17:59:30 -07002051 printk (KERN_INFO "%s: %s at 0x%lx, %s, IRQ %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 dev->name,
2053 de->de21040 ? "21040" : "21041",
2054 dev->base_addr,
Joe Perches0795af52007-10-03 17:59:30 -07002055 print_mac(mac, dev->dev_addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056 dev->irq);
2057
2058 pci_set_drvdata(pdev, dev);
2059
2060 /* enable busmastering */
2061 pci_set_master(pdev);
2062
2063 /* put adapter to sleep */
2064 de_adapter_sleep(de);
2065
2066 return 0;
2067
2068err_out_iomap:
Jesper Juhlb4558ea2005-10-28 16:53:13 -04002069 kfree(de->ee_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070 iounmap(regs);
2071err_out_res:
2072 pci_release_regions(pdev);
2073err_out_disable:
2074 pci_disable_device(pdev);
2075err_out_free:
2076 free_netdev(dev);
2077 return rc;
2078}
2079
Helge Deller4a1d2d82006-10-06 12:12:34 -06002080static void __devexit de_remove_one (struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081{
2082 struct net_device *dev = pci_get_drvdata(pdev);
2083 struct de_private *de = dev->priv;
2084
Eric Sesterhenn / snakebyte7e0b58f2006-01-26 22:02:43 +01002085 BUG_ON(!dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 unregister_netdev(dev);
Jesper Juhlb4558ea2005-10-28 16:53:13 -04002087 kfree(de->ee_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 iounmap(de->regs);
2089 pci_release_regions(pdev);
2090 pci_disable_device(pdev);
2091 pci_set_drvdata(pdev, NULL);
2092 free_netdev(dev);
2093}
2094
2095#ifdef CONFIG_PM
2096
Pavel Machek05adc3b2005-04-16 15:25:25 -07002097static int de_suspend (struct pci_dev *pdev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098{
2099 struct net_device *dev = pci_get_drvdata (pdev);
2100 struct de_private *de = dev->priv;
2101
2102 rtnl_lock();
2103 if (netif_running (dev)) {
2104 del_timer_sync(&de->media_timer);
2105
2106 disable_irq(dev->irq);
2107 spin_lock_irq(&de->lock);
2108
2109 de_stop_hw(de);
2110 netif_stop_queue(dev);
2111 netif_device_detach(dev);
2112 netif_carrier_off(dev);
2113
2114 spin_unlock_irq(&de->lock);
2115 enable_irq(dev->irq);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04002116
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 /* Update the error counts. */
2118 __de_get_stats(de);
2119
2120 synchronize_irq(dev->irq);
2121 de_clean_rings(de);
2122
2123 de_adapter_sleep(de);
2124 pci_disable_device(pdev);
2125 } else {
2126 netif_device_detach(dev);
2127 }
2128 rtnl_unlock();
2129 return 0;
2130}
2131
2132static int de_resume (struct pci_dev *pdev)
2133{
2134 struct net_device *dev = pci_get_drvdata (pdev);
2135 struct de_private *de = dev->priv;
Valerie Henson9f486ae2006-09-08 11:15:41 -07002136 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137
2138 rtnl_lock();
2139 if (netif_device_present(dev))
2140 goto out;
Valerie Henson9f486ae2006-09-08 11:15:41 -07002141 if (!netif_running(dev))
2142 goto out_attach;
2143 if ((retval = pci_enable_device(pdev))) {
2144 printk (KERN_ERR "%s: pci_enable_device failed in resume\n",
2145 dev->name);
2146 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147 }
Valerie Henson9f486ae2006-09-08 11:15:41 -07002148 de_init_hw(de);
2149out_attach:
2150 netif_device_attach(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151out:
2152 rtnl_unlock();
2153 return 0;
2154}
2155
2156#endif /* CONFIG_PM */
2157
2158static struct pci_driver de_driver = {
2159 .name = DRV_NAME,
2160 .id_table = de_pci_tbl,
2161 .probe = de_init_one,
Helge Deller4a1d2d82006-10-06 12:12:34 -06002162 .remove = __devexit_p(de_remove_one),
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163#ifdef CONFIG_PM
2164 .suspend = de_suspend,
2165 .resume = de_resume,
2166#endif
2167};
2168
2169static int __init de_init (void)
2170{
2171#ifdef MODULE
2172 printk("%s", version);
2173#endif
Jeff Garzik29917622006-08-19 17:48:59 -04002174 return pci_register_driver(&de_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175}
2176
2177static void __exit de_exit (void)
2178{
2179 pci_unregister_driver (&de_driver);
2180}
2181
2182module_init(de_init);
2183module_exit(de_exit);