--- a/src/drivers/net/realtek.c +++ b/src/drivers/net/realtek.c @@ -565,6 +565,18 @@ } /** + * Return tx descriptor count depending on mode + */ +static int rtl_num_tx_desc(struct realtek_nic *rtl) { + return (rtl->legacy) ? 4 : RTL_NUM_TX_DESC; } + +/** + * Return rx descriptor count depending on mode + */ +static int rtl_num_rx_desc(struct realtek_nic *rtl) { + return (rtl->legacy) ? 4 : RTL_NUM_RX_DESC; } + +/** * Refill receive descriptor ring * * @v rtl Realtek device @@ -580,7 +592,7 @@ if ( rtl->legacy ) return; - while ( ( rtl->rx.prod - rtl->rx.cons ) < RTL_NUM_RX_DESC ) { + while ( ( rtl->rx.prod - rtl->rx.cons ) < rtl_num_rx_desc(rtl) ) { /* Allocate I/O buffer */ iobuf = alloc_iob ( RTL_RX_MAX_LEN ); @@ -590,8 +602,8 @@ } /* Get next receive descriptor */ - rx_idx = ( rtl->rx.prod++ % RTL_NUM_RX_DESC ); - is_last = ( rx_idx == ( RTL_NUM_RX_DESC - 1 ) ); + rx_idx = ( rtl->rx.prod++ % rtl_num_rx_desc(rtl) ); + is_last = ( rx_idx == ( rtl_num_rx_desc(rtl) - 1 ) ); rx = &rtl->rx.desc[rx_idx]; /* Populate receive descriptor */ @@ -697,7 +709,7 @@ realtek_destroy_ring ( rtl, &rtl->rx ); /* Discard any unused receive buffers */ - for ( i = 0 ; i < RTL_NUM_RX_DESC ; i++ ) { + for ( i = 0 ; i < rtl_num_rx_desc(rtl) ; i++ ) { if ( rtl->rx_iobuf[i] ) free_iob ( rtl->rx_iobuf[i] ); rtl->rx_iobuf[i] = NULL; @@ -723,11 +735,11 @@ int is_last; /* Get next transmit descriptor */ - if ( ( rtl->tx.prod - rtl->tx.cons ) >= RTL_NUM_TX_DESC ) { + if ( ( rtl->tx.prod - rtl->tx.cons ) >= rtl_num_tx_desc(rtl) ) { netdev_tx_defer ( netdev, iobuf ); return 0; } - tx_idx = ( rtl->tx.prod++ % RTL_NUM_TX_DESC ); + tx_idx = ( rtl->tx.prod++ % rtl_num_tx_desc(rtl) ); /* Transmit packet */ if ( rtl->legacy ) { @@ -752,7 +764,7 @@ /* Populate transmit descriptor */ address = virt_to_bus ( iobuf->data ); - is_last = ( tx_idx == ( RTL_NUM_TX_DESC - 1 ) ); + is_last = ( tx_idx == ( rtl_num_tx_desc(rtl) - 1 ) ); tx = &rtl->tx.desc[tx_idx]; tx->address = cpu_to_le64 ( address ); tx->length = cpu_to_le16 ( iob_len ( iobuf ) ); @@ -788,7 +800,7 @@ while ( rtl->tx.cons != rtl->tx.prod ) { /* Get next transmit descriptor */ - tx_idx = ( rtl->tx.cons % RTL_NUM_TX_DESC ); + tx_idx = ( rtl->tx.cons % rtl_num_tx_desc(rtl) ); /* Stop if descriptor is still in use */ if ( rtl->legacy ) { @@ -892,7 +904,7 @@ while ( rtl->rx.cons != rtl->rx.prod ) { /* Get next receive descriptor */ - rx_idx = ( rtl->rx.cons % RTL_NUM_RX_DESC ); + rx_idx = ( rtl->rx.cons % rtl_num_rx_desc(rtl) ); rx = &rtl->rx.desc[rx_idx]; /* Stop if descriptor is still in use */ --- a/src/drivers/net/realtek.h +++ b/src/drivers/net/realtek.h @@ -88,9 +88,9 @@ /** Number of transmit descriptors * - * This is a hardware limit when using legacy mode. + * 4 is a hardware limit when using legacy mode. */ -#define RTL_NUM_TX_DESC 4 +#define RTL_NUM_TX_DESC 64 /** Receive Buffer Start Address (dword, 8139 only) */ #define RTL_RBSTART 0x30 @@ -223,7 +223,7 @@ #define RTL_RDSAR 0xe4 /** Number of receive descriptors */ -#define RTL_NUM_RX_DESC 4 +#define RTL_NUM_RX_DESC 64 /** Receive buffer length */ #define RTL_RX_MAX_LEN ( ETH_FRAME_LEN + 4 /* VLAN */ + 4 /* CRC */ )