|
@@ -600,6 +600,7 @@ fail:
|
|
|
*/
|
|
|
static void efx_start_datapath(struct efx_nic *efx)
|
|
|
{
|
|
|
+ netdev_features_t old_features = efx->net_dev->features;
|
|
|
bool old_rx_scatter = efx->rx_scatter;
|
|
|
struct efx_tx_queue *tx_queue;
|
|
|
struct efx_rx_queue *rx_queue;
|
|
@@ -644,6 +645,15 @@ static void efx_start_datapath(struct efx_nic *efx)
|
|
|
efx->rx_dma_len, efx->rx_page_buf_step,
|
|
|
efx->rx_bufs_per_page, efx->rx_pages_per_batch);
|
|
|
|
|
|
+ /* Restore previously fixed features in hw_features and remove
|
|
|
+ * features which are fixed now
|
|
|
+ */
|
|
|
+ efx->net_dev->hw_features |= efx->net_dev->features;
|
|
|
+ efx->net_dev->hw_features &= ~efx->fixed_features;
|
|
|
+ efx->net_dev->features |= efx->fixed_features;
|
|
|
+ if (efx->net_dev->features != old_features)
|
|
|
+ netdev_features_change(efx->net_dev);
|
|
|
+
|
|
|
/* RX filters may also have scatter-enabled flags */
|
|
|
if (efx->rx_scatter != old_rx_scatter)
|
|
|
efx->type->filter_update_rx_scatter(efx);
|
|
@@ -3147,17 +3157,17 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
|
|
|
return -ENOMEM;
|
|
|
efx = netdev_priv(net_dev);
|
|
|
efx->type = (const struct efx_nic_type *) entry->driver_data;
|
|
|
+ efx->fixed_features |= NETIF_F_HIGHDMA;
|
|
|
net_dev->features |= (efx->type->offload_features | NETIF_F_SG |
|
|
|
- NETIF_F_HIGHDMA | NETIF_F_TSO |
|
|
|
- NETIF_F_RXCSUM);
|
|
|
+ NETIF_F_TSO | NETIF_F_RXCSUM);
|
|
|
if (efx->type->offload_features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM))
|
|
|
net_dev->features |= NETIF_F_TSO6;
|
|
|
/* Mask for features that also apply to VLAN devices */
|
|
|
net_dev->vlan_features |= (NETIF_F_HW_CSUM | NETIF_F_SG |
|
|
|
NETIF_F_HIGHDMA | NETIF_F_ALL_TSO |
|
|
|
NETIF_F_RXCSUM);
|
|
|
- /* All offloads can be toggled */
|
|
|
- net_dev->hw_features = net_dev->features & ~NETIF_F_HIGHDMA;
|
|
|
+ net_dev->features |= efx->fixed_features;
|
|
|
+ net_dev->hw_features = net_dev->features & ~efx->fixed_features;
|
|
|
pci_set_drvdata(pci_dev, efx);
|
|
|
SET_NETDEV_DEV(net_dev, &pci_dev->dev);
|
|
|
rc = efx_init_struct(efx, pci_dev, net_dev);
|