Commit | Line | Data |
---|---|---|
9c80d176 SZ |
1 | /****************************************************************************** |
2 | ||
4765c386 | 3 | Copyright (c) 2001-2014, Intel Corporation |
9c80d176 SZ |
4 | All rights reserved. |
5 | ||
6 | Redistribution and use in source and binary forms, with or without | |
7 | modification, are permitted provided that the following conditions are met: | |
8 | ||
9 | 1. Redistributions of source code must retain the above copyright notice, | |
10 | this list of conditions and the following disclaimer. | |
11 | ||
12 | 2. Redistributions in binary form must reproduce the above copyright | |
13 | notice, this list of conditions and the following disclaimer in the | |
14 | documentation and/or other materials provided with the distribution. | |
15 | ||
16 | 3. Neither the name of the Intel Corporation nor the names of its | |
17 | contributors may be used to endorse or promote products derived from | |
18 | this software without specific prior written permission. | |
19 | ||
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
23 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |
24 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
25 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
26 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
27 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
28 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
29 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
30 | POSSIBILITY OF SUCH DAMAGE. | |
31 | ||
32 | ******************************************************************************/ | |
379ebbe7 | 33 | /*$FreeBSD:$*/ |
9c80d176 SZ |
34 | |
35 | #include "e1000_api.h" | |
36 | ||
37 | /** | |
38 | * e1000_init_mac_params - Initialize MAC function pointers | |
39 | * @hw: pointer to the HW structure | |
40 | * | |
41 | * This function initializes the function pointers for the MAC | |
42 | * set of functions. Called by drivers or by e1000_setup_init_funcs. | |
43 | **/ | |
44 | s32 e1000_init_mac_params(struct e1000_hw *hw) | |
45 | { | |
46 | s32 ret_val = E1000_SUCCESS; | |
47 | ||
48 | if (hw->mac.ops.init_params) { | |
49 | ret_val = hw->mac.ops.init_params(hw); | |
50 | if (ret_val) { | |
51 | DEBUGOUT("MAC Initialization Error\n"); | |
52 | goto out; | |
53 | } | |
54 | } else { | |
55 | DEBUGOUT("mac.init_mac_params was NULL\n"); | |
56 | ret_val = -E1000_ERR_CONFIG; | |
57 | } | |
58 | ||
59 | out: | |
60 | return ret_val; | |
61 | } | |
62 | ||
63 | /** | |
64 | * e1000_init_nvm_params - Initialize NVM function pointers | |
65 | * @hw: pointer to the HW structure | |
66 | * | |
67 | * This function initializes the function pointers for the NVM | |
68 | * set of functions. Called by drivers or by e1000_setup_init_funcs. | |
69 | **/ | |
70 | s32 e1000_init_nvm_params(struct e1000_hw *hw) | |
71 | { | |
72 | s32 ret_val = E1000_SUCCESS; | |
73 | ||
74 | if (hw->nvm.ops.init_params) { | |
75 | ret_val = hw->nvm.ops.init_params(hw); | |
76 | if (ret_val) { | |
77 | DEBUGOUT("NVM Initialization Error\n"); | |
78 | goto out; | |
79 | } | |
80 | } else { | |
81 | DEBUGOUT("nvm.init_nvm_params was NULL\n"); | |
82 | ret_val = -E1000_ERR_CONFIG; | |
83 | } | |
84 | ||
85 | out: | |
86 | return ret_val; | |
87 | } | |
88 | ||
89 | /** | |
90 | * e1000_init_phy_params - Initialize PHY function pointers | |
91 | * @hw: pointer to the HW structure | |
92 | * | |
93 | * This function initializes the function pointers for the PHY | |
94 | * set of functions. Called by drivers or by e1000_setup_init_funcs. | |
95 | **/ | |
96 | s32 e1000_init_phy_params(struct e1000_hw *hw) | |
97 | { | |
98 | s32 ret_val = E1000_SUCCESS; | |
99 | ||
100 | if (hw->phy.ops.init_params) { | |
101 | ret_val = hw->phy.ops.init_params(hw); | |
102 | if (ret_val) { | |
103 | DEBUGOUT("PHY Initialization Error\n"); | |
104 | goto out; | |
105 | } | |
106 | } else { | |
107 | DEBUGOUT("phy.init_phy_params was NULL\n"); | |
108 | ret_val = -E1000_ERR_CONFIG; | |
109 | } | |
110 | ||
111 | out: | |
112 | return ret_val; | |
113 | } | |
114 | ||
62583d18 SZ |
115 | /** |
116 | * e1000_init_mbx_params - Initialize mailbox function pointers | |
117 | * @hw: pointer to the HW structure | |
118 | * | |
119 | * This function initializes the function pointers for the PHY | |
120 | * set of functions. Called by drivers or by e1000_setup_init_funcs. | |
121 | **/ | |
122 | s32 e1000_init_mbx_params(struct e1000_hw *hw) | |
123 | { | |
124 | s32 ret_val = E1000_SUCCESS; | |
125 | ||
126 | if (hw->mbx.ops.init_params) { | |
127 | ret_val = hw->mbx.ops.init_params(hw); | |
128 | if (ret_val) { | |
129 | DEBUGOUT("Mailbox Initialization Error\n"); | |
130 | goto out; | |
131 | } | |
132 | } else { | |
133 | DEBUGOUT("mbx.init_mbx_params was NULL\n"); | |
134 | ret_val = -E1000_ERR_CONFIG; | |
135 | } | |
136 | ||
137 | out: | |
138 | return ret_val; | |
139 | } | |
140 | ||
9c80d176 SZ |
141 | /** |
142 | * e1000_set_mac_type - Sets MAC type | |
143 | * @hw: pointer to the HW structure | |
144 | * | |
145 | * This function sets the mac type of the adapter based on the | |
146 | * device ID stored in the hw structure. | |
147 | * MUST BE FIRST FUNCTION CALLED (explicitly or through | |
148 | * e1000_setup_init_funcs()). | |
149 | **/ | |
150 | s32 e1000_set_mac_type(struct e1000_hw *hw) | |
151 | { | |
152 | struct e1000_mac_info *mac = &hw->mac; | |
153 | s32 ret_val = E1000_SUCCESS; | |
154 | ||
155 | DEBUGFUNC("e1000_set_mac_type"); | |
156 | ||
157 | switch (hw->device_id) { | |
6a5a645e | 158 | #ifndef NO_82542_SUPPORT |
9c80d176 SZ |
159 | case E1000_DEV_ID_82542: |
160 | mac->type = e1000_82542; | |
161 | break; | |
6a5a645e | 162 | #endif |
9c80d176 SZ |
163 | case E1000_DEV_ID_82543GC_FIBER: |
164 | case E1000_DEV_ID_82543GC_COPPER: | |
165 | mac->type = e1000_82543; | |
166 | break; | |
167 | case E1000_DEV_ID_82544EI_COPPER: | |
168 | case E1000_DEV_ID_82544EI_FIBER: | |
169 | case E1000_DEV_ID_82544GC_COPPER: | |
170 | case E1000_DEV_ID_82544GC_LOM: | |
171 | mac->type = e1000_82544; | |
172 | break; | |
173 | case E1000_DEV_ID_82540EM: | |
174 | case E1000_DEV_ID_82540EM_LOM: | |
175 | case E1000_DEV_ID_82540EP: | |
176 | case E1000_DEV_ID_82540EP_LOM: | |
177 | case E1000_DEV_ID_82540EP_LP: | |
178 | mac->type = e1000_82540; | |
179 | break; | |
180 | case E1000_DEV_ID_82545EM_COPPER: | |
181 | case E1000_DEV_ID_82545EM_FIBER: | |
182 | mac->type = e1000_82545; | |
183 | break; | |
184 | case E1000_DEV_ID_82545GM_COPPER: | |
185 | case E1000_DEV_ID_82545GM_FIBER: | |
186 | case E1000_DEV_ID_82545GM_SERDES: | |
187 | mac->type = e1000_82545_rev_3; | |
188 | break; | |
189 | case E1000_DEV_ID_82546EB_COPPER: | |
190 | case E1000_DEV_ID_82546EB_FIBER: | |
191 | case E1000_DEV_ID_82546EB_QUAD_COPPER: | |
192 | mac->type = e1000_82546; | |
193 | break; | |
194 | case E1000_DEV_ID_82546GB_COPPER: | |
195 | case E1000_DEV_ID_82546GB_FIBER: | |
196 | case E1000_DEV_ID_82546GB_SERDES: | |
197 | case E1000_DEV_ID_82546GB_PCIE: | |
198 | case E1000_DEV_ID_82546GB_QUAD_COPPER: | |
199 | case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: | |
200 | mac->type = e1000_82546_rev_3; | |
201 | break; | |
202 | case E1000_DEV_ID_82541EI: | |
203 | case E1000_DEV_ID_82541EI_MOBILE: | |
204 | case E1000_DEV_ID_82541ER_LOM: | |
205 | mac->type = e1000_82541; | |
206 | break; | |
207 | case E1000_DEV_ID_82541ER: | |
208 | case E1000_DEV_ID_82541GI: | |
209 | case E1000_DEV_ID_82541GI_LF: | |
210 | case E1000_DEV_ID_82541GI_MOBILE: | |
211 | mac->type = e1000_82541_rev_2; | |
212 | break; | |
213 | case E1000_DEV_ID_82547EI: | |
214 | case E1000_DEV_ID_82547EI_MOBILE: | |
215 | mac->type = e1000_82547; | |
216 | break; | |
217 | case E1000_DEV_ID_82547GI: | |
218 | mac->type = e1000_82547_rev_2; | |
219 | break; | |
220 | case E1000_DEV_ID_82571EB_COPPER: | |
221 | case E1000_DEV_ID_82571EB_FIBER: | |
222 | case E1000_DEV_ID_82571EB_SERDES: | |
223 | case E1000_DEV_ID_82571EB_SERDES_DUAL: | |
224 | case E1000_DEV_ID_82571EB_SERDES_QUAD: | |
225 | case E1000_DEV_ID_82571EB_QUAD_COPPER: | |
226 | case E1000_DEV_ID_82571PT_QUAD_COPPER: | |
227 | case E1000_DEV_ID_82571EB_QUAD_FIBER: | |
228 | case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: | |
4be59a01 | 229 | case E1000_DEV_ID_82571EB_QUAD_COPPER_BP: |
9c80d176 SZ |
230 | mac->type = e1000_82571; |
231 | break; | |
232 | case E1000_DEV_ID_82572EI: | |
233 | case E1000_DEV_ID_82572EI_COPPER: | |
234 | case E1000_DEV_ID_82572EI_FIBER: | |
235 | case E1000_DEV_ID_82572EI_SERDES: | |
236 | mac->type = e1000_82572; | |
237 | break; | |
238 | case E1000_DEV_ID_82573E: | |
239 | case E1000_DEV_ID_82573E_IAMT: | |
240 | case E1000_DEV_ID_82573L: | |
241 | mac->type = e1000_82573; | |
242 | break; | |
243 | case E1000_DEV_ID_82574L: | |
6a5a645e | 244 | case E1000_DEV_ID_82574LA: |
9c80d176 SZ |
245 | mac->type = e1000_82574; |
246 | break; | |
6a5a645e SZ |
247 | case E1000_DEV_ID_82583V: |
248 | mac->type = e1000_82583; | |
249 | break; | |
9c80d176 SZ |
250 | case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: |
251 | case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: | |
252 | case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: | |
253 | case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: | |
254 | mac->type = e1000_80003es2lan; | |
255 | break; | |
256 | case E1000_DEV_ID_ICH8_IFE: | |
257 | case E1000_DEV_ID_ICH8_IFE_GT: | |
258 | case E1000_DEV_ID_ICH8_IFE_G: | |
259 | case E1000_DEV_ID_ICH8_IGP_M: | |
260 | case E1000_DEV_ID_ICH8_IGP_M_AMT: | |
261 | case E1000_DEV_ID_ICH8_IGP_AMT: | |
262 | case E1000_DEV_ID_ICH8_IGP_C: | |
6a5a645e | 263 | case E1000_DEV_ID_ICH8_82567V_3: |
9c80d176 SZ |
264 | mac->type = e1000_ich8lan; |
265 | break; | |
266 | case E1000_DEV_ID_ICH9_IFE: | |
267 | case E1000_DEV_ID_ICH9_IFE_GT: | |
268 | case E1000_DEV_ID_ICH9_IFE_G: | |
269 | case E1000_DEV_ID_ICH9_IGP_M: | |
270 | case E1000_DEV_ID_ICH9_IGP_M_AMT: | |
271 | case E1000_DEV_ID_ICH9_IGP_M_V: | |
272 | case E1000_DEV_ID_ICH9_IGP_AMT: | |
273 | case E1000_DEV_ID_ICH9_BM: | |
274 | case E1000_DEV_ID_ICH9_IGP_C: | |
275 | case E1000_DEV_ID_ICH10_R_BM_LM: | |
276 | case E1000_DEV_ID_ICH10_R_BM_LF: | |
277 | case E1000_DEV_ID_ICH10_R_BM_V: | |
278 | mac->type = e1000_ich9lan; | |
279 | break; | |
280 | case E1000_DEV_ID_ICH10_D_BM_LM: | |
281 | case E1000_DEV_ID_ICH10_D_BM_LF: | |
6a5a645e | 282 | case E1000_DEV_ID_ICH10_D_BM_V: |
9c80d176 SZ |
283 | mac->type = e1000_ich10lan; |
284 | break; | |
6a5a645e SZ |
285 | case E1000_DEV_ID_PCH_D_HV_DM: |
286 | case E1000_DEV_ID_PCH_D_HV_DC: | |
287 | case E1000_DEV_ID_PCH_M_HV_LM: | |
288 | case E1000_DEV_ID_PCH_M_HV_LC: | |
289 | mac->type = e1000_pchlan; | |
9c80d176 | 290 | break; |
6a5a645e SZ |
291 | case E1000_DEV_ID_PCH2_LV_LM: |
292 | case E1000_DEV_ID_PCH2_LV_V: | |
293 | mac->type = e1000_pch2lan; | |
9c80d176 | 294 | break; |
379ebbe7 SZ |
295 | case E1000_DEV_ID_PCH_LPT_I217_LM: |
296 | case E1000_DEV_ID_PCH_LPT_I217_V: | |
297 | case E1000_DEV_ID_PCH_LPTLP_I218_LM: | |
298 | case E1000_DEV_ID_PCH_LPTLP_I218_V: | |
4765c386 MN |
299 | case E1000_DEV_ID_PCH_I218_LM2: |
300 | case E1000_DEV_ID_PCH_I218_V2: | |
301 | case E1000_DEV_ID_PCH_I218_LM3: | |
302 | case E1000_DEV_ID_PCH_I218_V3: | |
379ebbe7 SZ |
303 | mac->type = e1000_pch_lpt; |
304 | break; | |
524ce499 SZ |
305 | case E1000_DEV_ID_PCH_SPT_I219_LM: |
306 | case E1000_DEV_ID_PCH_SPT_I219_V: | |
307 | case E1000_DEV_ID_PCH_SPT_I219_LM2: | |
308 | case E1000_DEV_ID_PCH_SPT_I219_V2: | |
309 | mac->type = e1000_pch_spt; | |
310 | break; | |
62583d18 SZ |
311 | case E1000_DEV_ID_82575EB_COPPER: |
312 | case E1000_DEV_ID_82575EB_FIBER_SERDES: | |
313 | case E1000_DEV_ID_82575GB_QUAD_COPPER: | |
314 | mac->type = e1000_82575; | |
315 | break; | |
316 | case E1000_DEV_ID_82576: | |
317 | case E1000_DEV_ID_82576_FIBER: | |
318 | case E1000_DEV_ID_82576_SERDES: | |
319 | case E1000_DEV_ID_82576_QUAD_COPPER: | |
320 | case E1000_DEV_ID_82576_QUAD_COPPER_ET2: | |
321 | case E1000_DEV_ID_82576_NS: | |
322 | case E1000_DEV_ID_82576_NS_SERDES: | |
323 | case E1000_DEV_ID_82576_SERDES_QUAD: | |
324 | mac->type = e1000_82576; | |
325 | break; | |
326 | case E1000_DEV_ID_82580_COPPER: | |
327 | case E1000_DEV_ID_82580_FIBER: | |
328 | case E1000_DEV_ID_82580_SERDES: | |
329 | case E1000_DEV_ID_82580_SGMII: | |
330 | case E1000_DEV_ID_82580_COPPER_DUAL: | |
331 | case E1000_DEV_ID_82580_QUAD_FIBER: | |
332 | case E1000_DEV_ID_DH89XXCC_SGMII: | |
333 | case E1000_DEV_ID_DH89XXCC_SERDES: | |
334 | case E1000_DEV_ID_DH89XXCC_BACKPLANE: | |
335 | case E1000_DEV_ID_DH89XXCC_SFP: | |
336 | mac->type = e1000_82580; | |
337 | break; | |
338 | case E1000_DEV_ID_I350_COPPER: | |
339 | case E1000_DEV_ID_I350_FIBER: | |
340 | case E1000_DEV_ID_I350_SERDES: | |
341 | case E1000_DEV_ID_I350_SGMII: | |
342 | case E1000_DEV_ID_I350_DA4: | |
343 | mac->type = e1000_i350; | |
344 | break; | |
379ebbe7 SZ |
345 | case E1000_DEV_ID_I210_COPPER_FLASHLESS: |
346 | case E1000_DEV_ID_I210_SERDES_FLASHLESS: | |
4be59a01 SZ |
347 | case E1000_DEV_ID_I210_COPPER: |
348 | case E1000_DEV_ID_I210_COPPER_OEM1: | |
349 | case E1000_DEV_ID_I210_COPPER_IT: | |
350 | case E1000_DEV_ID_I210_FIBER: | |
351 | case E1000_DEV_ID_I210_SERDES: | |
352 | case E1000_DEV_ID_I210_SGMII: | |
353 | mac->type = e1000_i210; | |
354 | break; | |
355 | case E1000_DEV_ID_I211_COPPER: | |
356 | mac->type = e1000_i211; | |
357 | break; | |
62583d18 | 358 | case E1000_DEV_ID_82576_VF: |
379ebbe7 | 359 | case E1000_DEV_ID_82576_VF_HV: |
62583d18 SZ |
360 | mac->type = e1000_vfadapt; |
361 | break; | |
362 | case E1000_DEV_ID_I350_VF: | |
379ebbe7 | 363 | case E1000_DEV_ID_I350_VF_HV: |
62583d18 SZ |
364 | mac->type = e1000_vfadapt_i350; |
365 | break; | |
4be59a01 | 366 | |
379ebbe7 SZ |
367 | case E1000_DEV_ID_I354_BACKPLANE_1GBPS: |
368 | case E1000_DEV_ID_I354_SGMII: | |
ba0123e0 | 369 | case E1000_DEV_ID_I354_BACKPLANE_2_5GBPS: |
379ebbe7 SZ |
370 | mac->type = e1000_i354; |
371 | break; | |
9c80d176 SZ |
372 | default: |
373 | /* Should never have loaded on this device */ | |
374 | ret_val = -E1000_ERR_MAC_INIT; | |
375 | break; | |
376 | } | |
377 | ||
378 | return ret_val; | |
379 | } | |
380 | ||
381 | /** | |
382 | * e1000_setup_init_funcs - Initializes function pointers | |
383 | * @hw: pointer to the HW structure | |
384 | * @init_device: TRUE will initialize the rest of the function pointers | |
4be59a01 SZ |
385 | * getting the device ready for use. FALSE will only set |
386 | * MAC type and the function pointers for the other init | |
387 | * functions. Passing FALSE will not generate any hardware | |
388 | * reads or writes. | |
9c80d176 SZ |
389 | * |
390 | * This function must be called by a driver in order to use the rest | |
391 | * of the 'shared' code files. Called by drivers only. | |
392 | **/ | |
393 | s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) | |
394 | { | |
395 | s32 ret_val; | |
396 | ||
397 | /* Can't do much good without knowing the MAC type. */ | |
398 | ret_val = e1000_set_mac_type(hw); | |
399 | if (ret_val) { | |
400 | DEBUGOUT("ERROR: MAC type could not be set properly.\n"); | |
401 | goto out; | |
402 | } | |
403 | ||
404 | if (!hw->hw_addr) { | |
405 | DEBUGOUT("ERROR: Registers not mapped\n"); | |
406 | ret_val = -E1000_ERR_CONFIG; | |
407 | goto out; | |
408 | } | |
409 | ||
410 | /* | |
411 | * Init function pointers to generic implementations. We do this first | |
412 | * allowing a driver module to override it afterward. | |
413 | */ | |
414 | e1000_init_mac_ops_generic(hw); | |
415 | e1000_init_phy_ops_generic(hw); | |
416 | e1000_init_nvm_ops_generic(hw); | |
62583d18 | 417 | e1000_init_mbx_ops_generic(hw); |
9c80d176 SZ |
418 | |
419 | /* | |
420 | * Set up the init function pointers. These are functions within the | |
421 | * adapter family file that sets up function pointers for the rest of | |
422 | * the functions in that family. | |
423 | */ | |
424 | switch (hw->mac.type) { | |
6a5a645e | 425 | #ifndef NO_82542_SUPPORT |
9c80d176 SZ |
426 | case e1000_82542: |
427 | e1000_init_function_pointers_82542(hw); | |
428 | break; | |
6a5a645e | 429 | #endif |
9c80d176 SZ |
430 | case e1000_82543: |
431 | case e1000_82544: | |
432 | e1000_init_function_pointers_82543(hw); | |
433 | break; | |
434 | case e1000_82540: | |
435 | case e1000_82545: | |
436 | case e1000_82545_rev_3: | |
437 | case e1000_82546: | |
438 | case e1000_82546_rev_3: | |
439 | e1000_init_function_pointers_82540(hw); | |
440 | break; | |
441 | case e1000_82541: | |
442 | case e1000_82541_rev_2: | |
443 | case e1000_82547: | |
444 | case e1000_82547_rev_2: | |
445 | e1000_init_function_pointers_82541(hw); | |
446 | break; | |
447 | case e1000_82571: | |
448 | case e1000_82572: | |
449 | case e1000_82573: | |
450 | case e1000_82574: | |
6a5a645e | 451 | case e1000_82583: |
9c80d176 SZ |
452 | e1000_init_function_pointers_82571(hw); |
453 | break; | |
454 | case e1000_80003es2lan: | |
455 | e1000_init_function_pointers_80003es2lan(hw); | |
456 | break; | |
457 | case e1000_ich8lan: | |
458 | case e1000_ich9lan: | |
459 | case e1000_ich10lan: | |
6a5a645e SZ |
460 | case e1000_pchlan: |
461 | case e1000_pch2lan: | |
379ebbe7 | 462 | case e1000_pch_lpt: |
524ce499 | 463 | case e1000_pch_spt: |
9c80d176 SZ |
464 | e1000_init_function_pointers_ich8lan(hw); |
465 | break; | |
62583d18 SZ |
466 | case e1000_82575: |
467 | case e1000_82576: | |
468 | case e1000_82580: | |
469 | case e1000_i350: | |
379ebbe7 | 470 | case e1000_i354: |
62583d18 SZ |
471 | e1000_init_function_pointers_82575(hw); |
472 | break; | |
4be59a01 SZ |
473 | case e1000_i210: |
474 | case e1000_i211: | |
475 | e1000_init_function_pointers_i210(hw); | |
476 | break; | |
62583d18 SZ |
477 | case e1000_vfadapt: |
478 | e1000_init_function_pointers_vf(hw); | |
479 | break; | |
480 | case e1000_vfadapt_i350: | |
481 | e1000_init_function_pointers_vf(hw); | |
482 | break; | |
9c80d176 SZ |
483 | default: |
484 | DEBUGOUT("Hardware not supported\n"); | |
485 | ret_val = -E1000_ERR_CONFIG; | |
486 | break; | |
487 | } | |
488 | ||
489 | /* | |
490 | * Initialize the rest of the function pointers. These require some | |
491 | * register reads/writes in some cases. | |
492 | */ | |
493 | if (!(ret_val) && init_device) { | |
494 | ret_val = e1000_init_mac_params(hw); | |
495 | if (ret_val) | |
496 | goto out; | |
497 | ||
498 | ret_val = e1000_init_nvm_params(hw); | |
499 | if (ret_val) | |
500 | goto out; | |
501 | ||
502 | ret_val = e1000_init_phy_params(hw); | |
503 | if (ret_val) | |
504 | goto out; | |
62583d18 SZ |
505 | |
506 | ret_val = e1000_init_mbx_params(hw); | |
507 | if (ret_val) | |
508 | goto out; | |
9c80d176 SZ |
509 | } |
510 | ||
511 | out: | |
512 | return ret_val; | |
513 | } | |
514 | ||
515 | /** | |
516 | * e1000_get_bus_info - Obtain bus information for adapter | |
517 | * @hw: pointer to the HW structure | |
518 | * | |
519 | * This will obtain information about the HW bus for which the | |
520 | * adapter is attached and stores it in the hw structure. This is a | |
521 | * function pointer entry point called by drivers. | |
522 | **/ | |
523 | s32 e1000_get_bus_info(struct e1000_hw *hw) | |
524 | { | |
525 | if (hw->mac.ops.get_bus_info) | |
526 | return hw->mac.ops.get_bus_info(hw); | |
527 | ||
528 | return E1000_SUCCESS; | |
529 | } | |
530 | ||
531 | /** | |
532 | * e1000_clear_vfta - Clear VLAN filter table | |
533 | * @hw: pointer to the HW structure | |
534 | * | |
535 | * This clears the VLAN filter table on the adapter. This is a function | |
536 | * pointer entry point called by drivers. | |
537 | **/ | |
538 | void e1000_clear_vfta(struct e1000_hw *hw) | |
539 | { | |
540 | if (hw->mac.ops.clear_vfta) | |
541 | hw->mac.ops.clear_vfta(hw); | |
542 | } | |
543 | ||
544 | /** | |
545 | * e1000_write_vfta - Write value to VLAN filter table | |
546 | * @hw: pointer to the HW structure | |
547 | * @offset: the 32-bit offset in which to write the value to. | |
548 | * @value: the 32-bit value to write at location offset. | |
549 | * | |
550 | * This writes a 32-bit value to a 32-bit offset in the VLAN filter | |
551 | * table. This is a function pointer entry point called by drivers. | |
552 | **/ | |
553 | void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) | |
554 | { | |
555 | if (hw->mac.ops.write_vfta) | |
556 | hw->mac.ops.write_vfta(hw, offset, value); | |
557 | } | |
558 | ||
559 | /** | |
560 | * e1000_update_mc_addr_list - Update Multicast addresses | |
561 | * @hw: pointer to the HW structure | |
562 | * @mc_addr_list: array of multicast addresses to program | |
563 | * @mc_addr_count: number of multicast addresses to program | |
9c80d176 | 564 | * |
6a5a645e | 565 | * Updates the Multicast Table Array. |
9c80d176 | 566 | * The caller must have a packed mc_addr_list of multicast addresses. |
9c80d176 SZ |
567 | **/ |
568 | void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, | |
4be59a01 | 569 | u32 mc_addr_count) |
9c80d176 SZ |
570 | { |
571 | if (hw->mac.ops.update_mc_addr_list) | |
6a5a645e | 572 | hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, |
4be59a01 | 573 | mc_addr_count); |
9c80d176 SZ |
574 | } |
575 | ||
576 | /** | |
577 | * e1000_force_mac_fc - Force MAC flow control | |
578 | * @hw: pointer to the HW structure | |
579 | * | |
580 | * Force the MAC's flow control settings. Currently no func pointer exists | |
581 | * and all implementations are handled in the generic version of this | |
582 | * function. | |
583 | **/ | |
584 | s32 e1000_force_mac_fc(struct e1000_hw *hw) | |
585 | { | |
586 | return e1000_force_mac_fc_generic(hw); | |
587 | } | |
588 | ||
589 | /** | |
590 | * e1000_check_for_link - Check/Store link connection | |
591 | * @hw: pointer to the HW structure | |
592 | * | |
593 | * This checks the link condition of the adapter and stores the | |
594 | * results in the hw->mac structure. This is a function pointer entry | |
595 | * point called by drivers. | |
596 | **/ | |
597 | s32 e1000_check_for_link(struct e1000_hw *hw) | |
598 | { | |
599 | if (hw->mac.ops.check_for_link) | |
600 | return hw->mac.ops.check_for_link(hw); | |
601 | ||
602 | return -E1000_ERR_CONFIG; | |
603 | } | |
604 | ||
605 | /** | |
606 | * e1000_check_mng_mode - Check management mode | |
607 | * @hw: pointer to the HW structure | |
608 | * | |
609 | * This checks if the adapter has manageability enabled. | |
610 | * This is a function pointer entry point called by drivers. | |
611 | **/ | |
612 | bool e1000_check_mng_mode(struct e1000_hw *hw) | |
613 | { | |
614 | if (hw->mac.ops.check_mng_mode) | |
615 | return hw->mac.ops.check_mng_mode(hw); | |
616 | ||
617 | return FALSE; | |
618 | } | |
619 | ||
620 | /** | |
621 | * e1000_mng_write_dhcp_info - Writes DHCP info to host interface | |
622 | * @hw: pointer to the HW structure | |
623 | * @buffer: pointer to the host interface | |
624 | * @length: size of the buffer | |
625 | * | |
626 | * Writes the DHCP information to the host interface. | |
627 | **/ | |
628 | s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length) | |
629 | { | |
630 | return e1000_mng_write_dhcp_info_generic(hw, buffer, length); | |
631 | } | |
632 | ||
633 | /** | |
634 | * e1000_reset_hw - Reset hardware | |
635 | * @hw: pointer to the HW structure | |
636 | * | |
637 | * This resets the hardware into a known state. This is a function pointer | |
638 | * entry point called by drivers. | |
639 | **/ | |
640 | s32 e1000_reset_hw(struct e1000_hw *hw) | |
641 | { | |
642 | if (hw->mac.ops.reset_hw) | |
643 | return hw->mac.ops.reset_hw(hw); | |
644 | ||
645 | return -E1000_ERR_CONFIG; | |
646 | } | |
647 | ||
648 | /** | |
649 | * e1000_init_hw - Initialize hardware | |
650 | * @hw: pointer to the HW structure | |
651 | * | |
652 | * This inits the hardware readying it for operation. This is a function | |
653 | * pointer entry point called by drivers. | |
654 | **/ | |
655 | s32 e1000_init_hw(struct e1000_hw *hw) | |
656 | { | |
657 | if (hw->mac.ops.init_hw) | |
658 | return hw->mac.ops.init_hw(hw); | |
659 | ||
660 | return -E1000_ERR_CONFIG; | |
661 | } | |
662 | ||
663 | /** | |
664 | * e1000_setup_link - Configures link and flow control | |
665 | * @hw: pointer to the HW structure | |
666 | * | |
667 | * This configures link and flow control settings for the adapter. This | |
668 | * is a function pointer entry point called by drivers. While modules can | |
669 | * also call this, they probably call their own version of this function. | |
670 | **/ | |
671 | s32 e1000_setup_link(struct e1000_hw *hw) | |
672 | { | |
673 | if (hw->mac.ops.setup_link) | |
674 | return hw->mac.ops.setup_link(hw); | |
675 | ||
676 | return -E1000_ERR_CONFIG; | |
677 | } | |
678 | ||
679 | /** | |
680 | * e1000_get_speed_and_duplex - Returns current speed and duplex | |
681 | * @hw: pointer to the HW structure | |
682 | * @speed: pointer to a 16-bit value to store the speed | |
683 | * @duplex: pointer to a 16-bit value to store the duplex. | |
684 | * | |
685 | * This returns the speed and duplex of the adapter in the two 'out' | |
686 | * variables passed in. This is a function pointer entry point called | |
687 | * by drivers. | |
688 | **/ | |
689 | s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex) | |
690 | { | |
691 | if (hw->mac.ops.get_link_up_info) | |
692 | return hw->mac.ops.get_link_up_info(hw, speed, duplex); | |
693 | ||
694 | return -E1000_ERR_CONFIG; | |
695 | } | |
696 | ||
697 | /** | |
698 | * e1000_setup_led - Configures SW controllable LED | |
699 | * @hw: pointer to the HW structure | |
700 | * | |
701 | * This prepares the SW controllable LED for use and saves the current state | |
702 | * of the LED so it can be later restored. This is a function pointer entry | |
703 | * point called by drivers. | |
704 | **/ | |
705 | s32 e1000_setup_led(struct e1000_hw *hw) | |
706 | { | |
707 | if (hw->mac.ops.setup_led) | |
708 | return hw->mac.ops.setup_led(hw); | |
709 | ||
710 | return E1000_SUCCESS; | |
711 | } | |
712 | ||
713 | /** | |
714 | * e1000_cleanup_led - Restores SW controllable LED | |
715 | * @hw: pointer to the HW structure | |
716 | * | |
717 | * This restores the SW controllable LED to the value saved off by | |
718 | * e1000_setup_led. This is a function pointer entry point called by drivers. | |
719 | **/ | |
720 | s32 e1000_cleanup_led(struct e1000_hw *hw) | |
721 | { | |
722 | if (hw->mac.ops.cleanup_led) | |
723 | return hw->mac.ops.cleanup_led(hw); | |
724 | ||
725 | return E1000_SUCCESS; | |
726 | } | |
727 | ||
728 | /** | |
729 | * e1000_blink_led - Blink SW controllable LED | |
730 | * @hw: pointer to the HW structure | |
731 | * | |
732 | * This starts the adapter LED blinking. Request the LED to be setup first | |
733 | * and cleaned up after. This is a function pointer entry point called by | |
734 | * drivers. | |
735 | **/ | |
736 | s32 e1000_blink_led(struct e1000_hw *hw) | |
737 | { | |
738 | if (hw->mac.ops.blink_led) | |
739 | return hw->mac.ops.blink_led(hw); | |
740 | ||
741 | return E1000_SUCCESS; | |
742 | } | |
743 | ||
6a5a645e SZ |
744 | /** |
745 | * e1000_id_led_init - store LED configurations in SW | |
746 | * @hw: pointer to the HW structure | |
747 | * | |
748 | * Initializes the LED config in SW. This is a function pointer entry point | |
749 | * called by drivers. | |
750 | **/ | |
751 | s32 e1000_id_led_init(struct e1000_hw *hw) | |
752 | { | |
753 | if (hw->mac.ops.id_led_init) | |
754 | return hw->mac.ops.id_led_init(hw); | |
755 | ||
756 | return E1000_SUCCESS; | |
757 | } | |
758 | ||
9c80d176 SZ |
759 | /** |
760 | * e1000_led_on - Turn on SW controllable LED | |
761 | * @hw: pointer to the HW structure | |
762 | * | |
763 | * Turns the SW defined LED on. This is a function pointer entry point | |
764 | * called by drivers. | |
765 | **/ | |
766 | s32 e1000_led_on(struct e1000_hw *hw) | |
767 | { | |
768 | if (hw->mac.ops.led_on) | |
769 | return hw->mac.ops.led_on(hw); | |
770 | ||
771 | return E1000_SUCCESS; | |
772 | } | |
773 | ||
774 | /** | |
775 | * e1000_led_off - Turn off SW controllable LED | |
776 | * @hw: pointer to the HW structure | |
777 | * | |
778 | * Turns the SW defined LED off. This is a function pointer entry point | |
779 | * called by drivers. | |
780 | **/ | |
781 | s32 e1000_led_off(struct e1000_hw *hw) | |
782 | { | |
783 | if (hw->mac.ops.led_off) | |
784 | return hw->mac.ops.led_off(hw); | |
785 | ||
786 | return E1000_SUCCESS; | |
787 | } | |
788 | ||
789 | /** | |
790 | * e1000_reset_adaptive - Reset adaptive IFS | |
791 | * @hw: pointer to the HW structure | |
792 | * | |
793 | * Resets the adaptive IFS. Currently no func pointer exists and all | |
794 | * implementations are handled in the generic version of this function. | |
795 | **/ | |
796 | void e1000_reset_adaptive(struct e1000_hw *hw) | |
797 | { | |
798 | e1000_reset_adaptive_generic(hw); | |
799 | } | |
800 | ||
801 | /** | |
802 | * e1000_update_adaptive - Update adaptive IFS | |
803 | * @hw: pointer to the HW structure | |
804 | * | |
805 | * Updates adapter IFS. Currently no func pointer exists and all | |
806 | * implementations are handled in the generic version of this function. | |
807 | **/ | |
808 | void e1000_update_adaptive(struct e1000_hw *hw) | |
809 | { | |
810 | e1000_update_adaptive_generic(hw); | |
811 | } | |
812 | ||
813 | /** | |
814 | * e1000_disable_pcie_master - Disable PCI-Express master access | |
815 | * @hw: pointer to the HW structure | |
816 | * | |
817 | * Disables PCI-Express master access and verifies there are no pending | |
818 | * requests. Currently no func pointer exists and all implementations are | |
819 | * handled in the generic version of this function. | |
820 | **/ | |
821 | s32 e1000_disable_pcie_master(struct e1000_hw *hw) | |
822 | { | |
823 | return e1000_disable_pcie_master_generic(hw); | |
824 | } | |
825 | ||
826 | /** | |
827 | * e1000_config_collision_dist - Configure collision distance | |
828 | * @hw: pointer to the HW structure | |
829 | * | |
830 | * Configures the collision distance to the default value and is used | |
831 | * during link setup. | |
832 | **/ | |
833 | void e1000_config_collision_dist(struct e1000_hw *hw) | |
834 | { | |
835 | if (hw->mac.ops.config_collision_dist) | |
836 | hw->mac.ops.config_collision_dist(hw); | |
837 | } | |
838 | ||
839 | /** | |
840 | * e1000_rar_set - Sets a receive address register | |
841 | * @hw: pointer to the HW structure | |
842 | * @addr: address to set the RAR to | |
843 | * @index: the RAR to set | |
844 | * | |
845 | * Sets a Receive Address Register (RAR) to the specified address. | |
846 | **/ | |
4765c386 | 847 | int e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) |
9c80d176 SZ |
848 | { |
849 | if (hw->mac.ops.rar_set) | |
4765c386 MN |
850 | return hw->mac.ops.rar_set(hw, addr, index); |
851 | ||
852 | return E1000_SUCCESS; | |
9c80d176 SZ |
853 | } |
854 | ||
855 | /** | |
856 | * e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state | |
857 | * @hw: pointer to the HW structure | |
858 | * | |
859 | * Ensures that the MDI/MDIX SW state is valid. | |
860 | **/ | |
861 | s32 e1000_validate_mdi_setting(struct e1000_hw *hw) | |
862 | { | |
863 | if (hw->mac.ops.validate_mdi_setting) | |
864 | return hw->mac.ops.validate_mdi_setting(hw); | |
865 | ||
866 | return E1000_SUCCESS; | |
867 | } | |
868 | ||
9c80d176 SZ |
869 | /** |
870 | * e1000_hash_mc_addr - Determines address location in multicast table | |
871 | * @hw: pointer to the HW structure | |
872 | * @mc_addr: Multicast address to hash. | |
873 | * | |
874 | * This hashes an address to determine its location in the multicast | |
875 | * table. Currently no func pointer exists and all implementations | |
876 | * are handled in the generic version of this function. | |
877 | **/ | |
878 | u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) | |
879 | { | |
880 | return e1000_hash_mc_addr_generic(hw, mc_addr); | |
881 | } | |
882 | ||
883 | /** | |
884 | * e1000_enable_tx_pkt_filtering - Enable packet filtering on TX | |
885 | * @hw: pointer to the HW structure | |
886 | * | |
887 | * Enables packet filtering on transmit packets if manageability is enabled | |
888 | * and host interface is enabled. | |
889 | * Currently no func pointer exists and all implementations are handled in the | |
890 | * generic version of this function. | |
891 | **/ | |
892 | bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw) | |
893 | { | |
894 | return e1000_enable_tx_pkt_filtering_generic(hw); | |
895 | } | |
896 | ||
897 | /** | |
898 | * e1000_mng_host_if_write - Writes to the manageability host interface | |
899 | * @hw: pointer to the HW structure | |
900 | * @buffer: pointer to the host interface buffer | |
901 | * @length: size of the buffer | |
902 | * @offset: location in the buffer to write to | |
903 | * @sum: sum of the data (not checksum) | |
904 | * | |
905 | * This function writes the buffer content at the offset given on the host if. | |
906 | * It also does alignment considerations to do the writes in most efficient | |
907 | * way. Also fills up the sum of the buffer in *buffer parameter. | |
908 | **/ | |
4be59a01 SZ |
909 | s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length, |
910 | u16 offset, u8 *sum) | |
9c80d176 | 911 | { |
379ebbe7 | 912 | return e1000_mng_host_if_write_generic(hw, buffer, length, offset, sum); |
9c80d176 SZ |
913 | } |
914 | ||
915 | /** | |
916 | * e1000_mng_write_cmd_header - Writes manageability command header | |
917 | * @hw: pointer to the HW structure | |
918 | * @hdr: pointer to the host interface command header | |
919 | * | |
920 | * Writes the command header after does the checksum calculation. | |
921 | **/ | |
922 | s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, | |
4be59a01 | 923 | struct e1000_host_mng_command_header *hdr) |
9c80d176 | 924 | { |
379ebbe7 | 925 | return e1000_mng_write_cmd_header_generic(hw, hdr); |
9c80d176 SZ |
926 | } |
927 | ||
928 | /** | |
929 | * e1000_mng_enable_host_if - Checks host interface is enabled | |
930 | * @hw: pointer to the HW structure | |
931 | * | |
932 | * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND | |
933 | * | |
934 | * This function checks whether the HOST IF is enabled for command operation | |
935 | * and also checks whether the previous command is completed. It busy waits | |
936 | * in case of previous command is not completed. | |
937 | **/ | |
4be59a01 | 938 | s32 e1000_mng_enable_host_if(struct e1000_hw *hw) |
9c80d176 | 939 | { |
379ebbe7 | 940 | return e1000_mng_enable_host_if_generic(hw); |
9c80d176 SZ |
941 | } |
942 | ||
943 | /** | |
379ebbe7 | 944 | * e1000_set_obff_timer - Set Optimized Buffer Flush/Fill timer |
9c80d176 | 945 | * @hw: pointer to the HW structure |
379ebbe7 | 946 | * @itr: u32 indicating itr value |
9c80d176 | 947 | * |
379ebbe7 | 948 | * Set the OBFF timer based on the given interrupt rate. |
9c80d176 | 949 | **/ |
379ebbe7 | 950 | s32 e1000_set_obff_timer(struct e1000_hw *hw, u32 itr) |
9c80d176 | 951 | { |
379ebbe7 SZ |
952 | if (hw->mac.ops.set_obff_timer) |
953 | return hw->mac.ops.set_obff_timer(hw, itr); | |
9c80d176 SZ |
954 | |
955 | return E1000_SUCCESS; | |
956 | } | |
957 | ||
958 | /** | |
959 | * e1000_check_reset_block - Verifies PHY can be reset | |
960 | * @hw: pointer to the HW structure | |
961 | * | |
962 | * Checks if the PHY is in a state that can be reset or if manageability | |
963 | * has it tied up. This is a function pointer entry point called by drivers. | |
964 | **/ | |
965 | s32 e1000_check_reset_block(struct e1000_hw *hw) | |
966 | { | |
967 | if (hw->phy.ops.check_reset_block) | |
968 | return hw->phy.ops.check_reset_block(hw); | |
969 | ||
970 | return E1000_SUCCESS; | |
971 | } | |
972 | ||
973 | /** | |
974 | * e1000_read_phy_reg - Reads PHY register | |
975 | * @hw: pointer to the HW structure | |
976 | * @offset: the register to read | |
977 | * @data: the buffer to store the 16-bit read. | |
978 | * | |
979 | * Reads the PHY register and returns the value in data. | |
980 | * This is a function pointer entry point called by drivers. | |
981 | **/ | |
982 | s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) | |
983 | { | |
984 | if (hw->phy.ops.read_reg) | |
985 | return hw->phy.ops.read_reg(hw, offset, data); | |
986 | ||
987 | return E1000_SUCCESS; | |
988 | } | |
989 | ||
990 | /** | |
991 | * e1000_write_phy_reg - Writes PHY register | |
992 | * @hw: pointer to the HW structure | |
993 | * @offset: the register to write | |
994 | * @data: the value to write. | |
995 | * | |
996 | * Writes the PHY register at offset with the value in data. | |
997 | * This is a function pointer entry point called by drivers. | |
998 | **/ | |
999 | s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) | |
1000 | { | |
1001 | if (hw->phy.ops.write_reg) | |
1002 | return hw->phy.ops.write_reg(hw, offset, data); | |
1003 | ||
1004 | return E1000_SUCCESS; | |
1005 | } | |
1006 | ||
1007 | /** | |
1008 | * e1000_release_phy - Generic release PHY | |
1009 | * @hw: pointer to the HW structure | |
1010 | * | |
1011 | * Return if silicon family does not require a semaphore when accessing the | |
1012 | * PHY. | |
1013 | **/ | |
1014 | void e1000_release_phy(struct e1000_hw *hw) | |
1015 | { | |
1016 | if (hw->phy.ops.release) | |
1017 | hw->phy.ops.release(hw); | |
1018 | } | |
1019 | ||
1020 | /** | |
1021 | * e1000_acquire_phy - Generic acquire PHY | |
1022 | * @hw: pointer to the HW structure | |
1023 | * | |
1024 | * Return success if silicon family does not require a semaphore when | |
1025 | * accessing the PHY. | |
1026 | **/ | |
1027 | s32 e1000_acquire_phy(struct e1000_hw *hw) | |
1028 | { | |
1029 | if (hw->phy.ops.acquire) | |
1030 | return hw->phy.ops.acquire(hw); | |
1031 | ||
1032 | return E1000_SUCCESS; | |
1033 | } | |
1034 | ||
1035 | /** | |
1036 | * e1000_cfg_on_link_up - Configure PHY upon link up | |
1037 | * @hw: pointer to the HW structure | |
1038 | **/ | |
1039 | s32 e1000_cfg_on_link_up(struct e1000_hw *hw) | |
1040 | { | |
1041 | if (hw->phy.ops.cfg_on_link_up) | |
1042 | return hw->phy.ops.cfg_on_link_up(hw); | |
1043 | ||
1044 | return E1000_SUCCESS; | |
1045 | } | |
1046 | ||
1047 | /** | |
1048 | * e1000_read_kmrn_reg - Reads register using Kumeran interface | |
1049 | * @hw: pointer to the HW structure | |
1050 | * @offset: the register to read | |
1051 | * @data: the location to store the 16-bit value read. | |
1052 | * | |
1053 | * Reads a register out of the Kumeran interface. Currently no func pointer | |
1054 | * exists and all implementations are handled in the generic version of | |
1055 | * this function. | |
1056 | **/ | |
1057 | s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) | |
1058 | { | |
1059 | return e1000_read_kmrn_reg_generic(hw, offset, data); | |
1060 | } | |
1061 | ||
1062 | /** | |
1063 | * e1000_write_kmrn_reg - Writes register using Kumeran interface | |
1064 | * @hw: pointer to the HW structure | |
1065 | * @offset: the register to write | |
1066 | * @data: the value to write. | |
1067 | * | |
1068 | * Writes a register to the Kumeran interface. Currently no func pointer | |
1069 | * exists and all implementations are handled in the generic version of | |
1070 | * this function. | |
1071 | **/ | |
1072 | s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) | |
1073 | { | |
1074 | return e1000_write_kmrn_reg_generic(hw, offset, data); | |
1075 | } | |
1076 | ||
1077 | /** | |
1078 | * e1000_get_cable_length - Retrieves cable length estimation | |
1079 | * @hw: pointer to the HW structure | |
1080 | * | |
1081 | * This function estimates the cable length and stores them in | |
1082 | * hw->phy.min_length and hw->phy.max_length. This is a function pointer | |
1083 | * entry point called by drivers. | |
1084 | **/ | |
1085 | s32 e1000_get_cable_length(struct e1000_hw *hw) | |
1086 | { | |
1087 | if (hw->phy.ops.get_cable_length) | |
1088 | return hw->phy.ops.get_cable_length(hw); | |
1089 | ||
1090 | return E1000_SUCCESS; | |
1091 | } | |
1092 | ||
1093 | /** | |
1094 | * e1000_get_phy_info - Retrieves PHY information from registers | |
1095 | * @hw: pointer to the HW structure | |
1096 | * | |
1097 | * This function gets some information from various PHY registers and | |
1098 | * populates hw->phy values with it. This is a function pointer entry | |
1099 | * point called by drivers. | |
1100 | **/ | |
1101 | s32 e1000_get_phy_info(struct e1000_hw *hw) | |
1102 | { | |
1103 | if (hw->phy.ops.get_info) | |
1104 | return hw->phy.ops.get_info(hw); | |
1105 | ||
1106 | return E1000_SUCCESS; | |
1107 | } | |
1108 | ||
1109 | /** | |
1110 | * e1000_phy_hw_reset - Hard PHY reset | |
1111 | * @hw: pointer to the HW structure | |
1112 | * | |
1113 | * Performs a hard PHY reset. This is a function pointer entry point called | |
1114 | * by drivers. | |
1115 | **/ | |
1116 | s32 e1000_phy_hw_reset(struct e1000_hw *hw) | |
1117 | { | |
1118 | if (hw->phy.ops.reset) | |
1119 | return hw->phy.ops.reset(hw); | |
1120 | ||
1121 | return E1000_SUCCESS; | |
1122 | } | |
1123 | ||
1124 | /** | |
1125 | * e1000_phy_commit - Soft PHY reset | |
1126 | * @hw: pointer to the HW structure | |
1127 | * | |
1128 | * Performs a soft PHY reset on those that apply. This is a function pointer | |
1129 | * entry point called by drivers. | |
1130 | **/ | |
1131 | s32 e1000_phy_commit(struct e1000_hw *hw) | |
1132 | { | |
1133 | if (hw->phy.ops.commit) | |
1134 | return hw->phy.ops.commit(hw); | |
1135 | ||
1136 | return E1000_SUCCESS; | |
1137 | } | |
1138 | ||
1139 | /** | |
1140 | * e1000_set_d0_lplu_state - Sets low power link up state for D0 | |
1141 | * @hw: pointer to the HW structure | |
1142 | * @active: boolean used to enable/disable lplu | |
1143 | * | |
1144 | * Success returns 0, Failure returns 1 | |
1145 | * | |
1146 | * The low power link up (lplu) state is set to the power management level D0 | |
1147 | * and SmartSpeed is disabled when active is TRUE, else clear lplu for D0 | |
1148 | * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU | |
1149 | * is used during Dx states where the power conservation is most important. | |
1150 | * During driver activity, SmartSpeed should be enabled so performance is | |
1151 | * maintained. This is a function pointer entry point called by drivers. | |
1152 | **/ | |
1153 | s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) | |
1154 | { | |
1155 | if (hw->phy.ops.set_d0_lplu_state) | |
1156 | return hw->phy.ops.set_d0_lplu_state(hw, active); | |
1157 | ||
1158 | return E1000_SUCCESS; | |
1159 | } | |
1160 | ||
1161 | /** | |
1162 | * e1000_set_d3_lplu_state - Sets low power link up state for D3 | |
1163 | * @hw: pointer to the HW structure | |
1164 | * @active: boolean used to enable/disable lplu | |
1165 | * | |
1166 | * Success returns 0, Failure returns 1 | |
1167 | * | |
1168 | * The low power link up (lplu) state is set to the power management level D3 | |
1169 | * and SmartSpeed is disabled when active is TRUE, else clear lplu for D3 | |
1170 | * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU | |
1171 | * is used during Dx states where the power conservation is most important. | |
1172 | * During driver activity, SmartSpeed should be enabled so performance is | |
1173 | * maintained. This is a function pointer entry point called by drivers. | |
1174 | **/ | |
1175 | s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active) | |
1176 | { | |
1177 | if (hw->phy.ops.set_d3_lplu_state) | |
1178 | return hw->phy.ops.set_d3_lplu_state(hw, active); | |
1179 | ||
1180 | return E1000_SUCCESS; | |
1181 | } | |
1182 | ||
1183 | /** | |
1184 | * e1000_read_mac_addr - Reads MAC address | |
1185 | * @hw: pointer to the HW structure | |
1186 | * | |
1187 | * Reads the MAC address out of the adapter and stores it in the HW structure. | |
1188 | * Currently no func pointer exists and all implementations are handled in the | |
1189 | * generic version of this function. | |
1190 | **/ | |
1191 | s32 e1000_read_mac_addr(struct e1000_hw *hw) | |
1192 | { | |
1193 | if (hw->mac.ops.read_mac_addr) | |
1194 | return hw->mac.ops.read_mac_addr(hw); | |
1195 | ||
1196 | return e1000_read_mac_addr_generic(hw); | |
1197 | } | |
1198 | ||
6a5a645e SZ |
1199 | /** |
1200 | * e1000_read_pba_string - Read device part number string | |
1201 | * @hw: pointer to the HW structure | |
1202 | * @pba_num: pointer to device part number | |
1203 | * @pba_num_size: size of part number buffer | |
1204 | * | |
1205 | * Reads the product board assembly (PBA) number from the EEPROM and stores | |
1206 | * the value in pba_num. | |
1207 | * Currently no func pointer exists and all implementations are handled in the | |
1208 | * generic version of this function. | |
1209 | **/ | |
1210 | s32 e1000_read_pba_string(struct e1000_hw *hw, u8 *pba_num, u32 pba_num_size) | |
1211 | { | |
1212 | return e1000_read_pba_string_generic(hw, pba_num, pba_num_size); | |
1213 | } | |
1214 | ||
1215 | /** | |
1216 | * e1000_read_pba_length - Read device part number string length | |
1217 | * @hw: pointer to the HW structure | |
1218 | * @pba_num_size: size of part number buffer | |
1219 | * | |
1220 | * Reads the product board assembly (PBA) number length from the EEPROM and | |
1221 | * stores the value in pba_num. | |
1222 | * Currently no func pointer exists and all implementations are handled in the | |
1223 | * generic version of this function. | |
1224 | **/ | |
1225 | s32 e1000_read_pba_length(struct e1000_hw *hw, u32 *pba_num_size) | |
1226 | { | |
1227 | return e1000_read_pba_length_generic(hw, pba_num_size); | |
1228 | } | |
1229 | ||
9c80d176 SZ |
1230 | /** |
1231 | * e1000_read_pba_num - Read device part number | |
1232 | * @hw: pointer to the HW structure | |
1233 | * @pba_num: pointer to device part number | |
1234 | * | |
1235 | * Reads the product board assembly (PBA) number from the EEPROM and stores | |
1236 | * the value in pba_num. | |
1237 | * Currently no func pointer exists and all implementations are handled in the | |
1238 | * generic version of this function. | |
1239 | **/ | |
1240 | s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num) | |
1241 | { | |
1242 | return e1000_read_pba_num_generic(hw, pba_num); | |
1243 | } | |
1244 | ||
1245 | /** | |
1246 | * e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum | |
1247 | * @hw: pointer to the HW structure | |
1248 | * | |
1249 | * Validates the NVM checksum is correct. This is a function pointer entry | |
1250 | * point called by drivers. | |
1251 | **/ | |
1252 | s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) | |
1253 | { | |
1254 | if (hw->nvm.ops.validate) | |
1255 | return hw->nvm.ops.validate(hw); | |
1256 | ||
1257 | return -E1000_ERR_CONFIG; | |
1258 | } | |
1259 | ||
1260 | /** | |
1261 | * e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum | |
1262 | * @hw: pointer to the HW structure | |
1263 | * | |
1264 | * Updates the NVM checksum. Currently no func pointer exists and all | |
1265 | * implementations are handled in the generic version of this function. | |
1266 | **/ | |
1267 | s32 e1000_update_nvm_checksum(struct e1000_hw *hw) | |
1268 | { | |
1269 | if (hw->nvm.ops.update) | |
1270 | return hw->nvm.ops.update(hw); | |
1271 | ||
1272 | return -E1000_ERR_CONFIG; | |
1273 | } | |
1274 | ||
1275 | /** | |
1276 | * e1000_reload_nvm - Reloads EEPROM | |
1277 | * @hw: pointer to the HW structure | |
1278 | * | |
1279 | * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the | |
1280 | * extended control register. | |
1281 | **/ | |
1282 | void e1000_reload_nvm(struct e1000_hw *hw) | |
1283 | { | |
1284 | if (hw->nvm.ops.reload) | |
1285 | hw->nvm.ops.reload(hw); | |
1286 | } | |
1287 | ||
1288 | /** | |
1289 | * e1000_read_nvm - Reads NVM (EEPROM) | |
1290 | * @hw: pointer to the HW structure | |
1291 | * @offset: the word offset to read | |
1292 | * @words: number of 16-bit words to read | |
1293 | * @data: pointer to the properly sized buffer for the data. | |
1294 | * | |
1295 | * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function | |
1296 | * pointer entry point called by drivers. | |
1297 | **/ | |
1298 | s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | |
1299 | { | |
1300 | if (hw->nvm.ops.read) | |
1301 | return hw->nvm.ops.read(hw, offset, words, data); | |
1302 | ||
1303 | return -E1000_ERR_CONFIG; | |
1304 | } | |
1305 | ||
1306 | /** | |
1307 | * e1000_write_nvm - Writes to NVM (EEPROM) | |
1308 | * @hw: pointer to the HW structure | |
1309 | * @offset: the word offset to read | |
1310 | * @words: number of 16-bit words to write | |
1311 | * @data: pointer to the properly sized buffer for the data. | |
1312 | * | |
1313 | * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function | |
1314 | * pointer entry point called by drivers. | |
1315 | **/ | |
1316 | s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | |
1317 | { | |
1318 | if (hw->nvm.ops.write) | |
1319 | return hw->nvm.ops.write(hw, offset, words, data); | |
1320 | ||
1321 | return E1000_SUCCESS; | |
1322 | } | |
1323 | ||
62583d18 SZ |
1324 | /** |
1325 | * e1000_write_8bit_ctrl_reg - Writes 8bit Control register | |
1326 | * @hw: pointer to the HW structure | |
1327 | * @reg: 32bit register offset | |
1328 | * @offset: the register to write | |
1329 | * @data: the value to write. | |
1330 | * | |
1331 | * Writes the PHY register at offset with the value in data. | |
1332 | * This is a function pointer entry point called by drivers. | |
1333 | **/ | |
1334 | s32 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, u32 offset, | |
4be59a01 | 1335 | u8 data) |
62583d18 SZ |
1336 | { |
1337 | return e1000_write_8bit_ctrl_reg_generic(hw, reg, offset, data); | |
1338 | } | |
1339 | ||
9c80d176 SZ |
1340 | /** |
1341 | * e1000_power_up_phy - Restores link in case of PHY power down | |
1342 | * @hw: pointer to the HW structure | |
1343 | * | |
1344 | * The phy may be powered down to save power, to turn off link when the | |
1345 | * driver is unloaded, or wake on lan is not enabled (among others). | |
1346 | **/ | |
1347 | void e1000_power_up_phy(struct e1000_hw *hw) | |
1348 | { | |
1349 | if (hw->phy.ops.power_up) | |
1350 | hw->phy.ops.power_up(hw); | |
1351 | ||
1352 | e1000_setup_link(hw); | |
1353 | } | |
1354 | ||
1355 | /** | |
1356 | * e1000_power_down_phy - Power down PHY | |
1357 | * @hw: pointer to the HW structure | |
1358 | * | |
1359 | * The phy may be powered down to save power, to turn off link when the | |
1360 | * driver is unloaded, or wake on lan is not enabled (among others). | |
1361 | **/ | |
1362 | void e1000_power_down_phy(struct e1000_hw *hw) | |
1363 | { | |
1364 | if (hw->phy.ops.power_down) | |
1365 | hw->phy.ops.power_down(hw); | |
1366 | } | |
1367 | ||
62583d18 SZ |
1368 | /** |
1369 | * e1000_power_up_fiber_serdes_link - Power up serdes link | |
1370 | * @hw: pointer to the HW structure | |
1371 | * | |
1372 | * Power on the optics and PCS. | |
1373 | **/ | |
1374 | void e1000_power_up_fiber_serdes_link(struct e1000_hw *hw) | |
1375 | { | |
1376 | if (hw->mac.ops.power_up_serdes) | |
1377 | hw->mac.ops.power_up_serdes(hw); | |
1378 | } | |
1379 | ||
1380 | /** | |
1381 | * e1000_shutdown_fiber_serdes_link - Remove link during power down | |
1382 | * @hw: pointer to the HW structure | |
1383 | * | |
1384 | * Shutdown the optics and PCS on driver unload. | |
1385 | **/ | |
1386 | void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw) | |
1387 | { | |
1388 | if (hw->mac.ops.shutdown_serdes) | |
1389 | hw->mac.ops.shutdown_serdes(hw); | |
1390 | } |