From ea130a63d821474e01afcd94f3057a54faf39457 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 9 Aug 2004 02:33:10 -0700 Subject: [PATCH] [VLAN]: Propagate ethtool/mii ioctls to the real device. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- net/8021q/vlan.c | 1 + net/8021q/vlan.h | 1 + net/8021q/vlan_dev.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index a44c900ac08ba..96e2391f3d6c9 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -358,6 +358,7 @@ static void vlan_setup(struct net_device *new_dev) new_dev->set_mac_address = vlan_dev_set_mac_address; new_dev->set_multicast_list = vlan_dev_set_multicast_list; new_dev->destructor = free_netdev; + new_dev->do_ioctl = vlan_dev_ioctl; } /* Attach a VLAN device to a mac address (ie Ethernet Card). diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 3a5ae43343899..5d9b7a1d2a8b1 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h @@ -65,6 +65,7 @@ int vlan_dev_change_mtu(struct net_device *dev, int new_mtu); int vlan_dev_set_mac_address(struct net_device *dev, void* addr); int vlan_dev_open(struct net_device* dev); int vlan_dev_stop(struct net_device* dev); +int vlan_dev_ioctl(struct net_device* dev, struct ifreq *ifr, int cmd); int vlan_dev_set_ingress_priority(char* dev_name, __u32 skb_prio, short vlan_prio); int vlan_dev_set_egress_priority(char* dev_name, __u32 skb_prio, short vlan_prio); int vlan_dev_set_vlan_flag(char* dev_name, __u32 flag, short flag_val); diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index bea6963654d14..9dfce1bc7d0a1 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -757,6 +757,34 @@ int vlan_dev_stop(struct net_device *dev) vlan_flush_mc_list(dev); return 0; } + +int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + struct net_device *real_dev = VLAN_DEV_INFO(dev)->real_dev; + struct ifreq ifrr; + int err = -EOPNOTSUPP; + + strncpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ); + ifrr.ifr_ifru = ifr->ifr_ifru; + + switch(cmd) { + case SIOCGMIIPHY: + case SIOCGMIIREG: + case SIOCSMIIREG: + if (real_dev->do_ioctl && netif_device_present(real_dev)) + err = real_dev->do_ioctl(dev, &ifrr, cmd); + break; + + case SIOCETHTOOL: + err = dev_ethtool(&ifrr); + } + + if (!err) + ifr->ifr_ifru = ifrr.ifr_ifru; + + return err; +} + /** Taken from Gleb + Lennert's VLAN code, and modified... */ void vlan_dev_set_multicast_list(struct net_device *vlan_dev) { -- 2.53.0