14919Sxy150489 /* 24919Sxy150489 * This file is provided under a CDDLv1 license. When using or 34919Sxy150489 * redistributing this file, you may do so under this license. 44919Sxy150489 * In redistributing this file this license must be included 54919Sxy150489 * and no other modification of this header file is permitted. 64919Sxy150489 * 74919Sxy150489 * CDDL LICENSE SUMMARY 84919Sxy150489 * 96735Scc210113 * Copyright(c) 1999 - 2008 Intel Corporation. All rights reserved. 104919Sxy150489 * 114919Sxy150489 * The contents of this file are subject to the terms of Version 124919Sxy150489 * 1.0 of the Common Development and Distribution License (the "License"). 134919Sxy150489 * 144919Sxy150489 * You should have received a copy of the License with this software. 154919Sxy150489 * You can obtain a copy of the License at 164919Sxy150489 * http://www.opensolaris.org/os/licensing. 174919Sxy150489 * See the License for the specific language governing permissions 184919Sxy150489 * and limitations under the License. 194919Sxy150489 */ 204919Sxy150489 214919Sxy150489 /* 225948Sml40262 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 234919Sxy150489 * Use is subject to license terms of the CDDLv1. 244919Sxy150489 */ 254919Sxy150489 264919Sxy150489 /* 27*7607STed.You@Sun.COM * IntelVersion: 1.91 v2008-7-17_MountAngel2 284919Sxy150489 */ 296735Scc210113 304919Sxy150489 #include "e1000_api.h" 314919Sxy150489 324919Sxy150489 /* 334919Sxy150489 * e1000_init_mac_params - Initialize MAC function pointers 344919Sxy150489 * @hw: pointer to the HW structure 354919Sxy150489 * 364919Sxy150489 * This function initializes the function pointers for the MAC 374919Sxy150489 * set of functions. Called by drivers or by e1000_setup_init_funcs. 384919Sxy150489 */ 394919Sxy150489 s32 404919Sxy150489 e1000_init_mac_params(struct e1000_hw *hw) 414919Sxy150489 { 424919Sxy150489 s32 ret_val = E1000_SUCCESS; 434919Sxy150489 446735Scc210113 if (hw->mac.ops.init_params) { 456735Scc210113 ret_val = hw->mac.ops.init_params(hw); 464919Sxy150489 if (ret_val) { 474919Sxy150489 DEBUGOUT("MAC Initialization Error\n"); 484919Sxy150489 goto out; 494919Sxy150489 } 504919Sxy150489 } else { 514919Sxy150489 DEBUGOUT("mac.init_mac_params was NULL\n"); 524919Sxy150489 ret_val = -E1000_ERR_CONFIG; 534919Sxy150489 } 544919Sxy150489 554919Sxy150489 out: 564919Sxy150489 return (ret_val); 574919Sxy150489 } 584919Sxy150489 594919Sxy150489 /* 604919Sxy150489 * e1000_init_nvm_params - Initialize NVM function pointers 614919Sxy150489 * @hw: pointer to the HW structure 624919Sxy150489 * 634919Sxy150489 * This function initializes the function pointers for the NVM 644919Sxy150489 * set of functions. Called by drivers or by e1000_setup_init_funcs. 654919Sxy150489 */ 664919Sxy150489 s32 674919Sxy150489 e1000_init_nvm_params(struct e1000_hw *hw) 684919Sxy150489 { 694919Sxy150489 s32 ret_val = E1000_SUCCESS; 704919Sxy150489 716735Scc210113 if (hw->nvm.ops.init_params) { 72*7607STed.You@Sun.COM hw->nvm.semaphore_delay = 10; 736735Scc210113 ret_val = hw->nvm.ops.init_params(hw); 744919Sxy150489 if (ret_val) { 754919Sxy150489 DEBUGOUT("NVM Initialization Error\n"); 764919Sxy150489 goto out; 774919Sxy150489 } 784919Sxy150489 } else { 794919Sxy150489 DEBUGOUT("nvm.init_nvm_params was NULL\n"); 804919Sxy150489 ret_val = -E1000_ERR_CONFIG; 814919Sxy150489 } 824919Sxy150489 834919Sxy150489 out: 844919Sxy150489 return (ret_val); 854919Sxy150489 } 864919Sxy150489 874919Sxy150489 /* 884919Sxy150489 * e1000_init_phy_params - Initialize PHY function pointers 894919Sxy150489 * @hw: pointer to the HW structure 904919Sxy150489 * 914919Sxy150489 * This function initializes the function pointers for the PHY 924919Sxy150489 * set of functions. Called by drivers or by e1000_setup_init_funcs. 934919Sxy150489 */ 944919Sxy150489 s32 954919Sxy150489 e1000_init_phy_params(struct e1000_hw *hw) 964919Sxy150489 { 974919Sxy150489 s32 ret_val = E1000_SUCCESS; 984919Sxy150489 996735Scc210113 if (hw->phy.ops.init_params) { 1006735Scc210113 ret_val = hw->phy.ops.init_params(hw); 1014919Sxy150489 if (ret_val) { 1024919Sxy150489 DEBUGOUT("PHY Initialization Error\n"); 1034919Sxy150489 goto out; 1044919Sxy150489 } 1054919Sxy150489 } else { 1064919Sxy150489 DEBUGOUT("phy.init_phy_params was NULL\n"); 1074919Sxy150489 ret_val = -E1000_ERR_CONFIG; 1084919Sxy150489 } 1094919Sxy150489 1104919Sxy150489 out: 1114919Sxy150489 return (ret_val); 1124919Sxy150489 } 1134919Sxy150489 1144919Sxy150489 /* 1154919Sxy150489 * e1000_set_mac_type - Sets MAC type 1164919Sxy150489 * @hw: pointer to the HW structure 1174919Sxy150489 * 1184919Sxy150489 * This function sets the mac type of the adapter based on the 1194919Sxy150489 * device ID stored in the hw structure. 1204919Sxy150489 * MUST BE FIRST FUNCTION CALLED (explicitly or through 1214919Sxy150489 * e1000_setup_init_funcs()). 1224919Sxy150489 */ 1234919Sxy150489 s32 1244919Sxy150489 e1000_set_mac_type(struct e1000_hw *hw) 1254919Sxy150489 { 1264919Sxy150489 struct e1000_mac_info *mac = &hw->mac; 1274919Sxy150489 s32 ret_val = E1000_SUCCESS; 1284919Sxy150489 1294919Sxy150489 DEBUGFUNC("e1000_set_mac_type"); 1304919Sxy150489 1314919Sxy150489 switch (hw->device_id) { 1324919Sxy150489 case E1000_DEV_ID_82542: 1334919Sxy150489 mac->type = e1000_82542; 1344919Sxy150489 break; 1354919Sxy150489 case E1000_DEV_ID_82543GC_FIBER: 1364919Sxy150489 case E1000_DEV_ID_82543GC_COPPER: 1374919Sxy150489 mac->type = e1000_82543; 1384919Sxy150489 break; 1394919Sxy150489 case E1000_DEV_ID_82544EI_COPPER: 1404919Sxy150489 case E1000_DEV_ID_82544EI_FIBER: 1414919Sxy150489 case E1000_DEV_ID_82544GC_COPPER: 1424919Sxy150489 case E1000_DEV_ID_82544GC_LOM: 1434919Sxy150489 mac->type = e1000_82544; 1444919Sxy150489 break; 1454919Sxy150489 case E1000_DEV_ID_82540EM: 1464919Sxy150489 case E1000_DEV_ID_82540EM_LOM: 1474919Sxy150489 case E1000_DEV_ID_82540EP: 1484919Sxy150489 case E1000_DEV_ID_82540EP_LOM: 1494919Sxy150489 case E1000_DEV_ID_82540EP_LP: 1504919Sxy150489 mac->type = e1000_82540; 1514919Sxy150489 break; 1524919Sxy150489 case E1000_DEV_ID_82545EM_COPPER: 1534919Sxy150489 case E1000_DEV_ID_82545EM_FIBER: 1544919Sxy150489 mac->type = e1000_82545; 1554919Sxy150489 break; 1564919Sxy150489 case E1000_DEV_ID_82545GM_COPPER: 1574919Sxy150489 case E1000_DEV_ID_82545GM_FIBER: 1584919Sxy150489 case E1000_DEV_ID_82545GM_SERDES: 1594919Sxy150489 mac->type = e1000_82545_rev_3; 1604919Sxy150489 break; 1614919Sxy150489 case E1000_DEV_ID_82546EB_COPPER: 1624919Sxy150489 case E1000_DEV_ID_82546EB_FIBER: 1634919Sxy150489 case E1000_DEV_ID_82546EB_QUAD_COPPER: 1644919Sxy150489 mac->type = e1000_82546; 1654919Sxy150489 break; 1664919Sxy150489 case E1000_DEV_ID_82546GB_COPPER: 1674919Sxy150489 case E1000_DEV_ID_82546GB_FIBER: 1684919Sxy150489 case E1000_DEV_ID_82546GB_SERDES: 1694919Sxy150489 case E1000_DEV_ID_82546GB_PCIE: 1704919Sxy150489 case E1000_DEV_ID_82546GB_QUAD_COPPER: 1714919Sxy150489 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 1724919Sxy150489 mac->type = e1000_82546_rev_3; 1734919Sxy150489 break; 1744919Sxy150489 case E1000_DEV_ID_82541EI: 1754919Sxy150489 case E1000_DEV_ID_82541EI_MOBILE: 1764919Sxy150489 case E1000_DEV_ID_82541ER_LOM: 1774919Sxy150489 mac->type = e1000_82541; 1784919Sxy150489 break; 1794919Sxy150489 case E1000_DEV_ID_82541ER: 1804919Sxy150489 case E1000_DEV_ID_82541GI: 1814919Sxy150489 case E1000_DEV_ID_82541GI_LF: 1824919Sxy150489 case E1000_DEV_ID_82541GI_MOBILE: 1834919Sxy150489 mac->type = e1000_82541_rev_2; 1844919Sxy150489 break; 1854919Sxy150489 case E1000_DEV_ID_82547EI: 1864919Sxy150489 case E1000_DEV_ID_82547EI_MOBILE: 1874919Sxy150489 mac->type = e1000_82547; 1884919Sxy150489 break; 1894919Sxy150489 case E1000_DEV_ID_82547GI: 1904919Sxy150489 mac->type = e1000_82547_rev_2; 1914919Sxy150489 break; 1924919Sxy150489 case E1000_DEV_ID_82571EB_COPPER: 1934919Sxy150489 case E1000_DEV_ID_82571EB_FIBER: 1944919Sxy150489 case E1000_DEV_ID_82571EB_SERDES: 1954919Sxy150489 case E1000_DEV_ID_82571EB_SERDES_DUAL: 1964919Sxy150489 case E1000_DEV_ID_82571EB_SERDES_QUAD: 1974919Sxy150489 case E1000_DEV_ID_82571EB_QUAD_COPPER: 1984919Sxy150489 case E1000_DEV_ID_82571PT_QUAD_COPPER: 1994919Sxy150489 case E1000_DEV_ID_82571EB_QUAD_FIBER: 2004919Sxy150489 case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: 2014919Sxy150489 mac->type = e1000_82571; 2024919Sxy150489 break; 2034919Sxy150489 case E1000_DEV_ID_82572EI: 2044919Sxy150489 case E1000_DEV_ID_82572EI_COPPER: 2054919Sxy150489 case E1000_DEV_ID_82572EI_FIBER: 2064919Sxy150489 case E1000_DEV_ID_82572EI_SERDES: 2074919Sxy150489 mac->type = e1000_82572; 2084919Sxy150489 break; 2094919Sxy150489 case E1000_DEV_ID_82573E: 2104919Sxy150489 case E1000_DEV_ID_82573E_IAMT: 2114919Sxy150489 case E1000_DEV_ID_82573L: 2124919Sxy150489 mac->type = e1000_82573; 2134919Sxy150489 break; 214*7607STed.You@Sun.COM case E1000_DEV_ID_82574L: 215*7607STed.You@Sun.COM mac->type = e1000_82574; 216*7607STed.You@Sun.COM break; 2174919Sxy150489 case E1000_DEV_ID_80003ES2LAN_COPPER_DPT: 2184919Sxy150489 case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: 2194919Sxy150489 case E1000_DEV_ID_80003ES2LAN_COPPER_SPT: 2204919Sxy150489 case E1000_DEV_ID_80003ES2LAN_SERDES_SPT: 2214919Sxy150489 mac->type = e1000_80003es2lan; 2224919Sxy150489 break; 2234919Sxy150489 case E1000_DEV_ID_ICH8_IFE: 2244919Sxy150489 case E1000_DEV_ID_ICH8_IFE_GT: 2254919Sxy150489 case E1000_DEV_ID_ICH8_IFE_G: 2264919Sxy150489 case E1000_DEV_ID_ICH8_IGP_M: 2274919Sxy150489 case E1000_DEV_ID_ICH8_IGP_M_AMT: 2284919Sxy150489 case E1000_DEV_ID_ICH8_IGP_AMT: 2294919Sxy150489 case E1000_DEV_ID_ICH8_IGP_C: 2304919Sxy150489 mac->type = e1000_ich8lan; 2314919Sxy150489 break; 2324919Sxy150489 case E1000_DEV_ID_ICH9_IFE: 2334919Sxy150489 case E1000_DEV_ID_ICH9_IFE_GT: 2344919Sxy150489 case E1000_DEV_ID_ICH9_IFE_G: 2355948Sml40262 case E1000_DEV_ID_ICH9_IGP_M: 2365948Sml40262 case E1000_DEV_ID_ICH9_IGP_M_AMT: 2376735Scc210113 case E1000_DEV_ID_ICH9_IGP_M_V: 2386735Scc210113 case E1000_DEV_ID_ICH9_IGP_AMT: 2396735Scc210113 case E1000_DEV_ID_ICH9_BM: 2404919Sxy150489 case E1000_DEV_ID_ICH9_IGP_C: 241*7607STed.You@Sun.COM case E1000_DEV_ID_ICH10_R_BM_LM: 242*7607STed.You@Sun.COM case E1000_DEV_ID_ICH10_R_BM_LF: 243*7607STed.You@Sun.COM case E1000_DEV_ID_ICH10_R_BM_V: 2444919Sxy150489 mac->type = e1000_ich9lan; 2454919Sxy150489 break; 246*7607STed.You@Sun.COM case E1000_DEV_ID_ICH10_D_BM_LM: 247*7607STed.You@Sun.COM case E1000_DEV_ID_ICH10_D_BM_LF: 248*7607STed.You@Sun.COM mac->type = e1000_ich10lan; 249*7607STed.You@Sun.COM break; 2504919Sxy150489 default: 2514919Sxy150489 /* Should never have loaded on this device */ 2524919Sxy150489 ret_val = -E1000_ERR_MAC_INIT; 2534919Sxy150489 break; 2544919Sxy150489 } 2554919Sxy150489 2564919Sxy150489 return (ret_val); 2574919Sxy150489 } 2584919Sxy150489 2594919Sxy150489 /* 2604919Sxy150489 * e1000_setup_init_funcs - Initializes function pointers 2614919Sxy150489 * @hw: pointer to the HW structure 262*7607STed.You@Sun.COM * @init_device: true will initialize the rest of the function pointers 263*7607STed.You@Sun.COM * getting the device ready for use. false will only set 2644919Sxy150489 * MAC type and the function pointers for the other init 265*7607STed.You@Sun.COM * functions. Passing false will not generate any hardware 2664919Sxy150489 * reads or writes. 2674919Sxy150489 * 2684919Sxy150489 * This function must be called by a driver in order to use the rest 2694919Sxy150489 * of the 'shared' code files. Called by drivers only. 2704919Sxy150489 */ 2714919Sxy150489 s32 2726735Scc210113 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) 2734919Sxy150489 { 2744919Sxy150489 s32 ret_val; 2754919Sxy150489 2764919Sxy150489 /* Can't do much good without knowing the MAC type. */ 2774919Sxy150489 ret_val = e1000_set_mac_type(hw); 2784919Sxy150489 if (ret_val) { 2794919Sxy150489 DEBUGOUT("ERROR: MAC type could not be set properly.\n"); 2804919Sxy150489 goto out; 2814919Sxy150489 } 2824919Sxy150489 if (!hw->hw_addr) { 2834919Sxy150489 DEBUGOUT("ERROR: Registers not mapped\n"); 2844919Sxy150489 ret_val = -E1000_ERR_CONFIG; 2854919Sxy150489 goto out; 2864919Sxy150489 } 2874919Sxy150489 2884919Sxy150489 /* 2896735Scc210113 * Init function pointers to generic implementations. We do this first 2906735Scc210113 * allowing a driver module to override it afterward. 2914919Sxy150489 */ 2926735Scc210113 e1000_init_mac_ops_generic(hw); 2936735Scc210113 e1000_init_phy_ops_generic(hw); 2946735Scc210113 e1000_init_nvm_ops_generic(hw); 2954919Sxy150489 2964919Sxy150489 /* 2974919Sxy150489 * Set up the init function pointers. These are functions within the 2984919Sxy150489 * adapter family file that sets up function pointers for the rest of 2994919Sxy150489 * the functions in that family. 3004919Sxy150489 */ 3014919Sxy150489 switch (hw->mac.type) { 3024919Sxy150489 case e1000_82542: 3034919Sxy150489 e1000_init_function_pointers_82542(hw); 3044919Sxy150489 break; 3054919Sxy150489 case e1000_82543: 3064919Sxy150489 case e1000_82544: 3074919Sxy150489 e1000_init_function_pointers_82543(hw); 3084919Sxy150489 break; 3094919Sxy150489 case e1000_82540: 3104919Sxy150489 case e1000_82545: 3114919Sxy150489 case e1000_82545_rev_3: 3124919Sxy150489 case e1000_82546: 3134919Sxy150489 case e1000_82546_rev_3: 3144919Sxy150489 e1000_init_function_pointers_82540(hw); 3154919Sxy150489 break; 3164919Sxy150489 case e1000_82541: 3174919Sxy150489 case e1000_82541_rev_2: 3184919Sxy150489 case e1000_82547: 3194919Sxy150489 case e1000_82547_rev_2: 3204919Sxy150489 e1000_init_function_pointers_82541(hw); 3214919Sxy150489 break; 3224919Sxy150489 case e1000_82571: 3234919Sxy150489 case e1000_82572: 3244919Sxy150489 case e1000_82573: 325*7607STed.You@Sun.COM case e1000_82574: 3264919Sxy150489 e1000_init_function_pointers_82571(hw); 3274919Sxy150489 break; 3284919Sxy150489 case e1000_80003es2lan: 3294919Sxy150489 e1000_init_function_pointers_80003es2lan(hw); 3304919Sxy150489 break; 3314919Sxy150489 case e1000_ich8lan: 3324919Sxy150489 case e1000_ich9lan: 333*7607STed.You@Sun.COM case e1000_ich10lan: 3344919Sxy150489 e1000_init_function_pointers_ich8lan(hw); 3354919Sxy150489 break; 3364919Sxy150489 default: 3374919Sxy150489 DEBUGOUT("Hardware not supported\n"); 3384919Sxy150489 ret_val = -E1000_ERR_CONFIG; 3394919Sxy150489 break; 3404919Sxy150489 } 3414919Sxy150489 3424919Sxy150489 /* 3434919Sxy150489 * Initialize the rest of the function pointers. These require some 3444919Sxy150489 * register reads/writes in some cases. 3454919Sxy150489 */ 3464919Sxy150489 if (!(ret_val) && init_device) { 3474919Sxy150489 ret_val = e1000_init_mac_params(hw); 3484919Sxy150489 if (ret_val) 3494919Sxy150489 goto out; 3504919Sxy150489 3514919Sxy150489 ret_val = e1000_init_nvm_params(hw); 3524919Sxy150489 if (ret_val) 3534919Sxy150489 goto out; 3544919Sxy150489 3554919Sxy150489 ret_val = e1000_init_phy_params(hw); 3564919Sxy150489 if (ret_val) 3574919Sxy150489 goto out; 3584919Sxy150489 3594919Sxy150489 } 3604919Sxy150489 3614919Sxy150489 out: 3624919Sxy150489 return (ret_val); 3634919Sxy150489 } 3644919Sxy150489 3654919Sxy150489 /* 3664919Sxy150489 * e1000_remove_device - Free device specific structure 3674919Sxy150489 * @hw: pointer to the HW structure 3684919Sxy150489 * 3694919Sxy150489 * If a device specific structure was allocated, this function will 3704919Sxy150489 * free it. This is a function pointer entry point called by drivers. 3714919Sxy150489 */ 3724919Sxy150489 void 3734919Sxy150489 e1000_remove_device(struct e1000_hw *hw) 3744919Sxy150489 { 3756735Scc210113 if (hw->mac.ops.remove_device) 3766735Scc210113 hw->mac.ops.remove_device(hw); 3774919Sxy150489 } 3784919Sxy150489 3794919Sxy150489 /* 3804919Sxy150489 * e1000_get_bus_info - Obtain bus information for adapter 3814919Sxy150489 * @hw: pointer to the HW structure 3824919Sxy150489 * 3834919Sxy150489 * This will obtain information about the HW bus for which the 3846735Scc210113 * adapter is attached and stores it in the hw structure. This is a 3854919Sxy150489 * function pointer entry point called by drivers. 3864919Sxy150489 */ 3874919Sxy150489 s32 3884919Sxy150489 e1000_get_bus_info(struct e1000_hw *hw) 3894919Sxy150489 { 3906735Scc210113 if (hw->mac.ops.get_bus_info) 3916735Scc210113 return (hw->mac.ops.get_bus_info(hw)); 3924919Sxy150489 3934919Sxy150489 return (E1000_SUCCESS); 3944919Sxy150489 } 3954919Sxy150489 3964919Sxy150489 /* 3974919Sxy150489 * e1000_clear_vfta - Clear VLAN filter table 3984919Sxy150489 * @hw: pointer to the HW structure 3994919Sxy150489 * 4004919Sxy150489 * This clears the VLAN filter table on the adapter. This is a function 4014919Sxy150489 * pointer entry point called by drivers. 4024919Sxy150489 */ 4034919Sxy150489 void 4044919Sxy150489 e1000_clear_vfta(struct e1000_hw *hw) 4054919Sxy150489 { 4066735Scc210113 if (hw->mac.ops.clear_vfta) 4076735Scc210113 hw->mac.ops.clear_vfta(hw); 4084919Sxy150489 } 4094919Sxy150489 4104919Sxy150489 /* 4114919Sxy150489 * e1000_write_vfta - Write value to VLAN filter table 4124919Sxy150489 * @hw: pointer to the HW structure 4134919Sxy150489 * @offset: the 32-bit offset in which to write the value to. 4144919Sxy150489 * @value: the 32-bit value to write at location offset. 4154919Sxy150489 * 4164919Sxy150489 * This writes a 32-bit value to a 32-bit offset in the VLAN filter 4174919Sxy150489 * table. This is a function pointer entry point called by drivers. 4184919Sxy150489 */ 4194919Sxy150489 void 4204919Sxy150489 e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) 4214919Sxy150489 { 4226735Scc210113 if (hw->mac.ops.write_vfta) 4236735Scc210113 hw->mac.ops.write_vfta(hw, offset, value); 4244919Sxy150489 } 4254919Sxy150489 4264919Sxy150489 /* 4276735Scc210113 * e1000_update_mc_addr_list - Update Multicast addresses 4284919Sxy150489 * @hw: pointer to the HW structure 4294919Sxy150489 * @mc_addr_list: array of multicast addresses to program 4304919Sxy150489 * @mc_addr_count: number of multicast addresses to program 4314919Sxy150489 * @rar_used_count: the first RAR register free to program 4324919Sxy150489 * @rar_count: total number of supported Receive Address Registers 4334919Sxy150489 * 4344919Sxy150489 * Updates the Receive Address Registers and Multicast Table Array. 4354919Sxy150489 * The caller must have a packed mc_addr_list of multicast addresses. 4364919Sxy150489 * The parameter rar_count will usually be hw->mac.rar_entry_count 4374919Sxy150489 * unless there are workarounds that change this. Currently no func pointer 4384919Sxy150489 * exists and all implementations are handled in the generic version of this 4394919Sxy150489 * function. 4404919Sxy150489 */ 4414919Sxy150489 void 4426735Scc210113 e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, 4434919Sxy150489 u32 mc_addr_count, u32 rar_used_count, u32 rar_count) 4444919Sxy150489 { 4456735Scc210113 if (hw->mac.ops.update_mc_addr_list) 4466735Scc210113 hw->mac.ops.update_mc_addr_list(hw, 4474919Sxy150489 mc_addr_list, 4484919Sxy150489 mc_addr_count, 4494919Sxy150489 rar_used_count, 4504919Sxy150489 rar_count); 4514919Sxy150489 } 4524919Sxy150489 4534919Sxy150489 /* 4544919Sxy150489 * e1000_force_mac_fc - Force MAC flow control 4554919Sxy150489 * @hw: pointer to the HW structure 4564919Sxy150489 * 4574919Sxy150489 * Force the MAC's flow control settings. Currently no func pointer exists 4584919Sxy150489 * and all implementations are handled in the generic version of this 4594919Sxy150489 * function. 4604919Sxy150489 */ 4614919Sxy150489 s32 4624919Sxy150489 e1000_force_mac_fc(struct e1000_hw *hw) 4634919Sxy150489 { 4644919Sxy150489 return (e1000_force_mac_fc_generic(hw)); 4654919Sxy150489 } 4664919Sxy150489 4674919Sxy150489 /* 4684919Sxy150489 * e1000_check_for_link - Check/Store link connection 4694919Sxy150489 * @hw: pointer to the HW structure 4704919Sxy150489 * 4714919Sxy150489 * This checks the link condition of the adapter and stores the 4724919Sxy150489 * results in the hw->mac structure. This is a function pointer entry 4734919Sxy150489 * point called by drivers. 4744919Sxy150489 */ 4754919Sxy150489 s32 4764919Sxy150489 e1000_check_for_link(struct e1000_hw *hw) 4774919Sxy150489 { 4786735Scc210113 if (hw->mac.ops.check_for_link) 4796735Scc210113 return (hw->mac.ops.check_for_link(hw)); 4804919Sxy150489 4814919Sxy150489 return (-E1000_ERR_CONFIG); 4824919Sxy150489 } 4834919Sxy150489 4844919Sxy150489 /* 4854919Sxy150489 * e1000_check_mng_mode - Check management mode 4864919Sxy150489 * @hw: pointer to the HW structure 4874919Sxy150489 * 4884919Sxy150489 * This checks if the adapter has manageability enabled. 4894919Sxy150489 * This is a function pointer entry point called by drivers. 4904919Sxy150489 */ 4916735Scc210113 bool 4924919Sxy150489 e1000_check_mng_mode(struct e1000_hw *hw) 4934919Sxy150489 { 4946735Scc210113 if (hw->mac.ops.check_mng_mode) 4956735Scc210113 return (hw->mac.ops.check_mng_mode(hw)); 4964919Sxy150489 497*7607STed.You@Sun.COM return (false); 4984919Sxy150489 } 4994919Sxy150489 5004919Sxy150489 /* 5014919Sxy150489 * e1000_mng_write_dhcp_info - Writes DHCP info to host interface 5024919Sxy150489 * @hw: pointer to the HW structure 5034919Sxy150489 * @buffer: pointer to the host interface 5044919Sxy150489 * @length: size of the buffer 5054919Sxy150489 * 5064919Sxy150489 * Writes the DHCP information to the host interface. 5074919Sxy150489 */ 5084919Sxy150489 s32 5096735Scc210113 e1000_mng_write_dhcp_info(struct e1000_hw *hw, u8 *buffer, u16 length) 5104919Sxy150489 { 5114919Sxy150489 return (e1000_mng_write_dhcp_info_generic(hw, buffer, length)); 5124919Sxy150489 } 5134919Sxy150489 5144919Sxy150489 /* 5154919Sxy150489 * e1000_reset_hw - Reset hardware 5164919Sxy150489 * @hw: pointer to the HW structure 5174919Sxy150489 * 5184919Sxy150489 * This resets the hardware into a known state. This is a function pointer 5194919Sxy150489 * entry point called by drivers. 5204919Sxy150489 */ 5214919Sxy150489 s32 5224919Sxy150489 e1000_reset_hw(struct e1000_hw *hw) 5234919Sxy150489 { 5246735Scc210113 if (hw->mac.ops.reset_hw) 5256735Scc210113 return (hw->mac.ops.reset_hw(hw)); 5264919Sxy150489 5274919Sxy150489 return (-E1000_ERR_CONFIG); 5284919Sxy150489 } 5294919Sxy150489 5304919Sxy150489 /* 5314919Sxy150489 * e1000_init_hw - Initialize hardware 5324919Sxy150489 * @hw: pointer to the HW structure 5334919Sxy150489 * 5344919Sxy150489 * This inits the hardware readying it for operation. This is a function 5354919Sxy150489 * pointer entry point called by drivers. 5364919Sxy150489 */ 5374919Sxy150489 s32 5384919Sxy150489 e1000_init_hw(struct e1000_hw *hw) 5394919Sxy150489 { 5406735Scc210113 if (hw->mac.ops.init_hw) 5416735Scc210113 return (hw->mac.ops.init_hw(hw)); 5424919Sxy150489 5434919Sxy150489 return (-E1000_ERR_CONFIG); 5444919Sxy150489 } 5454919Sxy150489 5464919Sxy150489 /* 5474919Sxy150489 * e1000_setup_link - Configures link and flow control 5484919Sxy150489 * @hw: pointer to the HW structure 5494919Sxy150489 * 5504919Sxy150489 * This configures link and flow control settings for the adapter. This 5514919Sxy150489 * is a function pointer entry point called by drivers. While modules can 5524919Sxy150489 * also call this, they probably call their own version of this function. 5534919Sxy150489 */ 5544919Sxy150489 s32 5554919Sxy150489 e1000_setup_link(struct e1000_hw *hw) 5564919Sxy150489 { 5576735Scc210113 if (hw->mac.ops.setup_link) 5586735Scc210113 return (hw->mac.ops.setup_link(hw)); 5594919Sxy150489 5604919Sxy150489 return (-E1000_ERR_CONFIG); 5614919Sxy150489 } 5624919Sxy150489 5634919Sxy150489 /* 5644919Sxy150489 * e1000_get_speed_and_duplex - Returns current speed and duplex 5654919Sxy150489 * @hw: pointer to the HW structure 5664919Sxy150489 * @speed: pointer to a 16-bit value to store the speed 5674919Sxy150489 * @duplex: pointer to a 16-bit value to store the duplex. 5684919Sxy150489 * 5694919Sxy150489 * This returns the speed and duplex of the adapter in the two 'out' 5704919Sxy150489 * variables passed in. This is a function pointer entry point called 5714919Sxy150489 * by drivers. 5724919Sxy150489 */ 5734919Sxy150489 s32 5746735Scc210113 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, u16 *duplex) 5754919Sxy150489 { 5766735Scc210113 if (hw->mac.ops.get_link_up_info) 5776735Scc210113 return (hw->mac.ops.get_link_up_info(hw, speed, duplex)); 5784919Sxy150489 5794919Sxy150489 return (-E1000_ERR_CONFIG); 5804919Sxy150489 } 5814919Sxy150489 5824919Sxy150489 /* 5834919Sxy150489 * e1000_setup_led - Configures SW controllable LED 5844919Sxy150489 * @hw: pointer to the HW structure 5854919Sxy150489 * 5864919Sxy150489 * This prepares the SW controllable LED for use and saves the current state 5874919Sxy150489 * of the LED so it can be later restored. This is a function pointer entry 5884919Sxy150489 * point called by drivers. 5894919Sxy150489 */ 5904919Sxy150489 s32 5914919Sxy150489 e1000_setup_led(struct e1000_hw *hw) 5924919Sxy150489 { 5936735Scc210113 if (hw->mac.ops.setup_led) 5946735Scc210113 return (hw->mac.ops.setup_led(hw)); 5954919Sxy150489 5964919Sxy150489 return (E1000_SUCCESS); 5974919Sxy150489 } 5984919Sxy150489 5994919Sxy150489 /* 6004919Sxy150489 * e1000_cleanup_led - Restores SW controllable LED 6014919Sxy150489 * @hw: pointer to the HW structure 6024919Sxy150489 * 6034919Sxy150489 * This restores the SW controllable LED to the value saved off by 6044919Sxy150489 * e1000_setup_led. This is a function pointer entry point called by drivers. 6054919Sxy150489 */ 6064919Sxy150489 s32 6074919Sxy150489 e1000_cleanup_led(struct e1000_hw *hw) 6084919Sxy150489 { 6096735Scc210113 if (hw->mac.ops.cleanup_led) 6106735Scc210113 return (hw->mac.ops.cleanup_led(hw)); 6114919Sxy150489 6124919Sxy150489 return (E1000_SUCCESS); 6134919Sxy150489 } 6144919Sxy150489 6154919Sxy150489 /* 6164919Sxy150489 * e1000_blink_led - Blink SW controllable LED 6174919Sxy150489 * @hw: pointer to the HW structure 6184919Sxy150489 * 6194919Sxy150489 * This starts the adapter LED blinking. Request the LED to be setup first 6204919Sxy150489 * and cleaned up after. This is a function pointer entry point called by 6214919Sxy150489 * drivers. 6224919Sxy150489 */ 6234919Sxy150489 s32 6244919Sxy150489 e1000_blink_led(struct e1000_hw *hw) 6254919Sxy150489 { 6266735Scc210113 if (hw->mac.ops.blink_led) 6276735Scc210113 return (hw->mac.ops.blink_led(hw)); 6284919Sxy150489 6294919Sxy150489 return (E1000_SUCCESS); 6304919Sxy150489 } 6314919Sxy150489 6324919Sxy150489 /* 6334919Sxy150489 * e1000_led_on - Turn on SW controllable LED 6344919Sxy150489 * @hw: pointer to the HW structure 6354919Sxy150489 * 6364919Sxy150489 * Turns the SW defined LED on. This is a function pointer entry point 6374919Sxy150489 * called by drivers. 6384919Sxy150489 */ 6394919Sxy150489 s32 6404919Sxy150489 e1000_led_on(struct e1000_hw *hw) 6414919Sxy150489 { 6426735Scc210113 if (hw->mac.ops.led_on) 6436735Scc210113 return (hw->mac.ops.led_on(hw)); 6444919Sxy150489 6454919Sxy150489 return (E1000_SUCCESS); 6464919Sxy150489 } 6474919Sxy150489 6484919Sxy150489 /* 6494919Sxy150489 * e1000_led_off - Turn off SW controllable LED 6504919Sxy150489 * @hw: pointer to the HW structure 6514919Sxy150489 * 6524919Sxy150489 * Turns the SW defined LED off. This is a function pointer entry point 6534919Sxy150489 * called by drivers. 6544919Sxy150489 */ 6554919Sxy150489 s32 6564919Sxy150489 e1000_led_off(struct e1000_hw *hw) 6574919Sxy150489 { 6586735Scc210113 if (hw->mac.ops.led_off) 6596735Scc210113 return (hw->mac.ops.led_off(hw)); 6604919Sxy150489 6614919Sxy150489 return (E1000_SUCCESS); 6624919Sxy150489 } 6634919Sxy150489 6644919Sxy150489 /* 6654919Sxy150489 * e1000_reset_adaptive - Reset adaptive IFS 6664919Sxy150489 * @hw: pointer to the HW structure 6674919Sxy150489 * 6684919Sxy150489 * Resets the adaptive IFS. Currently no func pointer exists and all 6694919Sxy150489 * implementations are handled in the generic version of this function. 6704919Sxy150489 */ 6714919Sxy150489 void 6724919Sxy150489 e1000_reset_adaptive(struct e1000_hw *hw) 6734919Sxy150489 { 6744919Sxy150489 e1000_reset_adaptive_generic(hw); 6754919Sxy150489 } 6764919Sxy150489 6774919Sxy150489 /* 6784919Sxy150489 * e1000_update_adaptive - Update adaptive IFS 6794919Sxy150489 * @hw: pointer to the HW structure 6804919Sxy150489 * 6814919Sxy150489 * Updates adapter IFS. Currently no func pointer exists and all 6824919Sxy150489 * implementations are handled in the generic version of this function. 6834919Sxy150489 */ 6844919Sxy150489 void 6854919Sxy150489 e1000_update_adaptive(struct e1000_hw *hw) 6864919Sxy150489 { 6874919Sxy150489 e1000_update_adaptive_generic(hw); 6884919Sxy150489 } 6894919Sxy150489 6904919Sxy150489 /* 6914919Sxy150489 * e1000_disable_pcie_master - Disable PCI-Express master access 6924919Sxy150489 * @hw: pointer to the HW structure 6934919Sxy150489 * 6944919Sxy150489 * Disables PCI-Express master access and verifies there are no pending 6954919Sxy150489 * requests. Currently no func pointer exists and all implementations are 6964919Sxy150489 * handled in the generic version of this function. 6974919Sxy150489 */ 6984919Sxy150489 s32 6994919Sxy150489 e1000_disable_pcie_master(struct e1000_hw *hw) 7004919Sxy150489 { 7014919Sxy150489 return (e1000_disable_pcie_master_generic(hw)); 7024919Sxy150489 } 7034919Sxy150489 7044919Sxy150489 /* 7054919Sxy150489 * e1000_config_collision_dist - Configure collision distance 7064919Sxy150489 * @hw: pointer to the HW structure 7074919Sxy150489 * 7084919Sxy150489 * Configures the collision distance to the default value and is used 7094919Sxy150489 * during link setup. 7104919Sxy150489 */ 7114919Sxy150489 void 7124919Sxy150489 e1000_config_collision_dist(struct e1000_hw *hw) 7134919Sxy150489 { 7146735Scc210113 if (hw->mac.ops.config_collision_dist) 7156735Scc210113 hw->mac.ops.config_collision_dist(hw); 7164919Sxy150489 } 7174919Sxy150489 7184919Sxy150489 /* 7194919Sxy150489 * e1000_rar_set - Sets a receive address register 7204919Sxy150489 * @hw: pointer to the HW structure 7214919Sxy150489 * @addr: address to set the RAR to 7224919Sxy150489 * @index: the RAR to set 7234919Sxy150489 * 7244919Sxy150489 * Sets a Receive Address Register (RAR) to the specified address. 7254919Sxy150489 */ 7264919Sxy150489 void 7274919Sxy150489 e1000_rar_set(struct e1000_hw *hw, u8 * addr, u32 index) 7284919Sxy150489 { 7296735Scc210113 if (hw->mac.ops.rar_set) 7306735Scc210113 hw->mac.ops.rar_set(hw, addr, index); 7314919Sxy150489 } 7324919Sxy150489 7334919Sxy150489 /* 7344919Sxy150489 * e1000_validate_mdi_setting - Ensures valid MDI/MDIX SW state 7354919Sxy150489 * @hw: pointer to the HW structure 7364919Sxy150489 * 7374919Sxy150489 * Ensures that the MDI/MDIX SW state is valid. 7384919Sxy150489 */ 7394919Sxy150489 s32 7404919Sxy150489 e1000_validate_mdi_setting(struct e1000_hw *hw) 7414919Sxy150489 { 7426735Scc210113 if (hw->mac.ops.validate_mdi_setting) 7436735Scc210113 return (hw->mac.ops.validate_mdi_setting(hw)); 7444919Sxy150489 7454919Sxy150489 return (E1000_SUCCESS); 7464919Sxy150489 } 7474919Sxy150489 7484919Sxy150489 /* 7494919Sxy150489 * e1000_mta_set - Sets multicast table bit 7504919Sxy150489 * @hw: pointer to the HW structure 7514919Sxy150489 * @hash_value: Multicast hash value. 7524919Sxy150489 * 7534919Sxy150489 * This sets the bit in the multicast table corresponding to the 7544919Sxy150489 * hash value. This is a function pointer entry point called by drivers. 7554919Sxy150489 */ 7564919Sxy150489 void 7574919Sxy150489 e1000_mta_set(struct e1000_hw *hw, u32 hash_value) 7584919Sxy150489 { 7596735Scc210113 if (hw->mac.ops.mta_set) 7606735Scc210113 hw->mac.ops.mta_set(hw, hash_value); 7614919Sxy150489 } 7624919Sxy150489 7634919Sxy150489 /* 7644919Sxy150489 * e1000_hash_mc_addr - Determines address location in multicast table 7654919Sxy150489 * @hw: pointer to the HW structure 7664919Sxy150489 * @mc_addr: Multicast address to hash. 7674919Sxy150489 * 7684919Sxy150489 * This hashes an address to determine its location in the multicast 7694919Sxy150489 * table. Currently no func pointer exists and all implementations 7704919Sxy150489 * are handled in the generic version of this function. 7714919Sxy150489 */ 7724919Sxy150489 u32 7734919Sxy150489 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr) 7744919Sxy150489 { 7754919Sxy150489 return (e1000_hash_mc_addr_generic(hw, mc_addr)); 7764919Sxy150489 } 7774919Sxy150489 7784919Sxy150489 /* 7794919Sxy150489 * e1000_enable_tx_pkt_filtering - Enable packet filtering on TX 7804919Sxy150489 * @hw: pointer to the HW structure 7814919Sxy150489 * 7824919Sxy150489 * Enables packet filtering on transmit packets if manageability is enabled 7834919Sxy150489 * and host interface is enabled. 7844919Sxy150489 * Currently no func pointer exists and all implementations are handled in the 7854919Sxy150489 * generic version of this function. 7864919Sxy150489 */ 7876735Scc210113 bool 7884919Sxy150489 e1000_enable_tx_pkt_filtering(struct e1000_hw *hw) 7894919Sxy150489 { 7904919Sxy150489 return (e1000_enable_tx_pkt_filtering_generic(hw)); 7914919Sxy150489 } 7924919Sxy150489 7934919Sxy150489 /* 7944919Sxy150489 * e1000_mng_host_if_write - Writes to the manageability host interface 7954919Sxy150489 * @hw: pointer to the HW structure 7964919Sxy150489 * @buffer: pointer to the host interface buffer 7974919Sxy150489 * @length: size of the buffer 7984919Sxy150489 * @offset: location in the buffer to write to 7994919Sxy150489 * @sum: sum of the data (not checksum) 8004919Sxy150489 * 8014919Sxy150489 * This function writes the buffer content at the offset given on the host if. 8024919Sxy150489 * It also does alignment considerations to do the writes in most efficient 8034919Sxy150489 * way. Also fills up the sum of the buffer in *buffer parameter. 8044919Sxy150489 */ 8054919Sxy150489 s32 8064919Sxy150489 e1000_mng_host_if_write(struct e1000_hw *hw, u8 *buffer, u16 length, 8074919Sxy150489 u16 offset, u8 *sum) 8084919Sxy150489 { 8096735Scc210113 if (hw->mac.ops.mng_host_if_write) 8106735Scc210113 return (hw->mac.ops.mng_host_if_write(hw, buffer, length, 8116735Scc210113 offset, sum)); 8124919Sxy150489 8134919Sxy150489 return (E1000_NOT_IMPLEMENTED); 8144919Sxy150489 } 8154919Sxy150489 8164919Sxy150489 /* 8174919Sxy150489 * e1000_mng_write_cmd_header - Writes manageability command header 8184919Sxy150489 * @hw: pointer to the HW structure 8194919Sxy150489 * @hdr: pointer to the host interface command header 8204919Sxy150489 * 8214919Sxy150489 * Writes the command header after does the checksum calculation. 8224919Sxy150489 */ 8234919Sxy150489 s32 8244919Sxy150489 e1000_mng_write_cmd_header(struct e1000_hw *hw, 8254919Sxy150489 struct e1000_host_mng_command_header *hdr) 8264919Sxy150489 { 8276735Scc210113 if (hw->mac.ops.mng_write_cmd_header) 8286735Scc210113 return (hw->mac.ops.mng_write_cmd_header(hw, hdr)); 8294919Sxy150489 8304919Sxy150489 return (E1000_NOT_IMPLEMENTED); 8314919Sxy150489 } 8324919Sxy150489 8334919Sxy150489 /* 8344919Sxy150489 * e1000_mng_enable_host_if - Checks host interface is enabled 8354919Sxy150489 * @hw: pointer to the HW structure 8364919Sxy150489 * 8374919Sxy150489 * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND 8384919Sxy150489 * 8396735Scc210113 * This function checks whether the HOST IF is enabled for command operation 8404919Sxy150489 * and also checks whether the previous command is completed. It busy waits 8414919Sxy150489 * in case of previous command is not completed. 8424919Sxy150489 */ 8434919Sxy150489 s32 8444919Sxy150489 e1000_mng_enable_host_if(struct e1000_hw *hw) 8454919Sxy150489 { 8466735Scc210113 if (hw->mac.ops.mng_enable_host_if) 8476735Scc210113 return (hw->mac.ops.mng_enable_host_if(hw)); 8484919Sxy150489 8494919Sxy150489 return (E1000_NOT_IMPLEMENTED); 8504919Sxy150489 } 8514919Sxy150489 8524919Sxy150489 /* 8534919Sxy150489 * e1000_wait_autoneg - Waits for autonegotiation completion 8544919Sxy150489 * @hw: pointer to the HW structure 8554919Sxy150489 * 8564919Sxy150489 * Waits for autoneg to complete. Currently no func pointer exists and all 8574919Sxy150489 * implementations are handled in the generic version of this function. 8584919Sxy150489 */ 8594919Sxy150489 s32 8604919Sxy150489 e1000_wait_autoneg(struct e1000_hw *hw) 8614919Sxy150489 { 8626735Scc210113 if (hw->mac.ops.wait_autoneg) 8636735Scc210113 return (hw->mac.ops.wait_autoneg(hw)); 8644919Sxy150489 8654919Sxy150489 return (E1000_SUCCESS); 8664919Sxy150489 } 8674919Sxy150489 8684919Sxy150489 /* 8694919Sxy150489 * e1000_check_reset_block - Verifies PHY can be reset 8704919Sxy150489 * @hw: pointer to the HW structure 8714919Sxy150489 * 8724919Sxy150489 * Checks if the PHY is in a state that can be reset or if manageability 8734919Sxy150489 * has it tied up. This is a function pointer entry point called by drivers. 8744919Sxy150489 */ 8754919Sxy150489 s32 8764919Sxy150489 e1000_check_reset_block(struct e1000_hw *hw) 8774919Sxy150489 { 8786735Scc210113 if (hw->phy.ops.check_reset_block) 8796735Scc210113 return (hw->phy.ops.check_reset_block(hw)); 8804919Sxy150489 8814919Sxy150489 return (E1000_SUCCESS); 8824919Sxy150489 } 8834919Sxy150489 8844919Sxy150489 /* 8854919Sxy150489 * e1000_read_phy_reg - Reads PHY register 8864919Sxy150489 * @hw: pointer to the HW structure 8874919Sxy150489 * @offset: the register to read 8884919Sxy150489 * @data: the buffer to store the 16-bit read. 8894919Sxy150489 * 8904919Sxy150489 * Reads the PHY register and returns the value in data. 8914919Sxy150489 * This is a function pointer entry point called by drivers. 8924919Sxy150489 */ 8934919Sxy150489 s32 8944919Sxy150489 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) 8954919Sxy150489 { 8966735Scc210113 if (hw->phy.ops.read_reg) 8976735Scc210113 return (hw->phy.ops.read_reg(hw, offset, data)); 8984919Sxy150489 8994919Sxy150489 return (E1000_SUCCESS); 9004919Sxy150489 } 9014919Sxy150489 9024919Sxy150489 /* 9034919Sxy150489 * e1000_write_phy_reg - Writes PHY register 9044919Sxy150489 * @hw: pointer to the HW structure 9054919Sxy150489 * @offset: the register to write 9064919Sxy150489 * @data: the value to write. 9074919Sxy150489 * 9084919Sxy150489 * Writes the PHY register at offset with the value in data. 9094919Sxy150489 * This is a function pointer entry point called by drivers. 9104919Sxy150489 */ 9114919Sxy150489 s32 9124919Sxy150489 e1000_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) 9134919Sxy150489 { 9146735Scc210113 if (hw->phy.ops.write_reg) 9156735Scc210113 return (hw->phy.ops.write_reg(hw, offset, data)); 9166735Scc210113 9176735Scc210113 return (E1000_SUCCESS); 9186735Scc210113 } 9196735Scc210113 9206735Scc210113 /* 9216735Scc210113 * e1000_release_phy - Generic release PHY 9226735Scc210113 * @hw: pointer to the HW structure 9236735Scc210113 * 9246735Scc210113 * Return if silicon family does not require a semaphore when accessing the 9256735Scc210113 * PHY. 9266735Scc210113 */ 9276735Scc210113 void 9286735Scc210113 e1000_release_phy(struct e1000_hw *hw) 9296735Scc210113 { 9306735Scc210113 if (hw->phy.ops.release) 9316735Scc210113 hw->phy.ops.release(hw); 9326735Scc210113 } 9336735Scc210113 9346735Scc210113 /* 9356735Scc210113 * e1000_acquire_phy - Generic acquire PHY 9366735Scc210113 * @hw: pointer to the HW structure 9376735Scc210113 * 9386735Scc210113 * Return success if silicon family does not require a semaphore when 9396735Scc210113 * accessing the PHY. 9406735Scc210113 */ 9416735Scc210113 s32 9426735Scc210113 e1000_acquire_phy(struct e1000_hw *hw) 9436735Scc210113 { 9446735Scc210113 if (hw->phy.ops.acquire) 9456735Scc210113 return (hw->phy.ops.acquire(hw)); 9464919Sxy150489 9474919Sxy150489 return (E1000_SUCCESS); 9484919Sxy150489 } 9494919Sxy150489 9504919Sxy150489 /* 9514919Sxy150489 * e1000_read_kmrn_reg - Reads register using Kumeran interface 9524919Sxy150489 * @hw: pointer to the HW structure 9534919Sxy150489 * @offset: the register to read 9544919Sxy150489 * @data: the location to store the 16-bit value read. 9554919Sxy150489 * 9564919Sxy150489 * Reads a register out of the Kumeran interface. Currently no func pointer 9574919Sxy150489 * exists and all implementations are handled in the generic version of 9584919Sxy150489 * this function. 9594919Sxy150489 */ 9604919Sxy150489 s32 9614919Sxy150489 e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) 9624919Sxy150489 { 9634919Sxy150489 return (e1000_read_kmrn_reg_generic(hw, offset, data)); 9644919Sxy150489 } 9654919Sxy150489 9664919Sxy150489 /* 9674919Sxy150489 * e1000_write_kmrn_reg - Writes register using Kumeran interface 9684919Sxy150489 * @hw: pointer to the HW structure 9694919Sxy150489 * @offset: the register to write 9704919Sxy150489 * @data: the value to write. 9714919Sxy150489 * 9724919Sxy150489 * Writes a register to the Kumeran interface. Currently no func pointer 9734919Sxy150489 * exists and all implementations are handled in the generic version of 9744919Sxy150489 * this function. 9754919Sxy150489 */ 9764919Sxy150489 s32 9774919Sxy150489 e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) 9784919Sxy150489 { 9794919Sxy150489 return (e1000_write_kmrn_reg_generic(hw, offset, data)); 9804919Sxy150489 } 9814919Sxy150489 9824919Sxy150489 /* 9834919Sxy150489 * e1000_get_cable_length - Retrieves cable length estimation 9844919Sxy150489 * @hw: pointer to the HW structure 9854919Sxy150489 * 9864919Sxy150489 * This function estimates the cable length and stores them in 9874919Sxy150489 * hw->phy.min_length and hw->phy.max_length. This is a function pointer 9884919Sxy150489 * entry point called by drivers. 9894919Sxy150489 */ 9904919Sxy150489 s32 9914919Sxy150489 e1000_get_cable_length(struct e1000_hw *hw) 9924919Sxy150489 { 9936735Scc210113 if (hw->phy.ops.get_cable_length) 9946735Scc210113 return (hw->phy.ops.get_cable_length(hw)); 9954919Sxy150489 9964919Sxy150489 return (E1000_SUCCESS); 9974919Sxy150489 } 9984919Sxy150489 9994919Sxy150489 /* 10004919Sxy150489 * e1000_get_phy_info - Retrieves PHY information from registers 10014919Sxy150489 * @hw: pointer to the HW structure 10024919Sxy150489 * 10034919Sxy150489 * This function gets some information from various PHY registers and 10044919Sxy150489 * populates hw->phy values with it. This is a function pointer entry 10054919Sxy150489 * point called by drivers. 10064919Sxy150489 */ 10074919Sxy150489 s32 10084919Sxy150489 e1000_get_phy_info(struct e1000_hw *hw) 10094919Sxy150489 { 10106735Scc210113 if (hw->phy.ops.get_info) 10116735Scc210113 return (hw->phy.ops.get_info(hw)); 10124919Sxy150489 10134919Sxy150489 return (E1000_SUCCESS); 10144919Sxy150489 } 10154919Sxy150489 10164919Sxy150489 /* 10174919Sxy150489 * e1000_phy_hw_reset - Hard PHY reset 10184919Sxy150489 * @hw: pointer to the HW structure 10194919Sxy150489 * 10204919Sxy150489 * Performs a hard PHY reset. This is a function pointer entry point called 10214919Sxy150489 * by drivers. 10224919Sxy150489 */ 10234919Sxy150489 s32 10244919Sxy150489 e1000_phy_hw_reset(struct e1000_hw *hw) 10254919Sxy150489 { 10266735Scc210113 if (hw->phy.ops.reset) 10276735Scc210113 return (hw->phy.ops.reset(hw)); 10284919Sxy150489 10294919Sxy150489 return (E1000_SUCCESS); 10304919Sxy150489 } 10314919Sxy150489 10324919Sxy150489 /* 10334919Sxy150489 * e1000_phy_commit - Soft PHY reset 10344919Sxy150489 * @hw: pointer to the HW structure 10354919Sxy150489 * 10364919Sxy150489 * Performs a soft PHY reset on those that apply. This is a function pointer 10374919Sxy150489 * entry point called by drivers. 10384919Sxy150489 */ 10394919Sxy150489 s32 10404919Sxy150489 e1000_phy_commit(struct e1000_hw *hw) 10414919Sxy150489 { 10426735Scc210113 if (hw->phy.ops.commit) 10436735Scc210113 return (hw->phy.ops.commit(hw)); 10444919Sxy150489 10454919Sxy150489 return (E1000_SUCCESS); 10464919Sxy150489 } 10474919Sxy150489 10484919Sxy150489 /* 10496735Scc210113 * e1000_set_d0_lplu_state - Sets low power link up state for D0 10504919Sxy150489 * @hw: pointer to the HW structure 10514919Sxy150489 * @active: boolean used to enable/disable lplu 10524919Sxy150489 * 10534919Sxy150489 * Success returns 0, Failure returns 1 10544919Sxy150489 * 10554919Sxy150489 * The low power link up (lplu) state is set to the power management level D0 10564919Sxy150489 * and SmartSpeed is disabled when active is true, else clear lplu for D0 10574919Sxy150489 * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 10584919Sxy150489 * is used during Dx states where the power conservation is most important. 10594919Sxy150489 * During driver activity, SmartSpeed should be enabled so performance is 10604919Sxy150489 * maintained. This is a function pointer entry point called by drivers. 10614919Sxy150489 */ 10624919Sxy150489 s32 10636735Scc210113 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) 10644919Sxy150489 { 10656735Scc210113 if (hw->phy.ops.set_d0_lplu_state) 10666735Scc210113 return (hw->phy.ops.set_d0_lplu_state(hw, active)); 10674919Sxy150489 10684919Sxy150489 return (E1000_SUCCESS); 10694919Sxy150489 } 10704919Sxy150489 10714919Sxy150489 /* 10724919Sxy150489 * e1000_set_d3_lplu_state - Sets low power link up state for D3 10734919Sxy150489 * @hw: pointer to the HW structure 10744919Sxy150489 * @active: boolean used to enable/disable lplu 10754919Sxy150489 * 10764919Sxy150489 * Success returns 0, Failure returns 1 10774919Sxy150489 * 10784919Sxy150489 * The low power link up (lplu) state is set to the power management level D3 10794919Sxy150489 * and SmartSpeed is disabled when active is true, else clear lplu for D3 10804919Sxy150489 * and enable Smartspeed. LPLU and Smartspeed are mutually exclusive. LPLU 10814919Sxy150489 * is used during Dx states where the power conservation is most important. 10824919Sxy150489 * During driver activity, SmartSpeed should be enabled so performance is 10834919Sxy150489 * maintained. This is a function pointer entry point called by drivers. 10844919Sxy150489 */ 10854919Sxy150489 s32 10866735Scc210113 e1000_set_d3_lplu_state(struct e1000_hw *hw, bool active) 10874919Sxy150489 { 10886735Scc210113 if (hw->phy.ops.set_d3_lplu_state) 10896735Scc210113 return (hw->phy.ops.set_d3_lplu_state(hw, active)); 10904919Sxy150489 10914919Sxy150489 return (E1000_SUCCESS); 10924919Sxy150489 } 10934919Sxy150489 10944919Sxy150489 /* 10954919Sxy150489 * e1000_read_mac_addr - Reads MAC address 10964919Sxy150489 * @hw: pointer to the HW structure 10974919Sxy150489 * 10984919Sxy150489 * Reads the MAC address out of the adapter and stores it in the HW structure. 10994919Sxy150489 * Currently no func pointer exists and all implementations are handled in the 11004919Sxy150489 * generic version of this function. 11014919Sxy150489 */ 11024919Sxy150489 s32 11034919Sxy150489 e1000_read_mac_addr(struct e1000_hw *hw) 11044919Sxy150489 { 11056735Scc210113 if (hw->mac.ops.read_mac_addr) 11066735Scc210113 return (hw->mac.ops.read_mac_addr(hw)); 11076735Scc210113 11084919Sxy150489 return (e1000_read_mac_addr_generic(hw)); 11094919Sxy150489 } 11104919Sxy150489 11114919Sxy150489 /* 11126735Scc210113 * e1000_read_pba_num - Read device part number 11134919Sxy150489 * @hw: pointer to the HW structure 11146735Scc210113 * @pba_num: pointer to device part number 11154919Sxy150489 * 11164919Sxy150489 * Reads the product board assembly (PBA) number from the EEPROM and stores 11176735Scc210113 * the value in pba_num. 11184919Sxy150489 * Currently no func pointer exists and all implementations are handled in the 11194919Sxy150489 * generic version of this function. 11204919Sxy150489 */ 11214919Sxy150489 s32 11226735Scc210113 e1000_read_pba_num(struct e1000_hw *hw, u32 *pba_num) 11234919Sxy150489 { 11246735Scc210113 return (e1000_read_pba_num_generic(hw, pba_num)); 11254919Sxy150489 } 11264919Sxy150489 11274919Sxy150489 /* 11284919Sxy150489 * e1000_validate_nvm_checksum - Verifies NVM (EEPROM) checksum 11294919Sxy150489 * @hw: pointer to the HW structure 11304919Sxy150489 * 11314919Sxy150489 * Validates the NVM checksum is correct. This is a function pointer entry 11324919Sxy150489 * point called by drivers. 11334919Sxy150489 */ 11344919Sxy150489 s32 11354919Sxy150489 e1000_validate_nvm_checksum(struct e1000_hw *hw) 11364919Sxy150489 { 11376735Scc210113 if (hw->nvm.ops.validate) 11386735Scc210113 return (hw->nvm.ops.validate(hw)); 11394919Sxy150489 11404919Sxy150489 return (-E1000_ERR_CONFIG); 11414919Sxy150489 } 11424919Sxy150489 11434919Sxy150489 /* 11444919Sxy150489 * e1000_update_nvm_checksum - Updates NVM (EEPROM) checksum 11454919Sxy150489 * @hw: pointer to the HW structure 11464919Sxy150489 * 11474919Sxy150489 * Updates the NVM checksum. Currently no func pointer exists and all 11484919Sxy150489 * implementations are handled in the generic version of this function. 11494919Sxy150489 */ 11504919Sxy150489 s32 11514919Sxy150489 e1000_update_nvm_checksum(struct e1000_hw *hw) 11524919Sxy150489 { 11536735Scc210113 if (hw->nvm.ops.update) 11546735Scc210113 return (hw->nvm.ops.update(hw)); 11554919Sxy150489 11564919Sxy150489 return (-E1000_ERR_CONFIG); 11574919Sxy150489 } 11584919Sxy150489 11594919Sxy150489 /* 11604919Sxy150489 * e1000_reload_nvm - Reloads EEPROM 11614919Sxy150489 * @hw: pointer to the HW structure 11624919Sxy150489 * 11634919Sxy150489 * Reloads the EEPROM by setting the "Reinitialize from EEPROM" bit in the 11644919Sxy150489 * extended control register. 11654919Sxy150489 */ 11664919Sxy150489 void 11674919Sxy150489 e1000_reload_nvm(struct e1000_hw *hw) 11684919Sxy150489 { 11696735Scc210113 if (hw->nvm.ops.reload) 11706735Scc210113 hw->nvm.ops.reload(hw); 11714919Sxy150489 } 11724919Sxy150489 11734919Sxy150489 /* 11744919Sxy150489 * e1000_read_nvm - Reads NVM (EEPROM) 11754919Sxy150489 * @hw: pointer to the HW structure 11764919Sxy150489 * @offset: the word offset to read 11774919Sxy150489 * @words: number of 16-bit words to read 11784919Sxy150489 * @data: pointer to the properly sized buffer for the data. 11794919Sxy150489 * 11804919Sxy150489 * Reads 16-bit chunks of data from the NVM (EEPROM). This is a function 11814919Sxy150489 * pointer entry point called by drivers. 11824919Sxy150489 */ 11834919Sxy150489 s32 11844919Sxy150489 e1000_read_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 11854919Sxy150489 { 11866735Scc210113 if (hw->nvm.ops.read) 11876735Scc210113 return (hw->nvm.ops.read(hw, offset, words, data)); 11884919Sxy150489 11894919Sxy150489 return (-E1000_ERR_CONFIG); 11904919Sxy150489 } 11914919Sxy150489 11924919Sxy150489 /* 11934919Sxy150489 * e1000_write_nvm - Writes to NVM (EEPROM) 11944919Sxy150489 * @hw: pointer to the HW structure 11954919Sxy150489 * @offset: the word offset to read 11964919Sxy150489 * @words: number of 16-bit words to write 11974919Sxy150489 * @data: pointer to the properly sized buffer for the data. 11984919Sxy150489 * 11994919Sxy150489 * Writes 16-bit chunks of data to the NVM (EEPROM). This is a function 12004919Sxy150489 * pointer entry point called by drivers. 12014919Sxy150489 */ 12024919Sxy150489 s32 12034919Sxy150489 e1000_write_nvm(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) 12044919Sxy150489 { 12056735Scc210113 if (hw->nvm.ops.write) 12066735Scc210113 return (hw->nvm.ops.write(hw, offset, words, data)); 12074919Sxy150489 12084919Sxy150489 return (E1000_SUCCESS); 12094919Sxy150489 } 12104919Sxy150489 12114919Sxy150489 /* 12124919Sxy150489 * e1000_write_8bit_ctrl_reg - Writes 8bit Control register 12134919Sxy150489 * @hw: pointer to the HW structure 12144919Sxy150489 * @reg: 32bit register offset 12154919Sxy150489 * @offset: the register to write 12164919Sxy150489 * @data: the value to write. 12174919Sxy150489 * 12184919Sxy150489 * Writes the PHY register at offset with the value in data. 12194919Sxy150489 * This is a function pointer entry point called by drivers. 12204919Sxy150489 */ 12214919Sxy150489 s32 12224919Sxy150489 e1000_write_8bit_ctrl_reg(struct e1000_hw *hw, u32 reg, u32 offset, u8 data) 12234919Sxy150489 { 12244919Sxy150489 return (e1000_write_8bit_ctrl_reg_generic(hw, reg, offset, data)); 12254919Sxy150489 } 12266735Scc210113 12276735Scc210113 /* 12286735Scc210113 * e1000_power_up_phy - Restores link in case of PHY power down 12296735Scc210113 * @hw: pointer to the HW structure 12306735Scc210113 * 12316735Scc210113 * The phy may be powered down to save power, to turn off link when the 12326735Scc210113 * driver is unloaded, or wake on lan is not enabled (among others). 12336735Scc210113 */ 12346735Scc210113 void 12356735Scc210113 e1000_power_up_phy(struct e1000_hw *hw) 12366735Scc210113 { 12376735Scc210113 if (hw->phy.ops.power_up) 12386735Scc210113 hw->phy.ops.power_up(hw); 12396735Scc210113 12407426SChenliang.Xu@Sun.COM (void) e1000_setup_link(hw); 12416735Scc210113 } 12426735Scc210113 12436735Scc210113 /* 12446735Scc210113 * e1000_power_down_phy - Power down PHY 12456735Scc210113 * @hw: pointer to the HW structure 12466735Scc210113 * 12476735Scc210113 * The phy may be powered down to save power, to turn off link when the 12486735Scc210113 * driver is unloaded, or wake on lan is not enabled (among others). 12496735Scc210113 */ 12506735Scc210113 void 12516735Scc210113 e1000_power_down_phy(struct e1000_hw *hw) 12526735Scc210113 { 12536735Scc210113 if (hw->phy.ops.power_down) 12546735Scc210113 hw->phy.ops.power_down(hw); 12556735Scc210113 } 1256*7607STed.You@Sun.COM 1257*7607STed.You@Sun.COM /* 1258*7607STed.You@Sun.COM * e1000_shutdown_fiber_serdes_link - Remove link during power down 1259*7607STed.You@Sun.COM * @hw: pointer to the HW structure 1260*7607STed.You@Sun.COM * 1261*7607STed.You@Sun.COM * Shutdown the optics and PCS on driver unload. 1262*7607STed.You@Sun.COM */ 1263*7607STed.You@Sun.COM void 1264*7607STed.You@Sun.COM e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw) 1265*7607STed.You@Sun.COM { 1266*7607STed.You@Sun.COM if (hw->mac.ops.shutdown_serdes) 1267*7607STed.You@Sun.COM hw->mac.ops.shutdown_serdes(hw); 1268*7607STed.You@Sun.COM } 1269