URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 1462 to Rev 1463
- ↔ Reverse comparison
Rev 1462 → Rev 1463
/trunk/or1ksim/peripheral/eth.c
51,6 → 51,8
#include "sched.h" |
#include "debug.h" |
|
DEFAULT_DEBUG_CHANNEL(eth); |
|
/* simulator interface */ |
static void eth_vapi_read( unsigned long id, unsigned long data, void *dat); |
/* register interface */ |
81,12 → 83,12
#if HAVE_ETH_PHY |
struct sockaddr_ll sll; |
#endif /* HAVE_ETH_PHY */ |
long nwritten; |
long nwritten = 0; |
unsigned long read_word; |
|
switch (eth->tx.state) { |
case ETH_TXSTATE_IDLE: |
debug (3, "TX - entering state WAIT4BD (%ld)\n", eth->tx.bd_index); |
TRACE ("TX - entering state WAIT4BD (%ld)\n", eth->tx.bd_index); |
eth->tx.state = ETH_TXSTATE_WAIT4BD; |
break; |
case ETH_TXSTATE_WAIT4BD: |
135,7 → 137,7
eth->tx.crc_dly = 0; |
/* XXX - For now we skip CRC calculation */ |
|
debug( 3, "Ethernet: Starting TX of %lu bytes (min. %u, max. %u)\n", |
TRACE( "Ethernet: Starting TX of %lu bytes (min. %u, max. %u)\n", |
eth->tx.packet_length, eth->tx.minimum_length, |
eth->tx.maximum_length ); |
|
146,7 → 148,7
|
/************************************************/ |
/* start transmit with reading packet into FIFO */ |
debug (3, "TX - entering state READFIFO\n"); |
TRACE ("TX - entering state READFIFO\n"); |
eth->tx.state = ETH_TXSTATE_READFIFO; |
} |
|
169,7 → 171,7
} |
#endif |
else { |
debug (3, "TX - entering state TRANSMIT\n"); |
TRACE ("TX - entering state TRANSMIT\n"); |
eth->tx.state = ETH_TXSTATE_TRANSMIT; |
} |
break; |
191,11 → 193,11
if (nwritten == eth->tx.packet_length) { |
CLEAR_FLAG (eth->tx.bd, ETH_TX_BD, READY); |
SET_FLAG (eth->regs.int_source, ETH_INT_SOURCE, TXB); |
debug (4, "ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
TRACE ("ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
|
debug (3, "TX - entering state WAIT4BD\n"); |
TRACE ("TX - entering state WAIT4BD\n"); |
eth->tx.state = ETH_TXSTATE_WAIT4BD; |
debug (3, "send (%ld)bytes OK\n", nwritten); |
TRACE ("send (%ld)bytes OK\n", nwritten); |
} |
else { |
/* XXX - implement retry mechanism here! */ |
202,11 → 204,11
CLEAR_FLAG (eth->tx.bd, ETH_TX_BD, READY); |
CLEAR_FLAG (eth->tx.bd, ETH_TX_BD, COLLISION); |
SET_FLAG (eth->regs.int_source, ETH_INT_SOURCE, TXE); |
debug (4, "ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
TRACE ("ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
|
debug (3, "TX - entering state WAIT4BD\n"); |
TRACE ("TX - entering state WAIT4BD\n"); |
eth->tx.state = ETH_TXSTATE_WAIT4BD; |
debug (3, "send FAILED!\n"); |
TRACE ("send FAILED!\n"); |
} |
|
eth->regs.bd_ram[eth->tx.bd_index] = eth->tx.bd; |
255,7 → 257,7
|
switch (eth->rx.state) { |
case ETH_RXSTATE_IDLE: |
debug (3, "RX - entering state WAIT4BD (%ld)\n", eth->rx.bd_index); |
TRACE ("RX - entering state WAIT4BD (%ld)\n", eth->rx.bd_index); |
eth->rx.state = ETH_RXSTATE_WAIT4BD; |
break; |
|
274,7 → 276,7
CLEAR_FLAG( eth->rx.bd, ETH_RX_BD, TOOBIG ); |
CLEAR_FLAG( eth->rx.bd, ETH_RX_BD, TOOSHORT ); |
|
debug( 3, "Ethernet: Starting RX\n" ); |
TRACE( "Ethernet: Starting RX\n" ); |
|
/* Setup file to read from */ |
if ( TEST_FLAG( eth->regs.moder, ETH_MODER, LOOPBCK ) ) { |
284,11 → 286,11
eth->rx.fd = eth->rxfd; |
eth->rx.offset = 0; |
} |
debug (3, "RX - entering state RECV\n"); |
TRACE ("RX - entering state RECV\n"); |
eth->rx.state = ETH_RXSTATE_RECV; |
} |
else if (!TEST_FLAG( eth->regs.moder, ETH_MODER, RXEN)) { |
debug (3, "RX - entering state IDLE\n"); |
TRACE ("RX - entering state IDLE\n"); |
eth->rx.state = ETH_RXSTATE_IDLE; |
} |
else { |
308,17 → 310,17
if ( eth_read_rx_file( eth, &(eth->rx.packet_length), sizeof(eth->rx.packet_length) ) |
< sizeof(eth->rx.packet_length) ) { |
/* TODO: just do what real ethernet would do (some kind of error state) */ |
debug (4, "eth_start_rx(): File does not have a packet ready for RX (len = %ld)\n", eth->rx.packet_length ); |
runtime.sim.cont_run = 0; |
TRACE ("eth_start_rx(): File does not have a packet ready for RX (len = %ld)\n", eth->rx.packet_length ); |
sim_done(); |
break; |
} |
|
/* Packet must be big enough to hold a header */ |
if ( eth->rx.packet_length < ETHER_HDR_LEN ){ |
debug( 3, "eth_start_rx(): Packet too small\n" ); |
TRACE( "eth_start_rx(): Packet too small\n" ); |
eth_rx_next_packet( eth ); |
|
debug (3, "RX - entering state WAIT4BD\n"); |
TRACE ("RX - entering state WAIT4BD\n"); |
eth->rx.state = ETH_RXSTATE_WAIT4BD; |
break; |
} |
329,7 → 331,7
/* for now Read entire packet into memory */ |
nread = eth_read_rx_file( eth, eth->rx_buff, eth->rx.bytes_left ); |
if ( nread < eth->rx.bytes_left ) { |
debug (3, "Read %ld from %ld. Error!\n", nread, eth->rx.bytes_left); |
TRACE ("Read %ld from %ld. Error!\n", nread, eth->rx.bytes_left); |
eth->rx.error = 1; |
break; |
} |
338,7 → 340,7
eth->rx.bytes_left = nread; |
eth->rx.bytes_read = 0; |
|
debug (3, "RX - entering state WRITEFIFO\n"); |
TRACE ("RX - entering state WRITEFIFO\n"); |
eth->rx.state = ETH_RXSTATE_WRITEFIFO; |
|
break; |
346,14 → 348,16
case ETH_RTX_SOCK: |
nread = recv(eth->rtx_sock, eth->rx_buff, ETH_MAXPL, MSG_DONTWAIT); |
|
if (nread == 0) |
if (nread == 0) { |
TRACE("No data read\n"); |
break; |
else if (nread < 0) { |
} else if (nread < 0) { |
if ( errno != EAGAIN ) { |
debug (3, "recv() FAILED!\n"); |
TRACE ("recv() FAILED!\n"); |
break; |
} |
else break; |
else |
break; |
} |
/* If not promiscouos mode, check the destination address */ |
if (!TEST_FLAG(eth->regs.moder, ETH_MODER, PRO)) { |
374,7 → 378,7
eth->rx.bytes_left = nread; |
eth->rx.bytes_read = 0; |
|
debug (3, "RX - entering state WRITEFIFO\n"); |
TRACE ("RX - entering state WRITEFIFO\n"); |
eth->rx.state = ETH_RXSTATE_WRITEFIFO; |
|
break; |
391,7 → 395,7
((unsigned long)eth->rx_buff[eth->rx.bytes_read+3] ); |
set_direct32( eth->rx.bd_addr + eth->rx.bytes_read, send_word, &breakpoint, 0, 0); |
/* update counters */ |
debug (3, "Write %ld, left %ld - %08lXd\n", eth->rx.bytes_read, |
TRACE ("Write %ld, left %ld - %08lXd\n", eth->rx.bytes_read, |
eth->rx.bytes_left, send_word); |
eth->rx.bytes_left -= 4; |
eth->rx.bytes_read += 4; |
406,7 → 410,7
SET_FIELD( eth->rx.bd, ETH_RX_BD, LENGTH, eth->rx.packet_length ); |
CLEAR_FLAG( eth->rx.bd, ETH_RX_BD, READY); |
SET_FLAG( eth->regs.int_source, ETH_INT_SOURCE, RXB); |
debug (4, "ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
TRACE ("ETH_INT_SOURCE = %0lx\n", eth->regs.int_source); |
|
if ( eth->rx.packet_length < (GET_FIELD( eth->regs.packetlen, ETH_PACKETLEN, MINFL ) - 4) ) |
SET_FLAG( eth->rx.bd, ETH_RX_BD, TOOSHORT); |
427,7 → 431,7
} |
|
/* ready to receive next packet */ |
debug (3, "RX - entering state IDLE\n"); |
TRACE ("RX - entering state IDLE\n"); |
eth->rx.state = ETH_RXSTATE_IDLE; |
} |
break; |
465,18 → 469,18
ssize_t result; |
|
if ( eth->rx.fd <= 0 ) { |
debug( 3, "Ethernet: No RX file\n" ); |
TRACE( "Ethernet: No RX file\n" ); |
return 0; |
} |
|
if ( eth->rx.offset ) |
if ( lseek( eth->rx.fd, *(eth->rx.offset), SEEK_SET ) == (off_t)-1 ) { |
debug( 3, "Ethernet: Error seeking RX file\n" ); |
TRACE( "Ethernet: Error seeking RX file\n" ); |
return 0; |
} |
|
result = read( eth->rx.fd, buf, count ); |
debug (4, "Ethernet: read result = %d \n", result); |
TRACE ("Ethernet: read result = %d \n", result); |
if ( eth->rx.offset && result >= 0 ) |
*(eth->rx.offset) += result; |
|
527,7 → 531,7
if (eth->rtx_sock != 0) |
break; |
|
debug (3, "RTX oppening socket...\n"); |
TRACE ("RTX opening socket...\n"); |
eth->rtx_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); |
if (eth->rtx_sock == -1) { |
fprintf( stderr, "Cannot open rtx_sock.\n"); |
535,7 → 539,7
} |
|
/* get interface index number */ |
debug (3, "RTX getting interface...\n"); |
TRACE ("RTX getting interface...\n"); |
memset(&(eth->ifr), 0, sizeof(eth->ifr)); |
strncpy(eth->ifr.ifr_name, eth->sockif, IFNAMSIZ); |
if (ioctl(eth->rtx_sock, SIOCGIFINDEX, &(eth->ifr)) == -1) { |
542,10 → 546,10
fprintf( stderr, "SIOCGIFINDEX failed!\n"); |
return; |
} |
debug (3, "RTX Socket Interface : %d\n", eth->ifr.ifr_ifindex); |
TRACE ("RTX Socket Interface : %d\n", eth->ifr.ifr_ifindex); |
|
/* Bind to interface... */ |
debug (3, "Binding to the interface ifindex=%d\n", eth->ifr.ifr_ifindex); |
TRACE ("Binding to the interface ifindex=%d\n", eth->ifr.ifr_ifindex); |
memset(&sll, 0xff, sizeof(sll)); |
sll.sll_family = AF_PACKET; /* allways AF_PACKET */ |
sll.sll_protocol = htons(ETH_P_ALL); |
556,12 → 560,12
} |
|
/* first, flush all received packets. */ |
debug (3, "Flush"); |
TRACE ("Flush"); |
do { |
fd_set fds; |
struct timeval t; |
|
debug( 3, "."); |
TRACE( "."); |
FD_ZERO(&fds); |
FD_SET(eth->rtx_sock, &fds); |
memset(&t, 0, sizeof(t)); |
569,7 → 573,7
if (j > 0) |
recv(eth->rtx_sock, eth->rx_buff, j, 0); |
} while (j); |
debug (3, "\n"); |
TRACE ("\n"); |
|
break; |
#else /* HAVE_ETH_PHY */ |
768,10 → 772,10
|
which = id - eth->base_vapi_id; |
|
debug( 5, "ETH: id %08lx, data %08lx\n", id, data ); |
TRACE( "ETH: id %08lx, data %08lx\n", id, data ); |
|
if ( !eth ) { |
debug( 1, "ETH: VAPI ID %08lx is not ours!\n", id ); |
TRACE( "ETH: VAPI ID %08lx is not ours!\n", id ); |
return; |
} |
|
/trunk/or1ksim/support/dbchs.h
25,4 → 25,5
DECLARE_DEBUG_CHANNEL(pic) |
DECLARE_DEBUG_CHANNEL(tick) |
DECLARE_DEBUG_CHANNEL(uart) |
DECLARE_DEBUG_CHANNEL(eth) |
DECLARE_DEBUG_CHANNEL(config) |