1 1.32 msaitoh /* $NetBSD: ixgbe_82599.c,v 1.32 2023/10/06 14:48:08 msaitoh Exp $ */ 2 1.15 msaitoh 3 1.1 dyoung /****************************************************************************** 4 1.16 msaitoh SPDX-License-Identifier: BSD-3-Clause 5 1.1 dyoung 6 1.28 msaitoh Copyright (c) 2001-2020, Intel Corporation 7 1.1 dyoung All rights reserved. 8 1.15 msaitoh 9 1.15 msaitoh Redistribution and use in source and binary forms, with or without 10 1.1 dyoung modification, are permitted provided that the following conditions are met: 11 1.15 msaitoh 12 1.15 msaitoh 1. Redistributions of source code must retain the above copyright notice, 13 1.1 dyoung this list of conditions and the following disclaimer. 14 1.15 msaitoh 15 1.15 msaitoh 2. Redistributions in binary form must reproduce the above copyright 16 1.15 msaitoh notice, this list of conditions and the following disclaimer in the 17 1.1 dyoung documentation and/or other materials provided with the distribution. 18 1.15 msaitoh 19 1.15 msaitoh 3. Neither the name of the Intel Corporation nor the names of its 20 1.15 msaitoh contributors may be used to endorse or promote products derived from 21 1.1 dyoung this software without specific prior written permission. 22 1.15 msaitoh 23 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 24 1.15 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 1.15 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 1.15 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 27 1.15 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 1.15 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 1.15 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 1.15 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 1.15 msaitoh CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 1.1 dyoung POSSIBILITY OF SUCH DAMAGE. 34 1.1 dyoung 35 1.1 dyoung ******************************************************************************/ 36 1.19 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82599.c 331224 2018-03-19 20:55:05Z erj $*/ 37 1.1 dyoung 38 1.23 msaitoh #include <sys/cdefs.h> 39 1.32 msaitoh __KERNEL_RCSID(0, "$NetBSD: ixgbe_82599.c,v 1.32 2023/10/06 14:48:08 msaitoh Exp $"); 40 1.23 msaitoh 41 1.1 dyoung #include "ixgbe_type.h" 42 1.6 msaitoh #include "ixgbe_82599.h" 43 1.1 dyoung #include "ixgbe_api.h" 44 1.1 dyoung #include "ixgbe_common.h" 45 1.1 dyoung #include "ixgbe_phy.h" 46 1.1 dyoung 47 1.12 msaitoh #define IXGBE_82599_MAX_TX_QUEUES 128 48 1.12 msaitoh #define IXGBE_82599_MAX_RX_QUEUES 128 49 1.12 msaitoh #define IXGBE_82599_RAR_ENTRIES 128 50 1.12 msaitoh #define IXGBE_82599_MC_TBL_SIZE 128 51 1.12 msaitoh #define IXGBE_82599_VFT_TBL_SIZE 128 52 1.12 msaitoh #define IXGBE_82599_RX_PB_SIZE 512 53 1.12 msaitoh 54 1.1 dyoung static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw, 55 1.6 msaitoh ixgbe_link_speed speed, 56 1.6 msaitoh bool autoneg_wait_to_complete); 57 1.1 dyoung static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); 58 1.6 msaitoh static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw, 59 1.6 msaitoh u16 offset, u16 *data); 60 1.6 msaitoh static s32 ixgbe_read_eeprom_buffer_82599(struct ixgbe_hw *hw, u16 offset, 61 1.6 msaitoh u16 words, u16 *data); 62 1.17 msaitoh static s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw); 63 1.12 msaitoh static s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset, 64 1.12 msaitoh u8 dev_addr, u8 *data); 65 1.12 msaitoh static s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset, 66 1.12 msaitoh u8 dev_addr, u8 data); 67 1.9 msaitoh 68 1.1 dyoung void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) 69 1.1 dyoung { 70 1.1 dyoung struct ixgbe_mac_info *mac = &hw->mac; 71 1.1 dyoung 72 1.1 dyoung DEBUGFUNC("ixgbe_init_mac_link_ops_82599"); 73 1.1 dyoung 74 1.9 msaitoh /* 75 1.9 msaitoh * enable the laser control functions for SFP+ fiber 76 1.9 msaitoh * and MNG not enabled 77 1.9 msaitoh */ 78 1.9 msaitoh if ((mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) && 79 1.12 msaitoh !ixgbe_mng_enabled(hw)) { 80 1.1 dyoung mac->ops.disable_tx_laser = 81 1.12 msaitoh ixgbe_disable_tx_laser_multispeed_fiber; 82 1.1 dyoung mac->ops.enable_tx_laser = 83 1.12 msaitoh ixgbe_enable_tx_laser_multispeed_fiber; 84 1.12 msaitoh mac->ops.flap_tx_laser = ixgbe_flap_tx_laser_multispeed_fiber; 85 1.1 dyoung 86 1.1 dyoung } else { 87 1.1 dyoung mac->ops.disable_tx_laser = NULL; 88 1.1 dyoung mac->ops.enable_tx_laser = NULL; 89 1.1 dyoung mac->ops.flap_tx_laser = NULL; 90 1.1 dyoung } 91 1.1 dyoung 92 1.1 dyoung if (hw->phy.multispeed_fiber) { 93 1.1 dyoung /* Set up dual speed SFP+ support */ 94 1.12 msaitoh mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber; 95 1.12 msaitoh mac->ops.setup_mac_link = ixgbe_setup_mac_link_82599; 96 1.12 msaitoh mac->ops.set_rate_select_speed = 97 1.12 msaitoh ixgbe_set_hard_rate_select_speed; 98 1.12 msaitoh if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber_fixed) 99 1.12 msaitoh mac->ops.set_rate_select_speed = 100 1.12 msaitoh ixgbe_set_soft_rate_select_speed; 101 1.1 dyoung } else { 102 1.1 dyoung if ((ixgbe_get_media_type(hw) == ixgbe_media_type_backplane) && 103 1.1 dyoung (hw->phy.smart_speed == ixgbe_smart_speed_auto || 104 1.1 dyoung hw->phy.smart_speed == ixgbe_smart_speed_on) && 105 1.1 dyoung !ixgbe_verify_lesm_fw_enabled_82599(hw)) { 106 1.12 msaitoh mac->ops.setup_link = ixgbe_setup_mac_link_smartspeed; 107 1.1 dyoung } else { 108 1.12 msaitoh mac->ops.setup_link = ixgbe_setup_mac_link_82599; 109 1.1 dyoung } 110 1.1 dyoung } 111 1.1 dyoung } 112 1.1 dyoung 113 1.1 dyoung /** 114 1.26 msaitoh * ixgbe_init_phy_ops_82599 - PHY/SFP specific init 115 1.26 msaitoh * @hw: pointer to hardware structure 116 1.1 dyoung * 117 1.26 msaitoh * Initialize any function pointers that were not able to be 118 1.26 msaitoh * set during init_shared_code because the PHY/SFP type was 119 1.26 msaitoh * not known. Perform the SFP init if necessary. 120 1.1 dyoung * 121 1.1 dyoung **/ 122 1.1 dyoung s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) 123 1.1 dyoung { 124 1.1 dyoung struct ixgbe_mac_info *mac = &hw->mac; 125 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy; 126 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 127 1.12 msaitoh u32 esdp; 128 1.1 dyoung 129 1.1 dyoung DEBUGFUNC("ixgbe_init_phy_ops_82599"); 130 1.1 dyoung 131 1.12 msaitoh if (hw->device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP) { 132 1.12 msaitoh /* Store flag indicating I2C bus access control unit. */ 133 1.12 msaitoh hw->phy.qsfp_shared_i2c_bus = TRUE; 134 1.12 msaitoh 135 1.12 msaitoh /* Initialize access to QSFP+ I2C bus */ 136 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 137 1.12 msaitoh esdp |= IXGBE_ESDP_SDP0_DIR; 138 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP1_DIR; 139 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP0; 140 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP0_NATIVE; 141 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP1_NATIVE; 142 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 143 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 144 1.12 msaitoh 145 1.12 msaitoh phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_82599; 146 1.12 msaitoh phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_82599; 147 1.12 msaitoh } 148 1.1 dyoung /* Identify the PHY or SFP module */ 149 1.1 dyoung ret_val = phy->ops.identify(hw); 150 1.1 dyoung if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED) 151 1.1 dyoung goto init_phy_ops_out; 152 1.1 dyoung 153 1.1 dyoung /* Setup function pointers based on detected SFP module and speeds */ 154 1.1 dyoung ixgbe_init_mac_link_ops_82599(hw); 155 1.1 dyoung if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) 156 1.1 dyoung hw->phy.ops.reset = NULL; 157 1.1 dyoung 158 1.1 dyoung /* If copper media, overwrite with copper function pointers */ 159 1.1 dyoung if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { 160 1.12 msaitoh mac->ops.setup_link = ixgbe_setup_copper_link_82599; 161 1.1 dyoung mac->ops.get_link_capabilities = 162 1.12 msaitoh ixgbe_get_copper_link_capabilities_generic; 163 1.1 dyoung } 164 1.1 dyoung 165 1.12 msaitoh /* Set necessary function pointers based on PHY type */ 166 1.1 dyoung switch (hw->phy.type) { 167 1.1 dyoung case ixgbe_phy_tn: 168 1.12 msaitoh phy->ops.setup_link = ixgbe_setup_phy_link_tnx; 169 1.12 msaitoh phy->ops.check_link = ixgbe_check_phy_link_tnx; 170 1.1 dyoung phy->ops.get_firmware_version = 171 1.12 msaitoh ixgbe_get_phy_firmware_version_tnx; 172 1.1 dyoung break; 173 1.1 dyoung default: 174 1.1 dyoung break; 175 1.1 dyoung } 176 1.1 dyoung init_phy_ops_out: 177 1.1 dyoung return ret_val; 178 1.1 dyoung } 179 1.1 dyoung 180 1.1 dyoung s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw) 181 1.1 dyoung { 182 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 183 1.1 dyoung u16 list_offset, data_offset, data_value; 184 1.1 dyoung 185 1.1 dyoung DEBUGFUNC("ixgbe_setup_sfp_modules_82599"); 186 1.1 dyoung 187 1.1 dyoung if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) { 188 1.1 dyoung ixgbe_init_mac_link_ops_82599(hw); 189 1.1 dyoung 190 1.1 dyoung hw->phy.ops.reset = NULL; 191 1.1 dyoung 192 1.1 dyoung ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset, 193 1.6 msaitoh &data_offset); 194 1.1 dyoung if (ret_val != IXGBE_SUCCESS) 195 1.1 dyoung goto setup_sfp_out; 196 1.1 dyoung 197 1.1 dyoung /* PHY config will finish before releasing the semaphore */ 198 1.6 msaitoh ret_val = hw->mac.ops.acquire_swfw_sync(hw, 199 1.6 msaitoh IXGBE_GSSR_MAC_CSR_SM); 200 1.1 dyoung if (ret_val != IXGBE_SUCCESS) { 201 1.1 dyoung ret_val = IXGBE_ERR_SWFW_SYNC; 202 1.1 dyoung goto setup_sfp_out; 203 1.1 dyoung } 204 1.1 dyoung 205 1.10 msaitoh if (hw->eeprom.ops.read(hw, ++data_offset, &data_value)) 206 1.10 msaitoh goto setup_sfp_err; 207 1.1 dyoung while (data_value != 0xffff) { 208 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_CORECTL, data_value); 209 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 210 1.10 msaitoh if (hw->eeprom.ops.read(hw, ++data_offset, &data_value)) 211 1.10 msaitoh goto setup_sfp_err; 212 1.1 dyoung } 213 1.1 dyoung 214 1.1 dyoung /* Release the semaphore */ 215 1.6 msaitoh hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); 216 1.12 msaitoh /* Delay obtaining semaphore again to allow FW access 217 1.12 msaitoh * prot_autoc_write uses the semaphore too. 218 1.12 msaitoh */ 219 1.1 dyoung msec_delay(hw->eeprom.semaphore_delay); 220 1.1 dyoung 221 1.9 msaitoh /* Restart DSP and set SFI mode */ 222 1.12 msaitoh ret_val = hw->mac.ops.prot_autoc_write(hw, 223 1.12 msaitoh hw->mac.orig_autoc | IXGBE_AUTOC_LMS_10G_SERIAL, 224 1.12 msaitoh FALSE); 225 1.9 msaitoh 226 1.9 msaitoh if (ret_val) { 227 1.1 dyoung DEBUGOUT("sfp module setup not complete\n"); 228 1.1 dyoung ret_val = IXGBE_ERR_SFP_SETUP_NOT_COMPLETE; 229 1.1 dyoung goto setup_sfp_out; 230 1.1 dyoung } 231 1.1 dyoung 232 1.1 dyoung } 233 1.1 dyoung 234 1.1 dyoung setup_sfp_out: 235 1.1 dyoung return ret_val; 236 1.10 msaitoh 237 1.10 msaitoh setup_sfp_err: 238 1.10 msaitoh /* Release the semaphore */ 239 1.10 msaitoh hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); 240 1.10 msaitoh /* Delay obtaining semaphore again to allow FW access */ 241 1.10 msaitoh msec_delay(hw->eeprom.semaphore_delay); 242 1.10 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 243 1.10 msaitoh "eeprom read at offset %d failed", data_offset); 244 1.10 msaitoh return IXGBE_ERR_PHY; 245 1.1 dyoung } 246 1.1 dyoung 247 1.1 dyoung /** 248 1.26 msaitoh * prot_autoc_read_82599 - Hides MAC differences needed for AUTOC read 249 1.26 msaitoh * @hw: pointer to hardware structure 250 1.26 msaitoh * @locked: Return the if we locked for this read. 251 1.26 msaitoh * @reg_val: Value we read from AUTOC 252 1.26 msaitoh * 253 1.26 msaitoh * For this part (82599) we need to wrap read-modify-writes with a possible 254 1.26 msaitoh * FW/SW lock. It is assumed this lock will be freed with the next 255 1.26 msaitoh * prot_autoc_write_82599(). 256 1.12 msaitoh */ 257 1.12 msaitoh s32 prot_autoc_read_82599(struct ixgbe_hw *hw, bool *locked, u32 *reg_val) 258 1.12 msaitoh { 259 1.12 msaitoh s32 ret_val; 260 1.12 msaitoh 261 1.12 msaitoh *locked = FALSE; 262 1.12 msaitoh /* If LESM is on then we need to hold the SW/FW semaphore. */ 263 1.12 msaitoh if (ixgbe_verify_lesm_fw_enabled_82599(hw)) { 264 1.12 msaitoh ret_val = hw->mac.ops.acquire_swfw_sync(hw, 265 1.12 msaitoh IXGBE_GSSR_MAC_CSR_SM); 266 1.12 msaitoh if (ret_val != IXGBE_SUCCESS) 267 1.12 msaitoh return IXGBE_ERR_SWFW_SYNC; 268 1.12 msaitoh 269 1.12 msaitoh *locked = TRUE; 270 1.12 msaitoh } 271 1.12 msaitoh 272 1.12 msaitoh *reg_val = IXGBE_READ_REG(hw, IXGBE_AUTOC); 273 1.12 msaitoh return IXGBE_SUCCESS; 274 1.12 msaitoh } 275 1.12 msaitoh 276 1.12 msaitoh /** 277 1.12 msaitoh * prot_autoc_write_82599 - Hides MAC differences needed for AUTOC write 278 1.12 msaitoh * @hw: pointer to hardware structure 279 1.19 msaitoh * @autoc: value to write to AUTOC 280 1.12 msaitoh * @locked: bool to indicate whether the SW/FW lock was already taken by 281 1.26 msaitoh * previous proc_autoc_read_82599. 282 1.12 msaitoh * 283 1.12 msaitoh * This part (82599) may need to hold the SW/FW lock around all writes to 284 1.12 msaitoh * AUTOC. Likewise after a write we need to do a pipeline reset. 285 1.12 msaitoh */ 286 1.12 msaitoh s32 prot_autoc_write_82599(struct ixgbe_hw *hw, u32 autoc, bool locked) 287 1.12 msaitoh { 288 1.12 msaitoh s32 ret_val = IXGBE_SUCCESS; 289 1.12 msaitoh 290 1.12 msaitoh /* Blocked by MNG FW so bail */ 291 1.12 msaitoh if (ixgbe_check_reset_blocked(hw)) 292 1.12 msaitoh goto out; 293 1.12 msaitoh 294 1.12 msaitoh /* We only need to get the lock if: 295 1.12 msaitoh * - We didn't do it already (in the read part of a read-modify-write) 296 1.12 msaitoh * - LESM is enabled. 297 1.12 msaitoh */ 298 1.12 msaitoh if (!locked && ixgbe_verify_lesm_fw_enabled_82599(hw)) { 299 1.12 msaitoh ret_val = hw->mac.ops.acquire_swfw_sync(hw, 300 1.12 msaitoh IXGBE_GSSR_MAC_CSR_SM); 301 1.12 msaitoh if (ret_val != IXGBE_SUCCESS) 302 1.12 msaitoh return IXGBE_ERR_SWFW_SYNC; 303 1.12 msaitoh 304 1.12 msaitoh locked = TRUE; 305 1.12 msaitoh } 306 1.12 msaitoh 307 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); 308 1.12 msaitoh ret_val = ixgbe_reset_pipeline_82599(hw); 309 1.12 msaitoh 310 1.12 msaitoh out: 311 1.12 msaitoh /* Free the SW/FW semaphore as we either grabbed it here or 312 1.12 msaitoh * already had it when this function was called. 313 1.12 msaitoh */ 314 1.12 msaitoh if (locked) 315 1.12 msaitoh hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); 316 1.12 msaitoh 317 1.12 msaitoh return ret_val; 318 1.12 msaitoh } 319 1.12 msaitoh 320 1.12 msaitoh /** 321 1.26 msaitoh * ixgbe_init_ops_82599 - Inits func ptrs and MAC type 322 1.26 msaitoh * @hw: pointer to hardware structure 323 1.1 dyoung * 324 1.26 msaitoh * Initialize the function pointers and assign the MAC type for 82599. 325 1.26 msaitoh * Does not touch the hardware. 326 1.1 dyoung **/ 327 1.1 dyoung 328 1.1 dyoung s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) 329 1.1 dyoung { 330 1.1 dyoung struct ixgbe_mac_info *mac = &hw->mac; 331 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy; 332 1.6 msaitoh struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 333 1.1 dyoung s32 ret_val; 334 1.29 msaitoh u16 i; 335 1.1 dyoung 336 1.1 dyoung DEBUGFUNC("ixgbe_init_ops_82599"); 337 1.1 dyoung 338 1.9 msaitoh ixgbe_init_phy_ops_generic(hw); 339 1.1 dyoung ret_val = ixgbe_init_ops_generic(hw); 340 1.1 dyoung 341 1.1 dyoung /* PHY */ 342 1.12 msaitoh phy->ops.identify = ixgbe_identify_phy_82599; 343 1.12 msaitoh phy->ops.init = ixgbe_init_phy_ops_82599; 344 1.1 dyoung 345 1.1 dyoung /* MAC */ 346 1.12 msaitoh mac->ops.reset_hw = ixgbe_reset_hw_82599; 347 1.12 msaitoh mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_gen2; 348 1.12 msaitoh mac->ops.get_media_type = ixgbe_get_media_type_82599; 349 1.1 dyoung mac->ops.get_supported_physical_layer = 350 1.12 msaitoh ixgbe_get_supported_physical_layer_82599; 351 1.12 msaitoh mac->ops.disable_sec_rx_path = ixgbe_disable_sec_rx_path_generic; 352 1.12 msaitoh mac->ops.enable_sec_rx_path = ixgbe_enable_sec_rx_path_generic; 353 1.12 msaitoh mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_82599; 354 1.12 msaitoh mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82599; 355 1.12 msaitoh mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82599; 356 1.12 msaitoh mac->ops.start_hw = ixgbe_start_hw_82599; 357 1.12 msaitoh mac->ops.get_san_mac_addr = ixgbe_get_san_mac_addr_generic; 358 1.12 msaitoh mac->ops.set_san_mac_addr = ixgbe_set_san_mac_addr_generic; 359 1.12 msaitoh mac->ops.get_device_caps = ixgbe_get_device_caps_generic; 360 1.12 msaitoh mac->ops.get_wwn_prefix = ixgbe_get_wwn_prefix_generic; 361 1.12 msaitoh mac->ops.get_fcoe_boot_status = ixgbe_get_fcoe_boot_status_generic; 362 1.12 msaitoh mac->ops.prot_autoc_read = prot_autoc_read_82599; 363 1.12 msaitoh mac->ops.prot_autoc_write = prot_autoc_write_82599; 364 1.1 dyoung 365 1.1 dyoung /* RAR, Multicast, VLAN */ 366 1.12 msaitoh mac->ops.set_vmdq = ixgbe_set_vmdq_generic; 367 1.12 msaitoh mac->ops.set_vmdq_san_mac = ixgbe_set_vmdq_san_mac_generic; 368 1.12 msaitoh mac->ops.clear_vmdq = ixgbe_clear_vmdq_generic; 369 1.12 msaitoh mac->ops.insert_mac_addr = ixgbe_insert_mac_addr_generic; 370 1.1 dyoung mac->rar_highwater = 1; 371 1.12 msaitoh mac->ops.set_vfta = ixgbe_set_vfta_generic; 372 1.12 msaitoh mac->ops.set_vlvf = ixgbe_set_vlvf_generic; 373 1.12 msaitoh mac->ops.clear_vfta = ixgbe_clear_vfta_generic; 374 1.12 msaitoh mac->ops.init_uta_tables = ixgbe_init_uta_tables_generic; 375 1.12 msaitoh mac->ops.setup_sfp = ixgbe_setup_sfp_modules_82599; 376 1.12 msaitoh mac->ops.set_mac_anti_spoofing = ixgbe_set_mac_anti_spoofing; 377 1.12 msaitoh mac->ops.set_vlan_anti_spoofing = ixgbe_set_vlan_anti_spoofing; 378 1.1 dyoung 379 1.1 dyoung /* Link */ 380 1.12 msaitoh mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_82599; 381 1.12 msaitoh mac->ops.check_link = ixgbe_check_mac_link_generic; 382 1.12 msaitoh mac->ops.setup_rxpba = ixgbe_set_rxpba_generic; 383 1.1 dyoung ixgbe_init_mac_link_ops_82599(hw); 384 1.1 dyoung 385 1.12 msaitoh mac->mcft_size = IXGBE_82599_MC_TBL_SIZE; 386 1.12 msaitoh mac->vft_size = IXGBE_82599_VFT_TBL_SIZE; 387 1.12 msaitoh mac->num_rar_entries = IXGBE_82599_RAR_ENTRIES; 388 1.12 msaitoh mac->rx_pb_size = IXGBE_82599_RX_PB_SIZE; 389 1.12 msaitoh mac->max_rx_queues = IXGBE_82599_MAX_RX_QUEUES; 390 1.12 msaitoh mac->max_tx_queues = IXGBE_82599_MAX_TX_QUEUES; 391 1.6 msaitoh mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw); 392 1.6 msaitoh 393 1.14 msaitoh mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw)) 394 1.14 msaitoh & IXGBE_FWSM_MODE_MASK); 395 1.1 dyoung 396 1.29 msaitoh for (i = 0; i < 64; i++) 397 1.29 msaitoh hw->mbx.ops[i].init_params = ixgbe_init_mbx_params_pf; 398 1.1 dyoung 399 1.6 msaitoh /* EEPROM */ 400 1.12 msaitoh eeprom->ops.read = ixgbe_read_eeprom_82599; 401 1.12 msaitoh eeprom->ops.read_buffer = ixgbe_read_eeprom_buffer_82599; 402 1.6 msaitoh 403 1.6 msaitoh /* Manageability interface */ 404 1.12 msaitoh mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_generic; 405 1.6 msaitoh 406 1.15 msaitoh mac->ops.bypass_rw = ixgbe_bypass_rw_generic; 407 1.15 msaitoh mac->ops.bypass_valid_rd = ixgbe_bypass_valid_rd_generic; 408 1.15 msaitoh mac->ops.bypass_set = ixgbe_bypass_set_generic; 409 1.15 msaitoh mac->ops.bypass_rd_eep = ixgbe_bypass_rd_eep_generic; 410 1.6 msaitoh 411 1.12 msaitoh mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic; 412 1.10 msaitoh 413 1.1 dyoung return ret_val; 414 1.1 dyoung } 415 1.1 dyoung 416 1.1 dyoung /** 417 1.26 msaitoh * ixgbe_get_link_capabilities_82599 - Determines link capabilities 418 1.26 msaitoh * @hw: pointer to hardware structure 419 1.26 msaitoh * @speed: pointer to link speed 420 1.26 msaitoh * @autoneg: TRUE when autoneg or autotry is enabled 421 1.1 dyoung * 422 1.26 msaitoh * Determines the link capabilities by reading the AUTOC register. 423 1.1 dyoung **/ 424 1.1 dyoung s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, 425 1.6 msaitoh ixgbe_link_speed *speed, 426 1.9 msaitoh bool *autoneg) 427 1.1 dyoung { 428 1.1 dyoung s32 status = IXGBE_SUCCESS; 429 1.1 dyoung u32 autoc = 0; 430 1.1 dyoung 431 1.1 dyoung DEBUGFUNC("ixgbe_get_link_capabilities_82599"); 432 1.1 dyoung 433 1.1 dyoung 434 1.1 dyoung /* Check if 1G SFP module. */ 435 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || 436 1.7 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || 437 1.13 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || 438 1.13 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 || 439 1.7 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || 440 1.7 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) { 441 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 442 1.9 msaitoh *autoneg = TRUE; 443 1.1 dyoung goto out; 444 1.1 dyoung } 445 1.1 dyoung 446 1.1 dyoung /* 447 1.1 dyoung * Determine link capabilities based on the stored value of AUTOC, 448 1.1 dyoung * which represents EEPROM defaults. If AUTOC value has not 449 1.1 dyoung * been stored, use the current register values. 450 1.1 dyoung */ 451 1.1 dyoung if (hw->mac.orig_link_settings_stored) 452 1.1 dyoung autoc = hw->mac.orig_autoc; 453 1.1 dyoung else 454 1.1 dyoung autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 455 1.1 dyoung 456 1.1 dyoung switch (autoc & IXGBE_AUTOC_LMS_MASK) { 457 1.1 dyoung case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: 458 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 459 1.9 msaitoh *autoneg = FALSE; 460 1.1 dyoung break; 461 1.1 dyoung 462 1.1 dyoung case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: 463 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL; 464 1.9 msaitoh *autoneg = FALSE; 465 1.1 dyoung break; 466 1.1 dyoung 467 1.1 dyoung case IXGBE_AUTOC_LMS_1G_AN: 468 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 469 1.9 msaitoh *autoneg = TRUE; 470 1.1 dyoung break; 471 1.1 dyoung 472 1.1 dyoung case IXGBE_AUTOC_LMS_10G_SERIAL: 473 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL; 474 1.9 msaitoh *autoneg = FALSE; 475 1.1 dyoung break; 476 1.1 dyoung 477 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_KX_KR: 478 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN: 479 1.1 dyoung *speed = IXGBE_LINK_SPEED_UNKNOWN; 480 1.1 dyoung if (autoc & IXGBE_AUTOC_KR_SUPP) 481 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL; 482 1.1 dyoung if (autoc & IXGBE_AUTOC_KX4_SUPP) 483 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL; 484 1.1 dyoung if (autoc & IXGBE_AUTOC_KX_SUPP) 485 1.1 dyoung *speed |= IXGBE_LINK_SPEED_1GB_FULL; 486 1.9 msaitoh *autoneg = TRUE; 487 1.1 dyoung break; 488 1.1 dyoung 489 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII: 490 1.1 dyoung *speed = IXGBE_LINK_SPEED_100_FULL; 491 1.1 dyoung if (autoc & IXGBE_AUTOC_KR_SUPP) 492 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL; 493 1.1 dyoung if (autoc & IXGBE_AUTOC_KX4_SUPP) 494 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL; 495 1.1 dyoung if (autoc & IXGBE_AUTOC_KX_SUPP) 496 1.1 dyoung *speed |= IXGBE_LINK_SPEED_1GB_FULL; 497 1.9 msaitoh *autoneg = TRUE; 498 1.1 dyoung break; 499 1.1 dyoung 500 1.1 dyoung case IXGBE_AUTOC_LMS_SGMII_1G_100M: 501 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_100_FULL; 502 1.9 msaitoh *autoneg = FALSE; 503 1.1 dyoung break; 504 1.1 dyoung 505 1.1 dyoung default: 506 1.1 dyoung status = IXGBE_ERR_LINK_SETUP; 507 1.1 dyoung goto out; 508 1.1 dyoung break; 509 1.1 dyoung } 510 1.1 dyoung 511 1.1 dyoung if (hw->phy.multispeed_fiber) { 512 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL | 513 1.6 msaitoh IXGBE_LINK_SPEED_1GB_FULL; 514 1.12 msaitoh 515 1.12 msaitoh /* QSFP must not enable full auto-negotiation 516 1.12 msaitoh * Limited autoneg is enabled at 1G 517 1.12 msaitoh */ 518 1.12 msaitoh if (hw->phy.media_type == ixgbe_media_type_fiber_qsfp) 519 1.12 msaitoh *autoneg = FALSE; 520 1.12 msaitoh else 521 1.12 msaitoh *autoneg = TRUE; 522 1.1 dyoung } 523 1.1 dyoung 524 1.1 dyoung out: 525 1.1 dyoung return status; 526 1.1 dyoung } 527 1.1 dyoung 528 1.1 dyoung /** 529 1.26 msaitoh * ixgbe_get_media_type_82599 - Get media type 530 1.26 msaitoh * @hw: pointer to hardware structure 531 1.1 dyoung * 532 1.26 msaitoh * Returns the media type (fiber, copper, backplane) 533 1.1 dyoung **/ 534 1.1 dyoung enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) 535 1.1 dyoung { 536 1.1 dyoung enum ixgbe_media_type media_type; 537 1.1 dyoung 538 1.1 dyoung DEBUGFUNC("ixgbe_get_media_type_82599"); 539 1.1 dyoung 540 1.1 dyoung /* Detect if there is a copper PHY attached. */ 541 1.1 dyoung switch (hw->phy.type) { 542 1.1 dyoung case ixgbe_phy_cu_unknown: 543 1.1 dyoung case ixgbe_phy_tn: 544 1.1 dyoung media_type = ixgbe_media_type_copper; 545 1.1 dyoung goto out; 546 1.1 dyoung default: 547 1.1 dyoung break; 548 1.1 dyoung } 549 1.1 dyoung 550 1.1 dyoung switch (hw->device_id) { 551 1.1 dyoung case IXGBE_DEV_ID_82599_KX4: 552 1.1 dyoung case IXGBE_DEV_ID_82599_KX4_MEZZ: 553 1.1 dyoung case IXGBE_DEV_ID_82599_COMBO_BACKPLANE: 554 1.6 msaitoh case IXGBE_DEV_ID_82599_KR: 555 1.1 dyoung case IXGBE_DEV_ID_82599_BACKPLANE_FCOE: 556 1.1 dyoung case IXGBE_DEV_ID_82599_XAUI_LOM: 557 1.1 dyoung /* Default device ID is mezzanine card KX/KX4 */ 558 1.1 dyoung media_type = ixgbe_media_type_backplane; 559 1.1 dyoung break; 560 1.1 dyoung case IXGBE_DEV_ID_82599_SFP: 561 1.1 dyoung case IXGBE_DEV_ID_82599_SFP_FCOE: 562 1.7 msaitoh case IXGBE_DEV_ID_82599_SFP_EM: 563 1.4 msaitoh case IXGBE_DEV_ID_82599_SFP_SF2: 564 1.5 msaitoh case IXGBE_DEV_ID_82599_SFP_SF_QP: 565 1.5 msaitoh case IXGBE_DEV_ID_82599EN_SFP: 566 1.1 dyoung media_type = ixgbe_media_type_fiber; 567 1.1 dyoung break; 568 1.1 dyoung case IXGBE_DEV_ID_82599_CX4: 569 1.1 dyoung media_type = ixgbe_media_type_cx4; 570 1.1 dyoung break; 571 1.1 dyoung case IXGBE_DEV_ID_82599_T3_LOM: 572 1.1 dyoung media_type = ixgbe_media_type_copper; 573 1.1 dyoung break; 574 1.31 msaitoh case IXGBE_DEV_ID_82599_LS: 575 1.31 msaitoh media_type = ixgbe_media_type_fiber_lco; 576 1.31 msaitoh break; 577 1.12 msaitoh case IXGBE_DEV_ID_82599_QSFP_SF_QP: 578 1.12 msaitoh media_type = ixgbe_media_type_fiber_qsfp; 579 1.12 msaitoh break; 580 1.9 msaitoh case IXGBE_DEV_ID_82599_BYPASS: 581 1.9 msaitoh media_type = ixgbe_media_type_fiber_fixed; 582 1.9 msaitoh hw->phy.multispeed_fiber = TRUE; 583 1.9 msaitoh break; 584 1.1 dyoung default: 585 1.1 dyoung media_type = ixgbe_media_type_unknown; 586 1.1 dyoung break; 587 1.1 dyoung } 588 1.1 dyoung out: 589 1.1 dyoung return media_type; 590 1.1 dyoung } 591 1.1 dyoung 592 1.1 dyoung /** 593 1.26 msaitoh * ixgbe_stop_mac_link_on_d3_82599 - Disables link on D3 594 1.26 msaitoh * @hw: pointer to hardware structure 595 1.10 msaitoh * 596 1.26 msaitoh * Disables link during D3 power down sequence. 597 1.10 msaitoh * 598 1.10 msaitoh **/ 599 1.10 msaitoh void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw) 600 1.10 msaitoh { 601 1.10 msaitoh u32 autoc2_reg; 602 1.10 msaitoh u16 ee_ctrl_2 = 0; 603 1.10 msaitoh 604 1.10 msaitoh DEBUGFUNC("ixgbe_stop_mac_link_on_d3_82599"); 605 1.10 msaitoh ixgbe_read_eeprom(hw, IXGBE_EEPROM_CTRL_2, &ee_ctrl_2); 606 1.10 msaitoh 607 1.12 msaitoh if (!ixgbe_mng_present(hw) && !hw->wol_enabled && 608 1.12 msaitoh ee_ctrl_2 & IXGBE_EEPROM_CCD_BIT) { 609 1.10 msaitoh autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2); 610 1.10 msaitoh autoc2_reg |= IXGBE_AUTOC2_LINK_DISABLE_ON_D3_MASK; 611 1.10 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg); 612 1.10 msaitoh } 613 1.10 msaitoh } 614 1.10 msaitoh 615 1.10 msaitoh /** 616 1.26 msaitoh * ixgbe_start_mac_link_82599 - Setup MAC link settings 617 1.26 msaitoh * @hw: pointer to hardware structure 618 1.26 msaitoh * @autoneg_wait_to_complete: TRUE when waiting for completion is needed 619 1.1 dyoung * 620 1.26 msaitoh * Configures link settings based on values in the ixgbe_hw struct. 621 1.26 msaitoh * Restarts the link. Performs autonegotiation if needed. 622 1.1 dyoung **/ 623 1.1 dyoung s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, 624 1.6 msaitoh bool autoneg_wait_to_complete) 625 1.1 dyoung { 626 1.1 dyoung u32 autoc_reg; 627 1.1 dyoung u32 links_reg; 628 1.1 dyoung u32 i; 629 1.1 dyoung s32 status = IXGBE_SUCCESS; 630 1.9 msaitoh bool got_lock = FALSE; 631 1.1 dyoung 632 1.1 dyoung DEBUGFUNC("ixgbe_start_mac_link_82599"); 633 1.1 dyoung 634 1.9 msaitoh /* reset_pipeline requires us to hold this lock as it writes to 635 1.9 msaitoh * AUTOC. 636 1.9 msaitoh */ 637 1.9 msaitoh if (ixgbe_verify_lesm_fw_enabled_82599(hw)) { 638 1.9 msaitoh status = hw->mac.ops.acquire_swfw_sync(hw, 639 1.9 msaitoh IXGBE_GSSR_MAC_CSR_SM); 640 1.9 msaitoh if (status != IXGBE_SUCCESS) 641 1.9 msaitoh goto out; 642 1.9 msaitoh 643 1.9 msaitoh got_lock = TRUE; 644 1.9 msaitoh } 645 1.9 msaitoh 646 1.1 dyoung /* Restart link */ 647 1.9 msaitoh ixgbe_reset_pipeline_82599(hw); 648 1.9 msaitoh 649 1.9 msaitoh if (got_lock) 650 1.9 msaitoh hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM); 651 1.1 dyoung 652 1.1 dyoung /* Only poll for autoneg to complete if specified to do so */ 653 1.1 dyoung if (autoneg_wait_to_complete) { 654 1.9 msaitoh autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 655 1.1 dyoung if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == 656 1.1 dyoung IXGBE_AUTOC_LMS_KX4_KX_KR || 657 1.1 dyoung (autoc_reg & IXGBE_AUTOC_LMS_MASK) == 658 1.1 dyoung IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || 659 1.1 dyoung (autoc_reg & IXGBE_AUTOC_LMS_MASK) == 660 1.1 dyoung IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { 661 1.1 dyoung links_reg = 0; /* Just in case Autoneg time = 0 */ 662 1.1 dyoung for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { 663 1.1 dyoung links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 664 1.1 dyoung if (links_reg & IXGBE_LINKS_KX_AN_COMP) 665 1.1 dyoung break; 666 1.1 dyoung msec_delay(100); 667 1.1 dyoung } 668 1.1 dyoung if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { 669 1.1 dyoung status = IXGBE_ERR_AUTONEG_NOT_COMPLETE; 670 1.1 dyoung DEBUGOUT("Autoneg did not complete.\n"); 671 1.1 dyoung } 672 1.1 dyoung } 673 1.1 dyoung } 674 1.1 dyoung 675 1.1 dyoung /* Add delay to filter out noises during initial link setup */ 676 1.1 dyoung msec_delay(50); 677 1.1 dyoung 678 1.9 msaitoh out: 679 1.1 dyoung return status; 680 1.1 dyoung } 681 1.1 dyoung 682 1.1 dyoung /** 683 1.26 msaitoh * ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser 684 1.26 msaitoh * @hw: pointer to hardware structure 685 1.1 dyoung * 686 1.26 msaitoh * The base drivers may require better control over SFP+ module 687 1.26 msaitoh * PHY states. This includes selectively shutting down the Tx 688 1.26 msaitoh * laser on the PHY, effectively halting physical link. 689 1.1 dyoung **/ 690 1.1 dyoung void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) 691 1.1 dyoung { 692 1.1 dyoung u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); 693 1.1 dyoung 694 1.12 msaitoh /* Blocked by MNG FW so bail */ 695 1.12 msaitoh if (ixgbe_check_reset_blocked(hw)) 696 1.12 msaitoh return; 697 1.12 msaitoh 698 1.12 msaitoh /* Disable Tx laser; allow 100us to go dark per spec */ 699 1.1 dyoung esdp_reg |= IXGBE_ESDP_SDP3; 700 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); 701 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 702 1.1 dyoung usec_delay(100); 703 1.1 dyoung } 704 1.1 dyoung 705 1.1 dyoung /** 706 1.26 msaitoh * ixgbe_enable_tx_laser_multispeed_fiber - Enable Tx laser 707 1.26 msaitoh * @hw: pointer to hardware structure 708 1.1 dyoung * 709 1.26 msaitoh * The base drivers may require better control over SFP+ module 710 1.26 msaitoh * PHY states. This includes selectively turning on the Tx 711 1.26 msaitoh * laser on the PHY, effectively starting physical link. 712 1.1 dyoung **/ 713 1.1 dyoung void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) 714 1.1 dyoung { 715 1.1 dyoung u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); 716 1.1 dyoung 717 1.12 msaitoh /* Enable Tx laser; allow 100ms to light up */ 718 1.1 dyoung esdp_reg &= ~IXGBE_ESDP_SDP3; 719 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); 720 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 721 1.1 dyoung msec_delay(100); 722 1.1 dyoung } 723 1.1 dyoung 724 1.1 dyoung /** 725 1.26 msaitoh * ixgbe_flap_tx_laser_multispeed_fiber - Flap Tx laser 726 1.26 msaitoh * @hw: pointer to hardware structure 727 1.1 dyoung * 728 1.26 msaitoh * When the driver changes the link speeds that it can support, 729 1.26 msaitoh * it sets autotry_restart to TRUE to indicate that we need to 730 1.26 msaitoh * initiate a new autotry session with the link partner. To do 731 1.26 msaitoh * so, we set the speed then disable and re-enable the Tx laser, to 732 1.26 msaitoh * alert the link partner that it also needs to restart autotry on its 733 1.26 msaitoh * end. This is consistent with TRUE clause 37 autoneg, which also 734 1.26 msaitoh * involves a loss of signal. 735 1.1 dyoung **/ 736 1.1 dyoung void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) 737 1.1 dyoung { 738 1.1 dyoung DEBUGFUNC("ixgbe_flap_tx_laser_multispeed_fiber"); 739 1.1 dyoung 740 1.12 msaitoh /* Blocked by MNG FW so bail */ 741 1.12 msaitoh if (ixgbe_check_reset_blocked(hw)) 742 1.12 msaitoh return; 743 1.12 msaitoh 744 1.1 dyoung if (hw->mac.autotry_restart) { 745 1.1 dyoung ixgbe_disable_tx_laser_multispeed_fiber(hw); 746 1.1 dyoung ixgbe_enable_tx_laser_multispeed_fiber(hw); 747 1.1 dyoung hw->mac.autotry_restart = FALSE; 748 1.1 dyoung } 749 1.1 dyoung } 750 1.1 dyoung 751 1.1 dyoung /** 752 1.26 msaitoh * ixgbe_set_hard_rate_select_speed - Set module link speed 753 1.26 msaitoh * @hw: pointer to hardware structure 754 1.26 msaitoh * @speed: link speed to set 755 1.9 msaitoh * 756 1.26 msaitoh * Set module link speed via RS0/RS1 rate select pins. 757 1.9 msaitoh */ 758 1.12 msaitoh void ixgbe_set_hard_rate_select_speed(struct ixgbe_hw *hw, 759 1.9 msaitoh ixgbe_link_speed speed) 760 1.9 msaitoh { 761 1.12 msaitoh u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); 762 1.9 msaitoh 763 1.9 msaitoh switch (speed) { 764 1.9 msaitoh case IXGBE_LINK_SPEED_10GB_FULL: 765 1.12 msaitoh esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); 766 1.9 msaitoh break; 767 1.9 msaitoh case IXGBE_LINK_SPEED_1GB_FULL: 768 1.12 msaitoh esdp_reg &= ~IXGBE_ESDP_SDP5; 769 1.12 msaitoh esdp_reg |= IXGBE_ESDP_SDP5_DIR; 770 1.9 msaitoh break; 771 1.9 msaitoh default: 772 1.9 msaitoh DEBUGOUT("Invalid fixed module speed\n"); 773 1.9 msaitoh return; 774 1.9 msaitoh } 775 1.9 msaitoh 776 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); 777 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 778 1.1 dyoung } 779 1.1 dyoung 780 1.1 dyoung /** 781 1.26 msaitoh * ixgbe_setup_mac_link_smartspeed - Set MAC link speed using SmartSpeed 782 1.26 msaitoh * @hw: pointer to hardware structure 783 1.26 msaitoh * @speed: new link speed 784 1.26 msaitoh * @autoneg_wait_to_complete: TRUE when waiting for completion is needed 785 1.1 dyoung * 786 1.26 msaitoh * Implements the Intel SmartSpeed algorithm. 787 1.1 dyoung **/ 788 1.1 dyoung s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, 789 1.9 msaitoh ixgbe_link_speed speed, 790 1.6 msaitoh bool autoneg_wait_to_complete) 791 1.1 dyoung { 792 1.1 dyoung s32 status = IXGBE_SUCCESS; 793 1.1 dyoung ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN; 794 1.1 dyoung s32 i, j; 795 1.1 dyoung bool link_up = FALSE; 796 1.1 dyoung u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 797 1.1 dyoung 798 1.1 dyoung DEBUGFUNC("ixgbe_setup_mac_link_smartspeed"); 799 1.1 dyoung 800 1.1 dyoung /* Set autoneg_advertised value based on input link speed */ 801 1.1 dyoung hw->phy.autoneg_advertised = 0; 802 1.1 dyoung 803 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) 804 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; 805 1.1 dyoung 806 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) 807 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; 808 1.1 dyoung 809 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) 810 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL; 811 1.1 dyoung 812 1.1 dyoung /* 813 1.1 dyoung * Implement Intel SmartSpeed algorithm. SmartSpeed will reduce the 814 1.1 dyoung * autoneg advertisement if link is unable to be established at the 815 1.1 dyoung * highest negotiated rate. This can sometimes happen due to integrity 816 1.1 dyoung * issues with the physical media connection. 817 1.1 dyoung */ 818 1.1 dyoung 819 1.1 dyoung /* First, try to get link with full advertisement */ 820 1.1 dyoung hw->phy.smart_speed_active = FALSE; 821 1.1 dyoung for (j = 0; j < IXGBE_SMARTSPEED_MAX_RETRIES; j++) { 822 1.9 msaitoh status = ixgbe_setup_mac_link_82599(hw, speed, 823 1.1 dyoung autoneg_wait_to_complete); 824 1.1 dyoung if (status != IXGBE_SUCCESS) 825 1.1 dyoung goto out; 826 1.1 dyoung 827 1.1 dyoung /* 828 1.1 dyoung * Wait for the controller to acquire link. Per IEEE 802.3ap, 829 1.1 dyoung * Section 73.10.2, we may have to wait up to 500ms if KR is 830 1.1 dyoung * attempted, or 200ms if KX/KX4/BX/BX4 is attempted, per 831 1.1 dyoung * Table 9 in the AN MAS. 832 1.1 dyoung */ 833 1.1 dyoung for (i = 0; i < 5; i++) { 834 1.1 dyoung msec_delay(100); 835 1.1 dyoung 836 1.1 dyoung /* If we have link, just jump out */ 837 1.1 dyoung status = ixgbe_check_link(hw, &link_speed, &link_up, 838 1.1 dyoung FALSE); 839 1.1 dyoung if (status != IXGBE_SUCCESS) 840 1.1 dyoung goto out; 841 1.1 dyoung 842 1.1 dyoung if (link_up) 843 1.1 dyoung goto out; 844 1.1 dyoung } 845 1.1 dyoung } 846 1.1 dyoung 847 1.1 dyoung /* 848 1.1 dyoung * We didn't get link. If we advertised KR plus one of KX4/KX 849 1.1 dyoung * (or BX4/BX), then disable KR and try again. 850 1.1 dyoung */ 851 1.1 dyoung if (((autoc_reg & IXGBE_AUTOC_KR_SUPP) == 0) || 852 1.1 dyoung ((autoc_reg & IXGBE_AUTOC_KX4_KX_SUPP_MASK) == 0)) 853 1.1 dyoung goto out; 854 1.1 dyoung 855 1.1 dyoung /* Turn SmartSpeed on to disable KR support */ 856 1.1 dyoung hw->phy.smart_speed_active = TRUE; 857 1.9 msaitoh status = ixgbe_setup_mac_link_82599(hw, speed, 858 1.1 dyoung autoneg_wait_to_complete); 859 1.1 dyoung if (status != IXGBE_SUCCESS) 860 1.1 dyoung goto out; 861 1.1 dyoung 862 1.1 dyoung /* 863 1.1 dyoung * Wait for the controller to acquire link. 600ms will allow for 864 1.1 dyoung * the AN link_fail_inhibit_timer as well for multiple cycles of 865 1.1 dyoung * parallel detect, both 10g and 1g. This allows for the maximum 866 1.1 dyoung * connect attempts as defined in the AN MAS table 73-7. 867 1.1 dyoung */ 868 1.1 dyoung for (i = 0; i < 6; i++) { 869 1.1 dyoung msec_delay(100); 870 1.1 dyoung 871 1.1 dyoung /* If we have link, just jump out */ 872 1.1 dyoung status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); 873 1.1 dyoung if (status != IXGBE_SUCCESS) 874 1.1 dyoung goto out; 875 1.1 dyoung 876 1.1 dyoung if (link_up) 877 1.1 dyoung goto out; 878 1.1 dyoung } 879 1.1 dyoung 880 1.1 dyoung /* We didn't get link. Turn SmartSpeed back off. */ 881 1.1 dyoung hw->phy.smart_speed_active = FALSE; 882 1.9 msaitoh status = ixgbe_setup_mac_link_82599(hw, speed, 883 1.1 dyoung autoneg_wait_to_complete); 884 1.1 dyoung 885 1.1 dyoung out: 886 1.1 dyoung if (link_up && (link_speed == IXGBE_LINK_SPEED_1GB_FULL)) 887 1.1 dyoung DEBUGOUT("Smartspeed has downgraded the link speed " 888 1.1 dyoung "from the maximum advertised\n"); 889 1.1 dyoung return status; 890 1.1 dyoung } 891 1.1 dyoung 892 1.1 dyoung /** 893 1.26 msaitoh * ixgbe_setup_mac_link_82599 - Set MAC link speed 894 1.26 msaitoh * @hw: pointer to hardware structure 895 1.26 msaitoh * @speed: new link speed 896 1.26 msaitoh * @autoneg_wait_to_complete: TRUE when waiting for completion is needed 897 1.1 dyoung * 898 1.26 msaitoh * Set the link speed in the AUTOC register and restarts link. 899 1.1 dyoung **/ 900 1.1 dyoung s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, 901 1.9 msaitoh ixgbe_link_speed speed, 902 1.6 msaitoh bool autoneg_wait_to_complete) 903 1.1 dyoung { 904 1.9 msaitoh bool autoneg = FALSE; 905 1.1 dyoung s32 status = IXGBE_SUCCESS; 906 1.12 msaitoh u32 pma_pmd_1g, link_mode; 907 1.12 msaitoh u32 current_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); /* holds the value of AUTOC register at this current point in time */ 908 1.12 msaitoh u32 orig_autoc = 0; /* holds the cached value of AUTOC register */ 909 1.12 msaitoh u32 autoc = current_autoc; /* Temporary variable used for comparison purposes */ 910 1.1 dyoung u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); 911 1.1 dyoung u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; 912 1.1 dyoung u32 links_reg; 913 1.1 dyoung u32 i; 914 1.1 dyoung ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN; 915 1.1 dyoung 916 1.1 dyoung DEBUGFUNC("ixgbe_setup_mac_link_82599"); 917 1.1 dyoung 918 1.1 dyoung /* Check to see if speed passed in is supported. */ 919 1.1 dyoung status = ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); 920 1.9 msaitoh if (status) 921 1.1 dyoung goto out; 922 1.1 dyoung 923 1.1 dyoung speed &= link_capabilities; 924 1.1 dyoung 925 1.17 msaitoh if (speed == 0) { 926 1.17 msaitoh ixgbe_disable_tx_laser(hw); /* For fiber */ 927 1.17 msaitoh ixgbe_set_phy_power(hw, false); /* For copper */ 928 1.17 msaitoh } else { 929 1.17 msaitoh /* In case previous media setting was none(down) */ 930 1.17 msaitoh ixgbe_enable_tx_laser(hw); /* for Fiber */ 931 1.17 msaitoh ixgbe_set_phy_power(hw, true); /* For copper */ 932 1.1 dyoung } 933 1.1 dyoung 934 1.1 dyoung /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ 935 1.1 dyoung if (hw->mac.orig_link_settings_stored) 936 1.12 msaitoh orig_autoc = hw->mac.orig_autoc; 937 1.1 dyoung else 938 1.12 msaitoh orig_autoc = autoc; 939 1.9 msaitoh 940 1.9 msaitoh link_mode = autoc & IXGBE_AUTOC_LMS_MASK; 941 1.9 msaitoh pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; 942 1.1 dyoung 943 1.1 dyoung if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || 944 1.1 dyoung link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || 945 1.1 dyoung link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { 946 1.1 dyoung /* Set KX4/KX/KR support according to speed requested */ 947 1.1 dyoung autoc &= ~(IXGBE_AUTOC_KX4_KX_SUPP_MASK | IXGBE_AUTOC_KR_SUPP); 948 1.8 msaitoh if (speed & IXGBE_LINK_SPEED_10GB_FULL) { 949 1.1 dyoung if (orig_autoc & IXGBE_AUTOC_KX4_SUPP) 950 1.1 dyoung autoc |= IXGBE_AUTOC_KX4_SUPP; 951 1.1 dyoung if ((orig_autoc & IXGBE_AUTOC_KR_SUPP) && 952 1.1 dyoung (hw->phy.smart_speed_active == FALSE)) 953 1.1 dyoung autoc |= IXGBE_AUTOC_KR_SUPP; 954 1.8 msaitoh } 955 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) 956 1.1 dyoung autoc |= IXGBE_AUTOC_KX_SUPP; 957 1.1 dyoung } else if ((pma_pmd_1g == IXGBE_AUTOC_1G_SFI) && 958 1.6 msaitoh (link_mode == IXGBE_AUTOC_LMS_1G_LINK_NO_AN || 959 1.6 msaitoh link_mode == IXGBE_AUTOC_LMS_1G_AN)) { 960 1.1 dyoung /* Switch from 1G SFI to 10G SFI if requested */ 961 1.1 dyoung if ((speed == IXGBE_LINK_SPEED_10GB_FULL) && 962 1.1 dyoung (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI)) { 963 1.1 dyoung autoc &= ~IXGBE_AUTOC_LMS_MASK; 964 1.1 dyoung autoc |= IXGBE_AUTOC_LMS_10G_SERIAL; 965 1.1 dyoung } 966 1.1 dyoung } else if ((pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI) && 967 1.6 msaitoh (link_mode == IXGBE_AUTOC_LMS_10G_SERIAL)) { 968 1.1 dyoung /* Switch from 10G SFI to 1G SFI if requested */ 969 1.1 dyoung if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && 970 1.1 dyoung (pma_pmd_1g == IXGBE_AUTOC_1G_SFI)) { 971 1.1 dyoung autoc &= ~IXGBE_AUTOC_LMS_MASK; 972 1.12 msaitoh if (autoneg || hw->phy.type == ixgbe_phy_qsfp_intel) 973 1.1 dyoung autoc |= IXGBE_AUTOC_LMS_1G_AN; 974 1.1 dyoung else 975 1.1 dyoung autoc |= IXGBE_AUTOC_LMS_1G_LINK_NO_AN; 976 1.1 dyoung } 977 1.1 dyoung } 978 1.1 dyoung 979 1.12 msaitoh if (autoc != current_autoc) { 980 1.1 dyoung /* Restart link */ 981 1.12 msaitoh status = hw->mac.ops.prot_autoc_write(hw, autoc, FALSE); 982 1.12 msaitoh if (status != IXGBE_SUCCESS) 983 1.12 msaitoh goto out; 984 1.1 dyoung 985 1.1 dyoung /* Only poll for autoneg to complete if specified to do so */ 986 1.1 dyoung if (autoneg_wait_to_complete) { 987 1.1 dyoung if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || 988 1.1 dyoung link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || 989 1.1 dyoung link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { 990 1.1 dyoung links_reg = 0; /*Just in case Autoneg time=0*/ 991 1.1 dyoung for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { 992 1.1 dyoung links_reg = 993 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_LINKS); 994 1.1 dyoung if (links_reg & IXGBE_LINKS_KX_AN_COMP) 995 1.1 dyoung break; 996 1.1 dyoung msec_delay(100); 997 1.1 dyoung } 998 1.1 dyoung if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { 999 1.1 dyoung status = 1000 1.1 dyoung IXGBE_ERR_AUTONEG_NOT_COMPLETE; 1001 1.1 dyoung DEBUGOUT("Autoneg did not complete.\n"); 1002 1.1 dyoung } 1003 1.1 dyoung } 1004 1.1 dyoung } 1005 1.1 dyoung 1006 1.1 dyoung /* Add delay to filter out noises during initial link setup */ 1007 1.1 dyoung msec_delay(50); 1008 1.1 dyoung } 1009 1.1 dyoung 1010 1.1 dyoung out: 1011 1.1 dyoung return status; 1012 1.1 dyoung } 1013 1.1 dyoung 1014 1.1 dyoung /** 1015 1.26 msaitoh * ixgbe_setup_copper_link_82599 - Set the PHY autoneg advertised field 1016 1.26 msaitoh * @hw: pointer to hardware structure 1017 1.26 msaitoh * @speed: new link speed 1018 1.26 msaitoh * @autoneg_wait_to_complete: TRUE if waiting is needed to complete 1019 1.1 dyoung * 1020 1.26 msaitoh * Restarts link on PHY and MAC based on settings passed in. 1021 1.1 dyoung **/ 1022 1.1 dyoung static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw, 1023 1.6 msaitoh ixgbe_link_speed speed, 1024 1.6 msaitoh bool autoneg_wait_to_complete) 1025 1.1 dyoung { 1026 1.1 dyoung s32 status; 1027 1.1 dyoung 1028 1.1 dyoung DEBUGFUNC("ixgbe_setup_copper_link_82599"); 1029 1.1 dyoung 1030 1.1 dyoung /* Setup the PHY according to input speed */ 1031 1.9 msaitoh status = hw->phy.ops.setup_link_speed(hw, speed, 1032 1.6 msaitoh autoneg_wait_to_complete); 1033 1.1 dyoung /* Set up MAC */ 1034 1.1 dyoung ixgbe_start_mac_link_82599(hw, autoneg_wait_to_complete); 1035 1.1 dyoung 1036 1.1 dyoung return status; 1037 1.1 dyoung } 1038 1.1 dyoung 1039 1.1 dyoung /** 1040 1.26 msaitoh * ixgbe_reset_hw_82599 - Perform hardware reset 1041 1.26 msaitoh * @hw: pointer to hardware structure 1042 1.1 dyoung * 1043 1.26 msaitoh * Resets the hardware by resetting the transmit and receive units, masks 1044 1.26 msaitoh * and clears all interrupts, perform a PHY reset, and perform a link (MAC) 1045 1.26 msaitoh * reset. 1046 1.1 dyoung **/ 1047 1.1 dyoung s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) 1048 1.1 dyoung { 1049 1.6 msaitoh ixgbe_link_speed link_speed; 1050 1.6 msaitoh s32 status; 1051 1.22 msaitoh s32 phy_status = IXGBE_SUCCESS; 1052 1.12 msaitoh u32 ctrl = 0; 1053 1.12 msaitoh u32 i, autoc, autoc2; 1054 1.10 msaitoh u32 curr_lms; 1055 1.6 msaitoh bool link_up = FALSE; 1056 1.1 dyoung 1057 1.1 dyoung DEBUGFUNC("ixgbe_reset_hw_82599"); 1058 1.1 dyoung 1059 1.1 dyoung /* Call adapter stop to disable tx/rx and clear interrupts */ 1060 1.6 msaitoh status = hw->mac.ops.stop_adapter(hw); 1061 1.6 msaitoh if (status != IXGBE_SUCCESS) 1062 1.6 msaitoh goto reset_hw_out; 1063 1.6 msaitoh 1064 1.6 msaitoh /* flush pending Tx transactions */ 1065 1.6 msaitoh ixgbe_clear_tx_pending(hw); 1066 1.1 dyoung 1067 1.1 dyoung /* PHY ops must be identified and initialized prior to reset */ 1068 1.1 dyoung 1069 1.1 dyoung /* Identify PHY and related function pointers */ 1070 1.22 msaitoh phy_status = hw->phy.ops.init(hw); 1071 1.1 dyoung 1072 1.22 msaitoh if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED) 1073 1.22 msaitoh goto mac_reset_top; 1074 1.1 dyoung 1075 1.1 dyoung /* Setup SFP module if there is one present. */ 1076 1.1 dyoung if (hw->phy.sfp_setup_needed) { 1077 1.22 msaitoh phy_status = hw->mac.ops.setup_sfp(hw); 1078 1.1 dyoung hw->phy.sfp_setup_needed = FALSE; 1079 1.1 dyoung } 1080 1.1 dyoung 1081 1.22 msaitoh if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED) 1082 1.22 msaitoh goto mac_reset_top; 1083 1.1 dyoung 1084 1.1 dyoung /* Reset PHY */ 1085 1.1 dyoung if (hw->phy.reset_disable == FALSE && hw->phy.ops.reset != NULL) 1086 1.1 dyoung hw->phy.ops.reset(hw); 1087 1.1 dyoung 1088 1.22 msaitoh mac_reset_top: 1089 1.10 msaitoh /* remember AUTOC from before we reset */ 1090 1.12 msaitoh curr_lms = IXGBE_READ_REG(hw, IXGBE_AUTOC) & IXGBE_AUTOC_LMS_MASK; 1091 1.10 msaitoh 1092 1.22 msaitoh mac_reset_retry: 1093 1.1 dyoung /* 1094 1.6 msaitoh * Issue global reset to the MAC. Needs to be SW reset if link is up. 1095 1.6 msaitoh * If link reset is used when link is up, it might reset the PHY when 1096 1.6 msaitoh * mng is using it. If link is down or the flag to force full link 1097 1.6 msaitoh * reset is set, then perform link reset. 1098 1.6 msaitoh */ 1099 1.6 msaitoh ctrl = IXGBE_CTRL_LNK_RST; 1100 1.6 msaitoh if (!hw->force_full_reset) { 1101 1.6 msaitoh hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE); 1102 1.6 msaitoh if (link_up) 1103 1.6 msaitoh ctrl = IXGBE_CTRL_RST; 1104 1.6 msaitoh } 1105 1.1 dyoung 1106 1.6 msaitoh ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL); 1107 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl); 1108 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1109 1.1 dyoung 1110 1.12 msaitoh /* Poll for reset bit to self-clear meaning reset is complete */ 1111 1.1 dyoung for (i = 0; i < 10; i++) { 1112 1.1 dyoung usec_delay(1); 1113 1.1 dyoung ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 1114 1.6 msaitoh if (!(ctrl & IXGBE_CTRL_RST_MASK)) 1115 1.1 dyoung break; 1116 1.1 dyoung } 1117 1.6 msaitoh 1118 1.6 msaitoh if (ctrl & IXGBE_CTRL_RST_MASK) { 1119 1.1 dyoung status = IXGBE_ERR_RESET_FAILED; 1120 1.1 dyoung DEBUGOUT("Reset polling failed to complete.\n"); 1121 1.1 dyoung } 1122 1.1 dyoung 1123 1.6 msaitoh msec_delay(50); 1124 1.6 msaitoh 1125 1.1 dyoung /* 1126 1.1 dyoung * Double resets are required for recovery from certain error 1127 1.12 msaitoh * conditions. Between resets, it is necessary to stall to 1128 1.12 msaitoh * allow time for any pending HW events to complete. 1129 1.1 dyoung */ 1130 1.1 dyoung if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) { 1131 1.1 dyoung hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED; 1132 1.22 msaitoh goto mac_reset_retry; 1133 1.1 dyoung } 1134 1.1 dyoung 1135 1.1 dyoung /* 1136 1.1 dyoung * Store the original AUTOC/AUTOC2 values if they have not been 1137 1.1 dyoung * stored off yet. Otherwise restore the stored original 1138 1.1 dyoung * values since the reset operation sets back to defaults. 1139 1.1 dyoung */ 1140 1.12 msaitoh autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 1141 1.1 dyoung autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); 1142 1.9 msaitoh 1143 1.9 msaitoh /* Enable link if disabled in NVM */ 1144 1.9 msaitoh if (autoc2 & IXGBE_AUTOC2_LINK_DISABLE_MASK) { 1145 1.9 msaitoh autoc2 &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; 1146 1.9 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2); 1147 1.9 msaitoh IXGBE_WRITE_FLUSH(hw); 1148 1.9 msaitoh } 1149 1.9 msaitoh 1150 1.1 dyoung if (hw->mac.orig_link_settings_stored == FALSE) { 1151 1.12 msaitoh hw->mac.orig_autoc = autoc; 1152 1.1 dyoung hw->mac.orig_autoc2 = autoc2; 1153 1.1 dyoung hw->mac.orig_link_settings_stored = TRUE; 1154 1.1 dyoung } else { 1155 1.10 msaitoh 1156 1.10 msaitoh /* If MNG FW is running on a multi-speed device that 1157 1.10 msaitoh * doesn't autoneg with out driver support we need to 1158 1.10 msaitoh * leave LMS in the state it was before we MAC reset. 1159 1.10 msaitoh * Likewise if we support WoL we don't want change the 1160 1.10 msaitoh * LMS state. 1161 1.10 msaitoh */ 1162 1.12 msaitoh if ((hw->phy.multispeed_fiber && ixgbe_mng_enabled(hw)) || 1163 1.10 msaitoh hw->wol_enabled) 1164 1.10 msaitoh hw->mac.orig_autoc = 1165 1.10 msaitoh (hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) | 1166 1.10 msaitoh curr_lms; 1167 1.10 msaitoh 1168 1.12 msaitoh if (autoc != hw->mac.orig_autoc) { 1169 1.12 msaitoh status = hw->mac.ops.prot_autoc_write(hw, 1170 1.12 msaitoh hw->mac.orig_autoc, 1171 1.12 msaitoh FALSE); 1172 1.12 msaitoh if (status != IXGBE_SUCCESS) 1173 1.12 msaitoh goto reset_hw_out; 1174 1.9 msaitoh } 1175 1.1 dyoung 1176 1.1 dyoung if ((autoc2 & IXGBE_AUTOC2_UPPER_MASK) != 1177 1.1 dyoung (hw->mac.orig_autoc2 & IXGBE_AUTOC2_UPPER_MASK)) { 1178 1.1 dyoung autoc2 &= ~IXGBE_AUTOC2_UPPER_MASK; 1179 1.1 dyoung autoc2 |= (hw->mac.orig_autoc2 & 1180 1.6 msaitoh IXGBE_AUTOC2_UPPER_MASK); 1181 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2); 1182 1.1 dyoung } 1183 1.1 dyoung } 1184 1.1 dyoung 1185 1.1 dyoung /* Store the permanent mac address */ 1186 1.1 dyoung hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); 1187 1.1 dyoung 1188 1.1 dyoung /* 1189 1.1 dyoung * Store MAC address from RAR0, clear receive address registers, and 1190 1.1 dyoung * clear the multicast table. Also reset num_rar_entries to 128, 1191 1.1 dyoung * since we modify this value when programming the SAN MAC address. 1192 1.1 dyoung */ 1193 1.1 dyoung hw->mac.num_rar_entries = 128; 1194 1.1 dyoung hw->mac.ops.init_rx_addrs(hw); 1195 1.1 dyoung 1196 1.1 dyoung /* Store the permanent SAN mac address */ 1197 1.1 dyoung hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr); 1198 1.1 dyoung 1199 1.1 dyoung /* Add the SAN MAC address to the RAR only if it's a valid address */ 1200 1.1 dyoung if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) { 1201 1.15 msaitoh /* Save the SAN MAC RAR index */ 1202 1.15 msaitoh hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1; 1203 1.15 msaitoh 1204 1.15 msaitoh hw->mac.ops.set_rar(hw, hw->mac.san_mac_rar_index, 1205 1.6 msaitoh hw->mac.san_addr, 0, IXGBE_RAH_AV); 1206 1.1 dyoung 1207 1.15 msaitoh /* clear VMDq pool/queue selection for this RAR */ 1208 1.15 msaitoh hw->mac.ops.clear_vmdq(hw, hw->mac.san_mac_rar_index, 1209 1.15 msaitoh IXGBE_CLEAR_VMDQ_ALL); 1210 1.7 msaitoh 1211 1.1 dyoung /* Reserve the last RAR for the SAN MAC address */ 1212 1.1 dyoung hw->mac.num_rar_entries--; 1213 1.1 dyoung } 1214 1.1 dyoung 1215 1.1 dyoung /* Store the alternative WWNN/WWPN prefix */ 1216 1.1 dyoung hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix, 1217 1.6 msaitoh &hw->mac.wwpn_prefix); 1218 1.1 dyoung 1219 1.1 dyoung reset_hw_out: 1220 1.22 msaitoh if (phy_status != IXGBE_SUCCESS) 1221 1.22 msaitoh status = phy_status; 1222 1.22 msaitoh 1223 1.1 dyoung return status; 1224 1.1 dyoung } 1225 1.1 dyoung 1226 1.1 dyoung /** 1227 1.12 msaitoh * ixgbe_fdir_check_cmd_complete - poll to check whether FDIRCMD is complete 1228 1.12 msaitoh * @hw: pointer to hardware structure 1229 1.12 msaitoh * @fdircmd: current value of FDIRCMD register 1230 1.12 msaitoh */ 1231 1.12 msaitoh static s32 ixgbe_fdir_check_cmd_complete(struct ixgbe_hw *hw, u32 *fdircmd) 1232 1.12 msaitoh { 1233 1.12 msaitoh int i; 1234 1.12 msaitoh 1235 1.12 msaitoh for (i = 0; i < IXGBE_FDIRCMD_CMD_POLL; i++) { 1236 1.12 msaitoh *fdircmd = IXGBE_READ_REG(hw, IXGBE_FDIRCMD); 1237 1.12 msaitoh if (!(*fdircmd & IXGBE_FDIRCMD_CMD_MASK)) 1238 1.12 msaitoh return IXGBE_SUCCESS; 1239 1.12 msaitoh usec_delay(10); 1240 1.12 msaitoh } 1241 1.12 msaitoh 1242 1.12 msaitoh return IXGBE_ERR_FDIR_CMD_INCOMPLETE; 1243 1.12 msaitoh } 1244 1.12 msaitoh 1245 1.12 msaitoh /** 1246 1.26 msaitoh * ixgbe_reinit_fdir_tables_82599 - Reinitialize Flow Director tables. 1247 1.26 msaitoh * @hw: pointer to hardware structure 1248 1.1 dyoung **/ 1249 1.1 dyoung s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) 1250 1.1 dyoung { 1251 1.12 msaitoh s32 err; 1252 1.1 dyoung int i; 1253 1.1 dyoung u32 fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL); 1254 1.12 msaitoh u32 fdircmd; 1255 1.1 dyoung fdirctrl &= ~IXGBE_FDIRCTRL_INIT_DONE; 1256 1.1 dyoung 1257 1.1 dyoung DEBUGFUNC("ixgbe_reinit_fdir_tables_82599"); 1258 1.1 dyoung 1259 1.1 dyoung /* 1260 1.1 dyoung * Before starting reinitialization process, 1261 1.1 dyoung * FDIRCMD.CMD must be zero. 1262 1.1 dyoung */ 1263 1.12 msaitoh err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd); 1264 1.12 msaitoh if (err) { 1265 1.12 msaitoh DEBUGOUT("Flow Director previous command did not complete, aborting table re-initialization.\n"); 1266 1.12 msaitoh return err; 1267 1.1 dyoung } 1268 1.1 dyoung 1269 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRFREE, 0); 1270 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1271 1.1 dyoung /* 1272 1.1 dyoung * 82599 adapters flow director init flow cannot be restarted, 1273 1.1 dyoung * Workaround 82599 silicon errata by performing the following steps 1274 1.1 dyoung * before re-writing the FDIRCTRL control register with the same value. 1275 1.1 dyoung * - write 1 to bit 8 of FDIRCMD register & 1276 1.1 dyoung * - write 0 to bit 8 of FDIRCMD register 1277 1.1 dyoung */ 1278 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, 1279 1.6 msaitoh (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) | 1280 1.6 msaitoh IXGBE_FDIRCMD_CLEARHT)); 1281 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1282 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, 1283 1.6 msaitoh (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) & 1284 1.6 msaitoh ~IXGBE_FDIRCMD_CLEARHT)); 1285 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1286 1.1 dyoung /* 1287 1.1 dyoung * Clear FDIR Hash register to clear any leftover hashes 1288 1.1 dyoung * waiting to be programmed. 1289 1.1 dyoung */ 1290 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, 0x00); 1291 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1292 1.1 dyoung 1293 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl); 1294 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1295 1.1 dyoung 1296 1.1 dyoung /* Poll init-done after we write FDIRCTRL register */ 1297 1.1 dyoung for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) { 1298 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & 1299 1.6 msaitoh IXGBE_FDIRCTRL_INIT_DONE) 1300 1.1 dyoung break; 1301 1.9 msaitoh msec_delay(1); 1302 1.1 dyoung } 1303 1.1 dyoung if (i >= IXGBE_FDIR_INIT_DONE_POLL) { 1304 1.1 dyoung DEBUGOUT("Flow Director Signature poll time exceeded!\n"); 1305 1.1 dyoung return IXGBE_ERR_FDIR_REINIT_FAILED; 1306 1.1 dyoung } 1307 1.1 dyoung 1308 1.1 dyoung /* Clear FDIR statistics registers (read to clear) */ 1309 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_FDIRUSTAT); 1310 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_FDIRFSTAT); 1311 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); 1312 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_FDIRMISS); 1313 1.1 dyoung IXGBE_READ_REG(hw, IXGBE_FDIRLEN); 1314 1.1 dyoung 1315 1.1 dyoung return IXGBE_SUCCESS; 1316 1.1 dyoung } 1317 1.1 dyoung 1318 1.1 dyoung /** 1319 1.26 msaitoh * ixgbe_fdir_enable_82599 - Initialize Flow Director control registers 1320 1.26 msaitoh * @hw: pointer to hardware structure 1321 1.26 msaitoh * @fdirctrl: value to write to flow director control register 1322 1.1 dyoung **/ 1323 1.6 msaitoh static void ixgbe_fdir_enable_82599(struct ixgbe_hw *hw, u32 fdirctrl) 1324 1.1 dyoung { 1325 1.1 dyoung int i; 1326 1.1 dyoung 1327 1.6 msaitoh DEBUGFUNC("ixgbe_fdir_enable_82599"); 1328 1.1 dyoung 1329 1.1 dyoung /* Prime the keys for hashing */ 1330 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, IXGBE_ATR_BUCKET_HASH_KEY); 1331 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, IXGBE_ATR_SIGNATURE_HASH_KEY); 1332 1.1 dyoung 1333 1.1 dyoung /* 1334 1.1 dyoung * Poll init-done after we write the register. Estimated times: 1335 1.1 dyoung * 10G: PBALLOC = 11b, timing is 60us 1336 1.1 dyoung * 1G: PBALLOC = 11b, timing is 600us 1337 1.1 dyoung * 100M: PBALLOC = 11b, timing is 6ms 1338 1.1 dyoung * 1339 1.1 dyoung * Multiple these timings by 4 if under full Rx load 1340 1.1 dyoung * 1341 1.1 dyoung * So we'll poll for IXGBE_FDIR_INIT_DONE_POLL times, sleeping for 1342 1.1 dyoung * 1 msec per poll time. If we're at line rate and drop to 100M, then 1343 1.1 dyoung * this might not finish in our poll time, but we can live with that 1344 1.1 dyoung * for now. 1345 1.1 dyoung */ 1346 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl); 1347 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1348 1.1 dyoung for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) { 1349 1.1 dyoung if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) & 1350 1.6 msaitoh IXGBE_FDIRCTRL_INIT_DONE) 1351 1.1 dyoung break; 1352 1.1 dyoung msec_delay(1); 1353 1.1 dyoung } 1354 1.6 msaitoh 1355 1.1 dyoung if (i >= IXGBE_FDIR_INIT_DONE_POLL) 1356 1.6 msaitoh DEBUGOUT("Flow Director poll time exceeded!\n"); 1357 1.1 dyoung } 1358 1.1 dyoung 1359 1.1 dyoung /** 1360 1.26 msaitoh * ixgbe_init_fdir_signature_82599 - Initialize Flow Director signature filters 1361 1.26 msaitoh * @hw: pointer to hardware structure 1362 1.26 msaitoh * @fdirctrl: value to write to flow director control register, initially 1363 1.6 msaitoh * contains just the value of the Rx packet buffer allocation 1364 1.1 dyoung **/ 1365 1.6 msaitoh s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 fdirctrl) 1366 1.1 dyoung { 1367 1.6 msaitoh DEBUGFUNC("ixgbe_init_fdir_signature_82599"); 1368 1.1 dyoung 1369 1.1 dyoung /* 1370 1.6 msaitoh * Continue setup of fdirctrl register bits: 1371 1.6 msaitoh * Move the flexible bytes to use the ethertype - shift 6 words 1372 1.6 msaitoh * Set the maximum length per hash bucket to 0xA filters 1373 1.6 msaitoh * Send interrupt when 64 filters are left 1374 1.6 msaitoh */ 1375 1.6 msaitoh fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT) | 1376 1.6 msaitoh (0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT) | 1377 1.6 msaitoh (4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT); 1378 1.1 dyoung 1379 1.6 msaitoh /* write hashes and fdirctrl register, poll for completion */ 1380 1.6 msaitoh ixgbe_fdir_enable_82599(hw, fdirctrl); 1381 1.1 dyoung 1382 1.1 dyoung return IXGBE_SUCCESS; 1383 1.1 dyoung } 1384 1.1 dyoung 1385 1.1 dyoung /** 1386 1.26 msaitoh * ixgbe_init_fdir_perfect_82599 - Initialize Flow Director perfect filters 1387 1.26 msaitoh * @hw: pointer to hardware structure 1388 1.26 msaitoh * @fdirctrl: value to write to flow director control register, initially 1389 1.6 msaitoh * contains just the value of the Rx packet buffer allocation 1390 1.26 msaitoh * @cloud_mode: TRUE - cloud mode, FALSE - other mode 1391 1.1 dyoung **/ 1392 1.12 msaitoh s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 fdirctrl, 1393 1.12 msaitoh bool cloud_mode) 1394 1.1 dyoung { 1395 1.19 msaitoh UNREFERENCED_1PARAMETER(cloud_mode); 1396 1.6 msaitoh DEBUGFUNC("ixgbe_init_fdir_perfect_82599"); 1397 1.1 dyoung 1398 1.1 dyoung /* 1399 1.6 msaitoh * Continue setup of fdirctrl register bits: 1400 1.6 msaitoh * Turn perfect match filtering on 1401 1.6 msaitoh * Report hash in RSS field of Rx wb descriptor 1402 1.14 msaitoh * Initialize the drop queue to queue 127 1403 1.6 msaitoh * Move the flexible bytes to use the ethertype - shift 6 words 1404 1.6 msaitoh * Set the maximum length per hash bucket to 0xA filters 1405 1.6 msaitoh * Send interrupt when 64 (0x4 * 16) filters are left 1406 1.6 msaitoh */ 1407 1.6 msaitoh fdirctrl |= IXGBE_FDIRCTRL_PERFECT_MATCH | 1408 1.6 msaitoh IXGBE_FDIRCTRL_REPORT_STATUS | 1409 1.6 msaitoh (IXGBE_FDIR_DROP_QUEUE << IXGBE_FDIRCTRL_DROP_Q_SHIFT) | 1410 1.6 msaitoh (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT) | 1411 1.6 msaitoh (0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT) | 1412 1.6 msaitoh (4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT); 1413 1.1 dyoung 1414 1.12 msaitoh if (cloud_mode) 1415 1.12 msaitoh fdirctrl |=(IXGBE_FDIRCTRL_FILTERMODE_CLOUD << 1416 1.12 msaitoh IXGBE_FDIRCTRL_FILTERMODE_SHIFT); 1417 1.12 msaitoh 1418 1.6 msaitoh /* write hashes and fdirctrl register, poll for completion */ 1419 1.6 msaitoh ixgbe_fdir_enable_82599(hw, fdirctrl); 1420 1.1 dyoung 1421 1.6 msaitoh return IXGBE_SUCCESS; 1422 1.1 dyoung } 1423 1.1 dyoung 1424 1.14 msaitoh /** 1425 1.26 msaitoh * ixgbe_set_fdir_drop_queue_82599 - Set Flow Director drop queue 1426 1.26 msaitoh * @hw: pointer to hardware structure 1427 1.26 msaitoh * @dropqueue: Rx queue index used for the dropped packets 1428 1.14 msaitoh **/ 1429 1.14 msaitoh void ixgbe_set_fdir_drop_queue_82599(struct ixgbe_hw *hw, u8 dropqueue) 1430 1.14 msaitoh { 1431 1.14 msaitoh u32 fdirctrl; 1432 1.14 msaitoh 1433 1.14 msaitoh DEBUGFUNC("ixgbe_set_fdir_drop_queue_82599"); 1434 1.14 msaitoh /* Clear init done bit and drop queue field */ 1435 1.14 msaitoh fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL); 1436 1.14 msaitoh fdirctrl &= ~(IXGBE_FDIRCTRL_DROP_Q_MASK | IXGBE_FDIRCTRL_INIT_DONE); 1437 1.14 msaitoh 1438 1.14 msaitoh /* Set drop queue */ 1439 1.14 msaitoh fdirctrl |= (dropqueue << IXGBE_FDIRCTRL_DROP_Q_SHIFT); 1440 1.14 msaitoh if ((hw->mac.type == ixgbe_mac_X550) || 1441 1.15 msaitoh (hw->mac.type == ixgbe_mac_X550EM_x) || 1442 1.15 msaitoh (hw->mac.type == ixgbe_mac_X550EM_a)) 1443 1.14 msaitoh fdirctrl |= IXGBE_FDIRCTRL_DROP_NO_MATCH; 1444 1.14 msaitoh 1445 1.14 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, 1446 1.14 msaitoh (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) | 1447 1.14 msaitoh IXGBE_FDIRCMD_CLEARHT)); 1448 1.14 msaitoh IXGBE_WRITE_FLUSH(hw); 1449 1.14 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, 1450 1.14 msaitoh (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) & 1451 1.14 msaitoh ~IXGBE_FDIRCMD_CLEARHT)); 1452 1.14 msaitoh IXGBE_WRITE_FLUSH(hw); 1453 1.14 msaitoh 1454 1.14 msaitoh /* write hashes and fdirctrl register, poll for completion */ 1455 1.14 msaitoh ixgbe_fdir_enable_82599(hw, fdirctrl); 1456 1.14 msaitoh } 1457 1.14 msaitoh 1458 1.1 dyoung /* 1459 1.1 dyoung * These defines allow us to quickly generate all of the necessary instructions 1460 1.1 dyoung * in the function below by simply calling out IXGBE_COMPUTE_SIG_HASH_ITERATION 1461 1.1 dyoung * for values 0 through 15 1462 1.1 dyoung */ 1463 1.1 dyoung #define IXGBE_ATR_COMMON_HASH_KEY \ 1464 1.1 dyoung (IXGBE_ATR_BUCKET_HASH_KEY & IXGBE_ATR_SIGNATURE_HASH_KEY) 1465 1.1 dyoung #define IXGBE_COMPUTE_SIG_HASH_ITERATION(_n) \ 1466 1.1 dyoung do { \ 1467 1.1 dyoung u32 n = (_n); \ 1468 1.1 dyoung if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << n)) \ 1469 1.1 dyoung common_hash ^= lo_hash_dword >> n; \ 1470 1.1 dyoung else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \ 1471 1.1 dyoung bucket_hash ^= lo_hash_dword >> n; \ 1472 1.1 dyoung else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << n)) \ 1473 1.1 dyoung sig_hash ^= lo_hash_dword << (16 - n); \ 1474 1.1 dyoung if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << (n + 16))) \ 1475 1.1 dyoung common_hash ^= hi_hash_dword >> n; \ 1476 1.1 dyoung else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \ 1477 1.1 dyoung bucket_hash ^= hi_hash_dword >> n; \ 1478 1.1 dyoung else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << (n + 16))) \ 1479 1.1 dyoung sig_hash ^= hi_hash_dword << (16 - n); \ 1480 1.12 msaitoh } while (0) 1481 1.1 dyoung 1482 1.1 dyoung /** 1483 1.26 msaitoh * ixgbe_atr_compute_sig_hash_82599 - Compute the signature hash 1484 1.26 msaitoh * @input: input bitstream to compute the hash on 1485 1.26 msaitoh * @common: compressed common input dword 1486 1.26 msaitoh * 1487 1.26 msaitoh * This function is almost identical to the function above but contains 1488 1.26 msaitoh * several optimizations such as unwinding all of the loops, letting the 1489 1.26 msaitoh * compiler work out all of the conditional ifs since the keys are static 1490 1.26 msaitoh * defines, and computing two keys at once since the hashed dword stream 1491 1.26 msaitoh * will be the same for both keys. 1492 1.1 dyoung **/ 1493 1.6 msaitoh u32 ixgbe_atr_compute_sig_hash_82599(union ixgbe_atr_hash_dword input, 1494 1.6 msaitoh union ixgbe_atr_hash_dword common) 1495 1.1 dyoung { 1496 1.1 dyoung u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; 1497 1.1 dyoung u32 sig_hash = 0, bucket_hash = 0, common_hash = 0; 1498 1.1 dyoung 1499 1.1 dyoung /* record the flow_vm_vlan bits as they are a key part to the hash */ 1500 1.1 dyoung flow_vm_vlan = IXGBE_NTOHL(input.dword); 1501 1.1 dyoung 1502 1.1 dyoung /* generate common hash dword */ 1503 1.1 dyoung hi_hash_dword = IXGBE_NTOHL(common.dword); 1504 1.1 dyoung 1505 1.1 dyoung /* low dword is word swapped version of common */ 1506 1.1 dyoung lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16); 1507 1.1 dyoung 1508 1.1 dyoung /* apply flow ID/VM pool/VLAN ID bits to hash words */ 1509 1.1 dyoung hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16); 1510 1.1 dyoung 1511 1.1 dyoung /* Process bits 0 and 16 */ 1512 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(0); 1513 1.1 dyoung 1514 1.1 dyoung /* 1515 1.1 dyoung * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to 1516 1.1 dyoung * delay this because bit 0 of the stream should not be processed 1517 1.12 msaitoh * so we do not add the VLAN until after bit 0 was processed 1518 1.1 dyoung */ 1519 1.1 dyoung lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16); 1520 1.1 dyoung 1521 1.1 dyoung /* Process remaining 30 bit of the key */ 1522 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(1); 1523 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(2); 1524 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(3); 1525 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(4); 1526 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(5); 1527 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(6); 1528 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(7); 1529 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(8); 1530 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(9); 1531 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(10); 1532 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(11); 1533 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(12); 1534 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(13); 1535 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(14); 1536 1.1 dyoung IXGBE_COMPUTE_SIG_HASH_ITERATION(15); 1537 1.1 dyoung 1538 1.1 dyoung /* combine common_hash result with signature and bucket hashes */ 1539 1.1 dyoung bucket_hash ^= common_hash; 1540 1.1 dyoung bucket_hash &= IXGBE_ATR_HASH_MASK; 1541 1.1 dyoung 1542 1.1 dyoung sig_hash ^= common_hash << 16; 1543 1.1 dyoung sig_hash &= IXGBE_ATR_HASH_MASK << 16; 1544 1.1 dyoung 1545 1.1 dyoung /* return completed signature hash */ 1546 1.1 dyoung return sig_hash ^ bucket_hash; 1547 1.1 dyoung } 1548 1.1 dyoung 1549 1.1 dyoung /** 1550 1.26 msaitoh * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter 1551 1.26 msaitoh * @hw: pointer to hardware structure 1552 1.26 msaitoh * @input: unique input dword 1553 1.26 msaitoh * @common: compressed common input dword 1554 1.26 msaitoh * @queue: queue index to direct traffic to 1555 1.12 msaitoh * 1556 1.12 msaitoh * Note that the tunnel bit in input must not be set when the hardware 1557 1.12 msaitoh * tunneling support does not exist. 1558 1.1 dyoung **/ 1559 1.14 msaitoh void ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, 1560 1.14 msaitoh union ixgbe_atr_hash_dword input, 1561 1.14 msaitoh union ixgbe_atr_hash_dword common, 1562 1.14 msaitoh u8 queue) 1563 1.1 dyoung { 1564 1.12 msaitoh u64 fdirhashcmd; 1565 1.12 msaitoh u8 flow_type; 1566 1.12 msaitoh bool tunnel; 1567 1.12 msaitoh u32 fdircmd; 1568 1.1 dyoung 1569 1.1 dyoung DEBUGFUNC("ixgbe_fdir_add_signature_filter_82599"); 1570 1.1 dyoung 1571 1.1 dyoung /* 1572 1.1 dyoung * Get the flow_type in order to program FDIRCMD properly 1573 1.1 dyoung * lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 1574 1.12 msaitoh * fifth is FDIRCMD.TUNNEL_FILTER 1575 1.1 dyoung */ 1576 1.12 msaitoh tunnel = !!(input.formatted.flow_type & IXGBE_ATR_L4TYPE_TUNNEL_MASK); 1577 1.12 msaitoh flow_type = input.formatted.flow_type & 1578 1.12 msaitoh (IXGBE_ATR_L4TYPE_TUNNEL_MASK - 1); 1579 1.12 msaitoh switch (flow_type) { 1580 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_TCPV4: 1581 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_UDPV4: 1582 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_SCTPV4: 1583 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_TCPV6: 1584 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_UDPV6: 1585 1.1 dyoung case IXGBE_ATR_FLOW_TYPE_SCTPV6: 1586 1.1 dyoung break; 1587 1.1 dyoung default: 1588 1.1 dyoung DEBUGOUT(" Error on flow type input\n"); 1589 1.14 msaitoh return; 1590 1.1 dyoung } 1591 1.1 dyoung 1592 1.1 dyoung /* configure FDIRCMD register */ 1593 1.1 dyoung fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | 1594 1.6 msaitoh IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; 1595 1.12 msaitoh fdircmd |= (u32)flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; 1596 1.1 dyoung fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; 1597 1.12 msaitoh if (tunnel) 1598 1.12 msaitoh fdircmd |= IXGBE_FDIRCMD_TUNNEL_FILTER; 1599 1.1 dyoung 1600 1.1 dyoung /* 1601 1.1 dyoung * The lower 32-bits of fdirhashcmd is for FDIRHASH, the upper 32-bits 1602 1.1 dyoung * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. 1603 1.1 dyoung */ 1604 1.1 dyoung fdirhashcmd = (u64)fdircmd << 32; 1605 1.24 msaitoh fdirhashcmd |= (u64)ixgbe_atr_compute_sig_hash_82599(input, common); 1606 1.1 dyoung IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); 1607 1.1 dyoung 1608 1.1 dyoung DEBUGOUT2("Tx Queue=%x hash=%x\n", queue, (u32)fdirhashcmd); 1609 1.1 dyoung 1610 1.14 msaitoh return; 1611 1.1 dyoung } 1612 1.1 dyoung 1613 1.6 msaitoh #define IXGBE_COMPUTE_BKT_HASH_ITERATION(_n) \ 1614 1.6 msaitoh do { \ 1615 1.6 msaitoh u32 n = (_n); \ 1616 1.6 msaitoh if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \ 1617 1.6 msaitoh bucket_hash ^= lo_hash_dword >> n; \ 1618 1.6 msaitoh if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \ 1619 1.6 msaitoh bucket_hash ^= hi_hash_dword >> n; \ 1620 1.12 msaitoh } while (0) 1621 1.6 msaitoh 1622 1.6 msaitoh /** 1623 1.26 msaitoh * ixgbe_atr_compute_perfect_hash_82599 - Compute the perfect filter hash 1624 1.26 msaitoh * @input: input bitstream to compute the hash on 1625 1.26 msaitoh * @input_mask: mask for the input bitstream 1626 1.26 msaitoh * 1627 1.26 msaitoh * This function serves two main purposes. First it applies the input_mask 1628 1.26 msaitoh * to the atr_input resulting in a cleaned up atr_input data stream. 1629 1.26 msaitoh * Secondly it computes the hash and stores it in the bkt_hash field at 1630 1.26 msaitoh * the end of the input byte stream. This way it will be available for 1631 1.26 msaitoh * future use without needing to recompute the hash. 1632 1.6 msaitoh **/ 1633 1.6 msaitoh void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input, 1634 1.6 msaitoh union ixgbe_atr_input *input_mask) 1635 1.6 msaitoh { 1636 1.6 msaitoh 1637 1.6 msaitoh u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; 1638 1.6 msaitoh u32 bucket_hash = 0; 1639 1.12 msaitoh u32 hi_dword = 0; 1640 1.12 msaitoh u32 i = 0; 1641 1.6 msaitoh 1642 1.6 msaitoh /* Apply masks to input data */ 1643 1.12 msaitoh for (i = 0; i < 14; i++) 1644 1.12 msaitoh input->dword_stream[i] &= input_mask->dword_stream[i]; 1645 1.6 msaitoh 1646 1.6 msaitoh /* record the flow_vm_vlan bits as they are a key part to the hash */ 1647 1.6 msaitoh flow_vm_vlan = IXGBE_NTOHL(input->dword_stream[0]); 1648 1.6 msaitoh 1649 1.6 msaitoh /* generate common hash dword */ 1650 1.12 msaitoh for (i = 1; i <= 13; i++) 1651 1.12 msaitoh hi_dword ^= input->dword_stream[i]; 1652 1.12 msaitoh hi_hash_dword = IXGBE_NTOHL(hi_dword); 1653 1.6 msaitoh 1654 1.6 msaitoh /* low dword is word swapped version of common */ 1655 1.6 msaitoh lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16); 1656 1.6 msaitoh 1657 1.6 msaitoh /* apply flow ID/VM pool/VLAN ID bits to hash words */ 1658 1.6 msaitoh hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16); 1659 1.6 msaitoh 1660 1.6 msaitoh /* Process bits 0 and 16 */ 1661 1.6 msaitoh IXGBE_COMPUTE_BKT_HASH_ITERATION(0); 1662 1.6 msaitoh 1663 1.6 msaitoh /* 1664 1.6 msaitoh * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to 1665 1.6 msaitoh * delay this because bit 0 of the stream should not be processed 1666 1.12 msaitoh * so we do not add the VLAN until after bit 0 was processed 1667 1.6 msaitoh */ 1668 1.6 msaitoh lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16); 1669 1.6 msaitoh 1670 1.6 msaitoh /* Process remaining 30 bit of the key */ 1671 1.12 msaitoh for (i = 1; i <= 15; i++) 1672 1.12 msaitoh IXGBE_COMPUTE_BKT_HASH_ITERATION(i); 1673 1.6 msaitoh 1674 1.6 msaitoh /* 1675 1.6 msaitoh * Limit hash to 13 bits since max bucket count is 8K. 1676 1.6 msaitoh * Store result at the end of the input stream. 1677 1.6 msaitoh */ 1678 1.6 msaitoh input->formatted.bkt_hash = bucket_hash & 0x1FFF; 1679 1.6 msaitoh } 1680 1.6 msaitoh 1681 1.1 dyoung /** 1682 1.26 msaitoh * ixgbe_get_fdirtcpm_82599 - generate a TCP port from atr_input_masks 1683 1.26 msaitoh * @input_mask: mask to be bit swapped 1684 1.1 dyoung * 1685 1.26 msaitoh * The source and destination port masks for flow director are bit swapped 1686 1.26 msaitoh * in that bit 15 effects bit 0, 14 effects 1, 13, 2 etc. In order to 1687 1.26 msaitoh * generate a correctly swapped value we need to bit swap the mask and that 1688 1.26 msaitoh * is what is accomplished by this function. 1689 1.1 dyoung **/ 1690 1.6 msaitoh static u32 ixgbe_get_fdirtcpm_82599(union ixgbe_atr_input *input_mask) 1691 1.1 dyoung { 1692 1.6 msaitoh u32 mask = IXGBE_NTOHS(input_mask->formatted.dst_port); 1693 1.1 dyoung mask <<= IXGBE_FDIRTCPM_DPORTM_SHIFT; 1694 1.24 msaitoh mask |= (u32)IXGBE_NTOHS(input_mask->formatted.src_port); 1695 1.1 dyoung mask = ((mask & 0x55555555) << 1) | ((mask & 0xAAAAAAAA) >> 1); 1696 1.1 dyoung mask = ((mask & 0x33333333) << 2) | ((mask & 0xCCCCCCCC) >> 2); 1697 1.1 dyoung mask = ((mask & 0x0F0F0F0F) << 4) | ((mask & 0xF0F0F0F0) >> 4); 1698 1.1 dyoung return ((mask & 0x00FF00FF) << 8) | ((mask & 0xFF00FF00) >> 8); 1699 1.1 dyoung } 1700 1.1 dyoung 1701 1.1 dyoung /* 1702 1.1 dyoung * These two macros are meant to address the fact that we have registers 1703 1.1 dyoung * that are either all or in part big-endian. As a result on big-endian 1704 1.1 dyoung * systems we will end up byte swapping the value to little-endian before 1705 1.1 dyoung * it is byte swapped again and written to the hardware in the original 1706 1.1 dyoung * big-endian format. 1707 1.1 dyoung */ 1708 1.1 dyoung #define IXGBE_STORE_AS_BE32(_value) \ 1709 1.1 dyoung (((u32)(_value) >> 24) | (((u32)(_value) & 0x00FF0000) >> 8) | \ 1710 1.1 dyoung (((u32)(_value) & 0x0000FF00) << 8) | ((u32)(_value) << 24)) 1711 1.1 dyoung 1712 1.1 dyoung #define IXGBE_WRITE_REG_BE32(a, reg, value) \ 1713 1.1 dyoung IXGBE_WRITE_REG((a), (reg), IXGBE_STORE_AS_BE32(IXGBE_NTOHL(value))) 1714 1.1 dyoung 1715 1.1 dyoung #define IXGBE_STORE_AS_BE16(_value) \ 1716 1.6 msaitoh IXGBE_NTOHS(((u16)(_value) >> 8) | ((u16)(_value) << 8)) 1717 1.1 dyoung 1718 1.6 msaitoh s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw, 1719 1.12 msaitoh union ixgbe_atr_input *input_mask, bool cloud_mode) 1720 1.1 dyoung { 1721 1.6 msaitoh /* mask IPv6 since it is currently not supported */ 1722 1.6 msaitoh u32 fdirm = IXGBE_FDIRM_DIPv6; 1723 1.6 msaitoh u32 fdirtcpm; 1724 1.12 msaitoh u32 fdirip6m; 1725 1.19 msaitoh UNREFERENCED_1PARAMETER(cloud_mode); 1726 1.6 msaitoh DEBUGFUNC("ixgbe_fdir_set_atr_input_mask_82599"); 1727 1.1 dyoung 1728 1.1 dyoung /* 1729 1.6 msaitoh * Program the relevant mask registers. If src/dst_port or src/dst_addr 1730 1.6 msaitoh * are zero, then assume a full mask for that field. Also assume that 1731 1.6 msaitoh * a VLAN of 0 is unspecified, so mask that out as well. L4type 1732 1.6 msaitoh * cannot be masked out in this implementation. 1733 1.6 msaitoh * 1734 1.6 msaitoh * This also assumes IPv4 only. IPv6 masking isn't supported at this 1735 1.6 msaitoh * point in time. 1736 1.1 dyoung */ 1737 1.6 msaitoh 1738 1.6 msaitoh /* verify bucket hash is cleared on hash generation */ 1739 1.6 msaitoh if (input_mask->formatted.bkt_hash) 1740 1.6 msaitoh DEBUGOUT(" bucket hash should always be 0 in mask\n"); 1741 1.6 msaitoh 1742 1.6 msaitoh /* Program FDIRM and verify partial masks */ 1743 1.6 msaitoh switch (input_mask->formatted.vm_pool & 0x7F) { 1744 1.6 msaitoh case 0x0: 1745 1.6 msaitoh fdirm |= IXGBE_FDIRM_POOL; 1746 1.6 msaitoh case 0x7F: 1747 1.6 msaitoh break; 1748 1.6 msaitoh default: 1749 1.6 msaitoh DEBUGOUT(" Error on vm pool mask\n"); 1750 1.6 msaitoh return IXGBE_ERR_CONFIG; 1751 1.6 msaitoh } 1752 1.6 msaitoh 1753 1.6 msaitoh switch (input_mask->formatted.flow_type & IXGBE_ATR_L4TYPE_MASK) { 1754 1.6 msaitoh case 0x0: 1755 1.1 dyoung fdirm |= IXGBE_FDIRM_L4P; 1756 1.6 msaitoh if (input_mask->formatted.dst_port || 1757 1.6 msaitoh input_mask->formatted.src_port) { 1758 1.1 dyoung DEBUGOUT(" Error on src/dst port mask\n"); 1759 1.1 dyoung return IXGBE_ERR_CONFIG; 1760 1.1 dyoung } 1761 1.6 msaitoh case IXGBE_ATR_L4TYPE_MASK: 1762 1.1 dyoung break; 1763 1.1 dyoung default: 1764 1.6 msaitoh DEBUGOUT(" Error on flow type mask\n"); 1765 1.1 dyoung return IXGBE_ERR_CONFIG; 1766 1.1 dyoung } 1767 1.1 dyoung 1768 1.6 msaitoh switch (IXGBE_NTOHS(input_mask->formatted.vlan_id) & 0xEFFF) { 1769 1.6 msaitoh case 0x0000: 1770 1.15 msaitoh /* mask VLAN ID */ 1771 1.6 msaitoh fdirm |= IXGBE_FDIRM_VLANID; 1772 1.15 msaitoh /* fall through */ 1773 1.1 dyoung case 0x0FFF: 1774 1.6 msaitoh /* mask VLAN priority */ 1775 1.6 msaitoh fdirm |= IXGBE_FDIRM_VLANP; 1776 1.1 dyoung break; 1777 1.6 msaitoh case 0xE000: 1778 1.15 msaitoh /* mask VLAN ID only */ 1779 1.6 msaitoh fdirm |= IXGBE_FDIRM_VLANID; 1780 1.15 msaitoh /* fall through */ 1781 1.6 msaitoh case 0xEFFF: 1782 1.6 msaitoh /* no VLAN fields masked */ 1783 1.1 dyoung break; 1784 1.1 dyoung default: 1785 1.1 dyoung DEBUGOUT(" Error on VLAN mask\n"); 1786 1.1 dyoung return IXGBE_ERR_CONFIG; 1787 1.1 dyoung } 1788 1.1 dyoung 1789 1.6 msaitoh switch (input_mask->formatted.flex_bytes & 0xFFFF) { 1790 1.6 msaitoh case 0x0000: 1791 1.15 msaitoh /* Mask Flex Bytes */ 1792 1.6 msaitoh fdirm |= IXGBE_FDIRM_FLEX; 1793 1.15 msaitoh /* fall through */ 1794 1.6 msaitoh case 0xFFFF: 1795 1.6 msaitoh break; 1796 1.6 msaitoh default: 1797 1.6 msaitoh DEBUGOUT(" Error on flexible byte mask\n"); 1798 1.6 msaitoh return IXGBE_ERR_CONFIG; 1799 1.1 dyoung } 1800 1.1 dyoung 1801 1.12 msaitoh if (cloud_mode) { 1802 1.12 msaitoh fdirm |= IXGBE_FDIRM_L3P; 1803 1.12 msaitoh fdirip6m = ((u32) 0xFFFFU << IXGBE_FDIRIP6M_DIPM_SHIFT); 1804 1.12 msaitoh fdirip6m |= IXGBE_FDIRIP6M_ALWAYS_MASK; 1805 1.12 msaitoh 1806 1.12 msaitoh switch (input_mask->formatted.inner_mac[0] & 0xFF) { 1807 1.12 msaitoh case 0x00: 1808 1.12 msaitoh /* Mask inner MAC, fall through */ 1809 1.12 msaitoh fdirip6m |= IXGBE_FDIRIP6M_INNER_MAC; 1810 1.12 msaitoh case 0xFF: 1811 1.12 msaitoh break; 1812 1.12 msaitoh default: 1813 1.12 msaitoh DEBUGOUT(" Error on inner_mac byte mask\n"); 1814 1.12 msaitoh return IXGBE_ERR_CONFIG; 1815 1.12 msaitoh } 1816 1.12 msaitoh 1817 1.12 msaitoh switch (input_mask->formatted.tni_vni & 0xFFFFFFFF) { 1818 1.12 msaitoh case 0x0: 1819 1.12 msaitoh /* Mask vxlan id */ 1820 1.12 msaitoh fdirip6m |= IXGBE_FDIRIP6M_TNI_VNI; 1821 1.12 msaitoh break; 1822 1.12 msaitoh case 0x00FFFFFF: 1823 1.12 msaitoh fdirip6m |= IXGBE_FDIRIP6M_TNI_VNI_24; 1824 1.12 msaitoh break; 1825 1.12 msaitoh case 0xFFFFFFFF: 1826 1.12 msaitoh break; 1827 1.12 msaitoh default: 1828 1.12 msaitoh DEBUGOUT(" Error on TNI/VNI byte mask\n"); 1829 1.12 msaitoh return IXGBE_ERR_CONFIG; 1830 1.12 msaitoh } 1831 1.12 msaitoh 1832 1.12 msaitoh switch (input_mask->formatted.tunnel_type & 0xFFFF) { 1833 1.12 msaitoh case 0x0: 1834 1.30 msaitoh /* Mask tunnel type, fall through */ 1835 1.12 msaitoh fdirip6m |= IXGBE_FDIRIP6M_TUNNEL_TYPE; 1836 1.12 msaitoh case 0xFFFF: 1837 1.12 msaitoh break; 1838 1.12 msaitoh default: 1839 1.12 msaitoh DEBUGOUT(" Error on tunnel type byte mask\n"); 1840 1.12 msaitoh return IXGBE_ERR_CONFIG; 1841 1.12 msaitoh } 1842 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIP6M, fdirip6m); 1843 1.12 msaitoh 1844 1.15 msaitoh /* Set all bits in FDIRTCPM, FDIRUDPM, FDIRSCTPM, 1845 1.15 msaitoh * FDIRSIP4M and FDIRDIP4M in cloud mode to allow 1846 1.15 msaitoh * L3/L3 packets to tunnel. 1847 1.12 msaitoh */ 1848 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, 0xFFFFFFFF); 1849 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, 0xFFFFFFFF); 1850 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRDIP4M, 0xFFFFFFFF); 1851 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIP4M, 0xFFFFFFFF); 1852 1.15 msaitoh switch (hw->mac.type) { 1853 1.15 msaitoh case ixgbe_mac_X550: 1854 1.15 msaitoh case ixgbe_mac_X550EM_x: 1855 1.15 msaitoh case ixgbe_mac_X550EM_a: 1856 1.15 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, 0xFFFFFFFF); 1857 1.15 msaitoh break; 1858 1.15 msaitoh default: 1859 1.15 msaitoh break; 1860 1.15 msaitoh } 1861 1.12 msaitoh } 1862 1.12 msaitoh 1863 1.1 dyoung /* Now mask VM pool and destination IPv6 - bits 5 and 2 */ 1864 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FDIRM, fdirm); 1865 1.1 dyoung 1866 1.12 msaitoh if (!cloud_mode) { 1867 1.12 msaitoh /* store the TCP/UDP port masks, bit reversed from port 1868 1.12 msaitoh * layout */ 1869 1.12 msaitoh fdirtcpm = ixgbe_get_fdirtcpm_82599(input_mask); 1870 1.12 msaitoh 1871 1.12 msaitoh /* write both the same so that UDP and TCP use the same mask */ 1872 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, ~fdirtcpm); 1873 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, ~fdirtcpm); 1874 1.12 msaitoh /* also use it for SCTP */ 1875 1.12 msaitoh switch (hw->mac.type) { 1876 1.12 msaitoh case ixgbe_mac_X550: 1877 1.12 msaitoh case ixgbe_mac_X550EM_x: 1878 1.15 msaitoh case ixgbe_mac_X550EM_a: 1879 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, ~fdirtcpm); 1880 1.12 msaitoh break; 1881 1.12 msaitoh default: 1882 1.12 msaitoh break; 1883 1.12 msaitoh } 1884 1.6 msaitoh 1885 1.12 msaitoh /* store source and destination IP masks (big-enian) */ 1886 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIP4M, 1887 1.12 msaitoh ~input_mask->formatted.src_ip[0]); 1888 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRDIP4M, 1889 1.12 msaitoh ~input_mask->formatted.dst_ip[0]); 1890 1.27 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIP6M, 0xFFFFFFFF); 1891 1.12 msaitoh } 1892 1.6 msaitoh return IXGBE_SUCCESS; 1893 1.6 msaitoh } 1894 1.1 dyoung 1895 1.6 msaitoh s32 ixgbe_fdir_write_perfect_filter_82599(struct ixgbe_hw *hw, 1896 1.6 msaitoh union ixgbe_atr_input *input, 1897 1.12 msaitoh u16 soft_id, u8 queue, bool cloud_mode) 1898 1.6 msaitoh { 1899 1.6 msaitoh u32 fdirport, fdirvlan, fdirhash, fdircmd; 1900 1.12 msaitoh u32 addr_low, addr_high; 1901 1.12 msaitoh u32 cloud_type = 0; 1902 1.12 msaitoh s32 err; 1903 1.19 msaitoh UNREFERENCED_1PARAMETER(cloud_mode); 1904 1.6 msaitoh 1905 1.6 msaitoh DEBUGFUNC("ixgbe_fdir_write_perfect_filter_82599"); 1906 1.12 msaitoh if (!cloud_mode) { 1907 1.12 msaitoh /* currently IPv6 is not supported, must be programmed with 0 */ 1908 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(0), 1909 1.12 msaitoh input->formatted.src_ip[0]); 1910 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(1), 1911 1.12 msaitoh input->formatted.src_ip[1]); 1912 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(2), 1913 1.12 msaitoh input->formatted.src_ip[2]); 1914 1.12 msaitoh 1915 1.12 msaitoh /* record the source address (big-endian) */ 1916 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPSA, 1917 1.12 msaitoh input->formatted.src_ip[0]); 1918 1.12 msaitoh 1919 1.12 msaitoh /* record the first 32 bits of the destination address 1920 1.12 msaitoh * (big-endian) */ 1921 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPDA, 1922 1.12 msaitoh input->formatted.dst_ip[0]); 1923 1.12 msaitoh 1924 1.12 msaitoh /* record source and destination port (little-endian)*/ 1925 1.12 msaitoh fdirport = IXGBE_NTOHS(input->formatted.dst_port); 1926 1.12 msaitoh fdirport <<= IXGBE_FDIRPORT_DESTINATION_SHIFT; 1927 1.24 msaitoh fdirport |= (u32)IXGBE_NTOHS(input->formatted.src_port); 1928 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport); 1929 1.12 msaitoh } 1930 1.6 msaitoh 1931 1.12 msaitoh /* record VLAN (little-endian) and flex_bytes(big-endian) */ 1932 1.6 msaitoh fdirvlan = IXGBE_STORE_AS_BE16(input->formatted.flex_bytes); 1933 1.6 msaitoh fdirvlan <<= IXGBE_FDIRVLAN_FLEX_SHIFT; 1934 1.24 msaitoh fdirvlan |= (u32)IXGBE_NTOHS(input->formatted.vlan_id); 1935 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, fdirvlan); 1936 1.6 msaitoh 1937 1.12 msaitoh if (cloud_mode) { 1938 1.12 msaitoh if (input->formatted.tunnel_type != 0) 1939 1.12 msaitoh cloud_type = 0x80000000; 1940 1.12 msaitoh 1941 1.12 msaitoh addr_low = ((u32)input->formatted.inner_mac[0] | 1942 1.12 msaitoh ((u32)input->formatted.inner_mac[1] << 8) | 1943 1.12 msaitoh ((u32)input->formatted.inner_mac[2] << 16) | 1944 1.12 msaitoh ((u32)input->formatted.inner_mac[3] << 24)); 1945 1.12 msaitoh addr_high = ((u32)input->formatted.inner_mac[4] | 1946 1.12 msaitoh ((u32)input->formatted.inner_mac[5] << 8)); 1947 1.12 msaitoh cloud_type |= addr_high; 1948 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(0), addr_low); 1949 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(1), cloud_type); 1950 1.12 msaitoh IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(2), input->formatted.tni_vni); 1951 1.12 msaitoh } 1952 1.12 msaitoh 1953 1.6 msaitoh /* configure FDIRHASH register */ 1954 1.6 msaitoh fdirhash = input->formatted.bkt_hash; 1955 1.6 msaitoh fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; 1956 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); 1957 1.1 dyoung 1958 1.6 msaitoh /* 1959 1.6 msaitoh * flush all previous writes to make certain registers are 1960 1.6 msaitoh * programmed prior to issuing the command 1961 1.6 msaitoh */ 1962 1.6 msaitoh IXGBE_WRITE_FLUSH(hw); 1963 1.1 dyoung 1964 1.1 dyoung /* configure FDIRCMD register */ 1965 1.1 dyoung fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | 1966 1.1 dyoung IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; 1967 1.6 msaitoh if (queue == IXGBE_FDIR_DROP_QUEUE) 1968 1.6 msaitoh fdircmd |= IXGBE_FDIRCMD_DROP; 1969 1.12 msaitoh if (input->formatted.flow_type & IXGBE_ATR_L4TYPE_TUNNEL_MASK) 1970 1.12 msaitoh fdircmd |= IXGBE_FDIRCMD_TUNNEL_FILTER; 1971 1.1 dyoung fdircmd |= input->formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; 1972 1.1 dyoung fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; 1973 1.6 msaitoh fdircmd |= (u32)input->formatted.vm_pool << IXGBE_FDIRCMD_VT_POOL_SHIFT; 1974 1.6 msaitoh 1975 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, fdircmd); 1976 1.12 msaitoh err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd); 1977 1.12 msaitoh if (err) { 1978 1.12 msaitoh DEBUGOUT("Flow Director command did not complete!\n"); 1979 1.12 msaitoh return err; 1980 1.12 msaitoh } 1981 1.1 dyoung 1982 1.6 msaitoh return IXGBE_SUCCESS; 1983 1.6 msaitoh } 1984 1.6 msaitoh 1985 1.6 msaitoh s32 ixgbe_fdir_erase_perfect_filter_82599(struct ixgbe_hw *hw, 1986 1.6 msaitoh union ixgbe_atr_input *input, 1987 1.6 msaitoh u16 soft_id) 1988 1.6 msaitoh { 1989 1.6 msaitoh u32 fdirhash; 1990 1.12 msaitoh u32 fdircmd; 1991 1.12 msaitoh s32 err; 1992 1.6 msaitoh 1993 1.6 msaitoh /* configure FDIRHASH register */ 1994 1.6 msaitoh fdirhash = input->formatted.bkt_hash; 1995 1.1 dyoung fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; 1996 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); 1997 1.6 msaitoh 1998 1.6 msaitoh /* flush hash to HW */ 1999 1.6 msaitoh IXGBE_WRITE_FLUSH(hw); 2000 1.6 msaitoh 2001 1.6 msaitoh /* Query if filter is present */ 2002 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, IXGBE_FDIRCMD_CMD_QUERY_REM_FILT); 2003 1.6 msaitoh 2004 1.12 msaitoh err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd); 2005 1.12 msaitoh if (err) { 2006 1.12 msaitoh DEBUGOUT("Flow Director command did not complete!\n"); 2007 1.12 msaitoh return err; 2008 1.6 msaitoh } 2009 1.6 msaitoh 2010 1.6 msaitoh /* if filter exists in hardware then remove it */ 2011 1.6 msaitoh if (fdircmd & IXGBE_FDIRCMD_FILTER_VALID) { 2012 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); 2013 1.6 msaitoh IXGBE_WRITE_FLUSH(hw); 2014 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, 2015 1.6 msaitoh IXGBE_FDIRCMD_CMD_REMOVE_FLOW); 2016 1.6 msaitoh } 2017 1.6 msaitoh 2018 1.12 msaitoh return IXGBE_SUCCESS; 2019 1.6 msaitoh } 2020 1.6 msaitoh 2021 1.6 msaitoh /** 2022 1.26 msaitoh * ixgbe_fdir_add_perfect_filter_82599 - Adds a perfect filter 2023 1.26 msaitoh * @hw: pointer to hardware structure 2024 1.26 msaitoh * @input: input bitstream 2025 1.26 msaitoh * @input_mask: mask for the input bitstream 2026 1.26 msaitoh * @soft_id: software index for the filters 2027 1.26 msaitoh * @queue: queue index to direct traffic to 2028 1.26 msaitoh * @cloud_mode: unused 2029 1.6 msaitoh * 2030 1.26 msaitoh * Note that the caller to this function must lock before calling, since the 2031 1.26 msaitoh * hardware writes must be protected from one another. 2032 1.6 msaitoh **/ 2033 1.6 msaitoh s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, 2034 1.6 msaitoh union ixgbe_atr_input *input, 2035 1.6 msaitoh union ixgbe_atr_input *input_mask, 2036 1.12 msaitoh u16 soft_id, u8 queue, bool cloud_mode) 2037 1.6 msaitoh { 2038 1.6 msaitoh s32 err = IXGBE_ERR_CONFIG; 2039 1.19 msaitoh UNREFERENCED_1PARAMETER(cloud_mode); 2040 1.6 msaitoh 2041 1.6 msaitoh DEBUGFUNC("ixgbe_fdir_add_perfect_filter_82599"); 2042 1.1 dyoung 2043 1.6 msaitoh /* 2044 1.6 msaitoh * Check flow_type formatting, and bail out before we touch the hardware 2045 1.6 msaitoh * if there's a configuration issue 2046 1.6 msaitoh */ 2047 1.6 msaitoh switch (input->formatted.flow_type) { 2048 1.6 msaitoh case IXGBE_ATR_FLOW_TYPE_IPV4: 2049 1.12 msaitoh case IXGBE_ATR_FLOW_TYPE_TUNNELED_IPV4: 2050 1.6 msaitoh input_mask->formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK; 2051 1.6 msaitoh if (input->formatted.dst_port || input->formatted.src_port) { 2052 1.6 msaitoh DEBUGOUT(" Error on src/dst port\n"); 2053 1.6 msaitoh return IXGBE_ERR_CONFIG; 2054 1.6 msaitoh } 2055 1.6 msaitoh break; 2056 1.6 msaitoh case IXGBE_ATR_FLOW_TYPE_SCTPV4: 2057 1.12 msaitoh case IXGBE_ATR_FLOW_TYPE_TUNNELED_SCTPV4: 2058 1.6 msaitoh if (input->formatted.dst_port || input->formatted.src_port) { 2059 1.6 msaitoh DEBUGOUT(" Error on src/dst port\n"); 2060 1.6 msaitoh return IXGBE_ERR_CONFIG; 2061 1.6 msaitoh } 2062 1.15 msaitoh /* fall through */ 2063 1.6 msaitoh case IXGBE_ATR_FLOW_TYPE_TCPV4: 2064 1.12 msaitoh case IXGBE_ATR_FLOW_TYPE_TUNNELED_TCPV4: 2065 1.6 msaitoh case IXGBE_ATR_FLOW_TYPE_UDPV4: 2066 1.12 msaitoh case IXGBE_ATR_FLOW_TYPE_TUNNELED_UDPV4: 2067 1.6 msaitoh input_mask->formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK | 2068 1.6 msaitoh IXGBE_ATR_L4TYPE_MASK; 2069 1.6 msaitoh break; 2070 1.6 msaitoh default: 2071 1.6 msaitoh DEBUGOUT(" Error on flow type input\n"); 2072 1.6 msaitoh return err; 2073 1.6 msaitoh } 2074 1.6 msaitoh 2075 1.6 msaitoh /* program input mask into the HW */ 2076 1.12 msaitoh err = ixgbe_fdir_set_input_mask_82599(hw, input_mask, cloud_mode); 2077 1.6 msaitoh if (err) 2078 1.6 msaitoh return err; 2079 1.6 msaitoh 2080 1.6 msaitoh /* apply mask and compute/store hash */ 2081 1.6 msaitoh ixgbe_atr_compute_perfect_hash_82599(input, input_mask); 2082 1.1 dyoung 2083 1.6 msaitoh /* program filters to filter memory */ 2084 1.6 msaitoh return ixgbe_fdir_write_perfect_filter_82599(hw, input, 2085 1.12 msaitoh soft_id, queue, cloud_mode); 2086 1.1 dyoung } 2087 1.1 dyoung 2088 1.1 dyoung /** 2089 1.26 msaitoh * ixgbe_read_analog_reg8_82599 - Reads 8 bit Omer analog register 2090 1.26 msaitoh * @hw: pointer to hardware structure 2091 1.26 msaitoh * @reg: analog register to read 2092 1.26 msaitoh * @val: read value 2093 1.1 dyoung * 2094 1.26 msaitoh * Performs read operation to Omer analog register specified. 2095 1.1 dyoung **/ 2096 1.1 dyoung s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) 2097 1.1 dyoung { 2098 1.1 dyoung u32 core_ctl; 2099 1.1 dyoung 2100 1.1 dyoung DEBUGFUNC("ixgbe_read_analog_reg8_82599"); 2101 1.1 dyoung 2102 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_CORECTL, IXGBE_CORECTL_WRITE_CMD | 2103 1.6 msaitoh (reg << 8)); 2104 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 2105 1.1 dyoung usec_delay(10); 2106 1.1 dyoung core_ctl = IXGBE_READ_REG(hw, IXGBE_CORECTL); 2107 1.1 dyoung *val = (u8)core_ctl; 2108 1.1 dyoung 2109 1.1 dyoung return IXGBE_SUCCESS; 2110 1.1 dyoung } 2111 1.1 dyoung 2112 1.1 dyoung /** 2113 1.26 msaitoh * ixgbe_write_analog_reg8_82599 - Writes 8 bit Omer analog register 2114 1.26 msaitoh * @hw: pointer to hardware structure 2115 1.26 msaitoh * @reg: atlas register to write 2116 1.26 msaitoh * @val: value to write 2117 1.1 dyoung * 2118 1.26 msaitoh * Performs write operation to Omer analog register specified. 2119 1.1 dyoung **/ 2120 1.1 dyoung s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) 2121 1.1 dyoung { 2122 1.1 dyoung u32 core_ctl; 2123 1.1 dyoung 2124 1.1 dyoung DEBUGFUNC("ixgbe_write_analog_reg8_82599"); 2125 1.1 dyoung 2126 1.1 dyoung core_ctl = (reg << 8) | val; 2127 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_CORECTL, core_ctl); 2128 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 2129 1.1 dyoung usec_delay(10); 2130 1.1 dyoung 2131 1.1 dyoung return IXGBE_SUCCESS; 2132 1.1 dyoung } 2133 1.1 dyoung 2134 1.1 dyoung /** 2135 1.26 msaitoh * ixgbe_start_hw_82599 - Prepare hardware for Tx/Rx 2136 1.26 msaitoh * @hw: pointer to hardware structure 2137 1.1 dyoung * 2138 1.26 msaitoh * Starts the hardware using the generic start_hw function 2139 1.26 msaitoh * and the generation start_hw function. 2140 1.26 msaitoh * Then performs revision-specific operations, if any. 2141 1.1 dyoung **/ 2142 1.6 msaitoh s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw) 2143 1.1 dyoung { 2144 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 2145 1.1 dyoung 2146 1.6 msaitoh DEBUGFUNC("ixgbe_start_hw_82599"); 2147 1.1 dyoung 2148 1.1 dyoung ret_val = ixgbe_start_hw_generic(hw); 2149 1.1 dyoung if (ret_val != IXGBE_SUCCESS) 2150 1.1 dyoung goto out; 2151 1.1 dyoung 2152 1.25 msaitoh ixgbe_start_hw_gen2(hw); 2153 1.1 dyoung 2154 1.1 dyoung /* We need to run link autotry after the driver loads */ 2155 1.1 dyoung hw->mac.autotry_restart = TRUE; 2156 1.1 dyoung 2157 1.1 dyoung if (ret_val == IXGBE_SUCCESS) 2158 1.1 dyoung ret_val = ixgbe_verify_fw_version_82599(hw); 2159 1.1 dyoung out: 2160 1.1 dyoung return ret_val; 2161 1.1 dyoung } 2162 1.1 dyoung 2163 1.1 dyoung /** 2164 1.26 msaitoh * ixgbe_identify_phy_82599 - Get physical layer module 2165 1.26 msaitoh * @hw: pointer to hardware structure 2166 1.1 dyoung * 2167 1.26 msaitoh * Determines the physical layer module found on the current adapter. 2168 1.26 msaitoh * If PHY already detected, maintains current PHY type in hw struct, 2169 1.26 msaitoh * otherwise executes the PHY detection routine. 2170 1.1 dyoung **/ 2171 1.1 dyoung s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) 2172 1.1 dyoung { 2173 1.12 msaitoh s32 status; 2174 1.1 dyoung 2175 1.1 dyoung DEBUGFUNC("ixgbe_identify_phy_82599"); 2176 1.1 dyoung 2177 1.1 dyoung /* Detect PHY if not unknown - returns success if already detected. */ 2178 1.1 dyoung status = ixgbe_identify_phy_generic(hw); 2179 1.1 dyoung if (status != IXGBE_SUCCESS) { 2180 1.1 dyoung /* 82599 10GBASE-T requires an external PHY */ 2181 1.1 dyoung if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper) 2182 1.12 msaitoh return status; 2183 1.1 dyoung else 2184 1.6 msaitoh status = ixgbe_identify_module_generic(hw); 2185 1.1 dyoung } 2186 1.1 dyoung 2187 1.1 dyoung /* Set PHY type none if no PHY detected */ 2188 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown) { 2189 1.1 dyoung hw->phy.type = ixgbe_phy_none; 2190 1.12 msaitoh return IXGBE_SUCCESS; 2191 1.1 dyoung } 2192 1.1 dyoung 2193 1.1 dyoung /* Return error if SFP module has been detected but is not supported */ 2194 1.1 dyoung if (hw->phy.type == ixgbe_phy_sfp_unsupported) 2195 1.12 msaitoh return IXGBE_ERR_SFP_NOT_SUPPORTED; 2196 1.1 dyoung 2197 1.1 dyoung return status; 2198 1.1 dyoung } 2199 1.1 dyoung 2200 1.1 dyoung /** 2201 1.26 msaitoh * ixgbe_get_supported_physical_layer_82599 - Returns physical layer type 2202 1.26 msaitoh * @hw: pointer to hardware structure 2203 1.1 dyoung * 2204 1.26 msaitoh * Determines physical layer capabilities of the current configuration. 2205 1.1 dyoung **/ 2206 1.15 msaitoh u64 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw) 2207 1.1 dyoung { 2208 1.15 msaitoh u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 2209 1.1 dyoung u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 2210 1.1 dyoung u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); 2211 1.1 dyoung u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK; 2212 1.1 dyoung u32 pma_pmd_10g_parallel = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK; 2213 1.1 dyoung u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; 2214 1.1 dyoung u16 ext_ability = 0; 2215 1.1 dyoung 2216 1.1 dyoung DEBUGFUNC("ixgbe_get_support_physical_layer_82599"); 2217 1.1 dyoung 2218 1.1 dyoung hw->phy.ops.identify(hw); 2219 1.1 dyoung 2220 1.1 dyoung switch (hw->phy.type) { 2221 1.1 dyoung case ixgbe_phy_tn: 2222 1.1 dyoung case ixgbe_phy_cu_unknown: 2223 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, 2224 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability); 2225 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY) 2226 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T; 2227 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY) 2228 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; 2229 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY) 2230 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX; 2231 1.1 dyoung goto out; 2232 1.1 dyoung default: 2233 1.1 dyoung break; 2234 1.1 dyoung } 2235 1.1 dyoung 2236 1.1 dyoung switch (autoc & IXGBE_AUTOC_LMS_MASK) { 2237 1.1 dyoung case IXGBE_AUTOC_LMS_1G_AN: 2238 1.1 dyoung case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: 2239 1.1 dyoung if (pma_pmd_1g == IXGBE_AUTOC_1G_KX_BX) { 2240 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX | 2241 1.1 dyoung IXGBE_PHYSICAL_LAYER_1000BASE_BX; 2242 1.1 dyoung goto out; 2243 1.1 dyoung } else 2244 1.1 dyoung /* SFI mode so read SFP module */ 2245 1.1 dyoung goto sfp_check; 2246 1.1 dyoung break; 2247 1.1 dyoung case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: 2248 1.1 dyoung if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_CX4) 2249 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; 2250 1.1 dyoung else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_KX4) 2251 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4; 2252 1.1 dyoung else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_XAUI) 2253 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_XAUI; 2254 1.1 dyoung goto out; 2255 1.1 dyoung break; 2256 1.1 dyoung case IXGBE_AUTOC_LMS_10G_SERIAL: 2257 1.1 dyoung if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_KR) { 2258 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR; 2259 1.1 dyoung goto out; 2260 1.1 dyoung } else if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI) 2261 1.1 dyoung goto sfp_check; 2262 1.1 dyoung break; 2263 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_KX_KR: 2264 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN: 2265 1.1 dyoung if (autoc & IXGBE_AUTOC_KX_SUPP) 2266 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX; 2267 1.1 dyoung if (autoc & IXGBE_AUTOC_KX4_SUPP) 2268 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4; 2269 1.1 dyoung if (autoc & IXGBE_AUTOC_KR_SUPP) 2270 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KR; 2271 1.1 dyoung goto out; 2272 1.1 dyoung break; 2273 1.1 dyoung default: 2274 1.1 dyoung goto out; 2275 1.1 dyoung break; 2276 1.1 dyoung } 2277 1.1 dyoung 2278 1.1 dyoung sfp_check: 2279 1.1 dyoung /* SFP check must be done last since DA modules are sometimes used to 2280 1.1 dyoung * test KR mode - we need to id KR mode correctly before SFP module. 2281 1.1 dyoung * Call identify_sfp because the pluggable module may have changed */ 2282 1.12 msaitoh physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw); 2283 1.1 dyoung out: 2284 1.1 dyoung return physical_layer; 2285 1.1 dyoung } 2286 1.1 dyoung 2287 1.1 dyoung /** 2288 1.26 msaitoh * ixgbe_enable_rx_dma_82599 - Enable the Rx DMA unit on 82599 2289 1.26 msaitoh * @hw: pointer to hardware structure 2290 1.26 msaitoh * @regval: register value to write to RXCTRL 2291 1.1 dyoung * 2292 1.26 msaitoh * Enables the Rx DMA unit for 82599 2293 1.1 dyoung **/ 2294 1.1 dyoung s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) 2295 1.1 dyoung { 2296 1.1 dyoung 2297 1.1 dyoung DEBUGFUNC("ixgbe_enable_rx_dma_82599"); 2298 1.1 dyoung 2299 1.1 dyoung /* 2300 1.1 dyoung * Workaround for 82599 silicon errata when enabling the Rx datapath. 2301 1.1 dyoung * If traffic is incoming before we enable the Rx unit, it could hang 2302 1.1 dyoung * the Rx DMA unit. Therefore, make sure the security engine is 2303 1.1 dyoung * completely disabled prior to enabling the Rx unit. 2304 1.1 dyoung */ 2305 1.1 dyoung 2306 1.6 msaitoh hw->mac.ops.disable_sec_rx_path(hw); 2307 1.1 dyoung 2308 1.12 msaitoh if (regval & IXGBE_RXCTRL_RXEN) 2309 1.12 msaitoh ixgbe_enable_rx(hw); 2310 1.12 msaitoh else 2311 1.12 msaitoh ixgbe_disable_rx(hw); 2312 1.6 msaitoh 2313 1.6 msaitoh hw->mac.ops.enable_sec_rx_path(hw); 2314 1.1 dyoung 2315 1.1 dyoung return IXGBE_SUCCESS; 2316 1.1 dyoung } 2317 1.1 dyoung 2318 1.1 dyoung /** 2319 1.26 msaitoh * ixgbe_verify_fw_version_82599 - verify FW version for 82599 2320 1.26 msaitoh * @hw: pointer to hardware structure 2321 1.1 dyoung * 2322 1.26 msaitoh * Verifies that installed the firmware version is 0.6 or higher 2323 1.26 msaitoh * for SFI devices. All 82599 SFI devices should have version 0.6 or higher. 2324 1.1 dyoung * 2325 1.26 msaitoh * Returns IXGBE_ERR_EEPROM_VERSION if the FW is not present or 2326 1.26 msaitoh * if the FW version is not supported. 2327 1.1 dyoung **/ 2328 1.10 msaitoh static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw) 2329 1.1 dyoung { 2330 1.1 dyoung s32 status = IXGBE_ERR_EEPROM_VERSION; 2331 1.1 dyoung u16 fw_offset, fw_ptp_cfg_offset; 2332 1.10 msaitoh u16 fw_version; 2333 1.1 dyoung 2334 1.1 dyoung DEBUGFUNC("ixgbe_verify_fw_version_82599"); 2335 1.1 dyoung 2336 1.1 dyoung /* firmware check is only necessary for SFI devices */ 2337 1.1 dyoung if (hw->phy.media_type != ixgbe_media_type_fiber) { 2338 1.1 dyoung status = IXGBE_SUCCESS; 2339 1.1 dyoung goto fw_version_out; 2340 1.1 dyoung } 2341 1.1 dyoung 2342 1.1 dyoung /* get the offset to the Firmware Module block */ 2343 1.10 msaitoh if (hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset)) { 2344 1.10 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 2345 1.10 msaitoh "eeprom read at offset %d failed", IXGBE_FW_PTR); 2346 1.10 msaitoh return IXGBE_ERR_EEPROM_VERSION; 2347 1.10 msaitoh } 2348 1.1 dyoung 2349 1.1 dyoung if ((fw_offset == 0) || (fw_offset == 0xFFFF)) 2350 1.1 dyoung goto fw_version_out; 2351 1.1 dyoung 2352 1.1 dyoung /* get the offset to the Pass Through Patch Configuration block */ 2353 1.10 msaitoh if (hw->eeprom.ops.read(hw, (fw_offset + 2354 1.6 msaitoh IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR), 2355 1.10 msaitoh &fw_ptp_cfg_offset)) { 2356 1.10 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 2357 1.10 msaitoh "eeprom read at offset %d failed", 2358 1.10 msaitoh fw_offset + 2359 1.10 msaitoh IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR); 2360 1.10 msaitoh return IXGBE_ERR_EEPROM_VERSION; 2361 1.10 msaitoh } 2362 1.1 dyoung 2363 1.1 dyoung if ((fw_ptp_cfg_offset == 0) || (fw_ptp_cfg_offset == 0xFFFF)) 2364 1.1 dyoung goto fw_version_out; 2365 1.1 dyoung 2366 1.1 dyoung /* get the firmware version */ 2367 1.10 msaitoh if (hw->eeprom.ops.read(hw, (fw_ptp_cfg_offset + 2368 1.10 msaitoh IXGBE_FW_PATCH_VERSION_4), &fw_version)) { 2369 1.10 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 2370 1.10 msaitoh "eeprom read at offset %d failed", 2371 1.10 msaitoh fw_ptp_cfg_offset + IXGBE_FW_PATCH_VERSION_4); 2372 1.10 msaitoh return IXGBE_ERR_EEPROM_VERSION; 2373 1.10 msaitoh } 2374 1.1 dyoung 2375 1.1 dyoung if (fw_version > 0x5) 2376 1.1 dyoung status = IXGBE_SUCCESS; 2377 1.1 dyoung 2378 1.1 dyoung fw_version_out: 2379 1.1 dyoung return status; 2380 1.1 dyoung } 2381 1.1 dyoung 2382 1.1 dyoung /** 2383 1.26 msaitoh * ixgbe_verify_lesm_fw_enabled_82599 - Checks LESM FW module state. 2384 1.26 msaitoh * @hw: pointer to hardware structure 2385 1.1 dyoung * 2386 1.26 msaitoh * Returns TRUE if the LESM FW module is present and enabled. Otherwise 2387 1.26 msaitoh * returns FALSE. Smart Speed must be disabled if LESM FW module is enabled. 2388 1.1 dyoung **/ 2389 1.1 dyoung bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw) 2390 1.1 dyoung { 2391 1.1 dyoung bool lesm_enabled = FALSE; 2392 1.1 dyoung u16 fw_offset, fw_lesm_param_offset, fw_lesm_state; 2393 1.1 dyoung s32 status; 2394 1.1 dyoung 2395 1.1 dyoung DEBUGFUNC("ixgbe_verify_lesm_fw_enabled_82599"); 2396 1.1 dyoung 2397 1.1 dyoung /* get the offset to the Firmware Module block */ 2398 1.1 dyoung status = hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset); 2399 1.1 dyoung 2400 1.1 dyoung if ((status != IXGBE_SUCCESS) || 2401 1.1 dyoung (fw_offset == 0) || (fw_offset == 0xFFFF)) 2402 1.1 dyoung goto out; 2403 1.1 dyoung 2404 1.1 dyoung /* get the offset to the LESM Parameters block */ 2405 1.1 dyoung status = hw->eeprom.ops.read(hw, (fw_offset + 2406 1.6 msaitoh IXGBE_FW_LESM_PARAMETERS_PTR), 2407 1.6 msaitoh &fw_lesm_param_offset); 2408 1.1 dyoung 2409 1.1 dyoung if ((status != IXGBE_SUCCESS) || 2410 1.1 dyoung (fw_lesm_param_offset == 0) || (fw_lesm_param_offset == 0xFFFF)) 2411 1.1 dyoung goto out; 2412 1.1 dyoung 2413 1.12 msaitoh /* get the LESM state word */ 2414 1.1 dyoung status = hw->eeprom.ops.read(hw, (fw_lesm_param_offset + 2415 1.6 msaitoh IXGBE_FW_LESM_STATE_1), 2416 1.6 msaitoh &fw_lesm_state); 2417 1.1 dyoung 2418 1.1 dyoung if ((status == IXGBE_SUCCESS) && 2419 1.1 dyoung (fw_lesm_state & IXGBE_FW_LESM_STATE_ENABLED)) 2420 1.1 dyoung lesm_enabled = TRUE; 2421 1.1 dyoung 2422 1.1 dyoung out: 2423 1.1 dyoung return lesm_enabled; 2424 1.1 dyoung } 2425 1.1 dyoung 2426 1.6 msaitoh /** 2427 1.26 msaitoh * ixgbe_read_eeprom_buffer_82599 - Read EEPROM word(s) using 2428 1.26 msaitoh * fastest available method 2429 1.6 msaitoh * 2430 1.26 msaitoh * @hw: pointer to hardware structure 2431 1.26 msaitoh * @offset: offset of word in EEPROM to read 2432 1.26 msaitoh * @words: number of words 2433 1.26 msaitoh * @data: word(s) read from the EEPROM 2434 1.6 msaitoh * 2435 1.26 msaitoh * Retrieves 16 bit word(s) read from EEPROM 2436 1.6 msaitoh **/ 2437 1.6 msaitoh static s32 ixgbe_read_eeprom_buffer_82599(struct ixgbe_hw *hw, u16 offset, 2438 1.6 msaitoh u16 words, u16 *data) 2439 1.6 msaitoh { 2440 1.6 msaitoh struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 2441 1.6 msaitoh s32 ret_val = IXGBE_ERR_CONFIG; 2442 1.6 msaitoh 2443 1.6 msaitoh DEBUGFUNC("ixgbe_read_eeprom_buffer_82599"); 2444 1.6 msaitoh 2445 1.6 msaitoh /* 2446 1.6 msaitoh * If EEPROM is detected and can be addressed using 14 bits, 2447 1.6 msaitoh * use EERD otherwise use bit bang 2448 1.6 msaitoh */ 2449 1.6 msaitoh if ((eeprom->type == ixgbe_eeprom_spi) && 2450 1.6 msaitoh (offset + (words - 1) <= IXGBE_EERD_MAX_ADDR)) 2451 1.6 msaitoh ret_val = ixgbe_read_eerd_buffer_generic(hw, offset, words, 2452 1.6 msaitoh data); 2453 1.6 msaitoh else 2454 1.6 msaitoh ret_val = ixgbe_read_eeprom_buffer_bit_bang_generic(hw, offset, 2455 1.6 msaitoh words, 2456 1.6 msaitoh data); 2457 1.6 msaitoh 2458 1.6 msaitoh return ret_val; 2459 1.6 msaitoh } 2460 1.6 msaitoh 2461 1.6 msaitoh /** 2462 1.26 msaitoh * ixgbe_read_eeprom_82599 - Read EEPROM word using 2463 1.26 msaitoh * fastest available method 2464 1.6 msaitoh * 2465 1.26 msaitoh * @hw: pointer to hardware structure 2466 1.26 msaitoh * @offset: offset of word in the EEPROM to read 2467 1.26 msaitoh * @data: word read from the EEPROM 2468 1.6 msaitoh * 2469 1.26 msaitoh * Reads a 16 bit word from the EEPROM 2470 1.6 msaitoh **/ 2471 1.6 msaitoh static s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw, 2472 1.6 msaitoh u16 offset, u16 *data) 2473 1.6 msaitoh { 2474 1.6 msaitoh struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 2475 1.6 msaitoh s32 ret_val = IXGBE_ERR_CONFIG; 2476 1.6 msaitoh 2477 1.6 msaitoh DEBUGFUNC("ixgbe_read_eeprom_82599"); 2478 1.6 msaitoh 2479 1.6 msaitoh /* 2480 1.6 msaitoh * If EEPROM is detected and can be addressed using 14 bits, 2481 1.6 msaitoh * use EERD otherwise use bit bang 2482 1.6 msaitoh */ 2483 1.6 msaitoh if ((eeprom->type == ixgbe_eeprom_spi) && 2484 1.6 msaitoh (offset <= IXGBE_EERD_MAX_ADDR)) 2485 1.6 msaitoh ret_val = ixgbe_read_eerd_generic(hw, offset, data); 2486 1.6 msaitoh else 2487 1.6 msaitoh ret_val = ixgbe_read_eeprom_bit_bang_generic(hw, offset, data); 2488 1.6 msaitoh 2489 1.6 msaitoh return ret_val; 2490 1.6 msaitoh } 2491 1.1 dyoung 2492 1.9 msaitoh /** 2493 1.9 msaitoh * ixgbe_reset_pipeline_82599 - perform pipeline reset 2494 1.9 msaitoh * 2495 1.26 msaitoh * @hw: pointer to hardware structure 2496 1.9 msaitoh * 2497 1.9 msaitoh * Reset pipeline by asserting Restart_AN together with LMS change to ensure 2498 1.12 msaitoh * full pipeline reset. This function assumes the SW/FW lock is held. 2499 1.9 msaitoh **/ 2500 1.17 msaitoh static s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw) 2501 1.9 msaitoh { 2502 1.9 msaitoh s32 ret_val; 2503 1.9 msaitoh u32 anlp1_reg = 0; 2504 1.9 msaitoh u32 i, autoc_reg, autoc2_reg; 2505 1.9 msaitoh 2506 1.9 msaitoh /* Enable link if disabled in NVM */ 2507 1.9 msaitoh autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2); 2508 1.9 msaitoh if (autoc2_reg & IXGBE_AUTOC2_LINK_DISABLE_MASK) { 2509 1.9 msaitoh autoc2_reg &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK; 2510 1.9 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg); 2511 1.9 msaitoh IXGBE_WRITE_FLUSH(hw); 2512 1.9 msaitoh } 2513 1.9 msaitoh 2514 1.12 msaitoh autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 2515 1.9 msaitoh autoc_reg |= IXGBE_AUTOC_AN_RESTART; 2516 1.9 msaitoh /* Write AUTOC register with toggled LMS[2] bit and Restart_AN */ 2517 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC, 2518 1.12 msaitoh autoc_reg ^ (0x4 << IXGBE_AUTOC_LMS_SHIFT)); 2519 1.9 msaitoh /* Wait for AN to leave state 0 */ 2520 1.9 msaitoh for (i = 0; i < 10; i++) { 2521 1.9 msaitoh msec_delay(4); 2522 1.9 msaitoh anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1); 2523 1.9 msaitoh if (anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK) 2524 1.9 msaitoh break; 2525 1.9 msaitoh } 2526 1.9 msaitoh 2527 1.9 msaitoh if (!(anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK)) { 2528 1.9 msaitoh DEBUGOUT("auto negotiation not completed\n"); 2529 1.9 msaitoh ret_val = IXGBE_ERR_RESET_FAILED; 2530 1.9 msaitoh goto reset_pipeline_out; 2531 1.9 msaitoh } 2532 1.9 msaitoh 2533 1.9 msaitoh ret_val = IXGBE_SUCCESS; 2534 1.9 msaitoh 2535 1.9 msaitoh reset_pipeline_out: 2536 1.9 msaitoh /* Write AUTOC register with original LMS field and Restart_AN */ 2537 1.9 msaitoh IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 2538 1.9 msaitoh IXGBE_WRITE_FLUSH(hw); 2539 1.9 msaitoh 2540 1.9 msaitoh return ret_val; 2541 1.9 msaitoh } 2542 1.9 msaitoh 2543 1.12 msaitoh /** 2544 1.26 msaitoh * ixgbe_read_i2c_byte_82599 - Reads 8 bit word over I2C 2545 1.26 msaitoh * @hw: pointer to hardware structure 2546 1.26 msaitoh * @byte_offset: byte offset to read 2547 1.26 msaitoh * @dev_addr: address to read from 2548 1.26 msaitoh * @data: value read 2549 1.12 msaitoh * 2550 1.26 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at 2551 1.26 msaitoh * a specified device address. 2552 1.12 msaitoh **/ 2553 1.12 msaitoh static s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset, 2554 1.12 msaitoh u8 dev_addr, u8 *data) 2555 1.12 msaitoh { 2556 1.12 msaitoh u32 esdp; 2557 1.12 msaitoh s32 status; 2558 1.12 msaitoh s32 timeout = 200; 2559 1.12 msaitoh 2560 1.12 msaitoh DEBUGFUNC("ixgbe_read_i2c_byte_82599"); 2561 1.7 msaitoh 2562 1.12 msaitoh if (hw->phy.qsfp_shared_i2c_bus == TRUE) { 2563 1.12 msaitoh /* Acquire I2C bus ownership. */ 2564 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2565 1.12 msaitoh esdp |= IXGBE_ESDP_SDP0; 2566 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 2567 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 2568 1.12 msaitoh 2569 1.12 msaitoh while (timeout) { 2570 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2571 1.12 msaitoh if (esdp & IXGBE_ESDP_SDP1) 2572 1.12 msaitoh break; 2573 1.12 msaitoh 2574 1.12 msaitoh msec_delay(5); 2575 1.12 msaitoh timeout--; 2576 1.12 msaitoh } 2577 1.12 msaitoh 2578 1.12 msaitoh if (!timeout) { 2579 1.12 msaitoh DEBUGOUT("Driver can't access resource," 2580 1.12 msaitoh " acquiring I2C bus timeout.\n"); 2581 1.12 msaitoh status = IXGBE_ERR_I2C; 2582 1.12 msaitoh goto release_i2c_access; 2583 1.12 msaitoh } 2584 1.12 msaitoh } 2585 1.12 msaitoh 2586 1.12 msaitoh status = ixgbe_read_i2c_byte_generic(hw, byte_offset, dev_addr, data); 2587 1.12 msaitoh 2588 1.12 msaitoh release_i2c_access: 2589 1.12 msaitoh 2590 1.12 msaitoh if (hw->phy.qsfp_shared_i2c_bus == TRUE) { 2591 1.12 msaitoh /* Release I2C bus ownership. */ 2592 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2593 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP0; 2594 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 2595 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 2596 1.12 msaitoh } 2597 1.12 msaitoh 2598 1.12 msaitoh return status; 2599 1.12 msaitoh } 2600 1.12 msaitoh 2601 1.12 msaitoh /** 2602 1.26 msaitoh * ixgbe_write_i2c_byte_82599 - Writes 8 bit word over I2C 2603 1.26 msaitoh * @hw: pointer to hardware structure 2604 1.26 msaitoh * @byte_offset: byte offset to write 2605 1.26 msaitoh * @dev_addr: address to read from 2606 1.26 msaitoh * @data: value to write 2607 1.12 msaitoh * 2608 1.26 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at 2609 1.26 msaitoh * a specified device address. 2610 1.12 msaitoh **/ 2611 1.12 msaitoh static s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset, 2612 1.12 msaitoh u8 dev_addr, u8 data) 2613 1.12 msaitoh { 2614 1.12 msaitoh u32 esdp; 2615 1.12 msaitoh s32 status; 2616 1.12 msaitoh s32 timeout = 200; 2617 1.12 msaitoh 2618 1.12 msaitoh DEBUGFUNC("ixgbe_write_i2c_byte_82599"); 2619 1.12 msaitoh 2620 1.12 msaitoh if (hw->phy.qsfp_shared_i2c_bus == TRUE) { 2621 1.12 msaitoh /* Acquire I2C bus ownership. */ 2622 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2623 1.12 msaitoh esdp |= IXGBE_ESDP_SDP0; 2624 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 2625 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 2626 1.12 msaitoh 2627 1.12 msaitoh while (timeout) { 2628 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2629 1.12 msaitoh if (esdp & IXGBE_ESDP_SDP1) 2630 1.12 msaitoh break; 2631 1.12 msaitoh 2632 1.12 msaitoh msec_delay(5); 2633 1.12 msaitoh timeout--; 2634 1.12 msaitoh } 2635 1.12 msaitoh 2636 1.12 msaitoh if (!timeout) { 2637 1.12 msaitoh DEBUGOUT("Driver can't access resource," 2638 1.12 msaitoh " acquiring I2C bus timeout.\n"); 2639 1.12 msaitoh status = IXGBE_ERR_I2C; 2640 1.12 msaitoh goto release_i2c_access; 2641 1.12 msaitoh } 2642 1.12 msaitoh } 2643 1.12 msaitoh 2644 1.12 msaitoh status = ixgbe_write_i2c_byte_generic(hw, byte_offset, dev_addr, data); 2645 1.12 msaitoh 2646 1.12 msaitoh release_i2c_access: 2647 1.12 msaitoh 2648 1.12 msaitoh if (hw->phy.qsfp_shared_i2c_bus == TRUE) { 2649 1.12 msaitoh /* Release I2C bus ownership. */ 2650 1.12 msaitoh esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 2651 1.12 msaitoh esdp &= ~IXGBE_ESDP_SDP0; 2652 1.12 msaitoh IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 2653 1.12 msaitoh IXGBE_WRITE_FLUSH(hw); 2654 1.12 msaitoh } 2655 1.12 msaitoh 2656 1.12 msaitoh return status; 2657 1.12 msaitoh } 2658