qlcnic: Fix LRO disable
o In dev->open LRO was enabled by default, enable it depending upon netdev->features , kernel may have disabled it. o Configure LRO when interface is up. Signed-off-by: Rajesh Borundia <Rajesh.Borundia@qlogic.com> Signed-off-by: Anirban Chakraborty <Anirban.Chakraborty@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
f8d54811cb
commit
b56421d0b7
@@ -998,22 +998,28 @@ static int qlcnic_set_flags(struct net_device *netdev, u32 data)
|
|||||||
if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO))
|
if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (!adapter->rx_csum) {
|
|
||||||
dev_info(&adapter->pdev->dev, "rx csum is off, "
|
|
||||||
"cannot toggle lro\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data & ETH_FLAG_LRO) && (netdev->features & NETIF_F_LRO))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (data & ETH_FLAG_LRO) {
|
if (data & ETH_FLAG_LRO) {
|
||||||
|
|
||||||
|
if (netdev->features & NETIF_F_LRO)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!adapter->rx_csum) {
|
||||||
|
dev_info(&adapter->pdev->dev, "rx csum is off, "
|
||||||
|
"cannot toggle lro\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
hw_lro = QLCNIC_LRO_ENABLED;
|
hw_lro = QLCNIC_LRO_ENABLED;
|
||||||
netdev->features |= NETIF_F_LRO;
|
netdev->features |= NETIF_F_LRO;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
if (!(netdev->features & NETIF_F_LRO))
|
||||||
|
return 0;
|
||||||
|
|
||||||
hw_lro = 0;
|
hw_lro = 0;
|
||||||
netdev->features &= ~NETIF_F_LRO;
|
netdev->features &= ~NETIF_F_LRO;
|
||||||
}
|
}
|
||||||
|
@@ -566,6 +566,9 @@ int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter, int enable)
|
|||||||
u64 word;
|
u64 word;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state))
|
||||||
|
return 0;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(struct qlcnic_nic_req));
|
memset(&req, 0, sizeof(struct qlcnic_nic_req));
|
||||||
|
|
||||||
req.qhdr = cpu_to_le64(QLCNIC_HOST_REQUEST << 23);
|
req.qhdr = cpu_to_le64(QLCNIC_HOST_REQUEST << 23);
|
||||||
@@ -711,6 +714,9 @@ int qlcnic_send_lro_cleanup(struct qlcnic_adapter *adapter)
|
|||||||
u64 word;
|
u64 word;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state))
|
||||||
|
return 0;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(struct qlcnic_nic_req));
|
memset(&req, 0, sizeof(struct qlcnic_nic_req));
|
||||||
req.qhdr = cpu_to_le64(QLCNIC_HOST_REQUEST << 23);
|
req.qhdr = cpu_to_le64(QLCNIC_HOST_REQUEST << 23);
|
||||||
|
|
||||||
|
@@ -773,7 +773,8 @@ qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
|
|||||||
features |= (NETIF_F_TSO | NETIF_F_TSO6);
|
features |= (NETIF_F_TSO | NETIF_F_TSO6);
|
||||||
vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
|
vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
|
||||||
}
|
}
|
||||||
if (adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
|
|
||||||
|
if (netdev->features & NETIF_F_LRO)
|
||||||
features |= NETIF_F_LRO;
|
features |= NETIF_F_LRO;
|
||||||
|
|
||||||
if (esw_cfg->offload_flags & BIT_0) {
|
if (esw_cfg->offload_flags & BIT_0) {
|
||||||
|
Reference in New Issue
Block a user