All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips
@ 2015-10-20  6:45 Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register Jakub Sitnicki
                   ` (16 more replies)
  0 siblings, 17 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Hi Jes,

I'm posting this patch set to show in what direction the work is
going.  Hopefully any changes (e.g. renames) which you wouldn't see
fit for this driver can be identified early this way.

The work is nowhere near the end.  These changes only get me past the
parse_efuse() step in the probe() routine.

I've structured the patch set in such a way that changes that are not
RTL8188EU-specific (preparatory work) come first.  All but the last
two patches (tagged "rtl8188eu:") fall into this category.  If you
were considering to apply any of them, note that they were not tested
with any device that is known to work with rtl8xxxu, only a TP-Link
TL-WN725N (RTL8188EU) dongle.

The corresponding git branch for this patch set is at:

git https://github.com/jsitnicki/linux.git branch rtl8xxxu-rtl8188eu

Cheers,
Jakub

Jakub Sitnicki (16):
  rtl8xxxu: Treat REG_9346CR as an 8-bit wide register
  rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices
  rtl8xxxu: Don't check for illegal offset when reading from efuse
  rtl8xxxu: Skip disabled efuse words early
  rtl8xxxu: Unbreak a user-visible string
  rtl8xxxu: rtl8723au: Introduce a pointer to efuse
  rtl8xxxu: rtl8192cu: Introduce a pointer to efuse
  rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv
  rtl8xxxu: Rename struct struct rtl8723au_tx_power fields
  rtl8xxxu: Rename struct rtl8723au_idx
  rtl8xxxu: Make efuse content length a parameter
  rtl8xxxu: Prepare to have more than one kind of struct *_tx_power
  rtl8xxxu: Make set_tx_power a chip-type-dependent operation
  rtl8xxxu: Introduce a device agnostic constant for efuse map length
  rtl8xxxu: rtl8188eu: Add stubbed fileops and chip-specific constants
  rtl8xxxu: rtl8188eu: Implement parse_efuse()

 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 318 ++++++++++++++---------
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h |  96 +++++--
 2 files changed, 262 insertions(+), 152 deletions(-)

-- 
2.1.0


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

* [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  0:29   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices Jakub Sitnicki
                   ` (15 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

rtl8723au driver treats REG_9346CR register as either 8- or 16-bit wide,
while rtl8192cu driver treats it as 8-bit wide, and so does rtl8188eu
driver.  Use the lowest common denominator strategy.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 11fcfda..5f90261 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1928,10 +1928,10 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 	u16 val16, efuse_addr, offset;
 	u32 val32;
 
-	val16 = rtl8xxxu_read16(priv, REG_9346CR);
-	if (val16 & EEPROM_ENABLE)
+	val8 = rtl8xxxu_read8(priv, REG_9346CR);
+	if (val8 & EEPROM_ENABLE)
 		priv->has_eeprom = 1;
-	if (val16 & EEPROM_BOOT)
+	if (val8 & EEPROM_BOOT)
 		priv->boot_eeprom = 1;
 
 	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
-- 
2.1.0


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

* [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  0:57   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse Jakub Sitnicki
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

rtl8192cu driver doesn't read/write the REG_EFUSE_TEST register.
Neither does the rtl8188eu driver.  Do it only for RTL8192CU-based
devices.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 9 ++++++---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 5f90261..a8d7e0a 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1704,6 +1704,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
 			priv->has_bluetooth = 1;
 		if (val32 & MULTI_GPS_FUNC_EN)
 			priv->has_gps = 1;
+		priv->is_multi_func = 1;
 	} else if (val32 & SYS_CFG_TYPE_ID) {
 		bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
 		bonding &= HPON_FSM_BONDING_MASK;
@@ -1934,9 +1935,11 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 	if (val8 & EEPROM_BOOT)
 		priv->boot_eeprom = 1;
 
-	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
-	val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
-	rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
+	if (priv->is_multi_func) {
+		val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
+		val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
+		rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
+	}
 
 	dev_dbg(dev, "Booting from %s\n",
 		priv->boot_eeprom ? "EEPROM" : "EFUSE");
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index f2a1bac..622e6f5 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -597,6 +597,7 @@ struct rtl8xxxu_priv {
 	struct rtl8723au_idx ht20_max_power_offset[3];
 	u32 chip_cut:4;
 	u32 rom_rev:4;
+	u32 is_multi_func:1;
 	u32 has_wifi:1;
 	u32 has_bluetooth:1;
 	u32 enable_bluetooth:1;
-- 
2.1.0


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

* [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  1:07   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 04/16] rtl8xxxu: Skip disabled efuse words early Jakub Sitnicki
                   ` (13 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

It is enough to check for either illegal offset or illegal map address
because map address is a value derived from an offset:

  map_addr = offset * 8
  EFUSE_MAP_LEN_8723A = EFUSE_MAX_SECTION_8723A * 8

Leave just the check for an illegal map address because its upper
bound (EFUSE_MAP_LEN_8723A) is used also in a couple other places.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 63 +++++++++++-------------
 1 file changed, 28 insertions(+), 35 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index a8d7e0a..79efdc2 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1973,6 +1973,8 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 
 	efuse_addr = 0;
 	while (efuse_addr < EFUSE_REAL_CONTENT_LEN_8723A) {
+		u16 map_addr;
+
 		ret = rtl8xxxu_read_efuse8(priv, efuse_addr++, &header);
 		if (ret || header == 0xff)
 			goto exit;
@@ -1995,45 +1997,36 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 			word_mask = header & 0x0f;
 		}
 
-		if (offset < EFUSE_MAX_SECTION_8723A) {
-			u16 map_addr;
-			/* Get word enable value from PG header */
+		/* Get word enable value from PG header */
 
-			/* We have 8 bits to indicate validity */
-			map_addr = offset * 8;
-			if (map_addr >= EFUSE_MAP_LEN_8723A) {
-				dev_warn(dev, "%s: Illegal map_addr (%04x), "
-					 "efuse corrupt!\n",
-					 __func__, map_addr);
-				ret = -EINVAL;
-				goto exit;
-			}
-			for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
-				/* Check word enable condition in the section */
-				if (!(word_mask & BIT(i))) {
-					ret = rtl8xxxu_read_efuse8(priv,
-								   efuse_addr++,
-								   &val8);
-					if (ret)
-						goto exit;
-					priv->efuse_wifi.raw[map_addr++] = val8;
-
-					ret = rtl8xxxu_read_efuse8(priv,
-								   efuse_addr++,
-								   &val8);
-					if (ret)
-						goto exit;
-					priv->efuse_wifi.raw[map_addr++] = val8;
-				} else
-					map_addr += 2;
-			}
-		} else {
-			dev_warn(dev,
-				 "%s: Illegal offset (%04x), efuse corrupt!\n",
-				 __func__, offset);
+		/* We have 8 bits to indicate validity */
+		map_addr = offset * 8;
+		if (map_addr >= EFUSE_MAP_LEN_8723A) {
+			dev_warn(dev, "%s: Illegal map_addr (%04x), "
+				 "efuse corrupt!\n",
+				 __func__, map_addr);
 			ret = -EINVAL;
 			goto exit;
 		}
+		for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
+			/* Check word enable condition in the section */
+			if (!(word_mask & BIT(i))) {
+				ret = rtl8xxxu_read_efuse8(priv,
+							   efuse_addr++,
+							   &val8);
+				if (ret)
+					goto exit;
+				priv->efuse_wifi.raw[map_addr++] = val8;
+
+				ret = rtl8xxxu_read_efuse8(priv,
+							   efuse_addr++,
+							   &val8);
+				if (ret)
+					goto exit;
+				priv->efuse_wifi.raw[map_addr++] = val8;
+			} else
+				map_addr += 2;
+		}
 	}
 
 exit:
-- 
2.1.0


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

* [RFC 04/16] rtl8xxxu: Skip disabled efuse words early
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (2 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  1:09   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 05/16] rtl8xxxu: Unbreak a user-visible string Jakub Sitnicki
                   ` (12 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Avoid a negative conditional and an extra level of indentation in the
bigger part of the loop body.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 28 +++++++++++-------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 79efdc2..cfb18db 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -2010,22 +2010,20 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 		}
 		for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
 			/* Check word enable condition in the section */
-			if (!(word_mask & BIT(i))) {
-				ret = rtl8xxxu_read_efuse8(priv,
-							   efuse_addr++,
-							   &val8);
-				if (ret)
-					goto exit;
-				priv->efuse_wifi.raw[map_addr++] = val8;
-
-				ret = rtl8xxxu_read_efuse8(priv,
-							   efuse_addr++,
-							   &val8);
-				if (ret)
-					goto exit;
-				priv->efuse_wifi.raw[map_addr++] = val8;
-			} else
+			if (word_mask & BIT(i)) {
 				map_addr += 2;
+				continue;
+			}
+
+			ret = rtl8xxxu_read_efuse8(priv, efuse_addr++, &val8);
+			if (ret)
+				goto exit;
+			priv->efuse_wifi.raw[map_addr++] = val8;
+
+			ret = rtl8xxxu_read_efuse8(priv, efuse_addr++, &val8);
+			if (ret)
+				goto exit;
+			priv->efuse_wifi.raw[map_addr++] = val8;
 		}
 	}
 
-- 
2.1.0


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

* [RFC 05/16] rtl8xxxu: Unbreak a user-visible string
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (3 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 04/16] rtl8xxxu: Skip disabled efuse words early Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  1:46   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse Jakub Sitnicki
                   ` (11 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index cfb18db..e892fde 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -2002,8 +2002,8 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 		/* We have 8 bits to indicate validity */
 		map_addr = offset * 8;
 		if (map_addr >= EFUSE_MAP_LEN_8723A) {
-			dev_warn(dev, "%s: Illegal map_addr (%04x), "
-				 "efuse corrupt!\n",
+			dev_warn(dev,
+				 "%s: Illegal map_addr (%04x), efuse corrupt!\n",
 				 __func__, map_addr);
 			ret = -EINVAL;
 			goto exit;
-- 
2.1.0


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

* [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (4 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 05/16] rtl8xxxu: Unbreak a user-visible string Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  1:52   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 07/16] rtl8xxxu: rtl8192cu: " Jakub Sitnicki
                   ` (10 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 26 +++++++++++++-----------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index e892fde..a390d75 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1779,43 +1779,45 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
 
 static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 {
-	if (priv->efuse_wifi.efuse8723.rtl_id != cpu_to_le16(0x8129))
+	struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
+
+	if (efuse->rtl_id != cpu_to_le16(0x8129))
 		return -EINVAL;
 
-	ether_addr_copy(priv->mac_addr, priv->efuse_wifi.efuse8723.mac_addr);
+	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
 	memcpy(priv->cck_tx_power_index_A,
-	       priv->efuse_wifi.efuse8723.cck_tx_power_index_A,
+	       efuse->cck_tx_power_index_A,
 	       sizeof(priv->cck_tx_power_index_A));
 	memcpy(priv->cck_tx_power_index_B,
-	       priv->efuse_wifi.efuse8723.cck_tx_power_index_B,
+	       efuse->cck_tx_power_index_B,
 	       sizeof(priv->cck_tx_power_index_B));
 
 	memcpy(priv->ht40_1s_tx_power_index_A,
-	       priv->efuse_wifi.efuse8723.ht40_1s_tx_power_index_A,
+	       efuse->ht40_1s_tx_power_index_A,
 	       sizeof(priv->ht40_1s_tx_power_index_A));
 	memcpy(priv->ht40_1s_tx_power_index_B,
-	       priv->efuse_wifi.efuse8723.ht40_1s_tx_power_index_B,
+	       efuse->ht40_1s_tx_power_index_B,
 	       sizeof(priv->ht40_1s_tx_power_index_B));
 
 	memcpy(priv->ht20_tx_power_index_diff,
-	       priv->efuse_wifi.efuse8723.ht20_tx_power_index_diff,
+	       efuse->ht20_tx_power_index_diff,
 	       sizeof(priv->ht20_tx_power_index_diff));
 	memcpy(priv->ofdm_tx_power_index_diff,
-	       priv->efuse_wifi.efuse8723.ofdm_tx_power_index_diff,
+	       efuse->ofdm_tx_power_index_diff,
 	       sizeof(priv->ofdm_tx_power_index_diff));
 
 	memcpy(priv->ht40_max_power_offset,
-	       priv->efuse_wifi.efuse8723.ht40_max_power_offset,
+	       efuse->ht40_max_power_offset,
 	       sizeof(priv->ht40_max_power_offset));
 	memcpy(priv->ht20_max_power_offset,
-	       priv->efuse_wifi.efuse8723.ht20_max_power_offset,
+	       efuse->ht20_max_power_offset,
 	       sizeof(priv->ht20_max_power_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
-		 priv->efuse_wifi.efuse8723.vendor_name);
+		 efuse->vendor_name);
 	dev_info(&priv->udev->dev, "Product: %.41s\n",
-		 priv->efuse_wifi.efuse8723.device_name);
+		 efuse->device_name);
 	return 0;
 }
 
-- 
2.1.0


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

* [RFC 07/16] rtl8xxxu: rtl8192cu: Introduce a pointer to efuse
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (5 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv Jakub Sitnicki
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 29 ++++++++++++------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index a390d75..e1f8c62 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1823,50 +1823,51 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 
 static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 {
+	struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192;
 	int i;
 
-	if (priv->efuse_wifi.efuse8192.rtl_id != cpu_to_le16(0x8129))
+	if (efuse->rtl_id != cpu_to_le16(0x8129))
 		return -EINVAL;
 
-	ether_addr_copy(priv->mac_addr, priv->efuse_wifi.efuse8192.mac_addr);
+	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
 	memcpy(priv->cck_tx_power_index_A,
-	       priv->efuse_wifi.efuse8192.cck_tx_power_index_A,
+	       efuse->cck_tx_power_index_A,
 	       sizeof(priv->cck_tx_power_index_A));
 	memcpy(priv->cck_tx_power_index_B,
-	       priv->efuse_wifi.efuse8192.cck_tx_power_index_B,
+	       efuse->cck_tx_power_index_B,
 	       sizeof(priv->cck_tx_power_index_B));
 
 	memcpy(priv->ht40_1s_tx_power_index_A,
-	       priv->efuse_wifi.efuse8192.ht40_1s_tx_power_index_A,
+	       efuse->ht40_1s_tx_power_index_A,
 	       sizeof(priv->ht40_1s_tx_power_index_A));
 	memcpy(priv->ht40_1s_tx_power_index_B,
-	       priv->efuse_wifi.efuse8192.ht40_1s_tx_power_index_B,
+	       efuse->ht40_1s_tx_power_index_B,
 	       sizeof(priv->ht40_1s_tx_power_index_B));
 	memcpy(priv->ht40_2s_tx_power_index_diff,
-	       priv->efuse_wifi.efuse8192.ht40_2s_tx_power_index_diff,
+	       efuse->ht40_2s_tx_power_index_diff,
 	       sizeof(priv->ht40_2s_tx_power_index_diff));
 
 	memcpy(priv->ht20_tx_power_index_diff,
-	       priv->efuse_wifi.efuse8192.ht20_tx_power_index_diff,
+	       efuse->ht20_tx_power_index_diff,
 	       sizeof(priv->ht20_tx_power_index_diff));
 	memcpy(priv->ofdm_tx_power_index_diff,
-	       priv->efuse_wifi.efuse8192.ofdm_tx_power_index_diff,
+	       efuse->ofdm_tx_power_index_diff,
 	       sizeof(priv->ofdm_tx_power_index_diff));
 
 	memcpy(priv->ht40_max_power_offset,
-	       priv->efuse_wifi.efuse8192.ht40_max_power_offset,
+	       efuse->ht40_max_power_offset,
 	       sizeof(priv->ht40_max_power_offset));
 	memcpy(priv->ht20_max_power_offset,
-	       priv->efuse_wifi.efuse8192.ht20_max_power_offset,
+	       efuse->ht20_max_power_offset,
 	       sizeof(priv->ht20_max_power_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
-		 priv->efuse_wifi.efuse8192.vendor_name);
+		 efuse->vendor_name);
 	dev_info(&priv->udev->dev, "Product: %.20s\n",
-		 priv->efuse_wifi.efuse8192.device_name);
+		 efuse->device_name);
 
-	if (priv->efuse_wifi.efuse8192.rf_regulatory & 0x20) {
+	if (efuse->rf_regulatory & 0x20) {
 		sprintf(priv->chip_name, "8188RU");
 		priv->hi_pa = 1;
 	}
-- 
2.1.0


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

* [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (6 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 07/16] rtl8xxxu: rtl8192cu: " Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  1:58   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 09/16] rtl8xxxu: Rename struct struct rtl8723au_tx_power fields Jakub Sitnicki
                   ` (8 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 95 ++++++++++++------------
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 30 ++++----
 2 files changed, 66 insertions(+), 59 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index e1f8c62..d67c668 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1490,6 +1490,7 @@ static void rtl8723au_config_channel(struct ieee80211_hw *hw)
 static void
 rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 {
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
 	u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS];
 	u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS];
 	u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b;
@@ -1498,27 +1499,27 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 
 	group = rtl8723a_channel_to_group(channel);
 
-	cck[0] = priv->cck_tx_power_index_A[group];
-	cck[1] = priv->cck_tx_power_index_B[group];
+	cck[0] = tx_power->cck_tx_power_index_A[group];
+	cck[1] = tx_power->cck_tx_power_index_B[group];
 
-	ofdm[0] = priv->ht40_1s_tx_power_index_A[group];
-	ofdm[1] = priv->ht40_1s_tx_power_index_B[group];
+	ofdm[0] = tx_power->ht40_1s_tx_power_index_A[group];
+	ofdm[1] = tx_power->ht40_1s_tx_power_index_B[group];
 
-	ofdmbase[0] = ofdm[0] +	priv->ofdm_tx_power_index_diff[group].a;
-	ofdmbase[1] = ofdm[1] +	priv->ofdm_tx_power_index_diff[group].b;
+	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_tx_power_index_diff[group].a;
+	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_tx_power_index_diff[group].b;
 
 	mcsbase[0] = ofdm[0];
 	mcsbase[1] = ofdm[1];
 	if (!ht40) {
-		mcsbase[0] += priv->ht20_tx_power_index_diff[group].a;
-		mcsbase[1] += priv->ht20_tx_power_index_diff[group].b;
+		mcsbase[0] += tx_power->ht20_tx_power_index_diff[group].a;
+		mcsbase[1] += tx_power->ht20_tx_power_index_diff[group].b;
 	}
 
 	if (priv->tx_paths > 1) {
-		if (ofdm[0] > priv->ht40_2s_tx_power_index_diff[group].a)
-			ofdm[0] -=  priv->ht40_2s_tx_power_index_diff[group].a;
-		if (ofdm[1] > priv->ht40_2s_tx_power_index_diff[group].b)
-			ofdm[1] -=  priv->ht40_2s_tx_power_index_diff[group].b;
+		if (ofdm[0] > tx_power->ht40_2s_tx_power_index_diff[group].a)
+			ofdm[0] -= tx_power->ht40_2s_tx_power_index_diff[group].a;
+		if (ofdm[1] > tx_power->ht40_2s_tx_power_index_diff[group].b)
+			ofdm[1] -= tx_power->ht40_2s_tx_power_index_diff[group].b;
 	}
 
 	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
@@ -1780,39 +1781,40 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
 static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
 
 	if (efuse->rtl_id != cpu_to_le16(0x8129))
 		return -EINVAL;
 
 	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
-	memcpy(priv->cck_tx_power_index_A,
+	memcpy(tx_power->cck_tx_power_index_A,
 	       efuse->cck_tx_power_index_A,
-	       sizeof(priv->cck_tx_power_index_A));
-	memcpy(priv->cck_tx_power_index_B,
+	       sizeof(tx_power->cck_tx_power_index_A));
+	memcpy(tx_power->cck_tx_power_index_B,
 	       efuse->cck_tx_power_index_B,
-	       sizeof(priv->cck_tx_power_index_B));
+	       sizeof(tx_power->cck_tx_power_index_B));
 
-	memcpy(priv->ht40_1s_tx_power_index_A,
+	memcpy(tx_power->ht40_1s_tx_power_index_A,
 	       efuse->ht40_1s_tx_power_index_A,
-	       sizeof(priv->ht40_1s_tx_power_index_A));
-	memcpy(priv->ht40_1s_tx_power_index_B,
+	       sizeof(tx_power->ht40_1s_tx_power_index_A));
+	memcpy(tx_power->ht40_1s_tx_power_index_B,
 	       efuse->ht40_1s_tx_power_index_B,
-	       sizeof(priv->ht40_1s_tx_power_index_B));
+	       sizeof(tx_power->ht40_1s_tx_power_index_B));
 
-	memcpy(priv->ht20_tx_power_index_diff,
+	memcpy(tx_power->ht20_tx_power_index_diff,
 	       efuse->ht20_tx_power_index_diff,
-	       sizeof(priv->ht20_tx_power_index_diff));
-	memcpy(priv->ofdm_tx_power_index_diff,
+	       sizeof(tx_power->ht20_tx_power_index_diff));
+	memcpy(tx_power->ofdm_tx_power_index_diff,
 	       efuse->ofdm_tx_power_index_diff,
-	       sizeof(priv->ofdm_tx_power_index_diff));
+	       sizeof(tx_power->ofdm_tx_power_index_diff));
 
-	memcpy(priv->ht40_max_power_offset,
+	memcpy(tx_power->ht40_max_power_offset,
 	       efuse->ht40_max_power_offset,
-	       sizeof(priv->ht40_max_power_offset));
-	memcpy(priv->ht20_max_power_offset,
+	       sizeof(tx_power->ht40_max_power_offset));
+	memcpy(tx_power->ht20_max_power_offset,
 	       efuse->ht20_max_power_offset,
-	       sizeof(priv->ht20_max_power_offset));
+	       sizeof(tx_power->ht20_max_power_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
 		 efuse->vendor_name);
@@ -1824,6 +1826,7 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192;
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
 	int i;
 
 	if (efuse->rtl_id != cpu_to_le16(0x8129))
@@ -1831,36 +1834,36 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 
 	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
-	memcpy(priv->cck_tx_power_index_A,
+	memcpy(tx_power->cck_tx_power_index_A,
 	       efuse->cck_tx_power_index_A,
-	       sizeof(priv->cck_tx_power_index_A));
-	memcpy(priv->cck_tx_power_index_B,
+	       sizeof(tx_power->cck_tx_power_index_A));
+	memcpy(tx_power->cck_tx_power_index_B,
 	       efuse->cck_tx_power_index_B,
-	       sizeof(priv->cck_tx_power_index_B));
+	       sizeof(tx_power->cck_tx_power_index_B));
 
-	memcpy(priv->ht40_1s_tx_power_index_A,
+	memcpy(tx_power->ht40_1s_tx_power_index_A,
 	       efuse->ht40_1s_tx_power_index_A,
-	       sizeof(priv->ht40_1s_tx_power_index_A));
-	memcpy(priv->ht40_1s_tx_power_index_B,
+	       sizeof(tx_power->ht40_1s_tx_power_index_A));
+	memcpy(tx_power->ht40_1s_tx_power_index_B,
 	       efuse->ht40_1s_tx_power_index_B,
-	       sizeof(priv->ht40_1s_tx_power_index_B));
-	memcpy(priv->ht40_2s_tx_power_index_diff,
+	       sizeof(tx_power->ht40_1s_tx_power_index_B));
+	memcpy(tx_power->ht40_2s_tx_power_index_diff,
 	       efuse->ht40_2s_tx_power_index_diff,
-	       sizeof(priv->ht40_2s_tx_power_index_diff));
+	       sizeof(tx_power->ht40_2s_tx_power_index_diff));
 
-	memcpy(priv->ht20_tx_power_index_diff,
+	memcpy(tx_power->ht20_tx_power_index_diff,
 	       efuse->ht20_tx_power_index_diff,
-	       sizeof(priv->ht20_tx_power_index_diff));
-	memcpy(priv->ofdm_tx_power_index_diff,
+	       sizeof(tx_power->ht20_tx_power_index_diff));
+	memcpy(tx_power->ofdm_tx_power_index_diff,
 	       efuse->ofdm_tx_power_index_diff,
-	       sizeof(priv->ofdm_tx_power_index_diff));
+	       sizeof(tx_power->ofdm_tx_power_index_diff));
 
-	memcpy(priv->ht40_max_power_offset,
+	memcpy(tx_power->ht40_max_power_offset,
 	       efuse->ht40_max_power_offset,
-	       sizeof(priv->ht40_max_power_offset));
-	memcpy(priv->ht20_max_power_offset,
+	       sizeof(tx_power->ht40_max_power_offset));
+	memcpy(tx_power->ht20_max_power_offset,
 	       efuse->ht20_max_power_offset,
-	       sizeof(priv->ht20_max_power_offset));
+	       sizeof(tx_power->ht20_max_power_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
 		 efuse->vendor_name);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 622e6f5..1a0c88d 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -564,6 +564,22 @@ struct h2c_cmd {
 
 struct rtl8xxxu_fileops;
 
+struct rtl8723au_tx_power {
+	u8 cck_tx_power_index_A[3];	/* 0x10 */
+	u8 cck_tx_power_index_B[3];
+	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
+	u8 ht40_1s_tx_power_index_B[3];
+	/*
+	 * The following entries are half-bytes split as:
+	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
+	 */
+	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
+	struct rtl8723au_idx ht20_tx_power_index_diff[3];
+	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
+	struct rtl8723au_idx ht40_max_power_offset[3];
+	struct rtl8723au_idx ht20_max_power_offset[3];
+};
+
 struct rtl8xxxu_priv {
 	struct ieee80211_hw *hw;
 	struct usb_device *udev;
@@ -582,19 +598,7 @@ struct rtl8xxxu_priv {
 
 	u8 mac_addr[ETH_ALEN];
 	char chip_name[8];
-	u8 cck_tx_power_index_A[3];	/* 0x10 */
-	u8 cck_tx_power_index_B[3];
-	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
-	u8 ht40_1s_tx_power_index_B[3];
-	/*
-	 * The following entries are half-bytes split as:
-	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
-	 */
-	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
-	struct rtl8723au_idx ht20_tx_power_index_diff[3];
-	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
-	struct rtl8723au_idx ht40_max_power_offset[3];
-	struct rtl8723au_idx ht20_max_power_offset[3];
+	struct rtl8723au_tx_power tx_power;
 	u32 chip_cut:4;
 	u32 rom_rev:4;
 	u32 is_multi_func:1;
-- 
2.1.0


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

* [RFC 09/16] rtl8xxxu: Rename struct struct rtl8723au_tx_power fields
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (7 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx Jakub Sitnicki
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Remove the redundant infix ("tx_power") from field names.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 92 ++++++++++++------------
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 18 ++---
 2 files changed, 55 insertions(+), 55 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index d67c668..992bcda 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1499,27 +1499,27 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 
 	group = rtl8723a_channel_to_group(channel);
 
-	cck[0] = tx_power->cck_tx_power_index_A[group];
-	cck[1] = tx_power->cck_tx_power_index_B[group];
+	cck[0] = tx_power->cck_index_A[group];
+	cck[1] = tx_power->cck_index_B[group];
 
-	ofdm[0] = tx_power->ht40_1s_tx_power_index_A[group];
-	ofdm[1] = tx_power->ht40_1s_tx_power_index_B[group];
+	ofdm[0] = tx_power->ht40_1s_index_A[group];
+	ofdm[1] = tx_power->ht40_1s_index_B[group];
 
-	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_tx_power_index_diff[group].a;
-	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_tx_power_index_diff[group].b;
+	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_index_diff[group].a;
+	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_index_diff[group].b;
 
 	mcsbase[0] = ofdm[0];
 	mcsbase[1] = ofdm[1];
 	if (!ht40) {
-		mcsbase[0] += tx_power->ht20_tx_power_index_diff[group].a;
-		mcsbase[1] += tx_power->ht20_tx_power_index_diff[group].b;
+		mcsbase[0] += tx_power->ht20_index_diff[group].a;
+		mcsbase[1] += tx_power->ht20_index_diff[group].b;
 	}
 
 	if (priv->tx_paths > 1) {
-		if (ofdm[0] > tx_power->ht40_2s_tx_power_index_diff[group].a)
-			ofdm[0] -= tx_power->ht40_2s_tx_power_index_diff[group].a;
-		if (ofdm[1] > tx_power->ht40_2s_tx_power_index_diff[group].b)
-			ofdm[1] -= tx_power->ht40_2s_tx_power_index_diff[group].b;
+		if (ofdm[0] > tx_power->ht40_2s_index_diff[group].a)
+			ofdm[0] -= tx_power->ht40_2s_index_diff[group].a;
+		if (ofdm[1] > tx_power->ht40_2s_index_diff[group].b)
+			ofdm[1] -= tx_power->ht40_2s_index_diff[group].b;
 	}
 
 	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
@@ -1788,33 +1788,33 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 
 	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
-	memcpy(tx_power->cck_tx_power_index_A,
+	memcpy(tx_power->cck_index_A,
 	       efuse->cck_tx_power_index_A,
-	       sizeof(tx_power->cck_tx_power_index_A));
-	memcpy(tx_power->cck_tx_power_index_B,
+	       sizeof(tx_power->cck_index_A));
+	memcpy(tx_power->cck_index_B,
 	       efuse->cck_tx_power_index_B,
-	       sizeof(tx_power->cck_tx_power_index_B));
+	       sizeof(tx_power->cck_index_B));
 
-	memcpy(tx_power->ht40_1s_tx_power_index_A,
+	memcpy(tx_power->ht40_1s_index_A,
 	       efuse->ht40_1s_tx_power_index_A,
-	       sizeof(tx_power->ht40_1s_tx_power_index_A));
-	memcpy(tx_power->ht40_1s_tx_power_index_B,
+	       sizeof(tx_power->ht40_1s_index_A));
+	memcpy(tx_power->ht40_1s_index_B,
 	       efuse->ht40_1s_tx_power_index_B,
-	       sizeof(tx_power->ht40_1s_tx_power_index_B));
+	       sizeof(tx_power->ht40_1s_index_B));
 
-	memcpy(tx_power->ht20_tx_power_index_diff,
+	memcpy(tx_power->ht20_index_diff,
 	       efuse->ht20_tx_power_index_diff,
-	       sizeof(tx_power->ht20_tx_power_index_diff));
-	memcpy(tx_power->ofdm_tx_power_index_diff,
+	       sizeof(tx_power->ht20_index_diff));
+	memcpy(tx_power->ofdm_index_diff,
 	       efuse->ofdm_tx_power_index_diff,
-	       sizeof(tx_power->ofdm_tx_power_index_diff));
+	       sizeof(tx_power->ofdm_index_diff));
 
-	memcpy(tx_power->ht40_max_power_offset,
+	memcpy(tx_power->ht40_max_offset,
 	       efuse->ht40_max_power_offset,
-	       sizeof(tx_power->ht40_max_power_offset));
-	memcpy(tx_power->ht20_max_power_offset,
+	       sizeof(tx_power->ht40_max_offset));
+	memcpy(tx_power->ht20_max_offset,
 	       efuse->ht20_max_power_offset,
-	       sizeof(tx_power->ht20_max_power_offset));
+	       sizeof(tx_power->ht20_max_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
 		 efuse->vendor_name);
@@ -1834,36 +1834,36 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 
 	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
 
-	memcpy(tx_power->cck_tx_power_index_A,
+	memcpy(tx_power->cck_index_A,
 	       efuse->cck_tx_power_index_A,
-	       sizeof(tx_power->cck_tx_power_index_A));
-	memcpy(tx_power->cck_tx_power_index_B,
+	       sizeof(tx_power->cck_index_A));
+	memcpy(tx_power->cck_index_B,
 	       efuse->cck_tx_power_index_B,
-	       sizeof(tx_power->cck_tx_power_index_B));
+	       sizeof(tx_power->cck_index_B));
 
-	memcpy(tx_power->ht40_1s_tx_power_index_A,
+	memcpy(tx_power->ht40_1s_index_A,
 	       efuse->ht40_1s_tx_power_index_A,
-	       sizeof(tx_power->ht40_1s_tx_power_index_A));
-	memcpy(tx_power->ht40_1s_tx_power_index_B,
+	       sizeof(tx_power->ht40_1s_index_A));
+	memcpy(tx_power->ht40_1s_index_B,
 	       efuse->ht40_1s_tx_power_index_B,
-	       sizeof(tx_power->ht40_1s_tx_power_index_B));
-	memcpy(tx_power->ht40_2s_tx_power_index_diff,
+	       sizeof(tx_power->ht40_1s_index_B));
+	memcpy(tx_power->ht40_2s_index_diff,
 	       efuse->ht40_2s_tx_power_index_diff,
-	       sizeof(tx_power->ht40_2s_tx_power_index_diff));
+	       sizeof(tx_power->ht40_2s_index_diff));
 
-	memcpy(tx_power->ht20_tx_power_index_diff,
+	memcpy(tx_power->ht20_index_diff,
 	       efuse->ht20_tx_power_index_diff,
-	       sizeof(tx_power->ht20_tx_power_index_diff));
-	memcpy(tx_power->ofdm_tx_power_index_diff,
+	       sizeof(tx_power->ht20_index_diff));
+	memcpy(tx_power->ofdm_index_diff,
 	       efuse->ofdm_tx_power_index_diff,
-	       sizeof(tx_power->ofdm_tx_power_index_diff));
+	       sizeof(tx_power->ofdm_index_diff));
 
-	memcpy(tx_power->ht40_max_power_offset,
+	memcpy(tx_power->ht40_max_offset,
 	       efuse->ht40_max_power_offset,
-	       sizeof(tx_power->ht40_max_power_offset));
-	memcpy(tx_power->ht20_max_power_offset,
+	       sizeof(tx_power->ht40_max_offset));
+	memcpy(tx_power->ht20_max_offset,
 	       efuse->ht20_max_power_offset,
-	       sizeof(tx_power->ht20_max_power_offset));
+	       sizeof(tx_power->ht20_max_offset));
 
 	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
 		 efuse->vendor_name);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 1a0c88d..23bf4c0 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -565,19 +565,19 @@ struct h2c_cmd {
 struct rtl8xxxu_fileops;
 
 struct rtl8723au_tx_power {
-	u8 cck_tx_power_index_A[3];	/* 0x10 */
-	u8 cck_tx_power_index_B[3];
-	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
-	u8 ht40_1s_tx_power_index_B[3];
+	u8 cck_index_A[3];	/* 0x10 */
+	u8 cck_index_B[3];
+	u8 ht40_1s_index_A[3];	/* 0x16 */
+	u8 ht40_1s_index_B[3];
 	/*
 	 * The following entries are half-bytes split as:
 	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
 	 */
-	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
-	struct rtl8723au_idx ht20_tx_power_index_diff[3];
-	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
-	struct rtl8723au_idx ht40_max_power_offset[3];
-	struct rtl8723au_idx ht20_max_power_offset[3];
+	struct rtl8723au_idx ht40_2s_index_diff[3];
+	struct rtl8723au_idx ht20_index_diff[3];
+	struct rtl8723au_idx ofdm_index_diff[3];
+	struct rtl8723au_idx ht40_max_offset[3];
+	struct rtl8723au_idx ht20_max_offset[3];
 };
 
 struct rtl8xxxu_priv {
-- 
2.1.0


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

* [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (8 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 09/16] rtl8xxxu: Rename struct struct rtl8723au_tx_power fields Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  2:00   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 11/16] rtl8xxxu: Make efuse content length a parameter Jakub Sitnicki
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 16 +++++-----
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 38 ++++++++++++------------
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 992bcda..d48db87 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1505,21 +1505,21 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 	ofdm[0] = tx_power->ht40_1s_index_A[group];
 	ofdm[1] = tx_power->ht40_1s_index_B[group];
 
-	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_index_diff[group].a;
-	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_index_diff[group].b;
+	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_index_diff[group].low;
+	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_index_diff[group].high;
 
 	mcsbase[0] = ofdm[0];
 	mcsbase[1] = ofdm[1];
 	if (!ht40) {
-		mcsbase[0] += tx_power->ht20_index_diff[group].a;
-		mcsbase[1] += tx_power->ht20_index_diff[group].b;
+		mcsbase[0] += tx_power->ht20_index_diff[group].low;
+		mcsbase[1] += tx_power->ht20_index_diff[group].high;
 	}
 
 	if (priv->tx_paths > 1) {
-		if (ofdm[0] > tx_power->ht40_2s_index_diff[group].a)
-			ofdm[0] -= tx_power->ht40_2s_index_diff[group].a;
-		if (ofdm[1] > tx_power->ht40_2s_index_diff[group].b)
-			ofdm[1] -= tx_power->ht40_2s_index_diff[group].b;
+		if (ofdm[0] > tx_power->ht40_2s_index_diff[group].low)
+			ofdm[0] -= tx_power->ht40_2s_index_diff[group].low;
+		if (ofdm[1] > tx_power->ht40_2s_index_diff[group].high)
+			ofdm[1] -= tx_power->ht40_2s_index_diff[group].high;
 	}
 
 	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 23bf4c0..2f5f903 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -407,13 +407,13 @@ struct rtl8xxxu_firmware_header {
 /*
  * The 8723au has 3 channel groups: 1-3, 4-9, and 10-14
  */
-struct rtl8723au_idx {
+struct nibble_pair {
 #ifdef __LITTLE_ENDIAN
-	int	a:4;
-	int	b:4;
+	int	low:4;
+	int	high:4;
 #else
-	int	b:4;
-	int	a:4;
+	int	high:4;
+	int	low:4;
 #endif
 } __attribute__((packed));
 
@@ -428,10 +428,10 @@ struct rtl8723au_efuse {
 	 * The following entries are half-bytes split as:
 	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
 	 */
-	struct rtl8723au_idx ht20_tx_power_index_diff[3];
-	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
-	struct rtl8723au_idx ht40_max_power_offset[3];
-	struct rtl8723au_idx ht20_max_power_offset[3];
+	struct nibble_pair ht20_tx_power_index_diff[3];
+	struct nibble_pair ofdm_tx_power_index_diff[3];
+	struct nibble_pair ht40_max_power_offset[3];
+	struct nibble_pair ht20_max_power_offset[3];
 	u8 channel_plan;		/* 0x28 */
 	u8 tssi_a;
 	u8 thermal_meter;
@@ -482,11 +482,11 @@ struct rtl8192cu_efuse {
 	 * The following entries are half-bytes split as:
 	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
 	 */
-	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
-	struct rtl8723au_idx ht20_tx_power_index_diff[3];	/* 0x69 */
-	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
-	struct rtl8723au_idx ht40_max_power_offset[3];		/* 0x6f */
-	struct rtl8723au_idx ht20_max_power_offset[3];
+	struct nibble_pair ht40_2s_tx_power_index_diff[3];
+	struct nibble_pair ht20_tx_power_index_diff[3];		/* 0x69 */
+	struct nibble_pair ofdm_tx_power_index_diff[3];
+	struct nibble_pair ht40_max_power_offset[3];		/* 0x6f */
+	struct nibble_pair ht20_max_power_offset[3];
 	u8 channel_plan;					/* 0x75 */
 	u8 tssi_a;
 	u8 tssi_b;
@@ -573,11 +573,11 @@ struct rtl8723au_tx_power {
 	 * The following entries are half-bytes split as:
 	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
 	 */
-	struct rtl8723au_idx ht40_2s_index_diff[3];
-	struct rtl8723au_idx ht20_index_diff[3];
-	struct rtl8723au_idx ofdm_index_diff[3];
-	struct rtl8723au_idx ht40_max_offset[3];
-	struct rtl8723au_idx ht20_max_offset[3];
+	struct nibble_pair ht40_2s_index_diff[3];
+	struct nibble_pair ht20_index_diff[3];
+	struct nibble_pair ofdm_index_diff[3];
+	struct nibble_pair ht40_max_offset[3];
+	struct nibble_pair ht20_max_offset[3];
 };
 
 struct rtl8xxxu_priv {
-- 
2.1.0


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

* [RFC 11/16] rtl8xxxu: Make efuse content length a parameter
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (9 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  2:01   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 12/16] rtl8xxxu: Prepare to have more than one kind of struct *_tx_power Jakub Sitnicki
                   ` (5 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

This is a preparatory step for adding support for RTL8188EU chips
which have different efuse length.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 5 ++++-
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index d48db87..a7d172a 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1930,6 +1930,7 @@ rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data)
 static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct device *dev = &priv->udev->dev;
+	int efuse_len = priv->fops->efuse_len;
 	int i, ret = 0;
 	u8 val8, word_mask, header, extheader;
 	u16 val16, efuse_addr, offset;
@@ -1978,7 +1979,7 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 	memset(priv->efuse_wifi.raw, 0xff, EFUSE_MAP_LEN_8723A);
 
 	efuse_addr = 0;
-	while (efuse_addr < EFUSE_REAL_CONTENT_LEN_8723A) {
+	while (efuse_addr < efuse_len) {
 		u16 map_addr;
 
 		ret = rtl8xxxu_read_efuse8(priv, efuse_addr++, &header);
@@ -5780,6 +5781,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
 	.parse_efuse = rtl8723au_parse_efuse,
 	.load_firmware = rtl8723au_load_firmware,
 	.power_on = rtl8723au_power_on,
+	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
 	.writeN_block_size = 1024,
 };
 
@@ -5787,6 +5789,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
 	.parse_efuse = rtl8192cu_parse_efuse,
 	.load_firmware = rtl8192cu_load_firmware,
 	.power_on = rtl8192cu_power_on,
+	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
 	.writeN_block_size = 128,
 };
 
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 2f5f903..ccfbc10 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -677,5 +677,6 @@ struct rtl8xxxu_fileops {
 	int (*parse_efuse) (struct rtl8xxxu_priv *priv);
 	int (*load_firmware) (struct rtl8xxxu_priv *priv);
 	int (*power_on) (struct rtl8xxxu_priv *priv);
+	int efuse_len;
 	int writeN_block_size;
 };
-- 
2.1.0


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

* [RFC 12/16] rtl8xxxu: Prepare to have more than one kind of struct *_tx_power
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (10 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 11/16] rtl8xxxu: Make efuse content length a parameter Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation Jakub Sitnicki
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Preparatory step for adding support for RTL8188EU chips. We follow the
same approach as with efuse here.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 +++---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 4 +++-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index a7d172a..83cdc2a 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1490,7 +1490,7 @@ static void rtl8723au_config_channel(struct ieee80211_hw *hw)
 static void
 rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 {
-	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power.tx_power8723;
 	u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS];
 	u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS];
 	u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b;
@@ -1781,7 +1781,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
 static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
-	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power.tx_power8723;
 
 	if (efuse->rtl_id != cpu_to_le16(0x8129))
 		return -EINVAL;
@@ -1826,7 +1826,7 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192;
-	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
+	struct rtl8723au_tx_power *tx_power = &priv->tx_power.tx_power8723;
 	int i;
 
 	if (efuse->rtl_id != cpu_to_le16(0x8129))
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index ccfbc10..1a767eb 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -598,7 +598,9 @@ struct rtl8xxxu_priv {
 
 	u8 mac_addr[ETH_ALEN];
 	char chip_name[8];
-	struct rtl8723au_tx_power tx_power;
+	union {
+		struct rtl8723au_tx_power tx_power8723;
+	} tx_power;
 	u32 chip_cut:4;
 	u32 rom_rev:4;
 	u32 is_multi_func:1;
-- 
2.1.0


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

* [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (11 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 12/16] rtl8xxxu: Prepare to have more than one kind of struct *_tx_power Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  2:07   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length Jakub Sitnicki
                   ` (3 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Preparatory step for adding support for RTL8188EU chips.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 ++++--
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 83cdc2a..ecda799 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -4223,7 +4223,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
 	/*
 	 * Start out with default power levels for channel 6, 20MHz
 	 */
-	rtl8723a_set_tx_power(priv, 1, false);
+	priv->fops->set_tx_power(priv, 1, false);
 
 	/* Let the 8051 take control of antenna setting */
 	val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
@@ -5207,7 +5207,7 @@ static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
 
 		channel = hw->conf.chandef.chan->hw_value;
 
-		rtl8723a_set_tx_power(priv, channel, ht40);
+		priv->fops->set_tx_power(priv, channel, ht40);
 
 		rtl8723au_config_channel(hw);
 	}
@@ -5781,6 +5781,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
 	.parse_efuse = rtl8723au_parse_efuse,
 	.load_firmware = rtl8723au_load_firmware,
 	.power_on = rtl8723au_power_on,
+	.set_tx_power = rtl8723a_set_tx_power,
 	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
 	.writeN_block_size = 1024,
 };
@@ -5789,6 +5790,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
 	.parse_efuse = rtl8192cu_parse_efuse,
 	.load_firmware = rtl8192cu_load_firmware,
 	.power_on = rtl8192cu_power_on,
+	.set_tx_power = rtl8723a_set_tx_power,
 	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
 	.writeN_block_size = 128,
 };
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 1a767eb..427eb7e 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -679,6 +679,7 @@ struct rtl8xxxu_fileops {
 	int (*parse_efuse) (struct rtl8xxxu_priv *priv);
 	int (*load_firmware) (struct rtl8xxxu_priv *priv);
 	int (*power_on) (struct rtl8xxxu_priv *priv);
+	void (*set_tx_power) (struct rtl8xxxu_priv *priv, int channel, bool ht40);
 	int efuse_len;
 	int writeN_block_size;
 };
-- 
2.1.0


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

* [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (12 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  2:03   ` Jes Sorensen
  2015-10-20  6:45 ` [RFC 15/16] rtl8xxxu: rtl8188eu: Add stubbed fileops and chip-specific constants Jakub Sitnicki
                   ` (2 subsequent siblings)
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Preparatory step for adding support for RTL8188EU devices.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---

Notes:
    An alternative approach to keeping a buffer that is big enough to hold
    the efuse map of any of the supported chips would be to allocate the
    efuse map on-the-go to pass it between read_efuse() and parse_efuse().
    
    This would also reduce the memory footprint of struct rtl8xxxu_priv.

 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 5 ++++-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index ecda799..cf3aad7 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1976,7 +1976,7 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 	}
 
 	/* Default value is 0xff */
-	memset(priv->efuse_wifi.raw, 0xff, EFUSE_MAP_LEN_8723A);
+	memset(priv->efuse_wifi.raw, 0xff, EFUSE_MAP_LEN);
 
 	efuse_addr = 0;
 	while (efuse_addr < efuse_len) {
@@ -2008,7 +2008,7 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
 
 		/* We have 8 bits to indicate validity */
 		map_addr = offset * 8;
-		if (map_addr >= EFUSE_MAP_LEN_8723A) {
+		if (map_addr >= EFUSE_MAP_LEN) {
 			dev_warn(dev,
 				 "%s: Illegal map_addr (%04x), efuse corrupt!\n",
 				 __func__, map_addr);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 427eb7e..e55d843 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -59,6 +59,9 @@
 #define EFUSE_MAX_SECTION_8723A		32
 #define EFUSE_REAL_CONTENT_LEN_8723A	512
 #define EFUSE_BT_MAP_LEN_8723A		1024
+
+/* One size fits all, that is use the highest value */
+#define EFUSE_MAP_LEN			EFUSE_MAP_LEN_8723A
 #define EFUSE_MAX_WORD_UNIT		4
 
 struct rtl8xxxu_rx_desc {
@@ -649,7 +652,7 @@ struct rtl8xxxu_priv {
 		u8 val8;
 	} usb_buf;
 	union {
-		u8 raw[EFUSE_MAP_LEN_8723A];
+		u8 raw[EFUSE_MAP_LEN];
 		struct rtl8723au_efuse efuse8723;
 		struct rtl8192cu_efuse efuse8192;
 	} efuse_wifi;
-- 
2.1.0


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

* [RFC 15/16] rtl8xxxu: rtl8188eu: Add stubbed fileops and chip-specific constants
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (13 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-20  6:45 ` [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse() Jakub Sitnicki
  2015-10-21  0:29 ` [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jes Sorensen
  16 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 32 ++++++++++++++++++++++++
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h |  6 ++++-
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index cf3aad7..344161b 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1597,6 +1597,12 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 	}
 }
 
+static void rtl8188eu_set_tx_power(struct rtl8xxxu_priv *priv,
+				   int channel, bool ht40)
+{
+	return; /* Not implemented */
+}
+
 static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
 				  enum nl80211_iftype linktype)
 {
@@ -1892,6 +1898,11 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 	return 0;
 }
 
+static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
+{
+	return -EOPNOTSUPP; /* Not implemented */
+}
+
 static int
 rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data)
 {
@@ -2235,6 +2246,11 @@ static int rtl8192cu_load_firmware(struct rtl8xxxu_priv *priv)
 	return ret;
 }
 
+static int rtl8188eu_load_firmware(struct rtl8xxxu_priv *priv)
+{
+	return -EOPNOTSUPP; /* Not implemented */
+}
+
 static void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv)
 {
 	u16 val16;
@@ -3919,6 +3935,11 @@ static int rtl8192cu_power_on(struct rtl8xxxu_priv *priv)
 	return 0;
 }
 
+static int rtl8188eu_power_on(struct rtl8xxxu_priv *priv)
+{
+	return -EOPNOTSUPP; /* Not implemented */
+}
+
 static void rtl8xxxu_power_off(struct rtl8xxxu_priv *priv)
 {
 	u8 val8;
@@ -5795,6 +5816,15 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
 	.writeN_block_size = 128,
 };
 
+static struct rtl8xxxu_fileops rtl8188eu_fops = {
+	.parse_efuse = rtl8188eu_parse_efuse,
+	.load_firmware = rtl8188eu_load_firmware,
+	.power_on = rtl8188eu_power_on,
+	.set_tx_power = rtl8188eu_set_tx_power,
+	.efuse_len = EFUSE_REAL_CONTENT_LEN_88E,
+	.writeN_block_size = 4,
+};
+
 static struct usb_device_id dev_table[] = {
 {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8724, 0xff, 0xff, 0xff),
 	.driver_info = (unsigned long)&rtl8723au_fops},
@@ -5895,6 +5925,8 @@ static struct usb_device_id dev_table[] = {
 	.driver_info = (unsigned long)&rtl8192cu_fops},
 {USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0x1201, 0xff, 0xff, 0xff),
 	.driver_info = (unsigned long)&rtl8192cu_fops},
+{USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8179), /* RTL8188EUS */
+	.driver_info = (unsigned long)&rtl8188eu_fops},
 /* Currently untested 8192 series devices */
 {USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0950, 0xff, 0xff, 0xff),
 	.driver_info = (unsigned long)&rtl8192cu_fops},
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index e55d843..79f47e3 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -60,8 +60,12 @@
 #define EFUSE_REAL_CONTENT_LEN_8723A	512
 #define EFUSE_BT_MAP_LEN_8723A		1024
 
+#define EFUSE_MAP_LEN_88E		512
+#define EFUSE_MAX_SECTION_88E		64
+#define EFUSE_REAL_CONTENT_LEN_88E	256
+
 /* One size fits all, that is use the highest value */
-#define EFUSE_MAP_LEN			EFUSE_MAP_LEN_8723A
+#define EFUSE_MAP_LEN			EFUSE_MAP_LEN_88E
 #define EFUSE_MAX_WORD_UNIT		4
 
 struct rtl8xxxu_rx_desc {
-- 
2.1.0


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

* [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse()
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (14 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 15/16] rtl8xxxu: rtl8188eu: Add stubbed fileops and chip-specific constants Jakub Sitnicki
@ 2015-10-20  6:45 ` Jakub Sitnicki
  2015-10-21  2:15   ` Jes Sorensen
  2015-10-21  0:29 ` [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jes Sorensen
  16 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-20  6:45 UTC (permalink / raw)
  To: Jes.Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

As opposed to the vendor driver (rtl8188eu), extract from efuse only
these TX power values that are going to be of use later on.

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 35 +++++++++++++++++++++++-
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 24 ++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 344161b..90da707 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -1900,7 +1900,40 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 
 static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
 {
-	return -EOPNOTSUPP; /* Not implemented */
+	struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188;
+	struct rtl8188eu_tx_power *tx_power = &priv->tx_power.tx_power8188;
+
+	if (efuse->rtl_id != cpu_to_le16(0x8129))
+		return -EINVAL;
+
+	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
+
+	memcpy(tx_power->cck_index_A,
+	       efuse->tx_power.cck_index_A,
+	       sizeof(tx_power->cck_index_A));
+
+	memcpy(tx_power->ht40_1s_index_A,
+	       efuse->tx_power.ht40_1s_index_A,
+	       sizeof(tx_power->ht40_1s_index_A));
+
+	memcpy(tx_power->ht20_ofdm_index_diff,
+	       efuse->tx_power.ht20_ofdm_index_diff,
+	       sizeof(tx_power->ht20_ofdm_index_diff));
+
+	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
+		 efuse->vendor_name);
+	dev_info(&priv->udev->dev, "Product: %.11s\n",
+		 efuse->device_name);
+
+	/* XXX: Do we need to read the rf_regulatory flag? */
+
+	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
+		print_hex_dump_bytes("rtl8xxxu: ", DUMP_PREFIX_OFFSET,
+				     priv->efuse_wifi.raw,
+				     sizeof(priv->efuse_wifi.raw));
+	}
+
+	return 0;
 }
 
 static int
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 79f47e3..ec49504 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -507,6 +507,22 @@ struct rtl8192cu_efuse {
 	u8 customer_id;
 };
 
+struct rtl8188eu_efuse {
+	__le16 rtl_id;
+	u8 res0[0x0e];
+	struct {						/* 0x10 */
+		u8 cck_index_A[6];
+		u8 ht40_1s_index_A[5];
+		struct nibble_pair ht20_ofdm_index_diff[1];
+	} tx_power;
+	u8 res1[0xbb];
+	u8 mac_addr[ETH_ALEN];					/* 0xd7 */
+	u8 res2[0x02];
+	u8 vendor_name[7];					/* 0xdf */
+	u8 res3[0x02];
+	u8 device_name[11];					/* 0xe8 */
+};
+
 struct rtl8xxxu_reg8val {
 	u16 reg;
 	u8 val;
@@ -587,6 +603,12 @@ struct rtl8723au_tx_power {
 	struct nibble_pair ht20_max_offset[3];
 };
 
+struct rtl8188eu_tx_power {
+	u8 cck_index_A[6];
+	u8 ht40_1s_index_A[5];
+	struct nibble_pair ht20_ofdm_index_diff[1];
+};
+
 struct rtl8xxxu_priv {
 	struct ieee80211_hw *hw;
 	struct usb_device *udev;
@@ -607,6 +629,7 @@ struct rtl8xxxu_priv {
 	char chip_name[8];
 	union {
 		struct rtl8723au_tx_power tx_power8723;
+		struct rtl8188eu_tx_power tx_power8188;
 	} tx_power;
 	u32 chip_cut:4;
 	u32 rom_rev:4;
@@ -659,6 +682,7 @@ struct rtl8xxxu_priv {
 		u8 raw[EFUSE_MAP_LEN];
 		struct rtl8723au_efuse efuse8723;
 		struct rtl8192cu_efuse efuse8192;
+		struct rtl8188eu_efuse efuse8188;
 	} efuse_wifi;
 	u32 adda_backup[RTL8XXXU_ADDA_REGS];
 	u32 mac_backup[RTL8XXXU_MAC_REGS];
-- 
2.1.0


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

* Re: [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips
  2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
                   ` (15 preceding siblings ...)
  2015-10-20  6:45 ` [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse() Jakub Sitnicki
@ 2015-10-21  0:29 ` Jes Sorensen
  2015-10-23  5:24   ` Jakub Sitnicki
  16 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  0:29 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Hi Jes,
>
> I'm posting this patch set to show in what direction the work is
> going.  Hopefully any changes (e.g. renames) which you wouldn't see
> fit for this driver can be identified early this way.
>
> The work is nowhere near the end.  These changes only get me past the
> parse_efuse() step in the probe() routine.
>
> I've structured the patch set in such a way that changes that are not
> RTL8188EU-specific (preparatory work) come first.  All but the last
> two patches (tagged "rtl8188eu:") fall into this category.  If you
> were considering to apply any of them, note that they were not tested
> with any device that is known to work with rtl8xxxu, only a TP-Link
> TL-WN725N (RTL8188EU) dongle.
>
> The corresponding git branch for this patch set is at:
>
> git https://github.com/jsitnicki/linux.git branch rtl8xxxu-rtl8188eu

Jakub,

Thanks for the feedback - some of these patches are good, some of them I
dislike, and some of them will conflict with work I have been doing
since I posted the patch. I have been working on adding 8723bu and
8192eu support and some of those changes should also benefit your work.

I have pushed my current nextgen tree to git, so if you checkout the
rtl8xxxu-nextgen branch you will see it.

I'll respond to the individual patches here.

Cheers,
Jes

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

* Re: [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register
  2015-10-20  6:45 ` [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register Jakub Sitnicki
@ 2015-10-21  0:29   ` Jes Sorensen
  2015-10-23  5:38     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  0:29 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> rtl8723au driver treats REG_9346CR register as either 8- or 16-bit wide,
> while rtl8192cu driver treats it as 8-bit wide, and so does rtl8188eu
> driver.  Use the lowest common denominator strategy.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)

NACK - this is a 16 bit register and the vendor drivers take the lazy
approach of just reading/writing the lower 8 bits when they feel like
it.

My code is more consistent, so this one is not going in.

Jes

>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 11fcfda..5f90261 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1928,10 +1928,10 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>  	u16 val16, efuse_addr, offset;
>  	u32 val32;
>  
> -	val16 = rtl8xxxu_read16(priv, REG_9346CR);
> -	if (val16 & EEPROM_ENABLE)
> +	val8 = rtl8xxxu_read8(priv, REG_9346CR);
> +	if (val8 & EEPROM_ENABLE)
>  		priv->has_eeprom = 1;
> -	if (val16 & EEPROM_BOOT)
> +	if (val8 & EEPROM_BOOT)
>  		priv->boot_eeprom = 1;
>  
>  	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);

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

* Re: [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices
  2015-10-20  6:45 ` [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices Jakub Sitnicki
@ 2015-10-21  0:57   ` Jes Sorensen
  2015-10-23  5:45     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  0:57 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> rtl8192cu driver doesn't read/write the REG_EFUSE_TEST register.
> Neither does the rtl8188eu driver.  Do it only for RTL8192CU-based
> devices.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 9 ++++++---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
>  2 files changed, 7 insertions(+), 3 deletions(-)

This looks a reasonable change - I verified the 8723BU does this as
well, but 8192EU doesn't.

I did modify you commit message slightly since it said "Do it only for
RTL8192CU-based devices" and I am sure you meant 8723AU (and now
8723BU).

If you dislike the change to the message, let me know and I'll pull the
patch or change it.

Cheers,
Jes

>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 5f90261..a8d7e0a 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1704,6 +1704,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
>  			priv->has_bluetooth = 1;
>  		if (val32 & MULTI_GPS_FUNC_EN)
>  			priv->has_gps = 1;
> +		priv->is_multi_func = 1;
>  	} else if (val32 & SYS_CFG_TYPE_ID) {
>  		bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
>  		bonding &= HPON_FSM_BONDING_MASK;
> @@ -1934,9 +1935,11 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>  	if (val8 & EEPROM_BOOT)
>  		priv->boot_eeprom = 1;
>  
> -	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
> -	val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
> -	rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
> +	if (priv->is_multi_func) {
> +		val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
> +		val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
> +		rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
> +	}
>  
>  	dev_dbg(dev, "Booting from %s\n",
>  		priv->boot_eeprom ? "EEPROM" : "EFUSE");
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index f2a1bac..622e6f5 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -597,6 +597,7 @@ struct rtl8xxxu_priv {
>  	struct rtl8723au_idx ht20_max_power_offset[3];
>  	u32 chip_cut:4;
>  	u32 rom_rev:4;
> +	u32 is_multi_func:1;
>  	u32 has_wifi:1;
>  	u32 has_bluetooth:1;
>  	u32 enable_bluetooth:1;

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

* Re: [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse
  2015-10-20  6:45 ` [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse Jakub Sitnicki
@ 2015-10-21  1:07   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  1:07 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> It is enough to check for either illegal offset or illegal map address
> because map address is a value derived from an offset:
>
>   map_addr = offset * 8
>   EFUSE_MAP_LEN_8723A = EFUSE_MAX_SECTION_8723A * 8
>
> Leave just the check for an illegal map address because its upper
> bound (EFUSE_MAP_LEN_8723A) is used also in a couple other places.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 63 +++++++++++-------------
>  1 file changed, 28 insertions(+), 35 deletions(-)

Applied - I had already changed EFUSE_MAP_LEN_8723A to EFUSE_MAP_LEN, so
I applied it with that minor modification.

Jes

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

* Re: [RFC 04/16] rtl8xxxu: Skip disabled efuse words early
  2015-10-20  6:45 ` [RFC 04/16] rtl8xxxu: Skip disabled efuse words early Jakub Sitnicki
@ 2015-10-21  1:09   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  1:09 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Avoid a negative conditional and an extra level of indentation in the
> bigger part of the loop body.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 28 +++++++++++-------------
>  1 file changed, 13 insertions(+), 15 deletions(-)

Nice cleanup - applied.

Jes

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

* Re: [RFC 05/16] rtl8xxxu: Unbreak a user-visible string
  2015-10-20  6:45 ` [RFC 05/16] rtl8xxxu: Unbreak a user-visible string Jakub Sitnicki
@ 2015-10-21  1:46   ` Jes Sorensen
  2015-10-23  5:54     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  1:46 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index cfb18db..e892fde 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -2002,8 +2002,8 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>  		/* We have 8 bits to indicate validity */
>  		map_addr = offset * 8;
>  		if (map_addr >= EFUSE_MAP_LEN_8723A) {
> -			dev_warn(dev, "%s: Illegal map_addr (%04x), "
> -				 "efuse corrupt!\n",
> +			dev_warn(dev,
> +				 "%s: Illegal map_addr (%04x), efuse corrupt!\n",

This would make the line longer than 80 characters - so no.

NAK

Jes

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

* Re: [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse
  2015-10-20  6:45 ` [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse Jakub Sitnicki
@ 2015-10-21  1:52   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  1:52 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 26 +++++++++++++-----------
>  1 file changed, 14 insertions(+), 12 deletions(-)

This cleans up the code nicely - so I applied both of these.

Jes

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

* Re: [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv
  2015-10-20  6:45 ` [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv Jakub Sitnicki
@ 2015-10-21  1:58   ` Jes Sorensen
  2015-10-23 21:16     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  1:58 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 95 ++++++++++++------------
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 30 ++++----
>  2 files changed, 66 insertions(+), 59 deletions(-)

I don't really see this patch adding any value - it just adds an
additional layer of convolution. Unless there is a strong reason for
applying it, I am going to drop this one.

Jes

>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index e1f8c62..d67c668 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1490,6 +1490,7 @@ static void rtl8723au_config_channel(struct ieee80211_hw *hw)
>  static void
>  rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
>  {
> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>  	u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS];
>  	u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS];
>  	u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b;
> @@ -1498,27 +1499,27 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
>  
>  	group = rtl8723a_channel_to_group(channel);
>  
> -	cck[0] = priv->cck_tx_power_index_A[group];
> -	cck[1] = priv->cck_tx_power_index_B[group];
> +	cck[0] = tx_power->cck_tx_power_index_A[group];
> +	cck[1] = tx_power->cck_tx_power_index_B[group];
>  
> -	ofdm[0] = priv->ht40_1s_tx_power_index_A[group];
> -	ofdm[1] = priv->ht40_1s_tx_power_index_B[group];
> +	ofdm[0] = tx_power->ht40_1s_tx_power_index_A[group];
> +	ofdm[1] = tx_power->ht40_1s_tx_power_index_B[group];
>  
> -	ofdmbase[0] = ofdm[0] +	priv->ofdm_tx_power_index_diff[group].a;
> -	ofdmbase[1] = ofdm[1] +	priv->ofdm_tx_power_index_diff[group].b;
> +	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_tx_power_index_diff[group].a;
> +	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_tx_power_index_diff[group].b;
>  
>  	mcsbase[0] = ofdm[0];
>  	mcsbase[1] = ofdm[1];
>  	if (!ht40) {
> -		mcsbase[0] += priv->ht20_tx_power_index_diff[group].a;
> -		mcsbase[1] += priv->ht20_tx_power_index_diff[group].b;
> +		mcsbase[0] += tx_power->ht20_tx_power_index_diff[group].a;
> +		mcsbase[1] += tx_power->ht20_tx_power_index_diff[group].b;
>  	}
>  
>  	if (priv->tx_paths > 1) {
> -		if (ofdm[0] > priv->ht40_2s_tx_power_index_diff[group].a)
> -			ofdm[0] -=  priv->ht40_2s_tx_power_index_diff[group].a;
> -		if (ofdm[1] > priv->ht40_2s_tx_power_index_diff[group].b)
> -			ofdm[1] -=  priv->ht40_2s_tx_power_index_diff[group].b;
> +		if (ofdm[0] > tx_power->ht40_2s_tx_power_index_diff[group].a)
> +			ofdm[0] -= tx_power->ht40_2s_tx_power_index_diff[group].a;
> +		if (ofdm[1] > tx_power->ht40_2s_tx_power_index_diff[group].b)
> +			ofdm[1] -= tx_power->ht40_2s_tx_power_index_diff[group].b;
>  	}
>  
>  	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
> @@ -1780,39 +1781,40 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
>  static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
>  {
>  	struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>  
>  	if (efuse->rtl_id != cpu_to_le16(0x8129))
>  		return -EINVAL;
>  
>  	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
>  
> -	memcpy(priv->cck_tx_power_index_A,
> +	memcpy(tx_power->cck_tx_power_index_A,
>  	       efuse->cck_tx_power_index_A,
> -	       sizeof(priv->cck_tx_power_index_A));
> -	memcpy(priv->cck_tx_power_index_B,
> +	       sizeof(tx_power->cck_tx_power_index_A));
> +	memcpy(tx_power->cck_tx_power_index_B,
>  	       efuse->cck_tx_power_index_B,
> -	       sizeof(priv->cck_tx_power_index_B));
> +	       sizeof(tx_power->cck_tx_power_index_B));
>  
> -	memcpy(priv->ht40_1s_tx_power_index_A,
> +	memcpy(tx_power->ht40_1s_tx_power_index_A,
>  	       efuse->ht40_1s_tx_power_index_A,
> -	       sizeof(priv->ht40_1s_tx_power_index_A));
> -	memcpy(priv->ht40_1s_tx_power_index_B,
> +	       sizeof(tx_power->ht40_1s_tx_power_index_A));
> +	memcpy(tx_power->ht40_1s_tx_power_index_B,
>  	       efuse->ht40_1s_tx_power_index_B,
> -	       sizeof(priv->ht40_1s_tx_power_index_B));
> +	       sizeof(tx_power->ht40_1s_tx_power_index_B));
>  
> -	memcpy(priv->ht20_tx_power_index_diff,
> +	memcpy(tx_power->ht20_tx_power_index_diff,
>  	       efuse->ht20_tx_power_index_diff,
> -	       sizeof(priv->ht20_tx_power_index_diff));
> -	memcpy(priv->ofdm_tx_power_index_diff,
> +	       sizeof(tx_power->ht20_tx_power_index_diff));
> +	memcpy(tx_power->ofdm_tx_power_index_diff,
>  	       efuse->ofdm_tx_power_index_diff,
> -	       sizeof(priv->ofdm_tx_power_index_diff));
> +	       sizeof(tx_power->ofdm_tx_power_index_diff));
>  
> -	memcpy(priv->ht40_max_power_offset,
> +	memcpy(tx_power->ht40_max_power_offset,
>  	       efuse->ht40_max_power_offset,
> -	       sizeof(priv->ht40_max_power_offset));
> -	memcpy(priv->ht20_max_power_offset,
> +	       sizeof(tx_power->ht40_max_power_offset));
> +	memcpy(tx_power->ht20_max_power_offset,
>  	       efuse->ht20_max_power_offset,
> -	       sizeof(priv->ht20_max_power_offset));
> +	       sizeof(tx_power->ht20_max_power_offset));
>  
>  	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
>  		 efuse->vendor_name);
> @@ -1824,6 +1826,7 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
>  static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>  {
>  	struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192;
> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>  	int i;
>  
>  	if (efuse->rtl_id != cpu_to_le16(0x8129))
> @@ -1831,36 +1834,36 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>  
>  	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
>  
> -	memcpy(priv->cck_tx_power_index_A,
> +	memcpy(tx_power->cck_tx_power_index_A,
>  	       efuse->cck_tx_power_index_A,
> -	       sizeof(priv->cck_tx_power_index_A));
> -	memcpy(priv->cck_tx_power_index_B,
> +	       sizeof(tx_power->cck_tx_power_index_A));
> +	memcpy(tx_power->cck_tx_power_index_B,
>  	       efuse->cck_tx_power_index_B,
> -	       sizeof(priv->cck_tx_power_index_B));
> +	       sizeof(tx_power->cck_tx_power_index_B));
>  
> -	memcpy(priv->ht40_1s_tx_power_index_A,
> +	memcpy(tx_power->ht40_1s_tx_power_index_A,
>  	       efuse->ht40_1s_tx_power_index_A,
> -	       sizeof(priv->ht40_1s_tx_power_index_A));
> -	memcpy(priv->ht40_1s_tx_power_index_B,
> +	       sizeof(tx_power->ht40_1s_tx_power_index_A));
> +	memcpy(tx_power->ht40_1s_tx_power_index_B,
>  	       efuse->ht40_1s_tx_power_index_B,
> -	       sizeof(priv->ht40_1s_tx_power_index_B));
> -	memcpy(priv->ht40_2s_tx_power_index_diff,
> +	       sizeof(tx_power->ht40_1s_tx_power_index_B));
> +	memcpy(tx_power->ht40_2s_tx_power_index_diff,
>  	       efuse->ht40_2s_tx_power_index_diff,
> -	       sizeof(priv->ht40_2s_tx_power_index_diff));
> +	       sizeof(tx_power->ht40_2s_tx_power_index_diff));
>  
> -	memcpy(priv->ht20_tx_power_index_diff,
> +	memcpy(tx_power->ht20_tx_power_index_diff,
>  	       efuse->ht20_tx_power_index_diff,
> -	       sizeof(priv->ht20_tx_power_index_diff));
> -	memcpy(priv->ofdm_tx_power_index_diff,
> +	       sizeof(tx_power->ht20_tx_power_index_diff));
> +	memcpy(tx_power->ofdm_tx_power_index_diff,
>  	       efuse->ofdm_tx_power_index_diff,
> -	       sizeof(priv->ofdm_tx_power_index_diff));
> +	       sizeof(tx_power->ofdm_tx_power_index_diff));
>  
> -	memcpy(priv->ht40_max_power_offset,
> +	memcpy(tx_power->ht40_max_power_offset,
>  	       efuse->ht40_max_power_offset,
> -	       sizeof(priv->ht40_max_power_offset));
> -	memcpy(priv->ht20_max_power_offset,
> +	       sizeof(tx_power->ht40_max_power_offset));
> +	memcpy(tx_power->ht20_max_power_offset,
>  	       efuse->ht20_max_power_offset,
> -	       sizeof(priv->ht20_max_power_offset));
> +	       sizeof(tx_power->ht20_max_power_offset));
>  
>  	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
>  		 efuse->vendor_name);
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 622e6f5..1a0c88d 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -564,6 +564,22 @@ struct h2c_cmd {
>  
>  struct rtl8xxxu_fileops;
>  
> +struct rtl8723au_tx_power {
> +	u8 cck_tx_power_index_A[3];	/* 0x10 */
> +	u8 cck_tx_power_index_B[3];
> +	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
> +	u8 ht40_1s_tx_power_index_B[3];
> +	/*
> +	 * The following entries are half-bytes split as:
> +	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
> +	 */
> +	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
> +	struct rtl8723au_idx ht20_tx_power_index_diff[3];
> +	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
> +	struct rtl8723au_idx ht40_max_power_offset[3];
> +	struct rtl8723au_idx ht20_max_power_offset[3];
> +};
> +
>  struct rtl8xxxu_priv {
>  	struct ieee80211_hw *hw;
>  	struct usb_device *udev;
> @@ -582,19 +598,7 @@ struct rtl8xxxu_priv {
>  
>  	u8 mac_addr[ETH_ALEN];
>  	char chip_name[8];
> -	u8 cck_tx_power_index_A[3];	/* 0x10 */
> -	u8 cck_tx_power_index_B[3];
> -	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
> -	u8 ht40_1s_tx_power_index_B[3];
> -	/*
> -	 * The following entries are half-bytes split as:
> -	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
> -	 */
> -	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
> -	struct rtl8723au_idx ht20_tx_power_index_diff[3];
> -	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
> -	struct rtl8723au_idx ht40_max_power_offset[3];
> -	struct rtl8723au_idx ht20_max_power_offset[3];
> +	struct rtl8723au_tx_power tx_power;
>  	u32 chip_cut:4;
>  	u32 rom_rev:4;
>  	u32 is_multi_func:1;

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

* Re: [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx
  2015-10-20  6:45 ` [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx Jakub Sitnicki
@ 2015-10-21  2:00   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  2:00 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 16 +++++-----
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 38 ++++++++++++------------
>  2 files changed, 27 insertions(+), 27 deletions(-)

This name change just make the naming worse. If this really needs to be
changed, at least make the change something that improves the naming.

Jes

>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 992bcda..d48db87 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1505,21 +1505,21 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
>  	ofdm[0] = tx_power->ht40_1s_index_A[group];
>  	ofdm[1] = tx_power->ht40_1s_index_B[group];
>  
> -	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_index_diff[group].a;
> -	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_index_diff[group].b;
> +	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_index_diff[group].low;
> +	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_index_diff[group].high;
>  
>  	mcsbase[0] = ofdm[0];
>  	mcsbase[1] = ofdm[1];
>  	if (!ht40) {
> -		mcsbase[0] += tx_power->ht20_index_diff[group].a;
> -		mcsbase[1] += tx_power->ht20_index_diff[group].b;
> +		mcsbase[0] += tx_power->ht20_index_diff[group].low;
> +		mcsbase[1] += tx_power->ht20_index_diff[group].high;
>  	}
>  
>  	if (priv->tx_paths > 1) {
> -		if (ofdm[0] > tx_power->ht40_2s_index_diff[group].a)
> -			ofdm[0] -= tx_power->ht40_2s_index_diff[group].a;
> -		if (ofdm[1] > tx_power->ht40_2s_index_diff[group].b)
> -			ofdm[1] -= tx_power->ht40_2s_index_diff[group].b;
> +		if (ofdm[0] > tx_power->ht40_2s_index_diff[group].low)
> +			ofdm[0] -= tx_power->ht40_2s_index_diff[group].low;
> +		if (ofdm[1] > tx_power->ht40_2s_index_diff[group].high)
> +			ofdm[1] -= tx_power->ht40_2s_index_diff[group].high;
>  	}
>  
>  	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 23bf4c0..2f5f903 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -407,13 +407,13 @@ struct rtl8xxxu_firmware_header {
>  /*
>   * The 8723au has 3 channel groups: 1-3, 4-9, and 10-14
>   */
> -struct rtl8723au_idx {
> +struct nibble_pair {
>  #ifdef __LITTLE_ENDIAN
> -	int	a:4;
> -	int	b:4;
> +	int	low:4;
> +	int	high:4;
>  #else
> -	int	b:4;
> -	int	a:4;
> +	int	high:4;
> +	int	low:4;
>  #endif
>  } __attribute__((packed));
>  
> @@ -428,10 +428,10 @@ struct rtl8723au_efuse {
>  	 * The following entries are half-bytes split as:
>  	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
>  	 */
> -	struct rtl8723au_idx ht20_tx_power_index_diff[3];
> -	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
> -	struct rtl8723au_idx ht40_max_power_offset[3];
> -	struct rtl8723au_idx ht20_max_power_offset[3];
> +	struct nibble_pair ht20_tx_power_index_diff[3];
> +	struct nibble_pair ofdm_tx_power_index_diff[3];
> +	struct nibble_pair ht40_max_power_offset[3];
> +	struct nibble_pair ht20_max_power_offset[3];
>  	u8 channel_plan;		/* 0x28 */
>  	u8 tssi_a;
>  	u8 thermal_meter;
> @@ -482,11 +482,11 @@ struct rtl8192cu_efuse {
>  	 * The following entries are half-bytes split as:
>  	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
>  	 */
> -	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
> -	struct rtl8723au_idx ht20_tx_power_index_diff[3];	/* 0x69 */
> -	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
> -	struct rtl8723au_idx ht40_max_power_offset[3];		/* 0x6f */
> -	struct rtl8723au_idx ht20_max_power_offset[3];
> +	struct nibble_pair ht40_2s_tx_power_index_diff[3];
> +	struct nibble_pair ht20_tx_power_index_diff[3];		/* 0x69 */
> +	struct nibble_pair ofdm_tx_power_index_diff[3];
> +	struct nibble_pair ht40_max_power_offset[3];		/* 0x6f */
> +	struct nibble_pair ht20_max_power_offset[3];
>  	u8 channel_plan;					/* 0x75 */
>  	u8 tssi_a;
>  	u8 tssi_b;
> @@ -573,11 +573,11 @@ struct rtl8723au_tx_power {
>  	 * The following entries are half-bytes split as:
>  	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
>  	 */
> -	struct rtl8723au_idx ht40_2s_index_diff[3];
> -	struct rtl8723au_idx ht20_index_diff[3];
> -	struct rtl8723au_idx ofdm_index_diff[3];
> -	struct rtl8723au_idx ht40_max_offset[3];
> -	struct rtl8723au_idx ht20_max_offset[3];
> +	struct nibble_pair ht40_2s_index_diff[3];
> +	struct nibble_pair ht20_index_diff[3];
> +	struct nibble_pair ofdm_index_diff[3];
> +	struct nibble_pair ht40_max_offset[3];
> +	struct nibble_pair ht20_max_offset[3];
>  };
>  
>  struct rtl8xxxu_priv {

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

* Re: [RFC 11/16] rtl8xxxu: Make efuse content length a parameter
  2015-10-20  6:45 ` [RFC 11/16] rtl8xxxu: Make efuse content length a parameter Jakub Sitnicki
@ 2015-10-21  2:01   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  2:01 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> This is a preparatory step for adding support for RTL8188EU chips
> which have different efuse length.

The way the EFUSES are stored, it doesn't matter that you try to read
more data as the EFUSE will stop. I already added support for reading
the larger EFUSE on 8192EU and 8723BU (and I have patches somewhere
reading the 8188EU EFUSE too), so I am pretty sure this change isn't
necessary.

Jes

>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 5 ++++-
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
>  2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index d48db87..a7d172a 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1930,6 +1930,7 @@ rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data)
>  static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>  {
>  	struct device *dev = &priv->udev->dev;
> +	int efuse_len = priv->fops->efuse_len;
>  	int i, ret = 0;
>  	u8 val8, word_mask, header, extheader;
>  	u16 val16, efuse_addr, offset;
> @@ -1978,7 +1979,7 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>  	memset(priv->efuse_wifi.raw, 0xff, EFUSE_MAP_LEN_8723A);
>  
>  	efuse_addr = 0;
> -	while (efuse_addr < EFUSE_REAL_CONTENT_LEN_8723A) {
> +	while (efuse_addr < efuse_len) {
>  		u16 map_addr;
>  
>  		ret = rtl8xxxu_read_efuse8(priv, efuse_addr++, &header);
> @@ -5780,6 +5781,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
>  	.parse_efuse = rtl8723au_parse_efuse,
>  	.load_firmware = rtl8723au_load_firmware,
>  	.power_on = rtl8723au_power_on,
> +	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>  	.writeN_block_size = 1024,
>  };
>  
> @@ -5787,6 +5789,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
>  	.parse_efuse = rtl8192cu_parse_efuse,
>  	.load_firmware = rtl8192cu_load_firmware,
>  	.power_on = rtl8192cu_power_on,
> +	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>  	.writeN_block_size = 128,
>  };
>  
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 2f5f903..ccfbc10 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -677,5 +677,6 @@ struct rtl8xxxu_fileops {
>  	int (*parse_efuse) (struct rtl8xxxu_priv *priv);
>  	int (*load_firmware) (struct rtl8xxxu_priv *priv);
>  	int (*power_on) (struct rtl8xxxu_priv *priv);
> +	int efuse_len;
>  	int writeN_block_size;
>  };

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

* Re: [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length
  2015-10-20  6:45 ` [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length Jakub Sitnicki
@ 2015-10-21  2:03   ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  2:03 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Preparatory step for adding support for RTL8188EU devices.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>
> Notes:
>     An alternative approach to keeping a buffer that is big enough to hold
>     the efuse map of any of the supported chips would be to allocate the
>     efuse map on-the-go to pass it between read_efuse() and parse_efuse().
>     
>     This would also reduce the memory footprint of struct rtl8xxxu_priv.
>
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 5 ++++-
>  2 files changed, 6 insertions(+), 3 deletions(-)

This change is already handled by my current code.

Jes

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

* Re: [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation
  2015-10-20  6:45 ` [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation Jakub Sitnicki
@ 2015-10-21  2:07   ` Jes Sorensen
  2015-10-23 21:17     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  2:07 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> Preparatory step for adding support for RTL8188EU chips.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 ++++--
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
>  2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 83cdc2a..ecda799 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -4223,7 +4223,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
>  	/*
>  	 * Start out with default power levels for channel 6, 20MHz
>  	 */
> -	rtl8723a_set_tx_power(priv, 1, false);
> +	priv->fops->set_tx_power(priv, 1, false);
>  
>  	/* Let the 8051 take control of antenna setting */
>  	val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
> @@ -5207,7 +5207,7 @@ static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
>  
>  		channel = hw->conf.chandef.chan->hw_value;
>  
> -		rtl8723a_set_tx_power(priv, channel, ht40);
> +		priv->fops->set_tx_power(priv, channel, ht40);
>  
>  		rtl8723au_config_channel(hw);
>  	}
> @@ -5781,6 +5781,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
>  	.parse_efuse = rtl8723au_parse_efuse,
>  	.load_firmware = rtl8723au_load_firmware,
>  	.power_on = rtl8723au_power_on,
> +	.set_tx_power = rtl8723a_set_tx_power,
>  	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>  	.writeN_block_size = 1024,
>  };
> @@ -5789,6 +5790,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
>  	.parse_efuse = rtl8192cu_parse_efuse,
>  	.load_firmware = rtl8192cu_load_firmware,
>  	.power_on = rtl8192cu_power_on,
> +	.set_tx_power = rtl8723a_set_tx_power,
>  	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>  	.writeN_block_size = 128,
>  };
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 1a767eb..427eb7e 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -679,6 +679,7 @@ struct rtl8xxxu_fileops {
>  	int (*parse_efuse) (struct rtl8xxxu_priv *priv);
>  	int (*load_firmware) (struct rtl8xxxu_priv *priv);
>  	int (*power_on) (struct rtl8xxxu_priv *priv);
> +	void (*set_tx_power) (struct rtl8xxxu_priv *priv, int channel, bool ht40);
>  	int efuse_len;
>  	int writeN_block_size;
>  };

Lets not add function pointers before we actually know we have a need
for them.

Jes

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

* Re: [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse()
  2015-10-20  6:45 ` [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse() Jakub Sitnicki
@ 2015-10-21  2:15   ` Jes Sorensen
  2015-10-23 21:52     ` Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-21  2:15 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> As opposed to the vendor driver (rtl8188eu), extract from efuse only
> these TX power values that are going to be of use later on.
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 35 +++++++++++++++++++++++-
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 24 ++++++++++++++++
>  2 files changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 344161b..90da707 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -1900,7 +1900,40 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>  
>  static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
>  {
> -	return -EOPNOTSUPP; /* Not implemented */
> +	struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188;
> +	struct rtl8188eu_tx_power *tx_power = &priv->tx_power.tx_power8188;
> +
> +	if (efuse->rtl_id != cpu_to_le16(0x8129))
> +		return -EINVAL;
> +
> +	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
> +
> +	memcpy(tx_power->cck_index_A,
> +	       efuse->tx_power.cck_index_A,
> +	       sizeof(tx_power->cck_index_A));
> +
> +	memcpy(tx_power->ht40_1s_index_A,
> +	       efuse->tx_power.ht40_1s_index_A,
> +	       sizeof(tx_power->ht40_1s_index_A));
> +
> +	memcpy(tx_power->ht20_ofdm_index_diff,
> +	       efuse->tx_power.ht20_ofdm_index_diff,
> +	       sizeof(tx_power->ht20_ofdm_index_diff));
> +
> +	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
> +		 efuse->vendor_name);
> +	dev_info(&priv->udev->dev, "Product: %.11s\n",
> +		 efuse->device_name);
> +
> +	/* XXX: Do we need to read the rf_regulatory flag? */
> +
> +	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
> +		print_hex_dump_bytes("rtl8xxxu: ", DUMP_PREFIX_OFFSET,
> +				     priv->efuse_wifi.raw,
> +				     sizeof(priv->efuse_wifi.raw));
> +	}
> +
> +	return 0;
>  }
>  
>  static int
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 79f47e3..ec49504 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -507,6 +507,22 @@ struct rtl8192cu_efuse {
>  	u8 customer_id;
>  };
>  
> +struct rtl8188eu_efuse {
> +	__le16 rtl_id;
> +	u8 res0[0x0e];
> +	struct {						/* 0x10 */
> +		u8 cck_index_A[6];
> +		u8 ht40_1s_index_A[5];
> +		struct nibble_pair ht20_ofdm_index_diff[1];
> +	} tx_power;
> +	u8 res1[0xbb];
> +	u8 mac_addr[ETH_ALEN];					/* 0xd7 */
> +	u8 res2[0x02];
> +	u8 vendor_name[7];					/* 0xdf */
> +	u8 res3[0x02];
> +	u8 device_name[11];					/* 0xe8 */
> +};

This is incomplete - I think it should look more like this:

struct rtl8188eu_efuse {
	__le16 rtl_id;
	u8 res0[0x0e];
	u8 cck_tx_power_index_A[3];	/* 0x10 */
	u8 cck_tx_power_index_B[3];
	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
	u8 ht40_1s_tx_power_index_B[3];
	u8 res1[0x9c];
	u8 channel_plan;		/* 0xb8 */
	u8 xtal_k;
	u8 thermal_meter;
	u8 iqk_lck;
	u8 res2[5];
	u8 rf_board_option;
	u8 rf_feature_option;
	u8 rf_bt_setting;
	u8 eeprom_version;
	u8 eeprom_customer_id;
	u8 res3[3];
	u8 rf_antenna_option;		/* 0xc9 */
	u8 res4[6];
	u8 vid;				/* 0xd0 */
	u8 res5[1];
	u8 pid;				/* 0xd2 */
	u8 res6[1];
	u8 usb_optional_function;
	u8 res7[2];
	u8 mac_addr[ETH_ALEN];		/* 0xd7 */
	u8 res8[2];
	u8 vendor_name[7];
	u8 res9[2];
	u8 device_name[0x0b];		/* 0xe8 */
	u8 res10[2];
	u8 serial[0x0b];		/* 0xf5 */
	u8 res11[0x30];
	u8 unknown[0x0d];		/* 0x130 */
	u8 res12[0xc3];
};

> +
>  struct rtl8xxxu_reg8val {
>  	u16 reg;
>  	u8 val;
> @@ -587,6 +603,12 @@ struct rtl8723au_tx_power {
>  	struct nibble_pair ht20_max_offset[3];
>  };
>  
> +struct rtl8188eu_tx_power {
> +	u8 cck_index_A[6];
> +	u8 ht40_1s_index_A[5];
> +	struct nibble_pair ht20_ofdm_index_diff[1];
> +};
> +
>  struct rtl8xxxu_priv {
>  	struct ieee80211_hw *hw;
>  	struct usb_device *udev;
> @@ -607,6 +629,7 @@ struct rtl8xxxu_priv {
>  	char chip_name[8];
>  	union {
>  		struct rtl8723au_tx_power tx_power8723;
> +		struct rtl8188eu_tx_power tx_power8188;
>  	} tx_power;
>  	u32 chip_cut:4;
>  	u32 rom_rev:4;
> @@ -659,6 +682,7 @@ struct rtl8xxxu_priv {
>  		u8 raw[EFUSE_MAP_LEN];
>  		struct rtl8723au_efuse efuse8723;
>  		struct rtl8192cu_efuse efuse8192;
> +		struct rtl8188eu_efuse efuse8188;
>  	} efuse_wifi;
>  	u32 adda_backup[RTL8XXXU_ADDA_REGS];
>  	u32 mac_backup[RTL8XXXU_MAC_REGS];

There is a lot of conflict with the last couple of patches - please
rebase them against current.

Thanks,
Jes

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

* Re: [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips
  2015-10-21  0:29 ` [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jes Sorensen
@ 2015-10-23  5:24   ` Jakub Sitnicki
  0 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23  5:24 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 02:29 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> Hi Jes,
>>
>> I'm posting this patch set to show in what direction the work is
>> going.  Hopefully any changes (e.g. renames) which you wouldn't see
>> fit for this driver can be identified early this way.
>>
>> The work is nowhere near the end.  These changes only get me past the
>> parse_efuse() step in the probe() routine.
>>
>> I've structured the patch set in such a way that changes that are not
>> RTL8188EU-specific (preparatory work) come first.  All but the last
>> two patches (tagged "rtl8188eu:") fall into this category.  If you
>> were considering to apply any of them, note that they were not tested
>> with any device that is known to work with rtl8xxxu, only a TP-Link
>> TL-WN725N (RTL8188EU) dongle.
>>
>> The corresponding git branch for this patch set is at:
>>
>> git https://github.com/jsitnicki/linux.git branch rtl8xxxu-rtl8188eu
>
> Jakub,
>
> Thanks for the feedback - some of these patches are good, some of them I
> dislike, and some of them will conflict with work I have been doing
> since I posted the patch. I have been working on adding 8723bu and
> 8192eu support and some of those changes should also benefit your work.
>
> I have pushed my current nextgen tree to git, so if you checkout the
> rtl8xxxu-nextgen branch you will see it.
>
> I'll respond to the individual patches here.

Thanks for the prompt review and the feedback.  I'll rebase the
RTL8188EU-related patches onto the -nextgen branch, and will be watching
it.

Cheers,
Jakub


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

* Re: [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register
  2015-10-21  0:29   ` Jes Sorensen
@ 2015-10-23  5:38     ` Jakub Sitnicki
  0 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23  5:38 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 02:29 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> rtl8723au driver treats REG_9346CR register as either 8- or 16-bit wide,
>> while rtl8192cu driver treats it as 8-bit wide, and so does rtl8188eu
>> driver.  Use the lowest common denominator strategy.
>>
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> NACK - this is a 16 bit register and the vendor drivers take the lazy
> approach of just reading/writing the lower 8 bits when they feel like
> it.
>
> My code is more consistent, so this one is not going in.

Makes sense.  It didn't occur to me to refer to register offset
definitions and check if REG_9346CR really is 16-bit wide.  Now that you
pointed it out I see it:

#define REG_9346CR                      0x000A
#define REG_EE_VPD                      0x000C

-Jakub

>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index 11fcfda..5f90261 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -1928,10 +1928,10 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>>  	u16 val16, efuse_addr, offset;
>>  	u32 val32;
>>  
>> -	val16 = rtl8xxxu_read16(priv, REG_9346CR);
>> -	if (val16 & EEPROM_ENABLE)
>> +	val8 = rtl8xxxu_read8(priv, REG_9346CR);
>> +	if (val8 & EEPROM_ENABLE)
>>  		priv->has_eeprom = 1;
>> -	if (val16 & EEPROM_BOOT)
>> +	if (val8 & EEPROM_BOOT)
>>  		priv->boot_eeprom = 1;
>>  
>>  	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);

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

* Re: [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices
  2015-10-21  0:57   ` Jes Sorensen
@ 2015-10-23  5:45     ` Jakub Sitnicki
  0 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23  5:45 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 02:57 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> rtl8192cu driver doesn't read/write the REG_EFUSE_TEST register.
>> Neither does the rtl8188eu driver.  Do it only for RTL8192CU-based
>> devices.
>>
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 9 ++++++---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
>>  2 files changed, 7 insertions(+), 3 deletions(-)
>
> This looks a reasonable change - I verified the 8723BU does this as
> well, but 8192EU doesn't.
>
> I did modify you commit message slightly since it said "Do it only for
> RTL8192CU-based devices" and I am sure you meant 8723AU (and now
> 8723BU).
>
> If you dislike the change to the message, let me know and I'll pull the
> patch or change it.

You're right.  It should say "RTL8723AU-based devices".  Must have had a
brain-fart there.  Thanks for fixing the message.

-Jakub

>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index 5f90261..a8d7e0a 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -1704,6 +1704,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
>>  			priv->has_bluetooth = 1;
>>  		if (val32 & MULTI_GPS_FUNC_EN)
>>  			priv->has_gps = 1;
>> +		priv->is_multi_func = 1;
>>  	} else if (val32 & SYS_CFG_TYPE_ID) {
>>  		bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
>>  		bonding &= HPON_FSM_BONDING_MASK;
>> @@ -1934,9 +1935,11 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>>  	if (val8 & EEPROM_BOOT)
>>  		priv->boot_eeprom = 1;
>>  
>> -	val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
>> -	val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
>> -	rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
>> +	if (priv->is_multi_func) {
>> +		val32 = rtl8xxxu_read32(priv, REG_EFUSE_TEST);
>> +		val32 = (val32 & ~EFUSE_SELECT_MASK) | EFUSE_WIFI_SELECT;
>> +		rtl8xxxu_write32(priv, REG_EFUSE_TEST, val32);
>> +	}
>>  
>>  	dev_dbg(dev, "Booting from %s\n",
>>  		priv->boot_eeprom ? "EEPROM" : "EFUSE");
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> index f2a1bac..622e6f5 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> @@ -597,6 +597,7 @@ struct rtl8xxxu_priv {
>>  	struct rtl8723au_idx ht20_max_power_offset[3];
>>  	u32 chip_cut:4;
>>  	u32 rom_rev:4;
>> +	u32 is_multi_func:1;
>>  	u32 has_wifi:1;
>>  	u32 has_bluetooth:1;
>>  	u32 enable_bluetooth:1;

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

* Re: [RFC 05/16] rtl8xxxu: Unbreak a user-visible string
  2015-10-21  1:46   ` Jes Sorensen
@ 2015-10-23  5:54     ` Jakub Sitnicki
  2015-10-23 15:38       ` Jes Sorensen
  0 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23  5:54 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 03:46 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index cfb18db..e892fde 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -2002,8 +2002,8 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>>  		/* We have 8 bits to indicate validity */
>>  		map_addr = offset * 8;
>>  		if (map_addr >= EFUSE_MAP_LEN_8723A) {
>> -			dev_warn(dev, "%s: Illegal map_addr (%04x), "
>> -				 "efuse corrupt!\n",
>> +			dev_warn(dev,
>> +				 "%s: Illegal map_addr (%04x), efuse corrupt!\n",
>
> This would make the line longer than 80 characters - so no.
>
> NAK

Oh, okay.  In my defense, Your Honor, Documentation/CodingStyle made me
do it ;-)

  [...] However, never break user-visible strings such as printk
  messages, because that breaks the ability to grep for them.

Cheers,
Jakub

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

* Re: [RFC 05/16] rtl8xxxu: Unbreak a user-visible string
  2015-10-23  5:54     ` Jakub Sitnicki
@ 2015-10-23 15:38       ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-23 15:38 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> On Wed, Oct 21, 2015 at 03:46 AM CEST, Jes Sorensen
> <Jes.Sorensen@redhat.com> wrote:
>> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>>> ---
>>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>>> index cfb18db..e892fde 100644
>>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>>> @@ -2002,8 +2002,8 @@ static int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
>>>  		/* We have 8 bits to indicate validity */
>>>  		map_addr = offset * 8;
>>>  		if (map_addr >= EFUSE_MAP_LEN_8723A) {
>>> -			dev_warn(dev, "%s: Illegal map_addr (%04x), "
>>> -				 "efuse corrupt!\n",
>>> +			dev_warn(dev,
>>> +				 "%s: Illegal map_addr (%04x), efuse corrupt!\n",
>>
>> This would make the line longer than 80 characters - so no.
>>
>> NAK
>
> Oh, okay.  In my defense, Your Honor, Documentation/CodingStyle made me
> do it ;-)
>
>   [...] However, never break user-visible strings such as printk
>   messages, because that breaks the ability to grep for them.

No worries, I am aware of that, I just don't like it so I break the
lines in reasonable places that still allow searching for them.

Cheers,
Jes

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

* Re: [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv
  2015-10-21  1:58   ` Jes Sorensen
@ 2015-10-23 21:16     ` Jakub Sitnicki
  2015-10-26 17:40       ` Jes Sorensen
  0 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23 21:16 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 03:58 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 95 ++++++++++++------------
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 30 ++++----
>>  2 files changed, 66 insertions(+), 59 deletions(-)
>
> I don't really see this patch adding any value - it just adds an
> additional layer of convolution. Unless there is a strong reason for
> applying it, I am going to drop this one.

The reasoning behind this change, which I should have had explained in
the commit description, is to later on have a union of two struct
*_tx_power's:

  	union {
  		struct rtl8723au_tx_power tx_power8723;
		struct rtl8188eu_tx_power tx_power8188;
  	} tx_power;

We arrive at this in the last patch from this series ("rtl8xxxu:
rtl8188eu: Implement parse_efuse()").

The existing *_tx_power_* fields in struct rtl8xxxu_priv don't fit the
rtl8188eu needs because the vendor driver divides the 2.4 GHz channels
into 6 as opposed to 3 groups (see the MAX_CHNL_GROUP_24G constant and
struct txpowerinfo24g in staging/rtl8188eu).

I agree that it does complicate the core structure (rtl8xxxu_priv) for
no reason until there is actually support for RTL8188EU.  However, I
gave the rtl8192eu driver a glance, and it looks like you might be
facing the same challenge there.

Cheers,
Jakub

>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index e1f8c62..d67c668 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -1490,6 +1490,7 @@ static void rtl8723au_config_channel(struct ieee80211_hw *hw)
>>  static void
>>  rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
>>  {
>> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>>  	u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS];
>>  	u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS];
>>  	u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b;
>> @@ -1498,27 +1499,27 @@ rtl8723a_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
>>  
>>  	group = rtl8723a_channel_to_group(channel);
>>  
>> -	cck[0] = priv->cck_tx_power_index_A[group];
>> -	cck[1] = priv->cck_tx_power_index_B[group];
>> +	cck[0] = tx_power->cck_tx_power_index_A[group];
>> +	cck[1] = tx_power->cck_tx_power_index_B[group];
>>  
>> -	ofdm[0] = priv->ht40_1s_tx_power_index_A[group];
>> -	ofdm[1] = priv->ht40_1s_tx_power_index_B[group];
>> +	ofdm[0] = tx_power->ht40_1s_tx_power_index_A[group];
>> +	ofdm[1] = tx_power->ht40_1s_tx_power_index_B[group];
>>  
>> -	ofdmbase[0] = ofdm[0] +	priv->ofdm_tx_power_index_diff[group].a;
>> -	ofdmbase[1] = ofdm[1] +	priv->ofdm_tx_power_index_diff[group].b;
>> +	ofdmbase[0] = ofdm[0] +	tx_power->ofdm_tx_power_index_diff[group].a;
>> +	ofdmbase[1] = ofdm[1] +	tx_power->ofdm_tx_power_index_diff[group].b;
>>  
>>  	mcsbase[0] = ofdm[0];
>>  	mcsbase[1] = ofdm[1];
>>  	if (!ht40) {
>> -		mcsbase[0] += priv->ht20_tx_power_index_diff[group].a;
>> -		mcsbase[1] += priv->ht20_tx_power_index_diff[group].b;
>> +		mcsbase[0] += tx_power->ht20_tx_power_index_diff[group].a;
>> +		mcsbase[1] += tx_power->ht20_tx_power_index_diff[group].b;
>>  	}
>>  
>>  	if (priv->tx_paths > 1) {
>> -		if (ofdm[0] > priv->ht40_2s_tx_power_index_diff[group].a)
>> -			ofdm[0] -=  priv->ht40_2s_tx_power_index_diff[group].a;
>> -		if (ofdm[1] > priv->ht40_2s_tx_power_index_diff[group].b)
>> -			ofdm[1] -=  priv->ht40_2s_tx_power_index_diff[group].b;
>> +		if (ofdm[0] > tx_power->ht40_2s_tx_power_index_diff[group].a)
>> +			ofdm[0] -= tx_power->ht40_2s_tx_power_index_diff[group].a;
>> +		if (ofdm[1] > tx_power->ht40_2s_tx_power_index_diff[group].b)
>> +			ofdm[1] -= tx_power->ht40_2s_tx_power_index_diff[group].b;
>>  	}
>>  
>>  	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_CHANNEL)
>> @@ -1780,39 +1781,40 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
>>  static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
>>  {
>>  	struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
>> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>>  
>>  	if (efuse->rtl_id != cpu_to_le16(0x8129))
>>  		return -EINVAL;
>>  
>>  	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
>>  
>> -	memcpy(priv->cck_tx_power_index_A,
>> +	memcpy(tx_power->cck_tx_power_index_A,
>>  	       efuse->cck_tx_power_index_A,
>> -	       sizeof(priv->cck_tx_power_index_A));
>> -	memcpy(priv->cck_tx_power_index_B,
>> +	       sizeof(tx_power->cck_tx_power_index_A));
>> +	memcpy(tx_power->cck_tx_power_index_B,
>>  	       efuse->cck_tx_power_index_B,
>> -	       sizeof(priv->cck_tx_power_index_B));
>> +	       sizeof(tx_power->cck_tx_power_index_B));
>>  
>> -	memcpy(priv->ht40_1s_tx_power_index_A,
>> +	memcpy(tx_power->ht40_1s_tx_power_index_A,
>>  	       efuse->ht40_1s_tx_power_index_A,
>> -	       sizeof(priv->ht40_1s_tx_power_index_A));
>> -	memcpy(priv->ht40_1s_tx_power_index_B,
>> +	       sizeof(tx_power->ht40_1s_tx_power_index_A));
>> +	memcpy(tx_power->ht40_1s_tx_power_index_B,
>>  	       efuse->ht40_1s_tx_power_index_B,
>> -	       sizeof(priv->ht40_1s_tx_power_index_B));
>> +	       sizeof(tx_power->ht40_1s_tx_power_index_B));
>>  
>> -	memcpy(priv->ht20_tx_power_index_diff,
>> +	memcpy(tx_power->ht20_tx_power_index_diff,
>>  	       efuse->ht20_tx_power_index_diff,
>> -	       sizeof(priv->ht20_tx_power_index_diff));
>> -	memcpy(priv->ofdm_tx_power_index_diff,
>> +	       sizeof(tx_power->ht20_tx_power_index_diff));
>> +	memcpy(tx_power->ofdm_tx_power_index_diff,
>>  	       efuse->ofdm_tx_power_index_diff,
>> -	       sizeof(priv->ofdm_tx_power_index_diff));
>> +	       sizeof(tx_power->ofdm_tx_power_index_diff));
>>  
>> -	memcpy(priv->ht40_max_power_offset,
>> +	memcpy(tx_power->ht40_max_power_offset,
>>  	       efuse->ht40_max_power_offset,
>> -	       sizeof(priv->ht40_max_power_offset));
>> -	memcpy(priv->ht20_max_power_offset,
>> +	       sizeof(tx_power->ht40_max_power_offset));
>> +	memcpy(tx_power->ht20_max_power_offset,
>>  	       efuse->ht20_max_power_offset,
>> -	       sizeof(priv->ht20_max_power_offset));
>> +	       sizeof(tx_power->ht20_max_power_offset));
>>  
>>  	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
>>  		 efuse->vendor_name);
>> @@ -1824,6 +1826,7 @@ static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
>>  static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>>  {
>>  	struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192;
>> +	struct rtl8723au_tx_power *tx_power = &priv->tx_power;
>>  	int i;
>>  
>>  	if (efuse->rtl_id != cpu_to_le16(0x8129))
>> @@ -1831,36 +1834,36 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>>  
>>  	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
>>  
>> -	memcpy(priv->cck_tx_power_index_A,
>> +	memcpy(tx_power->cck_tx_power_index_A,
>>  	       efuse->cck_tx_power_index_A,
>> -	       sizeof(priv->cck_tx_power_index_A));
>> -	memcpy(priv->cck_tx_power_index_B,
>> +	       sizeof(tx_power->cck_tx_power_index_A));
>> +	memcpy(tx_power->cck_tx_power_index_B,
>>  	       efuse->cck_tx_power_index_B,
>> -	       sizeof(priv->cck_tx_power_index_B));
>> +	       sizeof(tx_power->cck_tx_power_index_B));
>>  
>> -	memcpy(priv->ht40_1s_tx_power_index_A,
>> +	memcpy(tx_power->ht40_1s_tx_power_index_A,
>>  	       efuse->ht40_1s_tx_power_index_A,
>> -	       sizeof(priv->ht40_1s_tx_power_index_A));
>> -	memcpy(priv->ht40_1s_tx_power_index_B,
>> +	       sizeof(tx_power->ht40_1s_tx_power_index_A));
>> +	memcpy(tx_power->ht40_1s_tx_power_index_B,
>>  	       efuse->ht40_1s_tx_power_index_B,
>> -	       sizeof(priv->ht40_1s_tx_power_index_B));
>> -	memcpy(priv->ht40_2s_tx_power_index_diff,
>> +	       sizeof(tx_power->ht40_1s_tx_power_index_B));
>> +	memcpy(tx_power->ht40_2s_tx_power_index_diff,
>>  	       efuse->ht40_2s_tx_power_index_diff,
>> -	       sizeof(priv->ht40_2s_tx_power_index_diff));
>> +	       sizeof(tx_power->ht40_2s_tx_power_index_diff));
>>  
>> -	memcpy(priv->ht20_tx_power_index_diff,
>> +	memcpy(tx_power->ht20_tx_power_index_diff,
>>  	       efuse->ht20_tx_power_index_diff,
>> -	       sizeof(priv->ht20_tx_power_index_diff));
>> -	memcpy(priv->ofdm_tx_power_index_diff,
>> +	       sizeof(tx_power->ht20_tx_power_index_diff));
>> +	memcpy(tx_power->ofdm_tx_power_index_diff,
>>  	       efuse->ofdm_tx_power_index_diff,
>> -	       sizeof(priv->ofdm_tx_power_index_diff));
>> +	       sizeof(tx_power->ofdm_tx_power_index_diff));
>>  
>> -	memcpy(priv->ht40_max_power_offset,
>> +	memcpy(tx_power->ht40_max_power_offset,
>>  	       efuse->ht40_max_power_offset,
>> -	       sizeof(priv->ht40_max_power_offset));
>> -	memcpy(priv->ht20_max_power_offset,
>> +	       sizeof(tx_power->ht40_max_power_offset));
>> +	memcpy(tx_power->ht20_max_power_offset,
>>  	       efuse->ht20_max_power_offset,
>> -	       sizeof(priv->ht20_max_power_offset));
>> +	       sizeof(tx_power->ht20_max_power_offset));
>>  
>>  	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
>>  		 efuse->vendor_name);
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> index 622e6f5..1a0c88d 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> @@ -564,6 +564,22 @@ struct h2c_cmd {
>>  
>>  struct rtl8xxxu_fileops;
>>  
>> +struct rtl8723au_tx_power {
>> +	u8 cck_tx_power_index_A[3];	/* 0x10 */
>> +	u8 cck_tx_power_index_B[3];
>> +	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
>> +	u8 ht40_1s_tx_power_index_B[3];
>> +	/*
>> +	 * The following entries are half-bytes split as:
>> +	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
>> +	 */
>> +	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
>> +	struct rtl8723au_idx ht20_tx_power_index_diff[3];
>> +	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
>> +	struct rtl8723au_idx ht40_max_power_offset[3];
>> +	struct rtl8723au_idx ht20_max_power_offset[3];
>> +};
>> +
>>  struct rtl8xxxu_priv {
>>  	struct ieee80211_hw *hw;
>>  	struct usb_device *udev;
>> @@ -582,19 +598,7 @@ struct rtl8xxxu_priv {
>>  
>>  	u8 mac_addr[ETH_ALEN];
>>  	char chip_name[8];
>> -	u8 cck_tx_power_index_A[3];	/* 0x10 */
>> -	u8 cck_tx_power_index_B[3];
>> -	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
>> -	u8 ht40_1s_tx_power_index_B[3];
>> -	/*
>> -	 * The following entries are half-bytes split as:
>> -	 * bits 0-3: path A, bits 4-7: path B, all values 4 bits signed
>> -	 */
>> -	struct rtl8723au_idx ht40_2s_tx_power_index_diff[3];
>> -	struct rtl8723au_idx ht20_tx_power_index_diff[3];
>> -	struct rtl8723au_idx ofdm_tx_power_index_diff[3];
>> -	struct rtl8723au_idx ht40_max_power_offset[3];
>> -	struct rtl8723au_idx ht20_max_power_offset[3];
>> +	struct rtl8723au_tx_power tx_power;
>>  	u32 chip_cut:4;
>>  	u32 rom_rev:4;
>>  	u32 is_multi_func:1;

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

* Re: [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation
  2015-10-21  2:07   ` Jes Sorensen
@ 2015-10-23 21:17     ` Jakub Sitnicki
  0 siblings, 0 replies; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23 21:17 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 04:07 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> Preparatory step for adding support for RTL8188EU chips.
>>
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 6 ++++--
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
>>  2 files changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index 83cdc2a..ecda799 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -4223,7 +4223,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
>>  	/*
>>  	 * Start out with default power levels for channel 6, 20MHz
>>  	 */
>> -	rtl8723a_set_tx_power(priv, 1, false);
>> +	priv->fops->set_tx_power(priv, 1, false);
>>  
>>  	/* Let the 8051 take control of antenna setting */
>>  	val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
>> @@ -5207,7 +5207,7 @@ static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
>>  
>>  		channel = hw->conf.chandef.chan->hw_value;
>>  
>> -		rtl8723a_set_tx_power(priv, channel, ht40);
>> +		priv->fops->set_tx_power(priv, channel, ht40);
>>  
>>  		rtl8723au_config_channel(hw);
>>  	}
>> @@ -5781,6 +5781,7 @@ static struct rtl8xxxu_fileops rtl8723au_fops = {
>>  	.parse_efuse = rtl8723au_parse_efuse,
>>  	.load_firmware = rtl8723au_load_firmware,
>>  	.power_on = rtl8723au_power_on,
>> +	.set_tx_power = rtl8723a_set_tx_power,
>>  	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>>  	.writeN_block_size = 1024,
>>  };
>> @@ -5789,6 +5790,7 @@ static struct rtl8xxxu_fileops rtl8192cu_fops = {
>>  	.parse_efuse = rtl8192cu_parse_efuse,
>>  	.load_firmware = rtl8192cu_load_firmware,
>>  	.power_on = rtl8192cu_power_on,
>> +	.set_tx_power = rtl8723a_set_tx_power,
>>  	.efuse_len = EFUSE_REAL_CONTENT_LEN_8723A,
>>  	.writeN_block_size = 128,
>>  };
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> index 1a767eb..427eb7e 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> @@ -679,6 +679,7 @@ struct rtl8xxxu_fileops {
>>  	int (*parse_efuse) (struct rtl8xxxu_priv *priv);
>>  	int (*load_firmware) (struct rtl8xxxu_priv *priv);
>>  	int (*power_on) (struct rtl8xxxu_priv *priv);
>> +	void (*set_tx_power) (struct rtl8xxxu_priv *priv, int channel, bool ht40);
>>  	int efuse_len;
>>  	int writeN_block_size;
>>  };
>
> Lets not add function pointers before we actually know we have a need
> for them.

OK, will hold on to this patch in my queue.

-Jakub

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

* Re: [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse()
  2015-10-21  2:15   ` Jes Sorensen
@ 2015-10-23 21:52     ` Jakub Sitnicki
  2015-10-26 17:45       ` Jes Sorensen
  0 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-10-23 21:52 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless

On Wed, Oct 21, 2015 at 04:15 AM CEST, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>> As opposed to the vendor driver (rtl8188eu), extract from efuse only
>> these TX power values that are going to be of use later on.
>>
>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>> ---
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 35 +++++++++++++++++++++++-
>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 24 ++++++++++++++++
>>  2 files changed, 58 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> index 344161b..90da707 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
>> @@ -1900,7 +1900,40 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
>>  
>>  static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv)
>>  {
>> -	return -EOPNOTSUPP; /* Not implemented */
>> +	struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188;
>> +	struct rtl8188eu_tx_power *tx_power = &priv->tx_power.tx_power8188;
>> +
>> +	if (efuse->rtl_id != cpu_to_le16(0x8129))
>> +		return -EINVAL;
>> +
>> +	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
>> +
>> +	memcpy(tx_power->cck_index_A,
>> +	       efuse->tx_power.cck_index_A,
>> +	       sizeof(tx_power->cck_index_A));
>> +
>> +	memcpy(tx_power->ht40_1s_index_A,
>> +	       efuse->tx_power.ht40_1s_index_A,
>> +	       sizeof(tx_power->ht40_1s_index_A));
>> +
>> +	memcpy(tx_power->ht20_ofdm_index_diff,
>> +	       efuse->tx_power.ht20_ofdm_index_diff,
>> +	       sizeof(tx_power->ht20_ofdm_index_diff));
>> +
>> +	dev_info(&priv->udev->dev, "Vendor: %.7s\n",
>> +		 efuse->vendor_name);
>> +	dev_info(&priv->udev->dev, "Product: %.11s\n",
>> +		 efuse->device_name);
>> +
>> +	/* XXX: Do we need to read the rf_regulatory flag? */
>> +
>> +	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
>> +		print_hex_dump_bytes("rtl8xxxu: ", DUMP_PREFIX_OFFSET,
>> +				     priv->efuse_wifi.raw,
>> +				     sizeof(priv->efuse_wifi.raw));
>> +	}
>> +
>> +	return 0;
>>  }
>>  
>>  static int
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> index 79f47e3..ec49504 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> @@ -507,6 +507,22 @@ struct rtl8192cu_efuse {
>>  	u8 customer_id;
>>  };
>>  
>> +struct rtl8188eu_efuse {
>> +	__le16 rtl_id;
>> +	u8 res0[0x0e];
>> +	struct {						/* 0x10 */
>> +		u8 cck_index_A[6];
>> +		u8 ht40_1s_index_A[5];
>> +		struct nibble_pair ht20_ofdm_index_diff[1];
>> +	} tx_power;
>> +	u8 res1[0xbb];
>> +	u8 mac_addr[ETH_ALEN];					/* 0xd7 */
>> +	u8 res2[0x02];
>> +	u8 vendor_name[7];					/* 0xdf */
>> +	u8 res3[0x02];
>> +	u8 device_name[11];					/* 0xe8 */
>> +};
>
> This is incomplete - I think it should look more like this:
>
> struct rtl8188eu_efuse {
> 	__le16 rtl_id;
> 	u8 res0[0x0e];
> 	u8 cck_tx_power_index_A[3];	/* 0x10 */
> 	u8 cck_tx_power_index_B[3];
> 	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
> 	u8 ht40_1s_tx_power_index_B[3];
> 	u8 res1[0x9c];
> 	u8 channel_plan;		/* 0xb8 */
> 	u8 xtal_k;
> 	u8 thermal_meter;
> 	u8 iqk_lck;
> 	u8 res2[5];
> 	u8 rf_board_option;
> 	u8 rf_feature_option;
> 	u8 rf_bt_setting;
> 	u8 eeprom_version;
> 	u8 eeprom_customer_id;
> 	u8 res3[3];
> 	u8 rf_antenna_option;		/* 0xc9 */
> 	u8 res4[6];
> 	u8 vid;				/* 0xd0 */
> 	u8 res5[1];
> 	u8 pid;				/* 0xd2 */
> 	u8 res6[1];
> 	u8 usb_optional_function;
> 	u8 res7[2];
> 	u8 mac_addr[ETH_ALEN];		/* 0xd7 */
> 	u8 res8[2];
> 	u8 vendor_name[7];
> 	u8 res9[2];
> 	u8 device_name[0x0b];		/* 0xe8 */
> 	u8 res10[2];
> 	u8 serial[0x0b];		/* 0xf5 */
> 	u8 res11[0x30];
> 	u8 unknown[0x0d];		/* 0x130 */
> 	u8 res12[0xc3];
> };

The approach I took here was to add only the fields that I needed so
far.  But you're right, in full, it should like that, apart from the
tx_power fields.  My understanding of the vendor driver is that these
should look like so:

        /* RF path A */
	u8 cck_tx_power_index_A[6];
	u8 ht40_1s_tx_power_index_A[5];
	struct rtl8723au_idx ht20_ofdm_tx_power_index_diff_A;
        struct {
        	struct rtl8723au_idx ht40_ht20;
                struct rtl8723au_idx ofdm_cck;
        } tx_power_index_diff_A[3];
        /* RF path B */
	u8 cck_tx_power_index_B[6];
	u8 ht40_1s_tx_power_index_B[5];
	struct rtl8723au_idx ht20_ofdm_tx_power_index_diff_B;
        struct {
        	struct rtl8723au_idx ht40_ht20;
                struct rtl8723au_idx ofdm_cck;
        } tx_power_index_diff_B[3];
        /* RF path C */
        [...]
        /* RF path D */
        [...]

... but RTL8188EU has only RF path A, so I stopped at that.

It's not pretty how these 4-bit signed values (nibbles?) are laid out,
so I hope that I'm just getting it wrong :-)

Cheers,
Jakub

>> +
>>  struct rtl8xxxu_reg8val {
>>  	u16 reg;
>>  	u8 val;
>> @@ -587,6 +603,12 @@ struct rtl8723au_tx_power {
>>  	struct nibble_pair ht20_max_offset[3];
>>  };
>>  
>> +struct rtl8188eu_tx_power {
>> +	u8 cck_index_A[6];
>> +	u8 ht40_1s_index_A[5];
>> +	struct nibble_pair ht20_ofdm_index_diff[1];
>> +};
>> +
>>  struct rtl8xxxu_priv {
>>  	struct ieee80211_hw *hw;
>>  	struct usb_device *udev;
>> @@ -607,6 +629,7 @@ struct rtl8xxxu_priv {
>>  	char chip_name[8];
>>  	union {
>>  		struct rtl8723au_tx_power tx_power8723;
>> +		struct rtl8188eu_tx_power tx_power8188;
>>  	} tx_power;
>>  	u32 chip_cut:4;
>>  	u32 rom_rev:4;
>> @@ -659,6 +682,7 @@ struct rtl8xxxu_priv {
>>  		u8 raw[EFUSE_MAP_LEN];
>>  		struct rtl8723au_efuse efuse8723;
>>  		struct rtl8192cu_efuse efuse8192;
>> +		struct rtl8188eu_efuse efuse8188;
>>  	} efuse_wifi;
>>  	u32 adda_backup[RTL8XXXU_ADDA_REGS];
>>  	u32 mac_backup[RTL8XXXU_MAC_REGS];
>
> There is a lot of conflict with the last couple of patches - please
> rebase them against current.
>
> Thanks,
> Jes

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

* Re: [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv
  2015-10-23 21:16     ` Jakub Sitnicki
@ 2015-10-26 17:40       ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-10-26 17:40 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> On Wed, Oct 21, 2015 at 03:58 AM CEST, Jes Sorensen
> <Jes.Sorensen@redhat.com> wrote:
>> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>>> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
>>> ---
>>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 95
>>> ++++++++++++------------
>>>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 30 ++++----
>>>  2 files changed, 66 insertions(+), 59 deletions(-)
>>
>> I don't really see this patch adding any value - it just adds an
>> additional layer of convolution. Unless there is a strong reason for
>> applying it, I am going to drop this one.
>
> The reasoning behind this change, which I should have had explained in
> the commit description, is to later on have a union of two struct
> *_tx_power's:
>
>   	union {
>   		struct rtl8723au_tx_power tx_power8723;
> 		struct rtl8188eu_tx_power tx_power8188;
>   	} tx_power;
>
> We arrive at this in the last patch from this series ("rtl8xxxu:
> rtl8188eu: Implement parse_efuse()").
>
> The existing *_tx_power_* fields in struct rtl8xxxu_priv don't fit the
> rtl8188eu needs because the vendor driver divides the 2.4 GHz channels
> into 6 as opposed to 3 groups (see the MAX_CHNL_GROUP_24G constant and
> struct txpowerinfo24g in staging/rtl8188eu).
>
> I agree that it does complicate the core structure (rtl8xxxu_priv) for
> no reason until there is actually support for RTL8188EU.  However, I
> gave the rtl8192eu driver a glance, and it looks like you might be
> facing the same challenge there.

Jakub,

I see, looks like 8723bu has the same number of groups as well. An
alternative solution would be to do the conversion in parse_efuse() and
explode the values into per-channel arrays instead of keeping them in
groups. That should simplify the runtime portion of the code.

Cheers,
Jes

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

* Re: [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse()
  2015-10-23 21:52     ` Jakub Sitnicki
@ 2015-10-26 17:45       ` Jes Sorensen
  2015-11-02  8:21         ` [PATCH] rtl8xxxu: rtl8192eu: Map out EFUSE TX power area Jakub Sitnicki
  0 siblings, 1 reply; 42+ messages in thread
From: Jes Sorensen @ 2015-10-26 17:45 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> On Wed, Oct 21, 2015 at 04:15 AM CEST, Jes Sorensen
> <Jes.Sorensen@redhat.com> wrote:
>> Jakub Sitnicki <jsitnicki@gmail.com> writes:
>>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> index 79f47e3..ec49504 100644
>>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> @@ -507,6 +507,22 @@ struct rtl8192cu_efuse {
>>>  	u8 customer_id;
>>>  };
>>>  
>>> +struct rtl8188eu_efuse {
>>> +	__le16 rtl_id;
>>> +	u8 res0[0x0e];
>>> +	struct {						/* 0x10 */
>>> +		u8 cck_index_A[6];
>>> +		u8 ht40_1s_index_A[5];
>>> +		struct nibble_pair ht20_ofdm_index_diff[1];
>>> +	} tx_power;
>>> +	u8 res1[0xbb];
>>> +	u8 mac_addr[ETH_ALEN];					/* 0xd7 */
>>> +	u8 res2[0x02];
>>> +	u8 vendor_name[7];					/* 0xdf */
>>> +	u8 res3[0x02];
>>> +	u8 device_name[11];					/* 0xe8 */
>>> +};
>>
>> This is incomplete - I think it should look more like this:
>>
>> struct rtl8188eu_efuse {
>> 	__le16 rtl_id;
>> 	u8 res0[0x0e];
>> 	u8 cck_tx_power_index_A[3];	/* 0x10 */
>> 	u8 cck_tx_power_index_B[3];
>> 	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
>> 	u8 ht40_1s_tx_power_index_B[3];
>> 	u8 res1[0x9c];
>> 	u8 channel_plan;		/* 0xb8 */
>> 	u8 xtal_k;
>> 	u8 thermal_meter;
>> 	u8 iqk_lck;
>> 	u8 res2[5];
>> 	u8 rf_board_option;
>> 	u8 rf_feature_option;
>> 	u8 rf_bt_setting;
>> 	u8 eeprom_version;
>> 	u8 eeprom_customer_id;
>> 	u8 res3[3];
>> 	u8 rf_antenna_option;		/* 0xc9 */
>> 	u8 res4[6];
>> 	u8 vid;				/* 0xd0 */
>> 	u8 res5[1];
>> 	u8 pid;				/* 0xd2 */
>> 	u8 res6[1];
>> 	u8 usb_optional_function;
>> 	u8 res7[2];
>> 	u8 mac_addr[ETH_ALEN];		/* 0xd7 */
>> 	u8 res8[2];
>> 	u8 vendor_name[7];
>> 	u8 res9[2];
>> 	u8 device_name[0x0b];		/* 0xe8 */
>> 	u8 res10[2];
>> 	u8 serial[0x0b];		/* 0xf5 */
>> 	u8 res11[0x30];
>> 	u8 unknown[0x0d];		/* 0x130 */
>> 	u8 res12[0xc3];
>> };
>
> The approach I took here was to add only the fields that I needed so
> far.  But you're right, in full, it should like that, apart from the
> tx_power fields.  My understanding of the vendor driver is that these
> should look like so:
>
>         /* RF path A */
> 	u8 cck_tx_power_index_A[6];
> 	u8 ht40_1s_tx_power_index_A[5];
> 	struct rtl8723au_idx ht20_ofdm_tx_power_index_diff_A;
>         struct {
>         	struct rtl8723au_idx ht40_ht20;
>                 struct rtl8723au_idx ofdm_cck;
>         } tx_power_index_diff_A[3];
>         /* RF path B */
> 	u8 cck_tx_power_index_B[6];
> 	u8 ht40_1s_tx_power_index_B[5];
> 	struct rtl8723au_idx ht20_ofdm_tx_power_index_diff_B;
>         struct {
>         	struct rtl8723au_idx ht40_ht20;
>                 struct rtl8723au_idx ofdm_cck;
>         } tx_power_index_diff_B[3];
>         /* RF path C */
>         [...]
>         /* RF path D */
>         [...]
>
> ... but RTL8188EU has only RF path A, so I stopped at that.
>
> It's not pretty how these 4-bit signed values (nibbles?) are laid out,
> so I hope that I'm just getting it wrong :-)

It's pretty gross, I agree. I prefer to try to build a complete image of
the image. Down the line we tend to need the additional fields. The
EFUSE tends to map to a given power of 2 size.

My array was not complete either, I didn't get far enough to have to
deal with the power values. If you want to complete the struct and send
me a patch, that would be cool.

Cheers,
Jes

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

* [PATCH] rtl8xxxu: rtl8192eu: Map out EFUSE TX power area
  2015-10-26 17:45       ` Jes Sorensen
@ 2015-11-02  8:21         ` Jakub Sitnicki
  2015-11-10 21:57           ` Jes Sorensen
  0 siblings, 1 reply; 42+ messages in thread
From: Jakub Sitnicki @ 2015-11-02  8:21 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: Larry.Finger, linux-wireless, Jakub Sitnicki

TX power values are laid out differently in EFUSE found in RTL8192EU &
RTL8188EU devices.  TX power indices and differences for each RF path
are not interleaved (A, B, A, B), as in other chips, but follow one
another (A, B, C, D).

Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
---

Jes,

I reckon this is as "pretty" as it gets.  I even took the time to draw
it out:

  https://github.com/jsitnicki/realtek-notes/blob/master/efuse-tx-power.pdf

The whole TX power area is aligned to a multiple of 8, but subareas
for each RF path are not aligned (they are 18 bytes long each).

Patch is for rtl8xxxu-nextgen, of course.  Anything you would rename?

Cheers,
Jakub

 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c |  4 ++--
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 22 +++++++++++++++++-----
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 8c7d2da..6a89710 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -2300,7 +2300,7 @@ static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
 		return -EINVAL;
 
 	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
-
+#if 0
 	memcpy(priv->cck_tx_power_index_A, efuse->cck_tx_power_index_A,
 	       sizeof(priv->cck_tx_power_index_A));
 	memcpy(priv->cck_tx_power_index_B, efuse->cck_tx_power_index_B,
@@ -2310,7 +2310,7 @@ static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
 	       sizeof(priv->ht40_1s_tx_power_index_A));
 	memcpy(priv->ht40_1s_tx_power_index_B, efuse->ht40_1s_tx_power_index_B,
 	       sizeof(priv->ht40_1s_tx_power_index_B));
-#if 0
+
 	memcpy(priv->ht40_2s_tx_power_index_diff,
 	       efuse->ht40_2s_tx_power_index_diff,
 	       sizeof(priv->ht40_2s_tx_power_index_diff));
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 4b8431d..b223831 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -543,14 +543,26 @@ struct rtl8723bu_efuse {
 	u8 res12[0x4];
 };
 
+struct rtl8192eu_efuse_tx_power {
+	u8 cck_base[6];
+	u8 ht40_base[5];
+	struct rtl8723au_idx ht20_ofdm_1s_diff;
+	struct rtl8723au_idx ht40_ht20_2s_diff;
+	struct rtl8723au_idx ofdm_cck_2s_diff; /* not used */
+	struct rtl8723au_idx ht40_ht20_3s_diff;
+	struct rtl8723au_idx ofdm_cck_3s_diff; /* not used */
+	struct rtl8723au_idx ht40_ht20_4s_diff;
+	struct rtl8723au_idx ofdm_cck_4s_diff; /* not used */
+};
+
 struct rtl8192eu_efuse {
 	__le16 rtl_id;
 	u8 res0[0x0e];
-	u8 cck_tx_power_index_A[3];	/* 0x10 */
-	u8 cck_tx_power_index_B[3];
-	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
-	u8 ht40_1s_tx_power_index_B[3];
-	u8 res1[0x9c];
+	struct rtl8192eu_efuse_tx_power tx_power_index_A;	/* 0x10 */
+	struct rtl8192eu_efuse_tx_power tx_power_index_B;	/* 0x22 */
+	struct rtl8192eu_efuse_tx_power tx_power_index_C;	/* 0x34 */
+	struct rtl8192eu_efuse_tx_power tx_power_index_D;	/* 0x46 */
+	u8 res1[0x60];
 	u8 channel_plan;		/* 0xb8 */
 	u8 xtal_k;
 	u8 thermal_meter;
-- 
2.1.0


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

* Re: [PATCH] rtl8xxxu: rtl8192eu: Map out EFUSE TX power area
  2015-11-02  8:21         ` [PATCH] rtl8xxxu: rtl8192eu: Map out EFUSE TX power area Jakub Sitnicki
@ 2015-11-10 21:57           ` Jes Sorensen
  0 siblings, 0 replies; 42+ messages in thread
From: Jes Sorensen @ 2015-11-10 21:57 UTC (permalink / raw)
  To: Jakub Sitnicki; +Cc: Larry.Finger, linux-wireless

Jakub Sitnicki <jsitnicki@gmail.com> writes:
> TX power values are laid out differently in EFUSE found in RTL8192EU &
> RTL8188EU devices.  TX power indices and differences for each RF path
> are not interleaved (A, B, A, B), as in other chips, but follow one
> another (A, B, C, D).
>
> Signed-off-by: Jakub Sitnicki <jsitnicki@gmail.com>
> ---
>
> Jes,
>
> I reckon this is as "pretty" as it gets.  I even took the time to draw
> it out:
>
>   https://github.com/jsitnicki/realtek-notes/blob/master/efuse-tx-power.pdf
>
> The whole TX power area is aligned to a multiple of 8, but subareas
> for each RF path are not aligned (they are 18 bytes long each).
>
> Patch is for rtl8xxxu-nextgen, of course.  Anything you would rename?
>
> Cheers,
> Jakub

Jakub,

Thanks for digging through this! Patch looks good to me, I'll try to
see if it applies. I have been working on 8723bu support so things have
changed a bit.

Cheers,
Jes

>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c |  4 ++--
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 22 +++++++++++++++++-----
>  2 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 8c7d2da..6a89710 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -2300,7 +2300,7 @@ static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
>  		return -EINVAL;
>  
>  	ether_addr_copy(priv->mac_addr, efuse->mac_addr);
> -
> +#if 0
>  	memcpy(priv->cck_tx_power_index_A, efuse->cck_tx_power_index_A,
>  	       sizeof(priv->cck_tx_power_index_A));
>  	memcpy(priv->cck_tx_power_index_B, efuse->cck_tx_power_index_B,
> @@ -2310,7 +2310,7 @@ static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
>  	       sizeof(priv->ht40_1s_tx_power_index_A));
>  	memcpy(priv->ht40_1s_tx_power_index_B, efuse->ht40_1s_tx_power_index_B,
>  	       sizeof(priv->ht40_1s_tx_power_index_B));
> -#if 0
> +
>  	memcpy(priv->ht40_2s_tx_power_index_diff,
>  	       efuse->ht40_2s_tx_power_index_diff,
>  	       sizeof(priv->ht40_2s_tx_power_index_diff));
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index 4b8431d..b223831 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -543,14 +543,26 @@ struct rtl8723bu_efuse {
>  	u8 res12[0x4];
>  };
>  
> +struct rtl8192eu_efuse_tx_power {
> +	u8 cck_base[6];
> +	u8 ht40_base[5];
> +	struct rtl8723au_idx ht20_ofdm_1s_diff;
> +	struct rtl8723au_idx ht40_ht20_2s_diff;
> +	struct rtl8723au_idx ofdm_cck_2s_diff; /* not used */
> +	struct rtl8723au_idx ht40_ht20_3s_diff;
> +	struct rtl8723au_idx ofdm_cck_3s_diff; /* not used */
> +	struct rtl8723au_idx ht40_ht20_4s_diff;
> +	struct rtl8723au_idx ofdm_cck_4s_diff; /* not used */
> +};
> +
>  struct rtl8192eu_efuse {
>  	__le16 rtl_id;
>  	u8 res0[0x0e];
> -	u8 cck_tx_power_index_A[3];	/* 0x10 */
> -	u8 cck_tx_power_index_B[3];
> -	u8 ht40_1s_tx_power_index_A[3];	/* 0x16 */
> -	u8 ht40_1s_tx_power_index_B[3];
> -	u8 res1[0x9c];
> +	struct rtl8192eu_efuse_tx_power tx_power_index_A;	/* 0x10 */
> +	struct rtl8192eu_efuse_tx_power tx_power_index_B;	/* 0x22 */
> +	struct rtl8192eu_efuse_tx_power tx_power_index_C;	/* 0x34 */
> +	struct rtl8192eu_efuse_tx_power tx_power_index_D;	/* 0x46 */
> +	u8 res1[0x60];
>  	u8 channel_plan;		/* 0xb8 */
>  	u8 xtal_k;
>  	u8 thermal_meter;

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

end of thread, other threads:[~2015-11-10 21:57 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-20  6:45 [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jakub Sitnicki
2015-10-20  6:45 ` [RFC 01/16] rtl8xxxu: Treat REG_9346CR as an 8-bit wide register Jakub Sitnicki
2015-10-21  0:29   ` Jes Sorensen
2015-10-23  5:38     ` Jakub Sitnicki
2015-10-20  6:45 ` [RFC 02/16] rtl8xxxu: Use REG_EFUSE_TEST register only on multifunctional devices Jakub Sitnicki
2015-10-21  0:57   ` Jes Sorensen
2015-10-23  5:45     ` Jakub Sitnicki
2015-10-20  6:45 ` [RFC 03/16] rtl8xxxu: Don't check for illegal offset when reading from efuse Jakub Sitnicki
2015-10-21  1:07   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 04/16] rtl8xxxu: Skip disabled efuse words early Jakub Sitnicki
2015-10-21  1:09   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 05/16] rtl8xxxu: Unbreak a user-visible string Jakub Sitnicki
2015-10-21  1:46   ` Jes Sorensen
2015-10-23  5:54     ` Jakub Sitnicki
2015-10-23 15:38       ` Jes Sorensen
2015-10-20  6:45 ` [RFC 06/16] rtl8xxxu: rtl8723au: Introduce a pointer to efuse Jakub Sitnicki
2015-10-21  1:52   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 07/16] rtl8xxxu: rtl8192cu: " Jakub Sitnicki
2015-10-20  6:45 ` [RFC 08/16] rtl8xxxu: Extract TX power fields from struct rtl8xxu_priv Jakub Sitnicki
2015-10-21  1:58   ` Jes Sorensen
2015-10-23 21:16     ` Jakub Sitnicki
2015-10-26 17:40       ` Jes Sorensen
2015-10-20  6:45 ` [RFC 09/16] rtl8xxxu: Rename struct struct rtl8723au_tx_power fields Jakub Sitnicki
2015-10-20  6:45 ` [RFC 10/16] rtl8xxxu: Rename struct rtl8723au_idx Jakub Sitnicki
2015-10-21  2:00   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 11/16] rtl8xxxu: Make efuse content length a parameter Jakub Sitnicki
2015-10-21  2:01   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 12/16] rtl8xxxu: Prepare to have more than one kind of struct *_tx_power Jakub Sitnicki
2015-10-20  6:45 ` [RFC 13/16] rtl8xxxu: Make set_tx_power a chip-type-dependent operation Jakub Sitnicki
2015-10-21  2:07   ` Jes Sorensen
2015-10-23 21:17     ` Jakub Sitnicki
2015-10-20  6:45 ` [RFC 14/16] rtl8xxxu: Introduce a device agnostic constant for efuse map length Jakub Sitnicki
2015-10-21  2:03   ` Jes Sorensen
2015-10-20  6:45 ` [RFC 15/16] rtl8xxxu: rtl8188eu: Add stubbed fileops and chip-specific constants Jakub Sitnicki
2015-10-20  6:45 ` [RFC 16/16] rtl8xxxu: rtl8188eu: Implement parse_efuse() Jakub Sitnicki
2015-10-21  2:15   ` Jes Sorensen
2015-10-23 21:52     ` Jakub Sitnicki
2015-10-26 17:45       ` Jes Sorensen
2015-11-02  8:21         ` [PATCH] rtl8xxxu: rtl8192eu: Map out EFUSE TX power area Jakub Sitnicki
2015-11-10 21:57           ` Jes Sorensen
2015-10-21  0:29 ` [RFC 00/16] rtl8xxxu: eFUSE parsing for RTL8188EU chips Jes Sorensen
2015-10-23  5:24   ` Jakub Sitnicki

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.