1 1.19 msaitoh /* $NetBSD: ixgbe_82598.c,v 1.19 2022/06/06 02:16:37 msaitoh Exp $ */ 2 1.9 msaitoh 3 1.1 dyoung /****************************************************************************** 4 1.10 msaitoh SPDX-License-Identifier: BSD-3-Clause 5 1.1 dyoung 6 1.18 msaitoh Copyright (c) 2001-2020, Intel Corporation 7 1.1 dyoung All rights reserved. 8 1.9 msaitoh 9 1.9 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.9 msaitoh 12 1.9 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.9 msaitoh 15 1.9 msaitoh 2. Redistributions in binary form must reproduce the above copyright 16 1.9 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.9 msaitoh 19 1.9 msaitoh 3. Neither the name of the Intel Corporation nor the names of its 20 1.9 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.9 msaitoh 23 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 24 1.9 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 1.9 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 1.9 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 27 1.9 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 1.9 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 1.9 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 1.9 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 1.9 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.12 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_82598.c 331224 2018-03-19 20:55:05Z erj $*/ 37 1.1 dyoung 38 1.16 msaitoh #include <sys/cdefs.h> 39 1.19 msaitoh __KERNEL_RCSID(0, "$NetBSD: ixgbe_82598.c,v 1.19 2022/06/06 02:16:37 msaitoh Exp $"); 40 1.16 msaitoh 41 1.1 dyoung #include "ixgbe_type.h" 42 1.2 msaitoh #include "ixgbe_82598.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.6 msaitoh #define IXGBE_82598_MAX_TX_QUEUES 32 48 1.6 msaitoh #define IXGBE_82598_MAX_RX_QUEUES 64 49 1.6 msaitoh #define IXGBE_82598_RAR_ENTRIES 16 50 1.6 msaitoh #define IXGBE_82598_MC_TBL_SIZE 128 51 1.6 msaitoh #define IXGBE_82598_VFT_TBL_SIZE 128 52 1.6 msaitoh #define IXGBE_82598_RX_PB_SIZE 512 53 1.6 msaitoh 54 1.1 dyoung static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, 55 1.2 msaitoh ixgbe_link_speed *speed, 56 1.2 msaitoh bool *autoneg); 57 1.1 dyoung static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw); 58 1.1 dyoung static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw, 59 1.2 msaitoh bool autoneg_wait_to_complete); 60 1.1 dyoung static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, 61 1.2 msaitoh ixgbe_link_speed *speed, bool *link_up, 62 1.2 msaitoh bool link_up_wait_to_complete); 63 1.1 dyoung static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, 64 1.2 msaitoh ixgbe_link_speed speed, 65 1.2 msaitoh bool autoneg_wait_to_complete); 66 1.1 dyoung static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw, 67 1.2 msaitoh ixgbe_link_speed speed, 68 1.2 msaitoh bool autoneg_wait_to_complete); 69 1.1 dyoung static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw); 70 1.1 dyoung static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); 71 1.1 dyoung static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw); 72 1.2 msaitoh static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb, 73 1.2 msaitoh u32 headroom, int strategy); 74 1.4 msaitoh static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset, 75 1.4 msaitoh u8 *sff8472_data); 76 1.1 dyoung /** 77 1.17 msaitoh * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout 78 1.17 msaitoh * @hw: pointer to the HW structure 79 1.1 dyoung * 80 1.17 msaitoh * The defaults for 82598 should be in the range of 50us to 50ms, 81 1.17 msaitoh * however the hardware default for these parts is 500us to 1ms which is less 82 1.17 msaitoh * than the 10ms recommended by the pci-e spec. To address this we need to 83 1.17 msaitoh * increase the value to either 10ms to 250ms for capability version 1 config, 84 1.17 msaitoh * or 16ms to 55ms for version 2. 85 1.1 dyoung **/ 86 1.1 dyoung void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) 87 1.1 dyoung { 88 1.1 dyoung u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR); 89 1.1 dyoung u16 pcie_devctl2; 90 1.1 dyoung 91 1.1 dyoung /* only take action if timeout value is defaulted to 0 */ 92 1.1 dyoung if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK) 93 1.1 dyoung goto out; 94 1.1 dyoung 95 1.1 dyoung /* 96 1.14 pgoyette * if capabilities version is type 1 we can write the 97 1.1 dyoung * timeout of 10ms to 250ms through the GCR register 98 1.1 dyoung */ 99 1.1 dyoung if (!(gcr & IXGBE_GCR_CAP_VER2)) { 100 1.1 dyoung gcr |= IXGBE_GCR_CMPL_TMOUT_10ms; 101 1.1 dyoung goto out; 102 1.1 dyoung } 103 1.1 dyoung 104 1.1 dyoung /* 105 1.1 dyoung * for version 2 capabilities we need to write the config space 106 1.1 dyoung * directly in order to set the completion timeout value for 107 1.1 dyoung * 16ms to 55ms 108 1.1 dyoung */ 109 1.1 dyoung pcie_devctl2 = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2); 110 1.1 dyoung pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms; 111 1.1 dyoung IXGBE_WRITE_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2); 112 1.1 dyoung out: 113 1.1 dyoung /* disable completion timeout resend */ 114 1.1 dyoung gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND; 115 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr); 116 1.1 dyoung } 117 1.1 dyoung 118 1.1 dyoung /** 119 1.17 msaitoh * ixgbe_init_ops_82598 - Inits func ptrs and MAC type 120 1.17 msaitoh * @hw: pointer to hardware structure 121 1.1 dyoung * 122 1.17 msaitoh * Initialize the function pointers and assign the MAC type for 82598. 123 1.17 msaitoh * Does not touch the hardware. 124 1.1 dyoung **/ 125 1.1 dyoung s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) 126 1.1 dyoung { 127 1.1 dyoung struct ixgbe_mac_info *mac = &hw->mac; 128 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy; 129 1.1 dyoung s32 ret_val; 130 1.1 dyoung 131 1.1 dyoung DEBUGFUNC("ixgbe_init_ops_82598"); 132 1.1 dyoung 133 1.1 dyoung ret_val = ixgbe_init_phy_ops_generic(hw); 134 1.1 dyoung ret_val = ixgbe_init_ops_generic(hw); 135 1.1 dyoung 136 1.1 dyoung /* PHY */ 137 1.6 msaitoh phy->ops.init = ixgbe_init_phy_ops_82598; 138 1.1 dyoung 139 1.1 dyoung /* MAC */ 140 1.6 msaitoh mac->ops.start_hw = ixgbe_start_hw_82598; 141 1.6 msaitoh mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_82598; 142 1.6 msaitoh mac->ops.reset_hw = ixgbe_reset_hw_82598; 143 1.6 msaitoh mac->ops.get_media_type = ixgbe_get_media_type_82598; 144 1.1 dyoung mac->ops.get_supported_physical_layer = 145 1.6 msaitoh ixgbe_get_supported_physical_layer_82598; 146 1.6 msaitoh mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82598; 147 1.6 msaitoh mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82598; 148 1.6 msaitoh mac->ops.set_lan_id = ixgbe_set_lan_id_multi_port_pcie_82598; 149 1.6 msaitoh mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_82598; 150 1.1 dyoung 151 1.1 dyoung /* RAR, Multicast, VLAN */ 152 1.6 msaitoh mac->ops.set_vmdq = ixgbe_set_vmdq_82598; 153 1.6 msaitoh mac->ops.clear_vmdq = ixgbe_clear_vmdq_82598; 154 1.6 msaitoh mac->ops.set_vfta = ixgbe_set_vfta_82598; 155 1.2 msaitoh mac->ops.set_vlvf = NULL; 156 1.6 msaitoh mac->ops.clear_vfta = ixgbe_clear_vfta_82598; 157 1.1 dyoung 158 1.1 dyoung /* Flow Control */ 159 1.6 msaitoh mac->ops.fc_enable = ixgbe_fc_enable_82598; 160 1.1 dyoung 161 1.6 msaitoh mac->mcft_size = IXGBE_82598_MC_TBL_SIZE; 162 1.6 msaitoh mac->vft_size = IXGBE_82598_VFT_TBL_SIZE; 163 1.6 msaitoh mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES; 164 1.6 msaitoh mac->rx_pb_size = IXGBE_82598_RX_PB_SIZE; 165 1.6 msaitoh mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES; 166 1.6 msaitoh mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES; 167 1.3 msaitoh mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw); 168 1.1 dyoung 169 1.1 dyoung /* SFP+ Module */ 170 1.6 msaitoh phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_82598; 171 1.6 msaitoh phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_82598; 172 1.1 dyoung 173 1.1 dyoung /* Link */ 174 1.6 msaitoh mac->ops.check_link = ixgbe_check_mac_link_82598; 175 1.6 msaitoh mac->ops.setup_link = ixgbe_setup_mac_link_82598; 176 1.1 dyoung mac->ops.flap_tx_laser = NULL; 177 1.6 msaitoh mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_82598; 178 1.6 msaitoh mac->ops.setup_rxpba = ixgbe_set_rxpba_82598; 179 1.2 msaitoh 180 1.2 msaitoh /* Manageability interface */ 181 1.2 msaitoh mac->ops.set_fw_drv_ver = NULL; 182 1.1 dyoung 183 1.5 msaitoh mac->ops.get_rtrup2tc = NULL; 184 1.5 msaitoh 185 1.1 dyoung return ret_val; 186 1.1 dyoung } 187 1.1 dyoung 188 1.1 dyoung /** 189 1.17 msaitoh * ixgbe_init_phy_ops_82598 - PHY/SFP specific init 190 1.17 msaitoh * @hw: pointer to hardware structure 191 1.1 dyoung * 192 1.17 msaitoh * Initialize any function pointers that were not able to be 193 1.17 msaitoh * set during init_shared_code because the PHY/SFP type was 194 1.17 msaitoh * not known. Perform the SFP init if necessary. 195 1.1 dyoung * 196 1.1 dyoung **/ 197 1.1 dyoung s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) 198 1.1 dyoung { 199 1.1 dyoung struct ixgbe_mac_info *mac = &hw->mac; 200 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy; 201 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 202 1.1 dyoung u16 list_offset, data_offset; 203 1.1 dyoung 204 1.1 dyoung DEBUGFUNC("ixgbe_init_phy_ops_82598"); 205 1.1 dyoung 206 1.1 dyoung /* Identify the PHY */ 207 1.1 dyoung phy->ops.identify(hw); 208 1.1 dyoung 209 1.1 dyoung /* Overwrite the link function pointers if copper PHY */ 210 1.1 dyoung if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { 211 1.6 msaitoh mac->ops.setup_link = ixgbe_setup_copper_link_82598; 212 1.1 dyoung mac->ops.get_link_capabilities = 213 1.6 msaitoh ixgbe_get_copper_link_capabilities_generic; 214 1.1 dyoung } 215 1.1 dyoung 216 1.1 dyoung switch (hw->phy.type) { 217 1.1 dyoung case ixgbe_phy_tn: 218 1.6 msaitoh phy->ops.setup_link = ixgbe_setup_phy_link_tnx; 219 1.6 msaitoh phy->ops.check_link = ixgbe_check_phy_link_tnx; 220 1.1 dyoung phy->ops.get_firmware_version = 221 1.6 msaitoh ixgbe_get_phy_firmware_version_tnx; 222 1.1 dyoung break; 223 1.1 dyoung case ixgbe_phy_nl: 224 1.6 msaitoh phy->ops.reset = ixgbe_reset_phy_nl; 225 1.1 dyoung 226 1.1 dyoung /* Call SFP+ identify routine to get the SFP+ module type */ 227 1.1 dyoung ret_val = phy->ops.identify_sfp(hw); 228 1.1 dyoung if (ret_val != IXGBE_SUCCESS) 229 1.1 dyoung goto out; 230 1.1 dyoung else if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) { 231 1.1 dyoung ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED; 232 1.1 dyoung goto out; 233 1.1 dyoung } 234 1.1 dyoung 235 1.1 dyoung /* Check to see if SFP+ module is supported */ 236 1.1 dyoung ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, 237 1.2 msaitoh &list_offset, 238 1.2 msaitoh &data_offset); 239 1.1 dyoung if (ret_val != IXGBE_SUCCESS) { 240 1.1 dyoung ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED; 241 1.1 dyoung goto out; 242 1.1 dyoung } 243 1.1 dyoung break; 244 1.1 dyoung default: 245 1.1 dyoung break; 246 1.1 dyoung } 247 1.1 dyoung 248 1.1 dyoung out: 249 1.1 dyoung return ret_val; 250 1.1 dyoung } 251 1.1 dyoung 252 1.1 dyoung /** 253 1.17 msaitoh * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx 254 1.17 msaitoh * @hw: pointer to hardware structure 255 1.1 dyoung * 256 1.17 msaitoh * Starts the hardware using the generic start_hw function. 257 1.17 msaitoh * Disables relaxed ordering Then set pcie completion timeout 258 1.1 dyoung * 259 1.1 dyoung **/ 260 1.1 dyoung s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) 261 1.1 dyoung { 262 1.1 dyoung u32 regval; 263 1.1 dyoung u32 i; 264 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 265 1.1 dyoung 266 1.1 dyoung DEBUGFUNC("ixgbe_start_hw_82598"); 267 1.1 dyoung 268 1.1 dyoung ret_val = ixgbe_start_hw_generic(hw); 269 1.7 msaitoh if (ret_val) 270 1.7 msaitoh return ret_val; 271 1.1 dyoung 272 1.1 dyoung /* Disable relaxed ordering */ 273 1.1 dyoung for (i = 0; ((i < hw->mac.max_tx_queues) && 274 1.1 dyoung (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { 275 1.1 dyoung regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); 276 1.3 msaitoh regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; 277 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); 278 1.1 dyoung } 279 1.1 dyoung 280 1.1 dyoung for (i = 0; ((i < hw->mac.max_rx_queues) && 281 1.1 dyoung (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { 282 1.1 dyoung regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); 283 1.3 msaitoh regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN | 284 1.3 msaitoh IXGBE_DCA_RXCTRL_HEAD_WRO_EN); 285 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); 286 1.1 dyoung } 287 1.1 dyoung 288 1.1 dyoung /* set the completion timeout for interface */ 289 1.7 msaitoh ixgbe_set_pcie_completion_timeout(hw); 290 1.1 dyoung 291 1.1 dyoung return ret_val; 292 1.1 dyoung } 293 1.1 dyoung 294 1.1 dyoung /** 295 1.17 msaitoh * ixgbe_get_link_capabilities_82598 - Determines link capabilities 296 1.17 msaitoh * @hw: pointer to hardware structure 297 1.17 msaitoh * @speed: pointer to link speed 298 1.17 msaitoh * @autoneg: boolean auto-negotiation value 299 1.1 dyoung * 300 1.17 msaitoh * Determines the link capabilities by reading the AUTOC register. 301 1.1 dyoung **/ 302 1.1 dyoung static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, 303 1.2 msaitoh ixgbe_link_speed *speed, 304 1.2 msaitoh bool *autoneg) 305 1.1 dyoung { 306 1.1 dyoung s32 status = IXGBE_SUCCESS; 307 1.1 dyoung u32 autoc = 0; 308 1.1 dyoung 309 1.1 dyoung DEBUGFUNC("ixgbe_get_link_capabilities_82598"); 310 1.1 dyoung 311 1.1 dyoung /* 312 1.1 dyoung * Determine link capabilities based on the stored value of AUTOC, 313 1.1 dyoung * which represents EEPROM defaults. If AUTOC value has not been 314 1.1 dyoung * stored, use the current register value. 315 1.1 dyoung */ 316 1.1 dyoung if (hw->mac.orig_link_settings_stored) 317 1.1 dyoung autoc = hw->mac.orig_autoc; 318 1.1 dyoung else 319 1.1 dyoung autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 320 1.1 dyoung 321 1.1 dyoung switch (autoc & IXGBE_AUTOC_LMS_MASK) { 322 1.1 dyoung case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: 323 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 324 1.1 dyoung *autoneg = FALSE; 325 1.1 dyoung break; 326 1.1 dyoung 327 1.1 dyoung case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: 328 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL; 329 1.1 dyoung *autoneg = FALSE; 330 1.1 dyoung break; 331 1.1 dyoung 332 1.1 dyoung case IXGBE_AUTOC_LMS_1G_AN: 333 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 334 1.1 dyoung *autoneg = TRUE; 335 1.1 dyoung break; 336 1.1 dyoung 337 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_AN: 338 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_AN_1G_AN: 339 1.1 dyoung *speed = IXGBE_LINK_SPEED_UNKNOWN; 340 1.1 dyoung if (autoc & IXGBE_AUTOC_KX4_SUPP) 341 1.1 dyoung *speed |= IXGBE_LINK_SPEED_10GB_FULL; 342 1.1 dyoung if (autoc & IXGBE_AUTOC_KX_SUPP) 343 1.1 dyoung *speed |= IXGBE_LINK_SPEED_1GB_FULL; 344 1.1 dyoung *autoneg = TRUE; 345 1.1 dyoung break; 346 1.1 dyoung 347 1.1 dyoung default: 348 1.1 dyoung status = IXGBE_ERR_LINK_SETUP; 349 1.1 dyoung break; 350 1.1 dyoung } 351 1.1 dyoung 352 1.1 dyoung return status; 353 1.1 dyoung } 354 1.1 dyoung 355 1.1 dyoung /** 356 1.17 msaitoh * ixgbe_get_media_type_82598 - Determines media type 357 1.17 msaitoh * @hw: pointer to hardware structure 358 1.1 dyoung * 359 1.17 msaitoh * Returns the media type (fiber, copper, backplane) 360 1.1 dyoung **/ 361 1.1 dyoung static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) 362 1.1 dyoung { 363 1.1 dyoung enum ixgbe_media_type media_type; 364 1.1 dyoung 365 1.1 dyoung DEBUGFUNC("ixgbe_get_media_type_82598"); 366 1.1 dyoung 367 1.1 dyoung /* Detect if there is a copper PHY attached. */ 368 1.1 dyoung switch (hw->phy.type) { 369 1.1 dyoung case ixgbe_phy_cu_unknown: 370 1.1 dyoung case ixgbe_phy_tn: 371 1.1 dyoung media_type = ixgbe_media_type_copper; 372 1.1 dyoung goto out; 373 1.1 dyoung default: 374 1.1 dyoung break; 375 1.1 dyoung } 376 1.1 dyoung 377 1.1 dyoung /* Media type for I82598 is based on device ID */ 378 1.1 dyoung switch (hw->device_id) { 379 1.1 dyoung case IXGBE_DEV_ID_82598: 380 1.1 dyoung case IXGBE_DEV_ID_82598_BX: 381 1.1 dyoung /* Default device ID is mezzanine card KX/KX4 */ 382 1.1 dyoung media_type = ixgbe_media_type_backplane; 383 1.1 dyoung break; 384 1.1 dyoung case IXGBE_DEV_ID_82598AF_DUAL_PORT: 385 1.1 dyoung case IXGBE_DEV_ID_82598AF_SINGLE_PORT: 386 1.1 dyoung case IXGBE_DEV_ID_82598_DA_DUAL_PORT: 387 1.1 dyoung case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: 388 1.1 dyoung case IXGBE_DEV_ID_82598EB_XF_LR: 389 1.1 dyoung case IXGBE_DEV_ID_82598EB_SFP_LOM: 390 1.1 dyoung media_type = ixgbe_media_type_fiber; 391 1.1 dyoung break; 392 1.1 dyoung case IXGBE_DEV_ID_82598EB_CX4: 393 1.1 dyoung case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: 394 1.1 dyoung media_type = ixgbe_media_type_cx4; 395 1.1 dyoung break; 396 1.1 dyoung case IXGBE_DEV_ID_82598AT: 397 1.1 dyoung case IXGBE_DEV_ID_82598AT2: 398 1.1 dyoung media_type = ixgbe_media_type_copper; 399 1.1 dyoung break; 400 1.1 dyoung default: 401 1.1 dyoung media_type = ixgbe_media_type_unknown; 402 1.1 dyoung break; 403 1.1 dyoung } 404 1.1 dyoung out: 405 1.1 dyoung return media_type; 406 1.1 dyoung } 407 1.1 dyoung 408 1.1 dyoung /** 409 1.17 msaitoh * ixgbe_fc_enable_82598 - Enable flow control 410 1.17 msaitoh * @hw: pointer to hardware structure 411 1.1 dyoung * 412 1.17 msaitoh * Enable flow control according to the current settings. 413 1.1 dyoung **/ 414 1.3 msaitoh s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw) 415 1.1 dyoung { 416 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 417 1.1 dyoung u32 fctrl_reg; 418 1.1 dyoung u32 rmcs_reg; 419 1.1 dyoung u32 reg; 420 1.3 msaitoh u32 fcrtl, fcrth; 421 1.1 dyoung u32 link_speed = 0; 422 1.3 msaitoh int i; 423 1.1 dyoung bool link_up; 424 1.1 dyoung 425 1.1 dyoung DEBUGFUNC("ixgbe_fc_enable_82598"); 426 1.1 dyoung 427 1.3 msaitoh /* Validate the water mark configuration */ 428 1.3 msaitoh if (!hw->fc.pause_time) { 429 1.3 msaitoh ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; 430 1.3 msaitoh goto out; 431 1.3 msaitoh } 432 1.3 msaitoh 433 1.3 msaitoh /* Low water mark of zero causes XOFF floods */ 434 1.3 msaitoh for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { 435 1.3 msaitoh if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && 436 1.3 msaitoh hw->fc.high_water[i]) { 437 1.3 msaitoh if (!hw->fc.low_water[i] || 438 1.3 msaitoh hw->fc.low_water[i] >= hw->fc.high_water[i]) { 439 1.3 msaitoh DEBUGOUT("Invalid water mark configuration\n"); 440 1.3 msaitoh ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; 441 1.3 msaitoh goto out; 442 1.3 msaitoh } 443 1.3 msaitoh } 444 1.3 msaitoh } 445 1.3 msaitoh 446 1.1 dyoung /* 447 1.1 dyoung * On 82598 having Rx FC on causes resets while doing 1G 448 1.1 dyoung * so if it's on turn it off once we know link_speed. For 449 1.1 dyoung * more details see 82598 Specification update. 450 1.1 dyoung */ 451 1.1 dyoung hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE); 452 1.1 dyoung if (link_up && link_speed == IXGBE_LINK_SPEED_1GB_FULL) { 453 1.1 dyoung switch (hw->fc.requested_mode) { 454 1.1 dyoung case ixgbe_fc_full: 455 1.1 dyoung hw->fc.requested_mode = ixgbe_fc_tx_pause; 456 1.1 dyoung break; 457 1.1 dyoung case ixgbe_fc_rx_pause: 458 1.1 dyoung hw->fc.requested_mode = ixgbe_fc_none; 459 1.1 dyoung break; 460 1.1 dyoung default: 461 1.1 dyoung /* no change */ 462 1.1 dyoung break; 463 1.1 dyoung } 464 1.1 dyoung } 465 1.1 dyoung 466 1.1 dyoung /* Negotiate the fc mode to use */ 467 1.3 msaitoh ixgbe_fc_autoneg(hw); 468 1.1 dyoung 469 1.1 dyoung /* Disable any previous flow control settings */ 470 1.1 dyoung fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL); 471 1.1 dyoung fctrl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE); 472 1.1 dyoung 473 1.1 dyoung rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS); 474 1.1 dyoung rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X); 475 1.1 dyoung 476 1.1 dyoung /* 477 1.1 dyoung * The possible values of fc.current_mode are: 478 1.1 dyoung * 0: Flow control is completely disabled 479 1.1 dyoung * 1: Rx flow control is enabled (we can receive pause frames, 480 1.1 dyoung * but not send pause frames). 481 1.1 dyoung * 2: Tx flow control is enabled (we can send pause frames but 482 1.1 dyoung * we do not support receiving pause frames). 483 1.1 dyoung * 3: Both Rx and Tx flow control (symmetric) are enabled. 484 1.1 dyoung * other: Invalid. 485 1.1 dyoung */ 486 1.1 dyoung switch (hw->fc.current_mode) { 487 1.1 dyoung case ixgbe_fc_none: 488 1.1 dyoung /* 489 1.1 dyoung * Flow control is disabled by software override or autoneg. 490 1.1 dyoung * The code below will actually disable it in the HW. 491 1.1 dyoung */ 492 1.1 dyoung break; 493 1.1 dyoung case ixgbe_fc_rx_pause: 494 1.1 dyoung /* 495 1.1 dyoung * Rx Flow control is enabled and Tx Flow control is 496 1.1 dyoung * disabled by software override. Since there really 497 1.1 dyoung * isn't a way to advertise that we are capable of RX 498 1.1 dyoung * Pause ONLY, we will advertise that we support both 499 1.1 dyoung * symmetric and asymmetric Rx PAUSE. Later, we will 500 1.1 dyoung * disable the adapter's ability to send PAUSE frames. 501 1.1 dyoung */ 502 1.1 dyoung fctrl_reg |= IXGBE_FCTRL_RFCE; 503 1.1 dyoung break; 504 1.1 dyoung case ixgbe_fc_tx_pause: 505 1.1 dyoung /* 506 1.1 dyoung * Tx Flow control is enabled, and Rx Flow control is 507 1.1 dyoung * disabled by software override. 508 1.1 dyoung */ 509 1.1 dyoung rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; 510 1.1 dyoung break; 511 1.1 dyoung case ixgbe_fc_full: 512 1.1 dyoung /* Flow control (both Rx and Tx) is enabled by SW override. */ 513 1.1 dyoung fctrl_reg |= IXGBE_FCTRL_RFCE; 514 1.1 dyoung rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; 515 1.1 dyoung break; 516 1.1 dyoung default: 517 1.1 dyoung DEBUGOUT("Flow control param set incorrectly\n"); 518 1.1 dyoung ret_val = IXGBE_ERR_CONFIG; 519 1.1 dyoung goto out; 520 1.1 dyoung break; 521 1.1 dyoung } 522 1.1 dyoung 523 1.1 dyoung /* Set 802.3x based flow control settings. */ 524 1.1 dyoung fctrl_reg |= IXGBE_FCTRL_DPF; 525 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl_reg); 526 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg); 527 1.1 dyoung 528 1.1 dyoung /* Set up and enable Rx high/low water mark thresholds, enable XON. */ 529 1.3 msaitoh for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) { 530 1.3 msaitoh if ((hw->fc.current_mode & ixgbe_fc_tx_pause) && 531 1.3 msaitoh hw->fc.high_water[i]) { 532 1.3 msaitoh fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE; 533 1.3 msaitoh fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN; 534 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl); 535 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), fcrth); 536 1.3 msaitoh } else { 537 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0); 538 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0); 539 1.3 msaitoh } 540 1.1 dyoung 541 1.1 dyoung } 542 1.1 dyoung 543 1.1 dyoung /* Configure pause time (2 TCs per register) */ 544 1.15 msaitoh reg = (u32)hw->fc.pause_time * 0x00010001; 545 1.3 msaitoh for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++) 546 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); 547 1.1 dyoung 548 1.3 msaitoh /* Configure flow control refresh threshold value */ 549 1.3 msaitoh IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); 550 1.1 dyoung 551 1.1 dyoung out: 552 1.1 dyoung return ret_val; 553 1.1 dyoung } 554 1.1 dyoung 555 1.1 dyoung /** 556 1.17 msaitoh * ixgbe_start_mac_link_82598 - Configures MAC link settings 557 1.17 msaitoh * @hw: pointer to hardware structure 558 1.17 msaitoh * @autoneg_wait_to_complete: TRUE when waiting for completion is needed 559 1.1 dyoung * 560 1.17 msaitoh * Configures link settings based on values in the ixgbe_hw struct. 561 1.17 msaitoh * Restarts the link. Performs autonegotiation if needed. 562 1.1 dyoung **/ 563 1.1 dyoung static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw, 564 1.2 msaitoh bool autoneg_wait_to_complete) 565 1.1 dyoung { 566 1.1 dyoung u32 autoc_reg; 567 1.1 dyoung u32 links_reg; 568 1.1 dyoung u32 i; 569 1.1 dyoung s32 status = IXGBE_SUCCESS; 570 1.1 dyoung 571 1.1 dyoung DEBUGFUNC("ixgbe_start_mac_link_82598"); 572 1.1 dyoung 573 1.1 dyoung /* Restart link */ 574 1.1 dyoung autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 575 1.1 dyoung autoc_reg |= IXGBE_AUTOC_AN_RESTART; 576 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 577 1.1 dyoung 578 1.1 dyoung /* Only poll for autoneg to complete if specified to do so */ 579 1.1 dyoung if (autoneg_wait_to_complete) { 580 1.1 dyoung if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == 581 1.1 dyoung IXGBE_AUTOC_LMS_KX4_AN || 582 1.1 dyoung (autoc_reg & IXGBE_AUTOC_LMS_MASK) == 583 1.1 dyoung IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { 584 1.1 dyoung links_reg = 0; /* Just in case Autoneg time = 0 */ 585 1.1 dyoung for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { 586 1.1 dyoung links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 587 1.1 dyoung if (links_reg & IXGBE_LINKS_KX_AN_COMP) 588 1.1 dyoung break; 589 1.1 dyoung msec_delay(100); 590 1.1 dyoung } 591 1.1 dyoung if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { 592 1.1 dyoung status = IXGBE_ERR_AUTONEG_NOT_COMPLETE; 593 1.1 dyoung DEBUGOUT("Autonegotiation did not complete.\n"); 594 1.1 dyoung } 595 1.1 dyoung } 596 1.1 dyoung } 597 1.1 dyoung 598 1.1 dyoung /* Add delay to filter out noises during initial link setup */ 599 1.1 dyoung msec_delay(50); 600 1.1 dyoung 601 1.1 dyoung return status; 602 1.1 dyoung } 603 1.1 dyoung 604 1.1 dyoung /** 605 1.17 msaitoh * ixgbe_validate_link_ready - Function looks for phy link 606 1.17 msaitoh * @hw: pointer to hardware structure 607 1.1 dyoung * 608 1.17 msaitoh * Function indicates success when phy link is available. If phy is not ready 609 1.17 msaitoh * within 5 seconds of MAC indicating link, the function returns error. 610 1.1 dyoung **/ 611 1.1 dyoung static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw) 612 1.1 dyoung { 613 1.1 dyoung u32 timeout; 614 1.1 dyoung u16 an_reg; 615 1.1 dyoung 616 1.1 dyoung if (hw->device_id != IXGBE_DEV_ID_82598AT2) 617 1.1 dyoung return IXGBE_SUCCESS; 618 1.1 dyoung 619 1.1 dyoung for (timeout = 0; 620 1.1 dyoung timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) { 621 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, 622 1.2 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &an_reg); 623 1.1 dyoung 624 1.1 dyoung if ((an_reg & IXGBE_MII_AUTONEG_COMPLETE) && 625 1.1 dyoung (an_reg & IXGBE_MII_AUTONEG_LINK_UP)) 626 1.1 dyoung break; 627 1.1 dyoung 628 1.1 dyoung msec_delay(100); 629 1.1 dyoung } 630 1.1 dyoung 631 1.1 dyoung if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) { 632 1.1 dyoung DEBUGOUT("Link was indicated but link is down\n"); 633 1.1 dyoung return IXGBE_ERR_LINK_SETUP; 634 1.1 dyoung } 635 1.1 dyoung 636 1.1 dyoung return IXGBE_SUCCESS; 637 1.1 dyoung } 638 1.1 dyoung 639 1.1 dyoung /** 640 1.17 msaitoh * ixgbe_check_mac_link_82598 - Get link/speed status 641 1.17 msaitoh * @hw: pointer to hardware structure 642 1.17 msaitoh * @speed: pointer to link speed 643 1.17 msaitoh * @link_up: TRUE is link is up, FALSE otherwise 644 1.17 msaitoh * @link_up_wait_to_complete: bool used to wait for link up or not 645 1.1 dyoung * 646 1.17 msaitoh * Reads the links register to determine if link is up and the current speed 647 1.1 dyoung **/ 648 1.1 dyoung static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, 649 1.2 msaitoh ixgbe_link_speed *speed, bool *link_up, 650 1.2 msaitoh bool link_up_wait_to_complete) 651 1.1 dyoung { 652 1.1 dyoung u32 links_reg; 653 1.1 dyoung u32 i; 654 1.1 dyoung u16 link_reg, adapt_comp_reg; 655 1.1 dyoung 656 1.1 dyoung DEBUGFUNC("ixgbe_check_mac_link_82598"); 657 1.1 dyoung 658 1.1 dyoung /* 659 1.1 dyoung * SERDES PHY requires us to read link status from undocumented 660 1.1 dyoung * register 0xC79F. Bit 0 set indicates link is up/ready; clear 661 1.1 dyoung * indicates link down. OxC00C is read to check that the XAUI lanes 662 1.1 dyoung * are active. Bit 0 clear indicates active; set indicates inactive. 663 1.1 dyoung */ 664 1.1 dyoung if (hw->phy.type == ixgbe_phy_nl) { 665 1.1 dyoung hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); 666 1.1 dyoung hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); 667 1.1 dyoung hw->phy.ops.read_reg(hw, 0xC00C, IXGBE_TWINAX_DEV, 668 1.2 msaitoh &adapt_comp_reg); 669 1.1 dyoung if (link_up_wait_to_complete) { 670 1.8 msaitoh for (i = 0; i < hw->mac.max_link_up_time; i++) { 671 1.1 dyoung if ((link_reg & 1) && 672 1.1 dyoung ((adapt_comp_reg & 1) == 0)) { 673 1.1 dyoung *link_up = TRUE; 674 1.1 dyoung break; 675 1.1 dyoung } else { 676 1.1 dyoung *link_up = FALSE; 677 1.1 dyoung } 678 1.1 dyoung msec_delay(100); 679 1.1 dyoung hw->phy.ops.read_reg(hw, 0xC79F, 680 1.2 msaitoh IXGBE_TWINAX_DEV, 681 1.2 msaitoh &link_reg); 682 1.1 dyoung hw->phy.ops.read_reg(hw, 0xC00C, 683 1.2 msaitoh IXGBE_TWINAX_DEV, 684 1.2 msaitoh &adapt_comp_reg); 685 1.1 dyoung } 686 1.1 dyoung } else { 687 1.1 dyoung if ((link_reg & 1) && ((adapt_comp_reg & 1) == 0)) 688 1.1 dyoung *link_up = TRUE; 689 1.1 dyoung else 690 1.1 dyoung *link_up = FALSE; 691 1.1 dyoung } 692 1.1 dyoung 693 1.1 dyoung if (*link_up == FALSE) 694 1.1 dyoung goto out; 695 1.1 dyoung } 696 1.1 dyoung 697 1.1 dyoung links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 698 1.1 dyoung if (link_up_wait_to_complete) { 699 1.8 msaitoh for (i = 0; i < hw->mac.max_link_up_time; i++) { 700 1.1 dyoung if (links_reg & IXGBE_LINKS_UP) { 701 1.1 dyoung *link_up = TRUE; 702 1.1 dyoung break; 703 1.1 dyoung } else { 704 1.1 dyoung *link_up = FALSE; 705 1.1 dyoung } 706 1.1 dyoung msec_delay(100); 707 1.1 dyoung links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 708 1.1 dyoung } 709 1.1 dyoung } else { 710 1.1 dyoung if (links_reg & IXGBE_LINKS_UP) 711 1.1 dyoung *link_up = TRUE; 712 1.1 dyoung else 713 1.1 dyoung *link_up = FALSE; 714 1.1 dyoung } 715 1.1 dyoung 716 1.1 dyoung if (links_reg & IXGBE_LINKS_SPEED) 717 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL; 718 1.1 dyoung else 719 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 720 1.1 dyoung 721 1.1 dyoung if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == TRUE) && 722 1.1 dyoung (ixgbe_validate_link_ready(hw) != IXGBE_SUCCESS)) 723 1.1 dyoung *link_up = FALSE; 724 1.1 dyoung 725 1.1 dyoung out: 726 1.1 dyoung return IXGBE_SUCCESS; 727 1.1 dyoung } 728 1.1 dyoung 729 1.1 dyoung /** 730 1.17 msaitoh * ixgbe_setup_mac_link_82598 - Set MAC link speed 731 1.17 msaitoh * @hw: pointer to hardware structure 732 1.17 msaitoh * @speed: new link speed 733 1.17 msaitoh * @autoneg_wait_to_complete: TRUE when waiting for completion is needed 734 1.1 dyoung * 735 1.17 msaitoh * Set the link speed in the AUTOC register and restarts link. 736 1.1 dyoung **/ 737 1.1 dyoung static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, 738 1.4 msaitoh ixgbe_link_speed speed, 739 1.2 msaitoh bool autoneg_wait_to_complete) 740 1.1 dyoung { 741 1.4 msaitoh bool autoneg = FALSE; 742 1.2 msaitoh s32 status = IXGBE_SUCCESS; 743 1.1 dyoung ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN; 744 1.2 msaitoh u32 curr_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 745 1.2 msaitoh u32 autoc = curr_autoc; 746 1.2 msaitoh u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; 747 1.1 dyoung 748 1.1 dyoung DEBUGFUNC("ixgbe_setup_mac_link_82598"); 749 1.1 dyoung 750 1.1 dyoung /* Check to see if speed passed in is supported. */ 751 1.1 dyoung ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); 752 1.1 dyoung speed &= link_capabilities; 753 1.1 dyoung 754 1.1 dyoung if (speed == IXGBE_LINK_SPEED_UNKNOWN) 755 1.1 dyoung status = IXGBE_ERR_LINK_SETUP; 756 1.1 dyoung 757 1.1 dyoung /* Set KX4/KX support according to speed requested */ 758 1.1 dyoung else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN || 759 1.2 msaitoh link_mode == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { 760 1.1 dyoung autoc &= ~IXGBE_AUTOC_KX4_KX_SUPP_MASK; 761 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) 762 1.1 dyoung autoc |= IXGBE_AUTOC_KX4_SUPP; 763 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) 764 1.1 dyoung autoc |= IXGBE_AUTOC_KX_SUPP; 765 1.1 dyoung if (autoc != curr_autoc) 766 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); 767 1.1 dyoung } 768 1.1 dyoung 769 1.1 dyoung if (status == IXGBE_SUCCESS) { 770 1.1 dyoung /* 771 1.1 dyoung * Setup and restart the link based on the new values in 772 1.1 dyoung * ixgbe_hw This will write the AUTOC register based on the new 773 1.1 dyoung * stored values 774 1.1 dyoung */ 775 1.1 dyoung status = ixgbe_start_mac_link_82598(hw, 776 1.2 msaitoh autoneg_wait_to_complete); 777 1.1 dyoung } 778 1.1 dyoung 779 1.1 dyoung return status; 780 1.1 dyoung } 781 1.1 dyoung 782 1.1 dyoung 783 1.1 dyoung /** 784 1.17 msaitoh * ixgbe_setup_copper_link_82598 - Set the PHY autoneg advertised field 785 1.17 msaitoh * @hw: pointer to hardware structure 786 1.17 msaitoh * @speed: new link speed 787 1.17 msaitoh * @autoneg_wait_to_complete: TRUE if waiting is needed to complete 788 1.1 dyoung * 789 1.17 msaitoh * Sets the link speed in the AUTOC register in the MAC and restarts link. 790 1.1 dyoung **/ 791 1.1 dyoung static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw, 792 1.2 msaitoh ixgbe_link_speed speed, 793 1.2 msaitoh bool autoneg_wait_to_complete) 794 1.1 dyoung { 795 1.1 dyoung s32 status; 796 1.1 dyoung 797 1.1 dyoung DEBUGFUNC("ixgbe_setup_copper_link_82598"); 798 1.1 dyoung 799 1.1 dyoung /* Setup the PHY according to input speed */ 800 1.4 msaitoh status = hw->phy.ops.setup_link_speed(hw, speed, 801 1.2 msaitoh autoneg_wait_to_complete); 802 1.1 dyoung /* Set up MAC */ 803 1.1 dyoung ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete); 804 1.1 dyoung 805 1.1 dyoung return status; 806 1.1 dyoung } 807 1.1 dyoung 808 1.1 dyoung /** 809 1.17 msaitoh * ixgbe_reset_hw_82598 - Performs hardware reset 810 1.17 msaitoh * @hw: pointer to hardware structure 811 1.1 dyoung * 812 1.17 msaitoh * Resets the hardware by resetting the transmit and receive units, masks and 813 1.17 msaitoh * clears all interrupts, performing a PHY reset, and performing a link (MAC) 814 1.17 msaitoh * reset. 815 1.1 dyoung **/ 816 1.1 dyoung static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw) 817 1.1 dyoung { 818 1.1 dyoung s32 status = IXGBE_SUCCESS; 819 1.1 dyoung s32 phy_status = IXGBE_SUCCESS; 820 1.1 dyoung u32 ctrl; 821 1.1 dyoung u32 gheccr; 822 1.1 dyoung u32 i; 823 1.1 dyoung u32 autoc; 824 1.1 dyoung u8 analog_val; 825 1.1 dyoung 826 1.1 dyoung DEBUGFUNC("ixgbe_reset_hw_82598"); 827 1.1 dyoung 828 1.1 dyoung /* Call adapter stop to disable tx/rx and clear interrupts */ 829 1.2 msaitoh status = hw->mac.ops.stop_adapter(hw); 830 1.2 msaitoh if (status != IXGBE_SUCCESS) 831 1.2 msaitoh goto reset_hw_out; 832 1.1 dyoung 833 1.1 dyoung /* 834 1.1 dyoung * Power up the Atlas Tx lanes if they are currently powered down. 835 1.1 dyoung * Atlas Tx lanes are powered down for MAC loopback tests, but 836 1.1 dyoung * they are not automatically restored on reset. 837 1.1 dyoung */ 838 1.1 dyoung hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val); 839 1.1 dyoung if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) { 840 1.1 dyoung /* Enable Tx Atlas so packets can be transmitted again */ 841 1.1 dyoung hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, 842 1.2 msaitoh &analog_val); 843 1.1 dyoung analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN; 844 1.1 dyoung hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, 845 1.2 msaitoh analog_val); 846 1.1 dyoung 847 1.1 dyoung hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, 848 1.2 msaitoh &analog_val); 849 1.1 dyoung analog_val &= ~IXGBE_ATLAS_PDN_TX_10G_QL_ALL; 850 1.1 dyoung hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, 851 1.2 msaitoh analog_val); 852 1.1 dyoung 853 1.1 dyoung hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, 854 1.2 msaitoh &analog_val); 855 1.1 dyoung analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL; 856 1.1 dyoung hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, 857 1.2 msaitoh analog_val); 858 1.1 dyoung 859 1.1 dyoung hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, 860 1.2 msaitoh &analog_val); 861 1.1 dyoung analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL; 862 1.1 dyoung hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, 863 1.2 msaitoh analog_val); 864 1.1 dyoung } 865 1.1 dyoung 866 1.1 dyoung /* Reset PHY */ 867 1.1 dyoung if (hw->phy.reset_disable == FALSE) { 868 1.1 dyoung /* PHY ops must be identified and initialized prior to reset */ 869 1.1 dyoung 870 1.1 dyoung /* Init PHY and function pointers, perform SFP setup */ 871 1.1 dyoung phy_status = hw->phy.ops.init(hw); 872 1.13 msaitoh if ((phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED) || 873 1.13 msaitoh (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)) 874 1.2 msaitoh goto mac_reset_top; 875 1.1 dyoung 876 1.1 dyoung hw->phy.ops.reset(hw); 877 1.1 dyoung } 878 1.1 dyoung 879 1.1 dyoung mac_reset_top: 880 1.1 dyoung /* 881 1.1 dyoung * Issue global reset to the MAC. This needs to be a SW reset. 882 1.1 dyoung * If link reset is used, it might reset the MAC when mng is using it 883 1.1 dyoung */ 884 1.2 msaitoh ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL) | IXGBE_CTRL_RST; 885 1.2 msaitoh IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl); 886 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 887 1.1 dyoung 888 1.1 dyoung /* Poll for reset bit to self-clear indicating reset is complete */ 889 1.1 dyoung for (i = 0; i < 10; i++) { 890 1.1 dyoung usec_delay(1); 891 1.1 dyoung ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 892 1.1 dyoung if (!(ctrl & IXGBE_CTRL_RST)) 893 1.1 dyoung break; 894 1.1 dyoung } 895 1.1 dyoung if (ctrl & IXGBE_CTRL_RST) { 896 1.1 dyoung status = IXGBE_ERR_RESET_FAILED; 897 1.1 dyoung DEBUGOUT("Reset polling failed to complete.\n"); 898 1.1 dyoung } 899 1.1 dyoung 900 1.2 msaitoh msec_delay(50); 901 1.2 msaitoh 902 1.1 dyoung /* 903 1.1 dyoung * Double resets are required for recovery from certain error 904 1.1 dyoung * conditions. Between resets, it is necessary to stall to allow time 905 1.2 msaitoh * for any pending HW events to complete. 906 1.1 dyoung */ 907 1.1 dyoung if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) { 908 1.1 dyoung hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED; 909 1.1 dyoung goto mac_reset_top; 910 1.1 dyoung } 911 1.1 dyoung 912 1.1 dyoung gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR); 913 1.1 dyoung gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6)); 914 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr); 915 1.1 dyoung 916 1.1 dyoung /* 917 1.1 dyoung * Store the original AUTOC value if it has not been 918 1.1 dyoung * stored off yet. Otherwise restore the stored original 919 1.14 pgoyette * AUTOC value since the reset operation sets back to defaults. 920 1.1 dyoung */ 921 1.1 dyoung autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 922 1.1 dyoung if (hw->mac.orig_link_settings_stored == FALSE) { 923 1.1 dyoung hw->mac.orig_autoc = autoc; 924 1.1 dyoung hw->mac.orig_link_settings_stored = TRUE; 925 1.1 dyoung } else if (autoc != hw->mac.orig_autoc) { 926 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc); 927 1.1 dyoung } 928 1.1 dyoung 929 1.1 dyoung /* Store the permanent mac address */ 930 1.1 dyoung hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); 931 1.1 dyoung 932 1.1 dyoung /* 933 1.1 dyoung * Store MAC address from RAR0, clear receive address registers, and 934 1.1 dyoung * clear the multicast table 935 1.1 dyoung */ 936 1.1 dyoung hw->mac.ops.init_rx_addrs(hw); 937 1.1 dyoung 938 1.1 dyoung reset_hw_out: 939 1.1 dyoung if (phy_status != IXGBE_SUCCESS) 940 1.1 dyoung status = phy_status; 941 1.1 dyoung 942 1.1 dyoung return status; 943 1.1 dyoung } 944 1.1 dyoung 945 1.1 dyoung /** 946 1.17 msaitoh * ixgbe_set_vmdq_82598 - Associate a VMDq set index with a rx address 947 1.17 msaitoh * @hw: pointer to hardware struct 948 1.17 msaitoh * @rar: receive address register index to associate with a VMDq index 949 1.17 msaitoh * @vmdq: VMDq set index 950 1.1 dyoung **/ 951 1.1 dyoung s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq) 952 1.1 dyoung { 953 1.1 dyoung u32 rar_high; 954 1.1 dyoung u32 rar_entries = hw->mac.num_rar_entries; 955 1.1 dyoung 956 1.1 dyoung DEBUGFUNC("ixgbe_set_vmdq_82598"); 957 1.1 dyoung 958 1.1 dyoung /* Make sure we are using a valid rar index range */ 959 1.1 dyoung if (rar >= rar_entries) { 960 1.1 dyoung DEBUGOUT1("RAR index %d is out of range.\n", rar); 961 1.1 dyoung return IXGBE_ERR_INVALID_ARGUMENT; 962 1.1 dyoung } 963 1.1 dyoung 964 1.1 dyoung rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); 965 1.1 dyoung rar_high &= ~IXGBE_RAH_VIND_MASK; 966 1.1 dyoung rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK); 967 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high); 968 1.1 dyoung return IXGBE_SUCCESS; 969 1.1 dyoung } 970 1.1 dyoung 971 1.1 dyoung /** 972 1.17 msaitoh * ixgbe_clear_vmdq_82598 - Disassociate a VMDq set index from an rx address 973 1.17 msaitoh * @hw: pointer to hardware struct 974 1.17 msaitoh * @rar: receive address register index to associate with a VMDq index 975 1.17 msaitoh * @vmdq: VMDq clear index (not used in 82598, but elsewhere) 976 1.1 dyoung **/ 977 1.1 dyoung static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq) 978 1.1 dyoung { 979 1.1 dyoung u32 rar_high; 980 1.1 dyoung u32 rar_entries = hw->mac.num_rar_entries; 981 1.1 dyoung 982 1.2 msaitoh UNREFERENCED_1PARAMETER(vmdq); 983 1.1 dyoung 984 1.1 dyoung /* Make sure we are using a valid rar index range */ 985 1.1 dyoung if (rar >= rar_entries) { 986 1.1 dyoung DEBUGOUT1("RAR index %d is out of range.\n", rar); 987 1.1 dyoung return IXGBE_ERR_INVALID_ARGUMENT; 988 1.1 dyoung } 989 1.1 dyoung 990 1.1 dyoung rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); 991 1.1 dyoung if (rar_high & IXGBE_RAH_VIND_MASK) { 992 1.1 dyoung rar_high &= ~IXGBE_RAH_VIND_MASK; 993 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high); 994 1.1 dyoung } 995 1.1 dyoung 996 1.1 dyoung return IXGBE_SUCCESS; 997 1.1 dyoung } 998 1.1 dyoung 999 1.1 dyoung /** 1000 1.17 msaitoh * ixgbe_set_vfta_82598 - Set VLAN filter table 1001 1.17 msaitoh * @hw: pointer to hardware structure 1002 1.17 msaitoh * @vlan: VLAN id to write to VLAN filter 1003 1.17 msaitoh * @vind: VMDq output index that maps queue to VLAN id in VFTA 1004 1.17 msaitoh * @vlan_on: boolean flag to turn on/off VLAN in VFTA 1005 1.17 msaitoh * @vlvf_bypass: boolean flag - unused 1006 1.1 dyoung * 1007 1.17 msaitoh * Turn on/off specified VLAN in the VLAN filter table. 1008 1.1 dyoung **/ 1009 1.1 dyoung s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind, 1010 1.9 msaitoh bool vlan_on, bool vlvf_bypass) 1011 1.1 dyoung { 1012 1.1 dyoung u32 regindex; 1013 1.1 dyoung u32 bitindex; 1014 1.1 dyoung u32 bits; 1015 1.1 dyoung u32 vftabyte; 1016 1.1 dyoung 1017 1.9 msaitoh UNREFERENCED_1PARAMETER(vlvf_bypass); 1018 1.9 msaitoh 1019 1.1 dyoung DEBUGFUNC("ixgbe_set_vfta_82598"); 1020 1.1 dyoung 1021 1.1 dyoung if (vlan > 4095) 1022 1.1 dyoung return IXGBE_ERR_PARAM; 1023 1.1 dyoung 1024 1.1 dyoung /* Determine 32-bit word position in array */ 1025 1.1 dyoung regindex = (vlan >> 5) & 0x7F; /* upper seven bits */ 1026 1.1 dyoung 1027 1.1 dyoung /* Determine the location of the (VMD) queue index */ 1028 1.1 dyoung vftabyte = ((vlan >> 3) & 0x03); /* bits (4:3) indicating byte array */ 1029 1.1 dyoung bitindex = (vlan & 0x7) << 2; /* lower 3 bits indicate nibble */ 1030 1.1 dyoung 1031 1.1 dyoung /* Set the nibble for VMD queue index */ 1032 1.1 dyoung bits = IXGBE_READ_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex)); 1033 1.1 dyoung bits &= (~(0x0F << bitindex)); 1034 1.1 dyoung bits |= (vind << bitindex); 1035 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex), bits); 1036 1.1 dyoung 1037 1.1 dyoung /* Determine the location of the bit for this VLAN id */ 1038 1.1 dyoung bitindex = vlan & 0x1F; /* lower five bits */ 1039 1.1 dyoung 1040 1.1 dyoung bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex)); 1041 1.1 dyoung if (vlan_on) 1042 1.1 dyoung /* Turn on this VLAN id */ 1043 1.1 dyoung bits |= (1 << bitindex); 1044 1.1 dyoung else 1045 1.1 dyoung /* Turn off this VLAN id */ 1046 1.1 dyoung bits &= ~(1 << bitindex); 1047 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits); 1048 1.1 dyoung 1049 1.1 dyoung return IXGBE_SUCCESS; 1050 1.1 dyoung } 1051 1.1 dyoung 1052 1.1 dyoung /** 1053 1.17 msaitoh * ixgbe_clear_vfta_82598 - Clear VLAN filter table 1054 1.17 msaitoh * @hw: pointer to hardware structure 1055 1.1 dyoung * 1056 1.19 msaitoh * Clears the VLAN filter table, and the VMDq index associated with the filter 1057 1.1 dyoung **/ 1058 1.1 dyoung static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw) 1059 1.1 dyoung { 1060 1.1 dyoung u32 offset; 1061 1.1 dyoung u32 vlanbyte; 1062 1.1 dyoung 1063 1.1 dyoung DEBUGFUNC("ixgbe_clear_vfta_82598"); 1064 1.1 dyoung 1065 1.1 dyoung for (offset = 0; offset < hw->mac.vft_size; offset++) 1066 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0); 1067 1.1 dyoung 1068 1.1 dyoung for (vlanbyte = 0; vlanbyte < 4; vlanbyte++) 1069 1.1 dyoung for (offset = 0; offset < hw->mac.vft_size; offset++) 1070 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vlanbyte, offset), 1071 1.2 msaitoh 0); 1072 1.1 dyoung 1073 1.1 dyoung return IXGBE_SUCCESS; 1074 1.1 dyoung } 1075 1.1 dyoung 1076 1.1 dyoung /** 1077 1.17 msaitoh * ixgbe_read_analog_reg8_82598 - Reads 8 bit Atlas analog register 1078 1.17 msaitoh * @hw: pointer to hardware structure 1079 1.17 msaitoh * @reg: analog register to read 1080 1.17 msaitoh * @val: read value 1081 1.1 dyoung * 1082 1.17 msaitoh * Performs read operation to Atlas analog register specified. 1083 1.1 dyoung **/ 1084 1.1 dyoung s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val) 1085 1.1 dyoung { 1086 1.1 dyoung u32 atlas_ctl; 1087 1.1 dyoung 1088 1.1 dyoung DEBUGFUNC("ixgbe_read_analog_reg8_82598"); 1089 1.1 dyoung 1090 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, 1091 1.2 msaitoh IXGBE_ATLASCTL_WRITE_CMD | (reg << 8)); 1092 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1093 1.1 dyoung usec_delay(10); 1094 1.1 dyoung atlas_ctl = IXGBE_READ_REG(hw, IXGBE_ATLASCTL); 1095 1.1 dyoung *val = (u8)atlas_ctl; 1096 1.1 dyoung 1097 1.1 dyoung return IXGBE_SUCCESS; 1098 1.1 dyoung } 1099 1.1 dyoung 1100 1.1 dyoung /** 1101 1.17 msaitoh * ixgbe_write_analog_reg8_82598 - Writes 8 bit Atlas analog register 1102 1.17 msaitoh * @hw: pointer to hardware structure 1103 1.17 msaitoh * @reg: atlas register to write 1104 1.17 msaitoh * @val: value to write 1105 1.1 dyoung * 1106 1.17 msaitoh * Performs write operation to Atlas analog register specified. 1107 1.1 dyoung **/ 1108 1.1 dyoung s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val) 1109 1.1 dyoung { 1110 1.1 dyoung u32 atlas_ctl; 1111 1.1 dyoung 1112 1.1 dyoung DEBUGFUNC("ixgbe_write_analog_reg8_82598"); 1113 1.1 dyoung 1114 1.1 dyoung atlas_ctl = (reg << 8) | val; 1115 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl); 1116 1.1 dyoung IXGBE_WRITE_FLUSH(hw); 1117 1.1 dyoung usec_delay(10); 1118 1.1 dyoung 1119 1.1 dyoung return IXGBE_SUCCESS; 1120 1.1 dyoung } 1121 1.1 dyoung 1122 1.1 dyoung /** 1123 1.17 msaitoh * ixgbe_read_i2c_phy_82598 - Reads 8 bit word over I2C interface. 1124 1.17 msaitoh * @hw: pointer to hardware structure 1125 1.17 msaitoh * @dev_addr: address to read from 1126 1.17 msaitoh * @byte_offset: byte offset to read from dev_addr 1127 1.17 msaitoh * @eeprom_data: value read 1128 1.1 dyoung * 1129 1.17 msaitoh * Performs 8 byte read operation to SFP module's EEPROM over I2C interface. 1130 1.1 dyoung **/ 1131 1.4 msaitoh static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, 1132 1.4 msaitoh u8 byte_offset, u8 *eeprom_data) 1133 1.1 dyoung { 1134 1.1 dyoung s32 status = IXGBE_SUCCESS; 1135 1.1 dyoung u16 sfp_addr = 0; 1136 1.1 dyoung u16 sfp_data = 0; 1137 1.1 dyoung u16 sfp_stat = 0; 1138 1.5 msaitoh u16 gssr; 1139 1.1 dyoung u32 i; 1140 1.1 dyoung 1141 1.4 msaitoh DEBUGFUNC("ixgbe_read_i2c_phy_82598"); 1142 1.1 dyoung 1143 1.5 msaitoh if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1) 1144 1.5 msaitoh gssr = IXGBE_GSSR_PHY1_SM; 1145 1.5 msaitoh else 1146 1.5 msaitoh gssr = IXGBE_GSSR_PHY0_SM; 1147 1.5 msaitoh 1148 1.5 msaitoh if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS) 1149 1.5 msaitoh return IXGBE_ERR_SWFW_SYNC; 1150 1.5 msaitoh 1151 1.1 dyoung if (hw->phy.type == ixgbe_phy_nl) { 1152 1.1 dyoung /* 1153 1.1 dyoung * NetLogic phy SDA/SCL registers are at addresses 0xC30A to 1154 1.1 dyoung * 0xC30D. These registers are used to talk to the SFP+ 1155 1.1 dyoung * module's EEPROM through the SDA/SCL (I2C) interface. 1156 1.1 dyoung */ 1157 1.4 msaitoh sfp_addr = (dev_addr << 8) + byte_offset; 1158 1.1 dyoung sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK); 1159 1.5 msaitoh hw->phy.ops.write_reg_mdi(hw, 1160 1.5 msaitoh IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, 1161 1.5 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 1162 1.5 msaitoh sfp_addr); 1163 1.1 dyoung 1164 1.1 dyoung /* Poll status */ 1165 1.1 dyoung for (i = 0; i < 100; i++) { 1166 1.5 msaitoh hw->phy.ops.read_reg_mdi(hw, 1167 1.5 msaitoh IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT, 1168 1.5 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 1169 1.5 msaitoh &sfp_stat); 1170 1.1 dyoung sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK; 1171 1.1 dyoung if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS) 1172 1.1 dyoung break; 1173 1.1 dyoung msec_delay(10); 1174 1.1 dyoung } 1175 1.1 dyoung 1176 1.1 dyoung if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) { 1177 1.1 dyoung DEBUGOUT("EEPROM read did not pass.\n"); 1178 1.1 dyoung status = IXGBE_ERR_SFP_NOT_PRESENT; 1179 1.1 dyoung goto out; 1180 1.1 dyoung } 1181 1.1 dyoung 1182 1.1 dyoung /* Read data */ 1183 1.5 msaitoh hw->phy.ops.read_reg_mdi(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA, 1184 1.5 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data); 1185 1.1 dyoung 1186 1.1 dyoung *eeprom_data = (u8)(sfp_data >> 8); 1187 1.1 dyoung } else { 1188 1.1 dyoung status = IXGBE_ERR_PHY; 1189 1.1 dyoung } 1190 1.1 dyoung 1191 1.1 dyoung out: 1192 1.5 msaitoh hw->mac.ops.release_swfw_sync(hw, gssr); 1193 1.1 dyoung return status; 1194 1.1 dyoung } 1195 1.1 dyoung 1196 1.1 dyoung /** 1197 1.17 msaitoh * ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface. 1198 1.17 msaitoh * @hw: pointer to hardware structure 1199 1.17 msaitoh * @byte_offset: EEPROM byte offset to read 1200 1.17 msaitoh * @eeprom_data: value read 1201 1.4 msaitoh * 1202 1.17 msaitoh * Performs 8 byte read operation to SFP module's EEPROM over I2C interface. 1203 1.4 msaitoh **/ 1204 1.4 msaitoh s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, 1205 1.4 msaitoh u8 *eeprom_data) 1206 1.4 msaitoh { 1207 1.4 msaitoh return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR, 1208 1.4 msaitoh byte_offset, eeprom_data); 1209 1.4 msaitoh } 1210 1.4 msaitoh 1211 1.4 msaitoh /** 1212 1.17 msaitoh * ixgbe_read_i2c_sff8472_82598 - Reads 8 bit word over I2C interface. 1213 1.17 msaitoh * @hw: pointer to hardware structure 1214 1.17 msaitoh * @byte_offset: byte offset at address 0xA2 1215 1.17 msaitoh * @sff8472_data: value read 1216 1.4 msaitoh * 1217 1.17 msaitoh * Performs 8 byte read operation to SFP module's SFF-8472 data over I2C 1218 1.4 msaitoh **/ 1219 1.4 msaitoh static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset, 1220 1.4 msaitoh u8 *sff8472_data) 1221 1.4 msaitoh { 1222 1.4 msaitoh return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR2, 1223 1.4 msaitoh byte_offset, sff8472_data); 1224 1.4 msaitoh } 1225 1.4 msaitoh 1226 1.4 msaitoh /** 1227 1.17 msaitoh * ixgbe_get_supported_physical_layer_82598 - Returns physical layer type 1228 1.17 msaitoh * @hw: pointer to hardware structure 1229 1.1 dyoung * 1230 1.17 msaitoh * Determines physical layer capabilities of the current configuration. 1231 1.1 dyoung **/ 1232 1.9 msaitoh u64 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) 1233 1.1 dyoung { 1234 1.9 msaitoh u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 1235 1.1 dyoung u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 1236 1.1 dyoung u32 pma_pmd_10g = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK; 1237 1.1 dyoung u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; 1238 1.1 dyoung u16 ext_ability = 0; 1239 1.1 dyoung 1240 1.1 dyoung DEBUGFUNC("ixgbe_get_supported_physical_layer_82598"); 1241 1.1 dyoung 1242 1.1 dyoung hw->phy.ops.identify(hw); 1243 1.1 dyoung 1244 1.1 dyoung /* Copper PHY must be checked before AUTOC LMS to determine correct 1245 1.1 dyoung * physical layer because 10GBase-T PHYs use LMS = KX4/KX */ 1246 1.1 dyoung switch (hw->phy.type) { 1247 1.1 dyoung case ixgbe_phy_tn: 1248 1.1 dyoung case ixgbe_phy_cu_unknown: 1249 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, 1250 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability); 1251 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY) 1252 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T; 1253 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY) 1254 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; 1255 1.1 dyoung if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY) 1256 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX; 1257 1.1 dyoung goto out; 1258 1.1 dyoung default: 1259 1.1 dyoung break; 1260 1.1 dyoung } 1261 1.1 dyoung 1262 1.1 dyoung switch (autoc & IXGBE_AUTOC_LMS_MASK) { 1263 1.1 dyoung case IXGBE_AUTOC_LMS_1G_AN: 1264 1.1 dyoung case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: 1265 1.1 dyoung if (pma_pmd_1g == IXGBE_AUTOC_1G_KX) 1266 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX; 1267 1.1 dyoung else 1268 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_BX; 1269 1.1 dyoung break; 1270 1.1 dyoung case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: 1271 1.1 dyoung if (pma_pmd_10g == IXGBE_AUTOC_10G_CX4) 1272 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; 1273 1.1 dyoung else if (pma_pmd_10g == IXGBE_AUTOC_10G_KX4) 1274 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4; 1275 1.1 dyoung else /* XAUI */ 1276 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 1277 1.1 dyoung break; 1278 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_AN: 1279 1.1 dyoung case IXGBE_AUTOC_LMS_KX4_AN_1G_AN: 1280 1.1 dyoung if (autoc & IXGBE_AUTOC_KX_SUPP) 1281 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX; 1282 1.1 dyoung if (autoc & IXGBE_AUTOC_KX4_SUPP) 1283 1.1 dyoung physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4; 1284 1.1 dyoung break; 1285 1.1 dyoung default: 1286 1.1 dyoung break; 1287 1.1 dyoung } 1288 1.1 dyoung 1289 1.1 dyoung if (hw->phy.type == ixgbe_phy_nl) { 1290 1.1 dyoung hw->phy.ops.identify_sfp(hw); 1291 1.1 dyoung 1292 1.1 dyoung switch (hw->phy.sfp_type) { 1293 1.1 dyoung case ixgbe_sfp_type_da_cu: 1294 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; 1295 1.1 dyoung break; 1296 1.1 dyoung case ixgbe_sfp_type_sr: 1297 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; 1298 1.1 dyoung break; 1299 1.1 dyoung case ixgbe_sfp_type_lr: 1300 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; 1301 1.1 dyoung break; 1302 1.1 dyoung default: 1303 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 1304 1.1 dyoung break; 1305 1.1 dyoung } 1306 1.1 dyoung } 1307 1.1 dyoung 1308 1.1 dyoung switch (hw->device_id) { 1309 1.1 dyoung case IXGBE_DEV_ID_82598_DA_DUAL_PORT: 1310 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; 1311 1.1 dyoung break; 1312 1.1 dyoung case IXGBE_DEV_ID_82598AF_DUAL_PORT: 1313 1.1 dyoung case IXGBE_DEV_ID_82598AF_SINGLE_PORT: 1314 1.1 dyoung case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: 1315 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; 1316 1.1 dyoung break; 1317 1.1 dyoung case IXGBE_DEV_ID_82598EB_XF_LR: 1318 1.1 dyoung physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; 1319 1.1 dyoung break; 1320 1.1 dyoung default: 1321 1.1 dyoung break; 1322 1.1 dyoung } 1323 1.1 dyoung 1324 1.1 dyoung out: 1325 1.1 dyoung return physical_layer; 1326 1.1 dyoung } 1327 1.1 dyoung 1328 1.1 dyoung /** 1329 1.17 msaitoh * ixgbe_set_lan_id_multi_port_pcie_82598 - Set LAN id for PCIe multiple 1330 1.17 msaitoh * port devices. 1331 1.17 msaitoh * @hw: pointer to the HW structure 1332 1.1 dyoung * 1333 1.17 msaitoh * Calls common function and corrects issue with some single port devices 1334 1.17 msaitoh * that enable LAN1 but not LAN0. 1335 1.1 dyoung **/ 1336 1.1 dyoung void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw) 1337 1.1 dyoung { 1338 1.1 dyoung struct ixgbe_bus_info *bus = &hw->bus; 1339 1.1 dyoung u16 pci_gen = 0; 1340 1.1 dyoung u16 pci_ctrl2 = 0; 1341 1.1 dyoung 1342 1.1 dyoung DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie_82598"); 1343 1.1 dyoung 1344 1.1 dyoung ixgbe_set_lan_id_multi_port_pcie(hw); 1345 1.1 dyoung 1346 1.1 dyoung /* check if LAN0 is disabled */ 1347 1.1 dyoung hw->eeprom.ops.read(hw, IXGBE_PCIE_GENERAL_PTR, &pci_gen); 1348 1.1 dyoung if ((pci_gen != 0) && (pci_gen != 0xFFFF)) { 1349 1.1 dyoung 1350 1.1 dyoung hw->eeprom.ops.read(hw, pci_gen + IXGBE_PCIE_CTRL2, &pci_ctrl2); 1351 1.1 dyoung 1352 1.1 dyoung /* if LAN0 is completely disabled force function to 0 */ 1353 1.1 dyoung if ((pci_ctrl2 & IXGBE_PCIE_CTRL2_LAN_DISABLE) && 1354 1.1 dyoung !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DISABLE_SELECT) && 1355 1.1 dyoung !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DUMMY_ENABLE)) { 1356 1.1 dyoung 1357 1.1 dyoung bus->func = 0; 1358 1.1 dyoung } 1359 1.1 dyoung } 1360 1.1 dyoung } 1361 1.1 dyoung 1362 1.1 dyoung /** 1363 1.17 msaitoh * ixgbe_enable_relaxed_ordering_82598 - enable relaxed ordering 1364 1.17 msaitoh * @hw: pointer to hardware structure 1365 1.1 dyoung * 1366 1.1 dyoung **/ 1367 1.1 dyoung void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw) 1368 1.1 dyoung { 1369 1.1 dyoung u32 regval; 1370 1.1 dyoung u32 i; 1371 1.1 dyoung 1372 1.1 dyoung DEBUGFUNC("ixgbe_enable_relaxed_ordering_82598"); 1373 1.1 dyoung 1374 1.1 dyoung /* Enable relaxed ordering */ 1375 1.1 dyoung for (i = 0; ((i < hw->mac.max_tx_queues) && 1376 1.1 dyoung (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { 1377 1.1 dyoung regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); 1378 1.3 msaitoh regval |= IXGBE_DCA_TXCTRL_DESC_WRO_EN; 1379 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); 1380 1.1 dyoung } 1381 1.1 dyoung 1382 1.1 dyoung for (i = 0; ((i < hw->mac.max_rx_queues) && 1383 1.1 dyoung (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { 1384 1.1 dyoung regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); 1385 1.3 msaitoh regval |= IXGBE_DCA_RXCTRL_DATA_WRO_EN | 1386 1.3 msaitoh IXGBE_DCA_RXCTRL_HEAD_WRO_EN; 1387 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); 1388 1.1 dyoung } 1389 1.1 dyoung 1390 1.1 dyoung } 1391 1.2 msaitoh 1392 1.2 msaitoh /** 1393 1.2 msaitoh * ixgbe_set_rxpba_82598 - Initialize RX packet buffer 1394 1.2 msaitoh * @hw: pointer to hardware structure 1395 1.2 msaitoh * @num_pb: number of packet buffers to allocate 1396 1.2 msaitoh * @headroom: reserve n KB of headroom 1397 1.2 msaitoh * @strategy: packet buffer allocation strategy 1398 1.2 msaitoh **/ 1399 1.2 msaitoh static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb, 1400 1.2 msaitoh u32 headroom, int strategy) 1401 1.2 msaitoh { 1402 1.2 msaitoh u32 rxpktsize = IXGBE_RXPBSIZE_64KB; 1403 1.2 msaitoh u8 i = 0; 1404 1.2 msaitoh UNREFERENCED_1PARAMETER(headroom); 1405 1.2 msaitoh 1406 1.2 msaitoh if (!num_pb) 1407 1.2 msaitoh return; 1408 1.2 msaitoh 1409 1.2 msaitoh /* Setup Rx packet buffer sizes */ 1410 1.2 msaitoh switch (strategy) { 1411 1.2 msaitoh case PBA_STRATEGY_WEIGHTED: 1412 1.2 msaitoh /* Setup the first four at 80KB */ 1413 1.2 msaitoh rxpktsize = IXGBE_RXPBSIZE_80KB; 1414 1.2 msaitoh for (; i < 4; i++) 1415 1.2 msaitoh IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize); 1416 1.2 msaitoh /* Setup the last four at 48KB...don't re-init i */ 1417 1.2 msaitoh rxpktsize = IXGBE_RXPBSIZE_48KB; 1418 1.2 msaitoh /* Fall Through */ 1419 1.2 msaitoh case PBA_STRATEGY_EQUAL: 1420 1.2 msaitoh default: 1421 1.2 msaitoh /* Divide the remaining Rx packet buffer evenly among the TCs */ 1422 1.2 msaitoh for (; i < IXGBE_MAX_PACKET_BUFFERS; i++) 1423 1.2 msaitoh IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize); 1424 1.2 msaitoh break; 1425 1.2 msaitoh } 1426 1.2 msaitoh 1427 1.2 msaitoh /* Setup Tx packet buffer sizes */ 1428 1.2 msaitoh for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) 1429 1.2 msaitoh IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB); 1430 1.6 msaitoh } 1431 1.6 msaitoh 1432 1.6 msaitoh /** 1433 1.17 msaitoh * ixgbe_enable_rx_dma_82598 - Enable the Rx DMA unit 1434 1.17 msaitoh * @hw: pointer to hardware structure 1435 1.17 msaitoh * @regval: register value to write to RXCTRL 1436 1.6 msaitoh * 1437 1.17 msaitoh * Enables the Rx DMA unit 1438 1.6 msaitoh **/ 1439 1.6 msaitoh s32 ixgbe_enable_rx_dma_82598(struct ixgbe_hw *hw, u32 regval) 1440 1.6 msaitoh { 1441 1.6 msaitoh DEBUGFUNC("ixgbe_enable_rx_dma_82598"); 1442 1.2 msaitoh 1443 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval); 1444 1.6 msaitoh 1445 1.6 msaitoh return IXGBE_SUCCESS; 1446 1.2 msaitoh } 1447