mac80211: sync driver before TX
In P2P client mode, the GO (AP) to connect to might have periods of time where it is not available due to powersave. To allow the driver to sync with it and send frames to the GO only when it is available add a new callback tx_sync (and the corresponding finish_tx_sync). These callbacks can sleep unlike the actual TX. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
e0d687bd9d
commit
b2abb6e2bc
@@ -2335,14 +2335,16 @@ static enum work_done_result
|
||||
ieee80211_probe_auth_done(struct ieee80211_work *wk,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_local *local = wk->sdata->local;
|
||||
|
||||
if (!skb) {
|
||||
cfg80211_send_auth_timeout(wk->sdata->dev, wk->filter_ta);
|
||||
return WORK_DONE_DESTROY;
|
||||
goto destroy;
|
||||
}
|
||||
|
||||
if (wk->type == IEEE80211_WORK_AUTH) {
|
||||
cfg80211_send_rx_auth(wk->sdata->dev, skb->data, skb->len);
|
||||
return WORK_DONE_DESTROY;
|
||||
goto destroy;
|
||||
}
|
||||
|
||||
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->probe_auth.tries = 0;
|
||||
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,
|
||||
@@ -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,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_local *local = wk->sdata->local;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
struct ieee80211_rx_status *rx_status;
|
||||
struct ieee802_11_elems elems;
|
||||
@@ -2431,7 +2440,7 @@ static enum work_done_result ieee80211_assoc_done(struct ieee80211_work *wk,
|
||||
|
||||
if (!skb) {
|
||||
cfg80211_send_assoc_timeout(wk->sdata->dev, wk->filter_ta);
|
||||
return WORK_DONE_DESTROY;
|
||||
goto destroy;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
if (!ieee80211_assoc_success(wk, mgmt, skb->len)) {
|
||||
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);
|
||||
destroy:
|
||||
if (wk->assoc.synced)
|
||||
drv_finish_tx_sync(local, wk->sdata, wk->filter_ta,
|
||||
IEEE80211_TX_SYNC_ASSOC);
|
||||
|
||||
return WORK_DONE_DESTROY;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user