From 487778b781257831aa9b9140dd3c7ad4176e8314 Mon Sep 17 00:00:00 2001 From: wdenk Date: Fri, 6 Jun 2003 11:20:01 +0000 Subject: [PATCH] Patch by Robert Schwebel, April 02, 2003: fix for SMSC91111 driver --- CHANGELOG | 3 +++ drivers/smc91111.c | 14 ++++++++++++++ drivers/smc91111.h | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index bcb7776..f979068 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Changes since U-Boot 0.3.1: ====================================================================== +* Patch by Robert Schwebel, April 02, 2003: + fix for SMSC91111 driver + * Patch by Vladimir Gurevich, 04 Jun 2003: make ppc405 ethernet driver compatible with CONFIG_NET_MULTI option diff --git a/drivers/smc91111.c b/drivers/smc91111.c index 652d859..748830e 100644 --- a/drivers/smc91111.c +++ b/drivers/smc91111.c @@ -317,6 +317,17 @@ static int poll4int( byte mask, int timeout ) { return 0; } +/* Only one release command at a time, please */ +static inline void smc_wait_mmu_release_complete(void) +{ + int count = 0; + /* assume bank 2 selected */ + while ( SMC_inw(MMU_CMD_REG) & MC_BUSY ) { + udelay(1); // Wait until not busy + if( ++count > 200) break; + } +} + /* . Function: smc_reset( void ) . Purpose: @@ -374,6 +385,7 @@ static void smc_reset( void ) /* Reset the MMU */ SMC_SELECT_BANK( 2 ); + smc_wait_mmu_release_complete(); SMC_outw( MC_RESET, MMU_CMD_REG ); while ( SMC_inw( MMU_CMD_REG ) & MC_BUSY ) udelay(1); /* Wait until not busy */ @@ -674,6 +686,8 @@ static int smc_open() /* SMC_SELECT_BANK(0); */ /* SMC_outw(0, RPC_REG); */ + SMC_SELECT_BANK(1); + #ifdef USE_32_BIT for ( i = 0; i < 6; i += 2 ) { word address; diff --git a/drivers/smc91111.h b/drivers/smc91111.h index a372c27..3ac0a03 100644 --- a/drivers/smc91111.h +++ b/drivers/smc91111.h @@ -80,7 +80,7 @@ typedef unsigned long int dword; #define SMC_inw(r) (*((volatile word *)(SMC_BASE_ADDRESS+(r)))) #define SMC_inb(p) ({ \ unsigned int __p = (unsigned int)(SMC_BASE_ADDRESS + (p)); \ - unsigned int __v = *(volatile unsigned short *)((SMC_BASE_ADDRESS + __p) & ~1); \ + unsigned int __v = *(volatile unsigned short *)((__p) & ~1); \ if (__p & 1) __v >>= 8; \ else __v &= 0xff; \ __v; })