Commit d846992e authored by Michael Chan's avatar Michael Chan Committed by Jakub Kicinski
Browse files

bnxt_en: Implement the new toggle bit doorbell mechanism on P7 chips



The new chip family passes the Toggle bits to the driver in the NQE
notification.  The driver now stores this value and sends it back to
hardware when it re-arms the RX and TX CQs.  Together with the earlier
patch that guarantees the driver will only re-arm the CQ at the end of
NAPI polling if it has seen a new NQE, this method allows the hardware
to detect any dropped doorbells.

Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20231201223924.26955-6-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d3c16475
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -2880,13 +2880,18 @@ static void __bnxt_poll_cqs_done(struct bnxt *bp, struct bnxt_napi *bnapi,
		struct bnxt_db_info *db;

		if (cpr2->had_work_done) {
			u32 tgl = 0;

			if (dbr_type == DBR_TYPE_CQ_ARMALL) {
				cpr2->had_nqe_notify = 0;
				tgl = cpr2->toggle;
			}
			db = &cpr2->cp_db;
			bnxt_writeq(bp, db->db_key64 | dbr_type |
			bnxt_writeq(bp,
				    db->db_key64 | dbr_type | DB_TOGGLE(tgl) |
				    DB_RING_IDX(db, cpr2->cp_raw_cons),
				    db->doorbell);
			cpr2->had_work_done = 0;
			if (dbr_type == DBR_TYPE_CQ_ARMALL)
				cpr2->had_nqe_notify = 0;
		}
	}
	__bnxt_poll_work_done(bp, bnapi, budget);
@@ -2912,6 +2917,8 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
		work_done = __bnxt_poll_cqs(bp, bnapi, budget);
	}
	while (1) {
		u16 type;

		cons = RING_CMP(raw_cons);
		nqcmp = &cpr->nq_desc_ring[CP_RING(cons)][CP_IDX(cons)];

@@ -2933,7 +2940,8 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
		 */
		dma_rmb();

		if (nqcmp->type == cpu_to_le16(NQ_CN_TYPE_CQ_NOTIFICATION)) {
		type = le16_to_cpu(nqcmp->type);
		if (NQE_CN_TYPE(type) == NQ_CN_TYPE_CQ_NOTIFICATION) {
			u32 idx = le32_to_cpu(nqcmp->cq_handle_low);
			u32 cq_type = BNXT_NQ_HDL_TYPE(idx);
			struct bnxt_cp_ring_info *cpr2;
@@ -2946,6 +2954,7 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
			idx = BNXT_NQ_HDL_IDX(idx);
			cpr2 = &cpr->cp_ring_arr[idx];
			cpr2->had_nqe_notify = 1;
			cpr2->toggle = NQE_CN_TOGGLE(type);
			work_done += __bnxt_poll_work(bp, cpr2,
						      budget - work_done);
			cpr->has_more_work |= cpr2->has_more_work;
+1 −0
Original line number Diff line number Diff line
@@ -1038,6 +1038,7 @@ struct bnxt_cp_ring_info {
	u8			had_work_done:1;
	u8			has_more_work:1;
	u8			had_nqe_notify:1;
	u8			toggle;

	u8			cp_ring_type;
	u8			cp_idx;