diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/hw.h')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/hw.h | 692 | 
1 files changed, 692 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/hw.h b/drivers/net/ethernet/intel/e1000e/hw.h new file mode 100644 index 00000000000..72f5475c4b9 --- /dev/null +++ b/drivers/net/ethernet/intel/e1000e/hw.h @@ -0,0 +1,692 @@ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 Intel Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * The full GNU General Public License is included in this distribution in + * the file called "COPYING". + * + * Contact Information: + * Linux NICS <linux.nics@intel.com> + * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 + */ + +#ifndef _E1000_HW_H_ +#define _E1000_HW_H_ + +#include "regs.h" +#include "defines.h" + +struct e1000_hw; + +#define E1000_DEV_ID_82571EB_COPPER		0x105E +#define E1000_DEV_ID_82571EB_FIBER		0x105F +#define E1000_DEV_ID_82571EB_SERDES		0x1060 +#define E1000_DEV_ID_82571EB_QUAD_COPPER	0x10A4 +#define E1000_DEV_ID_82571PT_QUAD_COPPER	0x10D5 +#define E1000_DEV_ID_82571EB_QUAD_FIBER		0x10A5 +#define E1000_DEV_ID_82571EB_QUAD_COPPER_LP	0x10BC +#define E1000_DEV_ID_82571EB_SERDES_DUAL	0x10D9 +#define E1000_DEV_ID_82571EB_SERDES_QUAD	0x10DA +#define E1000_DEV_ID_82572EI_COPPER		0x107D +#define E1000_DEV_ID_82572EI_FIBER		0x107E +#define E1000_DEV_ID_82572EI_SERDES		0x107F +#define E1000_DEV_ID_82572EI			0x10B9 +#define E1000_DEV_ID_82573E			0x108B +#define E1000_DEV_ID_82573E_IAMT		0x108C +#define E1000_DEV_ID_82573L			0x109A +#define E1000_DEV_ID_82574L			0x10D3 +#define E1000_DEV_ID_82574LA			0x10F6 +#define E1000_DEV_ID_82583V			0x150C +#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT	0x1096 +#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT	0x1098 +#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT	0x10BA +#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT	0x10BB +#define E1000_DEV_ID_ICH8_82567V_3		0x1501 +#define E1000_DEV_ID_ICH8_IGP_M_AMT		0x1049 +#define E1000_DEV_ID_ICH8_IGP_AMT		0x104A +#define E1000_DEV_ID_ICH8_IGP_C			0x104B +#define E1000_DEV_ID_ICH8_IFE			0x104C +#define E1000_DEV_ID_ICH8_IFE_GT		0x10C4 +#define E1000_DEV_ID_ICH8_IFE_G			0x10C5 +#define E1000_DEV_ID_ICH8_IGP_M			0x104D +#define E1000_DEV_ID_ICH9_IGP_AMT		0x10BD +#define E1000_DEV_ID_ICH9_BM			0x10E5 +#define E1000_DEV_ID_ICH9_IGP_M_AMT		0x10F5 +#define E1000_DEV_ID_ICH9_IGP_M			0x10BF +#define E1000_DEV_ID_ICH9_IGP_M_V		0x10CB +#define E1000_DEV_ID_ICH9_IGP_C			0x294C +#define E1000_DEV_ID_ICH9_IFE			0x10C0 +#define E1000_DEV_ID_ICH9_IFE_GT		0x10C3 +#define E1000_DEV_ID_ICH9_IFE_G			0x10C2 +#define E1000_DEV_ID_ICH10_R_BM_LM		0x10CC +#define E1000_DEV_ID_ICH10_R_BM_LF		0x10CD +#define E1000_DEV_ID_ICH10_R_BM_V		0x10CE +#define E1000_DEV_ID_ICH10_D_BM_LM		0x10DE +#define E1000_DEV_ID_ICH10_D_BM_LF		0x10DF +#define E1000_DEV_ID_ICH10_D_BM_V		0x1525 +#define E1000_DEV_ID_PCH_M_HV_LM		0x10EA +#define E1000_DEV_ID_PCH_M_HV_LC		0x10EB +#define E1000_DEV_ID_PCH_D_HV_DM		0x10EF +#define E1000_DEV_ID_PCH_D_HV_DC		0x10F0 +#define E1000_DEV_ID_PCH2_LV_LM			0x1502 +#define E1000_DEV_ID_PCH2_LV_V			0x1503 +#define E1000_DEV_ID_PCH_LPT_I217_LM		0x153A +#define E1000_DEV_ID_PCH_LPT_I217_V		0x153B +#define E1000_DEV_ID_PCH_LPTLP_I218_LM		0x155A +#define E1000_DEV_ID_PCH_LPTLP_I218_V		0x1559 +#define E1000_DEV_ID_PCH_I218_LM2		0x15A0 +#define E1000_DEV_ID_PCH_I218_V2		0x15A1 +#define E1000_DEV_ID_PCH_I218_LM3		0x15A2	/* Wildcat Point PCH */ +#define E1000_DEV_ID_PCH_I218_V3		0x15A3	/* Wildcat Point PCH */ + +#define E1000_REVISION_4	4 + +#define E1000_FUNC_1		1 + +#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0	0 +#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1	3 + +enum e1000_mac_type { +	e1000_82571, +	e1000_82572, +	e1000_82573, +	e1000_82574, +	e1000_82583, +	e1000_80003es2lan, +	e1000_ich8lan, +	e1000_ich9lan, +	e1000_ich10lan, +	e1000_pchlan, +	e1000_pch2lan, +	e1000_pch_lpt, +}; + +enum e1000_media_type { +	e1000_media_type_unknown = 0, +	e1000_media_type_copper = 1, +	e1000_media_type_fiber = 2, +	e1000_media_type_internal_serdes = 3, +	e1000_num_media_types +}; + +enum e1000_nvm_type { +	e1000_nvm_unknown = 0, +	e1000_nvm_none, +	e1000_nvm_eeprom_spi, +	e1000_nvm_flash_hw, +	e1000_nvm_flash_sw +}; + +enum e1000_nvm_override { +	e1000_nvm_override_none = 0, +	e1000_nvm_override_spi_small, +	e1000_nvm_override_spi_large +}; + +enum e1000_phy_type { +	e1000_phy_unknown = 0, +	e1000_phy_none, +	e1000_phy_m88, +	e1000_phy_igp, +	e1000_phy_igp_2, +	e1000_phy_gg82563, +	e1000_phy_igp_3, +	e1000_phy_ife, +	e1000_phy_bm, +	e1000_phy_82578, +	e1000_phy_82577, +	e1000_phy_82579, +	e1000_phy_i217, +}; + +enum e1000_bus_width { +	e1000_bus_width_unknown = 0, +	e1000_bus_width_pcie_x1, +	e1000_bus_width_pcie_x2, +	e1000_bus_width_pcie_x4 = 4, +	e1000_bus_width_32, +	e1000_bus_width_64, +	e1000_bus_width_reserved +}; + +enum e1000_1000t_rx_status { +	e1000_1000t_rx_status_not_ok = 0, +	e1000_1000t_rx_status_ok, +	e1000_1000t_rx_status_undefined = 0xFF +}; + +enum e1000_rev_polarity { +	e1000_rev_polarity_normal = 0, +	e1000_rev_polarity_reversed, +	e1000_rev_polarity_undefined = 0xFF +}; + +enum e1000_fc_mode { +	e1000_fc_none = 0, +	e1000_fc_rx_pause, +	e1000_fc_tx_pause, +	e1000_fc_full, +	e1000_fc_default = 0xFF +}; + +enum e1000_ms_type { +	e1000_ms_hw_default = 0, +	e1000_ms_force_master, +	e1000_ms_force_slave, +	e1000_ms_auto +}; + +enum e1000_smart_speed { +	e1000_smart_speed_default = 0, +	e1000_smart_speed_on, +	e1000_smart_speed_off +}; + +enum e1000_serdes_link_state { +	e1000_serdes_link_down = 0, +	e1000_serdes_link_autoneg_progress, +	e1000_serdes_link_autoneg_complete, +	e1000_serdes_link_forced_up +}; + +/* Receive Descriptor - Extended */ +union e1000_rx_desc_extended { +	struct { +		__le64 buffer_addr; +		__le64 reserved; +	} read; +	struct { +		struct { +			__le32 mrq;	      /* Multiple Rx Queues */ +			union { +				__le32 rss;	    /* RSS Hash */ +				struct { +					__le16 ip_id;  /* IP id */ +					__le16 csum;   /* Packet Checksum */ +				} csum_ip; +			} hi_dword; +		} lower; +		struct { +			__le32 status_error;     /* ext status/error */ +			__le16 length; +			__le16 vlan;	     /* VLAN tag */ +		} upper; +	} wb;  /* writeback */ +}; + +#define MAX_PS_BUFFERS 4 + +/* Number of packet split data buffers (not including the header buffer) */ +#define PS_PAGE_BUFFERS	(MAX_PS_BUFFERS - 1) + +/* Receive Descriptor - Packet Split */ +union e1000_rx_desc_packet_split { +	struct { +		/* one buffer for protocol header(s), three data buffers */ +		__le64 buffer_addr[MAX_PS_BUFFERS]; +	} read; +	struct { +		struct { +			__le32 mrq;	      /* Multiple Rx Queues */ +			union { +				__le32 rss;	      /* RSS Hash */ +				struct { +					__le16 ip_id;    /* IP id */ +					__le16 csum;     /* Packet Checksum */ +				} csum_ip; +			} hi_dword; +		} lower; +		struct { +			__le32 status_error;     /* ext status/error */ +			__le16 length0;	  /* length of buffer 0 */ +			__le16 vlan;	     /* VLAN tag */ +		} middle; +		struct { +			__le16 header_status; +			/* length of buffers 1-3 */ +			__le16 length[PS_PAGE_BUFFERS]; +		} upper; +		__le64 reserved; +	} wb; /* writeback */ +}; + +/* Transmit Descriptor */ +struct e1000_tx_desc { +	__le64 buffer_addr;      /* Address of the descriptor's data buffer */ +	union { +		__le32 data; +		struct { +			__le16 length;    /* Data buffer length */ +			u8 cso;	/* Checksum offset */ +			u8 cmd;	/* Descriptor control */ +		} flags; +	} lower; +	union { +		__le32 data; +		struct { +			u8 status;     /* Descriptor status */ +			u8 css;	/* Checksum start */ +			__le16 special; +		} fields; +	} upper; +}; + +/* Offload Context Descriptor */ +struct e1000_context_desc { +	union { +		__le32 ip_config; +		struct { +			u8 ipcss;      /* IP checksum start */ +			u8 ipcso;      /* IP checksum offset */ +			__le16 ipcse;     /* IP checksum end */ +		} ip_fields; +	} lower_setup; +	union { +		__le32 tcp_config; +		struct { +			u8 tucss;      /* TCP checksum start */ +			u8 tucso;      /* TCP checksum offset */ +			__le16 tucse;     /* TCP checksum end */ +		} tcp_fields; +	} upper_setup; +	__le32 cmd_and_length; +	union { +		__le32 data; +		struct { +			u8 status;     /* Descriptor status */ +			u8 hdr_len;    /* Header length */ +			__le16 mss;       /* Maximum segment size */ +		} fields; +	} tcp_seg_setup; +}; + +/* Offload data descriptor */ +struct e1000_data_desc { +	__le64 buffer_addr;   /* Address of the descriptor's buffer address */ +	union { +		__le32 data; +		struct { +			__le16 length;    /* Data buffer length */ +			u8 typ_len_ext; +			u8 cmd; +		} flags; +	} lower; +	union { +		__le32 data; +		struct { +			u8 status;     /* Descriptor status */ +			u8 popts;      /* Packet Options */ +			__le16 special; +		} fields; +	} upper; +}; + +/* Statistics counters collected by the MAC */ +struct e1000_hw_stats { +	u64 crcerrs; +	u64 algnerrc; +	u64 symerrs; +	u64 rxerrc; +	u64 mpc; +	u64 scc; +	u64 ecol; +	u64 mcc; +	u64 latecol; +	u64 colc; +	u64 dc; +	u64 tncrs; +	u64 sec; +	u64 cexterr; +	u64 rlec; +	u64 xonrxc; +	u64 xontxc; +	u64 xoffrxc; +	u64 xofftxc; +	u64 fcruc; +	u64 prc64; +	u64 prc127; +	u64 prc255; +	u64 prc511; +	u64 prc1023; +	u64 prc1522; +	u64 gprc; +	u64 bprc; +	u64 mprc; +	u64 gptc; +	u64 gorc; +	u64 gotc; +	u64 rnbc; +	u64 ruc; +	u64 rfc; +	u64 roc; +	u64 rjc; +	u64 mgprc; +	u64 mgpdc; +	u64 mgptc; +	u64 tor; +	u64 tot; +	u64 tpr; +	u64 tpt; +	u64 ptc64; +	u64 ptc127; +	u64 ptc255; +	u64 ptc511; +	u64 ptc1023; +	u64 ptc1522; +	u64 mptc; +	u64 bptc; +	u64 tsctc; +	u64 tsctfc; +	u64 iac; +	u64 icrxptc; +	u64 icrxatc; +	u64 ictxptc; +	u64 ictxatc; +	u64 ictxqec; +	u64 ictxqmtc; +	u64 icrxdmtc; +	u64 icrxoc; +}; + +struct e1000_phy_stats { +	u32 idle_errors; +	u32 receive_errors; +}; + +struct e1000_host_mng_dhcp_cookie { +	u32 signature; +	u8 status; +	u8 reserved0; +	u16 vlan_id; +	u32 reserved1; +	u16 reserved2; +	u8 reserved3; +	u8 checksum; +}; + +/* Host Interface "Rev 1" */ +struct e1000_host_command_header { +	u8 command_id; +	u8 command_length; +	u8 command_options; +	u8 checksum; +}; + +#define E1000_HI_MAX_DATA_LENGTH	252 +struct e1000_host_command_info { +	struct e1000_host_command_header command_header; +	u8 command_data[E1000_HI_MAX_DATA_LENGTH]; +}; + +/* Host Interface "Rev 2" */ +struct e1000_host_mng_command_header { +	u8 command_id; +	u8 checksum; +	u16 reserved1; +	u16 reserved2; +	u16 command_length; +}; + +#define E1000_HI_MAX_MNG_DATA_LENGTH	0x6F8 +struct e1000_host_mng_command_info { +	struct e1000_host_mng_command_header command_header; +	u8 command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; +}; + +#include "mac.h" +#include "phy.h" +#include "nvm.h" +#include "manage.h" + +/* Function pointers for the MAC. */ +struct e1000_mac_operations { +	s32  (*id_led_init)(struct e1000_hw *); +	s32  (*blink_led)(struct e1000_hw *); +	bool (*check_mng_mode)(struct e1000_hw *); +	s32  (*check_for_link)(struct e1000_hw *); +	s32  (*cleanup_led)(struct e1000_hw *); +	void (*clear_hw_cntrs)(struct e1000_hw *); +	void (*clear_vfta)(struct e1000_hw *); +	s32  (*get_bus_info)(struct e1000_hw *); +	void (*set_lan_id)(struct e1000_hw *); +	s32  (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); +	s32  (*led_on)(struct e1000_hw *); +	s32  (*led_off)(struct e1000_hw *); +	void (*update_mc_addr_list)(struct e1000_hw *, u8 *, u32); +	s32  (*reset_hw)(struct e1000_hw *); +	s32  (*init_hw)(struct e1000_hw *); +	s32  (*setup_link)(struct e1000_hw *); +	s32  (*setup_physical_interface)(struct e1000_hw *); +	s32  (*setup_led)(struct e1000_hw *); +	void (*write_vfta)(struct e1000_hw *, u32, u32); +	void (*config_collision_dist)(struct e1000_hw *); +	int  (*rar_set)(struct e1000_hw *, u8 *, u32); +	s32  (*read_mac_addr)(struct e1000_hw *); +	u32  (*rar_get_count)(struct e1000_hw *); +}; + +/* When to use various PHY register access functions: + * + *                 Func   Caller + *   Function      Does   Does    When to use + *   ~~~~~~~~~~~~  ~~~~~  ~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + *   X_reg         L,P,A  n/a     for simple PHY reg accesses + *   X_reg_locked  P,A    L       for multiple accesses of different regs + *                                on different pages + *   X_reg_page    A      L,P     for multiple accesses of different regs + *                                on the same page + * + * Where X=[read|write], L=locking, P=sets page, A=register access + * + */ +struct e1000_phy_operations { +	s32  (*acquire)(struct e1000_hw *); +	s32  (*cfg_on_link_up)(struct e1000_hw *); +	s32  (*check_polarity)(struct e1000_hw *); +	s32  (*check_reset_block)(struct e1000_hw *); +	s32  (*commit)(struct e1000_hw *); +	s32  (*force_speed_duplex)(struct e1000_hw *); +	s32  (*get_cfg_done)(struct e1000_hw *hw); +	s32  (*get_cable_length)(struct e1000_hw *); +	s32  (*get_info)(struct e1000_hw *); +	s32  (*set_page)(struct e1000_hw *, u16); +	s32  (*read_reg)(struct e1000_hw *, u32, u16 *); +	s32  (*read_reg_locked)(struct e1000_hw *, u32, u16 *); +	s32  (*read_reg_page)(struct e1000_hw *, u32, u16 *); +	void (*release)(struct e1000_hw *); +	s32  (*reset)(struct e1000_hw *); +	s32  (*set_d0_lplu_state)(struct e1000_hw *, bool); +	s32  (*set_d3_lplu_state)(struct e1000_hw *, bool); +	s32  (*write_reg)(struct e1000_hw *, u32, u16); +	s32  (*write_reg_locked)(struct e1000_hw *, u32, u16); +	s32  (*write_reg_page)(struct e1000_hw *, u32, u16); +	void (*power_up)(struct e1000_hw *); +	void (*power_down)(struct e1000_hw *); +}; + +/* Function pointers for the NVM. */ +struct e1000_nvm_operations { +	s32  (*acquire)(struct e1000_hw *); +	s32  (*read)(struct e1000_hw *, u16, u16, u16 *); +	void (*release)(struct e1000_hw *); +	void (*reload)(struct e1000_hw *); +	s32  (*update)(struct e1000_hw *); +	s32  (*valid_led_default)(struct e1000_hw *, u16 *); +	s32  (*validate)(struct e1000_hw *); +	s32  (*write)(struct e1000_hw *, u16, u16, u16 *); +}; + +struct e1000_mac_info { +	struct e1000_mac_operations ops; +	u8 addr[ETH_ALEN]; +	u8 perm_addr[ETH_ALEN]; + +	enum e1000_mac_type type; + +	u32 collision_delta; +	u32 ledctl_default; +	u32 ledctl_mode1; +	u32 ledctl_mode2; +	u32 mc_filter_type; +	u32 tx_packet_delta; +	u32 txcw; + +	u16 current_ifs_val; +	u16 ifs_max_val; +	u16 ifs_min_val; +	u16 ifs_ratio; +	u16 ifs_step_size; +	u16 mta_reg_count; + +	/* Maximum size of the MTA register table in all supported adapters */ +#define MAX_MTA_REG 128 +	u32 mta_shadow[MAX_MTA_REG]; +	u16 rar_entry_count; + +	u8 forced_speed_duplex; + +	bool adaptive_ifs; +	bool has_fwsm; +	bool arc_subsystem_valid; +	bool autoneg; +	bool autoneg_failed; +	bool get_link_status; +	bool in_ifs_mode; +	bool serdes_has_link; +	bool tx_pkt_filtering; +	enum e1000_serdes_link_state serdes_link_state; +}; + +struct e1000_phy_info { +	struct e1000_phy_operations ops; + +	enum e1000_phy_type type; + +	enum e1000_1000t_rx_status local_rx; +	enum e1000_1000t_rx_status remote_rx; +	enum e1000_ms_type ms_type; +	enum e1000_ms_type original_ms_type; +	enum e1000_rev_polarity cable_polarity; +	enum e1000_smart_speed smart_speed; + +	u32 addr; +	u32 id; +	u32 reset_delay_us;	/* in usec */ +	u32 revision; + +	enum e1000_media_type media_type; + +	u16 autoneg_advertised; +	u16 autoneg_mask; +	u16 cable_length; +	u16 max_cable_length; +	u16 min_cable_length; + +	u8 mdix; + +	bool disable_polarity_correction; +	bool is_mdix; +	bool polarity_correction; +	bool speed_downgraded; +	bool autoneg_wait_to_complete; +}; + +struct e1000_nvm_info { +	struct e1000_nvm_operations ops; + +	enum e1000_nvm_type type; +	enum e1000_nvm_override override; + +	u32 flash_bank_size; +	u32 flash_base_addr; + +	u16 word_size; +	u16 delay_usec; +	u16 address_bits; +	u16 opcode_bits; +	u16 page_size; +}; + +struct e1000_bus_info { +	enum e1000_bus_width width; + +	u16 func; +}; + +struct e1000_fc_info { +	u32 high_water;          /* Flow control high-water mark */ +	u32 low_water;           /* Flow control low-water mark */ +	u16 pause_time;          /* Flow control pause timer */ +	u16 refresh_time;        /* Flow control refresh timer */ +	bool send_xon;           /* Flow control send XON */ +	bool strict_ieee;        /* Strict IEEE mode */ +	enum e1000_fc_mode current_mode; /* FC mode in effect */ +	enum e1000_fc_mode requested_mode; /* FC mode requested by caller */ +}; + +struct e1000_dev_spec_82571 { +	bool laa_is_present; +	u32 smb_counter; +}; + +struct e1000_dev_spec_80003es2lan { +	bool mdic_wa_enable; +}; + +struct e1000_shadow_ram { +	u16 value; +	bool modified; +}; + +#define E1000_ICH8_SHADOW_RAM_WORDS		2048 + +/* I218 PHY Ultra Low Power (ULP) states */ +enum e1000_ulp_state { +	e1000_ulp_state_unknown, +	e1000_ulp_state_off, +	e1000_ulp_state_on, +}; + +struct e1000_dev_spec_ich8lan { +	bool kmrn_lock_loss_workaround_enabled; +	struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; +	bool nvm_k1_enabled; +	bool eee_disable; +	u16 eee_lp_ability; +	enum e1000_ulp_state ulp_state; +}; + +struct e1000_hw { +	struct e1000_adapter *adapter; + +	void __iomem *hw_addr; +	void __iomem *flash_address; + +	struct e1000_mac_info mac; +	struct e1000_fc_info fc; +	struct e1000_phy_info phy; +	struct e1000_nvm_info nvm; +	struct e1000_bus_info bus; +	struct e1000_host_mng_dhcp_cookie mng_cookie; + +	union { +		struct e1000_dev_spec_82571 e82571; +		struct e1000_dev_spec_80003es2lan e80003es2lan; +		struct e1000_dev_spec_ich8lan ich8lan; +	} dev_spec; +}; + +#include "82571.h" +#include "80003es2lan.h" +#include "ich8lan.h" + +#endif  | 
