1 /*-
2 * Copyright 2008-2013 Solarflare Communications Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26 #ifndef _SYS_SFT9001_H
27 #define _SYS_SFT9001_H
28
29 #include "efx.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #if EFSYS_OPT_PHY_SFT9001
36
37 #define SFT9001_10G_LOOPBACK_MASK \
38 ((1 << EFX_LOOPBACK_PHY_XS) | \
39 (1 << EFX_LOOPBACK_PCS) | \
40 (1 << EFX_LOOPBACK_PMA_PMD) | \
41 FALCON_XMAC_LOOPBACK_MASK)
42
43 #define SFT9001_1G_LOOPBACK_MASK \
44 ((1 << EFX_LOOPBACK_GPHY) | \
45 FALCON_GMAC_LOOPBACK_MASK)
46
47 #define SFT9001_LED_MASK \
48 ((1 << EFX_PHY_LED_OFF) | \
49 (1 << EFX_PHY_LED_ON) | \
50 (1 << EFX_PHY_LED_FLASH))
51
52 /* START MKCONFIG GENERATED Sft9001PhyHeaderPropsBlock 9b100228a7cfe533 */
53 typedef enum sft9001_prop_e {
54 SFT9001_SHORT_REACH,
55 SFT9001_ROBUST,
56 SFT9001_NPROPS
57 } sft9001_prop_t;
58
59 /* END MKCONFIG GENERATED Sft9001PhyHeaderPropsBlock */
60
61 #define SFT9001_ADV_CAP_MASK \
62 ((1 << EFX_PHY_CAP_AN) | \
63 (1 << EFX_PHY_CAP_10000FDX) | \
64 (1 << EFX_PHY_CAP_1000FDX) | \
65 (1 << EFX_PHY_CAP_100FDX) | \
66 (1 << EFX_PHY_CAP_PAUSE))
67
68 #define SFT9001_ADV_CAP_PERM \
69 ((1 << EFX_PHY_CAP_10000FDX) | \
70 (1 << EFX_PHY_CAP_1000FDX) | \
71 (1 << EFX_PHY_CAP_100FDX) | \
72 (1 << EFX_PHY_CAP_100HDX) | \
73 (1 << EFX_PHY_CAP_PAUSE) | \
74 (1 << EFX_PHY_CAP_ASYM))
75
76 #define SFT9001_BIST_MASK \
77 ((1 << EFX_PHY_BIST_TYPE_CABLE_SHORT) | \
78 (1 << EFX_PHY_BIST_TYPE_CABLE_LONG))
79
80 extern __checkReturn int
81 sft9001_reset(
82 __in efx_nic_t *enp);
83
84 extern __checkReturn int
85 sft9001_reconfigure(
86 __in efx_nic_t *enp);
87
88 extern __checkReturn int
89 sft9001_verify(
90 __in efx_nic_t *enp);
91
92 extern __checkReturn int
93 sft9001_uplink_check(
94 __in efx_nic_t *enp,
95 __out boolean_t *upp);
96
97 extern __checkReturn int
98 sft9001_downlink_check(
99 __in efx_nic_t *enp,
100 __out efx_link_mode_t *modep,
101 __out unsigned int *fcntlp,
102 __out uint32_t *lp_cap_maskp);
103
104 extern __checkReturn int
105 sft9001_oui_get(
106 __in efx_nic_t *enp,
107 __out uint32_t *ouip);
108
109 #if EFSYS_OPT_PHY_STATS
110
111 /* START MKCONFIG GENERATED Sft9001PhyHeaderStatsMask 06818b95754126e3 */
112 #define SFT9001_STAT_MASK \
113 (1ULL << EFX_PHY_STAT_OUI) | \
114 (1ULL << EFX_PHY_STAT_PMA_PMD_LINK_UP) | \
115 (1ULL << EFX_PHY_STAT_PMA_PMD_RX_FAULT) | \
116 (1ULL << EFX_PHY_STAT_PMA_PMD_TX_FAULT) | \
117 (1ULL << EFX_PHY_STAT_PMA_PMD_REV_A) | \
118 (1ULL << EFX_PHY_STAT_PMA_PMD_REV_B) | \
119 (1ULL << EFX_PHY_STAT_PMA_PMD_REV_C) | \
120 (1ULL << EFX_PHY_STAT_PMA_PMD_REV_D) | \
121 (1ULL << EFX_PHY_STAT_PCS_LINK_UP) | \
122 (1ULL << EFX_PHY_STAT_PCS_RX_FAULT) | \
123 (1ULL << EFX_PHY_STAT_PCS_TX_FAULT) | \
124 (1ULL << EFX_PHY_STAT_PCS_BER) | \
125 (1ULL << EFX_PHY_STAT_PCS_BLOCK_ERRORS) | \
126 (1ULL << EFX_PHY_STAT_PHY_XS_LINK_UP) | \
127 (1ULL << EFX_PHY_STAT_PHY_XS_RX_FAULT) | \
128 (1ULL << EFX_PHY_STAT_PHY_XS_TX_FAULT) | \
129 (1ULL << EFX_PHY_STAT_PHY_XS_ALIGN) | \
130 (1ULL << EFX_PHY_STAT_PHY_XS_SYNC_A) | \
131 (1ULL << EFX_PHY_STAT_PHY_XS_SYNC_B) | \
132 (1ULL << EFX_PHY_STAT_PHY_XS_SYNC_C) | \
133 (1ULL << EFX_PHY_STAT_PHY_XS_SYNC_D) | \
134 (1ULL << EFX_PHY_STAT_AN_LINK_UP) | \
135 (1ULL << EFX_PHY_STAT_AN_MASTER) | \
136 (1ULL << EFX_PHY_STAT_AN_LOCAL_RX_OK) | \
137 (1ULL << EFX_PHY_STAT_AN_REMOTE_RX_OK) | \
138 (1ULL << EFX_PHY_STAT_CL22EXT_LINK_UP) | \
139 (1ULL << EFX_PHY_STAT_SNR_A) | \
140 (1ULL << EFX_PHY_STAT_SNR_B) | \
141 (1ULL << EFX_PHY_STAT_SNR_C) | \
142 (1ULL << EFX_PHY_STAT_SNR_D)
143
144 /* END MKCONFIG GENERATED Sft9001PhyHeaderStatsMask */
145
146 extern __checkReturn int
147 sft9001_stats_update(
148 __in efx_nic_t *enp,
149 __in efsys_mem_t *esmp,
150 __out_ecount(EFX_PHY_NSTATS) uint32_t *stat);
151
152 #endif /* EFSYS_OPT_PHY_STATS */
153
154 #if EFSYS_OPT_PHY_PROPS
155
156 #if EFSYS_OPT_NAMES
157
158 extern const char __cs *
159 sft9001_prop_name(
160 __in efx_nic_t *enp,
161 __in unsigned int id);
162
163 #endif /* EFSYS_OPT_NAMES */
164
165 extern __checkReturn int
166 sft9001_prop_get(
167 __in efx_nic_t *enp,
168 __in unsigned int id,
169 __in uint32_t flags,
170 __out uint32_t *valp);
171
172 extern __checkReturn int
173 sft9001_prop_set(
174 __in efx_nic_t *enp,
175 __in unsigned int id,
176 __in uint32_t val);
177
178 #endif /* EFSYS_OPT_PHY_PROPS */
179
180 #if EFSYS_OPT_NVRAM_SFT9001
181
182 extern __checkReturn int
183 sft9001_nvram_size(
184 __in efx_nic_t *enp,
185 __out size_t *sizep);
186
187 extern __checkReturn int
188 sft9001_nvram_get_version(
189 __in efx_nic_t *enp,
190 __out uint32_t *subtypep,
191 __out_ecount(4) uint16_t version[4]);
192
193 extern __checkReturn int
194 sft9001_nvram_rw_start(
195 __in efx_nic_t *enp,
196 __out size_t *block_sizep);
197
198 extern __checkReturn int
199 sft9001_nvram_read_chunk(
200 __in efx_nic_t *enp,
201 __in unsigned int offset,
202 __out_bcount(size) caddr_t data,
203 __in size_t size);
204
205 extern __checkReturn int
206 sft9001_nvram_erase(
207 __in efx_nic_t *enp);
208
209 extern __checkReturn int
210 sft9001_nvram_write_chunk(
211 __in efx_nic_t *enp,
212 __in unsigned int offset,
213 __in_bcount(size) caddr_t data,
214 __in size_t size);
215
216 extern void
217 sft9001_nvram_rw_finish(
218 __in efx_nic_t *enp);
219
220 extern const uint8_t * const sft9001_loader;
221 extern const size_t sft9001_loader_size;
222
223 #pragma pack(1)
224
225 typedef struct sft9001_firmware_header_s {
226 efx_dword_t code_length;
227 efx_dword_t destination_address;
228 efx_word_t code_checksum;
229 efx_word_t boot_config;
230 efx_word_t header_csum;
231 efx_byte_t reserved[18];
232 } sft9001_firmware_header_t;
233
234 #pragma pack()
235
236 #endif /* EFSYS_OPT_NVRAM_SFT9001 */
237
238 #if EFSYS_OPT_PHY_BIST
239
240 extern __checkReturn int
241 sft9001_bist_start(
242 __in efx_nic_t *enp,
243 __in efx_phy_bist_type_t type);
244
245 extern __checkReturn int
246 sft9001_bist_poll(
247 __in efx_nic_t *enp,
248 __in efx_phy_bist_type_t type,
249 __out efx_phy_bist_result_t *resultp,
250 __out_opt uint32_t *value_maskp,
251 __out_ecount_opt(count) unsigned long *valuesp,
252 __in size_t count);
253
254 extern void
255 sft9001_bist_stop(
256 __in efx_nic_t *enp,
257 __in efx_phy_bist_type_t type);
258
259 #endif /* EFSYS_OPT_PHY_BIST */
260
261 #endif /* EFSYS_OPT_SFT9001 */
262
263 #ifdef __cplusplus
264 }
265 #endif
266
267 #endif /* _SYS_SFT9001_H */