aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvinash Patil <patila@marvell.com>2012-10-19 22:19:21 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-29 15:20:34 -0400
commitf3b369e40a0fbf975ab0e39c2104f184e188afc3 (patch)
treeee515cc33fb1c9c817d93179441aaf2289af1376
parent3a5b8a16856a4864efa5405e40eb05086b6956e6 (diff)
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: Avinash Patil <patila@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.c8
-rw-r--r--drivers/net/wireless/mwifiex/main.h10
-rw-r--r--drivers/net/wireless/mwifiex/sta_rx.c26
-rw-r--r--drivers/net/wireless/mwifiex/txrx.c10
-rw-r--r--drivers/net/wireless/mwifiex/uap_txrx.c17
-rw-r--r--drivers/net/wireless/mwifiex/util.c19
6 files changed, 32 insertions, 58 deletions
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c
index 9402b93b9a36..4a97acd170f7 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
@@ -58,8 +58,7 @@ mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv,
58 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) 58 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
59 mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr); 59 mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr);
60 else 60 else
61 mwifiex_process_rx_packet(priv->adapter, 61 mwifiex_process_rx_packet(priv, rx_tmp_ptr);
62 rx_tmp_ptr);
63 } 62 }
64 } 63 }
65 64
@@ -106,7 +105,7 @@ mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv,
106 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) 105 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
107 mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr); 106 mwifiex_handle_uap_rx_forward(priv, rx_tmp_ptr);
108 else 107 else
109 mwifiex_process_rx_packet(priv->adapter, rx_tmp_ptr); 108 mwifiex_process_rx_packet(priv, rx_tmp_ptr);
110 } 109 }
111 110
112 spin_lock_irqsave(&priv->rx_pkt_lock, flags); 111 spin_lock_irqsave(&priv->rx_pkt_lock, flags);
@@ -442,8 +441,7 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
442 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) 441 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
443 mwifiex_handle_uap_rx_forward(priv, payload); 442 mwifiex_handle_uap_rx_forward(priv, payload);
444 else 443 else
445 mwifiex_process_rx_packet(priv->adapter, 444 mwifiex_process_rx_packet(priv, payload);
446 payload);
447 } 445 }
448 return 0; 446 return 0;
449 } 447 }
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 4ed46b694ced..81f8772dcb07 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -747,9 +747,9 @@ int mwifiex_shutdown_fw_complete(struct mwifiex_adapter *adapter);
747 747
748int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *); 748int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
749 749
750int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb); 750int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb);
751 751
752int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, 752int mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
753 struct sk_buff *skb); 753 struct sk_buff *skb);
754 754
755int mwifiex_process_event(struct mwifiex_adapter *adapter); 755int mwifiex_process_event(struct mwifiex_adapter *adapter);
@@ -806,7 +806,7 @@ void mwifiex_hs_activated_event(struct mwifiex_private *priv,
806 u8 activated); 806 u8 activated);
807int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv, 807int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
808 struct host_cmd_ds_command *resp); 808 struct host_cmd_ds_command *resp);
809int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, 809int mwifiex_process_rx_packet(struct mwifiex_private *priv,
810 struct sk_buff *skb); 810 struct sk_buff *skb);
811int mwifiex_sta_prepare_cmd(struct mwifiex_private *, uint16_t cmd_no, 811int mwifiex_sta_prepare_cmd(struct mwifiex_private *, uint16_t cmd_no,
812 u16 cmd_action, u32 cmd_oid, 812 u16 cmd_action, u32 cmd_oid,
@@ -816,9 +816,9 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
816 void *data_buf, void *cmd_buf); 816 void *data_buf, void *cmd_buf);
817int mwifiex_process_sta_cmdresp(struct mwifiex_private *, u16 cmdresp_no, 817int mwifiex_process_sta_cmdresp(struct mwifiex_private *, u16 cmdresp_no,
818 struct host_cmd_ds_command *resp); 818 struct host_cmd_ds_command *resp);
819int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *, 819int mwifiex_process_sta_rx_packet(struct mwifiex_private *,
820 struct sk_buff *skb); 820 struct sk_buff *skb);
821int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, 821int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
822 struct sk_buff *skb); 822 struct sk_buff *skb);
823int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv, 823int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
824 struct sk_buff *skb); 824 struct sk_buff *skb);
diff --git a/drivers/net/wireless/mwifiex/sta_rx.c b/drivers/net/wireless/mwifiex/sta_rx.c
index 07d32b73783e..b5c109504393 100644
--- a/drivers/net/wireless/mwifiex/sta_rx.c
+++ b/drivers/net/wireless/mwifiex/sta_rx.c
@@ -38,14 +38,10 @@
38 * 38 *
39 * The completion callback is called after processing in complete. 39 * The completion callback is called after processing in complete.
40 */ 40 */
41int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, 41int mwifiex_process_rx_packet(struct mwifiex_private *priv,
42 struct sk_buff *skb) 42 struct sk_buff *skb)
43{ 43{
44 int ret; 44 int ret;
45 struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
46 struct mwifiex_private *priv =
47 mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
48 rx_info->bss_type);
49 struct rx_packet_hdr *rx_pkt_hdr; 45 struct rx_packet_hdr *rx_pkt_hdr;
50 struct rxpd *local_rx_pd; 46 struct rxpd *local_rx_pd;
51 int hdr_chop; 47 int hdr_chop;
@@ -98,9 +94,9 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
98 94
99 priv->rxpd_htinfo = local_rx_pd->ht_info; 95 priv->rxpd_htinfo = local_rx_pd->ht_info;
100 96
101 ret = mwifiex_recv_packet(adapter, skb); 97 ret = mwifiex_recv_packet(priv, skb);
102 if (ret == -1) 98 if (ret == -1)
103 dev_err(adapter->dev, "recv packet failed\n"); 99 dev_err(priv->adapter->dev, "recv packet failed\n");
104 100
105 return ret; 101 return ret;
106} 102}
@@ -117,21 +113,15 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
117 * 113 *
118 * The completion callback is called after processing in complete. 114 * The completion callback is called after processing in complete.
119 */ 115 */
120int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, 116int mwifiex_process_sta_rx_packet(struct mwifiex_private *priv,
121 struct sk_buff *skb) 117 struct sk_buff *skb)
122{ 118{
119 struct mwifiex_adapter *adapter = priv->adapter;
123 int ret = 0; 120 int ret = 0;
124 struct rxpd *local_rx_pd; 121 struct rxpd *local_rx_pd;
125 struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
126 struct rx_packet_hdr *rx_pkt_hdr; 122 struct rx_packet_hdr *rx_pkt_hdr;
127 u8 ta[ETH_ALEN]; 123 u8 ta[ETH_ALEN];
128 u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num; 124 u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num;
129 struct mwifiex_private *priv =
130 mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
131 rx_info->bss_type);
132
133 if (!priv)
134 return -1;
135 125
136 local_rx_pd = (struct rxpd *) (skb->data); 126 local_rx_pd = (struct rxpd *) (skb->data);
137 rx_pkt_type = le16_to_cpu(local_rx_pd->rx_pkt_type); 127 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 159
170 while (!skb_queue_empty(&list)) { 160 while (!skb_queue_empty(&list)) {
171 rx_skb = __skb_dequeue(&list); 161 rx_skb = __skb_dequeue(&list);
172 ret = mwifiex_recv_packet(adapter, rx_skb); 162 ret = mwifiex_recv_packet(priv, rx_skb);
173 if (ret == -1) 163 if (ret == -1)
174 dev_err(adapter->dev, "Rx of A-MSDU failed"); 164 dev_err(adapter->dev, "Rx of A-MSDU failed");
175 } 165 }
176 return 0; 166 return 0;
177 } else if (rx_pkt_type == PKT_TYPE_MGMT) { 167 } else if (rx_pkt_type == PKT_TYPE_MGMT) {
178 ret = mwifiex_process_mgmt_packet(adapter, skb); 168 ret = mwifiex_process_mgmt_packet(priv, skb);
179 if (ret) 169 if (ret)
180 dev_err(adapter->dev, "Rx of mgmt packet failed"); 170 dev_err(adapter->dev, "Rx of mgmt packet failed");
181 dev_kfree_skb_any(skb); 171 dev_kfree_skb_any(skb);
@@ -188,7 +178,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
188 */ 178 */
189 if (!IS_11N_ENABLED(priv) || 179 if (!IS_11N_ENABLED(priv) ||
190 memcmp(priv->curr_addr, rx_pkt_hdr->eth803_hdr.h_dest, ETH_ALEN)) { 180 memcmp(priv->curr_addr, rx_pkt_hdr->eth803_hdr.h_dest, ETH_ALEN)) {
191 mwifiex_process_rx_packet(adapter, skb); 181 mwifiex_process_rx_packet(priv, skb);
192 return ret; 182 return ret;
193 } 183 }
194 184
diff --git a/drivers/net/wireless/mwifiex/txrx.c b/drivers/net/wireless/mwifiex/txrx.c
index 2af263992e83..5cb3f7af8749 100644
--- a/drivers/net/wireless/mwifiex/txrx.c
+++ b/drivers/net/wireless/mwifiex/txrx.c
@@ -48,13 +48,19 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,
48 if (!priv) 48 if (!priv)
49 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); 49 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
50 50
51 if (!priv) {
52 dev_err(adapter->dev, "data: priv not found. Drop RX packet\n");
53 dev_kfree_skb_any(skb);
54 return -1;
55 }
56
51 rx_info->bss_num = priv->bss_num; 57 rx_info->bss_num = priv->bss_num;
52 rx_info->bss_type = priv->bss_type; 58 rx_info->bss_type = priv->bss_type;
53 59
54 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) 60 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
55 return mwifiex_process_uap_rx_packet(adapter, skb); 61 return mwifiex_process_uap_rx_packet(priv, skb);
56 62
57 return mwifiex_process_sta_rx_packet(adapter, skb); 63 return mwifiex_process_sta_rx_packet(priv, skb);
58} 64}
59EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet); 65EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
60 66
diff --git a/drivers/net/wireless/mwifiex/uap_txrx.c b/drivers/net/wireless/mwifiex/uap_txrx.c
index 0966ac24b3b4..a018e42d117e 100644
--- a/drivers/net/wireless/mwifiex/uap_txrx.c
+++ b/drivers/net/wireless/mwifiex/uap_txrx.c
@@ -146,7 +146,7 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
146 } 146 }
147 147
148 /* Forward unicat/Inter-BSS packets to kernel. */ 148 /* Forward unicat/Inter-BSS packets to kernel. */
149 return mwifiex_process_rx_packet(adapter, skb); 149 return mwifiex_process_rx_packet(priv, skb);
150} 150}
151 151
152/* 152/*
@@ -159,24 +159,17 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
159 * 159 *
160 * The completion callback is called after processing is complete. 160 * The completion callback is called after processing is complete.
161 */ 161 */
162int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter, 162int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
163 struct sk_buff *skb) 163 struct sk_buff *skb)
164{ 164{
165 struct mwifiex_adapter *adapter = priv->adapter;
165 int ret; 166 int ret;
166 struct uap_rxpd *uap_rx_pd; 167 struct uap_rxpd *uap_rx_pd;
167 struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
168 struct rx_packet_hdr *rx_pkt_hdr; 168 struct rx_packet_hdr *rx_pkt_hdr;
169 u16 rx_pkt_type; 169 u16 rx_pkt_type;
170 u8 ta[ETH_ALEN], pkt_type; 170 u8 ta[ETH_ALEN], pkt_type;
171 struct mwifiex_sta_node *node; 171 struct mwifiex_sta_node *node;
172 172
173 struct mwifiex_private *priv =
174 mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
175 rx_info->bss_type);
176
177 if (!priv)
178 return -1;
179
180 uap_rx_pd = (struct uap_rxpd *)(skb->data); 173 uap_rx_pd = (struct uap_rxpd *)(skb->data);
181 rx_pkt_type = le16_to_cpu(uap_rx_pd->rx_pkt_type); 174 rx_pkt_type = le16_to_cpu(uap_rx_pd->rx_pkt_type);
182 rx_pkt_hdr = (void *)uap_rx_pd + le16_to_cpu(uap_rx_pd->rx_pkt_offset); 175 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 203
211 while (!skb_queue_empty(&list)) { 204 while (!skb_queue_empty(&list)) {
212 rx_skb = __skb_dequeue(&list); 205 rx_skb = __skb_dequeue(&list);
213 ret = mwifiex_recv_packet(adapter, rx_skb); 206 ret = mwifiex_recv_packet(priv, rx_skb);
214 if (ret) 207 if (ret)
215 dev_err(adapter->dev, 208 dev_err(adapter->dev,
216 "AP:Rx A-MSDU failed"); 209 "AP:Rx A-MSDU failed");
@@ -218,7 +211,7 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter,
218 211
219 return 0; 212 return 0;
220 } else if (rx_pkt_type == PKT_TYPE_MGMT) { 213 } else if (rx_pkt_type == PKT_TYPE_MGMT) {
221 ret = mwifiex_process_mgmt_packet(adapter, skb); 214 ret = mwifiex_process_mgmt_packet(priv, skb);
222 if (ret) 215 if (ret)
223 dev_err(adapter->dev, "Rx of mgmt packet failed"); 216 dev_err(adapter->dev, "Rx of mgmt packet failed");
224 dev_kfree_skb_any(skb); 217 dev_kfree_skb_any(skb);
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index ae88f80cf86b..0982375ba3b1 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -146,20 +146,16 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,
146 * to the kernel. 146 * to the kernel.
147 */ 147 */
148int 148int
149mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, 149mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
150 struct sk_buff *skb) 150 struct sk_buff *skb)
151{ 151{
152 struct rxpd *rx_pd; 152 struct rxpd *rx_pd;
153 struct mwifiex_private *priv;
154 u16 pkt_len; 153 u16 pkt_len;
155 154
156 if (!skb) 155 if (!skb)
157 return -1; 156 return -1;
158 157
159 rx_pd = (struct rxpd *)skb->data; 158 rx_pd = (struct rxpd *)skb->data;
160 priv = mwifiex_get_priv_by_id(adapter, rx_pd->bss_num, rx_pd->bss_type);
161 if (!priv)
162 return -1;
163 159
164 skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset)); 160 skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset));
165 skb_pull(skb, sizeof(pkt_len)); 161 skb_pull(skb, sizeof(pkt_len));
@@ -190,20 +186,11 @@ mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
190 * the function creates a blank SKB, fills it with the data from the 186 * the function creates a blank SKB, fills it with the data from the
191 * received buffer and then sends this new SKB to the kernel. 187 * received buffer and then sends this new SKB to the kernel.
192 */ 188 */
193int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb) 189int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb)
194{ 190{
195 struct mwifiex_rxinfo *rx_info;
196 struct mwifiex_private *priv;
197
198 if (!skb) 191 if (!skb)
199 return -1; 192 return -1;
200 193
201 rx_info = MWIFIEX_SKB_RXCB(skb);
202 priv = mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
203 rx_info->bss_type);
204 if (!priv)
205 return -1;
206
207 skb->dev = priv->netdev; 194 skb->dev = priv->netdev;
208 skb->protocol = eth_type_trans(skb, priv->netdev); 195 skb->protocol = eth_type_trans(skb, priv->netdev);
209 skb->ip_summed = CHECKSUM_NONE; 196 skb->ip_summed = CHECKSUM_NONE;
@@ -225,7 +212,7 @@ int mwifiex_recv_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb)
225 * fragments. Currently we fail the Filesndl-ht.scr script 212 * fragments. Currently we fail the Filesndl-ht.scr script
226 * for UDP, hence this fix 213 * for UDP, hence this fix
227 */ 214 */
228 if ((adapter->iface_type == MWIFIEX_USB) && 215 if ((priv->adapter->iface_type == MWIFIEX_USB) &&
229 (skb->truesize > MWIFIEX_RX_DATA_BUF_SIZE)) 216 (skb->truesize > MWIFIEX_RX_DATA_BUF_SIZE))
230 skb->truesize += (skb->len - MWIFIEX_RX_DATA_BUF_SIZE); 217 skb->truesize += (skb->len - MWIFIEX_RX_DATA_BUF_SIZE);
231 218