diff options
-rw-r--r-- | drivers/net/bfin_mac.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index 609748b84e83..89c0018132ec 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/phy.h> | 27 | #include <linux/phy.h> |
28 | #include <linux/netdevice.h> | 28 | #include <linux/netdevice.h> |
29 | #include <linux/etherdevice.h> | 29 | #include <linux/etherdevice.h> |
30 | #include <linux/ethtool.h> | ||
30 | #include <linux/skbuff.h> | 31 | #include <linux/skbuff.h> |
31 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
32 | 33 | ||
@@ -454,6 +455,51 @@ static int mii_probe(struct net_device *dev) | |||
454 | return 0; | 455 | return 0; |
455 | } | 456 | } |
456 | 457 | ||
458 | /* | ||
459 | * Ethtool support | ||
460 | */ | ||
461 | |||
462 | static int | ||
463 | bfin_mac_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd) | ||
464 | { | ||
465 | struct bfin_mac_local *lp = netdev_priv(dev); | ||
466 | |||
467 | if (lp->phydev) | ||
468 | return phy_ethtool_gset(lp->phydev, cmd); | ||
469 | |||
470 | return -EINVAL; | ||
471 | } | ||
472 | |||
473 | static int | ||
474 | bfin_mac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) | ||
475 | { | ||
476 | struct bfin_mac_local *lp = netdev_priv(dev); | ||
477 | |||
478 | if (!capable(CAP_NET_ADMIN)) | ||
479 | return -EPERM; | ||
480 | |||
481 | if (lp->phydev) | ||
482 | return phy_ethtool_sset(lp->phydev, cmd); | ||
483 | |||
484 | return -EINVAL; | ||
485 | } | ||
486 | |||
487 | static void bfin_mac_ethtool_getdrvinfo(struct net_device *dev, | ||
488 | struct ethtool_drvinfo *info) | ||
489 | { | ||
490 | strcpy(info->driver, DRV_NAME); | ||
491 | strcpy(info->version, DRV_VERSION); | ||
492 | strcpy(info->fw_version, "N/A"); | ||
493 | strcpy(info->bus_info, dev->dev.bus_id); | ||
494 | } | ||
495 | |||
496 | static struct ethtool_ops bfin_mac_ethtool_ops = { | ||
497 | .get_settings = bfin_mac_ethtool_getsettings, | ||
498 | .set_settings = bfin_mac_ethtool_setsettings, | ||
499 | .get_link = ethtool_op_get_link, | ||
500 | .get_drvinfo = bfin_mac_ethtool_getdrvinfo, | ||
501 | }; | ||
502 | |||
457 | /**************************************************************************/ | 503 | /**************************************************************************/ |
458 | void setup_system_regs(struct net_device *dev) | 504 | void setup_system_regs(struct net_device *dev) |
459 | { | 505 | { |
@@ -997,6 +1043,7 @@ static int __init bfin_mac_probe(struct platform_device *pdev) | |||
997 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1043 | #ifdef CONFIG_NET_POLL_CONTROLLER |
998 | ndev->poll_controller = bfin_mac_poll; | 1044 | ndev->poll_controller = bfin_mac_poll; |
999 | #endif | 1045 | #endif |
1046 | ndev->ethtool_ops = &bfin_mac_ethtool_ops; | ||
1000 | 1047 | ||
1001 | spin_lock_init(&lp->lock); | 1048 | spin_lock_init(&lp->lock); |
1002 | 1049 | ||