]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixgbe/ixgbe_x540.c
MFV r323531: 8521 nvlist memory leak in get_clones_stat() and spa_load_best()
[FreeBSD/FreeBSD.git] / sys / dev / ixgbe / ixgbe_x540.c
1 /******************************************************************************
2
3   Copyright (c) 2001-2017, Intel Corporation
4   All rights reserved.
5
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31
32 ******************************************************************************/
33 /*$FreeBSD$*/
34
35 #include "ixgbe_x540.h"
36 #include "ixgbe_type.h"
37 #include "ixgbe_api.h"
38 #include "ixgbe_common.h"
39 #include "ixgbe_phy.h"
40
41 #define IXGBE_X540_MAX_TX_QUEUES        128
42 #define IXGBE_X540_MAX_RX_QUEUES        128
43 #define IXGBE_X540_RAR_ENTRIES          128
44 #define IXGBE_X540_MC_TBL_SIZE          128
45 #define IXGBE_X540_VFT_TBL_SIZE         128
46 #define IXGBE_X540_RX_PB_SIZE           384
47
48 static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw);
49 static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw);
50 static void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw);
51
52 /**
53  *  ixgbe_init_ops_X540 - Inits func ptrs and MAC type
54  *  @hw: pointer to hardware structure
55  *
56  *  Initialize the function pointers and assign the MAC type for X540.
57  *  Does not touch the hardware.
58  **/
59 s32 ixgbe_init_ops_X540(struct ixgbe_hw *hw)
60 {
61         struct ixgbe_mac_info *mac = &hw->mac;
62         struct ixgbe_phy_info *phy = &hw->phy;
63         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
64         s32 ret_val;
65
66         DEBUGFUNC("ixgbe_init_ops_X540");
67
68         ret_val = ixgbe_init_phy_ops_generic(hw);
69         ret_val = ixgbe_init_ops_generic(hw);
70
71
72         /* EEPROM */
73         eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
74         eeprom->ops.read = ixgbe_read_eerd_X540;
75         eeprom->ops.read_buffer = ixgbe_read_eerd_buffer_X540;
76         eeprom->ops.write = ixgbe_write_eewr_X540;
77         eeprom->ops.write_buffer = ixgbe_write_eewr_buffer_X540;
78         eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X540;
79         eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X540;
80         eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X540;
81
82         /* PHY */
83         phy->ops.init = ixgbe_init_phy_ops_generic;
84         phy->ops.reset = NULL;
85         phy->ops.set_phy_power = ixgbe_set_copper_phy_power;
86
87         /* MAC */
88         mac->ops.reset_hw = ixgbe_reset_hw_X540;
89         mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_gen2;
90         mac->ops.get_media_type = ixgbe_get_media_type_X540;
91         mac->ops.get_supported_physical_layer =
92                                     ixgbe_get_supported_physical_layer_X540;
93         mac->ops.read_analog_reg8 = NULL;
94         mac->ops.write_analog_reg8 = NULL;
95         mac->ops.start_hw = ixgbe_start_hw_X540;
96         mac->ops.get_san_mac_addr = ixgbe_get_san_mac_addr_generic;
97         mac->ops.set_san_mac_addr = ixgbe_set_san_mac_addr_generic;
98         mac->ops.get_device_caps = ixgbe_get_device_caps_generic;
99         mac->ops.get_wwn_prefix = ixgbe_get_wwn_prefix_generic;
100         mac->ops.get_fcoe_boot_status = ixgbe_get_fcoe_boot_status_generic;
101         mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X540;
102         mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X540;
103         mac->ops.init_swfw_sync = ixgbe_init_swfw_sync_X540;
104         mac->ops.disable_sec_rx_path = ixgbe_disable_sec_rx_path_generic;
105         mac->ops.enable_sec_rx_path = ixgbe_enable_sec_rx_path_generic;
106
107         /* RAR, Multicast, VLAN */
108         mac->ops.set_vmdq = ixgbe_set_vmdq_generic;
109         mac->ops.set_vmdq_san_mac = ixgbe_set_vmdq_san_mac_generic;
110         mac->ops.clear_vmdq = ixgbe_clear_vmdq_generic;
111         mac->ops.insert_mac_addr = ixgbe_insert_mac_addr_generic;
112         mac->rar_highwater = 1;
113         mac->ops.set_vfta = ixgbe_set_vfta_generic;
114         mac->ops.set_vlvf = ixgbe_set_vlvf_generic;
115         mac->ops.clear_vfta = ixgbe_clear_vfta_generic;
116         mac->ops.init_uta_tables = ixgbe_init_uta_tables_generic;
117         mac->ops.set_mac_anti_spoofing = ixgbe_set_mac_anti_spoofing;
118         mac->ops.set_vlan_anti_spoofing = ixgbe_set_vlan_anti_spoofing;
119
120         /* Link */
121         mac->ops.get_link_capabilities =
122                                 ixgbe_get_copper_link_capabilities_generic;
123         mac->ops.setup_link = ixgbe_setup_mac_link_X540;
124         mac->ops.setup_rxpba = ixgbe_set_rxpba_generic;
125         mac->ops.check_link = ixgbe_check_mac_link_generic;
126         mac->ops.bypass_rw = ixgbe_bypass_rw_generic;
127         mac->ops.bypass_valid_rd = ixgbe_bypass_valid_rd_generic;
128         mac->ops.bypass_set = ixgbe_bypass_set_generic;
129         mac->ops.bypass_rd_eep = ixgbe_bypass_rd_eep_generic;
130
131
132         mac->mcft_size          = IXGBE_X540_MC_TBL_SIZE;
133         mac->vft_size           = IXGBE_X540_VFT_TBL_SIZE;
134         mac->num_rar_entries    = IXGBE_X540_RAR_ENTRIES;
135         mac->rx_pb_size         = IXGBE_X540_RX_PB_SIZE;
136         mac->max_rx_queues      = IXGBE_X540_MAX_RX_QUEUES;
137         mac->max_tx_queues      = IXGBE_X540_MAX_TX_QUEUES;
138         mac->max_msix_vectors   = ixgbe_get_pcie_msix_count_generic(hw);
139
140         /*
141          * FWSM register
142          * ARC supported; valid only if manageability features are
143          * enabled.
144          */
145         mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
146                                      & IXGBE_FWSM_MODE_MASK);
147
148         hw->mbx.ops.init_params = ixgbe_init_mbx_params_pf;
149
150         /* LEDs */
151         mac->ops.blink_led_start = ixgbe_blink_led_start_X540;
152         mac->ops.blink_led_stop = ixgbe_blink_led_stop_X540;
153
154         /* Manageability interface */
155         mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_generic;
156
157         mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
158
159         return ret_val;
160 }
161
162 /**
163  *  ixgbe_get_link_capabilities_X540 - Determines link capabilities
164  *  @hw: pointer to hardware structure
165  *  @speed: pointer to link speed
166  *  @autoneg: TRUE when autoneg or autotry is enabled
167  *
168  *  Determines the link capabilities by reading the AUTOC register.
169  **/
170 s32 ixgbe_get_link_capabilities_X540(struct ixgbe_hw *hw,
171                                      ixgbe_link_speed *speed,
172                                      bool *autoneg)
173 {
174         ixgbe_get_copper_link_capabilities_generic(hw, speed, autoneg);
175
176         return IXGBE_SUCCESS;
177 }
178
179 /**
180  *  ixgbe_get_media_type_X540 - Get media type
181  *  @hw: pointer to hardware structure
182  *
183  *  Returns the media type (fiber, copper, backplane)
184  **/
185 enum ixgbe_media_type ixgbe_get_media_type_X540(struct ixgbe_hw *hw)
186 {
187         UNREFERENCED_1PARAMETER(hw);
188         return ixgbe_media_type_copper;
189 }
190
191 /**
192  *  ixgbe_setup_mac_link_X540 - Sets the auto advertised capabilities
193  *  @hw: pointer to hardware structure
194  *  @speed: new link speed
195  *  @autoneg_wait_to_complete: TRUE when waiting for completion is needed
196  **/
197 s32 ixgbe_setup_mac_link_X540(struct ixgbe_hw *hw,
198                               ixgbe_link_speed speed,
199                               bool autoneg_wait_to_complete)
200 {
201         DEBUGFUNC("ixgbe_setup_mac_link_X540");
202         return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
203 }
204
205 /**
206  *  ixgbe_reset_hw_X540 - Perform hardware reset
207  *  @hw: pointer to hardware structure
208  *
209  *  Resets the hardware by resetting the transmit and receive units, masks
210  *  and clears all interrupts, and perform a reset.
211  **/
212 s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
213 {
214         s32 status;
215         u32 ctrl, i;
216         u32 swfw_mask = hw->phy.phy_semaphore_mask;
217
218         DEBUGFUNC("ixgbe_reset_hw_X540");
219
220         /* Call adapter stop to disable tx/rx and clear interrupts */
221         status = hw->mac.ops.stop_adapter(hw);
222         if (status != IXGBE_SUCCESS)
223                 goto reset_hw_out;
224
225         /* flush pending Tx transactions */
226         ixgbe_clear_tx_pending(hw);
227
228 mac_reset_top:
229         status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
230         if (status != IXGBE_SUCCESS) {
231                 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
232                         "semaphore failed with %d", status);
233                 return IXGBE_ERR_SWFW_SYNC;
234         }
235         ctrl = IXGBE_CTRL_RST;
236         ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
237         IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
238         IXGBE_WRITE_FLUSH(hw);
239         hw->mac.ops.release_swfw_sync(hw, swfw_mask);
240
241         /* Poll for reset bit to self-clear indicating reset is complete */
242         for (i = 0; i < 10; i++) {
243                 usec_delay(1);
244                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
245                 if (!(ctrl & IXGBE_CTRL_RST_MASK))
246                         break;
247         }
248
249         if (ctrl & IXGBE_CTRL_RST_MASK) {
250                 status = IXGBE_ERR_RESET_FAILED;
251                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
252                              "Reset polling failed to complete.\n");
253         }
254         msec_delay(100);
255
256         /*
257          * Double resets are required for recovery from certain error
258          * conditions.  Between resets, it is necessary to stall to allow time
259          * for any pending HW events to complete.
260          */
261         if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
262                 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
263                 goto mac_reset_top;
264         }
265
266         /* Set the Rx packet buffer size. */
267         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(0), 384 << IXGBE_RXPBSIZE_SHIFT);
268
269         /* Store the permanent mac address */
270         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
271
272         /*
273          * Store MAC address from RAR0, clear receive address registers, and
274          * clear the multicast table.  Also reset num_rar_entries to 128,
275          * since we modify this value when programming the SAN MAC address.
276          */
277         hw->mac.num_rar_entries = 128;
278         hw->mac.ops.init_rx_addrs(hw);
279
280         /* Store the permanent SAN mac address */
281         hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
282
283         /* Add the SAN MAC address to the RAR only if it's a valid address */
284         if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) {
285                 /* Save the SAN MAC RAR index */
286                 hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;
287
288                 hw->mac.ops.set_rar(hw, hw->mac.san_mac_rar_index,
289                                     hw->mac.san_addr, 0, IXGBE_RAH_AV);
290
291                 /* clear VMDq pool/queue selection for this RAR */
292                 hw->mac.ops.clear_vmdq(hw, hw->mac.san_mac_rar_index,
293                                        IXGBE_CLEAR_VMDQ_ALL);
294
295                 /* Reserve the last RAR for the SAN MAC address */
296                 hw->mac.num_rar_entries--;
297         }
298
299         /* Store the alternative WWNN/WWPN prefix */
300         hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,
301                                    &hw->mac.wwpn_prefix);
302
303 reset_hw_out:
304         return status;
305 }
306
307 /**
308  *  ixgbe_start_hw_X540 - Prepare hardware for Tx/Rx
309  *  @hw: pointer to hardware structure
310  *
311  *  Starts the hardware using the generic start_hw function
312  *  and the generation start_hw function.
313  *  Then performs revision-specific operations, if any.
314  **/
315 s32 ixgbe_start_hw_X540(struct ixgbe_hw *hw)
316 {
317         s32 ret_val = IXGBE_SUCCESS;
318
319         DEBUGFUNC("ixgbe_start_hw_X540");
320
321         ret_val = ixgbe_start_hw_generic(hw);
322         if (ret_val != IXGBE_SUCCESS)
323                 goto out;
324
325         ret_val = ixgbe_start_hw_gen2(hw);
326
327 out:
328         return ret_val;
329 }
330
331 /**
332  *  ixgbe_get_supported_physical_layer_X540 - Returns physical layer type
333  *  @hw: pointer to hardware structure
334  *
335  *  Determines physical layer capabilities of the current configuration.
336  **/
337 u64 ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw)
338 {
339         u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
340         u16 ext_ability = 0;
341
342         DEBUGFUNC("ixgbe_get_supported_physical_layer_X540");
343
344         hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
345         IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
346         if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
347                 physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
348         if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
349                 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
350         if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY)
351                 physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
352
353         return physical_layer;
354 }
355
356 /**
357  *  ixgbe_init_eeprom_params_X540 - Initialize EEPROM params
358  *  @hw: pointer to hardware structure
359  *
360  *  Initializes the EEPROM parameters ixgbe_eeprom_info within the
361  *  ixgbe_hw struct in order to set up EEPROM access.
362  **/
363 s32 ixgbe_init_eeprom_params_X540(struct ixgbe_hw *hw)
364 {
365         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
366         u32 eec;
367         u16 eeprom_size;
368
369         DEBUGFUNC("ixgbe_init_eeprom_params_X540");
370
371         if (eeprom->type == ixgbe_eeprom_uninitialized) {
372                 eeprom->semaphore_delay = 10;
373                 eeprom->type = ixgbe_flash;
374
375                 eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
376                 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
377                                     IXGBE_EEC_SIZE_SHIFT);
378                 eeprom->word_size = 1 << (eeprom_size +
379                                           IXGBE_EEPROM_WORD_SIZE_SHIFT);
380
381                 DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
382                           eeprom->type, eeprom->word_size);
383         }
384
385         return IXGBE_SUCCESS;
386 }
387
388 /**
389  *  ixgbe_read_eerd_X540- Read EEPROM word using EERD
390  *  @hw: pointer to hardware structure
391  *  @offset: offset of  word in the EEPROM to read
392  *  @data: word read from the EEPROM
393  *
394  *  Reads a 16 bit word from the EEPROM using the EERD register.
395  **/
396 s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
397 {
398         s32 status = IXGBE_SUCCESS;
399
400         DEBUGFUNC("ixgbe_read_eerd_X540");
401         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
402             IXGBE_SUCCESS) {
403                 status = ixgbe_read_eerd_generic(hw, offset, data);
404                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
405         } else {
406                 status = IXGBE_ERR_SWFW_SYNC;
407         }
408
409         return status;
410 }
411
412 /**
413  *  ixgbe_read_eerd_buffer_X540- Read EEPROM word(s) using EERD
414  *  @hw: pointer to hardware structure
415  *  @offset: offset of  word in the EEPROM to read
416  *  @words: number of words
417  *  @data: word(s) read from the EEPROM
418  *
419  *  Reads a 16 bit word(s) from the EEPROM using the EERD register.
420  **/
421 s32 ixgbe_read_eerd_buffer_X540(struct ixgbe_hw *hw,
422                                 u16 offset, u16 words, u16 *data)
423 {
424         s32 status = IXGBE_SUCCESS;
425
426         DEBUGFUNC("ixgbe_read_eerd_buffer_X540");
427         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
428             IXGBE_SUCCESS) {
429                 status = ixgbe_read_eerd_buffer_generic(hw, offset,
430                                                         words, data);
431                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
432         } else {
433                 status = IXGBE_ERR_SWFW_SYNC;
434         }
435
436         return status;
437 }
438
439 /**
440  *  ixgbe_write_eewr_X540 - Write EEPROM word using EEWR
441  *  @hw: pointer to hardware structure
442  *  @offset: offset of  word in the EEPROM to write
443  *  @data: word write to the EEPROM
444  *
445  *  Write a 16 bit word to the EEPROM using the EEWR register.
446  **/
447 s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
448 {
449         s32 status = IXGBE_SUCCESS;
450
451         DEBUGFUNC("ixgbe_write_eewr_X540");
452         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
453             IXGBE_SUCCESS) {
454                 status = ixgbe_write_eewr_generic(hw, offset, data);
455                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
456         } else {
457                 status = IXGBE_ERR_SWFW_SYNC;
458         }
459
460         return status;
461 }
462
463 /**
464  *  ixgbe_write_eewr_buffer_X540 - Write EEPROM word(s) using EEWR
465  *  @hw: pointer to hardware structure
466  *  @offset: offset of  word in the EEPROM to write
467  *  @words: number of words
468  *  @data: word(s) write to the EEPROM
469  *
470  *  Write a 16 bit word(s) to the EEPROM using the EEWR register.
471  **/
472 s32 ixgbe_write_eewr_buffer_X540(struct ixgbe_hw *hw,
473                                  u16 offset, u16 words, u16 *data)
474 {
475         s32 status = IXGBE_SUCCESS;
476
477         DEBUGFUNC("ixgbe_write_eewr_buffer_X540");
478         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
479             IXGBE_SUCCESS) {
480                 status = ixgbe_write_eewr_buffer_generic(hw, offset,
481                                                          words, data);
482                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
483         } else {
484                 status = IXGBE_ERR_SWFW_SYNC;
485         }
486
487         return status;
488 }
489
490 /**
491  *  ixgbe_calc_eeprom_checksum_X540 - Calculates and returns the checksum
492  *
493  *  This function does not use synchronization for EERD and EEWR. It can
494  *  be used internally by function which utilize ixgbe_acquire_swfw_sync_X540.
495  *
496  *  @hw: pointer to hardware structure
497  *
498  *  Returns a negative error code on error, or the 16-bit checksum
499  **/
500 s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
501 {
502         u16 i, j;
503         u16 checksum = 0;
504         u16 length = 0;
505         u16 pointer = 0;
506         u16 word = 0;
507         u16 ptr_start = IXGBE_PCIE_ANALOG_PTR;
508
509         /* Do not use hw->eeprom.ops.read because we do not want to take
510          * the synchronization semaphores here. Instead use
511          * ixgbe_read_eerd_generic
512          */
513
514         DEBUGFUNC("ixgbe_calc_eeprom_checksum_X540");
515
516         /* Include 0x0 up to IXGBE_EEPROM_CHECKSUM; do not include the
517          * checksum itself
518          */
519         for (i = 0; i < IXGBE_EEPROM_CHECKSUM; i++) {
520                 if (ixgbe_read_eerd_generic(hw, i, &word)) {
521                         DEBUGOUT("EEPROM read failed\n");
522                         return IXGBE_ERR_EEPROM;
523                 }
524                 checksum += word;
525         }
526
527         /* Include all data from pointers 0x3, 0x6-0xE.  This excludes the
528          * FW, PHY module, and PCIe Expansion/Option ROM pointers.
529          */
530         for (i = ptr_start; i < IXGBE_FW_PTR; i++) {
531                 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
532                         continue;
533
534                 if (ixgbe_read_eerd_generic(hw, i, &pointer)) {
535                         DEBUGOUT("EEPROM read failed\n");
536                         return IXGBE_ERR_EEPROM;
537                 }
538
539                 /* Skip pointer section if the pointer is invalid. */
540                 if (pointer == 0xFFFF || pointer == 0 ||
541                     pointer >= hw->eeprom.word_size)
542                         continue;
543
544                 if (ixgbe_read_eerd_generic(hw, pointer, &length)) {
545                         DEBUGOUT("EEPROM read failed\n");
546                         return IXGBE_ERR_EEPROM;
547                 }
548
549                 /* Skip pointer section if length is invalid. */
550                 if (length == 0xFFFF || length == 0 ||
551                     (pointer + length) >= hw->eeprom.word_size)
552                         continue;
553
554                 for (j = pointer + 1; j <= pointer + length; j++) {
555                         if (ixgbe_read_eerd_generic(hw, j, &word)) {
556                                 DEBUGOUT("EEPROM read failed\n");
557                                 return IXGBE_ERR_EEPROM;
558                         }
559                         checksum += word;
560                 }
561         }
562
563         checksum = (u16)IXGBE_EEPROM_SUM - checksum;
564
565         return (s32)checksum;
566 }
567
568 /**
569  *  ixgbe_validate_eeprom_checksum_X540 - Validate EEPROM checksum
570  *  @hw: pointer to hardware structure
571  *  @checksum_val: calculated checksum
572  *
573  *  Performs checksum calculation and validates the EEPROM checksum.  If the
574  *  caller does not need checksum_val, the value can be NULL.
575  **/
576 s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
577                                         u16 *checksum_val)
578 {
579         s32 status;
580         u16 checksum;
581         u16 read_checksum = 0;
582
583         DEBUGFUNC("ixgbe_validate_eeprom_checksum_X540");
584
585         /* Read the first word from the EEPROM. If this times out or fails, do
586          * not continue or we could be in for a very long wait while every
587          * EEPROM read fails
588          */
589         status = hw->eeprom.ops.read(hw, 0, &checksum);
590         if (status) {
591                 DEBUGOUT("EEPROM read failed\n");
592                 return status;
593         }
594
595         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
596                 return IXGBE_ERR_SWFW_SYNC;
597
598         status = hw->eeprom.ops.calc_checksum(hw);
599         if (status < 0)
600                 goto out;
601
602         checksum = (u16)(status & 0xffff);
603
604         /* Do not use hw->eeprom.ops.read because we do not want to take
605          * the synchronization semaphores twice here.
606          */
607         status = ixgbe_read_eerd_generic(hw, IXGBE_EEPROM_CHECKSUM,
608                                          &read_checksum);
609         if (status)
610                 goto out;
611
612         /* Verify read checksum from EEPROM is the same as
613          * calculated checksum
614          */
615         if (read_checksum != checksum) {
616                 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
617                              "Invalid EEPROM checksum");
618                 status = IXGBE_ERR_EEPROM_CHECKSUM;
619         }
620
621         /* If the user cares, return the calculated checksum */
622         if (checksum_val)
623                 *checksum_val = checksum;
624
625 out:
626         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
627
628         return status;
629 }
630
631 /**
632  * ixgbe_update_eeprom_checksum_X540 - Updates the EEPROM checksum and flash
633  * @hw: pointer to hardware structure
634  *
635  * After writing EEPROM to shadow RAM using EEWR register, software calculates
636  * checksum and updates the EEPROM and instructs the hardware to update
637  * the flash.
638  **/
639 s32 ixgbe_update_eeprom_checksum_X540(struct ixgbe_hw *hw)
640 {
641         s32 status;
642         u16 checksum;
643
644         DEBUGFUNC("ixgbe_update_eeprom_checksum_X540");
645
646         /* Read the first word from the EEPROM. If this times out or fails, do
647          * not continue or we could be in for a very long wait while every
648          * EEPROM read fails
649          */
650         status = hw->eeprom.ops.read(hw, 0, &checksum);
651         if (status) {
652                 DEBUGOUT("EEPROM read failed\n");
653                 return status;
654         }
655
656         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
657                 return IXGBE_ERR_SWFW_SYNC;
658
659         status = hw->eeprom.ops.calc_checksum(hw);
660         if (status < 0)
661                 goto out;
662
663         checksum = (u16)(status & 0xffff);
664
665         /* Do not use hw->eeprom.ops.write because we do not want to
666          * take the synchronization semaphores twice here.
667          */
668         status = ixgbe_write_eewr_generic(hw, IXGBE_EEPROM_CHECKSUM, checksum);
669         if (status)
670                 goto out;
671
672         status = ixgbe_update_flash_X540(hw);
673
674 out:
675         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
676
677         return status;
678 }
679
680 /**
681  *  ixgbe_update_flash_X540 - Instruct HW to copy EEPROM to Flash device
682  *  @hw: pointer to hardware structure
683  *
684  *  Set FLUP (bit 23) of the EEC register to instruct Hardware to copy
685  *  EEPROM from shadow RAM to the flash device.
686  **/
687 s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
688 {
689         u32 flup;
690         s32 status;
691
692         DEBUGFUNC("ixgbe_update_flash_X540");
693
694         status = ixgbe_poll_flash_update_done_X540(hw);
695         if (status == IXGBE_ERR_EEPROM) {
696                 DEBUGOUT("Flash update time out\n");
697                 goto out;
698         }
699
700         flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw)) | IXGBE_EEC_FLUP;
701         IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
702
703         status = ixgbe_poll_flash_update_done_X540(hw);
704         if (status == IXGBE_SUCCESS)
705                 DEBUGOUT("Flash update complete\n");
706         else
707                 DEBUGOUT("Flash update time out\n");
708
709         if (hw->mac.type == ixgbe_mac_X540 && hw->revision_id == 0) {
710                 flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
711
712                 if (flup & IXGBE_EEC_SEC1VAL) {
713                         flup |= IXGBE_EEC_FLUP;
714                         IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
715                 }
716
717                 status = ixgbe_poll_flash_update_done_X540(hw);
718                 if (status == IXGBE_SUCCESS)
719                         DEBUGOUT("Flash update complete\n");
720                 else
721                         DEBUGOUT("Flash update time out\n");
722         }
723 out:
724         return status;
725 }
726
727 /**
728  *  ixgbe_poll_flash_update_done_X540 - Poll flash update status
729  *  @hw: pointer to hardware structure
730  *
731  *  Polls the FLUDONE (bit 26) of the EEC Register to determine when the
732  *  flash update is done.
733  **/
734 static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
735 {
736         u32 i;
737         u32 reg;
738         s32 status = IXGBE_ERR_EEPROM;
739
740         DEBUGFUNC("ixgbe_poll_flash_update_done_X540");
741
742         for (i = 0; i < IXGBE_FLUDONE_ATTEMPTS; i++) {
743                 reg = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
744                 if (reg & IXGBE_EEC_FLUDONE) {
745                         status = IXGBE_SUCCESS;
746                         break;
747                 }
748                 msec_delay(5);
749         }
750
751         if (i == IXGBE_FLUDONE_ATTEMPTS)
752                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
753                              "Flash update status polling timed out");
754
755         return status;
756 }
757
758 /**
759  *  ixgbe_acquire_swfw_sync_X540 - Acquire SWFW semaphore
760  *  @hw: pointer to hardware structure
761  *  @mask: Mask to specify which semaphore to acquire
762  *
763  *  Acquires the SWFW semaphore thought the SW_FW_SYNC register for
764  *  the specified function (CSR, PHY0, PHY1, NVM, Flash)
765  **/
766 s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
767 {
768         u32 swmask = mask & IXGBE_GSSR_NVM_PHY_MASK;
769         u32 fwmask = swmask << 5;
770         u32 swi2c_mask = mask & IXGBE_GSSR_I2C_MASK;
771         u32 timeout = 200;
772         u32 hwmask = 0;
773         u32 swfw_sync;
774         u32 i;
775
776         DEBUGFUNC("ixgbe_acquire_swfw_sync_X540");
777
778         if (swmask & IXGBE_GSSR_EEP_SM)
779                 hwmask |= IXGBE_GSSR_FLASH_SM;
780
781         /* SW only mask doesn't have FW bit pair */
782         if (mask & IXGBE_GSSR_SW_MNG_SM)
783                 swmask |= IXGBE_GSSR_SW_MNG_SM;
784
785         swmask |= swi2c_mask;
786         fwmask |= swi2c_mask << 2;
787         for (i = 0; i < timeout; i++) {
788                 /* SW NVM semaphore bit is used for access to all
789                  * SW_FW_SYNC bits (not just NVM)
790                  */
791                 if (ixgbe_get_swfw_sync_semaphore(hw)) {
792                         DEBUGOUT("Failed to get NVM access and register semaphore, returning IXGBE_ERR_SWFW_SYNC\n");
793                         return IXGBE_ERR_SWFW_SYNC;
794                 }
795
796                 swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
797                 if (!(swfw_sync & (fwmask | swmask | hwmask))) {
798                         swfw_sync |= swmask;
799                         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw),
800                                         swfw_sync);
801                         ixgbe_release_swfw_sync_semaphore(hw);
802                         return IXGBE_SUCCESS;
803                 }
804                 /* Firmware currently using resource (fwmask), hardware
805                  * currently using resource (hwmask), or other software
806                  * thread currently using resource (swmask)
807                  */
808                 ixgbe_release_swfw_sync_semaphore(hw);
809                 msec_delay(5);
810         }
811
812         /* If the resource is not released by the FW/HW the SW can assume that
813          * the FW/HW malfunctions. In that case the SW should set the SW bit(s)
814          * of the requested resource(s) while ignoring the corresponding FW/HW
815          * bits in the SW_FW_SYNC register.
816          */
817         if (ixgbe_get_swfw_sync_semaphore(hw)) {
818                 DEBUGOUT("Failed to get NVM sempahore and register semaphore while forcefully ignoring FW sempahore bit(s) and setting SW semaphore bit(s), returning IXGBE_ERR_SWFW_SYNC\n");
819                 return IXGBE_ERR_SWFW_SYNC;
820         }
821         swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
822         if (swfw_sync & (fwmask | hwmask)) {
823                 swfw_sync |= swmask;
824                 IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
825                 ixgbe_release_swfw_sync_semaphore(hw);
826                 msec_delay(5);
827                 return IXGBE_SUCCESS;
828         }
829         /* If the resource is not released by other SW the SW can assume that
830          * the other SW malfunctions. In that case the SW should clear all SW
831          * flags that it does not own and then repeat the whole process once
832          * again.
833          */
834         if (swfw_sync & swmask) {
835                 u32 rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
836                             IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
837                             IXGBE_GSSR_SW_MNG_SM;
838
839                 if (swi2c_mask)
840                         rmask |= IXGBE_GSSR_I2C_MASK;
841                 ixgbe_release_swfw_sync_X540(hw, rmask);
842                 ixgbe_release_swfw_sync_semaphore(hw);
843                 DEBUGOUT("Resource not released by other SW, returning IXGBE_ERR_SWFW_SYNC\n");
844                 return IXGBE_ERR_SWFW_SYNC;
845         }
846         ixgbe_release_swfw_sync_semaphore(hw);
847         DEBUGOUT("Returning error IXGBE_ERR_SWFW_SYNC\n");
848
849         return IXGBE_ERR_SWFW_SYNC;
850 }
851
852 /**
853  *  ixgbe_release_swfw_sync_X540 - Release SWFW semaphore
854  *  @hw: pointer to hardware structure
855  *  @mask: Mask to specify which semaphore to release
856  *
857  *  Releases the SWFW semaphore through the SW_FW_SYNC register
858  *  for the specified function (CSR, PHY0, PHY1, EVM, Flash)
859  **/
860 void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
861 {
862         u32 swmask = mask & (IXGBE_GSSR_NVM_PHY_MASK | IXGBE_GSSR_SW_MNG_SM);
863         u32 swfw_sync;
864
865         DEBUGFUNC("ixgbe_release_swfw_sync_X540");
866
867         if (mask & IXGBE_GSSR_I2C_MASK)
868                 swmask |= mask & IXGBE_GSSR_I2C_MASK;
869         ixgbe_get_swfw_sync_semaphore(hw);
870
871         swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
872         swfw_sync &= ~swmask;
873         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
874
875         ixgbe_release_swfw_sync_semaphore(hw);
876         msec_delay(2);
877 }
878
879 /**
880  *  ixgbe_get_swfw_sync_semaphore - Get hardware semaphore
881  *  @hw: pointer to hardware structure
882  *
883  *  Sets the hardware semaphores so SW/FW can gain control of shared resources
884  **/
885 static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
886 {
887         s32 status = IXGBE_ERR_EEPROM;
888         u32 timeout = 2000;
889         u32 i;
890         u32 swsm;
891
892         DEBUGFUNC("ixgbe_get_swfw_sync_semaphore");
893
894         /* Get SMBI software semaphore between device drivers first */
895         for (i = 0; i < timeout; i++) {
896                 /*
897                  * If the SMBI bit is 0 when we read it, then the bit will be
898                  * set and we have the semaphore
899                  */
900                 swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
901                 if (!(swsm & IXGBE_SWSM_SMBI)) {
902                         status = IXGBE_SUCCESS;
903                         break;
904                 }
905                 usec_delay(50);
906         }
907
908         /* Now get the semaphore between SW/FW through the REGSMP bit */
909         if (status == IXGBE_SUCCESS) {
910                 for (i = 0; i < timeout; i++) {
911                         swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
912                         if (!(swsm & IXGBE_SWFW_REGSMP))
913                                 break;
914
915                         usec_delay(50);
916                 }
917
918                 /*
919                  * Release semaphores and return error if SW NVM semaphore
920                  * was not granted because we don't have access to the EEPROM
921                  */
922                 if (i >= timeout) {
923                         ERROR_REPORT1(IXGBE_ERROR_POLLING,
924                                 "REGSMP Software NVM semaphore not granted.\n");
925                         ixgbe_release_swfw_sync_semaphore(hw);
926                         status = IXGBE_ERR_EEPROM;
927                 }
928         } else {
929                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
930                              "Software semaphore SMBI between device drivers "
931                              "not granted.\n");
932         }
933
934         return status;
935 }
936
937 /**
938  *  ixgbe_release_swfw_sync_semaphore - Release hardware semaphore
939  *  @hw: pointer to hardware structure
940  *
941  *  This function clears hardware semaphore bits.
942  **/
943 static void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw)
944 {
945         u32 swsm;
946
947         DEBUGFUNC("ixgbe_release_swfw_sync_semaphore");
948
949         /* Release both semaphores by writing 0 to the bits REGSMP and SMBI */
950
951         swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
952         swsm &= ~IXGBE_SWFW_REGSMP;
953         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swsm);
954
955         swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
956         swsm &= ~IXGBE_SWSM_SMBI;
957         IXGBE_WRITE_REG(hw, IXGBE_SWSM_BY_MAC(hw), swsm);
958
959         IXGBE_WRITE_FLUSH(hw);
960 }
961
962 /**
963  *  ixgbe_init_swfw_sync_X540 - Release hardware semaphore
964  *  @hw: pointer to hardware structure
965  *
966  *  This function reset hardware semaphore bits for a semaphore that may
967  *  have be left locked due to a catastrophic failure.
968  **/
969 void ixgbe_init_swfw_sync_X540(struct ixgbe_hw *hw)
970 {
971         u32 rmask;
972
973         /* First try to grab the semaphore but we don't need to bother
974          * looking to see whether we got the lock or not since we do
975          * the same thing regardless of whether we got the lock or not.
976          * We got the lock - we release it.
977          * We timeout trying to get the lock - we force its release.
978          */
979         ixgbe_get_swfw_sync_semaphore(hw);
980         ixgbe_release_swfw_sync_semaphore(hw);
981
982         /* Acquire and release all software resources. */
983         rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
984                 IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
985                 IXGBE_GSSR_SW_MNG_SM;
986
987         rmask |= IXGBE_GSSR_I2C_MASK;
988         ixgbe_acquire_swfw_sync_X540(hw, rmask);
989         ixgbe_release_swfw_sync_X540(hw, rmask);
990 }
991
992 /**
993  * ixgbe_blink_led_start_X540 - Blink LED based on index.
994  * @hw: pointer to hardware structure
995  * @index: led number to blink
996  *
997  * Devices that implement the version 2 interface:
998  *   X540
999  **/
1000 s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index)
1001 {
1002         u32 macc_reg;
1003         u32 ledctl_reg;
1004         ixgbe_link_speed speed;
1005         bool link_up;
1006
1007         DEBUGFUNC("ixgbe_blink_led_start_X540");
1008
1009         if (index > 3)
1010                 return IXGBE_ERR_PARAM;
1011
1012         /*
1013          * Link should be up in order for the blink bit in the LED control
1014          * register to work. Force link and speed in the MAC if link is down.
1015          * This will be reversed when we stop the blinking.
1016          */
1017         hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
1018         if (link_up == FALSE) {
1019                 macc_reg = IXGBE_READ_REG(hw, IXGBE_MACC);
1020                 macc_reg |= IXGBE_MACC_FLU | IXGBE_MACC_FSV_10G | IXGBE_MACC_FS;
1021                 IXGBE_WRITE_REG(hw, IXGBE_MACC, macc_reg);
1022         }
1023         /* Set the LED to LINK_UP + BLINK. */
1024         ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
1025         ledctl_reg &= ~IXGBE_LED_MODE_MASK(index);
1026         ledctl_reg |= IXGBE_LED_BLINK(index);
1027         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ledctl_reg);
1028         IXGBE_WRITE_FLUSH(hw);
1029
1030         return IXGBE_SUCCESS;
1031 }
1032
1033 /**
1034  * ixgbe_blink_led_stop_X540 - Stop blinking LED based on index.
1035  * @hw: pointer to hardware structure
1036  * @index: led number to stop blinking
1037  *
1038  * Devices that implement the version 2 interface:
1039  *   X540
1040  **/
1041 s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index)
1042 {
1043         u32 macc_reg;
1044         u32 ledctl_reg;
1045
1046         if (index > 3)
1047                 return IXGBE_ERR_PARAM;
1048
1049         DEBUGFUNC("ixgbe_blink_led_stop_X540");
1050
1051         /* Restore the LED to its default value. */
1052         ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
1053         ledctl_reg &= ~IXGBE_LED_MODE_MASK(index);
1054         ledctl_reg |= IXGBE_LED_LINK_ACTIVE << IXGBE_LED_MODE_SHIFT(index);
1055         ledctl_reg &= ~IXGBE_LED_BLINK(index);
1056         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ledctl_reg);
1057
1058         /* Unforce link and speed in the MAC. */
1059         macc_reg = IXGBE_READ_REG(hw, IXGBE_MACC);
1060         macc_reg &= ~(IXGBE_MACC_FLU | IXGBE_MACC_FSV_10G | IXGBE_MACC_FS);
1061         IXGBE_WRITE_REG(hw, IXGBE_MACC, macc_reg);
1062         IXGBE_WRITE_FLUSH(hw);
1063
1064         return IXGBE_SUCCESS;
1065 }