xref: /titanic_51/usr/src/uts/common/io/e1000api/e1000_mac.c (revision 42cc51e07cdbcad3b9aca8d9d991fc09b251feb7)
175eba5b6SRobert Mustacchi /******************************************************************************
275eba5b6SRobert Mustacchi 
3*42cc51e0SRobert Mustacchi   Copyright (c) 2001-2015, Intel Corporation
475eba5b6SRobert Mustacchi   All rights reserved.
575eba5b6SRobert Mustacchi 
675eba5b6SRobert Mustacchi   Redistribution and use in source and binary forms, with or without
775eba5b6SRobert Mustacchi   modification, are permitted provided that the following conditions are met:
875eba5b6SRobert Mustacchi 
975eba5b6SRobert Mustacchi    1. Redistributions of source code must retain the above copyright notice,
1075eba5b6SRobert Mustacchi       this list of conditions and the following disclaimer.
1175eba5b6SRobert Mustacchi 
1275eba5b6SRobert Mustacchi    2. Redistributions in binary form must reproduce the above copyright
1375eba5b6SRobert Mustacchi       notice, this list of conditions and the following disclaimer in the
1475eba5b6SRobert Mustacchi       documentation and/or other materials provided with the distribution.
1575eba5b6SRobert Mustacchi 
1675eba5b6SRobert Mustacchi    3. Neither the name of the Intel Corporation nor the names of its
1775eba5b6SRobert Mustacchi       contributors may be used to endorse or promote products derived from
1875eba5b6SRobert Mustacchi       this software without specific prior written permission.
1975eba5b6SRobert Mustacchi 
2075eba5b6SRobert Mustacchi   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2175eba5b6SRobert Mustacchi   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2275eba5b6SRobert Mustacchi   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2375eba5b6SRobert Mustacchi   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2475eba5b6SRobert Mustacchi   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2575eba5b6SRobert Mustacchi   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2675eba5b6SRobert Mustacchi   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2775eba5b6SRobert Mustacchi   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2875eba5b6SRobert Mustacchi   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2975eba5b6SRobert Mustacchi   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3075eba5b6SRobert Mustacchi   POSSIBILITY OF SUCH DAMAGE.
3175eba5b6SRobert Mustacchi 
3275eba5b6SRobert Mustacchi ******************************************************************************/
3375eba5b6SRobert Mustacchi /*$FreeBSD$*/
3475eba5b6SRobert Mustacchi 
3575eba5b6SRobert Mustacchi #include "e1000_api.h"
3675eba5b6SRobert Mustacchi 
3775eba5b6SRobert Mustacchi static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw);
3875eba5b6SRobert Mustacchi static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw);
3975eba5b6SRobert Mustacchi static void e1000_config_collision_dist_generic(struct e1000_hw *hw);
40c124a83eSRobert Mustacchi static int e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index);
4175eba5b6SRobert Mustacchi 
4275eba5b6SRobert Mustacchi /**
4375eba5b6SRobert Mustacchi  *  e1000_init_mac_ops_generic - Initialize MAC function pointers
4475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
4575eba5b6SRobert Mustacchi  *
4675eba5b6SRobert Mustacchi  *  Setups up the function pointers to no-op functions
4775eba5b6SRobert Mustacchi  **/
4875eba5b6SRobert Mustacchi void e1000_init_mac_ops_generic(struct e1000_hw *hw)
4975eba5b6SRobert Mustacchi {
5075eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
5175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_init_mac_ops_generic");
5275eba5b6SRobert Mustacchi 
5375eba5b6SRobert Mustacchi 	/* General Setup */
5475eba5b6SRobert Mustacchi 	mac->ops.init_params = e1000_null_ops_generic;
5575eba5b6SRobert Mustacchi 	mac->ops.init_hw = e1000_null_ops_generic;
5675eba5b6SRobert Mustacchi 	mac->ops.reset_hw = e1000_null_ops_generic;
5775eba5b6SRobert Mustacchi 	mac->ops.setup_physical_interface = e1000_null_ops_generic;
5875eba5b6SRobert Mustacchi 	mac->ops.get_bus_info = e1000_null_ops_generic;
5975eba5b6SRobert Mustacchi 	mac->ops.set_lan_id = e1000_set_lan_id_multi_port_pcie;
6075eba5b6SRobert Mustacchi 	mac->ops.read_mac_addr = e1000_read_mac_addr_generic;
6175eba5b6SRobert Mustacchi 	mac->ops.config_collision_dist = e1000_config_collision_dist_generic;
6275eba5b6SRobert Mustacchi 	mac->ops.clear_hw_cntrs = e1000_null_mac_generic;
6375eba5b6SRobert Mustacchi 	/* LED */
6475eba5b6SRobert Mustacchi 	mac->ops.cleanup_led = e1000_null_ops_generic;
6575eba5b6SRobert Mustacchi 	mac->ops.setup_led = e1000_null_ops_generic;
6675eba5b6SRobert Mustacchi 	mac->ops.blink_led = e1000_null_ops_generic;
6775eba5b6SRobert Mustacchi 	mac->ops.led_on = e1000_null_ops_generic;
6875eba5b6SRobert Mustacchi 	mac->ops.led_off = e1000_null_ops_generic;
6975eba5b6SRobert Mustacchi 	/* LINK */
7075eba5b6SRobert Mustacchi 	mac->ops.setup_link = e1000_null_ops_generic;
7175eba5b6SRobert Mustacchi 	mac->ops.get_link_up_info = e1000_null_link_info;
7275eba5b6SRobert Mustacchi 	mac->ops.check_for_link = e1000_null_ops_generic;
7375eba5b6SRobert Mustacchi 	mac->ops.set_obff_timer = e1000_null_set_obff_timer;
7475eba5b6SRobert Mustacchi 	/* Management */
7575eba5b6SRobert Mustacchi 	mac->ops.check_mng_mode = e1000_null_mng_mode;
7675eba5b6SRobert Mustacchi 	/* VLAN, MC, etc. */
7775eba5b6SRobert Mustacchi 	mac->ops.update_mc_addr_list = e1000_null_update_mc;
7875eba5b6SRobert Mustacchi 	mac->ops.clear_vfta = e1000_null_mac_generic;
7975eba5b6SRobert Mustacchi 	mac->ops.write_vfta = e1000_null_write_vfta;
8075eba5b6SRobert Mustacchi 	mac->ops.rar_set = e1000_rar_set_generic;
8175eba5b6SRobert Mustacchi 	mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic;
8275eba5b6SRobert Mustacchi }
8375eba5b6SRobert Mustacchi 
8475eba5b6SRobert Mustacchi /**
8575eba5b6SRobert Mustacchi  *  e1000_null_ops_generic - No-op function, returns 0
8675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
8775eba5b6SRobert Mustacchi  **/
88c124a83eSRobert Mustacchi s32 e1000_null_ops_generic(struct e1000_hw E1000_UNUSEDARG *hw)
8975eba5b6SRobert Mustacchi {
9075eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_ops_generic");
9175eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
9275eba5b6SRobert Mustacchi }
9375eba5b6SRobert Mustacchi 
9475eba5b6SRobert Mustacchi /**
9575eba5b6SRobert Mustacchi  *  e1000_null_mac_generic - No-op function, return void
9675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
9775eba5b6SRobert Mustacchi  **/
98c124a83eSRobert Mustacchi void e1000_null_mac_generic(struct e1000_hw E1000_UNUSEDARG *hw)
9975eba5b6SRobert Mustacchi {
10075eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_mac_generic");
10175eba5b6SRobert Mustacchi 	return;
10275eba5b6SRobert Mustacchi }
10375eba5b6SRobert Mustacchi 
10475eba5b6SRobert Mustacchi /**
10575eba5b6SRobert Mustacchi  *  e1000_null_link_info - No-op function, return 0
10675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
10775eba5b6SRobert Mustacchi  **/
108c124a83eSRobert Mustacchi s32 e1000_null_link_info(struct e1000_hw E1000_UNUSEDARG *hw,
109c124a83eSRobert Mustacchi 			 u16 E1000_UNUSEDARG *s, u16 E1000_UNUSEDARG *d)
11075eba5b6SRobert Mustacchi {
11175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_link_info");
11275eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
11375eba5b6SRobert Mustacchi }
11475eba5b6SRobert Mustacchi 
11575eba5b6SRobert Mustacchi /**
11675eba5b6SRobert Mustacchi  *  e1000_null_mng_mode - No-op function, return FALSE
11775eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
11875eba5b6SRobert Mustacchi  **/
119c124a83eSRobert Mustacchi bool e1000_null_mng_mode(struct e1000_hw E1000_UNUSEDARG *hw)
120c124a83eSRobert Mustacchi {
12175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_mng_mode");
12275eba5b6SRobert Mustacchi 	return FALSE;
12375eba5b6SRobert Mustacchi }
12475eba5b6SRobert Mustacchi 
12575eba5b6SRobert Mustacchi /**
12675eba5b6SRobert Mustacchi  *  e1000_null_update_mc - No-op function, return void
12775eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
12875eba5b6SRobert Mustacchi  **/
129c124a83eSRobert Mustacchi void e1000_null_update_mc(struct e1000_hw E1000_UNUSEDARG *hw,
130c124a83eSRobert Mustacchi 			  u8 E1000_UNUSEDARG *h, u32 E1000_UNUSEDARG a)
13175eba5b6SRobert Mustacchi {
13275eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_update_mc");
13375eba5b6SRobert Mustacchi 	return;
13475eba5b6SRobert Mustacchi }
13575eba5b6SRobert Mustacchi 
13675eba5b6SRobert Mustacchi /**
13775eba5b6SRobert Mustacchi  *  e1000_null_write_vfta - No-op function, return void
13875eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
13975eba5b6SRobert Mustacchi  **/
140c124a83eSRobert Mustacchi void e1000_null_write_vfta(struct e1000_hw E1000_UNUSEDARG *hw,
141c124a83eSRobert Mustacchi 			   u32 E1000_UNUSEDARG a, u32 E1000_UNUSEDARG b)
14275eba5b6SRobert Mustacchi {
14375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_write_vfta");
14475eba5b6SRobert Mustacchi 	return;
14575eba5b6SRobert Mustacchi }
14675eba5b6SRobert Mustacchi 
14775eba5b6SRobert Mustacchi /**
148c124a83eSRobert Mustacchi  *  e1000_null_rar_set - No-op function, return 0
14975eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
15075eba5b6SRobert Mustacchi  **/
151c124a83eSRobert Mustacchi int e1000_null_rar_set(struct e1000_hw E1000_UNUSEDARG *hw,
152c124a83eSRobert Mustacchi 			u8 E1000_UNUSEDARG *h, u32 E1000_UNUSEDARG a)
15375eba5b6SRobert Mustacchi {
15475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_rar_set");
155c124a83eSRobert Mustacchi 	return E1000_SUCCESS;
15675eba5b6SRobert Mustacchi }
15775eba5b6SRobert Mustacchi 
15875eba5b6SRobert Mustacchi /**
15975eba5b6SRobert Mustacchi  *  e1000_null_set_obff_timer - No-op function, return 0
16075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
16175eba5b6SRobert Mustacchi  **/
162c124a83eSRobert Mustacchi s32 e1000_null_set_obff_timer(struct e1000_hw E1000_UNUSEDARG *hw,
163c124a83eSRobert Mustacchi 			      u32 E1000_UNUSEDARG a)
16475eba5b6SRobert Mustacchi {
16575eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_null_set_obff_timer");
16675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
16775eba5b6SRobert Mustacchi }
16875eba5b6SRobert Mustacchi 
16975eba5b6SRobert Mustacchi /**
17075eba5b6SRobert Mustacchi  *  e1000_get_bus_info_pci_generic - Get PCI(x) bus information
17175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
17275eba5b6SRobert Mustacchi  *
17375eba5b6SRobert Mustacchi  *  Determines and stores the system bus information for a particular
17475eba5b6SRobert Mustacchi  *  network interface.  The following bus information is determined and stored:
17575eba5b6SRobert Mustacchi  *  bus speed, bus width, type (PCI/PCIx), and PCI(-x) function.
17675eba5b6SRobert Mustacchi  **/
17775eba5b6SRobert Mustacchi s32 e1000_get_bus_info_pci_generic(struct e1000_hw *hw)
17875eba5b6SRobert Mustacchi {
17975eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
18075eba5b6SRobert Mustacchi 	struct e1000_bus_info *bus = &hw->bus;
18175eba5b6SRobert Mustacchi 	u32 status = E1000_READ_REG(hw, E1000_STATUS);
18275eba5b6SRobert Mustacchi 	s32 ret_val = E1000_SUCCESS;
18375eba5b6SRobert Mustacchi 
18475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_bus_info_pci_generic");
18575eba5b6SRobert Mustacchi 
18675eba5b6SRobert Mustacchi 	/* PCI or PCI-X? */
18775eba5b6SRobert Mustacchi 	bus->type = (status & E1000_STATUS_PCIX_MODE)
18875eba5b6SRobert Mustacchi 			? e1000_bus_type_pcix
18975eba5b6SRobert Mustacchi 			: e1000_bus_type_pci;
19075eba5b6SRobert Mustacchi 
19175eba5b6SRobert Mustacchi 	/* Bus speed */
19275eba5b6SRobert Mustacchi 	if (bus->type == e1000_bus_type_pci) {
19375eba5b6SRobert Mustacchi 		bus->speed = (status & E1000_STATUS_PCI66)
19475eba5b6SRobert Mustacchi 			     ? e1000_bus_speed_66
19575eba5b6SRobert Mustacchi 			     : e1000_bus_speed_33;
19675eba5b6SRobert Mustacchi 	} else {
19775eba5b6SRobert Mustacchi 		switch (status & E1000_STATUS_PCIX_SPEED) {
19875eba5b6SRobert Mustacchi 		case E1000_STATUS_PCIX_SPEED_66:
19975eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_66;
20075eba5b6SRobert Mustacchi 			break;
20175eba5b6SRobert Mustacchi 		case E1000_STATUS_PCIX_SPEED_100:
20275eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_100;
20375eba5b6SRobert Mustacchi 			break;
20475eba5b6SRobert Mustacchi 		case E1000_STATUS_PCIX_SPEED_133:
20575eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_133;
20675eba5b6SRobert Mustacchi 			break;
20775eba5b6SRobert Mustacchi 		default:
20875eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_reserved;
20975eba5b6SRobert Mustacchi 			break;
21075eba5b6SRobert Mustacchi 		}
21175eba5b6SRobert Mustacchi 	}
21275eba5b6SRobert Mustacchi 
21375eba5b6SRobert Mustacchi 	/* Bus width */
21475eba5b6SRobert Mustacchi 	bus->width = (status & E1000_STATUS_BUS64)
21575eba5b6SRobert Mustacchi 		     ? e1000_bus_width_64
21675eba5b6SRobert Mustacchi 		     : e1000_bus_width_32;
21775eba5b6SRobert Mustacchi 
21875eba5b6SRobert Mustacchi 	/* Which PCI(-X) function? */
21975eba5b6SRobert Mustacchi 	mac->ops.set_lan_id(hw);
22075eba5b6SRobert Mustacchi 
22175eba5b6SRobert Mustacchi 	return ret_val;
22275eba5b6SRobert Mustacchi }
22375eba5b6SRobert Mustacchi 
22475eba5b6SRobert Mustacchi /**
22575eba5b6SRobert Mustacchi  *  e1000_get_bus_info_pcie_generic - Get PCIe bus information
22675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
22775eba5b6SRobert Mustacchi  *
22875eba5b6SRobert Mustacchi  *  Determines and stores the system bus information for a particular
22975eba5b6SRobert Mustacchi  *  network interface.  The following bus information is determined and stored:
23075eba5b6SRobert Mustacchi  *  bus speed, bus width, type (PCIe), and PCIe function.
23175eba5b6SRobert Mustacchi  **/
23275eba5b6SRobert Mustacchi s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw)
23375eba5b6SRobert Mustacchi {
23475eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
23575eba5b6SRobert Mustacchi 	struct e1000_bus_info *bus = &hw->bus;
23675eba5b6SRobert Mustacchi 	s32 ret_val;
23775eba5b6SRobert Mustacchi 	u16 pcie_link_status;
23875eba5b6SRobert Mustacchi 
23975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_bus_info_pcie_generic");
24075eba5b6SRobert Mustacchi 
24175eba5b6SRobert Mustacchi 	bus->type = e1000_bus_type_pci_express;
24275eba5b6SRobert Mustacchi 
24375eba5b6SRobert Mustacchi 	ret_val = e1000_read_pcie_cap_reg(hw, PCIE_LINK_STATUS,
24475eba5b6SRobert Mustacchi 					  &pcie_link_status);
24575eba5b6SRobert Mustacchi 	if (ret_val) {
24675eba5b6SRobert Mustacchi 		bus->width = e1000_bus_width_unknown;
24775eba5b6SRobert Mustacchi 		bus->speed = e1000_bus_speed_unknown;
24875eba5b6SRobert Mustacchi 	} else {
24975eba5b6SRobert Mustacchi 		switch (pcie_link_status & PCIE_LINK_SPEED_MASK) {
25075eba5b6SRobert Mustacchi 		case PCIE_LINK_SPEED_2500:
25175eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_2500;
25275eba5b6SRobert Mustacchi 			break;
25375eba5b6SRobert Mustacchi 		case PCIE_LINK_SPEED_5000:
25475eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_5000;
25575eba5b6SRobert Mustacchi 			break;
25675eba5b6SRobert Mustacchi 		default:
25775eba5b6SRobert Mustacchi 			bus->speed = e1000_bus_speed_unknown;
25875eba5b6SRobert Mustacchi 			break;
25975eba5b6SRobert Mustacchi 		}
26075eba5b6SRobert Mustacchi 
26175eba5b6SRobert Mustacchi 		bus->width = (enum e1000_bus_width)((pcie_link_status &
26275eba5b6SRobert Mustacchi 			      PCIE_LINK_WIDTH_MASK) >> PCIE_LINK_WIDTH_SHIFT);
26375eba5b6SRobert Mustacchi 	}
26475eba5b6SRobert Mustacchi 
26575eba5b6SRobert Mustacchi 	mac->ops.set_lan_id(hw);
26675eba5b6SRobert Mustacchi 
26775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
26875eba5b6SRobert Mustacchi }
26975eba5b6SRobert Mustacchi 
27075eba5b6SRobert Mustacchi /**
27175eba5b6SRobert Mustacchi  *  e1000_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices
27275eba5b6SRobert Mustacchi  *
27375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
27475eba5b6SRobert Mustacchi  *
27575eba5b6SRobert Mustacchi  *  Determines the LAN function id by reading memory-mapped registers
27675eba5b6SRobert Mustacchi  *  and swaps the port value if requested.
27775eba5b6SRobert Mustacchi  **/
27875eba5b6SRobert Mustacchi static void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw)
27975eba5b6SRobert Mustacchi {
28075eba5b6SRobert Mustacchi 	struct e1000_bus_info *bus = &hw->bus;
28175eba5b6SRobert Mustacchi 	u32 reg;
28275eba5b6SRobert Mustacchi 
28375eba5b6SRobert Mustacchi 	/* The status register reports the correct function number
28475eba5b6SRobert Mustacchi 	 * for the device regardless of function swap state.
28575eba5b6SRobert Mustacchi 	 */
28675eba5b6SRobert Mustacchi 	reg = E1000_READ_REG(hw, E1000_STATUS);
28775eba5b6SRobert Mustacchi 	bus->func = (reg & E1000_STATUS_FUNC_MASK) >> E1000_STATUS_FUNC_SHIFT;
28875eba5b6SRobert Mustacchi }
28975eba5b6SRobert Mustacchi 
29075eba5b6SRobert Mustacchi /**
29175eba5b6SRobert Mustacchi  *  e1000_set_lan_id_multi_port_pci - Set LAN id for PCI multiple port devices
29275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
29375eba5b6SRobert Mustacchi  *
29475eba5b6SRobert Mustacchi  *  Determines the LAN function id by reading PCI config space.
29575eba5b6SRobert Mustacchi  **/
29675eba5b6SRobert Mustacchi void e1000_set_lan_id_multi_port_pci(struct e1000_hw *hw)
29775eba5b6SRobert Mustacchi {
29875eba5b6SRobert Mustacchi 	struct e1000_bus_info *bus = &hw->bus;
29975eba5b6SRobert Mustacchi 	u16 pci_header_type;
30075eba5b6SRobert Mustacchi 	u32 status;
30175eba5b6SRobert Mustacchi 
30275eba5b6SRobert Mustacchi 	e1000_read_pci_cfg(hw, PCI_HEADER_TYPE_REGISTER, &pci_header_type);
30375eba5b6SRobert Mustacchi 	if (pci_header_type & PCI_HEADER_TYPE_MULTIFUNC) {
30475eba5b6SRobert Mustacchi 		status = E1000_READ_REG(hw, E1000_STATUS);
30575eba5b6SRobert Mustacchi 		bus->func = (status & E1000_STATUS_FUNC_MASK)
30675eba5b6SRobert Mustacchi 			    >> E1000_STATUS_FUNC_SHIFT;
30775eba5b6SRobert Mustacchi 	} else {
30875eba5b6SRobert Mustacchi 		bus->func = 0;
30975eba5b6SRobert Mustacchi 	}
31075eba5b6SRobert Mustacchi }
31175eba5b6SRobert Mustacchi 
31275eba5b6SRobert Mustacchi /**
31375eba5b6SRobert Mustacchi  *  e1000_set_lan_id_single_port - Set LAN id for a single port device
31475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
31575eba5b6SRobert Mustacchi  *
31675eba5b6SRobert Mustacchi  *  Sets the LAN function id to zero for a single port device.
31775eba5b6SRobert Mustacchi  **/
31875eba5b6SRobert Mustacchi void e1000_set_lan_id_single_port(struct e1000_hw *hw)
31975eba5b6SRobert Mustacchi {
32075eba5b6SRobert Mustacchi 	struct e1000_bus_info *bus = &hw->bus;
32175eba5b6SRobert Mustacchi 
32275eba5b6SRobert Mustacchi 	bus->func = 0;
32375eba5b6SRobert Mustacchi }
32475eba5b6SRobert Mustacchi 
32575eba5b6SRobert Mustacchi /**
32675eba5b6SRobert Mustacchi  *  e1000_clear_vfta_generic - Clear VLAN filter table
32775eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
32875eba5b6SRobert Mustacchi  *
32975eba5b6SRobert Mustacchi  *  Clears the register array which contains the VLAN filter table by
33075eba5b6SRobert Mustacchi  *  setting all the values to 0.
33175eba5b6SRobert Mustacchi  **/
33275eba5b6SRobert Mustacchi void e1000_clear_vfta_generic(struct e1000_hw *hw)
33375eba5b6SRobert Mustacchi {
33475eba5b6SRobert Mustacchi 	u32 offset;
33575eba5b6SRobert Mustacchi 
33675eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_clear_vfta_generic");
33775eba5b6SRobert Mustacchi 
33875eba5b6SRobert Mustacchi 	for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
33975eba5b6SRobert Mustacchi 		E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
34075eba5b6SRobert Mustacchi 		E1000_WRITE_FLUSH(hw);
34175eba5b6SRobert Mustacchi 	}
34275eba5b6SRobert Mustacchi }
34375eba5b6SRobert Mustacchi 
34475eba5b6SRobert Mustacchi /**
34575eba5b6SRobert Mustacchi  *  e1000_write_vfta_generic - Write value to VLAN filter table
34675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
34775eba5b6SRobert Mustacchi  *  @offset: register offset in VLAN filter table
34875eba5b6SRobert Mustacchi  *  @value: register value written to VLAN filter table
34975eba5b6SRobert Mustacchi  *
35075eba5b6SRobert Mustacchi  *  Writes value at the given offset in the register array which stores
35175eba5b6SRobert Mustacchi  *  the VLAN filter table.
35275eba5b6SRobert Mustacchi  **/
35375eba5b6SRobert Mustacchi void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
35475eba5b6SRobert Mustacchi {
35575eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_write_vfta_generic");
35675eba5b6SRobert Mustacchi 
35775eba5b6SRobert Mustacchi 	E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
35875eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
35975eba5b6SRobert Mustacchi }
36075eba5b6SRobert Mustacchi 
36175eba5b6SRobert Mustacchi /**
36275eba5b6SRobert Mustacchi  *  e1000_init_rx_addrs_generic - Initialize receive address's
36375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
36475eba5b6SRobert Mustacchi  *  @rar_count: receive address registers
36575eba5b6SRobert Mustacchi  *
36675eba5b6SRobert Mustacchi  *  Setup the receive address registers by setting the base receive address
36775eba5b6SRobert Mustacchi  *  register to the devices MAC address and clearing all the other receive
36875eba5b6SRobert Mustacchi  *  address registers to 0.
36975eba5b6SRobert Mustacchi  **/
37075eba5b6SRobert Mustacchi void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count)
37175eba5b6SRobert Mustacchi {
37275eba5b6SRobert Mustacchi 	u32 i;
37375eba5b6SRobert Mustacchi 	u8 mac_addr[ETH_ADDR_LEN] = {0};
37475eba5b6SRobert Mustacchi 
37575eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_init_rx_addrs_generic");
37675eba5b6SRobert Mustacchi 
37775eba5b6SRobert Mustacchi 	/* Setup the receive address */
37875eba5b6SRobert Mustacchi 	DEBUGOUT("Programming MAC Address into RAR[0]\n");
37975eba5b6SRobert Mustacchi 
38075eba5b6SRobert Mustacchi 	hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
38175eba5b6SRobert Mustacchi 
38275eba5b6SRobert Mustacchi 	/* Zero out the other (rar_entry_count - 1) receive addresses */
38375eba5b6SRobert Mustacchi 	DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1);
38475eba5b6SRobert Mustacchi 	for (i = 1; i < rar_count; i++)
38575eba5b6SRobert Mustacchi 		hw->mac.ops.rar_set(hw, mac_addr, i);
38675eba5b6SRobert Mustacchi }
38775eba5b6SRobert Mustacchi 
38875eba5b6SRobert Mustacchi /**
38975eba5b6SRobert Mustacchi  *  e1000_check_alt_mac_addr_generic - Check for alternate MAC addr
39075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
39175eba5b6SRobert Mustacchi  *
39275eba5b6SRobert Mustacchi  *  Checks the nvm for an alternate MAC address.  An alternate MAC address
39375eba5b6SRobert Mustacchi  *  can be setup by pre-boot software and must be treated like a permanent
39475eba5b6SRobert Mustacchi  *  address and must override the actual permanent MAC address. If an
39575eba5b6SRobert Mustacchi  *  alternate MAC address is found it is programmed into RAR0, replacing
39675eba5b6SRobert Mustacchi  *  the permanent address that was installed into RAR0 by the Si on reset.
39775eba5b6SRobert Mustacchi  *  This function will return SUCCESS unless it encounters an error while
39875eba5b6SRobert Mustacchi  *  reading the EEPROM.
39975eba5b6SRobert Mustacchi  **/
40075eba5b6SRobert Mustacchi s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
40175eba5b6SRobert Mustacchi {
40275eba5b6SRobert Mustacchi 	u32 i;
40375eba5b6SRobert Mustacchi 	s32 ret_val;
40475eba5b6SRobert Mustacchi 	u16 offset, nvm_alt_mac_addr_offset, nvm_data;
40575eba5b6SRobert Mustacchi 	u8 alt_mac_addr[ETH_ADDR_LEN];
40675eba5b6SRobert Mustacchi 
40775eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_check_alt_mac_addr_generic");
40875eba5b6SRobert Mustacchi 
40975eba5b6SRobert Mustacchi 	ret_val = hw->nvm.ops.read(hw, NVM_COMPAT, 1, &nvm_data);
41075eba5b6SRobert Mustacchi 	if (ret_val)
41175eba5b6SRobert Mustacchi 		return ret_val;
41275eba5b6SRobert Mustacchi 
41375eba5b6SRobert Mustacchi 	/* not supported on older hardware or 82573 */
41475eba5b6SRobert Mustacchi 	if ((hw->mac.type < e1000_82571) || (hw->mac.type == e1000_82573))
41575eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
41675eba5b6SRobert Mustacchi 
41775eba5b6SRobert Mustacchi 	/* Alternate MAC address is handled by the option ROM for 82580
41875eba5b6SRobert Mustacchi 	 * and newer. SW support not required.
41975eba5b6SRobert Mustacchi 	 */
42075eba5b6SRobert Mustacchi 	if (hw->mac.type >= e1000_82580)
42175eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
42275eba5b6SRobert Mustacchi 
42375eba5b6SRobert Mustacchi 	ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1,
42475eba5b6SRobert Mustacchi 				   &nvm_alt_mac_addr_offset);
42575eba5b6SRobert Mustacchi 	if (ret_val) {
42675eba5b6SRobert Mustacchi 		DEBUGOUT("NVM Read Error\n");
42775eba5b6SRobert Mustacchi 		return ret_val;
42875eba5b6SRobert Mustacchi 	}
42975eba5b6SRobert Mustacchi 
43075eba5b6SRobert Mustacchi 	if ((nvm_alt_mac_addr_offset == 0xFFFF) ||
43175eba5b6SRobert Mustacchi 	    (nvm_alt_mac_addr_offset == 0x0000))
43275eba5b6SRobert Mustacchi 		/* There is no Alternate MAC Address */
43375eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
43475eba5b6SRobert Mustacchi 
43575eba5b6SRobert Mustacchi 	if (hw->bus.func == E1000_FUNC_1)
43675eba5b6SRobert Mustacchi 		nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1;
43775eba5b6SRobert Mustacchi 	if (hw->bus.func == E1000_FUNC_2)
43875eba5b6SRobert Mustacchi 		nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN2;
43975eba5b6SRobert Mustacchi 
44075eba5b6SRobert Mustacchi 	if (hw->bus.func == E1000_FUNC_3)
44175eba5b6SRobert Mustacchi 		nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN3;
44275eba5b6SRobert Mustacchi 	for (i = 0; i < ETH_ADDR_LEN; i += 2) {
44375eba5b6SRobert Mustacchi 		offset = nvm_alt_mac_addr_offset + (i >> 1);
44475eba5b6SRobert Mustacchi 		ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data);
44575eba5b6SRobert Mustacchi 		if (ret_val) {
44675eba5b6SRobert Mustacchi 			DEBUGOUT("NVM Read Error\n");
44775eba5b6SRobert Mustacchi 			return ret_val;
44875eba5b6SRobert Mustacchi 		}
44975eba5b6SRobert Mustacchi 
45075eba5b6SRobert Mustacchi 		alt_mac_addr[i] = (u8)(nvm_data & 0xFF);
45175eba5b6SRobert Mustacchi 		alt_mac_addr[i + 1] = (u8)(nvm_data >> 8);
45275eba5b6SRobert Mustacchi 	}
45375eba5b6SRobert Mustacchi 
45475eba5b6SRobert Mustacchi 	/* if multicast bit is set, the alternate address will not be used */
45575eba5b6SRobert Mustacchi 	if (alt_mac_addr[0] & 0x01) {
45675eba5b6SRobert Mustacchi 		DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n");
45775eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
45875eba5b6SRobert Mustacchi 	}
45975eba5b6SRobert Mustacchi 
46075eba5b6SRobert Mustacchi 	/* We have a valid alternate MAC address, and we want to treat it the
46175eba5b6SRobert Mustacchi 	 * same as the normal permanent MAC address stored by the HW into the
46275eba5b6SRobert Mustacchi 	 * RAR. Do this by mapping this address into RAR0.
46375eba5b6SRobert Mustacchi 	 */
46475eba5b6SRobert Mustacchi 	hw->mac.ops.rar_set(hw, alt_mac_addr, 0);
46575eba5b6SRobert Mustacchi 
46675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
46775eba5b6SRobert Mustacchi }
46875eba5b6SRobert Mustacchi 
46975eba5b6SRobert Mustacchi /**
47075eba5b6SRobert Mustacchi  *  e1000_rar_set_generic - Set receive address register
47175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
47275eba5b6SRobert Mustacchi  *  @addr: pointer to the receive address
47375eba5b6SRobert Mustacchi  *  @index: receive address array register
47475eba5b6SRobert Mustacchi  *
47575eba5b6SRobert Mustacchi  *  Sets the receive address array register at index to the address passed
47675eba5b6SRobert Mustacchi  *  in by addr.
47775eba5b6SRobert Mustacchi  **/
478c124a83eSRobert Mustacchi static int e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index)
47975eba5b6SRobert Mustacchi {
48075eba5b6SRobert Mustacchi 	u32 rar_low, rar_high;
48175eba5b6SRobert Mustacchi 
48275eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_rar_set_generic");
48375eba5b6SRobert Mustacchi 
48475eba5b6SRobert Mustacchi 	/* HW expects these in little endian so we reverse the byte order
48575eba5b6SRobert Mustacchi 	 * from network order (big endian) to little endian
48675eba5b6SRobert Mustacchi 	 */
48775eba5b6SRobert Mustacchi 	rar_low = ((u32) addr[0] | ((u32) addr[1] << 8) |
48875eba5b6SRobert Mustacchi 		   ((u32) addr[2] << 16) | ((u32) addr[3] << 24));
48975eba5b6SRobert Mustacchi 
49075eba5b6SRobert Mustacchi 	rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
49175eba5b6SRobert Mustacchi 
49275eba5b6SRobert Mustacchi 	/* If MAC address zero, no need to set the AV bit */
49375eba5b6SRobert Mustacchi 	if (rar_low || rar_high)
49475eba5b6SRobert Mustacchi 		rar_high |= E1000_RAH_AV;
49575eba5b6SRobert Mustacchi 
49675eba5b6SRobert Mustacchi 	/* Some bridges will combine consecutive 32-bit writes into
49775eba5b6SRobert Mustacchi 	 * a single burst write, which will malfunction on some parts.
49875eba5b6SRobert Mustacchi 	 * The flushes avoid this.
49975eba5b6SRobert Mustacchi 	 */
50075eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_RAL(index), rar_low);
50175eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
50275eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_RAH(index), rar_high);
50375eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
504c124a83eSRobert Mustacchi 
505c124a83eSRobert Mustacchi 	return E1000_SUCCESS;
50675eba5b6SRobert Mustacchi }
50775eba5b6SRobert Mustacchi 
50875eba5b6SRobert Mustacchi /**
50975eba5b6SRobert Mustacchi  *  e1000_hash_mc_addr_generic - Generate a multicast hash value
51075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
51175eba5b6SRobert Mustacchi  *  @mc_addr: pointer to a multicast address
51275eba5b6SRobert Mustacchi  *
51375eba5b6SRobert Mustacchi  *  Generates a multicast address hash value which is used to determine
51475eba5b6SRobert Mustacchi  *  the multicast filter table array address and new table value.
51575eba5b6SRobert Mustacchi  **/
51675eba5b6SRobert Mustacchi u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr)
51775eba5b6SRobert Mustacchi {
51875eba5b6SRobert Mustacchi 	u32 hash_value, hash_mask;
51975eba5b6SRobert Mustacchi 	u8 bit_shift = 0;
52075eba5b6SRobert Mustacchi 
52175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_hash_mc_addr_generic");
52275eba5b6SRobert Mustacchi 
52375eba5b6SRobert Mustacchi 	/* Register count multiplied by bits per register */
52475eba5b6SRobert Mustacchi 	hash_mask = (hw->mac.mta_reg_count * 32) - 1;
52575eba5b6SRobert Mustacchi 
52675eba5b6SRobert Mustacchi 	/* For a mc_filter_type of 0, bit_shift is the number of left-shifts
52775eba5b6SRobert Mustacchi 	 * where 0xFF would still fall within the hash mask.
52875eba5b6SRobert Mustacchi 	 */
52975eba5b6SRobert Mustacchi 	while (hash_mask >> bit_shift != 0xFF)
53075eba5b6SRobert Mustacchi 		bit_shift++;
53175eba5b6SRobert Mustacchi 
53275eba5b6SRobert Mustacchi 	/* The portion of the address that is used for the hash table
53375eba5b6SRobert Mustacchi 	 * is determined by the mc_filter_type setting.
53475eba5b6SRobert Mustacchi 	 * The algorithm is such that there is a total of 8 bits of shifting.
53575eba5b6SRobert Mustacchi 	 * The bit_shift for a mc_filter_type of 0 represents the number of
53675eba5b6SRobert Mustacchi 	 * left-shifts where the MSB of mc_addr[5] would still fall within
53775eba5b6SRobert Mustacchi 	 * the hash_mask.  Case 0 does this exactly.  Since there are a total
53875eba5b6SRobert Mustacchi 	 * of 8 bits of shifting, then mc_addr[4] will shift right the
53975eba5b6SRobert Mustacchi 	 * remaining number of bits. Thus 8 - bit_shift.  The rest of the
54075eba5b6SRobert Mustacchi 	 * cases are a variation of this algorithm...essentially raising the
54175eba5b6SRobert Mustacchi 	 * number of bits to shift mc_addr[5] left, while still keeping the
54275eba5b6SRobert Mustacchi 	 * 8-bit shifting total.
54375eba5b6SRobert Mustacchi 	 *
54475eba5b6SRobert Mustacchi 	 * For example, given the following Destination MAC Address and an
54575eba5b6SRobert Mustacchi 	 * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask),
54675eba5b6SRobert Mustacchi 	 * we can see that the bit_shift for case 0 is 4.  These are the hash
54775eba5b6SRobert Mustacchi 	 * values resulting from each mc_filter_type...
54875eba5b6SRobert Mustacchi 	 * [0] [1] [2] [3] [4] [5]
54975eba5b6SRobert Mustacchi 	 * 01  AA  00  12  34  56
55075eba5b6SRobert Mustacchi 	 * LSB		 MSB
55175eba5b6SRobert Mustacchi 	 *
55275eba5b6SRobert Mustacchi 	 * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563
55375eba5b6SRobert Mustacchi 	 * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6
55475eba5b6SRobert Mustacchi 	 * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163
55575eba5b6SRobert Mustacchi 	 * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634
55675eba5b6SRobert Mustacchi 	 */
55775eba5b6SRobert Mustacchi 	switch (hw->mac.mc_filter_type) {
55875eba5b6SRobert Mustacchi 	default:
55975eba5b6SRobert Mustacchi 	case 0:
56075eba5b6SRobert Mustacchi 		break;
56175eba5b6SRobert Mustacchi 	case 1:
56275eba5b6SRobert Mustacchi 		bit_shift += 1;
56375eba5b6SRobert Mustacchi 		break;
56475eba5b6SRobert Mustacchi 	case 2:
56575eba5b6SRobert Mustacchi 		bit_shift += 2;
56675eba5b6SRobert Mustacchi 		break;
56775eba5b6SRobert Mustacchi 	case 3:
56875eba5b6SRobert Mustacchi 		bit_shift += 4;
56975eba5b6SRobert Mustacchi 		break;
57075eba5b6SRobert Mustacchi 	}
57175eba5b6SRobert Mustacchi 
57275eba5b6SRobert Mustacchi 	hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
57375eba5b6SRobert Mustacchi 				  (((u16) mc_addr[5]) << bit_shift)));
57475eba5b6SRobert Mustacchi 
57575eba5b6SRobert Mustacchi 	return hash_value;
57675eba5b6SRobert Mustacchi }
57775eba5b6SRobert Mustacchi 
57875eba5b6SRobert Mustacchi /**
57975eba5b6SRobert Mustacchi  *  e1000_update_mc_addr_list_generic - Update Multicast addresses
58075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
58175eba5b6SRobert Mustacchi  *  @mc_addr_list: array of multicast addresses to program
58275eba5b6SRobert Mustacchi  *  @mc_addr_count: number of multicast addresses to program
58375eba5b6SRobert Mustacchi  *
58475eba5b6SRobert Mustacchi  *  Updates entire Multicast Table Array.
58575eba5b6SRobert Mustacchi  *  The caller must have a packed mc_addr_list of multicast addresses.
58675eba5b6SRobert Mustacchi  **/
58775eba5b6SRobert Mustacchi void e1000_update_mc_addr_list_generic(struct e1000_hw *hw,
58875eba5b6SRobert Mustacchi 				       u8 *mc_addr_list, u32 mc_addr_count)
58975eba5b6SRobert Mustacchi {
59075eba5b6SRobert Mustacchi 	u32 hash_value, hash_bit, hash_reg;
59175eba5b6SRobert Mustacchi 	int i;
59275eba5b6SRobert Mustacchi 
59375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_update_mc_addr_list_generic");
59475eba5b6SRobert Mustacchi 
59575eba5b6SRobert Mustacchi 	/* clear mta_shadow */
59675eba5b6SRobert Mustacchi 	memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
59775eba5b6SRobert Mustacchi 
59875eba5b6SRobert Mustacchi 	/* update mta_shadow from mc_addr_list */
59975eba5b6SRobert Mustacchi 	for (i = 0; (u32) i < mc_addr_count; i++) {
60075eba5b6SRobert Mustacchi 		hash_value = e1000_hash_mc_addr_generic(hw, mc_addr_list);
60175eba5b6SRobert Mustacchi 
60275eba5b6SRobert Mustacchi 		hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
60375eba5b6SRobert Mustacchi 		hash_bit = hash_value & 0x1F;
60475eba5b6SRobert Mustacchi 
60575eba5b6SRobert Mustacchi 		hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
60675eba5b6SRobert Mustacchi 		mc_addr_list += (ETH_ADDR_LEN);
60775eba5b6SRobert Mustacchi 	}
60875eba5b6SRobert Mustacchi 
60975eba5b6SRobert Mustacchi 	/* replace the entire MTA table */
61075eba5b6SRobert Mustacchi 	for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
61175eba5b6SRobert Mustacchi 		E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, hw->mac.mta_shadow[i]);
61275eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
61375eba5b6SRobert Mustacchi }
61475eba5b6SRobert Mustacchi 
61575eba5b6SRobert Mustacchi /**
61675eba5b6SRobert Mustacchi  *  e1000_pcix_mmrbc_workaround_generic - Fix incorrect MMRBC value
61775eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
61875eba5b6SRobert Mustacchi  *
61975eba5b6SRobert Mustacchi  *  In certain situations, a system BIOS may report that the PCIx maximum
62075eba5b6SRobert Mustacchi  *  memory read byte count (MMRBC) value is higher than than the actual
62175eba5b6SRobert Mustacchi  *  value. We check the PCIx command register with the current PCIx status
62275eba5b6SRobert Mustacchi  *  register.
62375eba5b6SRobert Mustacchi  **/
62475eba5b6SRobert Mustacchi void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw)
62575eba5b6SRobert Mustacchi {
62675eba5b6SRobert Mustacchi 	u16 cmd_mmrbc;
62775eba5b6SRobert Mustacchi 	u16 pcix_cmd;
62875eba5b6SRobert Mustacchi 	u16 pcix_stat_hi_word;
62975eba5b6SRobert Mustacchi 	u16 stat_mmrbc;
63075eba5b6SRobert Mustacchi 
63175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_pcix_mmrbc_workaround_generic");
63275eba5b6SRobert Mustacchi 
63375eba5b6SRobert Mustacchi 	/* Workaround for PCI-X issue when BIOS sets MMRBC incorrectly */
63475eba5b6SRobert Mustacchi 	if (hw->bus.type != e1000_bus_type_pcix)
63575eba5b6SRobert Mustacchi 		return;
63675eba5b6SRobert Mustacchi 
63775eba5b6SRobert Mustacchi 	e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd);
63875eba5b6SRobert Mustacchi 	e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, &pcix_stat_hi_word);
63975eba5b6SRobert Mustacchi 	cmd_mmrbc = (pcix_cmd & PCIX_COMMAND_MMRBC_MASK) >>
64075eba5b6SRobert Mustacchi 		     PCIX_COMMAND_MMRBC_SHIFT;
64175eba5b6SRobert Mustacchi 	stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >>
64275eba5b6SRobert Mustacchi 		      PCIX_STATUS_HI_MMRBC_SHIFT;
64375eba5b6SRobert Mustacchi 	if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K)
64475eba5b6SRobert Mustacchi 		stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K;
64575eba5b6SRobert Mustacchi 	if (cmd_mmrbc > stat_mmrbc) {
64675eba5b6SRobert Mustacchi 		pcix_cmd &= ~PCIX_COMMAND_MMRBC_MASK;
64775eba5b6SRobert Mustacchi 		pcix_cmd |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT;
64875eba5b6SRobert Mustacchi 		e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd);
64975eba5b6SRobert Mustacchi 	}
65075eba5b6SRobert Mustacchi }
65175eba5b6SRobert Mustacchi 
65275eba5b6SRobert Mustacchi /**
65375eba5b6SRobert Mustacchi  *  e1000_clear_hw_cntrs_base_generic - Clear base hardware counters
65475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
65575eba5b6SRobert Mustacchi  *
65675eba5b6SRobert Mustacchi  *  Clears the base hardware counters by reading the counter registers.
65775eba5b6SRobert Mustacchi  **/
65875eba5b6SRobert Mustacchi void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw)
65975eba5b6SRobert Mustacchi {
66075eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_clear_hw_cntrs_base_generic");
66175eba5b6SRobert Mustacchi 
66275eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_CRCERRS);
66375eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_SYMERRS);
66475eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_MPC);
66575eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_SCC);
66675eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_ECOL);
66775eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_MCC);
66875eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_LATECOL);
66975eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_COLC);
67075eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_DC);
67175eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_SEC);
67275eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_RLEC);
67375eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_XONRXC);
67475eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_XONTXC);
67575eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_XOFFRXC);
67675eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_XOFFTXC);
67775eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_FCRUC);
67875eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GPRC);
67975eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_BPRC);
68075eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_MPRC);
68175eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GPTC);
68275eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GORCL);
68375eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GORCH);
68475eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GOTCL);
68575eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_GOTCH);
68675eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_RNBC);
68775eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_RUC);
68875eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_RFC);
68975eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_ROC);
69075eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_RJC);
69175eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TORL);
69275eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TORH);
69375eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TOTL);
69475eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TOTH);
69575eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TPR);
69675eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_TPT);
69775eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_MPTC);
69875eba5b6SRobert Mustacchi 	E1000_READ_REG(hw, E1000_BPTC);
69975eba5b6SRobert Mustacchi }
70075eba5b6SRobert Mustacchi 
70175eba5b6SRobert Mustacchi /**
70275eba5b6SRobert Mustacchi  *  e1000_check_for_copper_link_generic - Check for link (Copper)
70375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
70475eba5b6SRobert Mustacchi  *
70575eba5b6SRobert Mustacchi  *  Checks to see of the link status of the hardware has changed.  If a
70675eba5b6SRobert Mustacchi  *  change in link status has been detected, then we read the PHY registers
70775eba5b6SRobert Mustacchi  *  to get the current speed/duplex if link exists.
70875eba5b6SRobert Mustacchi  **/
70975eba5b6SRobert Mustacchi s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw)
71075eba5b6SRobert Mustacchi {
71175eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
71275eba5b6SRobert Mustacchi 	s32 ret_val;
71375eba5b6SRobert Mustacchi 	bool link;
71475eba5b6SRobert Mustacchi 
71575eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_check_for_copper_link");
71675eba5b6SRobert Mustacchi 
71775eba5b6SRobert Mustacchi 	/* We only want to go out to the PHY registers to see if Auto-Neg
71875eba5b6SRobert Mustacchi 	 * has completed and/or if our link status has changed.  The
71975eba5b6SRobert Mustacchi 	 * get_link_status flag is set upon receiving a Link Status
72075eba5b6SRobert Mustacchi 	 * Change or Rx Sequence Error interrupt.
72175eba5b6SRobert Mustacchi 	 */
72275eba5b6SRobert Mustacchi 	if (!mac->get_link_status)
72375eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
72475eba5b6SRobert Mustacchi 
72575eba5b6SRobert Mustacchi 	/* First we want to see if the MII Status Register reports
72675eba5b6SRobert Mustacchi 	 * link.  If so, then we want to get the current speed/duplex
72775eba5b6SRobert Mustacchi 	 * of the PHY.
72875eba5b6SRobert Mustacchi 	 */
72975eba5b6SRobert Mustacchi 	ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link);
73075eba5b6SRobert Mustacchi 	if (ret_val)
73175eba5b6SRobert Mustacchi 		return ret_val;
73275eba5b6SRobert Mustacchi 
73375eba5b6SRobert Mustacchi 	if (!link)
73475eba5b6SRobert Mustacchi 		return E1000_SUCCESS; /* No link detected */
73575eba5b6SRobert Mustacchi 
73675eba5b6SRobert Mustacchi 	mac->get_link_status = FALSE;
73775eba5b6SRobert Mustacchi 
73875eba5b6SRobert Mustacchi 	/* Check if there was DownShift, must be checked
73975eba5b6SRobert Mustacchi 	 * immediately after link-up
74075eba5b6SRobert Mustacchi 	 */
74175eba5b6SRobert Mustacchi 	e1000_check_downshift_generic(hw);
74275eba5b6SRobert Mustacchi 
74375eba5b6SRobert Mustacchi 	/* If we are forcing speed/duplex, then we simply return since
74475eba5b6SRobert Mustacchi 	 * we have already determined whether we have link or not.
74575eba5b6SRobert Mustacchi 	 */
74675eba5b6SRobert Mustacchi 	if (!mac->autoneg)
74775eba5b6SRobert Mustacchi 		return -E1000_ERR_CONFIG;
74875eba5b6SRobert Mustacchi 
74975eba5b6SRobert Mustacchi 	/* Auto-Neg is enabled.  Auto Speed Detection takes care
75075eba5b6SRobert Mustacchi 	 * of MAC speed/duplex configuration.  So we only need to
75175eba5b6SRobert Mustacchi 	 * configure Collision Distance in the MAC.
75275eba5b6SRobert Mustacchi 	 */
75375eba5b6SRobert Mustacchi 	mac->ops.config_collision_dist(hw);
75475eba5b6SRobert Mustacchi 
75575eba5b6SRobert Mustacchi 	/* Configure Flow Control now that Auto-Neg has completed.
75675eba5b6SRobert Mustacchi 	 * First, we need to restore the desired flow control
75775eba5b6SRobert Mustacchi 	 * settings because we may have had to re-autoneg with a
75875eba5b6SRobert Mustacchi 	 * different link partner.
75975eba5b6SRobert Mustacchi 	 */
76075eba5b6SRobert Mustacchi 	ret_val = e1000_config_fc_after_link_up_generic(hw);
76175eba5b6SRobert Mustacchi 	if (ret_val)
76275eba5b6SRobert Mustacchi 		DEBUGOUT("Error configuring flow control\n");
76375eba5b6SRobert Mustacchi 
76475eba5b6SRobert Mustacchi 	return ret_val;
76575eba5b6SRobert Mustacchi }
76675eba5b6SRobert Mustacchi 
76775eba5b6SRobert Mustacchi /**
76875eba5b6SRobert Mustacchi  *  e1000_check_for_fiber_link_generic - Check for link (Fiber)
76975eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
77075eba5b6SRobert Mustacchi  *
77175eba5b6SRobert Mustacchi  *  Checks for link up on the hardware.  If link is not up and we have
77275eba5b6SRobert Mustacchi  *  a signal, then we need to force link up.
77375eba5b6SRobert Mustacchi  **/
77475eba5b6SRobert Mustacchi s32 e1000_check_for_fiber_link_generic(struct e1000_hw *hw)
77575eba5b6SRobert Mustacchi {
77675eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
77775eba5b6SRobert Mustacchi 	u32 rxcw;
77875eba5b6SRobert Mustacchi 	u32 ctrl;
77975eba5b6SRobert Mustacchi 	u32 status;
78075eba5b6SRobert Mustacchi 	s32 ret_val;
78175eba5b6SRobert Mustacchi 
78275eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_check_for_fiber_link_generic");
78375eba5b6SRobert Mustacchi 
78475eba5b6SRobert Mustacchi 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
78575eba5b6SRobert Mustacchi 	status = E1000_READ_REG(hw, E1000_STATUS);
78675eba5b6SRobert Mustacchi 	rxcw = E1000_READ_REG(hw, E1000_RXCW);
78775eba5b6SRobert Mustacchi 
78875eba5b6SRobert Mustacchi 	/* If we don't have link (auto-negotiation failed or link partner
78975eba5b6SRobert Mustacchi 	 * cannot auto-negotiate), the cable is plugged in (we have signal),
79075eba5b6SRobert Mustacchi 	 * and our link partner is not trying to auto-negotiate with us (we
79175eba5b6SRobert Mustacchi 	 * are receiving idles or data), we need to force link up. We also
79275eba5b6SRobert Mustacchi 	 * need to give auto-negotiation time to complete, in case the cable
79375eba5b6SRobert Mustacchi 	 * was just plugged in. The autoneg_failed flag does this.
79475eba5b6SRobert Mustacchi 	 */
79575eba5b6SRobert Mustacchi 	/* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
79675eba5b6SRobert Mustacchi 	if ((ctrl & E1000_CTRL_SWDPIN1) && !(status & E1000_STATUS_LU) &&
79775eba5b6SRobert Mustacchi 	    !(rxcw & E1000_RXCW_C)) {
79875eba5b6SRobert Mustacchi 		if (!mac->autoneg_failed) {
79975eba5b6SRobert Mustacchi 			mac->autoneg_failed = TRUE;
80075eba5b6SRobert Mustacchi 			return E1000_SUCCESS;
80175eba5b6SRobert Mustacchi 		}
80275eba5b6SRobert Mustacchi 		DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
80375eba5b6SRobert Mustacchi 
80475eba5b6SRobert Mustacchi 		/* Disable auto-negotiation in the TXCW register */
80575eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE));
80675eba5b6SRobert Mustacchi 
80775eba5b6SRobert Mustacchi 		/* Force link-up and also force full-duplex. */
80875eba5b6SRobert Mustacchi 		ctrl = E1000_READ_REG(hw, E1000_CTRL);
80975eba5b6SRobert Mustacchi 		ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
81075eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
81175eba5b6SRobert Mustacchi 
81275eba5b6SRobert Mustacchi 		/* Configure Flow Control after forcing link up. */
81375eba5b6SRobert Mustacchi 		ret_val = e1000_config_fc_after_link_up_generic(hw);
81475eba5b6SRobert Mustacchi 		if (ret_val) {
81575eba5b6SRobert Mustacchi 			DEBUGOUT("Error configuring flow control\n");
81675eba5b6SRobert Mustacchi 			return ret_val;
81775eba5b6SRobert Mustacchi 		}
81875eba5b6SRobert Mustacchi 	} else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
81975eba5b6SRobert Mustacchi 		/* If we are forcing link and we are receiving /C/ ordered
82075eba5b6SRobert Mustacchi 		 * sets, re-enable auto-negotiation in the TXCW register
82175eba5b6SRobert Mustacchi 		 * and disable forced link in the Device Control register
82275eba5b6SRobert Mustacchi 		 * in an attempt to auto-negotiate with our link partner.
82375eba5b6SRobert Mustacchi 		 */
82475eba5b6SRobert Mustacchi 		DEBUGOUT("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
82575eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
82675eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU));
82775eba5b6SRobert Mustacchi 
82875eba5b6SRobert Mustacchi 		mac->serdes_has_link = TRUE;
82975eba5b6SRobert Mustacchi 	}
83075eba5b6SRobert Mustacchi 
83175eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
83275eba5b6SRobert Mustacchi }
83375eba5b6SRobert Mustacchi 
83475eba5b6SRobert Mustacchi /**
83575eba5b6SRobert Mustacchi  *  e1000_check_for_serdes_link_generic - Check for link (Serdes)
83675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
83775eba5b6SRobert Mustacchi  *
83875eba5b6SRobert Mustacchi  *  Checks for link up on the hardware.  If link is not up and we have
83975eba5b6SRobert Mustacchi  *  a signal, then we need to force link up.
84075eba5b6SRobert Mustacchi  **/
84175eba5b6SRobert Mustacchi s32 e1000_check_for_serdes_link_generic(struct e1000_hw *hw)
84275eba5b6SRobert Mustacchi {
84375eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
84475eba5b6SRobert Mustacchi 	u32 rxcw;
84575eba5b6SRobert Mustacchi 	u32 ctrl;
84675eba5b6SRobert Mustacchi 	u32 status;
84775eba5b6SRobert Mustacchi 	s32 ret_val;
84875eba5b6SRobert Mustacchi 
84975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_check_for_serdes_link_generic");
85075eba5b6SRobert Mustacchi 
85175eba5b6SRobert Mustacchi 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
85275eba5b6SRobert Mustacchi 	status = E1000_READ_REG(hw, E1000_STATUS);
85375eba5b6SRobert Mustacchi 	rxcw = E1000_READ_REG(hw, E1000_RXCW);
85475eba5b6SRobert Mustacchi 
85575eba5b6SRobert Mustacchi 	/* If we don't have link (auto-negotiation failed or link partner
85675eba5b6SRobert Mustacchi 	 * cannot auto-negotiate), and our link partner is not trying to
85775eba5b6SRobert Mustacchi 	 * auto-negotiate with us (we are receiving idles or data),
85875eba5b6SRobert Mustacchi 	 * we need to force link up. We also need to give auto-negotiation
85975eba5b6SRobert Mustacchi 	 * time to complete.
86075eba5b6SRobert Mustacchi 	 */
86175eba5b6SRobert Mustacchi 	/* (ctrl & E1000_CTRL_SWDPIN1) == 1 == have signal */
86275eba5b6SRobert Mustacchi 	if (!(status & E1000_STATUS_LU) && !(rxcw & E1000_RXCW_C)) {
86375eba5b6SRobert Mustacchi 		if (!mac->autoneg_failed) {
86475eba5b6SRobert Mustacchi 			mac->autoneg_failed = TRUE;
86575eba5b6SRobert Mustacchi 			return E1000_SUCCESS;
86675eba5b6SRobert Mustacchi 		}
86775eba5b6SRobert Mustacchi 		DEBUGOUT("NOT Rx'ing /C/, disable AutoNeg and force link.\n");
86875eba5b6SRobert Mustacchi 
86975eba5b6SRobert Mustacchi 		/* Disable auto-negotiation in the TXCW register */
87075eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_TXCW, (mac->txcw & ~E1000_TXCW_ANE));
87175eba5b6SRobert Mustacchi 
87275eba5b6SRobert Mustacchi 		/* Force link-up and also force full-duplex. */
87375eba5b6SRobert Mustacchi 		ctrl = E1000_READ_REG(hw, E1000_CTRL);
87475eba5b6SRobert Mustacchi 		ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD);
87575eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
87675eba5b6SRobert Mustacchi 
87775eba5b6SRobert Mustacchi 		/* Configure Flow Control after forcing link up. */
87875eba5b6SRobert Mustacchi 		ret_val = e1000_config_fc_after_link_up_generic(hw);
87975eba5b6SRobert Mustacchi 		if (ret_val) {
88075eba5b6SRobert Mustacchi 			DEBUGOUT("Error configuring flow control\n");
88175eba5b6SRobert Mustacchi 			return ret_val;
88275eba5b6SRobert Mustacchi 		}
88375eba5b6SRobert Mustacchi 	} else if ((ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
88475eba5b6SRobert Mustacchi 		/* If we are forcing link and we are receiving /C/ ordered
88575eba5b6SRobert Mustacchi 		 * sets, re-enable auto-negotiation in the TXCW register
88675eba5b6SRobert Mustacchi 		 * and disable forced link in the Device Control register
88775eba5b6SRobert Mustacchi 		 * in an attempt to auto-negotiate with our link partner.
88875eba5b6SRobert Mustacchi 		 */
88975eba5b6SRobert Mustacchi 		DEBUGOUT("Rx'ing /C/, enable AutoNeg and stop forcing link.\n");
89075eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw);
89175eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU));
89275eba5b6SRobert Mustacchi 
89375eba5b6SRobert Mustacchi 		mac->serdes_has_link = TRUE;
89475eba5b6SRobert Mustacchi 	} else if (!(E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW))) {
89575eba5b6SRobert Mustacchi 		/* If we force link for non-auto-negotiation switch, check
89675eba5b6SRobert Mustacchi 		 * link status based on MAC synchronization for internal
89775eba5b6SRobert Mustacchi 		 * serdes media type.
89875eba5b6SRobert Mustacchi 		 */
89975eba5b6SRobert Mustacchi 		/* SYNCH bit and IV bit are sticky. */
90075eba5b6SRobert Mustacchi 		usec_delay(10);
90175eba5b6SRobert Mustacchi 		rxcw = E1000_READ_REG(hw, E1000_RXCW);
90275eba5b6SRobert Mustacchi 		if (rxcw & E1000_RXCW_SYNCH) {
90375eba5b6SRobert Mustacchi 			if (!(rxcw & E1000_RXCW_IV)) {
90475eba5b6SRobert Mustacchi 				mac->serdes_has_link = TRUE;
90575eba5b6SRobert Mustacchi 				DEBUGOUT("SERDES: Link up - forced.\n");
90675eba5b6SRobert Mustacchi 			}
90775eba5b6SRobert Mustacchi 		} else {
90875eba5b6SRobert Mustacchi 			mac->serdes_has_link = FALSE;
90975eba5b6SRobert Mustacchi 			DEBUGOUT("SERDES: Link down - force failed.\n");
91075eba5b6SRobert Mustacchi 		}
91175eba5b6SRobert Mustacchi 	}
91275eba5b6SRobert Mustacchi 
91375eba5b6SRobert Mustacchi 	if (E1000_TXCW_ANE & E1000_READ_REG(hw, E1000_TXCW)) {
91475eba5b6SRobert Mustacchi 		status = E1000_READ_REG(hw, E1000_STATUS);
91575eba5b6SRobert Mustacchi 		if (status & E1000_STATUS_LU) {
91675eba5b6SRobert Mustacchi 			/* SYNCH bit and IV bit are sticky, so reread rxcw. */
91775eba5b6SRobert Mustacchi 			usec_delay(10);
91875eba5b6SRobert Mustacchi 			rxcw = E1000_READ_REG(hw, E1000_RXCW);
91975eba5b6SRobert Mustacchi 			if (rxcw & E1000_RXCW_SYNCH) {
92075eba5b6SRobert Mustacchi 				if (!(rxcw & E1000_RXCW_IV)) {
92175eba5b6SRobert Mustacchi 					mac->serdes_has_link = TRUE;
92275eba5b6SRobert Mustacchi 					DEBUGOUT("SERDES: Link up - autoneg completed successfully.\n");
92375eba5b6SRobert Mustacchi 				} else {
92475eba5b6SRobert Mustacchi 					mac->serdes_has_link = FALSE;
92575eba5b6SRobert Mustacchi 					DEBUGOUT("SERDES: Link down - invalid codewords detected in autoneg.\n");
92675eba5b6SRobert Mustacchi 				}
92775eba5b6SRobert Mustacchi 			} else {
92875eba5b6SRobert Mustacchi 				mac->serdes_has_link = FALSE;
92975eba5b6SRobert Mustacchi 				DEBUGOUT("SERDES: Link down - no sync.\n");
93075eba5b6SRobert Mustacchi 			}
93175eba5b6SRobert Mustacchi 		} else {
93275eba5b6SRobert Mustacchi 			mac->serdes_has_link = FALSE;
93375eba5b6SRobert Mustacchi 			DEBUGOUT("SERDES: Link down - autoneg failed\n");
93475eba5b6SRobert Mustacchi 		}
93575eba5b6SRobert Mustacchi 	}
93675eba5b6SRobert Mustacchi 
93775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
93875eba5b6SRobert Mustacchi }
93975eba5b6SRobert Mustacchi 
94075eba5b6SRobert Mustacchi /**
94175eba5b6SRobert Mustacchi  *  e1000_set_default_fc_generic - Set flow control default values
94275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
94375eba5b6SRobert Mustacchi  *
94475eba5b6SRobert Mustacchi  *  Read the EEPROM for the default values for flow control and store the
94575eba5b6SRobert Mustacchi  *  values.
94675eba5b6SRobert Mustacchi  **/
94775eba5b6SRobert Mustacchi s32 e1000_set_default_fc_generic(struct e1000_hw *hw)
94875eba5b6SRobert Mustacchi {
94975eba5b6SRobert Mustacchi 	s32 ret_val;
95075eba5b6SRobert Mustacchi 	u16 nvm_data;
951c124a83eSRobert Mustacchi 	u16 nvm_offset = 0;
95275eba5b6SRobert Mustacchi 
95375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_set_default_fc_generic");
95475eba5b6SRobert Mustacchi 
95575eba5b6SRobert Mustacchi 	/* Read and store word 0x0F of the EEPROM. This word contains bits
95675eba5b6SRobert Mustacchi 	 * that determine the hardware's default PAUSE (flow control) mode,
95775eba5b6SRobert Mustacchi 	 * a bit that determines whether the HW defaults to enabling or
95875eba5b6SRobert Mustacchi 	 * disabling auto-negotiation, and the direction of the
95975eba5b6SRobert Mustacchi 	 * SW defined pins. If there is no SW over-ride of the flow
96075eba5b6SRobert Mustacchi 	 * control setting, then the variable hw->fc will
96175eba5b6SRobert Mustacchi 	 * be initialized based on a value in the EEPROM.
96275eba5b6SRobert Mustacchi 	 */
963c124a83eSRobert Mustacchi 	if (hw->mac.type == e1000_i350) {
964c124a83eSRobert Mustacchi 		nvm_offset = NVM_82580_LAN_FUNC_OFFSET(hw->bus.func);
965c124a83eSRobert Mustacchi 		ret_val = hw->nvm.ops.read(hw,
966c124a83eSRobert Mustacchi 					   NVM_INIT_CONTROL2_REG +
967c124a83eSRobert Mustacchi 					   nvm_offset,
968c124a83eSRobert Mustacchi 					   1, &nvm_data);
969c124a83eSRobert Mustacchi 	} else {
970c124a83eSRobert Mustacchi 		ret_val = hw->nvm.ops.read(hw,
971c124a83eSRobert Mustacchi 					   NVM_INIT_CONTROL2_REG,
972c124a83eSRobert Mustacchi 					   1, &nvm_data);
973c124a83eSRobert Mustacchi 	}
974c124a83eSRobert Mustacchi 
97575eba5b6SRobert Mustacchi 
97675eba5b6SRobert Mustacchi 	if (ret_val) {
97775eba5b6SRobert Mustacchi 		DEBUGOUT("NVM Read Error\n");
97875eba5b6SRobert Mustacchi 		return ret_val;
97975eba5b6SRobert Mustacchi 	}
98075eba5b6SRobert Mustacchi 
98175eba5b6SRobert Mustacchi 	if (!(nvm_data & NVM_WORD0F_PAUSE_MASK))
98275eba5b6SRobert Mustacchi 		hw->fc.requested_mode = e1000_fc_none;
98375eba5b6SRobert Mustacchi 	else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) ==
98475eba5b6SRobert Mustacchi 		 NVM_WORD0F_ASM_DIR)
98575eba5b6SRobert Mustacchi 		hw->fc.requested_mode = e1000_fc_tx_pause;
98675eba5b6SRobert Mustacchi 	else
98775eba5b6SRobert Mustacchi 		hw->fc.requested_mode = e1000_fc_full;
98875eba5b6SRobert Mustacchi 
98975eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
99075eba5b6SRobert Mustacchi }
99175eba5b6SRobert Mustacchi 
99275eba5b6SRobert Mustacchi /**
99375eba5b6SRobert Mustacchi  *  e1000_setup_link_generic - Setup flow control and link settings
99475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
99575eba5b6SRobert Mustacchi  *
99675eba5b6SRobert Mustacchi  *  Determines which flow control settings to use, then configures flow
99775eba5b6SRobert Mustacchi  *  control.  Calls the appropriate media-specific link configuration
99875eba5b6SRobert Mustacchi  *  function.  Assuming the adapter has a valid link partner, a valid link
99975eba5b6SRobert Mustacchi  *  should be established.  Assumes the hardware has previously been reset
100075eba5b6SRobert Mustacchi  *  and the transmitter and receiver are not enabled.
100175eba5b6SRobert Mustacchi  **/
100275eba5b6SRobert Mustacchi s32 e1000_setup_link_generic(struct e1000_hw *hw)
100375eba5b6SRobert Mustacchi {
100475eba5b6SRobert Mustacchi 	s32 ret_val;
100575eba5b6SRobert Mustacchi 
100675eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_setup_link_generic");
100775eba5b6SRobert Mustacchi 
100875eba5b6SRobert Mustacchi 	/* In the case of the phy reset being blocked, we already have a link.
100975eba5b6SRobert Mustacchi 	 * We do not need to set it up again.
101075eba5b6SRobert Mustacchi 	 */
101175eba5b6SRobert Mustacchi 	if (hw->phy.ops.check_reset_block && hw->phy.ops.check_reset_block(hw))
101275eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
101375eba5b6SRobert Mustacchi 
101475eba5b6SRobert Mustacchi 	/* If requested flow control is set to default, set flow control
101575eba5b6SRobert Mustacchi 	 * based on the EEPROM flow control settings.
101675eba5b6SRobert Mustacchi 	 */
101775eba5b6SRobert Mustacchi 	if (hw->fc.requested_mode == e1000_fc_default) {
101875eba5b6SRobert Mustacchi 		ret_val = e1000_set_default_fc_generic(hw);
101975eba5b6SRobert Mustacchi 		if (ret_val)
102075eba5b6SRobert Mustacchi 			return ret_val;
102175eba5b6SRobert Mustacchi 	}
102275eba5b6SRobert Mustacchi 
102375eba5b6SRobert Mustacchi 	/* Save off the requested flow control mode for use later.  Depending
102475eba5b6SRobert Mustacchi 	 * on the link partner's capabilities, we may or may not use this mode.
102575eba5b6SRobert Mustacchi 	 */
102675eba5b6SRobert Mustacchi 	hw->fc.current_mode = hw->fc.requested_mode;
102775eba5b6SRobert Mustacchi 
102875eba5b6SRobert Mustacchi 	DEBUGOUT1("After fix-ups FlowControl is now = %x\n",
102975eba5b6SRobert Mustacchi 		hw->fc.current_mode);
103075eba5b6SRobert Mustacchi 
103175eba5b6SRobert Mustacchi 	/* Call the necessary media_type subroutine to configure the link. */
103275eba5b6SRobert Mustacchi 	ret_val = hw->mac.ops.setup_physical_interface(hw);
103375eba5b6SRobert Mustacchi 	if (ret_val)
103475eba5b6SRobert Mustacchi 		return ret_val;
103575eba5b6SRobert Mustacchi 
103675eba5b6SRobert Mustacchi 	/* Initialize the flow control address, type, and PAUSE timer
103775eba5b6SRobert Mustacchi 	 * registers to their default values.  This is done even if flow
103875eba5b6SRobert Mustacchi 	 * control is disabled, because it does not hurt anything to
103975eba5b6SRobert Mustacchi 	 * initialize these registers.
104075eba5b6SRobert Mustacchi 	 */
104175eba5b6SRobert Mustacchi 	DEBUGOUT("Initializing the Flow Control address, type and timer regs\n");
104275eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCT, FLOW_CONTROL_TYPE);
104375eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCAH, FLOW_CONTROL_ADDRESS_HIGH);
104475eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCAL, FLOW_CONTROL_ADDRESS_LOW);
104575eba5b6SRobert Mustacchi 
104675eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time);
104775eba5b6SRobert Mustacchi 
104875eba5b6SRobert Mustacchi 	return e1000_set_fc_watermarks_generic(hw);
104975eba5b6SRobert Mustacchi }
105075eba5b6SRobert Mustacchi 
105175eba5b6SRobert Mustacchi /**
105275eba5b6SRobert Mustacchi  *  e1000_commit_fc_settings_generic - Configure flow control
105375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
105475eba5b6SRobert Mustacchi  *
105575eba5b6SRobert Mustacchi  *  Write the flow control settings to the Transmit Config Word Register (TXCW)
105675eba5b6SRobert Mustacchi  *  base on the flow control settings in e1000_mac_info.
105775eba5b6SRobert Mustacchi  **/
105875eba5b6SRobert Mustacchi s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw)
105975eba5b6SRobert Mustacchi {
106075eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
106175eba5b6SRobert Mustacchi 	u32 txcw;
106275eba5b6SRobert Mustacchi 
106375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_commit_fc_settings_generic");
106475eba5b6SRobert Mustacchi 
106575eba5b6SRobert Mustacchi 	/* Check for a software override of the flow control settings, and
106675eba5b6SRobert Mustacchi 	 * setup the device accordingly.  If auto-negotiation is enabled, then
106775eba5b6SRobert Mustacchi 	 * software will have to set the "PAUSE" bits to the correct value in
106875eba5b6SRobert Mustacchi 	 * the Transmit Config Word Register (TXCW) and re-start auto-
106975eba5b6SRobert Mustacchi 	 * negotiation.  However, if auto-negotiation is disabled, then
107075eba5b6SRobert Mustacchi 	 * software will have to manually configure the two flow control enable
107175eba5b6SRobert Mustacchi 	 * bits in the CTRL register.
107275eba5b6SRobert Mustacchi 	 *
107375eba5b6SRobert Mustacchi 	 * The possible values of the "fc" parameter are:
107475eba5b6SRobert Mustacchi 	 *      0:  Flow control is completely disabled
107575eba5b6SRobert Mustacchi 	 *      1:  Rx flow control is enabled (we can receive pause frames,
107675eba5b6SRobert Mustacchi 	 *          but not send pause frames).
107775eba5b6SRobert Mustacchi 	 *      2:  Tx flow control is enabled (we can send pause frames but we
107875eba5b6SRobert Mustacchi 	 *          do not support receiving pause frames).
107975eba5b6SRobert Mustacchi 	 *      3:  Both Rx and Tx flow control (symmetric) are enabled.
108075eba5b6SRobert Mustacchi 	 */
108175eba5b6SRobert Mustacchi 	switch (hw->fc.current_mode) {
108275eba5b6SRobert Mustacchi 	case e1000_fc_none:
108375eba5b6SRobert Mustacchi 		/* Flow control completely disabled by a software over-ride. */
108475eba5b6SRobert Mustacchi 		txcw = (E1000_TXCW_ANE | E1000_TXCW_FD);
108575eba5b6SRobert Mustacchi 		break;
108675eba5b6SRobert Mustacchi 	case e1000_fc_rx_pause:
108775eba5b6SRobert Mustacchi 		/* Rx Flow control is enabled and Tx Flow control is disabled
108875eba5b6SRobert Mustacchi 		 * by a software over-ride. Since there really isn't a way to
108975eba5b6SRobert Mustacchi 		 * advertise that we are capable of Rx Pause ONLY, we will
109075eba5b6SRobert Mustacchi 		 * advertise that we support both symmetric and asymmetric Rx
109175eba5b6SRobert Mustacchi 		 * PAUSE.  Later, we will disable the adapter's ability to send
109275eba5b6SRobert Mustacchi 		 * PAUSE frames.
109375eba5b6SRobert Mustacchi 		 */
109475eba5b6SRobert Mustacchi 		txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
109575eba5b6SRobert Mustacchi 		break;
109675eba5b6SRobert Mustacchi 	case e1000_fc_tx_pause:
109775eba5b6SRobert Mustacchi 		/* Tx Flow control is enabled, and Rx Flow control is disabled,
109875eba5b6SRobert Mustacchi 		 * by a software over-ride.
109975eba5b6SRobert Mustacchi 		 */
110075eba5b6SRobert Mustacchi 		txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_ASM_DIR);
110175eba5b6SRobert Mustacchi 		break;
110275eba5b6SRobert Mustacchi 	case e1000_fc_full:
110375eba5b6SRobert Mustacchi 		/* Flow control (both Rx and Tx) is enabled by a software
110475eba5b6SRobert Mustacchi 		 * over-ride.
110575eba5b6SRobert Mustacchi 		 */
110675eba5b6SRobert Mustacchi 		txcw = (E1000_TXCW_ANE | E1000_TXCW_FD | E1000_TXCW_PAUSE_MASK);
110775eba5b6SRobert Mustacchi 		break;
110875eba5b6SRobert Mustacchi 	default:
110975eba5b6SRobert Mustacchi 		DEBUGOUT("Flow control param set incorrectly\n");
111075eba5b6SRobert Mustacchi 		return -E1000_ERR_CONFIG;
111175eba5b6SRobert Mustacchi 		break;
111275eba5b6SRobert Mustacchi 	}
111375eba5b6SRobert Mustacchi 
111475eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_TXCW, txcw);
111575eba5b6SRobert Mustacchi 	mac->txcw = txcw;
111675eba5b6SRobert Mustacchi 
111775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
111875eba5b6SRobert Mustacchi }
111975eba5b6SRobert Mustacchi 
112075eba5b6SRobert Mustacchi /**
112175eba5b6SRobert Mustacchi  *  e1000_poll_fiber_serdes_link_generic - Poll for link up
112275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
112375eba5b6SRobert Mustacchi  *
112475eba5b6SRobert Mustacchi  *  Polls for link up by reading the status register, if link fails to come
112575eba5b6SRobert Mustacchi  *  up with auto-negotiation, then the link is forced if a signal is detected.
112675eba5b6SRobert Mustacchi  **/
112775eba5b6SRobert Mustacchi s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw)
112875eba5b6SRobert Mustacchi {
112975eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
113075eba5b6SRobert Mustacchi 	u32 i, status;
113175eba5b6SRobert Mustacchi 	s32 ret_val;
113275eba5b6SRobert Mustacchi 
113375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_poll_fiber_serdes_link_generic");
113475eba5b6SRobert Mustacchi 
113575eba5b6SRobert Mustacchi 	/* If we have a signal (the cable is plugged in, or assumed TRUE for
113675eba5b6SRobert Mustacchi 	 * serdes media) then poll for a "Link-Up" indication in the Device
113775eba5b6SRobert Mustacchi 	 * Status Register.  Time-out if a link isn't seen in 500 milliseconds
113875eba5b6SRobert Mustacchi 	 * seconds (Auto-negotiation should complete in less than 500
113975eba5b6SRobert Mustacchi 	 * milliseconds even if the other end is doing it in SW).
114075eba5b6SRobert Mustacchi 	 */
114175eba5b6SRobert Mustacchi 	for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) {
114275eba5b6SRobert Mustacchi 		msec_delay(10);
114375eba5b6SRobert Mustacchi 		status = E1000_READ_REG(hw, E1000_STATUS);
114475eba5b6SRobert Mustacchi 		if (status & E1000_STATUS_LU)
114575eba5b6SRobert Mustacchi 			break;
114675eba5b6SRobert Mustacchi 	}
114775eba5b6SRobert Mustacchi 	if (i == FIBER_LINK_UP_LIMIT) {
114875eba5b6SRobert Mustacchi 		DEBUGOUT("Never got a valid link from auto-neg!!!\n");
114975eba5b6SRobert Mustacchi 		mac->autoneg_failed = TRUE;
115075eba5b6SRobert Mustacchi 		/* AutoNeg failed to achieve a link, so we'll call
115175eba5b6SRobert Mustacchi 		 * mac->check_for_link. This routine will force the
115275eba5b6SRobert Mustacchi 		 * link up if we detect a signal. This will allow us to
115375eba5b6SRobert Mustacchi 		 * communicate with non-autonegotiating link partners.
115475eba5b6SRobert Mustacchi 		 */
115575eba5b6SRobert Mustacchi 		ret_val = mac->ops.check_for_link(hw);
115675eba5b6SRobert Mustacchi 		if (ret_val) {
115775eba5b6SRobert Mustacchi 			DEBUGOUT("Error while checking for link\n");
115875eba5b6SRobert Mustacchi 			return ret_val;
115975eba5b6SRobert Mustacchi 		}
116075eba5b6SRobert Mustacchi 		mac->autoneg_failed = FALSE;
116175eba5b6SRobert Mustacchi 	} else {
116275eba5b6SRobert Mustacchi 		mac->autoneg_failed = FALSE;
116375eba5b6SRobert Mustacchi 		DEBUGOUT("Valid Link Found\n");
116475eba5b6SRobert Mustacchi 	}
116575eba5b6SRobert Mustacchi 
116675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
116775eba5b6SRobert Mustacchi }
116875eba5b6SRobert Mustacchi 
116975eba5b6SRobert Mustacchi /**
117075eba5b6SRobert Mustacchi  *  e1000_setup_fiber_serdes_link_generic - Setup link for fiber/serdes
117175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
117275eba5b6SRobert Mustacchi  *
117375eba5b6SRobert Mustacchi  *  Configures collision distance and flow control for fiber and serdes
117475eba5b6SRobert Mustacchi  *  links.  Upon successful setup, poll for link.
117575eba5b6SRobert Mustacchi  **/
117675eba5b6SRobert Mustacchi s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw)
117775eba5b6SRobert Mustacchi {
117875eba5b6SRobert Mustacchi 	u32 ctrl;
117975eba5b6SRobert Mustacchi 	s32 ret_val;
118075eba5b6SRobert Mustacchi 
118175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_setup_fiber_serdes_link_generic");
118275eba5b6SRobert Mustacchi 
118375eba5b6SRobert Mustacchi 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
118475eba5b6SRobert Mustacchi 
118575eba5b6SRobert Mustacchi 	/* Take the link out of reset */
118675eba5b6SRobert Mustacchi 	ctrl &= ~E1000_CTRL_LRST;
118775eba5b6SRobert Mustacchi 
118875eba5b6SRobert Mustacchi 	hw->mac.ops.config_collision_dist(hw);
118975eba5b6SRobert Mustacchi 
119075eba5b6SRobert Mustacchi 	ret_val = e1000_commit_fc_settings_generic(hw);
119175eba5b6SRobert Mustacchi 	if (ret_val)
119275eba5b6SRobert Mustacchi 		return ret_val;
119375eba5b6SRobert Mustacchi 
119475eba5b6SRobert Mustacchi 	/* Since auto-negotiation is enabled, take the link out of reset (the
119575eba5b6SRobert Mustacchi 	 * link will be in reset, because we previously reset the chip). This
119675eba5b6SRobert Mustacchi 	 * will restart auto-negotiation.  If auto-negotiation is successful
119775eba5b6SRobert Mustacchi 	 * then the link-up status bit will be set and the flow control enable
119875eba5b6SRobert Mustacchi 	 * bits (RFCE and TFCE) will be set according to their negotiated value.
119975eba5b6SRobert Mustacchi 	 */
120075eba5b6SRobert Mustacchi 	DEBUGOUT("Auto-negotiation enabled\n");
120175eba5b6SRobert Mustacchi 
120275eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
120375eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
120475eba5b6SRobert Mustacchi 	msec_delay(1);
120575eba5b6SRobert Mustacchi 
120675eba5b6SRobert Mustacchi 	/* For these adapters, the SW definable pin 1 is set when the optics
120775eba5b6SRobert Mustacchi 	 * detect a signal.  If we have a signal, then poll for a "Link-Up"
120875eba5b6SRobert Mustacchi 	 * indication.
120975eba5b6SRobert Mustacchi 	 */
121075eba5b6SRobert Mustacchi 	if (hw->phy.media_type == e1000_media_type_internal_serdes ||
121175eba5b6SRobert Mustacchi 	    (E1000_READ_REG(hw, E1000_CTRL) & E1000_CTRL_SWDPIN1)) {
121275eba5b6SRobert Mustacchi 		ret_val = e1000_poll_fiber_serdes_link_generic(hw);
121375eba5b6SRobert Mustacchi 	} else {
121475eba5b6SRobert Mustacchi 		DEBUGOUT("No signal detected\n");
121575eba5b6SRobert Mustacchi 	}
121675eba5b6SRobert Mustacchi 
121775eba5b6SRobert Mustacchi 	return ret_val;
121875eba5b6SRobert Mustacchi }
121975eba5b6SRobert Mustacchi 
122075eba5b6SRobert Mustacchi /**
122175eba5b6SRobert Mustacchi  *  e1000_config_collision_dist_generic - Configure collision distance
122275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
122375eba5b6SRobert Mustacchi  *
122475eba5b6SRobert Mustacchi  *  Configures the collision distance to the default value and is used
122575eba5b6SRobert Mustacchi  *  during link setup.
122675eba5b6SRobert Mustacchi  **/
122775eba5b6SRobert Mustacchi static void e1000_config_collision_dist_generic(struct e1000_hw *hw)
122875eba5b6SRobert Mustacchi {
122975eba5b6SRobert Mustacchi 	u32 tctl;
123075eba5b6SRobert Mustacchi 
123175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_config_collision_dist_generic");
123275eba5b6SRobert Mustacchi 
123375eba5b6SRobert Mustacchi 	tctl = E1000_READ_REG(hw, E1000_TCTL);
123475eba5b6SRobert Mustacchi 
123575eba5b6SRobert Mustacchi 	tctl &= ~E1000_TCTL_COLD;
123675eba5b6SRobert Mustacchi 	tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT;
123775eba5b6SRobert Mustacchi 
123875eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_TCTL, tctl);
123975eba5b6SRobert Mustacchi 	E1000_WRITE_FLUSH(hw);
124075eba5b6SRobert Mustacchi }
124175eba5b6SRobert Mustacchi 
124275eba5b6SRobert Mustacchi /**
124375eba5b6SRobert Mustacchi  *  e1000_set_fc_watermarks_generic - Set flow control high/low watermarks
124475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
124575eba5b6SRobert Mustacchi  *
124675eba5b6SRobert Mustacchi  *  Sets the flow control high/low threshold (watermark) registers.  If
124775eba5b6SRobert Mustacchi  *  flow control XON frame transmission is enabled, then set XON frame
124875eba5b6SRobert Mustacchi  *  transmission as well.
124975eba5b6SRobert Mustacchi  **/
125075eba5b6SRobert Mustacchi s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw)
125175eba5b6SRobert Mustacchi {
125275eba5b6SRobert Mustacchi 	u32 fcrtl = 0, fcrth = 0;
125375eba5b6SRobert Mustacchi 
125475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_set_fc_watermarks_generic");
125575eba5b6SRobert Mustacchi 
125675eba5b6SRobert Mustacchi 	/* Set the flow control receive threshold registers.  Normally,
125775eba5b6SRobert Mustacchi 	 * these registers will be set to a default threshold that may be
125875eba5b6SRobert Mustacchi 	 * adjusted later by the driver's runtime code.  However, if the
125975eba5b6SRobert Mustacchi 	 * ability to transmit pause frames is not enabled, then these
126075eba5b6SRobert Mustacchi 	 * registers will be set to 0.
126175eba5b6SRobert Mustacchi 	 */
126275eba5b6SRobert Mustacchi 	if (hw->fc.current_mode & e1000_fc_tx_pause) {
126375eba5b6SRobert Mustacchi 		/* We need to set up the Receive Threshold high and low water
126475eba5b6SRobert Mustacchi 		 * marks as well as (optionally) enabling the transmission of
126575eba5b6SRobert Mustacchi 		 * XON frames.
126675eba5b6SRobert Mustacchi 		 */
126775eba5b6SRobert Mustacchi 		fcrtl = hw->fc.low_water;
126875eba5b6SRobert Mustacchi 		if (hw->fc.send_xon)
126975eba5b6SRobert Mustacchi 			fcrtl |= E1000_FCRTL_XONE;
127075eba5b6SRobert Mustacchi 
127175eba5b6SRobert Mustacchi 		fcrth = hw->fc.high_water;
127275eba5b6SRobert Mustacchi 	}
127375eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl);
127475eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_FCRTH, fcrth);
127575eba5b6SRobert Mustacchi 
127675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
127775eba5b6SRobert Mustacchi }
127875eba5b6SRobert Mustacchi 
127975eba5b6SRobert Mustacchi /**
128075eba5b6SRobert Mustacchi  *  e1000_force_mac_fc_generic - Force the MAC's flow control settings
128175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
128275eba5b6SRobert Mustacchi  *
128375eba5b6SRobert Mustacchi  *  Force the MAC's flow control settings.  Sets the TFCE and RFCE bits in the
128475eba5b6SRobert Mustacchi  *  device control register to reflect the adapter settings.  TFCE and RFCE
128575eba5b6SRobert Mustacchi  *  need to be explicitly set by software when a copper PHY is used because
128675eba5b6SRobert Mustacchi  *  autonegotiation is managed by the PHY rather than the MAC.  Software must
128775eba5b6SRobert Mustacchi  *  also configure these bits when link is forced on a fiber connection.
128875eba5b6SRobert Mustacchi  **/
128975eba5b6SRobert Mustacchi s32 e1000_force_mac_fc_generic(struct e1000_hw *hw)
129075eba5b6SRobert Mustacchi {
129175eba5b6SRobert Mustacchi 	u32 ctrl;
129275eba5b6SRobert Mustacchi 
129375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_force_mac_fc_generic");
129475eba5b6SRobert Mustacchi 
129575eba5b6SRobert Mustacchi 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
129675eba5b6SRobert Mustacchi 
129775eba5b6SRobert Mustacchi 	/* Because we didn't get link via the internal auto-negotiation
129875eba5b6SRobert Mustacchi 	 * mechanism (we either forced link or we got link via PHY
129975eba5b6SRobert Mustacchi 	 * auto-neg), we have to manually enable/disable transmit an
130075eba5b6SRobert Mustacchi 	 * receive flow control.
130175eba5b6SRobert Mustacchi 	 *
130275eba5b6SRobert Mustacchi 	 * The "Case" statement below enables/disable flow control
130375eba5b6SRobert Mustacchi 	 * according to the "hw->fc.current_mode" parameter.
130475eba5b6SRobert Mustacchi 	 *
130575eba5b6SRobert Mustacchi 	 * The possible values of the "fc" parameter are:
130675eba5b6SRobert Mustacchi 	 *      0:  Flow control is completely disabled
130775eba5b6SRobert Mustacchi 	 *      1:  Rx flow control is enabled (we can receive pause
130875eba5b6SRobert Mustacchi 	 *          frames but not send pause frames).
130975eba5b6SRobert Mustacchi 	 *      2:  Tx flow control is enabled (we can send pause frames
131075eba5b6SRobert Mustacchi 	 *          frames but we do not receive pause frames).
131175eba5b6SRobert Mustacchi 	 *      3:  Both Rx and Tx flow control (symmetric) is enabled.
131275eba5b6SRobert Mustacchi 	 *  other:  No other values should be possible at this point.
131375eba5b6SRobert Mustacchi 	 */
131475eba5b6SRobert Mustacchi 	DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode);
131575eba5b6SRobert Mustacchi 
131675eba5b6SRobert Mustacchi 	switch (hw->fc.current_mode) {
131775eba5b6SRobert Mustacchi 	case e1000_fc_none:
131875eba5b6SRobert Mustacchi 		ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
131975eba5b6SRobert Mustacchi 		break;
132075eba5b6SRobert Mustacchi 	case e1000_fc_rx_pause:
132175eba5b6SRobert Mustacchi 		ctrl &= (~E1000_CTRL_TFCE);
132275eba5b6SRobert Mustacchi 		ctrl |= E1000_CTRL_RFCE;
132375eba5b6SRobert Mustacchi 		break;
132475eba5b6SRobert Mustacchi 	case e1000_fc_tx_pause:
132575eba5b6SRobert Mustacchi 		ctrl &= (~E1000_CTRL_RFCE);
132675eba5b6SRobert Mustacchi 		ctrl |= E1000_CTRL_TFCE;
132775eba5b6SRobert Mustacchi 		break;
132875eba5b6SRobert Mustacchi 	case e1000_fc_full:
132975eba5b6SRobert Mustacchi 		ctrl |= (E1000_CTRL_TFCE | E1000_CTRL_RFCE);
133075eba5b6SRobert Mustacchi 		break;
133175eba5b6SRobert Mustacchi 	default:
133275eba5b6SRobert Mustacchi 		DEBUGOUT("Flow control param set incorrectly\n");
133375eba5b6SRobert Mustacchi 		return -E1000_ERR_CONFIG;
133475eba5b6SRobert Mustacchi 	}
133575eba5b6SRobert Mustacchi 
133675eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
133775eba5b6SRobert Mustacchi 
133875eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
133975eba5b6SRobert Mustacchi }
134075eba5b6SRobert Mustacchi 
134175eba5b6SRobert Mustacchi /**
134275eba5b6SRobert Mustacchi  *  e1000_config_fc_after_link_up_generic - Configures flow control after link
134375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
134475eba5b6SRobert Mustacchi  *
134575eba5b6SRobert Mustacchi  *  Checks the status of auto-negotiation after link up to ensure that the
134675eba5b6SRobert Mustacchi  *  speed and duplex were not forced.  If the link needed to be forced, then
134775eba5b6SRobert Mustacchi  *  flow control needs to be forced also.  If auto-negotiation is enabled
134875eba5b6SRobert Mustacchi  *  and did not fail, then we configure flow control based on our link
134975eba5b6SRobert Mustacchi  *  partner.
135075eba5b6SRobert Mustacchi  **/
135175eba5b6SRobert Mustacchi s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw)
135275eba5b6SRobert Mustacchi {
135375eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
135475eba5b6SRobert Mustacchi 	s32 ret_val = E1000_SUCCESS;
135575eba5b6SRobert Mustacchi 	u32 pcs_status_reg, pcs_adv_reg, pcs_lp_ability_reg, pcs_ctrl_reg;
135675eba5b6SRobert Mustacchi 	u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
135775eba5b6SRobert Mustacchi 	u16 speed, duplex;
135875eba5b6SRobert Mustacchi 
135975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_config_fc_after_link_up_generic");
136075eba5b6SRobert Mustacchi 
136175eba5b6SRobert Mustacchi 	/* Check for the case where we have fiber media and auto-neg failed
136275eba5b6SRobert Mustacchi 	 * so we had to force link.  In this case, we need to force the
136375eba5b6SRobert Mustacchi 	 * configuration of the MAC to match the "fc" parameter.
136475eba5b6SRobert Mustacchi 	 */
136575eba5b6SRobert Mustacchi 	if (mac->autoneg_failed) {
136675eba5b6SRobert Mustacchi 		if (hw->phy.media_type == e1000_media_type_fiber ||
136775eba5b6SRobert Mustacchi 		    hw->phy.media_type == e1000_media_type_internal_serdes)
136875eba5b6SRobert Mustacchi 			ret_val = e1000_force_mac_fc_generic(hw);
136975eba5b6SRobert Mustacchi 	} else {
137075eba5b6SRobert Mustacchi 		if (hw->phy.media_type == e1000_media_type_copper)
137175eba5b6SRobert Mustacchi 			ret_val = e1000_force_mac_fc_generic(hw);
137275eba5b6SRobert Mustacchi 	}
137375eba5b6SRobert Mustacchi 
137475eba5b6SRobert Mustacchi 	if (ret_val) {
137575eba5b6SRobert Mustacchi 		DEBUGOUT("Error forcing flow control settings\n");
137675eba5b6SRobert Mustacchi 		return ret_val;
137775eba5b6SRobert Mustacchi 	}
137875eba5b6SRobert Mustacchi 
137975eba5b6SRobert Mustacchi 	/* Check for the case where we have copper media and auto-neg is
138075eba5b6SRobert Mustacchi 	 * enabled.  In this case, we need to check and see if Auto-Neg
138175eba5b6SRobert Mustacchi 	 * has completed, and if so, how the PHY and link partner has
138275eba5b6SRobert Mustacchi 	 * flow control configured.
138375eba5b6SRobert Mustacchi 	 */
138475eba5b6SRobert Mustacchi 	if ((hw->phy.media_type == e1000_media_type_copper) && mac->autoneg) {
138575eba5b6SRobert Mustacchi 		/* Read the MII Status Register and check to see if AutoNeg
138675eba5b6SRobert Mustacchi 		 * has completed.  We read this twice because this reg has
138775eba5b6SRobert Mustacchi 		 * some "sticky" (latched) bits.
138875eba5b6SRobert Mustacchi 		 */
138975eba5b6SRobert Mustacchi 		ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
139075eba5b6SRobert Mustacchi 		if (ret_val)
139175eba5b6SRobert Mustacchi 			return ret_val;
139275eba5b6SRobert Mustacchi 		ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
139375eba5b6SRobert Mustacchi 		if (ret_val)
139475eba5b6SRobert Mustacchi 			return ret_val;
139575eba5b6SRobert Mustacchi 
139675eba5b6SRobert Mustacchi 		if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) {
139775eba5b6SRobert Mustacchi 			DEBUGOUT("Copper PHY and Auto Neg has not completed.\n");
139875eba5b6SRobert Mustacchi 			return ret_val;
139975eba5b6SRobert Mustacchi 		}
140075eba5b6SRobert Mustacchi 
140175eba5b6SRobert Mustacchi 		/* The AutoNeg process has completed, so we now need to
140275eba5b6SRobert Mustacchi 		 * read both the Auto Negotiation Advertisement
140375eba5b6SRobert Mustacchi 		 * Register (Address 4) and the Auto_Negotiation Base
140475eba5b6SRobert Mustacchi 		 * Page Ability Register (Address 5) to determine how
140575eba5b6SRobert Mustacchi 		 * flow control was negotiated.
140675eba5b6SRobert Mustacchi 		 */
140775eba5b6SRobert Mustacchi 		ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV,
140875eba5b6SRobert Mustacchi 					       &mii_nway_adv_reg);
140975eba5b6SRobert Mustacchi 		if (ret_val)
141075eba5b6SRobert Mustacchi 			return ret_val;
141175eba5b6SRobert Mustacchi 		ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY,
141275eba5b6SRobert Mustacchi 					       &mii_nway_lp_ability_reg);
141375eba5b6SRobert Mustacchi 		if (ret_val)
141475eba5b6SRobert Mustacchi 			return ret_val;
141575eba5b6SRobert Mustacchi 
141675eba5b6SRobert Mustacchi 		/* Two bits in the Auto Negotiation Advertisement Register
141775eba5b6SRobert Mustacchi 		 * (Address 4) and two bits in the Auto Negotiation Base
141875eba5b6SRobert Mustacchi 		 * Page Ability Register (Address 5) determine flow control
141975eba5b6SRobert Mustacchi 		 * for both the PHY and the link partner.  The following
142075eba5b6SRobert Mustacchi 		 * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
142175eba5b6SRobert Mustacchi 		 * 1999, describes these PAUSE resolution bits and how flow
142275eba5b6SRobert Mustacchi 		 * control is determined based upon these settings.
142375eba5b6SRobert Mustacchi 		 * NOTE:  DC = Don't Care
142475eba5b6SRobert Mustacchi 		 *
142575eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
142675eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
142775eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
142875eba5b6SRobert Mustacchi 		 *   0   |    0    |  DC   |   DC    | e1000_fc_none
142975eba5b6SRobert Mustacchi 		 *   0   |    1    |   0   |   DC    | e1000_fc_none
143075eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    0    | e1000_fc_none
143175eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
143275eba5b6SRobert Mustacchi 		 *   1   |    0    |   0   |   DC    | e1000_fc_none
143375eba5b6SRobert Mustacchi 		 *   1   |   DC    |   1   |   DC    | e1000_fc_full
143475eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    0    | e1000_fc_none
143575eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
143675eba5b6SRobert Mustacchi 		 *
143775eba5b6SRobert Mustacchi 		 * Are both PAUSE bits set to 1?  If so, this implies
143875eba5b6SRobert Mustacchi 		 * Symmetric Flow Control is enabled at both ends.  The
143975eba5b6SRobert Mustacchi 		 * ASM_DIR bits are irrelevant per the spec.
144075eba5b6SRobert Mustacchi 		 *
144175eba5b6SRobert Mustacchi 		 * For Symmetric Flow Control:
144275eba5b6SRobert Mustacchi 		 *
144375eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
144475eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
144575eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
144675eba5b6SRobert Mustacchi 		 *   1   |   DC    |   1   |   DC    | E1000_fc_full
144775eba5b6SRobert Mustacchi 		 *
144875eba5b6SRobert Mustacchi 		 */
144975eba5b6SRobert Mustacchi 		if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
145075eba5b6SRobert Mustacchi 		    (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
145175eba5b6SRobert Mustacchi 			/* Now we need to check if the user selected Rx ONLY
145275eba5b6SRobert Mustacchi 			 * of pause frames.  In this case, we had to advertise
145375eba5b6SRobert Mustacchi 			 * FULL flow control because we could not advertise Rx
145475eba5b6SRobert Mustacchi 			 * ONLY. Hence, we must now check to see if we need to
145575eba5b6SRobert Mustacchi 			 * turn OFF the TRANSMISSION of PAUSE frames.
145675eba5b6SRobert Mustacchi 			 */
145775eba5b6SRobert Mustacchi 			if (hw->fc.requested_mode == e1000_fc_full) {
145875eba5b6SRobert Mustacchi 				hw->fc.current_mode = e1000_fc_full;
145975eba5b6SRobert Mustacchi 				DEBUGOUT("Flow Control = FULL.\n");
146075eba5b6SRobert Mustacchi 			} else {
146175eba5b6SRobert Mustacchi 				hw->fc.current_mode = e1000_fc_rx_pause;
146275eba5b6SRobert Mustacchi 				DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
146375eba5b6SRobert Mustacchi 			}
146475eba5b6SRobert Mustacchi 		}
146575eba5b6SRobert Mustacchi 		/* For receiving PAUSE frames ONLY.
146675eba5b6SRobert Mustacchi 		 *
146775eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
146875eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
146975eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
147075eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
147175eba5b6SRobert Mustacchi 		 */
147275eba5b6SRobert Mustacchi 		else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
147375eba5b6SRobert Mustacchi 			  (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
147475eba5b6SRobert Mustacchi 			  (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
147575eba5b6SRobert Mustacchi 			  (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
147675eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_tx_pause;
147775eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = Tx PAUSE frames only.\n");
147875eba5b6SRobert Mustacchi 		}
147975eba5b6SRobert Mustacchi 		/* For transmitting PAUSE frames ONLY.
148075eba5b6SRobert Mustacchi 		 *
148175eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
148275eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
148375eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
148475eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
148575eba5b6SRobert Mustacchi 		 */
148675eba5b6SRobert Mustacchi 		else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
148775eba5b6SRobert Mustacchi 			 (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
148875eba5b6SRobert Mustacchi 			 !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
148975eba5b6SRobert Mustacchi 			 (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
149075eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_rx_pause;
149175eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
149275eba5b6SRobert Mustacchi 		} else {
149375eba5b6SRobert Mustacchi 			/* Per the IEEE spec, at this point flow control
149475eba5b6SRobert Mustacchi 			 * should be disabled.
149575eba5b6SRobert Mustacchi 			 */
149675eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_none;
149775eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = NONE.\n");
149875eba5b6SRobert Mustacchi 		}
149975eba5b6SRobert Mustacchi 
150075eba5b6SRobert Mustacchi 		/* Now we need to do one last check...  If we auto-
150175eba5b6SRobert Mustacchi 		 * negotiated to HALF DUPLEX, flow control should not be
150275eba5b6SRobert Mustacchi 		 * enabled per IEEE 802.3 spec.
150375eba5b6SRobert Mustacchi 		 */
150475eba5b6SRobert Mustacchi 		ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
150575eba5b6SRobert Mustacchi 		if (ret_val) {
150675eba5b6SRobert Mustacchi 			DEBUGOUT("Error getting link speed and duplex\n");
150775eba5b6SRobert Mustacchi 			return ret_val;
150875eba5b6SRobert Mustacchi 		}
150975eba5b6SRobert Mustacchi 
151075eba5b6SRobert Mustacchi 		if (duplex == HALF_DUPLEX)
151175eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_none;
151275eba5b6SRobert Mustacchi 
151375eba5b6SRobert Mustacchi 		/* Now we call a subroutine to actually force the MAC
151475eba5b6SRobert Mustacchi 		 * controller to use the correct flow control settings.
151575eba5b6SRobert Mustacchi 		 */
151675eba5b6SRobert Mustacchi 		ret_val = e1000_force_mac_fc_generic(hw);
151775eba5b6SRobert Mustacchi 		if (ret_val) {
151875eba5b6SRobert Mustacchi 			DEBUGOUT("Error forcing flow control settings\n");
151975eba5b6SRobert Mustacchi 			return ret_val;
152075eba5b6SRobert Mustacchi 		}
152175eba5b6SRobert Mustacchi 	}
152275eba5b6SRobert Mustacchi 
152375eba5b6SRobert Mustacchi 	/* Check for the case where we have SerDes media and auto-neg is
152475eba5b6SRobert Mustacchi 	 * enabled.  In this case, we need to check and see if Auto-Neg
152575eba5b6SRobert Mustacchi 	 * has completed, and if so, how the PHY and link partner has
152675eba5b6SRobert Mustacchi 	 * flow control configured.
152775eba5b6SRobert Mustacchi 	 */
152875eba5b6SRobert Mustacchi 	if ((hw->phy.media_type == e1000_media_type_internal_serdes) &&
152975eba5b6SRobert Mustacchi 	    mac->autoneg) {
153075eba5b6SRobert Mustacchi 		/* Read the PCS_LSTS and check to see if AutoNeg
153175eba5b6SRobert Mustacchi 		 * has completed.
153275eba5b6SRobert Mustacchi 		 */
153375eba5b6SRobert Mustacchi 		pcs_status_reg = E1000_READ_REG(hw, E1000_PCS_LSTAT);
153475eba5b6SRobert Mustacchi 
153575eba5b6SRobert Mustacchi 		if (!(pcs_status_reg & E1000_PCS_LSTS_AN_COMPLETE)) {
153675eba5b6SRobert Mustacchi 			DEBUGOUT("PCS Auto Neg has not completed.\n");
153775eba5b6SRobert Mustacchi 			return ret_val;
153875eba5b6SRobert Mustacchi 		}
153975eba5b6SRobert Mustacchi 
154075eba5b6SRobert Mustacchi 		/* The AutoNeg process has completed, so we now need to
154175eba5b6SRobert Mustacchi 		 * read both the Auto Negotiation Advertisement
154275eba5b6SRobert Mustacchi 		 * Register (PCS_ANADV) and the Auto_Negotiation Base
154375eba5b6SRobert Mustacchi 		 * Page Ability Register (PCS_LPAB) to determine how
154475eba5b6SRobert Mustacchi 		 * flow control was negotiated.
154575eba5b6SRobert Mustacchi 		 */
154675eba5b6SRobert Mustacchi 		pcs_adv_reg = E1000_READ_REG(hw, E1000_PCS_ANADV);
154775eba5b6SRobert Mustacchi 		pcs_lp_ability_reg = E1000_READ_REG(hw, E1000_PCS_LPAB);
154875eba5b6SRobert Mustacchi 
154975eba5b6SRobert Mustacchi 		/* Two bits in the Auto Negotiation Advertisement Register
155075eba5b6SRobert Mustacchi 		 * (PCS_ANADV) and two bits in the Auto Negotiation Base
155175eba5b6SRobert Mustacchi 		 * Page Ability Register (PCS_LPAB) determine flow control
155275eba5b6SRobert Mustacchi 		 * for both the PHY and the link partner.  The following
155375eba5b6SRobert Mustacchi 		 * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
155475eba5b6SRobert Mustacchi 		 * 1999, describes these PAUSE resolution bits and how flow
155575eba5b6SRobert Mustacchi 		 * control is determined based upon these settings.
155675eba5b6SRobert Mustacchi 		 * NOTE:  DC = Don't Care
155775eba5b6SRobert Mustacchi 		 *
155875eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
155975eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
156075eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
156175eba5b6SRobert Mustacchi 		 *   0   |    0    |  DC   |   DC    | e1000_fc_none
156275eba5b6SRobert Mustacchi 		 *   0   |    1    |   0   |   DC    | e1000_fc_none
156375eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    0    | e1000_fc_none
156475eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
156575eba5b6SRobert Mustacchi 		 *   1   |    0    |   0   |   DC    | e1000_fc_none
156675eba5b6SRobert Mustacchi 		 *   1   |   DC    |   1   |   DC    | e1000_fc_full
156775eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    0    | e1000_fc_none
156875eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
156975eba5b6SRobert Mustacchi 		 *
157075eba5b6SRobert Mustacchi 		 * Are both PAUSE bits set to 1?  If so, this implies
157175eba5b6SRobert Mustacchi 		 * Symmetric Flow Control is enabled at both ends.  The
157275eba5b6SRobert Mustacchi 		 * ASM_DIR bits are irrelevant per the spec.
157375eba5b6SRobert Mustacchi 		 *
157475eba5b6SRobert Mustacchi 		 * For Symmetric Flow Control:
157575eba5b6SRobert Mustacchi 		 *
157675eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
157775eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
157875eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
157975eba5b6SRobert Mustacchi 		 *   1   |   DC    |   1   |   DC    | e1000_fc_full
158075eba5b6SRobert Mustacchi 		 *
158175eba5b6SRobert Mustacchi 		 */
158275eba5b6SRobert Mustacchi 		if ((pcs_adv_reg & E1000_TXCW_PAUSE) &&
158375eba5b6SRobert Mustacchi 		    (pcs_lp_ability_reg & E1000_TXCW_PAUSE)) {
158475eba5b6SRobert Mustacchi 			/* Now we need to check if the user selected Rx ONLY
158575eba5b6SRobert Mustacchi 			 * of pause frames.  In this case, we had to advertise
158675eba5b6SRobert Mustacchi 			 * FULL flow control because we could not advertise Rx
158775eba5b6SRobert Mustacchi 			 * ONLY. Hence, we must now check to see if we need to
158875eba5b6SRobert Mustacchi 			 * turn OFF the TRANSMISSION of PAUSE frames.
158975eba5b6SRobert Mustacchi 			 */
159075eba5b6SRobert Mustacchi 			if (hw->fc.requested_mode == e1000_fc_full) {
159175eba5b6SRobert Mustacchi 				hw->fc.current_mode = e1000_fc_full;
159275eba5b6SRobert Mustacchi 				DEBUGOUT("Flow Control = FULL.\n");
159375eba5b6SRobert Mustacchi 			} else {
159475eba5b6SRobert Mustacchi 				hw->fc.current_mode = e1000_fc_rx_pause;
159575eba5b6SRobert Mustacchi 				DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
159675eba5b6SRobert Mustacchi 			}
159775eba5b6SRobert Mustacchi 		}
159875eba5b6SRobert Mustacchi 		/* For receiving PAUSE frames ONLY.
159975eba5b6SRobert Mustacchi 		 *
160075eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
160175eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
160275eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
160375eba5b6SRobert Mustacchi 		 *   0   |    1    |   1   |    1    | e1000_fc_tx_pause
160475eba5b6SRobert Mustacchi 		 */
160575eba5b6SRobert Mustacchi 		else if (!(pcs_adv_reg & E1000_TXCW_PAUSE) &&
160675eba5b6SRobert Mustacchi 			  (pcs_adv_reg & E1000_TXCW_ASM_DIR) &&
160775eba5b6SRobert Mustacchi 			  (pcs_lp_ability_reg & E1000_TXCW_PAUSE) &&
160875eba5b6SRobert Mustacchi 			  (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) {
160975eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_tx_pause;
161075eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = Tx PAUSE frames only.\n");
161175eba5b6SRobert Mustacchi 		}
161275eba5b6SRobert Mustacchi 		/* For transmitting PAUSE frames ONLY.
161375eba5b6SRobert Mustacchi 		 *
161475eba5b6SRobert Mustacchi 		 *   LOCAL DEVICE  |   LINK PARTNER
161575eba5b6SRobert Mustacchi 		 * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
161675eba5b6SRobert Mustacchi 		 *-------|---------|-------|---------|--------------------
161775eba5b6SRobert Mustacchi 		 *   1   |    1    |   0   |    1    | e1000_fc_rx_pause
161875eba5b6SRobert Mustacchi 		 */
161975eba5b6SRobert Mustacchi 		else if ((pcs_adv_reg & E1000_TXCW_PAUSE) &&
162075eba5b6SRobert Mustacchi 			 (pcs_adv_reg & E1000_TXCW_ASM_DIR) &&
162175eba5b6SRobert Mustacchi 			 !(pcs_lp_ability_reg & E1000_TXCW_PAUSE) &&
162275eba5b6SRobert Mustacchi 			 (pcs_lp_ability_reg & E1000_TXCW_ASM_DIR)) {
162375eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_rx_pause;
162475eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
162575eba5b6SRobert Mustacchi 		} else {
162675eba5b6SRobert Mustacchi 			/* Per the IEEE spec, at this point flow control
162775eba5b6SRobert Mustacchi 			 * should be disabled.
162875eba5b6SRobert Mustacchi 			 */
162975eba5b6SRobert Mustacchi 			hw->fc.current_mode = e1000_fc_none;
163075eba5b6SRobert Mustacchi 			DEBUGOUT("Flow Control = NONE.\n");
163175eba5b6SRobert Mustacchi 		}
163275eba5b6SRobert Mustacchi 
163375eba5b6SRobert Mustacchi 		/* Now we call a subroutine to actually force the MAC
163475eba5b6SRobert Mustacchi 		 * controller to use the correct flow control settings.
163575eba5b6SRobert Mustacchi 		 */
163675eba5b6SRobert Mustacchi 		pcs_ctrl_reg = E1000_READ_REG(hw, E1000_PCS_LCTL);
163775eba5b6SRobert Mustacchi 		pcs_ctrl_reg |= E1000_PCS_LCTL_FORCE_FCTRL;
163875eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_PCS_LCTL, pcs_ctrl_reg);
163975eba5b6SRobert Mustacchi 
164075eba5b6SRobert Mustacchi 		ret_val = e1000_force_mac_fc_generic(hw);
164175eba5b6SRobert Mustacchi 		if (ret_val) {
164275eba5b6SRobert Mustacchi 			DEBUGOUT("Error forcing flow control settings\n");
164375eba5b6SRobert Mustacchi 			return ret_val;
164475eba5b6SRobert Mustacchi 		}
164575eba5b6SRobert Mustacchi 	}
164675eba5b6SRobert Mustacchi 
164775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
164875eba5b6SRobert Mustacchi }
164975eba5b6SRobert Mustacchi 
165075eba5b6SRobert Mustacchi /**
165175eba5b6SRobert Mustacchi  *  e1000_get_speed_and_duplex_copper_generic - Retrieve current speed/duplex
165275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
165375eba5b6SRobert Mustacchi  *  @speed: stores the current speed
165475eba5b6SRobert Mustacchi  *  @duplex: stores the current duplex
165575eba5b6SRobert Mustacchi  *
165675eba5b6SRobert Mustacchi  *  Read the status register for the current speed/duplex and store the current
165775eba5b6SRobert Mustacchi  *  speed and duplex for copper connections.
165875eba5b6SRobert Mustacchi  **/
165975eba5b6SRobert Mustacchi s32 e1000_get_speed_and_duplex_copper_generic(struct e1000_hw *hw, u16 *speed,
166075eba5b6SRobert Mustacchi 					      u16 *duplex)
166175eba5b6SRobert Mustacchi {
166275eba5b6SRobert Mustacchi 	u32 status;
166375eba5b6SRobert Mustacchi 
166475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_speed_and_duplex_copper_generic");
166575eba5b6SRobert Mustacchi 
166675eba5b6SRobert Mustacchi 	status = E1000_READ_REG(hw, E1000_STATUS);
166775eba5b6SRobert Mustacchi 	if (status & E1000_STATUS_SPEED_1000) {
166875eba5b6SRobert Mustacchi 		*speed = SPEED_1000;
166975eba5b6SRobert Mustacchi 		DEBUGOUT("1000 Mbs, ");
167075eba5b6SRobert Mustacchi 	} else if (status & E1000_STATUS_SPEED_100) {
167175eba5b6SRobert Mustacchi 		*speed = SPEED_100;
167275eba5b6SRobert Mustacchi 		DEBUGOUT("100 Mbs, ");
167375eba5b6SRobert Mustacchi 	} else {
167475eba5b6SRobert Mustacchi 		*speed = SPEED_10;
167575eba5b6SRobert Mustacchi 		DEBUGOUT("10 Mbs, ");
167675eba5b6SRobert Mustacchi 	}
167775eba5b6SRobert Mustacchi 
167875eba5b6SRobert Mustacchi 	if (status & E1000_STATUS_FD) {
167975eba5b6SRobert Mustacchi 		*duplex = FULL_DUPLEX;
168075eba5b6SRobert Mustacchi 		DEBUGOUT("Full Duplex\n");
168175eba5b6SRobert Mustacchi 	} else {
168275eba5b6SRobert Mustacchi 		*duplex = HALF_DUPLEX;
168375eba5b6SRobert Mustacchi 		DEBUGOUT("Half Duplex\n");
168475eba5b6SRobert Mustacchi 	}
168575eba5b6SRobert Mustacchi 
168675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
168775eba5b6SRobert Mustacchi }
168875eba5b6SRobert Mustacchi 
168975eba5b6SRobert Mustacchi /**
169075eba5b6SRobert Mustacchi  *  e1000_get_speed_and_duplex_fiber_generic - Retrieve current speed/duplex
169175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
169275eba5b6SRobert Mustacchi  *  @speed: stores the current speed
169375eba5b6SRobert Mustacchi  *  @duplex: stores the current duplex
169475eba5b6SRobert Mustacchi  *
169575eba5b6SRobert Mustacchi  *  Sets the speed and duplex to gigabit full duplex (the only possible option)
169675eba5b6SRobert Mustacchi  *  for fiber/serdes links.
169775eba5b6SRobert Mustacchi  **/
1698c124a83eSRobert Mustacchi s32 e1000_get_speed_and_duplex_fiber_serdes_generic(struct e1000_hw E1000_UNUSEDARG *hw,
169975eba5b6SRobert Mustacchi 						    u16 *speed, u16 *duplex)
170075eba5b6SRobert Mustacchi {
170175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_speed_and_duplex_fiber_serdes_generic");
170275eba5b6SRobert Mustacchi 
170375eba5b6SRobert Mustacchi 	*speed = SPEED_1000;
170475eba5b6SRobert Mustacchi 	*duplex = FULL_DUPLEX;
170575eba5b6SRobert Mustacchi 
170675eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
170775eba5b6SRobert Mustacchi }
170875eba5b6SRobert Mustacchi 
170975eba5b6SRobert Mustacchi /**
171075eba5b6SRobert Mustacchi  *  e1000_get_hw_semaphore_generic - Acquire hardware semaphore
171175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
171275eba5b6SRobert Mustacchi  *
171375eba5b6SRobert Mustacchi  *  Acquire the HW semaphore to access the PHY or NVM
171475eba5b6SRobert Mustacchi  **/
171575eba5b6SRobert Mustacchi s32 e1000_get_hw_semaphore_generic(struct e1000_hw *hw)
171675eba5b6SRobert Mustacchi {
171775eba5b6SRobert Mustacchi 	u32 swsm;
171875eba5b6SRobert Mustacchi 	s32 timeout = hw->nvm.word_size + 1;
171975eba5b6SRobert Mustacchi 	s32 i = 0;
172075eba5b6SRobert Mustacchi 
172175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_hw_semaphore_generic");
172275eba5b6SRobert Mustacchi 
172375eba5b6SRobert Mustacchi 	/* Get the SW semaphore */
172475eba5b6SRobert Mustacchi 	while (i < timeout) {
172575eba5b6SRobert Mustacchi 		swsm = E1000_READ_REG(hw, E1000_SWSM);
172675eba5b6SRobert Mustacchi 		if (!(swsm & E1000_SWSM_SMBI))
172775eba5b6SRobert Mustacchi 			break;
172875eba5b6SRobert Mustacchi 
172975eba5b6SRobert Mustacchi 		usec_delay(50);
173075eba5b6SRobert Mustacchi 		i++;
173175eba5b6SRobert Mustacchi 	}
173275eba5b6SRobert Mustacchi 
173375eba5b6SRobert Mustacchi 	if (i == timeout) {
173475eba5b6SRobert Mustacchi 		DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
173575eba5b6SRobert Mustacchi 		return -E1000_ERR_NVM;
173675eba5b6SRobert Mustacchi 	}
173775eba5b6SRobert Mustacchi 
173875eba5b6SRobert Mustacchi 	/* Get the FW semaphore. */
173975eba5b6SRobert Mustacchi 	for (i = 0; i < timeout; i++) {
174075eba5b6SRobert Mustacchi 		swsm = E1000_READ_REG(hw, E1000_SWSM);
174175eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_SWSM, swsm | E1000_SWSM_SWESMBI);
174275eba5b6SRobert Mustacchi 
174375eba5b6SRobert Mustacchi 		/* Semaphore acquired if bit latched */
174475eba5b6SRobert Mustacchi 		if (E1000_READ_REG(hw, E1000_SWSM) & E1000_SWSM_SWESMBI)
174575eba5b6SRobert Mustacchi 			break;
174675eba5b6SRobert Mustacchi 
174775eba5b6SRobert Mustacchi 		usec_delay(50);
174875eba5b6SRobert Mustacchi 	}
174975eba5b6SRobert Mustacchi 
175075eba5b6SRobert Mustacchi 	if (i == timeout) {
175175eba5b6SRobert Mustacchi 		/* Release semaphores */
175275eba5b6SRobert Mustacchi 		e1000_put_hw_semaphore_generic(hw);
175375eba5b6SRobert Mustacchi 		DEBUGOUT("Driver can't access the NVM\n");
175475eba5b6SRobert Mustacchi 		return -E1000_ERR_NVM;
175575eba5b6SRobert Mustacchi 	}
175675eba5b6SRobert Mustacchi 
175775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
175875eba5b6SRobert Mustacchi }
175975eba5b6SRobert Mustacchi 
176075eba5b6SRobert Mustacchi /**
176175eba5b6SRobert Mustacchi  *  e1000_put_hw_semaphore_generic - Release hardware semaphore
176275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
176375eba5b6SRobert Mustacchi  *
176475eba5b6SRobert Mustacchi  *  Release hardware semaphore used to access the PHY or NVM
176575eba5b6SRobert Mustacchi  **/
176675eba5b6SRobert Mustacchi void e1000_put_hw_semaphore_generic(struct e1000_hw *hw)
176775eba5b6SRobert Mustacchi {
176875eba5b6SRobert Mustacchi 	u32 swsm;
176975eba5b6SRobert Mustacchi 
177075eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_put_hw_semaphore_generic");
177175eba5b6SRobert Mustacchi 
177275eba5b6SRobert Mustacchi 	swsm = E1000_READ_REG(hw, E1000_SWSM);
177375eba5b6SRobert Mustacchi 
177475eba5b6SRobert Mustacchi 	swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);
177575eba5b6SRobert Mustacchi 
177675eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_SWSM, swsm);
177775eba5b6SRobert Mustacchi }
177875eba5b6SRobert Mustacchi 
177975eba5b6SRobert Mustacchi /**
178075eba5b6SRobert Mustacchi  *  e1000_get_auto_rd_done_generic - Check for auto read completion
178175eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
178275eba5b6SRobert Mustacchi  *
178375eba5b6SRobert Mustacchi  *  Check EEPROM for Auto Read done bit.
178475eba5b6SRobert Mustacchi  **/
178575eba5b6SRobert Mustacchi s32 e1000_get_auto_rd_done_generic(struct e1000_hw *hw)
178675eba5b6SRobert Mustacchi {
178775eba5b6SRobert Mustacchi 	s32 i = 0;
178875eba5b6SRobert Mustacchi 
178975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_get_auto_rd_done_generic");
179075eba5b6SRobert Mustacchi 
179175eba5b6SRobert Mustacchi 	while (i < AUTO_READ_DONE_TIMEOUT) {
179275eba5b6SRobert Mustacchi 		if (E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_AUTO_RD)
179375eba5b6SRobert Mustacchi 			break;
179475eba5b6SRobert Mustacchi 		msec_delay(1);
179575eba5b6SRobert Mustacchi 		i++;
179675eba5b6SRobert Mustacchi 	}
179775eba5b6SRobert Mustacchi 
179875eba5b6SRobert Mustacchi 	if (i == AUTO_READ_DONE_TIMEOUT) {
179975eba5b6SRobert Mustacchi 		DEBUGOUT("Auto read by HW from NVM has not completed.\n");
180075eba5b6SRobert Mustacchi 		return -E1000_ERR_RESET;
180175eba5b6SRobert Mustacchi 	}
180275eba5b6SRobert Mustacchi 
180375eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
180475eba5b6SRobert Mustacchi }
180575eba5b6SRobert Mustacchi 
180675eba5b6SRobert Mustacchi /**
180775eba5b6SRobert Mustacchi  *  e1000_valid_led_default_generic - Verify a valid default LED config
180875eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
180975eba5b6SRobert Mustacchi  *  @data: pointer to the NVM (EEPROM)
181075eba5b6SRobert Mustacchi  *
181175eba5b6SRobert Mustacchi  *  Read the EEPROM for the current default LED configuration.  If the
181275eba5b6SRobert Mustacchi  *  LED configuration is not valid, set to a valid LED configuration.
181375eba5b6SRobert Mustacchi  **/
181475eba5b6SRobert Mustacchi s32 e1000_valid_led_default_generic(struct e1000_hw *hw, u16 *data)
181575eba5b6SRobert Mustacchi {
181675eba5b6SRobert Mustacchi 	s32 ret_val;
181775eba5b6SRobert Mustacchi 
181875eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_valid_led_default_generic");
181975eba5b6SRobert Mustacchi 
182075eba5b6SRobert Mustacchi 	ret_val = hw->nvm.ops.read(hw, NVM_ID_LED_SETTINGS, 1, data);
182175eba5b6SRobert Mustacchi 	if (ret_val) {
182275eba5b6SRobert Mustacchi 		DEBUGOUT("NVM Read Error\n");
182375eba5b6SRobert Mustacchi 		return ret_val;
182475eba5b6SRobert Mustacchi 	}
182575eba5b6SRobert Mustacchi 
182675eba5b6SRobert Mustacchi 	if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF)
182775eba5b6SRobert Mustacchi 		*data = ID_LED_DEFAULT;
182875eba5b6SRobert Mustacchi 
182975eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
183075eba5b6SRobert Mustacchi }
183175eba5b6SRobert Mustacchi 
183275eba5b6SRobert Mustacchi /**
183375eba5b6SRobert Mustacchi  *  e1000_id_led_init_generic -
183475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
183575eba5b6SRobert Mustacchi  *
183675eba5b6SRobert Mustacchi  **/
183775eba5b6SRobert Mustacchi s32 e1000_id_led_init_generic(struct e1000_hw *hw)
183875eba5b6SRobert Mustacchi {
183975eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
184075eba5b6SRobert Mustacchi 	s32 ret_val;
184175eba5b6SRobert Mustacchi 	const u32 ledctl_mask = 0x000000FF;
184275eba5b6SRobert Mustacchi 	const u32 ledctl_on = E1000_LEDCTL_MODE_LED_ON;
184375eba5b6SRobert Mustacchi 	const u32 ledctl_off = E1000_LEDCTL_MODE_LED_OFF;
184475eba5b6SRobert Mustacchi 	u16 data, i, temp;
184575eba5b6SRobert Mustacchi 	const u16 led_mask = 0x0F;
184675eba5b6SRobert Mustacchi 
184775eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_id_led_init_generic");
184875eba5b6SRobert Mustacchi 
184975eba5b6SRobert Mustacchi 	ret_val = hw->nvm.ops.valid_led_default(hw, &data);
185075eba5b6SRobert Mustacchi 	if (ret_val)
185175eba5b6SRobert Mustacchi 		return ret_val;
185275eba5b6SRobert Mustacchi 
185375eba5b6SRobert Mustacchi 	mac->ledctl_default = E1000_READ_REG(hw, E1000_LEDCTL);
185475eba5b6SRobert Mustacchi 	mac->ledctl_mode1 = mac->ledctl_default;
185575eba5b6SRobert Mustacchi 	mac->ledctl_mode2 = mac->ledctl_default;
185675eba5b6SRobert Mustacchi 
185775eba5b6SRobert Mustacchi 	for (i = 0; i < 4; i++) {
185875eba5b6SRobert Mustacchi 		temp = (data >> (i << 2)) & led_mask;
185975eba5b6SRobert Mustacchi 		switch (temp) {
186075eba5b6SRobert Mustacchi 		case ID_LED_ON1_DEF2:
186175eba5b6SRobert Mustacchi 		case ID_LED_ON1_ON2:
186275eba5b6SRobert Mustacchi 		case ID_LED_ON1_OFF2:
186375eba5b6SRobert Mustacchi 			mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
186475eba5b6SRobert Mustacchi 			mac->ledctl_mode1 |= ledctl_on << (i << 3);
186575eba5b6SRobert Mustacchi 			break;
186675eba5b6SRobert Mustacchi 		case ID_LED_OFF1_DEF2:
186775eba5b6SRobert Mustacchi 		case ID_LED_OFF1_ON2:
186875eba5b6SRobert Mustacchi 		case ID_LED_OFF1_OFF2:
186975eba5b6SRobert Mustacchi 			mac->ledctl_mode1 &= ~(ledctl_mask << (i << 3));
187075eba5b6SRobert Mustacchi 			mac->ledctl_mode1 |= ledctl_off << (i << 3);
187175eba5b6SRobert Mustacchi 			break;
187275eba5b6SRobert Mustacchi 		default:
187375eba5b6SRobert Mustacchi 			/* Do nothing */
187475eba5b6SRobert Mustacchi 			break;
187575eba5b6SRobert Mustacchi 		}
187675eba5b6SRobert Mustacchi 		switch (temp) {
187775eba5b6SRobert Mustacchi 		case ID_LED_DEF1_ON2:
187875eba5b6SRobert Mustacchi 		case ID_LED_ON1_ON2:
187975eba5b6SRobert Mustacchi 		case ID_LED_OFF1_ON2:
188075eba5b6SRobert Mustacchi 			mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
188175eba5b6SRobert Mustacchi 			mac->ledctl_mode2 |= ledctl_on << (i << 3);
188275eba5b6SRobert Mustacchi 			break;
188375eba5b6SRobert Mustacchi 		case ID_LED_DEF1_OFF2:
188475eba5b6SRobert Mustacchi 		case ID_LED_ON1_OFF2:
188575eba5b6SRobert Mustacchi 		case ID_LED_OFF1_OFF2:
188675eba5b6SRobert Mustacchi 			mac->ledctl_mode2 &= ~(ledctl_mask << (i << 3));
188775eba5b6SRobert Mustacchi 			mac->ledctl_mode2 |= ledctl_off << (i << 3);
188875eba5b6SRobert Mustacchi 			break;
188975eba5b6SRobert Mustacchi 		default:
189075eba5b6SRobert Mustacchi 			/* Do nothing */
189175eba5b6SRobert Mustacchi 			break;
189275eba5b6SRobert Mustacchi 		}
189375eba5b6SRobert Mustacchi 	}
189475eba5b6SRobert Mustacchi 
189575eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
189675eba5b6SRobert Mustacchi }
189775eba5b6SRobert Mustacchi 
189875eba5b6SRobert Mustacchi /**
189975eba5b6SRobert Mustacchi  *  e1000_setup_led_generic - Configures SW controllable LED
190075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
190175eba5b6SRobert Mustacchi  *
190275eba5b6SRobert Mustacchi  *  This prepares the SW controllable LED for use and saves the current state
190375eba5b6SRobert Mustacchi  *  of the LED so it can be later restored.
190475eba5b6SRobert Mustacchi  **/
190575eba5b6SRobert Mustacchi s32 e1000_setup_led_generic(struct e1000_hw *hw)
190675eba5b6SRobert Mustacchi {
190775eba5b6SRobert Mustacchi 	u32 ledctl;
190875eba5b6SRobert Mustacchi 
190975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_setup_led_generic");
191075eba5b6SRobert Mustacchi 
191175eba5b6SRobert Mustacchi 	if (hw->mac.ops.setup_led != e1000_setup_led_generic)
191275eba5b6SRobert Mustacchi 		return -E1000_ERR_CONFIG;
191375eba5b6SRobert Mustacchi 
191475eba5b6SRobert Mustacchi 	if (hw->phy.media_type == e1000_media_type_fiber) {
191575eba5b6SRobert Mustacchi 		ledctl = E1000_READ_REG(hw, E1000_LEDCTL);
191675eba5b6SRobert Mustacchi 		hw->mac.ledctl_default = ledctl;
191775eba5b6SRobert Mustacchi 		/* Turn off LED0 */
191875eba5b6SRobert Mustacchi 		ledctl &= ~(E1000_LEDCTL_LED0_IVRT | E1000_LEDCTL_LED0_BLINK |
191975eba5b6SRobert Mustacchi 			    E1000_LEDCTL_LED0_MODE_MASK);
192075eba5b6SRobert Mustacchi 		ledctl |= (E1000_LEDCTL_MODE_LED_OFF <<
192175eba5b6SRobert Mustacchi 			   E1000_LEDCTL_LED0_MODE_SHIFT);
192275eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl);
192375eba5b6SRobert Mustacchi 	} else if (hw->phy.media_type == e1000_media_type_copper) {
192475eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1);
192575eba5b6SRobert Mustacchi 	}
192675eba5b6SRobert Mustacchi 
192775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
192875eba5b6SRobert Mustacchi }
192975eba5b6SRobert Mustacchi 
193075eba5b6SRobert Mustacchi /**
193175eba5b6SRobert Mustacchi  *  e1000_cleanup_led_generic - Set LED config to default operation
193275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
193375eba5b6SRobert Mustacchi  *
193475eba5b6SRobert Mustacchi  *  Remove the current LED configuration and set the LED configuration
193575eba5b6SRobert Mustacchi  *  to the default value, saved from the EEPROM.
193675eba5b6SRobert Mustacchi  **/
193775eba5b6SRobert Mustacchi s32 e1000_cleanup_led_generic(struct e1000_hw *hw)
193875eba5b6SRobert Mustacchi {
193975eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_cleanup_led_generic");
194075eba5b6SRobert Mustacchi 
194175eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default);
194275eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
194375eba5b6SRobert Mustacchi }
194475eba5b6SRobert Mustacchi 
194575eba5b6SRobert Mustacchi /**
194675eba5b6SRobert Mustacchi  *  e1000_blink_led_generic - Blink LED
194775eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
194875eba5b6SRobert Mustacchi  *
194975eba5b6SRobert Mustacchi  *  Blink the LEDs which are set to be on.
195075eba5b6SRobert Mustacchi  **/
195175eba5b6SRobert Mustacchi s32 e1000_blink_led_generic(struct e1000_hw *hw)
195275eba5b6SRobert Mustacchi {
195375eba5b6SRobert Mustacchi 	u32 ledctl_blink = 0;
195475eba5b6SRobert Mustacchi 	u32 i;
195575eba5b6SRobert Mustacchi 
195675eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_blink_led_generic");
195775eba5b6SRobert Mustacchi 
195875eba5b6SRobert Mustacchi 	if (hw->phy.media_type == e1000_media_type_fiber) {
195975eba5b6SRobert Mustacchi 		/* always blink LED0 for PCI-E fiber */
196075eba5b6SRobert Mustacchi 		ledctl_blink = E1000_LEDCTL_LED0_BLINK |
196175eba5b6SRobert Mustacchi 		     (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
196275eba5b6SRobert Mustacchi 	} else {
196375eba5b6SRobert Mustacchi 		/* Set the blink bit for each LED that's "on" (0x0E)
196475eba5b6SRobert Mustacchi 		 * (or "off" if inverted) in ledctl_mode2.  The blink
196575eba5b6SRobert Mustacchi 		 * logic in hardware only works when mode is set to "on"
196675eba5b6SRobert Mustacchi 		 * so it must be changed accordingly when the mode is
196775eba5b6SRobert Mustacchi 		 * "off" and inverted.
196875eba5b6SRobert Mustacchi 		 */
196975eba5b6SRobert Mustacchi 		ledctl_blink = hw->mac.ledctl_mode2;
197075eba5b6SRobert Mustacchi 		for (i = 0; i < 32; i += 8) {
197175eba5b6SRobert Mustacchi 			u32 mode = (hw->mac.ledctl_mode2 >> i) &
197275eba5b6SRobert Mustacchi 			    E1000_LEDCTL_LED0_MODE_MASK;
197375eba5b6SRobert Mustacchi 			u32 led_default = hw->mac.ledctl_default >> i;
197475eba5b6SRobert Mustacchi 
197575eba5b6SRobert Mustacchi 			if ((!(led_default & E1000_LEDCTL_LED0_IVRT) &&
197675eba5b6SRobert Mustacchi 			     (mode == E1000_LEDCTL_MODE_LED_ON)) ||
197775eba5b6SRobert Mustacchi 			    ((led_default & E1000_LEDCTL_LED0_IVRT) &&
197875eba5b6SRobert Mustacchi 			     (mode == E1000_LEDCTL_MODE_LED_OFF))) {
197975eba5b6SRobert Mustacchi 				ledctl_blink &=
198075eba5b6SRobert Mustacchi 				    ~(E1000_LEDCTL_LED0_MODE_MASK << i);
198175eba5b6SRobert Mustacchi 				ledctl_blink |= (E1000_LEDCTL_LED0_BLINK |
198275eba5b6SRobert Mustacchi 						 E1000_LEDCTL_MODE_LED_ON) << i;
198375eba5b6SRobert Mustacchi 			}
198475eba5b6SRobert Mustacchi 		}
198575eba5b6SRobert Mustacchi 	}
198675eba5b6SRobert Mustacchi 
198775eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_LEDCTL, ledctl_blink);
198875eba5b6SRobert Mustacchi 
198975eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
199075eba5b6SRobert Mustacchi }
199175eba5b6SRobert Mustacchi 
199275eba5b6SRobert Mustacchi /**
199375eba5b6SRobert Mustacchi  *  e1000_led_on_generic - Turn LED on
199475eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
199575eba5b6SRobert Mustacchi  *
199675eba5b6SRobert Mustacchi  *  Turn LED on.
199775eba5b6SRobert Mustacchi  **/
199875eba5b6SRobert Mustacchi s32 e1000_led_on_generic(struct e1000_hw *hw)
199975eba5b6SRobert Mustacchi {
200075eba5b6SRobert Mustacchi 	u32 ctrl;
200175eba5b6SRobert Mustacchi 
200275eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_led_on_generic");
200375eba5b6SRobert Mustacchi 
200475eba5b6SRobert Mustacchi 	switch (hw->phy.media_type) {
200575eba5b6SRobert Mustacchi 	case e1000_media_type_fiber:
200675eba5b6SRobert Mustacchi 		ctrl = E1000_READ_REG(hw, E1000_CTRL);
200775eba5b6SRobert Mustacchi 		ctrl &= ~E1000_CTRL_SWDPIN0;
200875eba5b6SRobert Mustacchi 		ctrl |= E1000_CTRL_SWDPIO0;
200975eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
201075eba5b6SRobert Mustacchi 		break;
201175eba5b6SRobert Mustacchi 	case e1000_media_type_copper:
201275eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2);
201375eba5b6SRobert Mustacchi 		break;
201475eba5b6SRobert Mustacchi 	default:
201575eba5b6SRobert Mustacchi 		break;
201675eba5b6SRobert Mustacchi 	}
201775eba5b6SRobert Mustacchi 
201875eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
201975eba5b6SRobert Mustacchi }
202075eba5b6SRobert Mustacchi 
202175eba5b6SRobert Mustacchi /**
202275eba5b6SRobert Mustacchi  *  e1000_led_off_generic - Turn LED off
202375eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
202475eba5b6SRobert Mustacchi  *
202575eba5b6SRobert Mustacchi  *  Turn LED off.
202675eba5b6SRobert Mustacchi  **/
202775eba5b6SRobert Mustacchi s32 e1000_led_off_generic(struct e1000_hw *hw)
202875eba5b6SRobert Mustacchi {
202975eba5b6SRobert Mustacchi 	u32 ctrl;
203075eba5b6SRobert Mustacchi 
203175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_led_off_generic");
203275eba5b6SRobert Mustacchi 
203375eba5b6SRobert Mustacchi 	switch (hw->phy.media_type) {
203475eba5b6SRobert Mustacchi 	case e1000_media_type_fiber:
203575eba5b6SRobert Mustacchi 		ctrl = E1000_READ_REG(hw, E1000_CTRL);
203675eba5b6SRobert Mustacchi 		ctrl |= E1000_CTRL_SWDPIN0;
203775eba5b6SRobert Mustacchi 		ctrl |= E1000_CTRL_SWDPIO0;
203875eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
203975eba5b6SRobert Mustacchi 		break;
204075eba5b6SRobert Mustacchi 	case e1000_media_type_copper:
204175eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1);
204275eba5b6SRobert Mustacchi 		break;
204375eba5b6SRobert Mustacchi 	default:
204475eba5b6SRobert Mustacchi 		break;
204575eba5b6SRobert Mustacchi 	}
204675eba5b6SRobert Mustacchi 
204775eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
204875eba5b6SRobert Mustacchi }
204975eba5b6SRobert Mustacchi 
205075eba5b6SRobert Mustacchi /**
205175eba5b6SRobert Mustacchi  *  e1000_set_pcie_no_snoop_generic - Set PCI-express capabilities
205275eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
205375eba5b6SRobert Mustacchi  *  @no_snoop: bitmap of snoop events
205475eba5b6SRobert Mustacchi  *
205575eba5b6SRobert Mustacchi  *  Set the PCI-express register to snoop for events enabled in 'no_snoop'.
205675eba5b6SRobert Mustacchi  **/
205775eba5b6SRobert Mustacchi void e1000_set_pcie_no_snoop_generic(struct e1000_hw *hw, u32 no_snoop)
205875eba5b6SRobert Mustacchi {
205975eba5b6SRobert Mustacchi 	u32 gcr;
206075eba5b6SRobert Mustacchi 
206175eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_set_pcie_no_snoop_generic");
206275eba5b6SRobert Mustacchi 
206375eba5b6SRobert Mustacchi 	if (hw->bus.type != e1000_bus_type_pci_express)
206475eba5b6SRobert Mustacchi 		return;
206575eba5b6SRobert Mustacchi 
206675eba5b6SRobert Mustacchi 	if (no_snoop) {
206775eba5b6SRobert Mustacchi 		gcr = E1000_READ_REG(hw, E1000_GCR);
206875eba5b6SRobert Mustacchi 		gcr &= ~(PCIE_NO_SNOOP_ALL);
206975eba5b6SRobert Mustacchi 		gcr |= no_snoop;
207075eba5b6SRobert Mustacchi 		E1000_WRITE_REG(hw, E1000_GCR, gcr);
207175eba5b6SRobert Mustacchi 	}
207275eba5b6SRobert Mustacchi }
207375eba5b6SRobert Mustacchi 
207475eba5b6SRobert Mustacchi /**
207575eba5b6SRobert Mustacchi  *  e1000_disable_pcie_master_generic - Disables PCI-express master access
207675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
207775eba5b6SRobert Mustacchi  *
207875eba5b6SRobert Mustacchi  *  Returns E1000_SUCCESS if successful, else returns -10
207975eba5b6SRobert Mustacchi  *  (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused
208075eba5b6SRobert Mustacchi  *  the master requests to be disabled.
208175eba5b6SRobert Mustacchi  *
208275eba5b6SRobert Mustacchi  *  Disables PCI-Express master access and verifies there are no pending
208375eba5b6SRobert Mustacchi  *  requests.
208475eba5b6SRobert Mustacchi  **/
208575eba5b6SRobert Mustacchi s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw)
208675eba5b6SRobert Mustacchi {
208775eba5b6SRobert Mustacchi 	u32 ctrl;
208875eba5b6SRobert Mustacchi 	s32 timeout = MASTER_DISABLE_TIMEOUT;
208975eba5b6SRobert Mustacchi 
209075eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_disable_pcie_master_generic");
209175eba5b6SRobert Mustacchi 
209275eba5b6SRobert Mustacchi 	if (hw->bus.type != e1000_bus_type_pci_express)
209375eba5b6SRobert Mustacchi 		return E1000_SUCCESS;
209475eba5b6SRobert Mustacchi 
209575eba5b6SRobert Mustacchi 	ctrl = E1000_READ_REG(hw, E1000_CTRL);
209675eba5b6SRobert Mustacchi 	ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;
209775eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
209875eba5b6SRobert Mustacchi 
209975eba5b6SRobert Mustacchi 	while (timeout) {
210075eba5b6SRobert Mustacchi 		if (!(E1000_READ_REG(hw, E1000_STATUS) &
2101c124a83eSRobert Mustacchi 		      E1000_STATUS_GIO_MASTER_ENABLE) ||
2102c124a83eSRobert Mustacchi 				E1000_REMOVED(hw->hw_addr))
210375eba5b6SRobert Mustacchi 			break;
210475eba5b6SRobert Mustacchi 		usec_delay(100);
210575eba5b6SRobert Mustacchi 		timeout--;
210675eba5b6SRobert Mustacchi 	}
210775eba5b6SRobert Mustacchi 
210875eba5b6SRobert Mustacchi 	if (!timeout) {
210975eba5b6SRobert Mustacchi 		DEBUGOUT("Master requests are pending.\n");
211075eba5b6SRobert Mustacchi 		return -E1000_ERR_MASTER_REQUESTS_PENDING;
211175eba5b6SRobert Mustacchi 	}
211275eba5b6SRobert Mustacchi 
211375eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
211475eba5b6SRobert Mustacchi }
211575eba5b6SRobert Mustacchi 
211675eba5b6SRobert Mustacchi /**
211775eba5b6SRobert Mustacchi  *  e1000_reset_adaptive_generic - Reset Adaptive Interframe Spacing
211875eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
211975eba5b6SRobert Mustacchi  *
212075eba5b6SRobert Mustacchi  *  Reset the Adaptive Interframe Spacing throttle to default values.
212175eba5b6SRobert Mustacchi  **/
212275eba5b6SRobert Mustacchi void e1000_reset_adaptive_generic(struct e1000_hw *hw)
212375eba5b6SRobert Mustacchi {
212475eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
212575eba5b6SRobert Mustacchi 
212675eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_reset_adaptive_generic");
212775eba5b6SRobert Mustacchi 
212875eba5b6SRobert Mustacchi 	if (!mac->adaptive_ifs) {
212975eba5b6SRobert Mustacchi 		DEBUGOUT("Not in Adaptive IFS mode!\n");
213075eba5b6SRobert Mustacchi 		return;
213175eba5b6SRobert Mustacchi 	}
213275eba5b6SRobert Mustacchi 
213375eba5b6SRobert Mustacchi 	mac->current_ifs_val = 0;
213475eba5b6SRobert Mustacchi 	mac->ifs_min_val = IFS_MIN;
213575eba5b6SRobert Mustacchi 	mac->ifs_max_val = IFS_MAX;
213675eba5b6SRobert Mustacchi 	mac->ifs_step_size = IFS_STEP;
213775eba5b6SRobert Mustacchi 	mac->ifs_ratio = IFS_RATIO;
213875eba5b6SRobert Mustacchi 
213975eba5b6SRobert Mustacchi 	mac->in_ifs_mode = FALSE;
214075eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, E1000_AIT, 0);
214175eba5b6SRobert Mustacchi }
214275eba5b6SRobert Mustacchi 
214375eba5b6SRobert Mustacchi /**
214475eba5b6SRobert Mustacchi  *  e1000_update_adaptive_generic - Update Adaptive Interframe Spacing
214575eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
214675eba5b6SRobert Mustacchi  *
214775eba5b6SRobert Mustacchi  *  Update the Adaptive Interframe Spacing Throttle value based on the
214875eba5b6SRobert Mustacchi  *  time between transmitted packets and time between collisions.
214975eba5b6SRobert Mustacchi  **/
215075eba5b6SRobert Mustacchi void e1000_update_adaptive_generic(struct e1000_hw *hw)
215175eba5b6SRobert Mustacchi {
215275eba5b6SRobert Mustacchi 	struct e1000_mac_info *mac = &hw->mac;
215375eba5b6SRobert Mustacchi 
215475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_update_adaptive_generic");
215575eba5b6SRobert Mustacchi 
215675eba5b6SRobert Mustacchi 	if (!mac->adaptive_ifs) {
215775eba5b6SRobert Mustacchi 		DEBUGOUT("Not in Adaptive IFS mode!\n");
215875eba5b6SRobert Mustacchi 		return;
215975eba5b6SRobert Mustacchi 	}
216075eba5b6SRobert Mustacchi 
216175eba5b6SRobert Mustacchi 	if ((mac->collision_delta * mac->ifs_ratio) > mac->tx_packet_delta) {
216275eba5b6SRobert Mustacchi 		if (mac->tx_packet_delta > MIN_NUM_XMITS) {
216375eba5b6SRobert Mustacchi 			mac->in_ifs_mode = TRUE;
216475eba5b6SRobert Mustacchi 			if (mac->current_ifs_val < mac->ifs_max_val) {
216575eba5b6SRobert Mustacchi 				if (!mac->current_ifs_val)
216675eba5b6SRobert Mustacchi 					mac->current_ifs_val = mac->ifs_min_val;
216775eba5b6SRobert Mustacchi 				else
216875eba5b6SRobert Mustacchi 					mac->current_ifs_val +=
216975eba5b6SRobert Mustacchi 						mac->ifs_step_size;
217075eba5b6SRobert Mustacchi 				E1000_WRITE_REG(hw, E1000_AIT,
217175eba5b6SRobert Mustacchi 						mac->current_ifs_val);
217275eba5b6SRobert Mustacchi 			}
217375eba5b6SRobert Mustacchi 		}
217475eba5b6SRobert Mustacchi 	} else {
217575eba5b6SRobert Mustacchi 		if (mac->in_ifs_mode &&
217675eba5b6SRobert Mustacchi 		    (mac->tx_packet_delta <= MIN_NUM_XMITS)) {
217775eba5b6SRobert Mustacchi 			mac->current_ifs_val = 0;
217875eba5b6SRobert Mustacchi 			mac->in_ifs_mode = FALSE;
217975eba5b6SRobert Mustacchi 			E1000_WRITE_REG(hw, E1000_AIT, 0);
218075eba5b6SRobert Mustacchi 		}
218175eba5b6SRobert Mustacchi 	}
218275eba5b6SRobert Mustacchi }
218375eba5b6SRobert Mustacchi 
218475eba5b6SRobert Mustacchi /**
218575eba5b6SRobert Mustacchi  *  e1000_validate_mdi_setting_generic - Verify MDI/MDIx settings
218675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
218775eba5b6SRobert Mustacchi  *
218875eba5b6SRobert Mustacchi  *  Verify that when not using auto-negotiation that MDI/MDIx is correctly
218975eba5b6SRobert Mustacchi  *  set, which is forced to MDI mode only.
219075eba5b6SRobert Mustacchi  **/
219175eba5b6SRobert Mustacchi static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw)
219275eba5b6SRobert Mustacchi {
219375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_validate_mdi_setting_generic");
219475eba5b6SRobert Mustacchi 
219575eba5b6SRobert Mustacchi 	if (!hw->mac.autoneg && (hw->phy.mdix == 0 || hw->phy.mdix == 3)) {
219675eba5b6SRobert Mustacchi 		DEBUGOUT("Invalid MDI setting detected\n");
219775eba5b6SRobert Mustacchi 		hw->phy.mdix = 1;
219875eba5b6SRobert Mustacchi 		return -E1000_ERR_CONFIG;
219975eba5b6SRobert Mustacchi 	}
220075eba5b6SRobert Mustacchi 
220175eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
220275eba5b6SRobert Mustacchi }
220375eba5b6SRobert Mustacchi 
220475eba5b6SRobert Mustacchi /**
220575eba5b6SRobert Mustacchi  *  e1000_validate_mdi_setting_crossover_generic - Verify MDI/MDIx settings
220675eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
220775eba5b6SRobert Mustacchi  *
220875eba5b6SRobert Mustacchi  *  Validate the MDI/MDIx setting, allowing for auto-crossover during forced
220975eba5b6SRobert Mustacchi  *  operation.
221075eba5b6SRobert Mustacchi  **/
2211c124a83eSRobert Mustacchi s32 e1000_validate_mdi_setting_crossover_generic(struct e1000_hw E1000_UNUSEDARG *hw)
221275eba5b6SRobert Mustacchi {
221375eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_validate_mdi_setting_crossover_generic");
221475eba5b6SRobert Mustacchi 
221575eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
221675eba5b6SRobert Mustacchi }
221775eba5b6SRobert Mustacchi 
221875eba5b6SRobert Mustacchi /**
221975eba5b6SRobert Mustacchi  *  e1000_write_8bit_ctrl_reg_generic - Write a 8bit CTRL register
222075eba5b6SRobert Mustacchi  *  @hw: pointer to the HW structure
222175eba5b6SRobert Mustacchi  *  @reg: 32bit register offset such as E1000_SCTL
222275eba5b6SRobert Mustacchi  *  @offset: register offset to write to
222375eba5b6SRobert Mustacchi  *  @data: data to write at register offset
222475eba5b6SRobert Mustacchi  *
222575eba5b6SRobert Mustacchi  *  Writes an address/data control type register.  There are several of these
222675eba5b6SRobert Mustacchi  *  and they all have the format address << 8 | data and bit 31 is polled for
222775eba5b6SRobert Mustacchi  *  completion.
222875eba5b6SRobert Mustacchi  **/
222975eba5b6SRobert Mustacchi s32 e1000_write_8bit_ctrl_reg_generic(struct e1000_hw *hw, u32 reg,
223075eba5b6SRobert Mustacchi 				      u32 offset, u8 data)
223175eba5b6SRobert Mustacchi {
223275eba5b6SRobert Mustacchi 	u32 i, regvalue = 0;
223375eba5b6SRobert Mustacchi 
223475eba5b6SRobert Mustacchi 	DEBUGFUNC("e1000_write_8bit_ctrl_reg_generic");
223575eba5b6SRobert Mustacchi 
223675eba5b6SRobert Mustacchi 	/* Set up the address and data */
223775eba5b6SRobert Mustacchi 	regvalue = ((u32)data) | (offset << E1000_GEN_CTL_ADDRESS_SHIFT);
223875eba5b6SRobert Mustacchi 	E1000_WRITE_REG(hw, reg, regvalue);
223975eba5b6SRobert Mustacchi 
224075eba5b6SRobert Mustacchi 	/* Poll the ready bit to see if the MDI read completed */
224175eba5b6SRobert Mustacchi 	for (i = 0; i < E1000_GEN_POLL_TIMEOUT; i++) {
224275eba5b6SRobert Mustacchi 		usec_delay(5);
224375eba5b6SRobert Mustacchi 		regvalue = E1000_READ_REG(hw, reg);
224475eba5b6SRobert Mustacchi 		if (regvalue & E1000_GEN_CTL_READY)
224575eba5b6SRobert Mustacchi 			break;
224675eba5b6SRobert Mustacchi 	}
224775eba5b6SRobert Mustacchi 	if (!(regvalue & E1000_GEN_CTL_READY)) {
224875eba5b6SRobert Mustacchi 		DEBUGOUT1("Reg %08x did not indicate ready\n", reg);
224975eba5b6SRobert Mustacchi 		return -E1000_ERR_PHY;
225075eba5b6SRobert Mustacchi 	}
225175eba5b6SRobert Mustacchi 
225275eba5b6SRobert Mustacchi 	return E1000_SUCCESS;
225375eba5b6SRobert Mustacchi }
2254