Message ID | c83970ff-337d-6628-6976-e1665c44dd0b@cogentembedded.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Geert Uytterhoeven |
Headers | show |
On Sat, Jun 2, 2018 at 9:37 PM, Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> wrote: > Browsing thru the driver disassembly, I noticed that ARM gcc generated > no code whatsoever for sh_eth_soft_swap() while building a little-endian > kernel -- apparently __LITTLE_ENDIAN__ was not being #define'd, however > it got implicitly #define'd when building with the SH gcc (I could only > find the explicit #define __LITTLE_ENDIAN that was #include'd when building > a little-endian kernel). Luckily, the Ether controller only doing big- > endian DMA is encountered on the early SH771x SoCs only and all ARM SoCs > implement EDMR.DE and thus set 'sh_eth_cpu_data::hw_swap'. But anyway, we > need to fix the #ifdef inside sh_eth_soft_swap() to something that would > work on all architectures... > > Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Gr{oetje,eeting}s, Geert
On Mon, Jun 4, 2018 at 10:48 AM, Geert Uytterhoeven <geert@linux-m68k.org> wrote: > On Sat, Jun 2, 2018 at 9:37 PM, Sergei Shtylyov > <sergei.shtylyov@cogentembedded.com> wrote: >> Browsing thru the driver disassembly, I noticed that ARM gcc generated >> no code whatsoever for sh_eth_soft_swap() while building a little-endian >> kernel -- apparently __LITTLE_ENDIAN__ was not being #define'd, however >> it got implicitly #define'd when building with the SH gcc (I could only >> find the explicit #define __LITTLE_ENDIAN that was #include'd when building >> a little-endian kernel). Luckily, the Ether controller only doing big- >> endian DMA is encountered on the early SH771x SoCs only and all ARM SoCs >> implement EDMR.DE and thus set 'sh_eth_cpu_data::hw_swap'. But anyway, we >> need to fix the #ifdef inside sh_eth_soft_swap() to something that would >> work on all architectures... >> >> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> > > Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Forgot to say: nice catch ;-) Gr{oetje,eeting}s, Geert
Index: net-next/drivers/net/ethernet/renesas/sh_eth.h =================================================================== --- net-next.orig/drivers/net/ethernet/renesas/sh_eth.h +++ net-next/drivers/net/ethernet/renesas/sh_eth.h @@ -562,7 +562,7 @@ struct sh_eth_private { static inline void sh_eth_soft_swap(char *src, int len) { -#ifdef __LITTLE_ENDIAN__ +#ifdef __LITTLE_ENDIAN u32 *p = (u32 *)src; u32 *maxp; maxp = p + ((len + sizeof(u32) - 1) / sizeof(u32));
Browsing thru the driver disassembly, I noticed that ARM gcc generated no code whatsoever for sh_eth_soft_swap() while building a little-endian kernel -- apparently __LITTLE_ENDIAN__ was not being #define'd, however it got implicitly #define'd when building with the SH gcc (I could only find the explicit #define __LITTLE_ENDIAN that was #include'd when building a little-endian kernel). Luckily, the Ether controller only doing big- endian DMA is encountered on the early SH771x SoCs only and all ARM SoCs implement EDMR.DE and thus set 'sh_eth_cpu_data::hw_swap'. But anyway, we need to fix the #ifdef inside sh_eth_soft_swap() to something that would work on all architectures... Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> --- drivers/net/ethernet/renesas/sh_eth.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)