|
@@ -1874,6 +1874,17 @@ static void efx_set_multicast_list(struct net_device *net_dev)
|
|
/* Otherwise efx_start_port() will do this */
|
|
/* Otherwise efx_start_port() will do this */
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int efx_set_features(struct net_device *net_dev, u32 data)
|
|
|
|
+{
|
|
|
|
+ struct efx_nic *efx = netdev_priv(net_dev);
|
|
|
|
+
|
|
|
|
+ /* If disabling RX n-tuple filtering, clear existing filters */
|
|
|
|
+ if (net_dev->features & ~data & NETIF_F_NTUPLE)
|
|
|
|
+ efx_filter_clear_rx(efx, EFX_FILTER_PRI_MANUAL);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct net_device_ops efx_netdev_ops = {
|
|
static const struct net_device_ops efx_netdev_ops = {
|
|
.ndo_open = efx_net_open,
|
|
.ndo_open = efx_net_open,
|
|
.ndo_stop = efx_net_stop,
|
|
.ndo_stop = efx_net_stop,
|
|
@@ -1885,6 +1896,7 @@ static const struct net_device_ops efx_netdev_ops = {
|
|
.ndo_change_mtu = efx_change_mtu,
|
|
.ndo_change_mtu = efx_change_mtu,
|
|
.ndo_set_mac_address = efx_set_mac_address,
|
|
.ndo_set_mac_address = efx_set_mac_address,
|
|
.ndo_set_multicast_list = efx_set_multicast_list,
|
|
.ndo_set_multicast_list = efx_set_multicast_list,
|
|
|
|
+ .ndo_set_features = efx_set_features,
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
.ndo_poll_controller = efx_netpoll,
|
|
.ndo_poll_controller = efx_netpoll,
|
|
#endif
|
|
#endif
|
|
@@ -2269,7 +2281,6 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,
|
|
strlcpy(efx->name, pci_name(pci_dev), sizeof(efx->name));
|
|
strlcpy(efx->name, pci_name(pci_dev), sizeof(efx->name));
|
|
|
|
|
|
efx->net_dev = net_dev;
|
|
efx->net_dev = net_dev;
|
|
- efx->rx_checksum_enabled = true;
|
|
|
|
spin_lock_init(&efx->stats_lock);
|
|
spin_lock_init(&efx->stats_lock);
|
|
mutex_init(&efx->mac_lock);
|
|
mutex_init(&efx->mac_lock);
|
|
efx->mac_op = type->default_mac_ops;
|
|
efx->mac_op = type->default_mac_ops;
|
|
@@ -2452,12 +2463,15 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
net_dev->features |= (type->offload_features | NETIF_F_SG |
|
|
net_dev->features |= (type->offload_features | NETIF_F_SG |
|
|
NETIF_F_HIGHDMA | NETIF_F_TSO |
|
|
NETIF_F_HIGHDMA | NETIF_F_TSO |
|
|
- NETIF_F_GRO);
|
|
|
|
|
|
+ NETIF_F_RXCSUM);
|
|
if (type->offload_features & NETIF_F_V6_CSUM)
|
|
if (type->offload_features & NETIF_F_V6_CSUM)
|
|
net_dev->features |= NETIF_F_TSO6;
|
|
net_dev->features |= NETIF_F_TSO6;
|
|
/* Mask for features that also apply to VLAN devices */
|
|
/* Mask for features that also apply to VLAN devices */
|
|
net_dev->vlan_features |= (NETIF_F_ALL_CSUM | NETIF_F_SG |
|
|
net_dev->vlan_features |= (NETIF_F_ALL_CSUM | NETIF_F_SG |
|
|
- NETIF_F_HIGHDMA | NETIF_F_ALL_TSO);
|
|
|
|
|
|
+ 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;
|
|
efx = netdev_priv(net_dev);
|
|
efx = netdev_priv(net_dev);
|
|
pci_set_drvdata(pci_dev, efx);
|
|
pci_set_drvdata(pci_dev, efx);
|
|
SET_NETDEV_DEV(net_dev, &pci_dev->dev);
|
|
SET_NETDEV_DEV(net_dev, &pci_dev->dev);
|