lkml.org 
[lkml]   [2020]   [Jan]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 163/191] bnxt_en: Fix the logic that creates the health reporters.
    Date
    From: Vasundhara Volam <vasundhara-v.volam@broadcom.com>

    [ Upstream commit 937f188c1f4f89b3fa93ba31fc8587dc1fb14a22 ]

    Fix the logic to properly check the fw capabilities and create the
    devlink health reporters only when needed. The current code creates
    the reporters unconditionally as long as bp->fw_health is valid, and
    that's not correct.

    Call bnxt_dl_fw_reporters_create() directly from the init and reset
    code path instead of from bnxt_dl_register(). This allows the
    reporters to be adjusted when capabilities change. The same
    applies to bnxt_dl_fw_reporters_destroy().

    Fixes: 6763c779c2d8 ("bnxt_en: Add new FW devlink_health_reporter")
    Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.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 | 11 +++
    drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 64 +++++++++++++++-------
    drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h | 2
    3 files changed, 56 insertions(+), 21 deletions(-)

    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -10563,6 +10563,12 @@ static int bnxt_fw_init_one(struct bnxt
    rc = bnxt_approve_mac(bp, bp->dev->dev_addr, false);
    if (rc)
    return rc;
    +
    + /* In case fw capabilities have changed, destroy the unneeded
    + * reporters and create newly capable ones.
    + */
    + bnxt_dl_fw_reporters_destroy(bp, false);
    + bnxt_dl_fw_reporters_create(bp);
    bnxt_fw_init_one_p3(bp);
    return 0;
    }
    @@ -11339,6 +11345,7 @@ static void bnxt_remove_one(struct pci_d

    if (BNXT_PF(bp)) {
    bnxt_sriov_disable(bp);
    + bnxt_dl_fw_reporters_destroy(bp, true);
    bnxt_dl_unregister(bp);
    }

    @@ -11837,8 +11844,10 @@ static int bnxt_init_one(struct pci_dev
    if (rc)
    goto init_err_cleanup_tc;

    - if (BNXT_PF(bp))
    + if (BNXT_PF(bp)) {
    bnxt_dl_register(bp);
    + bnxt_dl_fw_reporters_create(bp);
    + }

    netdev_info(dev, "%s found at mem %lx, node addr %pM\n",
    board_info[ent->driver_data].name,
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
    @@ -102,21 +102,15 @@ struct devlink_health_reporter_ops bnxt_
    .recover = bnxt_fw_fatal_recover,
    };

    -static void bnxt_dl_fw_reporters_create(struct bnxt *bp)
    +void bnxt_dl_fw_reporters_create(struct bnxt *bp)
    {
    struct bnxt_fw_health *health = bp->fw_health;

    - if (!health)
    + if (!bp->dl || !health)
    return;

    - health->fw_reporter =
    - devlink_health_reporter_create(bp->dl, &bnxt_dl_fw_reporter_ops,
    - 0, false, bp);
    - if (IS_ERR(health->fw_reporter)) {
    - netdev_warn(bp->dev, "Failed to create FW health reporter, rc = %ld\n",
    - PTR_ERR(health->fw_reporter));
    - health->fw_reporter = NULL;
    - }
    + if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) || health->fw_reset_reporter)
    + goto err_recovery;

    health->fw_reset_reporter =
    devlink_health_reporter_create(bp->dl,
    @@ -126,8 +120,30 @@ static void bnxt_dl_fw_reporters_create(
    netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n",
    PTR_ERR(health->fw_reset_reporter));
    health->fw_reset_reporter = NULL;
    + bp->fw_cap &= ~BNXT_FW_CAP_HOT_RESET;
    }

    +err_recovery:
    + if (!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
    + return;
    +
    + if (!health->fw_reporter) {
    + health->fw_reporter =
    + devlink_health_reporter_create(bp->dl,
    + &bnxt_dl_fw_reporter_ops,
    + 0, false, bp);
    + if (IS_ERR(health->fw_reporter)) {
    + netdev_warn(bp->dev, "Failed to create FW health reporter, rc = %ld\n",
    + PTR_ERR(health->fw_reporter));
    + health->fw_reporter = NULL;
    + bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
    + return;
    + }
    + }
    +
    + if (health->fw_fatal_reporter)
    + return;
    +
    health->fw_fatal_reporter =
    devlink_health_reporter_create(bp->dl,
    &bnxt_dl_fw_fatal_reporter_ops,
    @@ -136,24 +152,35 @@ static void bnxt_dl_fw_reporters_create(
    netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n",
    PTR_ERR(health->fw_fatal_reporter));
    health->fw_fatal_reporter = NULL;
    + bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
    }
    }

    -static void bnxt_dl_fw_reporters_destroy(struct bnxt *bp)
    +void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
    {
    struct bnxt_fw_health *health = bp->fw_health;

    - if (!health)
    + if (!bp->dl || !health)
    return;

    - if (health->fw_reporter)
    - devlink_health_reporter_destroy(health->fw_reporter);
    -
    - if (health->fw_reset_reporter)
    + if ((all || !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) &&
    + health->fw_reset_reporter) {
    devlink_health_reporter_destroy(health->fw_reset_reporter);
    + health->fw_reset_reporter = NULL;
    + }

    - if (health->fw_fatal_reporter)
    + if ((bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) && !all)
    + return;
    +
    + if (health->fw_reporter) {
    + devlink_health_reporter_destroy(health->fw_reporter);
    + health->fw_reporter = NULL;
    + }
    +
    + if (health->fw_fatal_reporter) {
    devlink_health_reporter_destroy(health->fw_fatal_reporter);
    + health->fw_fatal_reporter = NULL;
    + }
    }

    void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event)
    @@ -458,8 +485,6 @@ int bnxt_dl_register(struct bnxt *bp)

    devlink_params_publish(dl);

    - bnxt_dl_fw_reporters_create(bp);
    -
    return 0;

    err_dl_port_unreg:
    @@ -482,7 +507,6 @@ void bnxt_dl_unregister(struct bnxt *bp)
    if (!dl)
    return;

    - bnxt_dl_fw_reporters_destroy(bp);
    devlink_port_params_unregister(&bp->dl_port, bnxt_dl_port_params,
    ARRAY_SIZE(bnxt_dl_port_params));
    devlink_port_unregister(&bp->dl_port);
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h
    @@ -57,6 +57,8 @@ struct bnxt_dl_nvm_param {
    };

    void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event);
    +void bnxt_dl_fw_reporters_create(struct bnxt *bp);
    +void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all);
    int bnxt_dl_register(struct bnxt *bp);
    void bnxt_dl_unregister(struct bnxt *bp);


    \
     
     \ /
      Last update: 2020-01-02 23:18    [W:2.744 / U:0.860 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site