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