Skip to content

Commit 4d9f61a

Browse files
committed
Merge: idpf: post-v6.12 fixes
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/136 JIRA: https://issues.redhat.com/browse/RHEL-29554 Signed-off-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: Corinna Vinschen <vinschen@redhat.com> Approved-by: Kamal Heib <kheib@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Jan Stancek <jstancek@redhat.com>
2 parents a86f5e5 + 9a3a101 commit 4d9f61a

File tree

4 files changed

+35
-12
lines changed

4 files changed

+35
-12
lines changed

drivers/net/ethernet/intel/idpf/idpf_dev.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ static int idpf_intr_reg_init(struct idpf_vport *vport)
101101
intr->dyn_ctl_itridx_s = PF_GLINT_DYN_CTL_ITR_INDX_S;
102102
intr->dyn_ctl_intrvl_s = PF_GLINT_DYN_CTL_INTERVAL_S;
103103
intr->dyn_ctl_wb_on_itr_m = PF_GLINT_DYN_CTL_WB_ON_ITR_M;
104+
intr->dyn_ctl_swint_trig_m = PF_GLINT_DYN_CTL_SWINT_TRIG_M;
105+
intr->dyn_ctl_sw_itridx_ena_m =
106+
PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_M;
104107

105108
spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,
106109
IDPF_PF_ITR_IDX_SPACING);

drivers/net/ethernet/intel/idpf/idpf_txrx.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,6 +2448,7 @@ static void idpf_tx_splitq_map(struct idpf_tx_queue *tx_q,
24482448
* rest of the packet.
24492449
*/
24502450
tx_buf->type = LIBETH_SQE_EMPTY;
2451+
idpf_tx_buf_compl_tag(tx_buf) = params->compl_tag;
24512452

24522453
/* Adjust the DMA offset and the remaining size of the
24532454
* fragment. On the first iteration of this loop,
@@ -3603,21 +3604,31 @@ static void idpf_vport_intr_dis_irq_all(struct idpf_vport *vport)
36033604
/**
36043605
* idpf_vport_intr_buildreg_itr - Enable default interrupt generation settings
36053606
* @q_vector: pointer to q_vector
3606-
* @type: itr index
3607-
* @itr: itr value
36083607
*/
3609-
static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector,
3610-
const int type, u16 itr)
3608+
static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector)
36113609
{
3612-
u32 itr_val;
3610+
u32 itr_val = q_vector->intr_reg.dyn_ctl_intena_m;
3611+
int type = IDPF_NO_ITR_UPDATE_IDX;
3612+
u16 itr = 0;
3613+
3614+
if (q_vector->wb_on_itr) {
3615+
/*
3616+
* Trigger a software interrupt when exiting wb_on_itr, to make
3617+
* sure we catch any pending write backs that might have been
3618+
* missed due to interrupt state transition.
3619+
*/
3620+
itr_val |= q_vector->intr_reg.dyn_ctl_swint_trig_m |
3621+
q_vector->intr_reg.dyn_ctl_sw_itridx_ena_m;
3622+
type = IDPF_SW_ITR_UPDATE_IDX;
3623+
itr = IDPF_ITR_20K;
3624+
}
36133625

36143626
itr &= IDPF_ITR_MASK;
36153627
/* Don't clear PBA because that can cause lost interrupts that
36163628
* came in while we were cleaning/polling
36173629
*/
3618-
itr_val = q_vector->intr_reg.dyn_ctl_intena_m |
3619-
(type << q_vector->intr_reg.dyn_ctl_itridx_s) |
3620-
(itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1));
3630+
itr_val |= (type << q_vector->intr_reg.dyn_ctl_itridx_s) |
3631+
(itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1));
36213632

36223633
return itr_val;
36233634
}
@@ -3715,9 +3726,8 @@ void idpf_vport_intr_update_itr_ena_irq(struct idpf_q_vector *q_vector)
37153726
/* net_dim() updates ITR out-of-band using a work item */
37163727
idpf_net_dim(q_vector);
37173728

3729+
intval = idpf_vport_intr_buildreg_itr(q_vector);
37183730
q_vector->wb_on_itr = false;
3719-
intval = idpf_vport_intr_buildreg_itr(q_vector,
3720-
IDPF_NO_ITR_UPDATE_IDX, 0);
37213731

37223732
writel(intval, q_vector->intr_reg.dyn_ctl);
37233733
}

drivers/net/ethernet/intel/idpf/idpf_txrx.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ struct idpf_vec_regs {
354354
* @dyn_ctl_itridx_m: Mask for ITR index
355355
* @dyn_ctl_intrvl_s: Register bit offset for ITR interval
356356
* @dyn_ctl_wb_on_itr_m: Mask for WB on ITR feature
357+
* @dyn_ctl_sw_itridx_ena_m: Mask for SW ITR index
358+
* @dyn_ctl_swint_trig_m: Mask for dyn_ctl SW triggered interrupt enable
357359
* @rx_itr: RX ITR register
358360
* @tx_itr: TX ITR register
359361
* @icr_ena: Interrupt cause register offset
@@ -367,6 +369,8 @@ struct idpf_intr_reg {
367369
u32 dyn_ctl_itridx_m;
368370
u32 dyn_ctl_intrvl_s;
369371
u32 dyn_ctl_wb_on_itr_m;
372+
u32 dyn_ctl_sw_itridx_ena_m;
373+
u32 dyn_ctl_swint_trig_m;
370374
void __iomem *rx_itr;
371375
void __iomem *tx_itr;
372376
void __iomem *icr_ena;
@@ -437,8 +441,9 @@ struct idpf_q_vector {
437441
cpumask_var_t affinity_mask;
438442
__cacheline_group_end_aligned(cold);
439443
};
440-
libeth_cacheline_set_assert(struct idpf_q_vector, 112,
441-
424 + 2 * sizeof(struct dim),
444+
libeth_cacheline_set_assert(struct idpf_q_vector, 120,
445+
24 + sizeof(struct napi_struct) +
446+
2 * sizeof(struct dim),
442447
8 + sizeof(cpumask_var_t));
443448

444449
struct idpf_rx_queue_stats {
@@ -470,6 +475,8 @@ struct idpf_tx_queue_stats {
470475
#define IDPF_ITR_IS_DYNAMIC(itr_mode) (itr_mode)
471476
#define IDPF_ITR_TX_DEF IDPF_ITR_20K
472477
#define IDPF_ITR_RX_DEF IDPF_ITR_20K
478+
/* Index used for 'SW ITR' update in DYN_CTL register */
479+
#define IDPF_SW_ITR_UPDATE_IDX 2
473480
/* Index used for 'No ITR' update in DYN_CTL register */
474481
#define IDPF_NO_ITR_UPDATE_IDX 3
475482
#define IDPF_ITR_IDX_SPACING(spacing, dflt) (spacing ? spacing : dflt)

drivers/net/ethernet/intel/idpf/idpf_vf_dev.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ static int idpf_vf_intr_reg_init(struct idpf_vport *vport)
101101
intr->dyn_ctl_itridx_s = VF_INT_DYN_CTLN_ITR_INDX_S;
102102
intr->dyn_ctl_intrvl_s = VF_INT_DYN_CTLN_INTERVAL_S;
103103
intr->dyn_ctl_wb_on_itr_m = VF_INT_DYN_CTLN_WB_ON_ITR_M;
104+
intr->dyn_ctl_swint_trig_m = VF_INT_DYN_CTLN_SWINT_TRIG_M;
105+
intr->dyn_ctl_sw_itridx_ena_m =
106+
VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_M;
104107

105108
spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,
106109
IDPF_VF_ITR_IDX_SPACING);

0 commit comments

Comments
 (0)