aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/init.c
diff options
context:
space:
mode:
authorAvinash Patil <patila@marvell.com>2012-11-01 21:44:16 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-11-14 14:55:37 -0500
commit47411a06c0c44b3c9dc2feffb0d97785ec9aaa68 (patch)
tree4464ca983493e93fb688eb471d7c28ec0be78fa6 /drivers/net/wireless/mwifiex/init.c
parentd31ab3577eca0f74126ceb1d406710e620a155a0 (diff)
mwifiex: add multi-queue support
This patch adds support for multiple TX queues inside mwifiex driver. Four different queues according to WMM access categories are defined for each virtual interface. When a packet is received from netdev for transmission, tx pending count for particular queue is incremented and if tx pending count has reached upper water-mark, this queue is stopped instead of stopping all queues. Similarly when a packet is successfully transmitted from device, tx pending count is decremented per queue and if pending count falls below lower water-mark, queue operations are again resumed. This ensures that not all tranmission is blocked if traffic with particular TOS value suddenly increases. Also wake all queues after association/IBSS_join/uAP_BSS_start to enable traffic on all queues. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex/init.c')
-rw-r--r--drivers/net/wireless/mwifiex/init.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index 482faace7900..39f03ce5a5b1 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -388,9 +388,17 @@ void mwifiex_wake_up_net_dev_queue(struct net_device *netdev,
388 struct mwifiex_adapter *adapter) 388 struct mwifiex_adapter *adapter)
389{ 389{
390 unsigned long dev_queue_flags; 390 unsigned long dev_queue_flags;
391 unsigned int i;
391 392
392 spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags); 393 spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags);
393 netif_tx_wake_all_queues(netdev); 394
395 for (i = 0; i < netdev->num_tx_queues; i++) {
396 struct netdev_queue *txq = netdev_get_tx_queue(netdev, i);
397
398 if (netif_tx_queue_stopped(txq))
399 netif_tx_wake_queue(txq);
400 }
401
394 spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags); 402 spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags);
395} 403}
396 404
@@ -401,9 +409,17 @@ void mwifiex_stop_net_dev_queue(struct net_device *netdev,
401 struct mwifiex_adapter *adapter) 409 struct mwifiex_adapter *adapter)
402{ 410{
403 unsigned long dev_queue_flags; 411 unsigned long dev_queue_flags;
412 unsigned int i;
404 413
405 spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags); 414 spin_lock_irqsave(&adapter->queue_lock, dev_queue_flags);
406 netif_tx_stop_all_queues(netdev); 415
416 for (i = 0; i < netdev->num_tx_queues; i++) {
417 struct netdev_queue *txq = netdev_get_tx_queue(netdev, i);
418
419 if (!netif_tx_queue_stopped(txq))
420 netif_tx_stop_queue(txq);
421 }
422
407 spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags); 423 spin_unlock_irqrestore(&adapter->queue_lock, dev_queue_flags);
408} 424}
409 425