1 1.29 msaitoh /* $NetBSD: ixgbe_phy.c,v 1.29 2021/12/24 05:02:11 msaitoh Exp $ */ 2 1.12 msaitoh 3 1.1 dyoung /****************************************************************************** 4 1.14 msaitoh SPDX-License-Identifier: BSD-3-Clause 5 1.1 dyoung 6 1.29 msaitoh Copyright (c) 2001-2020, Intel Corporation 7 1.1 dyoung All rights reserved. 8 1.12 msaitoh 9 1.12 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.12 msaitoh 12 1.12 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.12 msaitoh 15 1.12 msaitoh 2. Redistributions in binary form must reproduce the above copyright 16 1.12 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.12 msaitoh 19 1.12 msaitoh 3. Neither the name of the Intel Corporation nor the names of its 20 1.12 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.12 msaitoh 23 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 24 1.12 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 1.12 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 1.12 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 27 1.12 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 1.12 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 1.12 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 1.12 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 1.12 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.17 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 331224 2018-03-19 20:55:05Z erj $*/ 37 1.1 dyoung 38 1.24 msaitoh #include <sys/cdefs.h> 39 1.29 msaitoh __KERNEL_RCSID(0, "$NetBSD: ixgbe_phy.c,v 1.29 2021/12/24 05:02:11 msaitoh Exp $"); 40 1.24 msaitoh 41 1.1 dyoung #include "ixgbe_api.h" 42 1.1 dyoung #include "ixgbe_common.h" 43 1.1 dyoung #include "ixgbe_phy.h" 44 1.1 dyoung 45 1.13 msaitoh #include <dev/mii/mdio.h> 46 1.13 msaitoh 47 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw); 48 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw); 49 1.25 msaitoh static void ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data); 50 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data); 51 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw); 52 1.25 msaitoh static void ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data); 53 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data); 54 1.3 msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl); 55 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl); 56 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data); 57 1.7 msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl); 58 1.5 msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset, 59 1.5 msaitoh u8 *sff8472_data); 60 1.1 dyoung 61 1.1 dyoung /** 62 1.7 msaitoh * ixgbe_out_i2c_byte_ack - Send I2C byte with ack 63 1.7 msaitoh * @hw: pointer to the hardware structure 64 1.7 msaitoh * @byte: byte to send 65 1.7 msaitoh * 66 1.7 msaitoh * Returns an error code on error. 67 1.7 msaitoh */ 68 1.7 msaitoh static s32 ixgbe_out_i2c_byte_ack(struct ixgbe_hw *hw, u8 byte) 69 1.7 msaitoh { 70 1.7 msaitoh s32 status; 71 1.7 msaitoh 72 1.7 msaitoh status = ixgbe_clock_out_i2c_byte(hw, byte); 73 1.7 msaitoh if (status) 74 1.7 msaitoh return status; 75 1.7 msaitoh return ixgbe_get_i2c_ack(hw); 76 1.7 msaitoh } 77 1.7 msaitoh 78 1.7 msaitoh /** 79 1.7 msaitoh * ixgbe_in_i2c_byte_ack - Receive an I2C byte and send ack 80 1.7 msaitoh * @hw: pointer to the hardware structure 81 1.7 msaitoh * @byte: pointer to a u8 to receive the byte 82 1.7 msaitoh * 83 1.7 msaitoh * Returns an error code on error. 84 1.7 msaitoh */ 85 1.7 msaitoh static s32 ixgbe_in_i2c_byte_ack(struct ixgbe_hw *hw, u8 *byte) 86 1.7 msaitoh { 87 1.25 msaitoh ixgbe_clock_in_i2c_byte(hw, byte); 88 1.7 msaitoh /* ACK */ 89 1.7 msaitoh return ixgbe_clock_out_i2c_bit(hw, FALSE); 90 1.7 msaitoh } 91 1.7 msaitoh 92 1.7 msaitoh /** 93 1.7 msaitoh * ixgbe_ones_comp_byte_add - Perform one's complement addition 94 1.17 msaitoh * @add1: addend 1 95 1.17 msaitoh * @add2: addend 2 96 1.7 msaitoh * 97 1.7 msaitoh * Returns one's complement 8-bit sum. 98 1.7 msaitoh */ 99 1.7 msaitoh static u8 ixgbe_ones_comp_byte_add(u8 add1, u8 add2) 100 1.7 msaitoh { 101 1.7 msaitoh u16 sum = add1 + add2; 102 1.7 msaitoh 103 1.7 msaitoh sum = (sum & 0xFF) + (sum >> 8); 104 1.7 msaitoh return sum & 0xFF; 105 1.7 msaitoh } 106 1.7 msaitoh 107 1.7 msaitoh /** 108 1.8 msaitoh * ixgbe_read_i2c_combined_generic_int - Perform I2C read combined operation 109 1.7 msaitoh * @hw: pointer to the hardware structure 110 1.7 msaitoh * @addr: I2C bus address to read from 111 1.7 msaitoh * @reg: I2C device register to read from 112 1.7 msaitoh * @val: pointer to location to receive read value 113 1.8 msaitoh * @lock: TRUE if to take and release semaphore 114 1.7 msaitoh * 115 1.7 msaitoh * Returns an error code on error. 116 1.7 msaitoh */ 117 1.12 msaitoh s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg, 118 1.12 msaitoh u16 *val, bool lock) 119 1.7 msaitoh { 120 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask; 121 1.12 msaitoh int max_retry = 3; 122 1.7 msaitoh int retry = 0; 123 1.7 msaitoh u8 csum_byte; 124 1.7 msaitoh u8 high_bits; 125 1.7 msaitoh u8 low_bits; 126 1.7 msaitoh u8 reg_high; 127 1.7 msaitoh u8 csum; 128 1.7 msaitoh 129 1.7 msaitoh reg_high = ((reg >> 7) & 0xFE) | 1; /* Indicate read combined */ 130 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF); 131 1.7 msaitoh csum = ~csum; 132 1.7 msaitoh do { 133 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask)) 134 1.7 msaitoh return IXGBE_ERR_SWFW_SYNC; 135 1.7 msaitoh ixgbe_i2c_start(hw); 136 1.7 msaitoh /* Device Address and write indication */ 137 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr)) 138 1.7 msaitoh goto fail; 139 1.7 msaitoh /* Write bits 14:8 */ 140 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg_high)) 141 1.7 msaitoh goto fail; 142 1.7 msaitoh /* Write bits 7:0 */ 143 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF)) 144 1.7 msaitoh goto fail; 145 1.7 msaitoh /* Write csum */ 146 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, csum)) 147 1.7 msaitoh goto fail; 148 1.7 msaitoh /* Re-start condition */ 149 1.7 msaitoh ixgbe_i2c_start(hw); 150 1.7 msaitoh /* Device Address and read indication */ 151 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr | 1)) 152 1.7 msaitoh goto fail; 153 1.7 msaitoh /* Get upper bits */ 154 1.7 msaitoh if (ixgbe_in_i2c_byte_ack(hw, &high_bits)) 155 1.7 msaitoh goto fail; 156 1.7 msaitoh /* Get low bits */ 157 1.7 msaitoh if (ixgbe_in_i2c_byte_ack(hw, &low_bits)) 158 1.7 msaitoh goto fail; 159 1.7 msaitoh /* Get csum */ 160 1.25 msaitoh ixgbe_clock_in_i2c_byte(hw, &csum_byte); 161 1.7 msaitoh /* NACK */ 162 1.7 msaitoh if (ixgbe_clock_out_i2c_bit(hw, FALSE)) 163 1.7 msaitoh goto fail; 164 1.7 msaitoh ixgbe_i2c_stop(hw); 165 1.8 msaitoh if (lock) 166 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 167 1.7 msaitoh *val = (high_bits << 8) | low_bits; 168 1.7 msaitoh return 0; 169 1.7 msaitoh 170 1.7 msaitoh fail: 171 1.7 msaitoh ixgbe_i2c_bus_clear(hw); 172 1.8 msaitoh if (lock) 173 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 174 1.7 msaitoh if (retry < max_retry) 175 1.7 msaitoh DEBUGOUT("I2C byte read combined error - Retrying.\n"); 176 1.7 msaitoh else 177 1.7 msaitoh DEBUGOUT("I2C byte read combined error.\n"); 178 1.26 msaitoh retry++; 179 1.26 msaitoh } while (retry <= max_retry); 180 1.7 msaitoh 181 1.7 msaitoh return IXGBE_ERR_I2C; 182 1.7 msaitoh } 183 1.7 msaitoh 184 1.7 msaitoh /** 185 1.8 msaitoh * ixgbe_write_i2c_combined_generic_int - Perform I2C write combined operation 186 1.7 msaitoh * @hw: pointer to the hardware structure 187 1.7 msaitoh * @addr: I2C bus address to write to 188 1.7 msaitoh * @reg: I2C device register to write to 189 1.7 msaitoh * @val: value to write 190 1.8 msaitoh * @lock: TRUE if to take and release semaphore 191 1.7 msaitoh * 192 1.7 msaitoh * Returns an error code on error. 193 1.7 msaitoh */ 194 1.12 msaitoh s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg, 195 1.12 msaitoh u16 val, bool lock) 196 1.7 msaitoh { 197 1.8 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask; 198 1.7 msaitoh int max_retry = 1; 199 1.7 msaitoh int retry = 0; 200 1.7 msaitoh u8 reg_high; 201 1.7 msaitoh u8 csum; 202 1.7 msaitoh 203 1.7 msaitoh reg_high = (reg >> 7) & 0xFE; /* Indicate write combined */ 204 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF); 205 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(csum, val >> 8); 206 1.7 msaitoh csum = ixgbe_ones_comp_byte_add(csum, val & 0xFF); 207 1.7 msaitoh csum = ~csum; 208 1.7 msaitoh do { 209 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask)) 210 1.8 msaitoh return IXGBE_ERR_SWFW_SYNC; 211 1.7 msaitoh ixgbe_i2c_start(hw); 212 1.7 msaitoh /* Device Address and write indication */ 213 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, addr)) 214 1.7 msaitoh goto fail; 215 1.7 msaitoh /* Write bits 14:8 */ 216 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg_high)) 217 1.7 msaitoh goto fail; 218 1.7 msaitoh /* Write bits 7:0 */ 219 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF)) 220 1.7 msaitoh goto fail; 221 1.7 msaitoh /* Write data 15:8 */ 222 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, val >> 8)) 223 1.7 msaitoh goto fail; 224 1.7 msaitoh /* Write data 7:0 */ 225 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, val & 0xFF)) 226 1.7 msaitoh goto fail; 227 1.7 msaitoh /* Write csum */ 228 1.7 msaitoh if (ixgbe_out_i2c_byte_ack(hw, csum)) 229 1.7 msaitoh goto fail; 230 1.7 msaitoh ixgbe_i2c_stop(hw); 231 1.8 msaitoh if (lock) 232 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 233 1.7 msaitoh return 0; 234 1.7 msaitoh 235 1.7 msaitoh fail: 236 1.7 msaitoh ixgbe_i2c_bus_clear(hw); 237 1.8 msaitoh if (lock) 238 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 239 1.7 msaitoh if (retry < max_retry) 240 1.7 msaitoh DEBUGOUT("I2C byte write combined error - Retrying.\n"); 241 1.7 msaitoh else 242 1.7 msaitoh DEBUGOUT("I2C byte write combined error.\n"); 243 1.26 msaitoh retry++; 244 1.26 msaitoh } while (retry <= max_retry); 245 1.7 msaitoh 246 1.7 msaitoh return IXGBE_ERR_I2C; 247 1.7 msaitoh } 248 1.7 msaitoh 249 1.7 msaitoh /** 250 1.27 msaitoh * ixgbe_init_phy_ops_generic - Inits PHY function ptrs 251 1.27 msaitoh * @hw: pointer to the hardware structure 252 1.1 dyoung * 253 1.27 msaitoh * Initialize the function pointers. 254 1.1 dyoung **/ 255 1.1 dyoung s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw) 256 1.1 dyoung { 257 1.1 dyoung struct ixgbe_phy_info *phy = &hw->phy; 258 1.1 dyoung 259 1.1 dyoung DEBUGFUNC("ixgbe_init_phy_ops_generic"); 260 1.1 dyoung 261 1.1 dyoung /* PHY */ 262 1.7 msaitoh phy->ops.identify = ixgbe_identify_phy_generic; 263 1.7 msaitoh phy->ops.reset = ixgbe_reset_phy_generic; 264 1.7 msaitoh phy->ops.read_reg = ixgbe_read_phy_reg_generic; 265 1.7 msaitoh phy->ops.write_reg = ixgbe_write_phy_reg_generic; 266 1.7 msaitoh phy->ops.read_reg_mdi = ixgbe_read_phy_reg_mdi; 267 1.7 msaitoh phy->ops.write_reg_mdi = ixgbe_write_phy_reg_mdi; 268 1.7 msaitoh phy->ops.setup_link = ixgbe_setup_phy_link_generic; 269 1.7 msaitoh phy->ops.setup_link_speed = ixgbe_setup_phy_link_speed_generic; 270 1.1 dyoung phy->ops.check_link = NULL; 271 1.1 dyoung phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic; 272 1.7 msaitoh phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_generic; 273 1.7 msaitoh phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_generic; 274 1.7 msaitoh phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_generic; 275 1.7 msaitoh phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_generic; 276 1.7 msaitoh phy->ops.write_i2c_eeprom = ixgbe_write_i2c_eeprom_generic; 277 1.7 msaitoh phy->ops.i2c_bus_clear = ixgbe_i2c_bus_clear; 278 1.7 msaitoh phy->ops.identify_sfp = ixgbe_identify_module_generic; 279 1.1 dyoung phy->sfp_type = ixgbe_sfp_type_unknown; 280 1.8 msaitoh phy->ops.read_i2c_byte_unlocked = ixgbe_read_i2c_byte_generic_unlocked; 281 1.8 msaitoh phy->ops.write_i2c_byte_unlocked = 282 1.8 msaitoh ixgbe_write_i2c_byte_generic_unlocked; 283 1.7 msaitoh phy->ops.check_overtemp = ixgbe_tn_check_overtemp; 284 1.1 dyoung return IXGBE_SUCCESS; 285 1.1 dyoung } 286 1.1 dyoung 287 1.1 dyoung /** 288 1.12 msaitoh * ixgbe_probe_phy - Probe a single address for a PHY 289 1.12 msaitoh * @hw: pointer to hardware structure 290 1.12 msaitoh * @phy_addr: PHY address to probe 291 1.12 msaitoh * 292 1.12 msaitoh * Returns TRUE if PHY found 293 1.12 msaitoh */ 294 1.12 msaitoh static bool ixgbe_probe_phy(struct ixgbe_hw *hw, u16 phy_addr) 295 1.12 msaitoh { 296 1.12 msaitoh u16 ext_ability = 0; 297 1.12 msaitoh 298 1.12 msaitoh if (!ixgbe_validate_phy_addr(hw, phy_addr)) { 299 1.12 msaitoh DEBUGOUT1("Unable to validate PHY address 0x%04X\n", 300 1.12 msaitoh phy_addr); 301 1.12 msaitoh return FALSE; 302 1.12 msaitoh } 303 1.12 msaitoh 304 1.12 msaitoh if (ixgbe_get_phy_id(hw)) 305 1.12 msaitoh return FALSE; 306 1.12 msaitoh 307 1.12 msaitoh hw->phy.type = ixgbe_get_phy_type_from_id(hw->phy.id); 308 1.12 msaitoh 309 1.12 msaitoh if (hw->phy.type == ixgbe_phy_unknown) { 310 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, 311 1.12 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability); 312 1.12 msaitoh if (ext_ability & 313 1.12 msaitoh (IXGBE_MDIO_PHY_10GBASET_ABILITY | 314 1.12 msaitoh IXGBE_MDIO_PHY_1000BASET_ABILITY)) 315 1.12 msaitoh hw->phy.type = ixgbe_phy_cu_unknown; 316 1.12 msaitoh else 317 1.12 msaitoh hw->phy.type = ixgbe_phy_generic; 318 1.12 msaitoh } 319 1.12 msaitoh 320 1.12 msaitoh return TRUE; 321 1.12 msaitoh } 322 1.12 msaitoh 323 1.12 msaitoh /** 324 1.27 msaitoh * ixgbe_identify_phy_generic - Get physical layer module 325 1.27 msaitoh * @hw: pointer to hardware structure 326 1.1 dyoung * 327 1.27 msaitoh * Determines the physical layer module found on the current adapter. 328 1.1 dyoung **/ 329 1.1 dyoung s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw) 330 1.1 dyoung { 331 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID; 332 1.12 msaitoh u16 phy_addr; 333 1.1 dyoung 334 1.1 dyoung DEBUGFUNC("ixgbe_identify_phy_generic"); 335 1.1 dyoung 336 1.7 msaitoh if (!hw->phy.phy_semaphore_mask) { 337 1.7 msaitoh if (hw->bus.lan_id) 338 1.7 msaitoh hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM; 339 1.7 msaitoh else 340 1.7 msaitoh hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM; 341 1.7 msaitoh } 342 1.7 msaitoh 343 1.12 msaitoh if (hw->phy.type != ixgbe_phy_unknown) 344 1.12 msaitoh return IXGBE_SUCCESS; 345 1.1 dyoung 346 1.12 msaitoh if (hw->phy.nw_mng_if_sel) { 347 1.12 msaitoh phy_addr = (hw->phy.nw_mng_if_sel & 348 1.12 msaitoh IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >> 349 1.12 msaitoh IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT; 350 1.12 msaitoh if (ixgbe_probe_phy(hw, phy_addr)) 351 1.12 msaitoh return IXGBE_SUCCESS; 352 1.12 msaitoh else 353 1.12 msaitoh return IXGBE_ERR_PHY_ADDR_INVALID; 354 1.12 msaitoh } 355 1.7 msaitoh 356 1.12 msaitoh for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) { 357 1.12 msaitoh if (ixgbe_probe_phy(hw, phy_addr)) { 358 1.12 msaitoh status = IXGBE_SUCCESS; 359 1.12 msaitoh break; 360 1.6 msaitoh } 361 1.1 dyoung } 362 1.1 dyoung 363 1.12 msaitoh /* Certain media types do not have a phy so an address will not 364 1.12 msaitoh * be found and the code will take this path. Caller has to 365 1.12 msaitoh * decide if it is an error or not. 366 1.12 msaitoh */ 367 1.12 msaitoh if (status != IXGBE_SUCCESS) 368 1.12 msaitoh hw->phy.addr = 0; 369 1.12 msaitoh 370 1.1 dyoung return status; 371 1.1 dyoung } 372 1.1 dyoung 373 1.1 dyoung /** 374 1.7 msaitoh * ixgbe_check_reset_blocked - check status of MNG FW veto bit 375 1.7 msaitoh * @hw: pointer to the hardware structure 376 1.7 msaitoh * 377 1.7 msaitoh * This function checks the MMNGC.MNG_VETO bit to see if there are 378 1.7 msaitoh * any constraints on link from manageability. For MAC's that don't 379 1.7 msaitoh * have this bit just return faluse since the link can not be blocked 380 1.7 msaitoh * via this method. 381 1.7 msaitoh **/ 382 1.7 msaitoh s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw) 383 1.7 msaitoh { 384 1.7 msaitoh u32 mmngc; 385 1.7 msaitoh 386 1.7 msaitoh DEBUGFUNC("ixgbe_check_reset_blocked"); 387 1.7 msaitoh 388 1.7 msaitoh /* If we don't have this bit, it can't be blocking */ 389 1.7 msaitoh if (hw->mac.type == ixgbe_mac_82598EB) 390 1.7 msaitoh return FALSE; 391 1.7 msaitoh 392 1.7 msaitoh mmngc = IXGBE_READ_REG(hw, IXGBE_MMNGC); 393 1.7 msaitoh if (mmngc & IXGBE_MMNGC_MNG_VETO) { 394 1.7 msaitoh ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, 395 1.7 msaitoh "MNG_VETO bit detected.\n"); 396 1.7 msaitoh return TRUE; 397 1.7 msaitoh } 398 1.7 msaitoh 399 1.7 msaitoh return FALSE; 400 1.7 msaitoh } 401 1.7 msaitoh 402 1.7 msaitoh /** 403 1.27 msaitoh * ixgbe_validate_phy_addr - Determines phy address is valid 404 1.27 msaitoh * @hw: pointer to hardware structure 405 1.27 msaitoh * @phy_addr: PHY address 406 1.1 dyoung * 407 1.1 dyoung **/ 408 1.1 dyoung bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr) 409 1.1 dyoung { 410 1.1 dyoung u16 phy_id = 0; 411 1.1 dyoung bool valid = FALSE; 412 1.1 dyoung 413 1.1 dyoung DEBUGFUNC("ixgbe_validate_phy_addr"); 414 1.1 dyoung 415 1.1 dyoung hw->phy.addr = phy_addr; 416 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH, 417 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id); 418 1.1 dyoung 419 1.1 dyoung if (phy_id != 0xFFFF && phy_id != 0x0) 420 1.1 dyoung valid = TRUE; 421 1.1 dyoung 422 1.12 msaitoh DEBUGOUT1("PHY ID HIGH is 0x%04X\n", phy_id); 423 1.12 msaitoh 424 1.1 dyoung return valid; 425 1.1 dyoung } 426 1.1 dyoung 427 1.1 dyoung /** 428 1.27 msaitoh * ixgbe_get_phy_id - Get the phy type 429 1.27 msaitoh * @hw: pointer to hardware structure 430 1.1 dyoung * 431 1.1 dyoung **/ 432 1.1 dyoung s32 ixgbe_get_phy_id(struct ixgbe_hw *hw) 433 1.1 dyoung { 434 1.1 dyoung u32 status; 435 1.1 dyoung u16 phy_id_high = 0; 436 1.1 dyoung u16 phy_id_low = 0; 437 1.1 dyoung 438 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_id"); 439 1.1 dyoung 440 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH, 441 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 442 1.3 msaitoh &phy_id_high); 443 1.1 dyoung 444 1.1 dyoung if (status == IXGBE_SUCCESS) { 445 1.1 dyoung hw->phy.id = (u32)(phy_id_high << 16); 446 1.1 dyoung status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW, 447 1.3 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 448 1.3 msaitoh &phy_id_low); 449 1.1 dyoung hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK); 450 1.1 dyoung hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK); 451 1.1 dyoung } 452 1.12 msaitoh DEBUGOUT2("PHY_ID_HIGH 0x%04X, PHY_ID_LOW 0x%04X\n", 453 1.12 msaitoh phy_id_high, phy_id_low); 454 1.12 msaitoh 455 1.1 dyoung return status; 456 1.1 dyoung } 457 1.1 dyoung 458 1.1 dyoung /** 459 1.27 msaitoh * ixgbe_get_phy_type_from_id - Get the phy type 460 1.27 msaitoh * @phy_id: PHY ID information 461 1.1 dyoung * 462 1.1 dyoung **/ 463 1.1 dyoung enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id) 464 1.1 dyoung { 465 1.1 dyoung enum ixgbe_phy_type phy_type; 466 1.1 dyoung 467 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_type_from_id"); 468 1.1 dyoung 469 1.1 dyoung switch (phy_id) { 470 1.1 dyoung case TN1010_PHY_ID: 471 1.1 dyoung phy_type = ixgbe_phy_tn; 472 1.1 dyoung break; 473 1.28 msaitoh case X550_PHY_ID: 474 1.3 msaitoh case X540_PHY_ID: 475 1.1 dyoung phy_type = ixgbe_phy_aq; 476 1.1 dyoung break; 477 1.1 dyoung case QT2022_PHY_ID: 478 1.1 dyoung phy_type = ixgbe_phy_qt; 479 1.1 dyoung break; 480 1.1 dyoung case ATH_PHY_ID: 481 1.1 dyoung phy_type = ixgbe_phy_nl; 482 1.1 dyoung break; 483 1.7 msaitoh case X557_PHY_ID: 484 1.12 msaitoh case X557_PHY_ID2: 485 1.7 msaitoh phy_type = ixgbe_phy_x550em_ext_t; 486 1.7 msaitoh break; 487 1.12 msaitoh case IXGBE_M88E1500_E_PHY_ID: 488 1.12 msaitoh case IXGBE_M88E1543_E_PHY_ID: 489 1.12 msaitoh phy_type = ixgbe_phy_ext_1g_t; 490 1.12 msaitoh break; 491 1.1 dyoung default: 492 1.1 dyoung phy_type = ixgbe_phy_unknown; 493 1.1 dyoung break; 494 1.1 dyoung } 495 1.1 dyoung return phy_type; 496 1.1 dyoung } 497 1.1 dyoung 498 1.1 dyoung /** 499 1.27 msaitoh * ixgbe_reset_phy_generic - Performs a PHY reset 500 1.27 msaitoh * @hw: pointer to hardware structure 501 1.1 dyoung **/ 502 1.1 dyoung s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw) 503 1.1 dyoung { 504 1.1 dyoung u32 i; 505 1.1 dyoung u16 ctrl = 0; 506 1.1 dyoung s32 status = IXGBE_SUCCESS; 507 1.1 dyoung 508 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_generic"); 509 1.1 dyoung 510 1.1 dyoung if (hw->phy.type == ixgbe_phy_unknown) 511 1.1 dyoung status = ixgbe_identify_phy_generic(hw); 512 1.1 dyoung 513 1.1 dyoung if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none) 514 1.1 dyoung goto out; 515 1.1 dyoung 516 1.1 dyoung /* Don't reset PHY if it's shut down due to overtemp. */ 517 1.1 dyoung if (!hw->phy.reset_if_overtemp && 518 1.1 dyoung (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw))) 519 1.1 dyoung goto out; 520 1.1 dyoung 521 1.7 msaitoh /* Blocked by MNG FW so bail */ 522 1.7 msaitoh if (ixgbe_check_reset_blocked(hw)) 523 1.7 msaitoh goto out; 524 1.7 msaitoh 525 1.1 dyoung /* 526 1.1 dyoung * Perform soft PHY reset to the PHY_XS. 527 1.1 dyoung * This will cause a soft reset to the PHY 528 1.1 dyoung */ 529 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, 530 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, 531 1.3 msaitoh IXGBE_MDIO_PHY_XS_RESET); 532 1.1 dyoung 533 1.1 dyoung /* 534 1.1 dyoung * Poll for reset bit to self-clear indicating reset is complete. 535 1.1 dyoung * Some PHYs could take up to 3 seconds to complete and need about 536 1.1 dyoung * 1.7 usec delay after the reset is complete. 537 1.1 dyoung */ 538 1.1 dyoung for (i = 0; i < 30; i++) { 539 1.1 dyoung msec_delay(100); 540 1.12 msaitoh if (hw->phy.type == ixgbe_phy_x550em_ext_t) { 541 1.12 msaitoh status = hw->phy.ops.read_reg(hw, 542 1.12 msaitoh IXGBE_MDIO_TX_VENDOR_ALARMS_3, 543 1.12 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 544 1.12 msaitoh &ctrl); 545 1.12 msaitoh if (status != IXGBE_SUCCESS) 546 1.12 msaitoh return status; 547 1.12 msaitoh 548 1.12 msaitoh if (ctrl & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) { 549 1.12 msaitoh usec_delay(2); 550 1.12 msaitoh break; 551 1.12 msaitoh } 552 1.12 msaitoh } else { 553 1.12 msaitoh status = hw->phy.ops.read_reg(hw, 554 1.12 msaitoh IXGBE_MDIO_PHY_XS_CONTROL, 555 1.12 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, 556 1.12 msaitoh &ctrl); 557 1.12 msaitoh if (status != IXGBE_SUCCESS) 558 1.12 msaitoh return status; 559 1.12 msaitoh 560 1.12 msaitoh if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) { 561 1.12 msaitoh usec_delay(2); 562 1.12 msaitoh break; 563 1.12 msaitoh } 564 1.1 dyoung } 565 1.1 dyoung } 566 1.1 dyoung 567 1.1 dyoung if (ctrl & IXGBE_MDIO_PHY_XS_RESET) { 568 1.1 dyoung status = IXGBE_ERR_RESET_FAILED; 569 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, 570 1.6 msaitoh "PHY reset polling failed to complete.\n"); 571 1.1 dyoung } 572 1.1 dyoung 573 1.1 dyoung out: 574 1.1 dyoung return status; 575 1.1 dyoung } 576 1.1 dyoung 577 1.1 dyoung /** 578 1.27 msaitoh * ixgbe_read_phy_mdi - Reads a value from a specified PHY register without 579 1.27 msaitoh * the SWFW lock 580 1.27 msaitoh * @hw: pointer to hardware structure 581 1.27 msaitoh * @reg_addr: 32 bit address of PHY register to read 582 1.27 msaitoh * @device_type: 5 bit device type 583 1.27 msaitoh * @phy_data: Pointer to read data from PHY register 584 1.6 msaitoh **/ 585 1.6 msaitoh s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, 586 1.12 msaitoh u16 *phy_data) 587 1.6 msaitoh { 588 1.6 msaitoh u32 i, data, command; 589 1.6 msaitoh 590 1.6 msaitoh /* Setup and write the address cycle command */ 591 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) | 592 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) | 593 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) | 594 1.6 msaitoh (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND)); 595 1.6 msaitoh 596 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command); 597 1.6 msaitoh 598 1.6 msaitoh /* 599 1.6 msaitoh * Check every 10 usec to see if the address cycle completed. 600 1.6 msaitoh * The MDI Command bit will clear when the operation is 601 1.6 msaitoh * complete 602 1.6 msaitoh */ 603 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) { 604 1.6 msaitoh usec_delay(10); 605 1.6 msaitoh 606 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA); 607 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) 608 1.12 msaitoh break; 609 1.6 msaitoh } 610 1.6 msaitoh 611 1.6 msaitoh 612 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) { 613 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address command did not complete.\n"); 614 1.12 msaitoh DEBUGOUT("PHY address command did not complete, returning IXGBE_ERR_PHY\n"); 615 1.6 msaitoh return IXGBE_ERR_PHY; 616 1.6 msaitoh } 617 1.6 msaitoh 618 1.6 msaitoh /* 619 1.6 msaitoh * Address cycle complete, setup and write the read 620 1.6 msaitoh * command 621 1.6 msaitoh */ 622 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) | 623 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) | 624 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) | 625 1.6 msaitoh (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND)); 626 1.6 msaitoh 627 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command); 628 1.6 msaitoh 629 1.6 msaitoh /* 630 1.6 msaitoh * Check every 10 usec to see if the address cycle 631 1.6 msaitoh * completed. The MDI Command bit will clear when the 632 1.6 msaitoh * operation is complete 633 1.6 msaitoh */ 634 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) { 635 1.6 msaitoh usec_delay(10); 636 1.6 msaitoh 637 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA); 638 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) 639 1.6 msaitoh break; 640 1.6 msaitoh } 641 1.6 msaitoh 642 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) { 643 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY read command didn't complete\n"); 644 1.12 msaitoh DEBUGOUT("PHY read command didn't complete, returning IXGBE_ERR_PHY\n"); 645 1.6 msaitoh return IXGBE_ERR_PHY; 646 1.6 msaitoh } 647 1.6 msaitoh 648 1.6 msaitoh /* 649 1.6 msaitoh * Read operation is complete. Get the data 650 1.6 msaitoh * from MSRWD 651 1.6 msaitoh */ 652 1.6 msaitoh data = IXGBE_READ_REG(hw, IXGBE_MSRWD); 653 1.6 msaitoh data >>= IXGBE_MSRWD_READ_DATA_SHIFT; 654 1.6 msaitoh *phy_data = (u16)(data); 655 1.6 msaitoh 656 1.6 msaitoh return IXGBE_SUCCESS; 657 1.6 msaitoh } 658 1.6 msaitoh 659 1.6 msaitoh /** 660 1.27 msaitoh * ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register 661 1.27 msaitoh * using the SWFW lock - this function is needed in most cases 662 1.27 msaitoh * @hw: pointer to hardware structure 663 1.27 msaitoh * @reg_addr: 32 bit address of PHY register to read 664 1.27 msaitoh * @device_type: 5 bit device type 665 1.27 msaitoh * @phy_data: Pointer to read data from PHY register 666 1.1 dyoung **/ 667 1.1 dyoung s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 668 1.3 msaitoh u32 device_type, u16 *phy_data) 669 1.1 dyoung { 670 1.6 msaitoh s32 status; 671 1.7 msaitoh u32 gssr = hw->phy.phy_semaphore_mask; 672 1.1 dyoung 673 1.1 dyoung DEBUGFUNC("ixgbe_read_phy_reg_generic"); 674 1.1 dyoung 675 1.12 msaitoh if (hw->mac.ops.acquire_swfw_sync(hw, gssr)) 676 1.12 msaitoh return IXGBE_ERR_SWFW_SYNC; 677 1.12 msaitoh 678 1.12 msaitoh status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data); 679 1.12 msaitoh 680 1.12 msaitoh hw->mac.ops.release_swfw_sync(hw, gssr); 681 1.6 msaitoh 682 1.6 msaitoh return status; 683 1.6 msaitoh } 684 1.6 msaitoh 685 1.6 msaitoh /** 686 1.27 msaitoh * ixgbe_write_phy_reg_mdi - Writes a value to specified PHY register 687 1.27 msaitoh * without SWFW lock 688 1.27 msaitoh * @hw: pointer to hardware structure 689 1.27 msaitoh * @reg_addr: 32 bit PHY register to write 690 1.27 msaitoh * @device_type: 5 bit device type 691 1.27 msaitoh * @phy_data: Data to write to the PHY register 692 1.6 msaitoh **/ 693 1.6 msaitoh s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, 694 1.6 msaitoh u32 device_type, u16 phy_data) 695 1.6 msaitoh { 696 1.6 msaitoh u32 i, command; 697 1.1 dyoung 698 1.6 msaitoh /* Put the data in the MDI single read and write data register*/ 699 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data); 700 1.1 dyoung 701 1.6 msaitoh /* Setup and write the address cycle command */ 702 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) | 703 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) | 704 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) | 705 1.6 msaitoh (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND)); 706 1.1 dyoung 707 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command); 708 1.1 dyoung 709 1.6 msaitoh /* 710 1.6 msaitoh * Check every 10 usec to see if the address cycle completed. 711 1.6 msaitoh * The MDI Command bit will clear when the operation is 712 1.6 msaitoh * complete 713 1.6 msaitoh */ 714 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) { 715 1.6 msaitoh usec_delay(10); 716 1.1 dyoung 717 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA); 718 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) 719 1.6 msaitoh break; 720 1.6 msaitoh } 721 1.1 dyoung 722 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) { 723 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address cmd didn't complete\n"); 724 1.6 msaitoh return IXGBE_ERR_PHY; 725 1.6 msaitoh } 726 1.1 dyoung 727 1.6 msaitoh /* 728 1.6 msaitoh * Address cycle complete, setup and write the write 729 1.6 msaitoh * command 730 1.6 msaitoh */ 731 1.6 msaitoh command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) | 732 1.6 msaitoh (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) | 733 1.6 msaitoh (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) | 734 1.6 msaitoh (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND)); 735 1.1 dyoung 736 1.6 msaitoh IXGBE_WRITE_REG(hw, IXGBE_MSCA, command); 737 1.1 dyoung 738 1.6 msaitoh /* 739 1.6 msaitoh * Check every 10 usec to see if the address cycle 740 1.6 msaitoh * completed. The MDI Command bit will clear when the 741 1.6 msaitoh * operation is complete 742 1.6 msaitoh */ 743 1.6 msaitoh for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) { 744 1.6 msaitoh usec_delay(10); 745 1.1 dyoung 746 1.6 msaitoh command = IXGBE_READ_REG(hw, IXGBE_MSCA); 747 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) == 0) 748 1.6 msaitoh break; 749 1.6 msaitoh } 750 1.1 dyoung 751 1.6 msaitoh if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) { 752 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY write cmd didn't complete\n"); 753 1.6 msaitoh return IXGBE_ERR_PHY; 754 1.1 dyoung } 755 1.1 dyoung 756 1.6 msaitoh return IXGBE_SUCCESS; 757 1.1 dyoung } 758 1.1 dyoung 759 1.1 dyoung /** 760 1.27 msaitoh * ixgbe_write_phy_reg_generic - Writes a value to specified PHY register 761 1.27 msaitoh * using SWFW lock- this function is needed in most cases 762 1.27 msaitoh * @hw: pointer to hardware structure 763 1.27 msaitoh * @reg_addr: 32 bit PHY register to write 764 1.27 msaitoh * @device_type: 5 bit device type 765 1.27 msaitoh * @phy_data: Data to write to the PHY register 766 1.1 dyoung **/ 767 1.1 dyoung s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 768 1.3 msaitoh u32 device_type, u16 phy_data) 769 1.1 dyoung { 770 1.6 msaitoh s32 status; 771 1.7 msaitoh u32 gssr = hw->phy.phy_semaphore_mask; 772 1.1 dyoung 773 1.1 dyoung DEBUGFUNC("ixgbe_write_phy_reg_generic"); 774 1.1 dyoung 775 1.6 msaitoh if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) { 776 1.12 msaitoh status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type, 777 1.6 msaitoh phy_data); 778 1.6 msaitoh hw->mac.ops.release_swfw_sync(hw, gssr); 779 1.6 msaitoh } else { 780 1.1 dyoung status = IXGBE_ERR_SWFW_SYNC; 781 1.1 dyoung } 782 1.1 dyoung 783 1.1 dyoung return status; 784 1.1 dyoung } 785 1.1 dyoung 786 1.1 dyoung /** 787 1.27 msaitoh * ixgbe_setup_phy_link_generic - Set and restart auto-neg 788 1.27 msaitoh * @hw: pointer to hardware structure 789 1.1 dyoung * 790 1.27 msaitoh * Restart auto-negotiation and PHY and waits for completion. 791 1.1 dyoung **/ 792 1.1 dyoung s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) 793 1.1 dyoung { 794 1.1 dyoung s32 status = IXGBE_SUCCESS; 795 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG; 796 1.1 dyoung bool autoneg = FALSE; 797 1.1 dyoung ixgbe_link_speed speed; 798 1.1 dyoung 799 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_generic"); 800 1.1 dyoung 801 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); 802 1.1 dyoung 803 1.12 msaitoh /* Set or unset auto-negotiation 10G advertisement */ 804 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, 805 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 806 1.12 msaitoh &autoneg_reg); 807 1.12 msaitoh 808 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE; 809 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) && 810 1.12 msaitoh (speed & IXGBE_LINK_SPEED_10GB_FULL)) 811 1.12 msaitoh autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE; 812 1.12 msaitoh 813 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, 814 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 815 1.12 msaitoh autoneg_reg); 816 1.12 msaitoh 817 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, 818 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 819 1.12 msaitoh &autoneg_reg); 820 1.1 dyoung 821 1.7 msaitoh if (hw->mac.type == ixgbe_mac_X550) { 822 1.12 msaitoh /* Set or unset auto-negotiation 5G advertisement */ 823 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE; 824 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) && 825 1.12 msaitoh (speed & IXGBE_LINK_SPEED_5GB_FULL)) 826 1.12 msaitoh autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE; 827 1.12 msaitoh 828 1.12 msaitoh /* Set or unset auto-negotiation 2.5G advertisement */ 829 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE; 830 1.12 msaitoh if ((hw->phy.autoneg_advertised & 831 1.12 msaitoh IXGBE_LINK_SPEED_2_5GB_FULL) && 832 1.12 msaitoh (speed & IXGBE_LINK_SPEED_2_5GB_FULL)) 833 1.12 msaitoh autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE; 834 1.12 msaitoh } 835 1.12 msaitoh 836 1.12 msaitoh /* Set or unset auto-negotiation 1G advertisement */ 837 1.12 msaitoh autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE; 838 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) && 839 1.12 msaitoh (speed & IXGBE_LINK_SPEED_1GB_FULL)) 840 1.12 msaitoh autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE; 841 1.12 msaitoh 842 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, 843 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 844 1.12 msaitoh autoneg_reg); 845 1.12 msaitoh 846 1.12 msaitoh /* Set or unset auto-negotiation 100M advertisement */ 847 1.12 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, 848 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 849 1.12 msaitoh &autoneg_reg); 850 1.12 msaitoh 851 1.12 msaitoh autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE | 852 1.12 msaitoh IXGBE_MII_100BASE_T_ADVERTISE_HALF); 853 1.12 msaitoh if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) && 854 1.12 msaitoh (speed & IXGBE_LINK_SPEED_100_FULL)) 855 1.12 msaitoh autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE; 856 1.12 msaitoh 857 1.12 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, 858 1.12 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 859 1.12 msaitoh autoneg_reg); 860 1.1 dyoung 861 1.13 msaitoh if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_100_FULL) { 862 1.13 msaitoh u16 ctrl; 863 1.13 msaitoh 864 1.13 msaitoh /* Force 100Mbps */ 865 1.13 msaitoh hw->phy.ops.read_reg(hw, MDIO_PMAPMD_CTRL1, MDIO_MMD_PMAPMD, 866 1.13 msaitoh &ctrl); 867 1.13 msaitoh ctrl &= ~PMAPMD_CTRL1_SPEED_MASK; 868 1.13 msaitoh ctrl |= PMAPMD_CTRL1_SPEED_100; 869 1.13 msaitoh hw->phy.ops.write_reg(hw, MDIO_PMAPMD_CTRL1,MDIO_MMD_PMAPMD, 870 1.13 msaitoh ctrl); 871 1.7 msaitoh 872 1.13 msaitoh /* Don't use auto-nego for 100Mbps */ 873 1.13 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 874 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg); 875 1.1 dyoung 876 1.19 msaitoh autoneg_reg &= ~AN_CTRL1_AUTOEN; 877 1.1 dyoung 878 1.13 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 879 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); 880 1.13 msaitoh } else { 881 1.13 msaitoh /* Blocked by MNG FW so don't reset PHY */ 882 1.13 msaitoh if (ixgbe_check_reset_blocked(hw)) 883 1.13 msaitoh return status; 884 1.13 msaitoh 885 1.13 msaitoh /* Restart PHY auto-negotiation. */ 886 1.13 msaitoh hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 887 1.13 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg); 888 1.13 msaitoh 889 1.13 msaitoh autoneg_reg |= IXGBE_MII_RESTART | AN_CTRL1_AUTOEN; 890 1.13 msaitoh 891 1.13 msaitoh hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 892 1.13 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); 893 1.13 msaitoh } 894 1.1 dyoung 895 1.1 dyoung return status; 896 1.1 dyoung } 897 1.1 dyoung 898 1.1 dyoung /** 899 1.27 msaitoh * ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities 900 1.27 msaitoh * @hw: pointer to hardware structure 901 1.27 msaitoh * @speed: new link speed 902 1.27 msaitoh * @autoneg_wait_to_complete: unused 903 1.1 dyoung **/ 904 1.1 dyoung s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw, 905 1.3 msaitoh ixgbe_link_speed speed, 906 1.3 msaitoh bool autoneg_wait_to_complete) 907 1.1 dyoung { 908 1.5 msaitoh UNREFERENCED_1PARAMETER(autoneg_wait_to_complete); 909 1.1 dyoung 910 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_speed_generic"); 911 1.1 dyoung 912 1.1 dyoung /* 913 1.1 dyoung * Clear autoneg_advertised and set new values based on input link 914 1.1 dyoung * speed. 915 1.1 dyoung */ 916 1.1 dyoung hw->phy.autoneg_advertised = 0; 917 1.1 dyoung 918 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) 919 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; 920 1.1 dyoung 921 1.7 msaitoh if (speed & IXGBE_LINK_SPEED_5GB_FULL) 922 1.7 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_5GB_FULL; 923 1.7 msaitoh 924 1.7 msaitoh if (speed & IXGBE_LINK_SPEED_2_5GB_FULL) 925 1.7 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_2_5GB_FULL; 926 1.7 msaitoh 927 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) 928 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; 929 1.1 dyoung 930 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) 931 1.1 dyoung hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL; 932 1.1 dyoung 933 1.12 msaitoh if (speed & IXGBE_LINK_SPEED_10_FULL) 934 1.12 msaitoh hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10_FULL; 935 1.12 msaitoh 936 1.1 dyoung /* Setup link based on the new speed settings */ 937 1.9 msaitoh ixgbe_setup_phy_link(hw); 938 1.1 dyoung 939 1.1 dyoung return IXGBE_SUCCESS; 940 1.1 dyoung } 941 1.1 dyoung 942 1.1 dyoung /** 943 1.9 msaitoh * ixgbe_get_copper_speeds_supported - Get copper link speeds from phy 944 1.9 msaitoh * @hw: pointer to hardware structure 945 1.9 msaitoh * 946 1.9 msaitoh * Determines the supported link capabilities by reading the PHY auto 947 1.9 msaitoh * negotiation register. 948 1.9 msaitoh **/ 949 1.9 msaitoh static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw) 950 1.9 msaitoh { 951 1.9 msaitoh s32 status; 952 1.9 msaitoh u16 speed_ability; 953 1.9 msaitoh 954 1.9 msaitoh status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY, 955 1.9 msaitoh IXGBE_MDIO_PMA_PMD_DEV_TYPE, 956 1.9 msaitoh &speed_ability); 957 1.9 msaitoh if (status) 958 1.9 msaitoh return status; 959 1.9 msaitoh 960 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G) 961 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_10GB_FULL; 962 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G) 963 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_1GB_FULL; 964 1.9 msaitoh if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M) 965 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_100_FULL; 966 1.9 msaitoh 967 1.9 msaitoh switch (hw->mac.type) { 968 1.9 msaitoh case ixgbe_mac_X550: 969 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_2_5GB_FULL; 970 1.9 msaitoh hw->phy.speeds_supported |= IXGBE_LINK_SPEED_5GB_FULL; 971 1.9 msaitoh break; 972 1.9 msaitoh case ixgbe_mac_X550EM_x: 973 1.12 msaitoh case ixgbe_mac_X550EM_a: 974 1.9 msaitoh hw->phy.speeds_supported &= ~IXGBE_LINK_SPEED_100_FULL; 975 1.9 msaitoh break; 976 1.9 msaitoh default: 977 1.9 msaitoh break; 978 1.9 msaitoh } 979 1.9 msaitoh 980 1.9 msaitoh return status; 981 1.9 msaitoh } 982 1.9 msaitoh 983 1.9 msaitoh /** 984 1.27 msaitoh * ixgbe_get_copper_link_capabilities_generic - Determines link capabilities 985 1.27 msaitoh * @hw: pointer to hardware structure 986 1.27 msaitoh * @speed: pointer to link speed 987 1.27 msaitoh * @autoneg: boolean auto-negotiation value 988 1.1 dyoung **/ 989 1.1 dyoung s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, 990 1.3 msaitoh ixgbe_link_speed *speed, 991 1.3 msaitoh bool *autoneg) 992 1.1 dyoung { 993 1.9 msaitoh s32 status = IXGBE_SUCCESS; 994 1.1 dyoung 995 1.1 dyoung DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic"); 996 1.1 dyoung 997 1.1 dyoung *autoneg = TRUE; 998 1.9 msaitoh if (!hw->phy.speeds_supported) 999 1.9 msaitoh status = ixgbe_get_copper_speeds_supported(hw); 1000 1.1 dyoung 1001 1.9 msaitoh *speed = hw->phy.speeds_supported; 1002 1.1 dyoung return status; 1003 1.1 dyoung } 1004 1.1 dyoung 1005 1.1 dyoung /** 1006 1.27 msaitoh * ixgbe_check_phy_link_tnx - Determine link and speed status 1007 1.27 msaitoh * @hw: pointer to hardware structure 1008 1.27 msaitoh * @speed: current link speed 1009 1.27 msaitoh * @link_up: TRUE is link is up, FALSE otherwise 1010 1.1 dyoung * 1011 1.27 msaitoh * Reads the VS1 register to determine if link is up and the current speed for 1012 1.27 msaitoh * the PHY. 1013 1.1 dyoung **/ 1014 1.1 dyoung s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed, 1015 1.3 msaitoh bool *link_up) 1016 1.1 dyoung { 1017 1.1 dyoung s32 status = IXGBE_SUCCESS; 1018 1.1 dyoung u32 time_out; 1019 1.1 dyoung u32 max_time_out = 10; 1020 1.1 dyoung u16 phy_link = 0; 1021 1.1 dyoung u16 phy_speed = 0; 1022 1.1 dyoung u16 phy_data = 0; 1023 1.1 dyoung 1024 1.1 dyoung DEBUGFUNC("ixgbe_check_phy_link_tnx"); 1025 1.1 dyoung 1026 1.1 dyoung /* Initialize speed and link to default case */ 1027 1.1 dyoung *link_up = FALSE; 1028 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL; 1029 1.1 dyoung 1030 1.1 dyoung /* 1031 1.1 dyoung * Check current speed and link status of the PHY register. 1032 1.1 dyoung * This is a vendor specific register and may have to 1033 1.1 dyoung * be changed for other copper PHYs. 1034 1.1 dyoung */ 1035 1.1 dyoung for (time_out = 0; time_out < max_time_out; time_out++) { 1036 1.1 dyoung usec_delay(10); 1037 1.1 dyoung status = hw->phy.ops.read_reg(hw, 1038 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS, 1039 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1040 1.3 msaitoh &phy_data); 1041 1.3 msaitoh phy_link = phy_data & IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS; 1042 1.1 dyoung phy_speed = phy_data & 1043 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS; 1044 1.1 dyoung if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) { 1045 1.1 dyoung *link_up = TRUE; 1046 1.1 dyoung if (phy_speed == 1047 1.1 dyoung IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS) 1048 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL; 1049 1.1 dyoung break; 1050 1.1 dyoung } 1051 1.1 dyoung } 1052 1.1 dyoung 1053 1.1 dyoung return status; 1054 1.1 dyoung } 1055 1.1 dyoung 1056 1.1 dyoung /** 1057 1.7 msaitoh * ixgbe_setup_phy_link_tnx - Set and restart auto-neg 1058 1.1 dyoung * @hw: pointer to hardware structure 1059 1.1 dyoung * 1060 1.7 msaitoh * Restart auto-negotiation and PHY and waits for completion. 1061 1.1 dyoung **/ 1062 1.1 dyoung s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw) 1063 1.1 dyoung { 1064 1.1 dyoung s32 status = IXGBE_SUCCESS; 1065 1.1 dyoung u16 autoneg_reg = IXGBE_MII_AUTONEG_REG; 1066 1.1 dyoung bool autoneg = FALSE; 1067 1.1 dyoung ixgbe_link_speed speed; 1068 1.1 dyoung 1069 1.1 dyoung DEBUGFUNC("ixgbe_setup_phy_link_tnx"); 1070 1.1 dyoung 1071 1.1 dyoung ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); 1072 1.1 dyoung 1073 1.1 dyoung if (speed & IXGBE_LINK_SPEED_10GB_FULL) { 1074 1.1 dyoung /* Set or unset auto-negotiation 10G advertisement */ 1075 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, 1076 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1077 1.3 msaitoh &autoneg_reg); 1078 1.1 dyoung 1079 1.1 dyoung autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE; 1080 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) 1081 1.1 dyoung autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE; 1082 1.1 dyoung 1083 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, 1084 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1085 1.3 msaitoh autoneg_reg); 1086 1.1 dyoung } 1087 1.1 dyoung 1088 1.1 dyoung if (speed & IXGBE_LINK_SPEED_1GB_FULL) { 1089 1.1 dyoung /* Set or unset auto-negotiation 1G advertisement */ 1090 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG, 1091 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1092 1.3 msaitoh &autoneg_reg); 1093 1.1 dyoung 1094 1.1 dyoung autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX; 1095 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) 1096 1.1 dyoung autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX; 1097 1.1 dyoung 1098 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG, 1099 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1100 1.3 msaitoh autoneg_reg); 1101 1.1 dyoung } 1102 1.1 dyoung 1103 1.1 dyoung if (speed & IXGBE_LINK_SPEED_100_FULL) { 1104 1.1 dyoung /* Set or unset auto-negotiation 100M advertisement */ 1105 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, 1106 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1107 1.3 msaitoh &autoneg_reg); 1108 1.1 dyoung 1109 1.1 dyoung autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE; 1110 1.1 dyoung if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) 1111 1.1 dyoung autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE; 1112 1.1 dyoung 1113 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, 1114 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 1115 1.3 msaitoh autoneg_reg); 1116 1.1 dyoung } 1117 1.1 dyoung 1118 1.7 msaitoh /* Blocked by MNG FW so don't reset PHY */ 1119 1.7 msaitoh if (ixgbe_check_reset_blocked(hw)) 1120 1.7 msaitoh return status; 1121 1.7 msaitoh 1122 1.7 msaitoh /* Restart PHY auto-negotiation. */ 1123 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 1124 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg); 1125 1.1 dyoung 1126 1.1 dyoung autoneg_reg |= IXGBE_MII_RESTART; 1127 1.1 dyoung 1128 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, 1129 1.3 msaitoh IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); 1130 1.1 dyoung 1131 1.1 dyoung return status; 1132 1.1 dyoung } 1133 1.1 dyoung 1134 1.1 dyoung /** 1135 1.27 msaitoh * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version 1136 1.27 msaitoh * @hw: pointer to hardware structure 1137 1.27 msaitoh * @firmware_version: pointer to the PHY Firmware Version 1138 1.1 dyoung **/ 1139 1.1 dyoung s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, 1140 1.3 msaitoh u16 *firmware_version) 1141 1.1 dyoung { 1142 1.7 msaitoh s32 status; 1143 1.1 dyoung 1144 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx"); 1145 1.1 dyoung 1146 1.1 dyoung status = hw->phy.ops.read_reg(hw, TNX_FW_REV, 1147 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1148 1.3 msaitoh firmware_version); 1149 1.1 dyoung 1150 1.1 dyoung return status; 1151 1.1 dyoung } 1152 1.1 dyoung 1153 1.1 dyoung /** 1154 1.27 msaitoh * ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version 1155 1.27 msaitoh * @hw: pointer to hardware structure 1156 1.27 msaitoh * @firmware_version: pointer to the PHY Firmware Version 1157 1.1 dyoung **/ 1158 1.1 dyoung s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw, 1159 1.3 msaitoh u16 *firmware_version) 1160 1.1 dyoung { 1161 1.7 msaitoh s32 status; 1162 1.1 dyoung 1163 1.1 dyoung DEBUGFUNC("ixgbe_get_phy_firmware_version_generic"); 1164 1.1 dyoung 1165 1.1 dyoung status = hw->phy.ops.read_reg(hw, AQ_FW_REV, 1166 1.3 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1167 1.3 msaitoh firmware_version); 1168 1.1 dyoung 1169 1.1 dyoung return status; 1170 1.1 dyoung } 1171 1.1 dyoung 1172 1.1 dyoung /** 1173 1.27 msaitoh * ixgbe_reset_phy_nl - Performs a PHY reset 1174 1.27 msaitoh * @hw: pointer to hardware structure 1175 1.1 dyoung **/ 1176 1.1 dyoung s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw) 1177 1.1 dyoung { 1178 1.1 dyoung u16 phy_offset, control, eword, edata, block_crc; 1179 1.1 dyoung bool end_data = FALSE; 1180 1.1 dyoung u16 list_offset, data_offset; 1181 1.1 dyoung u16 phy_data = 0; 1182 1.1 dyoung s32 ret_val = IXGBE_SUCCESS; 1183 1.1 dyoung u32 i; 1184 1.1 dyoung 1185 1.1 dyoung DEBUGFUNC("ixgbe_reset_phy_nl"); 1186 1.1 dyoung 1187 1.7 msaitoh /* Blocked by MNG FW so bail */ 1188 1.7 msaitoh if (ixgbe_check_reset_blocked(hw)) 1189 1.7 msaitoh goto out; 1190 1.7 msaitoh 1191 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, 1192 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); 1193 1.1 dyoung 1194 1.1 dyoung /* reset the PHY and poll for completion */ 1195 1.1 dyoung hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, 1196 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, 1197 1.3 msaitoh (phy_data | IXGBE_MDIO_PHY_XS_RESET)); 1198 1.1 dyoung 1199 1.1 dyoung for (i = 0; i < 100; i++) { 1200 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, 1201 1.3 msaitoh IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); 1202 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0) 1203 1.1 dyoung break; 1204 1.1 dyoung msec_delay(10); 1205 1.1 dyoung } 1206 1.1 dyoung 1207 1.1 dyoung if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) { 1208 1.1 dyoung DEBUGOUT("PHY reset did not complete.\n"); 1209 1.1 dyoung ret_val = IXGBE_ERR_PHY; 1210 1.1 dyoung goto out; 1211 1.1 dyoung } 1212 1.1 dyoung 1213 1.1 dyoung /* Get init offsets */ 1214 1.1 dyoung ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset, 1215 1.3 msaitoh &data_offset); 1216 1.1 dyoung if (ret_val != IXGBE_SUCCESS) 1217 1.1 dyoung goto out; 1218 1.1 dyoung 1219 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc); 1220 1.1 dyoung data_offset++; 1221 1.1 dyoung while (!end_data) { 1222 1.1 dyoung /* 1223 1.1 dyoung * Read control word from PHY init contents offset 1224 1.1 dyoung */ 1225 1.1 dyoung ret_val = hw->eeprom.ops.read(hw, data_offset, &eword); 1226 1.6 msaitoh if (ret_val) 1227 1.6 msaitoh goto err_eeprom; 1228 1.1 dyoung control = (eword & IXGBE_CONTROL_MASK_NL) >> 1229 1.3 msaitoh IXGBE_CONTROL_SHIFT_NL; 1230 1.1 dyoung edata = eword & IXGBE_DATA_MASK_NL; 1231 1.1 dyoung switch (control) { 1232 1.1 dyoung case IXGBE_DELAY_NL: 1233 1.1 dyoung data_offset++; 1234 1.1 dyoung DEBUGOUT1("DELAY: %d MS\n", edata); 1235 1.1 dyoung msec_delay(edata); 1236 1.1 dyoung break; 1237 1.1 dyoung case IXGBE_DATA_NL: 1238 1.3 msaitoh DEBUGOUT("DATA:\n"); 1239 1.1 dyoung data_offset++; 1240 1.6 msaitoh ret_val = hw->eeprom.ops.read(hw, data_offset, 1241 1.6 msaitoh &phy_offset); 1242 1.6 msaitoh if (ret_val) 1243 1.6 msaitoh goto err_eeprom; 1244 1.6 msaitoh data_offset++; 1245 1.1 dyoung for (i = 0; i < edata; i++) { 1246 1.6 msaitoh ret_val = hw->eeprom.ops.read(hw, data_offset, 1247 1.6 msaitoh &eword); 1248 1.6 msaitoh if (ret_val) 1249 1.6 msaitoh goto err_eeprom; 1250 1.1 dyoung hw->phy.ops.write_reg(hw, phy_offset, 1251 1.3 msaitoh IXGBE_TWINAX_DEV, eword); 1252 1.1 dyoung DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword, 1253 1.3 msaitoh phy_offset); 1254 1.1 dyoung data_offset++; 1255 1.1 dyoung phy_offset++; 1256 1.1 dyoung } 1257 1.1 dyoung break; 1258 1.1 dyoung case IXGBE_CONTROL_NL: 1259 1.1 dyoung data_offset++; 1260 1.3 msaitoh DEBUGOUT("CONTROL:\n"); 1261 1.1 dyoung if (edata == IXGBE_CONTROL_EOL_NL) { 1262 1.1 dyoung DEBUGOUT("EOL\n"); 1263 1.1 dyoung end_data = TRUE; 1264 1.1 dyoung } else if (edata == IXGBE_CONTROL_SOL_NL) { 1265 1.1 dyoung DEBUGOUT("SOL\n"); 1266 1.1 dyoung } else { 1267 1.1 dyoung DEBUGOUT("Bad control value\n"); 1268 1.1 dyoung ret_val = IXGBE_ERR_PHY; 1269 1.1 dyoung goto out; 1270 1.1 dyoung } 1271 1.1 dyoung break; 1272 1.1 dyoung default: 1273 1.1 dyoung DEBUGOUT("Bad control type\n"); 1274 1.1 dyoung ret_val = IXGBE_ERR_PHY; 1275 1.1 dyoung goto out; 1276 1.1 dyoung } 1277 1.1 dyoung } 1278 1.1 dyoung 1279 1.1 dyoung out: 1280 1.1 dyoung return ret_val; 1281 1.6 msaitoh 1282 1.6 msaitoh err_eeprom: 1283 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 1284 1.6 msaitoh "eeprom read at offset %d failed", data_offset); 1285 1.6 msaitoh return IXGBE_ERR_PHY; 1286 1.1 dyoung } 1287 1.1 dyoung 1288 1.23 msaitoh /************************************************************************ 1289 1.23 msaitoh * ixgbe_sfp_cage_full 1290 1.23 msaitoh * 1291 1.23 msaitoh * Determine if an SFP+ module is inserted to the cage. 1292 1.23 msaitoh ************************************************************************/ 1293 1.23 msaitoh bool 1294 1.23 msaitoh ixgbe_sfp_cage_full(struct ixgbe_hw *hw) 1295 1.23 msaitoh { 1296 1.23 msaitoh uint32_t mask; 1297 1.23 msaitoh int rv; 1298 1.23 msaitoh 1299 1.23 msaitoh KASSERT(hw->mac.type != ixgbe_mac_82598EB); 1300 1.23 msaitoh 1301 1.23 msaitoh if (hw->mac.type >= ixgbe_mac_X540) 1302 1.23 msaitoh mask = IXGBE_ESDP_SDP0; 1303 1.23 msaitoh else 1304 1.23 msaitoh mask = IXGBE_ESDP_SDP2; 1305 1.23 msaitoh 1306 1.23 msaitoh rv = IXGBE_READ_REG(hw, IXGBE_ESDP) & mask; 1307 1.23 msaitoh if ((hw->quirks & IXGBE_QUIRK_MOD_ABS_INVERT) != 0) 1308 1.23 msaitoh rv = !rv; 1309 1.23 msaitoh 1310 1.23 msaitoh if (hw->mac.type == ixgbe_mac_X550EM_a) { 1311 1.23 msaitoh /* X550EM_a's SDP0 is inverted than others. */ 1312 1.23 msaitoh return !rv; 1313 1.23 msaitoh } 1314 1.23 msaitoh 1315 1.23 msaitoh return rv; 1316 1.23 msaitoh } /* ixgbe_sfp_cage_full */ 1317 1.23 msaitoh 1318 1.1 dyoung /** 1319 1.27 msaitoh * ixgbe_identify_module_generic - Identifies module type 1320 1.27 msaitoh * @hw: pointer to hardware structure 1321 1.3 msaitoh * 1322 1.27 msaitoh * Determines HW type and calls appropriate function. 1323 1.3 msaitoh **/ 1324 1.3 msaitoh s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw) 1325 1.3 msaitoh { 1326 1.3 msaitoh s32 status = IXGBE_ERR_SFP_NOT_PRESENT; 1327 1.3 msaitoh 1328 1.3 msaitoh DEBUGFUNC("ixgbe_identify_module_generic"); 1329 1.3 msaitoh 1330 1.23 msaitoh /* Lightweight way to check if the cage is not full. */ 1331 1.23 msaitoh if (hw->mac.type != ixgbe_mac_82598EB) { 1332 1.23 msaitoh if (!ixgbe_sfp_cage_full(hw)) { 1333 1.23 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1334 1.23 msaitoh return IXGBE_ERR_SFP_NOT_PRESENT; 1335 1.23 msaitoh } 1336 1.23 msaitoh } 1337 1.23 msaitoh 1338 1.3 msaitoh switch (hw->mac.ops.get_media_type(hw)) { 1339 1.3 msaitoh case ixgbe_media_type_fiber: 1340 1.3 msaitoh status = ixgbe_identify_sfp_module_generic(hw); 1341 1.3 msaitoh break; 1342 1.3 msaitoh 1343 1.7 msaitoh case ixgbe_media_type_fiber_qsfp: 1344 1.7 msaitoh status = ixgbe_identify_qsfp_module_generic(hw); 1345 1.7 msaitoh break; 1346 1.3 msaitoh 1347 1.3 msaitoh default: 1348 1.3 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1349 1.3 msaitoh status = IXGBE_ERR_SFP_NOT_PRESENT; 1350 1.3 msaitoh break; 1351 1.3 msaitoh } 1352 1.3 msaitoh 1353 1.3 msaitoh return status; 1354 1.3 msaitoh } 1355 1.3 msaitoh 1356 1.3 msaitoh /** 1357 1.27 msaitoh * ixgbe_identify_sfp_module_generic - Identifies SFP modules 1358 1.27 msaitoh * @hw: pointer to hardware structure 1359 1.1 dyoung * 1360 1.27 msaitoh * Searches for and identifies the SFP module and assigns appropriate PHY type. 1361 1.1 dyoung **/ 1362 1.1 dyoung s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) 1363 1.1 dyoung { 1364 1.1 dyoung s32 status = IXGBE_ERR_PHY_ADDR_INVALID; 1365 1.1 dyoung u32 vendor_oui = 0; 1366 1.1 dyoung enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type; 1367 1.1 dyoung u8 identifier = 0; 1368 1.1 dyoung u8 comp_codes_1g = 0; 1369 1.1 dyoung u8 comp_codes_10g = 0; 1370 1.1 dyoung u8 oui_bytes[3] = {0, 0, 0}; 1371 1.1 dyoung u8 cable_tech = 0; 1372 1.1 dyoung u8 cable_spec = 0; 1373 1.1 dyoung u16 enforce_sfp = 0; 1374 1.1 dyoung 1375 1.1 dyoung DEBUGFUNC("ixgbe_identify_sfp_module_generic"); 1376 1.1 dyoung 1377 1.1 dyoung if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) { 1378 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1379 1.1 dyoung status = IXGBE_ERR_SFP_NOT_PRESENT; 1380 1.1 dyoung goto out; 1381 1.1 dyoung } 1382 1.1 dyoung 1383 1.7 msaitoh /* LAN ID is needed for I2C access */ 1384 1.7 msaitoh hw->mac.ops.set_lan_id(hw); 1385 1.7 msaitoh 1386 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1387 1.3 msaitoh IXGBE_SFF_IDENTIFIER, 1388 1.3 msaitoh &identifier); 1389 1.1 dyoung 1390 1.5 msaitoh if (status != IXGBE_SUCCESS) 1391 1.1 dyoung goto err_read_i2c_eeprom; 1392 1.1 dyoung 1393 1.1 dyoung if (identifier != IXGBE_SFF_IDENTIFIER_SFP) { 1394 1.22 msaitoh if (hw->phy.type != ixgbe_phy_nl) 1395 1.22 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported; 1396 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1397 1.1 dyoung } else { 1398 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1399 1.3 msaitoh IXGBE_SFF_1GBE_COMP_CODES, 1400 1.3 msaitoh &comp_codes_1g); 1401 1.1 dyoung 1402 1.5 msaitoh if (status != IXGBE_SUCCESS) 1403 1.1 dyoung goto err_read_i2c_eeprom; 1404 1.1 dyoung 1405 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1406 1.3 msaitoh IXGBE_SFF_10GBE_COMP_CODES, 1407 1.3 msaitoh &comp_codes_10g); 1408 1.1 dyoung 1409 1.5 msaitoh if (status != IXGBE_SUCCESS) 1410 1.1 dyoung goto err_read_i2c_eeprom; 1411 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1412 1.3 msaitoh IXGBE_SFF_CABLE_TECHNOLOGY, 1413 1.3 msaitoh &cable_tech); 1414 1.1 dyoung 1415 1.5 msaitoh if (status != IXGBE_SUCCESS) 1416 1.1 dyoung goto err_read_i2c_eeprom; 1417 1.1 dyoung 1418 1.1 dyoung /* ID Module 1419 1.1 dyoung * ========= 1420 1.1 dyoung * 0 SFP_DA_CU 1421 1.1 dyoung * 1 SFP_SR 1422 1.1 dyoung * 2 SFP_LR 1423 1.1 dyoung * 3 SFP_DA_CORE0 - 82599-specific 1424 1.1 dyoung * 4 SFP_DA_CORE1 - 82599-specific 1425 1.1 dyoung * 5 SFP_SR/LR_CORE0 - 82599-specific 1426 1.1 dyoung * 6 SFP_SR/LR_CORE1 - 82599-specific 1427 1.1 dyoung * 7 SFP_act_lmt_DA_CORE0 - 82599-specific 1428 1.1 dyoung * 8 SFP_act_lmt_DA_CORE1 - 82599-specific 1429 1.1 dyoung * 9 SFP_1g_cu_CORE0 - 82599-specific 1430 1.1 dyoung * 10 SFP_1g_cu_CORE1 - 82599-specific 1431 1.4 msaitoh * 11 SFP_1g_sx_CORE0 - 82599-specific 1432 1.4 msaitoh * 12 SFP_1g_sx_CORE1 - 82599-specific 1433 1.1 dyoung */ 1434 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) { 1435 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) 1436 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_da_cu; 1437 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) 1438 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_sr; 1439 1.1 dyoung else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) 1440 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_lr; 1441 1.1 dyoung else 1442 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown; 1443 1.7 msaitoh } else { 1444 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) { 1445 1.1 dyoung if (hw->bus.lan_id == 0) 1446 1.1 dyoung hw->phy.sfp_type = 1447 1.3 msaitoh ixgbe_sfp_type_da_cu_core0; 1448 1.1 dyoung else 1449 1.1 dyoung hw->phy.sfp_type = 1450 1.3 msaitoh ixgbe_sfp_type_da_cu_core1; 1451 1.1 dyoung } else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) { 1452 1.1 dyoung hw->phy.ops.read_i2c_eeprom( 1453 1.1 dyoung hw, IXGBE_SFF_CABLE_SPEC_COMP, 1454 1.1 dyoung &cable_spec); 1455 1.1 dyoung if (cable_spec & 1456 1.1 dyoung IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) { 1457 1.1 dyoung if (hw->bus.lan_id == 0) 1458 1.1 dyoung hw->phy.sfp_type = 1459 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core0; 1460 1.1 dyoung else 1461 1.1 dyoung hw->phy.sfp_type = 1462 1.1 dyoung ixgbe_sfp_type_da_act_lmt_core1; 1463 1.1 dyoung } else { 1464 1.1 dyoung hw->phy.sfp_type = 1465 1.3 msaitoh ixgbe_sfp_type_unknown; 1466 1.1 dyoung } 1467 1.1 dyoung } else if (comp_codes_10g & 1468 1.1 dyoung (IXGBE_SFF_10GBASESR_CAPABLE | 1469 1.1 dyoung IXGBE_SFF_10GBASELR_CAPABLE)) { 1470 1.1 dyoung if (hw->bus.lan_id == 0) 1471 1.1 dyoung hw->phy.sfp_type = 1472 1.3 msaitoh ixgbe_sfp_type_srlr_core0; 1473 1.1 dyoung else 1474 1.1 dyoung hw->phy.sfp_type = 1475 1.3 msaitoh ixgbe_sfp_type_srlr_core1; 1476 1.1 dyoung } else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) { 1477 1.1 dyoung if (hw->bus.lan_id == 0) 1478 1.1 dyoung hw->phy.sfp_type = 1479 1.1 dyoung ixgbe_sfp_type_1g_cu_core0; 1480 1.1 dyoung else 1481 1.1 dyoung hw->phy.sfp_type = 1482 1.1 dyoung ixgbe_sfp_type_1g_cu_core1; 1483 1.4 msaitoh } else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) { 1484 1.4 msaitoh if (hw->bus.lan_id == 0) 1485 1.4 msaitoh hw->phy.sfp_type = 1486 1.4 msaitoh ixgbe_sfp_type_1g_sx_core0; 1487 1.4 msaitoh else 1488 1.4 msaitoh hw->phy.sfp_type = 1489 1.4 msaitoh ixgbe_sfp_type_1g_sx_core1; 1490 1.8 msaitoh } else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) { 1491 1.8 msaitoh if (hw->bus.lan_id == 0) 1492 1.8 msaitoh hw->phy.sfp_type = 1493 1.8 msaitoh ixgbe_sfp_type_1g_lx_core0; 1494 1.8 msaitoh else 1495 1.8 msaitoh hw->phy.sfp_type = 1496 1.8 msaitoh ixgbe_sfp_type_1g_lx_core1; 1497 1.1 dyoung } else { 1498 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_unknown; 1499 1.1 dyoung } 1500 1.1 dyoung } 1501 1.1 dyoung 1502 1.1 dyoung if (hw->phy.sfp_type != stored_sfp_type) 1503 1.1 dyoung hw->phy.sfp_setup_needed = TRUE; 1504 1.1 dyoung 1505 1.1 dyoung /* Determine if the SFP+ PHY is dual speed or not. */ 1506 1.1 dyoung hw->phy.multispeed_fiber = FALSE; 1507 1.1 dyoung if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) && 1508 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) || 1509 1.1 dyoung ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && 1510 1.1 dyoung (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE))) 1511 1.1 dyoung hw->phy.multispeed_fiber = TRUE; 1512 1.1 dyoung 1513 1.1 dyoung /* Determine PHY vendor */ 1514 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) { 1515 1.1 dyoung hw->phy.id = identifier; 1516 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1517 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE0, 1518 1.3 msaitoh &oui_bytes[0]); 1519 1.1 dyoung 1520 1.5 msaitoh if (status != IXGBE_SUCCESS) 1521 1.1 dyoung goto err_read_i2c_eeprom; 1522 1.1 dyoung 1523 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1524 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE1, 1525 1.3 msaitoh &oui_bytes[1]); 1526 1.1 dyoung 1527 1.5 msaitoh if (status != IXGBE_SUCCESS) 1528 1.1 dyoung goto err_read_i2c_eeprom; 1529 1.1 dyoung 1530 1.1 dyoung status = hw->phy.ops.read_i2c_eeprom(hw, 1531 1.3 msaitoh IXGBE_SFF_VENDOR_OUI_BYTE2, 1532 1.3 msaitoh &oui_bytes[2]); 1533 1.1 dyoung 1534 1.5 msaitoh if (status != IXGBE_SUCCESS) 1535 1.1 dyoung goto err_read_i2c_eeprom; 1536 1.1 dyoung 1537 1.1 dyoung vendor_oui = 1538 1.1 dyoung ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) | 1539 1.1 dyoung (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) | 1540 1.1 dyoung (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT)); 1541 1.1 dyoung 1542 1.1 dyoung switch (vendor_oui) { 1543 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_TYCO: 1544 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) 1545 1.1 dyoung hw->phy.type = 1546 1.3 msaitoh ixgbe_phy_sfp_passive_tyco; 1547 1.1 dyoung break; 1548 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_FTL: 1549 1.1 dyoung if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) 1550 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl_active; 1551 1.1 dyoung else 1552 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_ftl; 1553 1.1 dyoung break; 1554 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_AVAGO: 1555 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_avago; 1556 1.1 dyoung break; 1557 1.1 dyoung case IXGBE_SFF_VENDOR_OUI_INTEL: 1558 1.1 dyoung hw->phy.type = ixgbe_phy_sfp_intel; 1559 1.1 dyoung break; 1560 1.1 dyoung default: 1561 1.15 msaitoh hw->phy.type = ixgbe_phy_sfp_unknown; 1562 1.1 dyoung break; 1563 1.1 dyoung } 1564 1.1 dyoung } 1565 1.1 dyoung 1566 1.1 dyoung /* Allow any DA cable vendor */ 1567 1.1 dyoung if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE | 1568 1.22 msaitoh IXGBE_SFF_DA_ACTIVE_CABLE)) { 1569 1.22 msaitoh status = IXGBE_SUCCESS; 1570 1.22 msaitoh 1571 1.22 msaitoh /* Keep phy.type for ixgbe_phy_nl */ 1572 1.22 msaitoh if (hw->phy.type == ixgbe_phy_nl) 1573 1.22 msaitoh goto out; 1574 1.22 msaitoh 1575 1.15 msaitoh if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) 1576 1.15 msaitoh hw->phy.type = ixgbe_phy_sfp_passive_unknown; 1577 1.15 msaitoh else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) 1578 1.15 msaitoh hw->phy.type = ixgbe_phy_sfp_active_unknown; 1579 1.1 dyoung goto out; 1580 1.1 dyoung } 1581 1.1 dyoung 1582 1.1 dyoung /* Verify supported 1G SFP modules */ 1583 1.1 dyoung if (comp_codes_10g == 0 && 1584 1.1 dyoung !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || 1585 1.4 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || 1586 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || 1587 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 || 1588 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || 1589 1.4 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) { 1590 1.22 msaitoh if (hw->phy.type != ixgbe_phy_nl) 1591 1.22 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported; 1592 1.1 dyoung status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1593 1.1 dyoung goto out; 1594 1.1 dyoung } 1595 1.1 dyoung 1596 1.1 dyoung /* Anything else 82598-based is supported */ 1597 1.1 dyoung if (hw->mac.type == ixgbe_mac_82598EB) { 1598 1.1 dyoung status = IXGBE_SUCCESS; 1599 1.1 dyoung goto out; 1600 1.1 dyoung } 1601 1.1 dyoung 1602 1.1 dyoung ixgbe_get_device_caps(hw, &enforce_sfp); 1603 1.1 dyoung if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) && 1604 1.6 msaitoh !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 || 1605 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 || 1606 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || 1607 1.8 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 || 1608 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || 1609 1.6 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) { 1610 1.1 dyoung /* Make sure we're a supported PHY type */ 1611 1.1 dyoung if (hw->phy.type == ixgbe_phy_sfp_intel) { 1612 1.1 dyoung status = IXGBE_SUCCESS; 1613 1.1 dyoung } else { 1614 1.4 msaitoh if (hw->allow_unsupported_sfp == TRUE) { 1615 1.12 msaitoh EWARN(hw, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n"); 1616 1.4 msaitoh status = IXGBE_SUCCESS; 1617 1.4 msaitoh } else { 1618 1.4 msaitoh DEBUGOUT("SFP+ module not supported\n"); 1619 1.22 msaitoh if (hw->phy.type != ixgbe_phy_nl) 1620 1.22 msaitoh hw->phy.type = 1621 1.22 msaitoh ixgbe_phy_sfp_unsupported; 1622 1.4 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1623 1.4 msaitoh } 1624 1.1 dyoung } 1625 1.1 dyoung } else { 1626 1.1 dyoung status = IXGBE_SUCCESS; 1627 1.1 dyoung } 1628 1.1 dyoung } 1629 1.1 dyoung 1630 1.1 dyoung out: 1631 1.22 msaitoh if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) 1632 1.20 msaitoh hw->need_unsupported_sfp_recovery = true; 1633 1.1 dyoung return status; 1634 1.1 dyoung 1635 1.1 dyoung err_read_i2c_eeprom: 1636 1.1 dyoung hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1637 1.1 dyoung if (hw->phy.type != ixgbe_phy_nl) { 1638 1.1 dyoung hw->phy.id = 0; 1639 1.1 dyoung hw->phy.type = ixgbe_phy_unknown; 1640 1.1 dyoung } 1641 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT; 1642 1.1 dyoung } 1643 1.1 dyoung 1644 1.7 msaitoh /** 1645 1.27 msaitoh * ixgbe_get_supported_phy_sfp_layer_generic - Returns physical layer type 1646 1.27 msaitoh * @hw: pointer to hardware structure 1647 1.7 msaitoh * 1648 1.27 msaitoh * Determines physical layer capabilities of the current SFP. 1649 1.7 msaitoh */ 1650 1.12 msaitoh u64 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw) 1651 1.7 msaitoh { 1652 1.12 msaitoh u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 1653 1.7 msaitoh u8 comp_codes_10g = 0; 1654 1.7 msaitoh u8 comp_codes_1g = 0; 1655 1.7 msaitoh 1656 1.7 msaitoh DEBUGFUNC("ixgbe_get_supported_phy_sfp_layer_generic"); 1657 1.7 msaitoh 1658 1.7 msaitoh hw->phy.ops.identify_sfp(hw); 1659 1.7 msaitoh if (hw->phy.sfp_type == ixgbe_sfp_type_not_present) 1660 1.7 msaitoh return physical_layer; 1661 1.7 msaitoh 1662 1.7 msaitoh switch (hw->phy.type) { 1663 1.7 msaitoh case ixgbe_phy_sfp_passive_tyco: 1664 1.7 msaitoh case ixgbe_phy_sfp_passive_unknown: 1665 1.7 msaitoh case ixgbe_phy_qsfp_passive_unknown: 1666 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; 1667 1.7 msaitoh break; 1668 1.7 msaitoh case ixgbe_phy_sfp_ftl_active: 1669 1.7 msaitoh case ixgbe_phy_sfp_active_unknown: 1670 1.7 msaitoh case ixgbe_phy_qsfp_active_unknown: 1671 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA; 1672 1.7 msaitoh break; 1673 1.7 msaitoh case ixgbe_phy_sfp_avago: 1674 1.7 msaitoh case ixgbe_phy_sfp_ftl: 1675 1.7 msaitoh case ixgbe_phy_sfp_intel: 1676 1.7 msaitoh case ixgbe_phy_sfp_unknown: 1677 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1678 1.7 msaitoh IXGBE_SFF_1GBE_COMP_CODES, &comp_codes_1g); 1679 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1680 1.7 msaitoh IXGBE_SFF_10GBE_COMP_CODES, &comp_codes_10g); 1681 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) 1682 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; 1683 1.7 msaitoh else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) 1684 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; 1685 1.7 msaitoh else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) 1686 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T; 1687 1.7 msaitoh else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) 1688 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_SX; 1689 1.7 msaitoh break; 1690 1.7 msaitoh case ixgbe_phy_qsfp_intel: 1691 1.7 msaitoh case ixgbe_phy_qsfp_unknown: 1692 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1693 1.7 msaitoh IXGBE_SFF_QSFP_10GBE_COMP, &comp_codes_10g); 1694 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE) 1695 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; 1696 1.7 msaitoh else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE) 1697 1.7 msaitoh physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; 1698 1.7 msaitoh break; 1699 1.7 msaitoh default: 1700 1.7 msaitoh break; 1701 1.7 msaitoh } 1702 1.7 msaitoh 1703 1.7 msaitoh return physical_layer; 1704 1.7 msaitoh } 1705 1.7 msaitoh 1706 1.7 msaitoh /** 1707 1.27 msaitoh * ixgbe_identify_qsfp_module_generic - Identifies QSFP modules 1708 1.27 msaitoh * @hw: pointer to hardware structure 1709 1.7 msaitoh * 1710 1.27 msaitoh * Searches for and identifies the QSFP module and assigns appropriate PHY type 1711 1.7 msaitoh **/ 1712 1.7 msaitoh s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw) 1713 1.7 msaitoh { 1714 1.7 msaitoh s32 status = IXGBE_ERR_PHY_ADDR_INVALID; 1715 1.7 msaitoh u32 vendor_oui = 0; 1716 1.7 msaitoh enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type; 1717 1.7 msaitoh u8 identifier = 0; 1718 1.7 msaitoh u8 comp_codes_1g = 0; 1719 1.7 msaitoh u8 comp_codes_10g = 0; 1720 1.7 msaitoh u8 oui_bytes[3] = {0, 0, 0}; 1721 1.7 msaitoh u16 enforce_sfp = 0; 1722 1.7 msaitoh u8 connector = 0; 1723 1.7 msaitoh u8 cable_length = 0; 1724 1.7 msaitoh u8 device_tech = 0; 1725 1.7 msaitoh bool active_cable = FALSE; 1726 1.7 msaitoh 1727 1.7 msaitoh DEBUGFUNC("ixgbe_identify_qsfp_module_generic"); 1728 1.7 msaitoh 1729 1.7 msaitoh if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) { 1730 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1731 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_PRESENT; 1732 1.7 msaitoh goto out; 1733 1.7 msaitoh } 1734 1.7 msaitoh 1735 1.8 msaitoh /* LAN ID is needed for I2C access */ 1736 1.8 msaitoh hw->mac.ops.set_lan_id(hw); 1737 1.8 msaitoh 1738 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER, 1739 1.7 msaitoh &identifier); 1740 1.7 msaitoh 1741 1.7 msaitoh if (status != IXGBE_SUCCESS) 1742 1.7 msaitoh goto err_read_i2c_eeprom; 1743 1.7 msaitoh 1744 1.7 msaitoh if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) { 1745 1.7 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported; 1746 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1747 1.7 msaitoh goto out; 1748 1.7 msaitoh } 1749 1.7 msaitoh 1750 1.7 msaitoh hw->phy.id = identifier; 1751 1.7 msaitoh 1752 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_10GBE_COMP, 1753 1.7 msaitoh &comp_codes_10g); 1754 1.7 msaitoh 1755 1.7 msaitoh if (status != IXGBE_SUCCESS) 1756 1.7 msaitoh goto err_read_i2c_eeprom; 1757 1.7 msaitoh 1758 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_1GBE_COMP, 1759 1.7 msaitoh &comp_codes_1g); 1760 1.7 msaitoh 1761 1.7 msaitoh if (status != IXGBE_SUCCESS) 1762 1.7 msaitoh goto err_read_i2c_eeprom; 1763 1.7 msaitoh 1764 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) { 1765 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_passive_unknown; 1766 1.7 msaitoh if (hw->bus.lan_id == 0) 1767 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core0; 1768 1.7 msaitoh else 1769 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core1; 1770 1.7 msaitoh } else if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE | 1771 1.7 msaitoh IXGBE_SFF_10GBASELR_CAPABLE)) { 1772 1.7 msaitoh if (hw->bus.lan_id == 0) 1773 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_srlr_core0; 1774 1.7 msaitoh else 1775 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_srlr_core1; 1776 1.7 msaitoh } else { 1777 1.7 msaitoh if (comp_codes_10g & IXGBE_SFF_QSFP_DA_ACTIVE_CABLE) 1778 1.7 msaitoh active_cable = TRUE; 1779 1.7 msaitoh 1780 1.7 msaitoh if (!active_cable) { 1781 1.7 msaitoh /* check for active DA cables that pre-date 1782 1.7 msaitoh * SFF-8436 v3.6 */ 1783 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1784 1.7 msaitoh IXGBE_SFF_QSFP_CONNECTOR, 1785 1.7 msaitoh &connector); 1786 1.7 msaitoh 1787 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1788 1.7 msaitoh IXGBE_SFF_QSFP_CABLE_LENGTH, 1789 1.7 msaitoh &cable_length); 1790 1.7 msaitoh 1791 1.7 msaitoh hw->phy.ops.read_i2c_eeprom(hw, 1792 1.7 msaitoh IXGBE_SFF_QSFP_DEVICE_TECH, 1793 1.7 msaitoh &device_tech); 1794 1.7 msaitoh 1795 1.7 msaitoh if ((connector == 1796 1.7 msaitoh IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE) && 1797 1.7 msaitoh (cable_length > 0) && 1798 1.7 msaitoh ((device_tech >> 4) == 1799 1.7 msaitoh IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL)) 1800 1.7 msaitoh active_cable = TRUE; 1801 1.7 msaitoh } 1802 1.7 msaitoh 1803 1.7 msaitoh if (active_cable) { 1804 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_active_unknown; 1805 1.7 msaitoh if (hw->bus.lan_id == 0) 1806 1.7 msaitoh hw->phy.sfp_type = 1807 1.7 msaitoh ixgbe_sfp_type_da_act_lmt_core0; 1808 1.7 msaitoh else 1809 1.7 msaitoh hw->phy.sfp_type = 1810 1.7 msaitoh ixgbe_sfp_type_da_act_lmt_core1; 1811 1.7 msaitoh } else { 1812 1.7 msaitoh /* unsupported module type */ 1813 1.7 msaitoh hw->phy.type = ixgbe_phy_sfp_unsupported; 1814 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1815 1.7 msaitoh goto out; 1816 1.7 msaitoh } 1817 1.7 msaitoh } 1818 1.7 msaitoh 1819 1.7 msaitoh if (hw->phy.sfp_type != stored_sfp_type) 1820 1.7 msaitoh hw->phy.sfp_setup_needed = TRUE; 1821 1.7 msaitoh 1822 1.7 msaitoh /* Determine if the QSFP+ PHY is dual speed or not. */ 1823 1.7 msaitoh hw->phy.multispeed_fiber = FALSE; 1824 1.7 msaitoh if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) && 1825 1.7 msaitoh (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) || 1826 1.7 msaitoh ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && 1827 1.7 msaitoh (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE))) 1828 1.7 msaitoh hw->phy.multispeed_fiber = TRUE; 1829 1.7 msaitoh 1830 1.7 msaitoh /* Determine PHY vendor for optical modules */ 1831 1.7 msaitoh if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE | 1832 1.21 msaitoh IXGBE_SFF_10GBASELR_CAPABLE)) { 1833 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, 1834 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0, 1835 1.7 msaitoh &oui_bytes[0]); 1836 1.7 msaitoh 1837 1.7 msaitoh if (status != IXGBE_SUCCESS) 1838 1.7 msaitoh goto err_read_i2c_eeprom; 1839 1.7 msaitoh 1840 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, 1841 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1, 1842 1.7 msaitoh &oui_bytes[1]); 1843 1.7 msaitoh 1844 1.7 msaitoh if (status != IXGBE_SUCCESS) 1845 1.7 msaitoh goto err_read_i2c_eeprom; 1846 1.7 msaitoh 1847 1.7 msaitoh status = hw->phy.ops.read_i2c_eeprom(hw, 1848 1.7 msaitoh IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2, 1849 1.7 msaitoh &oui_bytes[2]); 1850 1.7 msaitoh 1851 1.7 msaitoh if (status != IXGBE_SUCCESS) 1852 1.7 msaitoh goto err_read_i2c_eeprom; 1853 1.7 msaitoh 1854 1.7 msaitoh vendor_oui = 1855 1.7 msaitoh ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) | 1856 1.7 msaitoh (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) | 1857 1.7 msaitoh (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT)); 1858 1.7 msaitoh 1859 1.7 msaitoh if (vendor_oui == IXGBE_SFF_VENDOR_OUI_INTEL) 1860 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_intel; 1861 1.7 msaitoh else 1862 1.7 msaitoh hw->phy.type = ixgbe_phy_qsfp_unknown; 1863 1.7 msaitoh 1864 1.7 msaitoh ixgbe_get_device_caps(hw, &enforce_sfp); 1865 1.7 msaitoh if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) { 1866 1.7 msaitoh /* Make sure we're a supported PHY type */ 1867 1.7 msaitoh if (hw->phy.type == ixgbe_phy_qsfp_intel) { 1868 1.7 msaitoh status = IXGBE_SUCCESS; 1869 1.7 msaitoh } else { 1870 1.7 msaitoh if (hw->allow_unsupported_sfp == TRUE) { 1871 1.12 msaitoh EWARN(hw, "WARNING: Intel (R) Network Connections are quality tested using Intel (R) Ethernet Optics. Using untested modules is not supported and may cause unstable operation or damage to the module or the adapter. Intel Corporation is not responsible for any harm caused by using untested modules.\n"); 1872 1.7 msaitoh status = IXGBE_SUCCESS; 1873 1.7 msaitoh } else { 1874 1.7 msaitoh DEBUGOUT("QSFP module not supported\n"); 1875 1.7 msaitoh hw->phy.type = 1876 1.7 msaitoh ixgbe_phy_sfp_unsupported; 1877 1.7 msaitoh status = IXGBE_ERR_SFP_NOT_SUPPORTED; 1878 1.7 msaitoh } 1879 1.7 msaitoh } 1880 1.7 msaitoh } else { 1881 1.7 msaitoh status = IXGBE_SUCCESS; 1882 1.7 msaitoh } 1883 1.7 msaitoh } 1884 1.7 msaitoh 1885 1.7 msaitoh out: 1886 1.20 msaitoh if (hw->phy.type == ixgbe_phy_sfp_unsupported) 1887 1.20 msaitoh hw->need_unsupported_sfp_recovery = true; 1888 1.7 msaitoh return status; 1889 1.7 msaitoh 1890 1.7 msaitoh err_read_i2c_eeprom: 1891 1.7 msaitoh hw->phy.sfp_type = ixgbe_sfp_type_not_present; 1892 1.7 msaitoh hw->phy.id = 0; 1893 1.7 msaitoh hw->phy.type = ixgbe_phy_unknown; 1894 1.7 msaitoh 1895 1.7 msaitoh return IXGBE_ERR_SFP_NOT_PRESENT; 1896 1.7 msaitoh } 1897 1.3 msaitoh 1898 1.1 dyoung /** 1899 1.27 msaitoh * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence 1900 1.27 msaitoh * @hw: pointer to hardware structure 1901 1.27 msaitoh * @list_offset: offset to the SFP ID list 1902 1.27 msaitoh * @data_offset: offset to the SFP data block 1903 1.1 dyoung * 1904 1.27 msaitoh * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if 1905 1.27 msaitoh * so it returns the offsets to the phy init sequence block. 1906 1.1 dyoung **/ 1907 1.1 dyoung s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, 1908 1.3 msaitoh u16 *list_offset, 1909 1.3 msaitoh u16 *data_offset) 1910 1.1 dyoung { 1911 1.1 dyoung u16 sfp_id; 1912 1.1 dyoung u16 sfp_type = hw->phy.sfp_type; 1913 1.1 dyoung 1914 1.1 dyoung DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets"); 1915 1.1 dyoung 1916 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) 1917 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED; 1918 1.1 dyoung 1919 1.1 dyoung if (hw->phy.sfp_type == ixgbe_sfp_type_not_present) 1920 1.1 dyoung return IXGBE_ERR_SFP_NOT_PRESENT; 1921 1.1 dyoung 1922 1.1 dyoung if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) && 1923 1.1 dyoung (hw->phy.sfp_type == ixgbe_sfp_type_da_cu)) 1924 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED; 1925 1.1 dyoung 1926 1.1 dyoung /* 1927 1.1 dyoung * Limiting active cables and 1G Phys must be initialized as 1928 1.1 dyoung * SR modules 1929 1.1 dyoung */ 1930 1.1 dyoung if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 || 1931 1.8 msaitoh sfp_type == ixgbe_sfp_type_1g_lx_core0 || 1932 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_cu_core0 || 1933 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_sx_core0) 1934 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core0; 1935 1.1 dyoung else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 || 1936 1.8 msaitoh sfp_type == ixgbe_sfp_type_1g_lx_core1 || 1937 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_cu_core1 || 1938 1.4 msaitoh sfp_type == ixgbe_sfp_type_1g_sx_core1) 1939 1.1 dyoung sfp_type = ixgbe_sfp_type_srlr_core1; 1940 1.1 dyoung 1941 1.1 dyoung /* Read offset to PHY init contents */ 1942 1.6 msaitoh if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) { 1943 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 1944 1.6 msaitoh "eeprom read at offset %d failed", 1945 1.6 msaitoh IXGBE_PHY_INIT_OFFSET_NL); 1946 1.6 msaitoh return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT; 1947 1.6 msaitoh } 1948 1.1 dyoung 1949 1.1 dyoung if ((!*list_offset) || (*list_offset == 0xFFFF)) 1950 1.1 dyoung return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT; 1951 1.1 dyoung 1952 1.1 dyoung /* Shift offset to first ID word */ 1953 1.1 dyoung (*list_offset)++; 1954 1.1 dyoung 1955 1.1 dyoung /* 1956 1.1 dyoung * Find the matching SFP ID in the EEPROM 1957 1.1 dyoung * and program the init sequence 1958 1.1 dyoung */ 1959 1.6 msaitoh if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id)) 1960 1.6 msaitoh goto err_phy; 1961 1.1 dyoung 1962 1.1 dyoung while (sfp_id != IXGBE_PHY_INIT_END_NL) { 1963 1.1 dyoung if (sfp_id == sfp_type) { 1964 1.1 dyoung (*list_offset)++; 1965 1.6 msaitoh if (hw->eeprom.ops.read(hw, *list_offset, data_offset)) 1966 1.6 msaitoh goto err_phy; 1967 1.1 dyoung if ((!*data_offset) || (*data_offset == 0xFFFF)) { 1968 1.1 dyoung DEBUGOUT("SFP+ module not supported\n"); 1969 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED; 1970 1.1 dyoung } else { 1971 1.1 dyoung break; 1972 1.1 dyoung } 1973 1.1 dyoung } else { 1974 1.1 dyoung (*list_offset) += 2; 1975 1.1 dyoung if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id)) 1976 1.6 msaitoh goto err_phy; 1977 1.1 dyoung } 1978 1.1 dyoung } 1979 1.1 dyoung 1980 1.1 dyoung if (sfp_id == IXGBE_PHY_INIT_END_NL) { 1981 1.1 dyoung DEBUGOUT("No matching SFP+ module found\n"); 1982 1.1 dyoung return IXGBE_ERR_SFP_NOT_SUPPORTED; 1983 1.1 dyoung } 1984 1.1 dyoung 1985 1.1 dyoung return IXGBE_SUCCESS; 1986 1.6 msaitoh 1987 1.6 msaitoh err_phy: 1988 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 1989 1.6 msaitoh "eeprom read at offset %d failed", *list_offset); 1990 1.6 msaitoh return IXGBE_ERR_PHY; 1991 1.1 dyoung } 1992 1.1 dyoung 1993 1.1 dyoung /** 1994 1.27 msaitoh * ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface 1995 1.27 msaitoh * @hw: pointer to hardware structure 1996 1.27 msaitoh * @byte_offset: EEPROM byte offset to read 1997 1.27 msaitoh * @eeprom_data: value read 1998 1.1 dyoung * 1999 1.27 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface. 2000 1.1 dyoung **/ 2001 1.1 dyoung s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2002 1.3 msaitoh u8 *eeprom_data) 2003 1.1 dyoung { 2004 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_eeprom_generic"); 2005 1.1 dyoung 2006 1.1 dyoung return hw->phy.ops.read_i2c_byte(hw, byte_offset, 2007 1.3 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR, 2008 1.3 msaitoh eeprom_data); 2009 1.1 dyoung } 2010 1.1 dyoung 2011 1.1 dyoung /** 2012 1.27 msaitoh * ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface 2013 1.27 msaitoh * @hw: pointer to hardware structure 2014 1.27 msaitoh * @byte_offset: byte offset at address 0xA2 2015 1.27 msaitoh * @sff8472_data: value read 2016 1.5 msaitoh * 2017 1.27 msaitoh * Performs byte read operation to SFP module's SFF-8472 data over I2C 2018 1.5 msaitoh **/ 2019 1.5 msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset, 2020 1.5 msaitoh u8 *sff8472_data) 2021 1.5 msaitoh { 2022 1.5 msaitoh return hw->phy.ops.read_i2c_byte(hw, byte_offset, 2023 1.5 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR2, 2024 1.5 msaitoh sff8472_data); 2025 1.5 msaitoh } 2026 1.5 msaitoh 2027 1.5 msaitoh /** 2028 1.27 msaitoh * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface 2029 1.27 msaitoh * @hw: pointer to hardware structure 2030 1.27 msaitoh * @byte_offset: EEPROM byte offset to write 2031 1.27 msaitoh * @eeprom_data: value to write 2032 1.1 dyoung * 2033 1.27 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface. 2034 1.1 dyoung **/ 2035 1.1 dyoung s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2036 1.3 msaitoh u8 eeprom_data) 2037 1.1 dyoung { 2038 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_eeprom_generic"); 2039 1.1 dyoung 2040 1.1 dyoung return hw->phy.ops.write_i2c_byte(hw, byte_offset, 2041 1.3 msaitoh IXGBE_I2C_EEPROM_DEV_ADDR, 2042 1.3 msaitoh eeprom_data); 2043 1.1 dyoung } 2044 1.1 dyoung 2045 1.1 dyoung /** 2046 1.7 msaitoh * ixgbe_is_sfp_probe - Returns TRUE if SFP is being detected 2047 1.7 msaitoh * @hw: pointer to hardware structure 2048 1.7 msaitoh * @offset: eeprom offset to be read 2049 1.7 msaitoh * @addr: I2C address to be read 2050 1.7 msaitoh */ 2051 1.7 msaitoh static bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, u8 offset, u8 addr) 2052 1.7 msaitoh { 2053 1.7 msaitoh if (addr == IXGBE_I2C_EEPROM_DEV_ADDR && 2054 1.7 msaitoh offset == IXGBE_SFF_IDENTIFIER && 2055 1.7 msaitoh hw->phy.sfp_type == ixgbe_sfp_type_not_present) 2056 1.7 msaitoh return TRUE; 2057 1.7 msaitoh return FALSE; 2058 1.7 msaitoh } 2059 1.7 msaitoh 2060 1.7 msaitoh /** 2061 1.27 msaitoh * ixgbe_read_i2c_byte_generic_int - Reads 8 bit word over I2C 2062 1.27 msaitoh * @hw: pointer to hardware structure 2063 1.27 msaitoh * @byte_offset: byte offset to read 2064 1.27 msaitoh * @dev_addr: address to read from 2065 1.27 msaitoh * @data: value read 2066 1.27 msaitoh * @lock: TRUE if to take and release semaphore 2067 1.1 dyoung * 2068 1.27 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at 2069 1.27 msaitoh * a specified device address. 2070 1.1 dyoung **/ 2071 1.8 msaitoh static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset, 2072 1.8 msaitoh u8 dev_addr, u8 *data, bool lock) 2073 1.1 dyoung { 2074 1.7 msaitoh s32 status; 2075 1.1 dyoung u32 max_retry = 10; 2076 1.1 dyoung u32 retry = 0; 2077 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask; 2078 1.1 dyoung bool nack = 1; 2079 1.3 msaitoh *data = 0; 2080 1.1 dyoung 2081 1.1 dyoung DEBUGFUNC("ixgbe_read_i2c_byte_generic"); 2082 1.1 dyoung 2083 1.8 msaitoh if (hw->mac.type >= ixgbe_mac_X550) 2084 1.8 msaitoh max_retry = 3; 2085 1.7 msaitoh if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr)) 2086 1.7 msaitoh max_retry = IXGBE_SFP_DETECT_RETRIES; 2087 1.1 dyoung 2088 1.1 dyoung do { 2089 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask)) 2090 1.7 msaitoh return IXGBE_ERR_SWFW_SYNC; 2091 1.1 dyoung 2092 1.1 dyoung ixgbe_i2c_start(hw); 2093 1.1 dyoung 2094 1.1 dyoung /* Device Address and write indication */ 2095 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr); 2096 1.1 dyoung if (status != IXGBE_SUCCESS) 2097 1.1 dyoung goto fail; 2098 1.1 dyoung 2099 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2100 1.1 dyoung if (status != IXGBE_SUCCESS) 2101 1.1 dyoung goto fail; 2102 1.1 dyoung 2103 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset); 2104 1.1 dyoung if (status != IXGBE_SUCCESS) 2105 1.1 dyoung goto fail; 2106 1.1 dyoung 2107 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2108 1.1 dyoung if (status != IXGBE_SUCCESS) 2109 1.1 dyoung goto fail; 2110 1.1 dyoung 2111 1.1 dyoung ixgbe_i2c_start(hw); 2112 1.1 dyoung 2113 1.1 dyoung /* Device Address and read indication */ 2114 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1)); 2115 1.1 dyoung if (status != IXGBE_SUCCESS) 2116 1.1 dyoung goto fail; 2117 1.1 dyoung 2118 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2119 1.1 dyoung if (status != IXGBE_SUCCESS) 2120 1.1 dyoung goto fail; 2121 1.1 dyoung 2122 1.25 msaitoh ixgbe_clock_in_i2c_byte(hw, data); 2123 1.1 dyoung 2124 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, nack); 2125 1.1 dyoung if (status != IXGBE_SUCCESS) 2126 1.1 dyoung goto fail; 2127 1.1 dyoung 2128 1.1 dyoung ixgbe_i2c_stop(hw); 2129 1.8 msaitoh if (lock) 2130 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 2131 1.7 msaitoh return IXGBE_SUCCESS; 2132 1.1 dyoung 2133 1.1 dyoung fail: 2134 1.5 msaitoh ixgbe_i2c_bus_clear(hw); 2135 1.8 msaitoh if (lock) { 2136 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 2137 1.8 msaitoh msec_delay(100); 2138 1.8 msaitoh } 2139 1.1 dyoung if (retry < max_retry) 2140 1.1 dyoung DEBUGOUT("I2C byte read error - Retrying.\n"); 2141 1.1 dyoung else 2142 1.1 dyoung DEBUGOUT("I2C byte read error.\n"); 2143 1.26 msaitoh retry++; 2144 1.1 dyoung 2145 1.26 msaitoh } while (retry <= max_retry); 2146 1.1 dyoung 2147 1.1 dyoung return status; 2148 1.1 dyoung } 2149 1.1 dyoung 2150 1.1 dyoung /** 2151 1.27 msaitoh * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C 2152 1.27 msaitoh * @hw: pointer to hardware structure 2153 1.27 msaitoh * @byte_offset: byte offset to read 2154 1.27 msaitoh * @dev_addr: address to read from 2155 1.27 msaitoh * @data: value read 2156 1.8 msaitoh * 2157 1.27 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at 2158 1.27 msaitoh * a specified device address. 2159 1.8 msaitoh **/ 2160 1.8 msaitoh s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2161 1.8 msaitoh u8 dev_addr, u8 *data) 2162 1.8 msaitoh { 2163 1.8 msaitoh return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr, 2164 1.8 msaitoh data, TRUE); 2165 1.8 msaitoh } 2166 1.8 msaitoh 2167 1.8 msaitoh /** 2168 1.27 msaitoh * ixgbe_read_i2c_byte_generic_unlocked - Reads 8 bit word over I2C 2169 1.27 msaitoh * @hw: pointer to hardware structure 2170 1.27 msaitoh * @byte_offset: byte offset to read 2171 1.27 msaitoh * @dev_addr: address to read from 2172 1.27 msaitoh * @data: value read 2173 1.8 msaitoh * 2174 1.27 msaitoh * Performs byte read operation to SFP module's EEPROM over I2C interface at 2175 1.27 msaitoh * a specified device address. 2176 1.8 msaitoh **/ 2177 1.8 msaitoh s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2178 1.8 msaitoh u8 dev_addr, u8 *data) 2179 1.8 msaitoh { 2180 1.8 msaitoh return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr, 2181 1.8 msaitoh data, FALSE); 2182 1.8 msaitoh } 2183 1.8 msaitoh 2184 1.8 msaitoh /** 2185 1.27 msaitoh * ixgbe_write_i2c_byte_generic_int - Writes 8 bit word over I2C 2186 1.27 msaitoh * @hw: pointer to hardware structure 2187 1.27 msaitoh * @byte_offset: byte offset to write 2188 1.27 msaitoh * @dev_addr: address to write to 2189 1.27 msaitoh * @data: value to write 2190 1.27 msaitoh * @lock: TRUE if to take and release semaphore 2191 1.1 dyoung * 2192 1.27 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at 2193 1.27 msaitoh * a specified device address. 2194 1.1 dyoung **/ 2195 1.8 msaitoh static s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset, 2196 1.8 msaitoh u8 dev_addr, u8 data, bool lock) 2197 1.1 dyoung { 2198 1.8 msaitoh s32 status; 2199 1.2 christos u32 max_retry = 2; 2200 1.1 dyoung u32 retry = 0; 2201 1.7 msaitoh u32 swfw_mask = hw->phy.phy_semaphore_mask; 2202 1.1 dyoung 2203 1.1 dyoung DEBUGFUNC("ixgbe_write_i2c_byte_generic"); 2204 1.1 dyoung 2205 1.8 msaitoh if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != 2206 1.8 msaitoh IXGBE_SUCCESS) 2207 1.8 msaitoh return IXGBE_ERR_SWFW_SYNC; 2208 1.1 dyoung 2209 1.1 dyoung do { 2210 1.1 dyoung ixgbe_i2c_start(hw); 2211 1.1 dyoung 2212 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, dev_addr); 2213 1.1 dyoung if (status != IXGBE_SUCCESS) 2214 1.1 dyoung goto fail; 2215 1.1 dyoung 2216 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2217 1.1 dyoung if (status != IXGBE_SUCCESS) 2218 1.1 dyoung goto fail; 2219 1.1 dyoung 2220 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, byte_offset); 2221 1.1 dyoung if (status != IXGBE_SUCCESS) 2222 1.1 dyoung goto fail; 2223 1.1 dyoung 2224 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2225 1.1 dyoung if (status != IXGBE_SUCCESS) 2226 1.1 dyoung goto fail; 2227 1.1 dyoung 2228 1.1 dyoung status = ixgbe_clock_out_i2c_byte(hw, data); 2229 1.1 dyoung if (status != IXGBE_SUCCESS) 2230 1.1 dyoung goto fail; 2231 1.1 dyoung 2232 1.1 dyoung status = ixgbe_get_i2c_ack(hw); 2233 1.1 dyoung if (status != IXGBE_SUCCESS) 2234 1.1 dyoung goto fail; 2235 1.1 dyoung 2236 1.1 dyoung ixgbe_i2c_stop(hw); 2237 1.8 msaitoh if (lock) 2238 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 2239 1.7 msaitoh return IXGBE_SUCCESS; 2240 1.1 dyoung 2241 1.1 dyoung fail: 2242 1.1 dyoung ixgbe_i2c_bus_clear(hw); 2243 1.1 dyoung if (retry < max_retry) 2244 1.1 dyoung DEBUGOUT("I2C byte write error - Retrying.\n"); 2245 1.1 dyoung else 2246 1.1 dyoung DEBUGOUT("I2C byte write error.\n"); 2247 1.26 msaitoh retry++; 2248 1.26 msaitoh } while (retry <= max_retry); 2249 1.1 dyoung 2250 1.8 msaitoh if (lock) 2251 1.8 msaitoh hw->mac.ops.release_swfw_sync(hw, swfw_mask); 2252 1.1 dyoung 2253 1.1 dyoung return status; 2254 1.1 dyoung } 2255 1.1 dyoung 2256 1.1 dyoung /** 2257 1.27 msaitoh * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C 2258 1.27 msaitoh * @hw: pointer to hardware structure 2259 1.27 msaitoh * @byte_offset: byte offset to write 2260 1.27 msaitoh * @dev_addr: address to write to 2261 1.27 msaitoh * @data: value to write 2262 1.8 msaitoh * 2263 1.27 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at 2264 1.27 msaitoh * a specified device address. 2265 1.8 msaitoh **/ 2266 1.8 msaitoh s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2267 1.8 msaitoh u8 dev_addr, u8 data) 2268 1.8 msaitoh { 2269 1.8 msaitoh return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr, 2270 1.8 msaitoh data, TRUE); 2271 1.8 msaitoh } 2272 1.8 msaitoh 2273 1.8 msaitoh /** 2274 1.27 msaitoh * ixgbe_write_i2c_byte_generic_unlocked - Writes 8 bit word over I2C 2275 1.27 msaitoh * @hw: pointer to hardware structure 2276 1.27 msaitoh * @byte_offset: byte offset to write 2277 1.27 msaitoh * @dev_addr: address to write to 2278 1.27 msaitoh * @data: value to write 2279 1.8 msaitoh * 2280 1.27 msaitoh * Performs byte write operation to SFP module's EEPROM over I2C interface at 2281 1.27 msaitoh * a specified device address. 2282 1.8 msaitoh **/ 2283 1.8 msaitoh s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2284 1.8 msaitoh u8 dev_addr, u8 data) 2285 1.8 msaitoh { 2286 1.8 msaitoh return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr, 2287 1.8 msaitoh data, FALSE); 2288 1.8 msaitoh } 2289 1.8 msaitoh 2290 1.8 msaitoh /** 2291 1.27 msaitoh * ixgbe_i2c_start - Sets I2C start condition 2292 1.27 msaitoh * @hw: pointer to hardware structure 2293 1.1 dyoung * 2294 1.27 msaitoh * Sets I2C start condition (High -> Low on SDA while SCL is High) 2295 1.27 msaitoh * Set bit-bang mode on X550 hardware. 2296 1.1 dyoung **/ 2297 1.1 dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw) 2298 1.1 dyoung { 2299 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2300 1.1 dyoung 2301 1.1 dyoung DEBUGFUNC("ixgbe_i2c_start"); 2302 1.1 dyoung 2303 1.7 msaitoh i2cctl |= IXGBE_I2C_BB_EN_BY_MAC(hw); 2304 1.7 msaitoh 2305 1.1 dyoung /* Start condition must begin with data and clock high */ 2306 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1); 2307 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl); 2308 1.1 dyoung 2309 1.1 dyoung /* Setup time for start condition (4.7us) */ 2310 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STA); 2311 1.1 dyoung 2312 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0); 2313 1.1 dyoung 2314 1.1 dyoung /* Hold time for start condition (4us) */ 2315 1.1 dyoung usec_delay(IXGBE_I2C_T_HD_STA); 2316 1.1 dyoung 2317 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl); 2318 1.1 dyoung 2319 1.1 dyoung /* Minimum low period of clock is 4.7 us */ 2320 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW); 2321 1.1 dyoung 2322 1.1 dyoung } 2323 1.1 dyoung 2324 1.1 dyoung /** 2325 1.27 msaitoh * ixgbe_i2c_stop - Sets I2C stop condition 2326 1.27 msaitoh * @hw: pointer to hardware structure 2327 1.1 dyoung * 2328 1.27 msaitoh * Sets I2C stop condition (Low -> High on SDA while SCL is High) 2329 1.27 msaitoh * Disables bit-bang mode and negates data output enable on X550 2330 1.27 msaitoh * hardware. 2331 1.1 dyoung **/ 2332 1.1 dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw) 2333 1.1 dyoung { 2334 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2335 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2336 1.7 msaitoh u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw); 2337 1.7 msaitoh u32 bb_en_bit = IXGBE_I2C_BB_EN_BY_MAC(hw); 2338 1.1 dyoung 2339 1.1 dyoung DEBUGFUNC("ixgbe_i2c_stop"); 2340 1.1 dyoung 2341 1.1 dyoung /* Stop condition must begin with data low and clock high */ 2342 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 0); 2343 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl); 2344 1.1 dyoung 2345 1.1 dyoung /* Setup time for stop condition (4us) */ 2346 1.1 dyoung usec_delay(IXGBE_I2C_T_SU_STO); 2347 1.1 dyoung 2348 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1); 2349 1.1 dyoung 2350 1.1 dyoung /* bus free time between stop and start (4.7us)*/ 2351 1.1 dyoung usec_delay(IXGBE_I2C_T_BUF); 2352 1.7 msaitoh 2353 1.7 msaitoh if (bb_en_bit || data_oe_bit || clk_oe_bit) { 2354 1.7 msaitoh i2cctl &= ~bb_en_bit; 2355 1.7 msaitoh i2cctl |= data_oe_bit | clk_oe_bit; 2356 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl); 2357 1.7 msaitoh IXGBE_WRITE_FLUSH(hw); 2358 1.7 msaitoh } 2359 1.1 dyoung } 2360 1.1 dyoung 2361 1.1 dyoung /** 2362 1.27 msaitoh * ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C 2363 1.27 msaitoh * @hw: pointer to hardware structure 2364 1.27 msaitoh * @data: data byte to clock in 2365 1.1 dyoung * 2366 1.27 msaitoh * Clocks in one byte data via I2C data/clock 2367 1.1 dyoung **/ 2368 1.25 msaitoh static void ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data) 2369 1.1 dyoung { 2370 1.1 dyoung s32 i; 2371 1.1 dyoung bool bit = 0; 2372 1.1 dyoung 2373 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_byte"); 2374 1.1 dyoung 2375 1.7 msaitoh *data = 0; 2376 1.1 dyoung for (i = 7; i >= 0; i--) { 2377 1.3 msaitoh ixgbe_clock_in_i2c_bit(hw, &bit); 2378 1.1 dyoung *data |= bit << i; 2379 1.1 dyoung } 2380 1.1 dyoung } 2381 1.1 dyoung 2382 1.1 dyoung /** 2383 1.27 msaitoh * ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C 2384 1.27 msaitoh * @hw: pointer to hardware structure 2385 1.27 msaitoh * @data: data byte clocked out 2386 1.1 dyoung * 2387 1.27 msaitoh * Clocks out one byte data via I2C data/clock 2388 1.1 dyoung **/ 2389 1.1 dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data) 2390 1.1 dyoung { 2391 1.1 dyoung s32 status = IXGBE_SUCCESS; 2392 1.1 dyoung s32 i; 2393 1.1 dyoung u32 i2cctl; 2394 1.7 msaitoh bool bit; 2395 1.1 dyoung 2396 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_byte"); 2397 1.1 dyoung 2398 1.1 dyoung for (i = 7; i >= 0; i--) { 2399 1.1 dyoung bit = (data >> i) & 0x1; 2400 1.1 dyoung status = ixgbe_clock_out_i2c_bit(hw, bit); 2401 1.1 dyoung 2402 1.1 dyoung if (status != IXGBE_SUCCESS) 2403 1.1 dyoung break; 2404 1.1 dyoung } 2405 1.1 dyoung 2406 1.1 dyoung /* Release SDA line (set high) */ 2407 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2408 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw); 2409 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2410 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl); 2411 1.3 msaitoh IXGBE_WRITE_FLUSH(hw); 2412 1.1 dyoung 2413 1.1 dyoung return status; 2414 1.1 dyoung } 2415 1.1 dyoung 2416 1.1 dyoung /** 2417 1.27 msaitoh * ixgbe_get_i2c_ack - Polls for I2C ACK 2418 1.27 msaitoh * @hw: pointer to hardware structure 2419 1.1 dyoung * 2420 1.27 msaitoh * Clocks in/out one bit via I2C data/clock 2421 1.1 dyoung **/ 2422 1.1 dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw) 2423 1.1 dyoung { 2424 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2425 1.3 msaitoh s32 status = IXGBE_SUCCESS; 2426 1.1 dyoung u32 i = 0; 2427 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2428 1.1 dyoung u32 timeout = 10; 2429 1.1 dyoung bool ack = 1; 2430 1.1 dyoung 2431 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_ack"); 2432 1.1 dyoung 2433 1.7 msaitoh if (data_oe_bit) { 2434 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw); 2435 1.7 msaitoh i2cctl |= data_oe_bit; 2436 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl); 2437 1.7 msaitoh IXGBE_WRITE_FLUSH(hw); 2438 1.7 msaitoh } 2439 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl); 2440 1.1 dyoung 2441 1.1 dyoung /* Minimum high period of clock is 4us */ 2442 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH); 2443 1.1 dyoung 2444 1.1 dyoung /* Poll for ACK. Note that ACK in I2C spec is 2445 1.1 dyoung * transition from 1 to 0 */ 2446 1.1 dyoung for (i = 0; i < timeout; i++) { 2447 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2448 1.7 msaitoh ack = ixgbe_get_i2c_data(hw, &i2cctl); 2449 1.1 dyoung 2450 1.1 dyoung usec_delay(1); 2451 1.7 msaitoh if (!ack) 2452 1.1 dyoung break; 2453 1.1 dyoung } 2454 1.1 dyoung 2455 1.7 msaitoh if (ack) { 2456 1.7 msaitoh DEBUGOUT("I2C ack was not received.\n"); 2457 1.1 dyoung status = IXGBE_ERR_I2C; 2458 1.1 dyoung } 2459 1.1 dyoung 2460 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl); 2461 1.1 dyoung 2462 1.1 dyoung /* Minimum low period of clock is 4.7 us */ 2463 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW); 2464 1.1 dyoung 2465 1.1 dyoung return status; 2466 1.1 dyoung } 2467 1.1 dyoung 2468 1.1 dyoung /** 2469 1.27 msaitoh * ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock 2470 1.27 msaitoh * @hw: pointer to hardware structure 2471 1.27 msaitoh * @data: read data value 2472 1.1 dyoung * 2473 1.27 msaitoh * Clocks in one bit via I2C data/clock 2474 1.1 dyoung **/ 2475 1.25 msaitoh static void ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data) 2476 1.1 dyoung { 2477 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2478 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2479 1.1 dyoung 2480 1.1 dyoung DEBUGFUNC("ixgbe_clock_in_i2c_bit"); 2481 1.1 dyoung 2482 1.7 msaitoh if (data_oe_bit) { 2483 1.7 msaitoh i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw); 2484 1.7 msaitoh i2cctl |= data_oe_bit; 2485 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl); 2486 1.7 msaitoh IXGBE_WRITE_FLUSH(hw); 2487 1.7 msaitoh } 2488 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl); 2489 1.1 dyoung 2490 1.1 dyoung /* Minimum high period of clock is 4us */ 2491 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH); 2492 1.1 dyoung 2493 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2494 1.7 msaitoh *data = ixgbe_get_i2c_data(hw, &i2cctl); 2495 1.1 dyoung 2496 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl); 2497 1.1 dyoung 2498 1.1 dyoung /* Minimum low period of clock is 4.7 us */ 2499 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW); 2500 1.1 dyoung } 2501 1.1 dyoung 2502 1.1 dyoung /** 2503 1.27 msaitoh * ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock 2504 1.27 msaitoh * @hw: pointer to hardware structure 2505 1.27 msaitoh * @data: data value to write 2506 1.1 dyoung * 2507 1.27 msaitoh * Clocks out one bit via I2C data/clock 2508 1.1 dyoung **/ 2509 1.1 dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data) 2510 1.1 dyoung { 2511 1.1 dyoung s32 status; 2512 1.7 msaitoh u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2513 1.1 dyoung 2514 1.1 dyoung DEBUGFUNC("ixgbe_clock_out_i2c_bit"); 2515 1.1 dyoung 2516 1.1 dyoung status = ixgbe_set_i2c_data(hw, &i2cctl, data); 2517 1.1 dyoung if (status == IXGBE_SUCCESS) { 2518 1.3 msaitoh ixgbe_raise_i2c_clk(hw, &i2cctl); 2519 1.1 dyoung 2520 1.1 dyoung /* Minimum high period of clock is 4us */ 2521 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH); 2522 1.1 dyoung 2523 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl); 2524 1.1 dyoung 2525 1.1 dyoung /* Minimum low period of clock is 4.7 us. 2526 1.1 dyoung * This also takes care of the data hold time. 2527 1.1 dyoung */ 2528 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW); 2529 1.1 dyoung } else { 2530 1.1 dyoung status = IXGBE_ERR_I2C; 2531 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 2532 1.6 msaitoh "I2C data was not set to %X\n", data); 2533 1.1 dyoung } 2534 1.1 dyoung 2535 1.1 dyoung return status; 2536 1.1 dyoung } 2537 1.7 msaitoh 2538 1.1 dyoung /** 2539 1.27 msaitoh * ixgbe_raise_i2c_clk - Raises the I2C SCL clock 2540 1.27 msaitoh * @hw: pointer to hardware structure 2541 1.27 msaitoh * @i2cctl: Current value of I2CCTL register 2542 1.1 dyoung * 2543 1.27 msaitoh * Raises the I2C clock line '0'->'1' 2544 1.27 msaitoh * Negates the I2C clock output enable on X550 hardware. 2545 1.1 dyoung **/ 2546 1.3 msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) 2547 1.1 dyoung { 2548 1.7 msaitoh u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw); 2549 1.4 msaitoh u32 i = 0; 2550 1.4 msaitoh u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT; 2551 1.4 msaitoh u32 i2cctl_r = 0; 2552 1.4 msaitoh 2553 1.1 dyoung DEBUGFUNC("ixgbe_raise_i2c_clk"); 2554 1.1 dyoung 2555 1.7 msaitoh if (clk_oe_bit) { 2556 1.7 msaitoh *i2cctl |= clk_oe_bit; 2557 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2558 1.7 msaitoh } 2559 1.7 msaitoh 2560 1.4 msaitoh for (i = 0; i < timeout; i++) { 2561 1.7 msaitoh *i2cctl |= IXGBE_I2C_CLK_OUT_BY_MAC(hw); 2562 1.1 dyoung 2563 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2564 1.4 msaitoh IXGBE_WRITE_FLUSH(hw); 2565 1.4 msaitoh /* SCL rise time (1000ns) */ 2566 1.4 msaitoh usec_delay(IXGBE_I2C_T_RISE); 2567 1.1 dyoung 2568 1.7 msaitoh i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2569 1.7 msaitoh if (i2cctl_r & IXGBE_I2C_CLK_IN_BY_MAC(hw)) 2570 1.4 msaitoh break; 2571 1.4 msaitoh } 2572 1.1 dyoung } 2573 1.1 dyoung 2574 1.1 dyoung /** 2575 1.27 msaitoh * ixgbe_lower_i2c_clk - Lowers the I2C SCL clock 2576 1.27 msaitoh * @hw: pointer to hardware structure 2577 1.27 msaitoh * @i2cctl: Current value of I2CCTL register 2578 1.1 dyoung * 2579 1.27 msaitoh * Lowers the I2C clock line '1'->'0' 2580 1.27 msaitoh * Asserts the I2C clock output enable on X550 hardware. 2581 1.1 dyoung **/ 2582 1.1 dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) 2583 1.1 dyoung { 2584 1.1 dyoung DEBUGFUNC("ixgbe_lower_i2c_clk"); 2585 1.1 dyoung 2586 1.7 msaitoh *i2cctl &= ~(IXGBE_I2C_CLK_OUT_BY_MAC(hw)); 2587 1.7 msaitoh *i2cctl &= ~IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw); 2588 1.1 dyoung 2589 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2590 1.3 msaitoh IXGBE_WRITE_FLUSH(hw); 2591 1.1 dyoung 2592 1.1 dyoung /* SCL fall time (300ns) */ 2593 1.1 dyoung usec_delay(IXGBE_I2C_T_FALL); 2594 1.1 dyoung } 2595 1.1 dyoung 2596 1.1 dyoung /** 2597 1.27 msaitoh * ixgbe_set_i2c_data - Sets the I2C data bit 2598 1.27 msaitoh * @hw: pointer to hardware structure 2599 1.27 msaitoh * @i2cctl: Current value of I2CCTL register 2600 1.27 msaitoh * @data: I2C data value (0 or 1) to set 2601 1.1 dyoung * 2602 1.27 msaitoh * Sets the I2C data bit 2603 1.27 msaitoh * Asserts the I2C data output enable on X550 hardware. 2604 1.1 dyoung **/ 2605 1.1 dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data) 2606 1.1 dyoung { 2607 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2608 1.1 dyoung s32 status = IXGBE_SUCCESS; 2609 1.1 dyoung 2610 1.1 dyoung DEBUGFUNC("ixgbe_set_i2c_data"); 2611 1.1 dyoung 2612 1.1 dyoung if (data) 2613 1.7 msaitoh *i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw); 2614 1.1 dyoung else 2615 1.7 msaitoh *i2cctl &= ~(IXGBE_I2C_DATA_OUT_BY_MAC(hw)); 2616 1.7 msaitoh *i2cctl &= ~data_oe_bit; 2617 1.1 dyoung 2618 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2619 1.3 msaitoh IXGBE_WRITE_FLUSH(hw); 2620 1.1 dyoung 2621 1.1 dyoung /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */ 2622 1.1 dyoung usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA); 2623 1.1 dyoung 2624 1.7 msaitoh if (!data) /* Can't verify data in this case */ 2625 1.7 msaitoh return IXGBE_SUCCESS; 2626 1.7 msaitoh if (data_oe_bit) { 2627 1.7 msaitoh *i2cctl |= data_oe_bit; 2628 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2629 1.7 msaitoh IXGBE_WRITE_FLUSH(hw); 2630 1.7 msaitoh } 2631 1.7 msaitoh 2632 1.1 dyoung /* Verify data was set correctly */ 2633 1.7 msaitoh *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2634 1.7 msaitoh if (data != ixgbe_get_i2c_data(hw, i2cctl)) { 2635 1.1 dyoung status = IXGBE_ERR_I2C; 2636 1.6 msaitoh ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 2637 1.6 msaitoh "Error - I2C data was not set to %X.\n", 2638 1.6 msaitoh data); 2639 1.1 dyoung } 2640 1.1 dyoung 2641 1.1 dyoung return status; 2642 1.1 dyoung } 2643 1.1 dyoung 2644 1.1 dyoung /** 2645 1.27 msaitoh * ixgbe_get_i2c_data - Reads the I2C SDA data bit 2646 1.27 msaitoh * @hw: pointer to hardware structure 2647 1.27 msaitoh * @i2cctl: Current value of I2CCTL register 2648 1.1 dyoung * 2649 1.27 msaitoh * Returns the I2C data bit value 2650 1.27 msaitoh * Negates the I2C data output enable on X550 hardware. 2651 1.1 dyoung **/ 2652 1.7 msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl) 2653 1.1 dyoung { 2654 1.7 msaitoh u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw); 2655 1.1 dyoung bool data; 2656 1.1 dyoung 2657 1.1 dyoung DEBUGFUNC("ixgbe_get_i2c_data"); 2658 1.1 dyoung 2659 1.7 msaitoh if (data_oe_bit) { 2660 1.7 msaitoh *i2cctl |= data_oe_bit; 2661 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl); 2662 1.7 msaitoh IXGBE_WRITE_FLUSH(hw); 2663 1.7 msaitoh usec_delay(IXGBE_I2C_T_FALL); 2664 1.7 msaitoh } 2665 1.7 msaitoh 2666 1.7 msaitoh if (*i2cctl & IXGBE_I2C_DATA_IN_BY_MAC(hw)) 2667 1.1 dyoung data = 1; 2668 1.1 dyoung else 2669 1.1 dyoung data = 0; 2670 1.1 dyoung 2671 1.1 dyoung return data; 2672 1.1 dyoung } 2673 1.1 dyoung 2674 1.1 dyoung /** 2675 1.27 msaitoh * ixgbe_i2c_bus_clear - Clears the I2C bus 2676 1.27 msaitoh * @hw: pointer to hardware structure 2677 1.1 dyoung * 2678 1.27 msaitoh * Clears the I2C bus by sending nine clock pulses. 2679 1.27 msaitoh * Used when data line is stuck low. 2680 1.1 dyoung **/ 2681 1.1 dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw) 2682 1.1 dyoung { 2683 1.7 msaitoh u32 i2cctl; 2684 1.1 dyoung u32 i; 2685 1.1 dyoung 2686 1.1 dyoung DEBUGFUNC("ixgbe_i2c_bus_clear"); 2687 1.1 dyoung 2688 1.1 dyoung ixgbe_i2c_start(hw); 2689 1.7 msaitoh i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw)); 2690 1.1 dyoung 2691 1.1 dyoung ixgbe_set_i2c_data(hw, &i2cctl, 1); 2692 1.1 dyoung 2693 1.1 dyoung for (i = 0; i < 9; i++) { 2694 1.1 dyoung ixgbe_raise_i2c_clk(hw, &i2cctl); 2695 1.1 dyoung 2696 1.1 dyoung /* Min high period of clock is 4us */ 2697 1.1 dyoung usec_delay(IXGBE_I2C_T_HIGH); 2698 1.1 dyoung 2699 1.1 dyoung ixgbe_lower_i2c_clk(hw, &i2cctl); 2700 1.1 dyoung 2701 1.1 dyoung /* Min low period of clock is 4.7us*/ 2702 1.1 dyoung usec_delay(IXGBE_I2C_T_LOW); 2703 1.1 dyoung } 2704 1.1 dyoung 2705 1.1 dyoung ixgbe_i2c_start(hw); 2706 1.1 dyoung 2707 1.1 dyoung /* Put the i2c bus back to default state */ 2708 1.1 dyoung ixgbe_i2c_stop(hw); 2709 1.1 dyoung } 2710 1.1 dyoung 2711 1.1 dyoung /** 2712 1.27 msaitoh * ixgbe_tn_check_overtemp - Checks if an overtemp occurred. 2713 1.27 msaitoh * @hw: pointer to hardware structure 2714 1.1 dyoung * 2715 1.27 msaitoh * Checks if the LASI temp alarm status was triggered due to overtemp 2716 1.1 dyoung **/ 2717 1.1 dyoung s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw) 2718 1.1 dyoung { 2719 1.1 dyoung s32 status = IXGBE_SUCCESS; 2720 1.1 dyoung u16 phy_data = 0; 2721 1.1 dyoung 2722 1.1 dyoung DEBUGFUNC("ixgbe_tn_check_overtemp"); 2723 1.1 dyoung 2724 1.1 dyoung if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM) 2725 1.1 dyoung goto out; 2726 1.1 dyoung 2727 1.1 dyoung /* Check that the LASI temp alarm status was triggered */ 2728 1.1 dyoung hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG, 2729 1.1 dyoung IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data); 2730 1.1 dyoung 2731 1.1 dyoung if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM)) 2732 1.1 dyoung goto out; 2733 1.1 dyoung 2734 1.1 dyoung status = IXGBE_ERR_OVERTEMP; 2735 1.6 msaitoh ERROR_REPORT1(IXGBE_ERROR_CAUTION, "Device over temperature"); 2736 1.1 dyoung out: 2737 1.1 dyoung return status; 2738 1.1 dyoung } 2739 1.7 msaitoh 2740 1.7 msaitoh /** 2741 1.7 msaitoh * ixgbe_set_copper_phy_power - Control power for copper phy 2742 1.7 msaitoh * @hw: pointer to hardware structure 2743 1.7 msaitoh * @on: TRUE for on, FALSE for off 2744 1.7 msaitoh */ 2745 1.7 msaitoh s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on) 2746 1.7 msaitoh { 2747 1.7 msaitoh u32 status; 2748 1.7 msaitoh u16 reg; 2749 1.7 msaitoh 2750 1.10 msaitoh if (!on && ixgbe_mng_present(hw)) 2751 1.10 msaitoh return 0; 2752 1.10 msaitoh 2753 1.7 msaitoh status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL, 2754 1.7 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2755 1.7 msaitoh ®); 2756 1.7 msaitoh if (status) 2757 1.7 msaitoh return status; 2758 1.7 msaitoh 2759 1.7 msaitoh if (on) { 2760 1.7 msaitoh reg &= ~IXGBE_MDIO_PHY_SET_LOW_POWER_MODE; 2761 1.7 msaitoh } else { 2762 1.7 msaitoh if (ixgbe_check_reset_blocked(hw)) 2763 1.7 msaitoh return 0; 2764 1.7 msaitoh reg |= IXGBE_MDIO_PHY_SET_LOW_POWER_MODE; 2765 1.7 msaitoh } 2766 1.7 msaitoh 2767 1.7 msaitoh status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL, 2768 1.7 msaitoh IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2769 1.7 msaitoh reg); 2770 1.7 msaitoh return status; 2771 1.7 msaitoh } 2772