1 /******************************************************************************
2
3 Copyright (c) 2001-2020, Intel Corporation
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 ******************************************************************************/
33 /*$FreeBSD$*/
34
35 #include "ixgbe_x550.h"
36 #include "ixgbe_x540.h"
37 #include "ixgbe_type.h"
38 #include "ixgbe_api.h"
39 #include "ixgbe_common.h"
40 #include "ixgbe_phy.h"
41
42 static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
43 static s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *, u32 mask);
44 static void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *, u32 mask);
45 static s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw);
46
47 /**
48 * ixgbe_init_ops_X550 - Inits func ptrs and MAC type
49 * @hw: pointer to hardware structure
50 *
51 * Initialize the function pointers and assign the MAC type for X550.
52 * Does not touch the hardware.
53 **/
54 s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
55 {
56 struct ixgbe_mac_info *mac = &hw->mac;
57 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
58 s32 ret_val;
59
60 DEBUGFUNC("ixgbe_init_ops_X550");
61
62 ret_val = ixgbe_init_ops_X540(hw);
63 mac->ops.dmac_config = ixgbe_dmac_config_X550;
64 mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
65 mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
66 mac->ops.setup_eee = NULL;
67 mac->ops.set_source_address_pruning =
68 ixgbe_set_source_address_pruning_X550;
69 mac->ops.set_ethertype_anti_spoofing =
70 ixgbe_set_ethertype_anti_spoofing_X550;
71
72 mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
73 eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
74 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
75 eeprom->ops.read = ixgbe_read_ee_hostif_X550;
76 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
77 eeprom->ops.write = ixgbe_write_ee_hostif_X550;
78 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
79 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
80 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
81
82 mac->ops.disable_mdd = ixgbe_disable_mdd_X550;
83 mac->ops.enable_mdd = ixgbe_enable_mdd_X550;
84 mac->ops.mdd_event = ixgbe_mdd_event_X550;
85 mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
86 mac->ops.fw_recovery_mode = ixgbe_fw_recovery_mode_X550;
87 mac->ops.disable_rx = ixgbe_disable_rx_x550;
88 /* Manageability interface */
89 mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_x550;
90 switch (hw->device_id) {
91 case IXGBE_DEV_ID_X550EM_X_1G_T:
92 hw->mac.ops.led_on = NULL;
93 hw->mac.ops.led_off = NULL;
94 break;
95 case IXGBE_DEV_ID_X550EM_X_10G_T:
96 case IXGBE_DEV_ID_X550EM_A_10G_T:
97 hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
98 hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
99 break;
100 default:
101 break;
102 }
103 return ret_val;
104 }
105
106 /**
107 * ixgbe_read_cs4227 - Read CS4227 register
108 * @hw: pointer to hardware structure
109 * @reg: register number to write
110 * @value: pointer to receive value read
111 *
112 * Returns status code
113 **/
114 static s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value)
115 {
116 return hw->link.ops.read_link_unlocked(hw, hw->link.addr, reg, value);
117 }
118
119 /**
120 * ixgbe_write_cs4227 - Write CS4227 register
121 * @hw: pointer to hardware structure
122 * @reg: register number to write
123 * @value: value to write to register
124 *
125 * Returns status code
126 **/
127 static s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value)
128 {
129 return hw->link.ops.write_link_unlocked(hw, hw->link.addr, reg, value);
130 }
131
132 /**
133 * ixgbe_read_pe - Read register from port expander
134 * @hw: pointer to hardware structure
135 * @reg: register number to read
136 * @value: pointer to receive read value
137 *
138 * Returns status code
139 **/
140 static s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value)
141 {
142 s32 status;
143
144 status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
145 if (status != IXGBE_SUCCESS)
146 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
147 "port expander access failed with %d\n", status);
148 return status;
149 }
150
151 /**
152 * ixgbe_write_pe - Write register to port expander
153 * @hw: pointer to hardware structure
154 * @reg: register number to write
155 * @value: value to write
156 *
157 * Returns status code
158 **/
159 static s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value)
160 {
161 s32 status;
162
163 status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
164 if (status != IXGBE_SUCCESS)
165 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
166 "port expander access failed with %d\n", status);
167 return status;
168 }
169
170 /**
171 * ixgbe_reset_cs4227 - Reset CS4227 using port expander
172 * @hw: pointer to hardware structure
173 *
174 * This function assumes that the caller has acquired the proper semaphore.
175 * Returns error code
176 **/
177 static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
178 {
179 s32 status;
180 u32 retry;
181 u16 value;
182 u8 reg;
183
184 /* Trigger hard reset. */
185 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
186 if (status != IXGBE_SUCCESS)
187 return status;
188 reg |= IXGBE_PE_BIT1;
189 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
190 if (status != IXGBE_SUCCESS)
191 return status;
192
193 status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, ®);
194 if (status != IXGBE_SUCCESS)
195 return status;
196 reg &= ~IXGBE_PE_BIT1;
197 status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg);
198 if (status != IXGBE_SUCCESS)
199 return status;
200
201 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
202 if (status != IXGBE_SUCCESS)
203 return status;
204 reg &= ~IXGBE_PE_BIT1;
205 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
206 if (status != IXGBE_SUCCESS)
207 return status;
208
209 usec_delay(IXGBE_CS4227_RESET_HOLD);
210
211 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
212 if (status != IXGBE_SUCCESS)
213 return status;
214 reg |= IXGBE_PE_BIT1;
215 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
216 if (status != IXGBE_SUCCESS)
217 return status;
218
219 /* Wait for the reset to complete. */
220 msec_delay(IXGBE_CS4227_RESET_DELAY);
221 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
222 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EFUSE_STATUS,
223 &value);
224 if (status == IXGBE_SUCCESS &&
225 value == IXGBE_CS4227_EEPROM_LOAD_OK)
226 break;
227 msec_delay(IXGBE_CS4227_CHECK_DELAY);
228 }
229 if (retry == IXGBE_CS4227_RETRIES) {
230 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
231 "CS4227 reset did not complete.");
232 return IXGBE_ERR_PHY;
233 }
234
235 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
236 if (status != IXGBE_SUCCESS ||
237 !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
238 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
239 "CS4227 EEPROM did not load successfully.");
240 return IXGBE_ERR_PHY;
241 }
242
243 return IXGBE_SUCCESS;
244 }
245
246 /**
247 * ixgbe_check_cs4227 - Check CS4227 and reset as needed
248 * @hw: pointer to hardware structure
249 **/
250 static void ixgbe_check_cs4227(struct ixgbe_hw *hw)
251 {
252 s32 status = IXGBE_SUCCESS;
253 u32 swfw_mask = hw->phy.phy_semaphore_mask;
254 u16 value = 0;
255 u8 retry;
256
257 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
258 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
259 if (status != IXGBE_SUCCESS) {
260 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
261 "semaphore failed with %d", status);
262 msec_delay(IXGBE_CS4227_CHECK_DELAY);
263 continue;
264 }
265
266 /* Get status of reset flow. */
267 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
268
269 if (status == IXGBE_SUCCESS &&
270 value == IXGBE_CS4227_RESET_COMPLETE)
271 goto out;
272
273 if (status != IXGBE_SUCCESS ||
274 value != IXGBE_CS4227_RESET_PENDING)
275 break;
276
277 /* Reset is pending. Wait and check again. */
278 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
279 msec_delay(IXGBE_CS4227_CHECK_DELAY);
280 }
281
282 /* If still pending, assume other instance failed. */
283 if (retry == IXGBE_CS4227_RETRIES) {
284 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
285 if (status != IXGBE_SUCCESS) {
286 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
287 "semaphore failed with %d", status);
288 return;
289 }
290 }
291
292 /* Reset the CS4227. */
293 status = ixgbe_reset_cs4227(hw);
294 if (status != IXGBE_SUCCESS) {
295 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
296 "CS4227 reset failed: %d", status);
297 goto out;
298 }
299
300 /* Reset takes so long, temporarily release semaphore in case the
301 * other driver instance is waiting for the reset indication.
302 */
303 ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
304 IXGBE_CS4227_RESET_PENDING);
305 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
306 msec_delay(10);
307 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
308 if (status != IXGBE_SUCCESS) {
309 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
310 "semaphore failed with %d", status);
311 return;
312 }
313
314 /* Record completion for next time. */
315 status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
316 IXGBE_CS4227_RESET_COMPLETE);
317
318 out:
319 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
320 msec_delay(hw->eeprom.semaphore_delay);
321 }
322
323 /**
324 * ixgbe_setup_mux_ctl - Setup ESDP register for I2C mux control
325 * @hw: pointer to hardware structure
326 **/
327 static void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw)
328 {
329 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
330
331 if (hw->bus.lan_id) {
332 esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
333 esdp |= IXGBE_ESDP_SDP1_DIR;
334 }
335 esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
336 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
337 IXGBE_WRITE_FLUSH(hw);
338 }
339
340 /**
341 * ixgbe_identify_phy_x550em - Get PHY type based on device id
342 * @hw: pointer to hardware structure
343 *
344 * Returns error code
345 */
346 static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
347 {
348 hw->mac.ops.set_lan_id(hw);
349
350 ixgbe_read_mng_if_sel_x550em(hw);
351
352 switch (hw->device_id) {
353 case IXGBE_DEV_ID_X550EM_A_SFP:
354 return ixgbe_identify_sfp_module_X550em(hw);
355 case IXGBE_DEV_ID_X550EM_X_SFP:
356 /* set up for CS4227 usage */
357 ixgbe_setup_mux_ctl(hw);
358 ixgbe_check_cs4227(hw);
359 /* Fallthrough */
360
361 case IXGBE_DEV_ID_X550EM_A_SFP_N:
362 return ixgbe_identify_sfp_module_X550em(hw);
363 break;
364 case IXGBE_DEV_ID_X550EM_X_KX4:
365 hw->phy.type = ixgbe_phy_x550em_kx4;
366 break;
367 case IXGBE_DEV_ID_X550EM_X_XFI:
368 hw->phy.type = ixgbe_phy_x550em_xfi;
369 break;
370 case IXGBE_DEV_ID_X550EM_X_KR:
371 case IXGBE_DEV_ID_X550EM_A_KR:
372 case IXGBE_DEV_ID_X550EM_A_KR_L:
373 hw->phy.type = ixgbe_phy_x550em_kr;
374 break;
375 case IXGBE_DEV_ID_X550EM_A_10G_T:
376 case IXGBE_DEV_ID_X550EM_X_10G_T:
377 return ixgbe_identify_phy_generic(hw);
378 case IXGBE_DEV_ID_X550EM_X_1G_T:
379 hw->phy.type = ixgbe_phy_ext_1g_t;
380 break;
381 case IXGBE_DEV_ID_X550EM_A_1G_T:
382 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
383 hw->phy.type = ixgbe_phy_fw;
384 if (hw->bus.lan_id)
385 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
386 else
387 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
388 break;
389 default:
390 break;
391 }
392 return IXGBE_SUCCESS;
393 }
394
395 /**
396 * ixgbe_fw_phy_activity - Perform an activity on a PHY
397 * @hw: pointer to hardware structure
398 * @activity: activity to perform
399 * @data: Pointer to 4 32-bit words of data
400 */
401 s32 ixgbe_fw_phy_activity(struct ixgbe_hw *hw, u16 activity,
402 u32 (*data)[FW_PHY_ACT_DATA_COUNT])
403 {
404 union {
405 struct ixgbe_hic_phy_activity_req cmd;
406 struct ixgbe_hic_phy_activity_resp rsp;
407 } hic;
408 u16 retries = FW_PHY_ACT_RETRIES;
409 s32 rc;
410 u16 i;
411
412 do {
413 memset(&hic, 0, sizeof(hic));
414 hic.cmd.hdr.cmd = FW_PHY_ACT_REQ_CMD;
415 hic.cmd.hdr.buf_len = FW_PHY_ACT_REQ_LEN;
416 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
417 hic.cmd.port_number = hw->bus.lan_id;
418 hic.cmd.activity_id = IXGBE_CPU_TO_LE16(activity);
419 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
420 hic.cmd.data[i] = IXGBE_CPU_TO_BE32((*data)[i]);
421
422 rc = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd,
423 sizeof(hic.cmd),
424 IXGBE_HI_COMMAND_TIMEOUT,
425 true);
426 if (rc != IXGBE_SUCCESS)
427 return rc;
428 if (hic.rsp.hdr.cmd_or_resp.ret_status ==
429 FW_CEM_RESP_STATUS_SUCCESS) {
430 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
431 (*data)[i] = IXGBE_BE32_TO_CPU(hic.rsp.data[i]);
432 return IXGBE_SUCCESS;
433 }
434 usec_delay(20);
435 --retries;
436 } while (retries > 0);
437
438 return IXGBE_ERR_HOST_INTERFACE_COMMAND;
439 }
440
441 static const struct {
442 u16 fw_speed;
443 ixgbe_link_speed phy_speed;
444 } ixgbe_fw_map[] = {
445 { FW_PHY_ACT_LINK_SPEED_10, IXGBE_LINK_SPEED_10_FULL },
446 { FW_PHY_ACT_LINK_SPEED_100, IXGBE_LINK_SPEED_100_FULL },
447 { FW_PHY_ACT_LINK_SPEED_1G, IXGBE_LINK_SPEED_1GB_FULL },
448 { FW_PHY_ACT_LINK_SPEED_2_5G, IXGBE_LINK_SPEED_2_5GB_FULL },
449 { FW_PHY_ACT_LINK_SPEED_5G, IXGBE_LINK_SPEED_5GB_FULL },
450 { FW_PHY_ACT_LINK_SPEED_10G, IXGBE_LINK_SPEED_10GB_FULL },
451 };
452
453 /**
454 * ixgbe_get_phy_id_fw - Get the phy ID via firmware command
455 * @hw: pointer to hardware structure
456 *
457 * Returns error code
458 */
459 static s32 ixgbe_get_phy_id_fw(struct ixgbe_hw *hw)
460 {
461 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
462 u16 phy_speeds;
463 u16 phy_id_lo;
464 s32 rc;
465 u16 i;
466
467 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_PHY_INFO, &info);
468 if (rc)
469 return rc;
470
471 hw->phy.speeds_supported = 0;
472 phy_speeds = info[0] & FW_PHY_INFO_SPEED_MASK;
473 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
474 if (phy_speeds & ixgbe_fw_map[i].fw_speed)
475 hw->phy.speeds_supported |= ixgbe_fw_map[i].phy_speed;
476 }
477 if (!hw->phy.autoneg_advertised)
478 hw->phy.autoneg_advertised = hw->phy.speeds_supported;
479
480 hw->phy.id = info[0] & FW_PHY_INFO_ID_HI_MASK;
481 phy_id_lo = info[1] & FW_PHY_INFO_ID_LO_MASK;
482 hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK;
483 hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK;
484 if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK)
485 return IXGBE_ERR_PHY_ADDR_INVALID;
486 return IXGBE_SUCCESS;
487 }
488
489 /**
490 * ixgbe_identify_phy_fw - Get PHY type based on firmware command
491 * @hw: pointer to hardware structure
492 *
493 * Returns error code
494 */
495 static s32 ixgbe_identify_phy_fw(struct ixgbe_hw *hw)
496 {
497 if (hw->bus.lan_id)
498 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
499 else
500 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
501
502 hw->phy.type = ixgbe_phy_fw;
503 hw->phy.ops.read_reg = NULL;
504 hw->phy.ops.write_reg = NULL;
505 return ixgbe_get_phy_id_fw(hw);
506 }
507
508 /**
509 * ixgbe_shutdown_fw_phy - Shutdown a firmware-controlled PHY
510 * @hw: pointer to hardware structure
511 *
512 * Returns error code
513 */
514 s32 ixgbe_shutdown_fw_phy(struct ixgbe_hw *hw)
515 {
516 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
517
518 setup[0] = FW_PHY_ACT_FORCE_LINK_DOWN_OFF;
519 return ixgbe_fw_phy_activity(hw, FW_PHY_ACT_FORCE_LINK_DOWN, &setup);
520 }
521
522 static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
523 u32 device_type, u16 *phy_data)
524 {
525 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, *phy_data);
526 return IXGBE_NOT_IMPLEMENTED;
527 }
528
529 static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
530 u32 device_type, u16 phy_data)
531 {
532 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, phy_data);
533 return IXGBE_NOT_IMPLEMENTED;
534 }
535
536 /**
537 * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation
538 * @hw: pointer to the hardware structure
539 * @addr: I2C bus address to read from
540 * @reg: I2C device register to read from
541 * @val: pointer to location to receive read value
542 *
543 * Returns an error code on error.
544 **/
545 static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
546 u16 reg, u16 *val)
547 {
548 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, true);
549 }
550
551 /**
552 * ixgbe_read_i2c_combined_generic_unlocked - Do I2C read combined operation
553 * @hw: pointer to the hardware structure
554 * @addr: I2C bus address to read from
555 * @reg: I2C device register to read from
556 * @val: pointer to location to receive read value
557 *
558 * Returns an error code on error.
559 **/
560 static s32
561 ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, u8 addr,
562 u16 reg, u16 *val)
563 {
564 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, false);
565 }
566
567 /**
568 * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation
569 * @hw: pointer to the hardware structure
570 * @addr: I2C bus address to write to
571 * @reg: I2C device register to write to
572 * @val: value to write
573 *
574 * Returns an error code on error.
575 **/
576 static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
577 u8 addr, u16 reg, u16 val)
578 {
579 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, true);
580 }
581
582 /**
583 * ixgbe_write_i2c_combined_generic_unlocked - Do I2C write combined operation
584 * @hw: pointer to the hardware structure
585 * @addr: I2C bus address to write to
586 * @reg: I2C device register to write to
587 * @val: value to write
588 *
589 * Returns an error code on error.
590 **/
591 static s32
592 ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *hw,
593 u8 addr, u16 reg, u16 val)
594 {
595 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, false);
596 }
597
598 /**
599 * ixgbe_init_ops_X550EM - Inits func ptrs and MAC type
600 * @hw: pointer to hardware structure
601 *
602 * Initialize the function pointers and for MAC type X550EM.
603 * Does not touch the hardware.
604 **/
605 s32 ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
606 {
607 struct ixgbe_mac_info *mac = &hw->mac;
608 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
609 struct ixgbe_phy_info *phy = &hw->phy;
610 s32 ret_val;
611
612 DEBUGFUNC("ixgbe_init_ops_X550EM");
613
614 /* Similar to X550 so start there. */
615 ret_val = ixgbe_init_ops_X550(hw);
616
617 /* Since this function eventually calls
618 * ixgbe_init_ops_540 by design, we are setting
619 * the pointers to NULL explicitly here to overwrite
620 * the values being set in the x540 function.
621 */
622 /* Thermal sensor not supported in x550EM */
623 mac->ops.get_thermal_sensor_data = NULL;
624 mac->ops.init_thermal_sensor_thresh = NULL;
625 mac->thermal_sensor_enabled = false;
626
627 /* Bypass not supported in x550EM */
628 mac->ops.bypass_rw = NULL;
629 mac->ops.bypass_valid_rd = NULL;
630 mac->ops.bypass_set = NULL;
631 mac->ops.bypass_rd_eep = NULL;
632
633 /* FCOE not supported in x550EM */
634 mac->ops.get_san_mac_addr = NULL;
635 mac->ops.set_san_mac_addr = NULL;
636 mac->ops.get_wwn_prefix = NULL;
637 mac->ops.get_fcoe_boot_status = NULL;
638
639 /* IPsec not supported in x550EM */
640 mac->ops.disable_sec_rx_path = NULL;
641 mac->ops.enable_sec_rx_path = NULL;
642
643 /* AUTOC register is not present in x550EM. */
644 mac->ops.prot_autoc_read = NULL;
645 mac->ops.prot_autoc_write = NULL;
646
647 /* X550EM bus type is internal*/
648 hw->bus.type = ixgbe_bus_type_internal;
649 mac->ops.get_bus_info = ixgbe_get_bus_info_X550em;
650
651
652 mac->ops.get_media_type = ixgbe_get_media_type_X550em;
653 mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em;
654 mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em;
655 mac->ops.reset_hw = ixgbe_reset_hw_X550em;
656 mac->ops.get_supported_physical_layer =
657 ixgbe_get_supported_physical_layer_X550em;
658
659 if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper)
660 mac->ops.setup_fc = ixgbe_setup_fc_generic;
661 else
662 mac->ops.setup_fc = ixgbe_setup_fc_X550em;
663
664 /* PHY */
665 phy->ops.init = ixgbe_init_phy_ops_X550em;
666 switch (hw->device_id) {
667 case IXGBE_DEV_ID_X550EM_A_1G_T:
668 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
669 mac->ops.setup_fc = NULL;
670 phy->ops.identify = ixgbe_identify_phy_fw;
671 phy->ops.set_phy_power = NULL;
672 phy->ops.get_firmware_version = NULL;
673 break;
674 case IXGBE_DEV_ID_X550EM_X_1G_T:
675 mac->ops.setup_fc = NULL;
676 phy->ops.identify = ixgbe_identify_phy_x550em;
677 phy->ops.set_phy_power = NULL;
678 break;
679 default:
680 phy->ops.identify = ixgbe_identify_phy_x550em;
681 }
682
683 if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper)
684 phy->ops.set_phy_power = NULL;
685
686
687 /* EEPROM */
688 eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
689 eeprom->ops.read = ixgbe_read_ee_hostif_X550;
690 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
691 eeprom->ops.write = ixgbe_write_ee_hostif_X550;
692 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
693 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
694 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
695 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
696
697 return ret_val;
698 }
699
700 /**
701 * ixgbe_setup_fw_link - Setup firmware-controlled PHYs
702 * @hw: pointer to hardware structure
703 */
704 static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
705 {
706 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
707 s32 rc;
708 u16 i;
709
710 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
711 return 0;
712
713 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
714 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
715 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
716 return IXGBE_ERR_INVALID_LINK_SETTINGS;
717 }
718
719 switch (hw->fc.requested_mode) {
720 case ixgbe_fc_full:
721 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RXTX <<
722 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
723 break;
724 case ixgbe_fc_rx_pause:
725 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RX <<
726 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
727 break;
728 case ixgbe_fc_tx_pause:
729 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_TX <<
730 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
731 break;
732 default:
733 break;
734 }
735
736 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
737 if (hw->phy.autoneg_advertised & ixgbe_fw_map[i].phy_speed)
738 setup[0] |= (u32)(ixgbe_fw_map[i].fw_speed);
739 }
740 setup[0] |= FW_PHY_ACT_SETUP_LINK_HP | FW_PHY_ACT_SETUP_LINK_AN;
741
742 if (hw->phy.eee_speeds_advertised)
743 setup[0] |= FW_PHY_ACT_SETUP_LINK_EEE;
744
745 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
746 if (rc)
747 return rc;
748 if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
749 return IXGBE_ERR_OVERTEMP;
750 return IXGBE_SUCCESS;
751 }
752
753 /**
754 * ixgbe_fc_autoneg_fw _ Set up flow control for FW-controlled PHYs
755 * @hw: pointer to hardware structure
756 *
757 * Called at init time to set up flow control.
758 */
759 static s32 ixgbe_fc_autoneg_fw(struct ixgbe_hw *hw)
760 {
761 if (hw->fc.requested_mode == ixgbe_fc_default)
762 hw->fc.requested_mode = ixgbe_fc_full;
763
764 return ixgbe_setup_fw_link(hw);
765 }
766
767 /**
768 * ixgbe_setup_eee_fw - Enable/disable EEE support
769 * @hw: pointer to the HW structure
770 * @enable_eee: boolean flag to enable EEE
771 *
772 * Enable/disable EEE based on enable_eee flag.
773 * This function controls EEE for firmware-based PHY implementations.
774 */
775 static s32 ixgbe_setup_eee_fw(struct ixgbe_hw *hw, bool enable_eee)
776 {
777 if (!!hw->phy.eee_speeds_advertised == enable_eee)
778 return IXGBE_SUCCESS;
779 if (enable_eee)
780 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
781 else
782 hw->phy.eee_speeds_advertised = 0;
783 return hw->phy.ops.setup_link(hw);
784 }
785
786 /**
787 * ixgbe_init_ops_X550EM_a - Inits func ptrs and MAC type
788 * @hw: pointer to hardware structure
789 *
790 * Initialize the function pointers and for MAC type X550EM_a.
791 * Does not touch the hardware.
792 **/
793 s32 ixgbe_init_ops_X550EM_a(struct ixgbe_hw *hw)
794 {
795 struct ixgbe_mac_info *mac = &hw->mac;
796 s32 ret_val;
797
798 DEBUGFUNC("ixgbe_init_ops_X550EM_a");
799
800 /* Start with generic X550EM init */
801 ret_val = ixgbe_init_ops_X550EM(hw);
802
803 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
804 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L) {
805 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
806 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
807 } else {
808 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550a;
809 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550a;
810 }
811 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550a;
812 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550a;
813
814 switch (mac->ops.get_media_type(hw)) {
815 case ixgbe_media_type_fiber:
816 mac->ops.setup_fc = NULL;
817 mac->ops.fc_autoneg = ixgbe_fc_autoneg_fiber_x550em_a;
818 break;
819 case ixgbe_media_type_backplane:
820 mac->ops.fc_autoneg = ixgbe_fc_autoneg_backplane_x550em_a;
821 mac->ops.setup_fc = ixgbe_setup_fc_backplane_x550em_a;
822 break;
823 default:
824 break;
825 }
826
827 switch (hw->device_id) {
828 case IXGBE_DEV_ID_X550EM_A_1G_T:
829 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
830 mac->ops.fc_autoneg = ixgbe_fc_autoneg_sgmii_x550em_a;
831 mac->ops.setup_fc = ixgbe_fc_autoneg_fw;
832 mac->ops.setup_eee = ixgbe_setup_eee_fw;
833 hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL |
834 IXGBE_LINK_SPEED_1GB_FULL;
835 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
836 break;
837 default:
838 break;
839 }
840
841 return ret_val;
842 }
843
844 /**
845 * ixgbe_init_ops_X550EM_x - Inits func ptrs and MAC type
846 * @hw: pointer to hardware structure
847 *
848 * Initialize the function pointers and for MAC type X550EM_x.
849 * Does not touch the hardware.
850 **/
851 s32 ixgbe_init_ops_X550EM_x(struct ixgbe_hw *hw)
852 {
853 struct ixgbe_mac_info *mac = &hw->mac;
854 struct ixgbe_link_info *link = &hw->link;
855 s32 ret_val;
856
857 DEBUGFUNC("ixgbe_init_ops_X550EM_x");
858
859 /* Start with generic X550EM init */
860 ret_val = ixgbe_init_ops_X550EM(hw);
861
862 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
863 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
864 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
865 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
866 link->ops.read_link = ixgbe_read_i2c_combined_generic;
867 link->ops.read_link_unlocked = ixgbe_read_i2c_combined_generic_unlocked;
868 link->ops.write_link = ixgbe_write_i2c_combined_generic;
869 link->ops.write_link_unlocked =
870 ixgbe_write_i2c_combined_generic_unlocked;
871 link->addr = IXGBE_CS4227;
872
873 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T) {
874 mac->ops.setup_fc = NULL;
875 mac->ops.setup_eee = NULL;
876 mac->ops.init_led_link_act = NULL;
877 }
878
879 return ret_val;
880 }
881
882 /**
883 * ixgbe_dmac_config_X550
884 * @hw: pointer to hardware structure
885 *
886 * Configure DMA coalescing. If enabling dmac, dmac is activated.
887 * When disabling dmac, dmac enable dmac bit is cleared.
888 **/
889 s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw)
890 {
891 u32 reg, high_pri_tc;
892
893 DEBUGFUNC("ixgbe_dmac_config_X550");
894
895 /* Disable DMA coalescing before configuring */
896 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
897 reg &= ~IXGBE_DMACR_DMAC_EN;
898 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
899
900 /* Disable DMA Coalescing if the watchdog timer is 0 */
901 if (!hw->mac.dmac_config.watchdog_timer)
902 goto out;
903
904 ixgbe_dmac_config_tcs_X550(hw);
905
906 /* Configure DMA Coalescing Control Register */
907 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
908
909 /* Set the watchdog timer in units of 40.96 usec */
910 reg &= ~IXGBE_DMACR_DMACWT_MASK;
911 reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096;
912
913 reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK;
914 /* If fcoe is enabled, set high priority traffic class */
915 if (hw->mac.dmac_config.fcoe_en) {
916 high_pri_tc = 1 << hw->mac.dmac_config.fcoe_tc;
917 reg |= ((high_pri_tc << IXGBE_DMACR_HIGH_PRI_TC_SHIFT) &
918 IXGBE_DMACR_HIGH_PRI_TC_MASK);
919 }
920 reg |= IXGBE_DMACR_EN_MNG_IND;
921
922 /* Enable DMA coalescing after configuration */
923 reg |= IXGBE_DMACR_DMAC_EN;
924 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
925
926 out:
927 return IXGBE_SUCCESS;
928 }
929
930 /**
931 * ixgbe_dmac_config_tcs_X550
932 * @hw: pointer to hardware structure
933 *
934 * Configure DMA coalescing threshold per TC. The dmac enable bit must
935 * be cleared before configuring.
936 **/
937 s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw)
938 {
939 u32 tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb;
940
941 DEBUGFUNC("ixgbe_dmac_config_tcs_X550");
942
943 /* Configure DMA coalescing enabled */
944 switch (hw->mac.dmac_config.link_speed) {
945 case IXGBE_LINK_SPEED_10_FULL:
946 case IXGBE_LINK_SPEED_100_FULL:
947 pb_headroom = IXGBE_DMACRXT_100M;
948 break;
949 case IXGBE_LINK_SPEED_1GB_FULL:
950 pb_headroom = IXGBE_DMACRXT_1G;
951 break;
952 default:
953 pb_headroom = IXGBE_DMACRXT_10G;
954 break;
955 }
956
957 maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >>
958 IXGBE_MHADD_MFS_SHIFT) / 1024);
959
960 /* Set the per Rx packet buffer receive threshold */
961 for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) {
962 reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc));
963 reg &= ~IXGBE_DMCTH_DMACRXT_MASK;
964
965 if (tc < hw->mac.dmac_config.num_tcs) {
966 /* Get Rx PB size */
967 rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc));
968 rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >>
969 IXGBE_RXPBSIZE_SHIFT;
970
971 /* Calculate receive buffer threshold in kilobytes */
972 if (rx_pb_size > pb_headroom)
973 rx_pb_size = rx_pb_size - pb_headroom;
974 else
975 rx_pb_size = 0;
976
977 /* Minimum of MFS shall be set for DMCTH */
978 reg |= (rx_pb_size > maxframe_size_kb) ?
979 rx_pb_size : maxframe_size_kb;
980 }
981 IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg);
982 }
983 return IXGBE_SUCCESS;
984 }
985
986 /**
987 * ixgbe_dmac_update_tcs_X550
988 * @hw: pointer to hardware structure
989 *
990 * Disables dmac, updates per TC settings, and then enables dmac.
991 **/
992 s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw)
993 {
994 u32 reg;
995
996 DEBUGFUNC("ixgbe_dmac_update_tcs_X550");
997
998 /* Disable DMA coalescing before configuring */
999 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
1000 reg &= ~IXGBE_DMACR_DMAC_EN;
1001 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
1002
1003 ixgbe_dmac_config_tcs_X550(hw);
1004
1005 /* Enable DMA coalescing after configuration */
1006 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
1007 reg |= IXGBE_DMACR_DMAC_EN;
1008 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
1009
1010 return IXGBE_SUCCESS;
1011 }
1012
1013 /**
1014 * ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
1015 * @hw: pointer to hardware structure
1016 *
1017 * Initializes the EEPROM parameters ixgbe_eeprom_info within the
1018 * ixgbe_hw struct in order to set up EEPROM access.
1019 **/
1020 s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
1021 {
1022 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
1023 u32 eec;
1024 u16 eeprom_size;
1025
1026 DEBUGFUNC("ixgbe_init_eeprom_params_X550");
1027
1028 if (eeprom->type == ixgbe_eeprom_uninitialized) {
1029 eeprom->semaphore_delay = 10;
1030 eeprom->type = ixgbe_flash;
1031
1032 eec = IXGBE_READ_REG(hw, IXGBE_EEC);
1033 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
1034 IXGBE_EEC_SIZE_SHIFT);
1035 eeprom->word_size = 1 << (eeprom_size +
1036 IXGBE_EEPROM_WORD_SIZE_SHIFT);
1037
1038 DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
1039 eeprom->type, eeprom->word_size);
1040 }
1041
1042 return IXGBE_SUCCESS;
1043 }
1044
1045 /**
1046 * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning
1047 * @hw: pointer to hardware structure
1048 * @enable: enable or disable source address pruning
1049 * @pool: Rx pool to set source address pruning for
1050 **/
1051 void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
1052 unsigned int pool)
1053 {
1054 u64 pfflp;
1055
1056 /* max rx pool is 63 */
1057 if (pool > 63)
1058 return;
1059
1060 pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
1061 pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
1062
1063 if (enable)
1064 pfflp |= (1ULL << pool);
1065 else
1066 pfflp &= ~(1ULL << pool);
1067
1068 IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp);
1069 IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32));
1070 }
1071
1072 /**
1073 * ixgbe_set_ethertype_anti_spoofing_X550 - Configure Ethertype anti-spoofing
1074 * @hw: pointer to hardware structure
1075 * @enable: enable or disable switch for Ethertype anti-spoofing
1076 * @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing
1077 *
1078 **/
1079 void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
1080 bool enable, int vf)
1081 {
1082 int vf_target_reg = vf >> 3;
1083 int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT;
1084 u32 pfvfspoof;
1085
1086 DEBUGFUNC("ixgbe_set_ethertype_anti_spoofing_X550");
1087
1088 pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
1089 if (enable)
1090 pfvfspoof |= (1 << vf_target_shift);
1091 else
1092 pfvfspoof &= ~(1 << vf_target_shift);
1093
1094 IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof);
1095 }
1096
1097 /**
1098 * ixgbe_iosf_wait - Wait for IOSF command completion
1099 * @hw: pointer to hardware structure
1100 * @ctrl: pointer to location to receive final IOSF control value
1101 *
1102 * Returns failing status on timeout
1103 *
1104 * Note: ctrl can be NULL if the IOSF control register value is not needed
1105 **/
1106 static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
1107 {
1108 u32 i, command = 0;
1109
1110 /* Check every 10 usec to see if the address cycle completed.
1111 * The SB IOSF BUSY bit will clear when the operation is
1112 * complete
1113 */
1114 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
1115 command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
1116 if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
1117 break;
1118 usec_delay(10);
1119 }
1120 if (ctrl)
1121 *ctrl = command;
1122 if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
1123 ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n");
1124 return IXGBE_ERR_PHY;
1125 }
1126
1127 return IXGBE_SUCCESS;
1128 }
1129
1130 /**
1131 * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register
1132 * of the IOSF device
1133 * @hw: pointer to hardware structure
1134 * @reg_addr: 32 bit PHY register to write
1135 * @device_type: 3 bit device type
1136 * @data: Data to write to the register
1137 **/
1138 s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
1139 u32 device_type, u32 data)
1140 {
1141 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
1142 u32 command, error __unused;
1143 s32 ret;
1144
1145 ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
1146 if (ret != IXGBE_SUCCESS)
1147 return ret;
1148
1149 ret = ixgbe_iosf_wait(hw, NULL);
1150 if (ret != IXGBE_SUCCESS)
1151 goto out;
1152
1153 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
1154 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
1155
1156 /* Write IOSF control register */
1157 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
1158
1159 /* Write IOSF data register */
1160 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data);
1161
1162 ret = ixgbe_iosf_wait(hw, &command);
1163
1164 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
1165 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
1166 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
1167 ERROR_REPORT2(IXGBE_ERROR_POLLING,
1168 "Failed to write, error %x\n", error);
1169 ret = IXGBE_ERR_PHY;
1170 }
1171
1172 out:
1173 ixgbe_release_swfw_semaphore(hw, gssr);
1174 return ret;
1175 }
1176
1177 /**
1178 * ixgbe_read_iosf_sb_reg_x550 - Reads specified register of the IOSF device
1179 * @hw: pointer to hardware structure
1180 * @reg_addr: 32 bit PHY register to write
1181 * @device_type: 3 bit device type
1182 * @data: Pointer to read data from the register
1183 **/
1184 s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
1185 u32 device_type, u32 *data)
1186 {
1187 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
1188 u32 command, error __unused;
1189 s32 ret;
1190
1191 ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
1192 if (ret != IXGBE_SUCCESS)
1193 return ret;
1194
1195 ret = ixgbe_iosf_wait(hw, NULL);
1196 if (ret != IXGBE_SUCCESS)
1197 goto out;
1198
1199 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
1200 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
1201
1202 /* Write IOSF control register */
1203 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
1204
1205 ret = ixgbe_iosf_wait(hw, &command);
1206
1207 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
1208 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
1209 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
1210 ERROR_REPORT2(IXGBE_ERROR_POLLING,
1211 "Failed to read, error %x\n", error);
1212 ret = IXGBE_ERR_PHY;
1213 }
1214
1215 if (ret == IXGBE_SUCCESS)
1216 *data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA);
1217
1218 out:
1219 ixgbe_release_swfw_semaphore(hw, gssr);
1220 return ret;
1221 }
1222
1223 /**
1224 * ixgbe_get_phy_token - Get the token for shared phy access
1225 * @hw: Pointer to hardware structure
1226 */
1227
1228 s32 ixgbe_get_phy_token(struct ixgbe_hw *hw)
1229 {
1230 struct ixgbe_hic_phy_token_req token_cmd;
1231 s32 status;
1232
1233 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
1234 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
1235 token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
1236 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1237 token_cmd.port_number = hw->bus.lan_id;
1238 token_cmd.command_type = FW_PHY_TOKEN_REQ;
1239 token_cmd.pad = 0;
1240 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd,
1241 sizeof(token_cmd),
1242 IXGBE_HI_COMMAND_TIMEOUT,
1243 true);
1244 if (status) {
1245 DEBUGOUT1("Issuing host interface command failed with Status = %d\n",
1246 status);
1247 return status;
1248 }
1249 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
1250 return IXGBE_SUCCESS;
1251 if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY) {
1252 DEBUGOUT1("Host interface command returned 0x%08x , returning IXGBE_ERR_FW_RESP_INVALID\n",
1253 token_cmd.hdr.cmd_or_resp.ret_status);
1254 return IXGBE_ERR_FW_RESP_INVALID;
1255 }
1256
1257 DEBUGOUT("Returning IXGBE_ERR_TOKEN_RETRY\n");
1258 return IXGBE_ERR_TOKEN_RETRY;
1259 }
1260
1261 /**
1262 * ixgbe_put_phy_token - Put the token for shared phy access
1263 * @hw: Pointer to hardware structure
1264 */
1265
1266 s32 ixgbe_put_phy_token(struct ixgbe_hw *hw)
1267 {
1268 struct ixgbe_hic_phy_token_req token_cmd;
1269 s32 status;
1270
1271 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
1272 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
1273 token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
1274 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1275 token_cmd.port_number = hw->bus.lan_id;
1276 token_cmd.command_type = FW_PHY_TOKEN_REL;
1277 token_cmd.pad = 0;
1278 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd,
1279 sizeof(token_cmd),
1280 IXGBE_HI_COMMAND_TIMEOUT,
1281 true);
1282 if (status)
1283 return status;
1284 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
1285 return IXGBE_SUCCESS;
1286
1287 DEBUGOUT("Put PHY Token host interface command failed");
1288 return IXGBE_ERR_FW_RESP_INVALID;
1289 }
1290
1291 /**
1292 * ixgbe_write_iosf_sb_reg_x550a - Writes a value to specified register
1293 * of the IOSF device
1294 * @hw: pointer to hardware structure
1295 * @reg_addr: 32 bit PHY register to write
1296 * @device_type: 3 bit device type
1297 * @data: Data to write to the register
1298 **/
1299 s32 ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
1300 u32 device_type, u32 data)
1301 {
1302 struct ixgbe_hic_internal_phy_req write_cmd;
1303 s32 status;
1304 UNREFERENCED_1PARAMETER(device_type);
1305
1306 memset(&write_cmd, 0, sizeof(write_cmd));
1307 write_cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
1308 write_cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
1309 write_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1310 write_cmd.port_number = hw->bus.lan_id;
1311 write_cmd.command_type = FW_INT_PHY_REQ_WRITE;
1312 write_cmd.address = IXGBE_CPU_TO_BE16(reg_addr);
1313 write_cmd.write_data = IXGBE_CPU_TO_BE32(data);
1314
1315 status = ixgbe_host_interface_command(hw, (u32 *)&write_cmd,
1316 sizeof(write_cmd),
1317 IXGBE_HI_COMMAND_TIMEOUT, false);
1318
1319 return status;
1320 }
1321
1322 /**
1323 * ixgbe_read_iosf_sb_reg_x550a - Reads specified register of the IOSF device
1324 * @hw: pointer to hardware structure
1325 * @reg_addr: 32 bit PHY register to write
1326 * @device_type: 3 bit device type
1327 * @data: Pointer to read data from the register
1328 **/
1329 s32 ixgbe_read_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
1330 u32 device_type, u32 *data)
1331 {
1332 union {
1333 struct ixgbe_hic_internal_phy_req cmd;
1334 struct ixgbe_hic_internal_phy_resp rsp;
1335 } hic;
1336 s32 status;
1337 UNREFERENCED_1PARAMETER(device_type);
1338
1339 memset(&hic, 0, sizeof(hic));
1340 hic.cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
1341 hic.cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
1342 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1343 hic.cmd.port_number = hw->bus.lan_id;
1344 hic.cmd.command_type = FW_INT_PHY_REQ_READ;
1345 hic.cmd.address = IXGBE_CPU_TO_BE16(reg_addr);
1346
1347 status = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd,
1348 sizeof(hic.cmd),
1349 IXGBE_HI_COMMAND_TIMEOUT, true);
1350
1351 /* Extract the register value from the response. */
1352 *data = IXGBE_BE32_TO_CPU(hic.rsp.read_data);
1353
1354 return status;
1355 }
1356
1357 /**
1358 * ixgbe_disable_mdd_X550
1359 * @hw: pointer to hardware structure
1360 *
1361 * Disable malicious driver detection
1362 **/
1363 void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw)
1364 {
1365 u32 reg;
1366
1367 DEBUGFUNC("ixgbe_disable_mdd_X550");
1368
1369 /* Disable MDD for TX DMA and interrupt */
1370 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
1371 reg &= ~(IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
1372 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
1373
1374 /* Disable MDD for RX and interrupt */
1375 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
1376 reg &= ~(IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
1377 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
1378 }
1379
1380 /**
1381 * ixgbe_enable_mdd_X550
1382 * @hw: pointer to hardware structure
1383 *
1384 * Enable malicious driver detection
1385 **/
1386 void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw)
1387 {
1388 u32 reg;
1389
1390 DEBUGFUNC("ixgbe_enable_mdd_X550");
1391
1392 /* Enable MDD for TX DMA and interrupt */
1393 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
1394 reg |= (IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
1395 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
1396
1397 /* Enable MDD for RX and interrupt */
1398 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
1399 reg |= (IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
1400 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
1401 }
1402
1403 /**
1404 * ixgbe_restore_mdd_vf_X550
1405 * @hw: pointer to hardware structure
1406 * @vf: vf index
1407 *
1408 * Restore VF that was disabled during malicious driver detection event
1409 **/
1410 void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf)
1411 {
1412 u32 idx, reg, num_qs, start_q, bitmask;
1413
1414 DEBUGFUNC("ixgbe_restore_mdd_vf_X550");
1415
1416 /* Map VF to queues */
1417 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
1418 switch (reg & IXGBE_MRQC_MRQE_MASK) {
1419 case IXGBE_MRQC_VMDQRT8TCEN:
1420 num_qs = 8; /* 16 VFs / pools */
1421 bitmask = 0x000000FF;
1422 break;
1423 case IXGBE_MRQC_VMDQRSS32EN:
1424 case IXGBE_MRQC_VMDQRT4TCEN:
1425 num_qs = 4; /* 32 VFs / pools */
1426 bitmask = 0x0000000F;
1427 break;
1428 default: /* 64 VFs / pools */
1429 num_qs = 2;
1430 bitmask = 0x00000003;
1431 break;
1432 }
1433 start_q = vf * num_qs;
1434
1435 /* Release vf's queues by clearing WQBR_TX and WQBR_RX (RW1C) */
1436 idx = start_q / 32;
1437 reg = 0;
1438 reg |= (bitmask << (start_q % 32));
1439 IXGBE_WRITE_REG(hw, IXGBE_WQBR_TX(idx), reg);
1440 IXGBE_WRITE_REG(hw, IXGBE_WQBR_RX(idx), reg);
1441 }
1442
1443 /**
1444 * ixgbe_mdd_event_X550
1445 * @hw: pointer to hardware structure
1446 * @vf_bitmap: vf bitmap of malicious vfs
1447 *
1448 * Handle malicious driver detection event.
1449 **/
1450 void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap)
1451 {
1452 u32 wqbr;
1453 u32 i, j, reg, q, shift, vf, idx;
1454
1455 DEBUGFUNC("ixgbe_mdd_event_X550");
1456
1457 /* figure out pool size for mapping to vf's */
1458 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
1459 switch (reg & IXGBE_MRQC_MRQE_MASK) {
1460 case IXGBE_MRQC_VMDQRT8TCEN:
1461 shift = 3; /* 16 VFs / pools */
1462 break;
1463 case IXGBE_MRQC_VMDQRSS32EN:
1464 case IXGBE_MRQC_VMDQRT4TCEN:
1465 shift = 2; /* 32 VFs / pools */
1466 break;
1467 default:
1468 shift = 1; /* 64 VFs / pools */
1469 break;
1470 }
1471
1472 /* Read WQBR_TX and WQBR_RX and check for malicious queues */
1473 for (i = 0; i < 4; i++) {
1474 wqbr = IXGBE_READ_REG(hw, IXGBE_WQBR_TX(i));
1475 wqbr |= IXGBE_READ_REG(hw, IXGBE_WQBR_RX(i));
1476
1477 if (!wqbr)
1478 continue;
1479
1480 /* Get malicious queue */
1481 for (j = 0; j < 32 && wqbr; j++) {
1482
1483 if (!(wqbr & (1 << j)))
1484 continue;
1485
1486 /* Get queue from bitmask */
1487 q = j + (i * 32);
1488
1489 /* Map queue to vf */
1490 vf = (q >> shift);
1491
1492 /* Set vf bit in vf_bitmap */
1493 idx = vf / 32;
1494 vf_bitmap[idx] |= (1 << (vf % 32));
1495 wqbr &= ~(1 << j);
1496 }
1497 }
1498 }
1499
1500 /**
1501 * ixgbe_get_media_type_X550em - Get media type
1502 * @hw: pointer to hardware structure
1503 *
1504 * Returns the media type (fiber, copper, backplane)
1505 */
1506 enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
1507 {
1508 enum ixgbe_media_type media_type;
1509
1510 DEBUGFUNC("ixgbe_get_media_type_X550em");
1511
1512 /* Detect if there is a copper PHY attached. */
1513 switch (hw->device_id) {
1514 case IXGBE_DEV_ID_X550EM_X_KR:
1515 case IXGBE_DEV_ID_X550EM_X_KX4:
1516 case IXGBE_DEV_ID_X550EM_X_XFI:
1517 case IXGBE_DEV_ID_X550EM_A_KR:
1518 case IXGBE_DEV_ID_X550EM_A_KR_L:
1519 media_type = ixgbe_media_type_backplane;
1520 break;
1521 case IXGBE_DEV_ID_X550EM_X_SFP:
1522 case IXGBE_DEV_ID_X550EM_A_SFP:
1523 case IXGBE_DEV_ID_X550EM_A_SFP_N:
1524 case IXGBE_DEV_ID_X550EM_A_QSFP:
1525 case IXGBE_DEV_ID_X550EM_A_QSFP_N:
1526 media_type = ixgbe_media_type_fiber;
1527 break;
1528 case IXGBE_DEV_ID_X550EM_X_1G_T:
1529 case IXGBE_DEV_ID_X550EM_X_10G_T:
1530 case IXGBE_DEV_ID_X550EM_A_10G_T:
1531 media_type = ixgbe_media_type_copper;
1532 break;
1533 case IXGBE_DEV_ID_X550EM_A_SGMII:
1534 case IXGBE_DEV_ID_X550EM_A_SGMII_L:
1535 media_type = ixgbe_media_type_backplane;
1536 hw->phy.type = ixgbe_phy_sgmii;
1537 break;
1538 case IXGBE_DEV_ID_X550EM_A_1G_T:
1539 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
1540 media_type = ixgbe_media_type_copper;
1541 break;
1542 default:
1543 media_type = ixgbe_media_type_unknown;
1544 break;
1545 }
1546 return media_type;
1547 }
1548
1549 /**
1550 * ixgbe_supported_sfp_modules_X550em - Check if SFP module type is supported
1551 * @hw: pointer to hardware structure
1552 * @linear: true if SFP module is linear
1553 */
1554 static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
1555 {
1556 DEBUGFUNC("ixgbe_supported_sfp_modules_X550em");
1557
1558 switch (hw->phy.sfp_type) {
1559 case ixgbe_sfp_type_not_present:
1560 return IXGBE_ERR_SFP_NOT_PRESENT;
1561 case ixgbe_sfp_type_da_cu_core0:
1562 case ixgbe_sfp_type_da_cu_core1:
1563 *linear = true;
1564 break;
1565 case ixgbe_sfp_type_srlr_core0:
1566 case ixgbe_sfp_type_srlr_core1:
1567 case ixgbe_sfp_type_da_act_lmt_core0:
1568 case ixgbe_sfp_type_da_act_lmt_core1:
1569 case ixgbe_sfp_type_1g_sx_core0:
1570 case ixgbe_sfp_type_1g_sx_core1:
1571 case ixgbe_sfp_type_1g_lx_core0:
1572 case ixgbe_sfp_type_1g_lx_core1:
1573 *linear = false;
1574 break;
1575 case ixgbe_sfp_type_unknown:
1576 case ixgbe_sfp_type_1g_cu_core0:
1577 case ixgbe_sfp_type_1g_cu_core1:
1578 default:
1579 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1580 }
1581
1582 return IXGBE_SUCCESS;
1583 }
1584
1585 /**
1586 * ixgbe_identify_sfp_module_X550em - Identifies SFP modules
1587 * @hw: pointer to hardware structure
1588 *
1589 * Searches for and identifies the SFP module and assigns appropriate PHY type.
1590 **/
1591 s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw)
1592 {
1593 s32 status;
1594 bool linear;
1595
1596 DEBUGFUNC("ixgbe_identify_sfp_module_X550em");
1597
1598 status = ixgbe_identify_module_generic(hw);
1599
1600 if (status != IXGBE_SUCCESS)
1601 return status;
1602
1603 /* Check if SFP module is supported */
1604 status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
1605
1606 return status;
1607 }
1608
1609 /**
1610 * ixgbe_setup_sfp_modules_X550em - Setup MAC link ops
1611 * @hw: pointer to hardware structure
1612 */
1613 s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
1614 {
1615 s32 status;
1616 bool linear;
1617
1618 DEBUGFUNC("ixgbe_setup_sfp_modules_X550em");
1619
1620 /* Check if SFP module is supported */
1621 status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
1622
1623 if (status != IXGBE_SUCCESS)
1624 return status;
1625
1626 ixgbe_init_mac_link_ops_X550em(hw);
1627 hw->phy.ops.reset = NULL;
1628
1629 return IXGBE_SUCCESS;
1630 }
1631
1632 /**
1633 * ixgbe_restart_an_internal_phy_x550em - restart autonegotiation for the
1634 * internal PHY
1635 * @hw: pointer to hardware structure
1636 **/
1637 static s32 ixgbe_restart_an_internal_phy_x550em(struct ixgbe_hw *hw)
1638 {
1639 s32 status;
1640 u32 link_ctrl;
1641
1642 /* Restart auto-negotiation. */
1643 status = hw->mac.ops.read_iosf_sb_reg(hw,
1644 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1645 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_ctrl);
1646
1647 if (status) {
1648 DEBUGOUT("Auto-negotiation did not complete\n");
1649 return status;
1650 }
1651
1652 link_ctrl |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
1653 status = hw->mac.ops.write_iosf_sb_reg(hw,
1654 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1655 IXGBE_SB_IOSF_TARGET_KR_PHY, link_ctrl);
1656
1657 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1658 u32 flx_mask_st20;
1659
1660 /* Indicate to FW that AN restart has been asserted */
1661 status = hw->mac.ops.read_iosf_sb_reg(hw,
1662 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1663 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_mask_st20);
1664
1665 if (status) {
1666 DEBUGOUT("Auto-negotiation did not complete\n");
1667 return status;
1668 }
1669
1670 flx_mask_st20 |= IXGBE_KRM_PMD_FLX_MASK_ST20_FW_AN_RESTART;
1671 status = hw->mac.ops.write_iosf_sb_reg(hw,
1672 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1673 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_mask_st20);
1674 }
1675
1676 return status;
1677 }
1678
1679 /**
1680 * ixgbe_setup_sgmii - Set up link for sgmii
1681 * @hw: pointer to hardware structure
1682 * @speed: new link speed
1683 * @autoneg_wait: true when waiting for completion is needed
1684 */
1685 static s32 ixgbe_setup_sgmii(struct ixgbe_hw *hw, ixgbe_link_speed speed,
1686 bool autoneg_wait)
1687 {
1688 struct ixgbe_mac_info *mac = &hw->mac;
1689 u32 lval, sval, flx_val;
1690 s32 rc;
1691
1692 rc = mac->ops.read_iosf_sb_reg(hw,
1693 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1694 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
1695 if (rc)
1696 return rc;
1697
1698 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
1699 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
1700 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
1701 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
1702 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
1703 rc = mac->ops.write_iosf_sb_reg(hw,
1704 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1705 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1706 if (rc)
1707 return rc;
1708
1709 rc = mac->ops.read_iosf_sb_reg(hw,
1710 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1711 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
1712 if (rc)
1713 return rc;
1714
1715 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
1716 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
1717 rc = mac->ops.write_iosf_sb_reg(hw,
1718 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1719 IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
1720 if (rc)
1721 return rc;
1722
1723 rc = mac->ops.read_iosf_sb_reg(hw,
1724 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1725 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
1726 if (rc)
1727 return rc;
1728
1729 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
1730 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
1731 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
1732 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
1733 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
1734
1735 rc = mac->ops.write_iosf_sb_reg(hw,
1736 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1737 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
1738 if (rc)
1739 return rc;
1740
1741 rc = ixgbe_restart_an_internal_phy_x550em(hw);
1742 if (rc)
1743 return rc;
1744
1745 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
1746 }
1747
1748 /**
1749 * ixgbe_setup_sgmii_fw - Set up link for internal PHY SGMII auto-negotiation
1750 * @hw: pointer to hardware structure
1751 * @speed: new link speed
1752 * @autoneg_wait: true when waiting for completion is needed
1753 */
1754 static s32 ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed,
1755 bool autoneg_wait)
1756 {
1757 struct ixgbe_mac_info *mac = &hw->mac;
1758 u32 lval, sval, flx_val;
1759 s32 rc;
1760
1761 rc = mac->ops.read_iosf_sb_reg(hw,
1762 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1763 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
1764 if (rc)
1765 return rc;
1766
1767 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
1768 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
1769 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
1770 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
1771 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
1772 rc = mac->ops.write_iosf_sb_reg(hw,
1773 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1774 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1775 if (rc)
1776 return rc;
1777
1778 rc = mac->ops.read_iosf_sb_reg(hw,
1779 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1780 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
1781 if (rc)
1782 return rc;
1783
1784 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
1785 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
1786 rc = mac->ops.write_iosf_sb_reg(hw,
1787 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1788 IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
1789 if (rc)
1790 return rc;
1791
1792 rc = mac->ops.write_iosf_sb_reg(hw,
1793 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1794 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1795 if (rc)
1796 return rc;
1797
1798 rc = mac->ops.read_iosf_sb_reg(hw,
1799 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1800 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
1801 if (rc)
1802 return rc;
1803
1804 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
1805 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
1806 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
1807 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
1808 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
1809
1810 rc = mac->ops.write_iosf_sb_reg(hw,
1811 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1812 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
1813 if (rc)
1814 return rc;
1815
1816 rc = ixgbe_restart_an_internal_phy_x550em(hw);
1817
1818 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
1819 }
1820
1821 /**
1822 * ixgbe_init_mac_link_ops_X550em - init mac link function pointers
1823 * @hw: pointer to hardware structure
1824 */
1825 void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
1826 {
1827 struct ixgbe_mac_info *mac = &hw->mac;
1828
1829 DEBUGFUNC("ixgbe_init_mac_link_ops_X550em");
1830
1831 switch (hw->mac.ops.get_media_type(hw)) {
1832 case ixgbe_media_type_fiber:
1833 /* CS4227 does not support autoneg, so disable the laser control
1834 * functions for SFP+ fiber
1835 */
1836 mac->ops.disable_tx_laser = NULL;
1837 mac->ops.enable_tx_laser = NULL;
1838 mac->ops.flap_tx_laser = NULL;
1839 mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
1840 mac->ops.set_rate_select_speed =
1841 ixgbe_set_soft_rate_select_speed;
1842
1843 if ((hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) ||
1844 (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP))
1845 mac->ops.setup_mac_link =
1846 ixgbe_setup_mac_link_sfp_x550a;
1847 else
1848 mac->ops.setup_mac_link =
1849 ixgbe_setup_mac_link_sfp_x550em;
1850 break;
1851 case ixgbe_media_type_copper:
1852 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T)
1853 break;
1854 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1855 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
1856 hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L) {
1857 mac->ops.setup_link = ixgbe_setup_sgmii_fw;
1858 mac->ops.check_link =
1859 ixgbe_check_mac_link_generic;
1860 } else {
1861 mac->ops.setup_link =
1862 ixgbe_setup_mac_link_t_X550em;
1863 }
1864 } else {
1865 mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
1866 mac->ops.check_link = ixgbe_check_link_t_X550em;
1867 }
1868 break;
1869 case ixgbe_media_type_backplane:
1870 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
1871 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L)
1872 mac->ops.setup_link = ixgbe_setup_sgmii;
1873 break;
1874 default:
1875 break;
1876 }
1877 }
1878
1879 /**
1880 * ixgbe_get_link_capabilities_x550em - Determines link capabilities
1881 * @hw: pointer to hardware structure
1882 * @speed: pointer to link speed
1883 * @autoneg: true when autoneg or autotry is enabled
1884 */
1885 s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
1886 ixgbe_link_speed *speed,
1887 bool *autoneg)
1888 {
1889 DEBUGFUNC("ixgbe_get_link_capabilities_X550em");
1890
1891
1892 if (hw->phy.type == ixgbe_phy_fw) {
1893 *autoneg = true;
1894 *speed = hw->phy.speeds_supported;
1895 return 0;
1896 }
1897
1898 /* SFP */
1899 if (hw->phy.media_type == ixgbe_media_type_fiber) {
1900
1901 /* CS4227 SFP must not enable auto-negotiation */
1902 *autoneg = false;
1903
1904 /* Check if 1G SFP module. */
1905 if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1906 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1
1907 || hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1908 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) {
1909 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1910 return IXGBE_SUCCESS;
1911 }
1912
1913 /* Link capabilities are based on SFP */
1914 if (hw->phy.multispeed_fiber)
1915 *speed = IXGBE_LINK_SPEED_10GB_FULL |
1916 IXGBE_LINK_SPEED_1GB_FULL;
1917 else
1918 *speed = IXGBE_LINK_SPEED_10GB_FULL;
1919 } else {
1920 *autoneg = true;
1921
1922 switch (hw->phy.type) {
1923 case ixgbe_phy_x550em_xfi:
1924 *speed = IXGBE_LINK_SPEED_1GB_FULL |
1925 IXGBE_LINK_SPEED_10GB_FULL;
1926 *autoneg = false;
1927 break;
1928 case ixgbe_phy_ext_1g_t:
1929 case ixgbe_phy_sgmii:
1930 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1931 break;
1932 case ixgbe_phy_x550em_kr:
1933 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1934 /* check different backplane modes */
1935 if (hw->phy.nw_mng_if_sel &
1936 IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) {
1937 *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
1938 break;
1939 } else if (hw->device_id ==
1940 IXGBE_DEV_ID_X550EM_A_KR_L) {
1941 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1942 break;
1943 }
1944 }
1945 /* fall through */
1946 default:
1947 *speed = IXGBE_LINK_SPEED_10GB_FULL |
1948 IXGBE_LINK_SPEED_1GB_FULL;
1949 break;
1950 }
1951 }
1952
1953 return IXGBE_SUCCESS;
1954 }
1955
1956 /**
1957 * ixgbe_get_lasi_ext_t_x550em - Determime external Base T PHY interrupt cause
1958 * @hw: pointer to hardware structure
1959 * @lsc: pointer to boolean flag which indicates whether external Base T
1960 * PHY interrupt is lsc
1961 *
1962 * Determime if external Base T PHY interrupt cause is high temperature
1963 * failure alarm or link status change.
1964 *
1965 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
1966 * failure alarm, else return PHY access status.
1967 */
1968 static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
1969 {
1970 u32 status;
1971 u16 reg;
1972
1973 *lsc = false;
1974
1975 /* Vendor alarm triggered */
1976 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
1977 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1978 ®);
1979
1980 if (status != IXGBE_SUCCESS ||
1981 !(reg & IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN))
1982 return status;
1983
1984 /* Vendor Auto-Neg alarm triggered or Global alarm 1 triggered */
1985 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG,
1986 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1987 ®);
1988
1989 if (status != IXGBE_SUCCESS ||
1990 !(reg & (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
1991 IXGBE_MDIO_GLOBAL_ALARM_1_INT)))
1992 return status;
1993
1994 /* Global alarm triggered */
1995 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1,
1996 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1997 ®);
1998
1999 if (status != IXGBE_SUCCESS)
2000 return status;
2001
2002 /* If high temperature failure, then return over temp error and exit */
2003 if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
2004 /* power down the PHY in case the PHY FW didn't already */
2005 ixgbe_set_copper_phy_power(hw, false);
2006 return IXGBE_ERR_OVERTEMP;
2007 } else if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
2008 /* device fault alarm triggered */
2009 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_FAULT_MSG,
2010 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2011 ®);
2012
2013 if (status != IXGBE_SUCCESS)
2014 return status;
2015
2016 /* if device fault was due to high temp alarm handle and exit */
2017 if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
2018 /* power down the PHY in case the PHY FW didn't */
2019 ixgbe_set_copper_phy_power(hw, false);
2020 return IXGBE_ERR_OVERTEMP;
2021 }
2022 }
2023
2024 /* Vendor alarm 2 triggered */
2025 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
2026 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2027
2028 if (status != IXGBE_SUCCESS ||
2029 !(reg & IXGBE_MDIO_GLOBAL_STD_ALM2_INT))
2030 return status;
2031
2032 /* link connect/disconnect event occurred */
2033 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2,
2034 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2035
2036 if (status != IXGBE_SUCCESS)
2037 return status;
2038
2039 /* Indicate LSC */
2040 if (reg & IXGBE_MDIO_AUTO_NEG_VEN_LSC)
2041 *lsc = true;
2042
2043 return IXGBE_SUCCESS;
2044 }
2045
2046 /**
2047 * ixgbe_enable_lasi_ext_t_x550em - Enable external Base T PHY interrupts
2048 * @hw: pointer to hardware structure
2049 *
2050 * Enable link status change and temperature failure alarm for the external
2051 * Base T PHY
2052 *
2053 * Returns PHY access status
2054 */
2055 static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
2056 {
2057 u32 status;
2058 u16 reg;
2059 bool lsc;
2060
2061 /* Clear interrupt flags */
2062 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
2063
2064 /* Enable link status change alarm */
2065
2066 /* Enable the LASI interrupts on X552 devices to receive notifications
2067 * of the link configurations of the external PHY and correspondingly
2068 * support the configuration of the internal iXFI link, since iXFI does
2069 * not support auto-negotiation. This is not required for X553 devices
2070 * having KR support, which performs auto-negotiations and which is used
2071 * as the internal link to the external PHY. Hence adding a check here
2072 * to avoid enabling LASI interrupts for X553 devices.
2073 */
2074 if (hw->mac.type != ixgbe_mac_X550EM_a) {
2075 status = hw->phy.ops.read_reg(hw,
2076 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
2077 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2078
2079 if (status != IXGBE_SUCCESS)
2080 return status;
2081
2082 reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
2083
2084 status = hw->phy.ops.write_reg(hw,
2085 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
2086 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
2087
2088 if (status != IXGBE_SUCCESS)
2089 return status;
2090 }
2091
2092 /* Enable high temperature failure and global fault alarms */
2093 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
2094 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2095 ®);
2096
2097 if (status != IXGBE_SUCCESS)
2098 return status;
2099
2100 reg |= (IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN |
2101 IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN);
2102
2103 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
2104 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2105 reg);
2106
2107 if (status != IXGBE_SUCCESS)
2108 return status;
2109
2110 /* Enable vendor Auto-Neg alarm and Global Interrupt Mask 1 alarm */
2111 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
2112 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2113 ®);
2114
2115 if (status != IXGBE_SUCCESS)
2116 return status;
2117
2118 reg |= (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
2119 IXGBE_MDIO_GLOBAL_ALARM_1_INT);
2120
2121 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
2122 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2123 reg);
2124
2125 if (status != IXGBE_SUCCESS)
2126 return status;
2127
2128 /* Enable chip-wide vendor alarm */
2129 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
2130 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2131 ®);
2132
2133 if (status != IXGBE_SUCCESS)
2134 return status;
2135
2136 reg |= IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN;
2137
2138 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
2139 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2140 reg);
2141
2142 return status;
2143 }
2144
2145 /**
2146 * ixgbe_setup_kr_speed_x550em - Configure the KR PHY for link speed.
2147 * @hw: pointer to hardware structure
2148 * @speed: link speed
2149 *
2150 * Configures the integrated KR PHY.
2151 **/
2152 static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
2153 ixgbe_link_speed speed)
2154 {
2155 s32 status;
2156 u32 reg_val;
2157
2158 status = hw->mac.ops.read_iosf_sb_reg(hw,
2159 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2160 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2161 if (status)
2162 return status;
2163
2164 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
2165 reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
2166 IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
2167
2168 /* Advertise 10G support. */
2169 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
2170 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR;
2171
2172 /* Advertise 1G support. */
2173 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
2174 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
2175
2176 status = hw->mac.ops.write_iosf_sb_reg(hw,
2177 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2178 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2179
2180 if (hw->mac.type == ixgbe_mac_X550EM_a) {
2181 /* Set lane mode to KR auto negotiation */
2182 status = hw->mac.ops.read_iosf_sb_reg(hw,
2183 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2184 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2185
2186 if (status)
2187 return status;
2188
2189 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
2190 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
2191 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
2192 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
2193 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
2194
2195 status = hw->mac.ops.write_iosf_sb_reg(hw,
2196 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2197 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2198 }
2199
2200 return ixgbe_restart_an_internal_phy_x550em(hw);
2201 }
2202
2203 /**
2204 * ixgbe_reset_phy_fw - Reset firmware-controlled PHYs
2205 * @hw: pointer to hardware structure
2206 */
2207 static s32 ixgbe_reset_phy_fw(struct ixgbe_hw *hw)
2208 {
2209 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
2210 s32 rc;
2211
2212 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
2213 return IXGBE_SUCCESS;
2214
2215 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_PHY_SW_RESET, &store);
2216 if (rc)
2217 return rc;
2218 memset(store, 0, sizeof(store));
2219
2220 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_INIT_PHY, &store);
2221 if (rc)
2222 return rc;
2223
2224 return ixgbe_setup_fw_link(hw);
2225 }
2226
2227 /**
2228 * ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp
2229 * @hw: pointer to hardware structure
2230 */
2231 static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
2232 {
2233 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
2234 s32 rc;
2235
2236 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store);
2237 if (rc)
2238 return rc;
2239
2240 if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
2241 ixgbe_shutdown_fw_phy(hw);
2242 return IXGBE_ERR_OVERTEMP;
2243 }
2244 return IXGBE_SUCCESS;
2245 }
2246
2247 /**
2248 * ixgbe_read_mng_if_sel_x550em - Read NW_MNG_IF_SEL register
2249 * @hw: pointer to hardware structure
2250 *
2251 * Read NW_MNG_IF_SEL register and save field values, and check for valid field
2252 * values.
2253 **/
2254 static s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw)
2255 {
2256 /* Save NW management interface connected on board. This is used
2257 * to determine internal PHY mode.
2258 */
2259 hw->phy.nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
2260
2261 /* If X552 (X550EM_a) and MDIO is connected to external PHY, then set
2262 * PHY address. This register field was has only been used for X552.
2263 */
2264 if (hw->mac.type == ixgbe_mac_X550EM_a &&
2265 hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_MDIO_ACT) {
2266 hw->phy.addr = (hw->phy.nw_mng_if_sel &
2267 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
2268 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
2269 }
2270
2271 return IXGBE_SUCCESS;
2272 }
2273
2274 /**
2275 * ixgbe_init_phy_ops_X550em - PHY/SFP specific init
2276 * @hw: pointer to hardware structure
2277 *
2278 * Initialize any function pointers that were not able to be
2279 * set during init_shared_code because the PHY/SFP type was
2280 * not known. Perform the SFP init if necessary.
2281 */
2282 s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
2283 {
2284 struct ixgbe_phy_info *phy = &hw->phy;
2285 s32 ret_val;
2286
2287 DEBUGFUNC("ixgbe_init_phy_ops_X550em");
2288
2289 hw->mac.ops.set_lan_id(hw);
2290 ixgbe_read_mng_if_sel_x550em(hw);
2291
2292 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
2293 phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
2294 ixgbe_setup_mux_ctl(hw);
2295 phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
2296 }
2297
2298 switch (hw->device_id) {
2299 case IXGBE_DEV_ID_X550EM_A_1G_T:
2300 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
2301 phy->ops.read_reg_mdi = NULL;
2302 phy->ops.write_reg_mdi = NULL;
2303 hw->phy.ops.read_reg = NULL;
2304 hw->phy.ops.write_reg = NULL;
2305 phy->ops.check_overtemp = ixgbe_check_overtemp_fw;
2306 if (hw->bus.lan_id)
2307 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
2308 else
2309 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
2310
2311 break;
2312 case IXGBE_DEV_ID_X550EM_A_10G_T:
2313 case IXGBE_DEV_ID_X550EM_A_SFP:
2314 hw->phy.ops.read_reg = ixgbe_read_phy_reg_x550a;
2315 hw->phy.ops.write_reg = ixgbe_write_phy_reg_x550a;
2316 if (hw->bus.lan_id)
2317 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
2318 else
2319 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
2320 break;
2321 case IXGBE_DEV_ID_X550EM_X_SFP:
2322 /* set up for CS4227 usage */
2323 hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
2324 break;
2325 case IXGBE_DEV_ID_X550EM_X_1G_T:
2326 phy->ops.read_reg_mdi = NULL;
2327 phy->ops.write_reg_mdi = NULL;
2328 default:
2329 break;
2330 }
2331
2332 /* Identify the PHY or SFP module */
2333 ret_val = phy->ops.identify(hw);
2334 if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED ||
2335 ret_val == IXGBE_ERR_PHY_ADDR_INVALID)
2336 return ret_val;
2337
2338 /* Setup function pointers based on detected hardware */
2339 ixgbe_init_mac_link_ops_X550em(hw);
2340 if (phy->sfp_type != ixgbe_sfp_type_unknown)
2341 phy->ops.reset = NULL;
2342
2343 /* Set functions pointers based on phy type */
2344 switch (hw->phy.type) {
2345 case ixgbe_phy_x550em_kx4:
2346 phy->ops.setup_link = NULL;
2347 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2348 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2349 break;
2350 case ixgbe_phy_x550em_kr:
2351 phy->ops.setup_link = ixgbe_setup_kr_x550em;
2352 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2353 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2354 break;
2355 case ixgbe_phy_ext_1g_t:
2356 /* link is managed by FW */
2357 phy->ops.setup_link = NULL;
2358 phy->ops.reset = NULL;
2359 break;
2360 case ixgbe_phy_x550em_xfi:
2361 /* link is managed by HW */
2362 phy->ops.setup_link = NULL;
2363 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2364 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2365 break;
2366 case ixgbe_phy_x550em_ext_t:
2367 /* If internal link mode is XFI, then setup iXFI internal link,
2368 * else setup KR now.
2369 */
2370 phy->ops.setup_internal_link =
2371 ixgbe_setup_internal_phy_t_x550em;
2372
2373 /* setup SW LPLU only for first revision of X550EM_x */
2374 if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
2375 !(IXGBE_FUSES0_REV_MASK &
2376 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
2377 phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em;
2378
2379 phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em;
2380 phy->ops.reset = ixgbe_reset_phy_t_X550em;
2381 break;
2382 case ixgbe_phy_sgmii:
2383 phy->ops.setup_link = NULL;
2384 break;
2385 case ixgbe_phy_fw:
2386 phy->ops.setup_link = ixgbe_setup_fw_link;
2387 phy->ops.reset = ixgbe_reset_phy_fw;
2388 break;
2389 default:
2390 break;
2391 }
2392 return ret_val;
2393 }
2394
2395 /**
2396 * ixgbe_set_mdio_speed - Set MDIO clock speed
2397 * @hw: pointer to hardware structure
2398 */
2399 static void ixgbe_set_mdio_speed(struct ixgbe_hw *hw)
2400 {
2401 u32 hlreg0;
2402
2403 switch (hw->device_id) {
2404 case IXGBE_DEV_ID_X550EM_X_10G_T:
2405 case IXGBE_DEV_ID_X550EM_A_SGMII:
2406 case IXGBE_DEV_ID_X550EM_A_SGMII_L:
2407 case IXGBE_DEV_ID_X550EM_A_10G_T:
2408 case IXGBE_DEV_ID_X550EM_A_SFP:
2409 case IXGBE_DEV_ID_X550EM_A_QSFP:
2410 /* Config MDIO clock speed before the first MDIO PHY access */
2411 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2412 hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
2413 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
2414 break;
2415 case IXGBE_DEV_ID_X550EM_A_1G_T:
2416 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
2417 /* Select fast MDIO clock speed for these devices */
2418 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2419 hlreg0 |= IXGBE_HLREG0_MDCSPD;
2420 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
2421 break;
2422 default:
2423 break;
2424 }
2425 }
2426
2427 /**
2428 * ixgbe_reset_hw_X550em - Perform hardware reset
2429 * @hw: pointer to hardware structure
2430 *
2431 * Resets the hardware by resetting the transmit and receive units, masks
2432 * and clears all interrupts, perform a PHY reset, and perform a link (MAC)
2433 * reset.
2434 */
2435 s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
2436 {
2437 ixgbe_link_speed link_speed;
2438 s32 status;
2439 u32 ctrl = 0;
2440 u32 i;
2441 bool link_up = false;
2442 u32 swfw_mask = hw->phy.phy_semaphore_mask;
2443
2444 DEBUGFUNC("ixgbe_reset_hw_X550em");
2445
2446 /* Call adapter stop to disable Tx/Rx and clear interrupts */
2447 status = hw->mac.ops.stop_adapter(hw);
2448 if (status != IXGBE_SUCCESS) {
2449 DEBUGOUT1("Failed to stop adapter, STATUS = %d\n", status);
2450 return status;
2451 }
2452 /* flush pending Tx transactions */
2453 ixgbe_clear_tx_pending(hw);
2454
2455 ixgbe_set_mdio_speed(hw);
2456
2457 /* PHY ops must be identified and initialized prior to reset */
2458 status = hw->phy.ops.init(hw);
2459
2460 if (status)
2461 DEBUGOUT1("Failed to initialize PHY ops, STATUS = %d\n",
2462 status);
2463
2464 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED ||
2465 status == IXGBE_ERR_PHY_ADDR_INVALID) {
2466 DEBUGOUT("Returning from reset HW due to PHY init failure\n");
2467 return status;
2468 }
2469
2470 /* start the external PHY */
2471 if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
2472 status = ixgbe_init_ext_t_x550em(hw);
2473 if (status) {
2474 DEBUGOUT1("Failed to start the external PHY, STATUS = %d\n",
2475 status);
2476 return status;
2477 }
2478 }
2479
2480 /* Setup SFP module if there is one present. */
2481 if (hw->phy.sfp_setup_needed) {
2482 status = hw->mac.ops.setup_sfp(hw);
2483 hw->phy.sfp_setup_needed = false;
2484 }
2485
2486 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
2487 return status;
2488
2489 /* Reset PHY */
2490 if (!hw->phy.reset_disable && hw->phy.ops.reset) {
2491 if (hw->phy.ops.reset(hw) == IXGBE_ERR_OVERTEMP)
2492 return IXGBE_ERR_OVERTEMP;
2493 }
2494
2495 mac_reset_top:
2496 /* Issue global reset to the MAC. Needs to be SW reset if link is up.
2497 * If link reset is used when link is up, it might reset the PHY when
2498 * mng is using it. If link is down or the flag to force full link
2499 * reset is set, then perform link reset.
2500 */
2501 ctrl = IXGBE_CTRL_LNK_RST;
2502 if (!hw->force_full_reset) {
2503 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
2504 if (link_up)
2505 ctrl = IXGBE_CTRL_RST;
2506 }
2507
2508 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
2509 if (status != IXGBE_SUCCESS) {
2510 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
2511 "semaphore failed with %d", status);
2512 return IXGBE_ERR_SWFW_SYNC;
2513 }
2514 ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
2515 IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
2516 IXGBE_WRITE_FLUSH(hw);
2517 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2518
2519 /* Poll for reset bit to self-clear meaning reset is complete */
2520 for (i = 0; i < 10; i++) {
2521 usec_delay(1);
2522 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
2523 if (!(ctrl & IXGBE_CTRL_RST_MASK))
2524 break;
2525 }
2526
2527 if (ctrl & IXGBE_CTRL_RST_MASK) {
2528 status = IXGBE_ERR_RESET_FAILED;
2529 DEBUGOUT("Reset polling failed to complete.\n");
2530 }
2531
2532 msec_delay(50);
2533
2534 /* Double resets are required for recovery from certain error
2535 * conditions. Between resets, it is necessary to stall to
2536 * allow time for any pending HW events to complete.
2537 */
2538 if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
2539 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
2540 goto mac_reset_top;
2541 }
2542
2543 /* Store the permanent mac address */
2544 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
2545
2546 /* Store MAC address from RAR0, clear receive address registers, and
2547 * clear the multicast table. Also reset num_rar_entries to 128,
2548 * since we modify this value when programming the SAN MAC address.
2549 */
2550 hw->mac.num_rar_entries = 128;
2551 hw->mac.ops.init_rx_addrs(hw);
2552
2553 ixgbe_set_mdio_speed(hw);
2554
2555 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
2556 ixgbe_setup_mux_ctl(hw);
2557
2558 if (status != IXGBE_SUCCESS)
2559 DEBUGOUT1("Reset HW failed, STATUS = %d\n", status);
2560
2561 return status;
2562 }
2563
2564 /**
2565 * ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY.
2566 * @hw: pointer to hardware structure
2567 */
2568 s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
2569 {
2570 u32 status;
2571 u16 reg;
2572
2573 status = hw->phy.ops.read_reg(hw,
2574 IXGBE_MDIO_TX_VENDOR_ALARMS_3,
2575 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
2576 ®);
2577
2578 if (status != IXGBE_SUCCESS)
2579 return status;
2580
2581 /* If PHY FW reset completed bit is set then this is the first
2582 * SW instance after a power on so the PHY FW must be un-stalled.
2583 */
2584 if (reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
2585 status = hw->phy.ops.read_reg(hw,
2586 IXGBE_MDIO_GLOBAL_RES_PR_10,
2587 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2588 ®);
2589
2590 if (status != IXGBE_SUCCESS)
2591 return status;
2592
2593 reg &= ~IXGBE_MDIO_POWER_UP_STALL;
2594
2595 status = hw->phy.ops.write_reg(hw,
2596 IXGBE_MDIO_GLOBAL_RES_PR_10,
2597 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2598 reg);
2599
2600 if (status != IXGBE_SUCCESS)
2601 return status;
2602 }
2603
2604 return status;
2605 }
2606
2607 /**
2608 * ixgbe_setup_kr_x550em - Configure the KR PHY.
2609 * @hw: pointer to hardware structure
2610 **/
2611 s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
2612 {
2613 /* leave link alone for 2.5G */
2614 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL)
2615 return IXGBE_SUCCESS;
2616
2617 if (ixgbe_check_reset_blocked(hw))
2618 return 0;
2619
2620 return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
2621 }
2622
2623 /**
2624 * ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP
2625 * @hw: pointer to hardware structure
2626 * @speed: new link speed
2627 * @autoneg_wait_to_complete: unused
2628 *
2629 * Configure the external PHY and the integrated KR PHY for SFP support.
2630 **/
2631 s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
2632 ixgbe_link_speed speed,
2633 bool autoneg_wait_to_complete)
2634 {
2635 s32 ret_val;
2636 u16 reg_slice, reg_val;
2637 bool setup_linear = false;
2638 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
2639
2640 /* Check if SFP module is supported and linear */
2641 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
2642
2643 /* If no SFP module present, then return success. Return success since
2644 * there is no reason to configure CS4227 and SFP not present error is
2645 * not excepted in the setup MAC link flow.
2646 */
2647 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
2648 return IXGBE_SUCCESS;
2649
2650 if (ret_val != IXGBE_SUCCESS)
2651 return ret_val;
2652
2653 /* Configure internal PHY for KR/KX. */
2654 ixgbe_setup_kr_speed_x550em(hw, speed);
2655
2656 /* Configure CS4227 LINE side to proper mode. */
2657 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
2658 (hw->bus.lan_id << 12);
2659 if (setup_linear)
2660 reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
2661 else
2662 reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2663 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2664 reg_val);
2665 return ret_val;
2666 }
2667
2668 /**
2669 * ixgbe_setup_sfi_x550a - Configure the internal PHY for native SFI mode
2670 * @hw: pointer to hardware structure
2671 * @speed: the link speed to force
2672 *
2673 * Configures the integrated PHY for native SFI mode. Used to connect the
2674 * internal PHY directly to an SFP cage, without autonegotiation.
2675 **/
2676 static s32 ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
2677 {
2678 struct ixgbe_mac_info *mac = &hw->mac;
2679 s32 status;
2680 u32 reg_val;
2681
2682 /* Disable all AN and force speed to 10G Serial. */
2683 status = mac->ops.read_iosf_sb_reg(hw,
2684 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2685 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2686 if (status != IXGBE_SUCCESS)
2687 return status;
2688
2689 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
2690 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
2691 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
2692 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
2693
2694 /* Select forced link speed for internal PHY. */
2695 switch (*speed) {
2696 case IXGBE_LINK_SPEED_10GB_FULL:
2697 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10G;
2698 break;
2699 case IXGBE_LINK_SPEED_1GB_FULL:
2700 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
2701 break;
2702 default:
2703 /* Other link speeds are not supported by internal PHY. */
2704 return IXGBE_ERR_LINK_SETUP;
2705 }
2706
2707 status = mac->ops.write_iosf_sb_reg(hw,
2708 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2709 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2710
2711 /* Toggle port SW reset by AN reset. */
2712 status = ixgbe_restart_an_internal_phy_x550em(hw);
2713
2714 return status;
2715 }
2716
2717 /**
2718 * ixgbe_setup_mac_link_sfp_x550a - Setup internal PHY for SFP
2719 * @hw: pointer to hardware structure
2720 * @speed: new link speed
2721 * @autoneg_wait_to_complete: unused
2722 *
2723 * Configure the integrated PHY for SFP support.
2724 **/
2725 s32 ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
2726 ixgbe_link_speed speed,
2727 bool autoneg_wait_to_complete)
2728 {
2729 s32 ret_val;
2730 u16 reg_phy_ext;
2731 bool setup_linear = false;
2732 u32 reg_slice, reg_phy_int, slice_offset;
2733
2734 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
2735
2736 /* Check if SFP module is supported and linear */
2737 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
2738
2739 /* If no SFP module present, then return success. Return success since
2740 * SFP not present error is not excepted in the setup MAC link flow.
2741 */
2742 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
2743 return IXGBE_SUCCESS;
2744
2745 if (ret_val != IXGBE_SUCCESS)
2746 return ret_val;
2747
2748 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) {
2749 /* Configure internal PHY for native SFI based on module type */
2750 ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
2751 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2752 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_phy_int);
2753
2754 if (ret_val != IXGBE_SUCCESS)
2755 return ret_val;
2756
2757 reg_phy_int &= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA;
2758 if (!setup_linear)
2759 reg_phy_int |= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR;
2760
2761 ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
2762 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2763 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_phy_int);
2764
2765 if (ret_val != IXGBE_SUCCESS)
2766 return ret_val;
2767
2768 /* Setup SFI internal link. */
2769 ret_val = ixgbe_setup_sfi_x550a(hw, &speed);
2770 } else {
2771 /* Configure internal PHY for KR/KX. */
2772 ixgbe_setup_kr_speed_x550em(hw, speed);
2773
2774 if (hw->phy.addr == 0x0 || hw->phy.addr == 0xFFFF) {
2775 /* Find Address */
2776 DEBUGOUT("Invalid NW_MNG_IF_SEL.MDIO_PHY_ADD value\n");
2777 return IXGBE_ERR_PHY_ADDR_INVALID;
2778 }
2779
2780 /* Get external PHY SKU id */
2781 ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU,
2782 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2783
2784 if (ret_val != IXGBE_SUCCESS)
2785 return ret_val;
2786
2787 /* When configuring quad port CS4223, the MAC instance is part
2788 * of the slice offset.
2789 */
2790 if (reg_phy_ext == IXGBE_CS4223_SKU_ID)
2791 slice_offset = (hw->bus.lan_id +
2792 (hw->bus.instance_id << 1)) << 12;
2793 else
2794 slice_offset = hw->bus.lan_id << 12;
2795
2796 /* Configure CS4227/CS4223 LINE side to proper mode. */
2797 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + slice_offset;
2798
2799 ret_val = hw->phy.ops.read_reg(hw, reg_slice,
2800 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2801
2802 if (ret_val != IXGBE_SUCCESS)
2803 return ret_val;
2804
2805 reg_phy_ext &= ~((IXGBE_CS4227_EDC_MODE_CX1 << 1) |
2806 (IXGBE_CS4227_EDC_MODE_SR << 1));
2807
2808 if (setup_linear)
2809 reg_phy_ext |= (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
2810 else
2811 reg_phy_ext |= (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2812 ret_val = hw->phy.ops.write_reg(hw, reg_slice,
2813 IXGBE_MDIO_ZERO_DEV_TYPE, reg_phy_ext);
2814
2815 /* Flush previous write with a read */
2816 ret_val = hw->phy.ops.read_reg(hw, reg_slice,
2817 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2818 }
2819 return ret_val;
2820 }
2821
2822 /**
2823 * ixgbe_setup_ixfi_x550em_x - MAC specific iXFI configuration
2824 * @hw: pointer to hardware structure
2825 *
2826 * iXfI configuration needed for ixgbe_mac_X550EM_x devices.
2827 **/
2828 static s32 ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
2829 {
2830 struct ixgbe_mac_info *mac = &hw->mac;
2831 s32 status;
2832 u32 reg_val;
2833
2834 /* Disable training protocol FSM. */
2835 status = mac->ops.read_iosf_sb_reg(hw,
2836 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
2837 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2838 if (status != IXGBE_SUCCESS)
2839 return status;
2840 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
2841 status = mac->ops.write_iosf_sb_reg(hw,
2842 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
2843 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2844 if (status != IXGBE_SUCCESS)
2845 return status;
2846
2847 /* Disable Flex from training TXFFE. */
2848 status = mac->ops.read_iosf_sb_reg(hw,
2849 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
2850 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2851 if (status != IXGBE_SUCCESS)
2852 return status;
2853 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
2854 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
2855 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
2856 status = mac->ops.write_iosf_sb_reg(hw,
2857 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
2858 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2859 if (status != IXGBE_SUCCESS)
2860 return status;
2861 status = mac->ops.read_iosf_sb_reg(hw,
2862 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
2863 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2864 if (status != IXGBE_SUCCESS)
2865 return status;
2866 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
2867 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
2868 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
2869 status = mac->ops.write_iosf_sb_reg(hw,
2870 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
2871 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2872 if (status != IXGBE_SUCCESS)
2873 return status;
2874
2875 /* Enable override for coefficients. */
2876 status = mac->ops.read_iosf_sb_reg(hw,
2877 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
2878 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2879 if (status != IXGBE_SUCCESS)
2880 return status;
2881 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN;
2882 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
2883 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
2884 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
2885 status = mac->ops.write_iosf_sb_reg(hw,
2886 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
2887 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2888 return status;
2889 }
2890
2891 /**
2892 * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
2893 * @hw: pointer to hardware structure
2894 * @speed: the link speed to force
2895 *
2896 * Configures the integrated KR PHY to use iXFI mode. Used to connect an
2897 * internal and external PHY at a specific speed, without autonegotiation.
2898 **/
2899 static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
2900 {
2901 struct ixgbe_mac_info *mac = &hw->mac;
2902 s32 status;
2903 u32 reg_val;
2904
2905 /* iXFI is only supported with X552 */
2906 if (mac->type != ixgbe_mac_X550EM_x)
2907 return IXGBE_ERR_LINK_SETUP;
2908
2909 /* Disable AN and force speed to 10G Serial. */
2910 status = mac->ops.read_iosf_sb_reg(hw,
2911 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2912 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2913 if (status != IXGBE_SUCCESS)
2914 return status;
2915
2916 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
2917 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
2918
2919 /* Select forced link speed for internal PHY. */
2920 switch (*speed) {
2921 case IXGBE_LINK_SPEED_10GB_FULL:
2922 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
2923 break;
2924 case IXGBE_LINK_SPEED_1GB_FULL:
2925 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
2926 break;
2927 default:
2928 /* Other link speeds are not supported by internal KR PHY. */
2929 return IXGBE_ERR_LINK_SETUP;
2930 }
2931
2932 status = mac->ops.write_iosf_sb_reg(hw,
2933 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2934 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2935 if (status != IXGBE_SUCCESS)
2936 return status;
2937
2938 /* Additional configuration needed for x550em_x */
2939 if (hw->mac.type == ixgbe_mac_X550EM_x) {
2940 status = ixgbe_setup_ixfi_x550em_x(hw);
2941 if (status != IXGBE_SUCCESS)
2942 return status;
2943 }
2944
2945 /* Toggle port SW reset by AN reset. */
2946 status = ixgbe_restart_an_internal_phy_x550em(hw);
2947
2948 return status;
2949 }
2950
2951 /**
2952 * ixgbe_ext_phy_t_x550em_get_link - Get ext phy link status
2953 * @hw: address of hardware structure
2954 * @link_up: address of boolean to indicate link status
2955 *
2956 * Returns error code if unable to get link status.
2957 */
2958 static s32 ixgbe_ext_phy_t_x550em_get_link(struct ixgbe_hw *hw, bool *link_up)
2959 {
2960 u32 ret;
2961 u16 autoneg_status;
2962
2963 *link_up = false;
2964
2965 /* read this twice back to back to indicate current status */
2966 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
2967 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
2968 &autoneg_status);
2969 if (ret != IXGBE_SUCCESS)
2970 return ret;
2971
2972 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
2973 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
2974 &autoneg_status);
2975 if (ret != IXGBE_SUCCESS)
2976 return ret;
2977
2978 *link_up = !!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS);
2979
2980 return IXGBE_SUCCESS;
2981 }
2982
2983 /**
2984 * ixgbe_setup_internal_phy_t_x550em - Configure KR PHY to X557 link
2985 * @hw: point to hardware structure
2986 *
2987 * Configures the link between the integrated KR PHY and the external X557 PHY
2988 * The driver will call this function when it gets a link status change
2989 * interrupt from the X557 PHY. This function configures the link speed
2990 * between the PHYs to match the link speed of the BASE-T link.
2991 *
2992 * A return of a non-zero value indicates an error, and the base driver should
2993 * not report link up.
2994 */
2995 s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
2996 {
2997 ixgbe_link_speed force_speed;
2998 bool link_up;
2999 u32 status;
3000 u16 speed;
3001
3002 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
3003 return IXGBE_ERR_CONFIG;
3004
3005 if (hw->mac.type == ixgbe_mac_X550EM_x &&
3006 !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
3007 /* If link is down, there is no setup necessary so return */
3008 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3009 if (status != IXGBE_SUCCESS)
3010 return status;
3011
3012 if (!link_up)
3013 return IXGBE_SUCCESS;
3014
3015 status = hw->phy.ops.read_reg(hw,
3016 IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
3017 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3018 &speed);
3019 if (status != IXGBE_SUCCESS)
3020 return status;
3021
3022 /* If link is still down - no setup is required so return */
3023 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3024 if (status != IXGBE_SUCCESS)
3025 return status;
3026 if (!link_up)
3027 return IXGBE_SUCCESS;
3028
3029 /* clear everything but the speed and duplex bits */
3030 speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
3031
3032 switch (speed) {
3033 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
3034 force_speed = IXGBE_LINK_SPEED_10GB_FULL;
3035 break;
3036 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
3037 force_speed = IXGBE_LINK_SPEED_1GB_FULL;
3038 break;
3039 default:
3040 /* Internal PHY does not support anything else */
3041 return IXGBE_ERR_INVALID_LINK_SETTINGS;
3042 }
3043
3044 return ixgbe_setup_ixfi_x550em(hw, &force_speed);
3045 } else {
3046 speed = IXGBE_LINK_SPEED_10GB_FULL |
3047 IXGBE_LINK_SPEED_1GB_FULL;
3048 return ixgbe_setup_kr_speed_x550em(hw, speed);
3049 }
3050 }
3051
3052 /**
3053 * ixgbe_setup_phy_loopback_x550em - Configure the KR PHY for loopback.
3054 * @hw: pointer to hardware structure
3055 *
3056 * Configures the integrated KR PHY to use internal loopback mode.
3057 **/
3058 s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
3059 {
3060 s32 status;
3061 u32 reg_val;
3062
3063 /* Disable AN and force speed to 10G Serial. */
3064 status = hw->mac.ops.read_iosf_sb_reg(hw,
3065 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
3066 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3067 if (status != IXGBE_SUCCESS)
3068 return status;
3069 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
3070 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
3071 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
3072 status = hw->mac.ops.write_iosf_sb_reg(hw,
3073 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
3074 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3075 if (status != IXGBE_SUCCESS)
3076 return status;
3077
3078 /* Set near-end loopback clocks. */
3079 status = hw->mac.ops.read_iosf_sb_reg(hw,
3080 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
3081 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3082 if (status != IXGBE_SUCCESS)
3083 return status;
3084 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B;
3085 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS;
3086 status = hw->mac.ops.write_iosf_sb_reg(hw,
3087 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
3088 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3089 if (status != IXGBE_SUCCESS)
3090 return status;
3091
3092 /* Set loopback enable. */
3093 status = hw->mac.ops.read_iosf_sb_reg(hw,
3094 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
3095 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3096 if (status != IXGBE_SUCCESS)
3097 return status;
3098 reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK;
3099 status = hw->mac.ops.write_iosf_sb_reg(hw,
3100 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
3101 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3102 if (status != IXGBE_SUCCESS)
3103 return status;
3104
3105 /* Training bypass. */
3106 status = hw->mac.ops.read_iosf_sb_reg(hw,
3107 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
3108 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3109 if (status != IXGBE_SUCCESS)
3110 return status;
3111 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS;
3112 status = hw->mac.ops.write_iosf_sb_reg(hw,
3113 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
3114 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3115
3116 return status;
3117 }
3118
3119 /**
3120 * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
3121 * assuming that the semaphore is already obtained.
3122 * @hw: pointer to hardware structure
3123 * @offset: offset of word in the EEPROM to read
3124 * @data: word read from the EEPROM
3125 *
3126 * Reads a 16 bit word from the EEPROM using the hostif.
3127 **/
3128 s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data)
3129 {
3130 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
3131 struct ixgbe_hic_read_shadow_ram buffer;
3132 s32 status;
3133
3134 DEBUGFUNC("ixgbe_read_ee_hostif_X550");
3135 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
3136 buffer.hdr.req.buf_lenh = 0;
3137 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
3138 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3139
3140 /* convert offset from words to bytes */
3141 buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
3142 /* one word */
3143 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
3144 buffer.pad2 = 0;
3145 buffer.data = 0;
3146 buffer.pad3 = 0;
3147
3148 status = hw->mac.ops.acquire_swfw_sync(hw, mask);
3149 if (status)
3150 return status;
3151
3152 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer),
3153 IXGBE_HI_COMMAND_TIMEOUT);
3154 if (!status) {
3155 *data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
3156 FW_NVM_DATA_OFFSET);
3157 }
3158
3159 hw->mac.ops.release_swfw_sync(hw, mask);
3160 return status;
3161 }
3162
3163 /**
3164 * ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif
3165 * @hw: pointer to hardware structure
3166 * @offset: offset of word in the EEPROM to read
3167 * @words: number of words
3168 * @data: word(s) read from the EEPROM
3169 *
3170 * Reads a 16 bit word(s) from the EEPROM using the hostif.
3171 **/
3172 s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
3173 u16 offset, u16 words, u16 *data)
3174 {
3175 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
3176 struct ixgbe_hic_read_shadow_ram buffer;
3177 u32 current_word = 0;
3178 u16 words_to_read;
3179 s32 status;
3180 u32 i;
3181
3182 DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550");
3183
3184 /* Take semaphore for the entire operation. */
3185 status = hw->mac.ops.acquire_swfw_sync(hw, mask);
3186 if (status) {
3187 DEBUGOUT("EEPROM read buffer - semaphore failed\n");
3188 return status;
3189 }
3190
3191 while (words) {
3192 if (words > FW_MAX_READ_BUFFER_SIZE / 2)
3193 words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
3194 else
3195 words_to_read = words;
3196
3197 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
3198 buffer.hdr.req.buf_lenh = 0;
3199 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
3200 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3201
3202 /* convert offset from words to bytes */
3203 buffer.address = IXGBE_CPU_TO_BE32((offset + current_word) * 2);
3204 buffer.length = IXGBE_CPU_TO_BE16(words_to_read * 2);
3205 buffer.pad2 = 0;
3206 buffer.data = 0;
3207 buffer.pad3 = 0;
3208
3209 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer),
3210 IXGBE_HI_COMMAND_TIMEOUT);
3211
3212 if (status) {
3213 DEBUGOUT("Host interface command failed\n");
3214 goto out;
3215 }
3216
3217 for (i = 0; i < words_to_read; i++) {
3218 u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) +
3219 2 * i;
3220 u32 value = IXGBE_READ_REG(hw, reg);
3221
3222 data[current_word] = (u16)(value & 0xffff);
3223 current_word++;
3224 i++;
3225 if (i < words_to_read) {
3226 value >>= 16;
3227 data[current_word] = (u16)(value & 0xffff);
3228 current_word++;
3229 }
3230 }
3231 words -= words_to_read;
3232 }
3233
3234 out:
3235 hw->mac.ops.release_swfw_sync(hw, mask);
3236 return status;
3237 }
3238
3239 /**
3240 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
3241 * @hw: pointer to hardware structure
3242 * @offset: offset of word in the EEPROM to write
3243 * @data: word write to the EEPROM
3244 *
3245 * Write a 16 bit word to the EEPROM using the hostif.
3246 **/
3247 s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
3248 u16 data)
3249 {
3250 s32 status;
3251 struct ixgbe_hic_write_shadow_ram buffer;
3252
3253 DEBUGFUNC("ixgbe_write_ee_hostif_data_X550");
3254
3255 buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD;
3256 buffer.hdr.req.buf_lenh = 0;
3257 buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN;
3258 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3259
3260 /* one word */
3261 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
3262 buffer.data = data;
3263 buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
3264
3265 status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
3266 sizeof(buffer),
3267 IXGBE_HI_COMMAND_TIMEOUT, true);
3268 if (status != IXGBE_SUCCESS) {
3269 DEBUGOUT2("for offset %04x failed with status %d\n",
3270 offset, status);
3271 return status;
3272 }
3273
3274 if (buffer.hdr.rsp.buf_lenh_status != FW_CEM_RESP_STATUS_SUCCESS) {
3275 DEBUGOUT2("for offset %04x host interface return status %02x\n",
3276 offset, buffer.hdr.rsp.buf_lenh_status);
3277 return IXGBE_ERR_HOST_INTERFACE_COMMAND;
3278 }
3279
3280 return status;
3281 }
3282
3283 /**
3284 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
3285 * @hw: pointer to hardware structure
3286 * @offset: offset of word in the EEPROM to write
3287 * @data: word write to the EEPROM
3288 *
3289 * Write a 16 bit word to the EEPROM using the hostif.
3290 **/
3291 s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
3292 u16 data)
3293 {
3294 s32 status = IXGBE_SUCCESS;
3295
3296 DEBUGFUNC("ixgbe_write_ee_hostif_X550");
3297
3298 if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
3299 IXGBE_SUCCESS) {
3300 status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
3301 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3302 } else {
3303 DEBUGOUT("write ee hostif failed to get semaphore");
3304 status = IXGBE_ERR_SWFW_SYNC;
3305 }
3306
3307 return status;
3308 }
3309
3310 /**
3311 * ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif
3312 * @hw: pointer to hardware structure
3313 * @offset: offset of word in the EEPROM to write
3314 * @words: number of words
3315 * @data: word(s) write to the EEPROM
3316 *
3317 * Write a 16 bit word(s) to the EEPROM using the hostif.
3318 **/
3319 s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
3320 u16 offset, u16 words, u16 *data)
3321 {
3322 s32 status = IXGBE_SUCCESS;
3323 u32 i = 0;
3324
3325 DEBUGFUNC("ixgbe_write_ee_hostif_buffer_X550");
3326
3327 /* Take semaphore for the entire operation. */
3328 status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3329 if (status != IXGBE_SUCCESS) {
3330 DEBUGOUT("EEPROM write buffer - semaphore failed\n");
3331 goto out;
3332 }
3333
3334 for (i = 0; i < words; i++) {
3335 status = ixgbe_write_ee_hostif_data_X550(hw, offset + i,
3336 data[i]);
3337
3338 if (status != IXGBE_SUCCESS) {
3339 DEBUGOUT("Eeprom buffered write failed\n");
3340 break;
3341 }
3342 }
3343
3344 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3345 out:
3346
3347 return status;
3348 }
3349
3350 /**
3351 * ixgbe_checksum_ptr_x550 - Checksum one pointer region
3352 * @hw: pointer to hardware structure
3353 * @ptr: pointer offset in eeprom
3354 * @size: size of section pointed by ptr, if 0 first word will be used as size
3355 * @csum: address of checksum to update
3356 * @buffer: pointer to buffer containing calculated checksum
3357 * @buffer_size: size of buffer
3358 *
3359 * Returns error status for any failure
3360 */
3361 static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
3362 u16 size, u16 *csum, u16 *buffer,
3363 u32 buffer_size)
3364 {
3365 u16 buf[256];
3366 s32 status;
3367 u16 length, bufsz, i, start;
3368 u16 *local_buffer;
3369
3370 bufsz = sizeof(buf) / sizeof(buf[0]);
3371
3372 /* Read a chunk at the pointer location */
3373 if (!buffer) {
3374 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf);
3375 if (status) {
3376 DEBUGOUT("Failed to read EEPROM image\n");
3377 return status;
3378 }
3379 local_buffer = buf;
3380 } else {
3381 if (buffer_size < ptr)
3382 return IXGBE_ERR_PARAM;
3383 local_buffer = &buffer[ptr];
3384 }
3385
3386 if (size) {
3387 start = 0;
3388 length = size;
3389 } else {
3390 start = 1;
3391 length = local_buffer[0];
3392
3393 /* Skip pointer section if length is invalid. */
3394 if (length == 0xFFFF || length == 0 ||
3395 (ptr + length) >= hw->eeprom.word_size)
3396 return IXGBE_SUCCESS;
3397 }
3398
3399 if (buffer && ((u32)start + (u32)length > buffer_size))
3400 return IXGBE_ERR_PARAM;
3401
3402 for (i = start; length; i++, length--) {
3403 if (i == bufsz && !buffer) {
3404 ptr += bufsz;
3405 i = 0;
3406 if (length < bufsz)
3407 bufsz = length;
3408
3409 /* Read a chunk at the pointer location */
3410 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr,
3411 bufsz, buf);
3412 if (status) {
3413 DEBUGOUT("Failed to read EEPROM image\n");
3414 return status;
3415 }
3416 }
3417 *csum += local_buffer[i];
3418 }
3419 return IXGBE_SUCCESS;
3420 }
3421
3422 /**
3423 * ixgbe_calc_checksum_X550 - Calculates and returns the checksum
3424 * @hw: pointer to hardware structure
3425 * @buffer: pointer to buffer containing calculated checksum
3426 * @buffer_size: size of buffer
3427 *
3428 * Returns a negative error code on error, or the 16-bit checksum
3429 **/
3430 s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size)
3431 {
3432 u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1];
3433 u16 *local_buffer;
3434 s32 status;
3435 u16 checksum = 0;
3436 u16 pointer, i, size;
3437
3438 DEBUGFUNC("ixgbe_calc_eeprom_checksum_X550");
3439
3440 hw->eeprom.ops.init_params(hw);
3441
3442 if (!buffer) {
3443 /* Read pointer area */
3444 status = ixgbe_read_ee_hostif_buffer_X550(hw, 0,
3445 IXGBE_EEPROM_LAST_WORD + 1,
3446 eeprom_ptrs);
3447 if (status) {
3448 DEBUGOUT("Failed to read EEPROM image\n");
3449 return status;
3450 }
3451 local_buffer = eeprom_ptrs;
3452 } else {
3453 if (buffer_size < IXGBE_EEPROM_LAST_WORD)
3454 return IXGBE_ERR_PARAM;
3455 local_buffer = buffer;
3456 }
3457
3458 /*
3459 * For X550 hardware include 0x0-0x41 in the checksum, skip the
3460 * checksum word itself
3461 */
3462 for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++)
3463 if (i != IXGBE_EEPROM_CHECKSUM)
3464 checksum += local_buffer[i];
3465
3466 /*
3467 * Include all data from pointers 0x3, 0x6-0xE. This excludes the
3468 * FW, PHY module, and PCIe Expansion/Option ROM pointers.
3469 */
3470 for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) {
3471 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
3472 continue;
3473
3474 pointer = local_buffer[i];
3475
3476 /* Skip pointer section if the pointer is invalid. */
3477 if (pointer == 0xFFFF || pointer == 0 ||
3478 pointer >= hw->eeprom.word_size)
3479 continue;
3480
3481 switch (i) {
3482 case IXGBE_PCIE_GENERAL_PTR:
3483 size = IXGBE_IXGBE_PCIE_GENERAL_SIZE;
3484 break;
3485 case IXGBE_PCIE_CONFIG0_PTR:
3486 case IXGBE_PCIE_CONFIG1_PTR:
3487 size = IXGBE_PCIE_CONFIG_SIZE;
3488 break;
3489 default:
3490 size = 0;
3491 break;
3492 }
3493
3494 status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum,
3495 buffer, buffer_size);
3496 if (status)
3497 return status;
3498 }
3499
3500 checksum = (u16)IXGBE_EEPROM_SUM - checksum;
3501
3502 return (s32)checksum;
3503 }
3504
3505 /**
3506 * ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum
3507 * @hw: pointer to hardware structure
3508 *
3509 * Returns a negative error code on error, or the 16-bit checksum
3510 **/
3511 s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw)
3512 {
3513 return ixgbe_calc_checksum_X550(hw, NULL, 0);
3514 }
3515
3516 /**
3517 * ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum
3518 * @hw: pointer to hardware structure
3519 * @checksum_val: calculated checksum
3520 *
3521 * Performs checksum calculation and validates the EEPROM checksum. If the
3522 * caller does not need checksum_val, the value can be NULL.
3523 **/
3524 s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val)
3525 {
3526 s32 status;
3527 u16 checksum;
3528 u16 read_checksum = 0;
3529
3530 DEBUGFUNC("ixgbe_validate_eeprom_checksum_X550");
3531
3532 /* Read the first word from the EEPROM. If this times out or fails, do
3533 * not continue or we could be in for a very long wait while every
3534 * EEPROM read fails
3535 */
3536 status = hw->eeprom.ops.read(hw, 0, &checksum);
3537 if (status) {
3538 DEBUGOUT("EEPROM read failed\n");
3539 return status;
3540 }
3541
3542 status = hw->eeprom.ops.calc_checksum(hw);
3543 if (status < 0)
3544 return status;
3545
3546 checksum = (u16)(status & 0xffff);
3547
3548 status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
3549 &read_checksum);
3550 if (status)
3551 return status;
3552
3553 /* Verify read checksum from EEPROM is the same as
3554 * calculated checksum
3555 */
3556 if (read_checksum != checksum) {
3557 status = IXGBE_ERR_EEPROM_CHECKSUM;
3558 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
3559 "Invalid EEPROM checksum");
3560 }
3561
3562 /* If the user cares, return the calculated checksum */
3563 if (checksum_val)
3564 *checksum_val = checksum;
3565
3566 return status;
3567 }
3568
3569 /**
3570 * ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash
3571 * @hw: pointer to hardware structure
3572 *
3573 * After writing EEPROM to shadow RAM using EEWR register, software calculates
3574 * checksum and updates the EEPROM and instructs the hardware to update
3575 * the flash.
3576 **/
3577 s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw)
3578 {
3579 s32 status;
3580 u16 checksum = 0;
3581
3582 DEBUGFUNC("ixgbe_update_eeprom_checksum_X550");
3583
3584 /* Read the first word from the EEPROM. If this times out or fails, do
3585 * not continue or we could be in for a very long wait while every
3586 * EEPROM read fails
3587 */
3588 status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum);
3589 if (status) {
3590 DEBUGOUT("EEPROM read failed\n");
3591 return status;
3592 }
3593
3594 status = ixgbe_calc_eeprom_checksum_X550(hw);
3595 if (status < 0)
3596 return status;
3597
3598 checksum = (u16)(status & 0xffff);
3599
3600 status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
3601 checksum);
3602 if (status)
3603 return status;
3604
3605 status = ixgbe_update_flash_X550(hw);
3606
3607 return status;
3608 }
3609
3610 /**
3611 * ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device
3612 * @hw: pointer to hardware structure
3613 *
3614 * Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash.
3615 **/
3616 s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw)
3617 {
3618 s32 status = IXGBE_SUCCESS;
3619 union ixgbe_hic_hdr2 buffer;
3620
3621 DEBUGFUNC("ixgbe_update_flash_X550");
3622
3623 buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD;
3624 buffer.req.buf_lenh = 0;
3625 buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN;
3626 buffer.req.checksum = FW_DEFAULT_CHECKSUM;
3627
3628 status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
3629 sizeof(buffer),
3630 IXGBE_HI_COMMAND_TIMEOUT, false);
3631
3632 return status;
3633 }
3634
3635 /**
3636 * ixgbe_get_supported_physical_layer_X550em - Returns physical layer type
3637 * @hw: pointer to hardware structure
3638 *
3639 * Determines physical layer capabilities of the current configuration.
3640 **/
3641 u64 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
3642 {
3643 u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
3644 u16 ext_ability = 0;
3645
3646 DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em");
3647
3648 hw->phy.ops.identify(hw);
3649
3650 switch (hw->phy.type) {
3651 case ixgbe_phy_x550em_kr:
3652 if (hw->mac.type == ixgbe_mac_X550EM_a) {
3653 if (hw->phy.nw_mng_if_sel &
3654 IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) {
3655 physical_layer =
3656 IXGBE_PHYSICAL_LAYER_2500BASE_KX;
3657 break;
3658 } else if (hw->device_id ==
3659 IXGBE_DEV_ID_X550EM_A_KR_L) {
3660 physical_layer =
3661 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3662 break;
3663 }
3664 }
3665 /* fall through */
3666 case ixgbe_phy_x550em_xfi:
3667 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR |
3668 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3669 break;
3670 case ixgbe_phy_x550em_kx4:
3671 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
3672 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3673 break;
3674 case ixgbe_phy_x550em_ext_t:
3675 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
3676 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
3677 &ext_ability);
3678 if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
3679 physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
3680 if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
3681 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3682 break;
3683 case ixgbe_phy_fw:
3684 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_1GB_FULL)
3685 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3686 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_100_FULL)
3687 physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
3688 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_10_FULL)
3689 physical_layer |= IXGBE_PHYSICAL_LAYER_10BASE_T;
3690 break;
3691 case ixgbe_phy_sgmii:
3692 physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3693 break;
3694 case ixgbe_phy_ext_1g_t:
3695 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3696 break;
3697 default:
3698 break;
3699 }
3700
3701 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
3702 physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw);
3703
3704 return physical_layer;
3705 }
3706
3707 /**
3708 * ixgbe_get_bus_info_x550em - Set PCI bus info
3709 * @hw: pointer to hardware structure
3710 *
3711 * Sets bus link width and speed to unknown because X550em is
3712 * not a PCI device.
3713 **/
3714 s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw)
3715 {
3716
3717 DEBUGFUNC("ixgbe_get_bus_info_x550em");
3718
3719 hw->bus.width = ixgbe_bus_width_unknown;
3720 hw->bus.speed = ixgbe_bus_speed_unknown;
3721
3722 hw->mac.ops.set_lan_id(hw);
3723
3724 return IXGBE_SUCCESS;
3725 }
3726
3727 /**
3728 * ixgbe_disable_rx_x550 - Disable RX unit
3729 * @hw: pointer to hardware structure
3730 *
3731 * Enables the Rx DMA unit for x550
3732 **/
3733 void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
3734 {
3735 u32 rxctrl, pfdtxgswc;
3736 s32 status;
3737 struct ixgbe_hic_disable_rxen fw_cmd;
3738
3739 DEBUGFUNC("ixgbe_enable_rx_dma_x550");
3740
3741 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3742 if (rxctrl & IXGBE_RXCTRL_RXEN) {
3743 pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
3744 if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
3745 pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
3746 IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
3747 hw->mac.set_lben = true;
3748 } else {
3749 hw->mac.set_lben = false;
3750 }
3751
3752 fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
3753 fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
3754 fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
3755 fw_cmd.port_number = (u8)hw->bus.lan_id;
3756
3757 status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
3758 sizeof(struct ixgbe_hic_disable_rxen),
3759 IXGBE_HI_COMMAND_TIMEOUT, true);
3760
3761 /* If we fail - disable RX using register write */
3762 if (status) {
3763 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3764 if (rxctrl & IXGBE_RXCTRL_RXEN) {
3765 rxctrl &= ~IXGBE_RXCTRL_RXEN;
3766 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
3767 }
3768 }
3769 }
3770 }
3771
3772 /**
3773 * ixgbe_enter_lplu_x550em - Transition to low power states
3774 * @hw: pointer to hardware structure
3775 *
3776 * Configures Low Power Link Up on transition to low power states
3777 * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the
3778 * X557 PHY immediately prior to entering LPLU.
3779 **/
3780 s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
3781 {
3782 u16 an_10g_cntl_reg, autoneg_reg, speed;
3783 s32 status;
3784 ixgbe_link_speed lcd_speed;
3785 u32 save_autoneg;
3786 bool link_up;
3787
3788 /* SW LPLU not required on later HW revisions. */
3789 if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
3790 (IXGBE_FUSES0_REV_MASK &
3791 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
3792 return IXGBE_SUCCESS;
3793
3794 /* If blocked by MNG FW, then don't restart AN */
3795 if (ixgbe_check_reset_blocked(hw))
3796 return IXGBE_SUCCESS;
3797
3798 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3799 if (status != IXGBE_SUCCESS)
3800 return status;
3801
3802 status = ixgbe_read_eeprom(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3);
3803
3804 if (status != IXGBE_SUCCESS)
3805 return status;
3806
3807 /* If link is down, LPLU disabled in NVM, WoL disabled, or manageability
3808 * disabled, then force link down by entering low power mode.
3809 */
3810 if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) ||
3811 !(hw->wol_enabled || ixgbe_mng_present(hw)))
3812 return ixgbe_set_copper_phy_power(hw, false);
3813
3814 /* Determine LCD */
3815 status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed);
3816
3817 if (status != IXGBE_SUCCESS)
3818 return status;
3819
3820 /* If no valid LCD link speed, then force link down and exit. */
3821 if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN)
3822 return ixgbe_set_copper_phy_power(hw, false);
3823
3824 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
3825 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3826 &speed);
3827
3828 if (status != IXGBE_SUCCESS)
3829 return status;
3830
3831 /* If no link now, speed is invalid so take link down */
3832 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3833 if (status != IXGBE_SUCCESS)
3834 return ixgbe_set_copper_phy_power(hw, false);
3835
3836 /* clear everything but the speed bits */
3837 speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK;
3838
3839 /* If current speed is already LCD, then exit. */
3840 if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) &&
3841 (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) ||
3842 ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) &&
3843 (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL)))
3844 return status;
3845
3846 /* Clear AN completed indication */
3847 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM,
3848 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3849 &autoneg_reg);
3850
3851 if (status != IXGBE_SUCCESS)
3852 return status;
3853
3854 status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
3855 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3856 &an_10g_cntl_reg);
3857
3858 if (status != IXGBE_SUCCESS)
3859 return status;
3860
3861 status = hw->phy.ops.read_reg(hw,
3862 IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
3863 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3864 &autoneg_reg);
3865
3866 if (status != IXGBE_SUCCESS)
3867 return status;
3868
3869 save_autoneg = hw->phy.autoneg_advertised;
3870
3871 /* Setup link at least common link speed */
3872 status = hw->mac.ops.setup_link(hw, lcd_speed, false);
3873
3874 /* restore autoneg from before setting lplu speed */
3875 hw->phy.autoneg_advertised = save_autoneg;
3876
3877 return status;
3878 }
3879
3880 /**
3881 * ixgbe_get_lcd_x550em - Determine lowest common denominator
3882 * @hw: pointer to hardware structure
3883 * @lcd_speed: pointer to lowest common link speed
3884 *
3885 * Determine lowest common link speed with link partner.
3886 **/
3887 s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed)
3888 {
3889 u16 an_lp_status;
3890 s32 status;
3891 u16 word = hw->eeprom.ctrl_word_3;
3892
3893 *lcd_speed = IXGBE_LINK_SPEED_UNKNOWN;
3894
3895 status = hw->phy.ops.read_reg(hw, IXGBE_AUTO_NEG_LP_STATUS,
3896 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3897 &an_lp_status);
3898
3899 if (status != IXGBE_SUCCESS)
3900 return status;
3901
3902 /* If link partner advertised 1G, return 1G */
3903 if (an_lp_status & IXGBE_AUTO_NEG_LP_1000BASE_CAP) {
3904 *lcd_speed = IXGBE_LINK_SPEED_1GB_FULL;
3905 return status;
3906 }
3907
3908 /* If 10G disabled for LPLU via NVM D10GMP, then return no valid LCD */
3909 if ((hw->bus.lan_id && (word & NVM_INIT_CTRL_3_D10GMP_PORT1)) ||
3910 (word & NVM_INIT_CTRL_3_D10GMP_PORT0))
3911 return status;
3912
3913 /* Link partner not capable of lower speeds, return 10G */
3914 *lcd_speed = IXGBE_LINK_SPEED_10GB_FULL;
3915 return status;
3916 }
3917
3918 /**
3919 * ixgbe_setup_fc_X550em - Set up flow control
3920 * @hw: pointer to hardware structure
3921 *
3922 * Called at init time to set up flow control.
3923 **/
3924 s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
3925 {
3926 s32 ret_val = IXGBE_SUCCESS;
3927 u32 pause, asm_dir, reg_val;
3928
3929 DEBUGFUNC("ixgbe_setup_fc_X550em");
3930
3931 /* Validate the requested mode */
3932 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
3933 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
3934 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
3935 ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
3936 goto out;
3937 }
3938
3939 /* 10gig parts do not have a word in the EEPROM to determine the
3940 * default flow control setting, so we explicitly set it to full.
3941 */
3942 if (hw->fc.requested_mode == ixgbe_fc_default)
3943 hw->fc.requested_mode = ixgbe_fc_full;
3944
3945 /* Determine PAUSE and ASM_DIR bits. */
3946 switch (hw->fc.requested_mode) {
3947 case ixgbe_fc_none:
3948 pause = 0;
3949 asm_dir = 0;
3950 break;
3951 case ixgbe_fc_tx_pause:
3952 pause = 0;
3953 asm_dir = 1;
3954 break;
3955 case ixgbe_fc_rx_pause:
3956 /* Rx Flow control is enabled and Tx Flow control is
3957 * disabled by software override. Since there really
3958 * isn't a way to advertise that we are capable of RX
3959 * Pause ONLY, we will advertise that we support both
3960 * symmetric and asymmetric Rx PAUSE, as such we fall
3961 * through to the fc_full statement. Later, we will
3962 * disable the adapter's ability to send PAUSE frames.
3963 */
3964 case ixgbe_fc_full:
3965 pause = 1;
3966 asm_dir = 1;
3967 break;
3968 default:
3969 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
3970 "Flow control param set incorrectly\n");
3971 ret_val = IXGBE_ERR_CONFIG;
3972 goto out;
3973 }
3974
3975 switch (hw->device_id) {
3976 case IXGBE_DEV_ID_X550EM_X_KR:
3977 case IXGBE_DEV_ID_X550EM_A_KR:
3978 case IXGBE_DEV_ID_X550EM_A_KR_L:
3979 ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
3980 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
3981 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3982 if (ret_val != IXGBE_SUCCESS)
3983 goto out;
3984 reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
3985 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
3986 if (pause)
3987 reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
3988 if (asm_dir)
3989 reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
3990 ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
3991 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
3992 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3993
3994 /* This device does not fully support AN. */
3995 hw->fc.disable_fc_autoneg = true;
3996 break;
3997 case IXGBE_DEV_ID_X550EM_X_XFI:
3998 hw->fc.disable_fc_autoneg = true;
3999 break;
4000 default:
4001 break;
4002 }
4003
4004 out:
4005 return ret_val;
4006 }
4007
4008 /**
4009 * ixgbe_fc_autoneg_backplane_x550em_a - Enable flow control IEEE clause 37
4010 * @hw: pointer to hardware structure
4011 *
4012 * Enable flow control according to IEEE clause 37.
4013 **/
4014 void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
4015 {
4016 u32 link_s1, lp_an_page_low, an_cntl_1;
4017 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4018 ixgbe_link_speed speed;
4019 bool link_up;
4020
4021 /* AN should have completed when the cable was plugged in.
4022 * Look for reasons to bail out. Bail out if:
4023 * - FC autoneg is disabled, or if
4024 * - link is not up.
4025 */
4026 if (hw->fc.disable_fc_autoneg) {
4027 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4028 "Flow control autoneg is disabled");
4029 goto out;
4030 }
4031
4032 hw->mac.ops.check_link(hw, &speed, &link_up, false);
4033 if (!link_up) {
4034 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
4035 goto out;
4036 }
4037
4038 /* Check at auto-negotiation has completed */
4039 status = hw->mac.ops.read_iosf_sb_reg(hw,
4040 IXGBE_KRM_LINK_S1(hw->bus.lan_id),
4041 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_s1);
4042
4043 if (status != IXGBE_SUCCESS ||
4044 (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) {
4045 DEBUGOUT("Auto-Negotiation did not complete\n");
4046 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4047 goto out;
4048 }
4049
4050 /* Read the 10g AN autoc and LP ability registers and resolve
4051 * local flow control settings accordingly
4052 */
4053 status = hw->mac.ops.read_iosf_sb_reg(hw,
4054 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4055 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl_1);
4056
4057 if (status != IXGBE_SUCCESS) {
4058 DEBUGOUT("Auto-Negotiation did not complete\n");
4059 goto out;
4060 }
4061
4062 status = hw->mac.ops.read_iosf_sb_reg(hw,
4063 IXGBE_KRM_LP_BASE_PAGE_HIGH(hw->bus.lan_id),
4064 IXGBE_SB_IOSF_TARGET_KR_PHY, &lp_an_page_low);
4065
4066 if (status != IXGBE_SUCCESS) {
4067 DEBUGOUT("Auto-Negotiation did not complete\n");
4068 goto out;
4069 }
4070
4071 status = ixgbe_negotiate_fc(hw, an_cntl_1, lp_an_page_low,
4072 IXGBE_KRM_AN_CNTL_1_SYM_PAUSE,
4073 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE,
4074 IXGBE_KRM_LP_BASE_PAGE_HIGH_SYM_PAUSE,
4075 IXGBE_KRM_LP_BASE_PAGE_HIGH_ASM_PAUSE);
4076
4077 out:
4078 if (status == IXGBE_SUCCESS) {
4079 hw->fc.fc_was_autonegged = true;
4080 } else {
4081 hw->fc.fc_was_autonegged = false;
4082 hw->fc.current_mode = hw->fc.requested_mode;
4083 }
4084 }
4085
4086 /**
4087 * ixgbe_fc_autoneg_fiber_x550em_a - passthrough FC settings
4088 * @hw: pointer to hardware structure
4089 *
4090 **/
4091 void ixgbe_fc_autoneg_fiber_x550em_a(struct ixgbe_hw *hw)
4092 {
4093 hw->fc.fc_was_autonegged = false;
4094 hw->fc.current_mode = hw->fc.requested_mode;
4095 }
4096
4097 /**
4098 * ixgbe_fc_autoneg_sgmii_x550em_a - Enable flow control IEEE clause 37
4099 * @hw: pointer to hardware structure
4100 *
4101 * Enable flow control according to IEEE clause 37.
4102 **/
4103 void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
4104 {
4105 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4106 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
4107 ixgbe_link_speed speed;
4108 bool link_up;
4109
4110 /* AN should have completed when the cable was plugged in.
4111 * Look for reasons to bail out. Bail out if:
4112 * - FC autoneg is disabled, or if
4113 * - link is not up.
4114 */
4115 if (hw->fc.disable_fc_autoneg) {
4116 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4117 "Flow control autoneg is disabled");
4118 goto out;
4119 }
4120
4121 hw->mac.ops.check_link(hw, &speed, &link_up, false);
4122 if (!link_up) {
4123 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
4124 goto out;
4125 }
4126
4127 /* Check if auto-negotiation has completed */
4128 status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info);
4129 if (status != IXGBE_SUCCESS ||
4130 !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) {
4131 DEBUGOUT("Auto-Negotiation did not complete\n");
4132 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4133 goto out;
4134 }
4135
4136 /* Negotiate the flow control */
4137 status = ixgbe_negotiate_fc(hw, info[0], info[0],
4138 FW_PHY_ACT_GET_LINK_INFO_FC_RX,
4139 FW_PHY_ACT_GET_LINK_INFO_FC_TX,
4140 FW_PHY_ACT_GET_LINK_INFO_LP_FC_RX,
4141 FW_PHY_ACT_GET_LINK_INFO_LP_FC_TX);
4142
4143 out:
4144 if (status == IXGBE_SUCCESS) {
4145 hw->fc.fc_was_autonegged = true;
4146 } else {
4147 hw->fc.fc_was_autonegged = false;
4148 hw->fc.current_mode = hw->fc.requested_mode;
4149 }
4150 }
4151
4152 /**
4153 * ixgbe_setup_fc_backplane_x550em_a - Set up flow control
4154 * @hw: pointer to hardware structure
4155 *
4156 * Called at init time to set up flow control.
4157 **/
4158 s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
4159 {
4160 s32 status = IXGBE_SUCCESS;
4161 u32 an_cntl = 0;
4162
4163 DEBUGFUNC("ixgbe_setup_fc_backplane_x550em_a");
4164
4165 /* Validate the requested mode */
4166 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
4167 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4168 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
4169 return IXGBE_ERR_INVALID_LINK_SETTINGS;
4170 }
4171
4172 if (hw->fc.requested_mode == ixgbe_fc_default)
4173 hw->fc.requested_mode = ixgbe_fc_full;
4174
4175 /* Set up the 1G and 10G flow control advertisement registers so the
4176 * HW will be able to do FC autoneg once the cable is plugged in. If
4177 * we link at 10G, the 1G advertisement is harmless and vice versa.
4178 */
4179 status = hw->mac.ops.read_iosf_sb_reg(hw,
4180 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4181 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl);
4182
4183 if (status != IXGBE_SUCCESS) {
4184 DEBUGOUT("Auto-Negotiation did not complete\n");
4185 return status;
4186 }
4187
4188 /* The possible values of fc.requested_mode are:
4189 * 0: Flow control is completely disabled
4190 * 1: Rx flow control is enabled (we can receive pause frames,
4191 * but not send pause frames).
4192 * 2: Tx flow control is enabled (we can send pause frames but
4193 * we do not support receiving pause frames).
4194 * 3: Both Rx and Tx flow control (symmetric) are enabled.
4195 * other: Invalid.
4196 */
4197 switch (hw->fc.requested_mode) {
4198 case ixgbe_fc_none:
4199 /* Flow control completely disabled by software override. */
4200 an_cntl &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
4201 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
4202 break;
4203 case ixgbe_fc_tx_pause:
4204 /* Tx Flow control is enabled, and Rx Flow control is
4205 * disabled by software override.
4206 */
4207 an_cntl |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
4208 an_cntl &= ~IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
4209 break;
4210 case ixgbe_fc_rx_pause:
4211 /* Rx Flow control is enabled and Tx Flow control is
4212 * disabled by software override. Since there really
4213 * isn't a way to advertise that we are capable of RX
4214 * Pause ONLY, we will advertise that we support both
4215 * symmetric and asymmetric Rx PAUSE, as such we fall
4216 * through to the fc_full statement. Later, we will
4217 * disable the adapter's ability to send PAUSE frames.
4218 */
4219 case ixgbe_fc_full:
4220 /* Flow control (both Rx and Tx) is enabled by SW override. */
4221 an_cntl |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
4222 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
4223 break;
4224 default:
4225 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
4226 "Flow control param set incorrectly\n");
4227 return IXGBE_ERR_CONFIG;
4228 }
4229
4230 status = hw->mac.ops.write_iosf_sb_reg(hw,
4231 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4232 IXGBE_SB_IOSF_TARGET_KR_PHY, an_cntl);
4233
4234 /* Restart auto-negotiation. */
4235 status = ixgbe_restart_an_internal_phy_x550em(hw);
4236
4237 return status;
4238 }
4239
4240 /**
4241 * ixgbe_set_mux - Set mux for port 1 access with CS4227
4242 * @hw: pointer to hardware structure
4243 * @state: set mux if 1, clear if 0
4244 */
4245 static void ixgbe_set_mux(struct ixgbe_hw *hw, u8 state)
4246 {
4247 u32 esdp;
4248
4249 if (!hw->bus.lan_id)
4250 return;
4251 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
4252 if (state)
4253 esdp |= IXGBE_ESDP_SDP1;
4254 else
4255 esdp &= ~IXGBE_ESDP_SDP1;
4256 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
4257 IXGBE_WRITE_FLUSH(hw);
4258 }
4259
4260 /**
4261 * ixgbe_acquire_swfw_sync_X550em - Acquire SWFW semaphore
4262 * @hw: pointer to hardware structure
4263 * @mask: Mask to specify which semaphore to acquire
4264 *
4265 * Acquires the SWFW semaphore and sets the I2C MUX
4266 **/
4267 s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
4268 {
4269 s32 status;
4270
4271 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550em");
4272
4273 status = ixgbe_acquire_swfw_sync_X540(hw, mask);
4274 if (status)
4275 return status;
4276
4277 if (mask & IXGBE_GSSR_I2C_MASK)
4278 ixgbe_set_mux(hw, 1);
4279
4280 return IXGBE_SUCCESS;
4281 }
4282
4283 /**
4284 * ixgbe_release_swfw_sync_X550em - Release SWFW semaphore
4285 * @hw: pointer to hardware structure
4286 * @mask: Mask to specify which semaphore to release
4287 *
4288 * Releases the SWFW semaphore and sets the I2C MUX
4289 **/
4290 void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
4291 {
4292 DEBUGFUNC("ixgbe_release_swfw_sync_X550em");
4293
4294 if (mask & IXGBE_GSSR_I2C_MASK)
4295 ixgbe_set_mux(hw, 0);
4296
4297 ixgbe_release_swfw_sync_X540(hw, mask);
4298 }
4299
4300 /**
4301 * ixgbe_acquire_swfw_sync_X550a - Acquire SWFW semaphore
4302 * @hw: pointer to hardware structure
4303 * @mask: Mask to specify which semaphore to acquire
4304 *
4305 * Acquires the SWFW semaphore and get the shared phy token as needed
4306 */
4307 static s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask)
4308 {
4309 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
4310 int retries = FW_PHY_TOKEN_RETRIES;
4311 s32 status = IXGBE_SUCCESS;
4312
4313 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550a");
4314
4315 while (--retries) {
4316 status = IXGBE_SUCCESS;
4317 if (hmask)
4318 status = ixgbe_acquire_swfw_sync_X540(hw, hmask);
4319 if (status) {
4320 DEBUGOUT1("Could not acquire SWFW semaphore, Status = %d\n",
4321 status);
4322 return status;
4323 }
4324 if (!(mask & IXGBE_GSSR_TOKEN_SM))
4325 return IXGBE_SUCCESS;
4326
4327 status = ixgbe_get_phy_token(hw);
4328 if (status == IXGBE_ERR_TOKEN_RETRY)
4329 DEBUGOUT1("Could not acquire PHY token, Status = %d\n",
4330 status);
4331
4332 if (status == IXGBE_SUCCESS)
4333 return IXGBE_SUCCESS;
4334
4335 if (hmask)
4336 ixgbe_release_swfw_sync_X540(hw, hmask);
4337
4338 if (status != IXGBE_ERR_TOKEN_RETRY) {
4339 DEBUGOUT1("Unable to retry acquiring the PHY token, Status = %d\n",
4340 status);
4341 return status;
4342 }
4343 }
4344
4345 DEBUGOUT1("Semaphore acquisition retries failed!: PHY ID = 0x%08X\n",
4346 hw->phy.id);
4347 return status;
4348 }
4349
4350 /**
4351 * ixgbe_release_swfw_sync_X550a - Release SWFW semaphore
4352 * @hw: pointer to hardware structure
4353 * @mask: Mask to specify which semaphore to release
4354 *
4355 * Releases the SWFW semaphore and puts the shared phy token as needed
4356 */
4357 static void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask)
4358 {
4359 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
4360
4361 DEBUGFUNC("ixgbe_release_swfw_sync_X550a");
4362
4363 if (mask & IXGBE_GSSR_TOKEN_SM)
4364 ixgbe_put_phy_token(hw);
4365
4366 if (hmask)
4367 ixgbe_release_swfw_sync_X540(hw, hmask);
4368 }
4369
4370 /**
4371 * ixgbe_read_phy_reg_x550a - Reads specified PHY register
4372 * @hw: pointer to hardware structure
4373 * @reg_addr: 32 bit address of PHY register to read
4374 * @device_type: 5 bit device type
4375 * @phy_data: Pointer to read data from PHY register
4376 *
4377 * Reads a value from a specified PHY register using the SWFW lock and PHY
4378 * Token. The PHY Token is needed since the MDIO is shared between to MAC
4379 * instances.
4380 **/
4381 s32 ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
4382 u32 device_type, u16 *phy_data)
4383 {
4384 s32 status;
4385 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
4386
4387 DEBUGFUNC("ixgbe_read_phy_reg_x550a");
4388
4389 if (hw->mac.ops.acquire_swfw_sync(hw, mask))
4390 return IXGBE_ERR_SWFW_SYNC;
4391
4392 status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
4393
4394 hw->mac.ops.release_swfw_sync(hw, mask);
4395
4396 return status;
4397 }
4398
4399 /**
4400 * ixgbe_write_phy_reg_x550a - Writes specified PHY register
4401 * @hw: pointer to hardware structure
4402 * @reg_addr: 32 bit PHY register to write
4403 * @device_type: 5 bit device type
4404 * @phy_data: Data to write to the PHY register
4405 *
4406 * Writes a value to specified PHY register using the SWFW lock and PHY Token.
4407 * The PHY Token is needed since the MDIO is shared between to MAC instances.
4408 **/
4409 s32 ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
4410 u32 device_type, u16 phy_data)
4411 {
4412 s32 status;
4413 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
4414
4415 DEBUGFUNC("ixgbe_write_phy_reg_x550a");
4416
4417 if (hw->mac.ops.acquire_swfw_sync(hw, mask) == IXGBE_SUCCESS) {
4418 status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
4419 phy_data);
4420 hw->mac.ops.release_swfw_sync(hw, mask);
4421 } else {
4422 status = IXGBE_ERR_SWFW_SYNC;
4423 }
4424
4425 return status;
4426 }
4427
4428 /**
4429 * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
4430 * @hw: pointer to hardware structure
4431 *
4432 * Handle external Base T PHY interrupt. If high temperature
4433 * failure alarm then return error, else if link status change
4434 * then setup internal/external PHY link
4435 *
4436 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
4437 * failure alarm, else return PHY access status.
4438 */
4439 s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
4440 {
4441 bool lsc;
4442 u32 status;
4443
4444 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
4445
4446 if (status != IXGBE_SUCCESS)
4447 return status;
4448
4449 if (lsc)
4450 return ixgbe_setup_internal_phy(hw);
4451
4452 return IXGBE_SUCCESS;
4453 }
4454
4455 /**
4456 * ixgbe_setup_mac_link_t_X550em - Sets the auto advertised link speed
4457 * @hw: pointer to hardware structure
4458 * @speed: new link speed
4459 * @autoneg_wait_to_complete: true when waiting for completion is needed
4460 *
4461 * Setup internal/external PHY link speed based on link speed, then set
4462 * external PHY auto advertised link speed.
4463 *
4464 * Returns error status for any failure
4465 **/
4466 s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
4467 ixgbe_link_speed speed,
4468 bool autoneg_wait_to_complete)
4469 {
4470 s32 status;
4471 ixgbe_link_speed force_speed;
4472 u32 i;
4473 bool link_up = false;
4474
4475 DEBUGFUNC("ixgbe_setup_mac_link_t_X550em");
4476
4477 /* Setup internal/external PHY link speed to iXFI (10G), unless
4478 * only 1G is auto advertised then setup KX link.
4479 */
4480 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
4481 force_speed = IXGBE_LINK_SPEED_10GB_FULL;
4482 else
4483 force_speed = IXGBE_LINK_SPEED_1GB_FULL;
4484
4485 /* If X552 and internal link mode is XFI, then setup XFI internal link.
4486 */
4487 if (hw->mac.type == ixgbe_mac_X550EM_x &&
4488 !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
4489 status = ixgbe_setup_ixfi_x550em(hw, &force_speed);
4490
4491 if (status != IXGBE_SUCCESS)
4492 return status;
4493
4494 /* Wait for the controller to acquire link */
4495 for (i = 0; i < 10; i++) {
4496 msec_delay(100);
4497
4498 status = ixgbe_check_link(hw, &force_speed, &link_up,
4499 false);
4500 if (status != IXGBE_SUCCESS)
4501 return status;
4502
4503 if (link_up)
4504 break;
4505 }
4506 }
4507
4508 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
4509 }
4510
4511 /**
4512 * ixgbe_check_link_t_X550em - Determine link and speed status
4513 * @hw: pointer to hardware structure
4514 * @speed: pointer to link speed
4515 * @link_up: true when link is up
4516 * @link_up_wait_to_complete: bool used to wait for link up or not
4517 *
4518 * Check that both the MAC and X557 external PHY have link.
4519 **/
4520 s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
4521 bool *link_up, bool link_up_wait_to_complete)
4522 {
4523 u32 status;
4524 u16 i, autoneg_status = 0;
4525
4526 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
4527 return IXGBE_ERR_CONFIG;
4528
4529 status = ixgbe_check_mac_link_generic(hw, speed, link_up,
4530 link_up_wait_to_complete);
4531
4532 /* If check link fails or MAC link is not up, then return */
4533 if (status != IXGBE_SUCCESS || !(*link_up))
4534 return status;
4535
4536 /* MAC link is up, so check external PHY link.
4537 * X557 PHY. Link status is latching low, and can only be used to detect
4538 * link drop, and not the current status of the link without performing
4539 * back-to-back reads.
4540 */
4541 for (i = 0; i < 2; i++) {
4542 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
4543 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
4544 &autoneg_status);
4545
4546 if (status != IXGBE_SUCCESS)
4547 return status;
4548 }
4549
4550 /* If external PHY link is not up, then indicate link not up */
4551 if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
4552 *link_up = false;
4553
4554 return IXGBE_SUCCESS;
4555 }
4556
4557 /**
4558 * ixgbe_reset_phy_t_X550em - Performs X557 PHY reset and enables LASI
4559 * @hw: pointer to hardware structure
4560 **/
4561 s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw)
4562 {
4563 s32 status;
4564
4565 status = ixgbe_reset_phy_generic(hw);
4566
4567 if (status != IXGBE_SUCCESS)
4568 return status;
4569
4570 /* Configure Link Status Alarm and Temperature Threshold interrupts */
4571 return ixgbe_enable_lasi_ext_t_x550em(hw);
4572 }
4573
4574 /**
4575 * ixgbe_led_on_t_X550em - Turns on the software controllable LEDs.
4576 * @hw: pointer to hardware structure
4577 * @led_idx: led number to turn on
4578 **/
4579 s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
4580 {
4581 u16 phy_data;
4582
4583 DEBUGFUNC("ixgbe_led_on_t_X550em");
4584
4585 if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
4586 return IXGBE_ERR_PARAM;
4587
4588 /* To turn on the LED, set mode to ON. */
4589 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4590 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
4591 phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK;
4592 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4593 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
4594
4595 /* Some designs have the LEDs wired to the MAC */
4596 return ixgbe_led_on_generic(hw, led_idx);
4597 }
4598
4599 /**
4600 * ixgbe_led_off_t_X550em - Turns off the software controllable LEDs.
4601 * @hw: pointer to hardware structure
4602 * @led_idx: led number to turn off
4603 **/
4604 s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
4605 {
4606 u16 phy_data;
4607
4608 DEBUGFUNC("ixgbe_led_off_t_X550em");
4609
4610 if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
4611 return IXGBE_ERR_PARAM;
4612
4613 /* To turn on the LED, set mode to ON. */
4614 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4615 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
4616 phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK;
4617 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4618 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
4619
4620 /* Some designs have the LEDs wired to the MAC */
4621 return ixgbe_led_off_generic(hw, led_idx);
4622 }
4623
4624 /**
4625 * ixgbe_set_fw_drv_ver_x550 - Sends driver version to firmware
4626 * @hw: pointer to the HW structure
4627 * @maj: driver version major number
4628 * @min: driver version minor number
4629 * @build: driver version build number
4630 * @sub: driver version sub build number
4631 * @len: length of driver_ver string
4632 * @driver_ver: driver string
4633 *
4634 * Sends driver version number to firmware through the manageability
4635 * block. On success return IXGBE_SUCCESS
4636 * else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
4637 * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
4638 **/
4639 s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
4640 u8 build, u8 sub, u16 len, const char *driver_ver)
4641 {
4642 struct ixgbe_hic_drv_info2 fw_cmd;
4643 s32 ret_val = IXGBE_SUCCESS;
4644 int i;
4645
4646 DEBUGFUNC("ixgbe_set_fw_drv_ver_x550");
4647
4648 if ((len == 0) || (driver_ver == NULL) ||
4649 (len > sizeof(fw_cmd.driver_string)))
4650 return IXGBE_ERR_INVALID_ARGUMENT;
4651
4652 fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
4653 fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len;
4654 fw_cmd.hdr.cmd_or_resp.cmd_resv = FW_CEM_CMD_RESERVED;
4655 fw_cmd.port_num = (u8)hw->bus.func;
4656 fw_cmd.ver_maj = maj;
4657 fw_cmd.ver_min = min;
4658 fw_cmd.ver_build = build;
4659 fw_cmd.ver_sub = sub;
4660 fw_cmd.hdr.checksum = 0;
4661 memcpy(fw_cmd.driver_string, driver_ver, len);
4662 fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
4663 (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
4664
4665 for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
4666 ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
4667 sizeof(fw_cmd),
4668 IXGBE_HI_COMMAND_TIMEOUT,
4669 true);
4670 if (ret_val != IXGBE_SUCCESS)
4671 continue;
4672
4673 if (fw_cmd.hdr.cmd_or_resp.ret_status ==
4674 FW_CEM_RESP_STATUS_SUCCESS)
4675 ret_val = IXGBE_SUCCESS;
4676 else
4677 ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
4678
4679 break;
4680 }
4681
4682 return ret_val;
4683 }
4684
4685 /**
4686 * ixgbe_fw_recovery_mode_X550 - Check FW NVM recovery mode
4687 * @hw: pointer t hardware structure
4688 *
4689 * Returns true if in FW NVM recovery mode.
4690 **/
4691 bool ixgbe_fw_recovery_mode_X550(struct ixgbe_hw *hw)
4692 {
4693 u32 fwsm;
4694
4695 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw));
4696
4697 return !!(fwsm & IXGBE_FWSM_FW_NVM_RECOVERY_MODE);
4698 }
Cache object: 11a0583117df17cfd396d3b7bd0a740c
|