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>
This commit is contained in:
parent
d385c5c286
commit
ec4a16b4d2
4 changed files with 5 additions and 32 deletions
|
@ -449,7 +449,6 @@ int mwifiex_init_lock_list(struct mwifiex_adapter *adapter)
|
||||||
spin_lock_init(&adapter->scan_pending_q_lock);
|
spin_lock_init(&adapter->scan_pending_q_lock);
|
||||||
spin_lock_init(&adapter->rx_proc_lock);
|
spin_lock_init(&adapter->rx_proc_lock);
|
||||||
|
|
||||||
skb_queue_head_init(&adapter->usb_rx_data_q);
|
|
||||||
skb_queue_head_init(&adapter->rx_data_q);
|
skb_queue_head_init(&adapter->rx_data_q);
|
||||||
|
|
||||||
for (i = 0; i < adapter->priv_num; ++i) {
|
for (i = 0; i < adapter->priv_num; ++i) {
|
||||||
|
@ -668,19 +667,6 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
|
||||||
|
|
||||||
spin_lock(&adapter->mwifiex_lock);
|
spin_lock(&adapter->mwifiex_lock);
|
||||||
|
|
||||||
if (adapter->if_ops.data_complete) {
|
|
||||||
while ((skb = skb_dequeue(&adapter->usb_rx_data_q))) {
|
|
||||||
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
|
|
||||||
|
|
||||||
priv = adapter->priv[rx_info->bss_num];
|
|
||||||
if (priv)
|
|
||||||
priv->stats.rx_dropped++;
|
|
||||||
|
|
||||||
dev_kfree_skb_any(skb);
|
|
||||||
adapter->if_ops.data_complete(adapter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mwifiex_adapter_cleanup(adapter);
|
mwifiex_adapter_cleanup(adapter);
|
||||||
|
|
||||||
spin_unlock(&adapter->mwifiex_lock);
|
spin_unlock(&adapter->mwifiex_lock);
|
||||||
|
|
|
@ -178,7 +178,6 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct sk_buff *skb;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&adapter->main_proc_lock, flags);
|
spin_lock_irqsave(&adapter->main_proc_lock, flags);
|
||||||
|
|
||||||
|
@ -253,11 +252,6 @@ process_start:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check Rx data for USB */
|
|
||||||
if (adapter->iface_type == MWIFIEX_USB)
|
|
||||||
while ((skb = skb_dequeue(&adapter->usb_rx_data_q)))
|
|
||||||
mwifiex_handle_rx_packet(adapter, skb);
|
|
||||||
|
|
||||||
/* Check for event */
|
/* Check for event */
|
||||||
if (adapter->event_received) {
|
if (adapter->event_received) {
|
||||||
adapter->event_received = false;
|
adapter->event_received = false;
|
||||||
|
@ -864,7 +858,7 @@ mwifiex_add_card(void *card, struct semaphore *sem,
|
||||||
adapter->cmd_wait_q.status = 0;
|
adapter->cmd_wait_q.status = 0;
|
||||||
adapter->scan_wait_q_woken = false;
|
adapter->scan_wait_q_woken = false;
|
||||||
|
|
||||||
if (num_possible_cpus() > 1) {
|
if ((num_possible_cpus() > 1) || adapter->iface_type == MWIFIEX_USB) {
|
||||||
adapter->rx_work_enabled = true;
|
adapter->rx_work_enabled = true;
|
||||||
pr_notice("rx work enabled, cpus %d\n", num_possible_cpus());
|
pr_notice("rx work enabled, cpus %d\n", num_possible_cpus());
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,10 +106,7 @@ enum {
|
||||||
*/
|
*/
|
||||||
#define IS_CARD_RX_RCVD(adapter) (adapter->cmd_resp_received || \
|
#define IS_CARD_RX_RCVD(adapter) (adapter->cmd_resp_received || \
|
||||||
adapter->event_received || \
|
adapter->event_received || \
|
||||||
((adapter->iface_type != MWIFIEX_USB) && \
|
adapter->data_received)
|
||||||
adapter->data_received) || \
|
|
||||||
((adapter->iface_type == MWIFIEX_USB) && \
|
|
||||||
!skb_queue_empty(&adapter->usb_rx_data_q)))
|
|
||||||
|
|
||||||
#define MWIFIEX_TYPE_CMD 1
|
#define MWIFIEX_TYPE_CMD 1
|
||||||
#define MWIFIEX_TYPE_DATA 0
|
#define MWIFIEX_TYPE_DATA 0
|
||||||
|
@ -766,7 +763,6 @@ struct mwifiex_adapter {
|
||||||
spinlock_t scan_pending_q_lock;
|
spinlock_t scan_pending_q_lock;
|
||||||
/* spin lock for RX processing routine */
|
/* spin lock for RX processing routine */
|
||||||
spinlock_t rx_proc_lock;
|
spinlock_t rx_proc_lock;
|
||||||
struct sk_buff_head usb_rx_data_q;
|
|
||||||
u32 scan_processing;
|
u32 scan_processing;
|
||||||
u16 region_code;
|
u16 region_code;
|
||||||
struct mwifiex_802_11d_domain_reg domain_reg;
|
struct mwifiex_802_11d_domain_reg domain_reg;
|
||||||
|
|
|
@ -125,8 +125,10 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
|
||||||
dev_err(dev, "DATA: skb->len too large\n");
|
dev_err(dev, "DATA: skb->len too large\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
skb_queue_tail(&adapter->usb_rx_data_q, skb);
|
|
||||||
|
skb_queue_tail(&adapter->rx_data_q, skb);
|
||||||
adapter->data_received = true;
|
adapter->data_received = true;
|
||||||
|
atomic_inc(&adapter->rx_pending);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(dev, "%s: unknown endport %#x\n", __func__, ep);
|
dev_err(dev, "%s: unknown endport %#x\n", __func__, ep);
|
||||||
|
@ -176,7 +178,6 @@ static void mwifiex_usb_rx_complete(struct urb *urb)
|
||||||
else
|
else
|
||||||
skb_put(skb, recv_length - skb->len);
|
skb_put(skb, recv_length - skb->len);
|
||||||
|
|
||||||
atomic_inc(&adapter->rx_pending);
|
|
||||||
status = mwifiex_usb_recv(adapter, skb, context->ep);
|
status = mwifiex_usb_recv(adapter, skb, context->ep);
|
||||||
|
|
||||||
dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n",
|
dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n",
|
||||||
|
@ -191,7 +192,6 @@ static void mwifiex_usb_rx_complete(struct urb *urb)
|
||||||
if (card->rx_cmd_ep == context->ep)
|
if (card->rx_cmd_ep == context->ep)
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
atomic_dec(&adapter->rx_pending);
|
|
||||||
if (status == -1)
|
if (status == -1)
|
||||||
dev_err(adapter->dev,
|
dev_err(adapter->dev,
|
||||||
"received data processing failed!\n");
|
"received data processing failed!\n");
|
||||||
|
@ -962,7 +962,6 @@ static void mwifiex_submit_rx_urb(struct mwifiex_adapter *adapter, u8 ep)
|
||||||
static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
|
static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
atomic_dec(&adapter->rx_pending);
|
|
||||||
mwifiex_submit_rx_urb(adapter, MWIFIEX_USB_EP_CMD_EVENT);
|
mwifiex_submit_rx_urb(adapter, MWIFIEX_USB_EP_CMD_EVENT);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -970,8 +969,6 @@ static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
|
||||||
|
|
||||||
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter)
|
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter)
|
||||||
{
|
{
|
||||||
atomic_dec(&adapter->rx_pending);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue