OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_43/] [or1ksim/] [peripheral/] [eth.c] - Diff between revs 702 and 705

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 702 Rev 705
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");

powered by: WebSVN 2.1.0

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