s390/qeth: rely on kernel for feature recovery
authorJulian Wiedmann <jwi@linux.vnet.ibm.com>
Wed, 18 Oct 2017 15:40:13 +0000 (17:40 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Oct 2017 12:11:04 +0000 (13:11 +0100)
When recovering a device, qeth needs to re-run the IPA commands that
enable all previously active HW features.
Instead of duplicating qeth_set_features(), let netdev_update_features()
recover the missing HW features from dev->wanted_features.

Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c

index 91fcadbede8041ad713a53b01e2b8211982e2290..3b6aa0c48221818f2bcf234b5ac0a7088e16f4b5 100644 (file)
@@ -998,7 +998,7 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *,
                                                 __u16, __u16,
                                                 enum qeth_prot_versions);
 int qeth_set_features(struct net_device *, netdev_features_t);
-int qeth_recover_features(struct net_device *);
+void qeth_recover_features(struct net_device *dev);
 netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t);
 int qeth_vm_request_mac(struct qeth_card *card);
 int qeth_push_hdr(struct sk_buff *skb, struct qeth_hdr **hdr, unsigned int len);
index 68e118f1202e41021ce3c8aecb0ea91137df7108..e10e5b8d476c4171cf71fe142cdb4dd635e12669 100644 (file)
@@ -6403,32 +6403,29 @@ static int qeth_set_ipa_tso(struct qeth_card *card, int on)
        return rc;
 }
 
-/* try to restore device features on a device after recovery */
-int qeth_recover_features(struct net_device *dev)
+#define QETH_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_TSO)
+
+/**
+ * qeth_recover_features() - Restore device features after recovery
+ * @dev:       the recovering net_device
+ *
+ * Caller must hold rtnl lock.
+ */
+void qeth_recover_features(struct net_device *dev)
 {
+       netdev_features_t features = dev->features;
        struct qeth_card *card = dev->ml_priv;
-       netdev_features_t recover = dev->features;
-
-       if (recover & NETIF_F_IP_CSUM) {
-               if (qeth_set_ipa_csum(card, 1, IPA_OUTBOUND_CHECKSUM))
-                       recover ^= NETIF_F_IP_CSUM;
-       }
-       if (recover & NETIF_F_RXCSUM) {
-               if (qeth_set_ipa_csum(card, 1, IPA_INBOUND_CHECKSUM))
-                       recover ^= NETIF_F_RXCSUM;
-       }
-       if (recover & NETIF_F_TSO) {
-               if (qeth_set_ipa_tso(card, 1))
-                       recover ^= NETIF_F_TSO;
-       }
 
-       if (recover == dev->features)
-               return 0;
+       /* force-off any feature that needs an IPA sequence.
+        * netdev_update_features() will restart them.
+        */
+       dev->features &= ~QETH_HW_FEATURES;
+       netdev_update_features(dev);
 
+       if (features == dev->features)
+               return;
        dev_warn(&card->gdev->dev,
                 "Device recovery failed to restore all offload features\n");
-       dev->features = recover;
-       return -EIO;
 }
 EXPORT_SYMBOL_GPL(qeth_recover_features);
 
@@ -6485,8 +6482,7 @@ netdev_features_t qeth_fix_features(struct net_device *dev,
        /* if the card isn't up, remove features that require hw changes */
        if (card->state == CARD_STATE_DOWN ||
            card->state == CARD_STATE_RECOVER)
-               features = features & ~(NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
-                                       NETIF_F_TSO);
+               features &= ~QETH_HW_FEATURES;
        QETH_DBF_HEX(SETUP, 2, &features, sizeof(features));
        return features;
 }