Line 74... |
Line 74... |
switch (eth->tx.state) {
|
switch (eth->tx.state) {
|
case ETH_TXSTATE_IDLE:
|
case ETH_TXSTATE_IDLE:
|
if ( TEST_FLAG( eth->regs.moder, ETH_MODER, TXEN ) ) {
|
if ( TEST_FLAG( eth->regs.moder, ETH_MODER, TXEN ) ) {
|
|
|
/* wait for TxBuffer to be ready */
|
/* wait for TxBuffer to be ready */
|
debug (3, "TX - entering state WAIT4BD\n");
|
debug (3, "TX - entering state WAIT4BD (%d)\n", eth->tx.bd_index);
|
eth->tx.state = ETH_TXSTATE_WAIT4BD;
|
eth->tx.state = ETH_TXSTATE_WAIT4BD;
|
}
|
}
|
break;
|
break;
|
case ETH_TXSTATE_WAIT4BD:
|
case ETH_TXSTATE_WAIT4BD:
|
/* Read buffer descriptor */
|
/* Read buffer descriptor */
|
Line 236... |
Line 236... |
fd_set rfds;
|
fd_set rfds;
|
|
|
switch (eth->rx.state) {
|
switch (eth->rx.state) {
|
case ETH_RXSTATE_IDLE:
|
case ETH_RXSTATE_IDLE:
|
if ( TEST_FLAG( eth->regs.moder, ETH_MODER, RXEN) ) {
|
if ( TEST_FLAG( eth->regs.moder, ETH_MODER, RXEN) ) {
|
debug (3, "RX - entering state WAIT4BD\n");
|
debug (3, "RX - entering state WAIT4BD (%d)\n", eth->rx.bd_index);
|
eth->rx.state = ETH_RXSTATE_WAIT4BD;
|
eth->rx.state = ETH_RXSTATE_WAIT4BD;
|
}
|
}
|
break;
|
break;
|
|
|
case ETH_RXSTATE_WAIT4BD:
|
case ETH_RXSTATE_WAIT4BD:
|
Line 269... |
Line 269... |
eth->rx.offset = 0;
|
eth->rx.offset = 0;
|
}
|
}
|
debug (3, "RX - entering state RECV\n");
|
debug (3, "RX - entering state RECV\n");
|
eth->rx.state = ETH_RXSTATE_RECV;
|
eth->rx.state = ETH_RXSTATE_RECV;
|
}
|
}
|
|
else if (!TEST_FLAG( eth->regs.moder, ETH_MODER, RXEN)) {
|
|
debug (3, "RX - entering state IDLE\n");
|
|
eth->rx.state = ETH_RXSTATE_IDLE;
|
|
}
|
else {
|
else {
|
nread = recv(eth->rtx_sock, eth->rx_buff, ETH_MAXPL, MSG_PEEK);
|
nread = recv(eth->rtx_sock, eth->rx_buff, ETH_MAXPL, MSG_PEEK | MSG_DONTWAIT);
|
if (nread > 0) {
|
if (nread > 0) {
|
SET_FLAG (eth->regs.int_source, ETH_INT_SOURCE, BUSY);
|
SET_FLAG (eth->regs.int_source, ETH_INT_SOURCE, BUSY);
|
|
report_interrupt(eth->mac_int);
|
}
|
}
|
}
|
}
|
break;
|
break;
|
|
|
case ETH_RXSTATE_RECV:
|
case ETH_RXSTATE_RECV:
|
Line 345... |
Line 350... |
eth->rx.bytes_read += 4;
|
eth->rx.bytes_read += 4;
|
if ( eth->rx.bytes_left <= 0 ) {
|
if ( eth->rx.bytes_left <= 0 ) {
|
/* Write result to bd */
|
/* Write result to bd */
|
SET_FIELD( eth->rx.bd, ETH_RX_BD, LENGTH, eth->rx.packet_length );
|
SET_FIELD( eth->rx.bd, ETH_RX_BD, LENGTH, eth->rx.packet_length );
|
CLEAR_FLAG( eth->rx.bd, ETH_RX_BD, READY);
|
CLEAR_FLAG( eth->rx.bd, ETH_RX_BD, READY);
|
SET_FLAG( eth->regs.int_source, ETH_INT_SOURCE, RXF);
|
SET_FLAG( eth->regs.int_source, ETH_INT_SOURCE, RXB);
|
|
|
if ( eth->rx.packet_length < GET_FIELD( eth->regs.packetlen, ETH_PACKETLEN, MINFL ) )
|
if ( eth->rx.packet_length < GET_FIELD( eth->regs.packetlen, ETH_PACKETLEN, MINFL ) )
|
SET_FLAG( eth->rx.bd, ETH_RX_BD, TOOBIG);
|
SET_FLAG( eth->rx.bd, ETH_RX_BD, TOOBIG);
|
if ( eth->rx.packet_length > GET_FIELD( eth->regs.packetlen, ETH_PACKETLEN, MAXFL ) )
|
if ( eth->rx.packet_length > GET_FIELD( eth->regs.packetlen, ETH_PACKETLEN, MAXFL ) )
|
SET_FLAG( eth->rx.bd, ETH_RX_BD, TOOSHORT);
|
SET_FLAG( eth->rx.bd, ETH_RX_BD, TOOSHORT);
|
|
|
eth->regs.bd_ram[eth->rx.bd_index] = eth->rx.bd;
|
eth->regs.bd_ram[eth->rx.bd_index] = eth->rx.bd;
|
|
|
/* advance to next BD */
|
/* advance to next BD */
|
if ( TEST_FLAG( eth->rx.bd, ETH_RX_BD, WRAP ) || eth->rx.bd_index >= ETH_BD_COUNT )
|
if ( TEST_FLAG( eth->rx.bd, ETH_RX_BD, WRAP ) || eth->rx.bd_index >= ETH_BD_COUNT )
|
eth->tx.bd_index = eth->regs.tx_bd_num;
|
eth->rx.bd_index = eth->regs.tx_bd_num;
|
else
|
else
|
eth->tx.bd_index += 2;
|
eth->rx.bd_index += 2;
|
|
|
if ( TEST_FLAG(eth->regs.int_mask, ETH_INT_MASK, RXF_M) ) {
|
if ( TEST_FLAG(eth->regs.int_mask, ETH_INT_MASK, RXB_M) ) {
|
report_interrupt( eth->mac_int );
|
report_interrupt( eth->mac_int );
|
}
|
}
|
|
|
/* ready to receive next packet */
|
/* ready to receive next packet */
|
debug (3, "RX - entering state IDLE\n");
|
debug (3, "RX - entering state IDLE\n");
|