提交 f3b369e4 编写于 作者: A Avinash Patil 提交者: John W. Linville

mwifiex: rx path enhancement to derive priv only once

We derive mwifiex_private structure which is per interface from
received skb's rx_info. Once priv is derived, same priv can be
propagated to other functions instead of callee deriving priv
from rx_info again.
Signed-off-by: NAvinash Patil <patila@marvell.com>
Signed-off-by: NBing Zhao <bzhao@marvell.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 3a5b8a16
...@@ -58,8 +58,7 @@ mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv, ...@@ -58,8 +58,7 @@ mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv,
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr); mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr);
else else
mwifiex_process_rx_packet(priv->adapter, mwifiex_process_rx_packet(priv, rx_tmp_ptr);
rx_tmp_ptr);
} }
} }
...@@ -106,7 +105,7 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv, ...@@ -106,7 +105,7 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr); mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr);
else else
mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr); mwifiex_process_rx_packet(priv, rx_tmp_ptr);
} }
spin_lock_irqsave(&priv->rx_pkt_lock, flags); spin_lock_irqsave(&priv->rx_pkt_lock, flags);
...@@ -442,8 +441,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, ...@@ -442,8 +441,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
mwifiex_handle_uap_rx_forward(priv, payload); mwifiex_handle_uap_rx_forward(priv, payload);
else else
mwifiex_process_rx_packet(priv->adapter, mwifiex_process_rx_packet(priv, payload);
payload);
} }
return 0; return 0;
} }
......
...@@ -747,9 +747,9 @@ int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter); ...@@ -747,9 +747,9 @@ int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter);
int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *); int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb); int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb);
int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, int mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
struct sk_buff *skb); struct sk_buff *skb);
int mwifiex_process_event(struct mwifiex_adapter *adapter); int mwifiex_process_event(struct mwifiex_adapter *adapter);
...@@ -806,7 +806,7 @@ void mwifiex_hs_activated_event(struct mwifiex_private *priv, ...@@ -806,7 +806,7 @@ void mwifiex_hs_activated_event(struct mwifiex_private *priv,
u8 activated); u8 activated);
int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv, int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
struct host_cmd_ds_command *resp); struct host_cmd_ds_command *resp);
int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, int mwifiex_process_rx_packet(struct mwifiex_private *priv,
struct sk_buff *skb); struct sk_buff *skb);
int mwifiex_sta_prepare_cmd(struct mwifiex_private *, uint16_t cmd_no, int mwifiex_sta_prepare_cmd(struct mwifiex_private *, uint16_t cmd_no,
u16 cmd_action, u32 cmd_oid, u16 cmd_action, u32 cmd_oid,
...@@ -816,9 +816,9 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no, ...@@ -816,9 +816,9 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
void *data_buf, void *cmd_buf); void *data_buf, void *cmd_buf);
int mwifiex_process_sta_cmdresp(struct mwifiex_private *, u16 cmdresp_no, int mwifiex_process_sta_cmdresp(struct mwifiex_private *, u16 cmdresp_no,
struct host_cmd_ds_command *resp); struct host_cmd_ds_command *resp);
int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *, int mwifiex_process_sta_rx_packet(struct mwifiex_private *,
struct sk_buff *skb); struct sk_buff *skb);
int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
struct sk_buff *skb); struct sk_buff *skb);
int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv, int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
struct sk_buff *skb); struct sk_buff *skb);
......
...@@ -38,14 +38,10 @@ ...@@ -38,14 +38,10 @@
* *
* The completion callback is called after processing in complete. * The completion callback is called after processing in complete.
*/ */
int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, int mwifiex_process_rx_packet(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
int ret; int ret;
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
struct mwifiex_private *priv =
mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
rx_info->bss_type);
struct rx_packet_hdr *rx_pkt_hdr; struct rx_packet_hdr *rx_pkt_hdr;
struct rxpd *local_rx_pd; struct rxpd *local_rx_pd;
int hdr_chop; int hdr_chop;
...@@ -98,9 +94,9 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, ...@@ -98,9 +94,9 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
priv->rxpd_htinfo = local_rx_pd->ht_info; priv->rxpd_htinfo = local_rx_pd->ht_info;
ret = mwifiex_recv_packet(adapter, skb); ret = mwifiex_recv_packet(priv, skb);
if (ret == -1) if (ret == -1)
dev_err(adapter->dev, "recv packet failed\n"); dev_err(priv->adapter->dev, "recv packet failed\n");
return ret; return ret;
} }
...@@ -117,21 +113,15 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, ...@@ -117,21 +113,15 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
* *
* The completion callback is called after processing in complete. * The completion callback is called after processing in complete.
*/ */
int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, int mwifiex_process_sta_rx_packet(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct mwifiex_adapter *adapter = priv->adapter;
int ret = 0; int ret = 0;
struct rxpd *local_rx_pd; struct rxpd *local_rx_pd;
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
struct rx_packet_hdr *rx_pkt_hdr; struct rx_packet_hdr *rx_pkt_hdr;
u8 ta[ETH_ALEN]; u8 ta[ETH_ALEN];
u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num; u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num;
struct mwifiex_private *priv =
mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
rx_info->bss_type);
if (!priv)
return -1;
local_rx_pd = (struct rxpd *) (skb->data); local_rx_pd = (struct rxpd *) (skb->data);
rx_pkt_type = le16_to_cpu(local_rx_pd->rx_pkt_type); rx_pkt_type = le16_to_cpu(local_rx_pd->rx_pkt_type);
...@@ -169,13 +159,13 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -169,13 +159,13 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
while (!skb_queue_empty(&list)) { while (!skb_queue_empty(&list)) {
rx_skb = __skb_dequeue(&list); rx_skb = __skb_dequeue(&list);
ret = mwifiex_recv_packet(adapter, rx_skb); ret = mwifiex_recv_packet(priv, rx_skb);
if (ret == -1) if (ret == -1)
dev_err(adapter->dev, "Rx of A-MSDU failed"); dev_err(adapter->dev, "Rx of A-MSDU failed");
} }
return 0; return 0;
} else if (rx_pkt_type == PKT_TYPE_MGMT) { } else if (rx_pkt_type == PKT_TYPE_MGMT) {
ret = mwifiex_process_mgmt_packet(adapter, skb); ret = mwifiex_process_mgmt_packet(priv, skb);
if (ret) if (ret)
dev_err(adapter->dev, "Rx of mgmt packet failed"); dev_err(adapter->dev, "Rx of mgmt packet failed");
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
...@@ -188,7 +178,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -188,7 +178,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
*/ */
if (!IS_11N_ENABLED(priv) || if (!IS_11N_ENABLED(priv) ||
memcmp(priv->curr_addr, rx_pkt_hdr->eth803_hdr.h_dest, ETH_ALEN)) { memcmp(priv->curr_addr, rx_pkt_hdr->eth803_hdr.h_dest, ETH_ALEN)) {
mwifiex_process_rx_packet(adapter, skb); mwifiex_process_rx_packet(priv, skb);
return ret; return ret;
} }
......
...@@ -48,13 +48,19 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter, ...@@ -48,13 +48,19 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
if (!priv) if (!priv)
priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
if (!priv) {
dev_err(adapter->dev, "data: priv not found. Drop RX packet\n");
dev_kfree_skb_any(skb);
return -1;
}
rx_info->bss_num = priv->bss_num; rx_info->bss_num = priv->bss_num;
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(adapter, skb); return mwifiex_process_uap_rx_packet(priv, skb);
return mwifiex_process_sta_rx_packet(adapter, skb); return mwifiex_process_sta_rx_packet(priv, skb);
} }
EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet); EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
......
...@@ -146,7 +146,7 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv, ...@@ -146,7 +146,7 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
} }
/* Forward unicat/Inter-BSS packets to kernel. */ /* Forward unicat/Inter-BSS packets to kernel. */
return mwifiex_process_rx_packet(adapter, skb); return mwifiex_process_rx_packet(priv, skb);
} }
/* /*
...@@ -159,24 +159,17 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv, ...@@ -159,24 +159,17 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
* *
* The completion callback is called after processing is complete. * The completion callback is called after processing is complete.
*/ */
int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct mwifiex_adapter *adapter = priv->adapter;
int ret; int ret;
struct uap_rxpd *uap_rx_pd; struct uap_rxpd *uap_rx_pd;
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
struct rx_packet_hdr *rx_pkt_hdr; struct rx_packet_hdr *rx_pkt_hdr;
u16 rx_pkt_type; u16 rx_pkt_type;
u8 ta[ETH_ALEN], pkt_type; u8 ta[ETH_ALEN], pkt_type;
struct mwifiex_sta_node *node; struct mwifiex_sta_node *node;
struct mwifiex_private *priv =
mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
rx_info->bss_type);
if (!priv)
return -1;
uap_rx_pd = (struct uap_rxpd *)(skb->data); uap_rx_pd = (struct uap_rxpd *)(skb->data);
rx_pkt_type = le16_to_cpu(uap_rx_pd->rx_pkt_type); rx_pkt_type = le16_to_cpu(uap_rx_pd->rx_pkt_type);
rx_pkt_hdr = (void *)uap_rx_pd + le16_to_cpu(uap_rx_pd->rx_pkt_offset); rx_pkt_hdr = (void *)uap_rx_pd + le16_to_cpu(uap_rx_pd->rx_pkt_offset);
...@@ -210,7 +203,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, ...@@ -210,7 +203,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter,
while (!skb_queue_empty(&list)) { while (!skb_queue_empty(&list)) {
rx_skb = __skb_dequeue(&list); rx_skb = __skb_dequeue(&list);
ret = mwifiex_recv_packet(adapter, rx_skb); ret = mwifiex_recv_packet(priv, rx_skb);
if (ret) if (ret)
dev_err(adapter->dev, dev_err(adapter->dev,
"AP:Rx A-MSDU failed"); "AP:Rx A-MSDU failed");
...@@ -218,7 +211,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, ...@@ -218,7 +211,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter,
return 0; return 0;
} else if (rx_pkt_type == PKT_TYPE_MGMT) { } else if (rx_pkt_type == PKT_TYPE_MGMT) {
ret = mwifiex_process_mgmt_packet(adapter, skb); ret = mwifiex_process_mgmt_packet(priv, skb);
if (ret) if (ret)
dev_err(adapter->dev, "Rx of mgmt packet failed"); dev_err(adapter->dev, "Rx of mgmt packet failed");
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
......
...@@ -146,20 +146,16 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv, ...@@ -146,20 +146,16 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,
* to the kernel. * to the kernel.
*/ */
int int
mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct rxpd *rx_pd; struct rxpd *rx_pd;
struct mwifiex_private *priv;
u16 pkt_len; u16 pkt_len;
if (!skb) if (!skb)
return -1; return -1;
rx_pd = (struct rxpd *)skb->data; rx_pd = (struct rxpd *)skb->data;
priv = mwifiex_get_priv_by_id(adapter, rx_pd->bss_num, rx_pd->bss_type);
if (!priv)
return -1;
skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset)); skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset));
skb_pull(skb, sizeof(pkt_len)); skb_pull(skb, sizeof(pkt_len));
...@@ -190,20 +186,11 @@ mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, ...@@ -190,20 +186,11 @@ mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
* the function creates a blank SKB, fills it with the data from the * the function creates a blank SKB, fills it with the data from the
* received buffer and then sends this new SKB to the kernel. * received buffer and then sends this new SKB to the kernel.
*/ */
int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb) int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb)
{ {
struct mwifiex_rxinfo *rx_info;
struct mwifiex_private *priv;
if (!skb) if (!skb)
return -1; return -1;
rx_info = MWIFIEX_SKB_RXCB(skb);
priv = mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
rx_info->bss_type);
if (!priv)
return -1;
skb->dev = priv->netdev; skb->dev = priv->netdev;
skb->protocol = eth_type_trans(skb, priv->netdev); skb->protocol = eth_type_trans(skb, priv->netdev);
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
...@@ -225,7 +212,7 @@ int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb) ...@@ -225,7 +212,7 @@ int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb)
* fragments. Currently we fail the Filesndl-ht.scr script * fragments. Currently we fail the Filesndl-ht.scr script
* for UDP, hence this fix * for UDP, hence this fix
*/ */
if ((adapter->iface_type == MWIFIEX_USB) && if ((priv->adapter->iface_type == MWIFIEX_USB) &&
(skb->truesize > MWIFIEX_RX_DATA_BUF_SIZE)) (skb->truesize > MWIFIEX_RX_DATA_BUF_SIZE))
skb->truesize += (skb->len - MWIFIEX_RX_DATA_BUF_SIZE); skb->truesize += (skb->len - MWIFIEX_RX_DATA_BUF_SIZE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册