mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
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: Michael Chan <michael.chan@broadcom.com> Link: https://lore.kernel.org/r/20231201223924.26955-6-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d3c16475dc
commit
d846992e63
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user