--- sis900.c Fri Mar 9 07:44:11 2001 +++ sis900-new.c Fri Mar 9 07:42:29 2001 @@ -57,7 +57,7 @@ static int multicast_filter_limit = 128; #define sis900_debug debug -static int sis900_debug = 0; +static int sis900_debug = 1; /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (4*HZ) @@ -82,6 +82,7 @@ static void sis900_read_mode(struct device *net_dev, int phy_addr, int *speed, int *duplex); static void amd79c901_read_mode(struct device *net_dev, int phy_addr, int *speed, int *duplex); +static void ics1893_read_mode(struct device *net_dev, int phy_addr, int *speed, int *duplex); static struct mii_chip_info { const char * name; @@ -93,6 +94,7 @@ {"SiS 7014 Physical Layer Solution", 0x0016, 0xf830,sis900_read_mode}, {"AMD 79C901 10BASE-T PHY", 0x0000, 0x35b9, amd79c901_read_mode}, {"AMD 79C901 HomePNA PHY", 0x0000, 0x35c8, amd79c901_read_mode}, + {"ICS 1893 Integrated PHYciever", 0x0015, 0xf441, ics1893_read_mode}, {0,}, }; @@ -226,7 +228,7 @@ if (signature == 0xffff || signature == 0x0000) { printk (KERN_INFO "%s: Error EERPOM read %x\n", net_dev->name, signature); - return 0; + /*return 0;*/ } /* get MAC address from EEPROM */ @@ -299,7 +301,7 @@ return NULL; pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision); - if (revision == SIS630E_REV) + if (revision == SIS630E_REV || revision == SIS630S_REV) ret = sis630e_get_mac_addr(pci_dev, net_dev); else if (revision == SIS630EA1_REV) { ret = sis630e_get_mac_addr(pci_dev, net_dev); @@ -956,6 +958,38 @@ printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); } } + +/* ICS1893 PHY use Quick Poll Detailed Status Register to get its status */ +static void ics1893_read_mode(struct device *net_dev, int phy_addr, int *speed, int *duplex) +{ + int i = 0; + u32 status; + + /* MII_QPDSTS is Latched, read twice in succession will reflect the current state */ + for (i = 0; i < 2; i++) + status = mdio_read(net_dev, phy_addr, MII_QPDSTS); + + if (status & MII_STSICS_SPD) + *speed = HW_SPEED_100_MBPS; + else + *speed = HW_SPEED_10_MBPS; + + if (status & MII_STSICS_DPLX) + *duplex = FDX_CAPABLE_FULL_SELECTED; + else + *duplex = FDX_CAPABLE_HALF_SELECTED; + + if (status & MII_STSICS_LINKSTS) + printk(KERN_INFO "%s: Media Link On %s %s-duplex \n", + net_dev->name, + *speed == HW_SPEED_100_MBPS ? + "100mbps" : "10mbps", + *duplex == FDX_CAPABLE_FULL_SELECTED ? + "full" : "half"); + else + printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); +} + static void sis900_tx_timeout(struct device *net_dev) { struct sis900_private *sis_priv = (struct sis900_private *)net_dev->priv; --- sis900.h Fri Mar 9 07:44:11 2001 +++ sis900-new.h Fri Mar 9 07:42:29 2001 @@ -168,6 +168,12 @@ MII_MASK = 0x0013, MII_RESV = 0x0014 }; +/* mii registers specific to the ICS 1893 */ +enum ics_mii_registers { + MII_EXTCTRL = 0x0010, MII_QPDSTS = 0x0011, MII_10BTOP = 0x0012, + MII_EXTCTRL2 = 0x0013 +}; + /* mii registers specific to AMD 79C901 */ enum amd_mii_registers { MII_STATUS_SUMMARY = 0x0018 @@ -212,13 +218,19 @@ MII_STSOUT_SPD = 0x0080, MII_STSOUT_DPLX = 0x0040 }; +enum mii_stsics_register_bits { + MII_STSICS_SPD = 0x8000, MII_STSICS_DPLX = 0x4000, + MII_STSICS_LINKSTS = 0x0001 +}; + enum mii_stssum_register_bits { MII_STSSUM_LINK = 0x0008, MII_STSSUM_DPLX = 0x0004, MII_STSSUM_AUTO = 0x0002, MII_STSSUM_SPD = 0x0001 }; enum sis630_revision_id { - SIS630E_REV = 0x81, SIS630EA1_REV = 0x83 + SIS630E_REV = 0x81, SIS630EA1_REV = 0x83, + SIS630S_REV = 0x82 }; #define FDX_CAPABLE_DUPLEX_UNKNOWN 0