summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward M. Harte <hharte@broadcom.com>2011-07-27 12:16:11 -0700
committerJonas ABERG <jonas.aberg@stericsson.com>2011-10-28 11:00:37 +0200
commit2f46d250515ba6960b734046af4a89b7197768be (patch)
tree73bb3fad1cbbf43bad0f6f8defe24c1bd99fe747
parent85daa5cadd8266d3e6c867bfc63ccf3fbb2e74ca (diff)
net: wireless: bcmdhd: change logic for removing monitor interace for P2P.
Change-Id: Ie757ec25c86d0402d0463a9b7f2fff14b840f446 Signed-off-by: Howard M. Harte <hharte@broadcom.com> Signed-off-by: Dmitry Shmidt <dimitrysh@google.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/35561 Tested-by: Per VAHLNE <per.xx.vahlne@stericsson.com> Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
-rw-r--r--drivers/net/wireless/bcmdhd/dhd_linux_mon.c13
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.c7
2 files changed, 9 insertions, 11 deletions
diff --git a/drivers/net/wireless/bcmdhd/dhd_linux_mon.c b/drivers/net/wireless/bcmdhd/dhd_linux_mon.c
index 25eba63017f..6c1ff4d8ad4 100644
--- a/drivers/net/wireless/bcmdhd/dhd_linux_mon.c
+++ b/drivers/net/wireless/bcmdhd/dhd_linux_mon.c
@@ -322,17 +322,17 @@ int dhd_del_monitor(struct net_device *ndev)
return -EINVAL;
mutex_lock(&g_monitor.lock);
for (i = 0; i < DHD_MAX_IFS; i++) {
- if (g_monitor.mon_if[i].mon_ndev == ndev) {
+ if (g_monitor.mon_if[i].mon_ndev == ndev ||
+ g_monitor.mon_if[i].real_ndev == ndev) {
g_monitor.mon_if[i].real_ndev = NULL;
- g_monitor.mon_if[i].mon_ndev = NULL;
if (rtnl_is_locked()) {
rtnl_unlock();
rollback_lock = true;
}
- unregister_netdev(ndev);
- free_netdev(ndev);
+ unregister_netdev(g_monitor.mon_if[i].mon_ndev);
+ free_netdev(g_monitor.mon_if[i].mon_ndev);
+ g_monitor.mon_if[i].mon_ndev = NULL;
g_monitor.monitor_state = MONITOR_STATE_INTERFACE_DELETED;
- ndev = NULL;
break;
}
}
@@ -341,7 +341,8 @@ int dhd_del_monitor(struct net_device *ndev)
rollback_lock = false;
}
- if (ndev)
+ if (g_monitor.monitor_state !=
+ MONITOR_STATE_INTERFACE_DELETED)
MON_PRINT("interface not found in monitor IF array, is this a monitor IF? 0x%p\n",
ndev);
mutex_unlock(&g_monitor.lock);
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index 98c9ff61008..cc5d86e8e7b 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -1005,10 +1005,7 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev)
struct wl_priv *wl = WL_PRIV_GET();
s32 timeout = -1;
s32 ret = 0;
- if (dev && dev->type == ARPHRD_IEEE80211_RADIOTAP) {
- ret = dhd_del_monitor(dev);
- goto exit;
- }
+
if (wl->p2p_supported) {
memcpy(p2p_mac.octet, wl->p2p->int_addr.octet, ETHER_ADDR_LEN);
if (wl->p2p->vif_created) {
@@ -1029,9 +1026,9 @@ wl_cfg80211_del_virtual_iface(struct wiphy *wiphy, struct net_device *dev)
} else {
WL_ERR(("IFDEL didn't complete properly"));
}
+ ret = dhd_del_monitor(dev);
}
}
-exit:
return ret;
}