From 510df2330472b4b1044b79c398cf654eeda79c1e Mon Sep 17 00:00:00 2001 From: Selvin Xavier Date: Mon, 23 Oct 2017 03:03:12 -0700 Subject: [PATCH] bnxt_en: Bug 2645 - Set default completion ring for async events Adding patch from upstream which fixes the link status reporting issues. Signed-off-by: Selvin Xavier --- ...ult_completion_ring_for_async_events.patch | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 linux-next-cherry-picks/0063-bnxt_en_Set_default_completion_ring_for_async_events.patch diff --git a/linux-next-cherry-picks/0063-bnxt_en_Set_default_completion_ring_for_async_events.patch b/linux-next-cherry-picks/0063-bnxt_en_Set_default_completion_ring_for_async_events.patch new file mode 100755 index 0000000..85ff4ab --- /dev/null +++ b/linux-next-cherry-picks/0063-bnxt_en_Set_default_completion_ring_for_async_events.patch @@ -0,0 +1,70 @@ +From 486b5c22ea1d35e00e90dd79a32a9ee530b18915 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Thu, 29 Dec 2016 12:13:42 -0500 +Subject: bnxt_en: Set default completion ring for async events. + +With the added support for the bnxt_re RDMA driver, both drivers can be +allocating completion rings in any order. The firmware does not know +which completion ring should be receiving async events. Add an +extra step to tell firmware the completion ring number for receiving +async events after bnxt_en allocates the completion rings. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +(limited to 'drivers/net/ethernet/broadcom/bnxt') + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 338dbd0..1f54a7a 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -3858,6 +3858,30 @@ static int hwrm_ring_alloc_send_msg(struct bnxt *bp, + return rc; + } + ++static int bnxt_hwrm_set_async_event_cr(struct bnxt *bp, int idx) ++{ ++ int rc; ++ ++ if (BNXT_PF(bp)) { ++ struct hwrm_func_cfg_input req = {0}; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1); ++ req.fid = cpu_to_le16(0xffff); ++ req.enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_ASYNC_EVENT_CR); ++ req.async_event_cr = cpu_to_le16(idx); ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ } else { ++ struct hwrm_func_vf_cfg_input req = {0}; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_VF_CFG, -1, -1); ++ req.enables = ++ cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_ASYNC_EVENT_CR); ++ req.async_event_cr = cpu_to_le16(idx); ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ } ++ return rc; ++} ++ + static int bnxt_hwrm_ring_alloc(struct bnxt *bp) + { + int i, rc = 0; +@@ -3874,6 +3898,12 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp) + goto err_out; + BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons); + bp->grp_info[i].cp_fw_ring_id = ring->fw_ring_id; ++ ++ if (!i) { ++ rc = bnxt_hwrm_set_async_event_cr(bp, ring->fw_ring_id); ++ if (rc) ++ netdev_warn(bp->dev, "Failed to set async event completion ring.\n"); ++ } + } + + for (i = 0; i < bp->tx_nr_rings; i++) { +-- +cgit v1.1 + -- 2.46.0