net: smc911x: Add support RSK7203 board to smc911x
PATCH v2 1/1 net: smc911x: Add support RSK7203 board to smc911x
The RSK board has the SMSC9118 wired up 'incorrectly'. Byte-swapping is necessary, and so poor performance is inevitable. This problem cannot evade by the swap function of CHIP, this can evade by software Byte-swapping.
And this has problem by FIFO access only. pkt_data_pull/pkt_data_push functions necessary to solve this problem.
Signed-off-by Nobuhiro Iwamatsu <[email protected]>
--- drivers/net/smc911x.c | 34 +++++++++++++++++++++++++++++++--- 1 files changed, 31 insertions(+), 3 deletions(-)
drivers/net/smc911x.c +31 -3
@@ -1,5 +1,5 @@/* -* SMSC LAN9[12]1[567] Network driver +* SMSC LAN9[12]1[5678] Network driver * * (c) 2007 Pengutronix, Sascha Hauer <[email protected]> *
@@ -26,6 +26,7 @@#include <command.h> #include <net.h> #include <miiphy.h> +#include <asm/byteorder.h> #if defined (CONFIG_DRIVER_SMC911X_32_BIT ) && \ defined (CONFIG_DRIVER_SMC911X_16_BIT )
@@ -53,6 +54,33 @@ static inline void reg_write(u32 addr, u32 val) *(volatile u16 *)addr = (u16 )val; *(volatile u16 *)(addr +2 ) = (u16)(val >>16 ); } + +#if defined(CONFIG_RSK7203 ) +/* +* The RSK board has the SMSC9118 wired up 'incorrectly'. +* Byte-swapping is necessary, and so poor performance is inevitable. +* This problem cannot evade by the swap function of CHIP, this can +* evade by software Byte-swapping. +* And this has problem by FIFO access only. pkt_data_pull/pkt_data_push +* functions necessary to solve this problem. +*/ +static inline u32 pkt_data_pull (u32 addr) +{ +volatile u16 *addr_16 = (u16 *)addr; +return (((swab16 (*addr_16) <<16 ) &0xFFFF0000 )|swab16 (*(addr_16 +1 ))); +} + +static inline void pkt_data_push (u32 addr,u32 val) +{ + *(volatile u16 *)(addr +2 ) =swab16 ((u16 )val); + *(volatile u16 *)(addr) =swab16 ((u16)(val >>16 )); +} + +#else +# define pkt_data_pull (x) reg_read(x) +# define pkt_data_push (x, l) reg_write(x, l) +#endif /* CONFIG_RSK7203 */ +#else #error "SMC911X: undefined bus width"#endif /* CONFIG_DRIVER_SMC911X_16_BIT */
@@ -641,7 +669,7 @@ int eth_send(volatile void *packet, int length) tmplen = (length +3 ) /4 ;while (tmplen--) -reg_write (TX_DATA_FIFO , *data++); +pkt_data_push (TX_DATA_FIFO , *data++);/* wait for transmission */ while (!((reg_read (TX_FIFO_INF ) &TX_FIFO_INF_TSUSED ) >>16 ));
@@ -684,7 +712,7 @@ int eth_rx(void) tmplen = (pktlen +2 +3 ) /4 ;while (tmplen--) - *data++ =reg_read (RX_DATA_FIFO ); + *data++ =pkt_data_pull (RX_DATA_FIFO );if (status &RX_STS_ES ) printf(DRIVERNAME
Signature · 1 line
1.5.5.1