diff options
Diffstat (limited to 'drivers/net/sfc/nic.h')
-rw-r--r-- | drivers/net/sfc/nic.h | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/drivers/net/sfc/nic.h b/drivers/net/sfc/nic.h new file mode 100644 index 000000000000..3166bafdfbef --- /dev/null +++ b/drivers/net/sfc/nic.h | |||
@@ -0,0 +1,261 @@ | |||
1 | /**************************************************************************** | ||
2 | * Driver for Solarflare Solarstorm network controllers and boards | ||
3 | * Copyright 2005-2006 Fen Systems Ltd. | ||
4 | * Copyright 2006-2009 Solarflare Communications Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation, incorporated herein by reference. | ||
9 | */ | ||
10 | |||
11 | #ifndef EFX_NIC_H | ||
12 | #define EFX_NIC_H | ||
13 | |||
14 | #include <linux/i2c-algo-bit.h> | ||
15 | #include "net_driver.h" | ||
16 | #include "efx.h" | ||
17 | #include "mcdi.h" | ||
18 | |||
19 | /* | ||
20 | * Falcon hardware control | ||
21 | */ | ||
22 | |||
23 | enum { | ||
24 | EFX_REV_FALCON_A0 = 0, | ||
25 | EFX_REV_FALCON_A1 = 1, | ||
26 | EFX_REV_FALCON_B0 = 2, | ||
27 | EFX_REV_SIENA_A0 = 3, | ||
28 | }; | ||
29 | |||
30 | static inline int efx_nic_rev(struct efx_nic *efx) | ||
31 | { | ||
32 | return efx->type->revision; | ||
33 | } | ||
34 | |||
35 | extern u32 efx_nic_fpga_ver(struct efx_nic *efx); | ||
36 | |||
37 | static inline bool efx_nic_has_mc(struct efx_nic *efx) | ||
38 | { | ||
39 | return efx_nic_rev(efx) >= EFX_REV_SIENA_A0; | ||
40 | } | ||
41 | /* NIC has two interlinked PCI functions for the same port. */ | ||
42 | static inline bool efx_nic_is_dual_func(struct efx_nic *efx) | ||
43 | { | ||
44 | return efx_nic_rev(efx) < EFX_REV_FALCON_B0; | ||
45 | } | ||
46 | |||
47 | enum { | ||
48 | PHY_TYPE_NONE = 0, | ||
49 | PHY_TYPE_TXC43128 = 1, | ||
50 | PHY_TYPE_88E1111 = 2, | ||
51 | PHY_TYPE_SFX7101 = 3, | ||
52 | PHY_TYPE_QT2022C2 = 4, | ||
53 | PHY_TYPE_PM8358 = 6, | ||
54 | PHY_TYPE_SFT9001A = 8, | ||
55 | PHY_TYPE_QT2025C = 9, | ||
56 | PHY_TYPE_SFT9001B = 10, | ||
57 | }; | ||
58 | |||
59 | #define FALCON_XMAC_LOOPBACKS \ | ||
60 | ((1 << LOOPBACK_XGMII) | \ | ||
61 | (1 << LOOPBACK_XGXS) | \ | ||
62 | (1 << LOOPBACK_XAUI)) | ||
63 | |||
64 | #define FALCON_GMAC_LOOPBACKS \ | ||
65 | (1 << LOOPBACK_GMAC) | ||
66 | |||
67 | /** | ||
68 | * struct falcon_board_type - board operations and type information | ||
69 | * @id: Board type id, as found in NVRAM | ||
70 | * @ref_model: Model number of Solarflare reference design | ||
71 | * @gen_type: Generic board type description | ||
72 | * @init: Allocate resources and initialise peripheral hardware | ||
73 | * @init_phy: Do board-specific PHY initialisation | ||
74 | * @fini: Shut down hardware and free resources | ||
75 | * @set_id_led: Set state of identifying LED or revert to automatic function | ||
76 | * @monitor: Board-specific health check function | ||
77 | */ | ||
78 | struct falcon_board_type { | ||
79 | u8 id; | ||
80 | const char *ref_model; | ||
81 | const char *gen_type; | ||
82 | int (*init) (struct efx_nic *nic); | ||
83 | void (*init_phy) (struct efx_nic *efx); | ||
84 | void (*fini) (struct efx_nic *nic); | ||
85 | void (*set_id_led) (struct efx_nic *efx, enum efx_led_mode mode); | ||
86 | int (*monitor) (struct efx_nic *nic); | ||
87 | }; | ||
88 | |||
89 | /** | ||
90 | * struct falcon_board - board information | ||
91 | * @type: Type of board | ||
92 | * @major: Major rev. ('A', 'B' ...) | ||
93 | * @minor: Minor rev. (0, 1, ...) | ||
94 | * @i2c_adap: I2C adapter for on-board peripherals | ||
95 | * @i2c_data: Data for bit-banging algorithm | ||
96 | * @hwmon_client: I2C client for hardware monitor | ||
97 | * @ioexp_client: I2C client for power/port control | ||
98 | */ | ||
99 | struct falcon_board { | ||
100 | const struct falcon_board_type *type; | ||
101 | int major; | ||
102 | int minor; | ||
103 | struct i2c_adapter i2c_adap; | ||
104 | struct i2c_algo_bit_data i2c_data; | ||
105 | struct i2c_client *hwmon_client, *ioexp_client; | ||
106 | }; | ||
107 | |||
108 | /** | ||
109 | * struct falcon_nic_data - Falcon NIC state | ||
110 | * @pci_dev2: Secondary function of Falcon A | ||
111 | * @board: Board state and functions | ||
112 | * @stats_disable_count: Nest count for disabling statistics fetches | ||
113 | * @stats_pending: Is there a pending DMA of MAC statistics. | ||
114 | * @stats_timer: A timer for regularly fetching MAC statistics. | ||
115 | * @stats_dma_done: Pointer to the flag which indicates DMA completion. | ||
116 | */ | ||
117 | struct falcon_nic_data { | ||
118 | struct pci_dev *pci_dev2; | ||
119 | struct falcon_board board; | ||
120 | unsigned int stats_disable_count; | ||
121 | bool stats_pending; | ||
122 | struct timer_list stats_timer; | ||
123 | u32 *stats_dma_done; | ||
124 | }; | ||
125 | |||
126 | static inline struct falcon_board *falcon_board(struct efx_nic *efx) | ||
127 | { | ||
128 | struct falcon_nic_data *data = efx->nic_data; | ||
129 | return &data->board; | ||
130 | } | ||
131 | |||
132 | /** | ||
133 | * struct siena_nic_data - Siena NIC state | ||
134 | * @fw_version: Management controller firmware version | ||
135 | * @fw_build: Firmware build number | ||
136 | * @mcdi: Management-Controller-to-Driver Interface | ||
137 | * @wol_filter_id: Wake-on-LAN packet filter id | ||
138 | */ | ||
139 | struct siena_nic_data { | ||
140 | u64 fw_version; | ||
141 | u32 fw_build; | ||
142 | struct efx_mcdi_iface mcdi; | ||
143 | int wol_filter_id; | ||
144 | }; | ||
145 | |||
146 | extern void siena_print_fwver(struct efx_nic *efx, char *buf, size_t len); | ||
147 | |||
148 | extern struct efx_nic_type falcon_a1_nic_type; | ||
149 | extern struct efx_nic_type falcon_b0_nic_type; | ||
150 | extern struct efx_nic_type siena_a0_nic_type; | ||
151 | |||
152 | /************************************************************************** | ||
153 | * | ||
154 | * Externs | ||
155 | * | ||
156 | ************************************************************************** | ||
157 | */ | ||
158 | |||
159 | extern int falcon_probe_board(struct efx_nic *efx, u16 revision_info); | ||
160 | |||
161 | /* TX data path */ | ||
162 | extern int efx_nic_probe_tx(struct efx_tx_queue *tx_queue); | ||
163 | extern void efx_nic_init_tx(struct efx_tx_queue *tx_queue); | ||
164 | extern void efx_nic_fini_tx(struct efx_tx_queue *tx_queue); | ||
165 | extern void efx_nic_remove_tx(struct efx_tx_queue *tx_queue); | ||
166 | extern void efx_nic_push_buffers(struct efx_tx_queue *tx_queue); | ||
167 | |||
168 | /* RX data path */ | ||
169 | extern int efx_nic_probe_rx(struct efx_rx_queue *rx_queue); | ||
170 | extern void efx_nic_init_rx(struct efx_rx_queue *rx_queue); | ||
171 | extern void efx_nic_fini_rx(struct efx_rx_queue *rx_queue); | ||
172 | extern void efx_nic_remove_rx(struct efx_rx_queue *rx_queue); | ||
173 | extern void efx_nic_notify_rx_desc(struct efx_rx_queue *rx_queue); | ||
174 | |||
175 | /* Event data path */ | ||
176 | extern int efx_nic_probe_eventq(struct efx_channel *channel); | ||
177 | extern void efx_nic_init_eventq(struct efx_channel *channel); | ||
178 | extern void efx_nic_fini_eventq(struct efx_channel *channel); | ||
179 | extern void efx_nic_remove_eventq(struct efx_channel *channel); | ||
180 | extern int efx_nic_process_eventq(struct efx_channel *channel, int rx_quota); | ||
181 | extern void efx_nic_eventq_read_ack(struct efx_channel *channel); | ||
182 | |||
183 | /* MAC/PHY */ | ||
184 | extern void falcon_drain_tx_fifo(struct efx_nic *efx); | ||
185 | extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx); | ||
186 | extern int efx_nic_rx_xoff_thresh, efx_nic_rx_xon_thresh; | ||
187 | |||
188 | /* Interrupts and test events */ | ||
189 | extern int efx_nic_init_interrupt(struct efx_nic *efx); | ||
190 | extern void efx_nic_enable_interrupts(struct efx_nic *efx); | ||
191 | extern void efx_nic_generate_test_event(struct efx_channel *channel, | ||
192 | unsigned int magic); | ||
193 | extern void efx_nic_generate_interrupt(struct efx_nic *efx); | ||
194 | extern void efx_nic_disable_interrupts(struct efx_nic *efx); | ||
195 | extern void efx_nic_fini_interrupt(struct efx_nic *efx); | ||
196 | extern irqreturn_t efx_nic_fatal_interrupt(struct efx_nic *efx); | ||
197 | extern irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id); | ||
198 | extern void falcon_irq_ack_a1(struct efx_nic *efx); | ||
199 | |||
200 | #define EFX_IRQ_MOD_RESOLUTION 5 | ||
201 | |||
202 | /* Global Resources */ | ||
203 | extern int efx_nic_flush_queues(struct efx_nic *efx); | ||
204 | extern void falcon_start_nic_stats(struct efx_nic *efx); | ||
205 | extern void falcon_stop_nic_stats(struct efx_nic *efx); | ||
206 | extern int falcon_reset_xaui(struct efx_nic *efx); | ||
207 | extern void efx_nic_init_common(struct efx_nic *efx); | ||
208 | |||
209 | int efx_nic_alloc_buffer(struct efx_nic *efx, struct efx_buffer *buffer, | ||
210 | unsigned int len); | ||
211 | void efx_nic_free_buffer(struct efx_nic *efx, struct efx_buffer *buffer); | ||
212 | |||
213 | /* Tests */ | ||
214 | struct efx_nic_register_test { | ||
215 | unsigned address; | ||
216 | efx_oword_t mask; | ||
217 | }; | ||
218 | extern int efx_nic_test_registers(struct efx_nic *efx, | ||
219 | const struct efx_nic_register_test *regs, | ||
220 | size_t n_regs); | ||
221 | |||
222 | /************************************************************************** | ||
223 | * | ||
224 | * Falcon MAC stats | ||
225 | * | ||
226 | ************************************************************************** | ||
227 | */ | ||
228 | |||
229 | #define FALCON_STAT_OFFSET(falcon_stat) EFX_VAL(falcon_stat, offset) | ||
230 | #define FALCON_STAT_WIDTH(falcon_stat) EFX_VAL(falcon_stat, WIDTH) | ||
231 | |||
232 | /* Retrieve statistic from statistics block */ | ||
233 | #define FALCON_STAT(efx, falcon_stat, efx_stat) do { \ | ||
234 | if (FALCON_STAT_WIDTH(falcon_stat) == 16) \ | ||
235 | (efx)->mac_stats.efx_stat += le16_to_cpu( \ | ||
236 | *((__force __le16 *) \ | ||
237 | (efx->stats_buffer.addr + \ | ||
238 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
239 | else if (FALCON_STAT_WIDTH(falcon_stat) == 32) \ | ||
240 | (efx)->mac_stats.efx_stat += le32_to_cpu( \ | ||
241 | *((__force __le32 *) \ | ||
242 | (efx->stats_buffer.addr + \ | ||
243 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
244 | else \ | ||
245 | (efx)->mac_stats.efx_stat += le64_to_cpu( \ | ||
246 | *((__force __le64 *) \ | ||
247 | (efx->stats_buffer.addr + \ | ||
248 | FALCON_STAT_OFFSET(falcon_stat)))); \ | ||
249 | } while (0) | ||
250 | |||
251 | #define FALCON_MAC_STATS_SIZE 0x100 | ||
252 | |||
253 | #define MAC_DATA_LBN 0 | ||
254 | #define MAC_DATA_WIDTH 32 | ||
255 | |||
256 | extern void efx_nic_generate_event(struct efx_channel *channel, | ||
257 | efx_qword_t *event); | ||
258 | |||
259 | extern void falcon_poll_xmac(struct efx_nic *efx); | ||
260 | |||
261 | #endif /* EFX_NIC_H */ | ||