e1000e_core.h (4028B)
1/* 2* Core code for QEMU e1000e emulation 3* 4* Software developer's manuals: 5* http://www.intel.com/content/dam/doc/datasheet/82574l-gbe-controller-datasheet.pdf 6* 7* Copyright (c) 2015 Ravello Systems LTD (http://ravellosystems.com) 8* Developed by Daynix Computing LTD (http://www.daynix.com) 9* 10* Authors: 11* Dmitry Fleytman <dmitry@daynix.com> 12* Leonid Bloch <leonid@daynix.com> 13* Yan Vugenfirer <yan@daynix.com> 14* 15* Based on work done by: 16* Nir Peleg, Tutis Systems Ltd. for Qumranet Inc. 17* Copyright (c) 2008 Qumranet 18* Based on work done by: 19* Copyright (c) 2007 Dan Aloni 20* Copyright (c) 2004 Antony T Curtis 21* 22* This library is free software; you can redistribute it and/or 23* modify it under the terms of the GNU Lesser General Public 24* License as published by the Free Software Foundation; either 25* version 2.1 of the License, or (at your option) any later version. 26* 27* This library is distributed in the hope that it will be useful, 28* but WITHOUT ANY WARRANTY; without even the implied warranty of 29* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 30* Lesser General Public License for more details. 31* 32* You should have received a copy of the GNU Lesser General Public 33* License along with this library; if not, see <http://www.gnu.org/licenses/>. 34*/ 35 36#ifndef HW_NET_E1000E_CORE_H 37#define HW_NET_E1000E_CORE_H 38 39#define E1000E_PHY_PAGE_SIZE (0x20) 40#define E1000E_PHY_PAGES (0x07) 41#define E1000E_MAC_SIZE (0x8000) 42#define E1000E_EEPROM_SIZE (64) 43#define E1000E_MSIX_VEC_NUM (5) 44#define E1000E_NUM_QUEUES (2) 45 46typedef struct E1000Core E1000ECore; 47 48enum { PHY_R = BIT(0), 49 PHY_W = BIT(1), 50 PHY_RW = PHY_R | PHY_W, 51 PHY_ANYPAGE = BIT(2) }; 52 53typedef struct E1000IntrDelayTimer_st { 54 QEMUTimer *timer; 55 bool running; 56 uint32_t delay_reg; 57 uint32_t delay_resolution_ns; 58 E1000ECore *core; 59} E1000IntrDelayTimer; 60 61struct E1000Core { 62 uint32_t mac[E1000E_MAC_SIZE]; 63 uint16_t phy[E1000E_PHY_PAGES][E1000E_PHY_PAGE_SIZE]; 64 uint16_t eeprom[E1000E_EEPROM_SIZE]; 65 66 uint32_t rxbuf_sizes[E1000_PSRCTL_BUFFS_PER_DESC]; 67 uint32_t rx_desc_buf_size; 68 uint32_t rxbuf_min_shift; 69 uint8_t rx_desc_len; 70 71 QEMUTimer *autoneg_timer; 72 73 struct e1000e_tx { 74 e1000x_txd_props props; 75 76 bool skip_cp; 77 unsigned char sum_needed; 78 bool cptse; 79 struct NetTxPkt *tx_pkt; 80 } tx[E1000E_NUM_QUEUES]; 81 82 struct NetRxPkt *rx_pkt; 83 84 bool has_vnet; 85 int max_queue_num; 86 87 /* Interrupt moderation management */ 88 uint32_t delayed_causes; 89 90 E1000IntrDelayTimer radv; 91 E1000IntrDelayTimer rdtr; 92 E1000IntrDelayTimer raid; 93 94 E1000IntrDelayTimer tadv; 95 E1000IntrDelayTimer tidv; 96 97 E1000IntrDelayTimer itr; 98 bool itr_intr_pending; 99 100 E1000IntrDelayTimer eitr[E1000E_MSIX_VEC_NUM]; 101 bool eitr_intr_pending[E1000E_MSIX_VEC_NUM]; 102 103 VMChangeStateEntry *vmstate; 104 105 uint32_t itr_guest_value; 106 uint32_t eitr_guest_value[E1000E_MSIX_VEC_NUM]; 107 108 uint16_t vet; 109 110 uint8_t permanent_mac[ETH_ALEN]; 111 112 NICState *owner_nic; 113 PCIDevice *owner; 114 void (*owner_start_recv)(PCIDevice *d); 115 116 uint32_t msi_causes_pending; 117}; 118 119void 120e1000e_core_write(E1000ECore *core, hwaddr addr, uint64_t val, unsigned size); 121 122uint64_t 123e1000e_core_read(E1000ECore *core, hwaddr addr, unsigned size); 124 125void 126e1000e_core_pci_realize(E1000ECore *regs, 127 const uint16_t *eeprom_templ, 128 uint32_t eeprom_size, 129 const uint8_t *macaddr); 130 131void 132e1000e_core_reset(E1000ECore *core); 133 134void 135e1000e_core_pre_save(E1000ECore *core); 136 137int 138e1000e_core_post_load(E1000ECore *core); 139 140void 141e1000e_core_set_link_status(E1000ECore *core); 142 143void 144e1000e_core_pci_uninit(E1000ECore *core); 145 146bool 147e1000e_can_receive(E1000ECore *core); 148 149ssize_t 150e1000e_receive(E1000ECore *core, const uint8_t *buf, size_t size); 151 152ssize_t 153e1000e_receive_iov(E1000ECore *core, const struct iovec *iov, int iovcnt); 154 155void 156e1000e_start_recv(E1000ECore *core); 157 158#endif