Skip to content

Commit bbea3bc

Browse files
Avinash Patillinvjw
authored andcommitted
mwifiex: wakeup and stop multiple tx queues in net_device
replace single queue function calls with equivalent multiple queue functions. Wakeup queue and stop queue calls are guarded by spin lock. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Kiran Divekar <dkiran@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
1 parent 17a60b4 commit bbea3bc

File tree

6 files changed

+63
-12
lines changed

6 files changed

+63
-12
lines changed

drivers/net/wireless/mwifiex/init.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,45 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
282282
adapter->arp_filter_size = 0;
283283
}
284284

285+
/*
286+
* This function sets trans_start per tx_queue
287+
*/
288+
void mwifiex_set_trans_start(struct net_device *dev)
289+
{
290+
int i;
291+
292+
for (i = 0; i < dev->num_tx_queues; i++)
293+
netdev_get_tx_queue(dev, i)->trans_start = jiffies;
294+
295+
dev->trans_start = jiffies;
296+
}
297+
298+
/*
299+
* This function wakes up all queues in net_device
300+
*/
301+
void mwifiex_wake_up_net_dev_queue(struct net_device *netdev,
302+
struct mwifiex_adapter *adapter)
303+
{
304+
unsigned long dev_queue_flags;
305+
306+
spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags);
307+
netif_tx_wake_all_queues(netdev);
308+
spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags);
309+
}
310+
311+
/*
312+
* This function stops all queues in net_device
313+
*/
314+
void mwifiex_stop_net_dev_queue(struct net_device *netdev,
315+
struct mwifiex_adapter *adapter)
316+
{
317+
unsigned long dev_queue_flags;
318+
319+
spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags);
320+
netif_tx_stop_all_queues(netdev);
321+
spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags);
322+
}
323+
285324
/*
286325
* This function releases the lock variables and frees the locks and
287326
* associated locks.
@@ -359,6 +398,7 @@ int mwifiex_init_lock_list(struct mwifiex_adapter *adapter)
359398
spin_lock_init(&adapter->int_lock);
360399
spin_lock_init(&adapter->main_proc_lock);
361400
spin_lock_init(&adapter->mwifiex_cmd_lock);
401+
spin_lock_init(&adapter->queue_lock);
362402
for (i = 0; i < adapter->priv_num; i++) {
363403
if (adapter->priv[i]) {
364404
priv = adapter->priv[i];

drivers/net/wireless/mwifiex/main.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ mwifiex_fill_buffer(struct sk_buff *skb)
401401
static int
402402
mwifiex_open(struct net_device *dev)
403403
{
404-
netif_start_queue(dev);
404+
netif_tx_start_all_queues(dev);
405405
return 0;
406406
}
407407

@@ -465,8 +465,8 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
465465
atomic_inc(&priv->adapter->tx_pending);
466466

467467
if (atomic_read(&priv->adapter->tx_pending) >= MAX_TX_PENDING) {
468-
netif_stop_queue(priv->netdev);
469-
dev->trans_start = jiffies;
468+
mwifiex_set_trans_start(dev);
469+
mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter);
470470
}
471471

472472
queue_work(priv->adapter->workqueue, &priv->adapter->main_work);
@@ -533,7 +533,7 @@ mwifiex_tx_timeout(struct net_device *dev)
533533

534534
dev_err(priv->adapter->dev, "%lu : Tx timeout, bss_index=%d\n",
535535
jiffies, priv->bss_index);
536-
dev->trans_start = jiffies;
536+
mwifiex_set_trans_start(dev);
537537
priv->num_tx_timeout++;
538538
}
539539

@@ -793,7 +793,8 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
793793
priv = adapter->priv[i];
794794
if (priv && priv->netdev) {
795795
if (!netif_queue_stopped(priv->netdev))
796-
netif_stop_queue(priv->netdev);
796+
mwifiex_stop_net_dev_queue(priv->netdev,
797+
adapter);
797798
if (netif_carrier_ok(priv->netdev))
798799
netif_carrier_off(priv->netdev);
799800
}

drivers/net/wireless/mwifiex/main.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,19 @@ struct mwifiex_adapter {
655655
struct mwifiex_wait_queue cmd_wait_q;
656656
u8 scan_wait_q_woken;
657657
struct cmd_ctrl_node *cmd_queued;
658+
spinlock_t queue_lock; /* lock for tx queues */
658659
};
659660

660661
int mwifiex_init_lock_list(struct mwifiex_adapter *adapter);
661662

663+
void mwifiex_set_trans_start(struct net_device *dev);
664+
665+
void mwifiex_stop_net_dev_queue(struct net_device *netdev,
666+
struct mwifiex_adapter *adapter);
667+
668+
void mwifiex_wake_up_net_dev_queue(struct net_device *netdev,
669+
struct mwifiex_adapter *adapter);
670+
662671
int mwifiex_init_fw(struct mwifiex_adapter *adapter);
663672

664673
int mwifiex_init_fw_complete(struct mwifiex_adapter *adapter);

drivers/net/wireless/mwifiex/sta_event.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv)
126126
queue_work(priv->workqueue, &priv->cfg_workqueue);
127127
}
128128
if (!netif_queue_stopped(priv->netdev))
129-
netif_stop_queue(priv->netdev);
129+
mwifiex_stop_net_dev_queue(priv->netdev, adapter);
130130
if (netif_carrier_ok(priv->netdev))
131131
netif_carrier_off(priv->netdev);
132132
/* Reset wireless stats signal info */
@@ -201,7 +201,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
201201
if (!netif_carrier_ok(priv->netdev))
202202
netif_carrier_on(priv->netdev);
203203
if (netif_queue_stopped(priv->netdev))
204-
netif_wake_queue(priv->netdev);
204+
mwifiex_wake_up_net_dev_queue(priv->netdev, adapter);
205205
break;
206206

207207
case EVENT_DEAUTHENTICATED:
@@ -292,7 +292,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
292292
priv->adhoc_is_link_sensed = false;
293293
mwifiex_clean_txrx(priv);
294294
if (!netif_queue_stopped(priv->netdev))
295-
netif_stop_queue(priv->netdev);
295+
mwifiex_stop_net_dev_queue(priv->netdev, adapter);
296296
if (netif_carrier_ok(priv->netdev))
297297
netif_carrier_off(priv->netdev);
298298
break;

drivers/net/wireless/mwifiex/sta_ioctl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
234234
"associating...\n");
235235

236236
if (!netif_queue_stopped(priv->netdev))
237-
netif_stop_queue(priv->netdev);
237+
mwifiex_stop_net_dev_queue(priv->netdev, adapter);
238238

239239
/* Clear any past association response stored for
240240
* application retrieval */
@@ -265,7 +265,7 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
265265
ret = mwifiex_check_network_compatibility(priv, bss_desc);
266266

267267
if (!netif_queue_stopped(priv->netdev))
268-
netif_stop_queue(priv->netdev);
268+
mwifiex_stop_net_dev_queue(priv->netdev, adapter);
269269

270270
if (!ret) {
271271
dev_dbg(adapter->dev, "info: network found in scan"

drivers/net/wireless/mwifiex/txrx.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
134134
if (!priv)
135135
goto done;
136136

137-
priv->netdev->trans_start = jiffies;
137+
mwifiex_set_trans_start(priv->netdev);
138138
if (!status) {
139139
priv->stats.tx_packets++;
140140
priv->stats.tx_bytes += skb->len;
@@ -152,7 +152,8 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
152152
if ((GET_BSS_ROLE(tpriv) == MWIFIEX_BSS_ROLE_STA)
153153
&& (tpriv->media_connected)) {
154154
if (netif_queue_stopped(tpriv->netdev))
155-
netif_wake_queue(tpriv->netdev);
155+
mwifiex_wake_up_net_dev_queue(tpriv->netdev,
156+
adapter);
156157
}
157158
}
158159
done:

0 commit comments

Comments
 (0)