|
@@ -2335,14 +2335,16 @@ static enum work_done_result
|
|
ieee80211_probe_auth_done(struct ieee80211_work *wk,
|
|
ieee80211_probe_auth_done(struct ieee80211_work *wk,
|
|
struct sk_buff *skb)
|
|
struct sk_buff *skb)
|
|
{
|
|
{
|
|
|
|
+ struct ieee80211_local *local = wk->sdata->local;
|
|
|
|
+
|
|
if (!skb) {
|
|
if (!skb) {
|
|
cfg80211_send_auth_timeout(wk->sdata->dev, wk->filter_ta);
|
|
cfg80211_send_auth_timeout(wk->sdata->dev, wk->filter_ta);
|
|
- return WORK_DONE_DESTROY;
|
|
|
|
|
|
+ goto destroy;
|
|
}
|
|
}
|
|
|
|
|
|
if (wk->type == IEEE80211_WORK_AUTH) {
|
|
if (wk->type == IEEE80211_WORK_AUTH) {
|
|
cfg80211_send_rx_auth(wk->sdata->dev, skb->data, skb->len);
|
|
cfg80211_send_rx_auth(wk->sdata->dev, skb->data, skb->len);
|
|
- return WORK_DONE_DESTROY;
|
|
|
|
|
|
+ goto destroy;
|
|
}
|
|
}
|
|
|
|
|
|
mutex_lock(&wk->sdata->u.mgd.mtx);
|
|
mutex_lock(&wk->sdata->u.mgd.mtx);
|
|
@@ -2352,6 +2354,12 @@ ieee80211_probe_auth_done(struct ieee80211_work *wk,
|
|
wk->type = IEEE80211_WORK_AUTH;
|
|
wk->type = IEEE80211_WORK_AUTH;
|
|
wk->probe_auth.tries = 0;
|
|
wk->probe_auth.tries = 0;
|
|
return WORK_DONE_REQUEUE;
|
|
return WORK_DONE_REQUEUE;
|
|
|
|
+ destroy:
|
|
|
|
+ if (wk->probe_auth.synced)
|
|
|
|
+ drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
|
|
|
|
+ IEEE80211_TX_SYNC_AUTH);
|
|
|
|
+
|
|
|
|
+ return WORK_DONE_DESTROY;
|
|
}
|
|
}
|
|
|
|
|
|
int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
|
int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
|
@@ -2424,6 +2432,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
|
static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
|
static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
|
struct sk_buff *skb)
|
|
struct sk_buff *skb)
|
|
{
|
|
{
|
|
|
|
+ struct ieee80211_local *local = wk->sdata->local;
|
|
struct ieee80211_mgmt *mgmt;
|
|
struct ieee80211_mgmt *mgmt;
|
|
struct ieee80211_rx_status *rx_status;
|
|
struct ieee80211_rx_status *rx_status;
|
|
struct ieee802_11_elems elems;
|
|
struct ieee802_11_elems elems;
|
|
@@ -2431,7 +2440,7 @@ static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
|
|
|
|
|
if (!skb) {
|
|
if (!skb) {
|
|
cfg80211_send_assoc_timeout(wk->sdata->dev, wk->filter_ta);
|
|
cfg80211_send_assoc_timeout(wk->sdata->dev, wk->filter_ta);
|
|
- return WORK_DONE_DESTROY;
|
|
|
|
|
|
+ goto destroy;
|
|
}
|
|
}
|
|
|
|
|
|
if (wk->type == IEEE80211_WORK_ASSOC_BEACON_WAIT) {
|
|
if (wk->type == IEEE80211_WORK_ASSOC_BEACON_WAIT) {
|
|
@@ -2451,6 +2460,10 @@ static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
|
status = le16_to_cpu(mgmt->u.assoc_resp.status_code);
|
|
status = le16_to_cpu(mgmt->u.assoc_resp.status_code);
|
|
|
|
|
|
if (status == WLAN_STATUS_SUCCESS) {
|
|
if (status == WLAN_STATUS_SUCCESS) {
|
|
|
|
+ if (wk->assoc.synced)
|
|
|
|
+ drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
|
|
|
|
+ IEEE80211_TX_SYNC_ASSOC);
|
|
|
|
+
|
|
mutex_lock(&wk->sdata->u.mgd.mtx);
|
|
mutex_lock(&wk->sdata->u.mgd.mtx);
|
|
if (!ieee80211_assoc_success(wk, mgmt, skb->len)) {
|
|
if (!ieee80211_assoc_success(wk, mgmt, skb->len)) {
|
|
mutex_unlock(&wk->sdata->u.mgd.mtx);
|
|
mutex_unlock(&wk->sdata->u.mgd.mtx);
|
|
@@ -2464,6 +2477,11 @@ static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
|
}
|
|
}
|
|
|
|
|
|
cfg80211_send_rx_assoc(wk->sdata->dev, skb->data, skb->len);
|
|
cfg80211_send_rx_assoc(wk->sdata->dev, skb->data, skb->len);
|
|
|
|
+ destroy:
|
|
|
|
+ if (wk->assoc.synced)
|
|
|
|
+ drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
|
|
|
|
+ IEEE80211_TX_SYNC_ASSOC);
|
|
|
|
+
|
|
return WORK_DONE_DESTROY;
|
|
return WORK_DONE_DESTROY;
|
|
}
|
|
}
|
|
|
|
|