Commit 25bf6ce4 authored by Gabor Juhos's avatar Gabor Juhos Committed by John W. Linville

rt2x00: add queue_init callback to rt2x00_ops

The driver uses static data structures for initializing
specific fields of a given data queue. These static
queue data descriptor structures are containing values
which related to a given chipset.

Even though the values are chip specific, the actual
selection of the used structure is based on device
specific vendor/product identifiers. This approach works,
but it is not always reliable. Sometimes the vendor and/or
device IDs of the PCI and USB devices contains improper
values which makes it impossible to select the correct
structure for such devices.

The patch adds a new callback to tr2x00_ops which
is called after the chipset detection is finished.
This allows the drivers to do dynamic initialization
of the data_queue structure for a given queue based
on the actual chipset.

After each driver implements the queue_init callback,
the data_queue_desc structure will be removed.
Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
Acked-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 04453e9b
...@@ -653,6 +653,7 @@ struct rt2x00_ops { ...@@ -653,6 +653,7 @@ struct rt2x00_ops {
const struct data_queue_desc *tx; const struct data_queue_desc *tx;
const struct data_queue_desc *bcn; const struct data_queue_desc *bcn;
const struct data_queue_desc *atim; const struct data_queue_desc *atim;
void (*queue_init)(struct data_queue *queue);
const struct rt2x00lib_ops *lib; const struct rt2x00lib_ops *lib;
const void *drv; const void *drv;
const struct ieee80211_ops *hw; const struct ieee80211_ops *hw;
......
...@@ -1306,8 +1306,6 @@ rt2x00queue_get_qdesc_by_qid(struct rt2x00_dev *rt2x00dev, ...@@ -1306,8 +1306,6 @@ rt2x00queue_get_qdesc_by_qid(struct rt2x00_dev *rt2x00dev,
static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev, static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
struct data_queue *queue, enum data_queue_qid qid) struct data_queue *queue, enum data_queue_qid qid)
{ {
const struct data_queue_desc *qdesc;
mutex_init(&queue->status_lock); mutex_init(&queue->status_lock);
spin_lock_init(&queue->tx_lock); spin_lock_init(&queue->tx_lock);
spin_lock_init(&queue->index_lock); spin_lock_init(&queue->index_lock);
...@@ -1319,14 +1317,20 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev, ...@@ -1319,14 +1317,20 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
queue->cw_min = 5; queue->cw_min = 5;
queue->cw_max = 10; queue->cw_max = 10;
qdesc = rt2x00queue_get_qdesc_by_qid(rt2x00dev, qid); if (rt2x00dev->ops->queue_init) {
BUG_ON(!qdesc); rt2x00dev->ops->queue_init(queue);
} else {
const struct data_queue_desc *qdesc;
qdesc = rt2x00queue_get_qdesc_by_qid(rt2x00dev, qid);
BUG_ON(!qdesc);
queue->limit = qdesc->entry_num; queue->limit = qdesc->entry_num;
queue->data_size = qdesc->data_size; queue->data_size = qdesc->data_size;
queue->desc_size = qdesc->desc_size; queue->desc_size = qdesc->desc_size;
queue->winfo_size = qdesc->winfo_size; queue->winfo_size = qdesc->winfo_size;
queue->priv_size = qdesc->priv_size; queue->priv_size = qdesc->priv_size;
}
queue->threshold = DIV_ROUND_UP(queue->limit, 10); queue->threshold = DIV_ROUND_UP(queue->limit, 10);
} }
......
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