OpenCores
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)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.