Messages in this thread Patch in this message |  | | From | Greg Ungerer <> | | Subject | [RFC 2/4] net: smc91x: do not use readw()/writew() on ColdFire platforms | | Date | Thu, 7 May 2026 00:26:44 +1000 |
| |
From: Greg Ungerer <gerg@linux-m68k.org>
Modify the access macros and functions used to access the smsc hardware registers when used on ColdFire SoC platforms so they do not use readw() or writew(), or derived functions like ioread16be() and iowrite16be().
The current set of readX()/writeX() access methods for ColdFire have historically been non-standard, in that they mostly access memory big-endian instead of the expected little-endian. Before fixing the ColdFire readX() and writeX() supporting code to properly work with little-endian data existing driver uses need to be fixed. Convert the smsc driver ColdFire uses of these to use the raw access macros - which are well defined to be (native) big-endian on ColdFire. This change requires some byte swapping at time of access to retain existing correct behavior.
Signed-off-by: Greg Ungerer <gerg@linux-m68k.org> --- drivers/net/ethernet/smsc/smc91x.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 38aa4374e813..1290335629c1 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -142,22 +142,26 @@ static inline void _SMC_outw_align4(u16 val, void __iomem *ioaddr, int reg, #define SMC_CAN_USE_32BIT 0 #define SMC_NOWAIT 1 +/* + * Access SMSC device registers using raw IO access primitives. Byte + * swap as required for device registers, but not data. + */ static inline void mcf_insw(void __iomem *a, unsigned char *p, int l) { u16 *wp = (u16 *) p; while (l-- > 0) - *wp++ = readw(a); + *wp++ = __raw_readw(a); } static inline void mcf_outsw(void __iomem *a, unsigned char *p, int l) { u16 *wp = (u16 *) p; while (l-- > 0) - writew(*wp++, a); + __raw_writew(*wp++, a); } -#define SMC_inw(a, r) ioread16be((a) + (r)) -#define SMC_outw(lp, v, a, r) iowrite16be(v, (a) + (r)) +#define SMC_inw(a, r) swab16(__raw_readw((a) + (r))) +#define SMC_outw(lp, v, a, r) __raw_writew(swab16(v), (a) + (r)) #define SMC_insw(a, r, p, l) mcf_insw(a + r, p, l) #define SMC_outsw(a, r, p, l) mcf_outsw(a + r, p, l) -- 2.54.0
|  |