00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 FILE_LICENCE ( GPL2_ONLY );
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "igb.h"
00039
00040 static s32 igb_init_phy_params_82575(struct e1000_hw *hw);
00041 static s32 igb_init_nvm_params_82575(struct e1000_hw *hw);
00042 static s32 igb_init_mac_params_82575(struct e1000_hw *hw);
00043 static s32 igb_acquire_phy_82575(struct e1000_hw *hw);
00044 static void igb_release_phy_82575(struct e1000_hw *hw);
00045 static s32 igb_acquire_nvm_82575(struct e1000_hw *hw);
00046 static void igb_release_nvm_82575(struct e1000_hw *hw);
00047 static s32 igb_check_for_link_82575(struct e1000_hw *hw);
00048 static s32 igb_get_cfg_done_82575(struct e1000_hw *hw);
00049 static s32 igb_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed,
00050 u16 *duplex);
00051 static s32 igb_init_hw_82575(struct e1000_hw *hw);
00052 static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *hw);
00053 static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
00054 u16 *data);
00055 static s32 igb_reset_hw_82575(struct e1000_hw *hw);
00056 static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *hw,
00057 bool active);
00058 static s32 igb_setup_copper_link_82575(struct e1000_hw *hw);
00059 static s32 igb_setup_serdes_link_82575(struct e1000_hw *hw);
00060 static s32 igb_valid_led_default_82575(struct e1000_hw *hw, u16 *data);
00061 static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw,
00062 u32 offset, u16 data);
00063 static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw);
00064 static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask);
00065 static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw,
00066 u16 *speed, u16 *duplex);
00067 static s32 igb_get_phy_id_82575(struct e1000_hw *hw);
00068 static void igb_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask);
00069 static bool igb_sgmii_active_82575(struct e1000_hw *hw);
00070 static s32 igb_reset_init_script_82575(struct e1000_hw *hw);
00071 static s32 igb_read_mac_addr_82575(struct e1000_hw *hw);
00072 static void igb_power_down_phy_copper_82575(struct e1000_hw *hw);
00073 static void igb_shutdown_serdes_link_82575(struct e1000_hw *hw);
00074 static s32 igb_set_pcie_completion_timeout(struct e1000_hw *hw);
00075
00076
00077
00078
00079
00080 static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
00081 {
00082 struct e1000_phy_info *phy = &hw->phy;
00083 s32 ret_val = E1000_SUCCESS;
00084
00085 DEBUGFUNC("igb_init_phy_params_82575");
00086
00087 if (hw->phy.media_type != e1000_media_type_copper) {
00088 phy->type = e1000_phy_none;
00089 goto out;
00090 }
00091
00092 phy->ops.power_up = igb_power_up_phy_copper;
00093 phy->ops.power_down = igb_power_down_phy_copper_82575;
00094
00095 phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
00096 phy->reset_delay_us = 100;
00097
00098 phy->ops.acquire = igb_acquire_phy_82575;
00099 phy->ops.check_reset_block = igb_check_reset_block_generic;
00100 phy->ops.commit = igb_phy_sw_reset_generic;
00101 phy->ops.get_cfg_done = igb_get_cfg_done_82575;
00102 phy->ops.release = igb_release_phy_82575;
00103
00104 if (igb_sgmii_active_82575(hw)) {
00105 phy->ops.reset = igb_phy_hw_reset_sgmii_82575;
00106 phy->ops.read_reg = igb_read_phy_reg_sgmii_82575;
00107 phy->ops.write_reg = igb_write_phy_reg_sgmii_82575;
00108 } else {
00109 phy->ops.reset = igb_phy_hw_reset_generic;
00110 phy->ops.read_reg = igb_read_phy_reg_igp;
00111 phy->ops.write_reg = igb_write_phy_reg_igp;
00112 }
00113
00114
00115 ret_val = igb_get_phy_id_82575(hw);
00116
00117
00118 switch (phy->id) {
00119 case M88E1111_I_PHY_ID:
00120 phy->type = e1000_phy_m88;
00121 phy->ops.check_polarity = igb_check_polarity_m88;
00122 phy->ops.get_info = igb_get_phy_info_m88;
00123 #if 0
00124 phy->ops.get_cable_length = igb_get_cable_length_m88;
00125 #endif
00126 #if 0
00127 phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_m88;
00128 #endif
00129 break;
00130 case IGP03E1000_E_PHY_ID:
00131 case IGP04E1000_E_PHY_ID:
00132 phy->type = e1000_phy_igp_3;
00133 phy->ops.check_polarity = igb_check_polarity_igp;
00134 phy->ops.get_info = igb_get_phy_info_igp;
00135 #if 0
00136 phy->ops.get_cable_length = igb_get_cable_length_igp_2;
00137 #endif
00138 #if 0
00139 phy->ops.force_speed_duplex = igb_phy_force_speed_duplex_igp;
00140 #endif
00141 phy->ops.set_d0_lplu_state = igb_set_d0_lplu_state_82575;
00142 phy->ops.set_d3_lplu_state = igb_set_d3_lplu_state_generic;
00143 break;
00144 default:
00145 ret_val = -E1000_ERR_PHY;
00146 goto out;
00147 }
00148
00149 out:
00150 return ret_val;
00151 }
00152
00153
00154
00155
00156
00157 static s32 igb_init_nvm_params_82575(struct e1000_hw *hw)
00158 {
00159 struct e1000_nvm_info *nvm = &hw->nvm;
00160 u32 eecd = E1000_READ_REG(hw, E1000_EECD);
00161 u16 size;
00162
00163 DEBUGFUNC("igb_init_nvm_params_82575");
00164
00165 nvm->opcode_bits = 8;
00166 nvm->delay_usec = 1;
00167 switch (nvm->override) {
00168 case e1000_nvm_override_spi_large:
00169 nvm->page_size = 32;
00170 nvm->address_bits = 16;
00171 break;
00172 case e1000_nvm_override_spi_small:
00173 nvm->page_size = 8;
00174 nvm->address_bits = 8;
00175 break;
00176 default:
00177 nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8;
00178 nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8;
00179 break;
00180 }
00181
00182 nvm->type = e1000_nvm_eeprom_spi;
00183
00184 size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
00185 E1000_EECD_SIZE_EX_SHIFT);
00186
00187
00188
00189
00190
00191 size += NVM_WORD_SIZE_BASE_SHIFT;
00192
00193
00194 if (size > 14)
00195 size = 14;
00196 nvm->word_size = 1 << size;
00197
00198
00199 nvm->ops.acquire = igb_acquire_nvm_82575;
00200 nvm->ops.read = igb_read_nvm_eerd;
00201 nvm->ops.release = igb_release_nvm_82575;
00202 nvm->ops.update = igb_update_nvm_checksum_generic;
00203 nvm->ops.valid_led_default = igb_valid_led_default_82575;
00204 nvm->ops.validate = igb_validate_nvm_checksum_generic;
00205 nvm->ops.write = igb_write_nvm_spi;
00206
00207 return E1000_SUCCESS;
00208 }
00209
00210
00211
00212
00213
00214 static s32 igb_init_mac_params_82575(struct e1000_hw *hw)
00215 {
00216 struct e1000_mac_info *mac = &hw->mac;
00217 struct e1000_dev_spec_82575 *dev_spec = &hw->dev_spec._82575;
00218 u32 ctrl_ext = 0;
00219
00220 DEBUGFUNC("igb_init_mac_params_82575");
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 hw->phy.media_type = e1000_media_type_copper;
00231 dev_spec->sgmii_active = false;
00232
00233 ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
00234 switch (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) {
00235 case E1000_CTRL_EXT_LINK_MODE_SGMII:
00236 dev_spec->sgmii_active = true;
00237 ctrl_ext |= E1000_CTRL_I2C_ENA;
00238 break;
00239 case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES:
00240 hw->phy.media_type = e1000_media_type_internal_serdes;
00241 ctrl_ext |= E1000_CTRL_I2C_ENA;
00242 break;
00243 default:
00244 ctrl_ext &= ~E1000_CTRL_I2C_ENA;
00245 break;
00246 }
00247
00248 E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
00249
00250
00251 mac->mta_reg_count = 128;
00252
00253 mac->uta_reg_count = (hw->mac.type == e1000_82575) ? 0 : 128;
00254
00255 mac->rar_entry_count = E1000_RAR_ENTRIES_82575;
00256 if (mac->type == e1000_82576)
00257 mac->rar_entry_count = E1000_RAR_ENTRIES_82576;
00258
00259 mac->asf_firmware_present = true;
00260
00261 mac->arc_subsystem_valid =
00262 (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
00263 ? true : false;
00264
00265
00266
00267
00268 mac->ops.get_bus_info = igb_get_bus_info_pcie_generic;
00269
00270 mac->ops.reset_hw = igb_reset_hw_82575;
00271
00272 mac->ops.init_hw = igb_init_hw_82575;
00273
00274 mac->ops.setup_link = igb_setup_link_generic;
00275
00276 mac->ops.setup_physical_interface =
00277 (hw->phy.media_type == e1000_media_type_copper)
00278 ? igb_setup_copper_link_82575
00279 : igb_setup_serdes_link_82575;
00280
00281 mac->ops.shutdown_serdes = igb_shutdown_serdes_link_82575;
00282
00283 mac->ops.check_for_link = igb_check_for_link_82575;
00284
00285 mac->ops.rar_set = igb_rar_set_generic;
00286
00287 mac->ops.read_mac_addr = igb_read_mac_addr_82575;
00288
00289 mac->ops.update_mc_addr_list = igb_update_mc_addr_list_generic;
00290
00291 mac->ops.write_vfta = igb_write_vfta_generic;
00292
00293 mac->ops.clear_vfta = igb_clear_vfta_generic;
00294
00295 #if 0
00296 mac->ops.mta_set = igb_mta_set_generic;
00297
00298 mac->ops.id_led_init = igb_id_led_init_generic;
00299
00300 mac->ops.blink_led = igb_blink_led_generic;
00301
00302 mac->ops.setup_led = igb_setup_led_generic;
00303
00304 mac->ops.cleanup_led = igb_cleanup_led_generic;
00305
00306 mac->ops.led_on = igb_led_on_generic;
00307 mac->ops.led_off = igb_led_off_generic;
00308 #endif
00309
00310 mac->ops.clear_hw_cntrs = igb_clear_hw_cntrs_82575;
00311
00312 mac->ops.get_link_up_info = igb_get_link_up_info_82575;
00313
00314
00315 hw->mac.ops.set_lan_id(hw);
00316
00317 return E1000_SUCCESS;
00318 }
00319
00320
00321
00322
00323
00324
00325
00326 void igb_init_function_pointers_82575(struct e1000_hw *hw)
00327 {
00328 DEBUGFUNC("igb_init_function_pointers_82575");
00329
00330 hw->mac.ops.init_params = igb_init_mac_params_82575;
00331 hw->nvm.ops.init_params = igb_init_nvm_params_82575;
00332 hw->phy.ops.init_params = igb_init_phy_params_82575;
00333 #if 0
00334 hw->mbx.ops.init_params = igb_init_mbx_params_pf;
00335 #endif
00336 }
00337
00338
00339
00340
00341
00342
00343
00344 static s32 igb_acquire_phy_82575(struct e1000_hw *hw)
00345 {
00346 u16 mask = E1000_SWFW_PHY0_SM;
00347
00348 DEBUGFUNC("igb_acquire_phy_82575");
00349
00350 if (hw->bus.func == E1000_FUNC_1)
00351 mask = E1000_SWFW_PHY1_SM;
00352
00353 return igb_acquire_swfw_sync_82575(hw, mask);
00354 }
00355
00356
00357
00358
00359
00360
00361
00362 static void igb_release_phy_82575(struct e1000_hw *hw)
00363 {
00364 u16 mask = E1000_SWFW_PHY0_SM;
00365
00366 DEBUGFUNC("igb_release_phy_82575");
00367
00368 if (hw->bus.func == E1000_FUNC_1)
00369 mask = E1000_SWFW_PHY1_SM;
00370
00371 igb_release_swfw_sync_82575(hw, mask);
00372 }
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
00384 u16 *data)
00385 {
00386 s32 ret_val = -E1000_ERR_PARAM;
00387
00388 DEBUGFUNC("igb_read_phy_reg_sgmii_82575");
00389
00390 if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) {
00391 DEBUGOUT1("PHY Address %u is out of range\n", offset);
00392 goto out;
00393 }
00394
00395 ret_val = hw->phy.ops.acquire(hw);
00396 if (ret_val)
00397 goto out;
00398
00399 ret_val = igb_read_phy_reg_i2c(hw, offset, data);
00400
00401 hw->phy.ops.release(hw);
00402
00403 out:
00404 return ret_val;
00405 }
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset,
00417 u16 data)
00418 {
00419 s32 ret_val = -E1000_ERR_PARAM;
00420
00421 DEBUGFUNC("igb_write_phy_reg_sgmii_82575");
00422
00423 if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) {
00424 DEBUGOUT1("PHY Address %d is out of range\n", offset);
00425 goto out;
00426 }
00427
00428 ret_val = hw->phy.ops.acquire(hw);
00429 if (ret_val)
00430 goto out;
00431
00432 ret_val = igb_write_phy_reg_i2c(hw, offset, data);
00433
00434 hw->phy.ops.release(hw);
00435
00436 out:
00437 return ret_val;
00438 }
00439
00440
00441
00442
00443
00444
00445
00446
00447 static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
00448 {
00449 struct e1000_phy_info *phy = &hw->phy;
00450 s32 ret_val = E1000_SUCCESS;
00451 u16 phy_id;
00452 u32 ctrl_ext;
00453
00454 DEBUGFUNC("igb_get_phy_id_82575");
00455
00456
00457
00458
00459
00460
00461
00462
00463 if (!igb_sgmii_active_82575(hw)) {
00464 phy->addr = 1;
00465 ret_val = igb_get_phy_id(hw);
00466 goto out;
00467 }
00468
00469
00470 ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
00471 E1000_WRITE_REG(hw, E1000_CTRL_EXT,
00472 ctrl_ext & ~E1000_CTRL_EXT_SDP3_DATA);
00473 E1000_WRITE_FLUSH(hw);
00474 msec_delay(300);
00475
00476
00477
00478
00479
00480 for (phy->addr = 1; phy->addr < 8; phy->addr++) {
00481 ret_val = igb_read_phy_reg_sgmii_82575(hw, PHY_ID1, &phy_id);
00482 if (ret_val == E1000_SUCCESS) {
00483 DEBUGOUT2("Vendor ID 0x%08X read at address %u\n",
00484 phy_id,
00485 phy->addr);
00486
00487
00488
00489
00490 if (phy_id == M88_VENDOR)
00491 break;
00492 } else {
00493 DEBUGOUT1("PHY address %u was unreadable\n",
00494 phy->addr);
00495 }
00496 }
00497
00498
00499 if (phy->addr == 8) {
00500 phy->addr = 0;
00501 ret_val = -E1000_ERR_PHY;
00502 } else {
00503 ret_val = igb_get_phy_id(hw);
00504 }
00505
00506
00507 E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
00508
00509 out:
00510 return ret_val;
00511 }
00512
00513
00514
00515
00516
00517
00518
00519 static s32 igb_phy_hw_reset_sgmii_82575(struct e1000_hw *hw)
00520 {
00521 s32 ret_val = E1000_SUCCESS;
00522
00523 DEBUGFUNC("igb_phy_hw_reset_sgmii_82575");
00524
00525
00526
00527
00528
00529
00530 DEBUGOUT("Soft resetting SGMII attached PHY...\n");
00531
00532 if (!(hw->phy.ops.write_reg))
00533 goto out;
00534
00535
00536
00537
00538
00539 ret_val = hw->phy.ops.write_reg(hw, 0x1B, 0x8084);
00540 if (ret_val)
00541 goto out;
00542
00543 ret_val = hw->phy.ops.commit(hw);
00544
00545 out:
00546 return ret_val;
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562 static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active)
00563 {
00564 struct e1000_phy_info *phy = &hw->phy;
00565 s32 ret_val = E1000_SUCCESS;
00566 u16 data;
00567
00568 DEBUGFUNC("igb_set_d0_lplu_state_82575");
00569
00570 if (!(hw->phy.ops.read_reg))
00571 goto out;
00572
00573 ret_val = phy->ops.read_reg(hw, IGP02E1000_PHY_POWER_MGMT, &data);
00574 if (ret_val)
00575 goto out;
00576
00577 if (active) {
00578 data |= IGP02E1000_PM_D0_LPLU;
00579 ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT,
00580 data);
00581 if (ret_val)
00582 goto out;
00583
00584
00585 ret_val = phy->ops.read_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
00586 &data);
00587 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
00588 ret_val = phy->ops.write_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
00589 data);
00590 if (ret_val)
00591 goto out;
00592 } else {
00593 data &= ~IGP02E1000_PM_D0_LPLU;
00594 ret_val = phy->ops.write_reg(hw, IGP02E1000_PHY_POWER_MGMT,
00595 data);
00596
00597
00598
00599
00600
00601
00602 if (phy->smart_speed == e1000_smart_speed_on) {
00603 ret_val = phy->ops.read_reg(hw,
00604 IGP01E1000_PHY_PORT_CONFIG,
00605 &data);
00606 if (ret_val)
00607 goto out;
00608
00609 data |= IGP01E1000_PSCFR_SMART_SPEED;
00610 ret_val = phy->ops.write_reg(hw,
00611 IGP01E1000_PHY_PORT_CONFIG,
00612 data);
00613 if (ret_val)
00614 goto out;
00615 } else if (phy->smart_speed == e1000_smart_speed_off) {
00616 ret_val = phy->ops.read_reg(hw,
00617 IGP01E1000_PHY_PORT_CONFIG,
00618 &data);
00619 if (ret_val)
00620 goto out;
00621
00622 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
00623 ret_val = phy->ops.write_reg(hw,
00624 IGP01E1000_PHY_PORT_CONFIG,
00625 data);
00626 if (ret_val)
00627 goto out;
00628 }
00629 }
00630
00631 out:
00632 return ret_val;
00633 }
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 static s32 igb_acquire_nvm_82575(struct e1000_hw *hw)
00645 {
00646 s32 ret_val;
00647
00648 DEBUGFUNC("igb_acquire_nvm_82575");
00649
00650 ret_val = igb_acquire_swfw_sync_82575(hw, E1000_SWFW_EEP_SM);
00651 if (ret_val)
00652 goto out;
00653
00654 ret_val = igb_acquire_nvm_generic(hw);
00655
00656 if (ret_val)
00657 igb_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM);
00658
00659 out:
00660 return ret_val;
00661 }
00662
00663
00664
00665
00666
00667
00668
00669
00670 static void igb_release_nvm_82575(struct e1000_hw *hw)
00671 {
00672 DEBUGFUNC("igb_release_nvm_82575");
00673
00674 igb_release_nvm_generic(hw);
00675 igb_release_swfw_sync_82575(hw, E1000_SWFW_EEP_SM);
00676 }
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686 static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask)
00687 {
00688 u32 swfw_sync;
00689 u32 swmask = mask;
00690 u32 fwmask = mask << 16;
00691 s32 ret_val = E1000_SUCCESS;
00692 s32 i = 0, timeout = 200;
00693
00694 DEBUGFUNC("igb_acquire_swfw_sync_82575");
00695
00696 while (i < timeout) {
00697 if (igb_get_hw_semaphore_generic(hw)) {
00698 ret_val = -E1000_ERR_SWFW_SYNC;
00699 goto out;
00700 }
00701
00702 swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
00703 if (!(swfw_sync & (fwmask | swmask)))
00704 break;
00705
00706
00707
00708
00709
00710 igb_put_hw_semaphore_generic(hw);
00711 msec_delay_irq(5);
00712 i++;
00713 }
00714
00715 if (i == timeout) {
00716 DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
00717 ret_val = -E1000_ERR_SWFW_SYNC;
00718 goto out;
00719 }
00720
00721 swfw_sync |= swmask;
00722 E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
00723
00724 igb_put_hw_semaphore_generic(hw);
00725
00726 out:
00727 return ret_val;
00728 }
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738 static void igb_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask)
00739 {
00740 u32 swfw_sync;
00741
00742 DEBUGFUNC("igb_release_swfw_sync_82575");
00743
00744 while (igb_get_hw_semaphore_generic(hw) != E1000_SUCCESS);
00745
00746
00747 swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
00748 swfw_sync &= ~mask;
00749 E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
00750
00751 igb_put_hw_semaphore_generic(hw);
00752 }
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764 static s32 igb_get_cfg_done_82575(struct e1000_hw *hw)
00765 {
00766 s32 timeout = PHY_CFG_TIMEOUT;
00767 s32 ret_val = E1000_SUCCESS;
00768 u32 mask = E1000_NVM_CFG_DONE_PORT_0;
00769
00770 DEBUGFUNC("igb_get_cfg_done_82575");
00771
00772 if (hw->bus.func == E1000_FUNC_1)
00773 mask = E1000_NVM_CFG_DONE_PORT_1;
00774 while (timeout) {
00775 if (E1000_READ_REG(hw, E1000_EEMNGCTL) & mask)
00776 break;
00777 msec_delay(1);
00778 timeout--;
00779 }
00780 if (!timeout) {
00781 DEBUGOUT("MNG configuration cycle has not completed.\n");
00782 }
00783
00784
00785 if (((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) &&
00786 (hw->phy.type == e1000_phy_igp_3))
00787 igb_phy_init_script_igp3(hw);
00788
00789 return ret_val;
00790 }
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802 static s32 igb_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed,
00803 u16 *duplex)
00804 {
00805 s32 ret_val;
00806
00807 DEBUGFUNC("igb_get_link_up_info_82575");
00808
00809 if (hw->phy.media_type != e1000_media_type_copper)
00810 ret_val = igb_get_pcs_speed_and_duplex_82575(hw, speed,
00811 duplex);
00812 else
00813 ret_val = igb_get_speed_and_duplex_copper_generic(hw, speed,
00814 duplex);
00815
00816 return ret_val;
00817 }
00818
00819
00820
00821
00822
00823
00824
00825
00826 static s32 igb_check_for_link_82575(struct e1000_hw *hw)
00827 {
00828 s32 ret_val;
00829 u16 speed, duplex;
00830
00831 DEBUGFUNC("igb_check_for_link_82575");
00832
00833 if (hw->phy.media_type != e1000_media_type_copper) {
00834 ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed,
00835 &duplex);
00836
00837
00838
00839
00840
00841 hw->mac.get_link_status = !hw->mac.serdes_has_link;
00842 } else {
00843 ret_val = igb_check_for_copper_link_generic(hw);
00844 }
00845
00846 return ret_val;
00847 }
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858 static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw,
00859 u16 *speed, u16 *duplex)
00860 {
00861 struct e1000_mac_info *mac = &hw->mac;
00862 u32 pcs;
00863
00864 DEBUGFUNC("igb_get_pcs_speed_and_duplex_82575");
00865
00866
00867 mac->serdes_has_link = false;
00868 *speed = 0;
00869 *duplex = 0;
00870
00871
00872
00873
00874
00875
00876 pcs = E1000_READ_REG(hw, E1000_PCS_LSTAT);
00877
00878
00879
00880
00881
00882
00883 if ((pcs & E1000_PCS_LSTS_LINK_OK) && (pcs & E1000_PCS_LSTS_SYNK_OK)) {
00884 mac->serdes_has_link = true;
00885
00886
00887 if (pcs & E1000_PCS_LSTS_SPEED_1000) {
00888 *speed = SPEED_1000;
00889 } else if (pcs & E1000_PCS_LSTS_SPEED_100) {
00890 *speed = SPEED_100;
00891 } else {
00892 *speed = SPEED_10;
00893 }
00894
00895
00896 if (pcs & E1000_PCS_LSTS_DUPLEX_FULL) {
00897 *duplex = FULL_DUPLEX;
00898 } else {
00899 *duplex = HALF_DUPLEX;
00900 }
00901 }
00902
00903 return E1000_SUCCESS;
00904 }
00905
00906
00907
00908
00909
00910
00911
00912
00913 void igb_shutdown_serdes_link_82575(struct e1000_hw *hw)
00914 {
00915 #if 0
00916 u32 reg;
00917 #endif
00918 u16 eeprom_data = 0;
00919
00920 if ((hw->phy.media_type != e1000_media_type_internal_serdes) &&
00921 !igb_sgmii_active_82575(hw))
00922 return;
00923
00924 if (hw->bus.func == E1000_FUNC_0)
00925 hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
00926 else if (hw->bus.func == E1000_FUNC_1)
00927 hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
00928
00929
00930
00931
00932
00933 #if 0
00934 if (!(eeprom_data & E1000_NVM_APME_82575) &&
00935 !igb_enable_mng_pass_thru(hw)) {
00936
00937 reg = E1000_READ_REG(hw, E1000_PCS_CFG0);
00938 reg &= ~E1000_PCS_CFG_PCS_EN;
00939 E1000_WRITE_REG(hw, E1000_PCS_CFG0, reg);
00940
00941
00942 reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
00943 reg |= E1000_CTRL_EXT_SDP3_DATA;
00944 E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
00945
00946
00947 E1000_WRITE_FLUSH(hw);
00948 msec_delay(1);
00949 }
00950 #endif
00951 return;
00952 }
00953
00954
00955
00956
00957
00958
00959
00960 static s32 igb_reset_hw_82575(struct e1000_hw *hw)
00961 {
00962 u32 ctrl, icr;
00963 s32 ret_val;
00964
00965 DEBUGFUNC("igb_reset_hw_82575");
00966
00967
00968
00969
00970
00971 ret_val = igb_disable_pcie_master_generic(hw);
00972 if (ret_val) {
00973 DEBUGOUT("PCI-E Master disable polling has failed.\n");
00974 }
00975
00976
00977 ret_val = igb_set_pcie_completion_timeout(hw);
00978 if (ret_val) {
00979 DEBUGOUT("PCI-E Set completion timeout has failed.\n");
00980 }
00981
00982 DEBUGOUT("Masking off all interrupts\n");
00983 E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
00984
00985 E1000_WRITE_REG(hw, E1000_RCTL, 0);
00986 E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP);
00987 E1000_WRITE_FLUSH(hw);
00988
00989 msec_delay(10);
00990
00991 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00992
00993 DEBUGOUT("Issuing a global reset to MAC\n");
00994 E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
00995
00996 ret_val = igb_get_auto_rd_done_generic(hw);
00997 if (ret_val) {
00998
00999
01000
01001
01002
01003 DEBUGOUT("Auto Read Done did not complete\n");
01004 }
01005
01006
01007 if ((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0)
01008 igb_reset_init_script_82575(hw);
01009
01010
01011 E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
01012 icr = E1000_READ_REG(hw, E1000_ICR);
01013
01014
01015 ret_val = igb_check_alt_mac_addr_generic(hw);
01016
01017 return ret_val;
01018 }
01019
01020
01021
01022
01023
01024
01025
01026 static s32 igb_init_hw_82575(struct e1000_hw *hw)
01027 {
01028 struct e1000_mac_info *mac = &hw->mac;
01029 s32 ret_val;
01030 u16 i, rar_count = mac->rar_entry_count;
01031
01032 DEBUGFUNC("igb_init_hw_82575");
01033
01034
01035 ret_val = mac->ops.id_led_init(hw);
01036 if (ret_val) {
01037 DEBUGOUT("Error initializing identification LED\n");
01038
01039 }
01040
01041
01042 DEBUGOUT("Initializing the IEEE VLAN\n");
01043 mac->ops.clear_vfta(hw);
01044
01045
01046 igb_init_rx_addrs_generic(hw, rar_count);
01047
01048
01049 DEBUGOUT("Zeroing the MTA\n");
01050 for (i = 0; i < mac->mta_reg_count; i++)
01051 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
01052
01053
01054 DEBUGOUT("Zeroing the UTA\n");
01055 for (i = 0; i < mac->uta_reg_count; i++)
01056 E1000_WRITE_REG_ARRAY(hw, E1000_UTA, i, 0);
01057
01058
01059 ret_val = mac->ops.setup_link(hw);
01060
01061
01062
01063
01064
01065
01066
01067 igb_clear_hw_cntrs_82575(hw);
01068
01069 return ret_val;
01070 }
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080 static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
01081 {
01082 u32 ctrl;
01083 s32 ret_val;
01084
01085 DEBUGFUNC("igb_setup_copper_link_82575");
01086
01087 ctrl = E1000_READ_REG(hw, E1000_CTRL);
01088 ctrl |= E1000_CTRL_SLU;
01089 ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
01090 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
01091
01092 ret_val = igb_setup_serdes_link_82575(hw);
01093 if (ret_val)
01094 goto out;
01095
01096 if (igb_sgmii_active_82575(hw) && !hw->phy.reset_disable) {
01097 ret_val = hw->phy.ops.reset(hw);
01098 if (ret_val) {
01099 DEBUGOUT("Error resetting the PHY.\n");
01100 goto out;
01101 }
01102 }
01103 switch (hw->phy.type) {
01104 case e1000_phy_m88:
01105 ret_val = igb_copper_link_setup_m88(hw);
01106 break;
01107 case e1000_phy_igp_3:
01108 ret_val = igb_copper_link_setup_igp(hw);
01109 break;
01110 default:
01111 ret_val = -E1000_ERR_PHY;
01112 break;
01113 }
01114
01115 if (ret_val)
01116 goto out;
01117
01118 ret_val = igb_setup_copper_link_generic(hw);
01119 out:
01120 return ret_val;
01121 }
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132 static s32 igb_setup_serdes_link_82575(struct e1000_hw *hw)
01133 {
01134 u32 ctrl_reg, reg;
01135
01136 DEBUGFUNC("igb_setup_serdes_link_82575");
01137
01138 if ((hw->phy.media_type != e1000_media_type_internal_serdes) &&
01139 !igb_sgmii_active_82575(hw))
01140 return E1000_SUCCESS;
01141
01142
01143
01144
01145
01146
01147
01148 E1000_WRITE_REG(hw, E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK);
01149
01150
01151 reg = E1000_READ_REG(hw, E1000_CTRL_EXT);
01152 reg &= ~E1000_CTRL_EXT_SDP3_DATA;
01153 E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg);
01154
01155 ctrl_reg = E1000_READ_REG(hw, E1000_CTRL);
01156 ctrl_reg |= E1000_CTRL_SLU;
01157
01158 if (hw->mac.type == e1000_82575 || hw->mac.type == e1000_82576) {
01159
01160 ctrl_reg |= E1000_CTRL_SWDPIN0 | E1000_CTRL_SWDPIN1;
01161
01162
01163 reg = E1000_READ_REG(hw, E1000_CONNSW);
01164 reg |= E1000_CONNSW_ENRGSRC;
01165 E1000_WRITE_REG(hw, E1000_CONNSW, reg);
01166 }
01167
01168 reg = E1000_READ_REG(hw, E1000_PCS_LCTL);
01169
01170 if (igb_sgmii_active_82575(hw)) {
01171
01172 msec_delay(300);
01173
01174
01175 reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT);
01176 } else {
01177 ctrl_reg |= E1000_CTRL_SPD_1000 | E1000_CTRL_FRCSPD |
01178 E1000_CTRL_FD | E1000_CTRL_FRCDPX;
01179 }
01180
01181 E1000_WRITE_REG(hw, E1000_CTRL, ctrl_reg);
01182
01183
01184
01185
01186
01187
01188
01189
01190 reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP |
01191 E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK);
01192
01193
01194
01195
01196
01197 reg |= E1000_PCS_LCTL_FORCE_FCTRL;
01198
01199
01200
01201
01202
01203 if (hw->mac.autoneg || igb_sgmii_active_82575(hw)) {
01204
01205 reg |= E1000_PCS_LCTL_FSV_1000 |
01206 E1000_PCS_LCTL_FDV_FULL |
01207 E1000_PCS_LCTL_AN_ENABLE |
01208 E1000_PCS_LCTL_AN_RESTART;
01209 DEBUGOUT1("Configuring Autoneg:PCS_LCTL=0x%08X\n", reg);
01210 } else {
01211
01212 if (hw->mac.forced_speed_duplex & E1000_ALL_FULL_DUPLEX)
01213 reg |= E1000_PCS_LCTL_FDV_FULL;
01214
01215
01216
01217
01218 if (hw->mac.forced_speed_duplex & E1000_ALL_100_SPEED)
01219 reg |= E1000_PCS_LCTL_FSV_100;
01220
01221
01222 reg |= E1000_PCS_LCTL_FSD |
01223 E1000_PCS_LCTL_FORCE_LINK |
01224 E1000_PCS_LCTL_FLV_LINK_UP;
01225
01226 DEBUGOUT1("Configuring Forced Link:PCS_LCTL=0x%08X\n", reg);
01227 }
01228
01229 E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg);
01230
01231 if (!igb_sgmii_active_82575(hw))
01232 igb_force_mac_fc_generic(hw);
01233
01234 return E1000_SUCCESS;
01235 }
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245 static s32 igb_valid_led_default_82575(struct e1000_hw *hw, u16 *data)
01246 {
01247 s32 ret_val;
01248
01249 DEBUGFUNC("igb_valid_led_default_82575");
01250
01251 ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
01252 if (ret_val) {
01253 DEBUGOUT("NVM Read Error\n");
01254 goto out;
01255 }
01256
01257 if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) {
01258 switch(hw->phy.media_type) {
01259 case e1000_media_type_internal_serdes:
01260 *data = ID_LED_DEFAULT_82575_SERDES;
01261 break;
01262 case e1000_media_type_copper:
01263 default:
01264 *data = ID_LED_DEFAULT;
01265 break;
01266 }
01267 }
01268 out:
01269 return ret_val;
01270 }
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280 static bool igb_sgmii_active_82575(struct e1000_hw *hw)
01281 {
01282 struct e1000_dev_spec_82575 *dev_spec = &hw->dev_spec._82575;
01283 return dev_spec->sgmii_active;
01284 }
01285
01286
01287
01288
01289
01290
01291
01292
01293 static s32 igb_reset_init_script_82575(struct e1000_hw* hw)
01294 {
01295 DEBUGFUNC("igb_reset_init_script_82575");
01296
01297 if (hw->mac.type == e1000_82575) {
01298 DEBUGOUT("Running reset init script for 82575\n");
01299
01300 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x00, 0x0C);
01301 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x01, 0x78);
01302 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x1B, 0x23);
01303 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCTL, 0x23, 0x15);
01304
01305
01306 igb_write_8bit_ctrl_reg_generic(hw, E1000_CCMCTL, 0x14, 0x00);
01307 igb_write_8bit_ctrl_reg_generic(hw, E1000_CCMCTL, 0x10, 0x00);
01308
01309
01310 igb_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x00, 0xEC);
01311 igb_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x61, 0xDF);
01312 igb_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x34, 0x05);
01313 igb_write_8bit_ctrl_reg_generic(hw, E1000_GIOCTL, 0x2F, 0x81);
01314
01315
01316 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x02, 0x47);
01317 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x14, 0x00);
01318 igb_write_8bit_ctrl_reg_generic(hw, E1000_SCCTL, 0x10, 0x00);
01319 }
01320
01321 return E1000_SUCCESS;
01322 }
01323
01324
01325
01326
01327
01328 static s32 igb_read_mac_addr_82575(struct e1000_hw *hw)
01329 {
01330 s32 ret_val = E1000_SUCCESS;
01331
01332 DEBUGFUNC("igb_read_mac_addr_82575");
01333
01334
01335
01336
01337
01338
01339 ret_val = igb_check_alt_mac_addr_generic(hw);
01340 if (ret_val)
01341 goto out;
01342
01343 ret_val = igb_read_mac_addr_generic(hw);
01344
01345 out:
01346 return ret_val;
01347 }
01348
01349
01350
01351
01352
01353
01354
01355
01356 static void igb_power_down_phy_copper_82575(struct e1000_hw *hw)
01357 {
01358 struct e1000_phy_info *phy = &hw->phy;
01359 struct e1000_mac_info *mac = &hw->mac;
01360
01361 if (!(phy->ops.check_reset_block))
01362 return;
01363
01364
01365 if (!(mac->ops.check_mng_mode(hw) || phy->ops.check_reset_block(hw)))
01366 igb_power_down_phy_copper(hw);
01367
01368 return;
01369 }
01370
01371
01372
01373
01374
01375
01376
01377 static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw)
01378 {
01379 DEBUGFUNC("igb_clear_hw_cntrs_82575");
01380
01381 igb_clear_hw_cntrs_base_generic(hw);
01382
01383 E1000_READ_REG(hw, E1000_PRC64);
01384 E1000_READ_REG(hw, E1000_PRC127);
01385 E1000_READ_REG(hw, E1000_PRC255);
01386 E1000_READ_REG(hw, E1000_PRC511);
01387 E1000_READ_REG(hw, E1000_PRC1023);
01388 E1000_READ_REG(hw, E1000_PRC1522);
01389 E1000_READ_REG(hw, E1000_PTC64);
01390 E1000_READ_REG(hw, E1000_PTC127);
01391 E1000_READ_REG(hw, E1000_PTC255);
01392 E1000_READ_REG(hw, E1000_PTC511);
01393 E1000_READ_REG(hw, E1000_PTC1023);
01394 E1000_READ_REG(hw, E1000_PTC1522);
01395
01396 E1000_READ_REG(hw, E1000_ALGNERRC);
01397 E1000_READ_REG(hw, E1000_RXERRC);
01398 E1000_READ_REG(hw, E1000_TNCRS);
01399 E1000_READ_REG(hw, E1000_CEXTERR);
01400 E1000_READ_REG(hw, E1000_TSCTC);
01401 E1000_READ_REG(hw, E1000_TSCTFC);
01402
01403 E1000_READ_REG(hw, E1000_MGTPRC);
01404 E1000_READ_REG(hw, E1000_MGTPDC);
01405 E1000_READ_REG(hw, E1000_MGTPTC);
01406
01407 E1000_READ_REG(hw, E1000_IAC);
01408 E1000_READ_REG(hw, E1000_ICRXOC);
01409
01410 E1000_READ_REG(hw, E1000_ICRXPTC);
01411 E1000_READ_REG(hw, E1000_ICRXATC);
01412 E1000_READ_REG(hw, E1000_ICTXPTC);
01413 E1000_READ_REG(hw, E1000_ICTXATC);
01414 E1000_READ_REG(hw, E1000_ICTXQEC);
01415 E1000_READ_REG(hw, E1000_ICTXQMTC);
01416 E1000_READ_REG(hw, E1000_ICRXDMTC);
01417
01418 E1000_READ_REG(hw, E1000_CBTMPC);
01419 E1000_READ_REG(hw, E1000_HTDPMC);
01420 E1000_READ_REG(hw, E1000_CBRMPC);
01421 E1000_READ_REG(hw, E1000_RPTHC);
01422 E1000_READ_REG(hw, E1000_HGPTC);
01423 E1000_READ_REG(hw, E1000_HTCBDPC);
01424 E1000_READ_REG(hw, E1000_HGORCL);
01425 E1000_READ_REG(hw, E1000_HGORCH);
01426 E1000_READ_REG(hw, E1000_HGOTCL);
01427 E1000_READ_REG(hw, E1000_HGOTCH);
01428 E1000_READ_REG(hw, E1000_LENERRS);
01429
01430
01431 if ((hw->phy.media_type == e1000_media_type_internal_serdes) ||
01432 igb_sgmii_active_82575(hw))
01433 E1000_READ_REG(hw, E1000_SCVPC);
01434 }
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445 void igb_rx_fifo_flush_82575(struct e1000_hw *hw)
01446 {
01447 u32 rctl, rlpml, rxdctl[4], rfctl, temp_rctl, rx_enabled;
01448 int i, ms_wait;
01449
01450 DEBUGFUNC("igb_rx_fifo_workaround_82575");
01451 if (hw->mac.type != e1000_82575 ||
01452 !(E1000_READ_REG(hw, E1000_MANC) & E1000_MANC_RCV_TCO_EN))
01453 return;
01454
01455
01456 for (i = 0; i < 4; i++) {
01457 rxdctl[i] = E1000_READ_REG(hw, E1000_RXDCTL(i));
01458 E1000_WRITE_REG(hw, E1000_RXDCTL(i),
01459 rxdctl[i] & ~E1000_RXDCTL_QUEUE_ENABLE);
01460 }
01461
01462 for (ms_wait = 0; ms_wait < 10; ms_wait++) {
01463 msec_delay(1);
01464 rx_enabled = 0;
01465 for (i = 0; i < 4; i++)
01466 rx_enabled |= E1000_READ_REG(hw, E1000_RXDCTL(i));
01467 if (!(rx_enabled & E1000_RXDCTL_QUEUE_ENABLE))
01468 break;
01469 }
01470
01471 if (ms_wait == 10) {
01472 DEBUGOUT("Queue disable timed out after 10ms\n");
01473 }
01474
01475
01476
01477
01478 rfctl = E1000_READ_REG(hw, E1000_RFCTL);
01479 E1000_WRITE_REG(hw, E1000_RFCTL, rfctl & ~E1000_RFCTL_LEF);
01480
01481 rlpml = E1000_READ_REG(hw, E1000_RLPML);
01482 E1000_WRITE_REG(hw, E1000_RLPML, 0);
01483
01484 rctl = E1000_READ_REG(hw, E1000_RCTL);
01485 temp_rctl = rctl & ~(E1000_RCTL_EN | E1000_RCTL_SBP);
01486 temp_rctl |= E1000_RCTL_LPE;
01487
01488 E1000_WRITE_REG(hw, E1000_RCTL, temp_rctl);
01489 E1000_WRITE_REG(hw, E1000_RCTL, temp_rctl | E1000_RCTL_EN);
01490 E1000_WRITE_FLUSH(hw);
01491 msec_delay(2);
01492
01493
01494
01495
01496 for (i = 0; i < 4; i++)
01497 E1000_WRITE_REG(hw, E1000_RXDCTL(i), rxdctl[i]);
01498 E1000_WRITE_REG(hw, E1000_RCTL, rctl);
01499 E1000_WRITE_FLUSH(hw);
01500
01501 E1000_WRITE_REG(hw, E1000_RLPML, rlpml);
01502 E1000_WRITE_REG(hw, E1000_RFCTL, rfctl);
01503
01504
01505 E1000_READ_REG(hw, E1000_ROC);
01506 E1000_READ_REG(hw, E1000_RNBC);
01507 E1000_READ_REG(hw, E1000_MPC);
01508 }
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520 static s32 igb_set_pcie_completion_timeout(struct e1000_hw *hw)
01521 {
01522 u32 gcr = E1000_READ_REG(hw, E1000_GCR);
01523 s32 ret_val = E1000_SUCCESS;
01524 u16 pcie_devctl2;
01525
01526
01527 if (gcr & E1000_GCR_CMPL_TMOUT_MASK)
01528 goto out;
01529
01530
01531
01532
01533
01534 if (!(gcr & E1000_GCR_CAP_VER2)) {
01535 gcr |= E1000_GCR_CMPL_TMOUT_10ms;
01536 goto out;
01537 }
01538
01539
01540
01541
01542
01543
01544 ret_val = igb_read_pcie_cap_reg(hw, PCIE_DEVICE_CONTROL2,
01545 &pcie_devctl2);
01546 if (ret_val)
01547 goto out;
01548
01549 pcie_devctl2 |= PCIE_DEVICE_CONTROL2_16ms;
01550
01551 ret_val = igb_write_pcie_cap_reg(hw, PCIE_DEVICE_CONTROL2,
01552 &pcie_devctl2);
01553 out:
01554
01555 gcr &= ~E1000_GCR_CMPL_TMOUT_RESEND;
01556
01557 E1000_WRITE_REG(hw, E1000_GCR, gcr);
01558 return ret_val;
01559 }
01560
01561
01562
01563
01564
01565
01566
01567
01568 void igb_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable)
01569 {
01570 u32 dtxswc = E1000_READ_REG(hw, E1000_DTXSWC);
01571
01572 if (enable)
01573 dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
01574 else
01575 dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
01576
01577 E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc);
01578 }
01579
01580
01581
01582
01583
01584
01585
01586
01587 void igb_vmdq_set_replication_pf(struct e1000_hw *hw, bool enable)
01588 {
01589 u32 vt_ctl = E1000_READ_REG(hw, E1000_VT_CTL);
01590
01591 if (enable)
01592 vt_ctl |= E1000_VT_CTL_VM_REPL_EN;
01593 else
01594 vt_ctl &= ~E1000_VT_CTL_VM_REPL_EN;
01595
01596 E1000_WRITE_REG(hw, E1000_VT_CTL, vt_ctl);
01597 }
01598
01599 static struct pci_device_id igb_82575_nics[] = {
01600 PCI_ROM(0x8086, 0x10C9, "E1000_DEV_ID_82576", "E1000_DEV_ID_82576", 0),
01601 PCI_ROM(0x8086, 0x150A, "E1000_DEV_ID_82576_NS", "E1000_DEV_ID_82576_NS", 0),
01602 PCI_ROM(0x8086, 0x1518, "E1000_DEV_ID_82576_NS_SERDES", "E1000_DEV_ID_82576_NS_SERDES", 0),
01603 PCI_ROM(0x8086, 0x10E6, "E1000_DEV_ID_82576_FIBER", "E1000_DEV_ID_82576_FIBER", 0),
01604 PCI_ROM(0x8086, 0x10E7, "E1000_DEV_ID_82576_SERDES", "E1000_DEV_ID_82576_SERDES", 0),
01605 PCI_ROM(0x8086, 0x150D, "E1000_DEV_ID_82576_SERDES_QUAD", "E1000_DEV_ID_82576_SERDES_QUAD", 0),
01606 PCI_ROM(0x8086, 0x10E8, "E1000_DEV_ID_82576_QUAD_COPPER", "E1000_DEV_ID_82576_QUAD_COPPER", 0),
01607 PCI_ROM(0x8086, 0x10A7, "E1000_DEV_ID_82575EB_COPPER", "E1000_DEV_ID_82575EB_COPPER", 0),
01608 PCI_ROM(0x8086, 0x10A9, "E1000_DEV_ID_82575EB_FIBER_SERDES", "E1000_DEV_ID_82575EB_FIBER_SERDES", 0),
01609 PCI_ROM(0x8086, 0x10D6, "E1000_DEV_ID_82575GB_QUAD_COPPER", "E1000_DEV_ID_82575GB_QUAD_COPPER", 0),
01610 };
01611
01612 struct pci_driver igb_82575_driver __pci_driver = {
01613 .ids = igb_82575_nics,
01614 .id_count = (sizeof (igb_82575_nics) / sizeof (igb_82575_nics[0])),
01615 .probe = igb_probe,
01616 .remove = igb_remove,
01617 };