aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvinash Patil <patila@marvell.com>2014-11-05 06:34:27 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-11-11 16:31:12 -0500
commitec4a16b4d287d4d0f7465ae7e61ce4e9021d715c (patch)
tree779b020cfe1b7ac9156c1fd75d74d5cecc7b83fe
parentd385c5c2860075e1f3e03074f043dd8a828b2862 (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.c14
-rw-r--r--drivers/net/wireless/mwifiex/main.c8
-rw-r--r--drivers/net/wireless/mwifiex/main.h6
-rw-r--r--drivers/net/wireless/mwifiex/usb.c9
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)
962static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter, 962static 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
971static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter) 970static 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