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