1 /*
2  * Copyright (c) 2009-2015 Solarflare Communications Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * The views and conclusions contained in the software and documentation are
27  * those of the authors and should not be interpreted as representing official
28  * policies, either expressed or implied, of the FreeBSD Project.
29  */
30 
31 #ifndef _SYS_SIENA_IMPL_H
32 #define	_SYS_SIENA_IMPL_H
33 
34 #include "efx.h"
35 #include "efx_regs.h"
36 #include "efx_mcdi.h"
37 #include "siena_flash.h"
38 
39 #ifdef	__cplusplus
40 extern "C" {
41 #endif
42 
43 #define	SIENA_NVRAM_CHUNK 0x80
44 
45 extern	__checkReturn	efx_rc_t
46 siena_nic_probe(
47 	__in		efx_nic_t *enp);
48 
49 extern	__checkReturn	efx_rc_t
50 siena_nic_reset(
51 	__in		efx_nic_t *enp);
52 
53 extern	__checkReturn	efx_rc_t
54 siena_nic_init(
55 	__in		efx_nic_t *enp);
56 
57 #if EFSYS_OPT_DIAG
58 
59 extern	__checkReturn	efx_rc_t
60 siena_nic_register_test(
61 	__in		efx_nic_t *enp);
62 
63 #endif	/* EFSYS_OPT_DIAG */
64 
65 extern			void
66 siena_nic_fini(
67 	__in		efx_nic_t *enp);
68 
69 extern			void
70 siena_nic_unprobe(
71 	__in		efx_nic_t *enp);
72 
73 #define	SIENA_SRAM_ROWS	0x12000
74 
75 extern			void
76 siena_sram_init(
77 	__in		efx_nic_t *enp);
78 
79 #if EFSYS_OPT_DIAG
80 
81 extern	__checkReturn	efx_rc_t
82 siena_sram_test(
83 	__in		efx_nic_t *enp,
84 	__in		efx_sram_pattern_fn_t func);
85 
86 #endif	/* EFSYS_OPT_DIAG */
87 
88 #if EFSYS_OPT_MCDI
89 
90 extern	__checkReturn	efx_rc_t
91 siena_mcdi_init(
92 	__in		efx_nic_t *enp,
93 	__in		const efx_mcdi_transport_t *mtp);
94 
95 extern			void
96 siena_mcdi_send_request(
97 	__in		efx_nic_t *enp,
98 	__in		void *hdrp,
99 	__in		size_t hdr_len,
100 	__in		void *sdup,
101 	__in		size_t sdu_len);
102 
103 extern	__checkReturn	boolean_t
104 siena_mcdi_poll_response(
105 	__in		efx_nic_t *enp);
106 
107 extern			void
108 siena_mcdi_read_response(
109 	__in			efx_nic_t *enp,
110 	__out_bcount(length)	void *bufferp,
111 	__in			size_t offset,
112 	__in			size_t length);
113 
114 extern			efx_rc_t
115 siena_mcdi_poll_reboot(
116 	__in		efx_nic_t *enp);
117 
118 extern			void
119 siena_mcdi_fini(
120 	__in		efx_nic_t *enp);
121 
122 extern	__checkReturn	efx_rc_t
123 siena_mcdi_feature_supported(
124 	__in		efx_nic_t *enp,
125 	__in		efx_mcdi_feature_id_t id,
126 	__out		boolean_t *supportedp);
127 
128 #endif /* EFSYS_OPT_MCDI */
129 
130 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
131 
132 extern	__checkReturn		efx_rc_t
133 siena_nvram_partn_lock(
134 	__in			efx_nic_t *enp,
135 	__in			uint32_t partn);
136 
137 extern				void
138 siena_nvram_partn_unlock(
139 	__in			efx_nic_t *enp,
140 	__in			uint32_t partn);
141 
142 extern	__checkReturn		efx_rc_t
143 siena_nvram_get_dynamic_cfg(
144 	__in			efx_nic_t *enp,
145 	__in			uint32_t partn,
146 	__in			boolean_t vpd,
147 	__out			siena_mc_dynamic_config_hdr_t **dcfgp,
148 	__out			size_t *sizep);
149 
150 #endif	/* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
151 
152 #if EFSYS_OPT_NVRAM
153 
154 #if EFSYS_OPT_DIAG
155 
156 extern	__checkReturn		efx_rc_t
157 siena_nvram_test(
158 	__in			efx_nic_t *enp);
159 
160 #endif	/* EFSYS_OPT_DIAG */
161 
162 extern	__checkReturn		efx_rc_t
163 siena_nvram_get_subtype(
164 	__in			efx_nic_t *enp,
165 	__in			uint32_t partn,
166 	__out			uint32_t *subtypep);
167 
168 extern	__checkReturn		efx_rc_t
169 siena_nvram_type_to_partn(
170 	__in			efx_nic_t *enp,
171 	__in			efx_nvram_type_t type,
172 	__out			uint32_t *partnp);
173 
174 extern	__checkReturn		efx_rc_t
175 siena_nvram_partn_size(
176 	__in			efx_nic_t *enp,
177 	__in			uint32_t partn,
178 	__out			size_t *sizep);
179 
180 extern	__checkReturn		efx_rc_t
181 siena_nvram_partn_rw_start(
182 	__in			efx_nic_t *enp,
183 	__in			uint32_t partn,
184 	__out			size_t *chunk_sizep);
185 
186 extern	__checkReturn		efx_rc_t
187 siena_nvram_partn_read(
188 	__in			efx_nic_t *enp,
189 	__in			uint32_t partn,
190 	__in			unsigned int offset,
191 	__out_bcount(size)	caddr_t data,
192 	__in			size_t size);
193 
194 extern	__checkReturn		efx_rc_t
195 siena_nvram_partn_erase(
196 	__in			efx_nic_t *enp,
197 	__in			uint32_t partn,
198 	__in			unsigned int offset,
199 	__in			size_t size);
200 
201 extern	__checkReturn		efx_rc_t
202 siena_nvram_partn_write(
203 	__in			efx_nic_t *enp,
204 	__in			uint32_t partn,
205 	__in			unsigned int offset,
206 	__out_bcount(size)	caddr_t data,
207 	__in			size_t size);
208 
209 extern				void
210 siena_nvram_partn_rw_finish(
211 	__in			efx_nic_t *enp,
212 	__in			uint32_t partn);
213 
214 extern	__checkReturn		efx_rc_t
215 siena_nvram_partn_get_version(
216 	__in			efx_nic_t *enp,
217 	__in			uint32_t partn,
218 	__out			uint32_t *subtypep,
219 	__out_ecount(4)		uint16_t version[4]);
220 
221 extern	__checkReturn		efx_rc_t
222 siena_nvram_partn_set_version(
223 	__in			efx_nic_t *enp,
224 	__in			uint32_t partn,
225 	__in_ecount(4)		uint16_t version[4]);
226 
227 #endif	/* EFSYS_OPT_NVRAM */
228 
229 #if EFSYS_OPT_VPD
230 
231 extern	__checkReturn		efx_rc_t
232 siena_vpd_init(
233 	__in			efx_nic_t *enp);
234 
235 extern	__checkReturn		efx_rc_t
236 siena_vpd_size(
237 	__in			efx_nic_t *enp,
238 	__out			size_t *sizep);
239 
240 extern	__checkReturn		efx_rc_t
241 siena_vpd_read(
242 	__in			efx_nic_t *enp,
243 	__out_bcount(size)	caddr_t data,
244 	__in			size_t size);
245 
246 extern	__checkReturn		efx_rc_t
247 siena_vpd_verify(
248 	__in			efx_nic_t *enp,
249 	__in_bcount(size)	caddr_t data,
250 	__in			size_t size);
251 
252 extern	__checkReturn		efx_rc_t
253 siena_vpd_reinit(
254 	__in			efx_nic_t *enp,
255 	__in_bcount(size)	caddr_t data,
256 	__in			size_t size);
257 
258 extern	__checkReturn		efx_rc_t
259 siena_vpd_get(
260 	__in			efx_nic_t *enp,
261 	__in_bcount(size)	caddr_t data,
262 	__in			size_t size,
263 	__inout			efx_vpd_value_t *evvp);
264 
265 extern	__checkReturn		efx_rc_t
266 siena_vpd_set(
267 	__in			efx_nic_t *enp,
268 	__in_bcount(size)	caddr_t data,
269 	__in			size_t size,
270 	__in			efx_vpd_value_t *evvp);
271 
272 extern	__checkReturn		efx_rc_t
273 siena_vpd_next(
274 	__in			efx_nic_t *enp,
275 	__in_bcount(size)	caddr_t data,
276 	__in			size_t size,
277 	__out			efx_vpd_value_t *evvp,
278 	__inout			unsigned int *contp);
279 
280 extern __checkReturn		efx_rc_t
281 siena_vpd_write(
282 	__in			efx_nic_t *enp,
283 	__in_bcount(size)	caddr_t data,
284 	__in			size_t size);
285 
286 extern				void
287 siena_vpd_fini(
288 	__in			efx_nic_t *enp);
289 
290 #endif	/* EFSYS_OPT_VPD */
291 
292 typedef struct siena_link_state_s {
293 	uint32_t		sls_adv_cap_mask;
294 	uint32_t		sls_lp_cap_mask;
295 	unsigned int 		sls_fcntl;
296 	efx_link_mode_t		sls_link_mode;
297 #if EFSYS_OPT_LOOPBACK
298 	efx_loopback_type_t	sls_loopback;
299 #endif
300 	boolean_t		sls_mac_up;
301 } siena_link_state_t;
302 
303 extern			void
304 siena_phy_link_ev(
305 	__in		efx_nic_t *enp,
306 	__in		efx_qword_t *eqp,
307 	__out		efx_link_mode_t *link_modep);
308 
309 extern	__checkReturn	efx_rc_t
310 siena_phy_get_link(
311 	__in		efx_nic_t *enp,
312 	__out		siena_link_state_t *slsp);
313 
314 extern	__checkReturn	efx_rc_t
315 siena_phy_power(
316 	__in		efx_nic_t *enp,
317 	__in		boolean_t on);
318 
319 extern	__checkReturn	efx_rc_t
320 siena_phy_reconfigure(
321 	__in		efx_nic_t *enp);
322 
323 extern	__checkReturn	efx_rc_t
324 siena_phy_verify(
325 	__in		efx_nic_t *enp);
326 
327 extern	__checkReturn	efx_rc_t
328 siena_phy_oui_get(
329 	__in		efx_nic_t *enp,
330 	__out		uint32_t *ouip);
331 
332 #if EFSYS_OPT_PHY_STATS
333 
334 extern						void
335 siena_phy_decode_stats(
336 	__in					efx_nic_t *enp,
337 	__in					uint32_t vmask,
338 	__in_opt				efsys_mem_t *esmp,
339 	__out_opt				uint64_t *smaskp,
340 	__inout_ecount_opt(EFX_PHY_NSTATS)	uint32_t *stat);
341 
342 extern	__checkReturn			efx_rc_t
343 siena_phy_stats_update(
344 	__in				efx_nic_t *enp,
345 	__in				efsys_mem_t *esmp,
346 	__inout_ecount(EFX_PHY_NSTATS)	uint32_t *stat);
347 
348 #endif	/* EFSYS_OPT_PHY_STATS */
349 
350 #if EFSYS_OPT_BIST
351 
352 extern	__checkReturn		efx_rc_t
353 siena_phy_bist_start(
354 	__in			efx_nic_t *enp,
355 	__in			efx_bist_type_t type);
356 
357 extern	__checkReturn		efx_rc_t
358 siena_phy_bist_poll(
359 	__in			efx_nic_t *enp,
360 	__in			efx_bist_type_t type,
361 	__out			efx_bist_result_t *resultp,
362 	__out_opt __drv_when(count > 0, __notnull)
363 	uint32_t 	*value_maskp,
364 	__out_ecount_opt(count)	__drv_when(count > 0, __notnull)
365 	unsigned long	*valuesp,
366 	__in			size_t count);
367 
368 extern				void
369 siena_phy_bist_stop(
370 	__in			efx_nic_t *enp,
371 	__in			efx_bist_type_t type);
372 
373 #endif	/* EFSYS_OPT_BIST */
374 
375 extern	__checkReturn	efx_rc_t
376 siena_mac_poll(
377 	__in		efx_nic_t *enp,
378 	__out		efx_link_mode_t *link_modep);
379 
380 extern	__checkReturn	efx_rc_t
381 siena_mac_up(
382 	__in		efx_nic_t *enp,
383 	__out		boolean_t *mac_upp);
384 
385 extern	__checkReturn	efx_rc_t
386 siena_mac_reconfigure(
387 	__in	efx_nic_t *enp);
388 
389 #if EFSYS_OPT_LOOPBACK
390 
391 extern	__checkReturn	efx_rc_t
392 siena_mac_loopback_set(
393 	__in		efx_nic_t *enp,
394 	__in		efx_link_mode_t link_mode,
395 	__in		efx_loopback_type_t loopback_type);
396 
397 #endif	/* EFSYS_OPT_LOOPBACK */
398 
399 #if EFSYS_OPT_MAC_STATS
400 
401 extern	__checkReturn			efx_rc_t
402 siena_mac_stats_update(
403 	__in				efx_nic_t *enp,
404 	__in				efsys_mem_t *esmp,
405 	__inout_ecount(EFX_MAC_NSTATS)	efsys_stat_t *stat,
406 	__inout_opt			uint32_t *generationp);
407 
408 #endif	/* EFSYS_OPT_MAC_STATS */
409 
410 #ifdef	__cplusplus
411 }
412 #endif
413 
414 #endif	/* _SYS_SIENA_IMPL_H */
415