[PATCH v2 1/3] net: emaclite: fix broken build

From: Samuel Obuch samuel.obuch@codasip.com
Function ioremap_nocache seems to be defined only for mips and microblaze architectures. Therefore, the function call in the emaclite driver causes this driver to be unusable with other architectures, for example riscv.
v2: Use ioremap function instead of ioremap_nocache. Switch to linux/io.h which automatically creates ioremap if not defined by the architecture.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com --- drivers/net/xilinx_emaclite.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 6c9f1f7c27..2e152bf873 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -20,8 +20,8 @@ #include <fdtdec.h> #include <linux/delay.h> #include <linux/errno.h> +#include <linux/io.h> #include <linux/kernel.h> -#include <asm/io.h> #include <eth_phy.h>
DECLARE_GLOBAL_DATA_PTR; @@ -615,8 +615,8 @@ static int emaclite_of_to_plat(struct udevice *dev) int offset = 0;
pdata->iobase = dev_read_addr(dev); - emaclite->regs = (struct emaclite_regs *)ioremap_nocache(pdata->iobase, - 0x10000); + emaclite->regs = (struct emaclite_regs *)ioremap(pdata->iobase, + 0x10000);
emaclite->phyaddr = -1;

From: Samuel Obuch samuel.obuch@codasip.com
Use __raw_read* and __raw_write* functions to ensure read/write is passed to the memory-mapped regions, as non-volatile accesses may get optimised out.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com --- drivers/net/xilinx_emaclite.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 2e152bf873..c12736d0ee 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -113,12 +113,12 @@ static void xemaclite_alignedread(u32 *srcptr, void *destptr, u32 bytecount) /* Word aligned buffer, no correction needed. */ to32ptr = (u32 *) destptr; while (bytecount > 3) { - *to32ptr++ = *from32ptr++; + *to32ptr++ = __raw_readl(from32ptr++); bytecount -= 4; } to8ptr = (u8 *) to32ptr;
- alignbuffer = *from32ptr++; + alignbuffer = __raw_readl(from32ptr++); from8ptr = (u8 *) &alignbuffer;
for (i = 0; i < bytecount; i++) @@ -136,8 +136,7 @@ static void xemaclite_alignedwrite(void *srcptr, u32 *destptr, u32 bytecount)
from32ptr = (u32 *) srcptr; while (bytecount > 3) { - - *to32ptr++ = *from32ptr++; + __raw_writel(*from32ptr++, to32ptr++); bytecount -= 4; }
@@ -148,7 +147,7 @@ static void xemaclite_alignedwrite(void *srcptr, u32 *destptr, u32 bytecount) for (i = 0; i < bytecount; i++) *to8ptr++ = *from8ptr++;
- *to32ptr++ = alignbuffer; + __raw_writel(alignbuffer, to32ptr++); }
static int wait_for_bit(const char *func, u32 *reg, const u32 mask,

On Fri, Sep 23, 2022 at 3:31 PM samuel.obuch@codasip.com wrote:
From: Samuel Obuch samuel.obuch@codasip.com
Use __raw_read* and __raw_write* functions to ensure read/write is passed to the memory-mapped regions, as non-volatile accesses may get optimised out.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com
drivers/net/xilinx_emaclite.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 2e152bf873..c12736d0ee 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -113,12 +113,12 @@ static void xemaclite_alignedread(u32 *srcptr, void *destptr, u32 bytecount) /* Word aligned buffer, no correction needed. */ to32ptr = (u32 *) destptr; while (bytecount > 3) {
*to32ptr++ = *from32ptr++;
*to32ptr++ = __raw_readl(from32ptr++); bytecount -= 4; } to8ptr = (u8 *) to32ptr;
alignbuffer = *from32ptr++;
alignbuffer = __raw_readl(from32ptr++); from8ptr = (u8 *) &alignbuffer; for (i = 0; i < bytecount; i++)
@@ -136,8 +136,7 @@ static void xemaclite_alignedwrite(void *srcptr, u32 *destptr, u32 bytecount)
from32ptr = (u32 *) srcptr; while (bytecount > 3) {
*to32ptr++ = *from32ptr++;
__raw_writel(*from32ptr++, to32ptr++); bytecount -= 4; }
@@ -148,7 +147,7 @@ static void xemaclite_alignedwrite(void *srcptr, u32 *destptr, u32 bytecount) for (i = 0; i < bytecount; i++) *to8ptr++ = *from8ptr++;
*to32ptr++ = alignbuffer;
__raw_writel(alignbuffer, to32ptr++);
}
static int wait_for_bit(const char *func, u32 *reg, const u32 mask,
2.31.1
Reviewed-by: Ramon Fried rfried.dev@gmail.com

From: Samuel Obuch samuel.obuch@codasip.com
The maximum length is capped similarly to the emaclite_send function. Avoid integer underflow for values of ip->ip_len < 30, the minimum length of an IP packet is 21 bytes.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com --- drivers/net/xilinx_emaclite.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index c12736d0ee..52127a05e8 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -518,6 +518,8 @@ try_again: length = ntohs(ip->ip_len); length += ETHER_HDR_SIZE + ETH_FCS_LEN; debug("IP Packet %x\n", length); + if (length > PKTSIZE) + length = PKTSIZE; break; default: debug("Other Packet\n"); @@ -526,7 +528,7 @@ try_again: }
/* Read the rest of the packet which is longer then first read */ - if (length != first_read) + if (length > first_read) xemaclite_alignedread(addr + first_read, etherrxbuff + first_read, length - first_read);

On Fri, Sep 23, 2022 at 3:31 PM samuel.obuch@codasip.com wrote:
From: Samuel Obuch samuel.obuch@codasip.com
The maximum length is capped similarly to the emaclite_send function. Avoid integer underflow for values of ip->ip_len < 30, the minimum length of an IP packet is 21 bytes.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com
drivers/net/xilinx_emaclite.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index c12736d0ee..52127a05e8 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -518,6 +518,8 @@ try_again: length = ntohs(ip->ip_len); length += ETHER_HDR_SIZE + ETH_FCS_LEN; debug("IP Packet %x\n", length);
if (length > PKTSIZE)
length = PKTSIZE; break; default: debug("Other Packet\n");
@@ -526,7 +528,7 @@ try_again: }
/* Read the rest of the packet which is longer then first read */
if (length != first_read)
if (length > first_read) xemaclite_alignedread(addr + first_read, etherrxbuff + first_read, length - first_read);
-- 2.31.1
Reviewed-by: Ramon Fried rfried.dev@gmail.com

Hi,
can you please update subject line? Currently this driver is enabled by microblaze and mips which means there are not broken builds that's why subject is not correct.
On 9/23/22 14:31, samuel.obuch@codasip.com wrote:
From: Samuel Obuch samuel.obuch@codasip.com
Function ioremap_nocache seems to be defined only for mips and microblaze
nit: MIPS and Microblaze
architectures. Therefore, the function call in the emaclite driver causes this driver to be unusable with other architectures, for example riscv.
RISC-V
v2: Use ioremap function instead of ioremap_nocache. Switch to linux/io.h which automatically creates ioremap if not defined by the architecture.
This should go out of commit message below ---.
Signed-off-by: Samuel Obuch samuel.obuch@codasip.com
drivers/net/xilinx_emaclite.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 6c9f1f7c27..2e152bf873 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -20,8 +20,8 @@ #include <fdtdec.h> #include <linux/delay.h> #include <linux/errno.h> +#include <linux/io.h> #include <linux/kernel.h> -#include <asm/io.h>
There is actually one more asm/io.h in this file. Please also remove it.
#include <eth_phy.h>
DECLARE_GLOBAL_DATA_PTR; @@ -615,8 +615,8 @@ static int emaclite_of_to_plat(struct udevice *dev) int offset = 0;
pdata->iobase = dev_read_addr(dev);
- emaclite->regs = (struct emaclite_regs *)ioremap_nocache(pdata->iobase,
0x10000);
- emaclite->regs = (struct emaclite_regs *)ioremap(pdata->iobase,
0x10000);
Above you are not saying why you are doing it. It would be good to say in commit message that Microblaze ioremap_nocache is just empty and in MIPS ioremap_nocache implementation is the same with ioremap.
And also that Linux kernel doesn't use any ioremap_nocache function that's why this function shouldn't be used because simple ioremap is uncached already.
emaclite->phyaddr = -1;
Thanks, Michal
participants (3)
-
Michal Simek
-
Ramon Fried
-
samuel.obuch@codasip.com