qeth: use ndo_set_features callback for initial setup and recovery
authorFrank Blaschka <frank.blaschka@de.ibm.com>
Wed, 18 May 2011 03:28:35 +0000 (03:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 May 2011 21:27:39 +0000 (17:27 -0400)
This patch uses the ndo_set_features callback during normal device
startup or recovery to turn on hardware RX checksum. Patch was done
with much help from Michal Miroslaw, thx!!!

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Reviewed-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_l3_main.c

index bbe7e1c..fd69da3 100644 (file)
@@ -1417,63 +1417,33 @@ int qeth_l3_set_rx_csum(struct qeth_card *card, int on)
        int rc = 0;
 
        if (on) {
-               if (card->state != CARD_STATE_DOWN) {
-                       if (!qeth_is_supported(card,
-                                   IPA_INBOUND_CHECKSUM))
-                                       return -EPERM;
-                       rc = qeth_l3_send_checksum_command(card);
-                       if (rc)
-                               return -EIO;
-               }
-               card->dev->features |= NETIF_F_RXCSUM;
+               rc = qeth_l3_send_checksum_command(card);
+               if (rc)
+                       return -EIO;
+               dev_info(&card->gdev->dev,
+                       "HW Checksumming (inbound) enabled\n");
        } else {
-               if (card->state != CARD_STATE_DOWN) {
-                       rc = qeth_l3_send_simple_setassparms(card,
-                               IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
-                       if (rc)
-                               return -EIO;
-               }
-               card->dev->features &= ~NETIF_F_RXCSUM;
+               rc = qeth_l3_send_simple_setassparms(card,
+                       IPA_INBOUND_CHECKSUM, IPA_CMD_ASS_STOP, 0);
+               if (rc)
+                       return -EIO;
        }
 
-       return rc;
+       return 0;
 }
 
 static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
 {
-       int rc = 0;
-
        QETH_CARD_TEXT(card, 3, "strtcsum");
 
        if (card->dev->features & NETIF_F_RXCSUM) {
-               /* hw may have changed during offline or recovery */
-               if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
-                       dev_info(&card->gdev->dev,
-                       "Inbound HW Checksumming not "
-                       "supported on %s,\ncontinuing "
-                       "using Inbound SW Checksumming\n",
-                       QETH_CARD_IFNAME(card));
-                       goto update_feature;
-               }
-
-               rc = qeth_l3_send_checksum_command(card);
-               if (!rc)
-                       dev_info(&card->gdev->dev,
-                       "HW Checksumming (inbound) enabled\n");
-               else
-                       goto update_feature;
-       } else
-               dev_info(&card->gdev->dev,
-                       "Using SW checksumming on %s.\n",
-                       QETH_CARD_IFNAME(card));
+               rtnl_lock();
+               /* force set_features call */
+               card->dev->features &= ~NETIF_F_RXCSUM;
+               netdev_update_features(card->dev);
+               rtnl_unlock();
+       }
        return 0;
-
-update_feature:
-       rtnl_lock();
-       card->dev->features &= ~NETIF_F_RXCSUM;
-       netdev_update_features(card->dev);
-       rtnl_unlock();
-       return rc;
 }
 
 static int qeth_l3_start_ipa_tx_checksum(struct qeth_card *card)
@@ -3196,17 +3166,20 @@ static int qeth_l3_set_features(struct net_device *dev, u32 features)
 {
        struct qeth_card *card = dev->ml_priv;
        u32 changed = dev->features ^ features;
-       int on;
+       int err;
 
        if (!(changed & NETIF_F_RXCSUM))
                return 0;
 
-       if (features & NETIF_F_RXCSUM)
-               on = 1;
-       else
-               on = 0;
+       if (card->state == CARD_STATE_DOWN ||
+           card->state == CARD_STATE_RECOVER)
+               return 0;
+
+       err = qeth_l3_set_rx_csum(card, features & NETIF_F_RXCSUM);
+       if (err)
+               dev->features = features ^ NETIF_F_RXCSUM;
 
-       return qeth_l3_set_rx_csum(card, on);
+       return err;
 }
 
 static const struct ethtool_ops qeth_l3_ethtool_ops = {