@@ -164,7 +164,8 @@ aq_check_approve_fvlan(struct aq_nic_s *aq_nic,
return -EINVAL;
}
- if ((aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) &&
+ if (netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_FILTER_BIT,
+ aq_nic->ndev->features) &&
(!test_bit(be16_to_cpu(fsp->h_ext.vlan_tci) & VLAN_VID_MASK,
aq_nic->active_vlans))) {
netdev_err(aq_nic->ndev,
@@ -236,7 +237,8 @@ aq_rule_is_not_support(struct aq_nic_s *aq_nic,
{
bool rule_is_not_support = false;
- if (!(aq_nic->ndev->features & NETIF_F_NTUPLE)) {
+ if (!netdev_feature_test_bit(NETIF_F_NTUPLE_BIT,
+ aq_nic->ndev->features)) {
netdev_err(aq_nic->ndev,
"ethtool: Please, to enable the RX flow control:\n"
"ethtool -K %s ntuple on\n", aq_nic->ndev->name);
@@ -836,7 +838,8 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic)
aq_fvlan_rebuild(aq_nic, aq_nic->active_vlans,
aq_nic->aq_hw_rx_fltrs.fl2.aq_vlans);
- if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
+ if (netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_FILTER_BIT,
+ aq_nic->ndev->features)) {
for (i = 0; i < BITS_TO_LONGS(VLAN_N_VID); i++)
hweight += hweight_long(aq_nic->active_vlans[i]);
@@ -851,7 +854,8 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic)
if (err)
return err;
- if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
+ if (netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_FILTER_BIT,
+ aq_nic->ndev->features)) {
if (hweight <= AQ_VLAN_MAX_FILTERS && hweight > 0) {
err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw,
!(aq_nic->packet_filter & IFF_PROMISC));
@@ -1490,7 +1490,7 @@ int aq_macsec_init(struct aq_nic_s *nic)
if (!nic->macsec_cfg)
return -ENOMEM;
- nic->ndev->features |= NETIF_F_HW_MACSEC;
+ netdev_feature_set_bit(NETIF_F_HW_MACSEC_BIT, &nic->ndev->features);
nic->ndev->macsec_ops = &aq_macsec_ops;
return 0;
@@ -142,35 +142,42 @@ static int aq_ndev_change_mtu(struct net_device *ndev, int new_mtu)
static int aq_ndev_set_features(struct net_device *ndev,
netdev_features_t features)
{
- bool is_vlan_tx_insert = !!(features & NETIF_F_HW_VLAN_CTAG_TX);
- bool is_vlan_rx_strip = !!(features & NETIF_F_HW_VLAN_CTAG_RX);
struct aq_nic_s *aq_nic = netdev_priv(ndev);
bool need_ndev_restart = false;
struct aq_nic_cfg_s *aq_cfg;
+ bool is_vlan_tx_insert;
+ bool is_vlan_rx_strip;
bool is_lro = false;
int err = 0;
+ is_vlan_tx_insert = netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_TX_BIT,
+ features);
+ is_vlan_rx_strip = netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_RX_BIT,
+ features);
aq_cfg = aq_nic_get_cfg(aq_nic);
- if (!(features & NETIF_F_NTUPLE)) {
- if (aq_nic->ndev->features & NETIF_F_NTUPLE) {
+ if (!netdev_feature_test_bit(NETIF_F_NTUPLE_BIT, features)) {
+ if (netdev_feature_test_bit(NETIF_F_NTUPLE_BIT,
+ aq_nic->ndev->features)) {
err = aq_clear_rxnfc_all_rules(aq_nic);
if (unlikely(err))
goto err_exit;
}
}
- if (!(features & NETIF_F_HW_VLAN_CTAG_FILTER)) {
- if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) {
+ if (!netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_FILTER_BIT,
+ features)) {
+ if (netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_FILTER_BIT,
+ aq_nic->ndev->features)) {
err = aq_filters_vlan_offload_off(aq_nic);
if (unlikely(err))
goto err_exit;
}
}
- aq_cfg->features = features;
+ netdev_feature_copy(&aq_cfg->features, features);
if (aq_cfg->aq_hw_caps->hw_features & NETIF_F_LRO) {
- is_lro = features & NETIF_F_LRO;
+ is_lro = netdev_feature_test_bit(NETIF_F_LRO_BIT, features);
if (aq_cfg->is_lro != is_lro) {
aq_cfg->is_lro = is_lro;
@@ -178,7 +185,9 @@ static int aq_ndev_set_features(struct net_device *ndev,
}
}
- if ((aq_nic->ndev->features ^ features) & NETIF_F_RXCSUM) {
+ if (netdev_feature_test_bit(NETIF_F_RXCSUM_BIT,
+ aq_nic->ndev->features) !=
+ netdev_feature_test_bit(NETIF_F_RXCSUM_BIT, features)) {
err = aq_nic->aq_hw_ops->hw_set_offload(aq_nic->aq_hw,
aq_cfg);
@@ -144,9 +144,14 @@ void aq_nic_cfg_start(struct aq_nic_s *self)
cfg->link_irq_vec = 0;
cfg->link_speed_msk &= cfg->aq_hw_caps->link_speed_msk;
- cfg->features = cfg->aq_hw_caps->hw_features;
- cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX);
- cfg->is_vlan_tx_insert = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_TX);
+ netdev_feature_zero(&cfg->features);
+ netdev_feature_set_bits(cfg->aq_hw_caps->hw_features, &cfg->features);
+ cfg->is_vlan_rx_strip =
+ netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_RX_BIT,
+ cfg->features);
+ cfg->is_vlan_tx_insert =
+ netdev_feature_test_bit(NETIF_F_HW_VLAN_CTAG_TX_BIT,
+ cfg->features);
cfg->is_vlan_force_promisc = true;
for (i = 0; i < sizeof(cfg->prio_tc_map); i++)
@@ -367,12 +372,17 @@ void aq_nic_ndev_init(struct aq_nic_s *self)
const struct aq_hw_caps_s *aq_hw_caps = self->aq_nic_cfg.aq_hw_caps;
struct aq_nic_cfg_s *aq_nic_cfg = &self->aq_nic_cfg;
- self->ndev->hw_features |= aq_hw_caps->hw_features;
- self->ndev->features = aq_hw_caps->hw_features;
- self->ndev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
- NETIF_F_RXHASH | NETIF_F_SG |
- NETIF_F_LRO | NETIF_F_TSO | NETIF_F_TSO6;
- self->ndev->gso_partial_features = NETIF_F_GSO_UDP_L4;
+ netdev_feature_set_bits(aq_hw_caps->hw_features,
+ &self->ndev->hw_features);
+ netdev_feature_zero(&self->ndev->features);
+ netdev_feature_set_bits(aq_hw_caps->hw_features, &self->ndev->features);
+ netdev_feature_set_bits(NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
+ NETIF_F_RXHASH | NETIF_F_SG |
+ NETIF_F_LRO | NETIF_F_TSO | NETIF_F_TSO6,
+ &self->ndev->vlan_features);
+ netdev_feature_zero(&self->ndev->gso_partial_features);
+ netdev_feature_set_bit(NETIF_F_GSO_UDP_L4_BIT,
+ &self->ndev->gso_partial_features);
self->ndev->priv_flags = aq_hw_caps->hw_priv_flags;
self->ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
@@ -38,7 +38,7 @@ struct aq_fc_info {
struct aq_nic_cfg_s {
const struct aq_hw_caps_s *aq_hw_caps;
- u64 features;
+ netdev_features_t features;
u32 rxds; /* rx ring size, descriptors # */
u32 txds; /* tx ring size, descriptors # */
u32 vecs; /* allocated rx/tx vectors */
@@ -318,7 +318,8 @@ static void aq_rx_checksum(struct aq_ring_s *self,
struct aq_ring_buff_s *buff,
struct sk_buff *skb)
{
- if (!(self->aq_nic->ndev->features & NETIF_F_RXCSUM))
+ if (!netdev_feature_test_bit(NETIF_F_RXCSUM_BIT,
+ self->aq_nic->ndev->features))
return;
if (unlikely(buff->is_cso_err)) {
@@ -273,7 +273,8 @@ static int hw_atl_b0_hw_rss_set(struct aq_hw_s *self,
int hw_atl_b0_hw_offload_set(struct aq_hw_s *self,
struct aq_nic_cfg_s *aq_nic_cfg)
{
- u64 rxcsum = !!(aq_nic_cfg->features & NETIF_F_RXCSUM);
+ u64 rxcsum = netdev_feature_test_bit(NETIF_F_RXCSUM_BIT,
+ aq_nic_cfg->features);
unsigned int i;
/* TX checksums offloads*/
Use netdev_feature_xxx helpers to replace the logical operation for netdev features. Signed-off-by: Jian Shen <shenjian15@huawei.com> --- .../ethernet/aquantia/atlantic/aq_filters.c | 12 +++++--- .../ethernet/aquantia/atlantic/aq_macsec.c | 2 +- .../net/ethernet/aquantia/atlantic/aq_main.c | 27 ++++++++++++------ .../net/ethernet/aquantia/atlantic/aq_nic.c | 28 +++++++++++++------ .../net/ethernet/aquantia/atlantic/aq_nic.h | 2 +- .../net/ethernet/aquantia/atlantic/aq_ring.c | 3 +- .../aquantia/atlantic/hw_atl/hw_atl_b0.c | 3 +- 7 files changed, 51 insertions(+), 26 deletions(-)