diff options
author | Stone Piao <piaoyun@marvell.com> | 2012-09-25 23:23:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-09-28 13:54:04 -0400 |
commit | 2dbaf751b1dec3a603130a475f94cc4d3f404362 (patch) | |
tree | e308825a97d632f4f5b6a7f3d7cad03bdf8f818c | |
parent | 3cec68701a104c8aa0b5c38b6bfad4193cdff3fe (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.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/init.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/sta_rx.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/uap_txrx.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/util.c | 40 |
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 | ||
502 | enum mwifiex_ba_status { | 503 | enum mwifiex_ba_status { |
@@ -741,6 +742,9 @@ int mwifiex_dnld_fw(struct mwifiex_adapter *, struct mwifiex_fw_image *); | |||
741 | 742 | ||
742 | int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb); | 743 | int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb); |
743 | 744 | ||
745 | int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter, | ||
746 | struct sk_buff *skb); | ||
747 | |||
744 | int mwifiex_process_event(struct mwifiex_adapter *adapter); | 748 | int mwifiex_process_event(struct mwifiex_adapter *adapter); |
745 | 749 | ||
746 | int mwifiex_complete_cmd(struct mwifiex_adapter *adapter, | 750 | int 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 | */ | ||
148 | int | ||
149 | mwifiex_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 | * |