aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStone Piao <piaoyun@marvell.com>2012-09-25 23:23:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-09-28 13:54:04 -0400
commit2dbaf751b1dec3a603130a475f94cc4d3f404362 (patch)
treee308825a97d632f4f5b6a7f3d7cad03bdf8f818c
parent3cec68701a104c8aa0b5c38b6bfad4193cdff3fe (diff)
mwifiex: report received management frames to cfg80211
Process the management frames received from firmware and report them to cfg80211. Signed-off-by: Stone Piao <piaoyun@marvell.com> Signed-off-by: Kiran Divekar <dkiran@marvell.com> Signed-off-by: Kevin Gan <ganhy@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/fw.h1
-rw-r--r--drivers/net/wireless/mwifiex/init.c1
-rw-r--r--drivers/net/wireless/mwifiex/main.h4
-rw-r--r--drivers/net/wireless/mwifiex/sta_rx.c6
-rw-r--r--drivers/net/wireless/mwifiex/uap_txrx.c6
-rw-r--r--drivers/net/wireless/mwifiex/util.c40
6 files changed, 58 insertions, 0 deletions
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
index 41b304a33a07..b587ea3feffa 100644
--- a/drivers/net/wireless/mwifiex/fw.h
+++ b/drivers/net/wireless/mwifiex/fw.h
@@ -94,6 +94,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
94}; 94};
95 95
96#define CAL_SNR(RSSI, NF) ((s16)((s16)(RSSI)-(s16)(NF))) 96#define CAL_SNR(RSSI, NF) ((s16)((s16)(RSSI)-(s16)(NF)))
97#define CAL_RSSI(SNR, NF) ((s16)((s16)(SNR)+(s16)(NF)))
97 98
98#define UAP_BSS_PARAMS_I 0 99#define UAP_BSS_PARAMS_I 0
99#define UAP_CUSTOM_IE_I 1 100#define UAP_CUSTOM_IE_I 1
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index b2ba262f8a13..105a5c5d7d5d 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -214,6 +214,7 @@ static int mwifiex_init_priv(struct mwifiex_private *priv)
214 priv->wps_ie = NULL; 214 priv->wps_ie = NULL;
215 priv->wps_ie_len = 0; 215 priv->wps_ie_len = 0;
216 priv->ap_11n_enabled = 0; 216 priv->ap_11n_enabled = 0;
217 priv->mgmt_rx_freq = 2437;
217 218
218 priv->scan_block = false; 219 priv->scan_block = false;
219 220
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 6e0806244b82..ec5794ef4366 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -497,6 +497,7 @@ struct mwifiex_private {
497 struct timer_list scan_delay_timer; 497 struct timer_list scan_delay_timer;
498 u8 ap_11n_enabled; 498 u8 ap_11n_enabled;
499 u32 mgmt_frame_mask; 499 u32 mgmt_frame_mask;
500 u32 mgmt_rx_freq;
500}; 501};
501 502
502enum mwifiex_ba_status { 503enum mwifiex_ba_status {
@@ -741,6 +742,9 @@ int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *);
741 742
742int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb); 743int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb);
743 744
745int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
746 struct sk_buff *skb);
747
744int mwifiex_process_event(struct mwifiex_adapter *adapter); 748int mwifiex_process_event(struct mwifiex_adapter *adapter);
745 749
746int mwifiex_complete_cmd(struct mwifiex_adapter *adapter, 750int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,
diff --git a/drivers/net/wireless/mwifiex/sta_rx.c b/drivers/net/wireless/mwifiex/sta_rx.c
index d91d5c08c73a..07d32b73783e 100644
--- a/drivers/net/wireless/mwifiex/sta_rx.c
+++ b/drivers/net/wireless/mwifiex/sta_rx.c
@@ -174,6 +174,12 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
174 dev_err(adapter->dev, "Rx of A-MSDU failed"); 174 dev_err(adapter->dev, "Rx of A-MSDU failed");
175 } 175 }
176 return 0; 176 return 0;
177 } else if (rx_pkt_type == PKT_TYPE_MGMT) {
178 ret = mwifiex_process_mgmt_packet(adapter, skb);
179 if (ret)
180 dev_err(adapter->dev, "Rx of mgmt packet failed");
181 dev_kfree_skb_any(skb);
182 return ret;
177 } 183 }
178 184
179 /* 185 /*
diff --git a/drivers/net/wireless/mwifiex/uap_txrx.c b/drivers/net/wireless/mwifiex/uap_txrx.c
index df17d08715fe..012c1433d126 100644
--- a/drivers/net/wireless/mwifiex/uap_txrx.c
+++ b/drivers/net/wireless/mwifiex/uap_txrx.c
@@ -217,6 +217,12 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_adapter *adapter,
217 } 217 }
218 218
219 return 0; 219 return 0;
220 } else if (rx_pkt_type == PKT_TYPE_MGMT) {
221 ret = mwifiex_process_mgmt_packet(adapter, skb);
222 if (ret)
223 dev_err(adapter->dev, "Rx of mgmt packet failed");
224 dev_kfree_skb_any(skb);
225 return ret;
220 } 226 }
221 227
222 memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN); 228 memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN);
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index 2864c74bdb6f..e1dc3e41c65d 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -142,6 +142,46 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,
142} 142}
143 143
144/* 144/*
145 * This function processes the received management packet and send it
146 * to the kernel.
147 */
148int
149mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
150 struct sk_buff *skb)
151{
152 struct rxpd *rx_pd;
153 struct mwifiex_private *priv;
154 u16 pkt_len;
155
156 if (!skb)
157 return -1;
158
159 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
164 skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset));
165 skb_pull(skb, sizeof(pkt_len));
166
167 pkt_len = le16_to_cpu(rx_pd->rx_pkt_length);
168
169 /* Remove address4 */
170 memmove(skb->data + sizeof(struct ieee80211_hdr_3addr),
171 skb->data + sizeof(struct ieee80211_hdr),
172 pkt_len - sizeof(struct ieee80211_hdr));
173
174 pkt_len -= ETH_ALEN + sizeof(pkt_len);
175 rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
176
177 cfg80211_rx_mgmt(priv->wdev, priv->mgmt_rx_freq,
178 CAL_RSSI(rx_pd->snr, rx_pd->nf),
179 skb->data, pkt_len, GFP_ATOMIC);
180
181 return 0;
182}
183
184/*
145 * This function processes the received packet before sending it to the 185 * This function processes the received packet before sending it to the
146 * kernel. 186 * kernel.
147 * 187 *