diff options
author | David S. Miller <davem@davemloft.net> | 2019-04-10 15:29:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-04-10 15:29:37 -0400 |
commit | f4a58857151f5d0a885fcebb47f6fb1b17dfda9a (patch) | |
tree | 2da6515c2a951a950bcdc8c9d8adceada0f7aa7d /drivers/net/ethernet/ibm/ibmvnic.c | |
parent | f8d49bee4a5e3bd7ce0026e4a83098fcc53b8e7d (diff) | |
parent | dde746a35f8b7da4b9515dd3dc4708a9926fbd65 (diff) |
Merge branch 'ibmvnic-features'
Thomas Falcon says:
====================
ibmvnic: Fix netdev features settings on reset
In its current state, a driver reset clobbers any feature settings
a user may have toggled and will disable GRO as it is not explicitly
enabled in the driver. This patch set enables GRO and tries to retain
user settings after a reset. If the underlying carrier changes, however,
the driver will disable features unsupported by the new carrier.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 51cfe95f3e24..3dfb2d131eb7 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -3762,6 +3762,7 @@ static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter) | |||
3762 | { | 3762 | { |
3763 | struct device *dev = &adapter->vdev->dev; | 3763 | struct device *dev = &adapter->vdev->dev; |
3764 | struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; | 3764 | struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf; |
3765 | netdev_features_t old_hw_features = 0; | ||
3765 | union ibmvnic_crq crq; | 3766 | union ibmvnic_crq crq; |
3766 | int i; | 3767 | int i; |
3767 | 3768 | ||
@@ -3837,24 +3838,41 @@ static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter) | |||
3837 | adapter->ip_offload_ctrl.large_rx_ipv4 = 0; | 3838 | adapter->ip_offload_ctrl.large_rx_ipv4 = 0; |
3838 | adapter->ip_offload_ctrl.large_rx_ipv6 = 0; | 3839 | adapter->ip_offload_ctrl.large_rx_ipv6 = 0; |
3839 | 3840 | ||
3840 | adapter->netdev->features = NETIF_F_SG | NETIF_F_GSO; | 3841 | if (adapter->state != VNIC_PROBING) { |
3842 | old_hw_features = adapter->netdev->hw_features; | ||
3843 | adapter->netdev->hw_features = 0; | ||
3844 | } | ||
3845 | |||
3846 | adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO; | ||
3841 | 3847 | ||
3842 | if (buf->tcp_ipv4_chksum || buf->udp_ipv4_chksum) | 3848 | if (buf->tcp_ipv4_chksum || buf->udp_ipv4_chksum) |
3843 | adapter->netdev->features |= NETIF_F_IP_CSUM; | 3849 | adapter->netdev->hw_features |= NETIF_F_IP_CSUM; |
3844 | 3850 | ||
3845 | if (buf->tcp_ipv6_chksum || buf->udp_ipv6_chksum) | 3851 | if (buf->tcp_ipv6_chksum || buf->udp_ipv6_chksum) |
3846 | adapter->netdev->features |= NETIF_F_IPV6_CSUM; | 3852 | adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM; |
3847 | 3853 | ||
3848 | if ((adapter->netdev->features & | 3854 | if ((adapter->netdev->features & |
3849 | (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM))) | 3855 | (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM))) |
3850 | adapter->netdev->features |= NETIF_F_RXCSUM; | 3856 | adapter->netdev->hw_features |= NETIF_F_RXCSUM; |
3851 | 3857 | ||
3852 | if (buf->large_tx_ipv4) | 3858 | if (buf->large_tx_ipv4) |
3853 | adapter->netdev->features |= NETIF_F_TSO; | 3859 | adapter->netdev->hw_features |= NETIF_F_TSO; |
3854 | if (buf->large_tx_ipv6) | 3860 | if (buf->large_tx_ipv6) |
3855 | adapter->netdev->features |= NETIF_F_TSO6; | 3861 | adapter->netdev->hw_features |= NETIF_F_TSO6; |
3856 | 3862 | ||
3857 | adapter->netdev->hw_features |= adapter->netdev->features; | 3863 | if (adapter->state == VNIC_PROBING) { |
3864 | adapter->netdev->features |= adapter->netdev->hw_features; | ||
3865 | } else if (old_hw_features != adapter->netdev->hw_features) { | ||
3866 | netdev_features_t tmp = 0; | ||
3867 | |||
3868 | /* disable features no longer supported */ | ||
3869 | adapter->netdev->features &= adapter->netdev->hw_features; | ||
3870 | /* turn on features now supported if previously enabled */ | ||
3871 | tmp = (old_hw_features ^ adapter->netdev->hw_features) & | ||
3872 | adapter->netdev->hw_features; | ||
3873 | adapter->netdev->features |= | ||
3874 | tmp & adapter->netdev->wanted_features; | ||
3875 | } | ||
3858 | 3876 | ||
3859 | memset(&crq, 0, sizeof(crq)); | 3877 | memset(&crq, 0, sizeof(crq)); |
3860 | crq.control_ip_offload.first = IBMVNIC_CRQ_CMD; | 3878 | crq.control_ip_offload.first = IBMVNIC_CRQ_CMD; |