Skip to contentSkip to conversation

AX88180: use standard I/O accessors

PATCH Superseded Mike Frysinger 2 participants 5 messages May 11, 2010 – Jun 21, 2010 Network drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 AX88180: use standard I/O accessors

The current dm9000x driver accesses its memory mapped registers directly instead of using the standard I/O accessors. This can cause problems on Blackfin systems as the accesses can get out of order. So convert the direct volatile dereferences to use the normal in/out macros.

---
 drivers/net/ax88180.h |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)
drivers/net/ax88180.h +8 -7
index 9a324bd..7d75eb8 100644
@@ -19,6 +19,7 @@
 #ifndef _AX88180_H_
 #define _AX88180_H_
 
+#include <asm/io.h>
 #include <asm/types.h>
 #include <config.h>
 
@@ -354,7 +355,7 @@ struct ax88180_private {
 
 static inline unsigned short INW (struct eth_device *dev, unsigned long addr)
 {
-	return le16_to_cpu (*(volatile unsigned short *) (addr + dev->iobase));
+	return le16_to_cpu(inw(addr + dev->iobase));
 }
 
 /*
@@ -363,32 +364,32 @@ static inline unsigned short INW (struct eth_device *dev, unsigned long addr)
 #if defined (CONFIG_DRIVER_AX88180_16BIT)
 static inline void OUTW (struct eth_device *dev, unsigned short command, unsigned long addr)
 {
-	*(volatile unsigned short *) ((addr + dev->iobase)) = cpu_to_le16 (command);
+	outw(cpu_to_le16(command), addr + dev->iobase);
 }
 
 static inline unsigned short READ_RXBUF (struct eth_device *dev)
 {
-	return le16_to_cpu (*(volatile unsigned short *) (RXBUFFER_START + dev->iobase));
+	return le16_to_cpu(inw(RXBUFFER_START + dev->iobase));
 }
 
 static inline void WRITE_TXBUF (struct eth_device *dev, unsigned short data)
 {
-	*(volatile unsigned short *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le16 (data);
+	outw(cpu_to_le16(data), dev->iobase + TXBUFFER_START);
 }
 #else
 static inline void OUTW (struct eth_device *dev, unsigned short command, unsigned long addr)
 {
-	*(volatile unsigned long *) ((addr + dev->iobase)) = cpu_to_le32 (command);
+	outl(cpu_to_le32(command), addr + dev->iobase);
 }
 
 static inline unsigned long READ_RXBUF (struct eth_device *dev)
 {
-	return le32_to_cpu (*(volatile unsigned long *) (RXBUFFER_START + dev->iobase));
+	return le32_to_cpu(inl(RXBUFFER_START + dev->iobase));
 }
 
 static inline void WRITE_TXBUF (struct eth_device *dev, unsigned long data)
 {
-	*(volatile unsigned long *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le32 (data);
+	outl(cpu_to_le32(data), dev->iobase + TXBUFFER_START);
 }
 #endif
 
Signature · 1 line
1.7.1
#1 lore raw

PATCH v2 1/1 AX88180: use standard I/O accessors

The current dm9000x driver accesses its memory mapped registers directly instead of using the standard I/O accessors. This can cause problems on Blackfin systems as the accesses can get out of order. So convert the direct volatile dereferences to use the normal in/out macros.

---
v2
- use read/write rather than in/out per recent discussions (see dm9000)

 drivers/net/ax88180.h |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)
drivers/net/ax88180.h +8 -7
index 9a324bd..daf18e0 100644
@@ -19,6 +19,7 @@
 #ifndef _AX88180_H_
 #define _AX88180_H_
 
+#include <asm/io.h>
 #include <asm/types.h>
 #include <config.h>
 
@@ -354,7 +355,7 @@ struct ax88180_private {
 
 static inline unsigned short INW (struct eth_device *dev, unsigned long addr)
 {
-	return le16_to_cpu (*(volatile unsigned short *) (addr + dev->iobase));
+	return le16_to_cpu(readw(addr + (void *)dev->iobase));
 }
 
 /*
@@ -363,32 +364,32 @@ static inline unsigned short INW (struct eth_device *dev, unsigned long addr)
 #if defined (CONFIG_DRIVER_AX88180_16BIT)
 static inline void OUTW (struct eth_device *dev, unsigned short command, unsigned long addr)
 {
-	*(volatile unsigned short *) ((addr + dev->iobase)) = cpu_to_le16 (command);
+	writew(cpu_to_le16(command), addr + (void *)dev->iobase);
 }
 
 static inline unsigned short READ_RXBUF (struct eth_device *dev)
 {
-	return le16_to_cpu (*(volatile unsigned short *) (RXBUFFER_START + dev->iobase));
+	return le16_to_cpu(readw(RXBUFFER_START + (void *)dev->iobase));
 }
 
 static inline void WRITE_TXBUF (struct eth_device *dev, unsigned short data)
 {
-	*(volatile unsigned short *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le16 (data);
+	writew(cpu_to_le16(data), TXBUFFER_START + (void *)dev->iobase);
 }
 #else
 static inline void OUTW (struct eth_device *dev, unsigned short command, unsigned long addr)
 {
-	*(volatile unsigned long *) ((addr + dev->iobase)) = cpu_to_le32 (command);
+	writel(cpu_to_le32(command), addr + (void *)dev->iobase);
 }
 
 static inline unsigned long READ_RXBUF (struct eth_device *dev)
 {
-	return le32_to_cpu (*(volatile unsigned long *) (RXBUFFER_START + dev->iobase));
+	return le32_to_cpu(readl(RXBUFFER_START + (void *)dev->iobase));
 }
 
 static inline void WRITE_TXBUF (struct eth_device *dev, unsigned long data)
 {
-	*(volatile unsigned long *) ((TXBUFFER_START + dev->iobase)) = cpu_to_le32 (data);
+	writel(cpu_to_le32(data), TXBUFFER_START + (void *)dev->iobase);
 }
 #endif
 
Signature · 1 line
1.7.1
#2 lore raw

PATCH v2 1/1 AX88180: use standard I/O accessors

Mike,

Quoted 9 lines · Mike Frysinger

The current dm9000x driver accesses its memory mapped registers directly instead of using the standard I/O accessors. This can cause problems on Blackfin systems as the accesses can get out of order. So convert the direct volatile dereferences to use the normal in/out macros.

---

I can't get this to apply. Please rebase against TOT.

regards,
Ben

#3 lore raw

PATCH v2 1/1 AX88180: use standard I/O accessors

Quoted 11 lines · On Monday, June 21, 2010 01:41:54 Ben Warren wrote:
Quoted 8 lines · Mike Frysinger

The current dm9000x driver accesses its memory mapped registers directly instead of using the standard I/O accessors. This can cause problems on Blackfin systems as the accesses can get out of order. So convert the direct volatile dereferences to use the normal in/out macros.

---

I can't get this to apply. Please rebase against TOT.

you need the first two in the series:
Applying: AX88180: add support for the Marvell 88E1118 phy
Applying: AX88180: make OUTW handle 32bit/16bit defines too
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20100621/d1d87a54/attachment.pgp

#4 lore raw

PATCH v2 1/1 AX88180: use standard I/O accessors

Hi Mike,

Quoted 13 lines · Mike Frysinger
Quoted 11 lines · On Monday, June 21, 2010 01:41:54 Ben Warren wrote:
Quoted 9 lines · Mike Frysinger

The current dm9000x driver accesses its memory mapped registers directly instead of using the standard I/O accessors. This can cause problems on Blackfin systems as the accesses can get out of order. So convert the direct volatile dereferences to use the normal in/out macros.

---

Quoted 7 lines
Quoted 2 lines

I can't get this to apply. Please rebase against TOT.

you need the first two in the series:
Applying: AX88180: add support for the Marvell 88E1118 phy
Applying: AX88180: make OUTW handle 32bit/16bit defines too -mike

Sorry I missed those. All three are now in net/text.

regards,
Ben