@@ -22,6 +22,9 @@ static int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr);
22
22
static int ionic_lif_addr_del (struct ionic_lif * lif , const u8 * addr );
23
23
static void ionic_link_status_check (struct ionic_lif * lif );
24
24
25
+ static int ionic_start_queues (struct ionic_lif * lif );
26
+ static void ionic_stop_queues (struct ionic_lif * lif );
27
+
25
28
static void ionic_lif_deferred_work (struct work_struct * work )
26
29
{
27
30
struct ionic_lif * lif = container_of (work , struct ionic_lif , deferred .work );
@@ -73,6 +76,9 @@ static void ionic_link_status_check(struct ionic_lif *lif)
73
76
u16 link_status ;
74
77
bool link_up ;
75
78
79
+ if (!test_bit (IONIC_LIF_F_LINK_CHECK_REQUESTED , lif -> state ))
80
+ return ;
81
+
76
82
if (lif -> ionic -> is_mgmt_nic )
77
83
return ;
78
84
@@ -90,16 +96,16 @@ static void ionic_link_status_check(struct ionic_lif *lif)
90
96
netif_carrier_on (netdev );
91
97
}
92
98
93
- if (test_bit ( IONIC_LIF_F_UP , lif -> state ))
94
- netif_tx_wake_all_queues (lif -> netdev );
99
+ if (netif_running ( lif -> netdev ))
100
+ ionic_start_queues (lif );
95
101
} else {
96
102
if (netif_carrier_ok (netdev )) {
97
103
netdev_info (netdev , "Link down\n" );
98
104
netif_carrier_off (netdev );
99
105
}
100
106
101
- if (test_bit ( IONIC_LIF_F_UP , lif -> state ))
102
- netif_tx_stop_all_queues ( netdev );
107
+ if (netif_running ( lif -> netdev ))
108
+ ionic_stop_queues ( lif );
103
109
}
104
110
105
111
clear_bit (IONIC_LIF_F_LINK_CHECK_REQUESTED , lif -> state );
@@ -248,21 +254,6 @@ static int ionic_qcq_disable(struct ionic_qcq *qcq)
248
254
return ionic_adminq_post_wait (lif , & ctx );
249
255
}
250
256
251
- static void ionic_lif_quiesce (struct ionic_lif * lif )
252
- {
253
- struct ionic_admin_ctx ctx = {
254
- .work = COMPLETION_INITIALIZER_ONSTACK (ctx .work ),
255
- .cmd .lif_setattr = {
256
- .opcode = IONIC_CMD_LIF_SETATTR ,
257
- .attr = IONIC_LIF_ATTR_STATE ,
258
- .index = lif -> index ,
259
- .state = IONIC_LIF_DISABLE
260
- },
261
- };
262
-
263
- ionic_adminq_post_wait (lif , & ctx );
264
- }
265
-
266
257
static void ionic_lif_qcq_deinit (struct ionic_lif * lif , struct ionic_qcq * qcq )
267
258
{
268
259
struct ionic_dev * idev = & lif -> ionic -> idev ;
@@ -615,6 +606,10 @@ static int ionic_lif_txq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
615
606
dev_dbg (dev , "txq_init.ring_base 0x%llx\n" , ctx .cmd .q_init .ring_base );
616
607
dev_dbg (dev , "txq_init.ring_size %d\n" , ctx .cmd .q_init .ring_size );
617
608
609
+ q -> tail = q -> info ;
610
+ q -> head = q -> tail ;
611
+ cq -> tail = cq -> info ;
612
+
618
613
err = ionic_adminq_post_wait (lif , & ctx );
619
614
if (err )
620
615
return err ;
@@ -660,6 +655,10 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
660
655
dev_dbg (dev , "rxq_init.ring_base 0x%llx\n" , ctx .cmd .q_init .ring_base );
661
656
dev_dbg (dev , "rxq_init.ring_size %d\n" , ctx .cmd .q_init .ring_size );
662
657
658
+ q -> tail = q -> info ;
659
+ q -> head = q -> tail ;
660
+ cq -> tail = cq -> info ;
661
+
663
662
err = ionic_adminq_post_wait (lif , & ctx );
664
663
if (err )
665
664
return err ;
@@ -1473,6 +1472,7 @@ static void ionic_txrx_deinit(struct ionic_lif *lif)
1473
1472
ionic_rx_empty (& lif -> rxqcqs [i ].qcq -> q );
1474
1473
}
1475
1474
}
1475
+ lif -> rx_mode = 0 ;
1476
1476
}
1477
1477
1478
1478
static void ionic_txrx_free (struct ionic_lif * lif )
@@ -1582,15 +1582,15 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
1582
1582
int i , err ;
1583
1583
1584
1584
for (i = 0 ; i < lif -> nxqs ; i ++ ) {
1585
- err = ionic_qcq_enable (lif -> txqcqs [i ].qcq );
1585
+ ionic_rx_fill (& lif -> rxqcqs [i ].qcq -> q );
1586
+ err = ionic_qcq_enable (lif -> rxqcqs [i ].qcq );
1586
1587
if (err )
1587
1588
goto err_out ;
1588
1589
1589
- ionic_rx_fill (& lif -> rxqcqs [i ].qcq -> q );
1590
- err = ionic_qcq_enable (lif -> rxqcqs [i ].qcq );
1590
+ err = ionic_qcq_enable (lif -> txqcqs [i ].qcq );
1591
1591
if (err ) {
1592
1592
if (err != - ETIMEDOUT )
1593
- ionic_qcq_disable (lif -> txqcqs [i ].qcq );
1593
+ ionic_qcq_disable (lif -> rxqcqs [i ].qcq );
1594
1594
goto err_out ;
1595
1595
}
1596
1596
}
@@ -1599,17 +1599,34 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
1599
1599
1600
1600
err_out :
1601
1601
while (i -- ) {
1602
- err = ionic_qcq_disable (lif -> rxqcqs [i ].qcq );
1602
+ err = ionic_qcq_disable (lif -> txqcqs [i ].qcq );
1603
1603
if (err == - ETIMEDOUT )
1604
1604
break ;
1605
- err = ionic_qcq_disable (lif -> txqcqs [i ].qcq );
1605
+ err = ionic_qcq_disable (lif -> rxqcqs [i ].qcq );
1606
1606
if (err == - ETIMEDOUT )
1607
1607
break ;
1608
1608
}
1609
1609
1610
1610
return err ;
1611
1611
}
1612
1612
1613
+ static int ionic_start_queues (struct ionic_lif * lif )
1614
+ {
1615
+ int err ;
1616
+
1617
+ if (test_and_set_bit (IONIC_LIF_F_UP , lif -> state ))
1618
+ return 0 ;
1619
+
1620
+ err = ionic_txrx_enable (lif );
1621
+ if (err ) {
1622
+ clear_bit (IONIC_LIF_F_UP , lif -> state );
1623
+ return err ;
1624
+ }
1625
+ netif_tx_wake_all_queues (lif -> netdev );
1626
+
1627
+ return 0 ;
1628
+ }
1629
+
1613
1630
int ionic_open (struct net_device * netdev )
1614
1631
{
1615
1632
struct ionic_lif * lif = netdev_priv (netdev );
@@ -1621,54 +1638,42 @@ int ionic_open(struct net_device *netdev)
1621
1638
1622
1639
err = ionic_txrx_init (lif );
1623
1640
if (err )
1624
- goto err_txrx_free ;
1625
-
1626
- err = ionic_txrx_enable (lif );
1627
- if (err )
1628
- goto err_txrx_deinit ;
1629
-
1630
- netif_set_real_num_tx_queues (netdev , lif -> nxqs );
1631
- netif_set_real_num_rx_queues (netdev , lif -> nxqs );
1632
-
1633
- set_bit (IONIC_LIF_F_UP , lif -> state );
1641
+ goto err_out ;
1634
1642
1635
- ionic_link_status_check_request (lif );
1636
- if (netif_carrier_ok (netdev ))
1637
- netif_tx_wake_all_queues (netdev );
1643
+ /* don't start the queues until we have link */
1644
+ if (netif_carrier_ok (netdev )) {
1645
+ err = ionic_start_queues (lif );
1646
+ if (err )
1647
+ goto err_txrx_deinit ;
1648
+ }
1638
1649
1639
1650
return 0 ;
1640
1651
1641
1652
err_txrx_deinit :
1642
1653
ionic_txrx_deinit (lif );
1643
- err_txrx_free :
1654
+ err_out :
1644
1655
ionic_txrx_free (lif );
1645
1656
return err ;
1646
1657
}
1647
1658
1648
- int ionic_stop (struct net_device * netdev )
1659
+ static void ionic_stop_queues (struct ionic_lif * lif )
1649
1660
{
1650
- struct ionic_lif * lif = netdev_priv ( netdev );
1651
- int err = 0 ;
1661
+ if (! test_and_clear_bit ( IONIC_LIF_F_UP , lif -> state ))
1662
+ return ;
1652
1663
1653
- if (!test_bit (IONIC_LIF_F_UP , lif -> state )) {
1654
- dev_dbg (lif -> ionic -> dev , "%s: %s state=DOWN\n" ,
1655
- __func__ , lif -> name );
1656
- return 0 ;
1657
- }
1658
- dev_dbg (lif -> ionic -> dev , "%s: %s state=UP\n" , __func__ , lif -> name );
1659
- clear_bit (IONIC_LIF_F_UP , lif -> state );
1664
+ ionic_txrx_disable (lif );
1665
+ netif_tx_disable (lif -> netdev );
1666
+ }
1660
1667
1661
- /* carrier off before disabling queues to avoid watchdog timeout */
1662
- netif_carrier_off (netdev );
1663
- netif_tx_stop_all_queues (netdev );
1664
- netif_tx_disable (netdev );
1668
+ int ionic_stop (struct net_device * netdev )
1669
+ {
1670
+ struct ionic_lif * lif = netdev_priv (netdev );
1665
1671
1666
- ionic_txrx_disable (lif );
1667
- ionic_lif_quiesce (lif );
1672
+ ionic_stop_queues (lif );
1668
1673
ionic_txrx_deinit (lif );
1669
1674
ionic_txrx_free (lif );
1670
1675
1671
- return err ;
1676
+ return 0 ;
1672
1677
}
1673
1678
1674
1679
static int ionic_get_vf_config (struct net_device * netdev ,
0 commit comments