summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdrivers/staging/cw1200/ap.c24
-rw-r--r--drivers/staging/cw1200/cw1200.h7
-rw-r--r--drivers/staging/cw1200/txrx.c16
3 files changed, 39 insertions, 8 deletions
diff --git a/drivers/staging/cw1200/ap.c b/drivers/staging/cw1200/ap.c
index ff8d36cbedb..1211e127c52 100755
--- a/drivers/staging/cw1200/ap.c
+++ b/drivers/staging/cw1200/ap.c
@@ -1025,8 +1025,30 @@ void cw1200_link_id_gc_work(struct work_struct *work)
WARN_ON(wsm_reset(priv, &reset));
spin_lock_bh(&priv->ps_state_lock);
} else {
- next_gc = min(next_gc, (unsigned long)ttl);
+ next_gc = min_t(unsigned long, next_gc, ttl);
}
+#if defined(CONFIG_CW1200_USE_STE_EXTENSIONS)
+ } else if (priv->link_id_db[i].status == CW1200_LINK_RESET ||
+ priv->link_id_db[i].status ==
+ CW1200_LINK_RESET_REMAP) {
+ int status = priv->link_id_db[i].status;
+ priv->link_id_db[i].status =
+ priv->link_id_db[i].prev_status;
+ priv->link_id_db[i].timestamp = now;
+ reset.link_id = i + 1;
+ spin_unlock_bh(&priv->ps_state_lock);
+ WARN_ON(wsm_reset(priv, &reset));
+ if (status == CW1200_LINK_RESET_REMAP) {
+ memcpy(map_link.mac_addr,
+ priv->link_id_db[i].mac,
+ ETH_ALEN);
+ map_link.link_id = i + 1;
+ WARN_ON(wsm_map_link(priv, &map_link));
+ next_gc = min(next_gc,
+ CW1200_LINK_ID_GC_TIMEOUT);
+ }
+ spin_lock_bh(&priv->ps_state_lock);
+#endif
}
if (need_reset) {
skb_queue_purge(&priv->link_id_db[i].rx_queue);
diff --git a/drivers/staging/cw1200/cw1200.h b/drivers/staging/cw1200/cw1200.h
index d3ecb2a950f..c24dc420db4 100644
--- a/drivers/staging/cw1200/cw1200.h
+++ b/drivers/staging/cw1200/cw1200.h
@@ -65,6 +65,10 @@ enum cw1200_link_status {
CW1200_LINK_RESERVE,
CW1200_LINK_SOFT,
CW1200_LINK_HARD,
+#if defined(CONFIG_CW1200_USE_STE_EXTENSIONS)
+ CW1200_LINK_RESET,
+ CW1200_LINK_RESET_REMAP,
+#endif
};
enum cw1200_bss_loss_status {
@@ -77,6 +81,9 @@ enum cw1200_bss_loss_status {
struct cw1200_link_entry {
unsigned long timestamp;
enum cw1200_link_status status;
+#if defined(CONFIG_CW1200_USE_STE_EXTENSIONS)
+ enum cw1200_link_status prev_status;
+#endif
u8 mac[ETH_ALEN];
u8 buffered[CW1200_MAX_TID];
struct sk_buff_head rx_queue;
diff --git a/drivers/staging/cw1200/txrx.c b/drivers/staging/cw1200/txrx.c
index 9569fd5849f..b8859326612 100644
--- a/drivers/staging/cw1200/txrx.c
+++ b/drivers/staging/cw1200/txrx.c
@@ -1265,8 +1265,10 @@ void cw1200_link_id_reset(struct work_struct *work)
flush_workqueue(priv->workqueue);
/* Release the link ID */
spin_lock(&priv->ps_state_lock);
+ priv->link_id_db[temp_linkid - 1].prev_status =
+ priv->link_id_db[temp_linkid - 1].status;
priv->link_id_db[temp_linkid - 1].status =
- CW1200_LINK_RESERVE;
+ CW1200_LINK_RESET;
spin_unlock(&priv->ps_state_lock);
wsm_lock_tx_async(priv);
if (queue_work(priv->workqueue,
@@ -1275,15 +1277,15 @@ void cw1200_link_id_reset(struct work_struct *work)
}
} else {
spin_lock(&priv->ps_state_lock);
- entry = &priv->link_id_db[priv->action_linkid - 1];
+ priv->link_id_db[priv->action_linkid - 1].prev_status =
+ priv->link_id_db[priv->action_linkid - 1].status;
+ priv->link_id_db[priv->action_linkid - 1].status =
+ CW1200_LINK_RESET_REMAP;
+ spin_unlock(&priv->ps_state_lock);
wsm_lock_tx_async(priv);
if (queue_work(priv->workqueue, &priv->link_id_work) <= 0)
- wsm_unlock_tx(priv);
- spin_unlock(&priv->ps_state_lock);
+ wsm_unlock_tx(priv);
flush_workqueue(priv->workqueue);
- temp_linkid = cw1200_alloc_link_id(priv,
- &priv->action_frame_sa[0]);
- WARN_ON(!temp_linkid);
}
}
#endif