@@ -4454,11 +4454,10 @@ int i40e_control_wait_tx_q(int seid, struct i40e_pf *pf, int pf_q,
4454
4454
}
4455
4455
4456
4456
/**
4457
- * i40e_vsi_control_tx - Start or stop a VSI's rings
4457
+ * i40e_vsi_enable_tx - Start a VSI's rings
4458
4458
* @vsi: the VSI being configured
4459
- * @enable: start or stop the rings
4460
4459
**/
4461
- static int i40e_vsi_control_tx (struct i40e_vsi * vsi , bool enable )
4460
+ static int i40e_vsi_enable_tx (struct i40e_vsi * vsi )
4462
4461
{
4463
4462
struct i40e_pf * pf = vsi -> back ;
4464
4463
int i , pf_q , ret = 0 ;
@@ -4467,7 +4466,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
4467
4466
for (i = 0 ; i < vsi -> num_queue_pairs ; i ++ , pf_q ++ ) {
4468
4467
ret = i40e_control_wait_tx_q (vsi -> seid , pf ,
4469
4468
pf_q ,
4470
- false /*is xdp*/ , enable );
4469
+ false /*is xdp*/ , true );
4471
4470
if (ret )
4472
4471
break ;
4473
4472
@@ -4476,7 +4475,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
4476
4475
4477
4476
ret = i40e_control_wait_tx_q (vsi -> seid , pf ,
4478
4477
pf_q + vsi -> alloc_queue_pairs ,
4479
- true /*is xdp*/ , enable );
4478
+ true /*is xdp*/ , true );
4480
4479
if (ret )
4481
4480
break ;
4482
4481
}
@@ -4574,32 +4573,25 @@ int i40e_control_wait_rx_q(struct i40e_pf *pf, int pf_q, bool enable)
4574
4573
}
4575
4574
4576
4575
/**
4577
- * i40e_vsi_control_rx - Start or stop a VSI's rings
4576
+ * i40e_vsi_enable_rx - Start a VSI's rings
4578
4577
* @vsi: the VSI being configured
4579
- * @enable: start or stop the rings
4580
4578
**/
4581
- static int i40e_vsi_control_rx (struct i40e_vsi * vsi , bool enable )
4579
+ static int i40e_vsi_enable_rx (struct i40e_vsi * vsi )
4582
4580
{
4583
4581
struct i40e_pf * pf = vsi -> back ;
4584
4582
int i , pf_q , ret = 0 ;
4585
4583
4586
4584
pf_q = vsi -> base_queue ;
4587
4585
for (i = 0 ; i < vsi -> num_queue_pairs ; i ++ , pf_q ++ ) {
4588
- ret = i40e_control_wait_rx_q (pf , pf_q , enable );
4586
+ ret = i40e_control_wait_rx_q (pf , pf_q , true );
4589
4587
if (ret ) {
4590
4588
dev_info (& pf -> pdev -> dev ,
4591
- "VSI seid %d Rx ring %d %sable timeout\n" ,
4592
- vsi -> seid , pf_q , ( enable ? "en" : "dis" ) );
4589
+ "VSI seid %d Rx ring %d enable timeout\n" ,
4590
+ vsi -> seid , pf_q );
4593
4591
break ;
4594
4592
}
4595
4593
}
4596
4594
4597
- /* Due to HW errata, on Rx disable only, the register can indicate done
4598
- * before it really is. Needs 50ms to be sure
4599
- */
4600
- if (!enable )
4601
- mdelay (50 );
4602
-
4603
4595
return ret ;
4604
4596
}
4605
4597
@@ -4612,29 +4604,47 @@ int i40e_vsi_start_rings(struct i40e_vsi *vsi)
4612
4604
int ret = 0 ;
4613
4605
4614
4606
/* do rx first for enable and last for disable */
4615
- ret = i40e_vsi_control_rx (vsi , true );
4607
+ ret = i40e_vsi_enable_rx (vsi );
4616
4608
if (ret )
4617
4609
return ret ;
4618
- ret = i40e_vsi_control_tx (vsi , true );
4610
+ ret = i40e_vsi_enable_tx (vsi );
4619
4611
4620
4612
return ret ;
4621
4613
}
4622
4614
4615
+ #define I40E_DISABLE_TX_GAP_MSEC 50
4616
+
4623
4617
/**
4624
4618
* i40e_vsi_stop_rings - Stop a VSI's rings
4625
4619
* @vsi: the VSI being configured
4626
4620
**/
4627
4621
void i40e_vsi_stop_rings (struct i40e_vsi * vsi )
4628
4622
{
4623
+ struct i40e_pf * pf = vsi -> back ;
4624
+ int pf_q , err , q_end ;
4625
+
4629
4626
/* When port TX is suspended, don't wait */
4630
4627
if (test_bit (__I40E_PORT_SUSPENDED , vsi -> back -> state ))
4631
4628
return i40e_vsi_stop_rings_no_wait (vsi );
4632
4629
4633
- /* do rx first for enable and last for disable
4634
- * Ignore return value, we need to shutdown whatever we can
4635
- */
4636
- i40e_vsi_control_tx (vsi , false);
4637
- i40e_vsi_control_rx (vsi , false);
4630
+ q_end = vsi -> base_queue + vsi -> num_queue_pairs ;
4631
+ for (pf_q = vsi -> base_queue ; pf_q < q_end ; pf_q ++ )
4632
+ i40e_pre_tx_queue_cfg (& pf -> hw , (u32 )pf_q , false);
4633
+
4634
+ for (pf_q = vsi -> base_queue ; pf_q < q_end ; pf_q ++ ) {
4635
+ err = i40e_control_wait_rx_q (pf , pf_q , false);
4636
+ if (err )
4637
+ dev_info (& pf -> pdev -> dev ,
4638
+ "VSI seid %d Rx ring %d dissable timeout\n" ,
4639
+ vsi -> seid , pf_q );
4640
+ }
4641
+
4642
+ msleep (I40E_DISABLE_TX_GAP_MSEC );
4643
+ pf_q = vsi -> base_queue ;
4644
+ for (pf_q = vsi -> base_queue ; pf_q < q_end ; pf_q ++ )
4645
+ wr32 (& pf -> hw , I40E_QTX_ENA (pf_q ), 0 );
4646
+
4647
+ i40e_vsi_wait_queues_disabled (vsi );
4638
4648
}
4639
4649
4640
4650
/**
@@ -7280,6 +7290,8 @@ static int i40e_validate_mqprio_qopt(struct i40e_vsi *vsi,
7280
7290
}
7281
7291
if (vsi -> num_queue_pairs <
7282
7292
(mqprio_qopt -> qopt .offset [i ] + mqprio_qopt -> qopt .count [i ])) {
7293
+ dev_err (& vsi -> back -> pdev -> dev ,
7294
+ "Failed to create traffic channel, insufficient number of queues.\n" );
7283
7295
return - EINVAL ;
7284
7296
}
7285
7297
if (sum_max_rate > i40e_get_link_speed (vsi )) {
@@ -13261,6 +13273,7 @@ static const struct net_device_ops i40e_netdev_ops = {
13261
13273
.ndo_poll_controller = i40e_netpoll ,
13262
13274
#endif
13263
13275
.ndo_setup_tc = __i40e_setup_tc ,
13276
+ .ndo_select_queue = i40e_lan_select_queue ,
13264
13277
.ndo_set_features = i40e_set_features ,
13265
13278
.ndo_set_vf_mac = i40e_ndo_set_vf_mac ,
13266
13279
.ndo_set_vf_vlan = i40e_ndo_set_vf_port_vlan ,
0 commit comments