};
 
 #define CAL_SNR(RSSI, NF)              ((s16)((s16)(RSSI)-(s16)(NF)))
+#define CAL_RSSI(SNR, NF)              ((s16)((s16)(SNR)+(s16)(NF)))
 
 #define UAP_BSS_PARAMS_I                       0
 #define UAP_CUSTOM_IE_I                                1
 
        struct timer_list scan_delay_timer;
        u8 ap_11n_enabled;
        u32 mgmt_frame_mask;
+       u32 mgmt_rx_freq;
 };
 
 enum mwifiex_ba_status {
 
 int mwifiex_recv_packet(struct mwifiex_adapter *, struct sk_buff *skb);
 
+int mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
+                               struct sk_buff *skb);
+
 int mwifiex_process_event(struct mwifiex_adapter *adapter);
 
 int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,
 
                                dev_err(adapter->dev, "Rx of A-MSDU failed");
                }
                return 0;
+       } else if (rx_pkt_type == PKT_TYPE_MGMT) {
+               ret = mwifiex_process_mgmt_packet(adapter, skb);
+               if (ret)
+                       dev_err(adapter->dev, "Rx of mgmt packet failed");
+               dev_kfree_skb_any(skb);
+               return ret;
        }
 
        /*
 
                }
 
                return 0;
+       } else if (rx_pkt_type == PKT_TYPE_MGMT) {
+               ret = mwifiex_process_mgmt_packet(adapter, skb);
+               if (ret)
+                       dev_err(adapter->dev, "Rx of mgmt packet failed");
+               dev_kfree_skb_any(skb);
+               return ret;
        }
 
        memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN);
 
        return 0;
 }
 
+/*
+ * This function processes the received management packet and send it
+ * to the kernel.
+ */
+int
+mwifiex_process_mgmt_packet(struct mwifiex_adapter *adapter,
+                           struct sk_buff *skb)
+{
+       struct rxpd *rx_pd;
+       struct mwifiex_private *priv;
+       u16 pkt_len;
+
+       if (!skb)
+               return -1;
+
+       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, sizeof(pkt_len));
+
+       pkt_len = le16_to_cpu(rx_pd->rx_pkt_length);
+
+       /* Remove address4 */
+       memmove(skb->data + sizeof(struct ieee80211_hdr_3addr),
+               skb->data + sizeof(struct ieee80211_hdr),
+               pkt_len - sizeof(struct ieee80211_hdr));
+
+       pkt_len -= ETH_ALEN + sizeof(pkt_len);
+       rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
+
+       cfg80211_rx_mgmt(priv->wdev, priv->mgmt_rx_freq,
+                        CAL_RSSI(rx_pd->snr, rx_pd->nf),
+                        skb->data, pkt_len, GFP_ATOMIC);
+
+       return 0;
+}
+
 /*
  * This function processes the received packet before sending it to the
  * kernel.