1*75eba5b6SRobert Mustacchi /****************************************************************************** 2*75eba5b6SRobert Mustacchi 3*75eba5b6SRobert Mustacchi Copyright (c) 2001-2013, Intel Corporation 4*75eba5b6SRobert Mustacchi All rights reserved. 5*75eba5b6SRobert Mustacchi 6*75eba5b6SRobert Mustacchi Redistribution and use in source and binary forms, with or without 7*75eba5b6SRobert Mustacchi modification, are permitted provided that the following conditions are met: 8*75eba5b6SRobert Mustacchi 9*75eba5b6SRobert Mustacchi 1. Redistributions of source code must retain the above copyright notice, 10*75eba5b6SRobert Mustacchi this list of conditions and the following disclaimer. 11*75eba5b6SRobert Mustacchi 12*75eba5b6SRobert Mustacchi 2. Redistributions in binary form must reproduce the above copyright 13*75eba5b6SRobert Mustacchi notice, this list of conditions and the following disclaimer in the 14*75eba5b6SRobert Mustacchi documentation and/or other materials provided with the distribution. 15*75eba5b6SRobert Mustacchi 16*75eba5b6SRobert Mustacchi 3. Neither the name of the Intel Corporation nor the names of its 17*75eba5b6SRobert Mustacchi contributors may be used to endorse or promote products derived from 18*75eba5b6SRobert Mustacchi this software without specific prior written permission. 19*75eba5b6SRobert Mustacchi 20*75eba5b6SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21*75eba5b6SRobert Mustacchi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22*75eba5b6SRobert Mustacchi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23*75eba5b6SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24*75eba5b6SRobert Mustacchi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25*75eba5b6SRobert Mustacchi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26*75eba5b6SRobert Mustacchi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*75eba5b6SRobert Mustacchi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*75eba5b6SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29*75eba5b6SRobert Mustacchi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30*75eba5b6SRobert Mustacchi POSSIBILITY OF SUCH DAMAGE. 31*75eba5b6SRobert Mustacchi 32*75eba5b6SRobert Mustacchi ******************************************************************************/ 33*75eba5b6SRobert Mustacchi /*$FreeBSD$*/ 34*75eba5b6SRobert Mustacchi 35*75eba5b6SRobert Mustacchi #include "e1000_api.h" 36*75eba5b6SRobert Mustacchi 37*75eba5b6SRobert Mustacchi /** 38*75eba5b6SRobert Mustacchi * e1000_init_mac_params - Initialize MAC function pointers 39*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 40*75eba5b6SRobert Mustacchi * 41*75eba5b6SRobert Mustacchi * This function initializes the function pointers for the MAC 42*75eba5b6SRobert Mustacchi * set of functions. Called by drivers or by e1000_setup_init_funcs. 43*75eba5b6SRobert Mustacchi **/ 44*75eba5b6SRobert Mustacchi s32 e1000_init_mac_params(struct e1000_hw *hw) 45*75eba5b6SRobert Mustacchi { 46*75eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 47*75eba5b6SRobert Mustacchi 48*75eba5b6SRobert Mustacchi if (hw->mac.ops.init_params) { 49*75eba5b6SRobert Mustacchi ret_val = hw->mac.ops.init_params(hw); 50*75eba5b6SRobert Mustacchi if (ret_val) { 51*75eba5b6SRobert Mustacchi DEBUGOUT("MAC Initialization Error\n"); 52*75eba5b6SRobert Mustacchi goto out; 53*75eba5b6SRobert Mustacchi } 54*75eba5b6SRobert Mustacchi } else { 55*75eba5b6SRobert Mustacchi DEBUGOUT("mac.init_mac_params was NULL\n"); 56*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 57*75eba5b6SRobert Mustacchi } 58*75eba5b6SRobert Mustacchi 59*75eba5b6SRobert Mustacchi out: 60*75eba5b6SRobert Mustacchi return ret_val; 61*75eba5b6SRobert Mustacchi } 62*75eba5b6SRobert Mustacchi 63*75eba5b6SRobert Mustacchi /** 64*75eba5b6SRobert Mustacchi * e1000_init_nvm_params - Initialize NVM function pointers 65*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 66*75eba5b6SRobert Mustacchi * 67*75eba5b6SRobert Mustacchi * This function initializes the function pointers for the NVM 68*75eba5b6SRobert Mustacchi * set of functions. Called by drivers or by e1000_setup_init_funcs. 69*75eba5b6SRobert Mustacchi **/ 70*75eba5b6SRobert Mustacchi s32 e1000_init_nvm_params(struct e1000_hw *hw) 71*75eba5b6SRobert Mustacchi { 72*75eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 73*75eba5b6SRobert Mustacchi 74*75eba5b6SRobert Mustacchi if (hw->nvm.ops.init_params) { 75*75eba5b6SRobert Mustacchi ret_val = hw->nvm.ops.init_params(hw); 76*75eba5b6SRobert Mustacchi if (ret_val) { 77*75eba5b6SRobert Mustacchi DEBUGOUT("NVM Initialization Error\n"); 78*75eba5b6SRobert Mustacchi goto out; 79*75eba5b6SRobert Mustacchi } 80*75eba5b6SRobert Mustacchi } else { 81*75eba5b6SRobert Mustacchi DEBUGOUT("nvm.init_nvm_params was NULL\n"); 82*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 83*75eba5b6SRobert Mustacchi } 84*75eba5b6SRobert Mustacchi 85*75eba5b6SRobert Mustacchi out: 86*75eba5b6SRobert Mustacchi return ret_val; 87*75eba5b6SRobert Mustacchi } 88*75eba5b6SRobert Mustacchi 89*75eba5b6SRobert Mustacchi /** 90*75eba5b6SRobert Mustacchi * e1000_init_phy_params - Initialize PHY function pointers 91*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 92*75eba5b6SRobert Mustacchi * 93*75eba5b6SRobert Mustacchi * This function initializes the function pointers for the PHY 94*75eba5b6SRobert Mustacchi * set of functions. Called by drivers or by e1000_setup_init_funcs. 95*75eba5b6SRobert Mustacchi **/ 96*75eba5b6SRobert Mustacchi s32 e1000_init_phy_params(struct e1000_hw *hw) 97*75eba5b6SRobert Mustacchi { 98*75eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 99*75eba5b6SRobert Mustacchi 100*75eba5b6SRobert Mustacchi if (hw->phy.ops.init_params) { 101*75eba5b6SRobert Mustacchi ret_val = hw->phy.ops.init_params(hw); 102*75eba5b6SRobert Mustacchi if (ret_val) { 103*75eba5b6SRobert Mustacchi DEBUGOUT("PHY Initialization Error\n"); 104*75eba5b6SRobert Mustacchi goto out; 105*75eba5b6SRobert Mustacchi } 106*75eba5b6SRobert Mustacchi } else { 107*75eba5b6SRobert Mustacchi DEBUGOUT("phy.init_phy_params was NULL\n"); 108*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 109*75eba5b6SRobert Mustacchi } 110*75eba5b6SRobert Mustacchi 111*75eba5b6SRobert Mustacchi out: 112*75eba5b6SRobert Mustacchi return ret_val; 113*75eba5b6SRobert Mustacchi } 114*75eba5b6SRobert Mustacchi 115*75eba5b6SRobert Mustacchi /** 116*75eba5b6SRobert Mustacchi * e1000_init_mbx_params - Initialize mailbox function pointers 117*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 118*75eba5b6SRobert Mustacchi * 119*75eba5b6SRobert Mustacchi * This function initializes the function pointers for the PHY 120*75eba5b6SRobert Mustacchi * set of functions. Called by drivers or by e1000_setup_init_funcs. 121*75eba5b6SRobert Mustacchi **/ 122*75eba5b6SRobert Mustacchi s32 e1000_init_mbx_params(struct e1000_hw *hw) 123*75eba5b6SRobert Mustacchi { 124*75eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 125*75eba5b6SRobert Mustacchi 126*75eba5b6SRobert Mustacchi if (hw->mbx.ops.init_params) { 127*75eba5b6SRobert Mustacchi ret_val = hw->mbx.ops.init_params(hw); 128*75eba5b6SRobert Mustacchi if (ret_val) { 129*75eba5b6SRobert Mustacchi DEBUGOUT("Mailbox Initialization Error\n"); 130*75eba5b6SRobert Mustacchi goto out; 131*75eba5b6SRobert Mustacchi } 132*75eba5b6SRobert Mustacchi } else { 133*75eba5b6SRobert Mustacchi DEBUGOUT("mbx.init_mbx_params was NULL\n"); 134*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 135*75eba5b6SRobert Mustacchi } 136*75eba5b6SRobert Mustacchi 137*75eba5b6SRobert Mustacchi out: 138*75eba5b6SRobert Mustacchi return ret_val; 139*75eba5b6SRobert Mustacchi } 140*75eba5b6SRobert Mustacchi 141*75eba5b6SRobert Mustacchi /** 142*75eba5b6SRobert Mustacchi * e1000_set_mac_type - Sets MAC type 143*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 144*75eba5b6SRobert Mustacchi * 145*75eba5b6SRobert Mustacchi * This function sets the mac type of the adapter based on the 146*75eba5b6SRobert Mustacchi * device ID stored in the hw structure. 147*75eba5b6SRobert Mustacchi * MUST BE FIRST FUNCTION CALLED (explicitly or through 148*75eba5b6SRobert Mustacchi * e1000_setup_init_funcs()). 149*75eba5b6SRobert Mustacchi **/ 150*75eba5b6SRobert Mustacchi s32 e1000_set_mac_type(struct e1000_hw *hw) 151*75eba5b6SRobert Mustacchi { 152*75eba5b6SRobert Mustacchi struct e1000_mac_info *mac = &hw->mac; 153*75eba5b6SRobert Mustacchi s32 ret_val = E1000_SUCCESS; 154*75eba5b6SRobert Mustacchi 155*75eba5b6SRobert Mustacchi DEBUGFUNC("e1000_set_mac_type"); 156*75eba5b6SRobert Mustacchi 157*75eba5b6SRobert Mustacchi switch (hw->device_id) { 158*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82542: 159*75eba5b6SRobert Mustacchi mac->type = e1000_82542; 160*75eba5b6SRobert Mustacchi break; 161*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82543GC_FIBER: 162*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82543GC_COPPER: 163*75eba5b6SRobert Mustacchi mac->type = e1000_82543; 164*75eba5b6SRobert Mustacchi break; 165*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82544EI_COPPER: 166*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82544EI_FIBER: 167*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82544GC_COPPER: 168*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82544GC_LOM: 169*75eba5b6SRobert Mustacchi mac->type = e1000_82544; 170*75eba5b6SRobert Mustacchi break; 171*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82540EM: 172*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82540EM_LOM: 173*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82540EP: 174*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82540EP_LOM: 175*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82540EP_LP: 176*75eba5b6SRobert Mustacchi mac->type = e1000_82540; 177*75eba5b6SRobert Mustacchi break; 178*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82545EM_COPPER: 179*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82545EM_FIBER: 180*75eba5b6SRobert Mustacchi mac->type = e1000_82545; 181*75eba5b6SRobert Mustacchi break; 182*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82545GM_COPPER: 183*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82545GM_FIBER: 184*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82545GM_SERDES: 185*75eba5b6SRobert Mustacchi mac->type = e1000_82545_rev_3; 186*75eba5b6SRobert Mustacchi break; 187*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546EB_COPPER: 188*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546EB_FIBER: 189*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546EB_QUAD_COPPER: 190*75eba5b6SRobert Mustacchi mac->type = e1000_82546; 191*75eba5b6SRobert Mustacchi break; 192*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_COPPER: 193*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_FIBER: 194*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_SERDES: 195*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_PCIE: 196*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_QUAD_COPPER: 197*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 198*75eba5b6SRobert Mustacchi mac->type = e1000_82546_rev_3; 199*75eba5b6SRobert Mustacchi break; 200*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541EI: 201*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541EI_MOBILE: 202*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541ER_LOM: 203*75eba5b6SRobert Mustacchi mac->type = e1000_82541; 204*75eba5b6SRobert Mustacchi break; 205*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541ER: 206*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541GI: 207*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541GI_LF: 208*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82541GI_MOBILE: 209*75eba5b6SRobert Mustacchi mac->type = e1000_82541_rev_2; 210*75eba5b6SRobert Mustacchi break; 211*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82547EI: 212*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82547EI_MOBILE: 213*75eba5b6SRobert Mustacchi mac->type = e1000_82547; 214*75eba5b6SRobert Mustacchi break; 215*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82547GI: 216*75eba5b6SRobert Mustacchi mac->type = e1000_82547_rev_2; 217*75eba5b6SRobert Mustacchi break; 218*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_COPPER: 219*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_FIBER: 220*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES: 221*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES_DUAL: 222*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_SERDES_QUAD: 223*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_QUAD_COPPER: 224*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571PT_QUAD_COPPER: 225*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_QUAD_FIBER: 226*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: 227*75eba5b6SRobert Mustacchi mac->type = e1000_82571; 228*75eba5b6SRobert Mustacchi break; 229*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI: 230*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI_COPPER: 231*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI_FIBER: 232*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82572EI_SERDES: 233*75eba5b6SRobert Mustacchi mac->type = e1000_82572; 234*75eba5b6SRobert Mustacchi break; 235*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82573E: 236*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82573E_IAMT: 237*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82573L: 238*75eba5b6SRobert Mustacchi mac->type = e1000_82573; 239*75eba5b6SRobert Mustacchi break; 240*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82574L: 241*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82574LA: 242*75eba5b6SRobert Mustacchi mac->type = e1000_82574; 243*75eba5b6SRobert Mustacchi break; 244*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82583V: 245*75eba5b6SRobert Mustacchi mac->type = e1000_82583; 246*75eba5b6SRobert Mustacchi break; 247*75eba5b6SRobert Mustacchi case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: 248*75eba5b6SRobert Mustacchi case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 249*75eba5b6SRobert Mustacchi case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: 250*75eba5b6SRobert Mustacchi case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: 251*75eba5b6SRobert Mustacchi mac->type = e1000_80003es2lan; 252*75eba5b6SRobert Mustacchi break; 253*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IFE: 254*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IFE_GT: 255*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IFE_G: 256*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IGP_M: 257*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IGP_M_AMT: 258*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IGP_AMT: 259*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_IGP_C: 260*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH8_82567V_3: 261*75eba5b6SRobert Mustacchi mac->type = e1000_ich8lan; 262*75eba5b6SRobert Mustacchi break; 263*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IFE: 264*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IFE_GT: 265*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IFE_G: 266*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IGP_M: 267*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IGP_M_AMT: 268*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IGP_M_V: 269*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IGP_AMT: 270*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_BM: 271*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH9_IGP_C: 272*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_R_BM_LM: 273*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_R_BM_LF: 274*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_R_BM_V: 275*75eba5b6SRobert Mustacchi mac->type = e1000_ich9lan; 276*75eba5b6SRobert Mustacchi break; 277*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_D_BM_LM: 278*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_D_BM_LF: 279*75eba5b6SRobert Mustacchi case E1000_DEV_ID_ICH10_D_BM_V: 280*75eba5b6SRobert Mustacchi mac->type = e1000_ich10lan; 281*75eba5b6SRobert Mustacchi break; 282*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_D_HV_DM: 283*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_D_HV_DC: 284*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_M_HV_LM: 285*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_M_HV_LC: 286*75eba5b6SRobert Mustacchi mac->type = e1000_pchlan; 287*75eba5b6SRobert Mustacchi break; 288*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH2_LV_LM: 289*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH2_LV_V: 290*75eba5b6SRobert Mustacchi mac->type = e1000_pch2lan; 291*75eba5b6SRobert Mustacchi break; 292*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_LPT_I217_LM: 293*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_LPT_I217_V: 294*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_LPTLP_I218_LM: 295*75eba5b6SRobert Mustacchi case E1000_DEV_ID_PCH_LPTLP_I218_V: 296*75eba5b6SRobert Mustacchi mac->type = e1000_pch_lpt; 297*75eba5b6SRobert Mustacchi break; 298*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82575EB_COPPER: 299*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82575EB_FIBER_SERDES: 300*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82575GB_QUAD_COPPER: 301*75eba5b6SRobert Mustacchi mac->type = e1000_82575; 302*75eba5b6SRobert Mustacchi break; 303*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576: 304*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_FIBER: 305*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_SERDES: 306*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_QUAD_COPPER: 307*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_QUAD_COPPER_ET2: 308*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_NS: 309*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_NS_SERDES: 310*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_SERDES_QUAD: 311*75eba5b6SRobert Mustacchi mac->type = e1000_82576; 312*75eba5b6SRobert Mustacchi break; 313*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_COPPER: 314*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_FIBER: 315*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_SERDES: 316*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_SGMII: 317*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_COPPER_DUAL: 318*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82580_QUAD_FIBER: 319*75eba5b6SRobert Mustacchi case E1000_DEV_ID_DH89XXCC_SGMII: 320*75eba5b6SRobert Mustacchi case E1000_DEV_ID_DH89XXCC_SERDES: 321*75eba5b6SRobert Mustacchi case E1000_DEV_ID_DH89XXCC_BACKPLANE: 322*75eba5b6SRobert Mustacchi case E1000_DEV_ID_DH89XXCC_SFP: 323*75eba5b6SRobert Mustacchi mac->type = e1000_82580; 324*75eba5b6SRobert Mustacchi break; 325*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_COPPER: 326*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_FIBER: 327*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_SERDES: 328*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_SGMII: 329*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_DA4: 330*75eba5b6SRobert Mustacchi mac->type = e1000_i350; 331*75eba5b6SRobert Mustacchi break; 332*75eba5b6SRobert Mustacchi #if defined(QV_RELEASE) && defined(SPRINGVILLE_FLASHLESS_HW) 333*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_NVMLESS: 334*75eba5b6SRobert Mustacchi #endif /* QV_RELEASE && SPRINGVILLE_FLASHLESS_HW */ 335*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_COPPER: 336*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_COPPER_OEM1: 337*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_COPPER_IT: 338*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_FIBER: 339*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_SERDES: 340*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I210_SGMII: 341*75eba5b6SRobert Mustacchi mac->type = e1000_i210; 342*75eba5b6SRobert Mustacchi break; 343*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I211_COPPER: 344*75eba5b6SRobert Mustacchi mac->type = e1000_i211; 345*75eba5b6SRobert Mustacchi break; 346*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_VF: 347*75eba5b6SRobert Mustacchi case E1000_DEV_ID_82576_VF_HV: 348*75eba5b6SRobert Mustacchi mac->type = e1000_vfadapt; 349*75eba5b6SRobert Mustacchi break; 350*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_VF: 351*75eba5b6SRobert Mustacchi case E1000_DEV_ID_I350_VF_HV: 352*75eba5b6SRobert Mustacchi mac->type = e1000_vfadapt_i350; 353*75eba5b6SRobert Mustacchi break; 354*75eba5b6SRobert Mustacchi 355*75eba5b6SRobert Mustacchi default: 356*75eba5b6SRobert Mustacchi /* Should never have loaded on this device */ 357*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_MAC_INIT; 358*75eba5b6SRobert Mustacchi break; 359*75eba5b6SRobert Mustacchi } 360*75eba5b6SRobert Mustacchi 361*75eba5b6SRobert Mustacchi return ret_val; 362*75eba5b6SRobert Mustacchi } 363*75eba5b6SRobert Mustacchi 364*75eba5b6SRobert Mustacchi /** 365*75eba5b6SRobert Mustacchi * e1000_setup_init_funcs - Initializes function pointers 366*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 367*75eba5b6SRobert Mustacchi * @init_device: TRUE will initialize the rest of the function pointers 368*75eba5b6SRobert Mustacchi * getting the device ready for use. FALSE will only set 369*75eba5b6SRobert Mustacchi * MAC type and the function pointers for the other init 370*75eba5b6SRobert Mustacchi * functions. Passing FALSE will not generate any hardware 371*75eba5b6SRobert Mustacchi * reads or writes. 372*75eba5b6SRobert Mustacchi * 373*75eba5b6SRobert Mustacchi * This function must be called by a driver in order to use the rest 374*75eba5b6SRobert Mustacchi * of the 'shared' code files. Called by drivers only. 375*75eba5b6SRobert Mustacchi **/ 376*75eba5b6SRobert Mustacchi s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) 377*75eba5b6SRobert Mustacchi { 378*75eba5b6SRobert Mustacchi s32 ret_val; 379*75eba5b6SRobert Mustacchi 380*75eba5b6SRobert Mustacchi /* Can't do much good without knowing the MAC type. */ 381*75eba5b6SRobert Mustacchi ret_val = e1000_set_mac_type(hw); 382*75eba5b6SRobert Mustacchi if (ret_val) { 383*75eba5b6SRobert Mustacchi DEBUGOUT("ERROR: MAC type could not be set properly.\n"); 384*75eba5b6SRobert Mustacchi goto out; 385*75eba5b6SRobert Mustacchi } 386*75eba5b6SRobert Mustacchi 387*75eba5b6SRobert Mustacchi if (!hw->hw_addr) { 388*75eba5b6SRobert Mustacchi DEBUGOUT("ERROR: Registers not mapped\n"); 389*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 390*75eba5b6SRobert Mustacchi goto out; 391*75eba5b6SRobert Mustacchi } 392*75eba5b6SRobert Mustacchi 393*75eba5b6SRobert Mustacchi /* 394*75eba5b6SRobert Mustacchi * Init function pointers to generic implementations. We do this first 395*75eba5b6SRobert Mustacchi * allowing a driver module to override it afterward. 396*75eba5b6SRobert Mustacchi */ 397*75eba5b6SRobert Mustacchi e1000_init_mac_ops_generic(hw); 398*75eba5b6SRobert Mustacchi e1000_init_phy_ops_generic(hw); 399*75eba5b6SRobert Mustacchi e1000_init_nvm_ops_generic(hw); 400*75eba5b6SRobert Mustacchi e1000_init_mbx_ops_generic(hw); 401*75eba5b6SRobert Mustacchi 402*75eba5b6SRobert Mustacchi /* 403*75eba5b6SRobert Mustacchi * Set up the init function pointers. These are functions within the 404*75eba5b6SRobert Mustacchi * adapter family file that sets up function pointers for the rest of 405*75eba5b6SRobert Mustacchi * the functions in that family. 406*75eba5b6SRobert Mustacchi */ 407*75eba5b6SRobert Mustacchi switch (hw->mac.type) { 408*75eba5b6SRobert Mustacchi case e1000_82542: 409*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82542(hw); 410*75eba5b6SRobert Mustacchi break; 411*75eba5b6SRobert Mustacchi case e1000_82543: 412*75eba5b6SRobert Mustacchi case e1000_82544: 413*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82543(hw); 414*75eba5b6SRobert Mustacchi break; 415*75eba5b6SRobert Mustacchi case e1000_82540: 416*75eba5b6SRobert Mustacchi case e1000_82545: 417*75eba5b6SRobert Mustacchi case e1000_82545_rev_3: 418*75eba5b6SRobert Mustacchi case e1000_82546: 419*75eba5b6SRobert Mustacchi case e1000_82546_rev_3: 420*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82540(hw); 421*75eba5b6SRobert Mustacchi break; 422*75eba5b6SRobert Mustacchi case e1000_82541: 423*75eba5b6SRobert Mustacchi case e1000_82541_rev_2: 424*75eba5b6SRobert Mustacchi case e1000_82547: 425*75eba5b6SRobert Mustacchi case e1000_82547_rev_2: 426*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82541(hw); 427*75eba5b6SRobert Mustacchi break; 428*75eba5b6SRobert Mustacchi case e1000_82571: 429*75eba5b6SRobert Mustacchi case e1000_82572: 430*75eba5b6SRobert Mustacchi case e1000_82573: 431*75eba5b6SRobert Mustacchi case e1000_82574: 432*75eba5b6SRobert Mustacchi case e1000_82583: 433*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82571(hw); 434*75eba5b6SRobert Mustacchi break; 435*75eba5b6SRobert Mustacchi case e1000_80003es2lan: 436*75eba5b6SRobert Mustacchi e1000_init_function_pointers_80003es2lan(hw); 437*75eba5b6SRobert Mustacchi break; 438*75eba5b6SRobert Mustacchi case e1000_ich8lan: 439*75eba5b6SRobert Mustacchi case e1000_ich9lan: 440*75eba5b6SRobert Mustacchi case e1000_ich10lan: 441*75eba5b6SRobert Mustacchi case e1000_pchlan: 442*75eba5b6SRobert Mustacchi case e1000_pch2lan: 443*75eba5b6SRobert Mustacchi case e1000_pch_lpt: 444*75eba5b6SRobert Mustacchi e1000_init_function_pointers_ich8lan(hw); 445*75eba5b6SRobert Mustacchi break; 446*75eba5b6SRobert Mustacchi case e1000_82575: 447*75eba5b6SRobert Mustacchi case e1000_82576: 448*75eba5b6SRobert Mustacchi case e1000_82580: 449*75eba5b6SRobert Mustacchi case e1000_i350: 450*75eba5b6SRobert Mustacchi e1000_init_function_pointers_82575(hw); 451*75eba5b6SRobert Mustacchi break; 452*75eba5b6SRobert Mustacchi case e1000_i210: 453*75eba5b6SRobert Mustacchi case e1000_i211: 454*75eba5b6SRobert Mustacchi e1000_init_function_pointers_i210(hw); 455*75eba5b6SRobert Mustacchi break; 456*75eba5b6SRobert Mustacchi case e1000_vfadapt: 457*75eba5b6SRobert Mustacchi e1000_init_function_pointers_vf(hw); 458*75eba5b6SRobert Mustacchi break; 459*75eba5b6SRobert Mustacchi case e1000_vfadapt_i350: 460*75eba5b6SRobert Mustacchi e1000_init_function_pointers_vf(hw); 461*75eba5b6SRobert Mustacchi break; 462*75eba5b6SRobert Mustacchi default: 463*75eba5b6SRobert Mustacchi DEBUGOUT("Hardware not supported\n"); 464*75eba5b6SRobert Mustacchi ret_val = -E1000_ERR_CONFIG; 465*75eba5b6SRobert Mustacchi break; 466*75eba5b6SRobert Mustacchi } 467*75eba5b6SRobert Mustacchi 468*75eba5b6SRobert Mustacchi /* 469*75eba5b6SRobert Mustacchi * Initialize the rest of the function pointers. These require some 470*75eba5b6SRobert Mustacchi * register reads/writes in some cases. 471*75eba5b6SRobert Mustacchi */ 472*75eba5b6SRobert Mustacchi if (!(ret_val) && init_device) { 473*75eba5b6SRobert Mustacchi ret_val = e1000_init_mac_params(hw); 474*75eba5b6SRobert Mustacchi if (ret_val) 475*75eba5b6SRobert Mustacchi goto out; 476*75eba5b6SRobert Mustacchi 477*75eba5b6SRobert Mustacchi ret_val = e1000_init_nvm_params(hw); 478*75eba5b6SRobert Mustacchi if (ret_val) 479*75eba5b6SRobert Mustacchi goto out; 480*75eba5b6SRobert Mustacchi 481*75eba5b6SRobert Mustacchi ret_val = e1000_init_phy_params(hw); 482*75eba5b6SRobert Mustacchi if (ret_val) 483*75eba5b6SRobert Mustacchi goto out; 484*75eba5b6SRobert Mustacchi 485*75eba5b6SRobert Mustacchi ret_val = e1000_init_mbx_params(hw); 486*75eba5b6SRobert Mustacchi if (ret_val) 487*75eba5b6SRobert Mustacchi goto out; 488*75eba5b6SRobert Mustacchi } 489*75eba5b6SRobert Mustacchi 490*75eba5b6SRobert Mustacchi out: 491*75eba5b6SRobert Mustacchi return ret_val; 492*75eba5b6SRobert Mustacchi } 493*75eba5b6SRobert Mustacchi 494*75eba5b6SRobert Mustacchi /** 495*75eba5b6SRobert Mustacchi * e1000_get_bus_info - Obtain bus information for adapter 496*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 497*75eba5b6SRobert Mustacchi * 498*75eba5b6SRobert Mustacchi * This will obtain information about the HW bus for which the 499*75eba5b6SRobert Mustacchi * adapter is attached and stores it in the hw structure. This is a 500*75eba5b6SRobert Mustacchi * function pointer entry point called by drivers. 501*75eba5b6SRobert Mustacchi **/ 502*75eba5b6SRobert Mustacchi s32 e1000_get_bus_info(struct e1000_hw *hw) 503*75eba5b6SRobert Mustacchi { 504*75eba5b6SRobert Mustacchi if (hw->mac.ops.get_bus_info) 505*75eba5b6SRobert Mustacchi return hw->mac.ops.get_bus_info(hw); 506*75eba5b6SRobert Mustacchi 507*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 508*75eba5b6SRobert Mustacchi } 509*75eba5b6SRobert Mustacchi 510*75eba5b6SRobert Mustacchi /** 511*75eba5b6SRobert Mustacchi * e1000_clear_vfta - Clear VLAN filter table 512*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 513*75eba5b6SRobert Mustacchi * 514*75eba5b6SRobert Mustacchi * This clears the VLAN filter table on the adapter. This is a function 515*75eba5b6SRobert Mustacchi * pointer entry point called by drivers. 516*75eba5b6SRobert Mustacchi **/ 517*75eba5b6SRobert Mustacchi void e1000_clear_vfta(struct e1000_hw *hw) 518*75eba5b6SRobert Mustacchi { 519*75eba5b6SRobert Mustacchi if (hw->mac.ops.clear_vfta) 520*75eba5b6SRobert Mustacchi hw->mac.ops.clear_vfta(hw); 521*75eba5b6SRobert Mustacchi } 522*75eba5b6SRobert Mustacchi 523*75eba5b6SRobert Mustacchi /** 524*75eba5b6SRobert Mustacchi * e1000_write_vfta - Write value to VLAN filter table 525*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 526*75eba5b6SRobert Mustacchi * @offset: the 32-bit offset in which to write the value to. 527*75eba5b6SRobert Mustacchi * @value: the 32-bit value to write at location offset. 528*75eba5b6SRobert Mustacchi * 529*75eba5b6SRobert Mustacchi * This writes a 32-bit value to a 32-bit offset in the VLAN filter 530*75eba5b6SRobert Mustacchi * table. This is a function pointer entry point called by drivers. 531*75eba5b6SRobert Mustacchi **/ 532*75eba5b6SRobert Mustacchi void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) 533*75eba5b6SRobert Mustacchi { 534*75eba5b6SRobert Mustacchi if (hw->mac.ops.write_vfta) 535*75eba5b6SRobert Mustacchi hw->mac.ops.write_vfta(hw, offset, value); 536*75eba5b6SRobert Mustacchi } 537*75eba5b6SRobert Mustacchi 538*75eba5b6SRobert Mustacchi /** 539*75eba5b6SRobert Mustacchi * e1000_update_mc_addr_list - Update Multicast addresses 540*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 541*75eba5b6SRobert Mustacchi * @mc_addr_list: array of multicast addresses to program 542*75eba5b6SRobert Mustacchi * @mc_addr_count: number of multicast addresses to program 543*75eba5b6SRobert Mustacchi * 544*75eba5b6SRobert Mustacchi * Updates the Multicast Table Array. 545*75eba5b6SRobert Mustacchi * The caller must have a packed mc_addr_list of multicast addresses. 546*75eba5b6SRobert Mustacchi **/ 547*75eba5b6SRobert Mustacchi void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, 548*75eba5b6SRobert Mustacchi u32 mc_addr_count) 549*75eba5b6SRobert Mustacchi { 550*75eba5b6SRobert Mustacchi if (hw->mac.ops.update_mc_addr_list) 551*75eba5b6SRobert Mustacchi hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, 552*75eba5b6SRobert Mustacchi mc_addr_count); 553*75eba5b6SRobert Mustacchi } 554*75eba5b6SRobert Mustacchi 555*75eba5b6SRobert Mustacchi /** 556*75eba5b6SRobert Mustacchi * e1000_force_mac_fc - Force MAC flow control 557*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 558*75eba5b6SRobert Mustacchi * 559*75eba5b6SRobert Mustacchi * Force the MAC's flow control settings. Currently no func pointer exists 560*75eba5b6SRobert Mustacchi * and all implementations are handled in the generic version of this 561*75eba5b6SRobert Mustacchi * function. 562*75eba5b6SRobert Mustacchi **/ 563*75eba5b6SRobert Mustacchi s32 e1000_force_mac_fc(struct e1000_hw *hw) 564*75eba5b6SRobert Mustacchi { 565*75eba5b6SRobert Mustacchi return e1000_force_mac_fc_generic(hw); 566*75eba5b6SRobert Mustacchi } 567*75eba5b6SRobert Mustacchi 568*75eba5b6SRobert Mustacchi /** 569*75eba5b6SRobert Mustacchi * e1000_check_for_link - Check/Store link connection 570*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 571*75eba5b6SRobert Mustacchi * 572*75eba5b6SRobert Mustacchi * This checks the link condition of the adapter and stores the 573*75eba5b6SRobert Mustacchi * results in the hw->mac structure. This is a function pointer entry 574*75eba5b6SRobert Mustacchi * point called by drivers. 575*75eba5b6SRobert Mustacchi **/ 576*75eba5b6SRobert Mustacchi s32 e1000_check_for_link(struct e1000_hw *hw) 577*75eba5b6SRobert Mustacchi { 578*75eba5b6SRobert Mustacchi if (hw->mac.ops.check_for_link) 579*75eba5b6SRobert Mustacchi return hw->mac.ops.check_for_link(hw); 580*75eba5b6SRobert Mustacchi 581*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 582*75eba5b6SRobert Mustacchi } 583*75eba5b6SRobert Mustacchi 584*75eba5b6SRobert Mustacchi /** 585*75eba5b6SRobert Mustacchi * e1000_check_mng_mode - Check management mode 586*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 587*75eba5b6SRobert Mustacchi * 588*75eba5b6SRobert Mustacchi * This checks if the adapter has manageability enabled. 589*75eba5b6SRobert Mustacchi * This is a function pointer entry point called by drivers. 590*75eba5b6SRobert Mustacchi **/ 591*75eba5b6SRobert Mustacchi bool e1000_check_mng_mode(struct e1000_hw *hw) 592*75eba5b6SRobert Mustacchi { 593*75eba5b6SRobert Mustacchi if (hw->mac.ops.check_mng_mode) 594*75eba5b6SRobert Mustacchi return hw->mac.ops.check_mng_mode(hw); 595*75eba5b6SRobert Mustacchi 596*75eba5b6SRobert Mustacchi return FALSE; 597*75eba5b6SRobert Mustacchi } 598*75eba5b6SRobert Mustacchi 599*75eba5b6SRobert Mustacchi /** 600*75eba5b6SRobert Mustacchi * e1000_mng_write_dhcp_info - Writes DHCP info to host interface 601*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 602*75eba5b6SRobert Mustacchi * @buffer: pointer to the host interface 603*75eba5b6SRobert Mustacchi * @length: size of the buffer 604*75eba5b6SRobert Mustacchi * 605*75eba5b6SRobert Mustacchi * Writes the DHCP information to the host interface. 606*75eba5b6SRobert Mustacchi **/ 607*75eba5b6SRobert Mustacchi s32 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length) 608*75eba5b6SRobert Mustacchi { 609*75eba5b6SRobert Mustacchi return e1000_mng_write_dhcp_info_generic(hw, buffer, length); 610*75eba5b6SRobert Mustacchi } 611*75eba5b6SRobert Mustacchi 612*75eba5b6SRobert Mustacchi /** 613*75eba5b6SRobert Mustacchi * e1000_reset_hw - Reset hardware 614*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 615*75eba5b6SRobert Mustacchi * 616*75eba5b6SRobert Mustacchi * This resets the hardware into a known state. This is a function pointer 617*75eba5b6SRobert Mustacchi * entry point called by drivers. 618*75eba5b6SRobert Mustacchi **/ 619*75eba5b6SRobert Mustacchi s32 e1000_reset_hw(struct e1000_hw *hw) 620*75eba5b6SRobert Mustacchi { 621*75eba5b6SRobert Mustacchi if (hw->mac.ops.reset_hw) 622*75eba5b6SRobert Mustacchi return hw->mac.ops.reset_hw(hw); 623*75eba5b6SRobert Mustacchi 624*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 625*75eba5b6SRobert Mustacchi } 626*75eba5b6SRobert Mustacchi 627*75eba5b6SRobert Mustacchi /** 628*75eba5b6SRobert Mustacchi * e1000_init_hw - Initialize hardware 629*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 630*75eba5b6SRobert Mustacchi * 631*75eba5b6SRobert Mustacchi * This inits the hardware readying it for operation. This is a function 632*75eba5b6SRobert Mustacchi * pointer entry point called by drivers. 633*75eba5b6SRobert Mustacchi **/ 634*75eba5b6SRobert Mustacchi s32 e1000_init_hw(struct e1000_hw *hw) 635*75eba5b6SRobert Mustacchi { 636*75eba5b6SRobert Mustacchi if (hw->mac.ops.init_hw) 637*75eba5b6SRobert Mustacchi return hw->mac.ops.init_hw(hw); 638*75eba5b6SRobert Mustacchi 639*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 640*75eba5b6SRobert Mustacchi } 641*75eba5b6SRobert Mustacchi 642*75eba5b6SRobert Mustacchi /** 643*75eba5b6SRobert Mustacchi * e1000_setup_link - Configures link and flow control 644*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 645*75eba5b6SRobert Mustacchi * 646*75eba5b6SRobert Mustacchi * This configures link and flow control settings for the adapter. This 647*75eba5b6SRobert Mustacchi * is a function pointer entry point called by drivers. While modules can 648*75eba5b6SRobert Mustacchi * also call this, they probably call their own version of this function. 649*75eba5b6SRobert Mustacchi **/ 650*75eba5b6SRobert Mustacchi s32 e1000_setup_link(struct e1000_hw *hw) 651*75eba5b6SRobert Mustacchi { 652*75eba5b6SRobert Mustacchi if (hw->mac.ops.setup_link) 653*75eba5b6SRobert Mustacchi return hw->mac.ops.setup_link(hw); 654*75eba5b6SRobert Mustacchi 655*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 656*75eba5b6SRobert Mustacchi } 657*75eba5b6SRobert Mustacchi 658*75eba5b6SRobert Mustacchi /** 659*75eba5b6SRobert Mustacchi * e1000_get_speed_and_duplex - Returns current speed and duplex 660*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 661*75eba5b6SRobert Mustacchi * @speed: pointer to a 16-bit value to store the speed 662*75eba5b6SRobert Mustacchi * @duplex: pointer to a 16-bit value to store the duplex. 663*75eba5b6SRobert Mustacchi * 664*75eba5b6SRobert Mustacchi * This returns the speed and duplex of the adapter in the two 'out' 665*75eba5b6SRobert Mustacchi * variables passed in. This is a function pointer entry point called 666*75eba5b6SRobert Mustacchi * by drivers. 667*75eba5b6SRobert Mustacchi **/ 668*75eba5b6SRobert Mustacchi s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex) 669*75eba5b6SRobert Mustacchi { 670*75eba5b6SRobert Mustacchi if (hw->mac.ops.get_link_up_info) 671*75eba5b6SRobert Mustacchi return hw->mac.ops.get_link_up_info(hw, speed, duplex); 672*75eba5b6SRobert Mustacchi 673*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 674*75eba5b6SRobert Mustacchi } 675*75eba5b6SRobert Mustacchi 676*75eba5b6SRobert Mustacchi /** 677*75eba5b6SRobert Mustacchi * e1000_setup_led - Configures SW controllable LED 678*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 679*75eba5b6SRobert Mustacchi * 680*75eba5b6SRobert Mustacchi * This prepares the SW controllable LED for use and saves the current state 681*75eba5b6SRobert Mustacchi * of the LED so it can be later restored. This is a function pointer entry 682*75eba5b6SRobert Mustacchi * point called by drivers. 683*75eba5b6SRobert Mustacchi **/ 684*75eba5b6SRobert Mustacchi s32 e1000_setup_led(struct e1000_hw *hw) 685*75eba5b6SRobert Mustacchi { 686*75eba5b6SRobert Mustacchi if (hw->mac.ops.setup_led) 687*75eba5b6SRobert Mustacchi return hw->mac.ops.setup_led(hw); 688*75eba5b6SRobert Mustacchi 689*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 690*75eba5b6SRobert Mustacchi } 691*75eba5b6SRobert Mustacchi 692*75eba5b6SRobert Mustacchi /** 693*75eba5b6SRobert Mustacchi * e1000_cleanup_led - Restores SW controllable LED 694*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 695*75eba5b6SRobert Mustacchi * 696*75eba5b6SRobert Mustacchi * This restores the SW controllable LED to the value saved off by 697*75eba5b6SRobert Mustacchi * e1000_setup_led. This is a function pointer entry point called by drivers. 698*75eba5b6SRobert Mustacchi **/ 699*75eba5b6SRobert Mustacchi s32 e1000_cleanup_led(struct e1000_hw *hw) 700*75eba5b6SRobert Mustacchi { 701*75eba5b6SRobert Mustacchi if (hw->mac.ops.cleanup_led) 702*75eba5b6SRobert Mustacchi return hw->mac.ops.cleanup_led(hw); 703*75eba5b6SRobert Mustacchi 704*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 705*75eba5b6SRobert Mustacchi } 706*75eba5b6SRobert Mustacchi 707*75eba5b6SRobert Mustacchi /** 708*75eba5b6SRobert Mustacchi * e1000_blink_led - Blink SW controllable LED 709*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 710*75eba5b6SRobert Mustacchi * 711*75eba5b6SRobert Mustacchi * This starts the adapter LED blinking. Request the LED to be setup first 712*75eba5b6SRobert Mustacchi * and cleaned up after. This is a function pointer entry point called by 713*75eba5b6SRobert Mustacchi * drivers. 714*75eba5b6SRobert Mustacchi **/ 715*75eba5b6SRobert Mustacchi s32 e1000_blink_led(struct e1000_hw *hw) 716*75eba5b6SRobert Mustacchi { 717*75eba5b6SRobert Mustacchi if (hw->mac.ops.blink_led) 718*75eba5b6SRobert Mustacchi return hw->mac.ops.blink_led(hw); 719*75eba5b6SRobert Mustacchi 720*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 721*75eba5b6SRobert Mustacchi } 722*75eba5b6SRobert Mustacchi 723*75eba5b6SRobert Mustacchi /** 724*75eba5b6SRobert Mustacchi * e1000_id_led_init - store LED configurations in SW 725*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 726*75eba5b6SRobert Mustacchi * 727*75eba5b6SRobert Mustacchi * Initializes the LED config in SW. This is a function pointer entry point 728*75eba5b6SRobert Mustacchi * called by drivers. 729*75eba5b6SRobert Mustacchi **/ 730*75eba5b6SRobert Mustacchi s32 e1000_id_led_init(struct e1000_hw *hw) 731*75eba5b6SRobert Mustacchi { 732*75eba5b6SRobert Mustacchi if (hw->mac.ops.id_led_init) 733*75eba5b6SRobert Mustacchi return hw->mac.ops.id_led_init(hw); 734*75eba5b6SRobert Mustacchi 735*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 736*75eba5b6SRobert Mustacchi } 737*75eba5b6SRobert Mustacchi 738*75eba5b6SRobert Mustacchi /** 739*75eba5b6SRobert Mustacchi * e1000_led_on - Turn on SW controllable LED 740*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 741*75eba5b6SRobert Mustacchi * 742*75eba5b6SRobert Mustacchi * Turns the SW defined LED on. This is a function pointer entry point 743*75eba5b6SRobert Mustacchi * called by drivers. 744*75eba5b6SRobert Mustacchi **/ 745*75eba5b6SRobert Mustacchi s32 e1000_led_on(struct e1000_hw *hw) 746*75eba5b6SRobert Mustacchi { 747*75eba5b6SRobert Mustacchi if (hw->mac.ops.led_on) 748*75eba5b6SRobert Mustacchi return hw->mac.ops.led_on(hw); 749*75eba5b6SRobert Mustacchi 750*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 751*75eba5b6SRobert Mustacchi } 752*75eba5b6SRobert Mustacchi 753*75eba5b6SRobert Mustacchi /** 754*75eba5b6SRobert Mustacchi * e1000_led_off - Turn off SW controllable LED 755*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 756*75eba5b6SRobert Mustacchi * 757*75eba5b6SRobert Mustacchi * Turns the SW defined LED off. This is a function pointer entry point 758*75eba5b6SRobert Mustacchi * called by drivers. 759*75eba5b6SRobert Mustacchi **/ 760*75eba5b6SRobert Mustacchi s32 e1000_led_off(struct e1000_hw *hw) 761*75eba5b6SRobert Mustacchi { 762*75eba5b6SRobert Mustacchi if (hw->mac.ops.led_off) 763*75eba5b6SRobert Mustacchi return hw->mac.ops.led_off(hw); 764*75eba5b6SRobert Mustacchi 765*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 766*75eba5b6SRobert Mustacchi } 767*75eba5b6SRobert Mustacchi 768*75eba5b6SRobert Mustacchi /** 769*75eba5b6SRobert Mustacchi * e1000_reset_adaptive - Reset adaptive IFS 770*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 771*75eba5b6SRobert Mustacchi * 772*75eba5b6SRobert Mustacchi * Resets the adaptive IFS. Currently no func pointer exists and all 773*75eba5b6SRobert Mustacchi * implementations are handled in the generic version of this function. 774*75eba5b6SRobert Mustacchi **/ 775*75eba5b6SRobert Mustacchi void e1000_reset_adaptive(struct e1000_hw *hw) 776*75eba5b6SRobert Mustacchi { 777*75eba5b6SRobert Mustacchi e1000_reset_adaptive_generic(hw); 778*75eba5b6SRobert Mustacchi } 779*75eba5b6SRobert Mustacchi 780*75eba5b6SRobert Mustacchi /** 781*75eba5b6SRobert Mustacchi * e1000_update_adaptive - Update adaptive IFS 782*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 783*75eba5b6SRobert Mustacchi * 784*75eba5b6SRobert Mustacchi * Updates adapter IFS. Currently no func pointer exists and all 785*75eba5b6SRobert Mustacchi * implementations are handled in the generic version of this function. 786*75eba5b6SRobert Mustacchi **/ 787*75eba5b6SRobert Mustacchi void e1000_update_adaptive(struct e1000_hw *hw) 788*75eba5b6SRobert Mustacchi { 789*75eba5b6SRobert Mustacchi e1000_update_adaptive_generic(hw); 790*75eba5b6SRobert Mustacchi } 791*75eba5b6SRobert Mustacchi 792*75eba5b6SRobert Mustacchi /** 793*75eba5b6SRobert Mustacchi * e1000_disable_pcie_master - Disable PCI-Express master access 794*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 795*75eba5b6SRobert Mustacchi * 796*75eba5b6SRobert Mustacchi * Disables PCI-Express master access and verifies there are no pending 797*75eba5b6SRobert Mustacchi * requests. Currently no func pointer exists and all implementations are 798*75eba5b6SRobert Mustacchi * handled in the generic version of this function. 799*75eba5b6SRobert Mustacchi **/ 800*75eba5b6SRobert Mustacchi s32 e1000_disable_pcie_master(struct e1000_hw *hw) 801*75eba5b6SRobert Mustacchi { 802*75eba5b6SRobert Mustacchi return e1000_disable_pcie_master_generic(hw); 803*75eba5b6SRobert Mustacchi } 804*75eba5b6SRobert Mustacchi 805*75eba5b6SRobert Mustacchi /** 806*75eba5b6SRobert Mustacchi * e1000_config_collision_dist - Configure collision distance 807*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 808*75eba5b6SRobert Mustacchi * 809*75eba5b6SRobert Mustacchi * Configures the collision distance to the default value and is used 810*75eba5b6SRobert Mustacchi * during link setup. 811*75eba5b6SRobert Mustacchi **/ 812*75eba5b6SRobert Mustacchi void e1000_config_collision_dist(struct e1000_hw *hw) 813*75eba5b6SRobert Mustacchi { 814*75eba5b6SRobert Mustacchi if (hw->mac.ops.config_collision_dist) 815*75eba5b6SRobert Mustacchi hw->mac.ops.config_collision_dist(hw); 816*75eba5b6SRobert Mustacchi } 817*75eba5b6SRobert Mustacchi 818*75eba5b6SRobert Mustacchi /** 819*75eba5b6SRobert Mustacchi * e1000_rar_set - Sets a receive address register 820*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 821*75eba5b6SRobert Mustacchi * @addr: address to set the RAR to 822*75eba5b6SRobert Mustacchi * @index: the RAR to set 823*75eba5b6SRobert Mustacchi * 824*75eba5b6SRobert Mustacchi * Sets a Receive Address Register (RAR) to the specified address. 825*75eba5b6SRobert Mustacchi **/ 826*75eba5b6SRobert Mustacchi void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) 827*75eba5b6SRobert Mustacchi { 828*75eba5b6SRobert Mustacchi if (hw->mac.ops.rar_set) 829*75eba5b6SRobert Mustacchi hw->mac.ops.rar_set(hw, addr, index); 830*75eba5b6SRobert Mustacchi } 831*75eba5b6SRobert Mustacchi 832*75eba5b6SRobert Mustacchi /** 833*75eba5b6SRobert Mustacchi * e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state 834*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 835*75eba5b6SRobert Mustacchi * 836*75eba5b6SRobert Mustacchi * Ensures that the MDI/MDIX SW state is valid. 837*75eba5b6SRobert Mustacchi **/ 838*75eba5b6SRobert Mustacchi s32 e1000_validate_mdi_setting(struct e1000_hw *hw) 839*75eba5b6SRobert Mustacchi { 840*75eba5b6SRobert Mustacchi if (hw->mac.ops.validate_mdi_setting) 841*75eba5b6SRobert Mustacchi return hw->mac.ops.validate_mdi_setting(hw); 842*75eba5b6SRobert Mustacchi 843*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 844*75eba5b6SRobert Mustacchi } 845*75eba5b6SRobert Mustacchi 846*75eba5b6SRobert Mustacchi /** 847*75eba5b6SRobert Mustacchi * e1000_hash_mc_addr - Determines address location in multicast table 848*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 849*75eba5b6SRobert Mustacchi * @mc_addr: Multicast address to hash. 850*75eba5b6SRobert Mustacchi * 851*75eba5b6SRobert Mustacchi * This hashes an address to determine its location in the multicast 852*75eba5b6SRobert Mustacchi * table. Currently no func pointer exists and all implementations 853*75eba5b6SRobert Mustacchi * are handled in the generic version of this function. 854*75eba5b6SRobert Mustacchi **/ 855*75eba5b6SRobert Mustacchi u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) 856*75eba5b6SRobert Mustacchi { 857*75eba5b6SRobert Mustacchi return e1000_hash_mc_addr_generic(hw, mc_addr); 858*75eba5b6SRobert Mustacchi } 859*75eba5b6SRobert Mustacchi 860*75eba5b6SRobert Mustacchi /** 861*75eba5b6SRobert Mustacchi * e1000_enable_tx_pkt_filtering - Enable packet filtering on TX 862*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 863*75eba5b6SRobert Mustacchi * 864*75eba5b6SRobert Mustacchi * Enables packet filtering on transmit packets if manageability is enabled 865*75eba5b6SRobert Mustacchi * and host interface is enabled. 866*75eba5b6SRobert Mustacchi * Currently no func pointer exists and all implementations are handled in the 867*75eba5b6SRobert Mustacchi * generic version of this function. 868*75eba5b6SRobert Mustacchi **/ 869*75eba5b6SRobert Mustacchi bool e1000_enable_tx_pkt_filtering(struct e1000_hw *hw) 870*75eba5b6SRobert Mustacchi { 871*75eba5b6SRobert Mustacchi return e1000_enable_tx_pkt_filtering_generic(hw); 872*75eba5b6SRobert Mustacchi } 873*75eba5b6SRobert Mustacchi 874*75eba5b6SRobert Mustacchi /** 875*75eba5b6SRobert Mustacchi * e1000_mng_host_if_write - Writes to the manageability host interface 876*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 877*75eba5b6SRobert Mustacchi * @buffer: pointer to the host interface buffer 878*75eba5b6SRobert Mustacchi * @length: size of the buffer 879*75eba5b6SRobert Mustacchi * @offset: location in the buffer to write to 880*75eba5b6SRobert Mustacchi * @sum: sum of the data (not checksum) 881*75eba5b6SRobert Mustacchi * 882*75eba5b6SRobert Mustacchi * This function writes the buffer content at the offset given on the host if. 883*75eba5b6SRobert Mustacchi * It also does alignment considerations to do the writes in most efficient 884*75eba5b6SRobert Mustacchi * way. Also fills up the sum of the buffer in *buffer parameter. 885*75eba5b6SRobert Mustacchi **/ 886*75eba5b6SRobert Mustacchi s32 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length, 887*75eba5b6SRobert Mustacchi u16 offset, u8 *sum) 888*75eba5b6SRobert Mustacchi { 889*75eba5b6SRobert Mustacchi return e1000_mng_host_if_write_generic(hw, buffer, length, offset, sum); 890*75eba5b6SRobert Mustacchi } 891*75eba5b6SRobert Mustacchi 892*75eba5b6SRobert Mustacchi /** 893*75eba5b6SRobert Mustacchi * e1000_mng_write_cmd_header - Writes manageability command header 894*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 895*75eba5b6SRobert Mustacchi * @hdr: pointer to the host interface command header 896*75eba5b6SRobert Mustacchi * 897*75eba5b6SRobert Mustacchi * Writes the command header after does the checksum calculation. 898*75eba5b6SRobert Mustacchi **/ 899*75eba5b6SRobert Mustacchi s32 e1000_mng_write_cmd_header(struct e1000_hw *hw, 900*75eba5b6SRobert Mustacchi struct e1000_host_mng_command_header *hdr) 901*75eba5b6SRobert Mustacchi { 902*75eba5b6SRobert Mustacchi return e1000_mng_write_cmd_header_generic(hw, hdr); 903*75eba5b6SRobert Mustacchi } 904*75eba5b6SRobert Mustacchi 905*75eba5b6SRobert Mustacchi /** 906*75eba5b6SRobert Mustacchi * e1000_mng_enable_host_if - Checks host interface is enabled 907*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 908*75eba5b6SRobert Mustacchi * 909*75eba5b6SRobert Mustacchi * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND 910*75eba5b6SRobert Mustacchi * 911*75eba5b6SRobert Mustacchi * This function checks whether the HOST IF is enabled for command operation 912*75eba5b6SRobert Mustacchi * and also checks whether the previous command is completed. It busy waits 913*75eba5b6SRobert Mustacchi * in case of previous command is not completed. 914*75eba5b6SRobert Mustacchi **/ 915*75eba5b6SRobert Mustacchi s32 e1000_mng_enable_host_if(struct e1000_hw *hw) 916*75eba5b6SRobert Mustacchi { 917*75eba5b6SRobert Mustacchi return e1000_mng_enable_host_if_generic(hw); 918*75eba5b6SRobert Mustacchi } 919*75eba5b6SRobert Mustacchi 920*75eba5b6SRobert Mustacchi /** 921*75eba5b6SRobert Mustacchi * e1000_set_obff_timer - Set Optimized Buffer Flush/Fill timer 922*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 923*75eba5b6SRobert Mustacchi * @itr: u32 indicating itr value 924*75eba5b6SRobert Mustacchi * 925*75eba5b6SRobert Mustacchi * Set the OBFF timer based on the given interrupt rate. 926*75eba5b6SRobert Mustacchi **/ 927*75eba5b6SRobert Mustacchi s32 e1000_set_obff_timer(struct e1000_hw *hw, u32 itr) 928*75eba5b6SRobert Mustacchi { 929*75eba5b6SRobert Mustacchi if (hw->mac.ops.set_obff_timer) 930*75eba5b6SRobert Mustacchi return hw->mac.ops.set_obff_timer(hw, itr); 931*75eba5b6SRobert Mustacchi 932*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 933*75eba5b6SRobert Mustacchi } 934*75eba5b6SRobert Mustacchi 935*75eba5b6SRobert Mustacchi /** 936*75eba5b6SRobert Mustacchi * e1000_check_reset_block - Verifies PHY can be reset 937*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 938*75eba5b6SRobert Mustacchi * 939*75eba5b6SRobert Mustacchi * Checks if the PHY is in a state that can be reset or if manageability 940*75eba5b6SRobert Mustacchi * has it tied up. This is a function pointer entry point called by drivers. 941*75eba5b6SRobert Mustacchi **/ 942*75eba5b6SRobert Mustacchi s32 e1000_check_reset_block(struct e1000_hw *hw) 943*75eba5b6SRobert Mustacchi { 944*75eba5b6SRobert Mustacchi if (hw->phy.ops.check_reset_block) 945*75eba5b6SRobert Mustacchi return hw->phy.ops.check_reset_block(hw); 946*75eba5b6SRobert Mustacchi 947*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 948*75eba5b6SRobert Mustacchi } 949*75eba5b6SRobert Mustacchi 950*75eba5b6SRobert Mustacchi /** 951*75eba5b6SRobert Mustacchi * e1000_read_phy_reg - Reads PHY register 952*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 953*75eba5b6SRobert Mustacchi * @offset: the register to read 954*75eba5b6SRobert Mustacchi * @data: the buffer to store the 16-bit read. 955*75eba5b6SRobert Mustacchi * 956*75eba5b6SRobert Mustacchi * Reads the PHY register and returns the value in data. 957*75eba5b6SRobert Mustacchi * This is a function pointer entry point called by drivers. 958*75eba5b6SRobert Mustacchi **/ 959*75eba5b6SRobert Mustacchi s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) 960*75eba5b6SRobert Mustacchi { 961*75eba5b6SRobert Mustacchi if (hw->phy.ops.read_reg) 962*75eba5b6SRobert Mustacchi return hw->phy.ops.read_reg(hw, offset, data); 963*75eba5b6SRobert Mustacchi 964*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 965*75eba5b6SRobert Mustacchi } 966*75eba5b6SRobert Mustacchi 967*75eba5b6SRobert Mustacchi /** 968*75eba5b6SRobert Mustacchi * e1000_write_phy_reg - Writes PHY register 969*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 970*75eba5b6SRobert Mustacchi * @offset: the register to write 971*75eba5b6SRobert Mustacchi * @data: the value to write. 972*75eba5b6SRobert Mustacchi * 973*75eba5b6SRobert Mustacchi * Writes the PHY register at offset with the value in data. 974*75eba5b6SRobert Mustacchi * This is a function pointer entry point called by drivers. 975*75eba5b6SRobert Mustacchi **/ 976*75eba5b6SRobert Mustacchi s32 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) 977*75eba5b6SRobert Mustacchi { 978*75eba5b6SRobert Mustacchi if (hw->phy.ops.write_reg) 979*75eba5b6SRobert Mustacchi return hw->phy.ops.write_reg(hw, offset, data); 980*75eba5b6SRobert Mustacchi 981*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 982*75eba5b6SRobert Mustacchi } 983*75eba5b6SRobert Mustacchi 984*75eba5b6SRobert Mustacchi /** 985*75eba5b6SRobert Mustacchi * e1000_release_phy - Generic release PHY 986*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 987*75eba5b6SRobert Mustacchi * 988*75eba5b6SRobert Mustacchi * Return if silicon family does not require a semaphore when accessing the 989*75eba5b6SRobert Mustacchi * PHY. 990*75eba5b6SRobert Mustacchi **/ 991*75eba5b6SRobert Mustacchi void e1000_release_phy(struct e1000_hw *hw) 992*75eba5b6SRobert Mustacchi { 993*75eba5b6SRobert Mustacchi if (hw->phy.ops.release) 994*75eba5b6SRobert Mustacchi hw->phy.ops.release(hw); 995*75eba5b6SRobert Mustacchi } 996*75eba5b6SRobert Mustacchi 997*75eba5b6SRobert Mustacchi /** 998*75eba5b6SRobert Mustacchi * e1000_acquire_phy - Generic acquire PHY 999*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1000*75eba5b6SRobert Mustacchi * 1001*75eba5b6SRobert Mustacchi * Return success if silicon family does not require a semaphore when 1002*75eba5b6SRobert Mustacchi * accessing the PHY. 1003*75eba5b6SRobert Mustacchi **/ 1004*75eba5b6SRobert Mustacchi s32 e1000_acquire_phy(struct e1000_hw *hw) 1005*75eba5b6SRobert Mustacchi { 1006*75eba5b6SRobert Mustacchi if (hw->phy.ops.acquire) 1007*75eba5b6SRobert Mustacchi return hw->phy.ops.acquire(hw); 1008*75eba5b6SRobert Mustacchi 1009*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1010*75eba5b6SRobert Mustacchi } 1011*75eba5b6SRobert Mustacchi 1012*75eba5b6SRobert Mustacchi /** 1013*75eba5b6SRobert Mustacchi * e1000_cfg_on_link_up - Configure PHY upon link up 1014*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1015*75eba5b6SRobert Mustacchi **/ 1016*75eba5b6SRobert Mustacchi s32 e1000_cfg_on_link_up(struct e1000_hw *hw) 1017*75eba5b6SRobert Mustacchi { 1018*75eba5b6SRobert Mustacchi if (hw->phy.ops.cfg_on_link_up) 1019*75eba5b6SRobert Mustacchi return hw->phy.ops.cfg_on_link_up(hw); 1020*75eba5b6SRobert Mustacchi 1021*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1022*75eba5b6SRobert Mustacchi } 1023*75eba5b6SRobert Mustacchi 1024*75eba5b6SRobert Mustacchi /** 1025*75eba5b6SRobert Mustacchi * e1000_read_kmrn_reg - Reads register using Kumeran interface 1026*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1027*75eba5b6SRobert Mustacchi * @offset: the register to read 1028*75eba5b6SRobert Mustacchi * @data: the location to store the 16-bit value read. 1029*75eba5b6SRobert Mustacchi * 1030*75eba5b6SRobert Mustacchi * Reads a register out of the Kumeran interface. Currently no func pointer 1031*75eba5b6SRobert Mustacchi * exists and all implementations are handled in the generic version of 1032*75eba5b6SRobert Mustacchi * this function. 1033*75eba5b6SRobert Mustacchi **/ 1034*75eba5b6SRobert Mustacchi s32 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) 1035*75eba5b6SRobert Mustacchi { 1036*75eba5b6SRobert Mustacchi return e1000_read_kmrn_reg_generic(hw, offset, data); 1037*75eba5b6SRobert Mustacchi } 1038*75eba5b6SRobert Mustacchi 1039*75eba5b6SRobert Mustacchi /** 1040*75eba5b6SRobert Mustacchi * e1000_write_kmrn_reg - Writes register using Kumeran interface 1041*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1042*75eba5b6SRobert Mustacchi * @offset: the register to write 1043*75eba5b6SRobert Mustacchi * @data: the value to write. 1044*75eba5b6SRobert Mustacchi * 1045*75eba5b6SRobert Mustacchi * Writes a register to the Kumeran interface. Currently no func pointer 1046*75eba5b6SRobert Mustacchi * exists and all implementations are handled in the generic version of 1047*75eba5b6SRobert Mustacchi * this function. 1048*75eba5b6SRobert Mustacchi **/ 1049*75eba5b6SRobert Mustacchi s32 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) 1050*75eba5b6SRobert Mustacchi { 1051*75eba5b6SRobert Mustacchi return e1000_write_kmrn_reg_generic(hw, offset, data); 1052*75eba5b6SRobert Mustacchi } 1053*75eba5b6SRobert Mustacchi 1054*75eba5b6SRobert Mustacchi /** 1055*75eba5b6SRobert Mustacchi * e1000_get_cable_length - Retrieves cable length estimation 1056*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1057*75eba5b6SRobert Mustacchi * 1058*75eba5b6SRobert Mustacchi * This function estimates the cable length and stores them in 1059*75eba5b6SRobert Mustacchi * hw->phy.min_length and hw->phy.max_length. This is a function pointer 1060*75eba5b6SRobert Mustacchi * entry point called by drivers. 1061*75eba5b6SRobert Mustacchi **/ 1062*75eba5b6SRobert Mustacchi s32 e1000_get_cable_length(struct e1000_hw *hw) 1063*75eba5b6SRobert Mustacchi { 1064*75eba5b6SRobert Mustacchi if (hw->phy.ops.get_cable_length) 1065*75eba5b6SRobert Mustacchi return hw->phy.ops.get_cable_length(hw); 1066*75eba5b6SRobert Mustacchi 1067*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1068*75eba5b6SRobert Mustacchi } 1069*75eba5b6SRobert Mustacchi 1070*75eba5b6SRobert Mustacchi /** 1071*75eba5b6SRobert Mustacchi * e1000_get_phy_info - Retrieves PHY information from registers 1072*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1073*75eba5b6SRobert Mustacchi * 1074*75eba5b6SRobert Mustacchi * This function gets some information from various PHY registers and 1075*75eba5b6SRobert Mustacchi * populates hw->phy values with it. This is a function pointer entry 1076*75eba5b6SRobert Mustacchi * point called by drivers. 1077*75eba5b6SRobert Mustacchi **/ 1078*75eba5b6SRobert Mustacchi s32 e1000_get_phy_info(struct e1000_hw *hw) 1079*75eba5b6SRobert Mustacchi { 1080*75eba5b6SRobert Mustacchi if (hw->phy.ops.get_info) 1081*75eba5b6SRobert Mustacchi return hw->phy.ops.get_info(hw); 1082*75eba5b6SRobert Mustacchi 1083*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1084*75eba5b6SRobert Mustacchi } 1085*75eba5b6SRobert Mustacchi 1086*75eba5b6SRobert Mustacchi /** 1087*75eba5b6SRobert Mustacchi * e1000_phy_hw_reset - Hard PHY reset 1088*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1089*75eba5b6SRobert Mustacchi * 1090*75eba5b6SRobert Mustacchi * Performs a hard PHY reset. This is a function pointer entry point called 1091*75eba5b6SRobert Mustacchi * by drivers. 1092*75eba5b6SRobert Mustacchi **/ 1093*75eba5b6SRobert Mustacchi s32 e1000_phy_hw_reset(struct e1000_hw *hw) 1094*75eba5b6SRobert Mustacchi { 1095*75eba5b6SRobert Mustacchi if (hw->phy.ops.reset) 1096*75eba5b6SRobert Mustacchi return hw->phy.ops.reset(hw); 1097*75eba5b6SRobert Mustacchi 1098*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1099*75eba5b6SRobert Mustacchi } 1100*75eba5b6SRobert Mustacchi 1101*75eba5b6SRobert Mustacchi /** 1102*75eba5b6SRobert Mustacchi * e1000_phy_commit - Soft PHY reset 1103*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1104*75eba5b6SRobert Mustacchi * 1105*75eba5b6SRobert Mustacchi * Performs a soft PHY reset on those that apply. This is a function pointer 1106*75eba5b6SRobert Mustacchi * entry point called by drivers. 1107*75eba5b6SRobert Mustacchi **/ 1108*75eba5b6SRobert Mustacchi s32 e1000_phy_commit(struct e1000_hw *hw) 1109*75eba5b6SRobert Mustacchi { 1110*75eba5b6SRobert Mustacchi if (hw->phy.ops.commit) 1111*75eba5b6SRobert Mustacchi return hw->phy.ops.commit(hw); 1112*75eba5b6SRobert Mustacchi 1113*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1114*75eba5b6SRobert Mustacchi } 1115*75eba5b6SRobert Mustacchi 1116*75eba5b6SRobert Mustacchi /** 1117*75eba5b6SRobert Mustacchi * e1000_set_d0_lplu_state - Sets low power link up state for D0 1118*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1119*75eba5b6SRobert Mustacchi * @active: boolean used to enable/disable lplu 1120*75eba5b6SRobert Mustacchi * 1121*75eba5b6SRobert Mustacchi * Success returns 0, Failure returns 1 1122*75eba5b6SRobert Mustacchi * 1123*75eba5b6SRobert Mustacchi * The low power link up (lplu) state is set to the power management level D0 1124*75eba5b6SRobert Mustacchi * and SmartSpeed is disabled when active is TRUE, else clear lplu for D0 1125*75eba5b6SRobert Mustacchi * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 1126*75eba5b6SRobert Mustacchi * is used during Dx states where the power conservation is most important. 1127*75eba5b6SRobert Mustacchi * During driver activity, SmartSpeed should be enabled so performance is 1128*75eba5b6SRobert Mustacchi * maintained. This is a function pointer entry point called by drivers. 1129*75eba5b6SRobert Mustacchi **/ 1130*75eba5b6SRobert Mustacchi s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) 1131*75eba5b6SRobert Mustacchi { 1132*75eba5b6SRobert Mustacchi if (hw->phy.ops.set_d0_lplu_state) 1133*75eba5b6SRobert Mustacchi return hw->phy.ops.set_d0_lplu_state(hw, active); 1134*75eba5b6SRobert Mustacchi 1135*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1136*75eba5b6SRobert Mustacchi } 1137*75eba5b6SRobert Mustacchi 1138*75eba5b6SRobert Mustacchi /** 1139*75eba5b6SRobert Mustacchi * e1000_set_d3_lplu_state - Sets low power link up state for D3 1140*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1141*75eba5b6SRobert Mustacchi * @active: boolean used to enable/disable lplu 1142*75eba5b6SRobert Mustacchi * 1143*75eba5b6SRobert Mustacchi * Success returns 0, Failure returns 1 1144*75eba5b6SRobert Mustacchi * 1145*75eba5b6SRobert Mustacchi * The low power link up (lplu) state is set to the power management level D3 1146*75eba5b6SRobert Mustacchi * and SmartSpeed is disabled when active is TRUE, else clear lplu for D3 1147*75eba5b6SRobert Mustacchi * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 1148*75eba5b6SRobert Mustacchi * is used during Dx states where the power conservation is most important. 1149*75eba5b6SRobert Mustacchi * During driver activity, SmartSpeed should be enabled so performance is 1150*75eba5b6SRobert Mustacchi * maintained. This is a function pointer entry point called by drivers. 1151*75eba5b6SRobert Mustacchi **/ 1152*75eba5b6SRobert Mustacchi s32 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active) 1153*75eba5b6SRobert Mustacchi { 1154*75eba5b6SRobert Mustacchi if (hw->phy.ops.set_d3_lplu_state) 1155*75eba5b6SRobert Mustacchi return hw->phy.ops.set_d3_lplu_state(hw, active); 1156*75eba5b6SRobert Mustacchi 1157*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1158*75eba5b6SRobert Mustacchi } 1159*75eba5b6SRobert Mustacchi 1160*75eba5b6SRobert Mustacchi /** 1161*75eba5b6SRobert Mustacchi * e1000_read_mac_addr - Reads MAC address 1162*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1163*75eba5b6SRobert Mustacchi * 1164*75eba5b6SRobert Mustacchi * Reads the MAC address out of the adapter and stores it in the HW structure. 1165*75eba5b6SRobert Mustacchi * Currently no func pointer exists and all implementations are handled in the 1166*75eba5b6SRobert Mustacchi * generic version of this function. 1167*75eba5b6SRobert Mustacchi **/ 1168*75eba5b6SRobert Mustacchi s32 e1000_read_mac_addr(struct e1000_hw *hw) 1169*75eba5b6SRobert Mustacchi { 1170*75eba5b6SRobert Mustacchi if (hw->mac.ops.read_mac_addr) 1171*75eba5b6SRobert Mustacchi return hw->mac.ops.read_mac_addr(hw); 1172*75eba5b6SRobert Mustacchi 1173*75eba5b6SRobert Mustacchi return e1000_read_mac_addr_generic(hw); 1174*75eba5b6SRobert Mustacchi } 1175*75eba5b6SRobert Mustacchi 1176*75eba5b6SRobert Mustacchi /** 1177*75eba5b6SRobert Mustacchi * e1000_read_pba_string - Read device part number string 1178*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1179*75eba5b6SRobert Mustacchi * @pba_num: pointer to device part number 1180*75eba5b6SRobert Mustacchi * @pba_num_size: size of part number buffer 1181*75eba5b6SRobert Mustacchi * 1182*75eba5b6SRobert Mustacchi * Reads the product board assembly (PBA) number from the EEPROM and stores 1183*75eba5b6SRobert Mustacchi * the value in pba_num. 1184*75eba5b6SRobert Mustacchi * Currently no func pointer exists and all implementations are handled in the 1185*75eba5b6SRobert Mustacchi * generic version of this function. 1186*75eba5b6SRobert Mustacchi **/ 1187*75eba5b6SRobert Mustacchi s32 e1000_read_pba_string(struct e1000_hw *hw, u8 *pba_num, u32 pba_num_size) 1188*75eba5b6SRobert Mustacchi { 1189*75eba5b6SRobert Mustacchi return e1000_read_pba_string_generic(hw, pba_num, pba_num_size); 1190*75eba5b6SRobert Mustacchi } 1191*75eba5b6SRobert Mustacchi 1192*75eba5b6SRobert Mustacchi /** 1193*75eba5b6SRobert Mustacchi * e1000_read_pba_length - Read device part number string length 1194*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1195*75eba5b6SRobert Mustacchi * @pba_num_size: size of part number buffer 1196*75eba5b6SRobert Mustacchi * 1197*75eba5b6SRobert Mustacchi * Reads the product board assembly (PBA) number length from the EEPROM and 1198*75eba5b6SRobert Mustacchi * stores the value in pba_num. 1199*75eba5b6SRobert Mustacchi * Currently no func pointer exists and all implementations are handled in the 1200*75eba5b6SRobert Mustacchi * generic version of this function. 1201*75eba5b6SRobert Mustacchi **/ 1202*75eba5b6SRobert Mustacchi s32 e1000_read_pba_length(struct e1000_hw *hw, u32 *pba_num_size) 1203*75eba5b6SRobert Mustacchi { 1204*75eba5b6SRobert Mustacchi return e1000_read_pba_length_generic(hw, pba_num_size); 1205*75eba5b6SRobert Mustacchi } 1206*75eba5b6SRobert Mustacchi 1207*75eba5b6SRobert Mustacchi /** 1208*75eba5b6SRobert Mustacchi * e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum 1209*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1210*75eba5b6SRobert Mustacchi * 1211*75eba5b6SRobert Mustacchi * Validates the NVM checksum is correct. This is a function pointer entry 1212*75eba5b6SRobert Mustacchi * point called by drivers. 1213*75eba5b6SRobert Mustacchi **/ 1214*75eba5b6SRobert Mustacchi s32 e1000_validate_nvm_checksum(struct e1000_hw *hw) 1215*75eba5b6SRobert Mustacchi { 1216*75eba5b6SRobert Mustacchi if (hw->nvm.ops.validate) 1217*75eba5b6SRobert Mustacchi return hw->nvm.ops.validate(hw); 1218*75eba5b6SRobert Mustacchi 1219*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 1220*75eba5b6SRobert Mustacchi } 1221*75eba5b6SRobert Mustacchi 1222*75eba5b6SRobert Mustacchi /** 1223*75eba5b6SRobert Mustacchi * e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum 1224*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1225*75eba5b6SRobert Mustacchi * 1226*75eba5b6SRobert Mustacchi * Updates the NVM checksum. Currently no func pointer exists and all 1227*75eba5b6SRobert Mustacchi * implementations are handled in the generic version of this function. 1228*75eba5b6SRobert Mustacchi **/ 1229*75eba5b6SRobert Mustacchi s32 e1000_update_nvm_checksum(struct e1000_hw *hw) 1230*75eba5b6SRobert Mustacchi { 1231*75eba5b6SRobert Mustacchi if (hw->nvm.ops.update) 1232*75eba5b6SRobert Mustacchi return hw->nvm.ops.update(hw); 1233*75eba5b6SRobert Mustacchi 1234*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 1235*75eba5b6SRobert Mustacchi } 1236*75eba5b6SRobert Mustacchi 1237*75eba5b6SRobert Mustacchi /** 1238*75eba5b6SRobert Mustacchi * e1000_reload_nvm - Reloads EEPROM 1239*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1240*75eba5b6SRobert Mustacchi * 1241*75eba5b6SRobert Mustacchi * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the 1242*75eba5b6SRobert Mustacchi * extended control register. 1243*75eba5b6SRobert Mustacchi **/ 1244*75eba5b6SRobert Mustacchi void e1000_reload_nvm(struct e1000_hw *hw) 1245*75eba5b6SRobert Mustacchi { 1246*75eba5b6SRobert Mustacchi if (hw->nvm.ops.reload) 1247*75eba5b6SRobert Mustacchi hw->nvm.ops.reload(hw); 1248*75eba5b6SRobert Mustacchi } 1249*75eba5b6SRobert Mustacchi 1250*75eba5b6SRobert Mustacchi /** 1251*75eba5b6SRobert Mustacchi * e1000_read_nvm - Reads NVM (EEPROM) 1252*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1253*75eba5b6SRobert Mustacchi * @offset: the word offset to read 1254*75eba5b6SRobert Mustacchi * @words: number of 16-bit words to read 1255*75eba5b6SRobert Mustacchi * @data: pointer to the properly sized buffer for the data. 1256*75eba5b6SRobert Mustacchi * 1257*75eba5b6SRobert Mustacchi * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function 1258*75eba5b6SRobert Mustacchi * pointer entry point called by drivers. 1259*75eba5b6SRobert Mustacchi **/ 1260*75eba5b6SRobert Mustacchi s32 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 1261*75eba5b6SRobert Mustacchi { 1262*75eba5b6SRobert Mustacchi if (hw->nvm.ops.read) 1263*75eba5b6SRobert Mustacchi return hw->nvm.ops.read(hw, offset, words, data); 1264*75eba5b6SRobert Mustacchi 1265*75eba5b6SRobert Mustacchi return -E1000_ERR_CONFIG; 1266*75eba5b6SRobert Mustacchi } 1267*75eba5b6SRobert Mustacchi 1268*75eba5b6SRobert Mustacchi /** 1269*75eba5b6SRobert Mustacchi * e1000_write_nvm - Writes to NVM (EEPROM) 1270*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1271*75eba5b6SRobert Mustacchi * @offset: the word offset to read 1272*75eba5b6SRobert Mustacchi * @words: number of 16-bit words to write 1273*75eba5b6SRobert Mustacchi * @data: pointer to the properly sized buffer for the data. 1274*75eba5b6SRobert Mustacchi * 1275*75eba5b6SRobert Mustacchi * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function 1276*75eba5b6SRobert Mustacchi * pointer entry point called by drivers. 1277*75eba5b6SRobert Mustacchi **/ 1278*75eba5b6SRobert Mustacchi s32 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 1279*75eba5b6SRobert Mustacchi { 1280*75eba5b6SRobert Mustacchi if (hw->nvm.ops.write) 1281*75eba5b6SRobert Mustacchi return hw->nvm.ops.write(hw, offset, words, data); 1282*75eba5b6SRobert Mustacchi 1283*75eba5b6SRobert Mustacchi return E1000_SUCCESS; 1284*75eba5b6SRobert Mustacchi } 1285*75eba5b6SRobert Mustacchi 1286*75eba5b6SRobert Mustacchi /** 1287*75eba5b6SRobert Mustacchi * e1000_write_8bit_ctrl_reg - Writes 8bit Control register 1288*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1289*75eba5b6SRobert Mustacchi * @reg: 32bit register offset 1290*75eba5b6SRobert Mustacchi * @offset: the register to write 1291*75eba5b6SRobert Mustacchi * @data: the value to write. 1292*75eba5b6SRobert Mustacchi * 1293*75eba5b6SRobert Mustacchi * Writes the PHY register at offset with the value in data. 1294*75eba5b6SRobert Mustacchi * This is a function pointer entry point called by drivers. 1295*75eba5b6SRobert Mustacchi **/ 1296*75eba5b6SRobert Mustacchi s32 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, u32 offset, 1297*75eba5b6SRobert Mustacchi u8 data) 1298*75eba5b6SRobert Mustacchi { 1299*75eba5b6SRobert Mustacchi return e1000_write_8bit_ctrl_reg_generic(hw, reg, offset, data); 1300*75eba5b6SRobert Mustacchi } 1301*75eba5b6SRobert Mustacchi 1302*75eba5b6SRobert Mustacchi /** 1303*75eba5b6SRobert Mustacchi * e1000_power_up_phy - Restores link in case of PHY power down 1304*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1305*75eba5b6SRobert Mustacchi * 1306*75eba5b6SRobert Mustacchi * The phy may be powered down to save power, to turn off link when the 1307*75eba5b6SRobert Mustacchi * driver is unloaded, or wake on lan is not enabled (among others). 1308*75eba5b6SRobert Mustacchi **/ 1309*75eba5b6SRobert Mustacchi void e1000_power_up_phy(struct e1000_hw *hw) 1310*75eba5b6SRobert Mustacchi { 1311*75eba5b6SRobert Mustacchi if (hw->phy.ops.power_up) 1312*75eba5b6SRobert Mustacchi hw->phy.ops.power_up(hw); 1313*75eba5b6SRobert Mustacchi 1314*75eba5b6SRobert Mustacchi e1000_setup_link(hw); 1315*75eba5b6SRobert Mustacchi } 1316*75eba5b6SRobert Mustacchi 1317*75eba5b6SRobert Mustacchi /** 1318*75eba5b6SRobert Mustacchi * e1000_power_down_phy - Power down PHY 1319*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1320*75eba5b6SRobert Mustacchi * 1321*75eba5b6SRobert Mustacchi * The phy may be powered down to save power, to turn off link when the 1322*75eba5b6SRobert Mustacchi * driver is unloaded, or wake on lan is not enabled (among others). 1323*75eba5b6SRobert Mustacchi **/ 1324*75eba5b6SRobert Mustacchi void e1000_power_down_phy(struct e1000_hw *hw) 1325*75eba5b6SRobert Mustacchi { 1326*75eba5b6SRobert Mustacchi if (hw->phy.ops.power_down) 1327*75eba5b6SRobert Mustacchi hw->phy.ops.power_down(hw); 1328*75eba5b6SRobert Mustacchi } 1329*75eba5b6SRobert Mustacchi 1330*75eba5b6SRobert Mustacchi /** 1331*75eba5b6SRobert Mustacchi * e1000_power_up_fiber_serdes_link - Power up serdes link 1332*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1333*75eba5b6SRobert Mustacchi * 1334*75eba5b6SRobert Mustacchi * Power on the optics and PCS. 1335*75eba5b6SRobert Mustacchi **/ 1336*75eba5b6SRobert Mustacchi void e1000_power_up_fiber_serdes_link(struct e1000_hw *hw) 1337*75eba5b6SRobert Mustacchi { 1338*75eba5b6SRobert Mustacchi if (hw->mac.ops.power_up_serdes) 1339*75eba5b6SRobert Mustacchi hw->mac.ops.power_up_serdes(hw); 1340*75eba5b6SRobert Mustacchi } 1341*75eba5b6SRobert Mustacchi 1342*75eba5b6SRobert Mustacchi /** 1343*75eba5b6SRobert Mustacchi * e1000_shutdown_fiber_serdes_link - Remove link during power down 1344*75eba5b6SRobert Mustacchi * @hw: pointer to the HW structure 1345*75eba5b6SRobert Mustacchi * 1346*75eba5b6SRobert Mustacchi * Shutdown the optics and PCS on driver unload. 1347*75eba5b6SRobert Mustacchi **/ 1348*75eba5b6SRobert Mustacchi void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw) 1349*75eba5b6SRobert Mustacchi { 1350*75eba5b6SRobert Mustacchi if (hw->mac.ops.shutdown_serdes) 1351*75eba5b6SRobert Mustacchi hw->mac.ops.shutdown_serdes(hw); 1352*75eba5b6SRobert Mustacchi } 1353*75eba5b6SRobert Mustacchi 1354