3209e061ad
Commit 2e30168b
("libertas: terminate scan when stopping interface")
adds cleanup code to lbs_eth_stop to call cfg80211_scan_done if there's
an outstanding cfg80211_scan_request. However, it assumes that the
scan request was allocated via the cfg80211 stack. Libertas has
its own internal allocation method, kept track of with
priv->internal_scan. This doesn't set scan_req->wiphy, amongst other
things, which results in hitting a BUG() when we call cfg80211_scan_done
on the request.
This provides a function to take care of the low-level scan_req cleanup
details. We simply call that to deal with finishing up scan requests.
The bug we were hitting was:
[ 964.321495] kernel BUG at net/wireless/core.h:87!
[ 964.329970] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 964.341963] pgd = dcf80000
...
[ 964.849998] 9fe0: 00000000 beb417b8 4018e280 401e822c 60000010 00000004 00000000 00000000
[ 964.865007] [<c003104c>] (__bug+0x1c/0x28) from [<c0384ffc>] (cfg80211_scan_done+0x54/0x6c)
[ 964.895324] [<c0384ffc>] (cfg80211_scan_done+0x54/0x6c) from [<bf028bac>] (lbs_eth_stop+0x10c/0x188 [libertas])
[ 964.895324] [<bf028bac>] (lbs_eth_stop+0x10c/0x188 [libertas]) from [<c03002a0>] (__dev_close_many+0x94/0xc4)
[ 964.918995] [<c03002a0>] (__dev_close_many+0x94/0xc4) from [<c030037c>] (dev_close_many+0x78/0xe0)
Signed-off-by: Andres Salomon <dilinger@queued.net>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
24 lines
659 B
C
24 lines
659 B
C
#ifndef __LBS_CFG80211_H__
|
|
#define __LBS_CFG80211_H__
|
|
|
|
struct device;
|
|
struct lbs_private;
|
|
struct regulatory_request;
|
|
struct wiphy;
|
|
|
|
struct wireless_dev *lbs_cfg_alloc(struct device *dev);
|
|
int lbs_cfg_register(struct lbs_private *priv);
|
|
void lbs_cfg_free(struct lbs_private *priv);
|
|
|
|
int lbs_reg_notifier(struct wiphy *wiphy,
|
|
struct regulatory_request *request);
|
|
|
|
void lbs_send_disconnect_notification(struct lbs_private *priv);
|
|
void lbs_send_mic_failureevent(struct lbs_private *priv, u32 event);
|
|
|
|
void lbs_scan_done(struct lbs_private *priv);
|
|
void lbs_scan_deinit(struct lbs_private *priv);
|
|
int lbs_disconnect(struct lbs_private *priv, u16 reason);
|
|
|
|
#endif
|