Commit d6e19d13 authored by Luciano Coelho's avatar Luciano Coelho Committed by John W. Linville

wl1271: workaround to send a disconnect before rejoining

We don't get any indication from the stack when we have disassociated.  In
wl1271, it is important to send a CMD_DISCONNECT before joining again,
because the firmware cleans some things up.  So we check if we're already
joined and disconnect if that's the case.
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Reviewed-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 25a7dc6d
...@@ -422,6 +422,9 @@ struct wl1271 { ...@@ -422,6 +422,9 @@ struct wl1271 {
struct wl1271_tx_hw_res_if *tx_res_if; struct wl1271_tx_hw_res_if *tx_res_if;
struct ieee80211_vif *vif; struct ieee80211_vif *vif;
/* Used for a workaround to send disconnect before rejoining */
bool joined;
}; };
int wl1271_plt_start(struct wl1271 *wl); int wl1271_plt_start(struct wl1271 *wl);
......
...@@ -191,6 +191,19 @@ int wl1271_cmd_join(struct wl1271 *wl) ...@@ -191,6 +191,19 @@ int wl1271_cmd_join(struct wl1271 *wl)
do_cal = false; do_cal = false;
} }
/* FIXME: This is a workaround, because with the current stack, we
* cannot know when we have disassociated. So, if we have already
* joined, we disconnect before joining again. */
if (wl->joined) {
ret = wl1271_cmd_disconnect(wl);
if (ret < 0) {
wl1271_error("failed to disconnect before rejoining");
goto out;
}
wl->joined = false;
}
join = kzalloc(sizeof(*join), GFP_KERNEL); join = kzalloc(sizeof(*join), GFP_KERNEL);
if (!join) { if (!join) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -245,6 +258,8 @@ int wl1271_cmd_join(struct wl1271 *wl) ...@@ -245,6 +258,8 @@ int wl1271_cmd_join(struct wl1271 *wl)
goto out_free; goto out_free;
} }
wl->joined = true;
/* /*
* ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to * ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to
* simplify locking we just sleep instead, for now * simplify locking we just sleep instead, for now
......
...@@ -648,6 +648,8 @@ static void wl1271_op_stop(struct ieee80211_hw *hw) ...@@ -648,6 +648,8 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
wl->tx_security_seq_32 = 0; wl->tx_security_seq_32 = 0;
wl->time_offset = 0; wl->time_offset = 0;
wl->session_counter = 0; wl->session_counter = 0;
wl->joined = false;
for (i = 0; i < NUM_TX_QUEUES; i++) for (i = 0; i < NUM_TX_QUEUES; i++)
wl->tx_blocks_freed[i] = 0; wl->tx_blocks_freed[i] = 0;
...@@ -1395,6 +1397,7 @@ static int __devinit wl1271_probe(struct spi_device *spi) ...@@ -1395,6 +1397,7 @@ static int __devinit wl1271_probe(struct spi_device *spi)
wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET; wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
wl->band = IEEE80211_BAND_2GHZ; wl->band = IEEE80211_BAND_2GHZ;
wl->vif = NULL; wl->vif = NULL;
wl->joined = false;
for (i = 0; i < ACX_TX_DESCRIPTORS; i++) for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
wl->tx_frames[i] = NULL; wl->tx_frames[i] = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment