diff mbox series

net: pcnet: fix I/O primitives for memory access

Message ID 20200503174332.14578-1-daniel.schwierzeck@gmail.com
State Accepted
Commit 8510580f2e85a8687b40fe5fc3d8c060e5278505
Headers show
Series net: pcnet: fix I/O primitives for memory access | expand

Commit Message

Daniel Schwierzeck May 3, 2020, 5:43 p.m. UTC
Commit 69529c912059 ("net: pcnet: Switch to PCI memory access")
switched from PCI IO access to PCI memory access without updating
the I/O primitives. Contrary to SH, the primitives for memory
access and IO access are implemented differently. Thus doing
memory access with IO port primitives breaks the driver on
MIPS Malta board.

Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>

---
Needs to be applied after

[PULL] u-boot-sh/next network cleanup part 1

https://patchwork.ozlabs.org/project/uboot/patch/270da1a6-aa7a-16c6-6642-76a9ea8a7048 at denx.de/

 drivers/net/pcnet.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

Comments

Tom Rini May 4, 2020, 1:23 p.m. UTC | #1
On Sun, May 03, 2020 at 07:43:32PM +0200, Daniel Schwierzeck wrote:

> Commit 69529c912059 ("net: pcnet: Switch to PCI memory access")
> switched from PCI IO access to PCI memory access without updating
> the I/O primitives. Contrary to SH, the primitives for memory
> access and IO access are implemented differently. Thus doing
> memory access with IO port primitives breaks the driver on
> MIPS Malta board.
> 
> Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
> 

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/drivers/net/pcnet.c b/drivers/net/pcnet.c
index df82b716a7..8dfcb10a15 100644
--- a/drivers/net/pcnet.c
+++ b/drivers/net/pcnet.c
@@ -95,37 +95,49 @@  static pcnet_priv_t *lp;
 
 static u16 pcnet_read_csr(struct eth_device *dev, int index)
 {
-	outw(index, dev->iobase + PCNET_RAP);
-	return inw(dev->iobase + PCNET_RDP);
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	writew(index, base + PCNET_RAP);
+	return readw(base + PCNET_RDP);
 }
 
 static void pcnet_write_csr(struct eth_device *dev, int index, u16 val)
 {
-	outw(index, dev->iobase + PCNET_RAP);
-	outw(val, dev->iobase + PCNET_RDP);
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	writew(index, base + PCNET_RAP);
+	writew(val, base + PCNET_RDP);
 }
 
 static u16 pcnet_read_bcr(struct eth_device *dev, int index)
 {
-	outw(index, dev->iobase + PCNET_RAP);
-	return inw(dev->iobase + PCNET_BDP);
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	writew(index, base + PCNET_RAP);
+	return readw(base + PCNET_BDP);
 }
 
 static void pcnet_write_bcr(struct eth_device *dev, int index, u16 val)
 {
-	outw(index, dev->iobase + PCNET_RAP);
-	outw(val, dev->iobase + PCNET_BDP);
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	writew(index, base + PCNET_RAP);
+	writew(val, base + PCNET_BDP);
 }
 
 static void pcnet_reset(struct eth_device *dev)
 {
-	inw(dev->iobase + PCNET_RESET);
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	readw(base + PCNET_RESET);
 }
 
 static int pcnet_check(struct eth_device *dev)
 {
-	outw(88, dev->iobase + PCNET_RAP);
-	return inw(dev->iobase + PCNET_RAP) == 88;
+	void __iomem *base = (void __iomem *)dev->iobase;
+
+	writew(88, base + PCNET_RAP);
+	return readw(base + PCNET_RAP) == 88;
 }
 
 static int pcnet_init (struct eth_device *dev, bd_t * bis);