bnxt_en: Set default completion ring for async events.
authorMichael Chan <michael.chan@broadcom.com>
Thu, 29 Dec 2016 17:13:42 +0000 (12:13 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Dec 2016 19:37:23 +0000 (14:37 -0500)
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 <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 338dbd03ff5860700903fef512d0293100f05f2f..1f54a7acc3f760b22ff976a862a7253daf163783 100644 (file)
@@ -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++) {