Commit 8d42eada authored by David S. Miller's avatar David S. Miller

Merge branch 'bnxt_en-Fixes-for-net-next'

Michael Chan says:

====================
bnxt_en: Fixes for net-next.

This series includes a bug fix for a regression in firmware message polling
introduced recently on net-next.  There are 3 additional minor fixes for
unsupported link speed checking, VF MAC address handling, and setting
PHY eeprom length.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 724e47a1 707e7e96
...@@ -3530,6 +3530,8 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, ...@@ -3530,6 +3530,8 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
HWRM_RESP_LEN_SFT; HWRM_RESP_LEN_SFT;
valid = bp->hwrm_cmd_resp_addr + len - 1; valid = bp->hwrm_cmd_resp_addr + len - 1;
} else { } else {
int j;
/* Check if response len is updated */ /* Check if response len is updated */
for (i = 0; i < tmo_count; i++) { for (i = 0; i < tmo_count; i++) {
len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >> len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >>
...@@ -3547,14 +3549,15 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, ...@@ -3547,14 +3549,15 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
if (i >= tmo_count) { if (i >= tmo_count) {
netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n", netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n",
timeout, le16_to_cpu(req->req_type), HWRM_TOTAL_TIMEOUT(i),
le16_to_cpu(req->req_type),
le16_to_cpu(req->seq_id), len); le16_to_cpu(req->seq_id), len);
return -1; return -1;
} }
/* Last byte of resp contains valid bit */ /* Last byte of resp contains valid bit */
valid = bp->hwrm_cmd_resp_addr + len - 1; valid = bp->hwrm_cmd_resp_addr + len - 1;
for (i = 0; i < 5; i++) { for (j = 0; j < HWRM_VALID_BIT_DELAY_USEC; j++) {
/* make sure we read from updated DMA memory */ /* make sure we read from updated DMA memory */
dma_rmb(); dma_rmb();
if (*valid) if (*valid)
...@@ -3562,9 +3565,10 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, ...@@ -3562,9 +3565,10 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
udelay(1); udelay(1);
} }
if (i >= 5) { if (j >= HWRM_VALID_BIT_DELAY_USEC) {
netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n", netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n",
timeout, le16_to_cpu(req->req_type), HWRM_TOTAL_TIMEOUT(i),
le16_to_cpu(req->req_type),
le16_to_cpu(req->seq_id), len, *valid); le16_to_cpu(req->seq_id), len, *valid);
return -1; return -1;
} }
...@@ -6458,6 +6462,9 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state) ...@@ -6458,6 +6462,9 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
} }
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
if (!BNXT_SINGLE_PF(bp))
return 0;
diff = link_info->support_auto_speeds ^ link_info->advertising; diff = link_info->support_auto_speeds ^ link_info->advertising;
if ((link_info->support_auto_speeds | diff) != if ((link_info->support_auto_speeds | diff) !=
link_info->support_auto_speeds) { link_info->support_auto_speeds) {
...@@ -8671,8 +8678,8 @@ static int bnxt_init_mac_addr(struct bnxt *bp) ...@@ -8671,8 +8678,8 @@ static int bnxt_init_mac_addr(struct bnxt *bp)
memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN); memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN);
} else { } else {
eth_hw_addr_random(bp->dev); eth_hw_addr_random(bp->dev);
rc = bnxt_approve_mac(bp, bp->dev->dev_addr);
} }
rc = bnxt_approve_mac(bp, bp->dev->dev_addr);
#endif #endif
} }
return rc; return rc;
......
...@@ -539,6 +539,13 @@ struct rx_tpa_end_cmp_ext { ...@@ -539,6 +539,13 @@ struct rx_tpa_end_cmp_ext {
#define HWRM_MIN_TIMEOUT 25 #define HWRM_MIN_TIMEOUT 25
#define HWRM_MAX_TIMEOUT 40 #define HWRM_MAX_TIMEOUT 40
#define HWRM_TOTAL_TIMEOUT(n) (((n) <= HWRM_SHORT_TIMEOUT_COUNTER) ? \
((n) * HWRM_SHORT_MIN_TIMEOUT) : \
(HWRM_SHORT_TIMEOUT_COUNTER * HWRM_SHORT_MIN_TIMEOUT + \
((n) - HWRM_SHORT_TIMEOUT_COUNTER) * HWRM_MIN_TIMEOUT))
#define HWRM_VALID_BIT_DELAY_USEC 20
#define BNXT_RX_EVENT 1 #define BNXT_RX_EVENT 1
#define BNXT_AGG_EVENT 2 #define BNXT_AGG_EVENT 2
#define BNXT_TX_EVENT 4 #define BNXT_TX_EVENT 4
...@@ -1407,8 +1414,7 @@ struct bnxt { ...@@ -1407,8 +1414,7 @@ struct bnxt {
#define I2C_DEV_ADDR_A0 0xa0 #define I2C_DEV_ADDR_A0 0xa0
#define I2C_DEV_ADDR_A2 0xa2 #define I2C_DEV_ADDR_A2 0xa2
#define SFP_EEPROM_SFF_8472_COMP_ADDR 0x5e #define SFF_DIAG_SUPPORT_OFFSET 0x5c
#define SFP_EEPROM_SFF_8472_COMP_SIZE 1
#define SFF_MODULE_ID_SFP 0x3 #define SFF_MODULE_ID_SFP 0x3
#define SFF_MODULE_ID_QSFP 0xc #define SFF_MODULE_ID_QSFP 0xc
#define SFF_MODULE_ID_QSFP_PLUS 0xd #define SFF_MODULE_ID_QSFP_PLUS 0xd
......
...@@ -2184,9 +2184,8 @@ static int bnxt_read_sfp_module_eeprom_info(struct bnxt *bp, u16 i2c_addr, ...@@ -2184,9 +2184,8 @@ static int bnxt_read_sfp_module_eeprom_info(struct bnxt *bp, u16 i2c_addr,
static int bnxt_get_module_info(struct net_device *dev, static int bnxt_get_module_info(struct net_device *dev,
struct ethtool_modinfo *modinfo) struct ethtool_modinfo *modinfo)
{ {
u8 data[SFF_DIAG_SUPPORT_OFFSET + 1];
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
struct hwrm_port_phy_i2c_read_input req = {0};
struct hwrm_port_phy_i2c_read_output *output = bp->hwrm_cmd_resp_addr;
int rc; int rc;
/* No point in going further if phy status indicates /* No point in going further if phy status indicates
...@@ -2201,21 +2200,19 @@ static int bnxt_get_module_info(struct net_device *dev, ...@@ -2201,21 +2200,19 @@ static int bnxt_get_module_info(struct net_device *dev,
if (bp->hwrm_spec_code < 0x10202) if (bp->hwrm_spec_code < 0x10202)
return -EOPNOTSUPP; return -EOPNOTSUPP;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_I2C_READ, -1, -1); rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A0, 0, 0,
req.i2c_slave_addr = I2C_DEV_ADDR_A0; SFF_DIAG_SUPPORT_OFFSET + 1,
req.page_number = 0; data);
req.page_offset = cpu_to_le16(SFP_EEPROM_SFF_8472_COMP_ADDR);
req.data_length = SFP_EEPROM_SFF_8472_COMP_SIZE;
req.port_id = cpu_to_le16(bp->pf.port_id);
mutex_lock(&bp->hwrm_cmd_lock);
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
if (!rc) { if (!rc) {
u32 module_id = le32_to_cpu(output->data[0]); u8 module_id = data[0];
u8 diag_supported = data[SFF_DIAG_SUPPORT_OFFSET];
switch (module_id) { switch (module_id) {
case SFF_MODULE_ID_SFP: case SFF_MODULE_ID_SFP:
modinfo->type = ETH_MODULE_SFF_8472; modinfo->type = ETH_MODULE_SFF_8472;
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
if (!diag_supported)
modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
break; break;
case SFF_MODULE_ID_QSFP: case SFF_MODULE_ID_QSFP:
case SFF_MODULE_ID_QSFP_PLUS: case SFF_MODULE_ID_QSFP_PLUS:
...@@ -2231,7 +2228,6 @@ static int bnxt_get_module_info(struct net_device *dev, ...@@ -2231,7 +2228,6 @@ static int bnxt_get_module_info(struct net_device *dev,
break; break;
} }
} }
mutex_unlock(&bp->hwrm_cmd_lock);
return rc; return rc;
} }
......
...@@ -923,7 +923,8 @@ static int bnxt_vf_configure_mac(struct bnxt *bp, struct bnxt_vf_info *vf) ...@@ -923,7 +923,8 @@ static int bnxt_vf_configure_mac(struct bnxt *bp, struct bnxt_vf_info *vf)
if (req->enables & cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)) { if (req->enables & cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)) {
if (is_valid_ether_addr(req->dflt_mac_addr) && if (is_valid_ether_addr(req->dflt_mac_addr) &&
((vf->flags & BNXT_VF_TRUST) || ((vf->flags & BNXT_VF_TRUST) ||
(!is_valid_ether_addr(vf->mac_addr)))) { !is_valid_ether_addr(vf->mac_addr) ||
ether_addr_equal(req->dflt_mac_addr, vf->mac_addr))) {
ether_addr_copy(vf->vf_mac_addr, req->dflt_mac_addr); ether_addr_copy(vf->vf_mac_addr, req->dflt_mac_addr);
return bnxt_hwrm_exec_fwd_resp(bp, vf, msg_size); return bnxt_hwrm_exec_fwd_resp(bp, vf, msg_size);
} }
......
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