162583d18SSepherosa Ziehau /******************************************************************************
262583d18SSepherosa Ziehau
3*65aebe9fSSepherosa Ziehau Copyright (c) 2001-2016, Intel Corporation
462583d18SSepherosa Ziehau All rights reserved.
562583d18SSepherosa Ziehau
662583d18SSepherosa Ziehau Redistribution and use in source and binary forms, with or without
762583d18SSepherosa Ziehau modification, are permitted provided that the following conditions are met:
862583d18SSepherosa Ziehau
962583d18SSepherosa Ziehau 1. Redistributions of source code must retain the above copyright notice,
1062583d18SSepherosa Ziehau this list of conditions and the following disclaimer.
1162583d18SSepherosa Ziehau
1262583d18SSepherosa Ziehau 2. Redistributions in binary form must reproduce the above copyright
1362583d18SSepherosa Ziehau notice, this list of conditions and the following disclaimer in the
1462583d18SSepherosa Ziehau documentation and/or other materials provided with the distribution.
1562583d18SSepherosa Ziehau
1662583d18SSepherosa Ziehau 3. Neither the name of the Intel Corporation nor the names of its
1762583d18SSepherosa Ziehau contributors may be used to endorse or promote products derived from
1862583d18SSepherosa Ziehau this software without specific prior written permission.
1962583d18SSepherosa Ziehau
2062583d18SSepherosa Ziehau THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2162583d18SSepherosa Ziehau AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2262583d18SSepherosa Ziehau IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2362583d18SSepherosa Ziehau ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2462583d18SSepherosa Ziehau LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2562583d18SSepherosa Ziehau CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2662583d18SSepherosa Ziehau SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2762583d18SSepherosa Ziehau INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2862583d18SSepherosa Ziehau CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2962583d18SSepherosa Ziehau ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3062583d18SSepherosa Ziehau POSSIBILITY OF SUCH DAMAGE.
3162583d18SSepherosa Ziehau
3262583d18SSepherosa Ziehau ******************************************************************************/
3362583d18SSepherosa Ziehau /*$FreeBSD$*/
3462583d18SSepherosa Ziehau
3562583d18SSepherosa Ziehau
3662583d18SSepherosa Ziehau #include "e1000_api.h"
3762583d18SSepherosa Ziehau
3862583d18SSepherosa Ziehau
3962583d18SSepherosa Ziehau static s32 e1000_init_phy_params_vf(struct e1000_hw *hw);
4062583d18SSepherosa Ziehau static s32 e1000_init_nvm_params_vf(struct e1000_hw *hw);
4162583d18SSepherosa Ziehau static void e1000_release_vf(struct e1000_hw *hw);
4262583d18SSepherosa Ziehau static s32 e1000_acquire_vf(struct e1000_hw *hw);
4362583d18SSepherosa Ziehau static s32 e1000_setup_link_vf(struct e1000_hw *hw);
4462583d18SSepherosa Ziehau static s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw);
4562583d18SSepherosa Ziehau static s32 e1000_init_mac_params_vf(struct e1000_hw *hw);
4662583d18SSepherosa Ziehau static s32 e1000_check_for_link_vf(struct e1000_hw *hw);
4762583d18SSepherosa Ziehau static s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed,
4862583d18SSepherosa Ziehau u16 *duplex);
4962583d18SSepherosa Ziehau static s32 e1000_init_hw_vf(struct e1000_hw *hw);
5062583d18SSepherosa Ziehau static s32 e1000_reset_hw_vf(struct e1000_hw *hw);
5162583d18SSepherosa Ziehau static void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, u8 *, u32);
524765c386SMichael Neumann static int e1000_rar_set_vf(struct e1000_hw *, u8 *, u32);
5362583d18SSepherosa Ziehau static s32 e1000_read_mac_addr_vf(struct e1000_hw *);
5462583d18SSepherosa Ziehau
5562583d18SSepherosa Ziehau /**
5662583d18SSepherosa Ziehau * e1000_init_phy_params_vf - Inits PHY params
5762583d18SSepherosa Ziehau * @hw: pointer to the HW structure
5862583d18SSepherosa Ziehau *
5962583d18SSepherosa Ziehau * Doesn't do much - there's no PHY available to the VF.
6062583d18SSepherosa Ziehau **/
e1000_init_phy_params_vf(struct e1000_hw * hw)6162583d18SSepherosa Ziehau static s32 e1000_init_phy_params_vf(struct e1000_hw *hw)
6262583d18SSepherosa Ziehau {
6362583d18SSepherosa Ziehau DEBUGFUNC("e1000_init_phy_params_vf");
6462583d18SSepherosa Ziehau hw->phy.type = e1000_phy_vf;
6562583d18SSepherosa Ziehau hw->phy.ops.acquire = e1000_acquire_vf;
6662583d18SSepherosa Ziehau hw->phy.ops.release = e1000_release_vf;
6762583d18SSepherosa Ziehau
6862583d18SSepherosa Ziehau return E1000_SUCCESS;
6962583d18SSepherosa Ziehau }
7062583d18SSepherosa Ziehau
7162583d18SSepherosa Ziehau /**
7262583d18SSepherosa Ziehau * e1000_init_nvm_params_vf - Inits NVM params
7362583d18SSepherosa Ziehau * @hw: pointer to the HW structure
7462583d18SSepherosa Ziehau *
7562583d18SSepherosa Ziehau * Doesn't do much - there's no NVM available to the VF.
7662583d18SSepherosa Ziehau **/
e1000_init_nvm_params_vf(struct e1000_hw * hw)7762583d18SSepherosa Ziehau static s32 e1000_init_nvm_params_vf(struct e1000_hw *hw)
7862583d18SSepherosa Ziehau {
7962583d18SSepherosa Ziehau DEBUGFUNC("e1000_init_nvm_params_vf");
8062583d18SSepherosa Ziehau hw->nvm.type = e1000_nvm_none;
8162583d18SSepherosa Ziehau hw->nvm.ops.acquire = e1000_acquire_vf;
8262583d18SSepherosa Ziehau hw->nvm.ops.release = e1000_release_vf;
8362583d18SSepherosa Ziehau
8462583d18SSepherosa Ziehau return E1000_SUCCESS;
8562583d18SSepherosa Ziehau }
8662583d18SSepherosa Ziehau
8762583d18SSepherosa Ziehau /**
8862583d18SSepherosa Ziehau * e1000_init_mac_params_vf - Inits MAC params
8962583d18SSepherosa Ziehau * @hw: pointer to the HW structure
9062583d18SSepherosa Ziehau **/
e1000_init_mac_params_vf(struct e1000_hw * hw)9162583d18SSepherosa Ziehau static s32 e1000_init_mac_params_vf(struct e1000_hw *hw)
9262583d18SSepherosa Ziehau {
9362583d18SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
9462583d18SSepherosa Ziehau
9562583d18SSepherosa Ziehau DEBUGFUNC("e1000_init_mac_params_vf");
9662583d18SSepherosa Ziehau
9762583d18SSepherosa Ziehau /* Set media type */
9862583d18SSepherosa Ziehau /*
9962583d18SSepherosa Ziehau * Virtual functions don't care what they're media type is as they
10062583d18SSepherosa Ziehau * have no direct access to the PHY, or the media. That is handled
10162583d18SSepherosa Ziehau * by the physical function driver.
10262583d18SSepherosa Ziehau */
10362583d18SSepherosa Ziehau hw->phy.media_type = e1000_media_type_unknown;
10462583d18SSepherosa Ziehau
10562583d18SSepherosa Ziehau /* No ASF features for the VF driver */
10662583d18SSepherosa Ziehau mac->asf_firmware_present = FALSE;
10762583d18SSepherosa Ziehau /* ARC subsystem not supported */
10862583d18SSepherosa Ziehau mac->arc_subsystem_valid = FALSE;
10962583d18SSepherosa Ziehau /* Disable adaptive IFS mode so the generic funcs don't do anything */
11062583d18SSepherosa Ziehau mac->adaptive_ifs = FALSE;
11162583d18SSepherosa Ziehau /* VF's have no MTA Registers - PF feature only */
11262583d18SSepherosa Ziehau mac->mta_reg_count = 128;
11362583d18SSepherosa Ziehau /* VF's have no access to RAR entries */
11462583d18SSepherosa Ziehau mac->rar_entry_count = 1;
11562583d18SSepherosa Ziehau
11662583d18SSepherosa Ziehau /* Function pointers */
11762583d18SSepherosa Ziehau /* link setup */
11862583d18SSepherosa Ziehau mac->ops.setup_link = e1000_setup_link_vf;
11962583d18SSepherosa Ziehau /* bus type/speed/width */
12062583d18SSepherosa Ziehau mac->ops.get_bus_info = e1000_get_bus_info_pcie_vf;
12162583d18SSepherosa Ziehau /* reset */
12262583d18SSepherosa Ziehau mac->ops.reset_hw = e1000_reset_hw_vf;
12362583d18SSepherosa Ziehau /* hw initialization */
12462583d18SSepherosa Ziehau mac->ops.init_hw = e1000_init_hw_vf;
12562583d18SSepherosa Ziehau /* check for link */
12662583d18SSepherosa Ziehau mac->ops.check_for_link = e1000_check_for_link_vf;
12762583d18SSepherosa Ziehau /* link info */
12862583d18SSepherosa Ziehau mac->ops.get_link_up_info = e1000_get_link_up_info_vf;
12962583d18SSepherosa Ziehau /* multicast address update */
13062583d18SSepherosa Ziehau mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_vf;
13162583d18SSepherosa Ziehau /* set mac address */
13262583d18SSepherosa Ziehau mac->ops.rar_set = e1000_rar_set_vf;
13362583d18SSepherosa Ziehau /* read mac address */
13462583d18SSepherosa Ziehau mac->ops.read_mac_addr = e1000_read_mac_addr_vf;
13562583d18SSepherosa Ziehau
13662583d18SSepherosa Ziehau
13762583d18SSepherosa Ziehau return E1000_SUCCESS;
13862583d18SSepherosa Ziehau }
13962583d18SSepherosa Ziehau
14062583d18SSepherosa Ziehau /**
14162583d18SSepherosa Ziehau * e1000_init_function_pointers_vf - Inits function pointers
14262583d18SSepherosa Ziehau * @hw: pointer to the HW structure
14362583d18SSepherosa Ziehau **/
e1000_init_function_pointers_vf(struct e1000_hw * hw)14462583d18SSepherosa Ziehau void e1000_init_function_pointers_vf(struct e1000_hw *hw)
14562583d18SSepherosa Ziehau {
14662583d18SSepherosa Ziehau DEBUGFUNC("e1000_init_function_pointers_vf");
14762583d18SSepherosa Ziehau
14862583d18SSepherosa Ziehau hw->mac.ops.init_params = e1000_init_mac_params_vf;
14962583d18SSepherosa Ziehau hw->nvm.ops.init_params = e1000_init_nvm_params_vf;
15062583d18SSepherosa Ziehau hw->phy.ops.init_params = e1000_init_phy_params_vf;
15162583d18SSepherosa Ziehau hw->mbx.ops.init_params = e1000_init_mbx_params_vf;
15262583d18SSepherosa Ziehau }
15362583d18SSepherosa Ziehau
15462583d18SSepherosa Ziehau /**
15562583d18SSepherosa Ziehau * e1000_acquire_vf - Acquire rights to access PHY or NVM.
15662583d18SSepherosa Ziehau * @hw: pointer to the HW structure
15762583d18SSepherosa Ziehau *
15862583d18SSepherosa Ziehau * There is no PHY or NVM so we want all attempts to acquire these to fail.
15962583d18SSepherosa Ziehau * In addition, the MAC registers to access PHY/NVM don't exist so we don't
16062583d18SSepherosa Ziehau * even want any SW to attempt to use them.
16162583d18SSepherosa Ziehau **/
e1000_acquire_vf(struct e1000_hw E1000_UNUSEDARG * hw)162379ebbe7SSepherosa Ziehau static s32 e1000_acquire_vf(struct e1000_hw E1000_UNUSEDARG *hw)
16362583d18SSepherosa Ziehau {
16462583d18SSepherosa Ziehau return -E1000_ERR_PHY;
16562583d18SSepherosa Ziehau }
16662583d18SSepherosa Ziehau
16762583d18SSepherosa Ziehau /**
16862583d18SSepherosa Ziehau * e1000_release_vf - Release PHY or NVM
16962583d18SSepherosa Ziehau * @hw: pointer to the HW structure
17062583d18SSepherosa Ziehau *
17162583d18SSepherosa Ziehau * There is no PHY or NVM so we want all attempts to acquire these to fail.
17262583d18SSepherosa Ziehau * In addition, the MAC registers to access PHY/NVM don't exist so we don't
17362583d18SSepherosa Ziehau * even want any SW to attempt to use them.
17462583d18SSepherosa Ziehau **/
e1000_release_vf(struct e1000_hw E1000_UNUSEDARG * hw)175379ebbe7SSepherosa Ziehau static void e1000_release_vf(struct e1000_hw E1000_UNUSEDARG *hw)
17662583d18SSepherosa Ziehau {
17762583d18SSepherosa Ziehau return;
17862583d18SSepherosa Ziehau }
17962583d18SSepherosa Ziehau
18062583d18SSepherosa Ziehau /**
18162583d18SSepherosa Ziehau * e1000_setup_link_vf - Sets up link.
18262583d18SSepherosa Ziehau * @hw: pointer to the HW structure
18362583d18SSepherosa Ziehau *
18462583d18SSepherosa Ziehau * Virtual functions cannot change link.
18562583d18SSepherosa Ziehau **/
e1000_setup_link_vf(struct e1000_hw E1000_UNUSEDARG * hw)186379ebbe7SSepherosa Ziehau static s32 e1000_setup_link_vf(struct e1000_hw E1000_UNUSEDARG *hw)
18762583d18SSepherosa Ziehau {
18862583d18SSepherosa Ziehau DEBUGFUNC("e1000_setup_link_vf");
18962583d18SSepherosa Ziehau
19062583d18SSepherosa Ziehau return E1000_SUCCESS;
19162583d18SSepherosa Ziehau }
19262583d18SSepherosa Ziehau
19362583d18SSepherosa Ziehau /**
19462583d18SSepherosa Ziehau * e1000_get_bus_info_pcie_vf - Gets the bus info.
19562583d18SSepherosa Ziehau * @hw: pointer to the HW structure
19662583d18SSepherosa Ziehau *
19762583d18SSepherosa Ziehau * Virtual functions are not really on their own bus.
19862583d18SSepherosa Ziehau **/
e1000_get_bus_info_pcie_vf(struct e1000_hw * hw)19962583d18SSepherosa Ziehau static s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw)
20062583d18SSepherosa Ziehau {
20162583d18SSepherosa Ziehau struct e1000_bus_info *bus = &hw->bus;
20262583d18SSepherosa Ziehau
20362583d18SSepherosa Ziehau DEBUGFUNC("e1000_get_bus_info_pcie_vf");
20462583d18SSepherosa Ziehau
20562583d18SSepherosa Ziehau /* Do not set type PCI-E because we don't want disable master to run */
20662583d18SSepherosa Ziehau bus->type = e1000_bus_type_reserved;
20762583d18SSepherosa Ziehau bus->speed = e1000_bus_speed_2500;
20862583d18SSepherosa Ziehau
20962583d18SSepherosa Ziehau return 0;
21062583d18SSepherosa Ziehau }
21162583d18SSepherosa Ziehau
21262583d18SSepherosa Ziehau /**
21362583d18SSepherosa Ziehau * e1000_get_link_up_info_vf - Gets link info.
21462583d18SSepherosa Ziehau * @hw: pointer to the HW structure
21562583d18SSepherosa Ziehau * @speed: pointer to 16 bit value to store link speed.
21662583d18SSepherosa Ziehau * @duplex: pointer to 16 bit value to store duplex.
21762583d18SSepherosa Ziehau *
21862583d18SSepherosa Ziehau * Since we cannot read the PHY and get accurate link info, we must rely upon
21962583d18SSepherosa Ziehau * the status register's data which is often stale and inaccurate.
22062583d18SSepherosa Ziehau **/
e1000_get_link_up_info_vf(struct e1000_hw * hw,u16 * speed,u16 * duplex)22162583d18SSepherosa Ziehau static s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed,
22262583d18SSepherosa Ziehau u16 *duplex)
22362583d18SSepherosa Ziehau {
22462583d18SSepherosa Ziehau s32 status;
22562583d18SSepherosa Ziehau
22662583d18SSepherosa Ziehau DEBUGFUNC("e1000_get_link_up_info_vf");
22762583d18SSepherosa Ziehau
22862583d18SSepherosa Ziehau status = E1000_READ_REG(hw, E1000_STATUS);
22962583d18SSepherosa Ziehau if (status & E1000_STATUS_SPEED_1000) {
23062583d18SSepherosa Ziehau *speed = SPEED_1000;
23162583d18SSepherosa Ziehau DEBUGOUT("1000 Mbs, ");
23262583d18SSepherosa Ziehau } else if (status & E1000_STATUS_SPEED_100) {
23362583d18SSepherosa Ziehau *speed = SPEED_100;
23462583d18SSepherosa Ziehau DEBUGOUT("100 Mbs, ");
23562583d18SSepherosa Ziehau } else {
23662583d18SSepherosa Ziehau *speed = SPEED_10;
23762583d18SSepherosa Ziehau DEBUGOUT("10 Mbs, ");
23862583d18SSepherosa Ziehau }
23962583d18SSepherosa Ziehau
24062583d18SSepherosa Ziehau if (status & E1000_STATUS_FD) {
24162583d18SSepherosa Ziehau *duplex = FULL_DUPLEX;
24262583d18SSepherosa Ziehau DEBUGOUT("Full Duplex\n");
24362583d18SSepherosa Ziehau } else {
24462583d18SSepherosa Ziehau *duplex = HALF_DUPLEX;
24562583d18SSepherosa Ziehau DEBUGOUT("Half Duplex\n");
24662583d18SSepherosa Ziehau }
24762583d18SSepherosa Ziehau
24862583d18SSepherosa Ziehau return E1000_SUCCESS;
24962583d18SSepherosa Ziehau }
25062583d18SSepherosa Ziehau
25162583d18SSepherosa Ziehau /**
25262583d18SSepherosa Ziehau * e1000_reset_hw_vf - Resets the HW
25362583d18SSepherosa Ziehau * @hw: pointer to the HW structure
25462583d18SSepherosa Ziehau *
25562583d18SSepherosa Ziehau * VF's provide a function level reset. This is done using bit 26 of ctrl_reg.
25662583d18SSepherosa Ziehau * This is all the reset we can perform on a VF.
25762583d18SSepherosa Ziehau **/
e1000_reset_hw_vf(struct e1000_hw * hw)25862583d18SSepherosa Ziehau static s32 e1000_reset_hw_vf(struct e1000_hw *hw)
25962583d18SSepherosa Ziehau {
26062583d18SSepherosa Ziehau struct e1000_mbx_info *mbx = &hw->mbx;
26162583d18SSepherosa Ziehau u32 timeout = E1000_VF_INIT_TIMEOUT;
26262583d18SSepherosa Ziehau s32 ret_val = -E1000_ERR_MAC_INIT;
26362583d18SSepherosa Ziehau u32 ctrl, msgbuf[3];
26462583d18SSepherosa Ziehau u8 *addr = (u8 *)(&msgbuf[1]);
26562583d18SSepherosa Ziehau
26662583d18SSepherosa Ziehau DEBUGFUNC("e1000_reset_hw_vf");
26762583d18SSepherosa Ziehau
26862583d18SSepherosa Ziehau DEBUGOUT("Issuing a function level reset to MAC\n");
26962583d18SSepherosa Ziehau ctrl = E1000_READ_REG(hw, E1000_CTRL);
27062583d18SSepherosa Ziehau E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
27162583d18SSepherosa Ziehau
27262583d18SSepherosa Ziehau /* we cannot reset while the RSTI / RSTD bits are asserted */
27362583d18SSepherosa Ziehau while (!mbx->ops.check_for_rst(hw, 0) && timeout) {
27462583d18SSepherosa Ziehau timeout--;
27562583d18SSepherosa Ziehau usec_delay(5);
27662583d18SSepherosa Ziehau }
27762583d18SSepherosa Ziehau
27862583d18SSepherosa Ziehau if (timeout) {
27962583d18SSepherosa Ziehau /* mailbox timeout can now become active */
28062583d18SSepherosa Ziehau mbx->timeout = E1000_VF_MBX_INIT_TIMEOUT;
28162583d18SSepherosa Ziehau
28262583d18SSepherosa Ziehau msgbuf[0] = E1000_VF_RESET;
28362583d18SSepherosa Ziehau mbx->ops.write_posted(hw, msgbuf, 1, 0);
28462583d18SSepherosa Ziehau
28562583d18SSepherosa Ziehau msec_delay(10);
28662583d18SSepherosa Ziehau
28762583d18SSepherosa Ziehau /* set our "perm_addr" based on info provided by PF */
28862583d18SSepherosa Ziehau ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0);
28962583d18SSepherosa Ziehau if (!ret_val) {
29062583d18SSepherosa Ziehau if (msgbuf[0] == (E1000_VF_RESET |
29162583d18SSepherosa Ziehau E1000_VT_MSGTYPE_ACK))
29262583d18SSepherosa Ziehau memcpy(hw->mac.perm_addr, addr, 6);
29362583d18SSepherosa Ziehau else
29462583d18SSepherosa Ziehau ret_val = -E1000_ERR_MAC_INIT;
29562583d18SSepherosa Ziehau }
29662583d18SSepherosa Ziehau }
29762583d18SSepherosa Ziehau
29862583d18SSepherosa Ziehau return ret_val;
29962583d18SSepherosa Ziehau }
30062583d18SSepherosa Ziehau
30162583d18SSepherosa Ziehau /**
30262583d18SSepherosa Ziehau * e1000_init_hw_vf - Inits the HW
30362583d18SSepherosa Ziehau * @hw: pointer to the HW structure
30462583d18SSepherosa Ziehau *
30562583d18SSepherosa Ziehau * Not much to do here except clear the PF Reset indication if there is one.
30662583d18SSepherosa Ziehau **/
e1000_init_hw_vf(struct e1000_hw * hw)30762583d18SSepherosa Ziehau static s32 e1000_init_hw_vf(struct e1000_hw *hw)
30862583d18SSepherosa Ziehau {
30962583d18SSepherosa Ziehau DEBUGFUNC("e1000_init_hw_vf");
31062583d18SSepherosa Ziehau
31162583d18SSepherosa Ziehau /* attempt to set and restore our mac address */
31262583d18SSepherosa Ziehau e1000_rar_set_vf(hw, hw->mac.addr, 0);
31362583d18SSepherosa Ziehau
31462583d18SSepherosa Ziehau return E1000_SUCCESS;
31562583d18SSepherosa Ziehau }
31662583d18SSepherosa Ziehau
31762583d18SSepherosa Ziehau /**
31862583d18SSepherosa Ziehau * e1000_rar_set_vf - set device MAC address
31962583d18SSepherosa Ziehau * @hw: pointer to the HW structure
32062583d18SSepherosa Ziehau * @addr: pointer to the receive address
32162583d18SSepherosa Ziehau * @index receive address array register
32262583d18SSepherosa Ziehau **/
e1000_rar_set_vf(struct e1000_hw * hw,u8 * addr,u32 E1000_UNUSEDARG index)3234765c386SMichael Neumann static int e1000_rar_set_vf(struct e1000_hw *hw, u8 *addr,
324379ebbe7SSepherosa Ziehau u32 E1000_UNUSEDARG index)
32562583d18SSepherosa Ziehau {
32662583d18SSepherosa Ziehau struct e1000_mbx_info *mbx = &hw->mbx;
32762583d18SSepherosa Ziehau u32 msgbuf[3];
32862583d18SSepherosa Ziehau u8 *msg_addr = (u8 *)(&msgbuf[1]);
32962583d18SSepherosa Ziehau s32 ret_val;
33062583d18SSepherosa Ziehau
33162583d18SSepherosa Ziehau memset(msgbuf, 0, 12);
33262583d18SSepherosa Ziehau msgbuf[0] = E1000_VF_SET_MAC_ADDR;
33362583d18SSepherosa Ziehau memcpy(msg_addr, addr, 6);
33462583d18SSepherosa Ziehau ret_val = mbx->ops.write_posted(hw, msgbuf, 3, 0);
33562583d18SSepherosa Ziehau
33662583d18SSepherosa Ziehau if (!ret_val)
33762583d18SSepherosa Ziehau ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0);
33862583d18SSepherosa Ziehau
33962583d18SSepherosa Ziehau msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
34062583d18SSepherosa Ziehau
34162583d18SSepherosa Ziehau /* if nacked the address was rejected, use "perm_addr" */
34262583d18SSepherosa Ziehau if (!ret_val &&
34362583d18SSepherosa Ziehau (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK)))
34462583d18SSepherosa Ziehau e1000_read_mac_addr_vf(hw);
3454765c386SMichael Neumann
3464765c386SMichael Neumann return E1000_SUCCESS;
34762583d18SSepherosa Ziehau }
34862583d18SSepherosa Ziehau
34962583d18SSepherosa Ziehau /**
35062583d18SSepherosa Ziehau * e1000_hash_mc_addr_vf - Generate a multicast hash value
35162583d18SSepherosa Ziehau * @hw: pointer to the HW structure
35262583d18SSepherosa Ziehau * @mc_addr: pointer to a multicast address
35362583d18SSepherosa Ziehau *
35462583d18SSepherosa Ziehau * Generates a multicast address hash value which is used to determine
35562583d18SSepherosa Ziehau * the multicast filter table array address and new table value.
35662583d18SSepherosa Ziehau **/
e1000_hash_mc_addr_vf(struct e1000_hw * hw,u8 * mc_addr)35762583d18SSepherosa Ziehau static u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr)
35862583d18SSepherosa Ziehau {
35962583d18SSepherosa Ziehau u32 hash_value, hash_mask;
36062583d18SSepherosa Ziehau u8 bit_shift = 0;
36162583d18SSepherosa Ziehau
36262583d18SSepherosa Ziehau DEBUGFUNC("e1000_hash_mc_addr_generic");
36362583d18SSepherosa Ziehau
36462583d18SSepherosa Ziehau /* Register count multiplied by bits per register */
36562583d18SSepherosa Ziehau hash_mask = (hw->mac.mta_reg_count * 32) - 1;
36662583d18SSepherosa Ziehau
36762583d18SSepherosa Ziehau /*
36862583d18SSepherosa Ziehau * The bit_shift is the number of left-shifts
36962583d18SSepherosa Ziehau * where 0xFF would still fall within the hash mask.
37062583d18SSepherosa Ziehau */
37162583d18SSepherosa Ziehau while (hash_mask >> bit_shift != 0xFF)
37262583d18SSepherosa Ziehau bit_shift++;
37362583d18SSepherosa Ziehau
37462583d18SSepherosa Ziehau hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
37562583d18SSepherosa Ziehau (((u16) mc_addr[5]) << bit_shift)));
37662583d18SSepherosa Ziehau
37762583d18SSepherosa Ziehau return hash_value;
37862583d18SSepherosa Ziehau }
37962583d18SSepherosa Ziehau
e1000_write_msg_read_ack(struct e1000_hw * hw,u32 * msg,u16 size)3804be59a01SSepherosa Ziehau static void e1000_write_msg_read_ack(struct e1000_hw *hw,
3814be59a01SSepherosa Ziehau u32 *msg, u16 size)
3824be59a01SSepherosa Ziehau {
3834be59a01SSepherosa Ziehau struct e1000_mbx_info *mbx = &hw->mbx;
3844be59a01SSepherosa Ziehau u32 retmsg[E1000_VFMAILBOX_SIZE];
3854be59a01SSepherosa Ziehau s32 retval = mbx->ops.write_posted(hw, msg, size, 0);
3864be59a01SSepherosa Ziehau
3874be59a01SSepherosa Ziehau if (!retval)
3884be59a01SSepherosa Ziehau mbx->ops.read_posted(hw, retmsg, E1000_VFMAILBOX_SIZE, 0);
3894be59a01SSepherosa Ziehau }
3904be59a01SSepherosa Ziehau
39162583d18SSepherosa Ziehau /**
39262583d18SSepherosa Ziehau * e1000_update_mc_addr_list_vf - Update Multicast addresses
39362583d18SSepherosa Ziehau * @hw: pointer to the HW structure
39462583d18SSepherosa Ziehau * @mc_addr_list: array of multicast addresses to program
39562583d18SSepherosa Ziehau * @mc_addr_count: number of multicast addresses to program
39662583d18SSepherosa Ziehau *
39762583d18SSepherosa Ziehau * Updates the Multicast Table Array.
39862583d18SSepherosa Ziehau * The caller must have a packed mc_addr_list of multicast addresses.
39962583d18SSepherosa Ziehau **/
e1000_update_mc_addr_list_vf(struct e1000_hw * hw,u8 * mc_addr_list,u32 mc_addr_count)40062583d18SSepherosa Ziehau void e1000_update_mc_addr_list_vf(struct e1000_hw *hw,
40162583d18SSepherosa Ziehau u8 *mc_addr_list, u32 mc_addr_count)
40262583d18SSepherosa Ziehau {
40362583d18SSepherosa Ziehau u32 msgbuf[E1000_VFMAILBOX_SIZE];
40462583d18SSepherosa Ziehau u16 *hash_list = (u16 *)&msgbuf[1];
40562583d18SSepherosa Ziehau u32 hash_value;
40662583d18SSepherosa Ziehau u32 i;
40762583d18SSepherosa Ziehau
40862583d18SSepherosa Ziehau DEBUGFUNC("e1000_update_mc_addr_list_vf");
40962583d18SSepherosa Ziehau
41062583d18SSepherosa Ziehau /* Each entry in the list uses 1 16 bit word. We have 30
41162583d18SSepherosa Ziehau * 16 bit words available in our HW msg buffer (minus 1 for the
41262583d18SSepherosa Ziehau * msg type). That's 30 hash values if we pack 'em right. If
41362583d18SSepherosa Ziehau * there are more than 30 MC addresses to add then punt the
41462583d18SSepherosa Ziehau * extras for now and then add code to handle more than 30 later.
41562583d18SSepherosa Ziehau * It would be unusual for a server to request that many multi-cast
41662583d18SSepherosa Ziehau * addresses except for in large enterprise network environments.
41762583d18SSepherosa Ziehau */
41862583d18SSepherosa Ziehau
41962583d18SSepherosa Ziehau DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count);
42062583d18SSepherosa Ziehau
421*65aebe9fSSepherosa Ziehau if (mc_addr_count > 30) {
422*65aebe9fSSepherosa Ziehau msgbuf[0] |= E1000_VF_SET_MULTICAST_OVERFLOW;
42362583d18SSepherosa Ziehau mc_addr_count = 30;
424*65aebe9fSSepherosa Ziehau }
425a40fda39SSepherosa Ziehau
426a40fda39SSepherosa Ziehau msgbuf[0] = E1000_VF_SET_MULTICAST;
42762583d18SSepherosa Ziehau msgbuf[0] |= mc_addr_count << E1000_VT_MSGINFO_SHIFT;
42862583d18SSepherosa Ziehau
42962583d18SSepherosa Ziehau for (i = 0; i < mc_addr_count; i++) {
43062583d18SSepherosa Ziehau hash_value = e1000_hash_mc_addr_vf(hw, mc_addr_list);
43162583d18SSepherosa Ziehau DEBUGOUT1("Hash value = 0x%03X\n", hash_value);
43262583d18SSepherosa Ziehau hash_list[i] = hash_value & 0x0FFF;
43362583d18SSepherosa Ziehau mc_addr_list += ETH_ADDR_LEN;
43462583d18SSepherosa Ziehau }
43562583d18SSepherosa Ziehau
4364be59a01SSepherosa Ziehau e1000_write_msg_read_ack(hw, msgbuf, E1000_VFMAILBOX_SIZE);
43762583d18SSepherosa Ziehau }
43862583d18SSepherosa Ziehau
43962583d18SSepherosa Ziehau /**
44062583d18SSepherosa Ziehau * e1000_vfta_set_vf - Set/Unset vlan filter table address
44162583d18SSepherosa Ziehau * @hw: pointer to the HW structure
44262583d18SSepherosa Ziehau * @vid: determines the vfta register and bit to set/unset
44362583d18SSepherosa Ziehau * @set: if TRUE then set bit, else clear bit
44462583d18SSepherosa Ziehau **/
e1000_vfta_set_vf(struct e1000_hw * hw,u16 vid,bool set)44562583d18SSepherosa Ziehau void e1000_vfta_set_vf(struct e1000_hw *hw, u16 vid, bool set)
44662583d18SSepherosa Ziehau {
44762583d18SSepherosa Ziehau u32 msgbuf[2];
44862583d18SSepherosa Ziehau
44962583d18SSepherosa Ziehau msgbuf[0] = E1000_VF_SET_VLAN;
45062583d18SSepherosa Ziehau msgbuf[1] = vid;
45162583d18SSepherosa Ziehau /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
45262583d18SSepherosa Ziehau if (set)
45362583d18SSepherosa Ziehau msgbuf[0] |= E1000_VF_SET_VLAN_ADD;
45462583d18SSepherosa Ziehau
4554be59a01SSepherosa Ziehau e1000_write_msg_read_ack(hw, msgbuf, 2);
45662583d18SSepherosa Ziehau }
45762583d18SSepherosa Ziehau
45862583d18SSepherosa Ziehau /** e1000_rlpml_set_vf - Set the maximum receive packet length
45962583d18SSepherosa Ziehau * @hw: pointer to the HW structure
46062583d18SSepherosa Ziehau * @max_size: value to assign to max frame size
46162583d18SSepherosa Ziehau **/
e1000_rlpml_set_vf(struct e1000_hw * hw,u16 max_size)46262583d18SSepherosa Ziehau void e1000_rlpml_set_vf(struct e1000_hw *hw, u16 max_size)
46362583d18SSepherosa Ziehau {
46462583d18SSepherosa Ziehau u32 msgbuf[2];
46562583d18SSepherosa Ziehau
46662583d18SSepherosa Ziehau msgbuf[0] = E1000_VF_SET_LPE;
46762583d18SSepherosa Ziehau msgbuf[1] = max_size;
46862583d18SSepherosa Ziehau
4694be59a01SSepherosa Ziehau e1000_write_msg_read_ack(hw, msgbuf, 2);
47062583d18SSepherosa Ziehau }
47162583d18SSepherosa Ziehau
47262583d18SSepherosa Ziehau /**
47362583d18SSepherosa Ziehau * e1000_promisc_set_vf - Set flags for Unicast or Multicast promisc
47462583d18SSepherosa Ziehau * @hw: pointer to the HW structure
47562583d18SSepherosa Ziehau * @uni: boolean indicating unicast promisc status
47662583d18SSepherosa Ziehau * @multi: boolean indicating multicast promisc status
47762583d18SSepherosa Ziehau **/
e1000_promisc_set_vf(struct e1000_hw * hw,enum e1000_promisc_type type)47862583d18SSepherosa Ziehau s32 e1000_promisc_set_vf(struct e1000_hw *hw, enum e1000_promisc_type type)
47962583d18SSepherosa Ziehau {
48062583d18SSepherosa Ziehau struct e1000_mbx_info *mbx = &hw->mbx;
48162583d18SSepherosa Ziehau u32 msgbuf = E1000_VF_SET_PROMISC;
48262583d18SSepherosa Ziehau s32 ret_val;
48362583d18SSepherosa Ziehau
48462583d18SSepherosa Ziehau switch (type) {
48562583d18SSepherosa Ziehau case e1000_promisc_multicast:
48662583d18SSepherosa Ziehau msgbuf |= E1000_VF_SET_PROMISC_MULTICAST;
48762583d18SSepherosa Ziehau break;
48862583d18SSepherosa Ziehau case e1000_promisc_enabled:
48962583d18SSepherosa Ziehau msgbuf |= E1000_VF_SET_PROMISC_MULTICAST;
49062583d18SSepherosa Ziehau case e1000_promisc_unicast:
49162583d18SSepherosa Ziehau msgbuf |= E1000_VF_SET_PROMISC_UNICAST;
49262583d18SSepherosa Ziehau case e1000_promisc_disabled:
49362583d18SSepherosa Ziehau break;
49462583d18SSepherosa Ziehau default:
49562583d18SSepherosa Ziehau return -E1000_ERR_MAC_INIT;
49662583d18SSepherosa Ziehau }
49762583d18SSepherosa Ziehau
49862583d18SSepherosa Ziehau ret_val = mbx->ops.write_posted(hw, &msgbuf, 1, 0);
49962583d18SSepherosa Ziehau
50062583d18SSepherosa Ziehau if (!ret_val)
50162583d18SSepherosa Ziehau ret_val = mbx->ops.read_posted(hw, &msgbuf, 1, 0);
50262583d18SSepherosa Ziehau
50362583d18SSepherosa Ziehau if (!ret_val && !(msgbuf & E1000_VT_MSGTYPE_ACK))
50462583d18SSepherosa Ziehau ret_val = -E1000_ERR_MAC_INIT;
50562583d18SSepherosa Ziehau
50662583d18SSepherosa Ziehau return ret_val;
50762583d18SSepherosa Ziehau }
50862583d18SSepherosa Ziehau
50962583d18SSepherosa Ziehau /**
51062583d18SSepherosa Ziehau * e1000_read_mac_addr_vf - Read device MAC address
51162583d18SSepherosa Ziehau * @hw: pointer to the HW structure
51262583d18SSepherosa Ziehau **/
e1000_read_mac_addr_vf(struct e1000_hw * hw)51362583d18SSepherosa Ziehau static s32 e1000_read_mac_addr_vf(struct e1000_hw *hw)
51462583d18SSepherosa Ziehau {
51562583d18SSepherosa Ziehau int i;
51662583d18SSepherosa Ziehau
51762583d18SSepherosa Ziehau for (i = 0; i < ETH_ADDR_LEN; i++)
51862583d18SSepherosa Ziehau hw->mac.addr[i] = hw->mac.perm_addr[i];
51962583d18SSepherosa Ziehau
52062583d18SSepherosa Ziehau return E1000_SUCCESS;
52162583d18SSepherosa Ziehau }
52262583d18SSepherosa Ziehau
52362583d18SSepherosa Ziehau /**
52462583d18SSepherosa Ziehau * e1000_check_for_link_vf - Check for link for a virtual interface
52562583d18SSepherosa Ziehau * @hw: pointer to the HW structure
52662583d18SSepherosa Ziehau *
52762583d18SSepherosa Ziehau * Checks to see if the underlying PF is still talking to the VF and
52862583d18SSepherosa Ziehau * if it is then it reports the link state to the hardware, otherwise
52962583d18SSepherosa Ziehau * it reports link down and returns an error.
53062583d18SSepherosa Ziehau **/
e1000_check_for_link_vf(struct e1000_hw * hw)53162583d18SSepherosa Ziehau static s32 e1000_check_for_link_vf(struct e1000_hw *hw)
53262583d18SSepherosa Ziehau {
53362583d18SSepherosa Ziehau struct e1000_mbx_info *mbx = &hw->mbx;
53462583d18SSepherosa Ziehau struct e1000_mac_info *mac = &hw->mac;
53562583d18SSepherosa Ziehau s32 ret_val = E1000_SUCCESS;
53662583d18SSepherosa Ziehau u32 in_msg = 0;
53762583d18SSepherosa Ziehau
53862583d18SSepherosa Ziehau DEBUGFUNC("e1000_check_for_link_vf");
53962583d18SSepherosa Ziehau
54062583d18SSepherosa Ziehau /*
54162583d18SSepherosa Ziehau * We only want to run this if there has been a rst asserted.
54262583d18SSepherosa Ziehau * in this case that could mean a link change, device reset,
54362583d18SSepherosa Ziehau * or a virtual function reset
54462583d18SSepherosa Ziehau */
54562583d18SSepherosa Ziehau
54662583d18SSepherosa Ziehau /* If we were hit with a reset or timeout drop the link */
54762583d18SSepherosa Ziehau if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout)
54862583d18SSepherosa Ziehau mac->get_link_status = TRUE;
54962583d18SSepherosa Ziehau
55062583d18SSepherosa Ziehau if (!mac->get_link_status)
55162583d18SSepherosa Ziehau goto out;
55262583d18SSepherosa Ziehau
55362583d18SSepherosa Ziehau /* if link status is down no point in checking to see if pf is up */
55462583d18SSepherosa Ziehau if (!(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU))
55562583d18SSepherosa Ziehau goto out;
55662583d18SSepherosa Ziehau
55762583d18SSepherosa Ziehau /* if the read failed it could just be a mailbox collision, best wait
55862583d18SSepherosa Ziehau * until we are called again and don't report an error */
55962583d18SSepherosa Ziehau if (mbx->ops.read(hw, &in_msg, 1, 0))
56062583d18SSepherosa Ziehau goto out;
56162583d18SSepherosa Ziehau
56262583d18SSepherosa Ziehau /* if incoming message isn't clear to send we are waiting on response */
56362583d18SSepherosa Ziehau if (!(in_msg & E1000_VT_MSGTYPE_CTS)) {
56462583d18SSepherosa Ziehau /* message is not CTS and is NACK we have lost CTS status */
56562583d18SSepherosa Ziehau if (in_msg & E1000_VT_MSGTYPE_NACK)
56662583d18SSepherosa Ziehau ret_val = -E1000_ERR_MAC_INIT;
56762583d18SSepherosa Ziehau goto out;
56862583d18SSepherosa Ziehau }
56962583d18SSepherosa Ziehau
57062583d18SSepherosa Ziehau /* at this point we know the PF is talking to us, check and see if
57162583d18SSepherosa Ziehau * we are still accepting timeout or if we had a timeout failure.
57262583d18SSepherosa Ziehau * if we failed then we will need to reinit */
57362583d18SSepherosa Ziehau if (!mbx->timeout) {
57462583d18SSepherosa Ziehau ret_val = -E1000_ERR_MAC_INIT;
57562583d18SSepherosa Ziehau goto out;
57662583d18SSepherosa Ziehau }
57762583d18SSepherosa Ziehau
57862583d18SSepherosa Ziehau /* if we passed all the tests above then the link is up and we no
57962583d18SSepherosa Ziehau * longer need to check for link */
58062583d18SSepherosa Ziehau mac->get_link_status = FALSE;
58162583d18SSepherosa Ziehau
58262583d18SSepherosa Ziehau out:
58362583d18SSepherosa Ziehau return ret_val;
58462583d18SSepherosa Ziehau }
58562583d18SSepherosa Ziehau
586