This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

LAN91Cxx EB support


SMSC LAN91Cxx driver supported Big Endian Architecture patches.

--- ChangeLog.org	2003-02-27 19:27:53.000000000 +0900
+++ ChangeLog		2003-02-27 00:35:56.000000000 +0900
@@ -1,3 +1,8 @@
+2003-02-26  Yoshinori Sato <ysato at users dot sourceforge dot jp>
+
+	* src/smsc_lan91cxx.h: Support big endian arch.	
+	* src/if_lan91cxx.c: Support big endian arch.
+
 2002-08-28  Mark Salter  <msalter at redhat dot com>
 
 	* src/smsc_lan91cxx.h: Support 32-bit data reads.
--- src/smsc_lan91cxx.h.org	2003-02-27 19:28:25.000000000 +0900
+++ src/smsc_lan91cxx.h		2003-02-27 00:22:21.000000000 +0900
 //==========================================================================
 
 #include <cyg/hal/hal_io.h>
-
+#include <cyg/hal/hal_endian.h>
 
 #define LAN91CXX_TCR         0x00
 #define LAN91CXX_EPH_STATUS  0x01
@@ -342,8 +342,10 @@
         (struct lan91cxx_priv_data *)sc->driver_private;
     unsigned short val;
     
-    HAL_WRITE_UINT16(cpd->base+(LAN91CXX_BS << cpd->addrsh), regno>>3);
+    HAL_WRITE_UINT16(cpd->base+(LAN91CXX_BS << cpd->addrsh), CYG_CPU_TO_LE16(regno>>3));
     HAL_READ_UINT16(cpd->base+((regno&0x7) << cpd->addrsh), val);
+    val = CYG_LE16_TO_CPU(val);
+
 #if DEBUG & 2
     diag_printf("read reg %d val 0x%04x\n", regno, val);
 #endif
@@ -358,8 +360,8 @@
     struct lan91cxx_priv_data *cpd =
         (struct lan91cxx_priv_data *)sc->driver_private;
 	
-    HAL_WRITE_UINT16(cpd->base+(LAN91CXX_BS << cpd->addrsh), regno>>3);
-    HAL_WRITE_UINT16(cpd->base+((regno&0x7) << cpd->addrsh), val);
+    HAL_WRITE_UINT16(cpd->base+(LAN91CXX_BS << cpd->addrsh), CYG_CPU_TO_LE16(regno>>3));
+    HAL_WRITE_UINT16(cpd->base+((regno&0x7) << cpd->addrsh), CYG_CPU_TO_LE16(val));
 
 #if DEBUG & 2
     diag_printf("write reg %d val 0x%04x\n", regno, val);
@@ -414,7 +416,8 @@
     struct lan91cxx_priv_data *cpd =
         (struct lan91cxx_priv_data *)sc->driver_private;
     unsigned short val;
    
     HAL_READ_UINT16(cpd->base+(LAN91CXX_BS << cpd->addrsh), val);
+    val = CYG_LE16_TO_CPU(val);
 #if DEBUG & 2
     diag_printf("read bank val 0x%04x\n", val);
 #endif
@@ -432,7 +435,7 @@
     struct lan91cxx_priv_data *cpd =
         (struct lan91cxx_priv_data *)sc->driver_private;
 	
-    HAL_WRITE_UINT8(cpd->attbase + (offs << cpd->addrsh), val);
+    HAL_WRITE_UINT8(cpd->attbase + (offs << cpd->addrsh), CYG_CPU_TO_LE16(val));
 
 #if DEBUG & 2
     diag_printf("write attr %d val 0x%02x\n", offs, val);
@@ -448,6 +451,7 @@
     unsigned char val;
     
     HAL_READ_UINT8(cpd->attbase + (offs << cpd->addrsh), val);
+    val = CYG_LE16_TO_CPU(val);
 #if DEBUG & 2
     diag_printf("read attr %d val 0x%02x\n", offs, val);
 #endif
--- src/if_lan91cxx.c.org	2003-02-27 19:28:15.000000000 +0900
+++ src/if_lan91cxx.c		2003-02-27 19:37:04.000000000 +0900
@@ -716,7 +716,7 @@
         plen += sg_list[i].len;
 
     CYG_ASSERT( plen == total_len, "sg data length mismatch" );
-    
+
     // Alloc new TX packet
     do {
         put_reg(sc, LAN91CXX_MMU_COMMAND, LAN91CXX_MMU_alloc_for_tx
@@ -761,9 +761,9 @@
     // data writes.
 
     // Prepare header:
-    put_data(sc, 0);        // reserve space for status word
+    put_data(sc, CYG_CPU_TO_LE16(0));        // reserve space for status word
     // packet length (includes status, byte-count and control shorts)
-    put_data(sc, 0x7FE & (plen + 6) ); // Always even, always < 15xx(dec)
+    put_data(sc, CYG_CPU_TO_LE16(0x7FE & (plen + 6)) ); // Always even, always < 15xx(dec)
 
     // Put data into buffer
     for (i = 0;  i < sg_len;  i++) {
@@ -959,11 +959,14 @@
                                  LAN91CXX_POINTER_AUTO_INCR | 0x0000));
 #ifdef LAN91CXX_32BIT_RX
     val = get_data(sc);
+    val = CYG_LE32_TO_CPU(val);
     stat = val & 0xffff;
     len = ((val >> 16) & 0xffff) - 6;   // minus header/footer words
 #else
     stat = get_data(sc);
-    len = get_data(sc) - 6;             // minus header/footer words
+    stat = CYG_LE16_TO_CPU(stat);
+    len = get_data(sc);
+    len = CYG_LE16_TO_CPU(len) - 6;     // minus header/footer words
 #endif
 
 #ifdef KEEP_STATISTICS
@@ -1019,7 +1022,8 @@
     struct lan91cxx_priv_data *cpd = 
         (struct lan91cxx_priv_data *)sc->driver_private;
 #endif
-    int i, mlen=0, plen;
+    int i;
+    short mlen=0, plen;
     rxd_t *data=NULL, val;
     unsigned char *cp, cval;
 
@@ -1033,9 +1037,11 @@
 
     // packet length (minus header/footer)
 #ifdef LAN91CXX_32BIT_RX
+    val = CYG_LE32_TO_CPU(val);
     plen = (val >> 16) - 6;
 #else
-    plen = get_data(sc) - 6;
+    plen = get_data(sc);
+    plen = CYG_LE16_TO_CPU(plen) - 6;
 #endif
     if (val & LAN91CXX_RX_STATUS_ODDFRM)
 	plen++;
@@ -1066,6 +1072,7 @@
     }
     val = get_data(sc); // Read control word (and potential data) unconditionally
 #ifdef LAN91CXX_32BIT_RX
+    val = CYG_LE32_TO_CPU(val);
     if (plen & 2) {
 	if (data)
 	    *(cyg_uint16 *)data = val & 0xffff;

-- 
Yoshinori Sato
<ysato at users dot sourceforge dot jp>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]