Commit ea130a63 authored by Stephen Hemminger's avatar Stephen Hemminger

[VLAN]: Propagate ethtool/mii ioctls to the real device.

Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent 4a6d387e
...@@ -358,6 +358,7 @@ static void vlan_setup(struct net_device *new_dev) ...@@ -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_mac_address = vlan_dev_set_mac_address;
new_dev->set_multicast_list = vlan_dev_set_multicast_list; new_dev->set_multicast_list = vlan_dev_set_multicast_list;
new_dev->destructor = free_netdev; new_dev->destructor = free_netdev;
new_dev->do_ioctl = vlan_dev_ioctl;
} }
/* Attach a VLAN device to a mac address (ie Ethernet Card). /* Attach a VLAN device to a mac address (ie Ethernet Card).
......
...@@ -65,6 +65,7 @@ int vlan_dev_change_mtu(struct net_device *dev, int new_mtu); ...@@ -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_set_mac_address(struct net_device *dev, void* addr);
int vlan_dev_open(struct net_device* dev); int vlan_dev_open(struct net_device* dev);
int vlan_dev_stop(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_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_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); int vlan_dev_set_vlan_flag(char* dev_name, __u32 flag, short flag_val);
......
...@@ -757,6 +757,34 @@ int vlan_dev_stop(struct net_device *dev) ...@@ -757,6 +757,34 @@ int vlan_dev_stop(struct net_device *dev)
vlan_flush_mc_list(dev); vlan_flush_mc_list(dev);
return 0; 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... */ /** Taken from Gleb + Lennert's VLAN code, and modified... */
void vlan_dev_set_multicast_list(struct net_device *vlan_dev) void vlan_dev_set_multicast_list(struct net_device *vlan_dev)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment