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

Merge branch 'bnxt_en-fixes'

Michael Chan says:

====================
bnxt_en: Bug fixes

This series includes 3 fixes related to devlink firmware and chip
versions.  The other 2 patches fix a UDP tunneling issue and an
error recovery issue.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 63f8428b 1b2b9183
...@@ -2202,25 +2202,34 @@ static int bnxt_async_event_process(struct bnxt *bp, ...@@ -2202,25 +2202,34 @@ static int bnxt_async_event_process(struct bnxt *bp,
if (!fw_health) if (!fw_health)
goto async_event_process_exit; goto async_event_process_exit;
fw_health->enabled = EVENT_DATA1_RECOVERY_ENABLED(data1); if (!EVENT_DATA1_RECOVERY_ENABLED(data1)) {
fw_health->master = EVENT_DATA1_RECOVERY_MASTER_FUNC(data1); fw_health->enabled = false;
if (!fw_health->enabled) {
netif_info(bp, drv, bp->dev, netif_info(bp, drv, bp->dev,
"Error recovery info: error recovery[0]\n"); "Error recovery info: error recovery[0]\n");
break; break;
} }
fw_health->master = EVENT_DATA1_RECOVERY_MASTER_FUNC(data1);
fw_health->tmr_multiplier = fw_health->tmr_multiplier =
DIV_ROUND_UP(fw_health->polling_dsecs * HZ, DIV_ROUND_UP(fw_health->polling_dsecs * HZ,
bp->current_interval * 10); bp->current_interval * 10);
fw_health->tmr_counter = fw_health->tmr_multiplier; fw_health->tmr_counter = fw_health->tmr_multiplier;
fw_health->last_fw_heartbeat = if (!fw_health->enabled) {
bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG); fw_health->last_fw_heartbeat =
fw_health->last_fw_reset_cnt = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG); fw_health->last_fw_reset_cnt =
bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
}
netif_info(bp, drv, bp->dev, netif_info(bp, drv, bp->dev,
"Error recovery info: error recovery[1], master[%d], reset count[%u], health status: 0x%x\n", "Error recovery info: error recovery[1], master[%d], reset count[%u], health status: 0x%x\n",
fw_health->master, fw_health->last_fw_reset_cnt, fw_health->master, fw_health->last_fw_reset_cnt,
bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG)); bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG));
if (!fw_health->enabled) {
/* Make sure tmr_counter is set and visible to
* bnxt_health_check() before setting enabled to true.
*/
smp_wmb();
fw_health->enabled = true;
}
goto async_event_process_exit; goto async_event_process_exit;
} }
case ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION: case ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION:
...@@ -4641,6 +4650,13 @@ static int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, u8 tunnel_type) ...@@ -4641,6 +4650,13 @@ static int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, u8 tunnel_type)
struct hwrm_tunnel_dst_port_free_input *req; struct hwrm_tunnel_dst_port_free_input *req;
int rc; int rc;
if (tunnel_type == TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN &&
bp->vxlan_fw_dst_port_id == INVALID_HW_RING_ID)
return 0;
if (tunnel_type == TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE &&
bp->nge_fw_dst_port_id == INVALID_HW_RING_ID)
return 0;
rc = hwrm_req_init(bp, req, HWRM_TUNNEL_DST_PORT_FREE); rc = hwrm_req_init(bp, req, HWRM_TUNNEL_DST_PORT_FREE);
if (rc) if (rc)
return rc; return rc;
...@@ -4650,10 +4666,12 @@ static int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, u8 tunnel_type) ...@@ -4650,10 +4666,12 @@ static int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, u8 tunnel_type)
switch (tunnel_type) { switch (tunnel_type) {
case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN: case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN:
req->tunnel_dst_port_id = cpu_to_le16(bp->vxlan_fw_dst_port_id); req->tunnel_dst_port_id = cpu_to_le16(bp->vxlan_fw_dst_port_id);
bp->vxlan_port = 0;
bp->vxlan_fw_dst_port_id = INVALID_HW_RING_ID; bp->vxlan_fw_dst_port_id = INVALID_HW_RING_ID;
break; break;
case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE: case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE:
req->tunnel_dst_port_id = cpu_to_le16(bp->nge_fw_dst_port_id); req->tunnel_dst_port_id = cpu_to_le16(bp->nge_fw_dst_port_id);
bp->nge_port = 0;
bp->nge_fw_dst_port_id = INVALID_HW_RING_ID; bp->nge_fw_dst_port_id = INVALID_HW_RING_ID;
break; break;
default: default:
...@@ -4691,10 +4709,12 @@ static int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, __be16 port, ...@@ -4691,10 +4709,12 @@ static int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, __be16 port,
switch (tunnel_type) { switch (tunnel_type) {
case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN: case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN:
bp->vxlan_port = port;
bp->vxlan_fw_dst_port_id = bp->vxlan_fw_dst_port_id =
le16_to_cpu(resp->tunnel_dst_port_id); le16_to_cpu(resp->tunnel_dst_port_id);
break; break;
case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE: case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE:
bp->nge_port = port;
bp->nge_fw_dst_port_id = le16_to_cpu(resp->tunnel_dst_port_id); bp->nge_fw_dst_port_id = le16_to_cpu(resp->tunnel_dst_port_id);
break; break;
default: default:
...@@ -8223,12 +8243,10 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp, u8 flags) ...@@ -8223,12 +8243,10 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp, u8 flags)
static void bnxt_hwrm_free_tunnel_ports(struct bnxt *bp) static void bnxt_hwrm_free_tunnel_ports(struct bnxt *bp)
{ {
if (bp->vxlan_fw_dst_port_id != INVALID_HW_RING_ID) bnxt_hwrm_tunnel_dst_port_free(bp,
bnxt_hwrm_tunnel_dst_port_free( TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN);
bp, TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN); bnxt_hwrm_tunnel_dst_port_free(bp,
if (bp->nge_fw_dst_port_id != INVALID_HW_RING_ID) TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE);
bnxt_hwrm_tunnel_dst_port_free(
bp, TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE);
} }
static int bnxt_set_tpa(struct bnxt *bp, bool set_tpa) static int bnxt_set_tpa(struct bnxt *bp, bool set_tpa)
...@@ -11249,6 +11267,8 @@ static void bnxt_fw_health_check(struct bnxt *bp) ...@@ -11249,6 +11267,8 @@ static void bnxt_fw_health_check(struct bnxt *bp)
if (!fw_health->enabled || test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) if (!fw_health->enabled || test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
return; return;
/* Make sure it is enabled before checking the tmr_counter. */
smp_rmb();
if (fw_health->tmr_counter) { if (fw_health->tmr_counter) {
fw_health->tmr_counter--; fw_health->tmr_counter--;
return; return;
...@@ -12627,13 +12647,10 @@ static int bnxt_udp_tunnel_sync(struct net_device *netdev, unsigned int table) ...@@ -12627,13 +12647,10 @@ static int bnxt_udp_tunnel_sync(struct net_device *netdev, unsigned int table)
unsigned int cmd; unsigned int cmd;
udp_tunnel_nic_get_port(netdev, table, 0, &ti); udp_tunnel_nic_get_port(netdev, table, 0, &ti);
if (ti.type == UDP_TUNNEL_TYPE_VXLAN) { if (ti.type == UDP_TUNNEL_TYPE_VXLAN)
bp->vxlan_port = ti.port;
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN; cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
} else { else
bp->nge_port = ti.port;
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE; cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
}
if (ti.port) if (ti.port)
return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti.port, cmd); return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti.port, cmd);
......
...@@ -352,13 +352,16 @@ static void bnxt_copy_from_nvm_data(union devlink_param_value *dst, ...@@ -352,13 +352,16 @@ static void bnxt_copy_from_nvm_data(union devlink_param_value *dst,
dst->vu8 = (u8)val32; dst->vu8 = (u8)val32;
} }
static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp, static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp, u32 *nvm_cfg_ver)
union devlink_param_value *nvm_cfg_ver)
{ {
struct hwrm_nvm_get_variable_input *req; struct hwrm_nvm_get_variable_input *req;
u16 bytes = BNXT_NVM_CFG_VER_BYTES;
u16 bits = BNXT_NVM_CFG_VER_BITS;
union devlink_param_value ver;
union bnxt_nvm_data *data; union bnxt_nvm_data *data;
dma_addr_t data_dma_addr; dma_addr_t data_dma_addr;
int rc; int rc, i = 2;
u16 dim = 1;
rc = hwrm_req_init(bp, req, HWRM_NVM_GET_VARIABLE); rc = hwrm_req_init(bp, req, HWRM_NVM_GET_VARIABLE);
if (rc) if (rc)
...@@ -370,16 +373,34 @@ static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp, ...@@ -370,16 +373,34 @@ static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp,
goto exit; goto exit;
} }
/* earlier devices present as an array of raw bytes */
if (!BNXT_CHIP_P5(bp)) {
dim = 0;
i = 0;
bits *= 3; /* array of 3 version components */
bytes *= 4; /* copy whole word */
}
hwrm_req_hold(bp, req); hwrm_req_hold(bp, req);
req->dest_data_addr = cpu_to_le64(data_dma_addr); req->dest_data_addr = cpu_to_le64(data_dma_addr);
req->data_len = cpu_to_le16(BNXT_NVM_CFG_VER_BITS); req->data_len = cpu_to_le16(bits);
req->option_num = cpu_to_le16(NVM_OFF_NVM_CFG_VER); req->option_num = cpu_to_le16(NVM_OFF_NVM_CFG_VER);
req->dimensions = cpu_to_le16(dim);
rc = hwrm_req_send_silent(bp, req); while (i >= 0) {
if (!rc) req->index_0 = cpu_to_le16(i--);
bnxt_copy_from_nvm_data(nvm_cfg_ver, data, rc = hwrm_req_send_silent(bp, req);
BNXT_NVM_CFG_VER_BITS, if (rc)
BNXT_NVM_CFG_VER_BYTES); goto exit;
bnxt_copy_from_nvm_data(&ver, data, bits, bytes);
if (BNXT_CHIP_P5(bp)) {
*nvm_cfg_ver <<= 8;
*nvm_cfg_ver |= ver.vu8;
} else {
*nvm_cfg_ver = ver.vu32;
}
}
exit: exit:
hwrm_req_drop(bp, req); hwrm_req_drop(bp, req);
...@@ -416,12 +437,12 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -416,12 +437,12 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
{ {
struct hwrm_nvm_get_dev_info_output nvm_dev_info; struct hwrm_nvm_get_dev_info_output nvm_dev_info;
struct bnxt *bp = bnxt_get_bp_from_dl(dl); struct bnxt *bp = bnxt_get_bp_from_dl(dl);
union devlink_param_value nvm_cfg_ver;
struct hwrm_ver_get_output *ver_resp; struct hwrm_ver_get_output *ver_resp;
char mgmt_ver[FW_VER_STR_LEN]; char mgmt_ver[FW_VER_STR_LEN];
char roce_ver[FW_VER_STR_LEN]; char roce_ver[FW_VER_STR_LEN];
char ncsi_ver[FW_VER_STR_LEN]; char ncsi_ver[FW_VER_STR_LEN];
char buf[32]; char buf[32];
u32 ver = 0;
int rc; int rc;
rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME); rc = devlink_info_driver_name_put(req, DRV_MODULE_NAME);
...@@ -456,7 +477,7 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -456,7 +477,7 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
return rc; return rc;
ver_resp = &bp->ver_resp; ver_resp = &bp->ver_resp;
sprintf(buf, "%X", ver_resp->chip_rev); sprintf(buf, "%c%d", 'A' + ver_resp->chip_rev, ver_resp->chip_metal);
rc = bnxt_dl_info_put(bp, req, BNXT_VERSION_FIXED, rc = bnxt_dl_info_put(bp, req, BNXT_VERSION_FIXED,
DEVLINK_INFO_VERSION_GENERIC_ASIC_REV, buf); DEVLINK_INFO_VERSION_GENERIC_ASIC_REV, buf);
if (rc) if (rc)
...@@ -475,11 +496,9 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -475,11 +496,9 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
if (rc) if (rc)
return rc; return rc;
if (BNXT_PF(bp) && !bnxt_hwrm_get_nvm_cfg_ver(bp, &nvm_cfg_ver)) { if (BNXT_PF(bp) && !bnxt_hwrm_get_nvm_cfg_ver(bp, &ver)) {
u32 ver = nvm_cfg_ver.vu32; sprintf(buf, "%d.%d.%d", (ver >> 16) & 0xff, (ver >> 8) & 0xff,
ver & 0xff);
sprintf(buf, "%d.%d.%d", (ver >> 16) & 0xf, (ver >> 8) & 0xf,
ver & 0xf);
rc = bnxt_dl_info_put(bp, req, BNXT_VERSION_STORED, rc = bnxt_dl_info_put(bp, req, BNXT_VERSION_STORED,
DEVLINK_INFO_VERSION_GENERIC_FW_PSID, DEVLINK_INFO_VERSION_GENERIC_FW_PSID,
buf); buf);
......
...@@ -40,8 +40,8 @@ static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl) ...@@ -40,8 +40,8 @@ static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl)
#define NVM_OFF_ENABLE_SRIOV 401 #define NVM_OFF_ENABLE_SRIOV 401
#define NVM_OFF_NVM_CFG_VER 602 #define NVM_OFF_NVM_CFG_VER 602
#define BNXT_NVM_CFG_VER_BITS 24 #define BNXT_NVM_CFG_VER_BITS 8
#define BNXT_NVM_CFG_VER_BYTES 4 #define BNXT_NVM_CFG_VER_BYTES 1
#define BNXT_MSIX_VEC_MAX 512 #define BNXT_MSIX_VEC_MAX 512
#define BNXT_MSIX_VEC_MIN_MAX 128 #define BNXT_MSIX_VEC_MIN_MAX 128
......
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