Mercurial > ecos
changeset 2008:84e97524cca6
* src/if_lan91cxx.c: Changed some debug messages to output right
hex syntax (0x....)
* src/if_lan91cxx.c: 32bit mode can now be selected is correctly
working. The old implementation truncated some data.
* cdl/smsc_lan91cxx_eth_drivers.cdl: Added CDL to control if
16 or 32 bit access is used.
| author | asl |
|---|---|
| date | Wed, 29 Jun 2005 20:06:04 +0000 |
| parents | adbedd54ee7b |
| children | a6e5ade47511 |
| files | packages/devs/eth/smsc/lan91cxx/current/ChangeLog packages/devs/eth/smsc/lan91cxx/current/cdl/smsc_lan91cxx_eth_drivers.cdl packages/devs/eth/smsc/lan91cxx/current/src/if_lan91cxx.c packages/devs/eth/smsc/lan91cxx/current/src/smsc_lan91cxx.h |
| diffstat | 4 files changed, 69 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/devs/eth/smsc/lan91cxx/current/ChangeLog +++ b/packages/devs/eth/smsc/lan91cxx/current/ChangeLog @@ -1,3 +1,12 @@ +2005-06-27 Stefan Sommerfeld <sommerfeld@mikrom.com> + + * src/if_lan91cxx.c: Changed some debug messages to output right + hex syntax (0x....) + * src/if_lan91cxx.c: 32bit mode can now be selected is correctly + working. The old implementation truncated some data. + * cdl/smsc_lan91cxx_eth_drivers.cdl: Added CDL to control if + 16 or 32 bit access is used. + 2005-06-12 Yoshinori Sato <ysato@users.sourceforge.jp> * src/if_lan91cxx.c: Reset the physical layer before configuring
--- a/packages/devs/eth/smsc/lan91cxx/current/cdl/smsc_lan91cxx_eth_drivers.cdl +++ b/packages/devs/eth/smsc/lan91cxx/current/cdl/smsc_lan91cxx_eth_drivers.cdl @@ -109,6 +109,15 @@ cdl_package CYGPKG_DEVS_ETH_SMSC_LAN91CX configured in PCMCIA mode." } + cdl_option CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT { + display "use 32 bit data access" + default_value 0 + description " + The device driver uses 32 bit data access if + this option is enabled, otherwise 16 bit data access is + used." + } + cdl_component CYGPKG_DEVS_ETH_SMSC_LAN91CXX_OPTIONS { display "LAN91CXX ethernet driver build options" flavor none
--- a/packages/devs/eth/smsc/lan91cxx/current/src/if_lan91cxx.c +++ b/packages/devs/eth/smsc/lan91cxx/current/src/if_lan91cxx.c @@ -749,7 +749,7 @@ lan91cxx_can_send(struct eth_drv_sc *sc) tcr = get_reg(sc, LAN91CXX_TCR); if ( 0 == (LAN91CXX_TCR_TXENA & tcr) ) { #if DEBUG & 1 - db_printf("%s: ENGINE RESTART: tcr %x\n", __FUNCTION__, tcr ); + db_printf("%s: ENGINE RESTART: tcr 0x%04x\n", __FUNCTION__, tcr ); #endif // Complete any outstanding activity: if ( cpd->txbusy ) { @@ -792,7 +792,7 @@ lan91cxx_send(struct eth_drv_sc *sc, str tcr = get_reg(sc, LAN91CXX_TCR); if ( 0 == (LAN91CXX_TCR_TXENA & tcr) ) { #if DEBUG & 1 - db_printf("%s: ENGINE RESTART: tcr %x\n", __FUNCTION__, tcr ); + db_printf("%s: ENGINE RESTART: tcr 0x%04x\n", __FUNCTION__, tcr ); #endif tcr |= LAN91CXX_TCR_TXENA; put_reg(sc, LAN91CXX_TCR, tcr); @@ -846,7 +846,7 @@ lan91cxx_send(struct eth_drv_sc *sc, str } while (0); #if DEBUG & 4 - db_printf("#####Tx packet allocated %x (previous %x)\n", + db_printf("#####Tx packet allocated 0x%04x (previous 0x%04x)\n", packet, cpd->txpacket); #endif cpd->txpacket = packet; @@ -964,7 +964,7 @@ lan91cxx_TxEvent(struct eth_drv_sc *sc, tcr = get_reg(sc, LAN91CXX_TCR); if ( 0 == (LAN91CXX_TCR_TXENA & tcr) ) { #if DEBUG & 1 - db_printf("%s: ENGINE RESTART: tcr %x ints %04x\n", __FUNCTION__, tcr, ints); + db_printf("%s: ENGINE RESTART: tcr 0x%04x ints %04x\n", __FUNCTION__, tcr, ints); #endif tcr |= LAN91CXX_TCR_TXENA; put_reg(sc, LAN91CXX_TCR, tcr); @@ -985,7 +985,7 @@ lan91cxx_TxEvent(struct eth_drv_sc *sc, lan91cxx_txfifo_good++; #endif #if DEBUG & 4 - db_printf("#####Tx packet freed %x (expected %x)\n", packet, cpd->txpacket ); + db_printf("#####Tx packet freed 0x%04x (expected 0x%04x)\n", packet, cpd->txpacket ); #endif // and then free the packet put_reg(sc, LAN91CXX_PNR, cpd->txpacket); @@ -1024,7 +1024,7 @@ lan91cxx_RxEvent(struct eth_drv_sc *sc) struct lan91cxx_priv_data *cpd = (struct lan91cxx_priv_data *)sc->driver_private; unsigned short stat, len; -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT cyg_uint32 val; #endif @@ -1045,7 +1045,7 @@ lan91cxx_RxEvent(struct eth_drv_sc *sc) INCR_STAT( rx_count ); #if DEBUG & 4 - db_printf("#####Rx packet allocated %x (previous %x)\n", + db_printf("#####Rx packet allocated 0x%04x (previous 0x%04x)\n", 0xff & (stat >> 8), cpd->rxpacket ); #endif // There is an Rx Packet ready @@ -1054,7 +1054,7 @@ lan91cxx_RxEvent(struct eth_drv_sc *sc) // Read status and (word) length put_reg(sc, LAN91CXX_POINTER, (LAN91CXX_POINTER_RCV | LAN91CXX_POINTER_READ | LAN91CXX_POINTER_AUTO_INCR | 0x0000)); -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT val = get_data(sc); val = CYG_LE32_TO_CPU(val); stat = val & 0xffff; @@ -1122,8 +1122,13 @@ lan91cxx_recv(struct eth_drv_sc *sc, str #endif int i; short mlen=0, plen; - rxd_t *data=NULL, val; - unsigned char *cp, cval; + cyg_uint16 *data=NULL; + unsigned char *cp, cval, odd_even = 0; +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT + cyg_uint32 val; +#else + cyg_uint16 val; +#endif DEBUG_FUNCTION(); @@ -1134,7 +1139,7 @@ lan91cxx_recv(struct eth_drv_sc *sc, str val = get_data(sc); // packet length (minus header/footer) -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT val = CYG_LE32_TO_CPU(val); plen = (val >> 16) - 6; #else @@ -1147,31 +1152,55 @@ lan91cxx_recv(struct eth_drv_sc *sc, str plen++; for (i = 0; i < sg_len; i++) { - data = (rxd_t *)sg_list[i].buf; + data = (cyg_uint16 *)sg_list[i].buf; mlen = sg_list[i].len; CYG_ASSERT(0 == (mlen & (sizeof(*data) - 1)) || (i == (sg_len-1)), "odd length"); #if DEBUG & 1 - db_printf("%s : mlen %x, plen %x\n", __FUNCTION__, mlen, plen); + db_printf("%s : mlen 0x%04x, plen 0x%04x\n", __FUNCTION__, mlen, plen); #endif if (data) { while (mlen >= sizeof(*data)) { - *data++ = get_data(sc); +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT + if (!(odd_even)) { // because of the 32bit to 16bit conversion, read only every 2nd word +#endif + val = get_data(sc); +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT + odd_even = 1; + } + else { + val >>= 16; + odd_even = 0; + } +#endif + *data++ = val; mlen -= sizeof(*data); plen -= sizeof(*data); } } else { // must actively discard ie. read it from the chip anyway. while (mlen >= sizeof(*data)) { - (void)get_data(sc); +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT + if (!(odd_even)) { +#endif + val = get_data(sc); +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT + odd_even = 1; + } + else { + val >>= 16; + odd_even = 0; + } +#endif mlen -= sizeof(*data); plen -= sizeof(*data); } } } + if (!(odd_even)) { // read the control word only if we not already have it because of a 32bit access val = get_data(sc); // Read control word (and potential data) unconditionally -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT val = CYG_LE32_TO_CPU(val); if (plen & 2) { if (data) @@ -1179,10 +1208,11 @@ lan91cxx_recv(struct eth_drv_sc *sc, str cp = (unsigned char *)data + 2; val >>= 16; mlen -= 2; - } else + } #else val = CYG_LE16_TO_CPU(val); #endif + } cp = (unsigned char *)data; CYG_ASSERT(val & LAN91CXX_CONTROLBYTE_RX, @@ -1197,10 +1227,10 @@ lan91cxx_recv(struct eth_drv_sc *sc, str val = get_reg(sc, LAN91CXX_FIFO_PORTS); #if DEBUG & 4 if ( 0x8000 & val ) // Then the Rx FIFO is empty - db_printf("#####Rx packet NOT freed, stat is %x (expected %x)\n", + db_printf("#####Rx packet NOT freed, stat is 0x%04x (expected 0x%04x)\n", val, cpd->rxpacket); else - db_printf("#####Rx packet freed %x (expected %x)\n", + db_printf("#####Rx packet freed 0x%04x (expected 0x%04x)\n", 0xff & (val >> 8), cpd->rxpacket ); #endif CYG_ASSERT( (0xff & (val >> 8)) == cpd->rxpacket, "Unexpected rx packet" );
--- a/packages/devs/eth/smsc/lan91cxx/current/src/smsc_lan91cxx.h +++ b/packages/devs/eth/smsc/lan91cxx/current/src/smsc_lan91cxx.h @@ -339,7 +339,7 @@ typedef struct lan91cxx_priv_data { #include CYGDAT_DEVS_ETH_SMSC_LAN91CXX_INL -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT typedef cyg_uint32 rxd_t; #else typedef cyg_uint16 rxd_t; @@ -406,7 +406,7 @@ get_data(struct eth_drv_sc *sc) struct lan91cxx_priv_data *cpd = (struct lan91cxx_priv_data *)sc->driver_private; -#ifdef LAN91CXX_32BIT_RX +#ifdef CYGSEM_DEVS_ETH_SMSC_LAN91CXX_USE_32BIT HAL_READ_UINT32(cpd->base+((LAN91CXX_DATA_HIGH & 0x7) << cpd->addrsh), val); #else HAL_READ_UINT16(cpd->base+((LAN91CXX_DATA & 0x7) << cpd->addrsh), val);
