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
00029 FILE_LICENCE ( GPL2_OR_LATER );
00030
00031 #include "e1000e.h"
00032
00033 static s32 e1000e_copper_link_autoneg(struct e1000_hw *hw);
00034 static s32 e1000e_phy_setup_autoneg(struct e1000_hw *hw);
00035 static u32 e1000e_get_phy_addr_for_bm_page(u32 page, u32 reg);
00036 static s32 e1000e_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
00037 u16 *data, bool read);
00038 static u32 e1000e_get_phy_addr_for_hv_page(u32 page);
00039 static s32 e1000e_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
00040 u16 *data, bool read);
00041 #if 0
00042
00043 static const u16 e1000_m88_cable_length_table[] =
00044 { 0, 50, 80, 110, 140, 140, E1000_CABLE_LENGTH_UNDEFINED };
00045 #define M88E1000_CABLE_LENGTH_TABLE_SIZE \
00046 (sizeof(e1000_m88_cable_length_table) / \
00047 sizeof(e1000_m88_cable_length_table[0]))
00048
00049 static const u16 e1000_igp_2_cable_length_table[] =
00050 { 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21,
00051 0, 0, 0, 3, 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41,
00052 6, 10, 14, 18, 22, 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61,
00053 21, 26, 31, 35, 40, 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82,
00054 40, 45, 51, 56, 61, 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104,
00055 60, 66, 72, 77, 82, 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121,
00056 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124,
00057 104, 109, 114, 118, 121, 124};
00058 #define IGP02E1000_CABLE_LENGTH_TABLE_SIZE \
00059 (sizeof(e1000_igp_2_cable_length_table) / \
00060 sizeof(e1000_igp_2_cable_length_table[0]))
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 s32 e1000e_check_reset_block_generic(struct e1000_hw *hw)
00072 {
00073 u32 manc;
00074
00075 manc = er32(MANC);
00076
00077 return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?
00078 E1000_BLK_PHY_RESET : E1000_SUCCESS;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088 s32 e1000e_get_phy_id(struct e1000_hw *hw)
00089 {
00090 struct e1000_phy_info *phy = &hw->phy;
00091 s32 ret_val = E1000_SUCCESS;
00092 u16 phy_id;
00093 u16 retry_count = 0;
00094
00095 if (!(phy->ops.read_reg))
00096 goto out;
00097
00098 while (retry_count < 2) {
00099 ret_val = e1e_rphy(hw, PHY_ID1, &phy_id);
00100 if (ret_val)
00101 goto out;
00102
00103 phy->id = (u32)(phy_id << 16);
00104 udelay(20);
00105 ret_val = e1e_rphy(hw, PHY_ID2, &phy_id);
00106 if (ret_val)
00107 goto out;
00108
00109 phy->id |= (u32)(phy_id & PHY_REVISION_MASK);
00110 phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK);
00111
00112 if (phy->id != 0 && phy->id != PHY_REVISION_MASK)
00113 goto out;
00114
00115
00116
00117
00118
00119
00120
00121 ret_val = phy->ops.acquire(hw);
00122 if (ret_val)
00123 goto out;
00124 ret_val = e1000e_set_mdio_slow_mode_hv(hw, true);
00125 if (ret_val)
00126 goto out;
00127 phy->ops.release(hw);
00128
00129 retry_count++;
00130 }
00131 out:
00132
00133 if (retry_count) {
00134 ret_val = phy->ops.acquire(hw);
00135 if (ret_val)
00136 return ret_val;
00137 ret_val = e1000e_set_mdio_slow_mode_hv(hw, false);
00138 phy->ops.release(hw);
00139 }
00140
00141 return ret_val;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150 s32 e1000e_phy_reset_dsp(struct e1000_hw *hw)
00151 {
00152 s32 ret_val = E1000_SUCCESS;
00153
00154 if (!(hw->phy.ops.write_reg))
00155 goto out;
00156
00157 ret_val = e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0xC1);
00158 if (ret_val)
00159 goto out;
00160
00161 ret_val = e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0);
00162
00163 out:
00164 return ret_val;
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data)
00177 {
00178 struct e1000_phy_info *phy = &hw->phy;
00179 u32 i, mdic = 0;
00180 s32 ret_val = E1000_SUCCESS;
00181
00182
00183
00184
00185
00186
00187 mdic = ((offset << E1000_MDIC_REG_SHIFT) |
00188 (phy->addr << E1000_MDIC_PHY_SHIFT) |
00189 (E1000_MDIC_OP_READ));
00190
00191 ew32(MDIC, mdic);
00192
00193
00194
00195
00196
00197
00198 for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
00199 udelay(50);
00200 mdic = er32(MDIC);
00201 if (mdic & E1000_MDIC_READY)
00202 break;
00203 }
00204 if (!(mdic & E1000_MDIC_READY)) {
00205 e_dbg("MDI Read did not complete\n");
00206 ret_val = -E1000_ERR_PHY;
00207 goto out;
00208 }
00209 if (mdic & E1000_MDIC_ERROR) {
00210 e_dbg("MDI Error\n");
00211 ret_val = -E1000_ERR_PHY;
00212 goto out;
00213 }
00214 *data = (u16) mdic;
00215
00216 out:
00217 return ret_val;
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data)
00229 {
00230 struct e1000_phy_info *phy = &hw->phy;
00231 u32 i, mdic = 0;
00232 s32 ret_val = E1000_SUCCESS;
00233
00234
00235
00236
00237
00238
00239 mdic = (((u32)data) |
00240 (offset << E1000_MDIC_REG_SHIFT) |
00241 (phy->addr << E1000_MDIC_PHY_SHIFT) |
00242 (E1000_MDIC_OP_WRITE));
00243
00244 ew32(MDIC, mdic);
00245
00246
00247
00248
00249
00250
00251 for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
00252 udelay(50);
00253 mdic = er32(MDIC);
00254 if (mdic & E1000_MDIC_READY)
00255 break;
00256 }
00257 if (!(mdic & E1000_MDIC_READY)) {
00258 e_dbg("MDI Write did not complete\n");
00259 ret_val = -E1000_ERR_PHY;
00260 goto out;
00261 }
00262 if (mdic & E1000_MDIC_ERROR) {
00263 e_dbg("MDI Error\n");
00264 ret_val = -E1000_ERR_PHY;
00265 goto out;
00266 }
00267
00268 out:
00269 return ret_val;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data)
00283 {
00284 s32 ret_val = E1000_SUCCESS;
00285
00286 if (!(hw->phy.ops.acquire))
00287 goto out;
00288
00289 ret_val = hw->phy.ops.acquire(hw);
00290 if (ret_val)
00291 goto out;
00292
00293 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
00294 data);
00295
00296 hw->phy.ops.release(hw);
00297
00298 out:
00299 return ret_val;
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311 s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data)
00312 {
00313 s32 ret_val = E1000_SUCCESS;
00314
00315 if (!(hw->phy.ops.acquire))
00316 goto out;
00317
00318 ret_val = hw->phy.ops.acquire(hw);
00319 if (ret_val)
00320 goto out;
00321
00322 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
00323 data);
00324
00325 hw->phy.ops.release(hw);
00326
00327 out:
00328 return ret_val;
00329 }
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data,
00343 bool locked)
00344 {
00345 s32 ret_val = E1000_SUCCESS;
00346
00347 if (!locked) {
00348 if (!(hw->phy.ops.acquire))
00349 goto out;
00350
00351 ret_val = hw->phy.ops.acquire(hw);
00352 if (ret_val)
00353 goto out;
00354 }
00355
00356 if (offset > MAX_PHY_MULTI_PAGE_REG) {
00357 ret_val = e1000e_write_phy_reg_mdic(hw,
00358 IGP01E1000_PHY_PAGE_SELECT,
00359 (u16)offset);
00360 if (ret_val)
00361 goto release;
00362 }
00363
00364 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
00365 data);
00366
00367 release:
00368 if (!locked)
00369 hw->phy.ops.release(hw);
00370 out:
00371 return ret_val;
00372 }
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data)
00385 {
00386 return __e1000e_read_phy_reg_igp(hw, offset, data, false);
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 s32 e1000e_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data)
00399 {
00400 return __e1000e_read_phy_reg_igp(hw, offset, data, true);
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data,
00414 bool locked)
00415 {
00416 s32 ret_val = E1000_SUCCESS;
00417
00418 if (!locked) {
00419 if (!(hw->phy.ops.acquire))
00420 goto out;
00421
00422 ret_val = hw->phy.ops.acquire(hw);
00423 if (ret_val)
00424 goto out;
00425 }
00426
00427 if (offset > MAX_PHY_MULTI_PAGE_REG) {
00428 ret_val = e1000e_write_phy_reg_mdic(hw,
00429 IGP01E1000_PHY_PAGE_SELECT,
00430 (u16)offset);
00431 if (ret_val)
00432 goto release;
00433 }
00434
00435 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
00436 data);
00437
00438 release:
00439 if (!locked)
00440 hw->phy.ops.release(hw);
00441
00442 out:
00443 return ret_val;
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455 s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data)
00456 {
00457 return __e1000e_write_phy_reg_igp(hw, offset, data, false);
00458 }
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469 s32 e1000e_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data)
00470 {
00471 return __e1000e_write_phy_reg_igp(hw, offset, data, true);
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485 static s32 __e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
00486 bool locked)
00487 {
00488 u32 kmrnctrlsta;
00489 s32 ret_val = E1000_SUCCESS;
00490
00491 if (!locked) {
00492 if (!(hw->phy.ops.acquire))
00493 goto out;
00494
00495 ret_val = hw->phy.ops.acquire(hw);
00496 if (ret_val)
00497 goto out;
00498 }
00499
00500 kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
00501 E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
00502 ew32(KMRNCTRLSTA, kmrnctrlsta);
00503
00504 udelay(2);
00505
00506 kmrnctrlsta = er32(KMRNCTRLSTA);
00507 *data = (u16)kmrnctrlsta;
00508
00509 if (!locked)
00510 hw->phy.ops.release(hw);
00511
00512 out:
00513 return ret_val;
00514 }
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526 s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data)
00527 {
00528 return __e1000e_read_kmrn_reg(hw, offset, data, false);
00529 }
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data)
00542 {
00543 return __e1000e_read_kmrn_reg(hw, offset, data, true);
00544 }
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 static s32 __e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
00558 bool locked)
00559 {
00560 u32 kmrnctrlsta;
00561 s32 ret_val = E1000_SUCCESS;
00562
00563 if (!locked) {
00564 if (!(hw->phy.ops.acquire))
00565 goto out;
00566
00567 ret_val = hw->phy.ops.acquire(hw);
00568 if (ret_val)
00569 goto out;
00570 }
00571
00572 kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
00573 E1000_KMRNCTRLSTA_OFFSET) | data;
00574 ew32(KMRNCTRLSTA, kmrnctrlsta);
00575
00576 udelay(2);
00577
00578 if (!locked)
00579 hw->phy.ops.release(hw);
00580
00581 out:
00582 return ret_val;
00583 }
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594 s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data)
00595 {
00596 return __e1000e_write_kmrn_reg(hw, offset, data, false);
00597 }
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608 s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data)
00609 {
00610 return __e1000e_write_kmrn_reg(hw, offset, data, true);
00611 }
00612
00613
00614
00615
00616
00617
00618
00619 s32 e1000e_copper_link_setup_82577(struct e1000_hw *hw)
00620 {
00621 struct e1000_phy_info *phy = &hw->phy;
00622 s32 ret_val;
00623 u16 phy_data;
00624
00625 if (phy->reset_disable) {
00626 ret_val = E1000_SUCCESS;
00627 goto out;
00628 }
00629
00630
00631 ret_val = e1e_rphy(hw, I82577_CFG_REG, &phy_data);
00632 if (ret_val)
00633 goto out;
00634
00635 phy_data |= I82577_CFG_ASSERT_CRS_ON_TX;
00636
00637
00638 phy_data |= I82577_CFG_ENABLE_DOWNSHIFT;
00639
00640 ret_val = e1e_wphy(hw, I82577_CFG_REG, phy_data);
00641
00642 out:
00643 return ret_val;
00644 }
00645
00646
00647
00648
00649
00650
00651
00652
00653 s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw)
00654 {
00655 struct e1000_phy_info *phy = &hw->phy;
00656 s32 ret_val;
00657 u16 phy_data;
00658
00659 if (phy->reset_disable) {
00660 ret_val = E1000_SUCCESS;
00661 goto out;
00662 }
00663
00664
00665 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
00666 if (ret_val)
00667 goto out;
00668
00669
00670 if (phy->type != e1000_phy_bm)
00671 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
00682
00683 switch (phy->mdix) {
00684 case 1:
00685 phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
00686 break;
00687 case 2:
00688 phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
00689 break;
00690 case 3:
00691 phy_data |= M88E1000_PSCR_AUTO_X_1000T;
00692 break;
00693 case 0:
00694 default:
00695 phy_data |= M88E1000_PSCR_AUTO_X_MODE;
00696 break;
00697 }
00698
00699
00700
00701
00702
00703
00704
00705
00706 phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
00707 if (phy->disable_polarity_correction == 1)
00708 phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
00709
00710
00711 if (phy->type == e1000_phy_bm)
00712 phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT;
00713
00714 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
00715 if (ret_val)
00716 goto out;
00717
00718 if ((phy->type == e1000_phy_m88) &&
00719 (phy->revision < E1000_REVISION_4) &&
00720 (phy->id != BME1000_E_PHY_ID_R2)) {
00721
00722
00723
00724
00725 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL,
00726 &phy_data);
00727 if (ret_val)
00728 goto out;
00729
00730 phy_data |= M88E1000_EPSCR_TX_CLK_25;
00731
00732 if ((phy->revision == E1000_REVISION_2) &&
00733 (phy->id == M88E1111_I_PHY_ID)) {
00734
00735 phy_data &= ~M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK;
00736 phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X;
00737 } else {
00738
00739 phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
00740 M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
00741 phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
00742 M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
00743 }
00744 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL,
00745 phy_data);
00746 if (ret_val)
00747 goto out;
00748 }
00749
00750 if ((phy->type == e1000_phy_bm) && (phy->id == BME1000_E_PHY_ID_R2)) {
00751
00752 ret_val = e1e_wphy(hw, 29, 0x0003);
00753 if (ret_val)
00754 goto out;
00755
00756
00757 ret_val = e1e_wphy(hw, 30, 0x0000);
00758 if (ret_val)
00759 goto out;
00760 }
00761
00762
00763 ret_val = e1000e_commit_phy(hw);
00764 if (ret_val) {
00765 e_dbg("Error committing the PHY changes\n");
00766 goto out;
00767 }
00768
00769 if (phy->type == e1000_phy_82578) {
00770 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL,
00771 &phy_data);
00772 if (ret_val)
00773 goto out;
00774
00775
00776 phy_data |= I82578_EPSCR_DOWNSHIFT_ENABLE;
00777 phy_data &= ~I82578_EPSCR_DOWNSHIFT_COUNTER_MASK;
00778 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL,
00779 phy_data);
00780 if (ret_val)
00781 goto out;
00782 }
00783
00784 out:
00785 return ret_val;
00786 }
00787
00788
00789
00790
00791
00792
00793
00794
00795 s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw)
00796 {
00797 struct e1000_phy_info *phy = &hw->phy;
00798 s32 ret_val;
00799 u16 data;
00800
00801 if (phy->reset_disable) {
00802 ret_val = E1000_SUCCESS;
00803 goto out;
00804 }
00805
00806 ret_val = e1000e_phy_hw_reset(hw);
00807 if (ret_val) {
00808 e_dbg("Error resetting the PHY.\n");
00809 goto out;
00810 }
00811
00812
00813
00814
00815
00816 msleep(100);
00817
00818
00819
00820
00821
00822 if (phy->type == e1000_phy_igp) {
00823
00824 ret_val = hw->phy.ops.set_d3_lplu_state(hw, false);
00825 if (ret_val) {
00826 e_dbg("Error Disabling LPLU D3\n");
00827 goto out;
00828 }
00829 }
00830
00831
00832 if (hw->phy.ops.set_d0_lplu_state) {
00833 ret_val = hw->phy.ops.set_d0_lplu_state(hw, false);
00834 if (ret_val) {
00835 e_dbg("Error Disabling LPLU D0\n");
00836 goto out;
00837 }
00838 }
00839
00840 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &data);
00841 if (ret_val)
00842 goto out;
00843
00844 data &= ~IGP01E1000_PSCR_AUTO_MDIX;
00845
00846 switch (phy->mdix) {
00847 case 1:
00848 data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
00849 break;
00850 case 2:
00851 data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
00852 break;
00853 case 0:
00854 default:
00855 data |= IGP01E1000_PSCR_AUTO_MDIX;
00856 break;
00857 }
00858 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, data);
00859 if (ret_val)
00860 goto out;
00861
00862
00863 if (hw->mac.autoneg) {
00864
00865
00866
00867
00868
00869 if (phy->autoneg_advertised == ADVERTISE_1000_FULL) {
00870
00871 ret_val = e1e_rphy(hw,
00872 IGP01E1000_PHY_PORT_CONFIG,
00873 &data);
00874 if (ret_val)
00875 goto out;
00876
00877 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
00878 ret_val = e1e_wphy(hw,
00879 IGP01E1000_PHY_PORT_CONFIG,
00880 data);
00881 if (ret_val)
00882 goto out;
00883
00884
00885 ret_val = e1e_rphy(hw, PHY_1000T_CTRL, &data);
00886 if (ret_val)
00887 goto out;
00888
00889 data &= ~CR_1000T_MS_ENABLE;
00890 ret_val = e1e_wphy(hw, PHY_1000T_CTRL, data);
00891 if (ret_val)
00892 goto out;
00893 }
00894
00895 ret_val = e1e_rphy(hw, PHY_1000T_CTRL, &data);
00896 if (ret_val)
00897 goto out;
00898
00899
00900 phy->original_ms_type = (data & CR_1000T_MS_ENABLE) ?
00901 ((data & CR_1000T_MS_VALUE) ?
00902 e1000_ms_force_master :
00903 e1000_ms_force_slave) :
00904 e1000_ms_auto;
00905
00906 switch (phy->ms_type) {
00907 case e1000_ms_force_master:
00908 data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);
00909 break;
00910 case e1000_ms_force_slave:
00911 data |= CR_1000T_MS_ENABLE;
00912 data &= ~(CR_1000T_MS_VALUE);
00913 break;
00914 case e1000_ms_auto:
00915 data &= ~CR_1000T_MS_ENABLE;
00916 default:
00917 break;
00918 }
00919 ret_val = e1e_wphy(hw, PHY_1000T_CTRL, data);
00920 if (ret_val)
00921 goto out;
00922 }
00923
00924 out:
00925 return ret_val;
00926 }
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937 static s32 e1000e_copper_link_autoneg(struct e1000_hw *hw)
00938 {
00939 struct e1000_phy_info *phy = &hw->phy;
00940 s32 ret_val;
00941 u16 phy_ctrl;
00942
00943
00944
00945
00946
00947 phy->autoneg_advertised &= phy->autoneg_mask;
00948
00949
00950
00951
00952
00953 if (phy->autoneg_advertised == 0)
00954 phy->autoneg_advertised = phy->autoneg_mask;
00955
00956 e_dbg("Reconfiguring auto-neg advertisement params\n");
00957 ret_val = e1000e_phy_setup_autoneg(hw);
00958 if (ret_val) {
00959 e_dbg("Error Setting up Auto-Negotiation\n");
00960 goto out;
00961 }
00962 e_dbg("Restarting Auto-Neg\n");
00963
00964
00965
00966
00967
00968 ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_ctrl);
00969 if (ret_val)
00970 goto out;
00971
00972 phy_ctrl |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
00973 ret_val = e1e_wphy(hw, PHY_CONTROL, phy_ctrl);
00974 if (ret_val)
00975 goto out;
00976
00977
00978
00979
00980
00981 if (phy->autoneg_wait_to_complete) {
00982 ret_val = hw->mac.ops.wait_autoneg(hw);
00983 if (ret_val) {
00984 e_dbg("Error while waiting for "
00985 "autoneg to complete\n");
00986 goto out;
00987 }
00988 }
00989
00990 hw->mac.get_link_status = true;
00991
00992 out:
00993 return ret_val;
00994 }
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005 static s32 e1000e_phy_setup_autoneg(struct e1000_hw *hw)
01006 {
01007 struct e1000_phy_info *phy = &hw->phy;
01008 s32 ret_val;
01009 u16 mii_autoneg_adv_reg;
01010 u16 mii_1000t_ctrl_reg = 0;
01011
01012 phy->autoneg_advertised &= phy->autoneg_mask;
01013
01014
01015 ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
01016 if (ret_val)
01017 goto out;
01018
01019 if (phy->autoneg_mask & ADVERTISE_1000_FULL) {
01020
01021 ret_val = e1e_rphy(hw, PHY_1000T_CTRL,
01022 &mii_1000t_ctrl_reg);
01023 if (ret_val)
01024 goto out;
01025 }
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040 mii_autoneg_adv_reg &= ~(NWAY_AR_100TX_FD_CAPS |
01041 NWAY_AR_100TX_HD_CAPS |
01042 NWAY_AR_10T_FD_CAPS |
01043 NWAY_AR_10T_HD_CAPS);
01044 mii_1000t_ctrl_reg &= ~(CR_1000T_HD_CAPS | CR_1000T_FD_CAPS);
01045
01046 e_dbg("autoneg_advertised %x\n", phy->autoneg_advertised);
01047
01048
01049 if (phy->autoneg_advertised & ADVERTISE_10_HALF) {
01050 e_dbg("Advertise 10mb Half duplex\n");
01051 mii_autoneg_adv_reg |= NWAY_AR_10T_HD_CAPS;
01052 }
01053
01054
01055 if (phy->autoneg_advertised & ADVERTISE_10_FULL) {
01056 e_dbg("Advertise 10mb Full duplex\n");
01057 mii_autoneg_adv_reg |= NWAY_AR_10T_FD_CAPS;
01058 }
01059
01060
01061 if (phy->autoneg_advertised & ADVERTISE_100_HALF) {
01062 e_dbg("Advertise 100mb Half duplex\n");
01063 mii_autoneg_adv_reg |= NWAY_AR_100TX_HD_CAPS;
01064 }
01065
01066
01067 if (phy->autoneg_advertised & ADVERTISE_100_FULL) {
01068 e_dbg("Advertise 100mb Full duplex\n");
01069 mii_autoneg_adv_reg |= NWAY_AR_100TX_FD_CAPS;
01070 }
01071
01072
01073 if (phy->autoneg_advertised & ADVERTISE_1000_HALF)
01074 e_dbg("Advertise 1000mb Half duplex request denied!\n");
01075
01076
01077 if (phy->autoneg_advertised & ADVERTISE_1000_FULL) {
01078 e_dbg("Advertise 1000mb Full duplex\n");
01079 mii_1000t_ctrl_reg |= CR_1000T_FD_CAPS;
01080 }
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100 switch (hw->fc.current_mode) {
01101 case e1000_fc_none:
01102
01103
01104
01105
01106 mii_autoneg_adv_reg &= ~(NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
01107 break;
01108 case e1000_fc_rx_pause:
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119 mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
01120 break;
01121 case e1000_fc_tx_pause:
01122
01123
01124
01125
01126 mii_autoneg_adv_reg |= NWAY_AR_ASM_DIR;
01127 mii_autoneg_adv_reg &= ~NWAY_AR_PAUSE;
01128 break;
01129 case e1000_fc_full:
01130
01131
01132
01133
01134 mii_autoneg_adv_reg |= (NWAY_AR_ASM_DIR | NWAY_AR_PAUSE);
01135 break;
01136 default:
01137 e_dbg("Flow control param set incorrectly\n");
01138 ret_val = -E1000_ERR_CONFIG;
01139 goto out;
01140 }
01141
01142 ret_val = e1e_wphy(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
01143 if (ret_val)
01144 goto out;
01145
01146 e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
01147
01148 if (phy->autoneg_mask & ADVERTISE_1000_FULL) {
01149 ret_val = e1e_wphy(hw,
01150 PHY_1000T_CTRL,
01151 mii_1000t_ctrl_reg);
01152 if (ret_val)
01153 goto out;
01154 }
01155
01156 out:
01157 return ret_val;
01158 }
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169 s32 e1000e_setup_copper_link(struct e1000_hw *hw)
01170 {
01171 s32 ret_val;
01172 bool link;
01173
01174 if (hw->mac.autoneg) {
01175
01176
01177
01178
01179 ret_val = e1000e_copper_link_autoneg(hw);
01180 if (ret_val)
01181 goto out;
01182 } else {
01183 #if 0
01184
01185
01186
01187
01188 e_dbg("Forcing Speed and Duplex\n");
01189 ret_val = hw->phy.ops.force_speed_duplex(hw);
01190 if (ret_val) {
01191 e_dbg("Error Forcing Speed and Duplex\n");
01192 goto out;
01193 }
01194 #endif
01195 }
01196
01197
01198
01199
01200
01201 ret_val = e1000e_phy_has_link_generic(hw,
01202 COPPER_LINK_UP_LIMIT,
01203 10,
01204 &link);
01205 if (ret_val)
01206 goto out;
01207
01208 if (link) {
01209 e_dbg("Valid link established!!!\n");
01210 e1000e_config_collision_dist(hw);
01211 ret_val = e1000e_config_fc_after_link_up(hw);
01212 } else {
01213 e_dbg("Unable to establish link!!!\n");
01214 }
01215
01216 out:
01217 return ret_val;
01218 }
01219
01220 #if 0
01221
01222
01223
01224
01225
01226
01227
01228
01229 s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
01230 {
01231 struct e1000_phy_info *phy = &hw->phy;
01232 s32 ret_val;
01233 u16 phy_data;
01234 bool link;
01235
01236 ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data);
01237 if (ret_val)
01238 goto out;
01239
01240 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
01241
01242 ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data);
01243 if (ret_val)
01244 goto out;
01245
01246
01247
01248
01249
01250 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
01251 if (ret_val)
01252 goto out;
01253
01254 phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
01255 phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
01256
01257 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
01258 if (ret_val)
01259 goto out;
01260
01261 e_dbg("IGP PSCR: %X\n", phy_data);
01262
01263 udelay(1);
01264
01265 if (phy->autoneg_wait_to_complete) {
01266 e_dbg("Waiting for forced speed/duplex link on IGP phy.\n");
01267
01268 ret_val = e1000e_phy_has_link_generic(hw,
01269 PHY_FORCE_LIMIT,
01270 100000,
01271 &link);
01272 if (ret_val)
01273 goto out;
01274
01275 if (!link)
01276 e_dbg("Link taking longer than expected.\n");
01277
01278
01279 ret_val = e1000e_phy_has_link_generic(hw,
01280 PHY_FORCE_LIMIT,
01281 100000,
01282 &link);
01283 if (ret_val)
01284 goto out;
01285 }
01286
01287 out:
01288 return ret_val;
01289 }
01290 #endif
01291
01292 #if 0
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303 s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw)
01304 {
01305 struct e1000_phy_info *phy = &hw->phy;
01306 s32 ret_val;
01307 u16 phy_data;
01308 bool link;
01309
01310
01311
01312
01313
01314 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
01315 if (ret_val)
01316 goto out;
01317
01318 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
01319 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
01320 if (ret_val)
01321 goto out;
01322
01323 e_dbg("M88E1000 PSCR: %X\n", phy_data);
01324
01325 ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data);
01326 if (ret_val)
01327 goto out;
01328
01329 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
01330
01331 ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data);
01332 if (ret_val)
01333 goto out;
01334
01335
01336 ret_val = e1000e_commit_phy(hw);
01337 if (ret_val)
01338 goto out;
01339
01340 if (phy->autoneg_wait_to_complete) {
01341 e_dbg("Waiting for forced speed/duplex link on M88 phy.\n");
01342
01343 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
01344 100000, &link);
01345 if (ret_val)
01346 goto out;
01347
01348 if (!link) {
01349
01350
01351
01352
01353 ret_val = e1e_wphy(hw,
01354 M88E1000_PHY_PAGE_SELECT,
01355 0x001d);
01356 if (ret_val)
01357 goto out;
01358 ret_val = e1000e_phy_reset_dsp(hw);
01359 if (ret_val)
01360 goto out;
01361 }
01362
01363
01364 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
01365 100000, &link);
01366 if (ret_val)
01367 goto out;
01368 }
01369
01370 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
01371 if (ret_val)
01372 goto out;
01373
01374
01375
01376
01377
01378
01379 phy_data |= M88E1000_EPSCR_TX_CLK_25;
01380 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
01381 if (ret_val)
01382 goto out;
01383
01384
01385
01386
01387
01388 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
01389 if (ret_val)
01390 goto out;
01391
01392 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
01393 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
01394
01395 out:
01396 return ret_val;
01397 }
01398 #endif
01399
01400 #if 0
01401
01402
01403
01404
01405
01406
01407
01408
01409 s32 e1000e_phy_force_speed_duplex_ife(struct e1000_hw *hw)
01410 {
01411 struct e1000_phy_info *phy = &hw->phy;
01412 s32 ret_val;
01413 u16 data;
01414 bool link;
01415
01416 if (phy->type != e1000_phy_ife) {
01417 ret_val = e1000e_phy_force_speed_duplex_igp(hw);
01418 goto out;
01419 }
01420
01421 ret_val = e1e_rphy(hw, PHY_CONTROL, &data);
01422 if (ret_val)
01423 goto out;
01424
01425 e1000e_phy_force_speed_duplex_setup(hw, &data);
01426
01427 ret_val = e1e_wphy(hw, PHY_CONTROL, data);
01428 if (ret_val)
01429 goto out;
01430
01431
01432 ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data);
01433 if (ret_val)
01434 goto out;
01435
01436 data &= ~IFE_PMC_AUTO_MDIX;
01437 data &= ~IFE_PMC_FORCE_MDIX;
01438
01439 ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, data);
01440 if (ret_val)
01441 goto out;
01442
01443 e_dbg("IFE PMC: %X\n", data);
01444
01445 udelay(1);
01446
01447 if (phy->autoneg_wait_to_complete) {
01448 e_dbg("Waiting for forced speed/duplex link on IFE phy.\n");
01449
01450 ret_val = e1000e_phy_has_link_generic(hw,
01451 PHY_FORCE_LIMIT,
01452 100000,
01453 &link);
01454 if (ret_val)
01455 goto out;
01456
01457 if (!link)
01458 e_dbg("Link taking longer than expected.\n");
01459
01460
01461 ret_val = e1000e_phy_has_link_generic(hw,
01462 PHY_FORCE_LIMIT,
01463 100000,
01464 &link);
01465 if (ret_val)
01466 goto out;
01467 }
01468
01469 out:
01470 return ret_val;
01471 }
01472 #endif
01473
01474 #if 0
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487 void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl)
01488 {
01489 struct e1000_mac_info *mac = &hw->mac;
01490 u32 ctrl;
01491
01492
01493 hw->fc.current_mode = e1000_fc_none;
01494
01495
01496 ctrl = er32(CTRL);
01497 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
01498 ctrl &= ~E1000_CTRL_SPD_SEL;
01499
01500
01501 ctrl &= ~E1000_CTRL_ASDE;
01502
01503
01504 *phy_ctrl &= ~MII_CR_AUTO_NEG_EN;
01505
01506
01507 if (mac->forced_speed_duplex & E1000_ALL_HALF_DUPLEX) {
01508 ctrl &= ~E1000_CTRL_FD;
01509 *phy_ctrl &= ~MII_CR_FULL_DUPLEX;
01510 e_dbg("Half Duplex\n");
01511 } else {
01512 ctrl |= E1000_CTRL_FD;
01513 *phy_ctrl |= MII_CR_FULL_DUPLEX;
01514 e_dbg("Full Duplex\n");
01515 }
01516
01517
01518 if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) {
01519 ctrl |= E1000_CTRL_SPD_100;
01520 *phy_ctrl |= MII_CR_SPEED_100;
01521 *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_10);
01522 e_dbg("Forcing 100mb\n");
01523 } else {
01524 ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
01525 *phy_ctrl |= MII_CR_SPEED_10;
01526 *phy_ctrl &= ~(MII_CR_SPEED_1000 | MII_CR_SPEED_100);
01527 e_dbg("Forcing 10mb\n");
01528 }
01529
01530 e1000e_config_collision_dist(hw);
01531
01532 ew32(CTRL, ctrl);
01533 }
01534 #endif
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550 s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active)
01551 {
01552 struct e1000_phy_info *phy = &hw->phy;
01553 s32 ret_val = E1000_SUCCESS;
01554 u16 data;
01555
01556 if (!(hw->phy.ops.read_reg))
01557 goto out;
01558
01559 ret_val = e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &data);
01560 if (ret_val)
01561 goto out;
01562
01563 if (!active) {
01564 data &= ~IGP02E1000_PM_D3_LPLU;
01565 ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT,
01566 data);
01567 if (ret_val)
01568 goto out;
01569
01570
01571
01572
01573
01574
01575 if (phy->smart_speed == e1000_smart_speed_on) {
01576 ret_val = e1e_rphy(hw,
01577 IGP01E1000_PHY_PORT_CONFIG,
01578 &data);
01579 if (ret_val)
01580 goto out;
01581
01582 data |= IGP01E1000_PSCFR_SMART_SPEED;
01583 ret_val = e1e_wphy(hw,
01584 IGP01E1000_PHY_PORT_CONFIG,
01585 data);
01586 if (ret_val)
01587 goto out;
01588 } else if (phy->smart_speed == e1000_smart_speed_off) {
01589 ret_val = e1e_rphy(hw,
01590 IGP01E1000_PHY_PORT_CONFIG,
01591 &data);
01592 if (ret_val)
01593 goto out;
01594
01595 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
01596 ret_val = e1e_wphy(hw,
01597 IGP01E1000_PHY_PORT_CONFIG,
01598 data);
01599 if (ret_val)
01600 goto out;
01601 }
01602 } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
01603 (phy->autoneg_advertised == E1000_ALL_NOT_GIG) ||
01604 (phy->autoneg_advertised == E1000_ALL_10_SPEED)) {
01605 data |= IGP02E1000_PM_D3_LPLU;
01606 ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT,
01607 data);
01608 if (ret_val)
01609 goto out;
01610
01611
01612 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
01613 &data);
01614 if (ret_val)
01615 goto out;
01616
01617 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
01618 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
01619 data);
01620 }
01621
01622 out:
01623 return ret_val;
01624 }
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634 s32 e1000e_check_downshift(struct e1000_hw *hw)
01635 {
01636 struct e1000_phy_info *phy = &hw->phy;
01637 s32 ret_val;
01638 u16 phy_data, offset, mask;
01639
01640 switch (phy->type) {
01641 case e1000_phy_m88:
01642 case e1000_phy_gg82563:
01643 case e1000_phy_bm:
01644 case e1000_phy_82578:
01645 offset = M88E1000_PHY_SPEC_STATUS;
01646 mask = M88E1000_PSSR_DOWNSHIFT;
01647 break;
01648 case e1000_phy_igp_2:
01649 case e1000_phy_igp:
01650 case e1000_phy_igp_3:
01651 offset = IGP01E1000_PHY_LINK_HEALTH;
01652 mask = IGP01E1000_PLHR_SS_DOWNGRADE;
01653 break;
01654 default:
01655
01656 phy->speed_downgraded = false;
01657 ret_val = E1000_SUCCESS;
01658 goto out;
01659 }
01660
01661 ret_val = e1e_rphy(hw, offset, &phy_data);
01662
01663 if (!ret_val)
01664 phy->speed_downgraded = (phy_data & mask) ? true : false;
01665
01666 out:
01667 return ret_val;
01668 }
01669
01670
01671
01672
01673
01674
01675
01676
01677
01678 s32 e1000e_check_polarity_m88(struct e1000_hw *hw)
01679 {
01680 struct e1000_phy_info *phy = &hw->phy;
01681 s32 ret_val;
01682 u16 data;
01683
01684 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &data);
01685
01686 if (!ret_val)
01687 phy->cable_polarity = (data & M88E1000_PSSR_REV_POLARITY)
01688 ? e1000_rev_polarity_reversed
01689 : e1000_rev_polarity_normal;
01690
01691 return ret_val;
01692 }
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703 s32 e1000e_check_polarity_igp(struct e1000_hw *hw)
01704 {
01705 struct e1000_phy_info *phy = &hw->phy;
01706 s32 ret_val;
01707 u16 data, offset, mask;
01708
01709
01710
01711
01712
01713 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data);
01714 if (ret_val)
01715 goto out;
01716
01717 if ((data & IGP01E1000_PSSR_SPEED_MASK) ==
01718 IGP01E1000_PSSR_SPEED_1000MBPS) {
01719 offset = IGP01E1000_PHY_PCS_INIT_REG;
01720 mask = IGP01E1000_PHY_POLARITY_MASK;
01721 } else {
01722
01723
01724
01725
01726 offset = IGP01E1000_PHY_PORT_STATUS;
01727 mask = IGP01E1000_PSSR_POLARITY_REVERSED;
01728 }
01729
01730 ret_val = e1e_rphy(hw, offset, &data);
01731
01732 if (!ret_val)
01733 phy->cable_polarity = (data & mask)
01734 ? e1000_rev_polarity_reversed
01735 : e1000_rev_polarity_normal;
01736
01737 out:
01738 return ret_val;
01739 }
01740
01741
01742
01743
01744
01745
01746
01747 s32 e1000e_check_polarity_ife(struct e1000_hw *hw)
01748 {
01749 struct e1000_phy_info *phy = &hw->phy;
01750 s32 ret_val;
01751 u16 phy_data, offset, mask;
01752
01753
01754
01755
01756 if (phy->polarity_correction) {
01757 offset = IFE_PHY_EXTENDED_STATUS_CONTROL;
01758 mask = IFE_PESC_POLARITY_REVERSED;
01759 } else {
01760 offset = IFE_PHY_SPECIAL_CONTROL;
01761 mask = IFE_PSC_FORCE_POLARITY;
01762 }
01763
01764 ret_val = e1e_rphy(hw, offset, &phy_data);
01765
01766 if (!ret_val)
01767 phy->cable_polarity = (phy_data & mask)
01768 ? e1000_rev_polarity_reversed
01769 : e1000_rev_polarity_normal;
01770
01771 return ret_val;
01772 }
01773
01774
01775
01776
01777
01778
01779
01780
01781 s32 e1000e_wait_autoneg(struct e1000_hw *hw)
01782 {
01783 s32 ret_val = E1000_SUCCESS;
01784 u16 i, phy_status;
01785
01786 if (!(hw->phy.ops.read_reg))
01787 return E1000_SUCCESS;
01788
01789
01790 for (i = PHY_AUTO_NEG_LIMIT; i > 0; i--) {
01791 ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
01792 if (ret_val)
01793 break;
01794 ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
01795 if (ret_val)
01796 break;
01797 if (phy_status & MII_SR_AUTONEG_COMPLETE)
01798 break;
01799 msleep(100);
01800 }
01801
01802
01803
01804
01805
01806 return ret_val;
01807 }
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818 s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
01819 u32 usec_interval, bool *success)
01820 {
01821 s32 ret_val = E1000_SUCCESS;
01822 u16 i, phy_status;
01823
01824 if (!(hw->phy.ops.read_reg))
01825 return E1000_SUCCESS;
01826
01827 for (i = 0; i < iterations; i++) {
01828
01829
01830
01831
01832
01833 ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
01834 if (ret_val) {
01835
01836
01837
01838
01839
01840 udelay(usec_interval);
01841 }
01842 ret_val = e1e_rphy(hw, PHY_STATUS, &phy_status);
01843 if (ret_val)
01844 break;
01845 if (phy_status & MII_SR_LINK_STATUS)
01846 break;
01847 if (usec_interval >= 1000)
01848 mdelay(usec_interval/1000);
01849 else
01850 udelay(usec_interval);
01851 }
01852
01853 *success = (i < iterations) ? true : false;
01854
01855 return ret_val;
01856 }
01857
01858 #if 0
01859
01860
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874 s32 e1000e_get_cable_length_m88(struct e1000_hw *hw)
01875 {
01876 struct e1000_phy_info *phy = &hw->phy;
01877 s32 ret_val;
01878 u16 phy_data, index;
01879
01880 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
01881 if (ret_val)
01882 goto out;
01883
01884 index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
01885 M88E1000_PSSR_CABLE_LENGTH_SHIFT;
01886 if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) {
01887 ret_val = -E1000_ERR_PHY;
01888 goto out;
01889 }
01890
01891 phy->min_cable_length = e1000_m88_cable_length_table[index];
01892 phy->max_cable_length = e1000_m88_cable_length_table[index + 1];
01893
01894 phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
01895
01896 out:
01897 return ret_val;
01898 }
01899
01900
01901
01902
01903
01904
01905
01906
01907
01908
01909
01910
01911 s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw)
01912 {
01913 struct e1000_phy_info *phy = &hw->phy;
01914 s32 ret_val = E1000_SUCCESS;
01915 u16 phy_data, i, agc_value = 0;
01916 u16 cur_agc_index, max_agc_index = 0;
01917 u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1;
01918 u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] =
01919 {IGP02E1000_PHY_AGC_A,
01920 IGP02E1000_PHY_AGC_B,
01921 IGP02E1000_PHY_AGC_C,
01922 IGP02E1000_PHY_AGC_D};
01923
01924
01925 for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) {
01926 ret_val = e1e_rphy(hw, agc_reg_array[i], &phy_data);
01927 if (ret_val)
01928 goto out;
01929
01930
01931
01932
01933
01934
01935
01936 cur_agc_index = (phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) &
01937 IGP02E1000_AGC_LENGTH_MASK;
01938
01939
01940 if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) ||
01941 (cur_agc_index == 0)) {
01942 ret_val = -E1000_ERR_PHY;
01943 goto out;
01944 }
01945
01946
01947 if (e1000_igp_2_cable_length_table[min_agc_index] >
01948 e1000_igp_2_cable_length_table[cur_agc_index])
01949 min_agc_index = cur_agc_index;
01950 if (e1000_igp_2_cable_length_table[max_agc_index] <
01951 e1000_igp_2_cable_length_table[cur_agc_index])
01952 max_agc_index = cur_agc_index;
01953
01954 agc_value += e1000_igp_2_cable_length_table[cur_agc_index];
01955 }
01956
01957 agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] +
01958 e1000_igp_2_cable_length_table[max_agc_index]);
01959 agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2);
01960
01961
01962 phy->min_cable_length = ((agc_value - IGP02E1000_AGC_RANGE) > 0) ?
01963 (agc_value - IGP02E1000_AGC_RANGE) : 0;
01964 phy->max_cable_length = agc_value + IGP02E1000_AGC_RANGE;
01965
01966 phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
01967
01968 out:
01969 return ret_val;
01970 }
01971 #endif
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983 s32 e1000e_get_phy_info_m88(struct e1000_hw *hw)
01984 {
01985 struct e1000_phy_info *phy = &hw->phy;
01986 s32 ret_val;
01987 u16 phy_data;
01988 bool link;
01989
01990 if (phy->media_type != e1000_media_type_copper) {
01991 e_dbg("Phy info is only valid for copper media\n");
01992 ret_val = -E1000_ERR_CONFIG;
01993 goto out;
01994 }
01995
01996 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
01997 if (ret_val)
01998 goto out;
01999
02000 if (!link) {
02001 e_dbg("Phy info is only valid if link is up\n");
02002 ret_val = -E1000_ERR_CONFIG;
02003 goto out;
02004 }
02005
02006 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
02007 if (ret_val)
02008 goto out;
02009
02010 phy->polarity_correction = (phy_data & M88E1000_PSCR_POLARITY_REVERSAL)
02011 ? true : false;
02012
02013 ret_val = e1000e_check_polarity_m88(hw);
02014 if (ret_val)
02015 goto out;
02016
02017 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
02018 if (ret_val)
02019 goto out;
02020
02021 phy->is_mdix = (phy_data & M88E1000_PSSR_MDIX) ? true : false;
02022
02023 if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) {
02024 #if 0
02025 ret_val = e1000e_get_cable_length(hw);
02026 #endif
02027 ret_val = -E1000_ERR_CONFIG;
02028 if (ret_val)
02029 goto out;
02030 #if 0
02031 ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &phy_data);
02032 if (ret_val)
02033 goto out;
02034
02035 phy->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS)
02036 ? e1000_1000t_rx_status_ok
02037 : e1000_1000t_rx_status_not_ok;
02038
02039 phy->remote_rx = (phy_data & SR_1000T_REMOTE_RX_STATUS)
02040 ? e1000_1000t_rx_status_ok
02041 : e1000_1000t_rx_status_not_ok;
02042 #endif
02043 } else {
02044
02045 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
02046 phy->local_rx = e1000_1000t_rx_status_undefined;
02047 phy->remote_rx = e1000_1000t_rx_status_undefined;
02048 }
02049 out:
02050 return ret_val;
02051 }
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062 s32 e1000e_get_phy_info_igp(struct e1000_hw *hw)
02063 {
02064 struct e1000_phy_info *phy = &hw->phy;
02065 s32 ret_val;
02066 u16 data;
02067 bool link;
02068
02069 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
02070 if (ret_val)
02071 goto out;
02072
02073 if (!link) {
02074 e_dbg("Phy info is only valid if link is up\n");
02075 ret_val = -E1000_ERR_CONFIG;
02076 goto out;
02077 }
02078
02079 phy->polarity_correction = true;
02080
02081 ret_val = e1000e_check_polarity_igp(hw);
02082 if (ret_val)
02083 goto out;
02084
02085 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data);
02086 if (ret_val)
02087 goto out;
02088
02089 phy->is_mdix = (data & IGP01E1000_PSSR_MDIX) ? true : false;
02090
02091 if ((data & IGP01E1000_PSSR_SPEED_MASK) ==
02092 IGP01E1000_PSSR_SPEED_1000MBPS) {
02093 #if 0
02094 ret_val = phy->ops.get_cable_length(hw);
02095 #endif
02096 ret_val = -E1000_ERR_CONFIG;
02097 if (ret_val)
02098 goto out;
02099 #if 0
02100 ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &data);
02101 if (ret_val)
02102 goto out;
02103
02104 phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS)
02105 ? e1000_1000t_rx_status_ok
02106 : e1000_1000t_rx_status_not_ok;
02107
02108 phy->remote_rx = (data & SR_1000T_REMOTE_RX_STATUS)
02109 ? e1000_1000t_rx_status_ok
02110 : e1000_1000t_rx_status_not_ok;
02111 #endif
02112 } else {
02113 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
02114 phy->local_rx = e1000_1000t_rx_status_undefined;
02115 phy->remote_rx = e1000_1000t_rx_status_undefined;
02116 }
02117 out:
02118 return ret_val;
02119 }
02120
02121
02122
02123
02124
02125
02126
02127
02128 s32 e1000e_phy_sw_reset(struct e1000_hw *hw)
02129 {
02130 s32 ret_val = E1000_SUCCESS;
02131 u16 phy_ctrl;
02132
02133 if (!(hw->phy.ops.read_reg))
02134 goto out;
02135
02136 ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_ctrl);
02137 if (ret_val)
02138 goto out;
02139
02140 phy_ctrl |= MII_CR_RESET;
02141 ret_val = e1e_wphy(hw, PHY_CONTROL, phy_ctrl);
02142 if (ret_val)
02143 goto out;
02144
02145 udelay(1);
02146
02147 out:
02148 return ret_val;
02149 }
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160 s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw)
02161 {
02162 struct e1000_phy_info *phy = &hw->phy;
02163 s32 ret_val = E1000_SUCCESS;
02164 u32 ctrl;
02165
02166 ret_val = e1000e_check_reset_block(hw);
02167 if (ret_val) {
02168 ret_val = E1000_SUCCESS;
02169 goto out;
02170 }
02171
02172 ret_val = phy->ops.acquire(hw);
02173 if (ret_val)
02174 goto out;
02175
02176 ctrl = er32(CTRL);
02177 ew32(CTRL, ctrl | E1000_CTRL_PHY_RST);
02178 e1e_flush();
02179
02180 udelay(phy->reset_delay_us);
02181
02182 ew32(CTRL, ctrl);
02183 e1e_flush();
02184
02185 udelay(150);
02186
02187 phy->ops.release(hw);
02188
02189 ret_val = phy->ops.get_cfg_done(hw);
02190
02191 out:
02192 return ret_val;
02193 }
02194
02195
02196
02197
02198
02199
02200
02201
02202 s32 e1000e_get_cfg_done(struct e1000_hw *hw __unused)
02203 {
02204 mdelay(10);
02205
02206 return E1000_SUCCESS;
02207 }
02208
02209
02210
02211
02212
02213
02214
02215 s32 e1000e_phy_init_script_igp3(struct e1000_hw *hw)
02216 {
02217 e_dbg("Running IGP 3 PHY init script\n");
02218
02219
02220
02221 e1e_wphy(hw, 0x2F5B, 0x9018);
02222
02223 e1e_wphy(hw, 0x2F52, 0x0000);
02224
02225 e1e_wphy(hw, 0x2FB1, 0x8B24);
02226
02227 e1e_wphy(hw, 0x2FB2, 0xF8F0);
02228
02229 e1e_wphy(hw, 0x2010, 0x10B0);
02230
02231 e1e_wphy(hw, 0x2011, 0x0000);
02232
02233 e1e_wphy(hw, 0x20DD, 0x249A);
02234
02235 e1e_wphy(hw, 0x20DE, 0x00D3);
02236
02237 e1e_wphy(hw, 0x28B4, 0x04CE);
02238
02239 e1e_wphy(hw, 0x2F70, 0x29E4);
02240
02241 e1e_wphy(hw, 0x0000, 0x0140);
02242
02243 e1e_wphy(hw, 0x1F30, 0x1606);
02244
02245 e1e_wphy(hw, 0x1F31, 0xB814);
02246
02247 e1e_wphy(hw, 0x1F35, 0x002A);
02248
02249 e1e_wphy(hw, 0x1F3E, 0x0067);
02250
02251 e1e_wphy(hw, 0x1F54, 0x0065);
02252
02253 e1e_wphy(hw, 0x1F55, 0x002A);
02254
02255 e1e_wphy(hw, 0x1F56, 0x002A);
02256
02257 e1e_wphy(hw, 0x1F72, 0x3FB0);
02258
02259 e1e_wphy(hw, 0x1F76, 0xC0FF);
02260
02261 e1e_wphy(hw, 0x1F77, 0x1DEC);
02262
02263 e1e_wphy(hw, 0x1F78, 0xF9EF);
02264
02265 e1e_wphy(hw, 0x1F79, 0x0210);
02266
02267 e1e_wphy(hw, 0x1895, 0x0003);
02268
02269 e1e_wphy(hw, 0x1796, 0x0008);
02270
02271 e1e_wphy(hw, 0x1798, 0xD008);
02272
02273
02274
02275
02276 e1e_wphy(hw, 0x1898, 0xD918);
02277
02278 e1e_wphy(hw, 0x187A, 0x0800);
02279
02280
02281
02282
02283 e1e_wphy(hw, 0x0019, 0x008D);
02284
02285 e1e_wphy(hw, 0x001B, 0x2080);
02286
02287 e1e_wphy(hw, 0x0014, 0x0045);
02288
02289 e1e_wphy(hw, 0x0000, 0x1340);
02290
02291 return E1000_SUCCESS;
02292 }
02293
02294
02295
02296
02297
02298
02299
02300 enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
02301 {
02302 enum e1000_phy_type phy_type = e1000_phy_unknown;
02303
02304 switch (phy_id) {
02305 case M88E1000_I_PHY_ID:
02306 case M88E1000_E_PHY_ID:
02307 case M88E1111_I_PHY_ID:
02308 case M88E1011_I_PHY_ID:
02309 phy_type = e1000_phy_m88;
02310 break;
02311 case IGP01E1000_I_PHY_ID:
02312 phy_type = e1000_phy_igp_2;
02313 break;
02314 case GG82563_E_PHY_ID:
02315 phy_type = e1000_phy_gg82563;
02316 break;
02317 case IGP03E1000_E_PHY_ID:
02318 phy_type = e1000_phy_igp_3;
02319 break;
02320 case IFE_E_PHY_ID:
02321 case IFE_PLUS_E_PHY_ID:
02322 case IFE_C_E_PHY_ID:
02323 phy_type = e1000_phy_ife;
02324 break;
02325 case BME1000_E_PHY_ID:
02326 case BME1000_E_PHY_ID_R2:
02327 phy_type = e1000_phy_bm;
02328 break;
02329 case I82578_E_PHY_ID:
02330 phy_type = e1000_phy_82578;
02331 break;
02332 case I82577_E_PHY_ID:
02333 phy_type = e1000_phy_82577;
02334 break;
02335 default:
02336 phy_type = e1000_phy_unknown;
02337 break;
02338 }
02339 return phy_type;
02340 }
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350 s32 e1000e_determine_phy_address(struct e1000_hw *hw)
02351 {
02352 s32 ret_val = -E1000_ERR_PHY_TYPE;
02353 u32 phy_addr = 0;
02354 u32 i;
02355 enum e1000_phy_type phy_type = e1000_phy_unknown;
02356
02357 hw->phy.id = phy_type;
02358
02359 for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) {
02360 hw->phy.addr = phy_addr;
02361 i = 0;
02362
02363 do {
02364 e1000e_get_phy_id(hw);
02365 phy_type = e1000e_get_phy_type_from_id(hw->phy.id);
02366
02367
02368
02369
02370
02371 if (phy_type != e1000_phy_unknown) {
02372 ret_val = E1000_SUCCESS;
02373 goto out;
02374 }
02375 msleep(1);
02376 i++;
02377 } while (i < 10);
02378 }
02379
02380 out:
02381 return ret_val;
02382 }
02383
02384
02385
02386
02387
02388
02389
02390 static u32 e1000e_get_phy_addr_for_bm_page(u32 page, u32 reg)
02391 {
02392 u32 phy_addr = 2;
02393
02394 if ((page >= 768) || (page == 0 && reg == 25) || (reg == 31))
02395 phy_addr = 1;
02396
02397 return phy_addr;
02398 }
02399
02400
02401
02402
02403
02404
02405
02406
02407
02408
02409 s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
02410 {
02411 s32 ret_val;
02412 u32 page_select = 0;
02413 u32 page = offset >> IGP_PAGE_SHIFT;
02414 u32 page_shift = 0;
02415
02416 ret_val = hw->phy.ops.acquire(hw);
02417 if (ret_val)
02418 return ret_val;
02419
02420
02421 if (page == BM_WUC_PAGE) {
02422 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset, &data,
02423 false);
02424 goto out;
02425 }
02426
02427 hw->phy.addr = e1000e_get_phy_addr_for_bm_page(page, offset);
02428
02429 if (offset > MAX_PHY_MULTI_PAGE_REG) {
02430
02431
02432
02433
02434
02435 if (hw->phy.addr == 1) {
02436 page_shift = IGP_PAGE_SHIFT;
02437 page_select = IGP01E1000_PHY_PAGE_SELECT;
02438 } else {
02439 page_shift = 0;
02440 page_select = BM_PHY_PAGE_SELECT;
02441 }
02442
02443
02444 ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
02445 (page << page_shift));
02446 if (ret_val)
02447 goto out;
02448 }
02449
02450 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
02451 data);
02452
02453 out:
02454 hw->phy.ops.release(hw);
02455 return ret_val;
02456 }
02457
02458
02459
02460
02461
02462
02463
02464
02465
02466
02467
02468 s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
02469 {
02470 s32 ret_val;
02471 u32 page_select = 0;
02472 u32 page = offset >> IGP_PAGE_SHIFT;
02473 u32 page_shift = 0;
02474
02475 ret_val = hw->phy.ops.acquire(hw);
02476 if (ret_val)
02477 return ret_val;
02478
02479
02480 if (page == BM_WUC_PAGE) {
02481 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset, data,
02482 true);
02483 goto out;
02484 }
02485
02486 hw->phy.addr = e1000e_get_phy_addr_for_bm_page(page, offset);
02487
02488 if (offset > MAX_PHY_MULTI_PAGE_REG) {
02489
02490
02491
02492
02493
02494 if (hw->phy.addr == 1) {
02495 page_shift = IGP_PAGE_SHIFT;
02496 page_select = IGP01E1000_PHY_PAGE_SELECT;
02497 } else {
02498 page_shift = 0;
02499 page_select = BM_PHY_PAGE_SELECT;
02500 }
02501
02502
02503 ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
02504 (page << page_shift));
02505 if (ret_val)
02506 goto out;
02507 }
02508
02509 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
02510 data);
02511 out:
02512 hw->phy.ops.release(hw);
02513 return ret_val;
02514 }
02515
02516
02517
02518
02519
02520
02521
02522
02523
02524
02525
02526 s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
02527 {
02528 s32 ret_val;
02529 u16 page = (u16)(offset >> IGP_PAGE_SHIFT);
02530
02531 ret_val = hw->phy.ops.acquire(hw);
02532 if (ret_val)
02533 return ret_val;
02534
02535
02536 if (page == BM_WUC_PAGE) {
02537 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset, data,
02538 true);
02539 goto out;
02540 }
02541
02542 hw->phy.addr = 1;
02543
02544 if (offset > MAX_PHY_MULTI_PAGE_REG) {
02545
02546
02547 ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT,
02548 page);
02549
02550 if (ret_val)
02551 goto out;
02552 }
02553
02554 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
02555 data);
02556 out:
02557 hw->phy.ops.release(hw);
02558 return ret_val;
02559 }
02560
02561
02562
02563
02564
02565
02566
02567
02568
02569
02570 s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
02571 {
02572 s32 ret_val;
02573 u16 page = (u16)(offset >> IGP_PAGE_SHIFT);
02574
02575 ret_val = hw->phy.ops.acquire(hw);
02576 if (ret_val)
02577 return ret_val;
02578
02579
02580 if (page == BM_WUC_PAGE) {
02581 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset, &data,
02582 false);
02583 goto out;
02584 }
02585
02586 hw->phy.addr = 1;
02587
02588 if (offset > MAX_PHY_MULTI_PAGE_REG) {
02589
02590 ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT,
02591 page);
02592
02593 if (ret_val)
02594 goto out;
02595 }
02596
02597 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
02598 data);
02599
02600 out:
02601 hw->phy.ops.release(hw);
02602 return ret_val;
02603 }
02604
02605
02606
02607
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617
02618
02619
02620
02621
02622
02623
02624 static s32 e1000e_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
02625 u16 *data, bool read)
02626 {
02627 s32 ret_val;
02628 u16 reg = BM_PHY_REG_NUM(offset);
02629 u16 phy_reg = 0;
02630
02631
02632 if ((hw->mac.type == e1000_pchlan) &&
02633 (!(er32(PHY_CTRL) & E1000_PHY_CTRL_GBE_DISABLE)))
02634 e_dbg("Attempting to access page 800 while gig enabled.\n");
02635
02636
02637 hw->phy.addr = 1;
02638
02639
02640 e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
02641 (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
02642
02643 ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg);
02644 if (ret_val) {
02645 e_dbg("Could not read PHY page 769\n");
02646 goto out;
02647 }
02648
02649
02650 phy_reg &= ~(BM_WUC_HOST_WU_BIT);
02651 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
02652 if (ret_val) {
02653 e_dbg("Could not clear PHY page 769 bit 4\n");
02654 goto out;
02655 }
02656
02657
02658 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG,
02659 phy_reg | BM_WUC_ENABLE_BIT);
02660 if (ret_val) {
02661 e_dbg("Could not write PHY page 769 bit 2\n");
02662 goto out;
02663 }
02664
02665
02666 ret_val = e1000e_write_phy_reg_mdic(hw,
02667 IGP01E1000_PHY_PAGE_SELECT,
02668 (BM_WUC_PAGE << IGP_PAGE_SHIFT));
02669
02670
02671 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg);
02672 if (ret_val) {
02673 e_dbg("Could not write address opcode to page 800\n");
02674 goto out;
02675 }
02676
02677 if (read) {
02678
02679 ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE,
02680 data);
02681 } else {
02682
02683 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE,
02684 *data);
02685 }
02686
02687 if (ret_val) {
02688 e_dbg("Could not access data value from page 800\n");
02689 goto out;
02690 }
02691
02692
02693
02694
02695
02696 e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
02697 (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
02698
02699
02700 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
02701 if (ret_val) {
02702 e_dbg("Could not clear PHY page 769 bit 2\n");
02703 goto out;
02704 }
02705
02706 out:
02707 return ret_val;
02708 }
02709
02710
02711
02712
02713
02714
02715
02716
02717
02718 void e1000e_power_up_phy_copper(struct e1000_hw *hw)
02719 {
02720 u16 mii_reg = 0;
02721
02722
02723 e1e_rphy(hw, PHY_CONTROL, &mii_reg);
02724 mii_reg &= ~MII_CR_POWER_DOWN;
02725 e1e_wphy(hw, PHY_CONTROL, mii_reg);
02726 }
02727
02728
02729
02730
02731
02732
02733
02734
02735
02736 void e1000e_power_down_phy_copper(struct e1000_hw *hw)
02737 {
02738 u16 mii_reg = 0;
02739
02740
02741 e1e_rphy(hw, PHY_CONTROL, &mii_reg);
02742 mii_reg |= MII_CR_POWER_DOWN;
02743 e1e_wphy(hw, PHY_CONTROL, mii_reg);
02744 msleep(1);
02745 }
02746
02747
02748
02749
02750
02751
02752
02753
02754 s32 e1000e_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow)
02755 {
02756 s32 ret_val = E1000_SUCCESS;
02757 u16 data = 0;
02758
02759
02760 hw->phy.addr = 1;
02761 ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
02762 (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
02763 if (ret_val)
02764 goto out;
02765
02766 ret_val = e1000e_write_phy_reg_mdic(hw, BM_CS_CTRL1,
02767 (0x2180 | (slow << 10)));
02768 if (ret_val)
02769 goto out;
02770
02771
02772 if (!slow)
02773 ret_val = e1000e_read_phy_reg_mdic(hw, BM_CS_CTRL1, &data);
02774
02775 out:
02776 return ret_val;
02777 }
02778
02779
02780
02781
02782
02783
02784
02785
02786
02787
02788
02789
02790 static s32 __e1000e_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data,
02791 bool locked)
02792 {
02793 s32 ret_val;
02794 u16 page = BM_PHY_REG_PAGE(offset);
02795 u16 reg = BM_PHY_REG_NUM(offset);
02796 bool in_slow_mode = false;
02797
02798 if (!locked) {
02799 ret_val = hw->phy.ops.acquire(hw);
02800 if (ret_val)
02801 return ret_val;
02802 }
02803
02804
02805 if ((hw->phy.type == e1000_phy_82577) &&
02806 !(er32(STATUS) & E1000_STATUS_LU)) {
02807 ret_val = e1000e_set_mdio_slow_mode_hv(hw, true);
02808 if (ret_val)
02809 goto out;
02810
02811 in_slow_mode = true;
02812 }
02813
02814
02815 if (page == BM_WUC_PAGE) {
02816 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset,
02817 data, true);
02818 goto out;
02819 }
02820
02821 if (page > 0 && page < HV_INTC_FC_PAGE_START) {
02822 ret_val = e1000e_access_phy_debug_regs_hv(hw, offset,
02823 data, true);
02824 goto out;
02825 }
02826
02827 hw->phy.addr = e1000e_get_phy_addr_for_hv_page(page);
02828
02829 if (page == HV_INTC_FC_PAGE_START)
02830 page = 0;
02831
02832 if (reg > MAX_PHY_MULTI_PAGE_REG) {
02833 u32 phy_addr = hw->phy.addr;
02834
02835 hw->phy.addr = 1;
02836
02837
02838 ret_val = e1000e_write_phy_reg_mdic(hw,
02839 IGP01E1000_PHY_PAGE_SELECT,
02840 (page << IGP_PAGE_SHIFT));
02841 hw->phy.addr = phy_addr;
02842
02843 if (ret_val)
02844 goto out;
02845 }
02846
02847 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg,
02848 data);
02849 out:
02850
02851 if ((hw->phy.type == e1000_phy_82577) && in_slow_mode)
02852 ret_val |= e1000e_set_mdio_slow_mode_hv(hw, false);
02853
02854 if (!locked)
02855 hw->phy.ops.release(hw);
02856
02857 return ret_val;
02858 }
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870 s32 e1000e_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data)
02871 {
02872 return __e1000e_read_phy_reg_hv(hw, offset, data, false);
02873 }
02874
02875
02876
02877
02878
02879
02880
02881
02882
02883
02884 s32 e1000e_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 *data)
02885 {
02886 return __e1000e_read_phy_reg_hv(hw, offset, data, true);
02887 }
02888
02889
02890
02891
02892
02893
02894
02895
02896
02897
02898
02899 static s32 __e1000e_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,
02900 bool locked)
02901 {
02902 s32 ret_val;
02903 u16 page = BM_PHY_REG_PAGE(offset);
02904 u16 reg = BM_PHY_REG_NUM(offset);
02905 bool in_slow_mode = false;
02906
02907 if (!locked) {
02908 ret_val = hw->phy.ops.acquire(hw);
02909 if (ret_val)
02910 return ret_val;
02911 }
02912
02913
02914 if ((hw->phy.type == e1000_phy_82577) &&
02915 !(er32(STATUS) & E1000_STATUS_LU)) {
02916 ret_val = e1000e_set_mdio_slow_mode_hv(hw, true);
02917 if (ret_val)
02918 goto out;
02919
02920 in_slow_mode = true;
02921 }
02922
02923
02924 if (page == BM_WUC_PAGE) {
02925 ret_val = e1000e_access_phy_wakeup_reg_bm(hw, offset,
02926 &data, false);
02927 goto out;
02928 }
02929
02930 if (page > 0 && page < HV_INTC_FC_PAGE_START) {
02931 ret_val = e1000e_access_phy_debug_regs_hv(hw, offset,
02932 &data, false);
02933 goto out;
02934 }
02935
02936 hw->phy.addr = e1000e_get_phy_addr_for_hv_page(page);
02937
02938 if (page == HV_INTC_FC_PAGE_START)
02939 page = 0;
02940
02941
02942
02943
02944
02945 if ((hw->phy.type == e1000_phy_82578) &&
02946 (hw->phy.revision >= 1) &&
02947 (hw->phy.addr == 2) &&
02948 ((MAX_PHY_REG_ADDRESS & reg) == 0) &&
02949 (data & (1 << 11))) {
02950 u16 data2 = 0x7EFF;
02951 ret_val = e1000e_access_phy_debug_regs_hv(hw, (1 << 6) | 0x3,
02952 &data2, false);
02953 if (ret_val)
02954 goto out;
02955 }
02956
02957 if (reg > MAX_PHY_MULTI_PAGE_REG) {
02958 u32 phy_addr = hw->phy.addr;
02959
02960 hw->phy.addr = 1;
02961
02962
02963 ret_val = e1000e_write_phy_reg_mdic(hw,
02964 IGP01E1000_PHY_PAGE_SELECT,
02965 (page << IGP_PAGE_SHIFT));
02966 hw->phy.addr = phy_addr;
02967
02968 if (ret_val)
02969 goto out;
02970 }
02971
02972 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg,
02973 data);
02974
02975 out:
02976
02977 if ((hw->phy.type == e1000_phy_82577) && in_slow_mode)
02978 ret_val |= e1000e_set_mdio_slow_mode_hv(hw, false);
02979
02980 if (!locked)
02981 hw->phy.ops.release(hw);
02982
02983 return ret_val;
02984 }
02985
02986
02987
02988
02989
02990
02991
02992
02993
02994
02995 s32 e1000e_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data)
02996 {
02997 return __e1000e_write_phy_reg_hv(hw, offset, data, false);
02998 }
02999
03000
03001
03002
03003
03004
03005
03006
03007
03008
03009 s32 e1000e_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 data)
03010 {
03011 return __e1000e_write_phy_reg_hv(hw, offset, data, true);
03012 }
03013
03014
03015
03016
03017
03018 static u32 e1000e_get_phy_addr_for_hv_page(u32 page)
03019 {
03020 u32 phy_addr = 2;
03021
03022 if (page >= HV_INTC_FC_PAGE_START)
03023 phy_addr = 1;
03024
03025 return phy_addr;
03026 }
03027
03028
03029
03030
03031
03032
03033
03034
03035
03036
03037
03038
03039 static s32 e1000e_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
03040 u16 *data, bool read)
03041 {
03042 s32 ret_val;
03043 u32 addr_reg = 0;
03044 u32 data_reg = 0;
03045
03046
03047 addr_reg = (hw->phy.type == e1000_phy_82578) ?
03048 I82578_ADDR_REG : I82577_ADDR_REG;
03049 data_reg = addr_reg + 1;
03050
03051
03052 hw->phy.addr = 2;
03053
03054
03055 ret_val = e1000e_write_phy_reg_mdic(hw, addr_reg, (u16)offset & 0x3F);
03056 if (ret_val) {
03057 e_dbg("Could not write PHY the HV address register\n");
03058 goto out;
03059 }
03060
03061
03062 if (read)
03063 ret_val = e1000e_read_phy_reg_mdic(hw, data_reg, data);
03064 else
03065 ret_val = e1000e_write_phy_reg_mdic(hw, data_reg, *data);
03066
03067 if (ret_val) {
03068 e_dbg("Could not read data value from HV data register\n");
03069 goto out;
03070 }
03071
03072 out:
03073 return ret_val;
03074 }
03075
03076
03077
03078
03079
03080
03081
03082
03083
03084
03085
03086
03087 s32 e1000e_link_stall_workaround_hv(struct e1000_hw *hw)
03088 {
03089 s32 ret_val = E1000_SUCCESS;
03090 u16 data;
03091
03092 if (hw->phy.type != e1000_phy_82578)
03093 goto out;
03094
03095
03096 e1e_rphy(hw, PHY_CONTROL, &data);
03097 if (data & PHY_CONTROL_LB)
03098 goto out;
03099
03100
03101 ret_val = e1e_rphy(hw, BM_CS_STATUS, &data);
03102 if (ret_val)
03103 goto out;
03104
03105 data &= BM_CS_STATUS_LINK_UP |
03106 BM_CS_STATUS_RESOLVED |
03107 BM_CS_STATUS_SPEED_MASK;
03108
03109 if (data != (BM_CS_STATUS_LINK_UP |
03110 BM_CS_STATUS_RESOLVED |
03111 BM_CS_STATUS_SPEED_1000))
03112 goto out;
03113
03114 msleep(200);
03115
03116
03117 ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL,
03118 HV_MUX_DATA_CTRL_GEN_TO_MAC |
03119 HV_MUX_DATA_CTRL_FORCE_SPEED);
03120 if (ret_val)
03121 goto out;
03122
03123 ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL,
03124 HV_MUX_DATA_CTRL_GEN_TO_MAC);
03125
03126 out:
03127 return ret_val;
03128 }
03129
03130
03131
03132
03133
03134
03135
03136
03137
03138 s32 e1000e_check_polarity_82577(struct e1000_hw *hw)
03139 {
03140 struct e1000_phy_info *phy = &hw->phy;
03141 s32 ret_val;
03142 u16 data;
03143
03144 ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data);
03145
03146 if (!ret_val)
03147 phy->cable_polarity = (data & I82577_PHY_STATUS2_REV_POLARITY)
03148 ? e1000_rev_polarity_reversed
03149 : e1000_rev_polarity_normal;
03150
03151 return ret_val;
03152 }
03153
03154 #if 0
03155
03156
03157
03158
03159
03160
03161
03162
03163 s32 e1000e_phy_force_speed_duplex_82577(struct e1000_hw *hw)
03164 {
03165 struct e1000_phy_info *phy = &hw->phy;
03166 s32 ret_val;
03167 u16 phy_data;
03168 bool link;
03169
03170 ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data);
03171 if (ret_val)
03172 goto out;
03173
03174 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
03175
03176 ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data);
03177 if (ret_val)
03178 goto out;
03179
03180
03181
03182
03183
03184 ret_val = e1e_rphy(hw, I82577_PHY_CTRL_2, &phy_data);
03185 if (ret_val)
03186 goto out;
03187
03188 phy_data &= ~I82577_PHY_CTRL2_AUTO_MDIX;
03189 phy_data &= ~I82577_PHY_CTRL2_FORCE_MDI_MDIX;
03190
03191 ret_val = e1e_wphy(hw, I82577_PHY_CTRL_2, phy_data);
03192 if (ret_val)
03193 goto out;
03194
03195 e_dbg("I82577_PHY_CTRL_2: %X\n", phy_data);
03196
03197 udelay(1);
03198
03199 if (phy->autoneg_wait_to_complete) {
03200 e_dbg("Waiting for forced speed/duplex link on 82577 phy\n");
03201
03202 ret_val = e1000e_phy_has_link_generic(hw,
03203 PHY_FORCE_LIMIT,
03204 100000,
03205 &link);
03206 if (ret_val)
03207 goto out;
03208
03209 if (!link)
03210 e_dbg("Link taking longer than expected.\n");
03211
03212
03213 ret_val = e1000e_phy_has_link_generic(hw,
03214 PHY_FORCE_LIMIT,
03215 100000,
03216 &link);
03217 if (ret_val)
03218 goto out;
03219 }
03220
03221 out:
03222 return ret_val;
03223 }
03224 #endif
03225
03226
03227
03228
03229
03230
03231
03232
03233
03234
03235 s32 e1000e_get_phy_info_82577(struct e1000_hw *hw)
03236 {
03237 struct e1000_phy_info *phy = &hw->phy;
03238 s32 ret_val;
03239 u16 data;
03240 bool link;
03241
03242 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
03243 if (ret_val)
03244 goto out;
03245
03246 if (!link) {
03247 e_dbg("Phy info is only valid if link is up\n");
03248 ret_val = -E1000_ERR_CONFIG;
03249 goto out;
03250 }
03251
03252 phy->polarity_correction = true;
03253
03254 ret_val = e1000e_check_polarity_82577(hw);
03255 if (ret_val)
03256 goto out;
03257
03258 ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data);
03259 if (ret_val)
03260 goto out;
03261
03262 phy->is_mdix = (data & I82577_PHY_STATUS2_MDIX) ? true : false;
03263
03264 if ((data & I82577_PHY_STATUS2_SPEED_MASK) ==
03265 I82577_PHY_STATUS2_SPEED_1000MBPS) {
03266 #if 0
03267 ret_val = e1000e_get_cable_length(hw);
03268 #endif
03269 ret_val = -E1000_ERR_CONFIG;
03270 if (ret_val)
03271 goto out;
03272 #if 0
03273 ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &data);
03274 if (ret_val)
03275 goto out;
03276
03277 phy->local_rx = (data & SR_1000T_LOCAL_RX_STATUS)
03278 ? e1000_1000t_rx_status_ok
03279 : e1000_1000t_rx_status_not_ok;
03280
03281 phy->remote_rx = (data & SR_1000T_REMOTE_RX_STATUS)
03282 ? e1000_1000t_rx_status_ok
03283 : e1000_1000t_rx_status_not_ok;
03284 #endif
03285 } else {
03286 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
03287 phy->local_rx = e1000_1000t_rx_status_undefined;
03288 phy->remote_rx = e1000_1000t_rx_status_undefined;
03289 }
03290 out:
03291 return ret_val;
03292 }
03293
03294 #if 0
03295
03296
03297
03298
03299
03300
03301
03302 s32 e1000e_get_cable_length_82577(struct e1000_hw *hw)
03303 {
03304 struct e1000_phy_info *phy = &hw->phy;
03305 s32 ret_val;
03306 u16 phy_data, length;
03307
03308 ret_val = e1e_rphy(hw, I82577_PHY_DIAG_STATUS, &phy_data);
03309 if (ret_val)
03310 goto out;
03311
03312 length = (phy_data & I82577_DSTATUS_CABLE_LENGTH) >>
03313 I82577_DSTATUS_CABLE_LENGTH_SHIFT;
03314
03315 if (length == E1000_CABLE_LENGTH_UNDEFINED)
03316 ret_val = -E1000_ERR_PHY;
03317
03318 phy->cable_length = length;
03319
03320 out:
03321 return ret_val;
03322 }
03323 #endif