diff options
author | Avinash Patil <patila@marvell.com> | 2012-11-01 21:44:16 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-11-14 14:55:37 -0500 |
commit | 47411a06c0c44b3c9dc2feffb0d97785ec9aaa68 (patch) | |
tree | 4464ca983493e93fb688eb471d7c28ec0be78fa6 /drivers/net/wireless/mwifiex/init.c | |
parent | d31ab3577eca0f74126ceb1d406710e620a155a0 (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.c | 20 |
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 | ||