This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
LAN91Cxx EB support
- From: Yoshinori Sato <ysato at users dot sourceforge dot jp>
- To: eCos patches <ecos-patches at sources dot redhat dot com>
- Date: Thu, 27 Feb 2003 20:03:42 +0900
- Subject: 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>