16f3fbe4eSDmitry Fleytman /* 26f3fbe4eSDmitry Fleytman * Core code for QEMU e1000e emulation 36f3fbe4eSDmitry Fleytman * 46f3fbe4eSDmitry Fleytman * Software developer's manuals: 56f3fbe4eSDmitry Fleytman * http://www.intel.com/content/dam/doc/datasheet/82574l-gbe-controller-datasheet.pdf 66f3fbe4eSDmitry Fleytman * 76f3fbe4eSDmitry Fleytman * Copyright (c) 2015 Ravello Systems LTD (http://ravellosystems.com) 86f3fbe4eSDmitry Fleytman * Developed by Daynix Computing LTD (http://www.daynix.com) 96f3fbe4eSDmitry Fleytman * 106f3fbe4eSDmitry Fleytman * Authors: 116f3fbe4eSDmitry Fleytman * Dmitry Fleytman <dmitry@daynix.com> 126f3fbe4eSDmitry Fleytman * Leonid Bloch <leonid@daynix.com> 136f3fbe4eSDmitry Fleytman * Yan Vugenfirer <yan@daynix.com> 146f3fbe4eSDmitry Fleytman * 156f3fbe4eSDmitry Fleytman * Based on work done by: 166f3fbe4eSDmitry Fleytman * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc. 176f3fbe4eSDmitry Fleytman * Copyright (c) 2008 Qumranet 186f3fbe4eSDmitry Fleytman * Based on work done by: 196f3fbe4eSDmitry Fleytman * Copyright (c) 2007 Dan Aloni 206f3fbe4eSDmitry Fleytman * Copyright (c) 2004 Antony T Curtis 216f3fbe4eSDmitry Fleytman * 226f3fbe4eSDmitry Fleytman * This library is free software; you can redistribute it and/or 236f3fbe4eSDmitry Fleytman * modify it under the terms of the GNU Lesser General Public 246f3fbe4eSDmitry Fleytman * License as published by the Free Software Foundation; either 257cd2a9faSChetan Pant * version 2.1 of the License, or (at your option) any later version. 266f3fbe4eSDmitry Fleytman * 276f3fbe4eSDmitry Fleytman * This library is distributed in the hope that it will be useful, 286f3fbe4eSDmitry Fleytman * but WITHOUT ANY WARRANTY; without even the implied warranty of 296f3fbe4eSDmitry Fleytman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 306f3fbe4eSDmitry Fleytman * Lesser General Public License for more details. 316f3fbe4eSDmitry Fleytman * 326f3fbe4eSDmitry Fleytman * You should have received a copy of the GNU Lesser General Public 336f3fbe4eSDmitry Fleytman * License along with this library; if not, see <http://www.gnu.org/licenses/>. 346f3fbe4eSDmitry Fleytman */ 356f3fbe4eSDmitry Fleytman 36f91005e1SMarkus Armbruster #ifndef HW_NET_E1000E_CORE_H 37f91005e1SMarkus Armbruster #define HW_NET_E1000E_CORE_H 38f91005e1SMarkus Armbruster 396f3fbe4eSDmitry Fleytman #define E1000E_PHY_PAGE_SIZE (0x20) 406f3fbe4eSDmitry Fleytman #define E1000E_PHY_PAGES (0x07) 416f3fbe4eSDmitry Fleytman #define E1000E_MAC_SIZE (0x8000) 426f3fbe4eSDmitry Fleytman #define E1000E_EEPROM_SIZE (64) 436f3fbe4eSDmitry Fleytman #define E1000E_MSIX_VEC_NUM (5) 446f3fbe4eSDmitry Fleytman #define E1000E_NUM_QUEUES (2) 456f3fbe4eSDmitry Fleytman 466f3fbe4eSDmitry Fleytman typedef struct E1000Core E1000ECore; 476f3fbe4eSDmitry Fleytman 486f3fbe4eSDmitry Fleytman enum { PHY_R = BIT(0), 496f3fbe4eSDmitry Fleytman PHY_W = BIT(1), 506f3fbe4eSDmitry Fleytman PHY_RW = PHY_R | PHY_W, 516f3fbe4eSDmitry Fleytman PHY_ANYPAGE = BIT(2) }; 526f3fbe4eSDmitry Fleytman 536f3fbe4eSDmitry Fleytman typedef struct E1000IntrDelayTimer_st { 546f3fbe4eSDmitry Fleytman QEMUTimer *timer; 556f3fbe4eSDmitry Fleytman bool running; 566f3fbe4eSDmitry Fleytman uint32_t delay_reg; 576f3fbe4eSDmitry Fleytman uint32_t delay_resolution_ns; 586f3fbe4eSDmitry Fleytman E1000ECore *core; 596f3fbe4eSDmitry Fleytman } E1000IntrDelayTimer; 606f3fbe4eSDmitry Fleytman 616f3fbe4eSDmitry Fleytman struct E1000Core { 626f3fbe4eSDmitry Fleytman uint32_t mac[E1000E_MAC_SIZE]; 636f3fbe4eSDmitry Fleytman uint16_t phy[E1000E_PHY_PAGES][E1000E_PHY_PAGE_SIZE]; 646f3fbe4eSDmitry Fleytman uint16_t eeprom[E1000E_EEPROM_SIZE]; 656f3fbe4eSDmitry Fleytman 666f3fbe4eSDmitry Fleytman uint32_t rxbuf_sizes[E1000_PSRCTL_BUFFS_PER_DESC]; 676f3fbe4eSDmitry Fleytman uint32_t rx_desc_buf_size; 686f3fbe4eSDmitry Fleytman uint32_t rxbuf_min_shift; 696f3fbe4eSDmitry Fleytman uint8_t rx_desc_len; 706f3fbe4eSDmitry Fleytman 716f3fbe4eSDmitry Fleytman QEMUTimer *autoneg_timer; 726f3fbe4eSDmitry Fleytman 736f3fbe4eSDmitry Fleytman struct e1000e_tx { 746f3fbe4eSDmitry Fleytman e1000x_txd_props props; 756f3fbe4eSDmitry Fleytman 766f3fbe4eSDmitry Fleytman bool skip_cp; 777d08c73eSEd Swierk via Qemu-devel unsigned char sum_needed; 787d08c73eSEd Swierk via Qemu-devel bool cptse; 796f3fbe4eSDmitry Fleytman struct NetTxPkt *tx_pkt; 806f3fbe4eSDmitry Fleytman } tx[E1000E_NUM_QUEUES]; 816f3fbe4eSDmitry Fleytman 826f3fbe4eSDmitry Fleytman struct NetRxPkt *rx_pkt; 836f3fbe4eSDmitry Fleytman 846f3fbe4eSDmitry Fleytman bool has_vnet; 856f3fbe4eSDmitry Fleytman int max_queue_num; 866f3fbe4eSDmitry Fleytman 876f3fbe4eSDmitry Fleytman /* Interrupt moderation management */ 886f3fbe4eSDmitry Fleytman uint32_t delayed_causes; 896f3fbe4eSDmitry Fleytman 906f3fbe4eSDmitry Fleytman E1000IntrDelayTimer radv; 916f3fbe4eSDmitry Fleytman E1000IntrDelayTimer rdtr; 926f3fbe4eSDmitry Fleytman E1000IntrDelayTimer raid; 936f3fbe4eSDmitry Fleytman 946f3fbe4eSDmitry Fleytman E1000IntrDelayTimer tadv; 956f3fbe4eSDmitry Fleytman E1000IntrDelayTimer tidv; 966f3fbe4eSDmitry Fleytman 976f3fbe4eSDmitry Fleytman E1000IntrDelayTimer itr; 986f3fbe4eSDmitry Fleytman 996f3fbe4eSDmitry Fleytman E1000IntrDelayTimer eitr[E1000E_MSIX_VEC_NUM]; 1006f3fbe4eSDmitry Fleytman 1016f3fbe4eSDmitry Fleytman uint32_t itr_guest_value; 1026f3fbe4eSDmitry Fleytman uint32_t eitr_guest_value[E1000E_MSIX_VEC_NUM]; 1036f3fbe4eSDmitry Fleytman 1046f3fbe4eSDmitry Fleytman uint16_t vet; 1056f3fbe4eSDmitry Fleytman 1066f3fbe4eSDmitry Fleytman uint8_t permanent_mac[ETH_ALEN]; 1076f3fbe4eSDmitry Fleytman 1086f3fbe4eSDmitry Fleytman NICState *owner_nic; 1096f3fbe4eSDmitry Fleytman PCIDevice *owner; 1106f3fbe4eSDmitry Fleytman void (*owner_start_recv)(PCIDevice *d); 1114712c158SJan Kiszka 112*5fb7d149SAkihiko Odaki int64_t timadj; 1136f3fbe4eSDmitry Fleytman }; 1146f3fbe4eSDmitry Fleytman 1156f3fbe4eSDmitry Fleytman void 1166f3fbe4eSDmitry Fleytman e1000e_core_write(E1000ECore *core, hwaddr addr, uint64_t val, unsigned size); 1176f3fbe4eSDmitry Fleytman 1186f3fbe4eSDmitry Fleytman uint64_t 1196f3fbe4eSDmitry Fleytman e1000e_core_read(E1000ECore *core, hwaddr addr, unsigned size); 1206f3fbe4eSDmitry Fleytman 1216f3fbe4eSDmitry Fleytman void 1226f3fbe4eSDmitry Fleytman e1000e_core_pci_realize(E1000ECore *regs, 1236f3fbe4eSDmitry Fleytman const uint16_t *eeprom_templ, 1246f3fbe4eSDmitry Fleytman uint32_t eeprom_size, 1256f3fbe4eSDmitry Fleytman const uint8_t *macaddr); 1266f3fbe4eSDmitry Fleytman 1276f3fbe4eSDmitry Fleytman void 1286f3fbe4eSDmitry Fleytman e1000e_core_reset(E1000ECore *core); 1296f3fbe4eSDmitry Fleytman 1306f3fbe4eSDmitry Fleytman void 1316f3fbe4eSDmitry Fleytman e1000e_core_pre_save(E1000ECore *core); 1326f3fbe4eSDmitry Fleytman 1336f3fbe4eSDmitry Fleytman int 1346f3fbe4eSDmitry Fleytman e1000e_core_post_load(E1000ECore *core); 1356f3fbe4eSDmitry Fleytman 1366f3fbe4eSDmitry Fleytman void 1376f3fbe4eSDmitry Fleytman e1000e_core_set_link_status(E1000ECore *core); 1386f3fbe4eSDmitry Fleytman 1396f3fbe4eSDmitry Fleytman void 1406f3fbe4eSDmitry Fleytman e1000e_core_pci_uninit(E1000ECore *core); 1416f3fbe4eSDmitry Fleytman 142205ce567SPhilippe Mathieu-Daudé bool 1436f3fbe4eSDmitry Fleytman e1000e_can_receive(E1000ECore *core); 1446f3fbe4eSDmitry Fleytman 1456f3fbe4eSDmitry Fleytman ssize_t 1466f3fbe4eSDmitry Fleytman e1000e_receive(E1000ECore *core, const uint8_t *buf, size_t size); 1476f3fbe4eSDmitry Fleytman 1486f3fbe4eSDmitry Fleytman ssize_t 1496f3fbe4eSDmitry Fleytman e1000e_receive_iov(E1000ECore *core, const struct iovec *iov, int iovcnt); 1506ee0e20bSDmitry Fleytman 1516ee0e20bSDmitry Fleytman void 1526ee0e20bSDmitry Fleytman e1000e_start_recv(E1000ECore *core); 153f91005e1SMarkus Armbruster 154f91005e1SMarkus Armbruster #endif 155