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