|
@@ -9253,6 +9253,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
|
u8 broadcast[ETH_ALEN];
|
|
u8 broadcast[ETH_ALEN];
|
|
u8 mac_addr[ETH_ALEN];
|
|
u8 mac_addr[ETH_ALEN];
|
|
int etherdev_size;
|
|
int etherdev_size;
|
|
|
|
+ netdev_features_t hw_enc_features;
|
|
|
|
+ netdev_features_t hw_features;
|
|
|
|
|
|
etherdev_size = sizeof(struct i40e_netdev_priv);
|
|
etherdev_size = sizeof(struct i40e_netdev_priv);
|
|
netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs);
|
|
netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs);
|
|
@@ -9263,43 +9265,43 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
|
np = netdev_priv(netdev);
|
|
np = netdev_priv(netdev);
|
|
np->vsi = vsi;
|
|
np->vsi = vsi;
|
|
|
|
|
|
- netdev->hw_enc_features |= NETIF_F_SG |
|
|
|
|
- NETIF_F_IP_CSUM |
|
|
|
|
- NETIF_F_IPV6_CSUM |
|
|
|
|
- NETIF_F_HIGHDMA |
|
|
|
|
- NETIF_F_SOFT_FEATURES |
|
|
|
|
- NETIF_F_TSO |
|
|
|
|
- NETIF_F_TSO_ECN |
|
|
|
|
- NETIF_F_TSO6 |
|
|
|
|
- NETIF_F_GSO_GRE |
|
|
|
|
- NETIF_F_GSO_GRE_CSUM |
|
|
|
|
- NETIF_F_GSO_IPXIP4 |
|
|
|
|
- NETIF_F_GSO_IPXIP6 |
|
|
|
|
- NETIF_F_GSO_UDP_TUNNEL |
|
|
|
|
- NETIF_F_GSO_UDP_TUNNEL_CSUM |
|
|
|
|
- NETIF_F_GSO_PARTIAL |
|
|
|
|
- NETIF_F_SCTP_CRC |
|
|
|
|
- NETIF_F_RXHASH |
|
|
|
|
- NETIF_F_RXCSUM |
|
|
|
|
- 0;
|
|
|
|
|
|
+ hw_enc_features = NETIF_F_SG |
|
|
|
|
+ NETIF_F_IP_CSUM |
|
|
|
|
+ NETIF_F_IPV6_CSUM |
|
|
|
|
+ NETIF_F_HIGHDMA |
|
|
|
|
+ NETIF_F_SOFT_FEATURES |
|
|
|
|
+ NETIF_F_TSO |
|
|
|
|
+ NETIF_F_TSO_ECN |
|
|
|
|
+ NETIF_F_TSO6 |
|
|
|
|
+ NETIF_F_GSO_GRE |
|
|
|
|
+ NETIF_F_GSO_GRE_CSUM |
|
|
|
|
+ NETIF_F_GSO_PARTIAL |
|
|
|
|
+ NETIF_F_GSO_UDP_TUNNEL |
|
|
|
|
+ NETIF_F_GSO_UDP_TUNNEL_CSUM |
|
|
|
|
+ NETIF_F_SCTP_CRC |
|
|
|
|
+ NETIF_F_RXHASH |
|
|
|
|
+ NETIF_F_RXCSUM |
|
|
|
|
+ 0;
|
|
|
|
|
|
if (!(pf->flags & I40E_FLAG_OUTER_UDP_CSUM_CAPABLE))
|
|
if (!(pf->flags & I40E_FLAG_OUTER_UDP_CSUM_CAPABLE))
|
|
netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
|
|
netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
|
|
|
|
|
|
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
|
|
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
|
|
|
|
|
|
|
|
+ netdev->hw_enc_features |= hw_enc_features;
|
|
|
|
+
|
|
/* record features VLANs can make use of */
|
|
/* record features VLANs can make use of */
|
|
- netdev->vlan_features |= netdev->hw_enc_features |
|
|
|
|
- NETIF_F_TSO_MANGLEID;
|
|
|
|
|
|
+ netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID;
|
|
|
|
|
|
if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
|
|
if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
|
|
netdev->hw_features |= NETIF_F_NTUPLE;
|
|
netdev->hw_features |= NETIF_F_NTUPLE;
|
|
|
|
+ hw_features = hw_enc_features |
|
|
|
|
+ NETIF_F_HW_VLAN_CTAG_TX |
|
|
|
|
+ NETIF_F_HW_VLAN_CTAG_RX;
|
|
|
|
|
|
- netdev->hw_features |= netdev->hw_enc_features |
|
|
|
|
- NETIF_F_HW_VLAN_CTAG_TX |
|
|
|
|
- NETIF_F_HW_VLAN_CTAG_RX;
|
|
|
|
|
|
+ netdev->hw_features |= hw_features;
|
|
|
|
|
|
- netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
|
|
|
|
|
|
+ netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
|
|
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
|
|
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
|
|
|
|
|
|
if (vsi->type == I40E_VSI_MAIN) {
|
|
if (vsi->type == I40E_VSI_MAIN) {
|
|
@@ -11393,6 +11395,11 @@ static void i40e_remove(struct pci_dev *pdev)
|
|
if (pf->service_task.func)
|
|
if (pf->service_task.func)
|
|
cancel_work_sync(&pf->service_task);
|
|
cancel_work_sync(&pf->service_task);
|
|
|
|
|
|
|
|
+ /* Client close must be called explicitly here because the timer
|
|
|
|
+ * has been stopped.
|
|
|
|
+ */
|
|
|
|
+ i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
|
|
|
|
+
|
|
if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
|
|
if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
|
|
i40e_free_vfs(pf);
|
|
i40e_free_vfs(pf);
|
|
pf->flags &= ~I40E_FLAG_SRIOV_ENABLED;
|
|
pf->flags &= ~I40E_FLAG_SRIOV_ENABLED;
|
|
@@ -11633,6 +11640,11 @@ static void i40e_shutdown(struct pci_dev *pdev)
|
|
cancel_work_sync(&pf->service_task);
|
|
cancel_work_sync(&pf->service_task);
|
|
i40e_fdir_teardown(pf);
|
|
i40e_fdir_teardown(pf);
|
|
|
|
|
|
|
|
+ /* Client close must be called explicitly here because the timer
|
|
|
|
+ * has been stopped.
|
|
|
|
+ */
|
|
|
|
+ i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
|
|
|
|
+
|
|
if (pf->wol_en && (pf->flags & I40E_FLAG_WOL_MC_MAGIC_PKT_WAKE))
|
|
if (pf->wol_en && (pf->flags & I40E_FLAG_WOL_MC_MAGIC_PKT_WAKE))
|
|
i40e_enable_mc_magic_wake(pf);
|
|
i40e_enable_mc_magic_wake(pf);
|
|
|
|
|