e1000.c (daf6b59be8c703264765a533bc63421caef95225) | e1000.c (1001cf45a7ca22d990e19a81029319ca763cad4f) |
---|---|
1/* 2 * QEMU e1000 emulation 3 * 4 * Software developer's manual: 5 * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf 6 * 7 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc. 8 * Copyright (c) 2008 Qumranet --- 22 unchanged lines hidden (view full) --- 31#include "net/net.h" 32#include "net/checksum.h" 33#include "sysemu/sysemu.h" 34#include "sysemu/dma.h" 35#include "qemu/iov.h" 36#include "qemu/range.h" 37 38#include "e1000x_common.h" | 1/* 2 * QEMU e1000 emulation 3 * 4 * Software developer's manual: 5 * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf 6 * 7 * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc. 8 * Copyright (c) 2008 Qumranet --- 22 unchanged lines hidden (view full) --- 31#include "net/net.h" 32#include "net/checksum.h" 33#include "sysemu/sysemu.h" 34#include "sysemu/dma.h" 35#include "qemu/iov.h" 36#include "qemu/range.h" 37 38#include "e1000x_common.h" |
39#include "trace.h" |
|
39 40static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 41 42/* #define E1000_DEBUG */ 43 44#ifdef E1000_DEBUG 45enum { 46 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT, --- 795 unchanged lines hidden (view full) --- 842static uint64_t rx_desc_base(E1000State *s) 843{ 844 uint64_t bah = s->mac_reg[RDBAH]; 845 uint64_t bal = s->mac_reg[RDBAL] & ~0xf; 846 847 return (bah << 32) + bal; 848} 849 | 40 41static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 42 43/* #define E1000_DEBUG */ 44 45#ifdef E1000_DEBUG 46enum { 47 DEBUG_GENERAL, DEBUG_IO, DEBUG_MMIO, DEBUG_INTERRUPT, --- 795 unchanged lines hidden (view full) --- 843static uint64_t rx_desc_base(E1000State *s) 844{ 845 uint64_t bah = s->mac_reg[RDBAH]; 846 uint64_t bal = s->mac_reg[RDBAL] & ~0xf; 847 848 return (bah << 32) + bal; 849} 850 |
851static void 852e1000_receiver_overrun(E1000State *s, size_t size) 853{ 854 trace_e1000_receiver_overrun(size, s->mac_reg[RDH], s->mac_reg[RDT]); 855 e1000x_inc_reg_if_not_full(s->mac_reg, RNBC); 856 e1000x_inc_reg_if_not_full(s->mac_reg, MPC); 857 set_ics(s, 0, E1000_ICS_RXO); 858} 859 |
|
850static ssize_t 851e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) 852{ 853 E1000State *s = qemu_get_nic_opaque(nc); 854 PCIDevice *d = PCI_DEVICE(s); 855 struct e1000_rx_desc desc; 856 dma_addr_t base; 857 unsigned int n, rdt; --- 53 unchanged lines hidden (view full) --- 911 vlan_status = E1000_RXD_STAT_VP; 912 size -= 4; 913 } 914 915 rdh_start = s->mac_reg[RDH]; 916 desc_offset = 0; 917 total_size = size + e1000x_fcs_len(s->mac_reg); 918 if (!e1000_has_rxbufs(s, total_size)) { | 860static ssize_t 861e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt) 862{ 863 E1000State *s = qemu_get_nic_opaque(nc); 864 PCIDevice *d = PCI_DEVICE(s); 865 struct e1000_rx_desc desc; 866 dma_addr_t base; 867 unsigned int n, rdt; --- 53 unchanged lines hidden (view full) --- 921 vlan_status = E1000_RXD_STAT_VP; 922 size -= 4; 923 } 924 925 rdh_start = s->mac_reg[RDH]; 926 desc_offset = 0; 927 total_size = size + e1000x_fcs_len(s->mac_reg); 928 if (!e1000_has_rxbufs(s, total_size)) { |
919 set_ics(s, 0, E1000_ICS_RXO); 920 return -1; | 929 e1000_receiver_overrun(s, total_size); 930 return -1; |
921 } 922 do { 923 desc_size = total_size - desc_offset; 924 if (desc_size > s->rxbuf_size) { 925 desc_size = s->rxbuf_size; 926 } 927 base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH]; 928 pci_dma_read(d, base, &desc, sizeof(desc)); --- 35 unchanged lines hidden (view full) --- 964 965 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN]) 966 s->mac_reg[RDH] = 0; 967 /* see comment in start_xmit; same here */ 968 if (s->mac_reg[RDH] == rdh_start || 969 rdh_start >= s->mac_reg[RDLEN] / sizeof(desc)) { 970 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n", 971 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]); | 931 } 932 do { 933 desc_size = total_size - desc_offset; 934 if (desc_size > s->rxbuf_size) { 935 desc_size = s->rxbuf_size; 936 } 937 base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH]; 938 pci_dma_read(d, base, &desc, sizeof(desc)); --- 35 unchanged lines hidden (view full) --- 974 975 if (++s->mac_reg[RDH] * sizeof(desc) >= s->mac_reg[RDLEN]) 976 s->mac_reg[RDH] = 0; 977 /* see comment in start_xmit; same here */ 978 if (s->mac_reg[RDH] == rdh_start || 979 rdh_start >= s->mac_reg[RDLEN] / sizeof(desc)) { 980 DBGOUT(RXERR, "RDH wraparound @%x, RDT %x, RDLEN %x\n", 981 rdh_start, s->mac_reg[RDT], s->mac_reg[RDLEN]); |
972 set_ics(s, 0, E1000_ICS_RXO); | 982 e1000_receiver_overrun(s, total_size); |
973 return -1; 974 } 975 } while (desc_offset < total_size); 976 977 e1000x_update_rx_total_stats(s->mac_reg, size, total_size); 978 979 n = E1000_ICS_RXT0; 980 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH]) --- 824 unchanged lines hidden --- | 983 return -1; 984 } 985 } while (desc_offset < total_size); 986 987 e1000x_update_rx_total_stats(s->mac_reg, size, total_size); 988 989 n = E1000_ICS_RXT0; 990 if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH]) --- 824 unchanged lines hidden --- |