summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-10-04 22:48:03 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 10:22:55 +0200
commit868040fa7b15aa1adf7af925f89dfa6c3b0b7a3c (patch)
treeb3cfbfec2113e0e788a5270c44cce8507bd24a8b
parent981db2f065cbba810c39290ac8906c2ae68f3b6b (diff)
cw1200: queue dependency refactoring.
According to the driver design queue should know as less as possible about other components. Last commits violate this "rule" by transpatent arguments like tid. This patch is fixing these violations. No functional changes in this commit. Change-Id: I078835dc0263ef71fa2d50a1d9bfae2c04bab440 Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33540 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
-rw-r--r--drivers/staging/cw1200/debug.c2
-rw-r--r--drivers/staging/cw1200/queue.c49
-rw-r--r--drivers/staging/cw1200/queue.h16
-rw-r--r--drivers/staging/cw1200/txrx.c47
-rw-r--r--drivers/staging/cw1200/txrx.h8
-rw-r--r--drivers/staging/cw1200/wsm.c22
6 files changed, 74 insertions, 70 deletions
diff --git a/drivers/staging/cw1200/debug.c b/drivers/staging/cw1200/debug.c
index 6ec0d086d8b..e1fc0a8a748 100644
--- a/drivers/staging/cw1200/debug.c
+++ b/drivers/staging/cw1200/debug.c
@@ -384,7 +384,7 @@ static ssize_t cw1200_11n_read(struct file *file,
}
static ssize_t cw1200_11n_write(struct file *file,
- char __user *user_buf, size_t count, loff_t *ppos)
+ const char __user *user_buf, size_t count, loff_t *ppos)
{
struct cw1200_common *priv = file->private_data;
struct ieee80211_supported_band *band[2] = {
diff --git a/drivers/staging/cw1200/queue.c b/drivers/staging/cw1200/queue.c
index ef7d48488bd..c667c433766 100644
--- a/drivers/staging/cw1200/queue.c
+++ b/drivers/staging/cw1200/queue.c
@@ -20,16 +20,8 @@
struct list_head head;
struct sk_buff *skb;
u32 packetID;
- /* For safety purposes only. I do not trust device too much.
- * It was observed (last time quite long time ago) that it
- * indicates TX for a packet several times, so it was not enough
- * to use offset or address as an uniquie ID in a
- * queue.
- */
+ struct cw1200_txpriv txpriv;
u8 generation;
- u8 link_id;
- u8 raw_link_id;
- u8 tid;
};
static inline void __cw1200_queue_lock(struct cw1200_queue *queue,
@@ -200,20 +192,18 @@ size_t cw1200_queue_get_num_queued(struct cw1200_queue *queue,
}
int cw1200_queue_put(struct cw1200_queue *queue, struct cw1200_common *priv,
- struct sk_buff *skb, struct tx_info *txinfo,
- u8 raw_link_id, u8 tid)
+ struct sk_buff *skb, struct cw1200_txpriv *txpriv)
{
int ret;
struct wsm_tx *wsm;
struct cw1200_queue_stats *stats = queue->stats;
- u8 link_id = txinfo->link_id;
wsm = (struct wsm_tx *)skb_push(skb, sizeof(struct wsm_tx));
- ret = cw1200_skb_to_wsm(priv, skb, wsm, txinfo);
+ ret = cw1200_skb_to_wsm(priv, skb, wsm, txpriv);
if (ret)
return ret;
- if (link_id >= queue->stats->map_capacity)
+ if (txpriv->link_id >= queue->stats->map_capacity)
return -EINVAL;
spin_lock_bh(&queue->lock);
@@ -224,21 +214,19 @@ int cw1200_queue_put(struct cw1200_queue *queue, struct cw1200_common *priv,
list_move_tail(&item->head, &queue->queue);
item->skb = skb;
+ item->txpriv = *txpriv;
item->generation = 0;
item->packetID = cw1200_queue_make_packet_id(
queue->generation, queue->queue_id,
item->generation, item - queue->pool);
wsm->packetID = __cpu_to_le32(item->packetID);
- item->link_id = link_id;
- item->raw_link_id = raw_link_id;
- item->tid = tid;
++queue->num_queued;
- ++queue->link_map_cache[link_id];
+ ++queue->link_map_cache[txpriv->link_id];
spin_lock_bh(&stats->lock);
++stats->num_queued;
- ++stats->link_map_cache[link_id];
+ ++stats->link_map_cache[txpriv->link_id];
spin_unlock_bh(&stats->lock);
if (queue->num_queued >= queue->capacity) {
@@ -256,7 +244,7 @@ int cw1200_queue_get(struct cw1200_queue *queue,
u32 link_id_map,
struct wsm_tx **tx,
struct ieee80211_tx_info **tx_info,
- int *link_id)
+ const struct cw1200_txpriv **txpriv)
{
int ret = -ENOENT;
struct cw1200_queue_item *item;
@@ -265,7 +253,7 @@ int cw1200_queue_get(struct cw1200_queue *queue,
spin_lock_bh(&queue->lock);
list_for_each_entry(item, &queue->queue, head) {
- if (link_id_map & BIT(item->link_id)) {
+ if (link_id_map & BIT(item->txpriv.link_id)) {
ret = 0;
break;
}
@@ -274,14 +262,14 @@ int cw1200_queue_get(struct cw1200_queue *queue,
if (!WARN_ON(ret)) {
*tx = (struct wsm_tx *)item->skb->data;
*tx_info = IEEE80211_SKB_CB(item->skb);
- *link_id = item->raw_link_id;
+ *txpriv = &item->txpriv;
list_move_tail(&item->head, &queue->pending);
++queue->num_pending;
- --queue->link_map_cache[item->link_id];
+ --queue->link_map_cache[item->txpriv.link_id];
spin_lock_bh(&stats->lock);
--stats->num_queued;
- if (!--stats->link_map_cache[item->link_id])
+ if (!--stats->link_map_cache[item->txpriv.link_id])
wakeup_stats = true;
spin_unlock_bh(&stats->lock);
}
@@ -316,11 +304,11 @@ int cw1200_queue_requeue(struct cw1200_queue *queue, u32 packetID)
} else {
struct wsm_tx *wsm = (struct wsm_tx *)item->skb->data;
--queue->num_pending;
- ++queue->link_map_cache[item->link_id];
+ ++queue->link_map_cache[item->txpriv.link_id];
spin_lock_bh(&stats->lock);
++stats->num_queued;
- ++stats->link_map_cache[item->link_id];
+ ++stats->link_map_cache[item->txpriv.link_id];
spin_unlock_bh(&stats->lock);
item->generation = ++item_generation;
@@ -343,11 +331,11 @@ int cw1200_queue_requeue_all(struct cw1200_queue *queue)
struct wsm_tx *wsm = (struct wsm_tx *)item->skb->data;
--queue->num_pending;
- ++queue->link_map_cache[item->link_id];
+ ++queue->link_map_cache[item->txpriv.link_id];
spin_lock_bh(&stats->lock);
++stats->num_queued;
- ++stats->link_map_cache[item->link_id];
+ ++stats->link_map_cache[item->txpriv.link_id];
spin_unlock_bh(&stats->lock);
++item->generation;
@@ -411,7 +399,8 @@ int cw1200_queue_remove(struct cw1200_queue *queue, struct cw1200_common *priv,
}
int cw1200_queue_get_skb(struct cw1200_queue *queue, u32 packetID,
- struct sk_buff **skb, int *tid)
+ struct sk_buff **skb,
+ const struct cw1200_txpriv **txpriv)
{
int ret = 0;
u8 queue_generation, queue_id, item_generation, item_id;
@@ -433,7 +422,7 @@ int cw1200_queue_get_skb(struct cw1200_queue *queue, u32 packetID,
ret = -ENOENT;
} else {
*skb = item->skb;
- *tid = item->tid;
+ *txpriv = &item->txpriv;
item->skb = NULL;
}
spin_unlock_bh(&queue->lock);
diff --git a/drivers/staging/cw1200/queue.h b/drivers/staging/cw1200/queue.h
index d1802c36f02..195d6acb6ec 100644
--- a/drivers/staging/cw1200/queue.h
+++ b/drivers/staging/cw1200/queue.h
@@ -18,7 +18,7 @@
/* extern */ struct wsm_tx;
/* extern */ struct cw1200_common;
/* extern */ struct ieee80211_tx_queue_stats;
-/* extern */ struct tx_info;
+/* extern */ struct cw1200_txpriv;
/* forward */ struct cw1200_queue_stats;
@@ -48,6 +48,12 @@ struct cw1200_queue_stats {
wait_queue_head_t wait_link_id_empty;
};
+struct cw1200_txpriv {
+ u8 link_id;
+ u8 raw_link_id;
+ u8 tid;
+};
+
int cw1200_queue_stats_init(struct cw1200_queue_stats *stats,
size_t map_capacity);
int cw1200_queue_init(struct cw1200_queue *queue,
@@ -61,19 +67,19 @@ void cw1200_queue_deinit(struct cw1200_queue *queue);
size_t cw1200_queue_get_num_queued(struct cw1200_queue *queue,
u32 link_id_map);
int cw1200_queue_put(struct cw1200_queue *queue, struct cw1200_common *cw1200,
- struct sk_buff *skb, struct tx_info *txinfo,
- u8 raw_link_id, u8 tid);
+ struct sk_buff *skb, struct cw1200_txpriv *txpriv);
int cw1200_queue_get(struct cw1200_queue *queue,
u32 link_id_map,
struct wsm_tx **tx,
struct ieee80211_tx_info **tx_info,
- int *link_id);
+ const struct cw1200_txpriv **txpriv);
int cw1200_queue_requeue(struct cw1200_queue *queue, u32 packetID);
int cw1200_queue_requeue_all(struct cw1200_queue *queue);
int cw1200_queue_remove(struct cw1200_queue *queue, struct cw1200_common *priv,
u32 packetID);
int cw1200_queue_get_skb(struct cw1200_queue *queue, u32 packetID,
- struct sk_buff **skb, int *tid);
+ struct sk_buff **skb,
+ const struct cw1200_txpriv **txpriv);
void cw1200_queue_lock(struct cw1200_queue *queue,
struct cw1200_common *cw1200);
void cw1200_queue_unlock(struct cw1200_queue *queue,
diff --git a/drivers/staging/cw1200/txrx.c b/drivers/staging/cw1200/txrx.c
index b0028ae81dc..5a55386127c 100644
--- a/drivers/staging/cw1200/txrx.c
+++ b/drivers/staging/cw1200/txrx.c
@@ -24,6 +24,12 @@
#define tx_policy_printk(...)
#endif
+/* txrx private */
+struct __cw1200_txpriv {
+ struct cw1200_txpriv super;
+ u16 ethertype;
+};
+
static int cw1200_handle_action_rx(struct cw1200_common *priv,
struct sk_buff *skb);
static int cw1200_handle_action_tx(struct cw1200_common *priv,
@@ -371,8 +377,10 @@ cw1200_get_tx_rate(const struct cw1200_common *priv,
/* NOTE: cw1200_skb_to_wsm executes in atomic context. */
int cw1200_skb_to_wsm(struct cw1200_common *priv, struct sk_buff *skb,
- struct wsm_tx *wsm, struct tx_info *txinfo)
+ struct wsm_tx *wsm, struct cw1200_txpriv *txpriv)
{
+ struct __cw1200_txpriv *info =
+ container_of(txpriv, struct __cw1200_txpriv, super);
bool tx_policy_renew = false;
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
const struct ieee80211_rate *rate = cw1200_get_tx_rate(priv,
@@ -416,7 +424,7 @@ int cw1200_skb_to_wsm(struct cw1200_common *priv, struct sk_buff *skb,
struct ieee80211_hdr *hdr =
(struct ieee80211_hdr *)(skb->data + sizeof(struct wsm_tx));
- if (cpu_to_be16(txinfo->ethertype) == ETH_P_PAE)
+ if (cpu_to_be16(info->ethertype) == ETH_P_PAE)
priority = WSM_EPTA_PRIORITY_EAPOL;
else if (ieee80211_is_action(hdr->frame_control))
priority = WSM_EPTA_PRIORITY_ACTION;
@@ -449,14 +457,15 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
struct ieee80211_hdr *hdr =
(struct ieee80211_hdr *)skb->data;
int was_buffered = 0;
- int tid = CW1200_MAX_TID;
const u8 *da = ieee80211_get_DA(hdr);
struct cw1200_sta_priv *sta_priv =
(struct cw1200_sta_priv *)&tx_info->control.sta->drv_priv;
int link_id, raw_link_id;
int ret;
int i;
- struct tx_info txinfo;
+ struct __cw1200_txpriv txpriv = {
+ .super.tid = CW1200_MAX_TID,
+ };
if (likely(tx_info->control.sta && sta_priv->link_id))
raw_link_id = link_id = sta_priv->link_id;
@@ -503,15 +512,15 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
} else if (ieee80211_is_data_qos(hdr->frame_control) ||
ieee80211_is_qos_nullfunc(hdr->frame_control)) {
u8 *qos = ieee80211_get_qos_ctl(hdr);
- tid = qos[0] & IEEE80211_QOS_CTL_TID_MASK;
+ txpriv.super.tid = qos[0] & IEEE80211_QOS_CTL_TID_MASK;
} else if (ieee80211_is_data(hdr->frame_control) ||
ieee80211_is_nullfunc(hdr->frame_control)) {
- tid = 0;
+ txpriv.super.tid = 0;
}
/* BT Coex support related configuration */
if (priv->is_BT_Present) {
- txinfo.ethertype = 0;
+ txpriv.ethertype = 0;
if (ieee80211_is_data_qos(hdr->frame_control) ||
ieee80211_is_data(hdr->frame_control)) {
@@ -520,7 +529,7 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
/* Skip LLC SNAP header (+6) */
if (headerlen > 0)
- txinfo.ethertype =
+ txpriv.ethertype =
*((u16 *)(skb->data + headerlen + 6));
}
else if (ieee80211_is_assoc_req(hdr->frame_control) ||
@@ -621,19 +630,20 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
&priv->multicast_start_work);
}
- txinfo.link_id = link_id;
-
- if (raw_link_id && tid < CW1200_MAX_TID)
+ if (raw_link_id && txpriv.super.tid < CW1200_MAX_TID)
was_buffered = priv->link_id_db[raw_link_id - 1]
- .buffered[tid]++;
+ .buffered[txpriv.super.tid]++;
+ txpriv.super.link_id = link_id;
+ txpriv.super.raw_link_id = raw_link_id;
ret = cw1200_queue_put(&priv->tx_queue[queue], priv, skb,
- &txinfo, raw_link_id, tid);
+ &txpriv.super);
spin_unlock_bh(&priv->buffered_multicasts_lock);
- if (raw_link_id && !was_buffered && tid < CW1200_MAX_TID)
- ieee80211_sta_set_buffered(tx_info->control.sta, tid, true);
+ if (raw_link_id && !was_buffered && txpriv.super.tid < CW1200_MAX_TID)
+ ieee80211_sta_set_buffered(tx_info->control.sta,
+ txpriv.super.tid, true);
if (!WARN_ON(ret))
cw1200_bh_wakeup(priv);
@@ -739,7 +749,7 @@ void cw1200_tx_confirm_cb(struct cw1200_common *priv,
u8 queue_id = cw1200_queue_get_queue_id(arg->packetID);
struct cw1200_queue *queue = &priv->tx_queue[queue_id];
struct sk_buff *skb;
- int tid = CW1200_MAX_TID;
+ const struct cw1200_txpriv *txpriv = NULL;
txrx_printk(KERN_DEBUG "[TX] TX confirm: %d, %d.\n",
arg->status, arg->ackFailures);
@@ -773,7 +783,7 @@ void cw1200_tx_confirm_cb(struct cw1200_common *priv,
WARN_ON(cw1200_queue_requeue(queue,
arg->packetID));
} else if (!WARN_ON(cw1200_queue_get_skb(
- queue, arg->packetID, &skb, &tid))) {
+ queue, arg->packetID, &skb, &txpriv))) {
struct ieee80211_tx_info *tx = IEEE80211_SKB_CB(skb);
struct wsm_tx *wsm_tx = (struct wsm_tx *)skb->data;
int rate_id = (wsm_tx->flags >> 4) & 0x07;
@@ -827,7 +837,8 @@ void cw1200_tx_confirm_cb(struct cw1200_common *priv,
}
skb_pull(skb, sizeof(struct wsm_tx));
- cw1200_notify_buffered_tx(priv, skb, arg->link_id, tid);
+ cw1200_notify_buffered_tx(priv, skb, arg->link_id,
+ txpriv->tid);
ieee80211_tx_status(priv->hw, skb);
WARN_ON(cw1200_queue_remove(queue, priv, arg->packetID));
}
diff --git a/drivers/staging/cw1200/txrx.h b/drivers/staging/cw1200/txrx.h
index 4bf792f23a8..87dbdfa949c 100644
--- a/drivers/staging/cw1200/txrx.h
+++ b/drivers/staging/cw1200/txrx.h
@@ -18,6 +18,7 @@
/* extern */ struct sk_buff;
/* extern */ struct wsm_tx;
/* extern */ struct wsm_tx_confirm;
+/* extern */ struct cw1200_txpriv;
struct tx_policy {
union {
@@ -43,11 +44,6 @@ struct tx_policy_cache {
spinlock_t lock;
};
-struct tx_info {
- u8 link_id;
- u16 ethertype;
-};
-
/* ******************************************************************** */
/* TX policy cache */
/* Intention of TX policy cache is an overcomplicated WSM API.
@@ -66,7 +62,7 @@ u32 cw1200_rate_mask_to_wsm(struct cw1200_common *priv,
u32 rates);
int cw1200_skb_to_wsm(struct cw1200_common *priv,
struct sk_buff *skb, struct wsm_tx *wsm,
- struct tx_info *txinfo);
+ struct cw1200_txpriv *txpriv);
void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb);
void cw1200_notify_buffered_tx(struct cw1200_common *priv,
struct sk_buff *skb, int link_id, int tid);
diff --git a/drivers/staging/cw1200/wsm.c b/drivers/staging/cw1200/wsm.c
index 0a3b564face..415fbcbee59 100644
--- a/drivers/staging/cw1200/wsm.c
+++ b/drivers/staging/cw1200/wsm.c
@@ -1399,7 +1399,7 @@ static bool wsm_handle_tx_data(struct cw1200_common *priv,
* probe responses.
* The easiest way to get it back is to convert
* probe request into WSM start_scan command. */
- int tid;
+ const struct cw1200_txpriv *txpriv;
int rate_id = (wsm->flags >> 4) & 0x07;
struct cw1200_queue *queue =
&priv->tx_queue[cw1200_queue_get_queue_id(
@@ -1410,7 +1410,7 @@ static bool wsm_handle_tx_data(struct cw1200_common *priv,
BUG_ON(priv->scan.probe_skb);
BUG_ON(cw1200_queue_get_skb(queue,
wsm->packetID,
- &priv->scan.probe_skb, &tid));
+ &priv->scan.probe_skb, &txpriv));
BUG_ON(cw1200_queue_remove(queue, priv,
wsm->packetID));
/* Release used TX rate policy */
@@ -1426,15 +1426,16 @@ static bool wsm_handle_tx_data(struct cw1200_common *priv,
* We are dropping everything except AUTH in non-joined mode. */
struct sk_buff *skb;
int rate_id = (wsm->flags >> 4) & 0x07;
- int tid = 8;
+ const struct cw1200_txpriv *txpriv = NULL;
struct cw1200_queue *queue =
&priv->tx_queue[cw1200_queue_get_queue_id(
wsm->packetID)];
wsm_printk(KERN_DEBUG "[WSM] Drop frame (0x%.4X):"
" not joined.\n", fctl);
- BUG_ON(cw1200_queue_get_skb(queue, wsm->packetID, &skb, &tid));
+ BUG_ON(cw1200_queue_get_skb(queue, wsm->packetID,
+ &skb, &txpriv));
skb_pull(skb, sizeof(struct wsm_tx));
- cw1200_notify_buffered_tx(priv, skb, link_id, tid);
+ cw1200_notify_buffered_tx(priv, skb, link_id, txpriv->tid);
BUG_ON(cw1200_queue_remove(queue, priv, wsm->packetID));
/* Release used TX rate policy */
tx_policy_put(priv, rate_id);
@@ -1580,7 +1581,7 @@ int wsm_get_tx(struct cw1200_common *priv, u8 **data,
struct ieee80211_tx_info *tx_info;
struct cw1200_queue *queue;
u32 tx_allowed_mask = 0;
- int link_id;
+ const struct cw1200_txpriv *txpriv = NULL;
/*
* Count was intended as an input for wsm->more flag.
* During implementation it was found that wsm->more
@@ -1629,17 +1630,18 @@ int wsm_get_tx(struct cw1200_common *priv, u8 **data,
if (cw1200_queue_get(queue,
tx_allowed_mask,
- &wsm, &tx_info, &link_id))
+ &wsm, &tx_info, &txpriv))
continue;
- if (wsm_handle_tx_data(priv, wsm, tx_info, link_id))
+ if (wsm_handle_tx_data(priv, wsm,
+ tx_info, txpriv->raw_link_id))
continue; /* Handled by WSM */
wsm->hdr.id &= __cpu_to_le16(
~WSM_TX_LINK_ID(WSM_TX_LINK_ID_MAX));
wsm->hdr.id |= cpu_to_le16(
- WSM_TX_LINK_ID(link_id));
- priv->pspoll_mask &= ~BIT(link_id);
+ WSM_TX_LINK_ID(txpriv->raw_link_id));
+ priv->pspoll_mask &= ~BIT(txpriv->raw_link_id);
*data = (u8 *)wsm;
*tx_len = __le16_to_cpu(wsm->hdr.len);