0001
0002
0003
0004 #include "e1000.h"
0005
0006 static s32 e1000_wait_autoneg(struct e1000_hw *hw);
0007 static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
0008 u16 *data, bool read, bool page_set);
0009 static u32 e1000_get_phy_addr_for_hv_page(u32 page);
0010 static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
0011 u16 *data, bool read);
0012
0013
0014 static const u16 e1000_m88_cable_length_table[] = {
0015 0, 50, 80, 110, 140, 140, E1000_CABLE_LENGTH_UNDEFINED
0016 };
0017
0018 #define M88E1000_CABLE_LENGTH_TABLE_SIZE \
0019 ARRAY_SIZE(e1000_m88_cable_length_table)
0020
0021 static const u16 e1000_igp_2_cable_length_table[] = {
0022 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 18, 21, 0, 0, 0, 3,
0023 6, 10, 13, 16, 19, 23, 26, 29, 32, 35, 38, 41, 6, 10, 14, 18, 22,
0024 26, 30, 33, 37, 41, 44, 48, 51, 54, 58, 61, 21, 26, 31, 35, 40,
0025 44, 49, 53, 57, 61, 65, 68, 72, 75, 79, 82, 40, 45, 51, 56, 61,
0026 66, 70, 75, 79, 83, 87, 91, 94, 98, 101, 104, 60, 66, 72, 77, 82,
0027 87, 92, 96, 100, 104, 108, 111, 114, 117, 119, 121, 83, 89, 95,
0028 100, 105, 109, 113, 116, 119, 122, 124, 104, 109, 114, 118, 121,
0029 124
0030 };
0031
0032 #define IGP02E1000_CABLE_LENGTH_TABLE_SIZE \
0033 ARRAY_SIZE(e1000_igp_2_cable_length_table)
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 s32 e1000e_check_reset_block_generic(struct e1000_hw *hw)
0044 {
0045 u32 manc;
0046
0047 manc = er32(MANC);
0048
0049 return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ? E1000_BLK_PHY_RESET : 0;
0050 }
0051
0052
0053
0054
0055
0056
0057
0058
0059 s32 e1000e_get_phy_id(struct e1000_hw *hw)
0060 {
0061 struct e1000_phy_info *phy = &hw->phy;
0062 s32 ret_val = 0;
0063 u16 phy_id;
0064 u16 retry_count = 0;
0065
0066 if (!phy->ops.read_reg)
0067 return 0;
0068
0069 while (retry_count < 2) {
0070 ret_val = e1e_rphy(hw, MII_PHYSID1, &phy_id);
0071 if (ret_val)
0072 return ret_val;
0073
0074 phy->id = (u32)(phy_id << 16);
0075 usleep_range(20, 40);
0076 ret_val = e1e_rphy(hw, MII_PHYSID2, &phy_id);
0077 if (ret_val)
0078 return ret_val;
0079
0080 phy->id |= (u32)(phy_id & PHY_REVISION_MASK);
0081 phy->revision = (u32)(phy_id & ~PHY_REVISION_MASK);
0082
0083 if (phy->id != 0 && phy->id != PHY_REVISION_MASK)
0084 return 0;
0085
0086 retry_count++;
0087 }
0088
0089 return 0;
0090 }
0091
0092
0093
0094
0095
0096
0097
0098 s32 e1000e_phy_reset_dsp(struct e1000_hw *hw)
0099 {
0100 s32 ret_val;
0101
0102 ret_val = e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0xC1);
0103 if (ret_val)
0104 return ret_val;
0105
0106 return e1e_wphy(hw, M88E1000_PHY_GEN_CONTROL, 0);
0107 }
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data)
0119 {
0120 struct e1000_phy_info *phy = &hw->phy;
0121 u32 i, mdic = 0;
0122
0123 if (offset > MAX_PHY_REG_ADDRESS) {
0124 e_dbg("PHY Address %d is out of range\n", offset);
0125 return -E1000_ERR_PARAM;
0126 }
0127
0128
0129
0130
0131
0132 mdic = ((offset << E1000_MDIC_REG_SHIFT) |
0133 (phy->addr << E1000_MDIC_PHY_SHIFT) |
0134 (E1000_MDIC_OP_READ));
0135
0136 ew32(MDIC, mdic);
0137
0138
0139
0140
0141
0142 for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
0143 udelay(50);
0144 mdic = er32(MDIC);
0145 if (mdic & E1000_MDIC_READY)
0146 break;
0147 }
0148 if (!(mdic & E1000_MDIC_READY)) {
0149 e_dbg("MDI Read PHY Reg Address %d did not complete\n", offset);
0150 return -E1000_ERR_PHY;
0151 }
0152 if (mdic & E1000_MDIC_ERROR) {
0153 e_dbg("MDI Read PHY Reg Address %d Error\n", offset);
0154 return -E1000_ERR_PHY;
0155 }
0156 if (((mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT) != offset) {
0157 e_dbg("MDI Read offset error - requested %d, returned %d\n",
0158 offset,
0159 (mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
0160 return -E1000_ERR_PHY;
0161 }
0162 *data = (u16)mdic;
0163
0164
0165
0166
0167 if (hw->mac.type == e1000_pch2lan)
0168 udelay(100);
0169
0170 return 0;
0171 }
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data)
0182 {
0183 struct e1000_phy_info *phy = &hw->phy;
0184 u32 i, mdic = 0;
0185
0186 if (offset > MAX_PHY_REG_ADDRESS) {
0187 e_dbg("PHY Address %d is out of range\n", offset);
0188 return -E1000_ERR_PARAM;
0189 }
0190
0191
0192
0193
0194
0195 mdic = (((u32)data) |
0196 (offset << E1000_MDIC_REG_SHIFT) |
0197 (phy->addr << E1000_MDIC_PHY_SHIFT) |
0198 (E1000_MDIC_OP_WRITE));
0199
0200 ew32(MDIC, mdic);
0201
0202
0203
0204
0205
0206 for (i = 0; i < (E1000_GEN_POLL_TIMEOUT * 3); i++) {
0207 udelay(50);
0208 mdic = er32(MDIC);
0209 if (mdic & E1000_MDIC_READY)
0210 break;
0211 }
0212 if (!(mdic & E1000_MDIC_READY)) {
0213 e_dbg("MDI Write PHY Reg Address %d did not complete\n", offset);
0214 return -E1000_ERR_PHY;
0215 }
0216 if (mdic & E1000_MDIC_ERROR) {
0217 e_dbg("MDI Write PHY Red Address %d Error\n", offset);
0218 return -E1000_ERR_PHY;
0219 }
0220 if (((mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT) != offset) {
0221 e_dbg("MDI Write offset error - requested %d, returned %d\n",
0222 offset,
0223 (mdic & E1000_MDIC_REG_MASK) >> E1000_MDIC_REG_SHIFT);
0224 return -E1000_ERR_PHY;
0225 }
0226
0227
0228
0229
0230 if (hw->mac.type == e1000_pch2lan)
0231 udelay(100);
0232
0233 return 0;
0234 }
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246 s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data)
0247 {
0248 s32 ret_val;
0249
0250 ret_val = hw->phy.ops.acquire(hw);
0251 if (ret_val)
0252 return ret_val;
0253
0254 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
0255 data);
0256
0257 hw->phy.ops.release(hw);
0258
0259 return ret_val;
0260 }
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data)
0272 {
0273 s32 ret_val;
0274
0275 ret_val = hw->phy.ops.acquire(hw);
0276 if (ret_val)
0277 return ret_val;
0278
0279 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
0280 data);
0281
0282 hw->phy.ops.release(hw);
0283
0284 return ret_val;
0285 }
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 s32 e1000_set_page_igp(struct e1000_hw *hw, u16 page)
0297 {
0298 e_dbg("Setting page 0x%x\n", page);
0299
0300 hw->phy.addr = 1;
0301
0302 return e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, page);
0303 }
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316 static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data,
0317 bool locked)
0318 {
0319 s32 ret_val = 0;
0320
0321 if (!locked) {
0322 if (!hw->phy.ops.acquire)
0323 return 0;
0324
0325 ret_val = hw->phy.ops.acquire(hw);
0326 if (ret_val)
0327 return ret_val;
0328 }
0329
0330 if (offset > MAX_PHY_MULTI_PAGE_REG)
0331 ret_val = e1000e_write_phy_reg_mdic(hw,
0332 IGP01E1000_PHY_PAGE_SELECT,
0333 (u16)offset);
0334 if (!ret_val)
0335 ret_val = e1000e_read_phy_reg_mdic(hw,
0336 MAX_PHY_REG_ADDRESS & offset,
0337 data);
0338 if (!locked)
0339 hw->phy.ops.release(hw);
0340
0341 return ret_val;
0342 }
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354 s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data)
0355 {
0356 return __e1000e_read_phy_reg_igp(hw, offset, data, false);
0357 }
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 s32 e1000e_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data)
0369 {
0370 return __e1000e_read_phy_reg_igp(hw, offset, data, true);
0371 }
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383 static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data,
0384 bool locked)
0385 {
0386 s32 ret_val = 0;
0387
0388 if (!locked) {
0389 if (!hw->phy.ops.acquire)
0390 return 0;
0391
0392 ret_val = hw->phy.ops.acquire(hw);
0393 if (ret_val)
0394 return ret_val;
0395 }
0396
0397 if (offset > MAX_PHY_MULTI_PAGE_REG)
0398 ret_val = e1000e_write_phy_reg_mdic(hw,
0399 IGP01E1000_PHY_PAGE_SELECT,
0400 (u16)offset);
0401 if (!ret_val)
0402 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS &
0403 offset, data);
0404 if (!locked)
0405 hw->phy.ops.release(hw);
0406
0407 return ret_val;
0408 }
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419 s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data)
0420 {
0421 return __e1000e_write_phy_reg_igp(hw, offset, data, false);
0422 }
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433 s32 e1000e_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data)
0434 {
0435 return __e1000e_write_phy_reg_igp(hw, offset, data, true);
0436 }
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
0450 bool locked)
0451 {
0452 u32 kmrnctrlsta;
0453
0454 if (!locked) {
0455 s32 ret_val = 0;
0456
0457 if (!hw->phy.ops.acquire)
0458 return 0;
0459
0460 ret_val = hw->phy.ops.acquire(hw);
0461 if (ret_val)
0462 return ret_val;
0463 }
0464
0465 kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
0466 E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
0467 ew32(KMRNCTRLSTA, kmrnctrlsta);
0468 e1e_flush();
0469
0470 udelay(2);
0471
0472 kmrnctrlsta = er32(KMRNCTRLSTA);
0473 *data = (u16)kmrnctrlsta;
0474
0475 if (!locked)
0476 hw->phy.ops.release(hw);
0477
0478 return 0;
0479 }
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491 s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data)
0492 {
0493 return __e1000_read_kmrn_reg(hw, offset, data, false);
0494 }
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506 s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data)
0507 {
0508 return __e1000_read_kmrn_reg(hw, offset, data, true);
0509 }
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522 static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
0523 bool locked)
0524 {
0525 u32 kmrnctrlsta;
0526
0527 if (!locked) {
0528 s32 ret_val = 0;
0529
0530 if (!hw->phy.ops.acquire)
0531 return 0;
0532
0533 ret_val = hw->phy.ops.acquire(hw);
0534 if (ret_val)
0535 return ret_val;
0536 }
0537
0538 kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
0539 E1000_KMRNCTRLSTA_OFFSET) | data;
0540 ew32(KMRNCTRLSTA, kmrnctrlsta);
0541 e1e_flush();
0542
0543 udelay(2);
0544
0545 if (!locked)
0546 hw->phy.ops.release(hw);
0547
0548 return 0;
0549 }
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data)
0561 {
0562 return __e1000_write_kmrn_reg(hw, offset, data, false);
0563 }
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574 s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data)
0575 {
0576 return __e1000_write_kmrn_reg(hw, offset, data, true);
0577 }
0578
0579
0580
0581
0582
0583
0584
0585 static s32 e1000_set_master_slave_mode(struct e1000_hw *hw)
0586 {
0587 s32 ret_val;
0588 u16 phy_data;
0589
0590
0591 ret_val = e1e_rphy(hw, MII_CTRL1000, &phy_data);
0592 if (ret_val)
0593 return ret_val;
0594
0595
0596 hw->phy.original_ms_type = (phy_data & CTL1000_ENABLE_MASTER) ?
0597 ((phy_data & CTL1000_AS_MASTER) ?
0598 e1000_ms_force_master : e1000_ms_force_slave) : e1000_ms_auto;
0599
0600 switch (hw->phy.ms_type) {
0601 case e1000_ms_force_master:
0602 phy_data |= (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER);
0603 break;
0604 case e1000_ms_force_slave:
0605 phy_data |= CTL1000_ENABLE_MASTER;
0606 phy_data &= ~(CTL1000_AS_MASTER);
0607 break;
0608 case e1000_ms_auto:
0609 phy_data &= ~CTL1000_ENABLE_MASTER;
0610 fallthrough;
0611 default:
0612 break;
0613 }
0614
0615 return e1e_wphy(hw, MII_CTRL1000, phy_data);
0616 }
0617
0618
0619
0620
0621
0622
0623
0624 s32 e1000_copper_link_setup_82577(struct e1000_hw *hw)
0625 {
0626 s32 ret_val;
0627 u16 phy_data;
0628
0629
0630 ret_val = e1e_rphy(hw, I82577_CFG_REG, &phy_data);
0631 if (ret_val)
0632 return ret_val;
0633
0634 phy_data |= I82577_CFG_ASSERT_CRS_ON_TX;
0635
0636
0637 phy_data |= I82577_CFG_ENABLE_DOWNSHIFT;
0638
0639 ret_val = e1e_wphy(hw, I82577_CFG_REG, phy_data);
0640 if (ret_val)
0641 return ret_val;
0642
0643
0644 ret_val = e1e_rphy(hw, I82577_PHY_CTRL_2, &phy_data);
0645 if (ret_val)
0646 return ret_val;
0647 phy_data &= ~I82577_PHY_CTRL2_MDIX_CFG_MASK;
0648
0649
0650
0651
0652
0653 switch (hw->phy.mdix) {
0654 case 1:
0655 break;
0656 case 2:
0657 phy_data |= I82577_PHY_CTRL2_MANUAL_MDIX;
0658 break;
0659 case 0:
0660 default:
0661 phy_data |= I82577_PHY_CTRL2_AUTO_MDI_MDIX;
0662 break;
0663 }
0664 ret_val = e1e_wphy(hw, I82577_PHY_CTRL_2, phy_data);
0665 if (ret_val)
0666 return ret_val;
0667
0668 return e1000_set_master_slave_mode(hw);
0669 }
0670
0671
0672
0673
0674
0675
0676
0677
0678 s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw)
0679 {
0680 struct e1000_phy_info *phy = &hw->phy;
0681 s32 ret_val;
0682 u16 phy_data;
0683
0684
0685 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
0686 if (ret_val)
0687 return ret_val;
0688
0689
0690 if (phy->type != e1000_phy_bm)
0691 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
0692
0693
0694
0695
0696
0697
0698
0699
0700 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
0701
0702 switch (phy->mdix) {
0703 case 1:
0704 phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;
0705 break;
0706 case 2:
0707 phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;
0708 break;
0709 case 3:
0710 phy_data |= M88E1000_PSCR_AUTO_X_1000T;
0711 break;
0712 case 0:
0713 default:
0714 phy_data |= M88E1000_PSCR_AUTO_X_MODE;
0715 break;
0716 }
0717
0718
0719
0720
0721
0722
0723
0724 phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
0725 if (phy->disable_polarity_correction)
0726 phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
0727
0728
0729 if (phy->type == e1000_phy_bm) {
0730
0731 if (phy->id == BME1000_E_PHY_ID_R2) {
0732 phy_data &= ~BME1000_PSCR_ENABLE_DOWNSHIFT;
0733 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL,
0734 phy_data);
0735 if (ret_val)
0736 return ret_val;
0737
0738 ret_val = phy->ops.commit(hw);
0739 if (ret_val) {
0740 e_dbg("Error committing the PHY changes\n");
0741 return ret_val;
0742 }
0743 }
0744
0745 phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT;
0746 }
0747
0748 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
0749 if (ret_val)
0750 return ret_val;
0751
0752 if ((phy->type == e1000_phy_m88) &&
0753 (phy->revision < E1000_REVISION_4) &&
0754 (phy->id != BME1000_E_PHY_ID_R2)) {
0755
0756
0757
0758 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
0759 if (ret_val)
0760 return ret_val;
0761
0762 phy_data |= M88E1000_EPSCR_TX_CLK_25;
0763
0764 if ((phy->revision == 2) && (phy->id == M88E1111_I_PHY_ID)) {
0765
0766 phy_data &= ~M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK;
0767 phy_data |= M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X;
0768 } else {
0769
0770 phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |
0771 M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
0772 phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
0773 M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
0774 }
0775 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
0776 if (ret_val)
0777 return ret_val;
0778 }
0779
0780 if ((phy->type == e1000_phy_bm) && (phy->id == BME1000_E_PHY_ID_R2)) {
0781
0782 ret_val = e1e_wphy(hw, 29, 0x0003);
0783 if (ret_val)
0784 return ret_val;
0785
0786
0787 ret_val = e1e_wphy(hw, 30, 0x0000);
0788 if (ret_val)
0789 return ret_val;
0790 }
0791
0792
0793 if (phy->ops.commit) {
0794 ret_val = phy->ops.commit(hw);
0795 if (ret_val) {
0796 e_dbg("Error committing the PHY changes\n");
0797 return ret_val;
0798 }
0799 }
0800
0801 if (phy->type == e1000_phy_82578) {
0802 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
0803 if (ret_val)
0804 return ret_val;
0805
0806
0807 phy_data |= I82578_EPSCR_DOWNSHIFT_ENABLE;
0808 phy_data &= ~I82578_EPSCR_DOWNSHIFT_COUNTER_MASK;
0809 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
0810 if (ret_val)
0811 return ret_val;
0812 }
0813
0814 return 0;
0815 }
0816
0817
0818
0819
0820
0821
0822
0823
0824 s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw)
0825 {
0826 struct e1000_phy_info *phy = &hw->phy;
0827 s32 ret_val;
0828 u16 data;
0829
0830 ret_val = e1000_phy_hw_reset(hw);
0831 if (ret_val) {
0832 e_dbg("Error resetting the PHY.\n");
0833 return ret_val;
0834 }
0835
0836
0837
0838
0839 msleep(100);
0840
0841
0842 if (hw->phy.ops.set_d0_lplu_state) {
0843 ret_val = hw->phy.ops.set_d0_lplu_state(hw, false);
0844 if (ret_val) {
0845 e_dbg("Error Disabling LPLU D0\n");
0846 return ret_val;
0847 }
0848 }
0849
0850 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &data);
0851 if (ret_val)
0852 return ret_val;
0853
0854 data &= ~IGP01E1000_PSCR_AUTO_MDIX;
0855
0856 switch (phy->mdix) {
0857 case 1:
0858 data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
0859 break;
0860 case 2:
0861 data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;
0862 break;
0863 case 0:
0864 default:
0865 data |= IGP01E1000_PSCR_AUTO_MDIX;
0866 break;
0867 }
0868 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, data);
0869 if (ret_val)
0870 return ret_val;
0871
0872
0873 if (hw->mac.autoneg) {
0874
0875
0876
0877
0878 if (phy->autoneg_advertised == ADVERTISE_1000_FULL) {
0879
0880 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
0881 &data);
0882 if (ret_val)
0883 return ret_val;
0884
0885 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
0886 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
0887 data);
0888 if (ret_val)
0889 return ret_val;
0890
0891
0892 ret_val = e1e_rphy(hw, MII_CTRL1000, &data);
0893 if (ret_val)
0894 return ret_val;
0895
0896 data &= ~CTL1000_ENABLE_MASTER;
0897 ret_val = e1e_wphy(hw, MII_CTRL1000, data);
0898 if (ret_val)
0899 return ret_val;
0900 }
0901
0902 ret_val = e1000_set_master_slave_mode(hw);
0903 }
0904
0905 return ret_val;
0906 }
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917 static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
0918 {
0919 struct e1000_phy_info *phy = &hw->phy;
0920 s32 ret_val;
0921 u16 mii_autoneg_adv_reg;
0922 u16 mii_1000t_ctrl_reg = 0;
0923
0924 phy->autoneg_advertised &= phy->autoneg_mask;
0925
0926
0927 ret_val = e1e_rphy(hw, MII_ADVERTISE, &mii_autoneg_adv_reg);
0928 if (ret_val)
0929 return ret_val;
0930
0931 if (phy->autoneg_mask & ADVERTISE_1000_FULL) {
0932
0933 ret_val = e1e_rphy(hw, MII_CTRL1000, &mii_1000t_ctrl_reg);
0934 if (ret_val)
0935 return ret_val;
0936 }
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949 mii_autoneg_adv_reg &= ~(ADVERTISE_100FULL |
0950 ADVERTISE_100HALF |
0951 ADVERTISE_10FULL | ADVERTISE_10HALF);
0952 mii_1000t_ctrl_reg &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
0953
0954 e_dbg("autoneg_advertised %x\n", phy->autoneg_advertised);
0955
0956
0957 if (phy->autoneg_advertised & ADVERTISE_10_HALF) {
0958 e_dbg("Advertise 10mb Half duplex\n");
0959 mii_autoneg_adv_reg |= ADVERTISE_10HALF;
0960 }
0961
0962
0963 if (phy->autoneg_advertised & ADVERTISE_10_FULL) {
0964 e_dbg("Advertise 10mb Full duplex\n");
0965 mii_autoneg_adv_reg |= ADVERTISE_10FULL;
0966 }
0967
0968
0969 if (phy->autoneg_advertised & ADVERTISE_100_HALF) {
0970 e_dbg("Advertise 100mb Half duplex\n");
0971 mii_autoneg_adv_reg |= ADVERTISE_100HALF;
0972 }
0973
0974
0975 if (phy->autoneg_advertised & ADVERTISE_100_FULL) {
0976 e_dbg("Advertise 100mb Full duplex\n");
0977 mii_autoneg_adv_reg |= ADVERTISE_100FULL;
0978 }
0979
0980
0981 if (phy->autoneg_advertised & ADVERTISE_1000_HALF)
0982 e_dbg("Advertise 1000mb Half duplex request denied!\n");
0983
0984
0985 if (phy->autoneg_advertised & ADVERTISE_1000_FULL) {
0986 e_dbg("Advertise 1000mb Full duplex\n");
0987 mii_1000t_ctrl_reg |= ADVERTISE_1000FULL;
0988 }
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007 switch (hw->fc.current_mode) {
1008 case e1000_fc_none:
1009
1010
1011
1012 mii_autoneg_adv_reg &=
1013 ~(ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP);
1014 break;
1015 case e1000_fc_rx_pause:
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025 mii_autoneg_adv_reg |=
1026 (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP);
1027 break;
1028 case e1000_fc_tx_pause:
1029
1030
1031
1032 mii_autoneg_adv_reg |= ADVERTISE_PAUSE_ASYM;
1033 mii_autoneg_adv_reg &= ~ADVERTISE_PAUSE_CAP;
1034 break;
1035 case e1000_fc_full:
1036
1037
1038
1039 mii_autoneg_adv_reg |=
1040 (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP);
1041 break;
1042 default:
1043 e_dbg("Flow control param set incorrectly\n");
1044 return -E1000_ERR_CONFIG;
1045 }
1046
1047 ret_val = e1e_wphy(hw, MII_ADVERTISE, mii_autoneg_adv_reg);
1048 if (ret_val)
1049 return ret_val;
1050
1051 e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
1052
1053 if (phy->autoneg_mask & ADVERTISE_1000_FULL)
1054 ret_val = e1e_wphy(hw, MII_CTRL1000, mii_1000t_ctrl_reg);
1055
1056 return ret_val;
1057 }
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068 static s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
1069 {
1070 struct e1000_phy_info *phy = &hw->phy;
1071 s32 ret_val;
1072 u16 phy_ctrl;
1073
1074
1075
1076
1077 phy->autoneg_advertised &= phy->autoneg_mask;
1078
1079
1080
1081
1082 if (!phy->autoneg_advertised)
1083 phy->autoneg_advertised = phy->autoneg_mask;
1084
1085 e_dbg("Reconfiguring auto-neg advertisement params\n");
1086 ret_val = e1000_phy_setup_autoneg(hw);
1087 if (ret_val) {
1088 e_dbg("Error Setting up Auto-Negotiation\n");
1089 return ret_val;
1090 }
1091 e_dbg("Restarting Auto-Neg\n");
1092
1093
1094
1095
1096 ret_val = e1e_rphy(hw, MII_BMCR, &phy_ctrl);
1097 if (ret_val)
1098 return ret_val;
1099
1100 phy_ctrl |= (BMCR_ANENABLE | BMCR_ANRESTART);
1101 ret_val = e1e_wphy(hw, MII_BMCR, phy_ctrl);
1102 if (ret_val)
1103 return ret_val;
1104
1105
1106
1107
1108 if (phy->autoneg_wait_to_complete) {
1109 ret_val = e1000_wait_autoneg(hw);
1110 if (ret_val) {
1111 e_dbg("Error while waiting for autoneg to complete\n");
1112 return ret_val;
1113 }
1114 }
1115
1116 hw->mac.get_link_status = true;
1117
1118 return ret_val;
1119 }
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130 s32 e1000e_setup_copper_link(struct e1000_hw *hw)
1131 {
1132 s32 ret_val;
1133 bool link;
1134
1135 if (hw->mac.autoneg) {
1136
1137
1138
1139 ret_val = e1000_copper_link_autoneg(hw);
1140 if (ret_val)
1141 return ret_val;
1142 } else {
1143
1144
1145
1146 e_dbg("Forcing Speed and Duplex\n");
1147 ret_val = hw->phy.ops.force_speed_duplex(hw);
1148 if (ret_val) {
1149 e_dbg("Error Forcing Speed and Duplex\n");
1150 return ret_val;
1151 }
1152 }
1153
1154
1155
1156
1157 ret_val = e1000e_phy_has_link_generic(hw, COPPER_LINK_UP_LIMIT, 10,
1158 &link);
1159 if (ret_val)
1160 return ret_val;
1161
1162 if (link) {
1163 e_dbg("Valid link established!!!\n");
1164 hw->mac.ops.config_collision_dist(hw);
1165 ret_val = e1000e_config_fc_after_link_up(hw);
1166 } else {
1167 e_dbg("Unable to establish link!!!\n");
1168 }
1169
1170 return ret_val;
1171 }
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181 s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
1182 {
1183 struct e1000_phy_info *phy = &hw->phy;
1184 s32 ret_val;
1185 u16 phy_data;
1186 bool link;
1187
1188 ret_val = e1e_rphy(hw, MII_BMCR, &phy_data);
1189 if (ret_val)
1190 return ret_val;
1191
1192 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
1193
1194 ret_val = e1e_wphy(hw, MII_BMCR, phy_data);
1195 if (ret_val)
1196 return ret_val;
1197
1198
1199
1200
1201 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
1202 if (ret_val)
1203 return ret_val;
1204
1205 phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
1206 phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
1207
1208 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
1209 if (ret_val)
1210 return ret_val;
1211
1212 e_dbg("IGP PSCR: %X\n", phy_data);
1213
1214 udelay(1);
1215
1216 if (phy->autoneg_wait_to_complete) {
1217 e_dbg("Waiting for forced speed/duplex link on IGP phy.\n");
1218
1219 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1220 100000, &link);
1221 if (ret_val)
1222 return ret_val;
1223
1224 if (!link)
1225 e_dbg("Link taking longer than expected.\n");
1226
1227
1228 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1229 100000, &link);
1230 }
1231
1232 return ret_val;
1233 }
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245 s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw)
1246 {
1247 struct e1000_phy_info *phy = &hw->phy;
1248 s32 ret_val;
1249 u16 phy_data;
1250 bool link;
1251
1252
1253
1254
1255 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
1256 if (ret_val)
1257 return ret_val;
1258
1259 phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
1260 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
1261 if (ret_val)
1262 return ret_val;
1263
1264 e_dbg("M88E1000 PSCR: %X\n", phy_data);
1265
1266 ret_val = e1e_rphy(hw, MII_BMCR, &phy_data);
1267 if (ret_val)
1268 return ret_val;
1269
1270 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
1271
1272 ret_val = e1e_wphy(hw, MII_BMCR, phy_data);
1273 if (ret_val)
1274 return ret_val;
1275
1276
1277 if (hw->phy.ops.commit) {
1278 ret_val = hw->phy.ops.commit(hw);
1279 if (ret_val)
1280 return ret_val;
1281 }
1282
1283 if (phy->autoneg_wait_to_complete) {
1284 e_dbg("Waiting for forced speed/duplex link on M88 phy.\n");
1285
1286 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1287 100000, &link);
1288 if (ret_val)
1289 return ret_val;
1290
1291 if (!link) {
1292 if (hw->phy.type != e1000_phy_m88) {
1293 e_dbg("Link taking longer than expected.\n");
1294 } else {
1295
1296
1297
1298 ret_val = e1e_wphy(hw, M88E1000_PHY_PAGE_SELECT,
1299 0x001d);
1300 if (ret_val)
1301 return ret_val;
1302 ret_val = e1000e_phy_reset_dsp(hw);
1303 if (ret_val)
1304 return ret_val;
1305 }
1306 }
1307
1308
1309 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1310 100000, &link);
1311 if (ret_val)
1312 return ret_val;
1313 }
1314
1315 if (hw->phy.type != e1000_phy_m88)
1316 return 0;
1317
1318 ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
1319 if (ret_val)
1320 return ret_val;
1321
1322
1323
1324
1325
1326 phy_data |= M88E1000_EPSCR_TX_CLK_25;
1327 ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
1328 if (ret_val)
1329 return ret_val;
1330
1331
1332
1333
1334 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
1335 if (ret_val)
1336 return ret_val;
1337
1338 phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
1339 ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
1340
1341 return ret_val;
1342 }
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352 s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
1353 {
1354 struct e1000_phy_info *phy = &hw->phy;
1355 s32 ret_val;
1356 u16 data;
1357 bool link;
1358
1359 ret_val = e1e_rphy(hw, MII_BMCR, &data);
1360 if (ret_val)
1361 return ret_val;
1362
1363 e1000e_phy_force_speed_duplex_setup(hw, &data);
1364
1365 ret_val = e1e_wphy(hw, MII_BMCR, data);
1366 if (ret_val)
1367 return ret_val;
1368
1369
1370 ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data);
1371 if (ret_val)
1372 return ret_val;
1373
1374 data &= ~IFE_PMC_AUTO_MDIX;
1375 data &= ~IFE_PMC_FORCE_MDIX;
1376
1377 ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, data);
1378 if (ret_val)
1379 return ret_val;
1380
1381 e_dbg("IFE PMC: %X\n", data);
1382
1383 udelay(1);
1384
1385 if (phy->autoneg_wait_to_complete) {
1386 e_dbg("Waiting for forced speed/duplex link on IFE phy.\n");
1387
1388 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1389 100000, &link);
1390 if (ret_val)
1391 return ret_val;
1392
1393 if (!link)
1394 e_dbg("Link taking longer than expected.\n");
1395
1396
1397 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
1398 100000, &link);
1399 if (ret_val)
1400 return ret_val;
1401 }
1402
1403 return 0;
1404 }
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418 void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl)
1419 {
1420 struct e1000_mac_info *mac = &hw->mac;
1421 u32 ctrl;
1422
1423
1424 hw->fc.current_mode = e1000_fc_none;
1425
1426
1427 ctrl = er32(CTRL);
1428 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
1429 ctrl &= ~E1000_CTRL_SPD_SEL;
1430
1431
1432 ctrl &= ~E1000_CTRL_ASDE;
1433
1434
1435 *phy_ctrl &= ~BMCR_ANENABLE;
1436
1437
1438 if (mac->forced_speed_duplex & E1000_ALL_HALF_DUPLEX) {
1439 ctrl &= ~E1000_CTRL_FD;
1440 *phy_ctrl &= ~BMCR_FULLDPLX;
1441 e_dbg("Half Duplex\n");
1442 } else {
1443 ctrl |= E1000_CTRL_FD;
1444 *phy_ctrl |= BMCR_FULLDPLX;
1445 e_dbg("Full Duplex\n");
1446 }
1447
1448
1449 if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) {
1450 ctrl |= E1000_CTRL_SPD_100;
1451 *phy_ctrl |= BMCR_SPEED100;
1452 *phy_ctrl &= ~BMCR_SPEED1000;
1453 e_dbg("Forcing 100mb\n");
1454 } else {
1455 ctrl &= ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
1456 *phy_ctrl &= ~(BMCR_SPEED1000 | BMCR_SPEED100);
1457 e_dbg("Forcing 10mb\n");
1458 }
1459
1460 hw->mac.ops.config_collision_dist(hw);
1461
1462 ew32(CTRL, ctrl);
1463 }
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479 s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active)
1480 {
1481 struct e1000_phy_info *phy = &hw->phy;
1482 s32 ret_val;
1483 u16 data;
1484
1485 ret_val = e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &data);
1486 if (ret_val)
1487 return ret_val;
1488
1489 if (!active) {
1490 data &= ~IGP02E1000_PM_D3_LPLU;
1491 ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, data);
1492 if (ret_val)
1493 return ret_val;
1494
1495
1496
1497
1498
1499 if (phy->smart_speed == e1000_smart_speed_on) {
1500 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
1501 &data);
1502 if (ret_val)
1503 return ret_val;
1504
1505 data |= IGP01E1000_PSCFR_SMART_SPEED;
1506 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
1507 data);
1508 if (ret_val)
1509 return ret_val;
1510 } else if (phy->smart_speed == e1000_smart_speed_off) {
1511 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG,
1512 &data);
1513 if (ret_val)
1514 return ret_val;
1515
1516 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
1517 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG,
1518 data);
1519 if (ret_val)
1520 return ret_val;
1521 }
1522 } else if ((phy->autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
1523 (phy->autoneg_advertised == E1000_ALL_NOT_GIG) ||
1524 (phy->autoneg_advertised == E1000_ALL_10_SPEED)) {
1525 data |= IGP02E1000_PM_D3_LPLU;
1526 ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, data);
1527 if (ret_val)
1528 return ret_val;
1529
1530
1531 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_CONFIG, &data);
1532 if (ret_val)
1533 return ret_val;
1534
1535 data &= ~IGP01E1000_PSCFR_SMART_SPEED;
1536 ret_val = e1e_wphy(hw, IGP01E1000_PHY_PORT_CONFIG, data);
1537 }
1538
1539 return ret_val;
1540 }
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 s32 e1000e_check_downshift(struct e1000_hw *hw)
1551 {
1552 struct e1000_phy_info *phy = &hw->phy;
1553 s32 ret_val;
1554 u16 phy_data, offset, mask;
1555
1556 switch (phy->type) {
1557 case e1000_phy_m88:
1558 case e1000_phy_gg82563:
1559 case e1000_phy_bm:
1560 case e1000_phy_82578:
1561 offset = M88E1000_PHY_SPEC_STATUS;
1562 mask = M88E1000_PSSR_DOWNSHIFT;
1563 break;
1564 case e1000_phy_igp_2:
1565 case e1000_phy_igp_3:
1566 offset = IGP01E1000_PHY_LINK_HEALTH;
1567 mask = IGP01E1000_PLHR_SS_DOWNGRADE;
1568 break;
1569 default:
1570
1571 phy->speed_downgraded = false;
1572 return 0;
1573 }
1574
1575 ret_val = e1e_rphy(hw, offset, &phy_data);
1576
1577 if (!ret_val)
1578 phy->speed_downgraded = !!(phy_data & mask);
1579
1580 return ret_val;
1581 }
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591 s32 e1000_check_polarity_m88(struct e1000_hw *hw)
1592 {
1593 struct e1000_phy_info *phy = &hw->phy;
1594 s32 ret_val;
1595 u16 data;
1596
1597 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &data);
1598
1599 if (!ret_val)
1600 phy->cable_polarity = ((data & M88E1000_PSSR_REV_POLARITY)
1601 ? e1000_rev_polarity_reversed
1602 : e1000_rev_polarity_normal);
1603
1604 return ret_val;
1605 }
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616 s32 e1000_check_polarity_igp(struct e1000_hw *hw)
1617 {
1618 struct e1000_phy_info *phy = &hw->phy;
1619 s32 ret_val;
1620 u16 data, offset, mask;
1621
1622
1623
1624
1625 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data);
1626 if (ret_val)
1627 return ret_val;
1628
1629 if ((data & IGP01E1000_PSSR_SPEED_MASK) ==
1630 IGP01E1000_PSSR_SPEED_1000MBPS) {
1631 offset = IGP01E1000_PHY_PCS_INIT_REG;
1632 mask = IGP01E1000_PHY_POLARITY_MASK;
1633 } else {
1634
1635
1636
1637 offset = IGP01E1000_PHY_PORT_STATUS;
1638 mask = IGP01E1000_PSSR_POLARITY_REVERSED;
1639 }
1640
1641 ret_val = e1e_rphy(hw, offset, &data);
1642
1643 if (!ret_val)
1644 phy->cable_polarity = ((data & mask)
1645 ? e1000_rev_polarity_reversed
1646 : e1000_rev_polarity_normal);
1647
1648 return ret_val;
1649 }
1650
1651
1652
1653
1654
1655
1656
1657 s32 e1000_check_polarity_ife(struct e1000_hw *hw)
1658 {
1659 struct e1000_phy_info *phy = &hw->phy;
1660 s32 ret_val;
1661 u16 phy_data, offset, mask;
1662
1663
1664
1665 if (phy->polarity_correction) {
1666 offset = IFE_PHY_EXTENDED_STATUS_CONTROL;
1667 mask = IFE_PESC_POLARITY_REVERSED;
1668 } else {
1669 offset = IFE_PHY_SPECIAL_CONTROL;
1670 mask = IFE_PSC_FORCE_POLARITY;
1671 }
1672
1673 ret_val = e1e_rphy(hw, offset, &phy_data);
1674
1675 if (!ret_val)
1676 phy->cable_polarity = ((phy_data & mask)
1677 ? e1000_rev_polarity_reversed
1678 : e1000_rev_polarity_normal);
1679
1680 return ret_val;
1681 }
1682
1683
1684
1685
1686
1687
1688
1689
1690 static s32 e1000_wait_autoneg(struct e1000_hw *hw)
1691 {
1692 s32 ret_val = 0;
1693 u16 i, phy_status;
1694
1695
1696 for (i = PHY_AUTO_NEG_LIMIT; i > 0; i--) {
1697 ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
1698 if (ret_val)
1699 break;
1700 ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
1701 if (ret_val)
1702 break;
1703 if (phy_status & BMSR_ANEGCOMPLETE)
1704 break;
1705 msleep(100);
1706 }
1707
1708
1709
1710
1711 return ret_val;
1712 }
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723 s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
1724 u32 usec_interval, bool *success)
1725 {
1726 s32 ret_val = 0;
1727 u16 i, phy_status;
1728
1729 *success = false;
1730 for (i = 0; i < iterations; i++) {
1731
1732
1733
1734
1735 ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
1736 if (ret_val) {
1737
1738
1739
1740
1741 if (usec_interval >= 1000)
1742 msleep(usec_interval / 1000);
1743 else
1744 udelay(usec_interval);
1745 }
1746 ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
1747 if (ret_val)
1748 break;
1749 if (phy_status & BMSR_LSTATUS) {
1750 *success = true;
1751 break;
1752 }
1753 if (usec_interval >= 1000)
1754 msleep(usec_interval / 1000);
1755 else
1756 udelay(usec_interval);
1757 }
1758
1759 return ret_val;
1760 }
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777 s32 e1000e_get_cable_length_m88(struct e1000_hw *hw)
1778 {
1779 struct e1000_phy_info *phy = &hw->phy;
1780 s32 ret_val;
1781 u16 phy_data, index;
1782
1783 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
1784 if (ret_val)
1785 return ret_val;
1786
1787 index = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
1788 M88E1000_PSSR_CABLE_LENGTH_SHIFT);
1789
1790 if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1)
1791 return -E1000_ERR_PHY;
1792
1793 phy->min_cable_length = e1000_m88_cable_length_table[index];
1794 phy->max_cable_length = e1000_m88_cable_length_table[index + 1];
1795
1796 phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
1797
1798 return 0;
1799 }
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812 s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw)
1813 {
1814 struct e1000_phy_info *phy = &hw->phy;
1815 s32 ret_val;
1816 u16 phy_data, i, agc_value = 0;
1817 u16 cur_agc_index, max_agc_index = 0;
1818 u16 min_agc_index = IGP02E1000_CABLE_LENGTH_TABLE_SIZE - 1;
1819 static const u16 agc_reg_array[IGP02E1000_PHY_CHANNEL_NUM] = {
1820 IGP02E1000_PHY_AGC_A,
1821 IGP02E1000_PHY_AGC_B,
1822 IGP02E1000_PHY_AGC_C,
1823 IGP02E1000_PHY_AGC_D
1824 };
1825
1826
1827 for (i = 0; i < IGP02E1000_PHY_CHANNEL_NUM; i++) {
1828 ret_val = e1e_rphy(hw, agc_reg_array[i], &phy_data);
1829 if (ret_val)
1830 return ret_val;
1831
1832
1833
1834
1835
1836
1837 cur_agc_index = ((phy_data >> IGP02E1000_AGC_LENGTH_SHIFT) &
1838 IGP02E1000_AGC_LENGTH_MASK);
1839
1840
1841 if ((cur_agc_index >= IGP02E1000_CABLE_LENGTH_TABLE_SIZE) ||
1842 (cur_agc_index == 0))
1843 return -E1000_ERR_PHY;
1844
1845
1846 if (e1000_igp_2_cable_length_table[min_agc_index] >
1847 e1000_igp_2_cable_length_table[cur_agc_index])
1848 min_agc_index = cur_agc_index;
1849 if (e1000_igp_2_cable_length_table[max_agc_index] <
1850 e1000_igp_2_cable_length_table[cur_agc_index])
1851 max_agc_index = cur_agc_index;
1852
1853 agc_value += e1000_igp_2_cable_length_table[cur_agc_index];
1854 }
1855
1856 agc_value -= (e1000_igp_2_cable_length_table[min_agc_index] +
1857 e1000_igp_2_cable_length_table[max_agc_index]);
1858 agc_value /= (IGP02E1000_PHY_CHANNEL_NUM - 2);
1859
1860
1861 phy->min_cable_length = (((agc_value - IGP02E1000_AGC_RANGE) > 0) ?
1862 (agc_value - IGP02E1000_AGC_RANGE) : 0);
1863 phy->max_cable_length = agc_value + IGP02E1000_AGC_RANGE;
1864
1865 phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
1866
1867 return 0;
1868 }
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880 s32 e1000e_get_phy_info_m88(struct e1000_hw *hw)
1881 {
1882 struct e1000_phy_info *phy = &hw->phy;
1883 s32 ret_val;
1884 u16 phy_data;
1885 bool link;
1886
1887 if (phy->media_type != e1000_media_type_copper) {
1888 e_dbg("Phy info is only valid for copper media\n");
1889 return -E1000_ERR_CONFIG;
1890 }
1891
1892 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
1893 if (ret_val)
1894 return ret_val;
1895
1896 if (!link) {
1897 e_dbg("Phy info is only valid if link is up\n");
1898 return -E1000_ERR_CONFIG;
1899 }
1900
1901 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
1902 if (ret_val)
1903 return ret_val;
1904
1905 phy->polarity_correction = !!(phy_data &
1906 M88E1000_PSCR_POLARITY_REVERSAL);
1907
1908 ret_val = e1000_check_polarity_m88(hw);
1909 if (ret_val)
1910 return ret_val;
1911
1912 ret_val = e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
1913 if (ret_val)
1914 return ret_val;
1915
1916 phy->is_mdix = !!(phy_data & M88E1000_PSSR_MDIX);
1917
1918 if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) {
1919 ret_val = hw->phy.ops.get_cable_length(hw);
1920 if (ret_val)
1921 return ret_val;
1922
1923 ret_val = e1e_rphy(hw, MII_STAT1000, &phy_data);
1924 if (ret_val)
1925 return ret_val;
1926
1927 phy->local_rx = (phy_data & LPA_1000LOCALRXOK)
1928 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
1929
1930 phy->remote_rx = (phy_data & LPA_1000REMRXOK)
1931 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
1932 } else {
1933
1934 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
1935 phy->local_rx = e1000_1000t_rx_status_undefined;
1936 phy->remote_rx = e1000_1000t_rx_status_undefined;
1937 }
1938
1939 return ret_val;
1940 }
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951 s32 e1000e_get_phy_info_igp(struct e1000_hw *hw)
1952 {
1953 struct e1000_phy_info *phy = &hw->phy;
1954 s32 ret_val;
1955 u16 data;
1956 bool link;
1957
1958 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
1959 if (ret_val)
1960 return ret_val;
1961
1962 if (!link) {
1963 e_dbg("Phy info is only valid if link is up\n");
1964 return -E1000_ERR_CONFIG;
1965 }
1966
1967 phy->polarity_correction = true;
1968
1969 ret_val = e1000_check_polarity_igp(hw);
1970 if (ret_val)
1971 return ret_val;
1972
1973 ret_val = e1e_rphy(hw, IGP01E1000_PHY_PORT_STATUS, &data);
1974 if (ret_val)
1975 return ret_val;
1976
1977 phy->is_mdix = !!(data & IGP01E1000_PSSR_MDIX);
1978
1979 if ((data & IGP01E1000_PSSR_SPEED_MASK) ==
1980 IGP01E1000_PSSR_SPEED_1000MBPS) {
1981 ret_val = phy->ops.get_cable_length(hw);
1982 if (ret_val)
1983 return ret_val;
1984
1985 ret_val = e1e_rphy(hw, MII_STAT1000, &data);
1986 if (ret_val)
1987 return ret_val;
1988
1989 phy->local_rx = (data & LPA_1000LOCALRXOK)
1990 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
1991
1992 phy->remote_rx = (data & LPA_1000REMRXOK)
1993 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
1994 } else {
1995 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
1996 phy->local_rx = e1000_1000t_rx_status_undefined;
1997 phy->remote_rx = e1000_1000t_rx_status_undefined;
1998 }
1999
2000 return ret_val;
2001 }
2002
2003
2004
2005
2006
2007
2008
2009 s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
2010 {
2011 struct e1000_phy_info *phy = &hw->phy;
2012 s32 ret_val;
2013 u16 data;
2014 bool link;
2015
2016 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
2017 if (ret_val)
2018 return ret_val;
2019
2020 if (!link) {
2021 e_dbg("Phy info is only valid if link is up\n");
2022 return -E1000_ERR_CONFIG;
2023 }
2024
2025 ret_val = e1e_rphy(hw, IFE_PHY_SPECIAL_CONTROL, &data);
2026 if (ret_val)
2027 return ret_val;
2028 phy->polarity_correction = !(data & IFE_PSC_AUTO_POLARITY_DISABLE);
2029
2030 if (phy->polarity_correction) {
2031 ret_val = e1000_check_polarity_ife(hw);
2032 if (ret_val)
2033 return ret_val;
2034 } else {
2035
2036 phy->cable_polarity = ((data & IFE_PSC_FORCE_POLARITY)
2037 ? e1000_rev_polarity_reversed
2038 : e1000_rev_polarity_normal);
2039 }
2040
2041 ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, &data);
2042 if (ret_val)
2043 return ret_val;
2044
2045 phy->is_mdix = !!(data & IFE_PMC_MDIX_STATUS);
2046
2047
2048 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
2049 phy->local_rx = e1000_1000t_rx_status_undefined;
2050 phy->remote_rx = e1000_1000t_rx_status_undefined;
2051
2052 return 0;
2053 }
2054
2055
2056
2057
2058
2059
2060
2061
2062 s32 e1000e_phy_sw_reset(struct e1000_hw *hw)
2063 {
2064 s32 ret_val;
2065 u16 phy_ctrl;
2066
2067 ret_val = e1e_rphy(hw, MII_BMCR, &phy_ctrl);
2068 if (ret_val)
2069 return ret_val;
2070
2071 phy_ctrl |= BMCR_RESET;
2072 ret_val = e1e_wphy(hw, MII_BMCR, phy_ctrl);
2073 if (ret_val)
2074 return ret_val;
2075
2076 udelay(1);
2077
2078 return ret_val;
2079 }
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090 s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw)
2091 {
2092 struct e1000_phy_info *phy = &hw->phy;
2093 s32 ret_val;
2094 u32 ctrl;
2095
2096 if (phy->ops.check_reset_block) {
2097 ret_val = phy->ops.check_reset_block(hw);
2098 if (ret_val)
2099 return 0;
2100 }
2101
2102 ret_val = phy->ops.acquire(hw);
2103 if (ret_val)
2104 return ret_val;
2105
2106 ctrl = er32(CTRL);
2107 ew32(CTRL, ctrl | E1000_CTRL_PHY_RST);
2108 e1e_flush();
2109
2110 udelay(phy->reset_delay_us);
2111
2112 ew32(CTRL, ctrl);
2113 e1e_flush();
2114
2115 usleep_range(150, 300);
2116
2117 phy->ops.release(hw);
2118
2119 return phy->ops.get_cfg_done(hw);
2120 }
2121
2122
2123
2124
2125
2126
2127
2128
2129 s32 e1000e_get_cfg_done_generic(struct e1000_hw __always_unused *hw)
2130 {
2131 mdelay(10);
2132
2133 return 0;
2134 }
2135
2136
2137
2138
2139
2140
2141
2142 s32 e1000e_phy_init_script_igp3(struct e1000_hw *hw)
2143 {
2144 e_dbg("Running IGP 3 PHY init script\n");
2145
2146
2147
2148 e1e_wphy(hw, 0x2F5B, 0x9018);
2149
2150 e1e_wphy(hw, 0x2F52, 0x0000);
2151
2152 e1e_wphy(hw, 0x2FB1, 0x8B24);
2153
2154 e1e_wphy(hw, 0x2FB2, 0xF8F0);
2155
2156 e1e_wphy(hw, 0x2010, 0x10B0);
2157
2158 e1e_wphy(hw, 0x2011, 0x0000);
2159
2160 e1e_wphy(hw, 0x20DD, 0x249A);
2161
2162 e1e_wphy(hw, 0x20DE, 0x00D3);
2163
2164 e1e_wphy(hw, 0x28B4, 0x04CE);
2165
2166 e1e_wphy(hw, 0x2F70, 0x29E4);
2167
2168 e1e_wphy(hw, 0x0000, 0x0140);
2169
2170 e1e_wphy(hw, 0x1F30, 0x1606);
2171
2172 e1e_wphy(hw, 0x1F31, 0xB814);
2173
2174 e1e_wphy(hw, 0x1F35, 0x002A);
2175
2176 e1e_wphy(hw, 0x1F3E, 0x0067);
2177
2178 e1e_wphy(hw, 0x1F54, 0x0065);
2179
2180 e1e_wphy(hw, 0x1F55, 0x002A);
2181
2182 e1e_wphy(hw, 0x1F56, 0x002A);
2183
2184 e1e_wphy(hw, 0x1F72, 0x3FB0);
2185
2186 e1e_wphy(hw, 0x1F76, 0xC0FF);
2187
2188 e1e_wphy(hw, 0x1F77, 0x1DEC);
2189
2190 e1e_wphy(hw, 0x1F78, 0xF9EF);
2191
2192 e1e_wphy(hw, 0x1F79, 0x0210);
2193
2194 e1e_wphy(hw, 0x1895, 0x0003);
2195
2196 e1e_wphy(hw, 0x1796, 0x0008);
2197
2198 e1e_wphy(hw, 0x1798, 0xD008);
2199
2200
2201
2202 e1e_wphy(hw, 0x1898, 0xD918);
2203
2204 e1e_wphy(hw, 0x187A, 0x0800);
2205
2206
2207
2208 e1e_wphy(hw, 0x0019, 0x008D);
2209
2210 e1e_wphy(hw, 0x001B, 0x2080);
2211
2212 e1e_wphy(hw, 0x0014, 0x0045);
2213
2214 e1e_wphy(hw, 0x0000, 0x1340);
2215
2216 return 0;
2217 }
2218
2219
2220
2221
2222
2223
2224
2225 enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
2226 {
2227 enum e1000_phy_type phy_type = e1000_phy_unknown;
2228
2229 switch (phy_id) {
2230 case M88E1000_I_PHY_ID:
2231 case M88E1000_E_PHY_ID:
2232 case M88E1111_I_PHY_ID:
2233 case M88E1011_I_PHY_ID:
2234 phy_type = e1000_phy_m88;
2235 break;
2236 case IGP01E1000_I_PHY_ID:
2237 phy_type = e1000_phy_igp_2;
2238 break;
2239 case GG82563_E_PHY_ID:
2240 phy_type = e1000_phy_gg82563;
2241 break;
2242 case IGP03E1000_E_PHY_ID:
2243 phy_type = e1000_phy_igp_3;
2244 break;
2245 case IFE_E_PHY_ID:
2246 case IFE_PLUS_E_PHY_ID:
2247 case IFE_C_E_PHY_ID:
2248 phy_type = e1000_phy_ife;
2249 break;
2250 case BME1000_E_PHY_ID:
2251 case BME1000_E_PHY_ID_R2:
2252 phy_type = e1000_phy_bm;
2253 break;
2254 case I82578_E_PHY_ID:
2255 phy_type = e1000_phy_82578;
2256 break;
2257 case I82577_E_PHY_ID:
2258 phy_type = e1000_phy_82577;
2259 break;
2260 case I82579_E_PHY_ID:
2261 phy_type = e1000_phy_82579;
2262 break;
2263 case I217_E_PHY_ID:
2264 phy_type = e1000_phy_i217;
2265 break;
2266 default:
2267 phy_type = e1000_phy_unknown;
2268 break;
2269 }
2270 return phy_type;
2271 }
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281 s32 e1000e_determine_phy_address(struct e1000_hw *hw)
2282 {
2283 u32 phy_addr = 0;
2284 u32 i;
2285 enum e1000_phy_type phy_type = e1000_phy_unknown;
2286
2287 hw->phy.id = phy_type;
2288
2289 for (phy_addr = 0; phy_addr < E1000_MAX_PHY_ADDR; phy_addr++) {
2290 hw->phy.addr = phy_addr;
2291 i = 0;
2292
2293 do {
2294 e1000e_get_phy_id(hw);
2295 phy_type = e1000e_get_phy_type_from_id(hw->phy.id);
2296
2297
2298
2299
2300 if (phy_type != e1000_phy_unknown)
2301 return 0;
2302
2303 usleep_range(1000, 2000);
2304 i++;
2305 } while (i < 10);
2306 }
2307
2308 return -E1000_ERR_PHY_TYPE;
2309 }
2310
2311
2312
2313
2314
2315
2316
2317
2318 static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg)
2319 {
2320 u32 phy_addr = 2;
2321
2322 if ((page >= 768) || (page == 0 && reg == 25) || (reg == 31))
2323 phy_addr = 1;
2324
2325 return phy_addr;
2326 }
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337 s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
2338 {
2339 s32 ret_val;
2340 u32 page = offset >> IGP_PAGE_SHIFT;
2341
2342 ret_val = hw->phy.ops.acquire(hw);
2343 if (ret_val)
2344 return ret_val;
2345
2346
2347 if (page == BM_WUC_PAGE) {
2348 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data,
2349 false, false);
2350 goto release;
2351 }
2352
2353 hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset);
2354
2355 if (offset > MAX_PHY_MULTI_PAGE_REG) {
2356 u32 page_shift, page_select;
2357
2358
2359
2360
2361
2362 if (hw->phy.addr == 1) {
2363 page_shift = IGP_PAGE_SHIFT;
2364 page_select = IGP01E1000_PHY_PAGE_SELECT;
2365 } else {
2366 page_shift = 0;
2367 page_select = BM_PHY_PAGE_SELECT;
2368 }
2369
2370
2371 ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
2372 (page << page_shift));
2373 if (ret_val)
2374 goto release;
2375 }
2376
2377 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
2378 data);
2379
2380 release:
2381 hw->phy.ops.release(hw);
2382 return ret_val;
2383 }
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395 s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
2396 {
2397 s32 ret_val;
2398 u32 page = offset >> IGP_PAGE_SHIFT;
2399
2400 ret_val = hw->phy.ops.acquire(hw);
2401 if (ret_val)
2402 return ret_val;
2403
2404
2405 if (page == BM_WUC_PAGE) {
2406 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data,
2407 true, false);
2408 goto release;
2409 }
2410
2411 hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset);
2412
2413 if (offset > MAX_PHY_MULTI_PAGE_REG) {
2414 u32 page_shift, page_select;
2415
2416
2417
2418
2419
2420 if (hw->phy.addr == 1) {
2421 page_shift = IGP_PAGE_SHIFT;
2422 page_select = IGP01E1000_PHY_PAGE_SELECT;
2423 } else {
2424 page_shift = 0;
2425 page_select = BM_PHY_PAGE_SELECT;
2426 }
2427
2428
2429 ret_val = e1000e_write_phy_reg_mdic(hw, page_select,
2430 (page << page_shift));
2431 if (ret_val)
2432 goto release;
2433 }
2434
2435 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
2436 data);
2437 release:
2438 hw->phy.ops.release(hw);
2439 return ret_val;
2440 }
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452 s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
2453 {
2454 s32 ret_val;
2455 u16 page = (u16)(offset >> IGP_PAGE_SHIFT);
2456
2457 ret_val = hw->phy.ops.acquire(hw);
2458 if (ret_val)
2459 return ret_val;
2460
2461
2462 if (page == BM_WUC_PAGE) {
2463 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data,
2464 true, false);
2465 goto release;
2466 }
2467
2468 hw->phy.addr = 1;
2469
2470 if (offset > MAX_PHY_MULTI_PAGE_REG) {
2471
2472 ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT,
2473 page);
2474
2475 if (ret_val)
2476 goto release;
2477 }
2478
2479 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
2480 data);
2481 release:
2482 hw->phy.ops.release(hw);
2483 return ret_val;
2484 }
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495 s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
2496 {
2497 s32 ret_val;
2498 u16 page = (u16)(offset >> IGP_PAGE_SHIFT);
2499
2500 ret_val = hw->phy.ops.acquire(hw);
2501 if (ret_val)
2502 return ret_val;
2503
2504
2505 if (page == BM_WUC_PAGE) {
2506 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data,
2507 false, false);
2508 goto release;
2509 }
2510
2511 hw->phy.addr = 1;
2512
2513 if (offset > MAX_PHY_MULTI_PAGE_REG) {
2514
2515 ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT,
2516 page);
2517
2518 if (ret_val)
2519 goto release;
2520 }
2521
2522 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset,
2523 data);
2524
2525 release:
2526 hw->phy.ops.release(hw);
2527 return ret_val;
2528 }
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538 s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
2539 {
2540 s32 ret_val;
2541 u16 temp;
2542
2543
2544 hw->phy.addr = 1;
2545
2546
2547 ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
2548 if (ret_val) {
2549 e_dbg("Could not set Port Control page\n");
2550 return ret_val;
2551 }
2552
2553 ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
2554 if (ret_val) {
2555 e_dbg("Could not read PHY register %d.%d\n",
2556 BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
2557 return ret_val;
2558 }
2559
2560
2561
2562
2563 temp = *phy_reg;
2564 temp |= BM_WUC_ENABLE_BIT;
2565 temp &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
2566
2567 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, temp);
2568 if (ret_val) {
2569 e_dbg("Could not write PHY register %d.%d\n",
2570 BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
2571 return ret_val;
2572 }
2573
2574
2575
2576
2577 return e1000_set_page_igp(hw, (BM_WUC_PAGE << IGP_PAGE_SHIFT));
2578 }
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591 s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
2592 {
2593 s32 ret_val;
2594
2595
2596 ret_val = e1000_set_page_igp(hw, (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT));
2597 if (ret_val) {
2598 e_dbg("Could not set Port Control page\n");
2599 return ret_val;
2600 }
2601
2602
2603 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, *phy_reg);
2604 if (ret_val)
2605 e_dbg("Could not restore PHY register %d.%d\n",
2606 BM_PORT_CTRL_PAGE, BM_WUC_ENABLE_REG);
2607
2608 return ret_val;
2609 }
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636 static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
2637 u16 *data, bool read, bool page_set)
2638 {
2639 s32 ret_val;
2640 u16 reg = BM_PHY_REG_NUM(offset);
2641 u16 page = BM_PHY_REG_PAGE(offset);
2642 u16 phy_reg = 0;
2643
2644
2645 if ((hw->mac.type == e1000_pchlan) &&
2646 (!(er32(PHY_CTRL) & E1000_PHY_CTRL_GBE_DISABLE)))
2647 e_dbg("Attempting to access page %d while gig enabled.\n",
2648 page);
2649
2650 if (!page_set) {
2651
2652 ret_val = e1000_enable_phy_wakeup_reg_access_bm(hw, &phy_reg);
2653 if (ret_val) {
2654 e_dbg("Could not enable PHY wakeup reg access\n");
2655 return ret_val;
2656 }
2657 }
2658
2659 e_dbg("Accessing PHY page %d reg 0x%x\n", page, reg);
2660
2661
2662 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg);
2663 if (ret_val) {
2664 e_dbg("Could not write address opcode to page %d\n", page);
2665 return ret_val;
2666 }
2667
2668 if (read) {
2669
2670 ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE,
2671 data);
2672 } else {
2673
2674 ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE,
2675 *data);
2676 }
2677
2678 if (ret_val) {
2679 e_dbg("Could not access PHY reg %d.%d\n", page, reg);
2680 return ret_val;
2681 }
2682
2683 if (!page_set)
2684 ret_val = e1000_disable_phy_wakeup_reg_access_bm(hw, &phy_reg);
2685
2686 return ret_val;
2687 }
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697 void e1000_power_up_phy_copper(struct e1000_hw *hw)
2698 {
2699 u16 mii_reg = 0;
2700
2701
2702 e1e_rphy(hw, MII_BMCR, &mii_reg);
2703 mii_reg &= ~BMCR_PDOWN;
2704 e1e_wphy(hw, MII_BMCR, mii_reg);
2705 }
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715 void e1000_power_down_phy_copper(struct e1000_hw *hw)
2716 {
2717 u16 mii_reg = 0;
2718
2719
2720 e1e_rphy(hw, MII_BMCR, &mii_reg);
2721 mii_reg |= BMCR_PDOWN;
2722 e1e_wphy(hw, MII_BMCR, mii_reg);
2723 usleep_range(1000, 2000);
2724 }
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738 static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data,
2739 bool locked, bool page_set)
2740 {
2741 s32 ret_val;
2742 u16 page = BM_PHY_REG_PAGE(offset);
2743 u16 reg = BM_PHY_REG_NUM(offset);
2744 u32 phy_addr = hw->phy.addr = e1000_get_phy_addr_for_hv_page(page);
2745
2746 if (!locked) {
2747 ret_val = hw->phy.ops.acquire(hw);
2748 if (ret_val)
2749 return ret_val;
2750 }
2751
2752
2753 if (page == BM_WUC_PAGE) {
2754 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data,
2755 true, page_set);
2756 goto out;
2757 }
2758
2759 if (page > 0 && page < HV_INTC_FC_PAGE_START) {
2760 ret_val = e1000_access_phy_debug_regs_hv(hw, offset,
2761 data, true);
2762 goto out;
2763 }
2764
2765 if (!page_set) {
2766 if (page == HV_INTC_FC_PAGE_START)
2767 page = 0;
2768
2769 if (reg > MAX_PHY_MULTI_PAGE_REG) {
2770
2771 ret_val = e1000_set_page_igp(hw,
2772 (page << IGP_PAGE_SHIFT));
2773
2774 hw->phy.addr = phy_addr;
2775
2776 if (ret_val)
2777 goto out;
2778 }
2779 }
2780
2781 e_dbg("reading PHY page %d (or 0x%x shifted) reg 0x%x\n", page,
2782 page << IGP_PAGE_SHIFT, reg);
2783
2784 ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, data);
2785 out:
2786 if (!locked)
2787 hw->phy.ops.release(hw);
2788
2789 return ret_val;
2790 }
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802 s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data)
2803 {
2804 return __e1000_read_phy_reg_hv(hw, offset, data, false, false);
2805 }
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816 s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 *data)
2817 {
2818 return __e1000_read_phy_reg_hv(hw, offset, data, true, false);
2819 }
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830 s32 e1000_read_phy_reg_page_hv(struct e1000_hw *hw, u32 offset, u16 *data)
2831 {
2832 return __e1000_read_phy_reg_hv(hw, offset, data, true, true);
2833 }
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846 static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,
2847 bool locked, bool page_set)
2848 {
2849 s32 ret_val;
2850 u16 page = BM_PHY_REG_PAGE(offset);
2851 u16 reg = BM_PHY_REG_NUM(offset);
2852 u32 phy_addr = hw->phy.addr = e1000_get_phy_addr_for_hv_page(page);
2853
2854 if (!locked) {
2855 ret_val = hw->phy.ops.acquire(hw);
2856 if (ret_val)
2857 return ret_val;
2858 }
2859
2860
2861 if (page == BM_WUC_PAGE) {
2862 ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data,
2863 false, page_set);
2864 goto out;
2865 }
2866
2867 if (page > 0 && page < HV_INTC_FC_PAGE_START) {
2868 ret_val = e1000_access_phy_debug_regs_hv(hw, offset,
2869 &data, false);
2870 goto out;
2871 }
2872
2873 if (!page_set) {
2874 if (page == HV_INTC_FC_PAGE_START)
2875 page = 0;
2876
2877
2878
2879
2880 if ((hw->phy.type == e1000_phy_82578) &&
2881 (hw->phy.revision >= 1) &&
2882 (hw->phy.addr == 2) &&
2883 !(MAX_PHY_REG_ADDRESS & reg) && (data & BIT(11))) {
2884 u16 data2 = 0x7EFF;
2885
2886 ret_val = e1000_access_phy_debug_regs_hv(hw,
2887 BIT(6) | 0x3,
2888 &data2, false);
2889 if (ret_val)
2890 goto out;
2891 }
2892
2893 if (reg > MAX_PHY_MULTI_PAGE_REG) {
2894
2895 ret_val = e1000_set_page_igp(hw,
2896 (page << IGP_PAGE_SHIFT));
2897
2898 hw->phy.addr = phy_addr;
2899
2900 if (ret_val)
2901 goto out;
2902 }
2903 }
2904
2905 e_dbg("writing PHY page %d (or 0x%x shifted) reg 0x%x\n", page,
2906 page << IGP_PAGE_SHIFT, reg);
2907
2908 ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg,
2909 data);
2910
2911 out:
2912 if (!locked)
2913 hw->phy.ops.release(hw);
2914
2915 return ret_val;
2916 }
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927 s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data)
2928 {
2929 return __e1000_write_phy_reg_hv(hw, offset, data, false, false);
2930 }
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941 s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 data)
2942 {
2943 return __e1000_write_phy_reg_hv(hw, offset, data, true, false);
2944 }
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955 s32 e1000_write_phy_reg_page_hv(struct e1000_hw *hw, u32 offset, u16 data)
2956 {
2957 return __e1000_write_phy_reg_hv(hw, offset, data, true, true);
2958 }
2959
2960
2961
2962
2963
2964 static u32 e1000_get_phy_addr_for_hv_page(u32 page)
2965 {
2966 u32 phy_addr = 2;
2967
2968 if (page >= HV_INTC_FC_PAGE_START)
2969 phy_addr = 1;
2970
2971 return phy_addr;
2972 }
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986 static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
2987 u16 *data, bool read)
2988 {
2989 s32 ret_val;
2990 u32 addr_reg;
2991 u32 data_reg;
2992
2993
2994 addr_reg = ((hw->phy.type == e1000_phy_82578) ?
2995 I82578_ADDR_REG : I82577_ADDR_REG);
2996 data_reg = addr_reg + 1;
2997
2998
2999 hw->phy.addr = 2;
3000
3001
3002 ret_val = e1000e_write_phy_reg_mdic(hw, addr_reg, (u16)offset & 0x3F);
3003 if (ret_val) {
3004 e_dbg("Could not write the Address Offset port register\n");
3005 return ret_val;
3006 }
3007
3008
3009 if (read)
3010 ret_val = e1000e_read_phy_reg_mdic(hw, data_reg, data);
3011 else
3012 ret_val = e1000e_write_phy_reg_mdic(hw, data_reg, *data);
3013
3014 if (ret_val)
3015 e_dbg("Could not access the Data port register\n");
3016
3017 return ret_val;
3018 }
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031 s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
3032 {
3033 s32 ret_val = 0;
3034 u16 data;
3035
3036 if (hw->phy.type != e1000_phy_82578)
3037 return 0;
3038
3039
3040 e1e_rphy(hw, MII_BMCR, &data);
3041 if (data & BMCR_LOOPBACK)
3042 return 0;
3043
3044
3045 ret_val = e1e_rphy(hw, BM_CS_STATUS, &data);
3046 if (ret_val)
3047 return ret_val;
3048
3049 data &= (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED |
3050 BM_CS_STATUS_SPEED_MASK);
3051
3052 if (data != (BM_CS_STATUS_LINK_UP | BM_CS_STATUS_RESOLVED |
3053 BM_CS_STATUS_SPEED_1000))
3054 return 0;
3055
3056 msleep(200);
3057
3058
3059 ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL,
3060 (HV_MUX_DATA_CTRL_GEN_TO_MAC |
3061 HV_MUX_DATA_CTRL_FORCE_SPEED));
3062 if (ret_val)
3063 return ret_val;
3064
3065 return e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC);
3066 }
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076 s32 e1000_check_polarity_82577(struct e1000_hw *hw)
3077 {
3078 struct e1000_phy_info *phy = &hw->phy;
3079 s32 ret_val;
3080 u16 data;
3081
3082 ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data);
3083
3084 if (!ret_val)
3085 phy->cable_polarity = ((data & I82577_PHY_STATUS2_REV_POLARITY)
3086 ? e1000_rev_polarity_reversed
3087 : e1000_rev_polarity_normal);
3088
3089 return ret_val;
3090 }
3091
3092
3093
3094
3095
3096
3097
3098 s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
3099 {
3100 struct e1000_phy_info *phy = &hw->phy;
3101 s32 ret_val;
3102 u16 phy_data;
3103 bool link;
3104
3105 ret_val = e1e_rphy(hw, MII_BMCR, &phy_data);
3106 if (ret_val)
3107 return ret_val;
3108
3109 e1000e_phy_force_speed_duplex_setup(hw, &phy_data);
3110
3111 ret_val = e1e_wphy(hw, MII_BMCR, phy_data);
3112 if (ret_val)
3113 return ret_val;
3114
3115 udelay(1);
3116
3117 if (phy->autoneg_wait_to_complete) {
3118 e_dbg("Waiting for forced speed/duplex link on 82577 phy\n");
3119
3120 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
3121 100000, &link);
3122 if (ret_val)
3123 return ret_val;
3124
3125 if (!link)
3126 e_dbg("Link taking longer than expected.\n");
3127
3128
3129 ret_val = e1000e_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
3130 100000, &link);
3131 }
3132
3133 return ret_val;
3134 }
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145 s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
3146 {
3147 struct e1000_phy_info *phy = &hw->phy;
3148 s32 ret_val;
3149 u16 data;
3150 bool link;
3151
3152 ret_val = e1000e_phy_has_link_generic(hw, 1, 0, &link);
3153 if (ret_val)
3154 return ret_val;
3155
3156 if (!link) {
3157 e_dbg("Phy info is only valid if link is up\n");
3158 return -E1000_ERR_CONFIG;
3159 }
3160
3161 phy->polarity_correction = true;
3162
3163 ret_val = e1000_check_polarity_82577(hw);
3164 if (ret_val)
3165 return ret_val;
3166
3167 ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data);
3168 if (ret_val)
3169 return ret_val;
3170
3171 phy->is_mdix = !!(data & I82577_PHY_STATUS2_MDIX);
3172
3173 if ((data & I82577_PHY_STATUS2_SPEED_MASK) ==
3174 I82577_PHY_STATUS2_SPEED_1000MBPS) {
3175 ret_val = hw->phy.ops.get_cable_length(hw);
3176 if (ret_val)
3177 return ret_val;
3178
3179 ret_val = e1e_rphy(hw, MII_STAT1000, &data);
3180 if (ret_val)
3181 return ret_val;
3182
3183 phy->local_rx = (data & LPA_1000LOCALRXOK)
3184 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
3185
3186 phy->remote_rx = (data & LPA_1000REMRXOK)
3187 ? e1000_1000t_rx_status_ok : e1000_1000t_rx_status_not_ok;
3188 } else {
3189 phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED;
3190 phy->local_rx = e1000_1000t_rx_status_undefined;
3191 phy->remote_rx = e1000_1000t_rx_status_undefined;
3192 }
3193
3194 return 0;
3195 }
3196
3197
3198
3199
3200
3201
3202
3203
3204 s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
3205 {
3206 struct e1000_phy_info *phy = &hw->phy;
3207 s32 ret_val;
3208 u16 phy_data, length;
3209
3210 ret_val = e1e_rphy(hw, I82577_PHY_DIAG_STATUS, &phy_data);
3211 if (ret_val)
3212 return ret_val;
3213
3214 length = ((phy_data & I82577_DSTATUS_CABLE_LENGTH) >>
3215 I82577_DSTATUS_CABLE_LENGTH_SHIFT);
3216
3217 if (length == E1000_CABLE_LENGTH_UNDEFINED)
3218 return -E1000_ERR_PHY;
3219
3220 phy->cable_length = length;
3221
3222 return 0;
3223 }