00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 FILE_LICENCE ( GPL2_ONLY );
00029
00030 #include "igb.h"
00031
00032 static s32 igb_set_default_fc_generic(struct e1000_hw *hw);
00033 static s32 igb_commit_fc_settings_generic(struct e1000_hw *hw);
00034 static s32 igb_poll_fiber_serdes_link_generic(struct e1000_hw *hw);
00035 static s32 igb_validate_mdi_setting_generic(struct e1000_hw *hw);
00036 static void igb_set_lan_id_multi_port_pcie(struct e1000_hw *hw);
00037
00038
00039
00040
00041
00042
00043
00044 void igb_init_mac_ops_generic(struct e1000_hw *hw)
00045 {
00046 struct e1000_mac_info *mac = &hw->mac;
00047 DEBUGFUNC("igb_init_mac_ops_generic");
00048
00049
00050 mac->ops.set_lan_id = igb_set_lan_id_multi_port_pcie;
00051 mac->ops.read_mac_addr = igb_read_mac_addr_generic;
00052 mac->ops.config_collision_dist = igb_config_collision_dist_generic;
00053
00054 mac->ops.wait_autoneg = igb_wait_autoneg_generic;
00055
00056 #if 0
00057 mac->ops.mng_host_if_write = igb_mng_host_if_write_generic;
00058 mac->ops.mng_write_cmd_header = igb_mng_write_cmd_header_generic;
00059 mac->ops.mng_enable_host_if = igb_mng_enable_host_if_generic;
00060 #endif
00061
00062 mac->ops.rar_set = igb_rar_set_generic;
00063 mac->ops.validate_mdi_setting = igb_validate_mdi_setting_generic;
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 s32 igb_get_bus_info_pcie_generic(struct e1000_hw *hw)
00075 {
00076 struct e1000_mac_info *mac = &hw->mac;
00077 struct e1000_bus_info *bus = &hw->bus;
00078
00079 s32 ret_val;
00080 u16 pcie_link_status;
00081
00082 DEBUGFUNC("igb_get_bus_info_pcie_generic");
00083
00084 bus->type = e1000_bus_type_pci_express;
00085 bus->speed = e1000_bus_speed_2500;
00086
00087 ret_val = igb_read_pcie_cap_reg(hw,
00088 PCIE_LINK_STATUS,
00089 &pcie_link_status);
00090 if (ret_val)
00091 bus->width = e1000_bus_width_unknown;
00092 else
00093 bus->width = (enum e1000_bus_width)((pcie_link_status &
00094 PCIE_LINK_WIDTH_MASK) >>
00095 PCIE_LINK_WIDTH_SHIFT);
00096
00097 mac->ops.set_lan_id(hw);
00098
00099 return E1000_SUCCESS;
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 static void igb_set_lan_id_multi_port_pcie(struct e1000_hw *hw)
00111 {
00112 struct e1000_bus_info *bus = &hw->bus;
00113 u32 reg;
00114
00115
00116
00117
00118
00119 reg = E1000_READ_REG(hw, E1000_STATUS);
00120 bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129 void igb_set_lan_id_single_port(struct e1000_hw *hw)
00130 {
00131 struct e1000_bus_info *bus = &hw->bus;
00132
00133 bus->func = 0;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 void igb_clear_vfta_generic(struct e1000_hw *hw)
00144 {
00145 u32 offset;
00146
00147 DEBUGFUNC("igb_clear_vfta_generic");
00148
00149 for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
00150 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
00151 E1000_WRITE_FLUSH(hw);
00152 }
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 void igb_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
00165 {
00166 DEBUGFUNC("igb_write_vfta_generic");
00167
00168 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
00169 E1000_WRITE_FLUSH(hw);
00170 }
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 void igb_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count)
00182 {
00183 u32 i;
00184 u8 mac_addr[ETH_ADDR_LEN] = {0};
00185
00186 DEBUGFUNC("igb_init_rx_addrs_generic");
00187
00188
00189 DEBUGOUT("Programming MAC Address into RAR[0]\n");
00190
00191 hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
00192
00193
00194 DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1);
00195 for (i = 1; i < rar_count; i++)
00196 hw->mac.ops.rar_set(hw, mac_addr, i);
00197 }
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 s32 igb_check_alt_mac_addr_generic(struct e1000_hw *hw)
00212 {
00213 u32 i;
00214 s32 ret_val = E1000_SUCCESS;
00215 u16 offset, nvm_alt_mac_addr_offset, nvm_data;
00216 u8 alt_mac_addr[ETH_ADDR_LEN];
00217
00218 DEBUGFUNC("igb_check_alt_mac_addr_generic");
00219
00220 ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1,
00221 &nvm_alt_mac_addr_offset);
00222 if (ret_val) {
00223 DEBUGOUT("NVM Read Error\n");
00224 goto out;
00225 }
00226
00227 if (nvm_alt_mac_addr_offset == 0xFFFF) {
00228
00229 goto out;
00230 }
00231
00232 if (hw->bus.func == E1000_FUNC_1)
00233 nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1;
00234 for (i = 0; i < ETH_ADDR_LEN; i += 2) {
00235 offset = nvm_alt_mac_addr_offset + (i >> 1);
00236 ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data);
00237 if (ret_val) {
00238 DEBUGOUT("NVM Read Error\n");
00239 goto out;
00240 }
00241
00242 alt_mac_addr[i] = (u8)(nvm_data & 0xFF);
00243 alt_mac_addr[i + 1] = (u8)(nvm_data >> 8);
00244 }
00245
00246
00247 if (alt_mac_addr[0] & 0x01) {
00248 DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n");
00249 goto out;
00250 }
00251
00252
00253
00254
00255
00256
00257 hw->mac.ops.rar_set(hw, alt_mac_addr, 0);
00258
00259 out:
00260 return ret_val;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 void igb_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index)
00273 {
00274 u32 rar_low, rar_high;
00275
00276 DEBUGFUNC("igb_rar_set_generic");
00277
00278
00279
00280
00281
00282 rar_low = ((u32) addr[0] |
00283 ((u32) addr[1] << 8) |
00284 ((u32) addr[2] << 16) | ((u32) addr[3] << 24));
00285
00286 rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
00287
00288
00289 if (rar_low || rar_high)
00290 rar_high |= E1000_RAH_AV;
00291
00292
00293
00294
00295
00296
00297 E1000_WRITE_REG(hw, E1000_RAL(index), rar_low);
00298 E1000_WRITE_FLUSH(hw);
00299 E1000_WRITE_REG(hw, E1000_RAH(index), rar_high);
00300 E1000_WRITE_FLUSH(hw);
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 void igb_mta_set_generic(struct e1000_hw *hw, u32 hash_value)
00314 {
00315 u32 hash_bit, hash_reg, mta;
00316
00317 DEBUGFUNC("igb_mta_set_generic");
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
00329 hash_bit = hash_value & 0x1F;
00330
00331 mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg);
00332
00333 mta |= (1 << hash_bit);
00334
00335 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta);
00336 E1000_WRITE_FLUSH(hw);
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 void igb_update_mc_addr_list_generic(struct e1000_hw *hw,
00349 u8 *mc_addr_list, u32 mc_addr_count)
00350 {
00351 u32 hash_value, hash_bit, hash_reg;
00352 int i;
00353
00354 DEBUGFUNC("igb_update_mc_addr_list_generic");
00355
00356
00357 memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
00358
00359
00360 for (i = 0; (u32) i < mc_addr_count; i++) {
00361 hash_value = igb_hash_mc_addr_generic(hw, mc_addr_list);
00362
00363 hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
00364 hash_bit = hash_value & 0x1F;
00365
00366 hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
00367 mc_addr_list += (ETH_ADDR_LEN);
00368 }
00369
00370
00371 for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
00372 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]);
00373 E1000_WRITE_FLUSH(hw);
00374 }
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 u32 igb_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr)
00386 {
00387 u32 hash_value, hash_mask;
00388 u8 bit_shift = 0;
00389
00390 DEBUGFUNC("igb_hash_mc_addr_generic");
00391
00392
00393 hash_mask = (hw->mac.mta_reg_count * 32) - 1;
00394
00395
00396
00397
00398
00399 while (hash_mask >> bit_shift != 0xFF)
00400 bit_shift++;
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428 switch (hw->mac.mc_filter_type) {
00429 default:
00430 case 0:
00431 break;
00432 case 1:
00433 bit_shift += 1;
00434 break;
00435 case 2:
00436 bit_shift += 2;
00437 break;
00438 case 3:
00439 bit_shift += 4;
00440 break;
00441 }
00442
00443 hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
00444 (((u16) mc_addr[5]) << bit_shift)));
00445
00446 return hash_value;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455 void igb_clear_hw_cntrs_base_generic(struct e1000_hw *hw)
00456 {
00457 DEBUGFUNC("igb_clear_hw_cntrs_base_generic");
00458
00459 E1000_READ_REG(hw, E1000_CRCERRS);
00460 E1000_READ_REG(hw, E1000_SYMERRS);
00461 E1000_READ_REG(hw, E1000_MPC);
00462 E1000_READ_REG(hw, E1000_SCC);
00463 E1000_READ_REG(hw, E1000_ECOL);
00464 E1000_READ_REG(hw, E1000_MCC);
00465 E1000_READ_REG(hw, E1000_LATECOL);
00466 E1000_READ_REG(hw, E1000_COLC);
00467 E1000_READ_REG(hw, E1000_DC);
00468 E1000_READ_REG(hw, E1000_SEC);
00469 E1000_READ_REG(hw, E1000_RLEC);
00470 E1000_READ_REG(hw, E1000_XONRXC);
00471 E1000_READ_REG(hw, E1000_XONTXC);
00472 E1000_READ_REG(hw, E1000_XOFFRXC);
00473 E1000_READ_REG(hw, E1000_XOFFTXC);
00474 E1000_READ_REG(hw, E1000_FCRUC);
00475 E1000_READ_REG(hw, E1000_GPRC);
00476 E1000_READ_REG(hw, E1000_BPRC);
00477 E1000_READ_REG(hw, E1000_MPRC);
00478 E1000_READ_REG(hw, E1000_GPTC);
00479 E1000_READ_REG(hw, E1000_GORCL);
00480 E1000_READ_REG(hw, E1000_GORCH);
00481 E1000_READ_REG(hw, E1000_GOTCL);
00482 E1000_READ_REG(hw, E1000_GOTCH);
00483 E1000_READ_REG(hw, E1000_RNBC);
00484 E1000_READ_REG(hw, E1000_RUC);
00485 E1000_READ_REG(hw, E1000_RFC);
00486 E1000_READ_REG(hw, E1000_ROC);
00487 E1000_READ_REG(hw, E1000_RJC);
00488 E1000_READ_REG(hw, E1000_TORL);
00489 E1000_READ_REG(hw, E1000_TORH);
00490 E1000_READ_REG(hw, E1000_TOTL);
00491 E1000_READ_REG(hw, E1000_TOTH);
00492 E1000_READ_REG(hw, E1000_TPR);
00493 E1000_READ_REG(hw, E1000_TPT);
00494 E1000_READ_REG(hw, E1000_MPTC);
00495 E1000_READ_REG(hw, E1000_BPTC);
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 s32 igb_check_for_copper_link_generic(struct e1000_hw *hw)
00507 {
00508 struct e1000_mac_info *mac = &hw->mac;
00509 s32 ret_val;
00510 bool link;
00511
00512 DEBUGFUNC("igb_check_for_copper_link");
00513
00514
00515
00516
00517
00518
00519
00520 if (!mac->get_link_status) {
00521 ret_val = E1000_SUCCESS;
00522 goto out;
00523 }
00524
00525
00526
00527
00528
00529
00530 ret_val = igb_phy_has_link_generic(hw, 1, 0, &link);
00531 if (ret_val)
00532 goto out;
00533
00534 if (!link)
00535 goto out;
00536
00537 mac->get_link_status = false;
00538
00539
00540
00541
00542
00543 igb_check_downshift_generic(hw);
00544
00545
00546
00547
00548
00549 if (!mac->autoneg) {
00550 ret_val = -E1000_ERR_CONFIG;
00551 goto out;
00552 }
00553
00554
00555
00556
00557
00558
00559 igb_config_collision_dist_generic(hw);
00560
00561
00562
00563
00564
00565
00566
00567 ret_val = igb_config_fc_after_link_up_generic(hw);
00568 if (ret_val) {
00569 DEBUGOUT("Error configuring flow control\n");
00570 }
00571 out:
00572 return ret_val;
00573 }
00574
00575
00576
00577
00578
00579
00580
00581
00582 s32 igb_check_for_fiber_link_generic(struct e1000_hw *hw)
00583 {
00584 struct e1000_mac_info *mac = &hw->mac;
00585 u32 rxcw;
00586 u32 ctrl;
00587 u32 status;
00588 s32 ret_val = E1000_SUCCESS;
00589
00590 DEBUGFUNC("igb_check_for_fiber_link_generic");
00591
00592 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00593 status = E1000_READ_REG(hw, E1000_STATUS);
00594 rxcw = E1000_READ_REG(hw, E1000_RXCW);
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605 if ((ctrl & E1000_CTRL_SWDPIN1) && (!(status & E1000_STATUS_LU)) &&
00606 (!(rxcw & E1000_RXCW_C))) {
00607 if (mac->autoneg_failed == 0) {
00608 mac->autoneg_failed = 1;
00609 goto out;
00610 }
00611 DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
00612
00613
00614 E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE));
00615
00616
00617 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00618 ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
00619 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
00620
00621
00622 ret_val = igb_config_fc_after_link_up_generic(hw);
00623 if (ret_val) {
00624 DEBUGOUT("Error configuring flow control\n");
00625 goto out;
00626 }
00627 } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
00628
00629
00630
00631
00632
00633
00634 DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
00635 E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
00636 E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU));
00637
00638 mac->serdes_has_link = true;
00639 }
00640
00641 out:
00642 return ret_val;
00643 }
00644
00645
00646
00647
00648
00649
00650
00651
00652 s32 igb_check_for_serdes_link_generic(struct e1000_hw *hw)
00653 {
00654 struct e1000_mac_info *mac = &hw->mac;
00655 u32 rxcw;
00656 u32 ctrl;
00657 u32 status;
00658 s32 ret_val = E1000_SUCCESS;
00659
00660 DEBUGFUNC("igb_check_for_serdes_link_generic");
00661
00662 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00663 status = E1000_READ_REG(hw, E1000_STATUS);
00664 rxcw = E1000_READ_REG(hw, E1000_RXCW);
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674 if ((!(status & E1000_STATUS_LU)) && (!(rxcw & E1000_RXCW_C))) {
00675 if (mac->autoneg_failed == 0) {
00676 mac->autoneg_failed = 1;
00677 goto out;
00678 }
00679 DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
00680
00681
00682 E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE));
00683
00684
00685 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00686 ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
00687 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
00688
00689
00690 ret_val = igb_config_fc_after_link_up_generic(hw);
00691 if (ret_val) {
00692 DEBUGOUT("Error configuring flow control\n");
00693 goto out;
00694 }
00695 } else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
00696
00697
00698
00699
00700
00701
00702 DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
00703 E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
00704 E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU));
00705
00706 mac->serdes_has_link = true;
00707 } else if (!(E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW))) {
00708
00709
00710
00711
00712
00713
00714 usec_delay(10);
00715 rxcw = E1000_READ_REG(hw, E1000_RXCW);
00716 if (rxcw & E1000_RXCW_SYNCH) {
00717 if (!(rxcw & E1000_RXCW_IV)) {
00718 mac->serdes_has_link = true;
00719 DEBUGOUT("SERDES: Link up - forced.\n");
00720 }
00721 } else {
00722 mac->serdes_has_link = false;
00723 DEBUGOUT("SERDES: Link down - force failed.\n");
00724 }
00725 }
00726
00727 if (E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW)) {
00728 status = E1000_READ_REG(hw, E1000_STATUS);
00729 if (status & E1000_STATUS_LU) {
00730
00731 usec_delay(10);
00732 rxcw = E1000_READ_REG(hw, E1000_RXCW);
00733 if (rxcw & E1000_RXCW_SYNCH) {
00734 if (!(rxcw & E1000_RXCW_IV)) {
00735 mac->serdes_has_link = true;
00736 DEBUGOUT("SERDES: Link up - autoneg "
00737 "completed sucessfully.\n");
00738 } else {
00739 mac->serdes_has_link = false;
00740 DEBUGOUT("SERDES: Link down - invalid"
00741 "codewords detected in autoneg.\n");
00742 }
00743 } else {
00744 mac->serdes_has_link = false;
00745 DEBUGOUT("SERDES: Link down - no sync.\n");
00746 }
00747 } else {
00748 mac->serdes_has_link = false;
00749 DEBUGOUT("SERDES: Link down - autoneg failed\n");
00750 }
00751 }
00752
00753 out:
00754 return ret_val;
00755 }
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767 s32 igb_setup_link_generic(struct e1000_hw *hw)
00768 {
00769 s32 ret_val = E1000_SUCCESS;
00770
00771 DEBUGFUNC("igb_setup_link_generic");
00772
00773
00774
00775
00776
00777 if (hw->phy.ops.check_reset_block)
00778 if (hw->phy.ops.check_reset_block(hw))
00779 goto out;
00780
00781
00782
00783
00784
00785 if (hw->fc.requested_mode == e1000_fc_default) {
00786 ret_val = igb_set_default_fc_generic(hw);
00787 if (ret_val)
00788 goto out;
00789 }
00790
00791
00792
00793
00794
00795 hw->fc.current_mode = hw->fc.requested_mode;
00796
00797 DEBUGOUT1("After fix-ups FlowControl is now = %x\n",
00798 hw->fc.current_mode);
00799
00800
00801 ret_val = hw->mac.ops.setup_physical_interface(hw);
00802 if (ret_val)
00803 goto out;
00804
00805
00806
00807
00808
00809
00810
00811 DEBUGOUT("Initializing the Flow Control address, type and timer regs\n");
00812 E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE);
00813 E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH);
00814 E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW);
00815
00816 E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time);
00817
00818 ret_val = igb_set_fc_watermarks_generic(hw);
00819
00820 out:
00821 return ret_val;
00822 }
00823
00824
00825
00826
00827
00828
00829
00830
00831 s32 igb_setup_fiber_serdes_link_generic(struct e1000_hw *hw)
00832 {
00833 u32 ctrl;
00834 s32 ret_val = E1000_SUCCESS;
00835
00836 DEBUGFUNC("igb_setup_fiber_serdes_link_generic");
00837
00838 ctrl = E1000_READ_REG(hw, E1000_CTRL);
00839
00840
00841 ctrl &= ~E1000_CTRL_LRST;
00842
00843 igb_config_collision_dist_generic(hw);
00844
00845 ret_val = igb_commit_fc_settings_generic(hw);
00846 if (ret_val)
00847 goto out;
00848
00849
00850
00851
00852
00853
00854
00855
00856 DEBUGOUT("Auto-negotiation enabled\n");
00857
00858 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
00859 E1000_WRITE_FLUSH(hw);
00860 msec_delay(1);
00861
00862
00863
00864
00865
00866
00867 if (hw->phy.media_type == e1000_media_type_internal_serdes ||
00868 (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) {
00869 ret_val = igb_poll_fiber_serdes_link_generic(hw);
00870 } else {
00871 DEBUGOUT("No signal detected\n");
00872 }
00873
00874 out:
00875 return ret_val;
00876 }
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886 void igb_config_collision_dist_generic(struct e1000_hw *hw)
00887 {
00888 u32 tctl;
00889
00890 DEBUGFUNC("igb_config_collision_dist_generic");
00891
00892 tctl = E1000_READ_REG(hw, E1000_TCTL);
00893
00894 tctl &= ~E1000_TCTL_COLD;
00895 tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT;
00896
00897 E1000_WRITE_REG(hw, E1000_TCTL, tctl);
00898 E1000_WRITE_FLUSH(hw);
00899 }
00900
00901
00902
00903
00904
00905
00906
00907
00908 static s32 igb_poll_fiber_serdes_link_generic(struct e1000_hw *hw)
00909 {
00910 struct e1000_mac_info *mac = &hw->mac;
00911 u32 i, status;
00912 s32 ret_val = E1000_SUCCESS;
00913
00914 DEBUGFUNC("igb_poll_fiber_serdes_link_generic");
00915
00916
00917
00918
00919
00920
00921
00922
00923 for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) {
00924 msec_delay(10);
00925 status = E1000_READ_REG(hw, E1000_STATUS);
00926 if (status & E1000_STATUS_LU)
00927 break;
00928 }
00929 if (i == FIBER_LINK_UP_LIMIT) {
00930 DEBUGOUT("Never got a valid link from auto-neg!!!\n");
00931 mac->autoneg_failed = 1;
00932
00933
00934
00935
00936
00937
00938 ret_val = hw->mac.ops.check_for_link(hw);
00939 if (ret_val) {
00940 DEBUGOUT("Error while checking for link\n");
00941 goto out;
00942 }
00943 mac->autoneg_failed = 0;
00944 } else {
00945 mac->autoneg_failed = 0;
00946 DEBUGOUT("Valid Link Found\n");
00947 }
00948
00949 out:
00950 return ret_val;
00951 }
00952
00953
00954
00955
00956
00957
00958
00959
00960 static s32 igb_commit_fc_settings_generic(struct e1000_hw *hw)
00961 {
00962 struct e1000_mac_info *mac = &hw->mac;
00963 u32 txcw;
00964 s32 ret_val = E1000_SUCCESS;
00965
00966 DEBUGFUNC("igb_commit_fc_settings_generic");
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985 switch (hw->fc.current_mode) {
00986 case e1000_fc_none:
00987
00988 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
00989 break;
00990 case e1000_fc_rx_pause:
00991
00992
00993
00994
00995
00996
00997
00998
00999 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
01000 break;
01001 case e1000_fc_tx_pause:
01002
01003
01004
01005
01006 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
01007 break;
01008 case e1000_fc_full:
01009
01010
01011
01012
01013 txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
01014 break;
01015 default:
01016 DEBUGOUT("Flow control param set incorrectly\n");
01017 ret_val = -E1000_ERR_CONFIG;
01018 goto out;
01019 break;
01020 }
01021
01022 E1000_WRITE_REG(hw, E1000_TXCW, txcw);
01023 mac->txcw = txcw;
01024
01025 out:
01026 return ret_val;
01027 }
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037 s32 igb_set_fc_watermarks_generic(struct e1000_hw *hw)
01038 {
01039 s32 ret_val = E1000_SUCCESS;
01040 u32 fcrtl = 0, fcrth = 0;
01041
01042 DEBUGFUNC("igb_set_fc_watermarks_generic");
01043
01044
01045
01046
01047
01048
01049
01050
01051 if (hw->fc.current_mode & e1000_fc_tx_pause) {
01052
01053
01054
01055
01056
01057 fcrtl = hw->fc.low_water;
01058 if (hw->fc.send_xon)
01059 fcrtl |= E1000_FCRTL_XONE;
01060
01061 fcrth = hw->fc.high_water;
01062 }
01063 E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl);
01064 E1000_WRITE_REG(hw, E1000_FCRTH, fcrth);
01065
01066 return ret_val;
01067 }
01068
01069
01070
01071
01072
01073
01074
01075
01076 static s32 igb_set_default_fc_generic(struct e1000_hw *hw)
01077 {
01078 s32 ret_val = E1000_SUCCESS;
01079 u16 nvm_data;
01080
01081 DEBUGFUNC("igb_set_default_fc_generic");
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092 ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG, 1, &nvm_data);
01093
01094 if (ret_val) {
01095 DEBUGOUT("NVM Read Error\n");
01096 goto out;
01097 }
01098
01099 if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0)
01100 hw->fc.requested_mode = e1000_fc_none;
01101 else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) ==
01102 NVM_WORD0F_ASM_DIR)
01103 hw->fc.requested_mode = e1000_fc_tx_pause;
01104 else
01105 hw->fc.requested_mode = e1000_fc_full;
01106
01107 out:
01108 return ret_val;
01109 }
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121 s32 igb_force_mac_fc_generic(struct e1000_hw *hw)
01122 {
01123 u32 ctrl;
01124 s32 ret_val = E1000_SUCCESS;
01125
01126 DEBUGFUNC("igb_force_mac_fc_generic");
01127
01128 ctrl = E1000_READ_REG(hw, E1000_CTRL);
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148 DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode);
01149
01150 switch (hw->fc.current_mode) {
01151 case e1000_fc_none:
01152 ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
01153 break;
01154 case e1000_fc_rx_pause:
01155 ctrl &= (~E1000_CTRL_TFCE);
01156 ctrl |= E1000_CTRL_RFCE;
01157 break;
01158 case e1000_fc_tx_pause:
01159 ctrl &= (~E1000_CTRL_RFCE);
01160 ctrl |= E1000_CTRL_TFCE;
01161 break;
01162 case e1000_fc_full:
01163 ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
01164 break;
01165 default:
01166 DEBUGOUT("Flow control param set incorrectly\n");
01167 ret_val = -E1000_ERR_CONFIG;
01168 goto out;
01169 }
01170
01171 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
01172
01173 out:
01174 return ret_val;
01175 }
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187 s32 igb_config_fc_after_link_up_generic(struct e1000_hw *hw)
01188 {
01189 struct e1000_mac_info *mac = &hw->mac;
01190 s32 ret_val = E1000_SUCCESS;
01191 u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
01192 u16 speed, duplex;
01193
01194 DEBUGFUNC("igb_config_fc_after_link_up_generic");
01195
01196
01197
01198
01199
01200
01201 if (mac->autoneg_failed) {
01202 if (hw->phy.media_type == e1000_media_type_fiber ||
01203 hw->phy.media_type == e1000_media_type_internal_serdes)
01204 ret_val = igb_force_mac_fc_generic(hw);
01205 } else {
01206 if (hw->phy.media_type == e1000_media_type_copper)
01207 ret_val = igb_force_mac_fc_generic(hw);
01208 }
01209
01210 if (ret_val) {
01211 DEBUGOUT("Error forcing flow control settings\n");
01212 goto out;
01213 }
01214
01215
01216
01217
01218
01219
01220
01221 if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) {
01222
01223
01224
01225
01226
01227 ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
01228 if (ret_val)
01229 goto out;
01230 ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
01231 if (ret_val)
01232 goto out;
01233
01234 if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) {
01235 DEBUGOUT("Copper PHY and Auto Neg "
01236 "has not completed.\n");
01237 goto out;
01238 }
01239
01240
01241
01242
01243
01244
01245
01246
01247 ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV,
01248 &mii_nway_adv_reg);
01249 if (ret_val)
01250 goto out;
01251 ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY,
01252 &mii_nway_lp_ability_reg);
01253 if (ret_val)
01254 goto out;
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290 if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
01291 (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
01292
01293
01294
01295
01296
01297
01298
01299 if (hw->fc.requested_mode == e1000_fc_full) {
01300 hw->fc.current_mode = e1000_fc_full;
01301 DEBUGOUT("Flow Control = FULL.\r\n");
01302 } else {
01303 hw->fc.current_mode = e1000_fc_rx_pause;
01304 DEBUGOUT("Flow Control = "
01305 "RX PAUSE frames only.\r\n");
01306 }
01307 }
01308
01309
01310
01311
01312
01313
01314
01315
01316 else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
01317 (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
01318 (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
01319 (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
01320 hw->fc.current_mode = e1000_fc_tx_pause;
01321 DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n");
01322 }
01323
01324
01325
01326
01327
01328
01329
01330
01331 else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
01332 (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
01333 !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
01334 (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
01335 hw->fc.current_mode = e1000_fc_rx_pause;
01336 DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
01337 } else {
01338
01339
01340
01341
01342 hw->fc.current_mode = e1000_fc_none;
01343 DEBUGOUT("Flow Control = NONE.\r\n");
01344 }
01345
01346
01347
01348
01349
01350
01351 ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
01352 if (ret_val) {
01353 DEBUGOUT("Error getting link speed and duplex\n");
01354 goto out;
01355 }
01356
01357 if (duplex == HALF_DUPLEX)
01358 hw->fc.current_mode = e1000_fc_none;
01359
01360
01361
01362
01363
01364 ret_val = igb_force_mac_fc_generic(hw);
01365 if (ret_val) {
01366 DEBUGOUT("Error forcing flow control settings\n");
01367 goto out;
01368 }
01369 }
01370
01371 out:
01372 return ret_val;
01373 }
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384 s32 igb_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed,
01385 u16 *duplex)
01386 {
01387 u32 status;
01388
01389 DEBUGFUNC("igb_get_speed_and_duplex_copper_generic");
01390
01391 status = E1000_READ_REG(hw, E1000_STATUS);
01392 if (status & E1000_STATUS_SPEED_1000) {
01393 *speed = SPEED_1000;
01394 DEBUGOUT("1000 Mbs, ");
01395 } else if (status & E1000_STATUS_SPEED_100) {
01396 *speed = SPEED_100;
01397 DEBUGOUT("100 Mbs, ");
01398 } else {
01399 *speed = SPEED_10;
01400 DEBUGOUT("10 Mbs, ");
01401 }
01402
01403 if (status & E1000_STATUS_FD) {
01404 *duplex = FULL_DUPLEX;
01405 DEBUGOUT("Full Duplex\n");
01406 } else {
01407 *duplex = HALF_DUPLEX;
01408 DEBUGOUT("Half Duplex\n");
01409 }
01410
01411 return E1000_SUCCESS;
01412 }
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423 s32 igb_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw *hw __unused,
01424 u16 *speed, u16 *duplex)
01425 {
01426 DEBUGFUNC("igb_get_speed_and_duplex_fiber_serdes_generic");
01427
01428 *speed = SPEED_1000;
01429 *duplex = FULL_DUPLEX;
01430
01431 return E1000_SUCCESS;
01432 }
01433
01434
01435
01436
01437
01438
01439
01440 s32 igb_get_hw_semaphore_generic(struct e1000_hw *hw)
01441 {
01442 u32 swsm;
01443 s32 ret_val = E1000_SUCCESS;
01444 s32 timeout = hw->nvm.word_size + 1;
01445 s32 i = 0;
01446
01447 DEBUGFUNC("igb_get_hw_semaphore_generic");
01448
01449
01450 while (i < timeout) {
01451 swsm = E1000_READ_REG(hw, E1000_SWSM);
01452 if (!(swsm & E1000_SWSM_SMBI))
01453 break;
01454
01455 usec_delay(50);
01456 i++;
01457 }
01458
01459 if (i == timeout) {
01460 DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
01461 ret_val = -E1000_ERR_NVM;
01462 goto out;
01463 }
01464
01465
01466 for (i = 0; i < timeout; i++) {
01467 swsm = E1000_READ_REG(hw, E1000_SWSM);
01468 E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
01469
01470
01471 if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI)
01472 break;
01473
01474 usec_delay(50);
01475 }
01476
01477 if (i == timeout) {
01478
01479 igb_put_hw_semaphore_generic(hw);
01480 DEBUGOUT("Driver can't access the NVM\n");
01481 ret_val = -E1000_ERR_NVM;
01482 goto out;
01483 }
01484
01485 out:
01486 return ret_val;
01487 }
01488
01489
01490
01491
01492
01493
01494
01495 void igb_put_hw_semaphore_generic(struct e1000_hw *hw)
01496 {
01497 u32 swsm;
01498
01499 DEBUGFUNC("igb_put_hw_semaphore_generic");
01500
01501 swsm = E1000_READ_REG(hw, E1000_SWSM);
01502
01503 swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
01504
01505 E1000_WRITE_REG(hw, E1000_SWSM, swsm);
01506 }
01507
01508
01509
01510
01511
01512
01513
01514 s32 igb_get_auto_rd_done_generic(struct e1000_hw *hw)
01515 {
01516 s32 i = 0;
01517 s32 ret_val = E1000_SUCCESS;
01518
01519 DEBUGFUNC("igb_get_auto_rd_done_generic");
01520
01521 while (i < AUTO_READ_DONE_TIMEOUT) {
01522 if (E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_AUTO_RD)
01523 break;
01524 msec_delay(1);
01525 i++;
01526 }
01527
01528 if (i == AUTO_READ_DONE_TIMEOUT) {
01529 DEBUGOUT("Auto read by HW from NVM has not completed.\n");
01530 ret_val = -E1000_ERR_RESET;
01531 goto out;
01532 }
01533
01534 out:
01535 return ret_val;
01536 }
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546 s32 igb_valid_led_default_generic(struct e1000_hw *hw, u16 *data)
01547 {
01548 s32 ret_val;
01549
01550 DEBUGFUNC("igb_valid_led_default_generic");
01551
01552 ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
01553 if (ret_val) {
01554 DEBUGOUT("NVM Read Error\n");
01555 goto out;
01556 }
01557
01558 if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF)
01559 *data = ID_LED_DEFAULT;
01560
01561 out:
01562 return ret_val;
01563 }
01564
01565
01566
01567
01568
01569
01570 s32 igb_id_led_init_generic(struct e1000_hw *hw)
01571 {
01572 struct e1000_mac_info *mac = &hw->mac;
01573 s32 ret_val;
01574 const u32 ledctl_mask = 0x000000FF;
01575 const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON;
01576 const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
01577 u16 data, i, temp;
01578 const u16 led_mask = 0x0F;
01579
01580 DEBUGFUNC("igb_id_led_init_generic");
01581
01582 ret_val = hw->nvm.ops.valid_led_default(hw, &data);
01583 if (ret_val)
01584 goto out;
01585
01586 mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL);
01587 mac->ledctl_mode1 = mac->ledctl_default;
01588 mac->ledctl_mode2 = mac->ledctl_default;
01589
01590 for (i = 0; i < 4; i++) {
01591 temp = (data >> (i << 2)) & led_mask;
01592 switch (temp) {
01593 case ID_LED_ON1_DEF2:
01594 case ID_LED_ON1_ON2:
01595 case ID_LED_ON1_OFF2:
01596 mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
01597 mac->ledctl_mode1 |= ledctl_on << (i << 3);
01598 break;
01599 case ID_LED_OFF1_DEF2:
01600 case ID_LED_OFF1_ON2:
01601 case ID_LED_OFF1_OFF2:
01602 mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
01603 mac->ledctl_mode1 |= ledctl_off << (i << 3);
01604 break;
01605 default:
01606
01607 break;
01608 }
01609 switch (temp) {
01610 case ID_LED_DEF1_ON2:
01611 case ID_LED_ON1_ON2:
01612 case ID_LED_OFF1_ON2:
01613 mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
01614 mac->ledctl_mode2 |= ledctl_on << (i << 3);
01615 break;
01616 case ID_LED_DEF1_OFF2:
01617 case ID_LED_ON1_OFF2:
01618 case ID_LED_OFF1_OFF2:
01619 mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
01620 mac->ledctl_mode2 |= ledctl_off << (i << 3);
01621 break;
01622 default:
01623
01624 break;
01625 }
01626 }
01627
01628 out:
01629 return ret_val;
01630 }
01631
01632 #if 0
01633
01634
01635
01636
01637
01638
01639
01640 s32 igb_setup_led_generic(struct e1000_hw *hw)
01641 {
01642 u32 ledctl;
01643 s32 ret_val = E1000_SUCCESS;
01644
01645 DEBUGFUNC("igb_setup_led_generic");
01646
01647 if (hw->mac.ops.setup_led != e1000_setup_led_generic) {
01648 ret_val = -E1000_ERR_CONFIG;
01649 goto out;
01650 }
01651
01652 if (hw->phy.media_type == e1000_media_type_fiber) {
01653 ledctl = E1000_READ_REG(hw, E1000_LEDCTL);
01654 hw->mac.ledctl_default = ledctl;
01655
01656 ledctl &= ~(E1000_LEDCTL_LED0_IVRT |
01657 E1000_LEDCTL_LED0_BLINK |
01658 E1000_LEDCTL_LED0_MODE_MASK);
01659 ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
01660 E1000_LEDCTL_LED0_MODE_SHIFT);
01661 E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl);
01662 } else if (hw->phy.media_type == e1000_media_type_copper) {
01663 E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1);
01664 }
01665
01666 out:
01667 return ret_val;
01668 }
01669
01670
01671
01672
01673
01674
01675
01676
01677 s32 igb_cleanup_led_generic(struct e1000_hw *hw)
01678 {
01679 s32 ret_val = E1000_SUCCESS;
01680
01681 DEBUGFUNC("igb_cleanup_led_generic");
01682
01683 if (hw->mac.ops.cleanup_led != e1000_cleanup_led_generic) {
01684 ret_val = -E1000_ERR_CONFIG;
01685 goto out;
01686 }
01687
01688 E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default);
01689
01690 out:
01691 return ret_val;
01692 }
01693
01694
01695
01696
01697
01698
01699
01700 s32 igb_blink_led_generic(struct e1000_hw *hw)
01701 {
01702 u32 ledctl_blink = 0;
01703 u32 i;
01704
01705 DEBUGFUNC("igb_blink_led_generic");
01706
01707 if (hw->phy.media_type == e1000_media_type_fiber) {
01708
01709 ledctl_blink = E1000_LEDCTL_LED0_BLINK |
01710 (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
01711 } else {
01712
01713
01714
01715
01716 ledctl_blink = hw->mac.ledctl_mode2;
01717 for (i = 0; i < 4; i++)
01718 if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) ==
01719 E1000_LEDCTL_MODE_LED_ON)
01720 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK <<
01721 (i * 8));
01722 }
01723
01724 E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink);
01725
01726 return E1000_SUCCESS;
01727 }
01728
01729
01730
01731
01732
01733
01734
01735 s32 igb_led_on_generic(struct e1000_hw *hw)
01736 {
01737 u32 ctrl;
01738
01739 DEBUGFUNC("igb_led_on_generic");
01740
01741 switch (hw->phy.media_type) {
01742 case e1000_media_type_fiber:
01743 ctrl = E1000_READ_REG(hw, E1000_CTRL);
01744 ctrl &= ~E1000_CTRL_SWDPIN0;
01745 ctrl |= E1000_CTRL_SWDPIO0;
01746 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
01747 break;
01748 case e1000_media_type_copper:
01749 E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2);
01750 break;
01751 default:
01752 break;
01753 }
01754
01755 return E1000_SUCCESS;
01756 }
01757
01758
01759
01760
01761
01762
01763
01764 s32 igb_led_off_generic(struct e1000_hw *hw)
01765 {
01766 u32 ctrl;
01767
01768 DEBUGFUNC("igb_led_off_generic");
01769
01770 switch (hw->phy.media_type) {
01771 case e1000_media_type_fiber:
01772 ctrl = E1000_READ_REG(hw, E1000_CTRL);
01773 ctrl |= E1000_CTRL_SWDPIN0;
01774 ctrl |= E1000_CTRL_SWDPIO0;
01775 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
01776 break;
01777 case e1000_media_type_copper:
01778 E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1);
01779 break;
01780 default:
01781 break;
01782 }
01783
01784 return E1000_SUCCESS;
01785 }
01786 #endif
01787
01788
01789
01790
01791
01792
01793
01794
01795 void igb_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop)
01796 {
01797 u32 gcr;
01798
01799 DEBUGFUNC("igb_set_pcie_no_snoop_generic");
01800
01801 if (hw->bus.type != e1000_bus_type_pci_express)
01802 goto out;
01803
01804 if (no_snoop) {
01805 gcr = E1000_READ_REG(hw, E1000_GCR);
01806 gcr &= ~(PCIE_NO_SNOOP_ALL);
01807 gcr |= no_snoop;
01808 E1000_WRITE_REG(hw, E1000_GCR, gcr);
01809 }
01810 out:
01811 return;
01812 }
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825 s32 igb_disable_pcie_master_generic(struct e1000_hw *hw)
01826 {
01827 u32 ctrl;
01828 s32 timeout = MASTER_DISABLE_TIMEOUT;
01829 s32 ret_val = E1000_SUCCESS;
01830
01831 DEBUGFUNC("igb_disable_pcie_master_generic");
01832
01833 if (hw->bus.type != e1000_bus_type_pci_express)
01834 goto out;
01835
01836 ctrl = E1000_READ_REG(hw, E1000_CTRL);
01837 ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
01838 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
01839
01840 while (timeout) {
01841 if (!(E1000_READ_REG(hw, E1000_STATUS) &
01842 E1000_STATUS_GIO_MASTER_ENABLE))
01843 break;
01844 usec_delay(100);
01845 timeout--;
01846 }
01847
01848 if (!timeout) {
01849 DEBUGOUT("Master requests are pending.\n");
01850 ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING;
01851 goto out;
01852 }
01853
01854 out:
01855 return ret_val;
01856 }
01857
01858
01859
01860
01861
01862
01863
01864 void igb_reset_adaptive_generic(struct e1000_hw *hw)
01865 {
01866 struct e1000_mac_info *mac = &hw->mac;
01867
01868 DEBUGFUNC("igb_reset_adaptive_generic");
01869
01870 if (!mac->adaptive_ifs) {
01871 DEBUGOUT("Not in Adaptive IFS mode!\n");
01872 goto out;
01873 }
01874
01875 mac->current_ifs_val = 0;
01876 mac->ifs_min_val = IFS_MIN;
01877 mac->ifs_max_val = IFS_MAX;
01878 mac->ifs_step_size = IFS_STEP;
01879 mac->ifs_ratio = IFS_RATIO;
01880
01881 mac->in_ifs_mode = false;
01882 E1000_WRITE_REG(hw, E1000_AIT, 0);
01883 out:
01884 return;
01885 }
01886
01887
01888
01889
01890
01891
01892
01893
01894 void igb_update_adaptive_generic(struct e1000_hw *hw)
01895 {
01896 struct e1000_mac_info *mac = &hw->mac;
01897
01898 DEBUGFUNC("igb_update_adaptive_generic");
01899
01900 if (!mac->adaptive_ifs) {
01901 DEBUGOUT("Not in Adaptive IFS mode!\n");
01902 goto out;
01903 }
01904
01905 if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) {
01906 if (mac->tx_packet_delta > MIN_NUM_XMITS) {
01907 mac->in_ifs_mode = true;
01908 if (mac->current_ifs_val < mac->ifs_max_val) {
01909 if (!mac->current_ifs_val)
01910 mac->current_ifs_val = mac->ifs_min_val;
01911 else
01912 mac->current_ifs_val +=
01913 mac->ifs_step_size;
01914 E1000_WRITE_REG(hw, E1000_AIT, mac->current_ifs_val);
01915 }
01916 }
01917 } else {
01918 if (mac->in_ifs_mode &&
01919 (mac->tx_packet_delta <= MIN_NUM_XMITS)) {
01920 mac->current_ifs_val = 0;
01921 mac->in_ifs_mode = false;
01922 E1000_WRITE_REG(hw, E1000_AIT, 0);
01923 }
01924 }
01925 out:
01926 return;
01927 }
01928
01929
01930
01931
01932
01933
01934
01935
01936 static s32 igb_validate_mdi_setting_generic(struct e1000_hw *hw)
01937 {
01938 s32 ret_val = E1000_SUCCESS;
01939
01940 DEBUGFUNC("igb_validate_mdi_setting_generic");
01941
01942 if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) {
01943 DEBUGOUT("Invalid MDI setting detected\n");
01944 hw->phy.mdix = 1;
01945 ret_val = -E1000_ERR_CONFIG;
01946 goto out;
01947 }
01948
01949 out:
01950 return ret_val;
01951 }
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963
01964 s32 igb_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg,
01965 u32 offset, u8 data)
01966 {
01967 u32 i, regvalue = 0;
01968 s32 ret_val = E1000_SUCCESS;
01969
01970 DEBUGFUNC("igb_write_8bit_ctrl_reg_generic");
01971
01972
01973 regvalue = ((u32)data) | (offset << E1000_GEN_CTL_ADDRESS_SHIFT);
01974 E1000_WRITE_REG(hw, reg, regvalue);
01975
01976
01977 for (i = 0; i < E1000_GEN_POLL_TIMEOUT; i++) {
01978 usec_delay(5);
01979 regvalue = E1000_READ_REG(hw, reg);
01980 if (regvalue & E1000_GEN_CTL_READY)
01981 break;
01982 }
01983 if (!(regvalue & E1000_GEN_CTL_READY)) {
01984 DEBUGOUT1("Reg %08x did not indicate ready\n", reg);
01985 ret_val = -E1000_ERR_PHY;
01986 goto out;
01987 }
01988
01989 out:
01990 return ret_val;
01991 }