|
|
|
@@ -2162,6 +2162,7 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
|
|
|
|
struct tx_cmp *txcmp;
|
|
|
|
|
|
|
|
|
|
cpr->has_more_work = 0;
|
|
|
|
|
cpr->had_work_done = 1;
|
|
|
|
|
while (1) {
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
@@ -2175,7 +2176,6 @@ static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
|
|
|
|
* reading any further.
|
|
|
|
|
*/
|
|
|
|
|
dma_rmb();
|
|
|
|
|
cpr->had_work_done = 1;
|
|
|
|
|
if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
|
|
|
|
|
tx_pkts++;
|
|
|
|
|
/* return full budget so NAPI will complete. */
|
|
|
|
@@ -2392,7 +2392,7 @@ static int __bnxt_poll_cqs(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __bnxt_poll_cqs_done(struct bnxt *bp, struct bnxt_napi *bnapi,
|
|
|
|
|
u64 dbr_type, bool all)
|
|
|
|
|
u64 dbr_type)
|
|
|
|
|
{
|
|
|
|
|
struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
|
|
|
|
|
int i;
|
|
|
|
@@ -2401,7 +2401,7 @@ static void __bnxt_poll_cqs_done(struct bnxt *bp, struct bnxt_napi *bnapi,
|
|
|
|
|
struct bnxt_cp_ring_info *cpr2 = cpr->cp_ring_arr[i];
|
|
|
|
|
struct bnxt_db_info *db;
|
|
|
|
|
|
|
|
|
|
if (cpr2 && (all || cpr2->had_work_done)) {
|
|
|
|
|
if (cpr2 && cpr2->had_work_done) {
|
|
|
|
|
db = &cpr2->cp_db;
|
|
|
|
|
writeq(db->db_key64 | dbr_type |
|
|
|
|
|
RING_CMP(cpr2->cp_raw_cons), db->doorbell);
|
|
|
|
@@ -2424,22 +2424,16 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
|
|
|
|
|
if (cpr->has_more_work) {
|
|
|
|
|
cpr->has_more_work = 0;
|
|
|
|
|
work_done = __bnxt_poll_cqs(bp, bnapi, budget);
|
|
|
|
|
if (cpr->has_more_work) {
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ, false);
|
|
|
|
|
return work_done;
|
|
|
|
|
}
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ_ARMALL, true);
|
|
|
|
|
if (napi_complete_done(napi, work_done))
|
|
|
|
|
BNXT_DB_NQ_ARM_P5(&cpr->cp_db, cpr->cp_raw_cons);
|
|
|
|
|
return work_done;
|
|
|
|
|
}
|
|
|
|
|
while (1) {
|
|
|
|
|
cons = RING_CMP(raw_cons);
|
|
|
|
|
nqcmp = &cpr->nq_desc_ring[CP_RING(cons)][CP_IDX(cons)];
|
|
|
|
|
|
|
|
|
|
if (!NQ_CMP_VALID(nqcmp, raw_cons)) {
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ_ARMALL,
|
|
|
|
|
false);
|
|
|
|
|
if (cpr->has_more_work)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ_ARMALL);
|
|
|
|
|
cpr->cp_raw_cons = raw_cons;
|
|
|
|
|
if (napi_complete_done(napi, work_done))
|
|
|
|
|
BNXT_DB_NQ_ARM_P5(&cpr->cp_db,
|
|
|
|
@@ -2459,16 +2453,17 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
|
|
|
|
|
cpr2 = cpr->cp_ring_arr[idx];
|
|
|
|
|
work_done += __bnxt_poll_work(bp, cpr2,
|
|
|
|
|
budget - work_done);
|
|
|
|
|
cpr->has_more_work = cpr2->has_more_work;
|
|
|
|
|
cpr->has_more_work |= cpr2->has_more_work;
|
|
|
|
|
} else {
|
|
|
|
|
bnxt_hwrm_handler(bp, (struct tx_cmp *)nqcmp);
|
|
|
|
|
}
|
|
|
|
|
raw_cons = NEXT_RAW_CMP(raw_cons);
|
|
|
|
|
if (cpr->has_more_work)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ, true);
|
|
|
|
|
cpr->cp_raw_cons = raw_cons;
|
|
|
|
|
__bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ);
|
|
|
|
|
if (raw_cons != cpr->cp_raw_cons) {
|
|
|
|
|
cpr->cp_raw_cons = raw_cons;
|
|
|
|
|
BNXT_DB_NQ_P5(&cpr->cp_db, raw_cons);
|
|
|
|
|
}
|
|
|
|
|
return work_done;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -4166,6 +4161,7 @@ static int bnxt_hwrm_to_stderr(u32 hwrm_err)
|
|
|
|
|
case HWRM_ERR_CODE_NO_BUFFER:
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
case HWRM_ERR_CODE_HOT_RESET_PROGRESS:
|
|
|
|
|
case HWRM_ERR_CODE_BUSY:
|
|
|
|
|
return -EAGAIN;
|
|
|
|
|
case HWRM_ERR_CODE_CMD_NOT_SUPPORTED:
|
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
@@ -5065,10 +5061,8 @@ vnic_mru:
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_vnic_free_one(struct bnxt *bp, u16 vnic_id)
|
|
|
|
|
static void bnxt_hwrm_vnic_free_one(struct bnxt *bp, u16 vnic_id)
|
|
|
|
|
{
|
|
|
|
|
u32 rc = 0;
|
|
|
|
|
|
|
|
|
|
if (bp->vnic_info[vnic_id].fw_vnic_id != INVALID_HW_RING_ID) {
|
|
|
|
|
struct hwrm_vnic_free_input req = {0};
|
|
|
|
|
|
|
|
|
@@ -5076,10 +5070,9 @@ static int bnxt_hwrm_vnic_free_one(struct bnxt *bp, u16 vnic_id)
|
|
|
|
|
req.vnic_id =
|
|
|
|
|
cpu_to_le32(bp->vnic_info[vnic_id].fw_vnic_id);
|
|
|
|
|
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
bp->vnic_info[vnic_id].fw_vnic_id = INVALID_HW_RING_ID;
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void bnxt_hwrm_vnic_free(struct bnxt *bp)
|
|
|
|
@@ -5196,14 +5189,13 @@ static int bnxt_hwrm_ring_grp_alloc(struct bnxt *bp)
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_ring_grp_free(struct bnxt *bp)
|
|
|
|
|
static void bnxt_hwrm_ring_grp_free(struct bnxt *bp)
|
|
|
|
|
{
|
|
|
|
|
u16 i;
|
|
|
|
|
u32 rc = 0;
|
|
|
|
|
struct hwrm_ring_grp_free_input req = {0};
|
|
|
|
|
|
|
|
|
|
if (!bp->grp_info || (bp->flags & BNXT_FLAG_CHIP_P5))
|
|
|
|
|
return 0;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_GRP_FREE, -1, -1);
|
|
|
|
|
|
|
|
|
@@ -5214,12 +5206,10 @@ static int bnxt_hwrm_ring_grp_free(struct bnxt *bp)
|
|
|
|
|
req.ring_group_id =
|
|
|
|
|
cpu_to_le32(bp->grp_info[i].fw_grp_id);
|
|
|
|
|
|
|
|
|
|
rc = _hwrm_send_message(bp, &req, sizeof(req),
|
|
|
|
|
HWRM_CMD_TIMEOUT);
|
|
|
|
|
_hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
bp->grp_info[i].fw_grp_id = INVALID_HW_RING_ID;
|
|
|
|
|
}
|
|
|
|
|
mutex_unlock(&bp->hwrm_cmd_lock);
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
|
|
|
|
@@ -5843,8 +5833,7 @@ bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
if (bp->hwrm_spec_code < 0x10601)
|
|
|
|
|
bp->hw_resc.resv_tx_rings = tx_rings;
|
|
|
|
|
|
|
|
|
|
rc = bnxt_hwrm_get_rings(bp);
|
|
|
|
|
return rc;
|
|
|
|
|
return bnxt_hwrm_get_rings(bp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
@@ -5865,8 +5854,7 @@ bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
if (rc)
|
|
|
|
|
return rc;
|
|
|
|
|
|
|
|
|
|
rc = bnxt_hwrm_get_rings(bp);
|
|
|
|
|
return rc;
|
|
|
|
|
return bnxt_hwrm_get_rings(bp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp,
|
|
|
|
@@ -6026,7 +6014,6 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
{
|
|
|
|
|
struct hwrm_func_vf_cfg_input req = {0};
|
|
|
|
|
u32 flags;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
if (!BNXT_NEW_RM(bp))
|
|
|
|
|
return 0;
|
|
|
|
@@ -6043,8 +6030,8 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
flags |= FUNC_VF_CFG_REQ_FLAGS_RING_GRP_ASSETS_TEST;
|
|
|
|
|
|
|
|
|
|
req.flags = cpu_to_le32(flags);
|
|
|
|
|
rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message_silent(bp, &req, sizeof(req),
|
|
|
|
|
HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
@@ -6053,7 +6040,6 @@ static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
{
|
|
|
|
|
struct hwrm_func_cfg_input req = {0};
|
|
|
|
|
u32 flags;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
__bnxt_hwrm_reserve_pf_rings(bp, &req, tx_rings, rx_rings, ring_grps,
|
|
|
|
|
cp_rings, stats, vnics);
|
|
|
|
@@ -6071,8 +6057,8 @@ static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
req.flags = cpu_to_le32(flags);
|
|
|
|
|
rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message_silent(bp, &req, sizeof(req),
|
|
|
|
|
HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_check_rings(struct bnxt *bp, int tx_rings, int rx_rings,
|
|
|
|
@@ -6311,16 +6297,16 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
|
|
|
|
|
static void bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
|
|
|
|
|
{
|
|
|
|
|
int rc = 0, i;
|
|
|
|
|
struct hwrm_stat_ctx_free_input req = {0};
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (!bp->bnapi)
|
|
|
|
|
return 0;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (BNXT_CHIP_TYPE_NITRO_A0(bp))
|
|
|
|
|
return 0;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_FREE, -1, -1);
|
|
|
|
|
|
|
|
|
@@ -6332,14 +6318,13 @@ static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
|
|
|
|
|
if (cpr->hw_stats_ctx_id != INVALID_STATS_CTX_ID) {
|
|
|
|
|
req.stat_ctx_id = cpu_to_le32(cpr->hw_stats_ctx_id);
|
|
|
|
|
|
|
|
|
|
rc = _hwrm_send_message(bp, &req, sizeof(req),
|
|
|
|
|
HWRM_CMD_TIMEOUT);
|
|
|
|
|
_hwrm_send_message(bp, &req, sizeof(req),
|
|
|
|
|
HWRM_CMD_TIMEOUT);
|
|
|
|
|
|
|
|
|
|
cpr->hw_stats_ctx_id = INVALID_STATS_CTX_ID;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mutex_unlock(&bp->hwrm_cmd_lock);
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
|
|
|
|
@@ -6544,8 +6529,8 @@ static int bnxt_hwrm_func_backing_store_cfg(struct bnxt *bp, u32 enables)
|
|
|
|
|
__le64 *pg_dir;
|
|
|
|
|
u32 flags = 0;
|
|
|
|
|
u8 *pg_attr;
|
|
|
|
|
int i, rc;
|
|
|
|
|
u32 ena;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (!ctx)
|
|
|
|
|
return 0;
|
|
|
|
@@ -6632,8 +6617,7 @@ static int bnxt_hwrm_func_backing_store_cfg(struct bnxt *bp, u32 enables)
|
|
|
|
|
bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, pg_attr, pg_dir);
|
|
|
|
|
}
|
|
|
|
|
req.flags = cpu_to_le32(flags);
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_alloc_ctx_mem_blk(struct bnxt *bp,
|
|
|
|
@@ -7337,7 +7321,6 @@ int bnxt_hwrm_fw_set_time(struct bnxt *bp)
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_port_qstats(struct bnxt *bp)
|
|
|
|
|
{
|
|
|
|
|
int rc;
|
|
|
|
|
struct bnxt_pf_info *pf = &bp->pf;
|
|
|
|
|
struct hwrm_port_qstats_input req = {0};
|
|
|
|
|
|
|
|
|
@@ -7348,8 +7331,7 @@ static int bnxt_hwrm_port_qstats(struct bnxt *bp)
|
|
|
|
|
req.port_id = cpu_to_le16(pf->port_id);
|
|
|
|
|
req.tx_stat_host_addr = cpu_to_le64(bp->hw_tx_port_stats_map);
|
|
|
|
|
req.rx_stat_host_addr = cpu_to_le64(bp->hw_rx_port_stats_map);
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp)
|
|
|
|
@@ -7503,7 +7485,6 @@ static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path,
|
|
|
|
|
static int bnxt_hwrm_set_br_mode(struct bnxt *bp, u16 br_mode)
|
|
|
|
|
{
|
|
|
|
|
struct hwrm_func_cfg_input req = {0};
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1);
|
|
|
|
|
req.fid = cpu_to_le16(0xffff);
|
|
|
|
@@ -7514,14 +7495,12 @@ static int bnxt_hwrm_set_br_mode(struct bnxt *bp, u16 br_mode)
|
|
|
|
|
req.evb_mode = FUNC_CFG_REQ_EVB_MODE_VEPA;
|
|
|
|
|
else
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bnxt_hwrm_set_cache_line_size(struct bnxt *bp, int size)
|
|
|
|
|
{
|
|
|
|
|
struct hwrm_func_cfg_input req = {0};
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
if (BNXT_VF(bp) || bp->hwrm_spec_code < 0x10803)
|
|
|
|
|
return 0;
|
|
|
|
@@ -7533,8 +7512,7 @@ static int bnxt_hwrm_set_cache_line_size(struct bnxt *bp, int size)
|
|
|
|
|
if (size == 128)
|
|
|
|
|
req.options = FUNC_CFG_REQ_OPTIONS_CACHE_LINESIZE_SIZE_128;
|
|
|
|
|
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int __bnxt_setup_vnic(struct bnxt *bp, u16 vnic_id)
|
|
|
|
@@ -8792,6 +8770,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
|
|
|
|
|
bnxt_free_ctx_mem(bp);
|
|
|
|
|
kfree(bp->ctx);
|
|
|
|
|
bp->ctx = NULL;
|
|
|
|
|
bnxt_dcb_free(bp);
|
|
|
|
|
rc = bnxt_fw_init_one(bp);
|
|
|
|
|
if (rc) {
|
|
|
|
|
set_bit(BNXT_STATE_ABORT_ERR, &bp->state);
|
|
|
|
@@ -8887,14 +8866,12 @@ int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp)
|
|
|
|
|
int bnxt_hwrm_free_wol_fltr(struct bnxt *bp)
|
|
|
|
|
{
|
|
|
|
|
struct hwrm_wol_filter_free_input req = {0};
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_WOL_FILTER_FREE, -1, -1);
|
|
|
|
|
req.port_id = cpu_to_le16(bp->pf.port_id);
|
|
|
|
|
req.enables = cpu_to_le32(WOL_FILTER_FREE_REQ_ENABLES_WOL_FILTER_ID);
|
|
|
|
|
req.wol_filter_id = bp->wol_filter_id;
|
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
return rc;
|
|
|
|
|
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u16 bnxt_hwrm_get_wol_fltrs(struct bnxt *bp, u16 handle)
|
|
|
|
@@ -11452,6 +11429,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
|
|
|
|
bnxt_sriov_disable(bp);
|
|
|
|
|
|
|
|
|
|
bnxt_dl_fw_reporters_destroy(bp, true);
|
|
|
|
|
if (BNXT_PF(bp))
|
|
|
|
|
devlink_port_type_clear(&bp->dl_port);
|
|
|
|
|
pci_disable_pcie_error_reporting(pdev);
|
|
|
|
|
unregister_netdev(dev);
|
|
|
|
|
bnxt_dl_unregister(bp);
|
|
|
|
|