xref: /freebsd/sys/dev/e1000/e1000_api.c (revision 9d81738f8f543736fc9da9cf1622b381fec98361)
18cfa0ad2SJack F Vogel /******************************************************************************
28cfa0ad2SJack F Vogel 
3d035aa2dSJack F Vogel   Copyright (c) 2001-2009, Intel Corporation
48cfa0ad2SJack F Vogel   All rights reserved.
58cfa0ad2SJack F Vogel 
68cfa0ad2SJack F Vogel   Redistribution and use in source and binary forms, with or without
78cfa0ad2SJack F Vogel   modification, are permitted provided that the following conditions are met:
88cfa0ad2SJack F Vogel 
98cfa0ad2SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
108cfa0ad2SJack F Vogel       this list of conditions and the following disclaimer.
118cfa0ad2SJack F Vogel 
128cfa0ad2SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
138cfa0ad2SJack F Vogel       notice, this list of conditions and the following disclaimer in the
148cfa0ad2SJack F Vogel       documentation and/or other materials provided with the distribution.
158cfa0ad2SJack F Vogel 
168cfa0ad2SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
178cfa0ad2SJack F Vogel       contributors may be used to endorse or promote products derived from
188cfa0ad2SJack F Vogel       this software without specific prior written permission.
198cfa0ad2SJack F Vogel 
208cfa0ad2SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
218cfa0ad2SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
228cfa0ad2SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
238cfa0ad2SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
248cfa0ad2SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
258cfa0ad2SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
268cfa0ad2SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
278cfa0ad2SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
288cfa0ad2SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
298cfa0ad2SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
308cfa0ad2SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
318cfa0ad2SJack F Vogel 
328cfa0ad2SJack F Vogel ******************************************************************************/
338cfa0ad2SJack F Vogel /*$FreeBSD$*/
348cfa0ad2SJack F Vogel 
358cfa0ad2SJack F Vogel #include "e1000_api.h"
368cfa0ad2SJack F Vogel 
378cfa0ad2SJack F Vogel /**
388cfa0ad2SJack F Vogel  *  e1000_init_mac_params - Initialize MAC function pointers
398cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
408cfa0ad2SJack F Vogel  *
418cfa0ad2SJack F Vogel  *  This function initializes the function pointers for the MAC
428cfa0ad2SJack F Vogel  *  set of functions.  Called by drivers or by e1000_setup_init_funcs.
438cfa0ad2SJack F Vogel  **/
448cfa0ad2SJack F Vogel s32 e1000_init_mac_params(struct e1000_hw *hw)
458cfa0ad2SJack F Vogel {
468cfa0ad2SJack F Vogel 	s32 ret_val = E1000_SUCCESS;
478cfa0ad2SJack F Vogel 
488cfa0ad2SJack F Vogel 	if (hw->mac.ops.init_params) {
498cfa0ad2SJack F Vogel 		ret_val = hw->mac.ops.init_params(hw);
508cfa0ad2SJack F Vogel 		if (ret_val) {
518cfa0ad2SJack F Vogel 			DEBUGOUT("MAC Initialization Error\n");
528cfa0ad2SJack F Vogel 			goto out;
538cfa0ad2SJack F Vogel 		}
548cfa0ad2SJack F Vogel 	} else {
558cfa0ad2SJack F Vogel 		DEBUGOUT("mac.init_mac_params was NULL\n");
568cfa0ad2SJack F Vogel 		ret_val = -E1000_ERR_CONFIG;
578cfa0ad2SJack F Vogel 	}
588cfa0ad2SJack F Vogel 
598cfa0ad2SJack F Vogel out:
608cfa0ad2SJack F Vogel 	return ret_val;
618cfa0ad2SJack F Vogel }
628cfa0ad2SJack F Vogel 
638cfa0ad2SJack F Vogel /**
648cfa0ad2SJack F Vogel  *  e1000_init_nvm_params - Initialize NVM function pointers
658cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
668cfa0ad2SJack F Vogel  *
678cfa0ad2SJack F Vogel  *  This function initializes the function pointers for the NVM
688cfa0ad2SJack F Vogel  *  set of functions.  Called by drivers or by e1000_setup_init_funcs.
698cfa0ad2SJack F Vogel  **/
708cfa0ad2SJack F Vogel s32 e1000_init_nvm_params(struct e1000_hw *hw)
718cfa0ad2SJack F Vogel {
728cfa0ad2SJack F Vogel 	s32 ret_val = E1000_SUCCESS;
738cfa0ad2SJack F Vogel 
748cfa0ad2SJack F Vogel 	if (hw->nvm.ops.init_params) {
758cfa0ad2SJack F Vogel 		ret_val = hw->nvm.ops.init_params(hw);
768cfa0ad2SJack F Vogel 		if (ret_val) {
778cfa0ad2SJack F Vogel 			DEBUGOUT("NVM Initialization Error\n");
788cfa0ad2SJack F Vogel 			goto out;
798cfa0ad2SJack F Vogel 		}
808cfa0ad2SJack F Vogel 	} else {
818cfa0ad2SJack F Vogel 		DEBUGOUT("nvm.init_nvm_params was NULL\n");
828cfa0ad2SJack F Vogel 		ret_val = -E1000_ERR_CONFIG;
838cfa0ad2SJack F Vogel 	}
848cfa0ad2SJack F Vogel 
858cfa0ad2SJack F Vogel out:
868cfa0ad2SJack F Vogel 	return ret_val;
878cfa0ad2SJack F Vogel }
888cfa0ad2SJack F Vogel 
898cfa0ad2SJack F Vogel /**
908cfa0ad2SJack F Vogel  *  e1000_init_phy_params - Initialize PHY function pointers
918cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
928cfa0ad2SJack F Vogel  *
938cfa0ad2SJack F Vogel  *  This function initializes the function pointers for the PHY
948cfa0ad2SJack F Vogel  *  set of functions.  Called by drivers or by e1000_setup_init_funcs.
958cfa0ad2SJack F Vogel  **/
968cfa0ad2SJack F Vogel s32 e1000_init_phy_params(struct e1000_hw *hw)
978cfa0ad2SJack F Vogel {
988cfa0ad2SJack F Vogel 	s32 ret_val = E1000_SUCCESS;
998cfa0ad2SJack F Vogel 
1008cfa0ad2SJack F Vogel 	if (hw->phy.ops.init_params) {
1018cfa0ad2SJack F Vogel 		ret_val = hw->phy.ops.init_params(hw);
1028cfa0ad2SJack F Vogel 		if (ret_val) {
1038cfa0ad2SJack F Vogel 			DEBUGOUT("PHY Initialization Error\n");
1048cfa0ad2SJack F Vogel 			goto out;
1058cfa0ad2SJack F Vogel 		}
1068cfa0ad2SJack F Vogel 	} else {
1078cfa0ad2SJack F Vogel 		DEBUGOUT("phy.init_phy_params was NULL\n");
1088cfa0ad2SJack F Vogel 		ret_val =  -E1000_ERR_CONFIG;
1098cfa0ad2SJack F Vogel 	}
1108cfa0ad2SJack F Vogel 
1118cfa0ad2SJack F Vogel out:
1128cfa0ad2SJack F Vogel 	return ret_val;
1138cfa0ad2SJack F Vogel }
1148cfa0ad2SJack F Vogel 
115d035aa2dSJack F Vogel 
1168cfa0ad2SJack F Vogel /**
1178cfa0ad2SJack F Vogel  *  e1000_set_mac_type - Sets MAC type
1188cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
1198cfa0ad2SJack F Vogel  *
1208cfa0ad2SJack F Vogel  *  This function sets the mac type of the adapter based on the
1218cfa0ad2SJack F Vogel  *  device ID stored in the hw structure.
1228cfa0ad2SJack F Vogel  *  MUST BE FIRST FUNCTION CALLED (explicitly or through
1238cfa0ad2SJack F Vogel  *  e1000_setup_init_funcs()).
1248cfa0ad2SJack F Vogel  **/
1258cfa0ad2SJack F Vogel s32 e1000_set_mac_type(struct e1000_hw *hw)
1268cfa0ad2SJack F Vogel {
1278cfa0ad2SJack F Vogel 	struct e1000_mac_info *mac = &hw->mac;
1288cfa0ad2SJack F Vogel 	s32 ret_val = E1000_SUCCESS;
1298cfa0ad2SJack F Vogel 
1308cfa0ad2SJack F Vogel 	DEBUGFUNC("e1000_set_mac_type");
1318cfa0ad2SJack F Vogel 
1328cfa0ad2SJack F Vogel 	switch (hw->device_id) {
1338cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82542:
1348cfa0ad2SJack F Vogel 		mac->type = e1000_82542;
1358cfa0ad2SJack F Vogel 		break;
1368cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82543GC_FIBER:
1378cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82543GC_COPPER:
1388cfa0ad2SJack F Vogel 		mac->type = e1000_82543;
1398cfa0ad2SJack F Vogel 		break;
1408cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82544EI_COPPER:
1418cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82544EI_FIBER:
1428cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82544GC_COPPER:
1438cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82544GC_LOM:
1448cfa0ad2SJack F Vogel 		mac->type = e1000_82544;
1458cfa0ad2SJack F Vogel 		break;
1468cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82540EM:
1478cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82540EM_LOM:
1488cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82540EP:
1498cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82540EP_LOM:
1508cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82540EP_LP:
1518cfa0ad2SJack F Vogel 		mac->type = e1000_82540;
1528cfa0ad2SJack F Vogel 		break;
1538cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82545EM_COPPER:
1548cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82545EM_FIBER:
1558cfa0ad2SJack F Vogel 		mac->type = e1000_82545;
1568cfa0ad2SJack F Vogel 		break;
1578cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82545GM_COPPER:
1588cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82545GM_FIBER:
1598cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82545GM_SERDES:
1608cfa0ad2SJack F Vogel 		mac->type = e1000_82545_rev_3;
1618cfa0ad2SJack F Vogel 		break;
1628cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546EB_COPPER:
1638cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546EB_FIBER:
1648cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546EB_QUAD_COPPER:
1658cfa0ad2SJack F Vogel 		mac->type = e1000_82546;
1668cfa0ad2SJack F Vogel 		break;
1678cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_COPPER:
1688cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_FIBER:
1698cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_SERDES:
1708cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_PCIE:
1718cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_QUAD_COPPER:
1728cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
1738cfa0ad2SJack F Vogel 		mac->type = e1000_82546_rev_3;
1748cfa0ad2SJack F Vogel 		break;
1758cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541EI:
1768cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541EI_MOBILE:
1778cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541ER_LOM:
1788cfa0ad2SJack F Vogel 		mac->type = e1000_82541;
1798cfa0ad2SJack F Vogel 		break;
1808cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541ER:
1818cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541GI:
1828cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541GI_LF:
1838cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82541GI_MOBILE:
1848cfa0ad2SJack F Vogel 		mac->type = e1000_82541_rev_2;
1858cfa0ad2SJack F Vogel 		break;
1868cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82547EI:
1878cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82547EI_MOBILE:
1888cfa0ad2SJack F Vogel 		mac->type = e1000_82547;
1898cfa0ad2SJack F Vogel 		break;
1908cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82547GI:
1918cfa0ad2SJack F Vogel 		mac->type = e1000_82547_rev_2;
1928cfa0ad2SJack F Vogel 		break;
1938cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_COPPER:
1948cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_FIBER:
1958cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_SERDES:
1968cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_SERDES_DUAL:
1978cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_SERDES_QUAD:
1988cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_QUAD_COPPER:
1998cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571PT_QUAD_COPPER:
2008cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_QUAD_FIBER:
2018cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82571EB_QUAD_COPPER_LP:
2028cfa0ad2SJack F Vogel 		mac->type = e1000_82571;
2038cfa0ad2SJack F Vogel 		break;
2048cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82572EI:
2058cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82572EI_COPPER:
2068cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82572EI_FIBER:
2078cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82572EI_SERDES:
2088cfa0ad2SJack F Vogel 		mac->type = e1000_82572;
2098cfa0ad2SJack F Vogel 		break;
2108cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82573E:
2118cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82573E_IAMT:
2128cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82573L:
2138cfa0ad2SJack F Vogel 		mac->type = e1000_82573;
2148cfa0ad2SJack F Vogel 		break;
2158cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82574L:
2169d81738fSJack F Vogel 	case E1000_DEV_ID_82574LA:
2178cfa0ad2SJack F Vogel 		mac->type = e1000_82574;
2188cfa0ad2SJack F Vogel 		break;
2199d81738fSJack F Vogel 	case E1000_DEV_ID_82583V:
2209d81738fSJack F Vogel 		mac->type = e1000_82583;
2219d81738fSJack F Vogel 		break;
2228cfa0ad2SJack F Vogel 	case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
2238cfa0ad2SJack F Vogel 	case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
2248cfa0ad2SJack F Vogel 	case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
2258cfa0ad2SJack F Vogel 	case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
2268cfa0ad2SJack F Vogel 		mac->type = e1000_80003es2lan;
2278cfa0ad2SJack F Vogel 		break;
2288cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IFE:
2298cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IFE_GT:
2308cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IFE_G:
2318cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IGP_M:
2328cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IGP_M_AMT:
2338cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IGP_AMT:
2348cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH8_IGP_C:
2358cfa0ad2SJack F Vogel 		mac->type = e1000_ich8lan;
2368cfa0ad2SJack F Vogel 		break;
2378cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IFE:
2388cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IFE_GT:
2398cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IFE_G:
2408cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IGP_M:
2418cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IGP_M_AMT:
2428cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IGP_M_V:
2438cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IGP_AMT:
2448cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_BM:
2458cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH9_IGP_C:
2468cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH10_R_BM_LM:
2478cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH10_R_BM_LF:
2488cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH10_R_BM_V:
2498cfa0ad2SJack F Vogel 		mac->type = e1000_ich9lan;
2508cfa0ad2SJack F Vogel 		break;
2518cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH10_D_BM_LM:
2528cfa0ad2SJack F Vogel 	case E1000_DEV_ID_ICH10_D_BM_LF:
2538cfa0ad2SJack F Vogel 		mac->type = e1000_ich10lan;
2548cfa0ad2SJack F Vogel 		break;
2559d81738fSJack F Vogel 	case E1000_DEV_ID_PCH_D_HV_DM:
2569d81738fSJack F Vogel 	case E1000_DEV_ID_PCH_D_HV_DC:
2579d81738fSJack F Vogel 	case E1000_DEV_ID_PCH_M_HV_LM:
2589d81738fSJack F Vogel 	case E1000_DEV_ID_PCH_M_HV_LC:
2599d81738fSJack F Vogel 		mac->type = e1000_pchlan;
2609d81738fSJack F Vogel 		break;
2618cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82575EB_COPPER:
2628cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82575EB_FIBER_SERDES:
2638cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82575GB_QUAD_COPPER:
264d035aa2dSJack F Vogel 	case E1000_DEV_ID_82575GB_QUAD_COPPER_PM:
2658cfa0ad2SJack F Vogel 		mac->type = e1000_82575;
2668cfa0ad2SJack F Vogel 		break;
2678cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82576:
2688cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82576_FIBER:
2698cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82576_SERDES:
2708cfa0ad2SJack F Vogel 	case E1000_DEV_ID_82576_QUAD_COPPER:
271d035aa2dSJack F Vogel 	case E1000_DEV_ID_82576_NS:
2729d81738fSJack F Vogel 	case E1000_DEV_ID_82576_SERDES_QUAD:
2738cfa0ad2SJack F Vogel 		mac->type = e1000_82576;
2748cfa0ad2SJack F Vogel 		break;
2758cfa0ad2SJack F Vogel 	default:
2768cfa0ad2SJack F Vogel 		/* Should never have loaded on this device */
2778cfa0ad2SJack F Vogel 		ret_val = -E1000_ERR_MAC_INIT;
2788cfa0ad2SJack F Vogel 		break;
2798cfa0ad2SJack F Vogel 	}
2808cfa0ad2SJack F Vogel 
2818cfa0ad2SJack F Vogel 	return ret_val;
2828cfa0ad2SJack F Vogel }
2838cfa0ad2SJack F Vogel 
2848cfa0ad2SJack F Vogel /**
2858cfa0ad2SJack F Vogel  *  e1000_setup_init_funcs - Initializes function pointers
2868cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
2878cfa0ad2SJack F Vogel  *  @init_device: TRUE will initialize the rest of the function pointers
2888cfa0ad2SJack F Vogel  *                 getting the device ready for use.  FALSE will only set
2898cfa0ad2SJack F Vogel  *                 MAC type and the function pointers for the other init
2908cfa0ad2SJack F Vogel  *                 functions.  Passing FALSE will not generate any hardware
2918cfa0ad2SJack F Vogel  *                 reads or writes.
2928cfa0ad2SJack F Vogel  *
2938cfa0ad2SJack F Vogel  *  This function must be called by a driver in order to use the rest
2948cfa0ad2SJack F Vogel  *  of the 'shared' code files. Called by drivers only.
2958cfa0ad2SJack F Vogel  **/
2968cfa0ad2SJack F Vogel s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device)
2978cfa0ad2SJack F Vogel {
2988cfa0ad2SJack F Vogel 	s32 ret_val;
2998cfa0ad2SJack F Vogel 
3008cfa0ad2SJack F Vogel 	/* Can't do much good without knowing the MAC type. */
3018cfa0ad2SJack F Vogel 	ret_val = e1000_set_mac_type(hw);
3028cfa0ad2SJack F Vogel 	if (ret_val) {
3038cfa0ad2SJack F Vogel 		DEBUGOUT("ERROR: MAC type could not be set properly.\n");
3048cfa0ad2SJack F Vogel 		goto out;
3058cfa0ad2SJack F Vogel 	}
3068cfa0ad2SJack F Vogel 
3078cfa0ad2SJack F Vogel 	if (!hw->hw_addr) {
3088cfa0ad2SJack F Vogel 		DEBUGOUT("ERROR: Registers not mapped\n");
3098cfa0ad2SJack F Vogel 		ret_val = -E1000_ERR_CONFIG;
3108cfa0ad2SJack F Vogel 		goto out;
3118cfa0ad2SJack F Vogel 	}
3128cfa0ad2SJack F Vogel 
3138cfa0ad2SJack F Vogel 	/*
3148cfa0ad2SJack F Vogel 	 * Init function pointers to generic implementations. We do this first
3158cfa0ad2SJack F Vogel 	 * allowing a driver module to override it afterward.
3168cfa0ad2SJack F Vogel 	 */
3178cfa0ad2SJack F Vogel 	e1000_init_mac_ops_generic(hw);
3188cfa0ad2SJack F Vogel 	e1000_init_phy_ops_generic(hw);
3198cfa0ad2SJack F Vogel 	e1000_init_nvm_ops_generic(hw);
3208cfa0ad2SJack F Vogel 
3218cfa0ad2SJack F Vogel 	/*
3228cfa0ad2SJack F Vogel 	 * Set up the init function pointers. These are functions within the
3238cfa0ad2SJack F Vogel 	 * adapter family file that sets up function pointers for the rest of
3248cfa0ad2SJack F Vogel 	 * the functions in that family.
3258cfa0ad2SJack F Vogel 	 */
3268cfa0ad2SJack F Vogel 	switch (hw->mac.type) {
3278cfa0ad2SJack F Vogel 	case e1000_82542:
3288cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82542(hw);
3298cfa0ad2SJack F Vogel 		break;
3308cfa0ad2SJack F Vogel 	case e1000_82543:
3318cfa0ad2SJack F Vogel 	case e1000_82544:
3328cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82543(hw);
3338cfa0ad2SJack F Vogel 		break;
3348cfa0ad2SJack F Vogel 	case e1000_82540:
3358cfa0ad2SJack F Vogel 	case e1000_82545:
3368cfa0ad2SJack F Vogel 	case e1000_82545_rev_3:
3378cfa0ad2SJack F Vogel 	case e1000_82546:
3388cfa0ad2SJack F Vogel 	case e1000_82546_rev_3:
3398cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82540(hw);
3408cfa0ad2SJack F Vogel 		break;
3418cfa0ad2SJack F Vogel 	case e1000_82541:
3428cfa0ad2SJack F Vogel 	case e1000_82541_rev_2:
3438cfa0ad2SJack F Vogel 	case e1000_82547:
3448cfa0ad2SJack F Vogel 	case e1000_82547_rev_2:
3458cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82541(hw);
3468cfa0ad2SJack F Vogel 		break;
3478cfa0ad2SJack F Vogel 	case e1000_82571:
3488cfa0ad2SJack F Vogel 	case e1000_82572:
3498cfa0ad2SJack F Vogel 	case e1000_82573:
3508cfa0ad2SJack F Vogel 	case e1000_82574:
3519d81738fSJack F Vogel 	case e1000_82583:
3528cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82571(hw);
3538cfa0ad2SJack F Vogel 		break;
3548cfa0ad2SJack F Vogel 	case e1000_80003es2lan:
3558cfa0ad2SJack F Vogel 		e1000_init_function_pointers_80003es2lan(hw);
3568cfa0ad2SJack F Vogel 		break;
3578cfa0ad2SJack F Vogel 	case e1000_ich8lan:
3588cfa0ad2SJack F Vogel 	case e1000_ich9lan:
3598cfa0ad2SJack F Vogel 	case e1000_ich10lan:
3609d81738fSJack F Vogel 	case e1000_pchlan:
3618cfa0ad2SJack F Vogel 		e1000_init_function_pointers_ich8lan(hw);
3628cfa0ad2SJack F Vogel 		break;
3638cfa0ad2SJack F Vogel 	case e1000_82575:
3648cfa0ad2SJack F Vogel 	case e1000_82576:
3658cfa0ad2SJack F Vogel 		e1000_init_function_pointers_82575(hw);
3668cfa0ad2SJack F Vogel 		break;
3678cfa0ad2SJack F Vogel 	default:
3688cfa0ad2SJack F Vogel 		DEBUGOUT("Hardware not supported\n");
3698cfa0ad2SJack F Vogel 		ret_val = -E1000_ERR_CONFIG;
3708cfa0ad2SJack F Vogel 		break;
3718cfa0ad2SJack F Vogel 	}
3728cfa0ad2SJack F Vogel 
3738cfa0ad2SJack F Vogel 	/*
3748cfa0ad2SJack F Vogel 	 * Initialize the rest of the function pointers. These require some
3758cfa0ad2SJack F Vogel 	 * register reads/writes in some cases.
3768cfa0ad2SJack F Vogel 	 */
3778cfa0ad2SJack F Vogel 	if (!(ret_val) && init_device) {
3788cfa0ad2SJack F Vogel 		ret_val = e1000_init_mac_params(hw);
3798cfa0ad2SJack F Vogel 		if (ret_val)
3808cfa0ad2SJack F Vogel 			goto out;
3818cfa0ad2SJack F Vogel 
3828cfa0ad2SJack F Vogel 		ret_val = e1000_init_nvm_params(hw);
3838cfa0ad2SJack F Vogel 		if (ret_val)
3848cfa0ad2SJack F Vogel 			goto out;
3858cfa0ad2SJack F Vogel 
3868cfa0ad2SJack F Vogel 		ret_val = e1000_init_phy_params(hw);
3878cfa0ad2SJack F Vogel 		if (ret_val)
3888cfa0ad2SJack F Vogel 			goto out;
3898cfa0ad2SJack F Vogel 	}
3908cfa0ad2SJack F Vogel 
3918cfa0ad2SJack F Vogel out:
3928cfa0ad2SJack F Vogel 	return ret_val;
3938cfa0ad2SJack F Vogel }
3948cfa0ad2SJack F Vogel 
3958cfa0ad2SJack F Vogel /**
3968cfa0ad2SJack F Vogel  *  e1000_get_bus_info - Obtain bus information for adapter
3978cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
3988cfa0ad2SJack F Vogel  *
3998cfa0ad2SJack F Vogel  *  This will obtain information about the HW bus for which the
4008cfa0ad2SJack F Vogel  *  adapter is attached and stores it in the hw structure. This is a
4018cfa0ad2SJack F Vogel  *  function pointer entry point called by drivers.
4028cfa0ad2SJack F Vogel  **/
4038cfa0ad2SJack F Vogel s32 e1000_get_bus_info(struct e1000_hw *hw)
4048cfa0ad2SJack F Vogel {
4058cfa0ad2SJack F Vogel 	if (hw->mac.ops.get_bus_info)
4068cfa0ad2SJack F Vogel 		return hw->mac.ops.get_bus_info(hw);
4078cfa0ad2SJack F Vogel 
4088cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
4098cfa0ad2SJack F Vogel }
4108cfa0ad2SJack F Vogel 
4118cfa0ad2SJack F Vogel /**
4128cfa0ad2SJack F Vogel  *  e1000_clear_vfta - Clear VLAN filter table
4138cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4148cfa0ad2SJack F Vogel  *
4158cfa0ad2SJack F Vogel  *  This clears the VLAN filter table on the adapter. This is a function
4168cfa0ad2SJack F Vogel  *  pointer entry point called by drivers.
4178cfa0ad2SJack F Vogel  **/
4188cfa0ad2SJack F Vogel void e1000_clear_vfta(struct e1000_hw *hw)
4198cfa0ad2SJack F Vogel {
4208cfa0ad2SJack F Vogel 	if (hw->mac.ops.clear_vfta)
4218cfa0ad2SJack F Vogel 		hw->mac.ops.clear_vfta(hw);
4228cfa0ad2SJack F Vogel }
4238cfa0ad2SJack F Vogel 
4248cfa0ad2SJack F Vogel /**
4258cfa0ad2SJack F Vogel  *  e1000_write_vfta - Write value to VLAN filter table
4268cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4278cfa0ad2SJack F Vogel  *  @offset: the 32-bit offset in which to write the value to.
4288cfa0ad2SJack F Vogel  *  @value: the 32-bit value to write at location offset.
4298cfa0ad2SJack F Vogel  *
4308cfa0ad2SJack F Vogel  *  This writes a 32-bit value to a 32-bit offset in the VLAN filter
4318cfa0ad2SJack F Vogel  *  table. This is a function pointer entry point called by drivers.
4328cfa0ad2SJack F Vogel  **/
4338cfa0ad2SJack F Vogel void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
4348cfa0ad2SJack F Vogel {
4358cfa0ad2SJack F Vogel 	if (hw->mac.ops.write_vfta)
4368cfa0ad2SJack F Vogel 		hw->mac.ops.write_vfta(hw, offset, value);
4378cfa0ad2SJack F Vogel }
4388cfa0ad2SJack F Vogel 
4398cfa0ad2SJack F Vogel /**
4408cfa0ad2SJack F Vogel  *  e1000_update_mc_addr_list - Update Multicast addresses
4418cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4428cfa0ad2SJack F Vogel  *  @mc_addr_list: array of multicast addresses to program
4438cfa0ad2SJack F Vogel  *  @mc_addr_count: number of multicast addresses to program
4448cfa0ad2SJack F Vogel  *
445d035aa2dSJack F Vogel  *  Updates the Multicast Table Array.
4468cfa0ad2SJack F Vogel  *  The caller must have a packed mc_addr_list of multicast addresses.
4478cfa0ad2SJack F Vogel  **/
4488cfa0ad2SJack F Vogel void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
449d035aa2dSJack F Vogel                                u32 mc_addr_count)
4508cfa0ad2SJack F Vogel {
4518cfa0ad2SJack F Vogel 	if (hw->mac.ops.update_mc_addr_list)
452d035aa2dSJack F Vogel 		hw->mac.ops.update_mc_addr_list(hw, mc_addr_list,
453d035aa2dSJack F Vogel 		                                mc_addr_count);
4548cfa0ad2SJack F Vogel }
4558cfa0ad2SJack F Vogel 
4568cfa0ad2SJack F Vogel /**
4578cfa0ad2SJack F Vogel  *  e1000_force_mac_fc - Force MAC flow control
4588cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4598cfa0ad2SJack F Vogel  *
4608cfa0ad2SJack F Vogel  *  Force the MAC's flow control settings. Currently no func pointer exists
4618cfa0ad2SJack F Vogel  *  and all implementations are handled in the generic version of this
4628cfa0ad2SJack F Vogel  *  function.
4638cfa0ad2SJack F Vogel  **/
4648cfa0ad2SJack F Vogel s32 e1000_force_mac_fc(struct e1000_hw *hw)
4658cfa0ad2SJack F Vogel {
4668cfa0ad2SJack F Vogel 	return e1000_force_mac_fc_generic(hw);
4678cfa0ad2SJack F Vogel }
4688cfa0ad2SJack F Vogel 
4698cfa0ad2SJack F Vogel /**
4708cfa0ad2SJack F Vogel  *  e1000_check_for_link - Check/Store link connection
4718cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4728cfa0ad2SJack F Vogel  *
4738cfa0ad2SJack F Vogel  *  This checks the link condition of the adapter and stores the
4748cfa0ad2SJack F Vogel  *  results in the hw->mac structure. This is a function pointer entry
4758cfa0ad2SJack F Vogel  *  point called by drivers.
4768cfa0ad2SJack F Vogel  **/
4778cfa0ad2SJack F Vogel s32 e1000_check_for_link(struct e1000_hw *hw)
4788cfa0ad2SJack F Vogel {
4798cfa0ad2SJack F Vogel 	if (hw->mac.ops.check_for_link)
4808cfa0ad2SJack F Vogel 		return hw->mac.ops.check_for_link(hw);
4818cfa0ad2SJack F Vogel 
4828cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
4838cfa0ad2SJack F Vogel }
4848cfa0ad2SJack F Vogel 
4858cfa0ad2SJack F Vogel /**
4868cfa0ad2SJack F Vogel  *  e1000_check_mng_mode - Check management mode
4878cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
4888cfa0ad2SJack F Vogel  *
4898cfa0ad2SJack F Vogel  *  This checks if the adapter has manageability enabled.
4908cfa0ad2SJack F Vogel  *  This is a function pointer entry point called by drivers.
4918cfa0ad2SJack F Vogel  **/
4928cfa0ad2SJack F Vogel bool e1000_check_mng_mode(struct e1000_hw *hw)
4938cfa0ad2SJack F Vogel {
4948cfa0ad2SJack F Vogel 	if (hw->mac.ops.check_mng_mode)
4958cfa0ad2SJack F Vogel 		return hw->mac.ops.check_mng_mode(hw);
4968cfa0ad2SJack F Vogel 
4978cfa0ad2SJack F Vogel 	return FALSE;
4988cfa0ad2SJack F Vogel }
4998cfa0ad2SJack F Vogel 
5008cfa0ad2SJack F Vogel /**
5018cfa0ad2SJack F Vogel  *  e1000_mng_write_dhcp_info - Writes DHCP info to host interface
5028cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5038cfa0ad2SJack F Vogel  *  @buffer: pointer to the host interface
5048cfa0ad2SJack F Vogel  *  @length: size of the buffer
5058cfa0ad2SJack F Vogel  *
5068cfa0ad2SJack F Vogel  *  Writes the DHCP information to the host interface.
5078cfa0ad2SJack F Vogel  **/
5088cfa0ad2SJack F Vogel s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length)
5098cfa0ad2SJack F Vogel {
5108cfa0ad2SJack F Vogel 	return e1000_mng_write_dhcp_info_generic(hw, buffer, length);
5118cfa0ad2SJack F Vogel }
5128cfa0ad2SJack F Vogel 
5138cfa0ad2SJack F Vogel /**
5148cfa0ad2SJack F Vogel  *  e1000_reset_hw - Reset hardware
5158cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5168cfa0ad2SJack F Vogel  *
5178cfa0ad2SJack F Vogel  *  This resets the hardware into a known state. This is a function pointer
5188cfa0ad2SJack F Vogel  *  entry point called by drivers.
5198cfa0ad2SJack F Vogel  **/
5208cfa0ad2SJack F Vogel s32 e1000_reset_hw(struct e1000_hw *hw)
5218cfa0ad2SJack F Vogel {
5228cfa0ad2SJack F Vogel 	if (hw->mac.ops.reset_hw)
5238cfa0ad2SJack F Vogel 		return hw->mac.ops.reset_hw(hw);
5248cfa0ad2SJack F Vogel 
5258cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
5268cfa0ad2SJack F Vogel }
5278cfa0ad2SJack F Vogel 
5288cfa0ad2SJack F Vogel /**
5298cfa0ad2SJack F Vogel  *  e1000_init_hw - Initialize hardware
5308cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5318cfa0ad2SJack F Vogel  *
5328cfa0ad2SJack F Vogel  *  This inits the hardware readying it for operation. This is a function
5338cfa0ad2SJack F Vogel  *  pointer entry point called by drivers.
5348cfa0ad2SJack F Vogel  **/
5358cfa0ad2SJack F Vogel s32 e1000_init_hw(struct e1000_hw *hw)
5368cfa0ad2SJack F Vogel {
5378cfa0ad2SJack F Vogel 	if (hw->mac.ops.init_hw)
5388cfa0ad2SJack F Vogel 		return hw->mac.ops.init_hw(hw);
5398cfa0ad2SJack F Vogel 
5408cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
5418cfa0ad2SJack F Vogel }
5428cfa0ad2SJack F Vogel 
5438cfa0ad2SJack F Vogel /**
5448cfa0ad2SJack F Vogel  *  e1000_setup_link - Configures link and flow control
5458cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5468cfa0ad2SJack F Vogel  *
5478cfa0ad2SJack F Vogel  *  This configures link and flow control settings for the adapter. This
5488cfa0ad2SJack F Vogel  *  is a function pointer entry point called by drivers. While modules can
5498cfa0ad2SJack F Vogel  *  also call this, they probably call their own version of this function.
5508cfa0ad2SJack F Vogel  **/
5518cfa0ad2SJack F Vogel s32 e1000_setup_link(struct e1000_hw *hw)
5528cfa0ad2SJack F Vogel {
5538cfa0ad2SJack F Vogel 	if (hw->mac.ops.setup_link)
5548cfa0ad2SJack F Vogel 		return hw->mac.ops.setup_link(hw);
5558cfa0ad2SJack F Vogel 
5568cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
5578cfa0ad2SJack F Vogel }
5588cfa0ad2SJack F Vogel 
5598cfa0ad2SJack F Vogel /**
5608cfa0ad2SJack F Vogel  *  e1000_get_speed_and_duplex - Returns current speed and duplex
5618cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5628cfa0ad2SJack F Vogel  *  @speed: pointer to a 16-bit value to store the speed
5638cfa0ad2SJack F Vogel  *  @duplex: pointer to a 16-bit value to store the duplex.
5648cfa0ad2SJack F Vogel  *
5658cfa0ad2SJack F Vogel  *  This returns the speed and duplex of the adapter in the two 'out'
5668cfa0ad2SJack F Vogel  *  variables passed in. This is a function pointer entry point called
5678cfa0ad2SJack F Vogel  *  by drivers.
5688cfa0ad2SJack F Vogel  **/
5698cfa0ad2SJack F Vogel s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex)
5708cfa0ad2SJack F Vogel {
5718cfa0ad2SJack F Vogel 	if (hw->mac.ops.get_link_up_info)
5728cfa0ad2SJack F Vogel 		return hw->mac.ops.get_link_up_info(hw, speed, duplex);
5738cfa0ad2SJack F Vogel 
5748cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
5758cfa0ad2SJack F Vogel }
5768cfa0ad2SJack F Vogel 
5778cfa0ad2SJack F Vogel /**
5788cfa0ad2SJack F Vogel  *  e1000_setup_led - Configures SW controllable LED
5798cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5808cfa0ad2SJack F Vogel  *
5818cfa0ad2SJack F Vogel  *  This prepares the SW controllable LED for use and saves the current state
5828cfa0ad2SJack F Vogel  *  of the LED so it can be later restored. This is a function pointer entry
5838cfa0ad2SJack F Vogel  *  point called by drivers.
5848cfa0ad2SJack F Vogel  **/
5858cfa0ad2SJack F Vogel s32 e1000_setup_led(struct e1000_hw *hw)
5868cfa0ad2SJack F Vogel {
5878cfa0ad2SJack F Vogel 	if (hw->mac.ops.setup_led)
5888cfa0ad2SJack F Vogel 		return hw->mac.ops.setup_led(hw);
5898cfa0ad2SJack F Vogel 
5908cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
5918cfa0ad2SJack F Vogel }
5928cfa0ad2SJack F Vogel 
5938cfa0ad2SJack F Vogel /**
5948cfa0ad2SJack F Vogel  *  e1000_cleanup_led - Restores SW controllable LED
5958cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
5968cfa0ad2SJack F Vogel  *
5978cfa0ad2SJack F Vogel  *  This restores the SW controllable LED to the value saved off by
5988cfa0ad2SJack F Vogel  *  e1000_setup_led. This is a function pointer entry point called by drivers.
5998cfa0ad2SJack F Vogel  **/
6008cfa0ad2SJack F Vogel s32 e1000_cleanup_led(struct e1000_hw *hw)
6018cfa0ad2SJack F Vogel {
6028cfa0ad2SJack F Vogel 	if (hw->mac.ops.cleanup_led)
6038cfa0ad2SJack F Vogel 		return hw->mac.ops.cleanup_led(hw);
6048cfa0ad2SJack F Vogel 
6058cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
6068cfa0ad2SJack F Vogel }
6078cfa0ad2SJack F Vogel 
6088cfa0ad2SJack F Vogel /**
6098cfa0ad2SJack F Vogel  *  e1000_blink_led - Blink SW controllable LED
6108cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6118cfa0ad2SJack F Vogel  *
6128cfa0ad2SJack F Vogel  *  This starts the adapter LED blinking. Request the LED to be setup first
6138cfa0ad2SJack F Vogel  *  and cleaned up after. This is a function pointer entry point called by
6148cfa0ad2SJack F Vogel  *  drivers.
6158cfa0ad2SJack F Vogel  **/
6168cfa0ad2SJack F Vogel s32 e1000_blink_led(struct e1000_hw *hw)
6178cfa0ad2SJack F Vogel {
6188cfa0ad2SJack F Vogel 	if (hw->mac.ops.blink_led)
6198cfa0ad2SJack F Vogel 		return hw->mac.ops.blink_led(hw);
6208cfa0ad2SJack F Vogel 
6218cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
6228cfa0ad2SJack F Vogel }
6238cfa0ad2SJack F Vogel 
6248cfa0ad2SJack F Vogel /**
625d035aa2dSJack F Vogel  *  e1000_id_led_init - store LED configurations in SW
626d035aa2dSJack F Vogel  *  @hw: pointer to the HW structure
627d035aa2dSJack F Vogel  *
628d035aa2dSJack F Vogel  *  Initializes the LED config in SW. This is a function pointer entry point
629d035aa2dSJack F Vogel  *  called by drivers.
630d035aa2dSJack F Vogel  **/
631d035aa2dSJack F Vogel s32 e1000_id_led_init(struct e1000_hw *hw)
632d035aa2dSJack F Vogel {
633d035aa2dSJack F Vogel 	if (hw->mac.ops.id_led_init)
634d035aa2dSJack F Vogel 		return hw->mac.ops.id_led_init(hw);
635d035aa2dSJack F Vogel 
636d035aa2dSJack F Vogel 	return E1000_SUCCESS;
637d035aa2dSJack F Vogel }
638d035aa2dSJack F Vogel 
639d035aa2dSJack F Vogel /**
6408cfa0ad2SJack F Vogel  *  e1000_led_on - Turn on SW controllable LED
6418cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6428cfa0ad2SJack F Vogel  *
6438cfa0ad2SJack F Vogel  *  Turns the SW defined LED on. This is a function pointer entry point
6448cfa0ad2SJack F Vogel  *  called by drivers.
6458cfa0ad2SJack F Vogel  **/
6468cfa0ad2SJack F Vogel s32 e1000_led_on(struct e1000_hw *hw)
6478cfa0ad2SJack F Vogel {
6488cfa0ad2SJack F Vogel 	if (hw->mac.ops.led_on)
6498cfa0ad2SJack F Vogel 		return hw->mac.ops.led_on(hw);
6508cfa0ad2SJack F Vogel 
6518cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
6528cfa0ad2SJack F Vogel }
6538cfa0ad2SJack F Vogel 
6548cfa0ad2SJack F Vogel /**
6558cfa0ad2SJack F Vogel  *  e1000_led_off - Turn off SW controllable LED
6568cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6578cfa0ad2SJack F Vogel  *
6588cfa0ad2SJack F Vogel  *  Turns the SW defined LED off. This is a function pointer entry point
6598cfa0ad2SJack F Vogel  *  called by drivers.
6608cfa0ad2SJack F Vogel  **/
6618cfa0ad2SJack F Vogel s32 e1000_led_off(struct e1000_hw *hw)
6628cfa0ad2SJack F Vogel {
6638cfa0ad2SJack F Vogel 	if (hw->mac.ops.led_off)
6648cfa0ad2SJack F Vogel 		return hw->mac.ops.led_off(hw);
6658cfa0ad2SJack F Vogel 
6668cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
6678cfa0ad2SJack F Vogel }
6688cfa0ad2SJack F Vogel 
6698cfa0ad2SJack F Vogel /**
6708cfa0ad2SJack F Vogel  *  e1000_reset_adaptive - Reset adaptive IFS
6718cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6728cfa0ad2SJack F Vogel  *
6738cfa0ad2SJack F Vogel  *  Resets the adaptive IFS. Currently no func pointer exists and all
6748cfa0ad2SJack F Vogel  *  implementations are handled in the generic version of this function.
6758cfa0ad2SJack F Vogel  **/
6768cfa0ad2SJack F Vogel void e1000_reset_adaptive(struct e1000_hw *hw)
6778cfa0ad2SJack F Vogel {
6788cfa0ad2SJack F Vogel 	e1000_reset_adaptive_generic(hw);
6798cfa0ad2SJack F Vogel }
6808cfa0ad2SJack F Vogel 
6818cfa0ad2SJack F Vogel /**
6828cfa0ad2SJack F Vogel  *  e1000_update_adaptive - Update adaptive IFS
6838cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6848cfa0ad2SJack F Vogel  *
6858cfa0ad2SJack F Vogel  *  Updates adapter IFS. Currently no func pointer exists and all
6868cfa0ad2SJack F Vogel  *  implementations are handled in the generic version of this function.
6878cfa0ad2SJack F Vogel  **/
6888cfa0ad2SJack F Vogel void e1000_update_adaptive(struct e1000_hw *hw)
6898cfa0ad2SJack F Vogel {
6908cfa0ad2SJack F Vogel 	e1000_update_adaptive_generic(hw);
6918cfa0ad2SJack F Vogel }
6928cfa0ad2SJack F Vogel 
6938cfa0ad2SJack F Vogel /**
6948cfa0ad2SJack F Vogel  *  e1000_disable_pcie_master - Disable PCI-Express master access
6958cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
6968cfa0ad2SJack F Vogel  *
6978cfa0ad2SJack F Vogel  *  Disables PCI-Express master access and verifies there are no pending
6988cfa0ad2SJack F Vogel  *  requests. Currently no func pointer exists and all implementations are
6998cfa0ad2SJack F Vogel  *  handled in the generic version of this function.
7008cfa0ad2SJack F Vogel  **/
7018cfa0ad2SJack F Vogel s32 e1000_disable_pcie_master(struct e1000_hw *hw)
7028cfa0ad2SJack F Vogel {
7038cfa0ad2SJack F Vogel 	return e1000_disable_pcie_master_generic(hw);
7048cfa0ad2SJack F Vogel }
7058cfa0ad2SJack F Vogel 
7068cfa0ad2SJack F Vogel /**
7078cfa0ad2SJack F Vogel  *  e1000_config_collision_dist - Configure collision distance
7088cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7098cfa0ad2SJack F Vogel  *
7108cfa0ad2SJack F Vogel  *  Configures the collision distance to the default value and is used
7118cfa0ad2SJack F Vogel  *  during link setup.
7128cfa0ad2SJack F Vogel  **/
7138cfa0ad2SJack F Vogel void e1000_config_collision_dist(struct e1000_hw *hw)
7148cfa0ad2SJack F Vogel {
7158cfa0ad2SJack F Vogel 	if (hw->mac.ops.config_collision_dist)
7168cfa0ad2SJack F Vogel 		hw->mac.ops.config_collision_dist(hw);
7178cfa0ad2SJack F Vogel }
7188cfa0ad2SJack F Vogel 
7198cfa0ad2SJack F Vogel /**
7208cfa0ad2SJack F Vogel  *  e1000_rar_set - Sets a receive address register
7218cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7228cfa0ad2SJack F Vogel  *  @addr: address to set the RAR to
7238cfa0ad2SJack F Vogel  *  @index: the RAR to set
7248cfa0ad2SJack F Vogel  *
7258cfa0ad2SJack F Vogel  *  Sets a Receive Address Register (RAR) to the specified address.
7268cfa0ad2SJack F Vogel  **/
7278cfa0ad2SJack F Vogel void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
7288cfa0ad2SJack F Vogel {
7298cfa0ad2SJack F Vogel 	if (hw->mac.ops.rar_set)
7308cfa0ad2SJack F Vogel 		hw->mac.ops.rar_set(hw, addr, index);
7318cfa0ad2SJack F Vogel }
7328cfa0ad2SJack F Vogel 
7338cfa0ad2SJack F Vogel /**
7348cfa0ad2SJack F Vogel  *  e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state
7358cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7368cfa0ad2SJack F Vogel  *
7378cfa0ad2SJack F Vogel  *  Ensures that the MDI/MDIX SW state is valid.
7388cfa0ad2SJack F Vogel  **/
7398cfa0ad2SJack F Vogel s32 e1000_validate_mdi_setting(struct e1000_hw *hw)
7408cfa0ad2SJack F Vogel {
7418cfa0ad2SJack F Vogel 	if (hw->mac.ops.validate_mdi_setting)
7428cfa0ad2SJack F Vogel 		return hw->mac.ops.validate_mdi_setting(hw);
7438cfa0ad2SJack F Vogel 
7448cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
7458cfa0ad2SJack F Vogel }
7468cfa0ad2SJack F Vogel 
7478cfa0ad2SJack F Vogel /**
7488cfa0ad2SJack F Vogel  *  e1000_mta_set - Sets multicast table bit
7498cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7508cfa0ad2SJack F Vogel  *  @hash_value: Multicast hash value.
7518cfa0ad2SJack F Vogel  *
7528cfa0ad2SJack F Vogel  *  This sets the bit in the multicast table corresponding to the
7538cfa0ad2SJack F Vogel  *  hash value.  This is a function pointer entry point called by drivers.
7548cfa0ad2SJack F Vogel  **/
7558cfa0ad2SJack F Vogel void e1000_mta_set(struct e1000_hw *hw, u32 hash_value)
7568cfa0ad2SJack F Vogel {
7578cfa0ad2SJack F Vogel 	if (hw->mac.ops.mta_set)
7588cfa0ad2SJack F Vogel 		hw->mac.ops.mta_set(hw, hash_value);
7598cfa0ad2SJack F Vogel }
7608cfa0ad2SJack F Vogel 
7618cfa0ad2SJack F Vogel /**
7628cfa0ad2SJack F Vogel  *  e1000_hash_mc_addr - Determines address location in multicast table
7638cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7648cfa0ad2SJack F Vogel  *  @mc_addr: Multicast address to hash.
7658cfa0ad2SJack F Vogel  *
7668cfa0ad2SJack F Vogel  *  This hashes an address to determine its location in the multicast
7678cfa0ad2SJack F Vogel  *  table. Currently no func pointer exists and all implementations
7688cfa0ad2SJack F Vogel  *  are handled in the generic version of this function.
7698cfa0ad2SJack F Vogel  **/
7708cfa0ad2SJack F Vogel u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
7718cfa0ad2SJack F Vogel {
7728cfa0ad2SJack F Vogel 	return e1000_hash_mc_addr_generic(hw, mc_addr);
7738cfa0ad2SJack F Vogel }
7748cfa0ad2SJack F Vogel 
7758cfa0ad2SJack F Vogel /**
7768cfa0ad2SJack F Vogel  *  e1000_enable_tx_pkt_filtering - Enable packet filtering on TX
7778cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7788cfa0ad2SJack F Vogel  *
7798cfa0ad2SJack F Vogel  *  Enables packet filtering on transmit packets if manageability is enabled
7808cfa0ad2SJack F Vogel  *  and host interface is enabled.
7818cfa0ad2SJack F Vogel  *  Currently no func pointer exists and all implementations are handled in the
7828cfa0ad2SJack F Vogel  *  generic version of this function.
7838cfa0ad2SJack F Vogel  **/
7848cfa0ad2SJack F Vogel bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)
7858cfa0ad2SJack F Vogel {
7868cfa0ad2SJack F Vogel 	return e1000_enable_tx_pkt_filtering_generic(hw);
7878cfa0ad2SJack F Vogel }
7888cfa0ad2SJack F Vogel 
7898cfa0ad2SJack F Vogel /**
7908cfa0ad2SJack F Vogel  *  e1000_mng_host_if_write - Writes to the manageability host interface
7918cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
7928cfa0ad2SJack F Vogel  *  @buffer: pointer to the host interface buffer
7938cfa0ad2SJack F Vogel  *  @length: size of the buffer
7948cfa0ad2SJack F Vogel  *  @offset: location in the buffer to write to
7958cfa0ad2SJack F Vogel  *  @sum: sum of the data (not checksum)
7968cfa0ad2SJack F Vogel  *
7978cfa0ad2SJack F Vogel  *  This function writes the buffer content at the offset given on the host if.
7988cfa0ad2SJack F Vogel  *  It also does alignment considerations to do the writes in most efficient
7998cfa0ad2SJack F Vogel  *  way.  Also fills up the sum of the buffer in *buffer parameter.
8008cfa0ad2SJack F Vogel  **/
8018cfa0ad2SJack F Vogel s32 e1000_mng_host_if_write(struct e1000_hw * hw, u8 *buffer, u16 length,
8028cfa0ad2SJack F Vogel                             u16 offset, u8 *sum)
8038cfa0ad2SJack F Vogel {
8048cfa0ad2SJack F Vogel 	if (hw->mac.ops.mng_host_if_write)
8058cfa0ad2SJack F Vogel 		return hw->mac.ops.mng_host_if_write(hw, buffer, length,
8068cfa0ad2SJack F Vogel 		                                     offset, sum);
8078cfa0ad2SJack F Vogel 
8088cfa0ad2SJack F Vogel 	return E1000_NOT_IMPLEMENTED;
8098cfa0ad2SJack F Vogel }
8108cfa0ad2SJack F Vogel 
8118cfa0ad2SJack F Vogel /**
8128cfa0ad2SJack F Vogel  *  e1000_mng_write_cmd_header - Writes manageability command header
8138cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8148cfa0ad2SJack F Vogel  *  @hdr: pointer to the host interface command header
8158cfa0ad2SJack F Vogel  *
8168cfa0ad2SJack F Vogel  *  Writes the command header after does the checksum calculation.
8178cfa0ad2SJack F Vogel  **/
8188cfa0ad2SJack F Vogel s32 e1000_mng_write_cmd_header(struct e1000_hw *hw,
8198cfa0ad2SJack F Vogel                                struct e1000_host_mng_command_header *hdr)
8208cfa0ad2SJack F Vogel {
8218cfa0ad2SJack F Vogel 	if (hw->mac.ops.mng_write_cmd_header)
8228cfa0ad2SJack F Vogel 		return hw->mac.ops.mng_write_cmd_header(hw, hdr);
8238cfa0ad2SJack F Vogel 
8248cfa0ad2SJack F Vogel 	return E1000_NOT_IMPLEMENTED;
8258cfa0ad2SJack F Vogel }
8268cfa0ad2SJack F Vogel 
8278cfa0ad2SJack F Vogel /**
8288cfa0ad2SJack F Vogel  *  e1000_mng_enable_host_if - Checks host interface is enabled
8298cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8308cfa0ad2SJack F Vogel  *
8318cfa0ad2SJack F Vogel  *  Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND
8328cfa0ad2SJack F Vogel  *
8338cfa0ad2SJack F Vogel  *  This function checks whether the HOST IF is enabled for command operation
8348cfa0ad2SJack F Vogel  *  and also checks whether the previous command is completed.  It busy waits
8358cfa0ad2SJack F Vogel  *  in case of previous command is not completed.
8368cfa0ad2SJack F Vogel  **/
8378cfa0ad2SJack F Vogel s32 e1000_mng_enable_host_if(struct e1000_hw * hw)
8388cfa0ad2SJack F Vogel {
8398cfa0ad2SJack F Vogel 	if (hw->mac.ops.mng_enable_host_if)
8408cfa0ad2SJack F Vogel 		return hw->mac.ops.mng_enable_host_if(hw);
8418cfa0ad2SJack F Vogel 
8428cfa0ad2SJack F Vogel 	return E1000_NOT_IMPLEMENTED;
8438cfa0ad2SJack F Vogel }
8448cfa0ad2SJack F Vogel 
8458cfa0ad2SJack F Vogel /**
8468cfa0ad2SJack F Vogel  *  e1000_wait_autoneg - Waits for autonegotiation completion
8478cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8488cfa0ad2SJack F Vogel  *
8498cfa0ad2SJack F Vogel  *  Waits for autoneg to complete. Currently no func pointer exists and all
8508cfa0ad2SJack F Vogel  *  implementations are handled in the generic version of this function.
8518cfa0ad2SJack F Vogel  **/
8528cfa0ad2SJack F Vogel s32 e1000_wait_autoneg(struct e1000_hw *hw)
8538cfa0ad2SJack F Vogel {
8548cfa0ad2SJack F Vogel 	if (hw->mac.ops.wait_autoneg)
8558cfa0ad2SJack F Vogel 		return hw->mac.ops.wait_autoneg(hw);
8568cfa0ad2SJack F Vogel 
8578cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
8588cfa0ad2SJack F Vogel }
8598cfa0ad2SJack F Vogel 
8608cfa0ad2SJack F Vogel /**
8618cfa0ad2SJack F Vogel  *  e1000_check_reset_block - Verifies PHY can be reset
8628cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8638cfa0ad2SJack F Vogel  *
8648cfa0ad2SJack F Vogel  *  Checks if the PHY is in a state that can be reset or if manageability
8658cfa0ad2SJack F Vogel  *  has it tied up. This is a function pointer entry point called by drivers.
8668cfa0ad2SJack F Vogel  **/
8678cfa0ad2SJack F Vogel s32 e1000_check_reset_block(struct e1000_hw *hw)
8688cfa0ad2SJack F Vogel {
8698cfa0ad2SJack F Vogel 	if (hw->phy.ops.check_reset_block)
8708cfa0ad2SJack F Vogel 		return hw->phy.ops.check_reset_block(hw);
8718cfa0ad2SJack F Vogel 
8728cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
8738cfa0ad2SJack F Vogel }
8748cfa0ad2SJack F Vogel 
8758cfa0ad2SJack F Vogel /**
8768cfa0ad2SJack F Vogel  *  e1000_read_phy_reg - Reads PHY register
8778cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8788cfa0ad2SJack F Vogel  *  @offset: the register to read
8798cfa0ad2SJack F Vogel  *  @data: the buffer to store the 16-bit read.
8808cfa0ad2SJack F Vogel  *
8818cfa0ad2SJack F Vogel  *  Reads the PHY register and returns the value in data.
8828cfa0ad2SJack F Vogel  *  This is a function pointer entry point called by drivers.
8838cfa0ad2SJack F Vogel  **/
8848cfa0ad2SJack F Vogel s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data)
8858cfa0ad2SJack F Vogel {
8868cfa0ad2SJack F Vogel 	if (hw->phy.ops.read_reg)
8878cfa0ad2SJack F Vogel 		return hw->phy.ops.read_reg(hw, offset, data);
8888cfa0ad2SJack F Vogel 
8898cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
8908cfa0ad2SJack F Vogel }
8918cfa0ad2SJack F Vogel 
8928cfa0ad2SJack F Vogel /**
8938cfa0ad2SJack F Vogel  *  e1000_write_phy_reg - Writes PHY register
8948cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
8958cfa0ad2SJack F Vogel  *  @offset: the register to write
8968cfa0ad2SJack F Vogel  *  @data: the value to write.
8978cfa0ad2SJack F Vogel  *
8988cfa0ad2SJack F Vogel  *  Writes the PHY register at offset with the value in data.
8998cfa0ad2SJack F Vogel  *  This is a function pointer entry point called by drivers.
9008cfa0ad2SJack F Vogel  **/
9018cfa0ad2SJack F Vogel s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data)
9028cfa0ad2SJack F Vogel {
9038cfa0ad2SJack F Vogel 	if (hw->phy.ops.write_reg)
9048cfa0ad2SJack F Vogel 		return hw->phy.ops.write_reg(hw, offset, data);
9058cfa0ad2SJack F Vogel 
9068cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
9078cfa0ad2SJack F Vogel }
9088cfa0ad2SJack F Vogel 
9098cfa0ad2SJack F Vogel /**
9108cfa0ad2SJack F Vogel  *  e1000_release_phy - Generic release PHY
9118cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9128cfa0ad2SJack F Vogel  *
9138cfa0ad2SJack F Vogel  *  Return if silicon family does not require a semaphore when accessing the
9148cfa0ad2SJack F Vogel  *  PHY.
9158cfa0ad2SJack F Vogel  **/
9168cfa0ad2SJack F Vogel void e1000_release_phy(struct e1000_hw *hw)
9178cfa0ad2SJack F Vogel {
9188cfa0ad2SJack F Vogel 	if (hw->phy.ops.release)
9198cfa0ad2SJack F Vogel 		hw->phy.ops.release(hw);
9208cfa0ad2SJack F Vogel }
9218cfa0ad2SJack F Vogel 
9228cfa0ad2SJack F Vogel /**
9238cfa0ad2SJack F Vogel  *  e1000_acquire_phy - Generic acquire PHY
9248cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9258cfa0ad2SJack F Vogel  *
9268cfa0ad2SJack F Vogel  *  Return success if silicon family does not require a semaphore when
9278cfa0ad2SJack F Vogel  *  accessing the PHY.
9288cfa0ad2SJack F Vogel  **/
9298cfa0ad2SJack F Vogel s32 e1000_acquire_phy(struct e1000_hw *hw)
9308cfa0ad2SJack F Vogel {
9318cfa0ad2SJack F Vogel 	if (hw->phy.ops.acquire)
9328cfa0ad2SJack F Vogel 		return hw->phy.ops.acquire(hw);
9338cfa0ad2SJack F Vogel 
9348cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
9358cfa0ad2SJack F Vogel }
9368cfa0ad2SJack F Vogel 
9378cfa0ad2SJack F Vogel /**
938daf9197cSJack F Vogel  *  e1000_cfg_on_link_up - Configure PHY upon link up
939daf9197cSJack F Vogel  *  @hw: pointer to the HW structure
940daf9197cSJack F Vogel  **/
941daf9197cSJack F Vogel s32 e1000_cfg_on_link_up(struct e1000_hw *hw)
942daf9197cSJack F Vogel {
943daf9197cSJack F Vogel 	if (hw->phy.ops.cfg_on_link_up)
944daf9197cSJack F Vogel 		return hw->phy.ops.cfg_on_link_up(hw);
945daf9197cSJack F Vogel 
946daf9197cSJack F Vogel 	return E1000_SUCCESS;
947daf9197cSJack F Vogel }
948daf9197cSJack F Vogel 
949daf9197cSJack F Vogel /**
9508cfa0ad2SJack F Vogel  *  e1000_read_kmrn_reg - Reads register using Kumeran interface
9518cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9528cfa0ad2SJack F Vogel  *  @offset: the register to read
9538cfa0ad2SJack F Vogel  *  @data: the location to store the 16-bit value read.
9548cfa0ad2SJack F Vogel  *
9558cfa0ad2SJack F Vogel  *  Reads a register out of the Kumeran interface. Currently no func pointer
9568cfa0ad2SJack F Vogel  *  exists and all implementations are handled in the generic version of
9578cfa0ad2SJack F Vogel  *  this function.
9588cfa0ad2SJack F Vogel  **/
9598cfa0ad2SJack F Vogel s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data)
9608cfa0ad2SJack F Vogel {
9618cfa0ad2SJack F Vogel 	return e1000_read_kmrn_reg_generic(hw, offset, data);
9628cfa0ad2SJack F Vogel }
9638cfa0ad2SJack F Vogel 
9648cfa0ad2SJack F Vogel /**
9658cfa0ad2SJack F Vogel  *  e1000_write_kmrn_reg - Writes register using Kumeran interface
9668cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9678cfa0ad2SJack F Vogel  *  @offset: the register to write
9688cfa0ad2SJack F Vogel  *  @data: the value to write.
9698cfa0ad2SJack F Vogel  *
9708cfa0ad2SJack F Vogel  *  Writes a register to the Kumeran interface. Currently no func pointer
9718cfa0ad2SJack F Vogel  *  exists and all implementations are handled in the generic version of
9728cfa0ad2SJack F Vogel  *  this function.
9738cfa0ad2SJack F Vogel  **/
9748cfa0ad2SJack F Vogel s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data)
9758cfa0ad2SJack F Vogel {
9768cfa0ad2SJack F Vogel 	return e1000_write_kmrn_reg_generic(hw, offset, data);
9778cfa0ad2SJack F Vogel }
9788cfa0ad2SJack F Vogel 
9798cfa0ad2SJack F Vogel /**
9808cfa0ad2SJack F Vogel  *  e1000_get_cable_length - Retrieves cable length estimation
9818cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9828cfa0ad2SJack F Vogel  *
9838cfa0ad2SJack F Vogel  *  This function estimates the cable length and stores them in
9848cfa0ad2SJack F Vogel  *  hw->phy.min_length and hw->phy.max_length. This is a function pointer
9858cfa0ad2SJack F Vogel  *  entry point called by drivers.
9868cfa0ad2SJack F Vogel  **/
9878cfa0ad2SJack F Vogel s32 e1000_get_cable_length(struct e1000_hw *hw)
9888cfa0ad2SJack F Vogel {
9898cfa0ad2SJack F Vogel 	if (hw->phy.ops.get_cable_length)
9908cfa0ad2SJack F Vogel 		return hw->phy.ops.get_cable_length(hw);
9918cfa0ad2SJack F Vogel 
9928cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
9938cfa0ad2SJack F Vogel }
9948cfa0ad2SJack F Vogel 
9958cfa0ad2SJack F Vogel /**
9968cfa0ad2SJack F Vogel  *  e1000_get_phy_info - Retrieves PHY information from registers
9978cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
9988cfa0ad2SJack F Vogel  *
9998cfa0ad2SJack F Vogel  *  This function gets some information from various PHY registers and
10008cfa0ad2SJack F Vogel  *  populates hw->phy values with it. This is a function pointer entry
10018cfa0ad2SJack F Vogel  *  point called by drivers.
10028cfa0ad2SJack F Vogel  **/
10038cfa0ad2SJack F Vogel s32 e1000_get_phy_info(struct e1000_hw *hw)
10048cfa0ad2SJack F Vogel {
10058cfa0ad2SJack F Vogel 	if (hw->phy.ops.get_info)
10068cfa0ad2SJack F Vogel 		return hw->phy.ops.get_info(hw);
10078cfa0ad2SJack F Vogel 
10088cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
10098cfa0ad2SJack F Vogel }
10108cfa0ad2SJack F Vogel 
10118cfa0ad2SJack F Vogel /**
10128cfa0ad2SJack F Vogel  *  e1000_phy_hw_reset - Hard PHY reset
10138cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
10148cfa0ad2SJack F Vogel  *
10158cfa0ad2SJack F Vogel  *  Performs a hard PHY reset. This is a function pointer entry point called
10168cfa0ad2SJack F Vogel  *  by drivers.
10178cfa0ad2SJack F Vogel  **/
10188cfa0ad2SJack F Vogel s32 e1000_phy_hw_reset(struct e1000_hw *hw)
10198cfa0ad2SJack F Vogel {
10208cfa0ad2SJack F Vogel 	if (hw->phy.ops.reset)
10218cfa0ad2SJack F Vogel 		return hw->phy.ops.reset(hw);
10228cfa0ad2SJack F Vogel 
10238cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
10248cfa0ad2SJack F Vogel }
10258cfa0ad2SJack F Vogel 
10268cfa0ad2SJack F Vogel /**
10278cfa0ad2SJack F Vogel  *  e1000_phy_commit - Soft PHY reset
10288cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
10298cfa0ad2SJack F Vogel  *
10308cfa0ad2SJack F Vogel  *  Performs a soft PHY reset on those that apply. This is a function pointer
10318cfa0ad2SJack F Vogel  *  entry point called by drivers.
10328cfa0ad2SJack F Vogel  **/
10338cfa0ad2SJack F Vogel s32 e1000_phy_commit(struct e1000_hw *hw)
10348cfa0ad2SJack F Vogel {
10358cfa0ad2SJack F Vogel 	if (hw->phy.ops.commit)
10368cfa0ad2SJack F Vogel 		return hw->phy.ops.commit(hw);
10378cfa0ad2SJack F Vogel 
10388cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
10398cfa0ad2SJack F Vogel }
10408cfa0ad2SJack F Vogel 
10418cfa0ad2SJack F Vogel /**
10428cfa0ad2SJack F Vogel  *  e1000_set_d0_lplu_state - Sets low power link up state for D0
10438cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
10448cfa0ad2SJack F Vogel  *  @active: boolean used to enable/disable lplu
10458cfa0ad2SJack F Vogel  *
10468cfa0ad2SJack F Vogel  *  Success returns 0, Failure returns 1
10478cfa0ad2SJack F Vogel  *
10488cfa0ad2SJack F Vogel  *  The low power link up (lplu) state is set to the power management level D0
10498cfa0ad2SJack F Vogel  *  and SmartSpeed is disabled when active is TRUE, else clear lplu for D0
10508cfa0ad2SJack F Vogel  *  and enable Smartspeed.  LPLU and Smartspeed are mutually exclusive.  LPLU
10518cfa0ad2SJack F Vogel  *  is used during Dx states where the power conservation is most important.
10528cfa0ad2SJack F Vogel  *  During driver activity, SmartSpeed should be enabled so performance is
10538cfa0ad2SJack F Vogel  *  maintained.  This is a function pointer entry point called by drivers.
10548cfa0ad2SJack F Vogel  **/
10558cfa0ad2SJack F Vogel s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active)
10568cfa0ad2SJack F Vogel {
10578cfa0ad2SJack F Vogel 	if (hw->phy.ops.set_d0_lplu_state)
10588cfa0ad2SJack F Vogel 		return hw->phy.ops.set_d0_lplu_state(hw, active);
10598cfa0ad2SJack F Vogel 
10608cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
10618cfa0ad2SJack F Vogel }
10628cfa0ad2SJack F Vogel 
10638cfa0ad2SJack F Vogel /**
10648cfa0ad2SJack F Vogel  *  e1000_set_d3_lplu_state - Sets low power link up state for D3
10658cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
10668cfa0ad2SJack F Vogel  *  @active: boolean used to enable/disable lplu
10678cfa0ad2SJack F Vogel  *
10688cfa0ad2SJack F Vogel  *  Success returns 0, Failure returns 1
10698cfa0ad2SJack F Vogel  *
10708cfa0ad2SJack F Vogel  *  The low power link up (lplu) state is set to the power management level D3
10718cfa0ad2SJack F Vogel  *  and SmartSpeed is disabled when active is TRUE, else clear lplu for D3
10728cfa0ad2SJack F Vogel  *  and enable Smartspeed.  LPLU and Smartspeed are mutually exclusive.  LPLU
10738cfa0ad2SJack F Vogel  *  is used during Dx states where the power conservation is most important.
10748cfa0ad2SJack F Vogel  *  During driver activity, SmartSpeed should be enabled so performance is
10758cfa0ad2SJack F Vogel  *  maintained.  This is a function pointer entry point called by drivers.
10768cfa0ad2SJack F Vogel  **/
10778cfa0ad2SJack F Vogel s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active)
10788cfa0ad2SJack F Vogel {
10798cfa0ad2SJack F Vogel 	if (hw->phy.ops.set_d3_lplu_state)
10808cfa0ad2SJack F Vogel 		return hw->phy.ops.set_d3_lplu_state(hw, active);
10818cfa0ad2SJack F Vogel 
10828cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
10838cfa0ad2SJack F Vogel }
10848cfa0ad2SJack F Vogel 
10858cfa0ad2SJack F Vogel /**
10868cfa0ad2SJack F Vogel  *  e1000_read_mac_addr - Reads MAC address
10878cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
10888cfa0ad2SJack F Vogel  *
10898cfa0ad2SJack F Vogel  *  Reads the MAC address out of the adapter and stores it in the HW structure.
10908cfa0ad2SJack F Vogel  *  Currently no func pointer exists and all implementations are handled in the
10918cfa0ad2SJack F Vogel  *  generic version of this function.
10928cfa0ad2SJack F Vogel  **/
10938cfa0ad2SJack F Vogel s32 e1000_read_mac_addr(struct e1000_hw *hw)
10948cfa0ad2SJack F Vogel {
10958cfa0ad2SJack F Vogel 	if (hw->mac.ops.read_mac_addr)
10968cfa0ad2SJack F Vogel 		return hw->mac.ops.read_mac_addr(hw);
10978cfa0ad2SJack F Vogel 
10988cfa0ad2SJack F Vogel 	return e1000_read_mac_addr_generic(hw);
10998cfa0ad2SJack F Vogel }
11008cfa0ad2SJack F Vogel 
11018cfa0ad2SJack F Vogel /**
11028cfa0ad2SJack F Vogel  *  e1000_read_pba_num - Read device part number
11038cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11048cfa0ad2SJack F Vogel  *  @pba_num: pointer to device part number
11058cfa0ad2SJack F Vogel  *
11068cfa0ad2SJack F Vogel  *  Reads the product board assembly (PBA) number from the EEPROM and stores
11078cfa0ad2SJack F Vogel  *  the value in pba_num.
11088cfa0ad2SJack F Vogel  *  Currently no func pointer exists and all implementations are handled in the
11098cfa0ad2SJack F Vogel  *  generic version of this function.
11108cfa0ad2SJack F Vogel  **/
11118cfa0ad2SJack F Vogel s32 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num)
11128cfa0ad2SJack F Vogel {
11138cfa0ad2SJack F Vogel 	return e1000_read_pba_num_generic(hw, pba_num);
11148cfa0ad2SJack F Vogel }
11158cfa0ad2SJack F Vogel 
11168cfa0ad2SJack F Vogel /**
11178cfa0ad2SJack F Vogel  *  e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum
11188cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11198cfa0ad2SJack F Vogel  *
11208cfa0ad2SJack F Vogel  *  Validates the NVM checksum is correct. This is a function pointer entry
11218cfa0ad2SJack F Vogel  *  point called by drivers.
11228cfa0ad2SJack F Vogel  **/
11238cfa0ad2SJack F Vogel s32 e1000_validate_nvm_checksum(struct e1000_hw *hw)
11248cfa0ad2SJack F Vogel {
11258cfa0ad2SJack F Vogel 	if (hw->nvm.ops.validate)
11268cfa0ad2SJack F Vogel 		return hw->nvm.ops.validate(hw);
11278cfa0ad2SJack F Vogel 
11288cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
11298cfa0ad2SJack F Vogel }
11308cfa0ad2SJack F Vogel 
11318cfa0ad2SJack F Vogel /**
11328cfa0ad2SJack F Vogel  *  e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum
11338cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11348cfa0ad2SJack F Vogel  *
11358cfa0ad2SJack F Vogel  *  Updates the NVM checksum. Currently no func pointer exists and all
11368cfa0ad2SJack F Vogel  *  implementations are handled in the generic version of this function.
11378cfa0ad2SJack F Vogel  **/
11388cfa0ad2SJack F Vogel s32 e1000_update_nvm_checksum(struct e1000_hw *hw)
11398cfa0ad2SJack F Vogel {
11408cfa0ad2SJack F Vogel 	if (hw->nvm.ops.update)
11418cfa0ad2SJack F Vogel 		return hw->nvm.ops.update(hw);
11428cfa0ad2SJack F Vogel 
11438cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
11448cfa0ad2SJack F Vogel }
11458cfa0ad2SJack F Vogel 
11468cfa0ad2SJack F Vogel /**
11478cfa0ad2SJack F Vogel  *  e1000_reload_nvm - Reloads EEPROM
11488cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11498cfa0ad2SJack F Vogel  *
11508cfa0ad2SJack F Vogel  *  Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the
11518cfa0ad2SJack F Vogel  *  extended control register.
11528cfa0ad2SJack F Vogel  **/
11538cfa0ad2SJack F Vogel void e1000_reload_nvm(struct e1000_hw *hw)
11548cfa0ad2SJack F Vogel {
11558cfa0ad2SJack F Vogel 	if (hw->nvm.ops.reload)
11568cfa0ad2SJack F Vogel 		hw->nvm.ops.reload(hw);
11578cfa0ad2SJack F Vogel }
11588cfa0ad2SJack F Vogel 
11598cfa0ad2SJack F Vogel /**
11608cfa0ad2SJack F Vogel  *  e1000_read_nvm - Reads NVM (EEPROM)
11618cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11628cfa0ad2SJack F Vogel  *  @offset: the word offset to read
11638cfa0ad2SJack F Vogel  *  @words: number of 16-bit words to read
11648cfa0ad2SJack F Vogel  *  @data: pointer to the properly sized buffer for the data.
11658cfa0ad2SJack F Vogel  *
11668cfa0ad2SJack F Vogel  *  Reads 16-bit chunks of data from the NVM (EEPROM). This is a function
11678cfa0ad2SJack F Vogel  *  pointer entry point called by drivers.
11688cfa0ad2SJack F Vogel  **/
11698cfa0ad2SJack F Vogel s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
11708cfa0ad2SJack F Vogel {
11718cfa0ad2SJack F Vogel 	if (hw->nvm.ops.read)
11728cfa0ad2SJack F Vogel 		return hw->nvm.ops.read(hw, offset, words, data);
11738cfa0ad2SJack F Vogel 
11748cfa0ad2SJack F Vogel 	return -E1000_ERR_CONFIG;
11758cfa0ad2SJack F Vogel }
11768cfa0ad2SJack F Vogel 
11778cfa0ad2SJack F Vogel /**
11788cfa0ad2SJack F Vogel  *  e1000_write_nvm - Writes to NVM (EEPROM)
11798cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11808cfa0ad2SJack F Vogel  *  @offset: the word offset to read
11818cfa0ad2SJack F Vogel  *  @words: number of 16-bit words to write
11828cfa0ad2SJack F Vogel  *  @data: pointer to the properly sized buffer for the data.
11838cfa0ad2SJack F Vogel  *
11848cfa0ad2SJack F Vogel  *  Writes 16-bit chunks of data to the NVM (EEPROM). This is a function
11858cfa0ad2SJack F Vogel  *  pointer entry point called by drivers.
11868cfa0ad2SJack F Vogel  **/
11878cfa0ad2SJack F Vogel s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
11888cfa0ad2SJack F Vogel {
11898cfa0ad2SJack F Vogel 	if (hw->nvm.ops.write)
11908cfa0ad2SJack F Vogel 		return hw->nvm.ops.write(hw, offset, words, data);
11918cfa0ad2SJack F Vogel 
11928cfa0ad2SJack F Vogel 	return E1000_SUCCESS;
11938cfa0ad2SJack F Vogel }
11948cfa0ad2SJack F Vogel 
11958cfa0ad2SJack F Vogel /**
11968cfa0ad2SJack F Vogel  *  e1000_write_8bit_ctrl_reg - Writes 8bit Control register
11978cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
11988cfa0ad2SJack F Vogel  *  @reg: 32bit register offset
11998cfa0ad2SJack F Vogel  *  @offset: the register to write
12008cfa0ad2SJack F Vogel  *  @data: the value to write.
12018cfa0ad2SJack F Vogel  *
12028cfa0ad2SJack F Vogel  *  Writes the PHY register at offset with the value in data.
12038cfa0ad2SJack F Vogel  *  This is a function pointer entry point called by drivers.
12048cfa0ad2SJack F Vogel  **/
12058cfa0ad2SJack F Vogel s32 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, u32 offset,
12068cfa0ad2SJack F Vogel                               u8 data)
12078cfa0ad2SJack F Vogel {
12088cfa0ad2SJack F Vogel 	return e1000_write_8bit_ctrl_reg_generic(hw, reg, offset, data);
12098cfa0ad2SJack F Vogel }
12108cfa0ad2SJack F Vogel 
12118cfa0ad2SJack F Vogel /**
12128cfa0ad2SJack F Vogel  * e1000_power_up_phy - Restores link in case of PHY power down
12138cfa0ad2SJack F Vogel  * @hw: pointer to the HW structure
12148cfa0ad2SJack F Vogel  *
12158cfa0ad2SJack F Vogel  * The phy may be powered down to save power, to turn off link when the
12168cfa0ad2SJack F Vogel  * driver is unloaded, or wake on lan is not enabled (among others).
12178cfa0ad2SJack F Vogel  **/
12188cfa0ad2SJack F Vogel void e1000_power_up_phy(struct e1000_hw *hw)
12198cfa0ad2SJack F Vogel {
12208cfa0ad2SJack F Vogel 	if (hw->phy.ops.power_up)
12218cfa0ad2SJack F Vogel 		hw->phy.ops.power_up(hw);
12228cfa0ad2SJack F Vogel 
12238cfa0ad2SJack F Vogel 	e1000_setup_link(hw);
12248cfa0ad2SJack F Vogel }
12258cfa0ad2SJack F Vogel 
12268cfa0ad2SJack F Vogel /**
12278cfa0ad2SJack F Vogel  * e1000_power_down_phy - Power down PHY
12288cfa0ad2SJack F Vogel  * @hw: pointer to the HW structure
12298cfa0ad2SJack F Vogel  *
12308cfa0ad2SJack F Vogel  * The phy may be powered down to save power, to turn off link when the
12318cfa0ad2SJack F Vogel  * driver is unloaded, or wake on lan is not enabled (among others).
12328cfa0ad2SJack F Vogel  **/
12338cfa0ad2SJack F Vogel void e1000_power_down_phy(struct e1000_hw *hw)
12348cfa0ad2SJack F Vogel {
12358cfa0ad2SJack F Vogel 	if (hw->phy.ops.power_down)
12368cfa0ad2SJack F Vogel 		hw->phy.ops.power_down(hw);
12378cfa0ad2SJack F Vogel }
12388cfa0ad2SJack F Vogel 
12398cfa0ad2SJack F Vogel /**
12408cfa0ad2SJack F Vogel  *  e1000_shutdown_fiber_serdes_link - Remove link during power down
12418cfa0ad2SJack F Vogel  *  @hw: pointer to the HW structure
12428cfa0ad2SJack F Vogel  *
12438cfa0ad2SJack F Vogel  *  Shutdown the optics and PCS on driver unload.
12448cfa0ad2SJack F Vogel  **/
12458cfa0ad2SJack F Vogel void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw)
12468cfa0ad2SJack F Vogel {
12478cfa0ad2SJack F Vogel 	if (hw->mac.ops.shutdown_serdes)
12488cfa0ad2SJack F Vogel 		hw->mac.ops.shutdown_serdes(hw);
12498cfa0ad2SJack F Vogel }
12508cfa0ad2SJack F Vogel 
1251