sfc: make capability checking a nic_type function
Various MCDI functions (especially in filter handling) need to check the datapath caps, but those live in nic_data (since they don't exist on Siena). Decouple from ef10-specific data structures by adding check_caps to the nic_type, to allow using these functions from non-ef10 drivers. Also add a convenience macro efx_has_cap() to reduce the amount of boilerplate involved in calling it. Signed-off-by: Edward Cree <ecree@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
dfcabb0788
Коммит
be904b8552
|
@ -3961,6 +3961,22 @@ out_unlock:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int ef10_check_caps(const struct efx_nic *efx,
|
||||||
|
u8 flag,
|
||||||
|
u32 offset)
|
||||||
|
{
|
||||||
|
const struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||||
|
|
||||||
|
switch (offset) {
|
||||||
|
case(MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_OFST):
|
||||||
|
return nic_data->datapath_caps & BIT_ULL(flag);
|
||||||
|
case(MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_OFST):
|
||||||
|
return nic_data->datapath_caps2 & BIT_ULL(flag);
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define EF10_OFFLOAD_FEATURES \
|
#define EF10_OFFLOAD_FEATURES \
|
||||||
(NETIF_F_IP_CSUM | \
|
(NETIF_F_IP_CSUM | \
|
||||||
NETIF_F_HW_VLAN_CTAG_FILTER | \
|
NETIF_F_HW_VLAN_CTAG_FILTER | \
|
||||||
|
@ -4073,6 +4089,7 @@ const struct efx_nic_type efx_hunt_a0_vf_nic_type = {
|
||||||
.hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |
|
.hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |
|
||||||
1 << HWTSTAMP_FILTER_ALL,
|
1 << HWTSTAMP_FILTER_ALL,
|
||||||
.rx_hash_key_size = 40,
|
.rx_hash_key_size = 40,
|
||||||
|
.check_caps = ef10_check_caps,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct efx_nic_type efx_hunt_a0_nic_type = {
|
const struct efx_nic_type efx_hunt_a0_nic_type = {
|
||||||
|
@ -4208,4 +4225,5 @@ const struct efx_nic_type efx_hunt_a0_nic_type = {
|
||||||
.hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |
|
.hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |
|
||||||
1 << HWTSTAMP_FILTER_ALL,
|
1 << HWTSTAMP_FILTER_ALL,
|
||||||
.rx_hash_key_size = 40,
|
.rx_hash_key_size = 40,
|
||||||
|
.check_caps = ef10_check_caps,
|
||||||
};
|
};
|
||||||
|
|
|
@ -326,6 +326,18 @@ void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev);
|
||||||
#define MCDI_EVENT_FIELD(_ev, _field) \
|
#define MCDI_EVENT_FIELD(_ev, _field) \
|
||||||
EFX_QWORD_FIELD(_ev, MCDI_EVENT_ ## _field)
|
EFX_QWORD_FIELD(_ev, MCDI_EVENT_ ## _field)
|
||||||
|
|
||||||
|
#define MCDI_CAPABILITY(field) \
|
||||||
|
MC_CMD_GET_CAPABILITIES_V4_OUT_ ## field ## _LBN
|
||||||
|
|
||||||
|
#define MCDI_CAPABILITY_OFST(field) \
|
||||||
|
MC_CMD_GET_CAPABILITIES_V4_OUT_ ## field ## _OFST
|
||||||
|
|
||||||
|
/* field is FLAGS1 or FLAGS2 */
|
||||||
|
#define efx_has_cap(efx, flag, field) \
|
||||||
|
efx->type->check_caps(efx, \
|
||||||
|
MCDI_CAPABILITY(flag), \
|
||||||
|
MCDI_CAPABILITY_OFST(field))
|
||||||
|
|
||||||
void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len);
|
void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len);
|
||||||
int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
|
int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
|
||||||
u16 *fw_subtype_list, u32 *capabilities);
|
u16 *fw_subtype_list, u32 *capabilities);
|
||||||
|
|
|
@ -1354,6 +1354,9 @@ struct efx_nic_type {
|
||||||
void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
|
void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
|
||||||
int (*set_wol)(struct efx_nic *efx, u32 type);
|
int (*set_wol)(struct efx_nic *efx, u32 type);
|
||||||
void (*resume_wol)(struct efx_nic *efx);
|
void (*resume_wol)(struct efx_nic *efx);
|
||||||
|
unsigned int (*check_caps)(const struct efx_nic *efx,
|
||||||
|
u8 flag,
|
||||||
|
u32 offset);
|
||||||
int (*test_chip)(struct efx_nic *efx, struct efx_self_tests *tests);
|
int (*test_chip)(struct efx_nic *efx, struct efx_self_tests *tests);
|
||||||
int (*test_nvram)(struct efx_nic *efx);
|
int (*test_nvram)(struct efx_nic *efx);
|
||||||
void (*mcdi_request)(struct efx_nic *efx,
|
void (*mcdi_request)(struct efx_nic *efx,
|
||||||
|
|
|
@ -948,6 +948,13 @@ fail:
|
||||||
|
|
||||||
#endif /* CONFIG_SFC_MTD */
|
#endif /* CONFIG_SFC_MTD */
|
||||||
|
|
||||||
|
unsigned int siena_check_caps(const struct efx_nic *efx,
|
||||||
|
u8 flag, u32 offset)
|
||||||
|
{
|
||||||
|
/* Siena did not support MC_CMD_GET_CAPABILITIES */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Revision-dependent attributes used by efx.c and nic.c
|
* Revision-dependent attributes used by efx.c and nic.c
|
||||||
|
|
Загрузка…
Ссылка в новой задаче