qlcnic: turn off lro when rxcsum is disabled.
o Also dont allow lro to be turn on, if rx csum is disabled Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com> Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8dec32cc42
commit
24763d80fb
|
@ -894,6 +894,7 @@ struct qlcnic_mac_req {
|
||||||
#define QLCNIC_MSI_ENABLED 0x02
|
#define QLCNIC_MSI_ENABLED 0x02
|
||||||
#define QLCNIC_MSIX_ENABLED 0x04
|
#define QLCNIC_MSIX_ENABLED 0x04
|
||||||
#define QLCNIC_LRO_ENABLED 0x08
|
#define QLCNIC_LRO_ENABLED 0x08
|
||||||
|
#define QLCNIC_LRO_DISABLED 0x00
|
||||||
#define QLCNIC_BRIDGE_ENABLED 0X10
|
#define QLCNIC_BRIDGE_ENABLED 0X10
|
||||||
#define QLCNIC_DIAG_ENABLED 0x20
|
#define QLCNIC_DIAG_ENABLED 0x20
|
||||||
#define QLCNIC_ESWITCH_ENABLED 0x40
|
#define QLCNIC_ESWITCH_ENABLED 0x40
|
||||||
|
|
|
@ -818,7 +818,21 @@ static u32 qlcnic_get_rx_csum(struct net_device *dev)
|
||||||
static int qlcnic_set_rx_csum(struct net_device *dev, u32 data)
|
static int qlcnic_set_rx_csum(struct net_device *dev, u32 data)
|
||||||
{
|
{
|
||||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (!!data) {
|
||||||
|
adapter->rx_csum = !!data;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapter->flags & QLCNIC_LRO_ENABLED) {
|
||||||
|
if (qlcnic_config_hw_lro(adapter, QLCNIC_LRO_DISABLED))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
dev->features &= ~NETIF_F_LRO;
|
||||||
|
qlcnic_send_lro_cleanup(adapter);
|
||||||
|
}
|
||||||
adapter->rx_csum = !!data;
|
adapter->rx_csum = !!data;
|
||||||
|
dev_info(&adapter->pdev->dev, "disabling LRO as rx_csum is off\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1001,6 +1015,15 @@ static int qlcnic_set_flags(struct net_device *netdev, u32 data)
|
||||||
if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
|
if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
|
||||||
return -EINVAL;
|
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) && (adapter->flags & QLCNIC_LRO_ENABLED))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (data & ETH_FLAG_LRO) {
|
if (data & ETH_FLAG_LRO) {
|
||||||
hw_lro = QLCNIC_LRO_ENABLED;
|
hw_lro = QLCNIC_LRO_ENABLED;
|
||||||
netdev->features |= NETIF_F_LRO;
|
netdev->features |= NETIF_F_LRO;
|
||||||
|
|
|
@ -995,7 +995,7 @@ __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
|
||||||
|
|
||||||
qlcnic_config_intr_coalesce(adapter);
|
qlcnic_config_intr_coalesce(adapter);
|
||||||
|
|
||||||
if (adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
|
if (netdev->features & NETIF_F_LRO)
|
||||||
qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
|
qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
|
||||||
|
|
||||||
qlcnic_napi_enable(adapter);
|
qlcnic_napi_enable(adapter);
|
||||||
|
|
Loading…
Reference in New Issue