Commit e624c70e authored by Leon Romanovsky's avatar Leon Romanovsky Committed by David S. Miller

bnxt_en: Check devlink allocation and registration status

devlink is a software interface that doesn't depend on any hardware
capabilities. The failure in SW means memory issues, wrong parameters,
programmer error e.t.c.

Like any other such interface in the kernel, the returned status of
devlink APIs should be checked and propagated further and not ignored.

Fixes: 4ab0c6a8 ("bnxt_en: add support to enable VF-representors")
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Reviewed-by: default avatarEdwin Peer <edwin.peer@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8551c9b
...@@ -13370,7 +13370,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -13370,7 +13370,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
bnxt_inv_fw_health_reg(bp); bnxt_inv_fw_health_reg(bp);
bnxt_dl_register(bp); rc = bnxt_dl_register(bp);
if (rc)
goto init_err_dl;
rc = register_netdev(dev); rc = register_netdev(dev);
if (rc) if (rc)
...@@ -13390,6 +13392,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -13390,6 +13392,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
init_err_cleanup: init_err_cleanup:
bnxt_dl_unregister(bp); bnxt_dl_unregister(bp);
init_err_dl:
bnxt_shutdown_tc(bp); bnxt_shutdown_tc(bp);
bnxt_clear_int_mode(bp); bnxt_clear_int_mode(bp);
......
...@@ -134,7 +134,7 @@ void bnxt_dl_fw_reporters_create(struct bnxt *bp) ...@@ -134,7 +134,7 @@ void bnxt_dl_fw_reporters_create(struct bnxt *bp)
{ {
struct bnxt_fw_health *health = bp->fw_health; struct bnxt_fw_health *health = bp->fw_health;
if (!bp->dl || !health) if (!health)
return; return;
if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) || health->fw_reset_reporter) if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) || health->fw_reset_reporter)
...@@ -188,7 +188,7 @@ void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all) ...@@ -188,7 +188,7 @@ void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
{ {
struct bnxt_fw_health *health = bp->fw_health; struct bnxt_fw_health *health = bp->fw_health;
if (!bp->dl || !health) if (!health)
return; return;
if ((all || !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) && if ((all || !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) &&
...@@ -781,6 +781,7 @@ int bnxt_dl_register(struct bnxt *bp) ...@@ -781,6 +781,7 @@ int bnxt_dl_register(struct bnxt *bp)
{ {
const struct devlink_ops *devlink_ops; const struct devlink_ops *devlink_ops;
struct devlink_port_attrs attrs = {}; struct devlink_port_attrs attrs = {};
struct bnxt_dl *bp_dl;
struct devlink *dl; struct devlink *dl;
int rc; int rc;
...@@ -795,7 +796,9 @@ int bnxt_dl_register(struct bnxt *bp) ...@@ -795,7 +796,9 @@ int bnxt_dl_register(struct bnxt *bp)
return -ENOMEM; return -ENOMEM;
} }
bnxt_link_bp_to_dl(bp, dl); bp->dl = dl;
bp_dl = devlink_priv(dl);
bp_dl->bp = bp;
/* Add switchdev eswitch mode setting, if SRIOV supported */ /* Add switchdev eswitch mode setting, if SRIOV supported */
if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV) && if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV) &&
...@@ -826,7 +829,6 @@ int bnxt_dl_register(struct bnxt *bp) ...@@ -826,7 +829,6 @@ int bnxt_dl_register(struct bnxt *bp)
err_dl_port_unreg: err_dl_port_unreg:
devlink_port_unregister(&bp->dl_port); devlink_port_unregister(&bp->dl_port);
err_dl_free: err_dl_free:
bnxt_link_bp_to_dl(bp, NULL);
devlink_free(dl); devlink_free(dl);
return rc; return rc;
} }
...@@ -835,9 +837,6 @@ void bnxt_dl_unregister(struct bnxt *bp) ...@@ -835,9 +837,6 @@ void bnxt_dl_unregister(struct bnxt *bp)
{ {
struct devlink *dl = bp->dl; struct devlink *dl = bp->dl;
if (!dl)
return;
if (BNXT_PF(bp)) { if (BNXT_PF(bp)) {
bnxt_dl_params_unregister(bp); bnxt_dl_params_unregister(bp);
devlink_port_unregister(&bp->dl_port); devlink_port_unregister(&bp->dl_port);
......
...@@ -20,19 +20,6 @@ static inline struct bnxt *bnxt_get_bp_from_dl(struct devlink *dl) ...@@ -20,19 +20,6 @@ static inline struct bnxt *bnxt_get_bp_from_dl(struct devlink *dl)
return ((struct bnxt_dl *)devlink_priv(dl))->bp; return ((struct bnxt_dl *)devlink_priv(dl))->bp;
} }
/* To clear devlink pointer from bp, pass NULL dl */
static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl)
{
bp->dl = dl;
/* add a back pointer in dl to bp */
if (dl) {
struct bnxt_dl *bp_dl = devlink_priv(dl);
bp_dl->bp = bp;
}
}
#define NVM_OFF_MSIX_VEC_PER_PF_MAX 108 #define NVM_OFF_MSIX_VEC_PER_PF_MAX 108
#define NVM_OFF_MSIX_VEC_PER_PF_MIN 114 #define NVM_OFF_MSIX_VEC_PER_PF_MIN 114
#define NVM_OFF_IGNORE_ARI 164 #define NVM_OFF_IGNORE_ARI 164
......
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