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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Jan 2020 07:22:52 +0000 (08:22 +0100)
[ 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>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c

index 2179f4e..cf292f7 100644 (file)
@@ -11299,7 +11299,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);
@@ -11691,6 +11691,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;
 }
 
@@ -11802,9 +11803,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);
        }
 
        /* MTU range: 60 - FW defined max */
index 3c7ccb2..2e6ad53 100644 (file)
@@ -1510,6 +1510,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 f9bf7d7..b010b34 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;