@@ -123,6 +123,12 @@ static void ionic_link_status_check(struct ionic_lif *lif)
123
123
link_up = link_status == IONIC_PORT_OPER_STATUS_UP ;
124
124
125
125
if (link_up ) {
126
+ if (lif -> netdev -> flags & IFF_UP && netif_running (lif -> netdev )) {
127
+ mutex_lock (& lif -> queue_lock );
128
+ ionic_start_queues (lif );
129
+ mutex_unlock (& lif -> queue_lock );
130
+ }
131
+
126
132
if (!netif_carrier_ok (netdev )) {
127
133
u32 link_speed ;
128
134
@@ -132,12 +138,6 @@ static void ionic_link_status_check(struct ionic_lif *lif)
132
138
link_speed / 1000 );
133
139
netif_carrier_on (netdev );
134
140
}
135
-
136
- if (lif -> netdev -> flags & IFF_UP && netif_running (lif -> netdev )) {
137
- mutex_lock (& lif -> queue_lock );
138
- ionic_start_queues (lif );
139
- mutex_unlock (& lif -> queue_lock );
140
- }
141
141
} else {
142
142
if (netif_carrier_ok (netdev )) {
143
143
netdev_info (netdev , "Link down\n" );
@@ -1074,22 +1074,22 @@ static int ionic_lif_addr(struct ionic_lif *lif, const u8 *addr, bool add,
1074
1074
1075
1075
static int ionic_addr_add (struct net_device * netdev , const u8 * addr )
1076
1076
{
1077
- return ionic_lif_addr (netdev_priv (netdev ), addr , true, true );
1077
+ return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR , CAN_SLEEP );
1078
1078
}
1079
1079
1080
1080
static int ionic_ndo_addr_add (struct net_device * netdev , const u8 * addr )
1081
1081
{
1082
- return ionic_lif_addr (netdev_priv (netdev ), addr , true, false );
1082
+ return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR , CAN_NOT_SLEEP );
1083
1083
}
1084
1084
1085
1085
static int ionic_addr_del (struct net_device * netdev , const u8 * addr )
1086
1086
{
1087
- return ionic_lif_addr (netdev_priv (netdev ), addr , false, true );
1087
+ return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR , CAN_SLEEP );
1088
1088
}
1089
1089
1090
1090
static int ionic_ndo_addr_del (struct net_device * netdev , const u8 * addr )
1091
1091
{
1092
- return ionic_lif_addr (netdev_priv (netdev ), addr , false, false );
1092
+ return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR , CAN_NOT_SLEEP );
1093
1093
}
1094
1094
1095
1095
static void ionic_lif_rx_mode (struct ionic_lif * lif , unsigned int rx_mode )
@@ -1129,38 +1129,10 @@ static void ionic_lif_rx_mode(struct ionic_lif *lif, unsigned int rx_mode)
1129
1129
lif -> rx_mode = rx_mode ;
1130
1130
}
1131
1131
1132
- static void _ionic_lif_rx_mode (struct ionic_lif * lif , unsigned int rx_mode ,
1133
- bool from_ndo )
1134
- {
1135
- struct ionic_deferred_work * work ;
1136
-
1137
- if (from_ndo ) {
1138
- work = kzalloc (sizeof (* work ), GFP_ATOMIC );
1139
- if (!work ) {
1140
- netdev_err (lif -> netdev , "%s OOM\n" , __func__ );
1141
- return ;
1142
- }
1143
- work -> type = IONIC_DW_TYPE_RX_MODE ;
1144
- work -> rx_mode = rx_mode ;
1145
- netdev_dbg (lif -> netdev , "deferred: rx_mode\n" );
1146
- ionic_lif_deferred_enqueue (& lif -> deferred , work );
1147
- } else {
1148
- ionic_lif_rx_mode (lif , rx_mode );
1149
- }
1150
- }
1151
-
1152
- static void ionic_dev_uc_sync (struct net_device * netdev , bool from_ndo )
1153
- {
1154
- if (from_ndo )
1155
- __dev_uc_sync (netdev , ionic_ndo_addr_add , ionic_ndo_addr_del );
1156
- else
1157
- __dev_uc_sync (netdev , ionic_addr_add , ionic_addr_del );
1158
-
1159
- }
1160
-
1161
- static void ionic_set_rx_mode (struct net_device * netdev , bool from_ndo )
1132
+ static void ionic_set_rx_mode (struct net_device * netdev , bool can_sleep )
1162
1133
{
1163
1134
struct ionic_lif * lif = netdev_priv (netdev );
1135
+ struct ionic_deferred_work * work ;
1164
1136
unsigned int nfilters ;
1165
1137
unsigned int rx_mode ;
1166
1138
@@ -1177,7 +1149,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
1177
1149
* we remove our overflow flag and check the netdev flags
1178
1150
* to see if we can disable NIC PROMISC
1179
1151
*/
1180
- ionic_dev_uc_sync (netdev , from_ndo );
1152
+ if (can_sleep )
1153
+ __dev_uc_sync (netdev , ionic_addr_add , ionic_addr_del );
1154
+ else
1155
+ __dev_uc_sync (netdev , ionic_ndo_addr_add , ionic_ndo_addr_del );
1181
1156
nfilters = le32_to_cpu (lif -> identity -> eth .max_ucast_filters );
1182
1157
if (netdev_uc_count (netdev ) + 1 > nfilters ) {
1183
1158
rx_mode |= IONIC_RX_MODE_F_PROMISC ;
@@ -1189,7 +1164,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
1189
1164
}
1190
1165
1191
1166
/* same for multicast */
1192
- ionic_dev_uc_sync (netdev , from_ndo );
1167
+ if (can_sleep )
1168
+ __dev_mc_sync (netdev , ionic_addr_add , ionic_addr_del );
1169
+ else
1170
+ __dev_mc_sync (netdev , ionic_ndo_addr_add , ionic_ndo_addr_del );
1193
1171
nfilters = le32_to_cpu (lif -> identity -> eth .max_mcast_filters );
1194
1172
if (netdev_mc_count (netdev ) > nfilters ) {
1195
1173
rx_mode |= IONIC_RX_MODE_F_ALLMULTI ;
@@ -1200,13 +1178,26 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
1200
1178
rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI ;
1201
1179
}
1202
1180
1203
- if (lif -> rx_mode != rx_mode )
1204
- _ionic_lif_rx_mode (lif , rx_mode , from_ndo );
1181
+ if (lif -> rx_mode != rx_mode ) {
1182
+ if (!can_sleep ) {
1183
+ work = kzalloc (sizeof (* work ), GFP_ATOMIC );
1184
+ if (!work ) {
1185
+ netdev_err (lif -> netdev , "%s OOM\n" , __func__ );
1186
+ return ;
1187
+ }
1188
+ work -> type = IONIC_DW_TYPE_RX_MODE ;
1189
+ work -> rx_mode = rx_mode ;
1190
+ netdev_dbg (lif -> netdev , "deferred: rx_mode\n" );
1191
+ ionic_lif_deferred_enqueue (& lif -> deferred , work );
1192
+ } else {
1193
+ ionic_lif_rx_mode (lif , rx_mode );
1194
+ }
1195
+ }
1205
1196
}
1206
1197
1207
1198
static void ionic_ndo_set_rx_mode (struct net_device * netdev )
1208
1199
{
1209
- ionic_set_rx_mode (netdev , true );
1200
+ ionic_set_rx_mode (netdev , CAN_NOT_SLEEP );
1210
1201
}
1211
1202
1212
1203
static __le64 ionic_netdev_features_to_nic (netdev_features_t features )
@@ -1625,6 +1616,24 @@ static void ionic_lif_rss_deinit(struct ionic_lif *lif)
1625
1616
ionic_lif_rss_config (lif , 0x0 , NULL , NULL );
1626
1617
}
1627
1618
1619
+ static void ionic_lif_quiesce (struct ionic_lif * lif )
1620
+ {
1621
+ struct ionic_admin_ctx ctx = {
1622
+ .work = COMPLETION_INITIALIZER_ONSTACK (ctx .work ),
1623
+ .cmd .lif_setattr = {
1624
+ .opcode = IONIC_CMD_LIF_SETATTR ,
1625
+ .index = cpu_to_le16 (lif -> index ),
1626
+ .attr = IONIC_LIF_ATTR_STATE ,
1627
+ .state = IONIC_LIF_QUIESCE ,
1628
+ },
1629
+ };
1630
+ int err ;
1631
+
1632
+ err = ionic_adminq_post_wait (lif , & ctx );
1633
+ if (err )
1634
+ netdev_err (lif -> netdev , "lif quiesce failed %d\n" , err );
1635
+ }
1636
+
1628
1637
static void ionic_txrx_disable (struct ionic_lif * lif )
1629
1638
{
1630
1639
unsigned int i ;
@@ -1639,6 +1648,8 @@ static void ionic_txrx_disable(struct ionic_lif *lif)
1639
1648
for (i = 0 ; i < lif -> nxqs ; i ++ )
1640
1649
err = ionic_qcq_disable (lif -> rxqcqs [i ], (err != - ETIMEDOUT ));
1641
1650
}
1651
+
1652
+ ionic_lif_quiesce (lif );
1642
1653
}
1643
1654
1644
1655
static void ionic_txrx_deinit (struct ionic_lif * lif )
@@ -1773,7 +1784,7 @@ static int ionic_txrx_init(struct ionic_lif *lif)
1773
1784
if (lif -> netdev -> features & NETIF_F_RXHASH )
1774
1785
ionic_lif_rss_init (lif );
1775
1786
1776
- ionic_set_rx_mode (lif -> netdev , false );
1787
+ ionic_set_rx_mode (lif -> netdev , CAN_SLEEP );
1777
1788
1778
1789
return 0 ;
1779
1790
@@ -2781,7 +2792,7 @@ static int ionic_station_set(struct ionic_lif *lif)
2781
2792
*/
2782
2793
if (!ether_addr_equal (ctx .comp .lif_getattr .mac ,
2783
2794
netdev -> dev_addr ))
2784
- ionic_lif_addr (lif , netdev -> dev_addr , true, true );
2795
+ ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR , CAN_SLEEP );
2785
2796
} else {
2786
2797
/* Update the netdev mac with the device's mac */
2787
2798
memcpy (addr .sa_data , ctx .comp .lif_getattr .mac , netdev -> addr_len );
@@ -2798,7 +2809,7 @@ static int ionic_station_set(struct ionic_lif *lif)
2798
2809
2799
2810
netdev_dbg (lif -> netdev , "adding station MAC addr %pM\n" ,
2800
2811
netdev -> dev_addr );
2801
- ionic_lif_addr (lif , netdev -> dev_addr , true, true );
2812
+ ionic_lif_addr (lif , netdev -> dev_addr , ADD_ADDR , CAN_SLEEP );
2802
2813
2803
2814
return 0 ;
2804
2815
}
@@ -2959,6 +2970,8 @@ int ionic_lif_register(struct ionic_lif *lif)
2959
2970
dev_err (lif -> ionic -> dev , "Cannot register net device, aborting\n" );
2960
2971
return err ;
2961
2972
}
2973
+
2974
+ ionic_link_status_check_request (lif , true);
2962
2975
lif -> registered = true;
2963
2976
ionic_lif_set_netdev_info (lif );
2964
2977
0 commit comments