sfc: support setting MTU even if not privileged to configure MAC fully
Unprivileged functions (such as VFs) may set their MTU by use of the 'control' field of MC_CMD_SET_MAC_EXT, as used in efx_mcdi_set_mtu(). If calling efx_ef10_mac_reconfigure() from efx_change_mtu(), and the NIC supports the above (SET_MAC_ENHANCED capability), use it rather than efx_mcdi_set_mac(). Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e44f65fd66
commit
af3c38d3fb
|
@ -3306,20 +3306,17 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int efx_ef10_mac_reconfigure(struct efx_nic *efx)
|
||||
static int efx_ef10_mac_reconfigure(struct efx_nic *efx, bool mtu_only)
|
||||
{
|
||||
WARN_ON(!mutex_is_locked(&efx->mac_lock));
|
||||
|
||||
efx_mcdi_filter_sync_rx_mode(efx);
|
||||
|
||||
if (mtu_only && efx_has_cap(efx, SET_MAC_ENHANCED))
|
||||
return efx_mcdi_set_mtu(efx);
|
||||
return efx_mcdi_set_mac(efx);
|
||||
}
|
||||
|
||||
static int efx_ef10_mac_reconfigure_vf(struct efx_nic *efx)
|
||||
{
|
||||
efx_mcdi_filter_sync_rx_mode(efx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int efx_ef10_start_bist(struct efx_nic *efx, u32 bist_type)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_START_BIST_IN_LEN);
|
||||
|
@ -4038,7 +4035,7 @@ const struct efx_nic_type efx_hunt_a0_vf_nic_type = {
|
|||
.stop_stats = efx_port_dummy_op_void,
|
||||
.set_id_led = efx_mcdi_set_id_led,
|
||||
.push_irq_moderation = efx_ef10_push_irq_moderation,
|
||||
.reconfigure_mac = efx_ef10_mac_reconfigure_vf,
|
||||
.reconfigure_mac = efx_ef10_mac_reconfigure,
|
||||
.check_mac_fault = efx_mcdi_mac_check_fault,
|
||||
.reconfigure_port = efx_mcdi_port_reconfigure,
|
||||
.get_wol = efx_ef10_get_wol_vf,
|
||||
|
|
|
@ -169,10 +169,6 @@ static int efx_init_port(struct efx_nic *efx)
|
|||
|
||||
efx->port_initialized = true;
|
||||
|
||||
/* Reconfigure the MAC before creating dma queues (required for
|
||||
* Falcon/A1 where RX_INGR_EN/TX_DRAIN_EN isn't supported) */
|
||||
efx_mac_reconfigure(efx);
|
||||
|
||||
/* Ensure the PHY advertises the correct flow control settings */
|
||||
rc = efx->phy_op->reconfigure(efx);
|
||||
if (rc && rc != -EPERM)
|
||||
|
|
|
@ -139,11 +139,11 @@ void efx_destroy_reset_workqueue(void)
|
|||
/* We assume that efx->type->reconfigure_mac will always try to sync RX
|
||||
* filters and therefore needs to read-lock the filter table against freeing
|
||||
*/
|
||||
void efx_mac_reconfigure(struct efx_nic *efx)
|
||||
void efx_mac_reconfigure(struct efx_nic *efx, bool mtu_only)
|
||||
{
|
||||
if (efx->type->reconfigure_mac) {
|
||||
down_read(&efx->filter_sem);
|
||||
efx->type->reconfigure_mac(efx);
|
||||
efx->type->reconfigure_mac(efx, mtu_only);
|
||||
up_read(&efx->filter_sem);
|
||||
}
|
||||
}
|
||||
|
@ -158,7 +158,7 @@ static void efx_mac_work(struct work_struct *data)
|
|||
|
||||
mutex_lock(&efx->mac_lock);
|
||||
if (efx->port_enabled)
|
||||
efx_mac_reconfigure(efx);
|
||||
efx_mac_reconfigure(efx, false);
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
}
|
||||
|
||||
|
@ -190,7 +190,7 @@ int efx_set_mac_address(struct net_device *net_dev, void *data)
|
|||
|
||||
/* Reconfigure the MAC */
|
||||
mutex_lock(&efx->mac_lock);
|
||||
efx_mac_reconfigure(efx);
|
||||
efx_mac_reconfigure(efx, false);
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
|
||||
return 0;
|
||||
|
@ -304,7 +304,7 @@ int efx_change_mtu(struct net_device *net_dev, int new_mtu)
|
|||
|
||||
mutex_lock(&efx->mac_lock);
|
||||
net_dev->mtu = new_mtu;
|
||||
efx_mac_reconfigure(efx);
|
||||
efx_mac_reconfigure(efx, true);
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
|
||||
efx_start_all(efx);
|
||||
|
@ -486,7 +486,7 @@ static void efx_start_port(struct efx_nic *efx)
|
|||
efx->port_enabled = true;
|
||||
|
||||
/* Ensure MAC ingress/egress is enabled */
|
||||
efx_mac_reconfigure(efx);
|
||||
efx_mac_reconfigure(efx, false);
|
||||
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ static inline void efx_init_mcdi_logging(struct efx_nic *efx) {}
|
|||
static inline void efx_fini_mcdi_logging(struct efx_nic *efx) {}
|
||||
#endif
|
||||
|
||||
void efx_mac_reconfigure(struct efx_nic *efx);
|
||||
void efx_mac_reconfigure(struct efx_nic *efx, bool mtu_only);
|
||||
int efx_set_mac_address(struct net_device *net_dev, void *data);
|
||||
void efx_set_rx_mode(struct net_device *net_dev);
|
||||
int efx_set_features(struct net_device *net_dev, netdev_features_t data);
|
||||
|
|
|
@ -241,7 +241,7 @@ int efx_ethtool_set_pauseparam(struct net_device *net_dev,
|
|||
/* Reconfigure the MAC. The PHY *may* generate a link state change event
|
||||
* if the user just changed the advertised capabilities, but there's no
|
||||
* harm doing this twice */
|
||||
efx_mac_reconfigure(efx);
|
||||
efx_mac_reconfigure(efx, false);
|
||||
|
||||
out:
|
||||
mutex_unlock(&efx->mac_lock);
|
||||
|
|
|
@ -1356,7 +1356,7 @@ struct efx_nic_type {
|
|||
void (*push_irq_moderation)(struct efx_channel *channel);
|
||||
int (*reconfigure_port)(struct efx_nic *efx);
|
||||
void (*prepare_enable_fc_tx)(struct efx_nic *efx);
|
||||
int (*reconfigure_mac)(struct efx_nic *efx);
|
||||
int (*reconfigure_mac)(struct efx_nic *efx, bool mtu_only);
|
||||
bool (*check_mac_fault)(struct efx_nic *efx);
|
||||
void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
|
||||
int (*set_wol)(struct efx_nic *efx, u32 type);
|
||||
|
|
|
@ -633,7 +633,7 @@ static size_t siena_update_nic_stats(struct efx_nic *efx, u64 *full_stats,
|
|||
return SIENA_STAT_COUNT;
|
||||
}
|
||||
|
||||
static int siena_mac_reconfigure(struct efx_nic *efx)
|
||||
static int siena_mac_reconfigure(struct efx_nic *efx, bool mtu_only __always_unused)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_MCAST_HASH_IN_LEN);
|
||||
int rc;
|
||||
|
|
Loading…
Reference in New Issue