Try three times for the NULL recovery.

This commit is contained in:
Solomon Peachy 2013-04-10 11:11:29 -04:00
parent 474fe3bb66
commit 4c2a3825b1
1 changed files with 16 additions and 4 deletions

View File

@ -156,6 +156,10 @@ void cw1200_cqm_bssloss_sm(struct cw1200_common *priv, int init, int good, int b
priv->bss_loss_confirm_id,
init, good, bad);
/* Reset state */
if (!(init || good || bad))
priv->bss_loss_state = 0;
if (!priv->bss_loss_state && init) {
tx = 1;
queue_delayed_work(priv->workqueue,
@ -163,13 +167,16 @@ void cw1200_cqm_bssloss_sm(struct cw1200_common *priv, int init, int good, int b
1 * HZ);
priv->bss_loss_state = 1;
} else if (priv->bss_loss_state) {
priv->bss_loss_state = 0;
if (good)
queue_work(priv->workqueue, &priv->bss_params_work);
else if (bad)
queue_delayed_work(priv->workqueue,
&priv->bss_loss_work,
1 * HZ); /* XXX 0 immediate ? */
if (++priv->bss_loss_state > 3) {
queue_delayed_work(priv->workqueue,
&priv->bss_loss_work,
HZ/4); /* XXX 0 immediate ? */
} else {
tx = 1;
}
}
/* Spit out a NULL packet if necessary */
@ -1047,6 +1054,11 @@ void cw1200_bss_params_work(struct work_struct *work)
container_of(work, struct cw1200_common, bss_params_work);
mutex_lock(&priv->conf_mutex);
/* Clear state */
spin_lock(&priv->bss_loss_lock);
priv->bss_loss_state = 0;
spin_unlock(&priv->bss_loss_lock);
priv->bss_params.reset_beacon_loss = 1;
wsm_set_bss_params(priv, &priv->bss_params);
priv->bss_params.reset_beacon_loss = 0;