improve the performance by using the "wrap modus"

=> http://wiki.osdev.org/RTL8139
This commit is contained in:
Stefan Lankes 2011-09-17 08:41:33 +02:00
parent e5ac848901
commit e0e3a4fd82

View file

@ -170,12 +170,11 @@ static void rtl_rx_inthandler(struct netif* netif)
#if ETH_PAD_SIZE
pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endif
for (q=p; q!=NULL; q=q->next) {
for(i=0; i<q->len; i++) {
((uint8_t*) q->payload)[i] = rtl8139if->rx_buffer[rtl8139if->rx_pos];
rtl8139if->rx_pos = (rtl8139if->rx_pos + 1) % RX_BUF_LEN;
}
for (q=p, i=0; q!=NULL; q=q->next) {
memcpy((uint8_t*) q->payload + i, rtl8139if->rx_buffer + rtl8139if->rx_pos + i, q->len);
i += q->len;
}
rtl8139if->rx_pos = (rtl8139if->rx_pos + p->tot_len) % RX_BUF_LEN;
#if ETH_PAD_SIZE
pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endif
@ -290,7 +289,7 @@ err_t rtl8139if_init(struct netif* netif)
memset(rtl8139if, 0, sizeof(rtl1839if_t));
/* allocate the receive buffer */
rtl8139if->rx_buffer = mem_allocation(RX_BUF_LEN/*+16*/, MAP_KERNEL_SPACE|MAP_NO_CACHE);
rtl8139if->rx_buffer = mem_allocation(RX_BUF_LEN + 1500 /*MTU*/ + 16 /* header size */, MAP_KERNEL_SPACE|MAP_NO_CACHE);
if (!(rtl8139if->rx_buffer)) {
LWIP_DEBUGF(NETIF_DEBUG, ("rtl8139if_init: out of memory\n"));
kfree(rtl8139if, sizeof(rtl1839if_t));
@ -388,7 +387,7 @@ err_t rtl8139if_init(struct netif* netif)
* APM - Accept Physical Match: Accept packets send to NIC's MAC address.
* AAP - Accept All Packets. Accept all packets (run in promiscuous mode).
*/
outportl(rtl8139if->iobase + RCR, RCR_MXDMA2|RCR_MXDMA1|RCR_MXDMA0|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); // The WRAP bit isn't set
outportl(rtl8139if->iobase + RCR, RCR_MXDMA2|RCR_MXDMA1|RCR_WRAP|RCR_MXDMA0|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); // The WRAP bit is set!
// set the transmit config register to
// be the normal interframe gap time