Skip to content

Commit d621831

Browse files
qzhan16anguy11
authored andcommitted
ice: Check FDIR program status for AVF
Enable returning FDIR completion status by checking the ctrl_vsi Rx queue descriptor value. To enable returning FDIR completion status from ctrl_vsi Rx queue, COMP_Queue and COMP_Report of FDIR filter programming descriptor needs to be properly configured. After program request sent to ctrl_vsi Tx queue, ctrl_vsi Rx queue interrupt will be triggered and completion status will be returned. Driver will first issue request in ice_vc_fdir_add_fltr(), then pass FDIR context to the background task in interrupt service routine ice_vc_fdir_irq_handler() and finally deal with them in ice_flush_fdir_ctx(). ice_flush_fdir_ctx() will check the descriptor's value, fdir context, and then send back virtual channel message to VF by calling ice_vc_add_fdir_fltr_post(). An additional timer will be setup in case of hardware interrupt timeout. Signed-off-by: Yahui Cao <yahui.cao@intel.com> Signed-off-by: Brett Creeley <brett.creeley@intel.com> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com> Tested-by: Chen Bo <BoX.C.Chen@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent 213528f commit d621831

File tree

7 files changed

+541
-16
lines changed

7 files changed

+541
-16
lines changed

drivers/net/ethernet/intel/ice/ice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ enum ice_state {
231231
__ICE_VF_RESETS_DISABLED, /* disable resets during ice_remove */
232232
__ICE_LINK_DEFAULT_OVERRIDE_PENDING,
233233
__ICE_PHY_INIT_COMPLETE,
234+
__ICE_FD_VF_FLUSH_CTX, /* set at FD Rx IRQ or timeout */
234235
__ICE_STATE_NBITS /* must be last */
235236
};
236237

drivers/net/ethernet/intel/ice/ice_hw_autogen.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,9 @@
384384
#define VSIQF_FD_CNT(_VSI) (0x00464000 + ((_VSI) * 4))
385385
#define VSIQF_FD_CNT_FD_GCNT_S 0
386386
#define VSIQF_FD_CNT_FD_GCNT_M ICE_M(0x3FFF, 0)
387+
#define VSIQF_FD_CNT_FD_BCNT_S 16
388+
#define VSIQF_FD_CNT_FD_BCNT_M ICE_M(0x3FFF, 16)
389+
#define VSIQF_FD_SIZE(_VSI) (0x00462000 + ((_VSI) * 4))
387390
#define VSIQF_HKEY_MAX_INDEX 12
388391
#define VSIQF_HLUT_MAX_INDEX 15
389392
#define PFPM_APM 0x000B8080

drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,26 @@ struct ice_fltr_desc {
140140
(0xFFFFFFFFULL << ICE_FXD_FLTR_QW1_FDID_S)
141141
#define ICE_FXD_FLTR_QW1_FDID_ZERO 0x0ULL
142142

143+
/* definition for FD filter programming status descriptor WB format */
144+
#define ICE_FXD_FLTR_WB_QW1_DD_S 0
145+
#define ICE_FXD_FLTR_WB_QW1_DD_M (0x1ULL << ICE_FXD_FLTR_WB_QW1_DD_S)
146+
#define ICE_FXD_FLTR_WB_QW1_DD_YES 0x1ULL
147+
148+
#define ICE_FXD_FLTR_WB_QW1_PROG_ID_S 1
149+
#define ICE_FXD_FLTR_WB_QW1_PROG_ID_M \
150+
(0x3ULL << ICE_FXD_FLTR_WB_QW1_PROG_ID_S)
151+
#define ICE_FXD_FLTR_WB_QW1_PROG_ADD 0x0ULL
152+
#define ICE_FXD_FLTR_WB_QW1_PROG_DEL 0x1ULL
153+
154+
#define ICE_FXD_FLTR_WB_QW1_FAIL_S 4
155+
#define ICE_FXD_FLTR_WB_QW1_FAIL_M (0x1ULL << ICE_FXD_FLTR_WB_QW1_FAIL_S)
156+
#define ICE_FXD_FLTR_WB_QW1_FAIL_YES 0x1ULL
157+
158+
#define ICE_FXD_FLTR_WB_QW1_FAIL_PROF_S 5
159+
#define ICE_FXD_FLTR_WB_QW1_FAIL_PROF_M \
160+
(0x1ULL << ICE_FXD_FLTR_WB_QW1_FAIL_PROF_S)
161+
#define ICE_FXD_FLTR_WB_QW1_FAIL_PROF_YES 0x1ULL
162+
143163
struct ice_rx_ptype_decoded {
144164
u32 ptype:10;
145165
u32 known:1;

drivers/net/ethernet/intel/ice/ice_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,6 +2071,7 @@ static void ice_service_task(struct work_struct *work)
20712071
ice_process_vflr_event(pf);
20722072
ice_clean_mailboxq_subtask(pf);
20732073
ice_sync_arfs_fltrs(pf);
2074+
ice_flush_fdir_ctx(pf);
20742075
/* Clear __ICE_SERVICE_SCHED flag to allow scheduling next event */
20752076
ice_service_task_complete(pf);
20762077

@@ -2082,6 +2083,7 @@ static void ice_service_task(struct work_struct *work)
20822083
test_bit(__ICE_MDD_EVENT_PENDING, pf->state) ||
20832084
test_bit(__ICE_VFLR_EVENT_PENDING, pf->state) ||
20842085
test_bit(__ICE_MAILBOXQ_EVENT_PENDING, pf->state) ||
2086+
test_bit(__ICE_FD_VF_FLUSH_CTX, pf->state) ||
20852087
test_bit(__ICE_ADMINQ_EVENT_PENDING, pf->state))
20862088
mod_timer(&pf->serv_tmr, jiffies);
20872089
}

drivers/net/ethernet/intel/ice/ice_txrx.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,11 @@ int ice_clean_rx_irq(struct ice_ring *rx_ring, int budget)
11151115
dma_rmb();
11161116

11171117
if (rx_desc->wb.rxdid == FDIR_DESC_RXDID || !rx_ring->netdev) {
1118+
struct ice_vsi *ctrl_vsi = rx_ring->vsi;
1119+
1120+
if (rx_desc->wb.rxdid == FDIR_DESC_RXDID &&
1121+
ctrl_vsi->vf_id != ICE_INVAL_VFID)
1122+
ice_vc_fdir_irq_handler(ctrl_vsi, rx_desc);
11181123
ice_put_rx_buf(rx_ring, NULL, 0);
11191124
cleaned_count++;
11201125
continue;

0 commit comments

Comments
 (0)