diff options
author | Avinash Patil <patila@marvell.com> | 2014-11-05 06:34:27 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-11-11 16:31:12 -0500 |
commit | ec4a16b4d287d4d0f7465ae7e61ce4e9021d715c (patch) | |
tree | 779b020cfe1b7ac9156c1fd75d74d5cecc7b83fe | |
parent | d385c5c2860075e1f3e03074f043dd8a828b2862 (diff) |
mwifiex: rx workqueue support for USB interface
This patch adds RX workqueue support for USB interfaces.
Currently rx_pending is applicable for cmd/events and Rx
data in USB interface. Let's use it only for Rx data.
Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/mwifiex/init.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/usb.c | 9 |
4 files changed, 5 insertions, 32 deletions
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c index 580aa45ec4bc..bd740b630b31 100644 --- a/drivers/net/wireless/mwifiex/init.c +++ b/drivers/net/wireless/mwifiex/init.c | |||
@@ -449,7 +449,6 @@ int mwifiex_init_lock_list(struct mwifiex_adapter *adapter) | |||
449 | spin_lock_init(&adapter->scan_pending_q_lock); | 449 | spin_lock_init(&adapter->scan_pending_q_lock); |
450 | spin_lock_init(&adapter->rx_proc_lock); | 450 | spin_lock_init(&adapter->rx_proc_lock); |
451 | 451 | ||
452 | skb_queue_head_init(&adapter->usb_rx_data_q); | ||
453 | skb_queue_head_init(&adapter->rx_data_q); | 452 | skb_queue_head_init(&adapter->rx_data_q); |
454 | 453 | ||
455 | for (i = 0; i < adapter->priv_num; ++i) { | 454 | for (i = 0; i < adapter->priv_num; ++i) { |
@@ -668,19 +667,6 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter) | |||
668 | 667 | ||
669 | spin_lock(&adapter->mwifiex_lock); | 668 | spin_lock(&adapter->mwifiex_lock); |
670 | 669 | ||
671 | if (adapter->if_ops.data_complete) { | ||
672 | while ((skb = skb_dequeue(&adapter->usb_rx_data_q))) { | ||
673 | struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb); | ||
674 | |||
675 | priv = adapter->priv[rx_info->bss_num]; | ||
676 | if (priv) | ||
677 | priv->stats.rx_dropped++; | ||
678 | |||
679 | dev_kfree_skb_any(skb); | ||
680 | adapter->if_ops.data_complete(adapter); | ||
681 | } | ||
682 | } | ||
683 | |||
684 | mwifiex_adapter_cleanup(adapter); | 670 | mwifiex_adapter_cleanup(adapter); |
685 | 671 | ||
686 | spin_unlock(&adapter->mwifiex_lock); | 672 | spin_unlock(&adapter->mwifiex_lock); |
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index f26420dbab6f..cb23ca3653b5 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c | |||
@@ -178,7 +178,6 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) | |||
178 | { | 178 | { |
179 | int ret = 0; | 179 | int ret = 0; |
180 | unsigned long flags; | 180 | unsigned long flags; |
181 | struct sk_buff *skb; | ||
182 | 181 | ||
183 | spin_lock_irqsave(&adapter->main_proc_lock, flags); | 182 | spin_lock_irqsave(&adapter->main_proc_lock, flags); |
184 | 183 | ||
@@ -253,11 +252,6 @@ process_start: | |||
253 | } | 252 | } |
254 | } | 253 | } |
255 | 254 | ||
256 | /* Check Rx data for USB */ | ||
257 | if (adapter->iface_type == MWIFIEX_USB) | ||
258 | while ((skb = skb_dequeue(&adapter->usb_rx_data_q))) | ||
259 | mwifiex_handle_rx_packet(adapter, skb); | ||
260 | |||
261 | /* Check for event */ | 255 | /* Check for event */ |
262 | if (adapter->event_received) { | 256 | if (adapter->event_received) { |
263 | adapter->event_received = false; | 257 | adapter->event_received = false; |
@@ -864,7 +858,7 @@ mwifiex_add_card(void *card, struct semaphore *sem, | |||
864 | adapter->cmd_wait_q.status = 0; | 858 | adapter->cmd_wait_q.status = 0; |
865 | adapter->scan_wait_q_woken = false; | 859 | adapter->scan_wait_q_woken = false; |
866 | 860 | ||
867 | if (num_possible_cpus() > 1) { | 861 | if ((num_possible_cpus() > 1) || adapter->iface_type == MWIFIEX_USB) { |
868 | adapter->rx_work_enabled = true; | 862 | adapter->rx_work_enabled = true; |
869 | pr_notice("rx work enabled, cpus %d\n", num_possible_cpus()); | 863 | pr_notice("rx work enabled, cpus %d\n", num_possible_cpus()); |
870 | } | 864 | } |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index fb47731d45a6..c7fdd8238f45 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -106,10 +106,7 @@ enum { | |||
106 | */ | 106 | */ |
107 | #define IS_CARD_RX_RCVD(adapter) (adapter->cmd_resp_received || \ | 107 | #define IS_CARD_RX_RCVD(adapter) (adapter->cmd_resp_received || \ |
108 | adapter->event_received || \ | 108 | adapter->event_received || \ |
109 | ((adapter->iface_type != MWIFIEX_USB) && \ | 109 | adapter->data_received) |
110 | adapter->data_received) || \ | ||
111 | ((adapter->iface_type == MWIFIEX_USB) && \ | ||
112 | !skb_queue_empty(&adapter->usb_rx_data_q))) | ||
113 | 110 | ||
114 | #define MWIFIEX_TYPE_CMD 1 | 111 | #define MWIFIEX_TYPE_CMD 1 |
115 | #define MWIFIEX_TYPE_DATA 0 | 112 | #define MWIFIEX_TYPE_DATA 0 |
@@ -766,7 +763,6 @@ struct mwifiex_adapter { | |||
766 | spinlock_t scan_pending_q_lock; | 763 | spinlock_t scan_pending_q_lock; |
767 | /* spin lock for RX processing routine */ | 764 | /* spin lock for RX processing routine */ |
768 | spinlock_t rx_proc_lock; | 765 | spinlock_t rx_proc_lock; |
769 | struct sk_buff_head usb_rx_data_q; | ||
770 | u32 scan_processing; | 766 | u32 scan_processing; |
771 | u16 region_code; | 767 | u16 region_code; |
772 | struct mwifiex_802_11d_domain_reg domain_reg; | 768 | struct mwifiex_802_11d_domain_reg domain_reg; |
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c index 4371e12b36f3..00afcf63845e 100644 --- a/drivers/net/wireless/mwifiex/usb.c +++ b/drivers/net/wireless/mwifiex/usb.c | |||
@@ -125,8 +125,10 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, | |||
125 | dev_err(dev, "DATA: skb->len too large\n"); | 125 | dev_err(dev, "DATA: skb->len too large\n"); |
126 | return -1; | 126 | return -1; |
127 | } | 127 | } |
128 | skb_queue_tail(&adapter->usb_rx_data_q, skb); | 128 | |
129 | skb_queue_tail(&adapter->rx_data_q, skb); | ||
129 | adapter->data_received = true; | 130 | adapter->data_received = true; |
131 | atomic_inc(&adapter->rx_pending); | ||
130 | break; | 132 | break; |
131 | default: | 133 | default: |
132 | dev_err(dev, "%s: unknown endport %#x\n", __func__, ep); | 134 | dev_err(dev, "%s: unknown endport %#x\n", __func__, ep); |
@@ -176,7 +178,6 @@ static void mwifiex_usb_rx_complete(struct urb *urb) | |||
176 | else | 178 | else |
177 | skb_put(skb, recv_length - skb->len); | 179 | skb_put(skb, recv_length - skb->len); |
178 | 180 | ||
179 | atomic_inc(&adapter->rx_pending); | ||
180 | status = mwifiex_usb_recv(adapter, skb, context->ep); | 181 | status = mwifiex_usb_recv(adapter, skb, context->ep); |
181 | 182 | ||
182 | dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n", | 183 | dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n", |
@@ -191,7 +192,6 @@ static void mwifiex_usb_rx_complete(struct urb *urb) | |||
191 | if (card->rx_cmd_ep == context->ep) | 192 | if (card->rx_cmd_ep == context->ep) |
192 | return; | 193 | return; |
193 | } else { | 194 | } else { |
194 | atomic_dec(&adapter->rx_pending); | ||
195 | if (status == -1) | 195 | if (status == -1) |
196 | dev_err(adapter->dev, | 196 | dev_err(adapter->dev, |
197 | "received data processing failed!\n"); | 197 | "received data processing failed!\n"); |
@@ -962,7 +962,6 @@ static void mwifiex_submit_rx_urb(struct mwifiex_adapter *adapter, u8 ep) | |||
962 | static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter, | 962 | static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter, |
963 | struct sk_buff *skb) | 963 | struct sk_buff *skb) |
964 | { | 964 | { |
965 | atomic_dec(&adapter->rx_pending); | ||
966 | mwifiex_submit_rx_urb(adapter, MWIFIEX_USB_EP_CMD_EVENT); | 965 | mwifiex_submit_rx_urb(adapter, MWIFIEX_USB_EP_CMD_EVENT); |
967 | 966 | ||
968 | return 0; | 967 | return 0; |
@@ -970,8 +969,6 @@ static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter, | |||
970 | 969 | ||
971 | static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter) | 970 | static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter) |
972 | { | 971 | { |
973 | atomic_dec(&adapter->rx_pending); | ||
974 | |||
975 | return 0; | 972 | return 0; |
976 | } | 973 | } |
977 | 974 | ||