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