1 /**************************************************************************
3 * sundance.c -- Etherboot device driver for the Sundance ST201 "Alta".
4 * Written 2002-2002 by Timothy Legge <tlegge@rogers.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * Portions of this code based on:
21 * sundance.c: A Linux device driver for the Sundance ST201 "Alta"
22 * Written 1999-2002 by Donald Becker
24 * tulip.c: Tulip and Clone Etherboot Driver
26 * Copyright (C) 2001 Entity Cyber, Inc.
28 * Linux Driver Version LK1.09a, 10-Jul-2003 (2.4.25)
32 * v1.1 01-01-2003 timlegge Initial implementation
33 * v1.7 04-10-2003 timlegge Transfers Linux Kernel (30 sec)
34 * v1.8 04-13-2003 timlegge Fix multiple transmission bug
35 * v1.9 08-19-2003 timlegge Support Multicast
36 * v1.10 01-17-2004 timlegge Initial driver output cleanup
37 * v1.11 03-21-2004 timlegge Remove unused variables
38 * v1.12 03-21-2004 timlegge Remove excess MII defines
39 * v1.13 03-24-2004 timlegge Update to Linux 2.4.25 driver
41 ****************************************************************************/
43 FILE_LICENCE ( GPL2_OR_LATER
);
45 /* to get some global routines like printf */
46 #include "etherboot.h"
47 /* to get the interface to the body of the program */
49 /* to get the PCI support functions, if this is a PCI NIC */
53 #define drv_version "v1.12"
54 #define drv_date "2004-03-21"
58 /* Condensed operations for readability. */
59 #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr))
60 #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr))
63 static int mtu
= 1514;
65 /* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
66 The sundance uses a 64 element hash table based on the Ethernet CRC. */
67 // static int multicast_filter_limit = 32;
69 /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
70 Setting to > 1518 effectively disables this feature.
71 This chip can receive into any byte alignment buffers, so word-oriented
72 archs do not need a copy-align of the IP header. */
73 static int rx_copybreak
= 0;
74 static int flowctrl
= 1;
76 /* Allow forcing the media type */
77 /* media[] specifies the media type the NIC operates at.
78 autosense Autosensing active media.
79 10mbps_hd 10Mbps half duplex.
80 10mbps_fd 10Mbps full duplex.
81 100mbps_hd 100Mbps half duplex.
82 100mbps_fd 100Mbps full duplex.
84 static char media
[] = "autosense";
86 /* Operational parameters that are set at compile time. */
88 /* As Etherboot uses a Polling driver we can keep the number of rings
89 to the minimum number required. In general that is 1 transmit and 4 receive receive rings. However some cards require that
90 there be a minimum of 2 rings */
91 #define TX_RING_SIZE 2
92 #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */
93 #define RX_RING_SIZE 4
96 /* Operational parameters that usually are not changed. */
97 /* Time in jiffies before concluding the transmitter is hung. */
98 #define TX_TIME_OUT (4*HZ)
99 #define PKT_BUF_SZ 1536
101 /* Offsets to the device registers.
102 Unlike software-only systems, device drivers interact with complex hardware.
103 It's not useful to define symbolic names for every register bit in the
104 device. The name can only partially document the semantics and make
105 the driver longer and more difficult to read.
106 In general, only the important configuration values or bits changed
107 multiple times should be defined symbolically.
112 TxDMABurstThresh
= 0x08,
113 TxDMAUrgentThresh
= 0x09,
114 TxDMAPollPeriod
= 0x0a,
119 RxDMABurstThresh
= 0x14,
120 RxDMAUrgentThresh
= 0x15,
121 RxDMAPollPeriod
= 0x16,
126 TxStartThresh
= 0x3c,
127 RxEarlyThresh
= 0x3e,
142 MulticastFilter0
= 0x60,
143 MulticastFilter1
= 0x64,
150 StatsCarrierError
= 0x74,
151 StatsLateColl
= 0x75,
152 StatsMultiColl
= 0x76,
156 StatsTxXSDefer
= 0x7a,
162 /* Aliased and bogus values! */
165 enum ASICCtrl_HiWord_bit
{
166 GlobalReset
= 0x0001,
171 NetworkReset
= 0x0020,
176 /* Bits in the interrupt status/mask registers. */
177 enum intr_status_bits
{
178 IntrSummary
= 0x0001, IntrPCIErr
= 0x0002, IntrMACCtrl
= 0x0008,
179 IntrTxDone
= 0x0004, IntrRxDone
= 0x0010, IntrRxStart
= 0x0020,
180 IntrDrvRqst
= 0x0040,
181 StatsMax
= 0x0080, LinkChange
= 0x0100,
182 IntrTxDMADone
= 0x0200, IntrRxDMADone
= 0x0400,
185 /* Bits in the RxMode register. */
187 AcceptAllIPMulti
= 0x20, AcceptMultiHash
= 0x10, AcceptAll
= 0x08,
188 AcceptBroadcast
= 0x04, AcceptMulticast
= 0x02, AcceptMyPhys
=
191 /* Bits in MACCtrl. */
192 enum mac_ctrl0_bits
{
193 EnbFullDuplex
= 0x20, EnbRcvLargeFrame
= 0x40,
194 EnbFlowCtrl
= 0x100, EnbPassRxCRC
= 0x200,
196 enum mac_ctrl1_bits
{
197 StatsEnable
= 0x0020, StatsDisable
= 0x0040, StatsEnabled
= 0x0080,
198 TxEnable
= 0x0100, TxDisable
= 0x0200, TxEnabled
= 0x0400,
199 RxEnable
= 0x0800, RxDisable
= 0x1000, RxEnabled
= 0x2000,
202 /* The Rx and Tx buffer descriptors.
203 Using only 32 bit fields simplifies software endian correction.
204 This structure must be aligned, and should avoid spanning cache lines.
213 /* Bits in netdev_desc.status */
214 enum desc_status_bits
{
216 DescEndPacket
= 0x4000,
217 DescEndRing
= 0x2000,
218 LastFrag
= 0x80000000,
219 DescIntrOnTx
= 0x8000,
220 DescIntrOnDMADone
= 0x80000000,
221 DisableAlign
= 0x00000001,
224 /**********************************************
225 * Descriptor Ring and Buffer defination
226 ***********************************************/
227 /* Define the TX Descriptor */
228 static struct netdev_desc tx_ring
[TX_RING_SIZE
];
230 /* Define the RX Descriptor */
231 static struct netdev_desc rx_ring
[RX_RING_SIZE
];
233 /* Create a static buffer of size PKT_BUF_SZ for each RX and TX descriptor.
234 All descriptors point to a part of this buffer */
236 unsigned char txb
[PKT_BUF_SZ
* TX_RING_SIZE
];
237 unsigned char rxb
[RX_RING_SIZE
* PKT_BUF_SZ
];
238 } rx_tx_buf __shared
;
239 #define rxb rx_tx_buf.rxb
240 #define txb rx_tx_buf.txb
242 /* FIXME: Move BASE to the private structure */
244 #define EEPROM_SIZE 128
246 enum pci_id_flags_bits
{
247 PCI_USES_IO
= 1, PCI_USES_MEM
= 2, PCI_USES_MASTER
= 4,
248 PCI_ADDR0
= 0 << 4, PCI_ADDR1
= 1 << 4, PCI_ADDR2
=
249 2 << 4, PCI_ADDR3
= 3 << 4,
252 enum chip_capability_flags
{ CanHaveMII
= 1, KendinPktDropBug
= 2, };
253 #define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0)
256 static struct sundance_private
{
257 const char *nic_name
;
258 /* Frequently used values */
260 unsigned int cur_rx
; /* Producer/consumer ring indicies */
263 /* These values keep track of the tranceiver/media in use */
264 unsigned int flowctrl
:1;
265 unsigned int an_enable
:1;
269 /* MII tranceiver section */
270 struct mii_if_info mii_if
;
271 int mii_preamble_required
;
272 unsigned char phys
[MII_CNT
];
273 unsigned char pci_rev_id
;
276 static struct sundance_private
*sdc
;
278 /* Station Address location within the EEPROM */
279 #define EEPROM_SA_OFFSET 0x10
280 #define DEFAULT_INTR (IntrRxDMADone | IntrPCIErr | \
281 IntrDrvRqst | IntrTxDone | StatsMax | \
284 static int eeprom_read(long ioaddr
, int location
);
285 static int mdio_read(struct nic
*nic
, int phy_id
, unsigned int location
);
286 static void mdio_write(struct nic
*nic
, int phy_id
, unsigned int location
,
288 static void set_rx_mode(struct nic
*nic
);
290 static void check_duplex(struct nic
*nic
)
292 int mii_lpa
= mdio_read(nic
, sdc
->phys
[0], MII_LPA
);
293 int negotiated
= mii_lpa
& sdc
->mii_if
.advertising
;
297 if (!sdc
->an_enable
|| mii_lpa
== 0xffff) {
298 if (sdc
->mii_if
.full_duplex
)
299 outw(inw(BASE
+ MACCtrl0
) | EnbFullDuplex
,
304 /* Autonegotiation */
305 duplex
= (negotiated
& 0x0100) || (negotiated
& 0x01C0) == 0x0040;
306 if (sdc
->mii_if
.full_duplex
!= duplex
) {
307 sdc
->mii_if
.full_duplex
= duplex
;
308 DBG ("%s: Setting %s-duplex based on MII #%d "
309 "negotiated capability %4.4x.\n", sdc
->nic_name
,
310 duplex
? "full" : "half", sdc
->phys
[0],
312 outw(inw(BASE
+ MACCtrl0
) | duplex
? 0x20 : 0,
318 /**************************************************************************
319 * init_ring - setup the tx and rx descriptors
320 *************************************************************************/
321 static void init_ring(struct nic
*nic __unused
)
327 /* Initialize all the Rx descriptors */
328 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
329 rx_ring
[i
].next_desc
= virt_to_le32desc(&rx_ring
[i
+ 1]);
330 rx_ring
[i
].status
= 0;
331 rx_ring
[i
].length
= 0;
335 /* Mark the last entry as wrapping the ring */
336 rx_ring
[i
- 1].next_desc
= virt_to_le32desc(&rx_ring
[0]);
338 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
339 rx_ring
[i
].addr
= virt_to_le32desc(&rxb
[i
* PKT_BUF_SZ
]);
340 rx_ring
[i
].length
= cpu_to_le32(PKT_BUF_SZ
| LastFrag
);
343 /* We only use one transmit buffer, but two
344 * descriptors so transmit engines have somewhere
345 * to point should they feel the need */
346 tx_ring
[0].status
= 0x00000000;
347 tx_ring
[0].addr
= virt_to_bus(&txb
[0]);
348 tx_ring
[0].next_desc
= 0; /* virt_to_bus(&tx_ring[1]); */
350 /* This descriptor is never used */
351 tx_ring
[1].status
= 0x00000000;
352 tx_ring
[1].addr
= 0; /*virt_to_bus(&txb[0]); */
353 tx_ring
[1].next_desc
= 0;
355 /* Mark the last entry as wrapping the ring,
356 * though this should never happen */
357 tx_ring
[1].length
= cpu_to_le32(LastFrag
| PKT_BUF_SZ
);
360 /**************************************************************************
361 * RESET - Reset Adapter
362 * ***********************************************************************/
363 static void sundance_reset(struct nic
*nic
)
369 outl(virt_to_le32desc(&rx_ring
[0]), BASE
+ RxListPtr
);
370 /* The Tx List Pointer is written as packets are queued */
372 /* Initialize other registers. */
373 /* __set_mac_addr(dev); */
377 addr16
= (nic
->node_addr
[0] | (nic
->node_addr
[1] << 8));
378 outw(addr16
, BASE
+ StationAddr
);
379 addr16
= (nic
->node_addr
[2] | (nic
->node_addr
[3] << 8));
380 outw(addr16
, BASE
+ StationAddr
+ 2);
381 addr16
= (nic
->node_addr
[4] | (nic
->node_addr
[5] << 8));
382 outw(addr16
, BASE
+ StationAddr
+ 4);
385 outw(sdc
->mtu
+ 14, BASE
+ MaxFrameSize
);
386 if (sdc
->mtu
> 2047) /* this will never happen with default options */
387 outl(inl(BASE
+ ASICCtrl
) | 0x0c, BASE
+ ASICCtrl
);
391 outw(0, BASE
+ DownCounter
);
392 /* Set the chip to poll every N*30nsec */
393 outb(100, BASE
+ RxDMAPollPeriod
);
395 /* Fix DFE-580TX packet drop issue */
396 if (sdc
->pci_rev_id
>= 0x14)
397 writeb(0x01, BASE
+ DebugCtrl1
);
399 outw(RxEnable
| TxEnable
, BASE
+ MACCtrl1
);
401 /* Construct a perfect filter frame with the mac address as first match
402 * and broadcast for all others */
403 for (i
= 0; i
< 192; i
++)
406 txb
[0] = nic
->node_addr
[0];
407 txb
[1] = nic
->node_addr
[1];
408 txb
[2] = nic
->node_addr
[2];
409 txb
[3] = nic
->node_addr
[3];
410 txb
[4] = nic
->node_addr
[4];
411 txb
[5] = nic
->node_addr
[5];
413 DBG ( "%s: Done sundance_reset, status: Rx %hX Tx %hX "
414 "MAC Control %hX, %hX %hX\n",
415 sdc
->nic_name
, (int) inl(BASE
+ RxStatus
),
416 (int) inw(BASE
+ TxStatus
), (int) inl(BASE
+ MACCtrl0
),
417 (int) inw(BASE
+ MACCtrl1
), (int) inw(BASE
+ MACCtrl0
) );
420 /**************************************************************************
421 IRQ - Wait for a frame
422 ***************************************************************************/
423 static void sundance_irq ( struct nic
*nic
, irq_action_t action
) {
424 unsigned int intr_status
;
429 intr_status
= inw(nic
->ioaddr
+ IntrStatus
);
430 intr_status
= intr_status
& ~DEFAULT_INTR
;
431 if ( action
== ENABLE
)
432 intr_status
= intr_status
| DEFAULT_INTR
;
433 outw(intr_status
, nic
->ioaddr
+ IntrEnable
);
436 outw(0x0200, BASE
+ ASICCtrl
);
440 /**************************************************************************
441 POLL - Wait for a frame
442 ***************************************************************************/
443 static int sundance_poll(struct nic
*nic
, int retreive
)
445 /* return true if there's an ethernet packet ready to read */
446 /* nic->packet should contain data on return */
447 /* nic->packetlen should contain length of data */
448 int entry
= sdc
->cur_rx
% RX_RING_SIZE
;
449 u32 frame_status
= le32_to_cpu(rx_ring
[entry
].status
);
453 if (!(frame_status
& DescOwn
))
456 /* There is a packet ready */
460 intr_status
= inw(nic
->ioaddr
+ IntrStatus
);
461 outw(intr_status
, nic
->ioaddr
+ IntrStatus
);
463 pkt_len
= frame_status
& 0x1fff;
465 if (frame_status
& 0x001f4000) {
466 DBG ( "Polling frame_status error\n" ); /* Do we really care about this */
468 if (pkt_len
< rx_copybreak
) {
469 /* FIXME: What should happen Will this ever occur */
470 printf("Poll Error: pkt_len < rx_copybreak");
472 nic
->packetlen
= pkt_len
;
473 memcpy(nic
->packet
, rxb
+
474 (sdc
->cur_rx
* PKT_BUF_SZ
), nic
->packetlen
);
478 rx_ring
[entry
].length
= cpu_to_le32(PKT_BUF_SZ
| LastFrag
);
479 rx_ring
[entry
].status
= 0;
481 sdc
->cur_rx
= entry
% RX_RING_SIZE
;
482 outw(DEFAULT_INTR
& ~(IntrRxDone
|IntrRxDMADone
),
483 nic
->ioaddr
+ IntrStatus
);
487 /**************************************************************************
488 TRANSMIT - Transmit a frame
489 ***************************************************************************/
490 static void sundance_transmit(struct nic
*nic
, const char *d
, /* Destination */
491 unsigned int t
, /* Type */
492 unsigned int s
, /* size */
499 outw(TxDisable
, BASE
+ MACCtrl1
);
501 memcpy(txb
, d
, ETH_ALEN
);
502 memcpy(txb
+ ETH_ALEN
, nic
->node_addr
, ETH_ALEN
);
503 nstype
= htons((u16
) t
);
504 memcpy(txb
+ 2 * ETH_ALEN
, (u8
*) & nstype
, 2);
505 memcpy(txb
+ ETH_HLEN
, p
, s
);
512 /* Setup the transmit descriptor */
513 tx_ring
[0].length
= cpu_to_le32(s
| LastFrag
);
514 tx_ring
[0].status
= cpu_to_le32(0x00000001);
516 /* Point to transmit descriptor */
517 outl(virt_to_le32desc(&tx_ring
[0]), BASE
+ TxListPtr
);
520 outw(TxEnable
, BASE
+ MACCtrl1
);
521 /* Trigger an immediate send */
522 outw(0, BASE
+ TxStatus
);
524 to
= currticks() + TX_TIME_OUT
;
525 while (!(tx_ring
[0].status
& 0x00010000) && (currticks() < to
)); /* wait */
527 if (currticks() >= to
) {
528 printf("TX Time Out");
531 outw(TxDisable
, BASE
+ MACCtrl1
);
535 /**************************************************************************
536 DISABLE - Turn off ethernet interface
537 ***************************************************************************/
538 static void sundance_disable ( struct nic
*nic __unused
) {
539 /* put the card in its initial state */
540 /* This function serves 3 purposes.
541 * This disables DMA and interrupts so we don't receive
542 * unexpected packets or interrupts from the card after
543 * etherboot has finished.
544 * This frees resources so etherboot may use
545 * this driver on another interface
546 * This allows etherboot to reinitialize the interface
547 * if something is something goes wrong.
549 outw(0x0000, BASE
+ IntrEnable
);
550 /* Stop the Chipchips Tx and Rx Status */
551 outw(TxDisable
| RxDisable
| StatsDisable
, BASE
+ MACCtrl1
);
554 static struct nic_operations sundance_operations
= {
555 .connect
= dummy_connect
,
556 .poll
= sundance_poll
,
557 .transmit
= sundance_transmit
,
562 /**************************************************************************
563 PROBE - Look for an adapter, this routine's visible to the outside
564 ***************************************************************************/
565 static int sundance_probe ( struct nic
*nic
, struct pci_device
*pci
) {
567 u8 ee_data
[EEPROM_SIZE
];
572 if (pci
->ioaddr
== 0)
575 /* BASE is used throughout to address the card */
577 printf(" sundance.c: Found %s Vendor=0x%hX Device=0x%hX\n",
578 pci
->driver_name
, pci
->vendor
, pci
->device
);
580 /* Get the MAC Address by reading the EEPROM */
581 for (i
= 0; i
< 3; i
++) {
582 ((u16
*) ee_data
)[i
] =
583 le16_to_cpu(eeprom_read(BASE
, i
+ EEPROM_SA_OFFSET
));
585 /* Update the nic structure with the MAC Address */
586 for (i
= 0; i
< ETH_ALEN
; i
++) {
587 nic
->node_addr
[i
] = ee_data
[i
];
590 /* Set the card as PCI Bus Master */
591 adjust_pci_device(pci
);
593 // sdc->mii_if.dev = pci;
594 // sdc->mii_if.phy_id_mask = 0x1f;
595 // sdc->mii_if.reg_num_mask = 0x1f;
597 /* point to private storage */
600 sdc
->nic_name
= pci
->driver_name
;
603 pci_read_config_byte(pci
, PCI_REVISION_ID
, &sdc
->pci_rev_id
);
605 DBG ( "Device revision id: %hx\n", sdc
->pci_rev_id
);
607 /* Print out some hardware info */
608 DBG ( "%s: %s at ioaddr %hX, ", pci
->driver_name
, nic
->node_addr
, (unsigned int) BASE
);
610 sdc
->mii_preamble_required
= 0;
612 int phy
, phy_idx
= 0;
613 sdc
->phys
[0] = 1; /* Default Setting */
614 sdc
->mii_preamble_required
++;
615 for (phy
= 1; phy
< 32 && phy_idx
< MII_CNT
; phy
++) {
616 int mii_status
= mdio_read(nic
, phy
, MII_BMSR
);
617 if (mii_status
!= 0xffff && mii_status
!= 0x0000) {
618 sdc
->phys
[phy_idx
++] = phy
;
619 sdc
->mii_if
.advertising
=
620 mdio_read(nic
, phy
, MII_ADVERTISE
);
621 if ((mii_status
& 0x0040) == 0)
622 sdc
->mii_preamble_required
++;
624 ( "%s: MII PHY found at address %d, status " "%hX advertising %hX\n", sdc
->nic_name
, phy
, mii_status
, sdc
->mii_if
.advertising
);
627 sdc
->mii_preamble_required
--;
629 printf("%s: No MII transceiver found!\n",
631 sdc
->mii_if
.phy_id
= sdc
->phys
[0];
634 /* Parse override configuration */
636 if (strcasecmp(media
, "autosense") != 0) {
638 if (strcasecmp(media
, "100mbps_fd") == 0 ||
639 strcasecmp(media
, "4") == 0) {
641 sdc
->mii_if
.full_duplex
= 1;
642 } else if (strcasecmp(media
, "100mbps_hd") == 0
643 || strcasecmp(media
, "3") == 0) {
645 sdc
->mii_if
.full_duplex
= 0;
646 } else if (strcasecmp(media
, "10mbps_fd") == 0 ||
647 strcasecmp(media
, "2") == 0) {
649 sdc
->mii_if
.full_duplex
= 1;
650 } else if (strcasecmp(media
, "10mbps_hd") == 0 ||
651 strcasecmp(media
, "1") == 0) {
653 sdc
->mii_if
.full_duplex
= 0;
662 if (inl(BASE
+ ASICCtrl
) & 0x80) {
663 /* Default 100Mbps Full */
664 if (sdc
->an_enable
) {
666 sdc
->mii_if
.full_duplex
= 1;
671 /* The Linux driver uses flow control and resets the link here. This means the
672 mii section from above would need to be re done I believe. Since it serves
673 no real purpose leave it out. */
675 /* Force media type */
676 if (!sdc
->an_enable
) {
678 mii_ctl
|= (sdc
->speed
== 100) ? BMCR_SPEED100
: 0;
679 mii_ctl
|= (sdc
->mii_if
.full_duplex
) ? BMCR_FULLDPLX
: 0;
680 mdio_write(nic
, sdc
->phys
[0], MII_BMCR
, mii_ctl
);
681 printf("Override speed=%d, %s duplex\n",
683 sdc
->mii_if
.full_duplex
? "Full" : "Half");
686 /* Reset the chip to erase previous misconfiguration */
687 DBG ( "ASIC Control is %#x\n", inl(BASE
+ ASICCtrl
) );
688 outw(0x007f, BASE
+ ASICCtrl
+ 2);
691 * wait for reset to complete
692 * this is heavily inspired by the linux sundance driver
693 * according to the linux driver it can take up to 1ms for the reset
697 while(inl(BASE
+ ASICCtrl
) & (ResetBusy
<< 16)) {
699 DBG("sundance: NIC reset did not complete.\n");
705 DBG ( "ASIC Control is now %#x.\n", inl(BASE
+ ASICCtrl
) );
708 if (sdc
->an_enable
) {
709 u16 mii_advertise
, mii_lpa
;
711 mdio_read(nic
, sdc
->phys
[0], MII_ADVERTISE
);
712 mii_lpa
= mdio_read(nic
, sdc
->phys
[0], MII_LPA
);
713 mii_advertise
&= mii_lpa
;
714 if (mii_advertise
& ADVERTISE_100FULL
)
716 else if (mii_advertise
& ADVERTISE_100HALF
)
718 else if (mii_advertise
& ADVERTISE_10FULL
)
720 else if (mii_advertise
& ADVERTISE_10HALF
)
723 mii_ctl
= mdio_read(nic
, sdc
->phys
[0], MII_BMCR
);
724 speed
= (mii_ctl
& BMCR_SPEED100
) ? 100 : 10;
726 printf("%s: Link changed: %dMbps ,", sdc
->nic_name
, speed
);
727 printf("%s duplex.\n", (mii_ctl
& BMCR_FULLDPLX
) ?
731 if (sdc
->flowctrl
&& sdc
->mii_if
.full_duplex
) {
732 outw(inw(BASE
+ MulticastFilter1
+ 2) | 0x0200,
733 BASE
+ MulticastFilter1
+ 2);
734 outw(inw(BASE
+ MACCtrl0
) | EnbFlowCtrl
, BASE
+ MACCtrl0
);
736 printf("%dMbps, %s-Duplex\n", sdc
->speed
,
737 sdc
->mii_if
.full_duplex
? "Full" : "Half");
739 /* point to NIC specific routines */
740 nic
->nic_op
= &sundance_operations
;
742 nic
->irqno
= pci
->irq
;
749 /* Read the EEPROM and MII Management Data I/O (MDIO) interfaces. */
750 static int eeprom_read(long ioaddr
, int location
)
752 int boguscnt
= 10000; /* Typical 1900 ticks */
753 outw(0x0200 | (location
& 0xff), ioaddr
+ EECtrl
);
755 if (!(inw(ioaddr
+ EECtrl
) & 0x8000)) {
756 return inw(ioaddr
+ EEData
);
759 while (--boguscnt
> 0);
763 /* MII transceiver control section.
764 Read and write the MII registers using software-generated serial
765 MDIO protocol. See the MII specifications or DP83840A data sheet
768 The maximum data clock rate is 2.5 Mhz.
769 The timing is decoupled from the processor clock by flushing the write
770 from the CPU write buffer with a following read, and using PCI
773 #define mdio_in(mdio_addr) inb(mdio_addr)
774 #define mdio_out(value, mdio_addr) outb(value, mdio_addr)
775 #define mdio_delay(mdio_addr) inb(mdio_addr)
778 MDIO_ShiftClk
= 0x0001, MDIO_Data
= 0x0002, MDIO_EnbOutput
=
781 #define MDIO_EnbIn (0)
782 #define MDIO_WRITE0 (MDIO_EnbOutput)
783 #define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput)
785 /* Generate the preamble required for initial synchronization and
786 a few older transceivers. */
787 static void mdio_sync(long mdio_addr
)
791 /* Establish sync by sending at least 32 logic ones. */
792 while (--bits
>= 0) {
793 mdio_out(MDIO_WRITE1
, mdio_addr
);
794 mdio_delay(mdio_addr
);
795 mdio_out(MDIO_WRITE1
| MDIO_ShiftClk
, mdio_addr
);
796 mdio_delay(mdio_addr
);
801 mdio_read(struct nic
*nic __unused
, int phy_id
, unsigned int location
)
803 long mdio_addr
= BASE
+ MIICtrl
;
804 int mii_cmd
= (0xf6 << 10) | (phy_id
<< 5) | location
;
807 if (sdc
->mii_preamble_required
)
808 mdio_sync(mdio_addr
);
810 /* Shift the read command bits out. */
811 for (i
= 15; i
>= 0; i
--) {
813 (mii_cmd
& (1 << i
)) ? MDIO_WRITE1
: MDIO_WRITE0
;
815 mdio_out(dataval
, mdio_addr
);
816 mdio_delay(mdio_addr
);
817 mdio_out(dataval
| MDIO_ShiftClk
, mdio_addr
);
818 mdio_delay(mdio_addr
);
820 /* Read the two transition, 16 data, and wire-idle bits. */
821 for (i
= 19; i
> 0; i
--) {
822 mdio_out(MDIO_EnbIn
, mdio_addr
);
823 mdio_delay(mdio_addr
);
824 retval
= (retval
<< 1) | ((mdio_in(mdio_addr
) & MDIO_Data
)
826 mdio_out(MDIO_EnbIn
| MDIO_ShiftClk
, mdio_addr
);
827 mdio_delay(mdio_addr
);
829 return (retval
>> 1) & 0xffff;
833 mdio_write(struct nic
*nic __unused
, int phy_id
,
834 unsigned int location
, int value
)
836 long mdio_addr
= BASE
+ MIICtrl
;
838 (0x5002 << 16) | (phy_id
<< 23) | (location
<< 18) | value
;
841 if (sdc
->mii_preamble_required
)
842 mdio_sync(mdio_addr
);
844 /* Shift the command bits out. */
845 for (i
= 31; i
>= 0; i
--) {
847 (mii_cmd
& (1 << i
)) ? MDIO_WRITE1
: MDIO_WRITE0
;
848 mdio_out(dataval
, mdio_addr
);
849 mdio_delay(mdio_addr
);
850 mdio_out(dataval
| MDIO_ShiftClk
, mdio_addr
);
851 mdio_delay(mdio_addr
);
853 /* Clear out extra bits. */
854 for (i
= 2; i
> 0; i
--) {
855 mdio_out(MDIO_EnbIn
, mdio_addr
);
856 mdio_delay(mdio_addr
);
857 mdio_out(MDIO_EnbIn
| MDIO_ShiftClk
, mdio_addr
);
858 mdio_delay(mdio_addr
);
863 static void set_rx_mode(struct nic
*nic __unused
)
866 u16 mc_filter
[4]; /* Multicast hash filter */
869 memset(mc_filter
, 0xff, sizeof(mc_filter
));
870 rx_mode
= AcceptBroadcast
| AcceptMulticast
| AcceptMyPhys
;
872 if (sdc
->mii_if
.full_duplex
&& sdc
->flowctrl
)
873 mc_filter
[3] |= 0x0200;
874 for (i
= 0; i
< 4; i
++)
875 outw(mc_filter
[i
], BASE
+ MulticastFilter0
+ i
* 2);
876 outb(rx_mode
, BASE
+ RxMode
);
880 static struct pci_device_id sundance_nics
[] = {
881 PCI_ROM(0x13f0, 0x0201, "sundance", "ST201 Sundance 'Alta' based Adaptor", 0),
882 PCI_ROM(0x1186, 0x1002, "dfe530txs", "D-Link DFE530TXS (Sundance ST201 Alta)", 0),
883 PCI_ROM(0x13f0, 0x0200, "ip100a", "IC+ IP100A", 0),
886 PCI_DRIVER ( sundance_driver
, sundance_nics
, PCI_NO_CLASS
);
888 DRIVER ( "SUNDANCE/PCI", nic_driver
, pci_driver
, sundance_driver
,
889 sundance_probe
, sundance_disable
);