|
@@ -370,8 +370,28 @@ void mwifiex_parse_tx_status_event(struct mwifiex_private *priv,
|
|
|
/* consumes ack_skb */
|
|
|
skb_complete_wifi_ack(ack_skb, !tx_status->status);
|
|
|
} else {
|
|
|
+ /* Remove broadcast address which was added by driver */
|
|
|
+ memmove(ack_skb->data +
|
|
|
+ sizeof(struct ieee80211_hdr_3addr) +
|
|
|
+ MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16),
|
|
|
+ ack_skb->data +
|
|
|
+ sizeof(struct ieee80211_hdr_3addr) +
|
|
|
+ MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16) +
|
|
|
+ ETH_ALEN, ack_skb->len -
|
|
|
+ (sizeof(struct ieee80211_hdr_3addr) +
|
|
|
+ MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16) +
|
|
|
+ ETH_ALEN));
|
|
|
+ ack_skb->len = ack_skb->len - ETH_ALEN;
|
|
|
+ /* Remove driver's proprietary header including 2 bytes
|
|
|
+ * of packet length and pass actual management frame buffer
|
|
|
+ * to cfg80211.
|
|
|
+ */
|
|
|
cfg80211_mgmt_tx_status(&priv->wdev, tx_info->cookie,
|
|
|
- ack_skb->data, ack_skb->len,
|
|
|
+ ack_skb->data +
|
|
|
+ MWIFIEX_MGMT_FRAME_HEADER_SIZE +
|
|
|
+ sizeof(u16), ack_skb->len -
|
|
|
+ (MWIFIEX_MGMT_FRAME_HEADER_SIZE
|
|
|
+ + sizeof(u16)),
|
|
|
!tx_status->status, GFP_ATOMIC);
|
|
|
dev_kfree_skb_any(ack_skb);
|
|
|
}
|