162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright(c) 1999 - 2006 Intel Corporation. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* Linux PRO/1000 Ethernet Driver main header file */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _E1000_H_ 762306a36Sopenharmony_ci#define _E1000_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/stddef.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci#include <asm/byteorder.h> 1362306a36Sopenharmony_ci#include <linux/mm.h> 1462306a36Sopenharmony_ci#include <linux/errno.h> 1562306a36Sopenharmony_ci#include <linux/ioport.h> 1662306a36Sopenharmony_ci#include <linux/pci.h> 1762306a36Sopenharmony_ci#include <linux/kernel.h> 1862306a36Sopenharmony_ci#include <linux/netdevice.h> 1962306a36Sopenharmony_ci#include <linux/etherdevice.h> 2062306a36Sopenharmony_ci#include <linux/skbuff.h> 2162306a36Sopenharmony_ci#include <linux/delay.h> 2262306a36Sopenharmony_ci#include <linux/timer.h> 2362306a36Sopenharmony_ci#include <linux/slab.h> 2462306a36Sopenharmony_ci#include <linux/vmalloc.h> 2562306a36Sopenharmony_ci#include <linux/interrupt.h> 2662306a36Sopenharmony_ci#include <linux/string.h> 2762306a36Sopenharmony_ci#include <linux/pagemap.h> 2862306a36Sopenharmony_ci#include <linux/dma-mapping.h> 2962306a36Sopenharmony_ci#include <linux/bitops.h> 3062306a36Sopenharmony_ci#include <asm/io.h> 3162306a36Sopenharmony_ci#include <asm/irq.h> 3262306a36Sopenharmony_ci#include <linux/capability.h> 3362306a36Sopenharmony_ci#include <linux/in.h> 3462306a36Sopenharmony_ci#include <linux/ip.h> 3562306a36Sopenharmony_ci#include <linux/ipv6.h> 3662306a36Sopenharmony_ci#include <linux/tcp.h> 3762306a36Sopenharmony_ci#include <linux/udp.h> 3862306a36Sopenharmony_ci#include <net/pkt_sched.h> 3962306a36Sopenharmony_ci#include <linux/list.h> 4062306a36Sopenharmony_ci#include <linux/reboot.h> 4162306a36Sopenharmony_ci#include <net/checksum.h> 4262306a36Sopenharmony_ci#include <linux/mii.h> 4362306a36Sopenharmony_ci#include <linux/ethtool.h> 4462306a36Sopenharmony_ci#include <linux/if_vlan.h> 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define BAR_0 0 4762306a36Sopenharmony_ci#define BAR_1 1 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\ 5062306a36Sopenharmony_ci PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct e1000_adapter; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#include "e1000_hw.h" 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define E1000_MAX_INTR 10 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* 5962306a36Sopenharmony_ci * Count for polling __E1000_RESET condition every 10-20msec. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_ci#define E1000_CHECK_RESET_COUNT 50 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* TX/RX descriptor defines */ 6462306a36Sopenharmony_ci#define E1000_DEFAULT_TXD 256 6562306a36Sopenharmony_ci#define E1000_MAX_TXD 256 6662306a36Sopenharmony_ci#define E1000_MIN_TXD 48 6762306a36Sopenharmony_ci#define E1000_MAX_82544_TXD 4096 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define E1000_DEFAULT_RXD 256 7062306a36Sopenharmony_ci#define E1000_MAX_RXD 256 7162306a36Sopenharmony_ci#define E1000_MIN_RXD 48 7262306a36Sopenharmony_ci#define E1000_MAX_82544_RXD 4096 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define E1000_MIN_ITR_USECS 10 /* 100000 irq/sec */ 7562306a36Sopenharmony_ci#define E1000_MAX_ITR_USECS 10000 /* 100 irq/sec */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* this is the size past which hardware will drop packets when setting LPE=0 */ 7862306a36Sopenharmony_ci#define MAXIMUM_ETHERNET_VLAN_SIZE 1522 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* Supported Rx Buffer Sizes */ 8162306a36Sopenharmony_ci#define E1000_RXBUFFER_128 128 /* Used for packet split */ 8262306a36Sopenharmony_ci#define E1000_RXBUFFER_256 256 /* Used for packet split */ 8362306a36Sopenharmony_ci#define E1000_RXBUFFER_512 512 8462306a36Sopenharmony_ci#define E1000_RXBUFFER_1024 1024 8562306a36Sopenharmony_ci#define E1000_RXBUFFER_2048 2048 8662306a36Sopenharmony_ci#define E1000_RXBUFFER_4096 4096 8762306a36Sopenharmony_ci#define E1000_RXBUFFER_8192 8192 8862306a36Sopenharmony_ci#define E1000_RXBUFFER_16384 16384 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* SmartSpeed delimiters */ 9162306a36Sopenharmony_ci#define E1000_SMARTSPEED_DOWNSHIFT 3 9262306a36Sopenharmony_ci#define E1000_SMARTSPEED_MAX 15 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Packet Buffer allocations */ 9562306a36Sopenharmony_ci#define E1000_PBA_BYTES_SHIFT 0xA 9662306a36Sopenharmony_ci#define E1000_TX_HEAD_ADDR_SHIFT 7 9762306a36Sopenharmony_ci#define E1000_PBA_TX_MASK 0xFFFF0000 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* Flow Control Watermarks */ 10062306a36Sopenharmony_ci#define E1000_FC_HIGH_DIFF 0x1638 /* High: 5688 bytes below Rx FIFO size */ 10162306a36Sopenharmony_ci#define E1000_FC_LOW_DIFF 0x1640 /* Low: 5696 bytes below Rx FIFO size */ 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define E1000_FC_PAUSE_TIME 0xFFFF /* pause for the max or until send xon */ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* How many Tx Descriptors do we need to call netif_wake_queue ? */ 10662306a36Sopenharmony_ci#define E1000_TX_QUEUE_WAKE 16 10762306a36Sopenharmony_ci/* How many Rx Buffers do we bundle into one write to the hardware ? */ 10862306a36Sopenharmony_ci#define E1000_RX_BUFFER_WRITE 16 /* Must be power of 2 */ 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define AUTO_ALL_MODES 0 11162306a36Sopenharmony_ci#define E1000_EEPROM_82544_APM 0x0004 11262306a36Sopenharmony_ci#define E1000_EEPROM_APME 0x0400 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#ifndef E1000_MASTER_SLAVE 11562306a36Sopenharmony_ci/* Switch to override PHY master/slave setting */ 11662306a36Sopenharmony_ci#define E1000_MASTER_SLAVE e1000_ms_hw_default 11762306a36Sopenharmony_ci#endif 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define E1000_MNG_VLAN_NONE (-1) 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* wrapper around a pointer to a socket buffer, 12262306a36Sopenharmony_ci * so a DMA handle can be stored along with the buffer 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_cistruct e1000_tx_buffer { 12562306a36Sopenharmony_ci struct sk_buff *skb; 12662306a36Sopenharmony_ci dma_addr_t dma; 12762306a36Sopenharmony_ci unsigned long time_stamp; 12862306a36Sopenharmony_ci u16 length; 12962306a36Sopenharmony_ci u16 next_to_watch; 13062306a36Sopenharmony_ci bool mapped_as_page; 13162306a36Sopenharmony_ci unsigned short segs; 13262306a36Sopenharmony_ci unsigned int bytecount; 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistruct e1000_rx_buffer { 13662306a36Sopenharmony_ci union { 13762306a36Sopenharmony_ci struct page *page; /* jumbo: alloc_page */ 13862306a36Sopenharmony_ci u8 *data; /* else, netdev_alloc_frag */ 13962306a36Sopenharmony_ci } rxbuf; 14062306a36Sopenharmony_ci dma_addr_t dma; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct e1000_tx_ring { 14462306a36Sopenharmony_ci /* pointer to the descriptor ring memory */ 14562306a36Sopenharmony_ci void *desc; 14662306a36Sopenharmony_ci /* physical address of the descriptor ring */ 14762306a36Sopenharmony_ci dma_addr_t dma; 14862306a36Sopenharmony_ci /* length of descriptor ring in bytes */ 14962306a36Sopenharmony_ci unsigned int size; 15062306a36Sopenharmony_ci /* number of descriptors in the ring */ 15162306a36Sopenharmony_ci unsigned int count; 15262306a36Sopenharmony_ci /* next descriptor to associate a buffer with */ 15362306a36Sopenharmony_ci unsigned int next_to_use; 15462306a36Sopenharmony_ci /* next descriptor to check for DD status bit */ 15562306a36Sopenharmony_ci unsigned int next_to_clean; 15662306a36Sopenharmony_ci /* array of buffer information structs */ 15762306a36Sopenharmony_ci struct e1000_tx_buffer *buffer_info; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci u16 tdh; 16062306a36Sopenharmony_ci u16 tdt; 16162306a36Sopenharmony_ci bool last_tx_tso; 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct e1000_rx_ring { 16562306a36Sopenharmony_ci /* pointer to the descriptor ring memory */ 16662306a36Sopenharmony_ci void *desc; 16762306a36Sopenharmony_ci /* physical address of the descriptor ring */ 16862306a36Sopenharmony_ci dma_addr_t dma; 16962306a36Sopenharmony_ci /* length of descriptor ring in bytes */ 17062306a36Sopenharmony_ci unsigned int size; 17162306a36Sopenharmony_ci /* number of descriptors in the ring */ 17262306a36Sopenharmony_ci unsigned int count; 17362306a36Sopenharmony_ci /* next descriptor to associate a buffer with */ 17462306a36Sopenharmony_ci unsigned int next_to_use; 17562306a36Sopenharmony_ci /* next descriptor to check for DD status bit */ 17662306a36Sopenharmony_ci unsigned int next_to_clean; 17762306a36Sopenharmony_ci /* array of buffer information structs */ 17862306a36Sopenharmony_ci struct e1000_rx_buffer *buffer_info; 17962306a36Sopenharmony_ci struct sk_buff *rx_skb_top; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* cpu for rx queue */ 18262306a36Sopenharmony_ci int cpu; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci u16 rdh; 18562306a36Sopenharmony_ci u16 rdt; 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#define E1000_DESC_UNUSED(R) \ 18962306a36Sopenharmony_ci({ \ 19062306a36Sopenharmony_ci unsigned int clean = smp_load_acquire(&(R)->next_to_clean); \ 19162306a36Sopenharmony_ci unsigned int use = READ_ONCE((R)->next_to_use); \ 19262306a36Sopenharmony_ci (clean > use ? 0 : (R)->count) + clean - use - 1; \ 19362306a36Sopenharmony_ci}) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci#define E1000_RX_DESC_EXT(R, i) \ 19662306a36Sopenharmony_ci (&(((union e1000_rx_desc_extended *)((R).desc))[i])) 19762306a36Sopenharmony_ci#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) 19862306a36Sopenharmony_ci#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc) 19962306a36Sopenharmony_ci#define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc) 20062306a36Sopenharmony_ci#define E1000_CONTEXT_DESC(R, i) E1000_GET_DESC(R, i, e1000_context_desc) 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* board specific private data structure */ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistruct e1000_adapter { 20562306a36Sopenharmony_ci unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 20662306a36Sopenharmony_ci u16 mng_vlan_id; 20762306a36Sopenharmony_ci u32 bd_number; 20862306a36Sopenharmony_ci u32 rx_buffer_len; 20962306a36Sopenharmony_ci u32 wol; 21062306a36Sopenharmony_ci u32 smartspeed; 21162306a36Sopenharmony_ci u32 en_mng_pt; 21262306a36Sopenharmony_ci u16 link_speed; 21362306a36Sopenharmony_ci u16 link_duplex; 21462306a36Sopenharmony_ci spinlock_t stats_lock; 21562306a36Sopenharmony_ci unsigned int total_tx_bytes; 21662306a36Sopenharmony_ci unsigned int total_tx_packets; 21762306a36Sopenharmony_ci unsigned int total_rx_bytes; 21862306a36Sopenharmony_ci unsigned int total_rx_packets; 21962306a36Sopenharmony_ci /* Interrupt Throttle Rate */ 22062306a36Sopenharmony_ci u32 itr; 22162306a36Sopenharmony_ci u32 itr_setting; 22262306a36Sopenharmony_ci u16 tx_itr; 22362306a36Sopenharmony_ci u16 rx_itr; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci u8 fc_autoneg; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* TX */ 22862306a36Sopenharmony_ci struct e1000_tx_ring *tx_ring; /* One per active queue */ 22962306a36Sopenharmony_ci unsigned int restart_queue; 23062306a36Sopenharmony_ci u32 txd_cmd; 23162306a36Sopenharmony_ci u32 tx_int_delay; 23262306a36Sopenharmony_ci u32 tx_abs_int_delay; 23362306a36Sopenharmony_ci u32 gotcl; 23462306a36Sopenharmony_ci u64 gotcl_old; 23562306a36Sopenharmony_ci u64 tpt_old; 23662306a36Sopenharmony_ci u64 colc_old; 23762306a36Sopenharmony_ci u32 tx_timeout_count; 23862306a36Sopenharmony_ci u32 tx_fifo_head; 23962306a36Sopenharmony_ci u32 tx_head_addr; 24062306a36Sopenharmony_ci u32 tx_fifo_size; 24162306a36Sopenharmony_ci u8 tx_timeout_factor; 24262306a36Sopenharmony_ci atomic_t tx_fifo_stall; 24362306a36Sopenharmony_ci bool pcix_82544; 24462306a36Sopenharmony_ci bool detect_tx_hung; 24562306a36Sopenharmony_ci bool dump_buffers; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci /* RX */ 24862306a36Sopenharmony_ci bool (*clean_rx)(struct e1000_adapter *adapter, 24962306a36Sopenharmony_ci struct e1000_rx_ring *rx_ring, 25062306a36Sopenharmony_ci int *work_done, int work_to_do); 25162306a36Sopenharmony_ci void (*alloc_rx_buf)(struct e1000_adapter *adapter, 25262306a36Sopenharmony_ci struct e1000_rx_ring *rx_ring, 25362306a36Sopenharmony_ci int cleaned_count); 25462306a36Sopenharmony_ci struct e1000_rx_ring *rx_ring; /* One per active queue */ 25562306a36Sopenharmony_ci struct napi_struct napi; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci int num_tx_queues; 25862306a36Sopenharmony_ci int num_rx_queues; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci u64 hw_csum_err; 26162306a36Sopenharmony_ci u64 hw_csum_good; 26262306a36Sopenharmony_ci u32 alloc_rx_buff_failed; 26362306a36Sopenharmony_ci u32 rx_int_delay; 26462306a36Sopenharmony_ci u32 rx_abs_int_delay; 26562306a36Sopenharmony_ci bool rx_csum; 26662306a36Sopenharmony_ci u32 gorcl; 26762306a36Sopenharmony_ci u64 gorcl_old; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci /* OS defined structs */ 27062306a36Sopenharmony_ci struct net_device *netdev; 27162306a36Sopenharmony_ci struct pci_dev *pdev; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci /* structs defined in e1000_hw.h */ 27462306a36Sopenharmony_ci struct e1000_hw hw; 27562306a36Sopenharmony_ci struct e1000_hw_stats stats; 27662306a36Sopenharmony_ci struct e1000_phy_info phy_info; 27762306a36Sopenharmony_ci struct e1000_phy_stats phy_stats; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci u32 test_icr; 28062306a36Sopenharmony_ci struct e1000_tx_ring test_tx_ring; 28162306a36Sopenharmony_ci struct e1000_rx_ring test_rx_ring; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci int msg_enable; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* to not mess up cache alignment, always add to the bottom */ 28662306a36Sopenharmony_ci bool tso_force; 28762306a36Sopenharmony_ci bool smart_power_down; /* phy smart power down */ 28862306a36Sopenharmony_ci bool quad_port_a; 28962306a36Sopenharmony_ci unsigned long flags; 29062306a36Sopenharmony_ci u32 eeprom_wol; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci /* for ioport free */ 29362306a36Sopenharmony_ci int bars; 29462306a36Sopenharmony_ci int need_ioport; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci bool discarding; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci struct work_struct reset_task; 29962306a36Sopenharmony_ci struct delayed_work watchdog_task; 30062306a36Sopenharmony_ci struct delayed_work fifo_stall_task; 30162306a36Sopenharmony_ci struct delayed_work phy_info_task; 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cienum e1000_state_t { 30562306a36Sopenharmony_ci __E1000_TESTING, 30662306a36Sopenharmony_ci __E1000_RESETTING, 30762306a36Sopenharmony_ci __E1000_DOWN, 30862306a36Sopenharmony_ci __E1000_DISABLED 30962306a36Sopenharmony_ci}; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci#undef pr_fmt 31262306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistruct net_device *e1000_get_hw_dev(struct e1000_hw *hw); 31562306a36Sopenharmony_ci#define e_dbg(format, arg...) \ 31662306a36Sopenharmony_ci netdev_dbg(e1000_get_hw_dev(hw), format, ## arg) 31762306a36Sopenharmony_ci#define e_err(msglvl, format, arg...) \ 31862306a36Sopenharmony_ci netif_err(adapter, msglvl, adapter->netdev, format, ## arg) 31962306a36Sopenharmony_ci#define e_info(msglvl, format, arg...) \ 32062306a36Sopenharmony_ci netif_info(adapter, msglvl, adapter->netdev, format, ## arg) 32162306a36Sopenharmony_ci#define e_warn(msglvl, format, arg...) \ 32262306a36Sopenharmony_ci netif_warn(adapter, msglvl, adapter->netdev, format, ## arg) 32362306a36Sopenharmony_ci#define e_notice(msglvl, format, arg...) \ 32462306a36Sopenharmony_ci netif_notice(adapter, msglvl, adapter->netdev, format, ## arg) 32562306a36Sopenharmony_ci#define e_dev_info(format, arg...) \ 32662306a36Sopenharmony_ci dev_info(&adapter->pdev->dev, format, ## arg) 32762306a36Sopenharmony_ci#define e_dev_warn(format, arg...) \ 32862306a36Sopenharmony_ci dev_warn(&adapter->pdev->dev, format, ## arg) 32962306a36Sopenharmony_ci#define e_dev_err(format, arg...) \ 33062306a36Sopenharmony_ci dev_err(&adapter->pdev->dev, format, ## arg) 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ciextern char e1000_driver_name[]; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ciint e1000_open(struct net_device *netdev); 33562306a36Sopenharmony_ciint e1000_close(struct net_device *netdev); 33662306a36Sopenharmony_ciint e1000_up(struct e1000_adapter *adapter); 33762306a36Sopenharmony_civoid e1000_down(struct e1000_adapter *adapter); 33862306a36Sopenharmony_civoid e1000_reinit_locked(struct e1000_adapter *adapter); 33962306a36Sopenharmony_civoid e1000_reset(struct e1000_adapter *adapter); 34062306a36Sopenharmony_ciint e1000_set_spd_dplx(struct e1000_adapter *adapter, u32 spd, u8 dplx); 34162306a36Sopenharmony_ciint e1000_setup_all_rx_resources(struct e1000_adapter *adapter); 34262306a36Sopenharmony_ciint e1000_setup_all_tx_resources(struct e1000_adapter *adapter); 34362306a36Sopenharmony_civoid e1000_free_all_rx_resources(struct e1000_adapter *adapter); 34462306a36Sopenharmony_civoid e1000_free_all_tx_resources(struct e1000_adapter *adapter); 34562306a36Sopenharmony_civoid e1000_update_stats(struct e1000_adapter *adapter); 34662306a36Sopenharmony_cibool e1000_has_link(struct e1000_adapter *adapter); 34762306a36Sopenharmony_civoid e1000_power_up_phy(struct e1000_adapter *); 34862306a36Sopenharmony_civoid e1000_set_ethtool_ops(struct net_device *netdev); 34962306a36Sopenharmony_civoid e1000_check_options(struct e1000_adapter *adapter); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci#endif /* _E1000_H_ */ 352