On Tue, Jul 22, 2025 at 03:18:40PM +0800, Fan Gong wrote: > Add async event queue interfaces initialization. > It allows driver to handle async events reported by HW. > > Co-developed-by: Xin Guo <guoxin09@xxxxxxxxxx> > Signed-off-by: Xin Guo <guoxin09@xxxxxxxxxx> > Co-developed-by: Zhu Yikai <zhuyikai1@xxxxxxxxxxxxxx> > Signed-off-by: Zhu Yikai <zhuyikai1@xxxxxxxxxxxxxx> > Signed-off-by: Fan Gong <gongfan1@xxxxxxxxxx> ... > diff --git a/drivers/net/ethernet/huawei/hinic3/hinic3_eqs.c b/drivers/net/ethernet/huawei/hinic3/hinic3_eqs.c ... > +int hinic3_aeq_register_cb(struct hinic3_hwdev *hwdev, > + enum hinic3_aeq_type event, > + hinic3_aeq_event_cb hwe_cb) > +{ > + struct hinic3_aeqs *aeqs; > + unsigned long *cb_state; cb_state is set but otherwise unused in this function. Probably it should be removed. Flagged by GCC 15.1.0 and Clang 20.1.8 builds with KCFLAGS=-Wunused-but-set-variable > + > + aeqs = hwdev->aeqs; > + cb_state = &aeqs->aeq_cb_state[event]; > + aeqs->aeq_cb[event] = hwe_cb; > + spin_lock_init(&aeqs->aeq_lock); > + > + return 0; > +} > + > +void hinic3_aeq_unregister_cb(struct hinic3_hwdev *hwdev, > + enum hinic3_aeq_type event) > +{ > + struct hinic3_aeqs *aeqs; > + unsigned long *cb_state; Ditto. > + > + aeqs = hwdev->aeqs; > + cb_state = &aeqs->aeq_cb_state[event]; > + > + spin_lock_bh(&aeqs->aeq_lock); > + aeqs->aeq_cb[event] = NULL; > + spin_unlock_bh(&aeqs->aeq_lock); > +} ... > +static void aeq_event_handler(struct hinic3_aeqs *aeqs, u32 aeqe, > + const struct hinic3_aeq_elem *aeqe_pos) > +{ > + struct hinic3_hwdev *hwdev = aeqs->hwdev; > + u8 data[HINIC3_AEQE_DATA_SIZE], size; > + enum hinic3_aeq_type event; > + hinic3_aeq_event_cb hwe_cb; > + unsigned long *cb_state; Ditto. > + > + if (EQ_ELEM_DESC_GET(aeqe, SRC)) > + return; > + > + event = EQ_ELEM_DESC_GET(aeqe, TYPE); > + if (event >= HINIC3_MAX_AEQ_EVENTS) { > + dev_warn(hwdev->dev, "Aeq unknown event:%d\n", event); > + return; > + } > + > + memcpy(data, aeqe_pos->aeqe_data, HINIC3_AEQE_DATA_SIZE); > + hinic3_cmdq_buf_swab32(data, HINIC3_AEQE_DATA_SIZE); > + size = EQ_ELEM_DESC_GET(aeqe, SIZE); > + cb_state = &aeqs->aeq_cb_state[event]; > + > + spin_lock_bh(&aeqs->aeq_lock); > + hwe_cb = aeqs->aeq_cb[event]; > + if (hwe_cb) > + hwe_cb(aeqs->hwdev, data, size); > + spin_unlock_bh(&aeqs->aeq_lock); > +} ... > +static void eq_calc_page_size_and_num(struct hinic3_eq *eq, u32 elem_size) > +{ > + u32 max_pages, min_page_size, page_size, total_size; > + > + /* No need for complicated arithmetics. All values must be power of 2. arithmetic > + * Multiplications give power of 2 and divisions give power of 2 without > + * remainder. > + */ > + max_pages = HINIC3_EQ_MAX_PAGES; > + min_page_size = HINIC3_MIN_PAGE_SIZE; > + total_size = eq->eq_len * elem_size; > + > + if (total_size <= max_pages * min_page_size) > + page_size = min_page_size; > + else > + page_size = total_size / max_pages; > + > + hinic3_queue_pages_init(&eq->qpages, eq->eq_len, page_size, elem_size); > +} ...