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: Luciano Coelho <luciano.coelho@nokia.com> Reviewed-by: Juuso Oikarinen <juuso.oikarinen@nokia.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
25a7dc6d22
Коммит
d6e19d135d
|
@ -422,6 +422,9 @@ struct wl1271 {
|
|||
struct wl1271_tx_hw_res_if *tx_res_if;
|
||||
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
/* Used for a workaround to send disconnect before rejoining */
|
||||
bool joined;
|
||||
};
|
||||
|
||||
int wl1271_plt_start(struct wl1271 *wl);
|
||||
|
|
|
@ -191,6 +191,19 @@ int wl1271_cmd_join(struct wl1271 *wl)
|
|||
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);
|
||||
if (!join) {
|
||||
ret = -ENOMEM;
|
||||
|
@ -245,6 +258,8 @@ int wl1271_cmd_join(struct wl1271 *wl)
|
|||
goto out_free;
|
||||
}
|
||||
|
||||
wl->joined = true;
|
||||
|
||||
/*
|
||||
* ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to
|
||||
* simplify locking we just sleep instead, for now
|
||||
|
|
|
@ -648,6 +648,8 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
|
|||
wl->tx_security_seq_32 = 0;
|
||||
wl->time_offset = 0;
|
||||
wl->session_counter = 0;
|
||||
wl->joined = false;
|
||||
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||||
wl->tx_blocks_freed[i] = 0;
|
||||
|
||||
|
@ -1395,6 +1397,7 @@ static int __devinit wl1271_probe(struct spi_device *spi)
|
|||
wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
|
||||
wl->band = IEEE80211_BAND_2GHZ;
|
||||
wl->vif = NULL;
|
||||
wl->joined = false;
|
||||
|
||||
for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
|
||||
wl->tx_frames[i] = NULL;
|
||||
|
|
Загрузка…
Ссылка в новой задаче