54#define drv_version "v1.12"
55#define drv_date "2004-03-21"
60#define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr))
61#define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr))
85static char media[] =
"autosense";
93#define TX_QUEUE_LEN 10
99#define TX_TIME_OUT (4*HZ)
100#define PKT_BUF_SZ 1536
240#define rx_tx_buf NIC_FAKE_BSS ( struct sundance_bss )
241#define rxb rx_tx_buf.rxb
242#define txb rx_tx_buf.txb
246#define EEPROM_SIZE 128
255#define PCI_IOTYPE (PCI_USES_MASTER | PCI_USES_IO | PCI_ADDR0)
281#define EEPROM_SA_OFFSET 0x10
282#define DEFAULT_INTR (IntrRxDMADone | IntrPCIErr | \
283 IntrDrvRqst | IntrTxDone | StatsMax | \
295 int negotiated = mii_lpa &
sdc->mii_if.advertising;
299 if (!
sdc->an_enable || mii_lpa == 0xffff) {
300 if (
sdc->mii_if.full_duplex)
307 duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040;
310 DBG (
"%s: Setting %s-duplex based on MII #%d "
311 "negotiated capability %4.4x.\n",
sdc->nic_name,
348 tx_ring[0].status = 0x00000000;
353 tx_ring[1].status = 0x00000000;
398 if (
sdc->pci_rev_id >= 0x14)
405 for (i = 0; i < 192; i++)
415 DBG (
"%s: Done sundance_reset, status: Rx %hX Tx %hX "
416 "MAC Control %hX, %hX %hX\n",
426 unsigned int intr_status;
465 pkt_len = frame_status & 0x1fff;
467 if (frame_status & 0x001f4000) {
468 DBG (
"Polling frame_status error\n" );
472 printf(
"Poll Error: pkt_len < rx_copybreak");
579 printf(
" sundance.c: Found %s Vendor=0x%hX Device=0x%hX\n",
583 for (i = 0; i < 3; i++) {
607 DBG (
"Device revision id: %hx\n",
sdc->pci_rev_id );
610 DBG (
"%s: %s at ioaddr %hX, ",
613 sdc->mii_preamble_required = 0;
615 int phy, phy_idx = 0;
617 sdc->mii_preamble_required++;
618 for (phy = 1; phy < 32 && phy_idx <
MII_CNT; phy++) {
620 if (mii_status != 0xffff && mii_status != 0x0000) {
621 sdc->phys[phy_idx++] = phy;
622 sdc->mii_if.advertising =
624 if ((mii_status & 0x0040) == 0)
625 sdc->mii_preamble_required++;
627 (
"%s: MII PHY found at address %d, status " "%hX advertising %hX\n",
sdc->nic_name, phy, mii_status,
sdc->mii_if.advertising );
630 sdc->mii_preamble_required--;
632 printf(
"%s: No MII transceiver found!\n",
634 sdc->mii_if.phy_id =
sdc->phys[0];
644 sdc->mii_if.full_duplex = 1;
648 sdc->mii_if.full_duplex = 0;
652 sdc->mii_if.full_duplex = 1;
656 sdc->mii_if.full_duplex = 0;
667 if (
sdc->an_enable) {
669 sdc->mii_if.full_duplex = 1;
679 if (!
sdc->an_enable) {
684 printf(
"Override speed=%d, %s duplex\n",
686 sdc->mii_if.full_duplex ?
"Full" :
"Half");
702 DBG(
"sundance: NIC reset did not complete.\n");
711 if (
sdc->an_enable) {
712 u16 mii_advertise, mii_lpa;
716 mii_advertise &= mii_lpa;
729 printf(
"%s: Link changed: %dMbps ,",
sdc->nic_name, speed);
734 if (
sdc->flowctrl &&
sdc->mii_if.full_duplex) {
739 printf(
"%dMbps, %s-Duplex\n",
sdc->speed,
740 sdc->mii_if.full_duplex ?
"Full" :
"Half");
755 int boguscnt = 10000;
762 while (--boguscnt > 0);
776#define mdio_in(mdio_addr) inb(mdio_addr)
777#define mdio_out(value, mdio_addr) outb(value, mdio_addr)
778#define mdio_delay(mdio_addr) inb(mdio_addr)
784#define MDIO_EnbIn (0)
785#define MDIO_WRITE0 (MDIO_EnbOutput)
786#define MDIO_WRITE1 (MDIO_Data | MDIO_EnbOutput)
795 while (--
bits >= 0) {
807 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
810 if (
sdc->mii_preamble_required)
814 for (i = 15; i >= 0; i--) {
824 for (i = 19; i > 0; i--) {
832 return (
retval >> 1) & 0xffff;
837 unsigned int location,
int value)
841 (0x5002 << 16) | (phy_id << 23) | (location << 18) |
value;
844 if (
sdc->mii_preamble_required)
848 for (i = 31; i >= 0; i--) {
857 for (i = 2; i > 0; i--) {
872 memset(mc_filter, 0xff,
sizeof(mc_filter));
875 if (
sdc->mii_if.full_duplex &&
sdc->flowctrl)
876 mc_filter[3] |= 0x0200;
877 for (i = 0; i < 4; i++)
884 PCI_ROM(0x1186, 0x1002,
"dfe530txs",
"D-Link DFE530TXS (Sundance ST201 Alta)", 0),
885 PCI_ROM(0x13f0, 0x0200,
"ip100a",
"IC+ IP100A", 0),
886 PCI_ROM(0x13f0, 0x0201,
"sundance",
"ST201 Sundance 'Alta' based Adaptor", 0),
pseudo_bit_t value[0x00020]
static volatile void * bits
static unsigned long ioaddr
static unsigned char ee_data[EEPROM_SIZE]
static void set_rx_mode(void)
#define __unused
Declare a variable or data structure as unused.
#define DBG(...)
Print a debugging message.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define le16_to_cpu(value)
#define le32_to_cpu(value)
#define cpu_to_le32(value)
#define outb(data, io_addr)
#define outw(data, io_addr)
#define outl(data, io_addr)
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
int dummy_connect(struct nic *nic __unused)
Media Independent Interface constants.
#define ADVERTISE_100FULL
#define ADVERTISE_100HALF
#define DRIVER(_name_text, _unused2, _unused3, _name, _probe, _disable, _fake_bss)
#define PCI_DRIVER(_name, _ids, _class)
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
#define PCI_ROM(_vendor, _device, _name, _description, _data)
#define PCI_REVISION
PCI revision.
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
unsigned char * node_addr
struct nic_operations * nic_op
A PCI device ID list entry.
unsigned long ioaddr
I/O address.
uint8_t irq
Interrupt number.
struct pci_device_id * id
Driver device ID.
uint16_t vendor
Vendor ID.
uint16_t device
Device ID.
unsigned char txb[PKT_BUF_SZ *TX_RING_SIZE]
unsigned char rxb[RX_RING_SIZE *PKT_BUF_SZ]
unsigned char phys[MII_CNT]
struct mii_if_info mii_if
int mii_preamble_required
static void sundance_disable(struct nic *nic __unused, void *hwdev __unused)
#define mdio_out(value, mdio_addr)
static void sundance_irq(struct nic *nic, irq_action_t action)
static void mdio_write(struct nic *nic, int phy_id, unsigned int location, int value)
static struct pci_device_id sundance_nics[]
#define virt_to_le32desc(addr)
static struct nic_operations sundance_operations
static int sundance_probe(struct nic *nic, struct pci_device *pci)
static void mdio_sync(long mdio_addr)
static int mdio_read(struct nic *nic, int phy_id, unsigned int location)
static struct sundance_private * sdc
#define mdio_in(mdio_addr)
#define mdio_delay(mdio_addr)
static int sundance_poll(struct nic *nic, int retrieve)
static struct sundance_private sdx
static void sundance_reset(struct nic *nic)
static int eeprom_read(long ioaddr, int location)
static void sundance_transmit(struct nic *nic, const char *d, unsigned int t, unsigned int s, const char *p)
unsigned long currticks(void)
Get current system time in ticks.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
int printf(const char *fmt,...)
Write a formatted string to the console.
static void check_duplex(void)
static void init_ring(void)