@@ -123,6 +123,12 @@ static void ionic_link_status_check(struct ionic_lif *lif)
123123 link_up = link_status == IONIC_PORT_OPER_STATUS_UP ;
124124
125125 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+
126132 if (!netif_carrier_ok (netdev )) {
127133 u32 link_speed ;
128134
@@ -132,12 +138,6 @@ static void ionic_link_status_check(struct ionic_lif *lif)
132138 link_speed / 1000 );
133139 netif_carrier_on (netdev );
134140 }
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- }
141141 } else {
142142 if (netif_carrier_ok (netdev )) {
143143 netdev_info (netdev , "Link down\n" );
@@ -1074,22 +1074,22 @@ static int ionic_lif_addr(struct ionic_lif *lif, const u8 *addr, bool add,
10741074
10751075static int ionic_addr_add (struct net_device * netdev , const u8 * addr )
10761076{
1077- return ionic_lif_addr (netdev_priv (netdev ), addr , true, true );
1077+ return ionic_lif_addr (netdev_priv (netdev ), addr , ADD_ADDR , CAN_SLEEP );
10781078}
10791079
10801080static int ionic_ndo_addr_add (struct net_device * netdev , const u8 * addr )
10811081{
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 );
10831083}
10841084
10851085static int ionic_addr_del (struct net_device * netdev , const u8 * addr )
10861086{
1087- return ionic_lif_addr (netdev_priv (netdev ), addr , false, true );
1087+ return ionic_lif_addr (netdev_priv (netdev ), addr , DEL_ADDR , CAN_SLEEP );
10881088}
10891089
10901090static int ionic_ndo_addr_del (struct net_device * netdev , const u8 * addr )
10911091{
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 );
10931093}
10941094
10951095static 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)
11291129 lif -> rx_mode = rx_mode ;
11301130}
11311131
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 )
11621133{
11631134 struct ionic_lif * lif = netdev_priv (netdev );
1135+ struct ionic_deferred_work * work ;
11641136 unsigned int nfilters ;
11651137 unsigned int rx_mode ;
11661138
@@ -1177,7 +1149,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
11771149 * we remove our overflow flag and check the netdev flags
11781150 * to see if we can disable NIC PROMISC
11791151 */
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 );
11811156 nfilters = le32_to_cpu (lif -> identity -> eth .max_ucast_filters );
11821157 if (netdev_uc_count (netdev ) + 1 > nfilters ) {
11831158 rx_mode |= IONIC_RX_MODE_F_PROMISC ;
@@ -1189,7 +1164,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
11891164 }
11901165
11911166 /* 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 );
11931171 nfilters = le32_to_cpu (lif -> identity -> eth .max_mcast_filters );
11941172 if (netdev_mc_count (netdev ) > nfilters ) {
11951173 rx_mode |= IONIC_RX_MODE_F_ALLMULTI ;
@@ -1200,13 +1178,26 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
12001178 rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI ;
12011179 }
12021180
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+ }
12051196}
12061197
12071198static void ionic_ndo_set_rx_mode (struct net_device * netdev )
12081199{
1209- ionic_set_rx_mode (netdev , true );
1200+ ionic_set_rx_mode (netdev , CAN_NOT_SLEEP );
12101201}
12111202
12121203static __le64 ionic_netdev_features_to_nic (netdev_features_t features )
@@ -1625,6 +1616,24 @@ static void ionic_lif_rss_deinit(struct ionic_lif *lif)
16251616 ionic_lif_rss_config (lif , 0x0 , NULL , NULL );
16261617}
16271618
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+
16281637static void ionic_txrx_disable (struct ionic_lif * lif )
16291638{
16301639 unsigned int i ;
@@ -1639,6 +1648,8 @@ static void ionic_txrx_disable(struct ionic_lif *lif)
16391648 for (i = 0 ; i < lif -> nxqs ; i ++ )
16401649 err = ionic_qcq_disable (lif -> rxqcqs [i ], (err != - ETIMEDOUT ));
16411650 }
1651+
1652+ ionic_lif_quiesce (lif );
16421653}
16431654
16441655static void ionic_txrx_deinit (struct ionic_lif * lif )
@@ -1773,7 +1784,7 @@ static int ionic_txrx_init(struct ionic_lif *lif)
17731784 if (lif -> netdev -> features & NETIF_F_RXHASH )
17741785 ionic_lif_rss_init (lif );
17751786
1776- ionic_set_rx_mode (lif -> netdev , false );
1787+ ionic_set_rx_mode (lif -> netdev , CAN_SLEEP );
17771788
17781789 return 0 ;
17791790
@@ -2781,7 +2792,7 @@ static int ionic_station_set(struct ionic_lif *lif)
27812792 */
27822793 if (!ether_addr_equal (ctx .comp .lif_getattr .mac ,
27832794 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 );
27852796 } else {
27862797 /* Update the netdev mac with the device's mac */
27872798 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)
27982809
27992810 netdev_dbg (lif -> netdev , "adding station MAC addr %pM\n" ,
28002811 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 );
28022813
28032814 return 0 ;
28042815}
@@ -2959,6 +2970,8 @@ int ionic_lif_register(struct ionic_lif *lif)
29592970 dev_err (lif -> ionic -> dev , "Cannot register net device, aborting\n" );
29602971 return err ;
29612972 }
2973+
2974+ ionic_link_status_check_request (lif , true);
29622975 lif -> registered = true;
29632976 ionic_lif_set_netdev_info (lif );
29642977
0 commit comments