diff options
| -rw-r--r-- | drivers/net/sis900.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c index 3e9d9aab0588..3107aed0fb51 100644 --- a/drivers/net/sis900.c +++ b/drivers/net/sis900.c | |||
| @@ -162,6 +162,7 @@ struct sis900_private { | |||
| 162 | struct mii_phy * mii; | 162 | struct mii_phy * mii; |
| 163 | struct mii_phy * first_mii; /* record the first mii structure */ | 163 | struct mii_phy * first_mii; /* record the first mii structure */ |
| 164 | unsigned int cur_phy; | 164 | unsigned int cur_phy; |
| 165 | struct mii_if_info mii_info; | ||
| 165 | 166 | ||
| 166 | struct timer_list timer; /* Link status detection timer. */ | 167 | struct timer_list timer; /* Link status detection timer. */ |
| 167 | u8 autong_complete; /* 1: auto-negotiate complete */ | 168 | u8 autong_complete; /* 1: auto-negotiate complete */ |
| @@ -203,7 +204,7 @@ static int sis900_open(struct net_device *net_dev); | |||
| 203 | static int sis900_mii_probe (struct net_device * net_dev); | 204 | static int sis900_mii_probe (struct net_device * net_dev); |
| 204 | static void sis900_init_rxfilter (struct net_device * net_dev); | 205 | static void sis900_init_rxfilter (struct net_device * net_dev); |
| 205 | static u16 read_eeprom(long ioaddr, int location); | 206 | static u16 read_eeprom(long ioaddr, int location); |
| 206 | static u16 mdio_read(struct net_device *net_dev, int phy_id, int location); | 207 | static int mdio_read(struct net_device *net_dev, int phy_id, int location); |
| 207 | static void mdio_write(struct net_device *net_dev, int phy_id, int location, int val); | 208 | static void mdio_write(struct net_device *net_dev, int phy_id, int location, int val); |
| 208 | static void sis900_timer(unsigned long data); | 209 | static void sis900_timer(unsigned long data); |
| 209 | static void sis900_check_mode (struct net_device *net_dev, struct mii_phy *mii_phy); | 210 | static void sis900_check_mode (struct net_device *net_dev, struct mii_phy *mii_phy); |
| @@ -478,7 +479,13 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev, | |||
| 478 | sis_priv->msg_enable = sis900_debug; | 479 | sis_priv->msg_enable = sis900_debug; |
| 479 | else | 480 | else |
| 480 | sis_priv->msg_enable = SIS900_DEF_MSG; | 481 | sis_priv->msg_enable = SIS900_DEF_MSG; |
| 481 | 482 | ||
| 483 | sis_priv->mii_info.dev = net_dev; | ||
| 484 | sis_priv->mii_info.mdio_read = mdio_read; | ||
| 485 | sis_priv->mii_info.mdio_write = mdio_write; | ||
| 486 | sis_priv->mii_info.phy_id_mask = 0x1f; | ||
| 487 | sis_priv->mii_info.reg_num_mask = 0x1f; | ||
| 488 | |||
| 482 | /* Get Mac address according to the chip revision */ | 489 | /* Get Mac address according to the chip revision */ |
| 483 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev)); | 490 | pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev)); |
| 484 | if(netif_msg_probe(sis_priv)) | 491 | if(netif_msg_probe(sis_priv)) |
| @@ -725,6 +732,8 @@ static u16 sis900_default_phy(struct net_device * net_dev) | |||
| 725 | pci_name(sis_priv->pci_dev), sis_priv->cur_phy); | 732 | pci_name(sis_priv->pci_dev), sis_priv->cur_phy); |
| 726 | } | 733 | } |
| 727 | 734 | ||
| 735 | sis_priv->mii_info.phy_id = sis_priv->cur_phy; | ||
| 736 | |||
| 728 | status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); | 737 | status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); |
| 729 | status &= (~MII_CNTL_ISOLATE); | 738 | status &= (~MII_CNTL_ISOLATE); |
| 730 | 739 | ||
| @@ -852,7 +861,7 @@ static void mdio_reset(long mdio_addr) | |||
| 852 | * Please see SiS7014 or ICS spec | 861 | * Please see SiS7014 or ICS spec |
| 853 | */ | 862 | */ |
| 854 | 863 | ||
| 855 | static u16 mdio_read(struct net_device *net_dev, int phy_id, int location) | 864 | static int mdio_read(struct net_device *net_dev, int phy_id, int location) |
| 856 | { | 865 | { |
| 857 | long mdio_addr = net_dev->base_addr + mear; | 866 | long mdio_addr = net_dev->base_addr + mear; |
| 858 | int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift); | 867 | int mii_cmd = MIIread|(phy_id<<MIIpmdShift)|(location<<MIIregShift); |
| @@ -1966,10 +1975,47 @@ static void sis900_set_msglevel(struct net_device *net_dev, u32 value) | |||
| 1966 | sis_priv->msg_enable = value; | 1975 | sis_priv->msg_enable = value; |
| 1967 | } | 1976 | } |
| 1968 | 1977 | ||
| 1978 | static u32 sis900_get_link(struct net_device *net_dev) | ||
| 1979 | { | ||
| 1980 | struct sis900_private *sis_priv = net_dev->priv; | ||
| 1981 | return mii_link_ok(&sis_priv->mii_info); | ||
| 1982 | } | ||
| 1983 | |||
| 1984 | static int sis900_get_settings(struct net_device *net_dev, | ||
| 1985 | struct ethtool_cmd *cmd) | ||
| 1986 | { | ||
| 1987 | struct sis900_private *sis_priv = net_dev->priv; | ||
| 1988 | spin_lock_irq(&sis_priv->lock); | ||
| 1989 | mii_ethtool_gset(&sis_priv->mii_info, cmd); | ||
| 1990 | spin_unlock_irq(&sis_priv->lock); | ||
| 1991 | return 0; | ||
| 1992 | } | ||
| 1993 | |||
| 1994 | static int sis900_set_settings(struct net_device *net_dev, | ||
| 1995 | struct ethtool_cmd *cmd) | ||
| 1996 | { | ||
| 1997 | struct sis900_private *sis_priv = net_dev->priv; | ||
| 1998 | int rt; | ||
| 1999 | spin_lock_irq(&sis_priv->lock); | ||
| 2000 | rt = mii_ethtool_sset(&sis_priv->mii_info, cmd); | ||
| 2001 | spin_unlock_irq(&sis_priv->lock); | ||
| 2002 | return rt; | ||
| 2003 | } | ||
| 2004 | |||
| 2005 | static int sis900_nway_reset(struct net_device *net_dev) | ||
| 2006 | { | ||
| 2007 | struct sis900_private *sis_priv = net_dev->priv; | ||
| 2008 | return mii_nway_restart(&sis_priv->mii_info); | ||
| 2009 | } | ||
| 2010 | |||
| 1969 | static struct ethtool_ops sis900_ethtool_ops = { | 2011 | static struct ethtool_ops sis900_ethtool_ops = { |
| 1970 | .get_drvinfo = sis900_get_drvinfo, | 2012 | .get_drvinfo = sis900_get_drvinfo, |
| 1971 | .get_msglevel = sis900_get_msglevel, | 2013 | .get_msglevel = sis900_get_msglevel, |
| 1972 | .set_msglevel = sis900_set_msglevel, | 2014 | .set_msglevel = sis900_set_msglevel, |
| 2015 | .get_link = sis900_get_link, | ||
| 2016 | .get_settings = sis900_get_settings, | ||
| 2017 | .set_settings = sis900_set_settings, | ||
| 2018 | .nway_reset = sis900_nway_reset, | ||
| 1973 | }; | 2019 | }; |
| 1974 | 2020 | ||
| 1975 | /** | 2021 | /** |
