mirror of https://gitee.com/openkylin/linux.git
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)
|
||||
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 *);
|
||||
int (*cmdrsp_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 (*dnld_fw) (struct mwifiex_adapter *, struct mwifiex_fw_image *);
|
||||
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",
|
||||
skb->len, rx_pkt_offset, rx_pkt_length);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
ta, (u8) rx_pkt_type, skb);
|
||||
|
||||
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);
|
||||
}
|
||||
if (ret || (rx_pkt_type == PKT_TYPE_BAR))
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
if (ret)
|
||||
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);
|
||||
struct rxpd *local_rx_pd;
|
||||
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
|
||||
int ret;
|
||||
|
||||
local_rx_pd = (struct rxpd *) (skb->data);
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -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),
|
||||
le16_to_cpu(uap_rx_pd->rx_pkt_length));
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -326,12 +321,8 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
|
|||
uap_rx_pd->priority, ta, pkt_type,
|
||||
skb);
|
||||
|
||||
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);
|
||||
}
|
||||
if (ret || (rx_pkt_type == PKT_TYPE_BAR))
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
if (ret)
|
||||
priv->stats.rx_dropped++;
|
||||
|
|
|
@ -938,11 +938,9 @@ static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter,
|
||||
struct sk_buff *skb)
|
||||
static int mwifiex_usb_data_complete(struct mwifiex_adapter *adapter)
|
||||
{
|
||||
atomic_dec(&adapter->rx_pending);
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue