qeth: use ndo_siocdevprivate
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Jul 2021 13:45:02 +0000 (15:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jul 2021 19:11:44 +0000 (20:11 +0100)
qeth has both standard MII ioctls and custom SIOCDEVPRIVATE ones,
all of which work correctly with compat user space.

Move the private ones over to the new ndo_siocdevprivate callback.

Cc: Julian Wiedmann <jwi@linux.ibm.com>
Cc: Karsten Graul <kgraul@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: linux-s390@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l3_main.c

index c170315..535a60b 100644 (file)
@@ -771,7 +771,8 @@ struct qeth_discipline {
        void (*remove) (struct ccwgroup_device *);
        int (*set_online)(struct qeth_card *card, bool carrier_ok);
        void (*set_offline)(struct qeth_card *card);
-       int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd);
+       int (*do_ioctl)(struct net_device *dev, struct ifreq *rq,
+                       void __user *data, int cmd);
        int (*control_event_handler)(struct qeth_card *card,
                                        struct qeth_ipa_cmd *cmd);
 };
@@ -1085,6 +1086,8 @@ int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
                                     enum qeth_ipa_isolation_modes mode);
 
 int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq,
+                       void __user *data, int cmd);
 void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
 int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
 int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
index 7f48621..5b973f3 100644 (file)
@@ -6590,21 +6590,42 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
        .shutdown = qeth_core_shutdown,
 };
 
-int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd)
 {
        struct qeth_card *card = dev->ml_priv;
-       struct mii_ioctl_data *mii_data;
        int rc = 0;
 
        switch (cmd) {
        case SIOC_QETH_ADP_SET_SNMP_CONTROL:
-               rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
+               rc = qeth_snmp_command(card, data);
                break;
        case SIOC_QETH_GET_CARD_TYPE:
                if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) &&
                    !IS_VM_NIC(card))
                        return 1;
                return 0;
+       case SIOC_QETH_QUERY_OAT:
+               rc = qeth_query_oat_command(card, data);
+               break;
+       default:
+               if (card->discipline->do_ioctl)
+                       rc = card->discipline->do_ioctl(dev, rq, data, cmd);
+               else
+                       rc = -EOPNOTSUPP;
+       }
+       if (rc)
+               QETH_CARD_TEXT_(card, 2, "ioce%x", rc);
+       return rc;
+}
+EXPORT_SYMBOL_GPL(qeth_siocdevprivate);
+
+int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+       struct qeth_card *card = dev->ml_priv;
+       struct mii_ioctl_data *mii_data;
+       int rc = 0;
+
+       switch (cmd) {
        case SIOCGMIIPHY:
                mii_data = if_mii(rq);
                mii_data->phy_id = 0;
@@ -6617,14 +6638,8 @@ int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        mii_data->val_out = qeth_mdio_read(dev,
                                mii_data->phy_id, mii_data->reg_num);
                break;
-       case SIOC_QETH_QUERY_OAT:
-               rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data);
-               break;
        default:
-               if (card->discipline->do_ioctl)
-                       rc = card->discipline->do_ioctl(dev, rq, cmd);
-               else
-                       rc = -EOPNOTSUPP;
+               return -EOPNOTSUPP;
        }
        if (rc)
                QETH_CARD_TEXT_(card, 2, "ioce%x", rc);
index 7fe0f1a..d50d3cb 100644 (file)
@@ -837,6 +837,7 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
        .ndo_validate_addr      = qeth_l2_validate_addr,
        .ndo_set_rx_mode        = qeth_l2_set_rx_mode,
        .ndo_do_ioctl           = qeth_do_ioctl,
+       .ndo_siocdevprivate     = qeth_siocdevprivate,
        .ndo_set_mac_address    = qeth_l2_set_mac_address,
        .ndo_vlan_rx_add_vid    = qeth_l2_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = qeth_l2_vlan_rx_kill_vid,
index 7cc59f4..d7a8953 100644 (file)
@@ -1512,7 +1512,7 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
        return rc;
 }
 
-static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd)
 {
        struct qeth_card *card = dev->ml_priv;
        struct qeth_arp_cache_entry arp_entry;
@@ -1532,13 +1532,13 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        rc = -EPERM;
                        break;
                }
-               rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data);
+               rc = qeth_l3_arp_query(card, data);
                break;
        case SIOC_QETH_ARP_ADD_ENTRY:
        case SIOC_QETH_ARP_REMOVE_ENTRY:
                if (!capable(CAP_NET_ADMIN))
                        return -EPERM;
-               if (copy_from_user(&arp_entry, rq->ifr_data, sizeof(arp_entry)))
+               if (copy_from_user(&arp_entry, data, sizeof(arp_entry)))
                        return -EFAULT;
 
                arp_cmd = (cmd == SIOC_QETH_ARP_ADD_ENTRY) ?
@@ -1842,6 +1842,7 @@ static const struct net_device_ops qeth_l3_netdev_ops = {
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_rx_mode        = qeth_l3_set_rx_mode,
        .ndo_do_ioctl           = qeth_do_ioctl,
+       .ndo_siocdevprivate     = qeth_siocdevprivate,
        .ndo_fix_features       = qeth_fix_features,
        .ndo_set_features       = qeth_set_features,
        .ndo_tx_timeout         = qeth_tx_timeout,
@@ -1857,6 +1858,7 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_set_rx_mode        = qeth_l3_set_rx_mode,
        .ndo_do_ioctl           = qeth_do_ioctl,
+       .ndo_siocdevprivate     = qeth_siocdevprivate,
        .ndo_fix_features       = qeth_fix_features,
        .ndo_set_features       = qeth_set_features,
        .ndo_tx_timeout         = qeth_tx_timeout,