Home | History | Annotate | Line # | Download | only in igc
      1  1.2  rin /*	$NetBSD: igc_hw.h,v 1.2 2023/10/04 07:35:27 rin Exp $	*/
      2  1.1  rin /*	$OpenBSD: igc_hw.h,v 1.2 2022/05/11 06:14:15 kevlo Exp $	*/
      3  1.1  rin /*-
      4  1.1  rin  * Copyright 2021 Intel Corp
      5  1.1  rin  * Copyright 2021 Rubicon Communications, LLC (Netgate)
      6  1.1  rin  * SPDX-License-Identifier: BSD-3-Clause
      7  1.1  rin  *
      8  1.1  rin  * $FreeBSD$
      9  1.1  rin  */
     10  1.1  rin 
     11  1.1  rin #ifndef _IGC_HW_H_
     12  1.1  rin #define _IGC_HW_H_
     13  1.1  rin 
     14  1.2  rin #ifdef _KERNEL_OPT
     15  1.1  rin #include "vlan.h"
     16  1.2  rin #endif
     17  1.1  rin 
     18  1.1  rin #include <sys/param.h>
     19  1.1  rin #include <sys/systm.h>
     20  1.2  rin #include <sys/bus.h>
     21  1.1  rin #include <sys/mbuf.h>
     22  1.1  rin #include <sys/kernel.h>
     23  1.2  rin #include <sys/kmem.h>
     24  1.1  rin #include <sys/socket.h>
     25  1.1  rin #include <sys/device.h>
     26  1.1  rin #include <sys/endian.h>
     27  1.1  rin 
     28  1.2  rin #include <net/bpf.h>
     29  1.1  rin #include <net/if.h>
     30  1.1  rin #include <net/if_media.h>
     31  1.2  rin #include <net/if_ether.h>
     32  1.1  rin 
     33  1.1  rin #include <netinet/in.h>
     34  1.1  rin 
     35  1.1  rin #include <dev/pci/pcivar.h>
     36  1.1  rin #include <dev/pci/pcireg.h>
     37  1.1  rin #include <dev/pci/pcidevs.h>
     38  1.1  rin 
     39  1.2  rin #include <dev/pci/igc/igc_base.h>
     40  1.2  rin #include <dev/pci/igc/igc_defines.h>
     41  1.2  rin #include <dev/pci/igc/igc_i225.h>
     42  1.2  rin #include <dev/pci/igc/igc_mac.h>
     43  1.2  rin #include <dev/pci/igc/igc_nvm.h>
     44  1.2  rin #include <dev/pci/igc/igc_phy.h>
     45  1.2  rin #include <dev/pci/igc/igc_regs.h>
     46  1.1  rin 
     47  1.1  rin struct igc_hw;
     48  1.1  rin 
     49  1.1  rin #define IGC_FUNC_1	1
     50  1.1  rin 
     51  1.1  rin #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN0	0
     52  1.1  rin #define IGC_ALT_MAC_ADDRESS_OFFSET_LAN1	3
     53  1.1  rin 
     54  1.2  rin #define IGC_MAX_NQUEUES	4
     55  1.2  rin 
     56  1.1  rin enum igc_mac_type {
     57  1.1  rin 	igc_undefined = 0,
     58  1.1  rin 	igc_i225,
     59  1.1  rin 	igc_num_macs	/* List is 1-based, so subtract 1 for TRUE count. */
     60  1.1  rin };
     61  1.1  rin 
     62  1.1  rin enum igc_media_type {
     63  1.1  rin 	igc_media_type_unknown = 0,
     64  1.1  rin 	igc_media_type_copper = 1,
     65  1.1  rin 	igc_num_media_types
     66  1.1  rin };
     67  1.1  rin 
     68  1.1  rin enum igc_nvm_type {
     69  1.1  rin 	igc_nvm_unknown = 0,
     70  1.1  rin 	igc_nvm_eeprom_spi,
     71  1.1  rin 	igc_nvm_flash_hw,
     72  1.1  rin 	igc_nvm_invm
     73  1.1  rin };
     74  1.1  rin 
     75  1.1  rin enum igc_phy_type {
     76  1.1  rin 	igc_phy_unknown = 0,
     77  1.1  rin 	igc_phy_none,
     78  1.1  rin 	igc_phy_i225
     79  1.1  rin };
     80  1.1  rin 
     81  1.1  rin enum igc_bus_type {
     82  1.1  rin 	igc_bus_type_unknown = 0,
     83  1.1  rin 	igc_bus_type_pci,
     84  1.1  rin 	igc_bus_type_pcix,
     85  1.1  rin 	igc_bus_type_pci_express,
     86  1.1  rin 	igc_bus_type_reserved
     87  1.1  rin };
     88  1.1  rin 
     89  1.1  rin enum igc_bus_speed {
     90  1.1  rin 	igc_bus_speed_unknown = 0,
     91  1.1  rin 	igc_bus_speed_33,
     92  1.1  rin 	igc_bus_speed_66,
     93  1.1  rin 	igc_bus_speed_100,
     94  1.1  rin 	igc_bus_speed_120,
     95  1.1  rin 	igc_bus_speed_133,
     96  1.1  rin 	igc_bus_speed_2500,
     97  1.1  rin 	igc_bus_speed_5000,
     98  1.1  rin 	igc_bus_speed_reserved
     99  1.1  rin };
    100  1.1  rin 
    101  1.1  rin enum igc_bus_width {
    102  1.1  rin 	igc_bus_width_unknown = 0,
    103  1.1  rin 	igc_bus_width_pcie_x1,
    104  1.1  rin 	igc_bus_width_pcie_x2,
    105  1.1  rin 	igc_bus_width_pcie_x4 = 4,
    106  1.1  rin 	igc_bus_width_pcie_x8 = 8,
    107  1.1  rin 	igc_bus_width_32,
    108  1.1  rin 	igc_bus_width_64,
    109  1.1  rin 	igc_bus_width_reserved
    110  1.1  rin };
    111  1.1  rin 
    112  1.1  rin enum igc_fc_mode {
    113  1.1  rin 	igc_fc_none = 0,
    114  1.1  rin 	igc_fc_rx_pause,
    115  1.1  rin 	igc_fc_tx_pause,
    116  1.1  rin 	igc_fc_full,
    117  1.1  rin 	igc_fc_default = 0xFF
    118  1.1  rin };
    119  1.1  rin 
    120  1.1  rin enum igc_ms_type {
    121  1.1  rin 	igc_ms_hw_default = 0,
    122  1.1  rin 	igc_ms_force_master,
    123  1.1  rin 	igc_ms_force_slave,
    124  1.1  rin 	igc_ms_auto
    125  1.1  rin };
    126  1.1  rin 
    127  1.1  rin enum igc_smart_speed {
    128  1.1  rin 	igc_smart_speed_default = 0,
    129  1.1  rin 	igc_smart_speed_on,
    130  1.1  rin 	igc_smart_speed_off
    131  1.1  rin };
    132  1.1  rin 
    133  1.1  rin /* Receive Descriptor */
    134  1.1  rin struct igc_rx_desc {
    135  1.1  rin 	uint64_t buffer_addr;	/* Address of the descriptor's data buffer */
    136  1.2  rin 	uint16_t length;	/* Length of data DMAed into data buffer */
    137  1.1  rin 	uint16_t csum;		/* Packet checksum */
    138  1.1  rin 	uint8_t  status;	/* Descriptor status */
    139  1.1  rin 	uint8_t  errors;	/* Descriptor errors */
    140  1.1  rin 	uint16_t special;
    141  1.1  rin };
    142  1.1  rin 
    143  1.1  rin /* Receive Descriptor - Extended */
    144  1.1  rin union igc_rx_desc_extended {
    145  1.1  rin 	struct {
    146  1.1  rin 		uint64_t buffer_addr;
    147  1.1  rin 		uint64_t reserved;
    148  1.1  rin 	} read;
    149  1.1  rin 	struct {
    150  1.1  rin 		struct {
    151  1.1  rin 			uint32_t mrq;	/* Multiple Rx queues */
    152  1.1  rin 			union {
    153  1.1  rin 				uint32_t rss;	/* RSS hash */
    154  1.1  rin 				struct {
    155  1.1  rin 					uint16_t ip_id;	/* IP id */
    156  1.1  rin 					uint16_t csum;	/* Packet checksum */
    157  1.1  rin 				} csum_ip;
    158  1.1  rin 			} hi_dword;
    159  1.1  rin 		} lower;
    160  1.1  rin 		struct {
    161  1.1  rin 			uint32_t status_error;	/* ext status/error */
    162  1.1  rin 			uint16_t length;
    163  1.1  rin 			uint16_t vlan;	/* VLAN tag */
    164  1.1  rin 		} upper;
    165  1.1  rin 	} wb;	/* writeback */
    166  1.1  rin };
    167  1.1  rin 
    168  1.1  rin /* Transmit Descriptor */
    169  1.1  rin struct igc_tx_desc {
    170  1.1  rin 	uint64_t buffer_addr;	/* Address of the descriptor's data buffer */
    171  1.1  rin 	union {
    172  1.1  rin 		uint32_t data;
    173  1.1  rin 		struct {
    174  1.1  rin 			uint16_t length;	/* Data buffer length */
    175  1.1  rin 			uint8_t cso;	/* Checksum offset */
    176  1.1  rin 			uint8_t cmd;	/* Descriptor control */
    177  1.1  rin 		} flags;
    178  1.1  rin 	} lower;
    179  1.1  rin 	union {
    180  1.1  rin 		uint32_t data;
    181  1.1  rin 		struct {
    182  1.1  rin 			uint8_t status;	/* Descriptor status */
    183  1.1  rin 			uint8_t css;	/* Checksum start */
    184  1.1  rin 			uint16_t special;
    185  1.1  rin 		} fields;
    186  1.1  rin 	} upper;
    187  1.1  rin };
    188  1.1  rin 
    189  1.1  rin /* Function pointers for the MAC. */
    190  1.1  rin struct igc_mac_operations {
    191  1.1  rin 	int	(*init_params)(struct igc_hw *);
    192  1.1  rin 	int	(*check_for_link)(struct igc_hw *);
    193  1.1  rin 	void	(*clear_hw_cntrs)(struct igc_hw *);
    194  1.1  rin 	void	(*clear_vfta)(struct igc_hw *);
    195  1.1  rin 	int	(*get_bus_info)(struct igc_hw *);
    196  1.1  rin 	void	(*set_lan_id)(struct igc_hw *);
    197  1.1  rin 	int	(*get_link_up_info)(struct igc_hw *, uint16_t *, uint16_t *);
    198  1.1  rin 	void	(*update_mc_addr_list)(struct igc_hw *, uint8_t *, uint32_t);
    199  1.1  rin 	int	(*reset_hw)(struct igc_hw *);
    200  1.1  rin 	int	(*init_hw)(struct igc_hw *);
    201  1.1  rin 	int	(*setup_link)(struct igc_hw *);
    202  1.1  rin 	int	(*setup_physical_interface)(struct igc_hw *);
    203  1.1  rin 	void	(*write_vfta)(struct igc_hw *, uint32_t, uint32_t);
    204  1.1  rin 	void	(*config_collision_dist)(struct igc_hw *);
    205  1.1  rin 	int	(*rar_set)(struct igc_hw *, uint8_t *, uint32_t);
    206  1.1  rin 	int	(*read_mac_addr)(struct igc_hw *);
    207  1.1  rin 	int	(*validate_mdi_setting)(struct igc_hw *);
    208  1.1  rin 	int	(*acquire_swfw_sync)(struct igc_hw *, uint16_t);
    209  1.1  rin 	void	(*release_swfw_sync)(struct igc_hw *, uint16_t);
    210  1.1  rin };
    211  1.1  rin 
    212  1.1  rin /* When to use various PHY register access functions:
    213  1.1  rin  *
    214  1.1  rin  *                 Func   Caller
    215  1.1  rin  *   Function      Does   Does    When to use
    216  1.1  rin  *   ~~~~~~~~~~~~  ~~~~~  ~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    217  1.1  rin  *   X_reg         L,P,A  n/a     for simple PHY reg accesses
    218  1.1  rin  *   X_reg_locked  P,A    L       for multiple accesses of different regs
    219  1.1  rin  *                                on different pages
    220  1.1  rin  *   X_reg_page    A      L,P     for multiple accesses of different regs
    221  1.1  rin  *                                on the same page
    222  1.1  rin  *
    223  1.1  rin  * Where X=[read|write], L=locking, P=sets page, A=register access
    224  1.1  rin  *
    225  1.1  rin  */
    226  1.1  rin struct igc_phy_operations {
    227  1.1  rin 	int	(*init_params)(struct igc_hw *);
    228  1.1  rin 	int	(*acquire)(struct igc_hw *);
    229  1.1  rin 	int	(*check_reset_block)(struct igc_hw *);
    230  1.1  rin 	int	(*force_speed_duplex)(struct igc_hw *);
    231  1.1  rin 	int	(*get_info)(struct igc_hw *);
    232  1.1  rin 	int	(*set_page)(struct igc_hw *, uint16_t);
    233  1.1  rin 	int	(*read_reg)(struct igc_hw *, uint32_t, uint16_t *);
    234  1.1  rin 	int	(*read_reg_locked)(struct igc_hw *, uint32_t, uint16_t *);
    235  1.1  rin 	int	(*read_reg_page)(struct igc_hw *, uint32_t, uint16_t *);
    236  1.1  rin 	void	(*release)(struct igc_hw *);
    237  1.1  rin 	int	(*reset)(struct igc_hw *);
    238  1.1  rin 	int	(*set_d0_lplu_state)(struct igc_hw *, bool);
    239  1.1  rin 	int	(*set_d3_lplu_state)(struct igc_hw *, bool);
    240  1.1  rin 	int	(*write_reg)(struct igc_hw *, uint32_t, uint16_t);
    241  1.1  rin 	int	(*write_reg_locked)(struct igc_hw *, uint32_t, uint16_t);
    242  1.1  rin 	int	(*write_reg_page)(struct igc_hw *, uint32_t, uint16_t);
    243  1.1  rin 	void	(*power_up)(struct igc_hw *);
    244  1.1  rin 	void	(*power_down)(struct igc_hw *);
    245  1.1  rin };
    246  1.1  rin 
    247  1.1  rin /* Function pointers for the NVM. */
    248  1.1  rin struct igc_nvm_operations {
    249  1.1  rin 	int	(*init_params)(struct igc_hw *);
    250  1.1  rin 	int	(*acquire)(struct igc_hw *);
    251  1.1  rin 	int	(*read)(struct igc_hw *, uint16_t, uint16_t, uint16_t *);
    252  1.1  rin 	void	(*release)(struct igc_hw *);
    253  1.1  rin 	void	(*reload)(struct igc_hw *);
    254  1.1  rin 	int	(*update)(struct igc_hw *);
    255  1.1  rin 	int	(*validate)(struct igc_hw *);
    256  1.1  rin 	int	(*write)(struct igc_hw *, uint16_t, uint16_t, uint16_t *);
    257  1.1  rin };
    258  1.1  rin 
    259  1.1  rin struct igc_info {
    260  1.1  rin 	int				(*get_invariants)(struct igc_hw *hw);
    261  1.1  rin 	struct igc_mac_operations	*mac_ops;
    262  1.1  rin 	const struct igc_phy_operations	*phy_ops;
    263  1.1  rin 	struct igc_nvm_operations	*nvm_ops;
    264  1.1  rin };
    265  1.1  rin 
    266  1.1  rin extern const struct igc_info igc_i225_info;
    267  1.1  rin 
    268  1.1  rin struct igc_mac_info {
    269  1.1  rin 	struct igc_mac_operations	ops;
    270  1.1  rin 	uint8_t				addr[ETHER_ADDR_LEN];
    271  1.1  rin 	uint8_t				perm_addr[ETHER_ADDR_LEN];
    272  1.1  rin 
    273  1.1  rin 	enum igc_mac_type		type;
    274  1.1  rin 
    275  1.1  rin 	uint32_t			mc_filter_type;
    276  1.1  rin 
    277  1.1  rin 	uint16_t			current_ifs_val;
    278  1.1  rin 	uint16_t			ifs_max_val;
    279  1.1  rin 	uint16_t			ifs_min_val;
    280  1.1  rin 	uint16_t			ifs_ratio;
    281  1.1  rin 	uint16_t			ifs_step_size;
    282  1.1  rin 	uint16_t			mta_reg_count;
    283  1.1  rin 	uint16_t			uta_reg_count;
    284  1.1  rin 
    285  1.1  rin 	/* Maximum size of the MTA register table in all supported adapters */
    286  1.1  rin #define MAX_MTA_REG	128
    287  1.1  rin 	uint32_t			mta_shadow[MAX_MTA_REG];
    288  1.1  rin 	uint16_t			rar_entry_count;
    289  1.1  rin 
    290  1.1  rin 	uint8_t				forced_speed_duplex;
    291  1.1  rin 
    292  1.1  rin 	bool				asf_firmware_present;
    293  1.1  rin 	bool				autoneg;
    294  1.1  rin 	bool				get_link_status;
    295  1.1  rin 	uint32_t			max_frame_size;
    296  1.1  rin };
    297  1.1  rin 
    298  1.1  rin struct igc_phy_info {
    299  1.1  rin 	struct igc_phy_operations	ops;
    300  1.1  rin 	enum igc_phy_type		type;
    301  1.1  rin 
    302  1.1  rin 	enum igc_smart_speed		smart_speed;
    303  1.1  rin 
    304  1.1  rin 	uint32_t			addr;
    305  1.1  rin 	uint32_t			id;
    306  1.1  rin 	uint32_t			reset_delay_us;	/* in usec */
    307  1.1  rin 	uint32_t			revision;
    308  1.1  rin 
    309  1.1  rin 	enum igc_media_type		media_type;
    310  1.1  rin 
    311  1.1  rin 	uint16_t			autoneg_advertised;
    312  1.1  rin 	uint16_t			autoneg_mask;
    313  1.1  rin 
    314  1.1  rin 	uint8_t				mdix;
    315  1.1  rin 
    316  1.1  rin 	bool				polarity_correction;
    317  1.1  rin 	bool				speed_downgraded;
    318  1.1  rin 	bool				autoneg_wait_to_complete;
    319  1.1  rin };
    320  1.1  rin 
    321  1.1  rin struct igc_nvm_info {
    322  1.1  rin 	struct igc_nvm_operations	ops;
    323  1.1  rin 	enum igc_nvm_type		type;
    324  1.1  rin 
    325  1.1  rin 	uint16_t			word_size;
    326  1.1  rin 	uint16_t			delay_usec;
    327  1.1  rin 	uint16_t			address_bits;
    328  1.1  rin 	uint16_t			opcode_bits;
    329  1.1  rin 	uint16_t			page_size;
    330  1.1  rin };
    331  1.1  rin 
    332  1.1  rin struct igc_bus_info {
    333  1.1  rin 	enum igc_bus_type	type;
    334  1.1  rin 	enum igc_bus_speed	speed;
    335  1.1  rin 	enum igc_bus_width	width;
    336  1.1  rin 
    337  1.1  rin 	uint16_t		func;
    338  1.1  rin 	uint16_t		pci_cmd_word;
    339  1.1  rin };
    340  1.1  rin 
    341  1.1  rin struct igc_fc_info {
    342  1.1  rin 	uint32_t	high_water;
    343  1.1  rin 	uint32_t	low_water;
    344  1.1  rin 	uint16_t	pause_time;
    345  1.1  rin 	uint16_t	refresh_time;
    346  1.1  rin 	bool		send_xon;
    347  1.1  rin 	bool		strict_ieee;
    348  1.1  rin 	enum		igc_fc_mode current_mode;
    349  1.1  rin 	enum		igc_fc_mode requested_mode;
    350  1.1  rin };
    351  1.1  rin 
    352  1.1  rin struct igc_dev_spec_i225 {
    353  1.1  rin 	bool		eee_disable;
    354  1.1  rin 	bool		clear_semaphore_once;
    355  1.1  rin 	uint32_t	mtu;
    356  1.1  rin };
    357  1.1  rin 
    358  1.1  rin struct igc_hw {
    359  1.1  rin 	void			*back;
    360  1.1  rin 
    361  1.2  rin 	bus_addr_t		hw_addr;
    362  1.1  rin 
    363  1.1  rin 	struct igc_mac_info	mac;
    364  1.1  rin 	struct igc_fc_info	fc;
    365  1.1  rin 	struct igc_phy_info	phy;
    366  1.1  rin 	struct igc_nvm_info	nvm;
    367  1.1  rin 	struct igc_bus_info	bus;
    368  1.1  rin 
    369  1.1  rin 	union {
    370  1.1  rin 		struct igc_dev_spec_i225 _i225;
    371  1.1  rin 	} dev_spec;
    372  1.1  rin 
    373  1.1  rin 	uint16_t		device_id;
    374  1.1  rin };
    375  1.1  rin 
    376  1.1  rin #endif	/* _IGC_HW_H_ */
    377