Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: David S. Miller <davem@davemloft.net>

+30 -20
+12 -5
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 3530 3530 HWRM_RESP_LEN_SFT; 3531 3531 valid = bp->hwrm_cmd_resp_addr + len - 1; 3532 3532 } else { 3533 + int j; 3534 + 3533 3535 /* Check if response len is updated */ 3534 3536 for (i = 0; i < tmo_count; i++) { 3535 3537 len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >> ··· 3549 3547 3550 3548 if (i >= tmo_count) { 3551 3549 netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n", 3552 - timeout, le16_to_cpu(req->req_type), 3550 + HWRM_TOTAL_TIMEOUT(i), 3551 + le16_to_cpu(req->req_type), 3553 3552 le16_to_cpu(req->seq_id), len); 3554 3553 return -1; 3555 3554 } 3556 3555 3557 3556 /* Last byte of resp contains valid bit */ 3558 3557 valid = bp->hwrm_cmd_resp_addr + len - 1; 3559 - for (i = 0; i < 5; i++) { 3558 + for (j = 0; j < HWRM_VALID_BIT_DELAY_USEC; j++) { 3560 3559 /* make sure we read from updated DMA memory */ 3561 3560 dma_rmb(); 3562 3561 if (*valid) ··· 3565 3562 udelay(1); 3566 3563 } 3567 3564 3568 - if (i >= 5) { 3565 + if (j >= HWRM_VALID_BIT_DELAY_USEC) { 3569 3566 netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n", 3570 - timeout, le16_to_cpu(req->req_type), 3567 + HWRM_TOTAL_TIMEOUT(i), 3568 + le16_to_cpu(req->req_type), 3571 3569 le16_to_cpu(req->seq_id), len, *valid); 3572 3570 return -1; 3573 3571 } ··· 6462 6458 } 6463 6459 mutex_unlock(&bp->hwrm_cmd_lock); 6464 6460 6461 + if (!BNXT_SINGLE_PF(bp)) 6462 + return 0; 6463 + 6465 6464 diff = link_info->support_auto_speeds ^ link_info->advertising; 6466 6465 if ((link_info->support_auto_speeds | diff) != 6467 6466 link_info->support_auto_speeds) { ··· 8678 8671 memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN); 8679 8672 } else { 8680 8673 eth_hw_addr_random(bp->dev); 8681 - rc = bnxt_approve_mac(bp, bp->dev->dev_addr); 8682 8674 } 8675 + rc = bnxt_approve_mac(bp, bp->dev->dev_addr); 8683 8676 #endif 8684 8677 } 8685 8678 return rc;
+8 -2
drivers/net/ethernet/broadcom/bnxt/bnxt.h
··· 539 539 #define HWRM_MIN_TIMEOUT 25 540 540 #define HWRM_MAX_TIMEOUT 40 541 541 542 + #define HWRM_TOTAL_TIMEOUT(n) (((n) <= HWRM_SHORT_TIMEOUT_COUNTER) ? \ 543 + ((n) * HWRM_SHORT_MIN_TIMEOUT) : \ 544 + (HWRM_SHORT_TIMEOUT_COUNTER * HWRM_SHORT_MIN_TIMEOUT + \ 545 + ((n) - HWRM_SHORT_TIMEOUT_COUNTER) * HWRM_MIN_TIMEOUT)) 546 + 547 + #define HWRM_VALID_BIT_DELAY_USEC 20 548 + 542 549 #define BNXT_RX_EVENT 1 543 550 #define BNXT_AGG_EVENT 2 544 551 #define BNXT_TX_EVENT 4 ··· 1414 1407 1415 1408 #define I2C_DEV_ADDR_A0 0xa0 1416 1409 #define I2C_DEV_ADDR_A2 0xa2 1417 - #define SFP_EEPROM_SFF_8472_COMP_ADDR 0x5e 1418 - #define SFP_EEPROM_SFF_8472_COMP_SIZE 1 1410 + #define SFF_DIAG_SUPPORT_OFFSET 0x5c 1419 1411 #define SFF_MODULE_ID_SFP 0x3 1420 1412 #define SFF_MODULE_ID_QSFP 0xc 1421 1413 #define SFF_MODULE_ID_QSFP_PLUS 0xd
+8 -12
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
··· 2184 2184 static int bnxt_get_module_info(struct net_device *dev, 2185 2185 struct ethtool_modinfo *modinfo) 2186 2186 { 2187 + u8 data[SFF_DIAG_SUPPORT_OFFSET + 1]; 2187 2188 struct bnxt *bp = netdev_priv(dev); 2188 - struct hwrm_port_phy_i2c_read_input req = {0}; 2189 - struct hwrm_port_phy_i2c_read_output *output = bp->hwrm_cmd_resp_addr; 2190 2189 int rc; 2191 2190 2192 2191 /* No point in going further if phy status indicates ··· 2200 2201 if (bp->hwrm_spec_code < 0x10202) 2201 2202 return -EOPNOTSUPP; 2202 2203 2203 - bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_I2C_READ, -1, -1); 2204 - req.i2c_slave_addr = I2C_DEV_ADDR_A0; 2205 - req.page_number = 0; 2206 - req.page_offset = cpu_to_le16(SFP_EEPROM_SFF_8472_COMP_ADDR); 2207 - req.data_length = SFP_EEPROM_SFF_8472_COMP_SIZE; 2208 - req.port_id = cpu_to_le16(bp->pf.port_id); 2209 - mutex_lock(&bp->hwrm_cmd_lock); 2210 - rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); 2204 + rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A0, 0, 0, 2205 + SFF_DIAG_SUPPORT_OFFSET + 1, 2206 + data); 2211 2207 if (!rc) { 2212 - u32 module_id = le32_to_cpu(output->data[0]); 2208 + u8 module_id = data[0]; 2209 + u8 diag_supported = data[SFF_DIAG_SUPPORT_OFFSET]; 2213 2210 2214 2211 switch (module_id) { 2215 2212 case SFF_MODULE_ID_SFP: 2216 2213 modinfo->type = ETH_MODULE_SFF_8472; 2217 2214 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; 2215 + if (!diag_supported) 2216 + modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN; 2218 2217 break; 2219 2218 case SFF_MODULE_ID_QSFP: 2220 2219 case SFF_MODULE_ID_QSFP_PLUS: ··· 2228 2231 break; 2229 2232 } 2230 2233 } 2231 - mutex_unlock(&bp->hwrm_cmd_lock); 2232 2234 return rc; 2233 2235 } 2234 2236
+2 -1
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
··· 923 923 if (req->enables & cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)) { 924 924 if (is_valid_ether_addr(req->dflt_mac_addr) && 925 925 ((vf->flags & BNXT_VF_TRUST) || 926 - (!is_valid_ether_addr(vf->mac_addr)))) { 926 + !is_valid_ether_addr(vf->mac_addr) || 927 + ether_addr_equal(req->dflt_mac_addr, vf->mac_addr))) { 927 928 ether_addr_copy(vf->vf_mac_addr, req->dflt_mac_addr); 928 929 return bnxt_hwrm_exec_fwd_resp(bp, vf, msg_size); 929 930 }