Commit aa25cf469485e41305425674e8e65f3c60874ef7
1 parent
875cdcf6
ETRAX-FS: Drop DMA polling for ethernet.
* Drop DMA poll mode. Instead immediately push rx frames straight into the DMA without waiting for DMA_run to poll them of the fifo. Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5520 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
4 additions
and
46 deletions
hw/etraxfs_eth.c
| ... | ... | @@ -322,10 +322,6 @@ struct fs_eth |
| 322 | 322 | uint8_t macaddr[2][6]; |
| 323 | 323 | uint32_t regs[FS_ETH_MAX_REGS]; |
| 324 | 324 | |
| 325 | - unsigned char rx_fifo[1536]; | |
| 326 | - int rx_fifo_len; | |
| 327 | - int rx_fifo_pos; | |
| 328 | - | |
| 329 | 325 | struct etraxfs_dma_client *dma_out; |
| 330 | 326 | struct etraxfs_dma_client *dma_in; |
| 331 | 327 | |
| ... | ... | @@ -523,15 +519,7 @@ static int eth_match_groupaddr(struct fs_eth *eth, const unsigned char *sa) |
| 523 | 519 | |
| 524 | 520 | static int eth_can_receive(void *opaque) |
| 525 | 521 | { |
| 526 | - struct fs_eth *eth = opaque; | |
| 527 | - int r; | |
| 528 | - | |
| 529 | - r = eth->rx_fifo_len == 0; | |
| 530 | - if (!r) { | |
| 531 | - /* TODO: signal fifo overrun. */ | |
| 532 | - printf("PACKET LOSS!\n"); | |
| 533 | - } | |
| 534 | - return r; | |
| 522 | + return 1; | |
| 535 | 523 | } |
| 536 | 524 | |
| 537 | 525 | static void eth_receive(void *opaque, const uint8_t *buf, int size) |
| ... | ... | @@ -556,38 +544,8 @@ static void eth_receive(void *opaque, const uint8_t *buf, int size) |
| 556 | 544 | && !eth_match_groupaddr(eth, buf)) |
| 557 | 545 | return; |
| 558 | 546 | |
| 559 | - if (size > sizeof(eth->rx_fifo)) { | |
| 560 | - /* TODO: signal error. */ | |
| 561 | - } else if (eth->rx_fifo_len) { | |
| 562 | - /* FIFO overrun. */ | |
| 563 | - } else { | |
| 564 | - memcpy(eth->rx_fifo, buf, size); | |
| 565 | - /* +4, HW passes the CRC to sw. */ | |
| 566 | - eth->rx_fifo_len = size + 4; | |
| 567 | - eth->rx_fifo_pos = 0; | |
| 568 | - } | |
| 569 | -} | |
| 570 | - | |
| 571 | -static void eth_rx_pull(void *opaque) | |
| 572 | -{ | |
| 573 | - struct fs_eth *eth = opaque; | |
| 574 | - int len; | |
| 575 | - if (eth->rx_fifo_len) { | |
| 576 | - D(printf("%s %d\n", __func__, eth->rx_fifo_len)); | |
| 577 | -#if 0 | |
| 578 | - { | |
| 579 | - int i; | |
| 580 | - for (i = 0; i < 32; i++) | |
| 581 | - printf("%2.2x", eth->rx_fifo[i]); | |
| 582 | - printf("\n"); | |
| 583 | - } | |
| 584 | -#endif | |
| 585 | - len = etraxfs_dmac_input(eth->dma_in, | |
| 586 | - eth->rx_fifo + eth->rx_fifo_pos, | |
| 587 | - eth->rx_fifo_len, 1); | |
| 588 | - eth->rx_fifo_len -= len; | |
| 589 | - eth->rx_fifo_pos += len; | |
| 590 | - } | |
| 547 | + /* FIXME: Find another way to pass on the fake csum. */ | |
| 548 | + etraxfs_dmac_input(eth->dma_in, (void *)buf, size + 4, 1); | |
| 591 | 549 | } |
| 592 | 550 | |
| 593 | 551 | static int eth_tx_push(void *opaque, unsigned char *buf, int len) |
| ... | ... | @@ -628,7 +586,7 @@ void *etraxfs_eth_init(NICInfo *nd, CPUState *env, |
| 628 | 586 | dma[0].client.push = eth_tx_push; |
| 629 | 587 | dma[0].client.opaque = eth; |
| 630 | 588 | dma[1].client.opaque = eth; |
| 631 | - dma[1].client.pull = eth_rx_pull; | |
| 589 | + dma[1].client.pull = NULL; | |
| 632 | 590 | |
| 633 | 591 | eth->env = env; |
| 634 | 592 | eth->base = base; | ... | ... |