1*b8270585SJack F Vogel /****************************************************************************** 2*b8270585SJack F Vogel 3*b8270585SJack F Vogel Copyright (c) 2001-2010, Intel Corporation 4*b8270585SJack F Vogel All rights reserved. 5*b8270585SJack F Vogel 6*b8270585SJack F Vogel Redistribution and use in source and binary forms, with or without 7*b8270585SJack F Vogel modification, are permitted provided that the following conditions are met: 8*b8270585SJack F Vogel 9*b8270585SJack F Vogel 1. Redistributions of source code must retain the above copyright notice, 10*b8270585SJack F Vogel this list of conditions and the following disclaimer. 11*b8270585SJack F Vogel 12*b8270585SJack F Vogel 2. Redistributions in binary form must reproduce the above copyright 13*b8270585SJack F Vogel notice, this list of conditions and the following disclaimer in the 14*b8270585SJack F Vogel documentation and/or other materials provided with the distribution. 15*b8270585SJack F Vogel 16*b8270585SJack F Vogel 3. Neither the name of the Intel Corporation nor the names of its 17*b8270585SJack F Vogel contributors may be used to endorse or promote products derived from 18*b8270585SJack F Vogel this software without specific prior written permission. 19*b8270585SJack F Vogel 20*b8270585SJack F Vogel THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21*b8270585SJack F Vogel AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22*b8270585SJack F Vogel IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23*b8270585SJack F Vogel ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24*b8270585SJack F Vogel LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25*b8270585SJack F Vogel CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26*b8270585SJack F Vogel SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*b8270585SJack F Vogel INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*b8270585SJack F Vogel CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29*b8270585SJack F Vogel ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30*b8270585SJack F Vogel POSSIBILITY OF SUCH DAMAGE. 31*b8270585SJack F Vogel 32*b8270585SJack F Vogel ******************************************************************************/ 33*b8270585SJack F Vogel /*$FreeBSD$*/ 34*b8270585SJack F Vogel 35*b8270585SJack F Vogel 36*b8270585SJack F Vogel #include "e1000_api.h" 37*b8270585SJack F Vogel 38*b8270585SJack F Vogel 39*b8270585SJack F Vogel static s32 e1000_init_phy_params_vf(struct e1000_hw *hw); 40*b8270585SJack F Vogel static s32 e1000_init_nvm_params_vf(struct e1000_hw *hw); 41*b8270585SJack F Vogel static void e1000_release_vf(struct e1000_hw *hw); 42*b8270585SJack F Vogel static s32 e1000_acquire_vf(struct e1000_hw *hw); 43*b8270585SJack F Vogel static s32 e1000_setup_link_vf(struct e1000_hw *hw); 44*b8270585SJack F Vogel static s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw); 45*b8270585SJack F Vogel static s32 e1000_init_mac_params_vf(struct e1000_hw *hw); 46*b8270585SJack F Vogel static s32 e1000_check_for_link_vf(struct e1000_hw *hw); 47*b8270585SJack F Vogel static s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed, 48*b8270585SJack F Vogel u16 *duplex); 49*b8270585SJack F Vogel static s32 e1000_init_hw_vf(struct e1000_hw *hw); 50*b8270585SJack F Vogel static s32 e1000_reset_hw_vf(struct e1000_hw *hw); 51*b8270585SJack F Vogel static void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, u8 *, u32); 52*b8270585SJack F Vogel static void e1000_rar_set_vf(struct e1000_hw *, u8 *, u32); 53*b8270585SJack F Vogel static s32 e1000_read_mac_addr_vf(struct e1000_hw *); 54*b8270585SJack F Vogel 55*b8270585SJack F Vogel /** 56*b8270585SJack F Vogel * e1000_init_phy_params_vf - Inits PHY params 57*b8270585SJack F Vogel * @hw: pointer to the HW structure 58*b8270585SJack F Vogel * 59*b8270585SJack F Vogel * Doesn't do much - there's no PHY available to the VF. 60*b8270585SJack F Vogel **/ 61*b8270585SJack F Vogel static s32 e1000_init_phy_params_vf(struct e1000_hw *hw) 62*b8270585SJack F Vogel { 63*b8270585SJack F Vogel DEBUGFUNC("e1000_init_phy_params_vf"); 64*b8270585SJack F Vogel hw->phy.type = e1000_phy_vf; 65*b8270585SJack F Vogel hw->phy.ops.acquire = e1000_acquire_vf; 66*b8270585SJack F Vogel hw->phy.ops.release = e1000_release_vf; 67*b8270585SJack F Vogel 68*b8270585SJack F Vogel return E1000_SUCCESS; 69*b8270585SJack F Vogel } 70*b8270585SJack F Vogel 71*b8270585SJack F Vogel /** 72*b8270585SJack F Vogel * e1000_init_nvm_params_vf - Inits NVM params 73*b8270585SJack F Vogel * @hw: pointer to the HW structure 74*b8270585SJack F Vogel * 75*b8270585SJack F Vogel * Doesn't do much - there's no NVM available to the VF. 76*b8270585SJack F Vogel **/ 77*b8270585SJack F Vogel static s32 e1000_init_nvm_params_vf(struct e1000_hw *hw) 78*b8270585SJack F Vogel { 79*b8270585SJack F Vogel DEBUGFUNC("e1000_init_nvm_params_vf"); 80*b8270585SJack F Vogel hw->nvm.type = e1000_nvm_none; 81*b8270585SJack F Vogel hw->nvm.ops.acquire = e1000_acquire_vf; 82*b8270585SJack F Vogel hw->nvm.ops.release = e1000_release_vf; 83*b8270585SJack F Vogel 84*b8270585SJack F Vogel return E1000_SUCCESS; 85*b8270585SJack F Vogel } 86*b8270585SJack F Vogel 87*b8270585SJack F Vogel /** 88*b8270585SJack F Vogel * e1000_init_mac_params_vf - Inits MAC params 89*b8270585SJack F Vogel * @hw: pointer to the HW structure 90*b8270585SJack F Vogel **/ 91*b8270585SJack F Vogel static s32 e1000_init_mac_params_vf(struct e1000_hw *hw) 92*b8270585SJack F Vogel { 93*b8270585SJack F Vogel struct e1000_mac_info *mac = &hw->mac; 94*b8270585SJack F Vogel 95*b8270585SJack F Vogel DEBUGFUNC("e1000_init_mac_params_vf"); 96*b8270585SJack F Vogel 97*b8270585SJack F Vogel /* Set media type */ 98*b8270585SJack F Vogel /* 99*b8270585SJack F Vogel * Virtual functions don't care what they're media type is as they 100*b8270585SJack F Vogel * have no direct access to the PHY, or the media. That is handled 101*b8270585SJack F Vogel * by the physical function driver. 102*b8270585SJack F Vogel */ 103*b8270585SJack F Vogel hw->phy.media_type = e1000_media_type_unknown; 104*b8270585SJack F Vogel 105*b8270585SJack F Vogel /* No ASF features for the VF driver */ 106*b8270585SJack F Vogel mac->asf_firmware_present = FALSE; 107*b8270585SJack F Vogel /* ARC subsystem not supported */ 108*b8270585SJack F Vogel mac->arc_subsystem_valid = FALSE; 109*b8270585SJack F Vogel /* Disable adaptive IFS mode so the generic funcs don't do anything */ 110*b8270585SJack F Vogel mac->adaptive_ifs = FALSE; 111*b8270585SJack F Vogel /* VF's have no MTA Registers - PF feature only */ 112*b8270585SJack F Vogel mac->mta_reg_count = 128; 113*b8270585SJack F Vogel /* VF's have no access to RAR entries */ 114*b8270585SJack F Vogel mac->rar_entry_count = 1; 115*b8270585SJack F Vogel 116*b8270585SJack F Vogel /* Function pointers */ 117*b8270585SJack F Vogel /* link setup */ 118*b8270585SJack F Vogel mac->ops.setup_link = e1000_setup_link_vf; 119*b8270585SJack F Vogel /* bus type/speed/width */ 120*b8270585SJack F Vogel mac->ops.get_bus_info = e1000_get_bus_info_pcie_vf; 121*b8270585SJack F Vogel /* reset */ 122*b8270585SJack F Vogel mac->ops.reset_hw = e1000_reset_hw_vf; 123*b8270585SJack F Vogel /* hw initialization */ 124*b8270585SJack F Vogel mac->ops.init_hw = e1000_init_hw_vf; 125*b8270585SJack F Vogel /* check for link */ 126*b8270585SJack F Vogel mac->ops.check_for_link = e1000_check_for_link_vf; 127*b8270585SJack F Vogel /* link info */ 128*b8270585SJack F Vogel mac->ops.get_link_up_info = e1000_get_link_up_info_vf; 129*b8270585SJack F Vogel /* multicast address update */ 130*b8270585SJack F Vogel mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_vf; 131*b8270585SJack F Vogel /* set mac address */ 132*b8270585SJack F Vogel mac->ops.rar_set = e1000_rar_set_vf; 133*b8270585SJack F Vogel /* read mac address */ 134*b8270585SJack F Vogel mac->ops.read_mac_addr = e1000_read_mac_addr_vf; 135*b8270585SJack F Vogel 136*b8270585SJack F Vogel 137*b8270585SJack F Vogel return E1000_SUCCESS; 138*b8270585SJack F Vogel } 139*b8270585SJack F Vogel 140*b8270585SJack F Vogel /** 141*b8270585SJack F Vogel * e1000_init_function_pointers_vf - Inits function pointers 142*b8270585SJack F Vogel * @hw: pointer to the HW structure 143*b8270585SJack F Vogel **/ 144*b8270585SJack F Vogel void e1000_init_function_pointers_vf(struct e1000_hw *hw) 145*b8270585SJack F Vogel { 146*b8270585SJack F Vogel DEBUGFUNC("e1000_init_function_pointers_vf"); 147*b8270585SJack F Vogel 148*b8270585SJack F Vogel hw->mac.ops.init_params = e1000_init_mac_params_vf; 149*b8270585SJack F Vogel hw->nvm.ops.init_params = e1000_init_nvm_params_vf; 150*b8270585SJack F Vogel hw->phy.ops.init_params = e1000_init_phy_params_vf; 151*b8270585SJack F Vogel hw->mbx.ops.init_params = e1000_init_mbx_params_vf; 152*b8270585SJack F Vogel } 153*b8270585SJack F Vogel 154*b8270585SJack F Vogel /** 155*b8270585SJack F Vogel * e1000_acquire_vf - Acquire rights to access PHY or NVM. 156*b8270585SJack F Vogel * @hw: pointer to the HW structure 157*b8270585SJack F Vogel * 158*b8270585SJack F Vogel * There is no PHY or NVM so we want all attempts to acquire these to fail. 159*b8270585SJack F Vogel * In addition, the MAC registers to access PHY/NVM don't exist so we don't 160*b8270585SJack F Vogel * even want any SW to attempt to use them. 161*b8270585SJack F Vogel **/ 162*b8270585SJack F Vogel static s32 e1000_acquire_vf(struct e1000_hw *hw) 163*b8270585SJack F Vogel { 164*b8270585SJack F Vogel return -E1000_ERR_PHY; 165*b8270585SJack F Vogel } 166*b8270585SJack F Vogel 167*b8270585SJack F Vogel /** 168*b8270585SJack F Vogel * e1000_release_vf - Release PHY or NVM 169*b8270585SJack F Vogel * @hw: pointer to the HW structure 170*b8270585SJack F Vogel * 171*b8270585SJack F Vogel * There is no PHY or NVM so we want all attempts to acquire these to fail. 172*b8270585SJack F Vogel * In addition, the MAC registers to access PHY/NVM don't exist so we don't 173*b8270585SJack F Vogel * even want any SW to attempt to use them. 174*b8270585SJack F Vogel **/ 175*b8270585SJack F Vogel static void e1000_release_vf(struct e1000_hw *hw) 176*b8270585SJack F Vogel { 177*b8270585SJack F Vogel return; 178*b8270585SJack F Vogel } 179*b8270585SJack F Vogel 180*b8270585SJack F Vogel /** 181*b8270585SJack F Vogel * e1000_setup_link_vf - Sets up link. 182*b8270585SJack F Vogel * @hw: pointer to the HW structure 183*b8270585SJack F Vogel * 184*b8270585SJack F Vogel * Virtual functions cannot change link. 185*b8270585SJack F Vogel **/ 186*b8270585SJack F Vogel static s32 e1000_setup_link_vf(struct e1000_hw *hw) 187*b8270585SJack F Vogel { 188*b8270585SJack F Vogel DEBUGFUNC("e1000_setup_link_vf"); 189*b8270585SJack F Vogel 190*b8270585SJack F Vogel return E1000_SUCCESS; 191*b8270585SJack F Vogel } 192*b8270585SJack F Vogel 193*b8270585SJack F Vogel /** 194*b8270585SJack F Vogel * e1000_get_bus_info_pcie_vf - Gets the bus info. 195*b8270585SJack F Vogel * @hw: pointer to the HW structure 196*b8270585SJack F Vogel * 197*b8270585SJack F Vogel * Virtual functions are not really on their own bus. 198*b8270585SJack F Vogel **/ 199*b8270585SJack F Vogel static s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw) 200*b8270585SJack F Vogel { 201*b8270585SJack F Vogel struct e1000_bus_info *bus = &hw->bus; 202*b8270585SJack F Vogel 203*b8270585SJack F Vogel DEBUGFUNC("e1000_get_bus_info_pcie_vf"); 204*b8270585SJack F Vogel 205*b8270585SJack F Vogel /* Do not set type PCI-E because we don't want disable master to run */ 206*b8270585SJack F Vogel bus->type = e1000_bus_type_reserved; 207*b8270585SJack F Vogel bus->speed = e1000_bus_speed_2500; 208*b8270585SJack F Vogel 209*b8270585SJack F Vogel return 0; 210*b8270585SJack F Vogel } 211*b8270585SJack F Vogel 212*b8270585SJack F Vogel /** 213*b8270585SJack F Vogel * e1000_get_link_up_info_vf - Gets link info. 214*b8270585SJack F Vogel * @hw: pointer to the HW structure 215*b8270585SJack F Vogel * @speed: pointer to 16 bit value to store link speed. 216*b8270585SJack F Vogel * @duplex: pointer to 16 bit value to store duplex. 217*b8270585SJack F Vogel * 218*b8270585SJack F Vogel * Since we cannot read the PHY and get accurate link info, we must rely upon 219*b8270585SJack F Vogel * the status register's data which is often stale and inaccurate. 220*b8270585SJack F Vogel **/ 221*b8270585SJack F Vogel static s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed, 222*b8270585SJack F Vogel u16 *duplex) 223*b8270585SJack F Vogel { 224*b8270585SJack F Vogel s32 status; 225*b8270585SJack F Vogel 226*b8270585SJack F Vogel DEBUGFUNC("e1000_get_link_up_info_vf"); 227*b8270585SJack F Vogel 228*b8270585SJack F Vogel status = E1000_READ_REG(hw, E1000_STATUS); 229*b8270585SJack F Vogel if (status & E1000_STATUS_SPEED_1000) { 230*b8270585SJack F Vogel *speed = SPEED_1000; 231*b8270585SJack F Vogel DEBUGOUT("1000 Mbs, "); 232*b8270585SJack F Vogel } else if (status & E1000_STATUS_SPEED_100) { 233*b8270585SJack F Vogel *speed = SPEED_100; 234*b8270585SJack F Vogel DEBUGOUT("100 Mbs, "); 235*b8270585SJack F Vogel } else { 236*b8270585SJack F Vogel *speed = SPEED_10; 237*b8270585SJack F Vogel DEBUGOUT("10 Mbs, "); 238*b8270585SJack F Vogel } 239*b8270585SJack F Vogel 240*b8270585SJack F Vogel if (status & E1000_STATUS_FD) { 241*b8270585SJack F Vogel *duplex = FULL_DUPLEX; 242*b8270585SJack F Vogel DEBUGOUT("Full Duplex\n"); 243*b8270585SJack F Vogel } else { 244*b8270585SJack F Vogel *duplex = HALF_DUPLEX; 245*b8270585SJack F Vogel DEBUGOUT("Half Duplex\n"); 246*b8270585SJack F Vogel } 247*b8270585SJack F Vogel 248*b8270585SJack F Vogel return E1000_SUCCESS; 249*b8270585SJack F Vogel } 250*b8270585SJack F Vogel 251*b8270585SJack F Vogel /** 252*b8270585SJack F Vogel * e1000_reset_hw_vf - Resets the HW 253*b8270585SJack F Vogel * @hw: pointer to the HW structure 254*b8270585SJack F Vogel * 255*b8270585SJack F Vogel * VF's provide a function level reset. This is done using bit 26 of ctrl_reg. 256*b8270585SJack F Vogel * This is all the reset we can perform on a VF. 257*b8270585SJack F Vogel **/ 258*b8270585SJack F Vogel static s32 e1000_reset_hw_vf(struct e1000_hw *hw) 259*b8270585SJack F Vogel { 260*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 261*b8270585SJack F Vogel u32 timeout = E1000_VF_INIT_TIMEOUT; 262*b8270585SJack F Vogel s32 ret_val = -E1000_ERR_MAC_INIT; 263*b8270585SJack F Vogel u32 ctrl, msgbuf[3]; 264*b8270585SJack F Vogel u8 *addr = (u8 *)(&msgbuf[1]); 265*b8270585SJack F Vogel 266*b8270585SJack F Vogel DEBUGFUNC("e1000_reset_hw_vf"); 267*b8270585SJack F Vogel 268*b8270585SJack F Vogel DEBUGOUT("Issuing a function level reset to MAC\n"); 269*b8270585SJack F Vogel ctrl = E1000_READ_REG(hw, E1000_CTRL); 270*b8270585SJack F Vogel E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST); 271*b8270585SJack F Vogel 272*b8270585SJack F Vogel /* we cannot reset while the RSTI / RSTD bits are asserted */ 273*b8270585SJack F Vogel while (!mbx->ops.check_for_rst(hw, 0) && timeout) { 274*b8270585SJack F Vogel timeout--; 275*b8270585SJack F Vogel usec_delay(5); 276*b8270585SJack F Vogel } 277*b8270585SJack F Vogel 278*b8270585SJack F Vogel if (timeout) { 279*b8270585SJack F Vogel /* mailbox timeout can now become active */ 280*b8270585SJack F Vogel mbx->timeout = E1000_VF_MBX_INIT_TIMEOUT; 281*b8270585SJack F Vogel 282*b8270585SJack F Vogel msgbuf[0] = E1000_VF_RESET; 283*b8270585SJack F Vogel mbx->ops.write_posted(hw, msgbuf, 1, 0); 284*b8270585SJack F Vogel 285*b8270585SJack F Vogel msec_delay(10); 286*b8270585SJack F Vogel 287*b8270585SJack F Vogel /* set our "perm_addr" based on info provided by PF */ 288*b8270585SJack F Vogel ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0); 289*b8270585SJack F Vogel if (!ret_val) { 290*b8270585SJack F Vogel if (msgbuf[0] == (E1000_VF_RESET | 291*b8270585SJack F Vogel E1000_VT_MSGTYPE_ACK)) 292*b8270585SJack F Vogel memcpy(hw->mac.perm_addr, addr, 6); 293*b8270585SJack F Vogel else 294*b8270585SJack F Vogel ret_val = -E1000_ERR_MAC_INIT; 295*b8270585SJack F Vogel } 296*b8270585SJack F Vogel } 297*b8270585SJack F Vogel 298*b8270585SJack F Vogel return ret_val; 299*b8270585SJack F Vogel } 300*b8270585SJack F Vogel 301*b8270585SJack F Vogel /** 302*b8270585SJack F Vogel * e1000_init_hw_vf - Inits the HW 303*b8270585SJack F Vogel * @hw: pointer to the HW structure 304*b8270585SJack F Vogel * 305*b8270585SJack F Vogel * Not much to do here except clear the PF Reset indication if there is one. 306*b8270585SJack F Vogel **/ 307*b8270585SJack F Vogel static s32 e1000_init_hw_vf(struct e1000_hw *hw) 308*b8270585SJack F Vogel { 309*b8270585SJack F Vogel DEBUGFUNC("e1000_init_hw_vf"); 310*b8270585SJack F Vogel 311*b8270585SJack F Vogel /* attempt to set and restore our mac address */ 312*b8270585SJack F Vogel e1000_rar_set_vf(hw, hw->mac.addr, 0); 313*b8270585SJack F Vogel 314*b8270585SJack F Vogel return E1000_SUCCESS; 315*b8270585SJack F Vogel } 316*b8270585SJack F Vogel 317*b8270585SJack F Vogel /** 318*b8270585SJack F Vogel * e1000_rar_set_vf - set device MAC address 319*b8270585SJack F Vogel * @hw: pointer to the HW structure 320*b8270585SJack F Vogel * @addr: pointer to the receive address 321*b8270585SJack F Vogel * @index receive address array register 322*b8270585SJack F Vogel **/ 323*b8270585SJack F Vogel static void e1000_rar_set_vf(struct e1000_hw *hw, u8 * addr, u32 index) 324*b8270585SJack F Vogel { 325*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 326*b8270585SJack F Vogel u32 msgbuf[3]; 327*b8270585SJack F Vogel u8 *msg_addr = (u8 *)(&msgbuf[1]); 328*b8270585SJack F Vogel s32 ret_val; 329*b8270585SJack F Vogel 330*b8270585SJack F Vogel memset(msgbuf, 0, 12); 331*b8270585SJack F Vogel msgbuf[0] = E1000_VF_SET_MAC_ADDR; 332*b8270585SJack F Vogel memcpy(msg_addr, addr, 6); 333*b8270585SJack F Vogel ret_val = mbx->ops.write_posted(hw, msgbuf, 3, 0); 334*b8270585SJack F Vogel 335*b8270585SJack F Vogel if (!ret_val) 336*b8270585SJack F Vogel ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0); 337*b8270585SJack F Vogel 338*b8270585SJack F Vogel msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS; 339*b8270585SJack F Vogel 340*b8270585SJack F Vogel /* if nacked the address was rejected, use "perm_addr" */ 341*b8270585SJack F Vogel if (!ret_val && 342*b8270585SJack F Vogel (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK))) 343*b8270585SJack F Vogel e1000_read_mac_addr_vf(hw); 344*b8270585SJack F Vogel } 345*b8270585SJack F Vogel 346*b8270585SJack F Vogel /** 347*b8270585SJack F Vogel * e1000_hash_mc_addr_vf - Generate a multicast hash value 348*b8270585SJack F Vogel * @hw: pointer to the HW structure 349*b8270585SJack F Vogel * @mc_addr: pointer to a multicast address 350*b8270585SJack F Vogel * 351*b8270585SJack F Vogel * Generates a multicast address hash value which is used to determine 352*b8270585SJack F Vogel * the multicast filter table array address and new table value. 353*b8270585SJack F Vogel **/ 354*b8270585SJack F Vogel static u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr) 355*b8270585SJack F Vogel { 356*b8270585SJack F Vogel u32 hash_value, hash_mask; 357*b8270585SJack F Vogel u8 bit_shift = 0; 358*b8270585SJack F Vogel 359*b8270585SJack F Vogel DEBUGFUNC("e1000_hash_mc_addr_generic"); 360*b8270585SJack F Vogel 361*b8270585SJack F Vogel /* Register count multiplied by bits per register */ 362*b8270585SJack F Vogel hash_mask = (hw->mac.mta_reg_count * 32) - 1; 363*b8270585SJack F Vogel 364*b8270585SJack F Vogel /* 365*b8270585SJack F Vogel * The bit_shift is the number of left-shifts 366*b8270585SJack F Vogel * where 0xFF would still fall within the hash mask. 367*b8270585SJack F Vogel */ 368*b8270585SJack F Vogel while (hash_mask >> bit_shift != 0xFF) 369*b8270585SJack F Vogel bit_shift++; 370*b8270585SJack F Vogel 371*b8270585SJack F Vogel hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) | 372*b8270585SJack F Vogel (((u16) mc_addr[5]) << bit_shift))); 373*b8270585SJack F Vogel 374*b8270585SJack F Vogel return hash_value; 375*b8270585SJack F Vogel } 376*b8270585SJack F Vogel 377*b8270585SJack F Vogel /** 378*b8270585SJack F Vogel * e1000_update_mc_addr_list_vf - Update Multicast addresses 379*b8270585SJack F Vogel * @hw: pointer to the HW structure 380*b8270585SJack F Vogel * @mc_addr_list: array of multicast addresses to program 381*b8270585SJack F Vogel * @mc_addr_count: number of multicast addresses to program 382*b8270585SJack F Vogel * 383*b8270585SJack F Vogel * Updates the Multicast Table Array. 384*b8270585SJack F Vogel * The caller must have a packed mc_addr_list of multicast addresses. 385*b8270585SJack F Vogel **/ 386*b8270585SJack F Vogel void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, 387*b8270585SJack F Vogel u8 *mc_addr_list, u32 mc_addr_count) 388*b8270585SJack F Vogel { 389*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 390*b8270585SJack F Vogel u32 msgbuf[E1000_VFMAILBOX_SIZE]; 391*b8270585SJack F Vogel u16 *hash_list = (u16 *)&msgbuf[1]; 392*b8270585SJack F Vogel u32 hash_value; 393*b8270585SJack F Vogel u32 i; 394*b8270585SJack F Vogel 395*b8270585SJack F Vogel DEBUGFUNC("e1000_update_mc_addr_list_vf"); 396*b8270585SJack F Vogel 397*b8270585SJack F Vogel /* Each entry in the list uses 1 16 bit word. We have 30 398*b8270585SJack F Vogel * 16 bit words available in our HW msg buffer (minus 1 for the 399*b8270585SJack F Vogel * msg type). That's 30 hash values if we pack 'em right. If 400*b8270585SJack F Vogel * there are more than 30 MC addresses to add then punt the 401*b8270585SJack F Vogel * extras for now and then add code to handle more than 30 later. 402*b8270585SJack F Vogel * It would be unusual for a server to request that many multi-cast 403*b8270585SJack F Vogel * addresses except for in large enterprise network environments. 404*b8270585SJack F Vogel */ 405*b8270585SJack F Vogel 406*b8270585SJack F Vogel DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count); 407*b8270585SJack F Vogel 408*b8270585SJack F Vogel if (mc_addr_count > 30) { 409*b8270585SJack F Vogel msgbuf[0] |= E1000_VF_SET_MULTICAST_OVERFLOW; 410*b8270585SJack F Vogel mc_addr_count = 30; 411*b8270585SJack F Vogel } 412*b8270585SJack F Vogel 413*b8270585SJack F Vogel msgbuf[0] = E1000_VF_SET_MULTICAST; 414*b8270585SJack F Vogel msgbuf[0] |= mc_addr_count << E1000_VT_MSGINFO_SHIFT; 415*b8270585SJack F Vogel 416*b8270585SJack F Vogel for (i = 0; i < mc_addr_count; i++) { 417*b8270585SJack F Vogel hash_value = e1000_hash_mc_addr_vf(hw, mc_addr_list); 418*b8270585SJack F Vogel DEBUGOUT1("Hash value = 0x%03X\n", hash_value); 419*b8270585SJack F Vogel hash_list[i] = hash_value & 0x0FFF; 420*b8270585SJack F Vogel mc_addr_list += ETH_ADDR_LEN; 421*b8270585SJack F Vogel } 422*b8270585SJack F Vogel 423*b8270585SJack F Vogel mbx->ops.write_posted(hw, msgbuf, E1000_VFMAILBOX_SIZE, 0); 424*b8270585SJack F Vogel } 425*b8270585SJack F Vogel 426*b8270585SJack F Vogel /** 427*b8270585SJack F Vogel * e1000_vfta_set_vf - Set/Unset vlan filter table address 428*b8270585SJack F Vogel * @hw: pointer to the HW structure 429*b8270585SJack F Vogel * @vid: determines the vfta register and bit to set/unset 430*b8270585SJack F Vogel * @set: if TRUE then set bit, else clear bit 431*b8270585SJack F Vogel **/ 432*b8270585SJack F Vogel void e1000_vfta_set_vf(struct e1000_hw *hw, u16 vid, bool set) 433*b8270585SJack F Vogel { 434*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 435*b8270585SJack F Vogel u32 msgbuf[2]; 436*b8270585SJack F Vogel 437*b8270585SJack F Vogel msgbuf[0] = E1000_VF_SET_VLAN; 438*b8270585SJack F Vogel msgbuf[1] = vid; 439*b8270585SJack F Vogel /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */ 440*b8270585SJack F Vogel if (set) 441*b8270585SJack F Vogel msgbuf[0] |= E1000_VF_SET_VLAN_ADD; 442*b8270585SJack F Vogel 443*b8270585SJack F Vogel mbx->ops.write_posted(hw, msgbuf, 2, 0); 444*b8270585SJack F Vogel } 445*b8270585SJack F Vogel 446*b8270585SJack F Vogel /** e1000_rlpml_set_vf - Set the maximum receive packet length 447*b8270585SJack F Vogel * @hw: pointer to the HW structure 448*b8270585SJack F Vogel * @max_size: value to assign to max frame size 449*b8270585SJack F Vogel **/ 450*b8270585SJack F Vogel void e1000_rlpml_set_vf(struct e1000_hw *hw, u16 max_size) 451*b8270585SJack F Vogel { 452*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 453*b8270585SJack F Vogel u32 msgbuf[2]; 454*b8270585SJack F Vogel 455*b8270585SJack F Vogel msgbuf[0] = E1000_VF_SET_LPE; 456*b8270585SJack F Vogel msgbuf[1] = max_size; 457*b8270585SJack F Vogel 458*b8270585SJack F Vogel mbx->ops.write_posted(hw, msgbuf, 2, 0); 459*b8270585SJack F Vogel } 460*b8270585SJack F Vogel 461*b8270585SJack F Vogel /** 462*b8270585SJack F Vogel * e1000_promisc_set_vf - Set flags for Unicast or Multicast promisc 463*b8270585SJack F Vogel * @hw: pointer to the HW structure 464*b8270585SJack F Vogel * @uni: boolean indicating unicast promisc status 465*b8270585SJack F Vogel * @multi: boolean indicating multicast promisc status 466*b8270585SJack F Vogel **/ 467*b8270585SJack F Vogel s32 e1000_promisc_set_vf(struct e1000_hw *hw, enum e1000_promisc_type type) 468*b8270585SJack F Vogel { 469*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 470*b8270585SJack F Vogel u32 msgbuf = E1000_VF_SET_PROMISC; 471*b8270585SJack F Vogel s32 ret_val; 472*b8270585SJack F Vogel 473*b8270585SJack F Vogel switch (type) { 474*b8270585SJack F Vogel case e1000_promisc_multicast: 475*b8270585SJack F Vogel msgbuf |= E1000_VF_SET_PROMISC_MULTICAST; 476*b8270585SJack F Vogel break; 477*b8270585SJack F Vogel case e1000_promisc_enabled: 478*b8270585SJack F Vogel msgbuf |= E1000_VF_SET_PROMISC_MULTICAST; 479*b8270585SJack F Vogel case e1000_promisc_unicast: 480*b8270585SJack F Vogel msgbuf |= E1000_VF_SET_PROMISC_UNICAST; 481*b8270585SJack F Vogel case e1000_promisc_disabled: 482*b8270585SJack F Vogel break; 483*b8270585SJack F Vogel default: 484*b8270585SJack F Vogel return -E1000_ERR_MAC_INIT; 485*b8270585SJack F Vogel } 486*b8270585SJack F Vogel 487*b8270585SJack F Vogel ret_val = mbx->ops.write_posted(hw, &msgbuf, 1, 0); 488*b8270585SJack F Vogel 489*b8270585SJack F Vogel if (!ret_val) 490*b8270585SJack F Vogel ret_val = mbx->ops.read_posted(hw, &msgbuf, 1, 0); 491*b8270585SJack F Vogel 492*b8270585SJack F Vogel if (!ret_val && !(msgbuf & E1000_VT_MSGTYPE_ACK)) 493*b8270585SJack F Vogel ret_val = -E1000_ERR_MAC_INIT; 494*b8270585SJack F Vogel 495*b8270585SJack F Vogel return ret_val; 496*b8270585SJack F Vogel } 497*b8270585SJack F Vogel 498*b8270585SJack F Vogel /** 499*b8270585SJack F Vogel * e1000_read_mac_addr_vf - Read device MAC address 500*b8270585SJack F Vogel * @hw: pointer to the HW structure 501*b8270585SJack F Vogel **/ 502*b8270585SJack F Vogel static s32 e1000_read_mac_addr_vf(struct e1000_hw *hw) 503*b8270585SJack F Vogel { 504*b8270585SJack F Vogel int i; 505*b8270585SJack F Vogel 506*b8270585SJack F Vogel for (i = 0; i < ETH_ADDR_LEN; i++) 507*b8270585SJack F Vogel hw->mac.addr[i] = hw->mac.perm_addr[i]; 508*b8270585SJack F Vogel 509*b8270585SJack F Vogel return E1000_SUCCESS; 510*b8270585SJack F Vogel } 511*b8270585SJack F Vogel 512*b8270585SJack F Vogel /** 513*b8270585SJack F Vogel * e1000_check_for_link_vf - Check for link for a virtual interface 514*b8270585SJack F Vogel * @hw: pointer to the HW structure 515*b8270585SJack F Vogel * 516*b8270585SJack F Vogel * Checks to see if the underlying PF is still talking to the VF and 517*b8270585SJack F Vogel * if it is then it reports the link state to the hardware, otherwise 518*b8270585SJack F Vogel * it reports link down and returns an error. 519*b8270585SJack F Vogel **/ 520*b8270585SJack F Vogel static s32 e1000_check_for_link_vf(struct e1000_hw *hw) 521*b8270585SJack F Vogel { 522*b8270585SJack F Vogel struct e1000_mbx_info *mbx = &hw->mbx; 523*b8270585SJack F Vogel struct e1000_mac_info *mac = &hw->mac; 524*b8270585SJack F Vogel s32 ret_val = E1000_SUCCESS; 525*b8270585SJack F Vogel u32 in_msg = 0; 526*b8270585SJack F Vogel 527*b8270585SJack F Vogel DEBUGFUNC("e1000_check_for_link_vf"); 528*b8270585SJack F Vogel 529*b8270585SJack F Vogel /* 530*b8270585SJack F Vogel * We only want to run this if there has been a rst asserted. 531*b8270585SJack F Vogel * in this case that could mean a link change, device reset, 532*b8270585SJack F Vogel * or a virtual function reset 533*b8270585SJack F Vogel */ 534*b8270585SJack F Vogel 535*b8270585SJack F Vogel /* If we were hit with a reset drop the link */ 536*b8270585SJack F Vogel if (!mbx->ops.check_for_rst(hw, 0)) 537*b8270585SJack F Vogel mac->get_link_status = TRUE; 538*b8270585SJack F Vogel 539*b8270585SJack F Vogel if (!mac->get_link_status) 540*b8270585SJack F Vogel goto out; 541*b8270585SJack F Vogel 542*b8270585SJack F Vogel /* if link status is down no point in checking to see if pf is up */ 543*b8270585SJack F Vogel if (!(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)) 544*b8270585SJack F Vogel goto out; 545*b8270585SJack F Vogel 546*b8270585SJack F Vogel /* if the read failed it could just be a mailbox collision, best wait 547*b8270585SJack F Vogel * until we are called again and don't report an error */ 548*b8270585SJack F Vogel if (mbx->ops.read(hw, &in_msg, 1, 0)) 549*b8270585SJack F Vogel goto out; 550*b8270585SJack F Vogel 551*b8270585SJack F Vogel /* if incoming message isn't clear to send we are waiting on response */ 552*b8270585SJack F Vogel if (!(in_msg & E1000_VT_MSGTYPE_CTS)) { 553*b8270585SJack F Vogel /* message is not CTS and is NACK we have lost CTS status */ 554*b8270585SJack F Vogel if (in_msg & E1000_VT_MSGTYPE_NACK) 555*b8270585SJack F Vogel ret_val = -E1000_ERR_MAC_INIT; 556*b8270585SJack F Vogel goto out; 557*b8270585SJack F Vogel } 558*b8270585SJack F Vogel 559*b8270585SJack F Vogel /* at this point we know the PF is talking to us, check and see if 560*b8270585SJack F Vogel * we are still accepting timeout or if we had a timeout failure. 561*b8270585SJack F Vogel * if we failed then we will need to reinit */ 562*b8270585SJack F Vogel if (!mbx->timeout) { 563*b8270585SJack F Vogel ret_val = -E1000_ERR_MAC_INIT; 564*b8270585SJack F Vogel goto out; 565*b8270585SJack F Vogel } 566*b8270585SJack F Vogel 567*b8270585SJack F Vogel /* if we passed all the tests above then the link is up and we no 568*b8270585SJack F Vogel * longer need to check for link */ 569*b8270585SJack F Vogel mac->get_link_status = FALSE; 570*b8270585SJack F Vogel 571*b8270585SJack F Vogel out: 572*b8270585SJack F Vogel return ret_val; 573*b8270585SJack F Vogel } 574*b8270585SJack F Vogel 575