qtnfmac: implement scan timeout

Userspace tools may hang on scan in the case when scan completion event
is not returned by firmware. This patch implements the scan timeout
to avoid such situation.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Avinash Patil <avinashp@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
Sergey Matyukevich 2017-07-28 02:06:51 +03:00 committed by Kalle Valo
parent 97883695d5
commit c7ead2abd2
5 changed files with 29 additions and 4 deletions

View File

@ -579,19 +579,33 @@ qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,
return ret; return ret;
} }
static void qtnf_scan_timeout(unsigned long data)
{
struct qtnf_wmac *mac = (struct qtnf_wmac *)data;
pr_warn("mac%d scan timed out\n", mac->macid);
qtnf_scan_done(mac, true);
}
static int static int
qtnf_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request) qtnf_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
{ {
struct qtnf_wmac *mac = wiphy_priv(wiphy); struct qtnf_wmac *mac = wiphy_priv(wiphy);
int ret;
mac->scan_req = request; mac->scan_req = request;
ret = qtnf_cmd_send_scan(mac); if (qtnf_cmd_send_scan(mac)) {
if (ret)
pr_err("MAC%u: failed to start scan\n", mac->macid); pr_err("MAC%u: failed to start scan\n", mac->macid);
mac->scan_req = NULL;
return -EFAULT;
}
return ret; mac->scan_timeout.data = (unsigned long)mac;
mac->scan_timeout.function = qtnf_scan_timeout;
mod_timer(&mac->scan_timeout,
jiffies + QTNF_SCAN_TIMEOUT_SEC * HZ);
return 0;
} }
static int static int

View File

@ -34,10 +34,14 @@ static inline void qtnf_scan_done(struct qtnf_wmac *mac, bool aborted)
.aborted = aborted, .aborted = aborted,
}; };
mutex_lock(&mac->mac_lock);
if (mac->scan_req) { if (mac->scan_req) {
cfg80211_scan_done(mac->scan_req, &info); cfg80211_scan_done(mac->scan_req, &info);
mac->scan_req = NULL; mac->scan_req = NULL;
} }
mutex_unlock(&mac->mac_lock);
} }
#endif /* _QTN_FMAC_CFG80211_H_ */ #endif /* _QTN_FMAC_CFG80211_H_ */

View File

@ -288,6 +288,8 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
mac->iflist[i].mac = mac; mac->iflist[i].mac = mac;
mac->iflist[i].vifid = i; mac->iflist[i].vifid = i;
qtnf_sta_list_init(&mac->iflist[i].sta_list); qtnf_sta_list_init(&mac->iflist[i].sta_list);
mutex_init(&mac->mac_lock);
init_timer(&mac->scan_timeout);
} }
qtnf_mac_init_primary_intf(mac); qtnf_mac_init_primary_intf(mac);

View File

@ -46,6 +46,7 @@
#define QTNF_MAX_EVENT_QUEUE_LEN 255 #define QTNF_MAX_EVENT_QUEUE_LEN 255
#define QTNF_DEFAULT_BG_SCAN_PERIOD 300 #define QTNF_DEFAULT_BG_SCAN_PERIOD 300
#define QTNF_MAX_BG_SCAN_PERIOD 0xffff #define QTNF_MAX_BG_SCAN_PERIOD 0xffff
#define QTNF_SCAN_TIMEOUT_SEC 15
#define QTNF_DEF_BSS_PRIORITY 0 #define QTNF_DEF_BSS_PRIORITY 0
#define QTNF_DEF_WDOG_TIMEOUT 5 #define QTNF_DEF_WDOG_TIMEOUT 5
@ -147,6 +148,8 @@ struct qtnf_wmac {
struct cfg80211_scan_request *scan_req; struct cfg80211_scan_request *scan_req;
struct cfg80211_chan_def chandef; struct cfg80211_chan_def chandef;
struct cfg80211_chan_def csa_chandef; struct cfg80211_chan_def csa_chandef;
struct mutex mac_lock; /* lock during wmac speicific ops */
struct timer_list scan_timeout;
}; };
struct qtnf_hw_info { struct qtnf_hw_info {

View File

@ -345,6 +345,8 @@ qtnf_event_handle_scan_complete(struct qtnf_wmac *mac,
return -EINVAL; return -EINVAL;
} }
if (timer_pending(&mac->scan_timeout))
del_timer_sync(&mac->scan_timeout);
qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED); qtnf_scan_done(mac, le32_to_cpu(status->flags) & QLINK_SCAN_ABORTED);
return 0; return 0;