|
@@ -3858,6 +3858,30 @@ static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
|
|
return rc;
|
|
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)
|
|
static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
|
{
|
|
{
|
|
int i, rc = 0;
|
|
int i, rc = 0;
|
|
@@ -3874,6 +3898,12 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
|
goto err_out;
|
|
goto err_out;
|
|
BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);
|
|
BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);
|
|
bp->grp_info[i].cp_fw_ring_id = ring->fw_ring_id;
|
|
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++) {
|
|
for (i = 0; i < bp->tx_nr_rings; i++) {
|