ixgbe_82598.c revision 1.4
1/* $OpenBSD: ixgbe_82598.c,v 1.4 2009/06/07 13:24:57 jsg Exp $ */ 2 3/****************************************************************************** 4 5 Copyright (c) 2001-2008, Intel Corporation 6 All rights reserved. 7 8 Redistribution and use in source and binary forms, with or without 9 modification, are permitted provided that the following conditions are met: 10 11 1. Redistributions of source code must retain the above copyright notice, 12 this list of conditions and the following disclaimer. 13 14 2. Redistributions in binary form must reproduce the above copyright 15 notice, this list of conditions and the following disclaimer in the 16 documentation and/or other materials provided with the distribution. 17 18 3. Neither the name of the Intel Corporation nor the names of its 19 contributors may be used to endorse or promote products derived from 20 this software without specific prior written permission. 21 22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 23 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 26 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 POSSIBILITY OF SUCH DAMAGE. 33 34******************************************************************************/ 35/*$FreeBSD: src/sys/dev/ixgbe/ixgbe_82598.c,v 1.4 2008/05/16 18:46:30 jfv Exp $*/ 36 37#include <dev/pci/ixgbe.h> 38#include <dev/pci/ixgbe_type.h> 39 40int32_t ixgbe_init_ops_82598(struct ixgbe_hw *hw); 41int32_t ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, 42 ixgbe_link_speed *speed, 43 int *autoneg); 44int32_t ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw, 45 ixgbe_link_speed *speed, 46 int *autoneg); 47enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw); 48int32_t ixgbe_setup_fc_82598(struct ixgbe_hw *hw, int32_t packetbuf_num); 49int32_t ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw); 50int32_t ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, 51 ixgbe_link_speed *speed, 52 int *link_up, int link_up_wait_to_complete); 53int32_t ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, 54 ixgbe_link_speed speed, 55 int autoneg, 56 int autoneg_wait_to_complete); 57int32_t ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw); 58int32_t ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, 59 ixgbe_link_speed speed, 60 int autoneg, 61 int autoneg_wait_to_complete); 62#ifndef NO_82598_A0_SUPPORT 63int32_t ixgbe_reset_hw_rev_0_82598(struct ixgbe_hw *hw); 64#endif 65int32_t ixgbe_reset_hw_82598(struct ixgbe_hw *hw); 66int32_t ixgbe_configure_fiber_serdes_fc_82598(struct ixgbe_hw *hw); 67int32_t ixgbe_setup_fiber_serdes_link_82598(struct ixgbe_hw *hw); 68int32_t ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq); 69int32_t ixgbe_blink_led_stop_82598(struct ixgbe_hw *hw, uint32_t index); 70int32_t ixgbe_blink_led_start_82598(struct ixgbe_hw *hw, uint32_t index); 71 72/** 73 * ixgbe_init_ops_82598 - Inits func ptrs and MAC type 74 * @hw: pointer to hardware structure 75 * 76 * Initialize the function pointers and assign the MAC type for 82598. 77 * Does not touch the hardware. 78 **/ 79int32_t ixgbe_init_ops_82598(struct ixgbe_hw *hw) 80{ 81 struct ixgbe_mac_info *mac = &hw->mac; 82 struct ixgbe_phy_info *phy = &hw->phy; 83 int32_t ret_val; 84 85 ret_val = ixgbe_init_phy_ops_generic(hw); 86 ret_val = ixgbe_init_ops_generic(hw); 87 88 /* MAC */ 89#ifndef NO_82598_A0_SUPPORT 90 if (hw->revision_id == 0) 91 mac->ops.reset_hw = &ixgbe_reset_hw_rev_0_82598; 92 else 93 mac->ops.reset_hw = &ixgbe_reset_hw_82598; 94#else 95 mac->ops.reset_hw = &ixgbe_reset_hw_82598; 96#endif 97 mac->ops.get_media_type = &ixgbe_get_media_type_82598; 98 99 /* LEDs */ 100 mac->ops.blink_led_start = &ixgbe_blink_led_start_82598; 101 mac->ops.blink_led_stop = &ixgbe_blink_led_stop_82598; 102 103 /* RAR, Multicast, VLAN */ 104 mac->ops.set_vmdq = &ixgbe_set_vmdq_82598; 105 106 /* Flow Control */ 107 mac->ops.setup_fc = &ixgbe_setup_fc_82598; 108 109 /* Call PHY identify routine to get the phy type */ 110 phy->ops.identify(hw); 111 112 /* PHY Init */ 113 switch (hw->phy.type) { 114 case ixgbe_phy_tn: 115 phy->ops.check_link = &ixgbe_check_phy_link_tnx; 116 phy->ops.get_firmware_version = 117 &ixgbe_get_phy_firmware_version_tnx; 118 break; 119 case ixgbe_phy_nl: 120 phy->ops.reset = &ixgbe_reset_phy_nl; 121 break; 122 default: 123 break; 124 } 125 126 /* Link */ 127 mac->ops.check_link = &ixgbe_check_mac_link_82598; 128 if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { 129 mac->ops.setup_link = &ixgbe_setup_copper_link_82598; 130 mac->ops.setup_link_speed = 131 &ixgbe_setup_copper_link_speed_82598; 132 mac->ops.get_link_capabilities = 133 &ixgbe_get_copper_link_capabilities_82598; 134 } else { 135 mac->ops.setup_link = &ixgbe_setup_mac_link_82598; 136 mac->ops.setup_link_speed = &ixgbe_setup_mac_link_speed_82598; 137 mac->ops.get_link_capabilities = 138 &ixgbe_get_link_capabilities_82598; 139 } 140 141 mac->mcft_size = 128; 142 mac->vft_size = 128; 143 mac->num_rar_entries = 16; 144 mac->max_tx_queues = 32; 145 mac->max_rx_queues = 64; 146 147 return IXGBE_SUCCESS; 148} 149 150/** 151 * ixgbe_get_link_capabilities_82598 - Determines link capabilities 152 * @hw: pointer to hardware structure 153 * @speed: pointer to link speed 154 * @autoneg: intean auto-negotiation value 155 * 156 * Determines the link capabilities by reading the AUTOC register. 157 **/ 158int32_t ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, 159 ixgbe_link_speed *speed, 160 int *autoneg) 161{ 162 int32_t status = IXGBE_SUCCESS; 163 int32_t autoc_reg; 164 165 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 166 167 if (hw->mac.link_settings_loaded) { 168 autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE; 169 autoc_reg &= ~IXGBE_AUTOC_LMS_MASK; 170 autoc_reg |= hw->mac.link_attach_type; 171 autoc_reg |= hw->mac.link_mode_select; 172 } 173 174 switch (autoc_reg & IXGBE_AUTOC_LMS_MASK) { 175 case IXGBE_AUTOC_LMS_1G_LINK_NO_AN: 176 *speed = IXGBE_LINK_SPEED_1GB_FULL; 177 *autoneg = FALSE; 178 break; 179 180 case IXGBE_AUTOC_LMS_10G_LINK_NO_AN: 181 *speed = IXGBE_LINK_SPEED_10GB_FULL; 182 *autoneg = FALSE; 183 break; 184 185 case IXGBE_AUTOC_LMS_1G_AN: 186 *speed = IXGBE_LINK_SPEED_1GB_FULL; 187 *autoneg = TRUE; 188 break; 189 190 case IXGBE_AUTOC_LMS_KX4_AN: 191 case IXGBE_AUTOC_LMS_KX4_AN_1G_AN: 192 *speed = IXGBE_LINK_SPEED_UNKNOWN; 193 if (autoc_reg & IXGBE_AUTOC_KX4_SUPP) 194 *speed |= IXGBE_LINK_SPEED_10GB_FULL; 195 if (autoc_reg & IXGBE_AUTOC_KX_SUPP) 196 *speed |= IXGBE_LINK_SPEED_1GB_FULL; 197 *autoneg = TRUE; 198 break; 199 200 default: 201 status = IXGBE_ERR_LINK_SETUP; 202 break; 203 } 204 205 return status; 206} 207 208/** 209 * ixgbe_get_copper_link_capabilities_82598 - Determines link capabilities 210 * @hw: pointer to hardware structure 211 * @speed: pointer to link speed 212 * @autoneg: intean auto-negotiation value 213 * 214 * Determines the link capabilities by reading the AUTOC register. 215 **/ 216int32_t ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw, 217 ixgbe_link_speed *speed, 218 int *autoneg) 219{ 220 int32_t status = IXGBE_ERR_LINK_SETUP; 221 uint16_t speed_ability; 222 223 *speed = 0; 224 *autoneg = TRUE; 225 226 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY, 227 IXGBE_MDIO_PMA_PMD_DEV_TYPE, 228 &speed_ability); 229 230 if (status == IXGBE_SUCCESS) { 231 if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G) 232 *speed |= IXGBE_LINK_SPEED_10GB_FULL; 233 if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G) 234 *speed |= IXGBE_LINK_SPEED_1GB_FULL; 235 } 236 237 return status; 238} 239 240/** 241 * ixgbe_get_media_type_82598 - Determines media type 242 * @hw: pointer to hardware structure 243 * 244 * Returns the media type (fiber, copper, backplane) 245 **/ 246enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) 247{ 248 enum ixgbe_media_type media_type; 249 250 /* Media type for I82598 is based on device ID */ 251 switch (hw->device_id) { 252 case IXGBE_DEV_ID_82598AF_DUAL_PORT: 253 case IXGBE_DEV_ID_82598AF_SINGLE_PORT: 254 case IXGBE_DEV_ID_82598EB_CX4: 255 case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: 256 case IXGBE_DEV_ID_82598_DA_DUAL_PORT: 257 case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: 258 case IXGBE_DEV_ID_82598EB_XF_LR: 259 media_type = ixgbe_media_type_fiber; 260 break; 261 case IXGBE_DEV_ID_82598AT: 262 media_type = ixgbe_media_type_copper; 263 break; 264 case IXGBE_DEV_ID_82598AT_DUAL_PORT: 265 media_type = ixgbe_media_type_copper; 266 break; 267 default: 268 media_type = ixgbe_media_type_unknown; 269 break; 270 } 271 272 return media_type; 273} 274 275/** 276 * ixgbe_setup_fc_82598 - Configure flow control settings 277 * @hw: pointer to hardware structure 278 * @packetbuf_num: packet buffer number (0-7) 279 * 280 * Configures the flow control settings based on SW configuration. This 281 * function is used for 802.3x flow control configuration only. 282 **/ 283int32_t ixgbe_setup_fc_82598(struct ixgbe_hw *hw, int32_t packetbuf_num) 284{ 285 uint32_t frctl_reg; 286 uint32_t rmcs_reg; 287 288 if (packetbuf_num < 0 || packetbuf_num > 7) { 289 DEBUGOUT1("Invalid packet buffer number [%d], expected range is" 290 " 0-7\n", packetbuf_num); 291 panic("ixgbe"); 292 } 293 294 frctl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL); 295 frctl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE); 296 297 rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS); 298 rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X); 299 300 /* 301 * 10 gig parts do not have a word in the EEPROM to determine the 302 * default flow control setting, so we explicitly set it to full. 303 */ 304 if (hw->fc.type == ixgbe_fc_default) 305 hw->fc.type = ixgbe_fc_full; 306 307 /* 308 * We want to save off the original Flow Control configuration just in 309 * case we get disconnected and then reconnected into a different hub 310 * or switch with different Flow Control capabilities. 311 */ 312 hw->fc.original_type = hw->fc.type; 313 314 /* 315 * The possible values of the "flow_control" parameter are: 316 * 0: Flow control is completely disabled 317 * 1: Rx flow control is enabled (we can receive pause frames but not 318 * send pause frames). 319 * 2: Tx flow control is enabled (we can send pause frames but we do not 320 * support receiving pause frames) 321 * 3: Both Rx and Tx flow control (symmetric) are enabled. 322 * other: Invalid. 323 */ 324 switch (hw->fc.type) { 325 case ixgbe_fc_none: 326 break; 327 case ixgbe_fc_rx_pause: 328 /* 329 * Rx Flow control is enabled, 330 * and Tx Flow control is disabled. 331 */ 332 frctl_reg |= IXGBE_FCTRL_RFCE; 333 break; 334 case ixgbe_fc_tx_pause: 335 /* 336 * Tx Flow control is enabled, and Rx Flow control is disabled, 337 * by a software over-ride. 338 */ 339 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; 340 break; 341 case ixgbe_fc_full: 342 /* 343 * Flow control (both Rx and Tx) is enabled by a software 344 * over-ride. 345 */ 346 frctl_reg |= IXGBE_FCTRL_RFCE; 347 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X; 348 break; 349 default: 350 /* We should never get here. The value should be 0-3. */ 351 DEBUGOUT("Flow control param set incorrectly\n"); 352 panic("ixgbe"); 353 break; 354 } 355 356 /* Enable 802.3x based flow control settings. */ 357 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, frctl_reg); 358 IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg); 359 360 /* 361 * Check for invalid software configuration, zeros are completely 362 * invalid for all parameters used past this point, and if we enable 363 * flow control with zero water marks, we blast flow control packets. 364 */ 365 if (!hw->fc.low_water || !hw->fc.high_water || !hw->fc.pause_time) { 366 DEBUGOUT("Flow control structure initialized incorrectly\n"); 367 return IXGBE_ERR_INVALID_LINK_SETTINGS; 368 } 369 370 /* 371 * We need to set up the Receive Threshold high and low water 372 * marks as well as (optionally) enabling the transmission of 373 * XON frames. 374 */ 375 if (hw->fc.type & ixgbe_fc_tx_pause) { 376 if (hw->fc.send_xon) { 377 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), 378 (hw->fc.low_water | IXGBE_FCRTL_XONE)); 379 } else { 380 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), 381 hw->fc.low_water); 382 } 383 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(packetbuf_num), 384 (hw->fc.high_water)|IXGBE_FCRTH_FCEN); 385 } 386 387 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(0), hw->fc.pause_time); 388 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1)); 389 390 return IXGBE_SUCCESS; 391} 392 393/** 394 * ixgbe_setup_mac_link_82598 - Configures MAC link settings 395 * @hw: pointer to hardware structure 396 * 397 * Configures link settings based on values in the ixgbe_hw struct. 398 * Restarts the link. Performs autonegotiation if needed. 399 **/ 400int32_t ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw) 401{ 402 ixgbe_link_speed speed; 403 int link_up; 404 uint32_t autoc_reg; 405 uint32_t links_reg; 406 uint32_t i; 407 int32_t status = IXGBE_SUCCESS; 408 409 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 410 411 if (hw->mac.link_settings_loaded) { 412 autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE; 413 autoc_reg &= ~IXGBE_AUTOC_LMS_MASK; 414 autoc_reg |= hw->mac.link_attach_type; 415 autoc_reg |= hw->mac.link_mode_select; 416 417 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 418 IXGBE_WRITE_FLUSH(hw); 419 msec_delay(50); 420 } 421 422 /* Restart link */ 423 autoc_reg |= IXGBE_AUTOC_AN_RESTART; 424 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 425 426 /* Only poll for autoneg to complete if specified to do so */ 427 if (hw->phy.autoneg_wait_to_complete) { 428 if (hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN || 429 hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) { 430 links_reg = 0; /* Just in case Autoneg time = 0 */ 431 for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) { 432 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 433 if (links_reg & IXGBE_LINKS_KX_AN_COMP) 434 break; 435 msec_delay(100); 436 } 437 if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) { 438 status = IXGBE_ERR_AUTONEG_NOT_COMPLETE; 439 DEBUGOUT("Autonegotiation did not complete.\n"); 440 } 441 } 442 } 443 444 /* 445 * We want to save off the original Flow Control configuration just in 446 * case we get disconnected and then reconnected into a different hub 447 * or switch with different Flow Control capabilities. 448 */ 449 hw->fc.original_type = hw->fc.type; 450 /* 451 * Set up the SerDes link if in 1Gb mode, otherwise just set up 452 * 10Gb flow control. 453 */ 454 hw->mac.ops.check_link(hw, &speed, &link_up, FALSE); 455 if (speed == IXGBE_LINK_SPEED_1GB_FULL) 456 status = ixgbe_setup_fiber_serdes_link_82598(hw); 457 else 458 ixgbe_setup_fc_82598(hw, 0); 459 460 /* Add delay to filter out noises during initial link setup */ 461 msec_delay(50); 462 463 return status; 464} 465 466/** 467 * ixgbe_check_mac_link_82598 - Get link/speed status 468 * @hw: pointer to hardware structure 469 * @speed: pointer to link speed 470 * @link_up: TRUE is link is up, FALSE otherwise 471 * @link_up_wait_to_complete: int used to wait for link up or not 472 * 473 * Reads the links register to determine if link is up and the current speed 474 **/ 475int32_t ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed *speed, 476 int *link_up, int link_up_wait_to_complete) 477{ 478 uint32_t links_reg; 479 uint32_t i; 480 uint16_t link_reg, adapt_comp_reg; 481 482 if (hw->phy.type == ixgbe_phy_nl) { 483 hw->phy.ops.read_reg(hw, 1, IXGBE_TWINAX_DEV, &link_reg); 484 hw->phy.ops.read_reg(hw, 1, IXGBE_TWINAX_DEV, &link_reg); 485 hw->phy.ops.read_reg(hw, 0xC00C, IXGBE_TWINAX_DEV, 486 &adapt_comp_reg); 487 if (link_up_wait_to_complete) { 488 for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { 489 if ((link_reg & (1 << 2)) && 490 ((adapt_comp_reg & 1) == 0)) { 491 *link_up = TRUE; 492 break; 493 } else { 494 *link_up = FALSE; 495 } 496 msec_delay(100); 497 hw->phy.ops.read_reg(hw, 1, IXGBE_TWINAX_DEV, 498 &link_reg); 499 hw->phy.ops.read_reg(hw, 0xC00C, 500 IXGBE_TWINAX_DEV, 501 &adapt_comp_reg); 502 } 503 } else { 504 if ((link_reg & (1 << 2)) && 505 ((adapt_comp_reg & 1) == 0)) 506 *link_up = TRUE; 507 else 508 *link_up = FALSE; 509 } 510 511 if (*link_up == FALSE) 512 goto out; 513 } 514 515 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 516 if (link_up_wait_to_complete) { 517 for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { 518 if (links_reg & IXGBE_LINKS_UP) { 519 *link_up = TRUE; 520 break; 521 } else { 522 *link_up = FALSE; 523 } 524 msec_delay(100); 525 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); 526 } 527 } else { 528 if (links_reg & IXGBE_LINKS_UP) 529 *link_up = TRUE; 530 else 531 *link_up = FALSE; 532 } 533 534 if (links_reg & IXGBE_LINKS_SPEED) 535 *speed = IXGBE_LINK_SPEED_10GB_FULL; 536 else 537 *speed = IXGBE_LINK_SPEED_1GB_FULL; 538 539out: 540 return IXGBE_SUCCESS; 541} 542 543/** 544 * ixgbe_configure_fiber_serdes_fc_82598 - Configure fiber flow control 545 * @hw: pointer to hardware structure 546 * 547 * Reads PCS registers and sets flow control settings, based on 548 * link-partner's abilities. 549 **/ 550int32_t ixgbe_configure_fiber_serdes_fc_82598(struct ixgbe_hw *hw) 551{ 552 int32_t ret_val = IXGBE_SUCCESS; 553 uint32_t pcs_anadv_reg, pcs_lpab_reg, pcs_lstat_reg, i; 554 DEBUGFUNC("ixgbe_configure_fiber_serdes_fc_82598"); 555 556 /* Check that autonegotiation has completed */ 557 for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) { 558 msec_delay(10); 559 pcs_lstat_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); 560 if (pcs_lstat_reg & IXGBE_PCS1GLSTA_LINK_OK) { 561 if (pcs_lstat_reg & IXGBE_PCS1GLSTA_AN_COMPLETE) { 562 if (!(pcs_lstat_reg & 563 (IXGBE_PCS1GLSTA_AN_TIMED_OUT))) 564 hw->mac.autoneg_failed = 0; 565 else 566 hw->mac.autoneg_failed = 1; 567 break; 568 } else { 569 hw->mac.autoneg_failed = 1; 570 break; 571 } 572 } 573 } 574 575 if (hw->mac.autoneg_failed) { 576 /* 577 * AutoNeg failed to achieve a link, so we will turn 578 * flow control off. 579 */ 580 hw->fc.type = ixgbe_fc_none; 581 DEBUGOUT("Flow Control = NONE.\n"); 582 ret_val = ixgbe_setup_fc_82598(hw, 0); 583 goto out; 584 } 585 586 /* 587 * Read the AN advertisement and LP ability registers and resolve 588 * local flow control settings accordingly 589 */ 590 pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); 591 pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); 592 if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && 593 (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE)) { 594 /* 595 * Now we need to check if the user selected Rx ONLY 596 * of pause frames. In this case, we had to advertise 597 * FULL flow control because we could not advertise RX 598 * ONLY. Hence, we must now check to see if we need to 599 * turn OFF the TRANSMISSION of PAUSE frames. 600 */ 601 if (hw->fc.original_type == ixgbe_fc_full) { 602 hw->fc.type = ixgbe_fc_full; 603 DEBUGOUT("Flow Control = FULL.\n"); 604 } else { 605 hw->fc.type = ixgbe_fc_rx_pause; 606 DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); 607 } 608 } else if (!(pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && 609 (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && 610 (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && 611 (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { 612 hw->fc.type = ixgbe_fc_tx_pause; 613 DEBUGOUT("Flow Control = TX PAUSE frames only.\n"); 614 } else if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && 615 (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && 616 !(pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && 617 (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { 618 hw->fc.type = ixgbe_fc_rx_pause; 619 DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); 620 } else { 621 hw->fc.type = ixgbe_fc_none; 622 DEBUGOUT("Flow Control = NONE.\n"); 623 } 624 625 ret_val = ixgbe_setup_fc_82598(hw, 0); 626 if (ret_val) { 627 DEBUGOUT("Error forcing flow control settings\n"); 628 goto out; 629 } 630 631out: 632 return ret_val; 633} 634 635/** 636 * ixgbe_setup_fiber_serdes_link_82598 - Configure fiber serdes link 637 * @hw: pointer to hardware structure 638 * 639 * Sets up PCS registers and sets flow control settings, based on 640 * link-partner's abilities. 641 **/ 642int32_t ixgbe_setup_fiber_serdes_link_82598(struct ixgbe_hw *hw) 643{ 644 uint32_t reg; 645 int32_t ret_val; 646 647 DEBUGFUNC("ixgbe_setup_fiber_serdes_link_82598"); 648 649 /* 650 * 10 gig parts do not have a word in the EEPROM to determine the 651 * default flow control setting, so we explicitly set it to full. 652 */ 653 if (hw->fc.type == ixgbe_fc_default) 654 hw->fc.type = ixgbe_fc_full; 655 656 /* 657 * 82598 fiber/serdes devices require that flow control be resolved in 658 * software. 659 */ 660 reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); 661 662 /* 663 * The possible values of the "fc" parameter are: 664 * 0: Flow control is completely disabled 665 * 1: Rx flow control is enabled (we can receive pause frames, 666 * but not send pause frames). 667 * 2: Tx flow control is enabled (we can send pause frames but 668 * we do not support receiving pause frames). 669 * 3: Both Rx and Tx flow control (symmetric) are enabled. 670 */ 671 switch (hw->fc.type) { 672 case ixgbe_fc_none: 673 /* 674 * Flow control completely disabled by a software 675 * over-ride. 676 */ 677 reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); 678 break; 679 case ixgbe_fc_rx_pause: 680 /* 681 * Rx Flow control is enabled and Tx Flow control is 682 * disabled by a software over-ride. Since there really 683 * isn't a way to advertise that we are capable of RX 684 * Pause ONLY, we will advertise that we support both 685 * symmetric and asymmetric Rx PAUSE. Later, we will 686 * disable the adapter's ability to send PAUSE frames. 687 */ 688 reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); 689 break; 690 case ixgbe_fc_tx_pause: 691 /* 692 * Tx Flow control is enabled, and Rx Flow control is 693 * disabled, by a software over-ride. 694 */ 695 reg |= (IXGBE_PCS1GANA_ASM_PAUSE); 696 reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE); 697 break; 698 case ixgbe_fc_full: 699 /* 700 * Flow control (both Rx and Tx) is enabled by a 701 * software over-ride. 702 */ 703 reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); 704 break; 705 default: 706 DEBUGOUT("Flow control param set incorrectly\n"); 707 ret_val = IXGBE_ERR_CONFIG; 708 goto out; 709 break; 710 } 711 712 IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg); 713 reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL); 714 715 /* Set PCS register for autoneg */ 716 /* Enable and restart autoneg */ 717 reg |= IXGBE_PCS1GLCTL_AN_ENABLE | IXGBE_PCS1GLCTL_AN_RESTART; 718 719 reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; /* Disable AN timeout */ 720 DEBUGOUT1("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg); 721 IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg); 722 723 /* 724 * Configure flow control. If we aren't auto-negotiating, 725 * just setup the flow control and do not worry about PCS autoneg. 726 */ 727 ixgbe_configure_fiber_serdes_fc_82598(hw); 728 729out: 730 return IXGBE_SUCCESS; 731} 732 733/** 734 * ixgbe_setup_mac_link_speed_82598 - Set MAC link speed 735 * @hw: pointer to hardware structure 736 * @speed: new link speed 737 * @autoneg: TRUE if auto-negotiation enabled 738 * @autoneg_wait_to_complete: TRUE if waiting is needed to complete 739 * 740 * Set the link speed in the AUTOC register and restarts link. 741 **/ 742int32_t ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, 743 ixgbe_link_speed speed, int autoneg, 744 int autoneg_wait_to_complete) 745{ 746 int32_t status = IXGBE_SUCCESS; 747 748 /* If speed is 10G, then check for CX4 or XAUI. */ 749 if ((speed == IXGBE_LINK_SPEED_10GB_FULL) && 750 (!(hw->mac.link_attach_type & IXGBE_AUTOC_10G_KX4))) { 751 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_10G_LINK_NO_AN; 752 } else if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && (!autoneg)) { 753 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_LINK_NO_AN; 754 } else if (autoneg) { 755 /* BX mode - Autonegotiate 1G */ 756 if (!(hw->mac.link_attach_type & IXGBE_AUTOC_1G_PMA_PMD)) 757 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_AN; 758 else /* KX/KX4 mode */ 759 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN_1G_AN; 760 } else { 761 status = IXGBE_ERR_LINK_SETUP; 762 } 763 764 if (status == IXGBE_SUCCESS) { 765 hw->phy.autoneg_wait_to_complete = autoneg_wait_to_complete; 766 767 hw->mac.link_settings_loaded = TRUE; 768 /* 769 * Setup and restart the link based on the new values in 770 * ixgbe_hw This will write the AUTOC register based on the new 771 * stored values 772 */ 773 ixgbe_setup_mac_link_82598(hw); 774 } 775 776 return status; 777} 778 779 780/** 781 * ixgbe_setup_copper_link_82598 - Setup copper link settings 782 * @hw: pointer to hardware structure 783 * 784 * Configures link settings based on values in the ixgbe_hw struct. 785 * Restarts the link. Performs autonegotiation if needed. Restart 786 * phy and wait for autonegotiate to finish. Then synchronize the 787 * MAC and PHY. 788 **/ 789int32_t ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw) 790{ 791 int32_t status; 792 793 /* Restart autonegotiation on PHY */ 794 status = hw->phy.ops.setup_link(hw); 795 796 /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */ 797 hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX); 798 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN; 799 800 /* Set up MAC */ 801 ixgbe_setup_mac_link_82598(hw); 802 803 return status; 804} 805 806/** 807 * ixgbe_setup_copper_link_speed_82598 - Set the PHY autoneg advertised field 808 * @hw: pointer to hardware structure 809 * @speed: new link speed 810 * @autoneg: TRUE if autonegotiation enabled 811 * @autoneg_wait_to_complete: TRUE if waiting is needed to complete 812 * 813 * Sets the link speed in the AUTOC register in the MAC and restarts link. 814 **/ 815int32_t ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, 816 ixgbe_link_speed speed, 817 int autoneg, 818 int autoneg_wait_to_complete) 819{ 820 int32_t status; 821 822 /* Setup the PHY according to input speed */ 823 status = hw->phy.ops.setup_link_speed(hw, speed, autoneg, 824 autoneg_wait_to_complete); 825 826 /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */ 827 hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX); 828 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN; 829 830 /* Set up MAC */ 831 ixgbe_setup_mac_link_82598(hw); 832 833 return status; 834} 835 836#ifndef NO_82598_A0_SUPPORT 837/** 838 * ixgbe_reset_hw_rev_0_82598 - Performs hardware reset 839 * @hw: pointer to hardware structure 840 * 841 * Resets the hardware by resetting the transmit and receive units, masks and 842 * clears all interrupts, performing a PHY reset, and performing a link (MAC) 843 * reset. 844 **/ 845int32_t ixgbe_reset_hw_rev_0_82598(struct ixgbe_hw *hw) 846{ 847 int32_t status = IXGBE_SUCCESS; 848 uint32_t ctrl; 849 uint32_t gheccr; 850 uint32_t autoc; 851 uint32_t i; 852 uint32_t resets; 853 854 /* Call adapter stop to disable tx/rx and clear interrupts */ 855 hw->mac.ops.stop_adapter(hw); 856 857 /* Reset PHY */ 858 hw->phy.ops.reset(hw); 859 860 for (resets = 0; resets < 10; resets++) { 861 /* 862 * Prevent the PCI-E bus from from hanging by disabling PCI-E 863 * master access and verify no pending requests before reset 864 */ 865 if (ixgbe_disable_pcie_master(hw) != IXGBE_SUCCESS) { 866 status = IXGBE_ERR_MASTER_REQUESTS_PENDING; 867 DEBUGOUT("PCI-E Master disable polling has failed.\n"); 868 } 869 870 /* 871 * Issue global reset to the MAC. This needs to be a SW reset. 872 * If link reset is used, it might reset the MAC when mng is 873 * using it. 874 */ 875 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 876 IXGBE_WRITE_REG(hw, IXGBE_CTRL, (ctrl | IXGBE_CTRL_RST)); 877 IXGBE_WRITE_FLUSH(hw); 878 879 /* 880 * Poll for reset bit to self-clear indicating reset is 881 * complete 882 */ 883 for (i = 0; i < 10; i++) { 884 usec_delay(1); 885 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 886 if (!(ctrl & IXGBE_CTRL_RST)) 887 break; 888 } 889 if (ctrl & IXGBE_CTRL_RST) { 890 status = IXGBE_ERR_RESET_FAILED; 891 DEBUGOUT("Reset polling failed to complete.\n"); 892 } 893 } 894 895 msec_delay(50); 896 897 gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR); 898 gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6)); 899 IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr); 900 901 /* 902 * AUTOC register which stores link settings gets cleared 903 * and reloaded from EEPROM after reset. We need to restore 904 * our stored value from init in case SW changed the attach 905 * type or speed. If this is the first time and link settings 906 * have not been stored, store default settings from AUTOC. 907 */ 908 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 909 if (hw->mac.link_settings_loaded) { 910 autoc &= ~(IXGBE_AUTOC_LMS_ATTACH_TYPE); 911 autoc &= ~(IXGBE_AUTOC_LMS_MASK); 912 autoc |= hw->mac.link_attach_type; 913 autoc |= hw->mac.link_mode_select; 914 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); 915 } else { 916 hw->mac.link_attach_type = 917 (autoc & IXGBE_AUTOC_LMS_ATTACH_TYPE); 918 hw->mac.link_mode_select = (autoc & IXGBE_AUTOC_LMS_MASK); 919 hw->mac.link_settings_loaded = TRUE; 920 } 921 922 /* Store the permanent mac address */ 923 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); 924 925 return status; 926} 927 928#endif /* NO_A0_SUPPORT */ 929/** 930 * ixgbe_reset_hw_82598 - Performs hardware reset 931 * @hw: pointer to hardware structure 932 * 933 * Resets the hardware by resetting the transmit and receive units, masks and 934 * clears all interrupts, performing a PHY reset, and performing a link (MAC) 935 * reset. 936 **/ 937int32_t ixgbe_reset_hw_82598(struct ixgbe_hw *hw) 938{ 939 int32_t status = IXGBE_SUCCESS; 940 uint32_t ctrl; 941 uint32_t gheccr; 942 uint32_t i; 943 uint32_t autoc; 944 uint8_t analog_val; 945 946 /* Call adapter stop to disable tx/rx and clear interrupts */ 947 hw->mac.ops.stop_adapter(hw); 948 949 /* 950 * Power up the Atlas Tx lanes if they are currently powered down. 951 * Atlas Tx lanes are powered down for MAC loopback tests, but 952 * they are not automatically restored on reset. 953 */ 954 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val); 955 if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) { 956 /* Enable Tx Atlas so packets can be transmitted again */ 957 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, 958 &analog_val); 959 analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN; 960 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, 961 analog_val); 962 963 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, 964 &analog_val); 965 analog_val &= ~ IXGBE_ATLAS_PDN_TX_10G_QL_ALL; 966 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, 967 analog_val); 968 969 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, 970 &analog_val); 971 analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL; 972 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, 973 analog_val); 974 975 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, 976 &analog_val); 977 analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL; 978 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, 979 analog_val); 980 } 981 982 /* Reset PHY */ 983 if (hw->phy.reset_disable == FALSE) 984 hw->phy.ops.reset(hw); 985 986 /* 987 * Prevent the PCI-E bus from from hanging by disabling PCI-E master 988 * access and verify no pending requests before reset 989 */ 990 if (ixgbe_disable_pcie_master(hw) != IXGBE_SUCCESS) { 991 status = IXGBE_ERR_MASTER_REQUESTS_PENDING; 992 DEBUGOUT("PCI-E Master disable polling has failed.\n"); 993 } 994 995 /* 996 * Issue global reset to the MAC. This needs to be a SW reset. 997 * If link reset is used, it might reset the MAC when mng is using it 998 */ 999 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 1000 IXGBE_WRITE_REG(hw, IXGBE_CTRL, (ctrl | IXGBE_CTRL_RST)); 1001 IXGBE_WRITE_FLUSH(hw); 1002 1003 /* Poll for reset bit to self-clear indicating reset is complete */ 1004 for (i = 0; i < 10; i++) { 1005 usec_delay(1); 1006 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 1007 if (!(ctrl & IXGBE_CTRL_RST)) 1008 break; 1009 } 1010 if (ctrl & IXGBE_CTRL_RST) { 1011 status = IXGBE_ERR_RESET_FAILED; 1012 DEBUGOUT("Reset polling failed to complete.\n"); 1013 } 1014 1015 msec_delay(50); 1016 1017 gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR); 1018 gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6)); 1019 IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr); 1020 1021 /* 1022 * AUTOC register which stores link settings gets cleared 1023 * and reloaded from EEPROM after reset. We need to restore 1024 * our stored value from init in case SW changed the attach 1025 * type or speed. If this is the first time and link settings 1026 * have not been stored, store default settings from AUTOC. 1027 */ 1028 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); 1029 if (hw->mac.link_settings_loaded) { 1030 autoc &= ~(IXGBE_AUTOC_LMS_ATTACH_TYPE); 1031 autoc &= ~(IXGBE_AUTOC_LMS_MASK); 1032 autoc |= hw->mac.link_attach_type; 1033 autoc |= hw->mac.link_mode_select; 1034 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); 1035 } else { 1036 hw->mac.link_attach_type = 1037 (autoc & IXGBE_AUTOC_LMS_ATTACH_TYPE); 1038 hw->mac.link_mode_select = (autoc & IXGBE_AUTOC_LMS_MASK); 1039 hw->mac.link_settings_loaded = TRUE; 1040 } 1041 1042 /* Store the permanent mac address */ 1043 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); 1044 1045 return status; 1046} 1047 1048/** 1049 * ixgbe_set_vmdq_82598 - Associate a VMDq set index with a rx address 1050 * @hw: pointer to hardware struct 1051 * @rar: receive address register index to associate with a VMDq index 1052 * @vmdq: VMDq set index 1053 **/ 1054int32_t ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq) 1055{ 1056 uint32_t rar_high; 1057 1058 rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); 1059 rar_high &= ~IXGBE_RAH_VIND_MASK; 1060 rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK); 1061 IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high); 1062 return IXGBE_SUCCESS; 1063} 1064 1065/** 1066 * ixgbe_blink_led_start_82598 - Blink LED based on index. 1067 * @hw: pointer to hardware structure 1068 * @index: led number to blink 1069 **/ 1070int32_t ixgbe_blink_led_start_82598(struct ixgbe_hw *hw, uint32_t index) 1071{ 1072 ixgbe_link_speed speed = 0; 1073 int link_up = 0; 1074 uint32_t autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 1075 uint32_t led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); 1076 1077 /* 1078 * Link must be up to auto-blink the LEDs on the 82598EB MAC; 1079 * force it if link is down. 1080 */ 1081 hw->mac.ops.check_link(hw, &speed, &link_up, FALSE); 1082 1083 if (!link_up) { 1084 autoc_reg |= IXGBE_AUTOC_FLU; 1085 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 1086 msec_delay(10); 1087 } 1088 1089 led_reg &= ~IXGBE_LED_MODE_MASK(index); 1090 led_reg |= IXGBE_LED_BLINK(index); 1091 IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); 1092 IXGBE_WRITE_FLUSH(hw); 1093 1094 return IXGBE_SUCCESS; 1095} 1096 1097/** 1098 * ixgbe_blink_led_stop_82598 - Stop blinking LED based on index. 1099 * @hw: pointer to hardware structure 1100 * @index: led number to stop blinking 1101 **/ 1102int32_t ixgbe_blink_led_stop_82598(struct ixgbe_hw *hw, uint32_t index) 1103{ 1104 uint32_t autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); 1105 uint32_t led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); 1106 1107 autoc_reg &= ~IXGBE_AUTOC_FLU; 1108 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); 1109 1110 led_reg &= ~IXGBE_LED_MODE_MASK(index); 1111 led_reg &= ~IXGBE_LED_BLINK(index); 1112 IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg); 1113 IXGBE_WRITE_FLUSH(hw); 1114 1115 return IXGBE_SUCCESS; 1116} 1117