qlcnic: Check FW capability for TSO
authorAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Fri, 9 Jul 2010 13:14:58 +0000 (13:14 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 10 Jul 2010 00:41:57 +0000 (17:41 -0700)
Driver checks TSO capability from FW before enabling it.

Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_ethtool.c
drivers/net/qlcnic/qlcnic_main.c

index 60ea7cb3308fec9c6f9eeb371239cb41ef0d64ff..02a50e60166dcb66e3984309809b78193e75403c 100644 (file)
@@ -821,9 +821,10 @@ struct qlcnic_nic_intr_coalesce {
 #define QLCNIC_LRO_REQUEST_CLEANUP     4
 
 /* Capabilites received */
-#define QLCNIC_FW_CAPABILITY_BDG               (1 << 8)
-#define QLCNIC_FW_CAPABILITY_FVLANTX           (1 << 9)
-#define QLCNIC_FW_CAPABILITY_HW_LRO            (1 << 10)
+#define QLCNIC_FW_CAPABILITY_TSO               BIT_1
+#define QLCNIC_FW_CAPABILITY_BDG               BIT_8
+#define QLCNIC_FW_CAPABILITY_FVLANTX           BIT_9
+#define QLCNIC_FW_CAPABILITY_HW_LRO            BIT_10
 
 /* module types */
 #define LINKEVENT_MODULE_NOT_PRESENT                   1
index f8e39e4cfe0fdc2752c40967034992c939720850..baf5a52b2a4bbed8be5a9444248a5e7e462f908e 100644 (file)
@@ -820,6 +820,9 @@ static u32 qlcnic_get_tso(struct net_device *dev)
 
 static int qlcnic_set_tso(struct net_device *dev, u32 data)
 {
+       struct qlcnic_adapter *adapter = netdev_priv(dev);
+       if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO))
+               return -EOPNOTSUPP;
        if (data)
                dev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
        else
index 18e2b2e6626d40ad3f7b3a82a4ba6ee7bb459db4..c334f1a0a2a42b43a618ea22d9f94de619132093 100644 (file)
@@ -1226,10 +1226,14 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter,
        SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_ops);
 
        netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
-               NETIF_F_IPV6_CSUM | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6);
-
+               NETIF_F_IPV6_CSUM | NETIF_F_GRO);
        netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
-               NETIF_F_IPV6_CSUM | NETIF_F_TSO | NETIF_F_TSO6);
+               NETIF_F_IPV6_CSUM);
+
+       if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) {
+               netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
+               netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
+       }
 
        if (pci_using_dac) {
                netdev->features |= NETIF_F_HIGHDMA;