net: usb: use ndo_siocdevprivate
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Jul 2021 13:45:00 +0000 (15:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jul 2021 19:11:43 +0000 (20:11 +0100)
The pegasus and rtl8150 drivers use SIOCDEVPRIVATE ioctls
to access their MII registers, in place of the normal
commands. This is broken for all compat ioctls today.

Change to ndo_siocdevprivate to fix it.

Cc: Petko Manolov <petkan@nucleusys.com>
Cc: linux-usb@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/pegasus.c
drivers/net/usb/rtl8150.c

index 9a907182569cffe21b8c8bedb903d676daa05684..0475ef0efdca7e59d1e99ddefdb3a3a7bb5c6dde 100644 (file)
@@ -987,7 +987,8 @@ static const struct ethtool_ops ops = {
        .set_link_ksettings = pegasus_set_link_ksettings,
 };
 
-static int pegasus_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
+static int pegasus_siocdevprivate(struct net_device *net, struct ifreq *rq,
+                                 void __user *udata, int cmd)
 {
        __u16 *data = (__u16 *) &rq->ifr_ifru;
        pegasus_t *pegasus = netdev_priv(net);
@@ -1245,7 +1246,7 @@ static int pegasus_resume(struct usb_interface *intf)
 static const struct net_device_ops pegasus_netdev_ops = {
        .ndo_open =                     pegasus_open,
        .ndo_stop =                     pegasus_close,
-       .ndo_do_ioctl =                 pegasus_ioctl,
+       .ndo_siocdevprivate =           pegasus_siocdevprivate,
        .ndo_start_xmit =               pegasus_start_xmit,
        .ndo_set_rx_mode =              pegasus_set_multicast,
        .ndo_tx_timeout =               pegasus_tx_timeout,
index 7656f2a3afd93cf2b64b432d101e5a4f6d6d18e2..4a1b0e0fc3a3a1af12d55e1bff28acab76c7d79c 100644 (file)
@@ -822,7 +822,8 @@ static const struct ethtool_ops ops = {
        .get_link_ksettings = rtl8150_get_link_ksettings,
 };
 
-static int rtl8150_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
+static int rtl8150_siocdevprivate(struct net_device *netdev, struct ifreq *rq,
+                                 void __user *udata, int cmd)
 {
        rtl8150_t *dev = netdev_priv(netdev);
        u16 *data = (u16 *) & rq->ifr_ifru;
@@ -850,7 +851,7 @@ static int rtl8150_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
 static const struct net_device_ops rtl8150_netdev_ops = {
        .ndo_open               = rtl8150_open,
        .ndo_stop               = rtl8150_close,
-       .ndo_do_ioctl           = rtl8150_ioctl,
+       .ndo_siocdevprivate     = rtl8150_siocdevprivate,
        .ndo_start_xmit         = rtl8150_start_xmit,
        .ndo_tx_timeout         = rtl8150_tx_timeout,
        .ndo_set_rx_mode        = rtl8150_set_multicast,