2013-08-22 18:53:33

by Gabor Juhos

[permalink] [raw]
Subject: [PATCH v3 1/2] rt2x00: rt2800lib: add rt2800_hw_beacon_base helper

The HW_BEACON_BASE() macro returns the base address
of a given beacon, however the returned values are
not usable on all chipsets. On devices which have
selectable shared memory parts, some beacon may be
located in the high part of the shared memory.

Instead of extending the already complicated macro,
add a new helper function and use that to get the
base address of a given beacon.

The actual patch contains no functional changes, the
helper function will be extended in a further patch
to handle different chipsets' requirements.

Signed-off-by: Gabor Juhos <[email protected]>
---
Changes since v2:
- separated from the 'rt2x00: fix beaconing on RT3593' patch-set
- update commit log

Changes since v1: ---
---
drivers/net/wireless/rt2x00/rt2800lib.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index aa6b6b0..38606e2 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -940,6 +940,12 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
}
EXPORT_SYMBOL_GPL(rt2800_txdone_entry);

+static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
+ unsigned int index)
+{
+ return HW_BEACON_BASE(index);
+}
+
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
{
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
@@ -992,7 +998,8 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
return;
}

- beacon_base = HW_BEACON_BASE(entry->entry_idx);
+ beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
+
rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
entry->skb->len + padding_len);

@@ -1017,7 +1024,7 @@ static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,
const int txwi_desc_size = rt2x00dev->bcn->winfo_size;
unsigned int beacon_base;

- beacon_base = HW_BEACON_BASE(index);
+ beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);

/*
* For the Beacon base registers we only need to clear
--
1.7.10


2013-08-22 18:53:33

by Gabor Juhos

[permalink] [raw]
Subject: [PATCH v3 2/2] rt2x00: rt2800lib: don't hardcode beacon offsets

The values written into the BCN_OFFSET[01] registers are
hardcoded in the rt2800_init_register function.

Add a macro and a helper function to derive these values
directly from the base address of a given beacon, and use
the new function instead of the hardcoded numbers.

The patch contains no functional changes. The programmed
register values are the same before and after the patch.

Signed-off-by: Gabor Juhos <[email protected]>
---
Changes since v2:
- separated from the 'rt2x00: fix beaconing on RT3593' patch-set

Changes since v1: ---
---
drivers/net/wireless/rt2x00/rt2800.h | 2 ++
drivers/net/wireless/rt2x00/rt2800lib.c | 30 ++++++++++++++++++++++--------
2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index e25e5bf..fa33b5e 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -2024,6 +2024,8 @@ struct mac_iveiv_entry {
(((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
(HW_BEACON_BASE6 - ((__index - 6) * 0x0200))))

+#define BEACON_BASE_TO_OFFSET(_base) (((_base) - 0x4000) / 64)
+
/*
* BBP registers.
* The wordsize of the BBP is 8 bits.
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 38606e2..20243dc 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -946,6 +946,12 @@ static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
return HW_BEACON_BASE(index);
}

+static inline u8 rt2800_get_beacon_offset(struct rt2x00_dev *rt2x00dev,
+ unsigned int index)
+{
+ return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
+}
+
void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
{
struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
@@ -4474,17 +4480,25 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
return ret;

rt2800_register_read(rt2x00dev, BCN_OFFSET0, &reg);
- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */
- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */
- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2, 0xf0); /* 0x3c00 */
- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3, 0xf8); /* 0x3e00 */
+ rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0,
+ rt2800_get_beacon_offset(rt2x00dev, 0));
+ rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1,
+ rt2800_get_beacon_offset(rt2x00dev, 1));
+ rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2,
+ rt2800_get_beacon_offset(rt2x00dev, 2));
+ rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3,
+ rt2800_get_beacon_offset(rt2x00dev, 3));
rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg);

rt2800_register_read(rt2x00dev, BCN_OFFSET1, &reg);
- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4, 0xc8); /* 0x3200 */
- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5, 0xd0); /* 0x3400 */
- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6, 0x77); /* 0x1dc0 */
- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7, 0x6f); /* 0x1bc0 */
+ rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4,
+ rt2800_get_beacon_offset(rt2x00dev, 4));
+ rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5,
+ rt2800_get_beacon_offset(rt2x00dev, 5));
+ rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6,
+ rt2800_get_beacon_offset(rt2x00dev, 6));
+ rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7,
+ rt2800_get_beacon_offset(rt2x00dev, 7));
rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg);

rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
--
1.7.10

2013-08-23 08:31:14

by Helmut Schaa

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] rt2x00: rt2800lib: don't hardcode beacon offsets

On Thu, Aug 22, 2013 at 8:53 PM, Gabor Juhos <[email protected]> wrote:
> The values written into the BCN_OFFSET[01] registers are
> hardcoded in the rt2800_init_register function.
>
> Add a macro and a helper function to derive these values
> directly from the base address of a given beacon, and use
> the new function instead of the hardcoded numbers.
>
> The patch contains no functional changes. The programmed
> register values are the same before and after the patch.
>
> Signed-off-by: Gabor Juhos <[email protected]>

Fine with me as well.
Acked-by: Helmut Schaa <[email protected]>

> ---
> Changes since v2:
> - separated from the 'rt2x00: fix beaconing on RT3593' patch-set
>
> Changes since v1: ---
> ---
> drivers/net/wireless/rt2x00/rt2800.h | 2 ++
> drivers/net/wireless/rt2x00/rt2800lib.c | 30 ++++++++++++++++++++++--------
> 2 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
> index e25e5bf..fa33b5e 100644
> --- a/drivers/net/wireless/rt2x00/rt2800.h
> +++ b/drivers/net/wireless/rt2x00/rt2800.h
> @@ -2024,6 +2024,8 @@ struct mac_iveiv_entry {
> (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
> (HW_BEACON_BASE6 - ((__index - 6) * 0x0200))))
>
> +#define BEACON_BASE_TO_OFFSET(_base) (((_base) - 0x4000) / 64)
> +
> /*
> * BBP registers.
> * The wordsize of the BBP is 8 bits.
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 38606e2..20243dc 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -946,6 +946,12 @@ static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
> return HW_BEACON_BASE(index);
> }
>
> +static inline u8 rt2800_get_beacon_offset(struct rt2x00_dev *rt2x00dev,
> + unsigned int index)
> +{
> + return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
> +}
> +
> void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
> {
> struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
> @@ -4474,17 +4480,25 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
> return ret;
>
> rt2800_register_read(rt2x00dev, BCN_OFFSET0, &reg);
> - rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0, 0xe0); /* 0x3800 */
> - rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1, 0xe8); /* 0x3a00 */
> - rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2, 0xf0); /* 0x3c00 */
> - rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3, 0xf8); /* 0x3e00 */
> + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0,
> + rt2800_get_beacon_offset(rt2x00dev, 0));
> + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1,
> + rt2800_get_beacon_offset(rt2x00dev, 1));
> + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2,
> + rt2800_get_beacon_offset(rt2x00dev, 2));
> + rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3,
> + rt2800_get_beacon_offset(rt2x00dev, 3));
> rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg);
>
> rt2800_register_read(rt2x00dev, BCN_OFFSET1, &reg);
> - rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4, 0xc8); /* 0x3200 */
> - rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5, 0xd0); /* 0x3400 */
> - rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6, 0x77); /* 0x1dc0 */
> - rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7, 0x6f); /* 0x1bc0 */
> + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4,
> + rt2800_get_beacon_offset(rt2x00dev, 4));
> + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5,
> + rt2800_get_beacon_offset(rt2x00dev, 5));
> + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6,
> + rt2800_get_beacon_offset(rt2x00dev, 6));
> + rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7,
> + rt2800_get_beacon_offset(rt2x00dev, 7));
> rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg);
>
> rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
> --
> 1.7.10
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2013-08-23 08:23:43

by Helmut Schaa

[permalink] [raw]
Subject: Re: [PATCH v3 1/2] rt2x00: rt2800lib: add rt2800_hw_beacon_base helper

On Thu, Aug 22, 2013 at 8:53 PM, Gabor Juhos <[email protected]> wrote:
> The HW_BEACON_BASE() macro returns the base address
> of a given beacon, however the returned values are
> not usable on all chipsets. On devices which have
> selectable shared memory parts, some beacon may be
> located in the high part of the shared memory.
>
> Instead of extending the already complicated macro,
> add a new helper function and use that to get the
> base address of a given beacon.
>
> The actual patch contains no functional changes, the
> helper function will be extended in a further patch
> to handle different chipsets' requirements.
>
> Signed-off-by: Gabor Juhos <[email protected]>

Looks good.

Acked-by: Helmut Schaa <[email protected]>

> ---
> Changes since v2:
> - separated from the 'rt2x00: fix beaconing on RT3593' patch-set
> - update commit log
>
> Changes since v1: ---
> ---
> drivers/net/wireless/rt2x00/rt2800lib.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index aa6b6b0..38606e2 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -940,6 +940,12 @@ void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi)
> }
> EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
>
> +static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
> + unsigned int index)
> +{
> + return HW_BEACON_BASE(index);
> +}
> +
> void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
> {
> struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
> @@ -992,7 +998,8 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
> return;
> }
>
> - beacon_base = HW_BEACON_BASE(entry->entry_idx);
> + beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
> +
> rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
> entry->skb->len + padding_len);
>
> @@ -1017,7 +1024,7 @@ static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,
> const int txwi_desc_size = rt2x00dev->bcn->winfo_size;
> unsigned int beacon_base;
>
> - beacon_base = HW_BEACON_BASE(index);
> + beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
>
> /*
> * For the Beacon base registers we only need to clear
> --
> 1.7.10
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html