1*517904deSPeter Grehan /*- 2*517904deSPeter Grehan * Copyright 2021 Intel Corp 3*517904deSPeter Grehan * Copyright 2021 Rubicon Communications, LLC (Netgate) 4*517904deSPeter Grehan * SPDX-License-Identifier: BSD-3-Clause 5*517904deSPeter Grehan */ 6*517904deSPeter Grehan 7*517904deSPeter Grehan #include <sys/cdefs.h> 8*517904deSPeter Grehan __FBSDID("$FreeBSD$"); 9*517904deSPeter Grehan 10*517904deSPeter Grehan #include "igc_api.h" 11*517904deSPeter Grehan 12*517904deSPeter Grehan /** 13*517904deSPeter Grehan * igc_init_mac_params - Initialize MAC function pointers 14*517904deSPeter Grehan * @hw: pointer to the HW structure 15*517904deSPeter Grehan * 16*517904deSPeter Grehan * This function initializes the function pointers for the MAC 17*517904deSPeter Grehan * set of functions. Called by drivers or by igc_setup_init_funcs. 18*517904deSPeter Grehan **/ 19*517904deSPeter Grehan s32 igc_init_mac_params(struct igc_hw *hw) 20*517904deSPeter Grehan { 21*517904deSPeter Grehan s32 ret_val = IGC_SUCCESS; 22*517904deSPeter Grehan 23*517904deSPeter Grehan if (hw->mac.ops.init_params) { 24*517904deSPeter Grehan ret_val = hw->mac.ops.init_params(hw); 25*517904deSPeter Grehan if (ret_val) { 26*517904deSPeter Grehan DEBUGOUT("MAC Initialization Error\n"); 27*517904deSPeter Grehan goto out; 28*517904deSPeter Grehan } 29*517904deSPeter Grehan } else { 30*517904deSPeter Grehan DEBUGOUT("mac.init_mac_params was NULL\n"); 31*517904deSPeter Grehan ret_val = -IGC_ERR_CONFIG; 32*517904deSPeter Grehan } 33*517904deSPeter Grehan 34*517904deSPeter Grehan out: 35*517904deSPeter Grehan return ret_val; 36*517904deSPeter Grehan } 37*517904deSPeter Grehan 38*517904deSPeter Grehan /** 39*517904deSPeter Grehan * igc_init_nvm_params - Initialize NVM function pointers 40*517904deSPeter Grehan * @hw: pointer to the HW structure 41*517904deSPeter Grehan * 42*517904deSPeter Grehan * This function initializes the function pointers for the NVM 43*517904deSPeter Grehan * set of functions. Called by drivers or by igc_setup_init_funcs. 44*517904deSPeter Grehan **/ 45*517904deSPeter Grehan s32 igc_init_nvm_params(struct igc_hw *hw) 46*517904deSPeter Grehan { 47*517904deSPeter Grehan s32 ret_val = IGC_SUCCESS; 48*517904deSPeter Grehan 49*517904deSPeter Grehan if (hw->nvm.ops.init_params) { 50*517904deSPeter Grehan ret_val = hw->nvm.ops.init_params(hw); 51*517904deSPeter Grehan if (ret_val) { 52*517904deSPeter Grehan DEBUGOUT("NVM Initialization Error\n"); 53*517904deSPeter Grehan goto out; 54*517904deSPeter Grehan } 55*517904deSPeter Grehan } else { 56*517904deSPeter Grehan DEBUGOUT("nvm.init_nvm_params was NULL\n"); 57*517904deSPeter Grehan ret_val = -IGC_ERR_CONFIG; 58*517904deSPeter Grehan } 59*517904deSPeter Grehan 60*517904deSPeter Grehan out: 61*517904deSPeter Grehan return ret_val; 62*517904deSPeter Grehan } 63*517904deSPeter Grehan 64*517904deSPeter Grehan /** 65*517904deSPeter Grehan * igc_init_phy_params - Initialize PHY function pointers 66*517904deSPeter Grehan * @hw: pointer to the HW structure 67*517904deSPeter Grehan * 68*517904deSPeter Grehan * This function initializes the function pointers for the PHY 69*517904deSPeter Grehan * set of functions. Called by drivers or by igc_setup_init_funcs. 70*517904deSPeter Grehan **/ 71*517904deSPeter Grehan s32 igc_init_phy_params(struct igc_hw *hw) 72*517904deSPeter Grehan { 73*517904deSPeter Grehan s32 ret_val = IGC_SUCCESS; 74*517904deSPeter Grehan 75*517904deSPeter Grehan if (hw->phy.ops.init_params) { 76*517904deSPeter Grehan ret_val = hw->phy.ops.init_params(hw); 77*517904deSPeter Grehan if (ret_val) { 78*517904deSPeter Grehan DEBUGOUT("PHY Initialization Error\n"); 79*517904deSPeter Grehan goto out; 80*517904deSPeter Grehan } 81*517904deSPeter Grehan } else { 82*517904deSPeter Grehan DEBUGOUT("phy.init_phy_params was NULL\n"); 83*517904deSPeter Grehan ret_val = -IGC_ERR_CONFIG; 84*517904deSPeter Grehan } 85*517904deSPeter Grehan 86*517904deSPeter Grehan out: 87*517904deSPeter Grehan return ret_val; 88*517904deSPeter Grehan } 89*517904deSPeter Grehan 90*517904deSPeter Grehan /** 91*517904deSPeter Grehan * igc_set_mac_type - Sets MAC type 92*517904deSPeter Grehan * @hw: pointer to the HW structure 93*517904deSPeter Grehan * 94*517904deSPeter Grehan * This function sets the mac type of the adapter based on the 95*517904deSPeter Grehan * device ID stored in the hw structure. 96*517904deSPeter Grehan * MUST BE FIRST FUNCTION CALLED (explicitly or through 97*517904deSPeter Grehan * igc_setup_init_funcs()). 98*517904deSPeter Grehan **/ 99*517904deSPeter Grehan s32 igc_set_mac_type(struct igc_hw *hw) 100*517904deSPeter Grehan { 101*517904deSPeter Grehan struct igc_mac_info *mac = &hw->mac; 102*517904deSPeter Grehan s32 ret_val = IGC_SUCCESS; 103*517904deSPeter Grehan 104*517904deSPeter Grehan DEBUGFUNC("igc_set_mac_type"); 105*517904deSPeter Grehan 106*517904deSPeter Grehan switch (hw->device_id) { 107*517904deSPeter Grehan case IGC_DEV_ID_I225_LM: 108*517904deSPeter Grehan case IGC_DEV_ID_I225_V: 109*517904deSPeter Grehan case IGC_DEV_ID_I225_K: 110*517904deSPeter Grehan case IGC_DEV_ID_I225_I: 111*517904deSPeter Grehan case IGC_DEV_ID_I220_V: 112*517904deSPeter Grehan case IGC_DEV_ID_I225_K2: 113*517904deSPeter Grehan case IGC_DEV_ID_I225_LMVP: 114*517904deSPeter Grehan case IGC_DEV_ID_I225_IT: 115*517904deSPeter Grehan case IGC_DEV_ID_I226_LM: 116*517904deSPeter Grehan case IGC_DEV_ID_I226_V: 117*517904deSPeter Grehan case IGC_DEV_ID_I226_IT: 118*517904deSPeter Grehan case IGC_DEV_ID_I221_V: 119*517904deSPeter Grehan case IGC_DEV_ID_I226_BLANK_NVM: 120*517904deSPeter Grehan case IGC_DEV_ID_I225_BLANK_NVM: 121*517904deSPeter Grehan mac->type = igc_i225; 122*517904deSPeter Grehan break; 123*517904deSPeter Grehan default: 124*517904deSPeter Grehan /* Should never have loaded on this device */ 125*517904deSPeter Grehan ret_val = -IGC_ERR_MAC_INIT; 126*517904deSPeter Grehan break; 127*517904deSPeter Grehan } 128*517904deSPeter Grehan 129*517904deSPeter Grehan return ret_val; 130*517904deSPeter Grehan } 131*517904deSPeter Grehan 132*517904deSPeter Grehan /** 133*517904deSPeter Grehan * igc_setup_init_funcs - Initializes function pointers 134*517904deSPeter Grehan * @hw: pointer to the HW structure 135*517904deSPeter Grehan * @init_device: true will initialize the rest of the function pointers 136*517904deSPeter Grehan * getting the device ready for use. FALSE will only set 137*517904deSPeter Grehan * MAC type and the function pointers for the other init 138*517904deSPeter Grehan * functions. Passing FALSE will not generate any hardware 139*517904deSPeter Grehan * reads or writes. 140*517904deSPeter Grehan * 141*517904deSPeter Grehan * This function must be called by a driver in order to use the rest 142*517904deSPeter Grehan * of the 'shared' code files. Called by drivers only. 143*517904deSPeter Grehan **/ 144*517904deSPeter Grehan s32 igc_setup_init_funcs(struct igc_hw *hw, bool init_device) 145*517904deSPeter Grehan { 146*517904deSPeter Grehan s32 ret_val; 147*517904deSPeter Grehan 148*517904deSPeter Grehan /* Can't do much good without knowing the MAC type. */ 149*517904deSPeter Grehan ret_val = igc_set_mac_type(hw); 150*517904deSPeter Grehan if (ret_val) { 151*517904deSPeter Grehan DEBUGOUT("ERROR: MAC type could not be set properly.\n"); 152*517904deSPeter Grehan goto out; 153*517904deSPeter Grehan } 154*517904deSPeter Grehan 155*517904deSPeter Grehan if (!hw->hw_addr) { 156*517904deSPeter Grehan DEBUGOUT("ERROR: Registers not mapped\n"); 157*517904deSPeter Grehan ret_val = -IGC_ERR_CONFIG; 158*517904deSPeter Grehan goto out; 159*517904deSPeter Grehan } 160*517904deSPeter Grehan 161*517904deSPeter Grehan /* 162*517904deSPeter Grehan * Init function pointers to generic implementations. We do this first 163*517904deSPeter Grehan * allowing a driver module to override it afterward. 164*517904deSPeter Grehan */ 165*517904deSPeter Grehan igc_init_mac_ops_generic(hw); 166*517904deSPeter Grehan igc_init_phy_ops_generic(hw); 167*517904deSPeter Grehan igc_init_nvm_ops_generic(hw); 168*517904deSPeter Grehan 169*517904deSPeter Grehan /* 170*517904deSPeter Grehan * Set up the init function pointers. These are functions within the 171*517904deSPeter Grehan * adapter family file that sets up function pointers for the rest of 172*517904deSPeter Grehan * the functions in that family. 173*517904deSPeter Grehan */ 174*517904deSPeter Grehan switch (hw->mac.type) { 175*517904deSPeter Grehan case igc_i225: 176*517904deSPeter Grehan igc_init_function_pointers_i225(hw); 177*517904deSPeter Grehan break; 178*517904deSPeter Grehan default: 179*517904deSPeter Grehan DEBUGOUT("Hardware not supported\n"); 180*517904deSPeter Grehan ret_val = -IGC_ERR_CONFIG; 181*517904deSPeter Grehan break; 182*517904deSPeter Grehan } 183*517904deSPeter Grehan 184*517904deSPeter Grehan /* 185*517904deSPeter Grehan * Initialize the rest of the function pointers. These require some 186*517904deSPeter Grehan * register reads/writes in some cases. 187*517904deSPeter Grehan */ 188*517904deSPeter Grehan if (!(ret_val) && init_device) { 189*517904deSPeter Grehan ret_val = igc_init_mac_params(hw); 190*517904deSPeter Grehan if (ret_val) 191*517904deSPeter Grehan goto out; 192*517904deSPeter Grehan 193*517904deSPeter Grehan ret_val = igc_init_nvm_params(hw); 194*517904deSPeter Grehan if (ret_val) 195*517904deSPeter Grehan goto out; 196*517904deSPeter Grehan 197*517904deSPeter Grehan ret_val = igc_init_phy_params(hw); 198*517904deSPeter Grehan if (ret_val) 199*517904deSPeter Grehan goto out; 200*517904deSPeter Grehan } 201*517904deSPeter Grehan 202*517904deSPeter Grehan out: 203*517904deSPeter Grehan return ret_val; 204*517904deSPeter Grehan } 205*517904deSPeter Grehan 206*517904deSPeter Grehan /** 207*517904deSPeter Grehan * igc_get_bus_info - Obtain bus information for adapter 208*517904deSPeter Grehan * @hw: pointer to the HW structure 209*517904deSPeter Grehan * 210*517904deSPeter Grehan * This will obtain information about the HW bus for which the 211*517904deSPeter Grehan * adapter is attached and stores it in the hw structure. This is a 212*517904deSPeter Grehan * function pointer entry point called by drivers. 213*517904deSPeter Grehan **/ 214*517904deSPeter Grehan s32 igc_get_bus_info(struct igc_hw *hw) 215*517904deSPeter Grehan { 216*517904deSPeter Grehan if (hw->mac.ops.get_bus_info) 217*517904deSPeter Grehan return hw->mac.ops.get_bus_info(hw); 218*517904deSPeter Grehan 219*517904deSPeter Grehan return IGC_SUCCESS; 220*517904deSPeter Grehan } 221*517904deSPeter Grehan 222*517904deSPeter Grehan /** 223*517904deSPeter Grehan * igc_clear_vfta - Clear VLAN filter table 224*517904deSPeter Grehan * @hw: pointer to the HW structure 225*517904deSPeter Grehan * 226*517904deSPeter Grehan * This clears the VLAN filter table on the adapter. This is a function 227*517904deSPeter Grehan * pointer entry point called by drivers. 228*517904deSPeter Grehan **/ 229*517904deSPeter Grehan void igc_clear_vfta(struct igc_hw *hw) 230*517904deSPeter Grehan { 231*517904deSPeter Grehan if (hw->mac.ops.clear_vfta) 232*517904deSPeter Grehan hw->mac.ops.clear_vfta(hw); 233*517904deSPeter Grehan } 234*517904deSPeter Grehan 235*517904deSPeter Grehan /** 236*517904deSPeter Grehan * igc_write_vfta - Write value to VLAN filter table 237*517904deSPeter Grehan * @hw: pointer to the HW structure 238*517904deSPeter Grehan * @offset: the 32-bit offset in which to write the value to. 239*517904deSPeter Grehan * @value: the 32-bit value to write at location offset. 240*517904deSPeter Grehan * 241*517904deSPeter Grehan * This writes a 32-bit value to a 32-bit offset in the VLAN filter 242*517904deSPeter Grehan * table. This is a function pointer entry point called by drivers. 243*517904deSPeter Grehan **/ 244*517904deSPeter Grehan void igc_write_vfta(struct igc_hw *hw, u32 offset, u32 value) 245*517904deSPeter Grehan { 246*517904deSPeter Grehan if (hw->mac.ops.write_vfta) 247*517904deSPeter Grehan hw->mac.ops.write_vfta(hw, offset, value); 248*517904deSPeter Grehan } 249*517904deSPeter Grehan 250*517904deSPeter Grehan /** 251*517904deSPeter Grehan * igc_update_mc_addr_list - Update Multicast addresses 252*517904deSPeter Grehan * @hw: pointer to the HW structure 253*517904deSPeter Grehan * @mc_addr_list: array of multicast addresses to program 254*517904deSPeter Grehan * @mc_addr_count: number of multicast addresses to program 255*517904deSPeter Grehan * 256*517904deSPeter Grehan * Updates the Multicast Table Array. 257*517904deSPeter Grehan * The caller must have a packed mc_addr_list of multicast addresses. 258*517904deSPeter Grehan **/ 259*517904deSPeter Grehan void igc_update_mc_addr_list(struct igc_hw *hw, u8 *mc_addr_list, 260*517904deSPeter Grehan u32 mc_addr_count) 261*517904deSPeter Grehan { 262*517904deSPeter Grehan if (hw->mac.ops.update_mc_addr_list) 263*517904deSPeter Grehan hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, 264*517904deSPeter Grehan mc_addr_count); 265*517904deSPeter Grehan } 266*517904deSPeter Grehan 267*517904deSPeter Grehan /** 268*517904deSPeter Grehan * igc_force_mac_fc - Force MAC flow control 269*517904deSPeter Grehan * @hw: pointer to the HW structure 270*517904deSPeter Grehan * 271*517904deSPeter Grehan * Force the MAC's flow control settings. Currently no func pointer exists 272*517904deSPeter Grehan * and all implementations are handled in the generic version of this 273*517904deSPeter Grehan * function. 274*517904deSPeter Grehan **/ 275*517904deSPeter Grehan s32 igc_force_mac_fc(struct igc_hw *hw) 276*517904deSPeter Grehan { 277*517904deSPeter Grehan return igc_force_mac_fc_generic(hw); 278*517904deSPeter Grehan } 279*517904deSPeter Grehan 280*517904deSPeter Grehan /** 281*517904deSPeter Grehan * igc_check_for_link - Check/Store link connection 282*517904deSPeter Grehan * @hw: pointer to the HW structure 283*517904deSPeter Grehan * 284*517904deSPeter Grehan * This checks the link condition of the adapter and stores the 285*517904deSPeter Grehan * results in the hw->mac structure. This is a function pointer entry 286*517904deSPeter Grehan * point called by drivers. 287*517904deSPeter Grehan **/ 288*517904deSPeter Grehan s32 igc_check_for_link(struct igc_hw *hw) 289*517904deSPeter Grehan { 290*517904deSPeter Grehan if (hw->mac.ops.check_for_link) 291*517904deSPeter Grehan return hw->mac.ops.check_for_link(hw); 292*517904deSPeter Grehan 293*517904deSPeter Grehan return -IGC_ERR_CONFIG; 294*517904deSPeter Grehan } 295*517904deSPeter Grehan 296*517904deSPeter Grehan /** 297*517904deSPeter Grehan * igc_reset_hw - Reset hardware 298*517904deSPeter Grehan * @hw: pointer to the HW structure 299*517904deSPeter Grehan * 300*517904deSPeter Grehan * This resets the hardware into a known state. This is a function pointer 301*517904deSPeter Grehan * entry point called by drivers. 302*517904deSPeter Grehan **/ 303*517904deSPeter Grehan s32 igc_reset_hw(struct igc_hw *hw) 304*517904deSPeter Grehan { 305*517904deSPeter Grehan if (hw->mac.ops.reset_hw) 306*517904deSPeter Grehan return hw->mac.ops.reset_hw(hw); 307*517904deSPeter Grehan 308*517904deSPeter Grehan return -IGC_ERR_CONFIG; 309*517904deSPeter Grehan } 310*517904deSPeter Grehan 311*517904deSPeter Grehan /** 312*517904deSPeter Grehan * igc_init_hw - Initialize hardware 313*517904deSPeter Grehan * @hw: pointer to the HW structure 314*517904deSPeter Grehan * 315*517904deSPeter Grehan * This inits the hardware readying it for operation. This is a function 316*517904deSPeter Grehan * pointer entry point called by drivers. 317*517904deSPeter Grehan **/ 318*517904deSPeter Grehan s32 igc_init_hw(struct igc_hw *hw) 319*517904deSPeter Grehan { 320*517904deSPeter Grehan if (hw->mac.ops.init_hw) 321*517904deSPeter Grehan return hw->mac.ops.init_hw(hw); 322*517904deSPeter Grehan 323*517904deSPeter Grehan return -IGC_ERR_CONFIG; 324*517904deSPeter Grehan } 325*517904deSPeter Grehan 326*517904deSPeter Grehan /** 327*517904deSPeter Grehan * igc_setup_link - Configures link and flow control 328*517904deSPeter Grehan * @hw: pointer to the HW structure 329*517904deSPeter Grehan * 330*517904deSPeter Grehan * This configures link and flow control settings for the adapter. This 331*517904deSPeter Grehan * is a function pointer entry point called by drivers. While modules can 332*517904deSPeter Grehan * also call this, they probably call their own version of this function. 333*517904deSPeter Grehan **/ 334*517904deSPeter Grehan s32 igc_setup_link(struct igc_hw *hw) 335*517904deSPeter Grehan { 336*517904deSPeter Grehan if (hw->mac.ops.setup_link) 337*517904deSPeter Grehan return hw->mac.ops.setup_link(hw); 338*517904deSPeter Grehan 339*517904deSPeter Grehan return -IGC_ERR_CONFIG; 340*517904deSPeter Grehan } 341*517904deSPeter Grehan 342*517904deSPeter Grehan /** 343*517904deSPeter Grehan * igc_get_speed_and_duplex - Returns current speed and duplex 344*517904deSPeter Grehan * @hw: pointer to the HW structure 345*517904deSPeter Grehan * @speed: pointer to a 16-bit value to store the speed 346*517904deSPeter Grehan * @duplex: pointer to a 16-bit value to store the duplex. 347*517904deSPeter Grehan * 348*517904deSPeter Grehan * This returns the speed and duplex of the adapter in the two 'out' 349*517904deSPeter Grehan * variables passed in. This is a function pointer entry point called 350*517904deSPeter Grehan * by drivers. 351*517904deSPeter Grehan **/ 352*517904deSPeter Grehan s32 igc_get_speed_and_duplex(struct igc_hw *hw, u16 *speed, u16 *duplex) 353*517904deSPeter Grehan { 354*517904deSPeter Grehan if (hw->mac.ops.get_link_up_info) 355*517904deSPeter Grehan return hw->mac.ops.get_link_up_info(hw, speed, duplex); 356*517904deSPeter Grehan 357*517904deSPeter Grehan return -IGC_ERR_CONFIG; 358*517904deSPeter Grehan } 359*517904deSPeter Grehan 360*517904deSPeter Grehan /** 361*517904deSPeter Grehan * igc_disable_pcie_master - Disable PCI-Express master access 362*517904deSPeter Grehan * @hw: pointer to the HW structure 363*517904deSPeter Grehan * 364*517904deSPeter Grehan * Disables PCI-Express master access and verifies there are no pending 365*517904deSPeter Grehan * requests. Currently no func pointer exists and all implementations are 366*517904deSPeter Grehan * handled in the generic version of this function. 367*517904deSPeter Grehan **/ 368*517904deSPeter Grehan s32 igc_disable_pcie_master(struct igc_hw *hw) 369*517904deSPeter Grehan { 370*517904deSPeter Grehan return igc_disable_pcie_master_generic(hw); 371*517904deSPeter Grehan } 372*517904deSPeter Grehan 373*517904deSPeter Grehan /** 374*517904deSPeter Grehan * igc_config_collision_dist - Configure collision distance 375*517904deSPeter Grehan * @hw: pointer to the HW structure 376*517904deSPeter Grehan * 377*517904deSPeter Grehan * Configures the collision distance to the default value and is used 378*517904deSPeter Grehan * during link setup. 379*517904deSPeter Grehan **/ 380*517904deSPeter Grehan void igc_config_collision_dist(struct igc_hw *hw) 381*517904deSPeter Grehan { 382*517904deSPeter Grehan if (hw->mac.ops.config_collision_dist) 383*517904deSPeter Grehan hw->mac.ops.config_collision_dist(hw); 384*517904deSPeter Grehan } 385*517904deSPeter Grehan 386*517904deSPeter Grehan /** 387*517904deSPeter Grehan * igc_rar_set - Sets a receive address register 388*517904deSPeter Grehan * @hw: pointer to the HW structure 389*517904deSPeter Grehan * @addr: address to set the RAR to 390*517904deSPeter Grehan * @index: the RAR to set 391*517904deSPeter Grehan * 392*517904deSPeter Grehan * Sets a Receive Address Register (RAR) to the specified address. 393*517904deSPeter Grehan **/ 394*517904deSPeter Grehan int igc_rar_set(struct igc_hw *hw, u8 *addr, u32 index) 395*517904deSPeter Grehan { 396*517904deSPeter Grehan if (hw->mac.ops.rar_set) 397*517904deSPeter Grehan return hw->mac.ops.rar_set(hw, addr, index); 398*517904deSPeter Grehan 399*517904deSPeter Grehan return IGC_SUCCESS; 400*517904deSPeter Grehan } 401*517904deSPeter Grehan 402*517904deSPeter Grehan /** 403*517904deSPeter Grehan * igc_validate_mdi_setting - Ensures valid MDI/MDIX SW state 404*517904deSPeter Grehan * @hw: pointer to the HW structure 405*517904deSPeter Grehan * 406*517904deSPeter Grehan * Ensures that the MDI/MDIX SW state is valid. 407*517904deSPeter Grehan **/ 408*517904deSPeter Grehan s32 igc_validate_mdi_setting(struct igc_hw *hw) 409*517904deSPeter Grehan { 410*517904deSPeter Grehan if (hw->mac.ops.validate_mdi_setting) 411*517904deSPeter Grehan return hw->mac.ops.validate_mdi_setting(hw); 412*517904deSPeter Grehan 413*517904deSPeter Grehan return IGC_SUCCESS; 414*517904deSPeter Grehan } 415*517904deSPeter Grehan 416*517904deSPeter Grehan /** 417*517904deSPeter Grehan * igc_hash_mc_addr - Determines address location in multicast table 418*517904deSPeter Grehan * @hw: pointer to the HW structure 419*517904deSPeter Grehan * @mc_addr: Multicast address to hash. 420*517904deSPeter Grehan * 421*517904deSPeter Grehan * This hashes an address to determine its location in the multicast 422*517904deSPeter Grehan * table. Currently no func pointer exists and all implementations 423*517904deSPeter Grehan * are handled in the generic version of this function. 424*517904deSPeter Grehan **/ 425*517904deSPeter Grehan u32 igc_hash_mc_addr(struct igc_hw *hw, u8 *mc_addr) 426*517904deSPeter Grehan { 427*517904deSPeter Grehan return igc_hash_mc_addr_generic(hw, mc_addr); 428*517904deSPeter Grehan } 429*517904deSPeter Grehan 430*517904deSPeter Grehan /** 431*517904deSPeter Grehan * igc_check_reset_block - Verifies PHY can be reset 432*517904deSPeter Grehan * @hw: pointer to the HW structure 433*517904deSPeter Grehan * 434*517904deSPeter Grehan * Checks if the PHY is in a state that can be reset or if manageability 435*517904deSPeter Grehan * has it tied up. This is a function pointer entry point called by drivers. 436*517904deSPeter Grehan **/ 437*517904deSPeter Grehan s32 igc_check_reset_block(struct igc_hw *hw) 438*517904deSPeter Grehan { 439*517904deSPeter Grehan if (hw->phy.ops.check_reset_block) 440*517904deSPeter Grehan return hw->phy.ops.check_reset_block(hw); 441*517904deSPeter Grehan 442*517904deSPeter Grehan return IGC_SUCCESS; 443*517904deSPeter Grehan } 444*517904deSPeter Grehan 445*517904deSPeter Grehan /** 446*517904deSPeter Grehan * igc_read_phy_reg - Reads PHY register 447*517904deSPeter Grehan * @hw: pointer to the HW structure 448*517904deSPeter Grehan * @offset: the register to read 449*517904deSPeter Grehan * @data: the buffer to store the 16-bit read. 450*517904deSPeter Grehan * 451*517904deSPeter Grehan * Reads the PHY register and returns the value in data. 452*517904deSPeter Grehan * This is a function pointer entry point called by drivers. 453*517904deSPeter Grehan **/ 454*517904deSPeter Grehan s32 igc_read_phy_reg(struct igc_hw *hw, u32 offset, u16 *data) 455*517904deSPeter Grehan { 456*517904deSPeter Grehan if (hw->phy.ops.read_reg) 457*517904deSPeter Grehan return hw->phy.ops.read_reg(hw, offset, data); 458*517904deSPeter Grehan 459*517904deSPeter Grehan return IGC_SUCCESS; 460*517904deSPeter Grehan } 461*517904deSPeter Grehan 462*517904deSPeter Grehan /** 463*517904deSPeter Grehan * igc_write_phy_reg - Writes PHY register 464*517904deSPeter Grehan * @hw: pointer to the HW structure 465*517904deSPeter Grehan * @offset: the register to write 466*517904deSPeter Grehan * @data: the value to write. 467*517904deSPeter Grehan * 468*517904deSPeter Grehan * Writes the PHY register at offset with the value in data. 469*517904deSPeter Grehan * This is a function pointer entry point called by drivers. 470*517904deSPeter Grehan **/ 471*517904deSPeter Grehan s32 igc_write_phy_reg(struct igc_hw *hw, u32 offset, u16 data) 472*517904deSPeter Grehan { 473*517904deSPeter Grehan if (hw->phy.ops.write_reg) 474*517904deSPeter Grehan return hw->phy.ops.write_reg(hw, offset, data); 475*517904deSPeter Grehan 476*517904deSPeter Grehan return IGC_SUCCESS; 477*517904deSPeter Grehan } 478*517904deSPeter Grehan 479*517904deSPeter Grehan /** 480*517904deSPeter Grehan * igc_release_phy - Generic release PHY 481*517904deSPeter Grehan * @hw: pointer to the HW structure 482*517904deSPeter Grehan * 483*517904deSPeter Grehan * Return if silicon family does not require a semaphore when accessing the 484*517904deSPeter Grehan * PHY. 485*517904deSPeter Grehan **/ 486*517904deSPeter Grehan void igc_release_phy(struct igc_hw *hw) 487*517904deSPeter Grehan { 488*517904deSPeter Grehan if (hw->phy.ops.release) 489*517904deSPeter Grehan hw->phy.ops.release(hw); 490*517904deSPeter Grehan } 491*517904deSPeter Grehan 492*517904deSPeter Grehan /** 493*517904deSPeter Grehan * igc_acquire_phy - Generic acquire PHY 494*517904deSPeter Grehan * @hw: pointer to the HW structure 495*517904deSPeter Grehan * 496*517904deSPeter Grehan * Return success if silicon family does not require a semaphore when 497*517904deSPeter Grehan * accessing the PHY. 498*517904deSPeter Grehan **/ 499*517904deSPeter Grehan s32 igc_acquire_phy(struct igc_hw *hw) 500*517904deSPeter Grehan { 501*517904deSPeter Grehan if (hw->phy.ops.acquire) 502*517904deSPeter Grehan return hw->phy.ops.acquire(hw); 503*517904deSPeter Grehan 504*517904deSPeter Grehan return IGC_SUCCESS; 505*517904deSPeter Grehan } 506*517904deSPeter Grehan 507*517904deSPeter Grehan /** 508*517904deSPeter Grehan * igc_get_phy_info - Retrieves PHY information from registers 509*517904deSPeter Grehan * @hw: pointer to the HW structure 510*517904deSPeter Grehan * 511*517904deSPeter Grehan * This function gets some information from various PHY registers and 512*517904deSPeter Grehan * populates hw->phy values with it. This is a function pointer entry 513*517904deSPeter Grehan * point called by drivers. 514*517904deSPeter Grehan **/ 515*517904deSPeter Grehan s32 igc_get_phy_info(struct igc_hw *hw) 516*517904deSPeter Grehan { 517*517904deSPeter Grehan if (hw->phy.ops.get_info) 518*517904deSPeter Grehan return hw->phy.ops.get_info(hw); 519*517904deSPeter Grehan 520*517904deSPeter Grehan return IGC_SUCCESS; 521*517904deSPeter Grehan } 522*517904deSPeter Grehan 523*517904deSPeter Grehan /** 524*517904deSPeter Grehan * igc_phy_hw_reset - Hard PHY reset 525*517904deSPeter Grehan * @hw: pointer to the HW structure 526*517904deSPeter Grehan * 527*517904deSPeter Grehan * Performs a hard PHY reset. This is a function pointer entry point called 528*517904deSPeter Grehan * by drivers. 529*517904deSPeter Grehan **/ 530*517904deSPeter Grehan s32 igc_phy_hw_reset(struct igc_hw *hw) 531*517904deSPeter Grehan { 532*517904deSPeter Grehan if (hw->phy.ops.reset) 533*517904deSPeter Grehan return hw->phy.ops.reset(hw); 534*517904deSPeter Grehan 535*517904deSPeter Grehan return IGC_SUCCESS; 536*517904deSPeter Grehan } 537*517904deSPeter Grehan 538*517904deSPeter Grehan /** 539*517904deSPeter Grehan * igc_phy_commit - Soft PHY reset 540*517904deSPeter Grehan * @hw: pointer to the HW structure 541*517904deSPeter Grehan * 542*517904deSPeter Grehan * Performs a soft PHY reset on those that apply. This is a function pointer 543*517904deSPeter Grehan * entry point called by drivers. 544*517904deSPeter Grehan **/ 545*517904deSPeter Grehan s32 igc_phy_commit(struct igc_hw *hw) 546*517904deSPeter Grehan { 547*517904deSPeter Grehan if (hw->phy.ops.commit) 548*517904deSPeter Grehan return hw->phy.ops.commit(hw); 549*517904deSPeter Grehan 550*517904deSPeter Grehan return IGC_SUCCESS; 551*517904deSPeter Grehan } 552*517904deSPeter Grehan 553*517904deSPeter Grehan /** 554*517904deSPeter Grehan * igc_set_d0_lplu_state - Sets low power link up state for D0 555*517904deSPeter Grehan * @hw: pointer to the HW structure 556*517904deSPeter Grehan * @active: boolean used to enable/disable lplu 557*517904deSPeter Grehan * 558*517904deSPeter Grehan * Success returns 0, Failure returns 1 559*517904deSPeter Grehan * 560*517904deSPeter Grehan * The low power link up (lplu) state is set to the power management level D0 561*517904deSPeter Grehan * and SmartSpeed is disabled when active is true, else clear lplu for D0 562*517904deSPeter Grehan * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 563*517904deSPeter Grehan * is used during Dx states where the power conservation is most important. 564*517904deSPeter Grehan * During driver activity, SmartSpeed should be enabled so performance is 565*517904deSPeter Grehan * maintained. This is a function pointer entry point called by drivers. 566*517904deSPeter Grehan **/ 567*517904deSPeter Grehan s32 igc_set_d0_lplu_state(struct igc_hw *hw, bool active) 568*517904deSPeter Grehan { 569*517904deSPeter Grehan if (hw->phy.ops.set_d0_lplu_state) 570*517904deSPeter Grehan return hw->phy.ops.set_d0_lplu_state(hw, active); 571*517904deSPeter Grehan 572*517904deSPeter Grehan return IGC_SUCCESS; 573*517904deSPeter Grehan } 574*517904deSPeter Grehan 575*517904deSPeter Grehan /** 576*517904deSPeter Grehan * igc_set_d3_lplu_state - Sets low power link up state for D3 577*517904deSPeter Grehan * @hw: pointer to the HW structure 578*517904deSPeter Grehan * @active: boolean used to enable/disable lplu 579*517904deSPeter Grehan * 580*517904deSPeter Grehan * Success returns 0, Failure returns 1 581*517904deSPeter Grehan * 582*517904deSPeter Grehan * The low power link up (lplu) state is set to the power management level D3 583*517904deSPeter Grehan * and SmartSpeed is disabled when active is true, else clear lplu for D3 584*517904deSPeter Grehan * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 585*517904deSPeter Grehan * is used during Dx states where the power conservation is most important. 586*517904deSPeter Grehan * During driver activity, SmartSpeed should be enabled so performance is 587*517904deSPeter Grehan * maintained. This is a function pointer entry point called by drivers. 588*517904deSPeter Grehan **/ 589*517904deSPeter Grehan s32 igc_set_d3_lplu_state(struct igc_hw *hw, bool active) 590*517904deSPeter Grehan { 591*517904deSPeter Grehan if (hw->phy.ops.set_d3_lplu_state) 592*517904deSPeter Grehan return hw->phy.ops.set_d3_lplu_state(hw, active); 593*517904deSPeter Grehan 594*517904deSPeter Grehan return IGC_SUCCESS; 595*517904deSPeter Grehan } 596*517904deSPeter Grehan 597*517904deSPeter Grehan /** 598*517904deSPeter Grehan * igc_read_mac_addr - Reads MAC address 599*517904deSPeter Grehan * @hw: pointer to the HW structure 600*517904deSPeter Grehan * 601*517904deSPeter Grehan * Reads the MAC address out of the adapter and stores it in the HW structure. 602*517904deSPeter Grehan * Currently no func pointer exists and all implementations are handled in the 603*517904deSPeter Grehan * generic version of this function. 604*517904deSPeter Grehan **/ 605*517904deSPeter Grehan s32 igc_read_mac_addr(struct igc_hw *hw) 606*517904deSPeter Grehan { 607*517904deSPeter Grehan if (hw->mac.ops.read_mac_addr) 608*517904deSPeter Grehan return hw->mac.ops.read_mac_addr(hw); 609*517904deSPeter Grehan 610*517904deSPeter Grehan return igc_read_mac_addr_generic(hw); 611*517904deSPeter Grehan } 612*517904deSPeter Grehan 613*517904deSPeter Grehan /** 614*517904deSPeter Grehan * igc_read_pba_string - Read device part number string 615*517904deSPeter Grehan * @hw: pointer to the HW structure 616*517904deSPeter Grehan * @pba_num: pointer to device part number 617*517904deSPeter Grehan * @pba_num_size: size of part number buffer 618*517904deSPeter Grehan * 619*517904deSPeter Grehan * Reads the product board assembly (PBA) number from the EEPROM and stores 620*517904deSPeter Grehan * the value in pba_num. 621*517904deSPeter Grehan * Currently no func pointer exists and all implementations are handled in the 622*517904deSPeter Grehan * generic version of this function. 623*517904deSPeter Grehan **/ 624*517904deSPeter Grehan s32 igc_read_pba_string(struct igc_hw *hw, u8 *pba_num, u32 pba_num_size) 625*517904deSPeter Grehan { 626*517904deSPeter Grehan return igc_read_pba_string_generic(hw, pba_num, pba_num_size); 627*517904deSPeter Grehan } 628*517904deSPeter Grehan 629*517904deSPeter Grehan /** 630*517904deSPeter Grehan * igc_validate_nvm_checksum - Verifies NVM (EEPROM) checksum 631*517904deSPeter Grehan * @hw: pointer to the HW structure 632*517904deSPeter Grehan * 633*517904deSPeter Grehan * Validates the NVM checksum is correct. This is a function pointer entry 634*517904deSPeter Grehan * point called by drivers. 635*517904deSPeter Grehan **/ 636*517904deSPeter Grehan s32 igc_validate_nvm_checksum(struct igc_hw *hw) 637*517904deSPeter Grehan { 638*517904deSPeter Grehan if (hw->nvm.ops.validate) 639*517904deSPeter Grehan return hw->nvm.ops.validate(hw); 640*517904deSPeter Grehan 641*517904deSPeter Grehan return -IGC_ERR_CONFIG; 642*517904deSPeter Grehan } 643*517904deSPeter Grehan 644*517904deSPeter Grehan /** 645*517904deSPeter Grehan * igc_update_nvm_checksum - Updates NVM (EEPROM) checksum 646*517904deSPeter Grehan * @hw: pointer to the HW structure 647*517904deSPeter Grehan * 648*517904deSPeter Grehan * Updates the NVM checksum. Currently no func pointer exists and all 649*517904deSPeter Grehan * implementations are handled in the generic version of this function. 650*517904deSPeter Grehan **/ 651*517904deSPeter Grehan s32 igc_update_nvm_checksum(struct igc_hw *hw) 652*517904deSPeter Grehan { 653*517904deSPeter Grehan if (hw->nvm.ops.update) 654*517904deSPeter Grehan return hw->nvm.ops.update(hw); 655*517904deSPeter Grehan 656*517904deSPeter Grehan return -IGC_ERR_CONFIG; 657*517904deSPeter Grehan } 658*517904deSPeter Grehan 659*517904deSPeter Grehan /** 660*517904deSPeter Grehan * igc_reload_nvm - Reloads EEPROM 661*517904deSPeter Grehan * @hw: pointer to the HW structure 662*517904deSPeter Grehan * 663*517904deSPeter Grehan * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the 664*517904deSPeter Grehan * extended control register. 665*517904deSPeter Grehan **/ 666*517904deSPeter Grehan void igc_reload_nvm(struct igc_hw *hw) 667*517904deSPeter Grehan { 668*517904deSPeter Grehan if (hw->nvm.ops.reload) 669*517904deSPeter Grehan hw->nvm.ops.reload(hw); 670*517904deSPeter Grehan } 671*517904deSPeter Grehan 672*517904deSPeter Grehan /** 673*517904deSPeter Grehan * igc_read_nvm - Reads NVM (EEPROM) 674*517904deSPeter Grehan * @hw: pointer to the HW structure 675*517904deSPeter Grehan * @offset: the word offset to read 676*517904deSPeter Grehan * @words: number of 16-bit words to read 677*517904deSPeter Grehan * @data: pointer to the properly sized buffer for the data. 678*517904deSPeter Grehan * 679*517904deSPeter Grehan * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function 680*517904deSPeter Grehan * pointer entry point called by drivers. 681*517904deSPeter Grehan **/ 682*517904deSPeter Grehan s32 igc_read_nvm(struct igc_hw *hw, u16 offset, u16 words, u16 *data) 683*517904deSPeter Grehan { 684*517904deSPeter Grehan if (hw->nvm.ops.read) 685*517904deSPeter Grehan return hw->nvm.ops.read(hw, offset, words, data); 686*517904deSPeter Grehan 687*517904deSPeter Grehan return -IGC_ERR_CONFIG; 688*517904deSPeter Grehan } 689*517904deSPeter Grehan 690*517904deSPeter Grehan /** 691*517904deSPeter Grehan * igc_write_nvm - Writes to NVM (EEPROM) 692*517904deSPeter Grehan * @hw: pointer to the HW structure 693*517904deSPeter Grehan * @offset: the word offset to read 694*517904deSPeter Grehan * @words: number of 16-bit words to write 695*517904deSPeter Grehan * @data: pointer to the properly sized buffer for the data. 696*517904deSPeter Grehan * 697*517904deSPeter Grehan * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function 698*517904deSPeter Grehan * pointer entry point called by drivers. 699*517904deSPeter Grehan **/ 700*517904deSPeter Grehan s32 igc_write_nvm(struct igc_hw *hw, u16 offset, u16 words, u16 *data) 701*517904deSPeter Grehan { 702*517904deSPeter Grehan if (hw->nvm.ops.write) 703*517904deSPeter Grehan return hw->nvm.ops.write(hw, offset, words, data); 704*517904deSPeter Grehan 705*517904deSPeter Grehan return IGC_SUCCESS; 706*517904deSPeter Grehan } 707*517904deSPeter Grehan 708*517904deSPeter Grehan /** 709*517904deSPeter Grehan * igc_power_up_phy - Restores link in case of PHY power down 710*517904deSPeter Grehan * @hw: pointer to the HW structure 711*517904deSPeter Grehan * 712*517904deSPeter Grehan * The phy may be powered down to save power, to turn off link when the 713*517904deSPeter Grehan * driver is unloaded, or wake on lan is not enabled (among others). 714*517904deSPeter Grehan **/ 715*517904deSPeter Grehan void igc_power_up_phy(struct igc_hw *hw) 716*517904deSPeter Grehan { 717*517904deSPeter Grehan if (hw->phy.ops.power_up) 718*517904deSPeter Grehan hw->phy.ops.power_up(hw); 719*517904deSPeter Grehan 720*517904deSPeter Grehan igc_setup_link(hw); 721*517904deSPeter Grehan } 722*517904deSPeter Grehan 723*517904deSPeter Grehan /** 724*517904deSPeter Grehan * igc_power_down_phy - Power down PHY 725*517904deSPeter Grehan * @hw: pointer to the HW structure 726*517904deSPeter Grehan * 727*517904deSPeter Grehan * The phy may be powered down to save power, to turn off link when the 728*517904deSPeter Grehan * driver is unloaded, or wake on lan is not enabled (among others). 729*517904deSPeter Grehan **/ 730*517904deSPeter Grehan void igc_power_down_phy(struct igc_hw *hw) 731*517904deSPeter Grehan { 732*517904deSPeter Grehan if (hw->phy.ops.power_down) 733*517904deSPeter Grehan hw->phy.ops.power_down(hw); 734*517904deSPeter Grehan } 735*517904deSPeter Grehan 736