Skip to content

Commit 682fa9f

Browse files
author
Jakub Kicinski
committed
Merge branch 'bnxt_en-bug-fixes'
Michael Chan says: ==================== Devlink and error recovery bug fix patches. Most of the work is by Vasundhara Volam. ==================== Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 34c1520 + f682430 commit 682fa9f

File tree

3 files changed

+73
-52
lines changed

3 files changed

+73
-52
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10382,7 +10382,8 @@ static void bnxt_cleanup_pci(struct bnxt *bp)
1038210382
{
1038310383
bnxt_unmap_bars(bp, bp->pdev);
1038410384
pci_release_regions(bp->pdev);
10385-
pci_disable_device(bp->pdev);
10385+
if (pci_is_enabled(bp->pdev))
10386+
pci_disable_device(bp->pdev);
1038610387
}
1038710388

1038810389
static void bnxt_init_dflt_coal(struct bnxt *bp)
@@ -10669,14 +10670,11 @@ static void bnxt_fw_reset_task(struct work_struct *work)
1066910670
bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW;
1067010671
}
1067110672
/* fall through */
10672-
case BNXT_FW_RESET_STATE_RESET_FW: {
10673-
u32 wait_dsecs = bp->fw_health->post_reset_wait_dsecs;
10674-
10673+
case BNXT_FW_RESET_STATE_RESET_FW:
1067510674
bnxt_reset_all(bp);
1067610675
bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
10677-
bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10);
10676+
bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10);
1067810677
return;
10679-
}
1068010678
case BNXT_FW_RESET_STATE_ENABLE_DEV:
1068110679
if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) &&
1068210680
bp->fw_health) {

drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,20 @@ static int bnxt_fw_reporter_diagnose(struct devlink_health_reporter *reporter,
2929
val = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG);
3030
health_status = val & 0xffff;
3131

32-
if (health_status == BNXT_FW_STATUS_HEALTHY) {
33-
rc = devlink_fmsg_string_pair_put(fmsg, "FW status",
34-
"Healthy;");
35-
if (rc)
36-
return rc;
37-
} else if (health_status < BNXT_FW_STATUS_HEALTHY) {
38-
rc = devlink_fmsg_string_pair_put(fmsg, "FW status",
39-
"Not yet completed initialization;");
32+
if (health_status < BNXT_FW_STATUS_HEALTHY) {
33+
rc = devlink_fmsg_string_pair_put(fmsg, "Description",
34+
"Not yet completed initialization");
4035
if (rc)
4136
return rc;
4237
} else if (health_status > BNXT_FW_STATUS_HEALTHY) {
43-
rc = devlink_fmsg_string_pair_put(fmsg, "FW status",
44-
"Encountered fatal error and cannot recover;");
38+
rc = devlink_fmsg_string_pair_put(fmsg, "Description",
39+
"Encountered fatal error and cannot recover");
4540
if (rc)
4641
return rc;
4742
}
4843

4944
if (val >> 16) {
50-
rc = devlink_fmsg_u32_pair_put(fmsg, "Error", val >> 16);
45+
rc = devlink_fmsg_u32_pair_put(fmsg, "Error code", val >> 16);
5146
if (rc)
5247
return rc;
5348
}
@@ -215,25 +210,68 @@ enum bnxt_dl_param_id {
215210

216211
static const struct bnxt_dl_nvm_param nvm_params[] = {
217212
{DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV, NVM_OFF_ENABLE_SRIOV,
218-
BNXT_NVM_SHARED_CFG, 1},
213+
BNXT_NVM_SHARED_CFG, 1, 1},
219214
{DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI, NVM_OFF_IGNORE_ARI,
220-
BNXT_NVM_SHARED_CFG, 1},
215+
BNXT_NVM_SHARED_CFG, 1, 1},
221216
{DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
222-
NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10},
217+
NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10, 4},
223218
{DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
224-
NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7},
219+
NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7, 4},
225220
{BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK, NVM_OFF_DIS_GRE_VER_CHECK,
226-
BNXT_NVM_SHARED_CFG, 1},
221+
BNXT_NVM_SHARED_CFG, 1, 1},
227222
};
228223

224+
union bnxt_nvm_data {
225+
u8 val8;
226+
__le32 val32;
227+
};
228+
229+
static void bnxt_copy_to_nvm_data(union bnxt_nvm_data *dst,
230+
union devlink_param_value *src,
231+
int nvm_num_bits, int dl_num_bytes)
232+
{
233+
u32 val32 = 0;
234+
235+
if (nvm_num_bits == 1) {
236+
dst->val8 = src->vbool;
237+
return;
238+
}
239+
if (dl_num_bytes == 4)
240+
val32 = src->vu32;
241+
else if (dl_num_bytes == 2)
242+
val32 = (u32)src->vu16;
243+
else if (dl_num_bytes == 1)
244+
val32 = (u32)src->vu8;
245+
dst->val32 = cpu_to_le32(val32);
246+
}
247+
248+
static void bnxt_copy_from_nvm_data(union devlink_param_value *dst,
249+
union bnxt_nvm_data *src,
250+
int nvm_num_bits, int dl_num_bytes)
251+
{
252+
u32 val32;
253+
254+
if (nvm_num_bits == 1) {
255+
dst->vbool = src->val8;
256+
return;
257+
}
258+
val32 = le32_to_cpu(src->val32);
259+
if (dl_num_bytes == 4)
260+
dst->vu32 = val32;
261+
else if (dl_num_bytes == 2)
262+
dst->vu16 = (u16)val32;
263+
else if (dl_num_bytes == 1)
264+
dst->vu8 = (u8)val32;
265+
}
266+
229267
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
230268
int msg_len, union devlink_param_value *val)
231269
{
232270
struct hwrm_nvm_get_variable_input *req = msg;
233-
void *data_addr = NULL, *buf = NULL;
234271
struct bnxt_dl_nvm_param nvm_param;
235-
int bytesize, idx = 0, rc, i;
272+
union bnxt_nvm_data *data;
236273
dma_addr_t data_dma_addr;
274+
int idx = 0, rc, i;
237275

238276
/* Get/Set NVM CFG parameter is supported only on PFs */
239277
if (BNXT_VF(bp))
@@ -254,47 +292,31 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
254292
else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG)
255293
idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID;
256294

257-
bytesize = roundup(nvm_param.num_bits, BITS_PER_BYTE) / BITS_PER_BYTE;
258-
switch (bytesize) {
259-
case 1:
260-
if (nvm_param.num_bits == 1)
261-
buf = &val->vbool;
262-
else
263-
buf = &val->vu8;
264-
break;
265-
case 2:
266-
buf = &val->vu16;
267-
break;
268-
case 4:
269-
buf = &val->vu32;
270-
break;
271-
default:
272-
return -EFAULT;
273-
}
274-
275-
data_addr = dma_alloc_coherent(&bp->pdev->dev, bytesize,
276-
&data_dma_addr, GFP_KERNEL);
277-
if (!data_addr)
295+
data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data),
296+
&data_dma_addr, GFP_KERNEL);
297+
if (!data)
278298
return -ENOMEM;
279299

280300
req->dest_data_addr = cpu_to_le64(data_dma_addr);
281-
req->data_len = cpu_to_le16(nvm_param.num_bits);
301+
req->data_len = cpu_to_le16(nvm_param.nvm_num_bits);
282302
req->option_num = cpu_to_le16(nvm_param.offset);
283303
req->index_0 = cpu_to_le16(idx);
284304
if (idx)
285305
req->dimensions = cpu_to_le16(1);
286306

287307
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
288-
memcpy(data_addr, buf, bytesize);
308+
bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits,
309+
nvm_param.dl_num_bytes);
289310
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
290311
} else {
291312
rc = hwrm_send_message_silent(bp, msg, msg_len,
292313
HWRM_CMD_TIMEOUT);
314+
if (!rc)
315+
bnxt_copy_from_nvm_data(val, data,
316+
nvm_param.nvm_num_bits,
317+
nvm_param.dl_num_bytes);
293318
}
294-
if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE))
295-
memcpy(buf, data_addr, bytesize);
296-
297-
dma_free_coherent(&bp->pdev->dev, bytesize, data_addr, data_dma_addr);
319+
dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr);
298320
if (rc == -EACCES)
299321
netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n");
300322
return rc;

drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ struct bnxt_dl_nvm_param {
5252
u16 id;
5353
u16 offset;
5454
u16 dir_type;
55-
u16 num_bits;
55+
u16 nvm_num_bits;
56+
u8 dl_num_bytes;
5657
};
5758

5859
void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event);

0 commit comments

Comments
 (0)