diff options
author | Francois Romieu <romieu@fr.zoreil.com> | 2006-08-17 11:02:36 (GMT) |
---|---|---|
committer | Francois Romieu <romieu@fr.zoreil.com> | 2006-08-31 19:59:42 (GMT) |
commit | 5f787a1aca3705bdc6adbda36f8d6446380e85a6 (patch) | |
tree | 54d9f437366053acb21bbed879ec369608123da1 /drivers/net/r8169.c | |
parent | 64e4bfb40c9d07a48c1c7e5b8556e92e7cd7406a (diff) | |
download | linux-5f787a1aca3705bdc6adbda36f8d6446380e85a6.tar.xz |
r8169: add basic MII ioctl support
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r-- | drivers/net/r8169.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 0025b83..ace895b 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -1475,6 +1475,32 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp) printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name); } +static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + struct rtl8169_private *tp = netdev_priv(dev); + struct mii_ioctl_data *data = if_mii(ifr); + + if (!netif_running(dev)) + return -ENODEV; + + switch (cmd) { + case SIOCGMIIPHY: + data->phy_id = 32; /* Internal PHY */ + return 0; + + case SIOCGMIIREG: + data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f); + return 0; + + case SIOCSMIIREG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in); + return 0; + } + return -EOPNOTSUPP; +} + static int __devinit rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -1639,6 +1665,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) tp->phy_reset_enable = rtl8169_xmii_reset_enable; tp->phy_reset_pending = rtl8169_xmii_reset_pending; tp->link_ok = rtl8169_xmii_link_ok; + + dev->do_ioctl = rtl8169_ioctl; } /* Get MAC address. FIXME: read EEPROM */ |