OSDN Git Service

bnxt_en: fix clearing devlink ptr from bnxt struct
authorSathya Perla <sathya.perla@broadcom.com>
Mon, 28 Aug 2017 17:40:32 +0000 (13:40 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Aug 2017 23:57:10 +0000 (16:57 -0700)
The routine bnxt_link_bp_to_dl() is used to set the devlink ptr
in bnxt struct (bp) and also to set the bnxt back ptr in
the devlink struct.  If devlink_register() fails, bp->dl must
be cleared which is not happening currently. This patch fixes
bnxt_link_bp_to_dl() to clear bp->dl by passing  a NULL dl ptr.

Fixes: 4ab0c6a8ffd7 ("bnxt_en: add support to enable VF-representors")
Signed-off-by: Sathya Perla <sathya.perla@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.h

index 86cce6f..c365d3c 100644 (file)
@@ -468,11 +468,11 @@ int bnxt_dl_register(struct bnxt *bp)
                return -ENOMEM;
        }
 
-       bnxt_link_bp_to_dl(dl, bp);
+       bnxt_link_bp_to_dl(bp, dl);
        bp->eswitch_mode = DEVLINK_ESWITCH_MODE_LEGACY;
        rc = devlink_register(dl, &bp->pdev->dev);
        if (rc) {
-               bnxt_link_bp_to_dl(dl, NULL);
+               bnxt_link_bp_to_dl(bp, NULL);
                devlink_free(dl);
                netdev_warn(bp->dev, "devlink_register failed. rc=%d", rc);
                return rc;
index e55a3b6..3e997c9 100644 (file)
@@ -24,13 +24,17 @@ static inline struct bnxt *bnxt_get_bp_from_dl(struct devlink *dl)
        return ((struct bnxt_dl *)devlink_priv(dl))->bp;
 }
 
-static inline void bnxt_link_bp_to_dl(struct devlink *dl, struct bnxt *bp)
+/* To clear devlink pointer from bp, pass NULL dl */
+static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl)
 {
-       struct bnxt_dl *bp_dl = devlink_priv(dl);
+       bp->dl = dl;
 
-       bp_dl->bp = bp;
-       if (bp)
-               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;
+       }
 }
 
 int bnxt_dl_register(struct bnxt *bp);