Patch by Robert Schwebel, April 02, 2003:
authorwdenk <wdenk>
Fri, 6 Jun 2003 11:20:01 +0000 (11:20 +0000)
committerwdenk <wdenk>
Fri, 6 Jun 2003 11:20:01 +0000 (11:20 +0000)
fix for SMSC91111 driver

CHANGELOG
drivers/smc91111.c
drivers/smc91111.h

index bcb77767389efb64086445b58f4294d6cfee31fb..f9790683bf8b3a2b9cc2b9ac581caf01670ef5b7 100644 (file)
--- 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
 
index 652d859dc61b13eb223f511ae5ff89f5a125e23d..748830e01c27eb269395268af639428549cb367e 100644 (file)
@@ -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;
index a372c2734d5ca7829729ff360a9002b7a6223827..3ac0a03d5d367eac31766cffc388ec7e4586727a 100644 (file)
@@ -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; })