* [PATCH net 0/3] bnxt_en: set mac address and uc_list bug fixes.
@ 2015-12-02 3:15 Michael Chan
2015-12-02 3:15 ` [PATCH net 1/3] bnxt_en: Fixed incorrect implementation of ndo_set_mac_address Michael Chan
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Michael Chan @ 2015-12-02 3:15 UTC (permalink / raw)
To: davem; +Cc: netdev
Fix ndo_set_mac_address() for PF and VF.
Re-apply uc_list after chip reset.
Michael Chan (3):
bnxt_en: Fixed incorrect implemenation of ndo_set_mac_address
bnxt_en: enforce properly storing of MAC address
bnxt_en: Setup uc_list mac filters after resetting the chip.
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 42 +++++++++++++++++--------
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 7 ++---
2 files changed, 32 insertions(+), 17 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net 1/3] bnxt_en: Fixed incorrect implementation of ndo_set_mac_address
2015-12-02 3:15 [PATCH net 0/3] bnxt_en: set mac address and uc_list bug fixes Michael Chan
@ 2015-12-02 3:15 ` Michael Chan
2015-12-02 3:15 ` [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address Michael Chan
2015-12-02 3:15 ` [PATCH net 3/3] bnxt_en: Setup uc_list mac filters after resetting the chip Michael Chan
2 siblings, 0 replies; 5+ messages in thread
From: Michael Chan @ 2015-12-02 3:15 UTC (permalink / raw)
To: davem; +Cc: netdev, Jeffrey Huang
From: Jeffrey Huang <huangjw@broadcom.com>
The existing ndo_set_mac_address only copies the new MAC addr
and didn't set the new MAC addr to the HW. The correct way is
to delete the existing default MAC filter from HW and add
the new one. Because of RFS filters are also dependent on the
default mac filter l2 context, the driver must go thru
close_nic() to delete the default MAC and RFS filters, then
open_nic() to set the default MAC address to HW.
Signed-off-by: Jeffrey Huang <huangjw@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index db15c5e..651b587 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -5212,13 +5212,22 @@ init_err:
static int bnxt_change_mac_addr(struct net_device *dev, void *p)
{
struct sockaddr *addr = p;
+ struct bnxt *bp = netdev_priv(dev);
+ int rc = 0;
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
+ if (ether_addr_equal(addr->sa_data, dev->dev_addr))
+ return 0;
+
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+ if (netif_running(dev)) {
+ bnxt_close_nic(bp, false, false);
+ rc = bnxt_open_nic(bp, false, false);
+ }
- return 0;
+ return rc;
}
/* rtnl_lock held */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address
2015-12-02 3:15 [PATCH net 0/3] bnxt_en: set mac address and uc_list bug fixes Michael Chan
2015-12-02 3:15 ` [PATCH net 1/3] bnxt_en: Fixed incorrect implementation of ndo_set_mac_address Michael Chan
@ 2015-12-02 3:15 ` Michael Chan
2015-12-02 4:40 ` kbuild test robot
2015-12-02 3:15 ` [PATCH net 3/3] bnxt_en: Setup uc_list mac filters after resetting the chip Michael Chan
2 siblings, 1 reply; 5+ messages in thread
From: Michael Chan @ 2015-12-02 3:15 UTC (permalink / raw)
To: davem; +Cc: netdev, Jeffrey Huang
From: Jeffrey Huang <huangjw@broadcom.com>
For PF, the bp->pf.mac_addr always holds the permanent MAC
addr assigned by the HW. For VF, the bp->vf.mac_addr always
holds the administrator assigned VF MAC addr. The random
generated VF MAC addr should never get stored to bp->vf.mac_addr.
This way, when the VF wants to change the MAC address, we can tell
if the adminstrator has already set it and disallow the VF from
changing it.
Signed-off-by: Jeffrey Huang <huangjw@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 +++++++++++-------
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 7 +++----
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 651b587..4656480 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -3625,6 +3625,7 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
pf->fw_fid = le16_to_cpu(resp->fid);
pf->port_id = le16_to_cpu(resp->port_id);
memcpy(pf->mac_addr, resp->perm_mac_address, ETH_ALEN);
+ memcpy(bp->dev->dev_addr, pf->mac_addr, ETH_ALEN);
pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
pf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
pf->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
@@ -3648,8 +3649,11 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp)
vf->fw_fid = le16_to_cpu(resp->fid);
memcpy(vf->mac_addr, resp->perm_mac_address, ETH_ALEN);
- if (!is_valid_ether_addr(vf->mac_addr))
- random_ether_addr(vf->mac_addr);
+ if (is_valid_ether_addr(vf->mac_addr))
+ /* overwrite netdev dev_adr with admin VF MAC */
+ memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN);
+ else
+ random_ether_addr(bp->dev->dev_addr);
vf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
vf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
@@ -5218,6 +5222,9 @@ static int bnxt_change_mac_addr(struct net_device *dev, void *p)
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
+ if (BNXT_VF(bp) && is_valid_ether_addr(bp->vf.mac_addr))
+ return -EADDRNOTAVAIL;
+
if (ether_addr_equal(addr->sa_data, dev->dev_addr))
return 0;
@@ -5695,15 +5702,12 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
bnxt_set_tpa_flags(bp);
bnxt_set_ring_params(bp);
dflt_rings = netif_get_num_default_rss_queues();
- if (BNXT_PF(bp)) {
- memcpy(dev->dev_addr, bp->pf.mac_addr, ETH_ALEN);
+ if (BNXT_PF(bp))
bp->pf.max_irqs = max_irqs;
- } else {
#if defined(CONFIG_BNXT_SRIOV)
- memcpy(dev->dev_addr, bp->vf.mac_addr, ETH_ALEN);
+ else
bp->vf.max_irqs = max_irqs;
#endif
- }
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings);
bp->rx_nr_rings = min_t(int, dflt_rings, max_rx_rings);
bp->tx_nr_rings_per_tc = min_t(int, dflt_rings, max_tx_rings);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
index f4cf688..7a9af28 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
@@ -804,10 +804,9 @@ void bnxt_update_vf_mac(struct bnxt *bp)
if (!is_valid_ether_addr(resp->perm_mac_address))
goto update_vf_mac_exit;
- if (ether_addr_equal(resp->perm_mac_address, bp->vf.mac_addr))
- goto update_vf_mac_exit;
-
- memcpy(bp->vf.mac_addr, resp->perm_mac_address, ETH_ALEN);
+ if (!ether_addr_equal(resp->perm_mac_address, bp->vf.mac_addr))
+ memcpy(bp->vf.mac_addr, resp->perm_mac_address, ETH_ALEN);
+ /* overwrite netdev dev_adr with admin VF MAC */
memcpy(bp->dev->dev_addr, bp->vf.mac_addr, ETH_ALEN);
update_vf_mac_exit:
mutex_unlock(&bp->hwrm_cmd_lock);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net 3/3] bnxt_en: Setup uc_list mac filters after resetting the chip.
2015-12-02 3:15 [PATCH net 0/3] bnxt_en: set mac address and uc_list bug fixes Michael Chan
2015-12-02 3:15 ` [PATCH net 1/3] bnxt_en: Fixed incorrect implementation of ndo_set_mac_address Michael Chan
2015-12-02 3:15 ` [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address Michael Chan
@ 2015-12-02 3:15 ` Michael Chan
2 siblings, 0 replies; 5+ messages in thread
From: Michael Chan @ 2015-12-02 3:15 UTC (permalink / raw)
To: davem; +Cc: netdev
Call bnxt_cfg_rx_mode() in bnxt_init_chip() to setup uc_list and
mc_list mac address filters. Before the patch, uc_list is not
setup again after chip reset (such as ethtool ring size change)
and macvlans don't work any more after that.
Modify bnxt_cfg_rx_mode() to return error codes appropriately so
that the init chip sequence can detect any failures.
Signed-off-by: Michael Chan <mchan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 4656480..aecb2b62 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -3884,6 +3884,8 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
#endif
}
+static int bnxt_cfg_rx_mode(struct bnxt *);
+
static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
{
int rc = 0;
@@ -3950,11 +3952,9 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
bp->vnic_info[0].rx_mask |=
CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
- rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);
- if (rc) {
- netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %x\n", rc);
+ rc = bnxt_cfg_rx_mode(bp);
+ if (rc)
goto err_out;
- }
rc = bnxt_hwrm_set_coal(bp);
if (rc)
@@ -4869,7 +4869,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
}
}
-static void bnxt_cfg_rx_mode(struct bnxt *bp)
+static int bnxt_cfg_rx_mode(struct bnxt *bp)
{
struct net_device *dev = bp->dev;
struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
@@ -4918,6 +4918,7 @@ static void bnxt_cfg_rx_mode(struct bnxt *bp)
netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n",
rc);
vnic->uc_filter_count = i;
+ return rc;
}
}
@@ -4926,6 +4927,8 @@ skip_uc:
if (rc)
netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %x\n",
rc);
+
+ return rc;
}
static netdev_features_t bnxt_fix_features(struct net_device *dev,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address
2015-12-02 3:15 ` [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address Michael Chan
@ 2015-12-02 4:40 ` kbuild test robot
0 siblings, 0 replies; 5+ messages in thread
From: kbuild test robot @ 2015-12-02 4:40 UTC (permalink / raw)
To: Michael Chan; +Cc: kbuild-all, davem, netdev, Jeffrey Huang
[-- Attachment #1: Type: text/plain, Size: 1202 bytes --]
Hi Jeffrey,
[auto build test ERROR on net/master]
url: https://github.com/0day-ci/linux/commits/Michael-Chan/bnxt_en-set-mac-address-and-uc_list-bug-fixes/20151202-112939
config: x86_64-randconfig-s2-12021213 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All errors (new ones prefixed by >>):
drivers/net/ethernet/broadcom/bnxt/bnxt.c: In function 'bnxt_change_mac_addr':
>> drivers/net/ethernet/broadcom/bnxt/bnxt.c:5225:43: error: 'struct bnxt' has no member named 'vf'
if (BNXT_VF(bp) && is_valid_ether_addr(bp->vf.mac_addr))
^
vim +5225 drivers/net/ethernet/broadcom/bnxt/bnxt.c
5219 struct bnxt *bp = netdev_priv(dev);
5220 int rc = 0;
5221
5222 if (!is_valid_ether_addr(addr->sa_data))
5223 return -EADDRNOTAVAIL;
5224
> 5225 if (BNXT_VF(bp) && is_valid_ether_addr(bp->vf.mac_addr))
5226 return -EADDRNOTAVAIL;
5227
5228 if (ether_addr_equal(addr->sa_data, dev->dev_addr))
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 26126 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-12-02 4:43 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-02 3:15 [PATCH net 0/3] bnxt_en: set mac address and uc_list bug fixes Michael Chan
2015-12-02 3:15 ` [PATCH net 1/3] bnxt_en: Fixed incorrect implementation of ndo_set_mac_address Michael Chan
2015-12-02 3:15 ` [PATCH net 2/3] bnxt_en: enforce properly storing of MAC address Michael Chan
2015-12-02 4:40 ` kbuild test robot
2015-12-02 3:15 ` [PATCH net 3/3] bnxt_en: Setup uc_list mac filters after resetting the chip Michael Chan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).