]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
bnxt_en: Do not treat DSN (Digital Serial Number) read failure as fatal.
authorMichael Chan <michael.chan@broadcom.com>
Fri, 17 Jan 2020 05:32:47 +0000 (00:32 -0500)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 14 Feb 2020 06:00:53 +0000 (01:00 -0500)
BugLink: https://bugs.launchpad.net/bugs/1862429
[ Upstream commit d061b2411d5f3d6272187ab734ce0640827fca13 ]

DSN read can fail, for example on a kdump kernel without PCIe extended
config space support.  If DSN read fails, don't set the
BNXT_FLAG_DSN_VALID flag and continue loading.  Check the flag
to see if the stored DSN is valid before using it.  Only VF reps
creation should fail without valid DSN.

Fixes: 03213a996531 ("bnxt: move bp->switch_id initialization to PF probe")
Reported-by: Marc Smith <msmith626@gmail.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c

index 2d4ed6ec92958eb8c38686beb5de8c39de6089e7..5bd5536e09a6773da34931bba9eb3fb876fd0dda 100644 (file)
@@ -10262,7 +10262,7 @@ int bnxt_get_port_parent_id(struct net_device *dev,
                return -EOPNOTSUPP;
 
        /* The PF and it's VF-reps only support the switchdev framework */
-       if (!BNXT_PF(bp))
+       if (!BNXT_PF(bp) || !(bp->flags & BNXT_FLAG_DSN_VALID))
                return -EOPNOTSUPP;
 
        ppid->id_len = sizeof(bp->switch_id);
@@ -10651,6 +10651,7 @@ static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
        put_unaligned_le32(dw, &dsn[0]);
        pci_read_config_dword(pdev, pos + 4, &dw);
        put_unaligned_le32(dw, &dsn[4]);
+       bp->flags |= BNXT_FLAG_DSN_VALID;
        return 0;
 }
 
@@ -10802,9 +10803,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        if (BNXT_PF(bp)) {
                /* Read the adapter's DSN to use as the eswitch switch_id */
-               rc = bnxt_pcie_dsn_get(bp, bp->switch_id);
-               if (rc)
-                       goto init_err_pci_clean;
+               bnxt_pcie_dsn_get(bp, bp->switch_id);
        }
        bnxt_hwrm_func_qcfg(bp);
        bnxt_hwrm_vnic_qcaps(bp);
index 57e2e1ccbc373ac9d4d2304adf0a95677feddc17..46ea7e0bc64ef568190da168a6077f7d19a0f48b 100644 (file)
@@ -1360,6 +1360,7 @@ struct bnxt {
        #define BNXT_FLAG_NO_AGG_RINGS  0x20000
        #define BNXT_FLAG_RX_PAGE_MODE  0x40000
        #define BNXT_FLAG_MULTI_HOST    0x100000
+       #define BNXT_FLAG_DSN_VALID     0x200000
        #define BNXT_FLAG_DOUBLE_DB     0x400000
        #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000
        #define BNXT_FLAG_DIM           0x2000000
index f9bf7d7250abca8565684a2afa3bd9a29f347bbe..b010b34cdaf835fdf23eea5ffceaddce4386ec98 100644 (file)
@@ -398,6 +398,9 @@ static int bnxt_vf_reps_create(struct bnxt *bp)
        struct net_device *dev;
        int rc, i;
 
+       if (!(bp->flags & BNXT_FLAG_DSN_VALID))
+               return -ENODEV;
+
        bp->vf_reps = kcalloc(num_vfs, sizeof(vf_rep), GFP_KERNEL);
        if (!bp->vf_reps)
                return -ENOMEM;