All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 00/14] rt2x00: get rid of static data queue descriptors
@ 2013-05-02 12:30 Gabor Juhos
  2013-05-02 12:30 ` [RFC 01/14] rt2x00: rt2x00queue: add priv_size field to struct data_queue Gabor Juhos
                   ` (13 more replies)
  0 siblings, 14 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The patch-set depends on the following series:

'rt2x00: avoid a few superfluous pointer dereferences'

which are available here:

https://patchwork.kernel.org/bundle/juhosg/rt2x00-avoid-a-few-superfluous-pointer-dereference/

Gabor Juhos (14):
  rt2x00: rt2x00queue: add priv_size field to struct data_queue
  rt2x00: rt2x00queue: move data_queue field initialization to rt2x00queue_init
  rt2x00: rt2x00queue: remove qdesc parameter of rt2x00queue_alloc_entries
  rt2x00: rt2x00dev: use rt2x00dev->bcn->limit
  rt2x00: rt2x00queue: setup queue->threshold from queue->limit
  rt2x00: add queue_init callback to rt2x00_ops
  rt2x00: rt2800usb: implement queue_init callback
  rt2x00: rt2800pci: implement queue_init callback
  rt2x00: rt73usb: implement queue_init callback
  rt2x00: rt2400pci: implement queue_init callback
  rt2x00: rt2500pci: implement queue_init callback
  rt2x00: rt61pci: implement queue_init callback
  rt2x00: rt2500usb: implement queue_init callback
  rt2x00: remove data_queue_desc struct

 drivers/net/wireless/rt2x00/rt2400pci.c   |   65 +++++++++++--------
 drivers/net/wireless/rt2x00/rt2500pci.c   |   65 +++++++++++--------
 drivers/net/wireless/rt2x00/rt2500usb.c   |   65 +++++++++++--------
 drivers/net/wireless/rt2x00/rt2800pci.c   |   60 ++++++++++-------
 drivers/net/wireless/rt2x00/rt2800usb.c   |  100 ++++++++++++++---------------
 drivers/net/wireless/rt2x00/rt2x00.h      |    5 +-
 drivers/net/wireless/rt2x00/rt2x00dev.c   |    2 +-
 drivers/net/wireless/rt2x00/rt2x00queue.c |   26 ++++----
 drivers/net/wireless/rt2x00/rt2x00queue.h |   21 +-----
 drivers/net/wireless/rt2x00/rt61pci.c     |   54 ++++++++++------
 drivers/net/wireless/rt2x00/rt73usb.c     |   54 ++++++++++------
 11 files changed, 276 insertions(+), 241 deletions(-)

--
1.7.10


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [RFC 01/14] rt2x00: rt2x00queue: add priv_size field to struct data_queue
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 02/14] rt2x00: rt2x00queue: move data_queue field initialization to rt2x00queue_init Gabor Juhos
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

Add a new field into struct data_queue and store
the size of the per-queue_entry private data in
that. Additionally, use the new field in the
rt2x00queue_alloc_entries function to compute
the size of the queue entries for a given queue.

This does not change the current behaviour but
makes it possible to move the initialization of
the queue_data fields into the rt2x00queue_init
routine.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00queue.c |    5 +++--
 drivers/net/wireless/rt2x00/rt2x00queue.h |    2 ++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 2c12311..15714a2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1175,11 +1175,12 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,
 	queue->data_size = qdesc->data_size;
 	queue->desc_size = qdesc->desc_size;
 	queue->winfo_size = qdesc->winfo_size;
+	queue->priv_size = qdesc->priv_size;
 
 	/*
 	 * Allocate all queue entries.
 	 */
-	entry_size = sizeof(*entries) + qdesc->priv_size;
+	entry_size = sizeof(*entries) + queue->priv_size;
 	entries = kcalloc(queue->limit, entry_size, GFP_KERNEL);
 	if (!entries)
 		return -ENOMEM;
@@ -1195,7 +1196,7 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,
 		entries[i].entry_idx = i;
 		entries[i].priv_data =
 		    QUEUE_ENTRY_PRIV_OFFSET(entries, i, queue->limit,
-					    sizeof(*entries), qdesc->priv_size);
+					    sizeof(*entries), queue->priv_size);
 	}
 
 #undef QUEUE_ENTRY_PRIV_OFFSET
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 4a7b34e..2cf4903 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -453,6 +453,7 @@ enum data_queue_flags {
  * @cw_max: The cw max value for outgoing frames (field ignored in RX queue).
  * @data_size: Maximum data size for the frames in this queue.
  * @desc_size: Hardware descriptor size for the data in this queue.
+ * @priv_size: Size of per-queue_entry private data.
  * @usb_endpoint: Device endpoint used for communication (USB only)
  * @usb_maxpacket: Max packet size for given endpoint (USB only)
  */
@@ -481,6 +482,7 @@ struct data_queue {
 	unsigned short data_size;
 	unsigned char  desc_size;
 	unsigned char  winfo_size;
+	unsigned short priv_size;
 
 	unsigned short usb_endpoint;
 	unsigned short usb_maxpacket;
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 02/14] rt2x00: rt2x00queue: move data_queue field initialization to rt2x00queue_init
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
  2013-05-02 12:30 ` [RFC 01/14] rt2x00: rt2x00queue: add priv_size field to struct data_queue Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 03/14] rt2x00: rt2x00queue: remove qdesc parameter of rt2x00queue_alloc_entries Gabor Juhos
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

Some fileds of the data queues are initialized
in the rt2x00queue_alloc_entries routine before
the queue entries are allocated, however the
initialization code is not strictly related to
the allocation.

Move the code into the rt2x00queu_init function.
It is a more logical place and the change ensures
that the queue_data fields can be used in device
probe routines.

The patch also introduces a helper function in
order to be able to get the correct data_queue_desc
structure for a given queue. This helper is only
needed temporarily and it will be removed later.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00queue.c |   46 ++++++++++++++++++++++++-----
 1 file changed, 39 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 15714a2..7f938a5 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1170,13 +1170,6 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue,
 
 	rt2x00queue_reset(queue);
 
-	queue->limit = qdesc->entry_num;
-	queue->threshold = DIV_ROUND_UP(qdesc->entry_num, 10);
-	queue->data_size = qdesc->data_size;
-	queue->desc_size = qdesc->desc_size;
-	queue->winfo_size = qdesc->winfo_size;
-	queue->priv_size = qdesc->priv_size;
-
 	/*
 	 * Allocate all queue entries.
 	 */
@@ -1285,9 +1278,38 @@ void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev)
 	}
 }
 
+static const struct data_queue_desc *
+rt2x00queue_get_qdesc_by_qid(struct rt2x00_dev *rt2x00dev,
+			     enum data_queue_qid qid)
+{
+	switch (qid) {
+	case QID_RX:
+		return rt2x00dev->ops->rx;
+
+	case QID_AC_BE:
+	case QID_AC_BK:
+	case QID_AC_VO:
+	case QID_AC_VI:
+		return rt2x00dev->ops->tx;
+
+	case QID_BEACON:
+		return rt2x00dev->ops->bcn;
+
+	case QID_ATIM:
+		return rt2x00dev->ops->atim;
+
+	default:
+		break;
+	}
+
+	return NULL;
+}
+
 static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 			     struct data_queue *queue, enum data_queue_qid qid)
 {
+	const struct data_queue_desc *qdesc;
+
 	mutex_init(&queue->status_lock);
 	spin_lock_init(&queue->tx_lock);
 	spin_lock_init(&queue->index_lock);
@@ -1298,6 +1320,16 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 	queue->aifs = 2;
 	queue->cw_min = 5;
 	queue->cw_max = 10;
+
+	qdesc = rt2x00queue_get_qdesc_by_qid(rt2x00dev, qid);
+	BUG_ON(!qdesc);
+
+	queue->limit = qdesc->entry_num;
+	queue->threshold = DIV_ROUND_UP(qdesc->entry_num, 10);
+	queue->data_size = qdesc->data_size;
+	queue->desc_size = qdesc->desc_size;
+	queue->winfo_size = qdesc->winfo_size;
+	queue->priv_size = qdesc->priv_size;
 }
 
 int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 03/14] rt2x00: rt2x00queue: remove qdesc parameter of rt2x00queue_alloc_entries
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
  2013-05-02 12:30 ` [RFC 01/14] rt2x00: rt2x00queue: add priv_size field to struct data_queue Gabor Juhos
  2013-05-02 12:30 ` [RFC 02/14] rt2x00: rt2x00queue: move data_queue field initialization to rt2x00queue_init Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 04/14] rt2x00: rt2x00dev: use rt2x00dev->bcn->limit Gabor Juhos
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The qdesc parameter is not used anymore, so remove that.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00queue.c |   12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 7f938a5..c12d1c8 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1161,8 +1161,7 @@ void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev)
 	}
 }
 
-static int rt2x00queue_alloc_entries(struct data_queue *queue,
-				     const struct data_queue_desc *qdesc)
+static int rt2x00queue_alloc_entries(struct data_queue *queue)
 {
 	struct queue_entry *entries;
 	unsigned int entry_size;
@@ -1231,23 +1230,22 @@ int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)
 	struct data_queue *queue;
 	int status;
 
-	status = rt2x00queue_alloc_entries(rt2x00dev->rx, rt2x00dev->ops->rx);
+	status = rt2x00queue_alloc_entries(rt2x00dev->rx);
 	if (status)
 		goto exit;
 
 	tx_queue_for_each(rt2x00dev, queue) {
-		status = rt2x00queue_alloc_entries(queue, rt2x00dev->ops->tx);
+		status = rt2x00queue_alloc_entries(queue);
 		if (status)
 			goto exit;
 	}
 
-	status = rt2x00queue_alloc_entries(rt2x00dev->bcn, rt2x00dev->ops->bcn);
+	status = rt2x00queue_alloc_entries(rt2x00dev->bcn);
 	if (status)
 		goto exit;
 
 	if (test_bit(REQUIRE_ATIM_QUEUE, &rt2x00dev->cap_flags)) {
-		status = rt2x00queue_alloc_entries(rt2x00dev->atim,
-						   rt2x00dev->ops->atim);
+		status = rt2x00queue_alloc_entries(rt2x00dev->atim);
 		if (status)
 			goto exit;
 	}
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 04/14] rt2x00: rt2x00dev: use rt2x00dev->bcn->limit
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (2 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 03/14] rt2x00: rt2x00queue: remove qdesc parameter of rt2x00queue_alloc_entries Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 05/14] rt2x00: rt2x00queue: setup queue->threshold from queue->limit Gabor Juhos
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The beacon data queue is initialized already,
so fetch the number of the queue entries from
that instead of using the entry_num field of
the data queue descriptor.

The two values are the same, and the use of the
rt2x00dev->bcn->limit value allows us to get rid
of a superfluous pointer dereference.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00dev.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 6a20172..dff5012 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -1336,7 +1336,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 	 * beacon entries.
 	 */
 	rt2x00dev->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-	if (rt2x00dev->ops->bcn->entry_num > 0)
+	if (rt2x00dev->bcn->limit > 0)
 		rt2x00dev->hw->wiphy->interface_modes |=
 		    BIT(NL80211_IFTYPE_ADHOC) |
 		    BIT(NL80211_IFTYPE_AP) |
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 05/14] rt2x00: rt2x00queue: setup queue->threshold from queue->limit
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (3 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 04/14] rt2x00: rt2x00dev: use rt2x00dev->bcn->limit Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 06/14] rt2x00: add queue_init callback to rt2x00_ops Gabor Juhos
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

Use the queue->limit value instead of the
qdesc->entry_num to compute the threshold.
The two source values are the same and the
data queue descriptor structure will be
removed by a later patch.

Also separate the computation from the rest
of the init code to make further changes
easier.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00queue.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index c12d1c8..3ae2264 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1323,11 +1323,12 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 	BUG_ON(!qdesc);
 
 	queue->limit = qdesc->entry_num;
-	queue->threshold = DIV_ROUND_UP(qdesc->entry_num, 10);
 	queue->data_size = qdesc->data_size;
 	queue->desc_size = qdesc->desc_size;
 	queue->winfo_size = qdesc->winfo_size;
 	queue->priv_size = qdesc->priv_size;
+
+	queue->threshold = DIV_ROUND_UP(queue->limit, 10);
 }
 
 int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 06/14] rt2x00: add queue_init callback to rt2x00_ops
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (4 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 05/14] rt2x00: rt2x00queue: setup queue->threshold from queue->limit Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 07/14] rt2x00: rt2800usb: implement queue_init callback Gabor Juhos
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

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: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00.h      |    1 +
 drivers/net/wireless/rt2x00/rt2x00queue.c |   22 +++++++++++++---------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 7510723..2d2db64 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -653,6 +653,7 @@ struct rt2x00_ops {
 	const struct data_queue_desc *tx;
 	const struct data_queue_desc *bcn;
 	const struct data_queue_desc *atim;
+	void (*queue_init)(struct data_queue *queue);
 	const struct rt2x00lib_ops *lib;
 	const void *drv;
 	const struct ieee80211_ops *hw;
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 3ae2264..2a99ff1 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1306,8 +1306,6 @@ rt2x00queue_get_qdesc_by_qid(struct rt2x00_dev *rt2x00dev,
 static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 			     struct data_queue *queue, enum data_queue_qid qid)
 {
-	const struct data_queue_desc *qdesc;
-
 	mutex_init(&queue->status_lock);
 	spin_lock_init(&queue->tx_lock);
 	spin_lock_init(&queue->index_lock);
@@ -1319,14 +1317,20 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 	queue->cw_min = 5;
 	queue->cw_max = 10;
 
-	qdesc = rt2x00queue_get_qdesc_by_qid(rt2x00dev, qid);
-	BUG_ON(!qdesc);
+	if (rt2x00dev->ops->queue_init) {
+		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->data_size = qdesc->data_size;
-	queue->desc_size = qdesc->desc_size;
-	queue->winfo_size = qdesc->winfo_size;
-	queue->priv_size = qdesc->priv_size;
+		queue->limit = qdesc->entry_num;
+		queue->data_size = qdesc->data_size;
+		queue->desc_size = qdesc->desc_size;
+		queue->winfo_size = qdesc->winfo_size;
+		queue->priv_size = qdesc->priv_size;
+	}
 
 	queue->threshold = DIV_ROUND_UP(queue->limit, 10);
 }
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 07/14] rt2x00: rt2800usb: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (5 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 06/14] rt2x00: add queue_init callback to rt2x00_ops Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 08/14] rt2x00: rt2800pci: " Gabor Juhos
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

The actual chipset is already known when the callback
is used. This allows us to use a single callback for
all supported devices.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2800usb.c |  100 +++++++++++++++----------------
 1 file changed, 48 insertions(+), 52 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index c71a48d..b81d509 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -849,29 +849,54 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
 	.sta_remove		= rt2800_sta_remove,
 };
 
-static const struct data_queue_desc rt2800usb_queue_rx = {
-	.entry_num		= 128,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= RXINFO_DESC_SIZE,
-	.winfo_size		= RXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+static void rt2800usb_queue_init(struct data_queue *queue)
+{
+	struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
+	unsigned short txwi_size, rxwi_size;
 
-static const struct data_queue_desc rt2800usb_queue_tx = {
-	.entry_num		= 16,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= TXINFO_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	if (rt2x00_rt(rt2x00dev, RT5592)) {
+		txwi_size = TXWI_DESC_SIZE_5592;
+		rxwi_size = RXWI_DESC_SIZE_5592;
+	} else {
+		txwi_size = TXWI_DESC_SIZE;
+		rxwi_size = RXWI_DESC_SIZE;
+	}
 
-static const struct data_queue_desc rt2800usb_queue_bcn = {
-	.entry_num		= 8,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXINFO_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 128;
+		queue->data_size = AGGREGATION_SIZE;
+		queue->desc_size = RXINFO_DESC_SIZE;
+		queue->winfo_size = rxwi_size;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
+
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 16;
+		queue->data_size = AGGREGATION_SIZE;
+		queue->desc_size = TXINFO_DESC_SIZE;
+		queue->winfo_size = txwi_size;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
+
+	case QID_BEACON:
+		queue->limit = 8;
+		queue->data_size = MGMT_FRAME_SIZE;
+		queue->desc_size = TXINFO_DESC_SIZE;
+		queue->winfo_size = txwi_size;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
+
+	case QID_ATIM:
+		/* fallthrough */
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt2800usb_ops = {
 	.name			= KBUILD_MODNAME,
@@ -881,9 +906,7 @@ static const struct rt2x00_ops rt2800usb_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
-	.rx			= &rt2800usb_queue_rx,
-	.tx			= &rt2800usb_queue_tx,
-	.bcn			= &rt2800usb_queue_bcn,
+	.queue_init		= rt2800usb_queue_init,
 	.lib			= &rt2800usb_rt2x00_ops,
 	.drv			= &rt2800usb_rt2800_ops,
 	.hw			= &rt2800usb_mac80211_ops,
@@ -892,31 +915,6 @@ static const struct rt2x00_ops rt2800usb_ops = {
 #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
 };
 
-static const struct data_queue_desc rt2800usb_queue_rx_5592 = {
-	.entry_num		= 128,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= RXINFO_DESC_SIZE,
-	.winfo_size		= RXWI_DESC_SIZE_5592,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
-
-static const struct data_queue_desc rt2800usb_queue_tx_5592 = {
-	.entry_num		= 16,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= TXINFO_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE_5592,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
-
-static const struct data_queue_desc rt2800usb_queue_bcn_5592 = {
-	.entry_num		= 8,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXINFO_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE_5592,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
-
-
 static const struct rt2x00_ops rt2800usb_ops_5592 = {
 	.name			= KBUILD_MODNAME,
 	.drv_data_size		= sizeof(struct rt2800_drv_data),
@@ -925,9 +923,7 @@ static const struct rt2x00_ops rt2800usb_ops_5592 = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= TXINFO_DESC_SIZE + TXWI_DESC_SIZE_5592,
-	.rx			= &rt2800usb_queue_rx_5592,
-	.tx			= &rt2800usb_queue_tx_5592,
-	.bcn			= &rt2800usb_queue_bcn_5592,
+	.queue_init		= rt2800usb_queue_init,
 	.lib			= &rt2800usb_rt2x00_ops,
 	.drv			= &rt2800usb_rt2800_ops,
 	.hw			= &rt2800usb_mac80211_ops,
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 08/14] rt2x00: rt2800pci: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (6 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 07/14] rt2x00: rt2800usb: implement queue_init callback Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 09/14] rt2x00: rt73usb: " Gabor Juhos
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2800pci.c |   60 ++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 330f1d2..260c8b4 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -1186,29 +1186,43 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
 	.sta_remove		= rt2800_sta_remove,
 };
 
-static const struct data_queue_desc rt2800pci_queue_rx = {
-	.entry_num		= 128,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.winfo_size		= RXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+static void rt2800pci_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 128;
+		queue->data_size = AGGREGATION_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->winfo_size = RXWI_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2800pci_queue_tx = {
-	.entry_num		= 64,
-	.data_size		= AGGREGATION_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 64;
+		queue->data_size = AGGREGATION_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->winfo_size = TXWI_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2800pci_queue_bcn = {
-	.entry_num		= 8,
-	.data_size		= 0, /* No DMA required for beacons */
-	.desc_size		= TXD_DESC_SIZE,
-	.winfo_size		= TXWI_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_BEACON:
+		queue->limit = 8;
+		queue->data_size = 0; /* No DMA required for beacons */
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->winfo_size = TXWI_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
+
+	case QID_ATIM:
+		/* fallthrough */
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt2800pci_ops = {
 	.name			= KBUILD_MODNAME,
@@ -1218,9 +1232,7 @@ static const struct rt2x00_ops rt2800pci_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= TXWI_DESC_SIZE,
-	.rx			= &rt2800pci_queue_rx,
-	.tx			= &rt2800pci_queue_tx,
-	.bcn			= &rt2800pci_queue_bcn,
+	.queue_init		= rt2800pci_queue_init,
 	.lib			= &rt2800pci_rt2x00_ops,
 	.drv			= &rt2800pci_rt2800_ops,
 	.hw			= &rt2800pci_mac80211_ops,
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 09/14] rt2x00: rt73usb: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (7 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 08/14] rt2x00: rt2800pci: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 10/14] rt2x00: rt2400pci: " Gabor Juhos
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt73usb.c |   54 ++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 377e09b..b2e346a 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -2359,26 +2359,40 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
 	.config			= rt73usb_config,
 };
 
-static const struct data_queue_desc rt73usb_queue_rx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+static void rt73usb_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
 
-static const struct data_queue_desc rt73usb_queue_tx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
 
-static const struct data_queue_desc rt73usb_queue_bcn = {
-	.entry_num		= 4,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXINFO_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	case QID_BEACON:
+		queue->limit = 4;
+		queue->data_size = MGMT_FRAME_SIZE;
+		queue->desc_size = TXINFO_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
+
+	case QID_ATIM:
+		/* fallthrough */
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt73usb_ops = {
 	.name			= KBUILD_MODNAME,
@@ -2387,9 +2401,7 @@ static const struct rt2x00_ops rt73usb_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= TXD_DESC_SIZE,
-	.rx			= &rt73usb_queue_rx,
-	.tx			= &rt73usb_queue_tx,
-	.bcn			= &rt73usb_queue_bcn,
+	.queue_init		= rt73usb_queue_init,
 	.lib			= &rt73usb_rt2x00_ops,
 	.hw			= &rt73usb_mac80211_ops,
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 10/14] rt2x00: rt2400pci: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (8 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 09/14] rt2x00: rt73usb: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 11/14] rt2x00: rt2500pci: " Gabor Juhos
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Compile tested only.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2400pci.c |   65 ++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 28 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index f714373..e1ec9a4 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1767,33 +1767,45 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
 	.config			= rt2400pci_config,
 };
 
-static const struct data_queue_desc rt2400pci_queue_rx = {
-	.entry_num		= 24,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+static void rt2400pci_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 24;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2400pci_queue_tx = {
-	.entry_num		= 24,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 24;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2400pci_queue_bcn = {
-	.entry_num		= 1,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_BEACON:
+		queue->limit = 1;
+		queue->data_size = MGMT_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2400pci_queue_atim = {
-	.entry_num		= 8,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_ATIM:
+		queue->limit = 8;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
+
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt2400pci_ops = {
 	.name			= KBUILD_MODNAME,
@@ -1802,10 +1814,7 @@ static const struct rt2x00_ops rt2400pci_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= 0,
-	.rx			= &rt2400pci_queue_rx,
-	.tx			= &rt2400pci_queue_tx,
-	.bcn			= &rt2400pci_queue_bcn,
-	.atim			= &rt2400pci_queue_atim,
+	.queue_init		= rt2400pci_queue_init,
 	.lib			= &rt2400pci_rt2x00_ops,
 	.hw			= &rt2400pci_mac80211_ops,
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 11/14] rt2x00: rt2500pci: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (9 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 10/14] rt2x00: rt2400pci: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 12/14] rt2x00: rt61pci: " Gabor Juhos
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Compile tested only.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2500pci.c |   65 ++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 28 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 77e45b2..a1670e8 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -2056,33 +2056,45 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
 	.config			= rt2500pci_config,
 };
 
-static const struct data_queue_desc rt2500pci_queue_rx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+static void rt2500pci_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2500pci_queue_tx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2500pci_queue_bcn = {
-	.entry_num		= 1,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_BEACON:
+		queue->limit = 1;
+		queue->data_size = MGMT_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt2500pci_queue_atim = {
-	.entry_num		= 8,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_ATIM:
+		queue->limit = 8;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
+
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt2500pci_ops = {
 	.name			= KBUILD_MODNAME,
@@ -2091,10 +2103,7 @@ static const struct rt2x00_ops rt2500pci_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= 0,
-	.rx			= &rt2500pci_queue_rx,
-	.tx			= &rt2500pci_queue_tx,
-	.bcn			= &rt2500pci_queue_bcn,
-	.atim			= &rt2500pci_queue_atim,
+	.queue_init		= rt2500pci_queue_init,
 	.lib			= &rt2500pci_rt2x00_ops,
 	.hw			= &rt2500pci_mac80211_ops,
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 12/14] rt2x00: rt61pci: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (10 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 11/14] rt2x00: rt2500pci: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-06 16:06   ` [rt2x00-users] " Jakub Kicinski
  2013-05-02 12:30 ` [RFC 13/14] rt2x00: rt2500usb: " Gabor Juhos
  2013-05-02 12:30 ` [RFC 14/14] rt2x00: remove data_queue_desc struct Gabor Juhos
  13 siblings, 1 reply; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Compile tested only.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt61pci.c |   54 ++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 7e1759b..17507d1 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -3025,26 +3025,40 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
 	.config			= rt61pci_config,
 };
 
-static const struct data_queue_desc rt61pci_queue_rx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+static void rt61pci_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt61pci_queue_tx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
 
-static const struct data_queue_desc rt61pci_queue_bcn = {
-	.entry_num		= 4,
-	.data_size		= 0, /* No DMA required for beacons */
-	.desc_size		= TXINFO_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_mmio),
-};
+	case QID_BEACON:
+		queue->limit = 4;
+		queue->data_size = 0; /* No DMA required for beacons */
+		queue->desc_size = TXINFO_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_mmio);
+		break;
+
+	case QID_ATIM:
+		/* fallthrough */
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt61pci_ops = {
 	.name			= KBUILD_MODNAME,
@@ -3053,9 +3067,7 @@ static const struct rt2x00_ops rt61pci_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= 0,
-	.rx			= &rt61pci_queue_rx,
-	.tx			= &rt61pci_queue_tx,
-	.bcn			= &rt61pci_queue_bcn,
+	.queue_init		= rt61pci_queue_init,
 	.lib			= &rt61pci_rt2x00_ops,
 	.hw			= &rt61pci_mac80211_ops,
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 13/14] rt2x00: rt2500usb: implement queue_init callback
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (11 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 12/14] rt2x00: rt61pci: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  2013-05-02 12:30 ` [RFC 14/14] rt2x00: remove data_queue_desc struct Gabor Juhos
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

The generic rt2x00 code has been changed to allow the
drivers toimplement dynamic data_queue initialization.

Remove the static data queue descriptor structures
and implement the queue_init callback instead.

Compile tested only.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2500usb.c |   65 ++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 28 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index a7f7b36..e5e5479 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1867,33 +1867,45 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
 	.config			= rt2500usb_config,
 };
 
-static const struct data_queue_desc rt2500usb_queue_rx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= RXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+static void rt2500usb_queue_init(struct data_queue *queue)
+{
+	switch (queue->qid) {
+	case QID_RX:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = RXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
 
-static const struct data_queue_desc rt2500usb_queue_tx = {
-	.entry_num		= 32,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	case QID_AC_VO:
+	case QID_AC_VI:
+	case QID_AC_BE:
+	case QID_AC_BK:
+		queue->limit = 32;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
 
-static const struct data_queue_desc rt2500usb_queue_bcn = {
-	.entry_num		= 1,
-	.data_size		= MGMT_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb_bcn),
-};
+	case QID_BEACON:
+		queue->limit = 1;
+		queue->data_size = MGMT_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb_bcn);
+		break;
 
-static const struct data_queue_desc rt2500usb_queue_atim = {
-	.entry_num		= 8,
-	.data_size		= DATA_FRAME_SIZE,
-	.desc_size		= TXD_DESC_SIZE,
-	.priv_size		= sizeof(struct queue_entry_priv_usb),
-};
+	case QID_ATIM:
+		queue->limit = 8;
+		queue->data_size = DATA_FRAME_SIZE;
+		queue->desc_size = TXD_DESC_SIZE;
+		queue->priv_size = sizeof(struct queue_entry_priv_usb);
+		break;
+
+	default:
+		BUG();
+		break;
+	}
+}
 
 static const struct rt2x00_ops rt2500usb_ops = {
 	.name			= KBUILD_MODNAME,
@@ -1902,10 +1914,7 @@ static const struct rt2x00_ops rt2500usb_ops = {
 	.rf_size		= RF_SIZE,
 	.tx_queues		= NUM_TX_QUEUES,
 	.extra_tx_headroom	= TXD_DESC_SIZE,
-	.rx			= &rt2500usb_queue_rx,
-	.tx			= &rt2500usb_queue_tx,
-	.bcn			= &rt2500usb_queue_bcn,
-	.atim			= &rt2500usb_queue_atim,
+	.queue_init		= rt2500usb_queue_init,
 	.lib			= &rt2500usb_rt2x00_ops,
 	.hw			= &rt2500usb_mac80211_ops,
 #ifdef CONFIG_RT2X00_LIB_DEBUGFS
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [RFC 14/14] rt2x00: remove data_queue_desc struct
  2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
                   ` (12 preceding siblings ...)
  2013-05-02 12:30 ` [RFC 13/14] rt2x00: rt2500usb: " Gabor Juhos
@ 2013-05-02 12:30 ` Gabor Juhos
  13 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-02 12:30 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, users, Gabor Juhos

If the queue_init callback is implemented
by a driver it gets used instead of the
data_queue_desc based initialization.

The queue_init callback is implemented for
each drivers now, so the old initialization
method is not used anymore. Remove the unused
data_queue_desc structure and all of the
related code.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
 drivers/net/wireless/rt2x00/rt2x00.h      |    4 ---
 drivers/net/wireless/rt2x00/rt2x00queue.c |   42 +----------------------------
 drivers/net/wireless/rt2x00/rt2x00queue.h |   19 -------------
 3 files changed, 1 insertion(+), 64 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 2d2db64..2a17f7e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -649,10 +649,6 @@ struct rt2x00_ops {
 	const unsigned int rf_size;
 	const unsigned int tx_queues;
 	const unsigned int extra_tx_headroom;
-	const struct data_queue_desc *rx;
-	const struct data_queue_desc *tx;
-	const struct data_queue_desc *bcn;
-	const struct data_queue_desc *atim;
 	void (*queue_init)(struct data_queue *queue);
 	const struct rt2x00lib_ops *lib;
 	const void *drv;
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 2a99ff1..c4f1e2b 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -1276,33 +1276,6 @@ void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev)
 	}
 }
 
-static const struct data_queue_desc *
-rt2x00queue_get_qdesc_by_qid(struct rt2x00_dev *rt2x00dev,
-			     enum data_queue_qid qid)
-{
-	switch (qid) {
-	case QID_RX:
-		return rt2x00dev->ops->rx;
-
-	case QID_AC_BE:
-	case QID_AC_BK:
-	case QID_AC_VO:
-	case QID_AC_VI:
-		return rt2x00dev->ops->tx;
-
-	case QID_BEACON:
-		return rt2x00dev->ops->bcn;
-
-	case QID_ATIM:
-		return rt2x00dev->ops->atim;
-
-	default:
-		break;
-	}
-
-	return NULL;
-}
-
 static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 			     struct data_queue *queue, enum data_queue_qid qid)
 {
@@ -1317,20 +1290,7 @@ static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev,
 	queue->cw_min = 5;
 	queue->cw_max = 10;
 
-	if (rt2x00dev->ops->queue_init) {
-		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->data_size = qdesc->data_size;
-		queue->desc_size = qdesc->desc_size;
-		queue->winfo_size = qdesc->winfo_size;
-		queue->priv_size = qdesc->priv_size;
-	}
+	rt2x00dev->ops->queue_init(queue);
 
 	queue->threshold = DIV_ROUND_UP(queue->limit, 10);
 }
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 2cf4903..ebe1172 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -489,25 +489,6 @@ struct data_queue {
 };
 
 /**
- * struct data_queue_desc: Data queue description
- *
- * The information in this structure is used by drivers
- * to inform rt2x00lib about the creation of the data queue.
- *
- * @entry_num: Maximum number of entries for a queue.
- * @data_size: Maximum data size for the frames in this queue.
- * @desc_size: Hardware descriptor size for the data in this queue.
- * @priv_size: Size of per-queue_entry private data.
- */
-struct data_queue_desc {
-	unsigned short entry_num;
-	unsigned short data_size;
-	unsigned char  desc_size;
-	unsigned char  winfo_size;
-	unsigned short priv_size;
-};
-
-/**
  * queue_end - Return pointer to the last queue (HELPER MACRO).
  * @__dev: Pointer to &struct rt2x00_dev
  *
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [rt2x00-users] [RFC 12/14] rt2x00: rt61pci: implement queue_init callback
  2013-05-02 12:30 ` [RFC 12/14] rt2x00: rt61pci: " Gabor Juhos
@ 2013-05-06 16:06   ` Jakub Kicinski
  2013-05-06 19:16     ` Gabor Juhos
  0 siblings, 1 reply; 17+ messages in thread
From: Jakub Kicinski @ 2013-05-06 16:06 UTC (permalink / raw)
  To: Gabor Juhos; +Cc: John W. Linville, linux-wireless, users

On Thu,  2 May 2013 14:30:27 +0200, Gabor Juhos wrote:
> The generic rt2x00 code has been changed to allow the
> drivers toimplement dynamic data_queue initialization.
>
> Remove the static data queue descriptor structures
> and implement the queue_init callback instead.
>
> Compile tested only.
>
> Signed-off-by: Gabor Juhos <juhosg@openwrt.org>

Seems to work on rt61pci as well ;)

Feel free to remove "Compile tested only." and/or add:

Tested-by: Jakub Kicinski <kubakici@wp.pl>

  -- Kuba

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [rt2x00-users] [RFC 12/14] rt2x00: rt61pci: implement queue_init callback
  2013-05-06 16:06   ` [rt2x00-users] " Jakub Kicinski
@ 2013-05-06 19:16     ` Gabor Juhos
  0 siblings, 0 replies; 17+ messages in thread
From: Gabor Juhos @ 2013-05-06 19:16 UTC (permalink / raw)
  To: Jakub Kicinski; +Cc: John W. Linville, linux-wireless, users

> On Thu,  2 May 2013 14:30:27 +0200, Gabor Juhos wrote:
>> The generic rt2x00 code has been changed to allow the
>> drivers toimplement dynamic data_queue initialization.
>>
>> Remove the static data queue descriptor structures
>> and implement the queue_init callback instead.
>>
>> Compile tested only.
>>
>> Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
> 
> Seems to work on rt61pci as well ;)

Thanks for testing!

> Feel free to remove "Compile tested only." and/or add:
> 
> Tested-by: Jakub Kicinski <kubakici@wp.pl>

I will add your Tested-by tag when I will send the series as formal patches.

-Gabor

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2013-05-06 19:16 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-02 12:30 [RFC 00/14] rt2x00: get rid of static data queue descriptors Gabor Juhos
2013-05-02 12:30 ` [RFC 01/14] rt2x00: rt2x00queue: add priv_size field to struct data_queue Gabor Juhos
2013-05-02 12:30 ` [RFC 02/14] rt2x00: rt2x00queue: move data_queue field initialization to rt2x00queue_init Gabor Juhos
2013-05-02 12:30 ` [RFC 03/14] rt2x00: rt2x00queue: remove qdesc parameter of rt2x00queue_alloc_entries Gabor Juhos
2013-05-02 12:30 ` [RFC 04/14] rt2x00: rt2x00dev: use rt2x00dev->bcn->limit Gabor Juhos
2013-05-02 12:30 ` [RFC 05/14] rt2x00: rt2x00queue: setup queue->threshold from queue->limit Gabor Juhos
2013-05-02 12:30 ` [RFC 06/14] rt2x00: add queue_init callback to rt2x00_ops Gabor Juhos
2013-05-02 12:30 ` [RFC 07/14] rt2x00: rt2800usb: implement queue_init callback Gabor Juhos
2013-05-02 12:30 ` [RFC 08/14] rt2x00: rt2800pci: " Gabor Juhos
2013-05-02 12:30 ` [RFC 09/14] rt2x00: rt73usb: " Gabor Juhos
2013-05-02 12:30 ` [RFC 10/14] rt2x00: rt2400pci: " Gabor Juhos
2013-05-02 12:30 ` [RFC 11/14] rt2x00: rt2500pci: " Gabor Juhos
2013-05-02 12:30 ` [RFC 12/14] rt2x00: rt61pci: " Gabor Juhos
2013-05-06 16:06   ` [rt2x00-users] " Jakub Kicinski
2013-05-06 19:16     ` Gabor Juhos
2013-05-02 12:30 ` [RFC 13/14] rt2x00: rt2500usb: " Gabor Juhos
2013-05-02 12:30 ` [RFC 14/14] rt2x00: remove data_queue_desc struct Gabor Juhos

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.