mwifiex: fix rx_pending count imbalance
RX packets are handled in different paths. Not all paths have decrement of rx_pending counter. This patch fixes the counter imbalance. Signed-off-by: Ujjal Roy <royujjal@gmail.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
f8eb5ee5f5
commit
ca8d6dfc92
|
@ -643,7 +643,8 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
|
||||||
if (priv)
|
if (priv)
|
||||||
priv->stats.rx_dropped++;
|
priv->stats.rx_dropped++;
|
||||||
|
|
||||||
adapter->if_ops.data_complete(adapter, skb);
|
dev_kfree_skb_any(skb);
|
||||||
|
adapter->if_ops.data_complete(adapter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -615,7 +615,7 @@ struct mwifiex_if_ops {
|
||||||
void (*cleanup_mpa_buf) (struct mwifiex_adapter *);
|
void (*cleanup_mpa_buf) (struct mwifiex_adapter *);
|
||||||
int (*cmdrsp_complete) (struct mwifiex_adapter *, struct sk_buff *);
|
int (*cmdrsp_complete) (struct mwifiex_adapter *, struct sk_buff *);
|
||||||
int (*event_complete) (struct mwifiex_adapter *, struct sk_buff *);
|
int (*event_complete) (struct mwifiex_adapter *, struct sk_buff *);
|
||||||
int (*data_complete) (struct mwifiex_adapter *, struct sk_buff *);
|
int (*data_complete) (struct mwifiex_adapter *);
|
||||||
int (*init_fw_port) (struct mwifiex_adapter *);
|
int (*init_fw_port) (struct mwifiex_adapter *);
|
||||||
int (*dnld_fw) (struct mwifiex_adapter *, struct mwifiex_fw_image *);
|
int (*dnld_fw) (struct mwifiex_adapter *, struct mwifiex_fw_image *);
|
||||||
void (*card_reset) (struct mwifiex_adapter *);
|
void (*card_reset) (struct mwifiex_adapter *);
|
||||||
|
|
|
@ -188,12 +188,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_private *priv,
|
||||||
"wrong rx packet: len=%d, rx_pkt_offset=%d, rx_pkt_length=%d\n",
|
"wrong rx packet: len=%d, rx_pkt_offset=%d, rx_pkt_length=%d\n",
|
||||||
skb->len, rx_pkt_offset, rx_pkt_length);
|
skb->len, rx_pkt_offset, rx_pkt_length);
|
||||||
priv->stats.rx_dropped++;
|
priv->stats.rx_dropped++;
|
||||||
|
|
||||||
if (adapter->if_ops.data_complete)
|
|
||||||
adapter->if_ops.data_complete(adapter, skb);
|
|
||||||
else
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,12 +242,8 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_private *priv,
|
||||||
ret = mwifiex_11n_rx_reorder_pkt(priv, seq_num, local_rx_pd->priority,
|
ret = mwifiex_11n_rx_reorder_pkt(priv, seq_num, local_rx_pd->priority,
|
||||||
ta, (u8) rx_pkt_type, skb);
|
ta, (u8) rx_pkt_type, skb);
|
||||||
|
|
||||||
if (ret || (rx_pkt_type == PKT_TYPE_BAR)) {
|
if (ret || (rx_pkt_type == PKT_TYPE_BAR))
|
||||||
if (adapter->if_ops.data_complete)
|
|
||||||
adapter->if_ops.data_complete(adapter, skb);
|
|
||||||
else
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
priv->stats.rx_dropped++;
|
priv->stats.rx_dropped++;
|
||||||
|
|
|
@ -40,6 +40,7 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
|
||||||
mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
|
mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
|
||||||
struct rxpd *local_rx_pd;
|
struct rxpd *local_rx_pd;
|
||||||
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
|
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
|
||||||
|
int ret;
|
||||||
|
|
||||||
local_rx_pd = (struct rxpd *) (skb->data);
|
local_rx_pd = (struct rxpd *) (skb->data);
|
||||||
/* Get the BSS number from rxpd, get corresponding priv */
|
/* Get the BSS number from rxpd, get corresponding priv */
|
||||||
|
@ -58,9 +59,15 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
|
||||||
rx_info->bss_type = priv->bss_type;
|
rx_info->bss_type = priv->bss_type;
|
||||||
|
|
||||||
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
|
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
|
||||||
return mwifiex_process_uap_rx_packet(priv, skb);
|
ret = mwifiex_process_uap_rx_packet(priv, skb);
|
||||||
|
else
|
||||||
|
ret = mwifiex_process_sta_rx_packet(priv, skb);
|
||||||
|
|
||||||
return mwifiex_process_sta_rx_packet(priv, skb);
|
/* Decrement RX pending counter for each packet */
|
||||||
|
if (adapter->if_ops.data_complete)
|
||||||
|
adapter->if_ops.data_complete(adapter);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
|
EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
|
||||||
|
|
||||||
|
|
|
@ -267,12 +267,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
|
||||||
skb->len, le16_to_cpu(uap_rx_pd->rx_pkt_offset),
|
skb->len, le16_to_cpu(uap_rx_pd->rx_pkt_offset),
|
||||||
le16_to_cpu(uap_rx_pd->rx_pkt_length));
|
le16_to_cpu(uap_rx_pd->rx_pkt_length));
|
||||||
priv->stats.rx_dropped++;
|
priv->stats.rx_dropped++;
|
||||||
|
|
||||||
if (adapter->if_ops.data_complete)
|
|
||||||
adapter->if_ops.data_complete(adapter, skb);
|
|
||||||
else
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,12 +321,8 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
|
||||||
uap_rx_pd->priority, ta, pkt_type,
|
uap_rx_pd->priority, ta, pkt_type,
|
||||||
skb);
|
skb);
|
||||||
|
|
||||||
if (ret || (rx_pkt_type == PKT_TYPE_BAR)) {
|
if (ret || (rx_pkt_type == PKT_TYPE_BAR))
|
||||||
if (adapter->if_ops.data_complete)
|
|
||||||
adapter->if_ops.data_complete(adapter, skb);
|
|
||||||
else
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
}
|
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
priv->stats.rx_dropped++;
|
priv->stats.rx_dropped++;
|
||||||
|
|
|
@ -938,11 +938,9 @@ static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter,
|
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter)
|
||||||
struct sk_buff *skb)
|
|
||||||
{
|
{
|
||||||
atomic_dec(&adapter->rx_pending);
|
atomic_dec(&adapter->rx_pending);
|
||||||
dev_kfree_skb_any(skb);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue