All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] staging: vt6655: Replace macro VNSvInPortD with ioread32()
@ 2022-04-27  5:42 Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 1/3] staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD Philipp Hortmann
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-27  5:42 UTC (permalink / raw)
  To: Forest Bond, Greg Kroah-Hartman, linux-staging, linux-kernel

Replace macro VNSvInPortD with ioread32.
Avoid cast of the return value as much as possible.
The name of macro and the arguments use CamelCase which
is not accepted by checkpatch.pl

Tested with vt6655 on mini PCI Module
Transferred this patch over wlan connection of vt6655

Used this code for testing of fuction: CARDbGetCurrentTSF in patch
"staging: vt6655: Replace VNSvInPortD with ioread32":
	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: %llx", *pqwCurrTSF);
	
	low = ioread32(iobase + MAC_REG_TSFCNTR);
	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF temp_ph: %llx",
			 low + ((u64)high << 32));

output:
[  +0.000083] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 116e83
[  +0.000008] vt6655 0000:01:05.0: CARDbGetCurrentTSF temp_ph: 116e83
[  +0.000009] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 753d80
[  +0.000005] vt6655 0000:01:05.0: CARDbGetCurrentTSF temp_ph: 753d80
[  +0.000010] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 753d8f
[  +0.000004] vt6655 0000:01:05.0: CARDbGetCurrentTSF temp_ph: 753d8f

V1 -> V2: Removed patch "staging: vt6655: Replace VNSvInPortW with ioread16"
          as it was already accepted.
          Joint patch "Replace two VNSvInPortD with ioread64_lo_hi" with 
          patch "Replace VNSvInPortD with ioread32" and changed ioread64 to 
          two ioread32 as ioread64 does not work with 32 Bit computers.
          Shorted and simplified patch descriptions.          
V2 -> V3: Added missing version in subject lines
          Added change history in cover letter
          Removed remark in cover letter "This patch series is new.."
          as it is obsolet.
          
Philipp Hortmann (3):
  staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD
  staging: vt6655: Replace MACvReadISR with VNSvInPortD
  staging: vt6655: Replace VNSvInPortD with ioread32

 drivers/staging/vt6655/card.c        |  6 ++++--
 drivers/staging/vt6655/device_main.c |  6 +++---
 drivers/staging/vt6655/mac.h         | 24 +++++++++---------------
 drivers/staging/vt6655/rf.c          |  2 +-
 drivers/staging/vt6655/upc.h         |  3 ---
 5 files changed, 17 insertions(+), 24 deletions(-)

-- 
2.25.1


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

* [PATCH v3 1/3] staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD
  2022-04-27  5:42 [PATCH v3 0/3] staging: vt6655: Replace macro VNSvInPortD with ioread32() Philipp Hortmann
@ 2022-04-27  5:42 ` Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 2/3] staging: vt6655: Replace MACvReadISR " Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32 Philipp Hortmann
  2 siblings, 0 replies; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-27  5:42 UTC (permalink / raw)
  To: Forest Bond, Greg Kroah-Hartman, linux-staging, linux-kernel

Replace macro MACvReadMIBCounter with VNSvInPortD and as it
was the only user, it can now be removed.

Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
---
V1 -> V2: Shorted and simplified patch description
V2 -> V3: Added missing version in subject
---
 drivers/staging/vt6655/device_main.c | 2 +-
 drivers/staging/vt6655/mac.h         | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index 08b955c71b3c..7cceb57a5139 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -1042,7 +1042,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 	spin_lock_irqsave(&priv->lock, flags);
 
 	/* Read low level stats */
-	MACvReadMIBCounter(priv->port_offset, &mib_counter);
+	VNSvInPortD(priv->port_offset + MAC_REG_MIBCNTR, &mib_counter);
 
 	low_stats->dot11RTSSuccessCount += mib_counter & 0xff;
 	low_stats->dot11RTSFailureCount += (mib_counter >> 8) & 0xff;
diff --git a/drivers/staging/vt6655/mac.h b/drivers/staging/vt6655/mac.h
index 4c6739862188..74b45e1f0963 100644
--- a/drivers/staging/vt6655/mac.h
+++ b/drivers/staging/vt6655/mac.h
@@ -684,9 +684,6 @@ do {									\
 #define MACvSelectPage1(iobase)				\
 	VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1)
 
-#define MACvReadMIBCounter(iobase, pdwCounter)			\
-	VNSvInPortD(iobase + MAC_REG_MIBCNTR, pdwCounter)
-
 #define MACvEnableProtectMD(iobase)					\
 do {									\
 	unsigned long dwOrgValue;					\
-- 
2.25.1


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

* [PATCH v3 2/3] staging: vt6655: Replace MACvReadISR with VNSvInPortD
  2022-04-27  5:42 [PATCH v3 0/3] staging: vt6655: Replace macro VNSvInPortD with ioread32() Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 1/3] staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD Philipp Hortmann
@ 2022-04-27  5:42 ` Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32 Philipp Hortmann
  2 siblings, 0 replies; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-27  5:42 UTC (permalink / raw)
  To: Forest Bond, Greg Kroah-Hartman, linux-staging, linux-kernel

Replace macro MACvReadISR with VNSvInPortD and as it was the only
user, it can now be removed.

Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
---
V1 -> V2: Shorted and simplified patch description
V2 -> V3: Added missing version in subject
---
 drivers/staging/vt6655/device_main.c | 4 ++--
 drivers/staging/vt6655/mac.h         | 3 ---
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index 7cceb57a5139..c21787f32252 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -1029,7 +1029,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 	u32 isr;
 	unsigned long flags;
 
-	MACvReadISR(priv->port_offset, &isr);
+	VNSvInPortD(priv->port_offset + MAC_REG_ISR, &isr);
 
 	if (isr == 0)
 		return;
@@ -1116,7 +1116,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 		    ieee80211_queue_stopped(priv->hw, 0))
 			ieee80211_wake_queues(priv->hw);
 
-		MACvReadISR(priv->port_offset, &isr);
+		VNSvInPortD(priv->port_offset + MAC_REG_ISR, &isr);
 
 		MACvReceive0(priv->port_offset);
 		MACvReceive1(priv->port_offset);
diff --git a/drivers/staging/vt6655/mac.h b/drivers/staging/vt6655/mac.h
index 74b45e1f0963..5aaa0de20e67 100644
--- a/drivers/staging/vt6655/mac.h
+++ b/drivers/staging/vt6655/mac.h
@@ -666,9 +666,6 @@ do {									\
 	VNSvOutPortB(iobase + MAC_REG_STICKHW, byOrgValue);		\
 } while (0)
 
-#define MACvReadISR(iobase, pdwValue)				\
-	VNSvInPortD(iobase + MAC_REG_ISR, pdwValue)
-
 #define MACvWriteISR(iobase, dwValue)				\
 	VNSvOutPortD(iobase + MAC_REG_ISR, dwValue)
 
-- 
2.25.1


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

* [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  5:42 [PATCH v3 0/3] staging: vt6655: Replace macro VNSvInPortD with ioread32() Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 1/3] staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD Philipp Hortmann
  2022-04-27  5:42 ` [PATCH v3 2/3] staging: vt6655: Replace MACvReadISR " Philipp Hortmann
@ 2022-04-27  5:42 ` Philipp Hortmann
  2022-04-27  5:55   ` Greg Kroah-Hartman
  2 siblings, 1 reply; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-27  5:42 UTC (permalink / raw)
  To: Forest Bond, Greg Kroah-Hartman, linux-staging, linux-kernel

Replace macro VNSvInPortD with ioread32 and as it was
the only user, it can now be removed.
The name of macro and the arguments use CamelCase which
is not accepted by checkpatch.pl

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
---
V1 -> V2: This patch was 5/7 and is now 4/6
V2 -> V3: Inserted patch that was before in a different way in
          "Rename macros VNSvInPortB,W,D with CamelCase ..."
          This patch was part of 4/6 and is now 3/7
V3 -> V4: Removed casting of the output variable
V4 -> V5: Joint patch "Replace two VNSvInPortD with ioread64_lo_hi"
          with this patch. Changed ioread64 to two ioread32 as
          ioread64 does not work with 32 Bit computers.
          Shorted and simplified patch description.
V5 -> V6: Added missing version in subject
---
 drivers/staging/vt6655/card.c        |  6 ++++--
 drivers/staging/vt6655/device_main.c |  6 +++---
 drivers/staging/vt6655/mac.h         | 18 +++++++++---------
 drivers/staging/vt6655/rf.c          |  2 +-
 drivers/staging/vt6655/upc.h         |  3 ---
 5 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
index 022310af5485..0dd13e475d6b 100644
--- a/drivers/staging/vt6655/card.c
+++ b/drivers/staging/vt6655/card.c
@@ -744,6 +744,7 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
 	void __iomem *iobase = priv->port_offset;
 	unsigned short ww;
 	unsigned char data;
+	u32 low, high;
 
 	MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
 	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
@@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
 	}
 	if (ww == W_MAX_TIMEOUT)
 		return false;
-	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
-	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
+	low = ioread32(iobase + MAC_REG_TSFCNTR);
+	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
+	*pqwCurrTSF = low + ((u64)high << 32);
 
 	return true;
 }
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index c21787f32252..12fd825c23fe 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -1029,7 +1029,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 	u32 isr;
 	unsigned long flags;
 
-	VNSvInPortD(priv->port_offset + MAC_REG_ISR, &isr);
+	isr = ioread32(priv->port_offset + MAC_REG_ISR);
 
 	if (isr == 0)
 		return;
@@ -1042,7 +1042,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 	spin_lock_irqsave(&priv->lock, flags);
 
 	/* Read low level stats */
-	VNSvInPortD(priv->port_offset + MAC_REG_MIBCNTR, &mib_counter);
+	mib_counter = ioread32(priv->port_offset + MAC_REG_MIBCNTR);
 
 	low_stats->dot11RTSSuccessCount += mib_counter & 0xff;
 	low_stats->dot11RTSFailureCount += (mib_counter >> 8) & 0xff;
@@ -1116,7 +1116,7 @@ static void vnt_interrupt_process(struct vnt_private *priv)
 		    ieee80211_queue_stopped(priv->hw, 0))
 			ieee80211_wake_queues(priv->hw);
 
-		VNSvInPortD(priv->port_offset + MAC_REG_ISR, &isr);
+		isr = ioread32(priv->port_offset + MAC_REG_ISR);
 
 		MACvReceive0(priv->port_offset);
 		MACvReceive1(priv->port_offset);
diff --git a/drivers/staging/vt6655/mac.h b/drivers/staging/vt6655/mac.h
index 5aaa0de20e67..5b684194745c 100644
--- a/drivers/staging/vt6655/mac.h
+++ b/drivers/staging/vt6655/mac.h
@@ -618,7 +618,7 @@ do {								\
 #define MACvReceive0(iobase)						\
 do {									\
 	unsigned long dwData;						\
-	VNSvInPortD(iobase + MAC_REG_RXDMACTL0, &dwData);		\
+	dwData = ioread32(iobase + MAC_REG_RXDMACTL0);			\
 	if (dwData & DMACTL_RUN)					\
 		VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, DMACTL_WAKE); \
 	else								\
@@ -628,7 +628,7 @@ do {									\
 #define MACvReceive1(iobase)						\
 do {									\
 	unsigned long dwData;						\
-	VNSvInPortD(iobase + MAC_REG_RXDMACTL1, &dwData);		\
+	dwData = ioread32(iobase + MAC_REG_RXDMACTL1);			\
 	if (dwData & DMACTL_RUN)					\
 		VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, DMACTL_WAKE); \
 	else								\
@@ -638,7 +638,7 @@ do {									\
 #define MACvTransmit0(iobase)						\
 do {									\
 	unsigned long dwData;						\
-	VNSvInPortD(iobase + MAC_REG_TXDMACTL0, &dwData);		\
+	dwData = ioread32(iobase + MAC_REG_TXDMACTL0);			\
 	if (dwData & DMACTL_RUN)					\
 		VNSvOutPortD(iobase + MAC_REG_TXDMACTL0, DMACTL_WAKE); \
 	else								\
@@ -648,7 +648,7 @@ do {									\
 #define MACvTransmitAC0(iobase)					\
 do {									\
 	unsigned long dwData;						\
-	VNSvInPortD(iobase + MAC_REG_AC0DMACTL, &dwData);		\
+	dwData = ioread32(iobase + MAC_REG_AC0DMACTL);			\
 	if (dwData & DMACTL_RUN)					\
 		VNSvOutPortD(iobase + MAC_REG_AC0DMACTL, DMACTL_WAKE); \
 	else								\
@@ -684,7 +684,7 @@ do {									\
 #define MACvEnableProtectMD(iobase)					\
 do {									\
 	unsigned long dwOrgValue;					\
-	VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue);		\
+	dwOrgValue = ioread32(iobase + MAC_REG_ENCFG);			\
 	dwOrgValue = dwOrgValue | ENCFG_PROTECTMD;			\
 	VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue);		\
 } while (0)
@@ -692,7 +692,7 @@ do {									\
 #define MACvDisableProtectMD(iobase)					\
 do {									\
 	unsigned long dwOrgValue;					\
-	VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue);		\
+	dwOrgValue = ioread32(iobase + MAC_REG_ENCFG);			\
 	dwOrgValue = dwOrgValue & ~ENCFG_PROTECTMD;			\
 	VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue);		\
 } while (0)
@@ -700,7 +700,7 @@ do {									\
 #define MACvEnableBarkerPreambleMd(iobase)				\
 do {									\
 	unsigned long dwOrgValue;					\
-	VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue);		\
+	dwOrgValue = ioread32(iobase + MAC_REG_ENCFG);			\
 	dwOrgValue = dwOrgValue | ENCFG_BARKERPREAM;			\
 	VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue);		\
 } while (0)
@@ -708,7 +708,7 @@ do {									\
 #define MACvDisableBarkerPreambleMd(iobase)				\
 do {									\
 	unsigned long dwOrgValue;					\
-	VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue);		\
+	dwOrgValue = ioread32(iobase + MAC_REG_ENCFG);			\
 	dwOrgValue = dwOrgValue & ~ENCFG_BARKERPREAM;			\
 	VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue);		\
 } while (0)
@@ -716,7 +716,7 @@ do {									\
 #define MACvSetBBType(iobase, byTyp)					\
 do {									\
 	unsigned long dwOrgValue;					\
-	VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue);		\
+	dwOrgValue = ioread32(iobase + MAC_REG_ENCFG);			\
 	dwOrgValue = dwOrgValue & ~ENCFG_BBTYPE_MASK;			\
 	dwOrgValue = dwOrgValue | (unsigned long)byTyp;			\
 	VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue);		\
diff --git a/drivers/staging/vt6655/rf.c b/drivers/staging/vt6655/rf.c
index 4498c9d400f2..036f48572334 100644
--- a/drivers/staging/vt6655/rf.c
+++ b/drivers/staging/vt6655/rf.c
@@ -175,7 +175,7 @@ bool IFRFbWriteEmbedded(struct vnt_private *priv, unsigned long dwData)
 
 	/* W_MAX_TIMEOUT is the timeout period */
 	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
-		VNSvInPortD(iobase + MAC_REG_IFREGCTL, &dwValue);
+		dwValue = ioread32(iobase + MAC_REG_IFREGCTL);
 		if (dwValue & IFREGCTL_DONE)
 			break;
 	}
diff --git a/drivers/staging/vt6655/upc.h b/drivers/staging/vt6655/upc.h
index 4d09cf18ebe0..a5b74aaadcd3 100644
--- a/drivers/staging/vt6655/upc.h
+++ b/drivers/staging/vt6655/upc.h
@@ -20,9 +20,6 @@
 
 /* For memory mapped IO */
 
-#define VNSvInPortD(dwIOAddress, pdwData) \
-	(*(pdwData) = ioread32(dwIOAddress))
-
 #define VNSvOutPortB(dwIOAddress, byData) \
 	iowrite8((u8)(byData), dwIOAddress)
 
-- 
2.25.1


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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  5:42 ` [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32 Philipp Hortmann
@ 2022-04-27  5:55   ` Greg Kroah-Hartman
  2022-04-27  8:01     ` David Laight
  2022-04-29 15:18     ` Philipp Hortmann
  0 siblings, 2 replies; 14+ messages in thread
From: Greg Kroah-Hartman @ 2022-04-27  5:55 UTC (permalink / raw)
  To: Philipp Hortmann; +Cc: Forest Bond, linux-staging, linux-kernel

On Wed, Apr 27, 2022 at 07:42:23AM +0200, Philipp Hortmann wrote:
> Replace macro VNSvInPortD with ioread32 and as it was
> the only user, it can now be removed.
> The name of macro and the arguments use CamelCase which
> is not accepted by checkpatch.pl
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
> ---
> V1 -> V2: This patch was 5/7 and is now 4/6
> V2 -> V3: Inserted patch that was before in a different way in
>           "Rename macros VNSvInPortB,W,D with CamelCase ..."
>           This patch was part of 4/6 and is now 3/7
> V3 -> V4: Removed casting of the output variable
> V4 -> V5: Joint patch "Replace two VNSvInPortD with ioread64_lo_hi"
>           with this patch. Changed ioread64 to two ioread32 as
>           ioread64 does not work with 32 Bit computers.
>           Shorted and simplified patch description.
> V5 -> V6: Added missing version in subject
> ---
>  drivers/staging/vt6655/card.c        |  6 ++++--
>  drivers/staging/vt6655/device_main.c |  6 +++---
>  drivers/staging/vt6655/mac.h         | 18 +++++++++---------
>  drivers/staging/vt6655/rf.c          |  2 +-
>  drivers/staging/vt6655/upc.h         |  3 ---
>  5 files changed, 17 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
> index 022310af5485..0dd13e475d6b 100644
> --- a/drivers/staging/vt6655/card.c
> +++ b/drivers/staging/vt6655/card.c
> @@ -744,6 +744,7 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
>  	void __iomem *iobase = priv->port_offset;
>  	unsigned short ww;
>  	unsigned char data;
> +	u32 low, high;
>  
>  	MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
>  	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
> @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
>  	}
>  	if (ww == W_MAX_TIMEOUT)
>  		return false;
> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
> +	low = ioread32(iobase + MAC_REG_TSFCNTR);
> +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> +	*pqwCurrTSF = low + ((u64)high << 32);

Are you _sure_ this is doing the same thing?

Adding 1 to a u64 pointer increments it by a full u64.  So I guess the
cast to u32 * moves it only by a u32?  Hopefully?  That's messy.

Why not keep the current mess and do:
	pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
	((u32 *)pqwCurTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);

Or does that not compile?  Ick, how about:
	u32 *temp = (u32 *)pqwCurTSF;

	temp = ioread32(iobase + MAC_REG_TSFCNTR);
	temp++;
	temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);
As that duplicates the current code a bit better.

I don't know, it's like polishing dirt, in the end, it's still dirt...

How about looking at the caller of this to see what it expects to do
with this information?  Unwind the mess from there?

thanks,

greg k-h

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

* RE: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  5:55   ` Greg Kroah-Hartman
@ 2022-04-27  8:01     ` David Laight
  2022-04-27  8:48       ` 'Greg Kroah-Hartman'
  2022-04-27 19:10       ` Philipp Hortmann
  2022-04-29 15:18     ` Philipp Hortmann
  1 sibling, 2 replies; 14+ messages in thread
From: David Laight @ 2022-04-27  8:01 UTC (permalink / raw)
  To: 'Greg Kroah-Hartman', Philipp Hortmann
  Cc: Forest Bond, linux-staging, linux-kernel

From: Greg Kroah-Hartman
> Sent: 27 April 2022 06:55
> 
> On Wed, Apr 27, 2022 at 07:42:23AM +0200, Philipp Hortmann wrote:
> > Replace macro VNSvInPortD with ioread32 and as it was
> > the only user, it can now be removed.
> > The name of macro and the arguments use CamelCase which
> > is not accepted by checkpatch.pl
> >
> > Reported-by: kernel test robot <lkp@intel.com>
> > Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
> > ---
> > V1 -> V2: This patch was 5/7 and is now 4/6
> > V2 -> V3: Inserted patch that was before in a different way in
> >           "Rename macros VNSvInPortB,W,D with CamelCase ..."
> >           This patch was part of 4/6 and is now 3/7
> > V3 -> V4: Removed casting of the output variable
> > V4 -> V5: Joint patch "Replace two VNSvInPortD with ioread64_lo_hi"
> >           with this patch. Changed ioread64 to two ioread32 as
> >           ioread64 does not work with 32 Bit computers.
> >           Shorted and simplified patch description.
> > V5 -> V6: Added missing version in subject
> > ---
> >  drivers/staging/vt6655/card.c        |  6 ++++--
> >  drivers/staging/vt6655/device_main.c |  6 +++---
> >  drivers/staging/vt6655/mac.h         | 18 +++++++++---------
> >  drivers/staging/vt6655/rf.c          |  2 +-
> >  drivers/staging/vt6655/upc.h         |  3 ---
> >  5 files changed, 17 insertions(+), 18 deletions(-)
> >
> > diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
> > index 022310af5485..0dd13e475d6b 100644
> > --- a/drivers/staging/vt6655/card.c
> > +++ b/drivers/staging/vt6655/card.c
> > @@ -744,6 +744,7 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> >  	void __iomem *iobase = priv->port_offset;
> >  	unsigned short ww;
> >  	unsigned char data;
> > +	u32 low, high;
> >
> >  	MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
> >  	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
> > @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> >  	}
> >  	if (ww == W_MAX_TIMEOUT)
> >  		return false;
> > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
> > +	low = ioread32(iobase + MAC_REG_TSFCNTR);
> > +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> > +	*pqwCurrTSF = low + ((u64)high << 32);
> 
> Are you _sure_ this is doing the same thing?
> 
> Adding 1 to a u64 pointer increments it by a full u64.  So I guess the
> cast to u32 * moves it only by a u32?  Hopefully?  That's messy.

The new code is mostly better.
But is different on BE systems - who knows what is actually needed.
Depends what is being copied.

Actually I suspect that 'iobase' should be an __iomem structure
pointer, pqwCurrTSF a point of the same type and MAC_REG_xxxx
structure members.

Then the code should be using readl() not ioread32().
I very much doubt that 'iobase' is in PCI IO space.

	David

> 
> Why not keep the current mess and do:
> 	pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
> 	((u32 *)pqwCurTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> 
> Or does that not compile?  Ick, how about:
> 	u32 *temp = (u32 *)pqwCurTSF;
> 
> 	temp = ioread32(iobase + MAC_REG_TSFCNTR);
> 	temp++;
> 	temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> As that duplicates the current code a bit better.
> 
> I don't know, it's like polishing dirt, in the end, it's still dirt...
> 
> How about looking at the caller of this to see what it expects to do
> with this information?  Unwind the mess from there?
> 
> thanks,
> 
> greg k-h

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  8:01     ` David Laight
@ 2022-04-27  8:48       ` 'Greg Kroah-Hartman'
  2022-04-27 19:10       ` Philipp Hortmann
  1 sibling, 0 replies; 14+ messages in thread
From: 'Greg Kroah-Hartman' @ 2022-04-27  8:48 UTC (permalink / raw)
  To: David Laight; +Cc: Philipp Hortmann, Forest Bond, linux-staging, linux-kernel

On Wed, Apr 27, 2022 at 08:01:46AM +0000, David Laight wrote:
> From: Greg Kroah-Hartman
> > Sent: 27 April 2022 06:55
> > 
> > On Wed, Apr 27, 2022 at 07:42:23AM +0200, Philipp Hortmann wrote:
> > > Replace macro VNSvInPortD with ioread32 and as it was
> > > the only user, it can now be removed.
> > > The name of macro and the arguments use CamelCase which
> > > is not accepted by checkpatch.pl
> > >
> > > Reported-by: kernel test robot <lkp@intel.com>
> > > Signed-off-by: Philipp Hortmann <philipp.g.hortmann@gmail.com>
> > > ---
> > > V1 -> V2: This patch was 5/7 and is now 4/6
> > > V2 -> V3: Inserted patch that was before in a different way in
> > >           "Rename macros VNSvInPortB,W,D with CamelCase ..."
> > >           This patch was part of 4/6 and is now 3/7
> > > V3 -> V4: Removed casting of the output variable
> > > V4 -> V5: Joint patch "Replace two VNSvInPortD with ioread64_lo_hi"
> > >           with this patch. Changed ioread64 to two ioread32 as
> > >           ioread64 does not work with 32 Bit computers.
> > >           Shorted and simplified patch description.
> > > V5 -> V6: Added missing version in subject
> > > ---
> > >  drivers/staging/vt6655/card.c        |  6 ++++--
> > >  drivers/staging/vt6655/device_main.c |  6 +++---
> > >  drivers/staging/vt6655/mac.h         | 18 +++++++++---------
> > >  drivers/staging/vt6655/rf.c          |  2 +-
> > >  drivers/staging/vt6655/upc.h         |  3 ---
> > >  5 files changed, 17 insertions(+), 18 deletions(-)
> > >
> > > diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
> > > index 022310af5485..0dd13e475d6b 100644
> > > --- a/drivers/staging/vt6655/card.c
> > > +++ b/drivers/staging/vt6655/card.c
> > > @@ -744,6 +744,7 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> > >  	void __iomem *iobase = priv->port_offset;
> > >  	unsigned short ww;
> > >  	unsigned char data;
> > > +	u32 low, high;
> > >
> > >  	MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
> > >  	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
> > > @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> > >  	}
> > >  	if (ww == W_MAX_TIMEOUT)
> > >  		return false;
> > > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> > > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
> > > +	low = ioread32(iobase + MAC_REG_TSFCNTR);
> > > +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> > > +	*pqwCurrTSF = low + ((u64)high << 32);
> > 
> > Are you _sure_ this is doing the same thing?
> > 
> > Adding 1 to a u64 pointer increments it by a full u64.  So I guess the
> > cast to u32 * moves it only by a u32?  Hopefully?  That's messy.
> 
> The new code is mostly better.
> But is different on BE systems - who knows what is actually needed.

Yeah, the endian issues here are totally ignored, my proposal would
ensure it stays the same.  The change here breaks this on big endian
systems.  So I'll drop this patch for now and just apply the first 2.

> Depends what is being copied.
> 
> Actually I suspect that 'iobase' should be an __iomem structure
> pointer, pqwCurrTSF a point of the same type and MAC_REG_xxxx
> structure members.
> 
> Then the code should be using readl() not ioread32().
> I very much doubt that 'iobase' is in PCI IO space.

Who knows, but that should be unwound eventually...

thanks,

greg k-h

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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  8:01     ` David Laight
  2022-04-27  8:48       ` 'Greg Kroah-Hartman'
@ 2022-04-27 19:10       ` Philipp Hortmann
  2022-04-27 21:59         ` David Laight
  1 sibling, 1 reply; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-27 19:10 UTC (permalink / raw)
  To: David Laight
  Cc: Forest Bond, linux-staging, linux-kernel, 'Greg Kroah-Hartman'

On 4/27/22 10:01, David Laight wrote:
> Actually I suspect that 'iobase' should be an __iomem structure
> pointer, pqwCurrTSF a point of the same type and MAC_REG_xxxx
> structure members.
> 
> Then the code should be using readl() not ioread32().
> I very much doubt that 'iobase' is in PCI IO space.

Hi David,

here some infos and questions:

kernel@matrix-ESPRIMO-P710:~/Documents/git/kernels/staging$ sudo lspci 
-s 01:05.0 -vvv
01:05.0 Network controller: VIA Technologies, Inc. VT6655 WiFi Adapter, 
802.11a/b/g
	Subsystem: VIA Technologies, Inc. VT6655 WiFi Adapter, 802.11a/b/g
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping+ SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 32 (8000ns max), Cache Line Size: 64 bytes
	Interrupt: pin A routed to IRQ 19
	Region 0: Memory at f7c00000 (32-bit, non-prefetchable) [size=256]
	Region 1: I/O ports at e000 [size=256]
	Capabilities: [50] Power Management version 2
		Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1+,D2+,D3hot+,D3cold-)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Kernel driver in use: vt6655
	Kernel modules: vt6655_stage


---- In file device_main.c line 1699
	priv->memaddr = pci_resource_start(pcid, 0);
	priv->ioaddr = pci_resource_start(pcid, 1);
	priv->port_offset = ioremap(priv->memaddr & PCI_BASE_ADDRESS_MEM_MASK, 
256);
	dev_info(&pcid->dev, "vt6655_probe priv->memaddr: %x priv->ioaddr: %x", 
priv->memaddr, priv->ioaddr);

----- Output:
[  +0.000018] vt6655 0000:01:05.0: vt6655_probe priv->memaddr: f7c00000 
priv->ioaddr: e000


So port_offset is derived from memaddr.


----- In file card.c line 742
bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
{
	void __iomem *iobase = priv->port_offset;
...
	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);

Please tell me if you need further infos to see if it is PCI IO space.
I think it is memory-mapped.

So is ioread32 wrong, right or can it be used?

This article gives more info:
https://www.kernel.org/doc/html/latest/driver-api/device-io.html

Thanks for your support.

Bye Philipp










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

* RE: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27 19:10       ` Philipp Hortmann
@ 2022-04-27 21:59         ` David Laight
  0 siblings, 0 replies; 14+ messages in thread
From: David Laight @ 2022-04-27 21:59 UTC (permalink / raw)
  To: 'Philipp Hortmann'
  Cc: Forest Bond, linux-staging, linux-kernel, 'Greg Kroah-Hartman'

From: Philipp Hortmann
> Sent: 27 April 2022 20:10
> 
> On 4/27/22 10:01, David Laight wrote:
> > Actually I suspect that 'iobase' should be an __iomem structure
> > pointer, pqwCurrTSF a point of the same type and MAC_REG_xxxx
> > structure members.
> >
> > Then the code should be using readl() not ioread32().
> > I very much doubt that 'iobase' is in PCI IO space.
> 
> Hi David,
> 
> here some infos and questions:
> 
> $ sudo lspci -s 01:05.0 -vvv
> 01:05.0 Network controller: VIA Technologies, Inc. VT6655 WiFi Adapter, 802.11a/b/g
> 	Subsystem: VIA Technologies, Inc. VT6655 WiFi Adapter, 802.11a/b/g
...
> 	Region 0: Memory at f7c00000 (32-bit, non-prefetchable) [size=256]
> 	Region 1: I/O ports at e000 [size=256]
...
> ---- In file device_main.c line 1699
> 	priv->memaddr = pci_resource_start(pcid, 0);
> 	priv->ioaddr = pci_resource_start(pcid, 1);
> 	priv->port_offset = ioremap(priv->memaddr & PCI_BASE_ADDRESS_MEM_MASK, 256);

WTF is that mask?
The driver code I've got just uses pci_iomap(pci_dev, bar_number, length);
It then uses pci_iounmap(pci_dev, vaddr) to free it.

> 	dev_info(&pcid->dev, "vt6655_probe priv->memaddr: %x priv->ioaddr: %x",
> priv->memaddr, priv->ioaddr);
> 
> ----- Output:
> [  +0.000018] vt6655 0000:01:05.0: vt6655_probe priv->memaddr: f7c00000
> priv->ioaddr: e000
> 
> 
> So port_offset is derived from memaddr.
> 
> 
> ----- In file card.c line 742
> bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> {
> 	void __iomem *iobase = priv->port_offset;
> ...
> 	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> 
> Please tell me if you need further infos to see if it is PCI IO space.
> I think it is memory-mapped.

BAR 0 is memory, BAR 1 I/O, both almost certainly refer to the
same physical device registers.
Basically PCI(e) I/O space is (mostly) deprecated.
It (sort of) exists so that PCI hardware could replace very old
(eg ISA) hardware without requiring driver changes.

> So is ioread32 wrong, right or can it be used?

(Assuming x86)
ioread32() has to contain a test to see whether the address
is an 'io address' or a 'memory address'.
For the former an 'inw' instruction is executed for the latter
a normal memory access instruction.
OTOH readl() is just a memory access (with compiler barriers)
and is inlined into the driver object.

So if you used priv->ioaddr you'd have to use ioread32().
Since you are using the memory space addresses from BAR 0
you can use ioread32() but it is more efficient to use readl().

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-27  5:55   ` Greg Kroah-Hartman
  2022-04-27  8:01     ` David Laight
@ 2022-04-29 15:18     ` Philipp Hortmann
  2022-04-29 15:25       ` Greg Kroah-Hartman
  1 sibling, 1 reply; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-29 15:18 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Forest Bond, linux-staging, linux-kernel

On 4/27/22 07:55, Greg Kroah-Hartman wrote:
>> MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
>>   	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
>> @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
>>   	}
>>   	if (ww == W_MAX_TIMEOUT)
>>   		return false;
>> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
>> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
>> +	low = ioread32(iobase + MAC_REG_TSFCNTR);
>> +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
>> +	*pqwCurrTSF = low + ((u64)high << 32);
> Are you_sure_  this is doing the same thing?
> 

To compare I used the following code:
VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: %llx", 
*pqwCurrTSF);
low = ioread32(iobase + MAC_REG_TSFCNTR);
high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF low/high: %llx", low + 
((u64)high << 32));

Output:
vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 1155ba
vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    1155ba
vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd7c
vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd7c
vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd8a
vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd8a

So no different results for numbers larger than 32 Bit.

The pqwCurrTSF is a microsecond counter running in the WLAN Router:
At a later Measurement I got the following values:
269 seconds later: 0x3 6d89 fd91 -> 269.30 seconds
15 minutes later: 0x3 6d89 fd91 -> 15.54 minutes
8:38 hours later: 0xa 9787 ad91 -> 8.62 hours

So both methods work on a AMD64 processor.

> Adding 1 to a u64 pointer increments it by a full u64.  So I guess the
> cast to u32 * moves it only by a u32?  Hopefully?  That's messy.

That is the reason why I wanted to change this.

> Why not keep the current mess and do:
> 	pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
> 	((u32 *)pqwCurTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> Or does that not compile?  

drivers/staging/vt6655/card.c:760:13: warning: assignment to ‘u64 *’ 
{aka ‘long long unsigned int *’} from ‘unsigned int’ makes pointer from 
integer without a cast [-Wint-conversion]
   760 |  pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
       |             ^
drivers/staging/vt6655/card.c:761:26: error: lvalue required as left 
operand of assignment
   761 |  ((u32 *)pqwCurrTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);
       |                          ^

This compiles:
	*(u32 *)pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
	*((u32 *)pqwCurrTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);

Log:
vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 178f41d90
vt6655 0000:01:05.0: CARDbGetCurrentTSF with ioread: 178f41d90

Ick, how about:
> 	u32 *temp = (u32 *)pqwCurTSF;
> 
> 	temp = ioread32(iobase + MAC_REG_TSFCNTR);
> 	temp++;
> 	temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);

This is working:
	u32 *temp = (u32 *)pqwCurrTSF;

	*temp = ioread32(iobase + MAC_REG_TSFCNTR);
	temp++;
	*temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);

> As that duplicates the current code a bit better.
> 
> I don't know, it's like polishing dirt, in the end, it's still dirt...
> 
> How about looking at the caller of this to see what it expects to do
> with this information?  Unwind the mess from there?
>

I will propose something for that.

> thanks,
> 
> greg k-h

Thanks

Bye Philipp

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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-29 15:18     ` Philipp Hortmann
@ 2022-04-29 15:25       ` Greg Kroah-Hartman
  2022-04-29 15:32         ` Philipp Hortmann
  2022-04-29 21:04         ` Philipp Hortmann
  0 siblings, 2 replies; 14+ messages in thread
From: Greg Kroah-Hartman @ 2022-04-29 15:25 UTC (permalink / raw)
  To: Philipp Hortmann; +Cc: Forest Bond, linux-staging, linux-kernel

On Fri, Apr 29, 2022 at 05:18:28PM +0200, Philipp Hortmann wrote:
> On 4/27/22 07:55, Greg Kroah-Hartman wrote:
> > > MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
> > >   	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
> > > @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
> > >   	}
> > >   	if (ww == W_MAX_TIMEOUT)
> > >   		return false;
> > > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> > > -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
> > > +	low = ioread32(iobase + MAC_REG_TSFCNTR);
> > > +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> > > +	*pqwCurrTSF = low + ((u64)high << 32);
> > Are you_sure_  this is doing the same thing?
> > 
> 
> To compare I used the following code:
> VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
> VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
> dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: %llx",
> *pqwCurrTSF);
> low = ioread32(iobase + MAC_REG_TSFCNTR);
> high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF low/high: %llx", low +
> ((u64)high << 32));
> 
> Output:
> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 1155ba
> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    1155ba
> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd7c
> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd7c
> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd8a
> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd8a
> 
> So no different results for numbers larger than 32 Bit.

And for a big endian system?  Do you get the same result?

> The pqwCurrTSF is a microsecond counter running in the WLAN Router:
> At a later Measurement I got the following values:
> 269 seconds later: 0x3 6d89 fd91 -> 269.30 seconds
> 15 minutes later: 0x3 6d89 fd91 -> 15.54 minutes
> 8:38 hours later: 0xa 9787 ad91 -> 8.62 hours
> 
> So both methods work on a AMD64 processor.
> 
> > Adding 1 to a u64 pointer increments it by a full u64.  So I guess the
> > cast to u32 * moves it only by a u32?  Hopefully?  That's messy.
> 
> That is the reason why I wanted to change this.
> 
> > Why not keep the current mess and do:
> > 	pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
> > 	((u32 *)pqwCurTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> > Or does that not compile?
> 
> drivers/staging/vt6655/card.c:760:13: warning: assignment to ‘u64 *’ {aka
> ‘long long unsigned int *’} from ‘unsigned int’ makes pointer from integer
> without a cast [-Wint-conversion]
>   760 |  pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
>       |             ^
> drivers/staging/vt6655/card.c:761:26: error: lvalue required as left operand
> of assignment
>   761 |  ((u32 *)pqwCurrTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);
>       |                          ^
> 
> This compiles:
> 	*(u32 *)pqwCurrTSF = ioread32(iobase + MAC_REG_TSFCNTR);
> 	*((u32 *)pqwCurrTSF + 1) = ioread32(iobase + MAC_REG_TSFCNTR + 4);

Heh, I just guessed :)

> Log:
> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 178f41d90
> vt6655 0000:01:05.0: CARDbGetCurrentTSF with ioread: 178f41d90
> 
> Ick, how about:
> > 	u32 *temp = (u32 *)pqwCurTSF;
> > 
> > 	temp = ioread32(iobase + MAC_REG_TSFCNTR);
> > 	temp++;
> > 	temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);
> 
> This is working:
> 	u32 *temp = (u32 *)pqwCurrTSF;
> 
> 	*temp = ioread32(iobase + MAC_REG_TSFCNTR);
> 	temp++;
> 	*temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);

Nice!

thanks for testing,

greg k-h

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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-29 15:25       ` Greg Kroah-Hartman
@ 2022-04-29 15:32         ` Philipp Hortmann
  2022-04-29 15:45           ` Greg Kroah-Hartman
  2022-04-29 21:04         ` Philipp Hortmann
  1 sibling, 1 reply; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-29 15:32 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Forest Bond, linux-staging, linux-kernel

On 4/29/22 17:25, Greg Kroah-Hartman wrote:
> And for a big endian system?  Do you get the same result?

Just looking if I can buy one.

Can you propose a low cost big endian system with PCI bus?

Thanks for your support.

Bye Philipp



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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-29 15:32         ` Philipp Hortmann
@ 2022-04-29 15:45           ` Greg Kroah-Hartman
  0 siblings, 0 replies; 14+ messages in thread
From: Greg Kroah-Hartman @ 2022-04-29 15:45 UTC (permalink / raw)
  To: Philipp Hortmann; +Cc: Forest Bond, linux-staging, linux-kernel

On Fri, Apr 29, 2022 at 05:32:05PM +0200, Philipp Hortmann wrote:
> On 4/29/22 17:25, Greg Kroah-Hartman wrote:
> > And for a big endian system?  Do you get the same result?
> 
> Just looking if I can buy one.

Ick, no, don't do that.

> Can you propose a low cost big endian system with PCI bus?

Try testing the code out on something like https://godbolt.org/ maybe?

I think there might be a qemu big endian target as well but I can't
remember it's been a long time.  Don't go buy an obsolete box just for
this one old staging driver :)

thanks,

greg k-h

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

* Re: [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32
  2022-04-29 15:25       ` Greg Kroah-Hartman
  2022-04-29 15:32         ` Philipp Hortmann
@ 2022-04-29 21:04         ` Philipp Hortmann
  1 sibling, 0 replies; 14+ messages in thread
From: Philipp Hortmann @ 2022-04-29 21:04 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Forest Bond, linux-staging, linux-kernel, David Laight

On 4/29/22 17:25, Greg Kroah-Hartman wrote:
> On Fri, Apr 29, 2022 at 05:18:28PM +0200, Philipp Hortmann wrote:
>> On 4/27/22 07:55, Greg Kroah-Hartman wrote:
>>>> MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
>>>>    	for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
>>>> @@ -753,8 +754,9 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF)
>>>>    	}
>>>>    	if (ww == W_MAX_TIMEOUT)
>>>>    		return false;
>>>> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
>>>> -	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
>>>> +	low = ioread32(iobase + MAC_REG_TSFCNTR);
>>>> +	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
>>>> +	*pqwCurrTSF = low + ((u64)high << 32);
>>> Are you_sure_  this is doing the same thing?
>>>
>> To compare I used the following code:
>> VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
>> VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
>> dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: %llx",
>> *pqwCurrTSF);
>> low = ioread32(iobase + MAC_REG_TSFCNTR);
>> high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
>> dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF low/high: %llx", low +
>> ((u64)high << 32));
>>
>> Output:
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 1155ba
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    1155ba
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd7c
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd7c
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 35d7cbd8a
>> vt6655 0000:01:05.0: CARDbGetCurrentTSF low/high:    35d7cbd8a
>>
>> So no different results for numbers larger than 32 Bit.
> And for a big endian system?  Do you get the same result?
> 

Using ioread32be to simulate output of the big endian computer.

Code:
	u32 *temp = (u32 *)pqwCurrTSF;	
	
	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: 
0x%016llx", *pqwCurrTSF);

	temp++;
	*temp = ioread32be(iobase + MAC_REG_TSFCNTR);
	temp--;
	*temp = ioread32be(iobase + MAC_REG_TSFCNTR + 4);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF big-endian: 
0x%016llx", *pqwCurrTSF);

	*temp = ioread32(iobase + MAC_REG_TSFCNTR);
	temp++;
	*temp = ioread32(iobase + MAC_REG_TSFCNTR + 4);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF little endian: 
0x%016llx", *pqwCurrTSF);

Output:
[21250.521826] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 
0x00 00 00 05 f8 55 1d 9b
[21250.521831] vt6655 0000:01:05.0: CARDbGetCurrentTSF big-endian: 
0x9b 1d 55 f8 05 00 00 00
[21250.521835] vt6655 0000:01:05.0: CARDbGetCurrentTSF little endian: 
0x00 00 00 05 f8 55 1d 9b

Code 2:
	u32 high, low;
	
	VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF);
	VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF *pqwCurrTSF: 
0x%016llx", *pqwCurrTSF);

	low = ioread32be(iobase + MAC_REG_TSFCNTR);
	high = ioread32be(iobase + MAC_REG_TSFCNTR + 4);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF big-endian: 
0x%016llx", high + ((u64)low << 32));

	low = ioread32(iobase + MAC_REG_TSFCNTR);
	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);
	dev_info(&priv->pcid->dev, "CARDbGetCurrentTSF little endian: 
0x%016llx", low + ((u64)high << 32));

Output 2:
[21996.659694] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 
0x00 00 00 06 24 cd 8d 91
[21996.659698] vt6655 0000:01:05.0: CARDbGetCurrentTSF big-endian: 
0x91 8d cd 24 06 00 00 00
[21996.659701] vt6655 0000:01:05.0: CARDbGetCurrentTSF little endian: 
0x00 00 00 06 24 cd 8d 91

[22453.448296] vt6655 0000:01:05.0: CARDbGetCurrentTSF *pqwCurrTSF: 
0x00 00 00 06 40 07 dd a3
[22453.448300] vt6655 0000:01:05.0: CARDbGetCurrentTSF big-endian: 
0xa3 dd 07 40 06 00 00 00
[22453.448304] vt6655 0000:01:05.0: CARDbGetCurrentTSF little endian: 
0x00 00 00 06 40 07 dd a3

I am assuming that in case the big endian computer is used the ioread32 
will be automatically converted to ioread32be. So I have only to care 
about the u32 to be exchanged. That is easier with the second example.

Code:
	low = ioread32(iobase + MAC_REG_TSFCNTR);
	high = ioread32(iobase + MAC_REG_TSFCNTR + 4);

#ifdef __BIG_ENDIAN
	*pqwCurrTSF = high + ((u64)low << 32);
#else
	*pqwCurrTSF = low + ((u64)high << 32);
#endif

Comments are welcome.

This is the article that helped me a lot:
https://en.wikipedia.org/wiki/Endianness#Bit_endianness
Especially the "Endian example" picture

Thanks,
Bye Philipp

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

end of thread, other threads:[~2022-04-29 21:04 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-27  5:42 [PATCH v3 0/3] staging: vt6655: Replace macro VNSvInPortD with ioread32() Philipp Hortmann
2022-04-27  5:42 ` [PATCH v3 1/3] staging: vt6655: Replace MACvReadMIBCounter with VNSvInPortD Philipp Hortmann
2022-04-27  5:42 ` [PATCH v3 2/3] staging: vt6655: Replace MACvReadISR " Philipp Hortmann
2022-04-27  5:42 ` [PATCH v3 3/3] staging: vt6655: Replace VNSvInPortD with ioread32 Philipp Hortmann
2022-04-27  5:55   ` Greg Kroah-Hartman
2022-04-27  8:01     ` David Laight
2022-04-27  8:48       ` 'Greg Kroah-Hartman'
2022-04-27 19:10       ` Philipp Hortmann
2022-04-27 21:59         ` David Laight
2022-04-29 15:18     ` Philipp Hortmann
2022-04-29 15:25       ` Greg Kroah-Hartman
2022-04-29 15:32         ` Philipp Hortmann
2022-04-29 15:45           ` Greg Kroah-Hartman
2022-04-29 21:04         ` Philipp Hortmann

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.