88#include <linux/pci.h>
99#include <linux/netdevice.h>
1010#include <linux/etherdevice.h>
11+ #include <linux/jiffies.h>
1112
1213#include "octep_config.h"
1314#include "octep_main.h"
@@ -327,12 +328,14 @@ static void octep_setup_iq_regs_cnxk_pf(struct octep_device *oct, int iq_no)
327328}
328329
329330/* Setup registers for a hardware Rx Queue */
330- static void octep_setup_oq_regs_cnxk_pf (struct octep_device * oct , int oq_no )
331+ static int octep_setup_oq_regs_cnxk_pf (struct octep_device * oct , int oq_no )
331332{
332- u64 reg_val ;
333- u64 oq_ctl = 0ULL ;
334- u32 time_threshold = 0 ;
335333 struct octep_oq * oq = oct -> oq [oq_no ];
334+ unsigned long t_out_jiffies ;
335+ u32 time_threshold = 0 ;
336+ u64 oq_ctl = 0ULL ;
337+ u64 reg_ba_val ;
338+ u64 reg_val ;
336339
337340 oq_no += CFG_GET_PORTS_PF_SRN (oct -> conf );
338341 reg_val = octep_read_csr64 (oct , CNXK_SDP_R_OUT_CONTROL (oq_no ));
@@ -343,6 +346,36 @@ static void octep_setup_oq_regs_cnxk_pf(struct octep_device *oct, int oq_no)
343346 reg_val = octep_read_csr64 (oct , CNXK_SDP_R_OUT_CONTROL (oq_no ));
344347 } while (!(reg_val & CNXK_R_OUT_CTL_IDLE ));
345348 }
349+ octep_write_csr64 (oct , CNXK_SDP_R_OUT_WMARK (oq_no ), oq -> max_count );
350+ /* Wait for WMARK to get applied */
351+ usleep_range (10 , 15 );
352+
353+ octep_write_csr64 (oct , CNXK_SDP_R_OUT_SLIST_BADDR (oq_no ),
354+ oq -> desc_ring_dma );
355+ octep_write_csr64 (oct , CNXK_SDP_R_OUT_SLIST_RSIZE (oq_no ),
356+ oq -> max_count );
357+ reg_ba_val = octep_read_csr64 (oct , CNXK_SDP_R_OUT_SLIST_BADDR (oq_no ));
358+
359+ if (reg_ba_val != oq -> desc_ring_dma ) {
360+ t_out_jiffies = jiffies + 10 * HZ ;
361+ do {
362+ if (reg_ba_val == ULLONG_MAX )
363+ return - EFAULT ;
364+ octep_write_csr64 (oct ,
365+ CNXK_SDP_R_OUT_SLIST_BADDR (oq_no ),
366+ oq -> desc_ring_dma );
367+ octep_write_csr64 (oct ,
368+ CNXK_SDP_R_OUT_SLIST_RSIZE (oq_no ),
369+ oq -> max_count );
370+ reg_ba_val =
371+ octep_read_csr64 (oct ,
372+ CNXK_SDP_R_OUT_SLIST_BADDR (oq_no ));
373+ } while ((reg_ba_val != oq -> desc_ring_dma ) &&
374+ time_before (jiffies , t_out_jiffies ));
375+
376+ if (reg_ba_val != oq -> desc_ring_dma )
377+ return - EAGAIN ;
378+ }
346379
347380 reg_val &= ~(CNXK_R_OUT_CTL_IMODE );
348381 reg_val &= ~(CNXK_R_OUT_CTL_ROR_P );
@@ -356,10 +389,6 @@ static void octep_setup_oq_regs_cnxk_pf(struct octep_device *oct, int oq_no)
356389 reg_val |= (CNXK_R_OUT_CTL_ES_P );
357390
358391 octep_write_csr64 (oct , CNXK_SDP_R_OUT_CONTROL (oq_no ), reg_val );
359- octep_write_csr64 (oct , CNXK_SDP_R_OUT_SLIST_BADDR (oq_no ),
360- oq -> desc_ring_dma );
361- octep_write_csr64 (oct , CNXK_SDP_R_OUT_SLIST_RSIZE (oq_no ),
362- oq -> max_count );
363392
364393 oq_ctl = octep_read_csr64 (oct , CNXK_SDP_R_OUT_CONTROL (oq_no ));
365394
@@ -385,6 +414,7 @@ static void octep_setup_oq_regs_cnxk_pf(struct octep_device *oct, int oq_no)
385414 reg_val &= ~0xFFFFFFFFULL ;
386415 reg_val |= CFG_GET_OQ_WMARK (oct -> conf );
387416 octep_write_csr64 (oct , CNXK_SDP_R_OUT_WMARK (oq_no ), reg_val );
417+ return 0 ;
388418}
389419
390420/* Setup registers for a PF mailbox */
@@ -720,14 +750,26 @@ static void octep_enable_interrupts_cnxk_pf(struct octep_device *oct)
720750/* Disable all interrupts */
721751static void octep_disable_interrupts_cnxk_pf (struct octep_device * oct )
722752{
723- u64 intr_mask = 0ULL ;
753+ u64 reg_val , intr_mask = 0ULL ;
724754 int srn , num_rings , i ;
725755
726756 srn = CFG_GET_PORTS_PF_SRN (oct -> conf );
727757 num_rings = CFG_GET_PORTS_ACTIVE_IO_RINGS (oct -> conf );
728758
729- for (i = 0 ; i < num_rings ; i ++ )
730- intr_mask |= (0x1ULL << (srn + i ));
759+ for (i = 0 ; i < num_rings ; i ++ ) {
760+ intr_mask |= BIT_ULL (srn + i );
761+ reg_val = octep_read_csr64 (oct ,
762+ CNXK_SDP_R_IN_INT_LEVELS (srn + i ));
763+ reg_val &= ~CNXK_INT_ENA_BIT ;
764+ octep_write_csr64 (oct ,
765+ CNXK_SDP_R_IN_INT_LEVELS (srn + i ), reg_val );
766+
767+ reg_val = octep_read_csr64 (oct ,
768+ CNXK_SDP_R_OUT_INT_LEVELS (srn + i ));
769+ reg_val &= ~CNXK_INT_ENA_BIT ;
770+ octep_write_csr64 (oct ,
771+ CNXK_SDP_R_OUT_INT_LEVELS (srn + i ), reg_val );
772+ }
731773
732774 octep_write_csr64 (oct , CNXK_SDP_EPF_IRERR_RINT_ENA_W1C , intr_mask );
733775 octep_write_csr64 (oct , CNXK_SDP_EPF_ORERR_RINT_ENA_W1C , intr_mask );
0 commit comments