summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAniket Nagarnaik <aniketn@marvell.com>2015-07-02 09:07:02 -0400
committerKalle Valo <kvalo@codeaurora.org>2015-07-21 09:57:20 -0400
commitae86c587b5b53da4f7859f236f6c22ff9941cff9 (patch)
treea790ebafdb2c678ff289bdd9d2d89d1e1e78c080
parente60ac9c7a4c8776b2503892dfd01f1b4d651245d (diff)
mwifiex: fix for p2p broken link
This patch fixes following issues in p2p code paths. 1) bss role, bss type and connection type was not set correctly for p2p GO and p2p client at couple of places. 2) Driver appends a proprietary header to management frames which will be parsed by our firmware. Later while informing TX status to cfg80211, modified frame buffer was passed to cfg80211_mgmt_tx_status() instead of original one. Signed-off-by: Aniket Nagarnaik <aniketn@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c5
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c6
-rw-r--r--drivers/net/wireless/mwifiex/txrx.c22
3 files changed, 29 insertions, 4 deletions
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index 69ee6dbafd61..d4b327752a5e 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -831,10 +831,13 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
831 priv->bss_type = MWIFIEX_BSS_TYPE_STA; 831 priv->bss_type = MWIFIEX_BSS_TYPE_STA;
832 break; 832 break;
833 case NL80211_IFTYPE_P2P_CLIENT: 833 case NL80211_IFTYPE_P2P_CLIENT:
834 case NL80211_IFTYPE_P2P_GO:
835 priv->bss_role = MWIFIEX_BSS_ROLE_STA; 834 priv->bss_role = MWIFIEX_BSS_ROLE_STA;
836 priv->bss_type = MWIFIEX_BSS_TYPE_P2P; 835 priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
837 break; 836 break;
837 case NL80211_IFTYPE_P2P_GO:
838 priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
839 priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
840 break;
838 case NL80211_IFTYPE_AP: 841 case NL80211_IFTYPE_AP:
839 priv->bss_type = MWIFIEX_BSS_TYPE_UAP; 842 priv->bss_type = MWIFIEX_BSS_TYPE_UAP;
840 priv->bss_role = MWIFIEX_BSS_ROLE_UAP; 843 priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index 36cb6bdbe49b..a49a80dd773e 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -1997,10 +1997,12 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
1997 if (priv->bss_mode == NL80211_IFTYPE_ADHOC) 1997 if (priv->bss_mode == NL80211_IFTYPE_ADHOC)
1998 cmd_ptr->params.bss_mode.con_type = 1998 cmd_ptr->params.bss_mode.con_type =
1999 CONNECTION_TYPE_ADHOC; 1999 CONNECTION_TYPE_ADHOC;
2000 else if (priv->bss_mode == NL80211_IFTYPE_STATION) 2000 else if (priv->bss_mode == NL80211_IFTYPE_STATION ||
2001 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT)
2001 cmd_ptr->params.bss_mode.con_type = 2002 cmd_ptr->params.bss_mode.con_type =
2002 CONNECTION_TYPE_INFRA; 2003 CONNECTION_TYPE_INFRA;
2003 else if (priv->bss_mode == NL80211_IFTYPE_AP) 2004 else if (priv->bss_mode == NL80211_IFTYPE_AP ||
2005 priv->bss_mode == NL80211_IFTYPE_P2P_GO)
2004 cmd_ptr->params.bss_mode.con_type = CONNECTION_TYPE_AP; 2006 cmd_ptr->params.bss_mode.con_type = CONNECTION_TYPE_AP;
2005 cmd_ptr->size = cpu_to_le16(sizeof(struct 2007 cmd_ptr->size = cpu_to_le16(sizeof(struct
2006 host_cmd_ds_set_bss_mode) + S_DS_GEN); 2008 host_cmd_ds_set_bss_mode) + S_DS_GEN);
diff --git a/drivers/net/wireless/mwifiex/txrx.c b/drivers/net/wireless/mwifiex/txrx.c
index 5ed9b794053e..8b1e5b5d47fe 100644
--- a/drivers/net/wireless/mwifiex/txrx.c
+++ b/drivers/net/wireless/mwifiex/txrx.c
@@ -370,8 +370,28 @@ void mwifiex_parse_tx_status_event(struct mwifiex_private *priv,
370 /* consumes ack_skb */ 370 /* consumes ack_skb */
371 skb_complete_wifi_ack(ack_skb, !tx_status->status); 371 skb_complete_wifi_ack(ack_skb, !tx_status->status);
372 } else { 372 } else {
373 /* Remove broadcast address which was added by driver */
374 memmove(ack_skb->data +
375 sizeof(struct ieee80211_hdr_3addr) +
376 MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16),
377 ack_skb->data +
378 sizeof(struct ieee80211_hdr_3addr) +
379 MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16) +
380 ETH_ALEN, ack_skb->len -
381 (sizeof(struct ieee80211_hdr_3addr) +
382 MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(u16) +
383 ETH_ALEN));
384 ack_skb->len = ack_skb->len - ETH_ALEN;
385 /* Remove driver's proprietary header including 2 bytes
386 * of packet length and pass actual management frame buffer
387 * to cfg80211.
388 */
373 cfg80211_mgmt_tx_status(&priv->wdev, tx_info->cookie, 389 cfg80211_mgmt_tx_status(&priv->wdev, tx_info->cookie,
374 ack_skb->data, ack_skb->len, 390 ack_skb->data +
391 MWIFIEX_MGMT_FRAME_HEADER_SIZE +
392 sizeof(u16), ack_skb->len -
393 (MWIFIEX_MGMT_FRAME_HEADER_SIZE
394 + sizeof(u16)),
375 !tx_status->status, GFP_ATOMIC); 395 !tx_status->status, GFP_ATOMIC);
376 dev_kfree_skb_any(ack_skb); 396 dev_kfree_skb_any(ack_skb);
377 } 397 }