Commit ebfcd0fd authored by Andrew Rybchenko's avatar Andrew Rybchenko Committed by David S. Miller

sfc: Add efx_nic member with fixed netdev features

It allows to change set of fixed features on datapath reset.
Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b071c3a2
...@@ -600,6 +600,7 @@ static int efx_probe_channels(struct efx_nic *efx) ...@@ -600,6 +600,7 @@ static int efx_probe_channels(struct efx_nic *efx)
*/ */
static void efx_start_datapath(struct efx_nic *efx) 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; bool old_rx_scatter = efx->rx_scatter;
struct efx_tx_queue *tx_queue; struct efx_tx_queue *tx_queue;
struct efx_rx_queue *rx_queue; struct efx_rx_queue *rx_queue;
...@@ -644,6 +645,15 @@ static void efx_start_datapath(struct efx_nic *efx) ...@@ -644,6 +645,15 @@ static void efx_start_datapath(struct efx_nic *efx)
efx->rx_dma_len, efx->rx_page_buf_step, efx->rx_dma_len, efx->rx_page_buf_step,
efx->rx_bufs_per_page, efx->rx_pages_per_batch); 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 */ /* RX filters may also have scatter-enabled flags */
if (efx->rx_scatter != old_rx_scatter) if (efx->rx_scatter != old_rx_scatter)
efx->type->filter_update_rx_scatter(efx); efx->type->filter_update_rx_scatter(efx);
...@@ -3147,17 +3157,17 @@ static int efx_pci_probe(struct pci_dev *pci_dev, ...@@ -3147,17 +3157,17 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
return -ENOMEM; return -ENOMEM;
efx = netdev_priv(net_dev); efx = netdev_priv(net_dev);
efx->type = (const struct efx_nic_type *) entry->driver_data; 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 | net_dev->features |= (efx->type->offload_features | NETIF_F_SG |
NETIF_F_HIGHDMA | NETIF_F_TSO | NETIF_F_TSO | NETIF_F_RXCSUM);
NETIF_F_RXCSUM);
if (efx->type->offload_features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_CSUM)) if (efx->type->offload_features & (NETIF_F_IPV6_CSUM | NETIF_F_HW_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_HW_CSUM | NETIF_F_SG | net_dev->vlan_features |= (NETIF_F_HW_CSUM | NETIF_F_SG |
NETIF_F_HIGHDMA | NETIF_F_ALL_TSO | NETIF_F_HIGHDMA | NETIF_F_ALL_TSO |
NETIF_F_RXCSUM); NETIF_F_RXCSUM);
/* All offloads can be toggled */ net_dev->features |= efx->fixed_features;
net_dev->hw_features = net_dev->features & ~NETIF_F_HIGHDMA; net_dev->hw_features = net_dev->features & ~efx->fixed_features;
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);
rc = efx_init_struct(efx, pci_dev, net_dev); rc = efx_init_struct(efx, pci_dev, net_dev);
......
...@@ -868,6 +868,7 @@ struct vfdi_status; ...@@ -868,6 +868,7 @@ struct vfdi_status;
* be held to modify it. * be held to modify it.
* @port_initialized: Port initialized? * @port_initialized: Port initialized?
* @net_dev: Operating system network device. Consider holding the rtnl lock * @net_dev: Operating system network device. Consider holding the rtnl lock
* @fixed_features: Features which cannot be turned off
* @stats_buffer: DMA buffer for statistics * @stats_buffer: DMA buffer for statistics
* @phy_type: PHY type * @phy_type: PHY type
* @phy_op: PHY interface * @phy_op: PHY interface
...@@ -1007,6 +1008,8 @@ struct efx_nic { ...@@ -1007,6 +1008,8 @@ struct efx_nic {
bool port_initialized; bool port_initialized;
struct net_device *net_dev; struct net_device *net_dev;
netdev_features_t fixed_features;
struct efx_buffer stats_buffer; struct efx_buffer stats_buffer;
u64 rx_nodesc_drops_total; u64 rx_nodesc_drops_total;
u64 rx_nodesc_drops_while_down; u64 rx_nodesc_drops_while_down;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment