1dee1ad47SJeff Kirsher /******************************************************************************* 2dee1ad47SJeff Kirsher 3dee1ad47SJeff Kirsher Intel 82599 Virtual Function driver 4dee1ad47SJeff Kirsher Copyright(c) 1999 - 2010 Intel Corporation. 5dee1ad47SJeff Kirsher 6dee1ad47SJeff Kirsher This program is free software; you can redistribute it and/or modify it 7dee1ad47SJeff Kirsher under the terms and conditions of the GNU General Public License, 8dee1ad47SJeff Kirsher version 2, as published by the Free Software Foundation. 9dee1ad47SJeff Kirsher 10dee1ad47SJeff Kirsher This program is distributed in the hope it will be useful, but WITHOUT 11dee1ad47SJeff Kirsher ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12dee1ad47SJeff Kirsher FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13dee1ad47SJeff Kirsher more details. 14dee1ad47SJeff Kirsher 15dee1ad47SJeff Kirsher You should have received a copy of the GNU General Public License along with 16dee1ad47SJeff Kirsher this program; if not, write to the Free Software Foundation, Inc., 17dee1ad47SJeff Kirsher 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18dee1ad47SJeff Kirsher 19dee1ad47SJeff Kirsher The full GNU General Public License is included in this distribution in 20dee1ad47SJeff Kirsher the file called "COPYING". 21dee1ad47SJeff Kirsher 22dee1ad47SJeff Kirsher Contact Information: 23dee1ad47SJeff Kirsher e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 24dee1ad47SJeff Kirsher Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 25dee1ad47SJeff Kirsher 26dee1ad47SJeff Kirsher *******************************************************************************/ 27dee1ad47SJeff Kirsher 28dee1ad47SJeff Kirsher #include "vf.h" 29b5417bf8SStephen Hemminger #include "ixgbevf.h" 30dee1ad47SJeff Kirsher 31dee1ad47SJeff Kirsher /** 32dee1ad47SJeff Kirsher * ixgbevf_start_hw_vf - Prepare hardware for Tx/Rx 33dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 34dee1ad47SJeff Kirsher * 35dee1ad47SJeff Kirsher * Starts the hardware by filling the bus info structure and media type, clears 36dee1ad47SJeff Kirsher * all on chip counters, initializes receive address registers, multicast 37dee1ad47SJeff Kirsher * table, VLAN filter table, calls routine to set up link and flow control 38dee1ad47SJeff Kirsher * settings, and leaves transmit and receive units disabled and uninitialized 39dee1ad47SJeff Kirsher **/ 40dee1ad47SJeff Kirsher static s32 ixgbevf_start_hw_vf(struct ixgbe_hw *hw) 41dee1ad47SJeff Kirsher { 42dee1ad47SJeff Kirsher /* Clear adapter stopped flag */ 43dee1ad47SJeff Kirsher hw->adapter_stopped = false; 44dee1ad47SJeff Kirsher 45dee1ad47SJeff Kirsher return 0; 46dee1ad47SJeff Kirsher } 47dee1ad47SJeff Kirsher 48dee1ad47SJeff Kirsher /** 49dee1ad47SJeff Kirsher * ixgbevf_init_hw_vf - virtual function hardware initialization 50dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 51dee1ad47SJeff Kirsher * 52dee1ad47SJeff Kirsher * Initialize the hardware by resetting the hardware and then starting 53dee1ad47SJeff Kirsher * the hardware 54dee1ad47SJeff Kirsher **/ 55dee1ad47SJeff Kirsher static s32 ixgbevf_init_hw_vf(struct ixgbe_hw *hw) 56dee1ad47SJeff Kirsher { 57dee1ad47SJeff Kirsher s32 status = hw->mac.ops.start_hw(hw); 58dee1ad47SJeff Kirsher 59dee1ad47SJeff Kirsher hw->mac.ops.get_mac_addr(hw, hw->mac.addr); 60dee1ad47SJeff Kirsher 61dee1ad47SJeff Kirsher return status; 62dee1ad47SJeff Kirsher } 63dee1ad47SJeff Kirsher 64dee1ad47SJeff Kirsher /** 65dee1ad47SJeff Kirsher * ixgbevf_reset_hw_vf - Performs hardware reset 66dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 67dee1ad47SJeff Kirsher * 68dee1ad47SJeff Kirsher * Resets the hardware by reseting the transmit and receive units, masks and 69dee1ad47SJeff Kirsher * clears all interrupts. 70dee1ad47SJeff Kirsher **/ 71dee1ad47SJeff Kirsher static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw) 72dee1ad47SJeff Kirsher { 73dee1ad47SJeff Kirsher struct ixgbe_mbx_info *mbx = &hw->mbx; 74dee1ad47SJeff Kirsher u32 timeout = IXGBE_VF_INIT_TIMEOUT; 75dee1ad47SJeff Kirsher s32 ret_val = IXGBE_ERR_INVALID_MAC_ADDR; 76dee1ad47SJeff Kirsher u32 msgbuf[IXGBE_VF_PERMADDR_MSG_LEN]; 77dee1ad47SJeff Kirsher u8 *addr = (u8 *)(&msgbuf[1]); 78dee1ad47SJeff Kirsher 79dee1ad47SJeff Kirsher /* Call adapter stop to disable tx/rx and clear interrupts */ 80dee1ad47SJeff Kirsher hw->mac.ops.stop_adapter(hw); 81dee1ad47SJeff Kirsher 82dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_VFCTRL, IXGBE_CTRL_RST); 83dee1ad47SJeff Kirsher IXGBE_WRITE_FLUSH(hw); 84dee1ad47SJeff Kirsher 85dee1ad47SJeff Kirsher /* we cannot reset while the RSTI / RSTD bits are asserted */ 86dee1ad47SJeff Kirsher while (!mbx->ops.check_for_rst(hw) && timeout) { 87dee1ad47SJeff Kirsher timeout--; 88dee1ad47SJeff Kirsher udelay(5); 89dee1ad47SJeff Kirsher } 90dee1ad47SJeff Kirsher 91dee1ad47SJeff Kirsher if (!timeout) 92dee1ad47SJeff Kirsher return IXGBE_ERR_RESET_FAILED; 93dee1ad47SJeff Kirsher 94dee1ad47SJeff Kirsher /* mailbox timeout can now become active */ 95dee1ad47SJeff Kirsher mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT; 96dee1ad47SJeff Kirsher 97dee1ad47SJeff Kirsher msgbuf[0] = IXGBE_VF_RESET; 98dee1ad47SJeff Kirsher mbx->ops.write_posted(hw, msgbuf, 1); 99dee1ad47SJeff Kirsher 100dee1ad47SJeff Kirsher msleep(10); 101dee1ad47SJeff Kirsher 102dee1ad47SJeff Kirsher /* set our "perm_addr" based on info provided by PF */ 103dee1ad47SJeff Kirsher /* also set up the mc_filter_type which is piggy backed 104dee1ad47SJeff Kirsher * on the mac address in word 3 */ 105dee1ad47SJeff Kirsher ret_val = mbx->ops.read_posted(hw, msgbuf, IXGBE_VF_PERMADDR_MSG_LEN); 106dee1ad47SJeff Kirsher if (ret_val) 107dee1ad47SJeff Kirsher return ret_val; 108dee1ad47SJeff Kirsher 109dee1ad47SJeff Kirsher if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK)) 110dee1ad47SJeff Kirsher return IXGBE_ERR_INVALID_MAC_ADDR; 111dee1ad47SJeff Kirsher 112ea99d832SJoe Perches memcpy(hw->mac.perm_addr, addr, ETH_ALEN); 113dee1ad47SJeff Kirsher hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD]; 114dee1ad47SJeff Kirsher 115dee1ad47SJeff Kirsher return 0; 116dee1ad47SJeff Kirsher } 117dee1ad47SJeff Kirsher 118dee1ad47SJeff Kirsher /** 119dee1ad47SJeff Kirsher * ixgbevf_stop_hw_vf - Generic stop Tx/Rx units 120dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 121dee1ad47SJeff Kirsher * 122dee1ad47SJeff Kirsher * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts, 123dee1ad47SJeff Kirsher * disables transmit and receive units. The adapter_stopped flag is used by 124dee1ad47SJeff Kirsher * the shared code and drivers to determine if the adapter is in a stopped 125dee1ad47SJeff Kirsher * state and should not touch the hardware. 126dee1ad47SJeff Kirsher **/ 127dee1ad47SJeff Kirsher static s32 ixgbevf_stop_hw_vf(struct ixgbe_hw *hw) 128dee1ad47SJeff Kirsher { 129dee1ad47SJeff Kirsher u32 number_of_queues; 130dee1ad47SJeff Kirsher u32 reg_val; 131dee1ad47SJeff Kirsher u16 i; 132dee1ad47SJeff Kirsher 133dee1ad47SJeff Kirsher /* 134dee1ad47SJeff Kirsher * Set the adapter_stopped flag so other driver functions stop touching 135dee1ad47SJeff Kirsher * the hardware 136dee1ad47SJeff Kirsher */ 137dee1ad47SJeff Kirsher hw->adapter_stopped = true; 138dee1ad47SJeff Kirsher 139dee1ad47SJeff Kirsher /* Disable the receive unit by stopped each queue */ 140dee1ad47SJeff Kirsher number_of_queues = hw->mac.max_rx_queues; 141dee1ad47SJeff Kirsher for (i = 0; i < number_of_queues; i++) { 142dee1ad47SJeff Kirsher reg_val = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)); 143dee1ad47SJeff Kirsher if (reg_val & IXGBE_RXDCTL_ENABLE) { 144dee1ad47SJeff Kirsher reg_val &= ~IXGBE_RXDCTL_ENABLE; 145dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), reg_val); 146dee1ad47SJeff Kirsher } 147dee1ad47SJeff Kirsher } 148dee1ad47SJeff Kirsher 149dee1ad47SJeff Kirsher IXGBE_WRITE_FLUSH(hw); 150dee1ad47SJeff Kirsher 151dee1ad47SJeff Kirsher /* Clear interrupt mask to stop from interrupts being generated */ 152dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, IXGBE_VF_IRQ_CLEAR_MASK); 153dee1ad47SJeff Kirsher 154dee1ad47SJeff Kirsher /* Clear any pending interrupts */ 155dee1ad47SJeff Kirsher IXGBE_READ_REG(hw, IXGBE_VTEICR); 156dee1ad47SJeff Kirsher 157dee1ad47SJeff Kirsher /* Disable the transmit unit. Each queue must be disabled. */ 158dee1ad47SJeff Kirsher number_of_queues = hw->mac.max_tx_queues; 159dee1ad47SJeff Kirsher for (i = 0; i < number_of_queues; i++) { 160dee1ad47SJeff Kirsher reg_val = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i)); 161dee1ad47SJeff Kirsher if (reg_val & IXGBE_TXDCTL_ENABLE) { 162dee1ad47SJeff Kirsher reg_val &= ~IXGBE_TXDCTL_ENABLE; 163dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), reg_val); 164dee1ad47SJeff Kirsher } 165dee1ad47SJeff Kirsher } 166dee1ad47SJeff Kirsher 167dee1ad47SJeff Kirsher return 0; 168dee1ad47SJeff Kirsher } 169dee1ad47SJeff Kirsher 170dee1ad47SJeff Kirsher /** 171dee1ad47SJeff Kirsher * ixgbevf_mta_vector - Determines bit-vector in multicast table to set 172dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 173dee1ad47SJeff Kirsher * @mc_addr: the multicast address 174dee1ad47SJeff Kirsher * 175dee1ad47SJeff Kirsher * Extracts the 12 bits, from a multicast address, to determine which 176dee1ad47SJeff Kirsher * bit-vector to set in the multicast table. The hardware uses 12 bits, from 177dee1ad47SJeff Kirsher * incoming rx multicast addresses, to determine the bit-vector to check in 178dee1ad47SJeff Kirsher * the MTA. Which of the 4 combination, of 12-bits, the hardware uses is set 179dee1ad47SJeff Kirsher * by the MO field of the MCSTCTRL. The MO field is set during initialization 180dee1ad47SJeff Kirsher * to mc_filter_type. 181dee1ad47SJeff Kirsher **/ 182dee1ad47SJeff Kirsher static s32 ixgbevf_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr) 183dee1ad47SJeff Kirsher { 184dee1ad47SJeff Kirsher u32 vector = 0; 185dee1ad47SJeff Kirsher 186dee1ad47SJeff Kirsher switch (hw->mac.mc_filter_type) { 187dee1ad47SJeff Kirsher case 0: /* use bits [47:36] of the address */ 188dee1ad47SJeff Kirsher vector = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4)); 189dee1ad47SJeff Kirsher break; 190dee1ad47SJeff Kirsher case 1: /* use bits [46:35] of the address */ 191dee1ad47SJeff Kirsher vector = ((mc_addr[4] >> 3) | (((u16)mc_addr[5]) << 5)); 192dee1ad47SJeff Kirsher break; 193dee1ad47SJeff Kirsher case 2: /* use bits [45:34] of the address */ 194dee1ad47SJeff Kirsher vector = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6)); 195dee1ad47SJeff Kirsher break; 196dee1ad47SJeff Kirsher case 3: /* use bits [43:32] of the address */ 197dee1ad47SJeff Kirsher vector = ((mc_addr[4]) | (((u16)mc_addr[5]) << 8)); 198dee1ad47SJeff Kirsher break; 199dee1ad47SJeff Kirsher default: /* Invalid mc_filter_type */ 200dee1ad47SJeff Kirsher break; 201dee1ad47SJeff Kirsher } 202dee1ad47SJeff Kirsher 203dee1ad47SJeff Kirsher /* vector can only be 12-bits or boundary will be exceeded */ 204dee1ad47SJeff Kirsher vector &= 0xFFF; 205dee1ad47SJeff Kirsher return vector; 206dee1ad47SJeff Kirsher } 207dee1ad47SJeff Kirsher 208dee1ad47SJeff Kirsher /** 209dee1ad47SJeff Kirsher * ixgbevf_get_mac_addr_vf - Read device MAC address 210dee1ad47SJeff Kirsher * @hw: pointer to the HW structure 211dee1ad47SJeff Kirsher * @mac_addr: pointer to storage for retrieved MAC address 212dee1ad47SJeff Kirsher **/ 213dee1ad47SJeff Kirsher static s32 ixgbevf_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr) 214dee1ad47SJeff Kirsher { 215ea99d832SJoe Perches memcpy(mac_addr, hw->mac.perm_addr, ETH_ALEN); 216dee1ad47SJeff Kirsher 217dee1ad47SJeff Kirsher return 0; 218dee1ad47SJeff Kirsher } 219dee1ad47SJeff Kirsher 220dee1ad47SJeff Kirsher static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr) 221dee1ad47SJeff Kirsher { 222dee1ad47SJeff Kirsher struct ixgbe_mbx_info *mbx = &hw->mbx; 223dee1ad47SJeff Kirsher u32 msgbuf[3]; 224dee1ad47SJeff Kirsher u8 *msg_addr = (u8 *)(&msgbuf[1]); 225dee1ad47SJeff Kirsher s32 ret_val; 226dee1ad47SJeff Kirsher 227dee1ad47SJeff Kirsher memset(msgbuf, 0, sizeof(msgbuf)); 228dee1ad47SJeff Kirsher /* 229dee1ad47SJeff Kirsher * If index is one then this is the start of a new list and needs 230dee1ad47SJeff Kirsher * indication to the PF so it can do it's own list management. 231dee1ad47SJeff Kirsher * If it is zero then that tells the PF to just clear all of 232dee1ad47SJeff Kirsher * this VF's macvlans and there is no new list. 233dee1ad47SJeff Kirsher */ 234dee1ad47SJeff Kirsher msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT; 235dee1ad47SJeff Kirsher msgbuf[0] |= IXGBE_VF_SET_MACVLAN; 236dee1ad47SJeff Kirsher if (addr) 237dee1ad47SJeff Kirsher memcpy(msg_addr, addr, 6); 238dee1ad47SJeff Kirsher ret_val = mbx->ops.write_posted(hw, msgbuf, 3); 239dee1ad47SJeff Kirsher 240dee1ad47SJeff Kirsher if (!ret_val) 241dee1ad47SJeff Kirsher ret_val = mbx->ops.read_posted(hw, msgbuf, 3); 242dee1ad47SJeff Kirsher 243dee1ad47SJeff Kirsher msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS; 244dee1ad47SJeff Kirsher 245dee1ad47SJeff Kirsher if (!ret_val) 246dee1ad47SJeff Kirsher if (msgbuf[0] == 247dee1ad47SJeff Kirsher (IXGBE_VF_SET_MACVLAN | IXGBE_VT_MSGTYPE_NACK)) 248dee1ad47SJeff Kirsher ret_val = -ENOMEM; 249dee1ad47SJeff Kirsher 250dee1ad47SJeff Kirsher return ret_val; 251dee1ad47SJeff Kirsher } 252dee1ad47SJeff Kirsher 253dee1ad47SJeff Kirsher /** 254dee1ad47SJeff Kirsher * ixgbevf_set_rar_vf - set device MAC address 255dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 256dee1ad47SJeff Kirsher * @index: Receive address register to write 257dee1ad47SJeff Kirsher * @addr: Address to put into receive address register 258dee1ad47SJeff Kirsher * @vmdq: Unused in this implementation 259dee1ad47SJeff Kirsher **/ 260dee1ad47SJeff Kirsher static s32 ixgbevf_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, 261dee1ad47SJeff Kirsher u32 vmdq) 262dee1ad47SJeff Kirsher { 263dee1ad47SJeff Kirsher struct ixgbe_mbx_info *mbx = &hw->mbx; 264dee1ad47SJeff Kirsher u32 msgbuf[3]; 265dee1ad47SJeff Kirsher u8 *msg_addr = (u8 *)(&msgbuf[1]); 266dee1ad47SJeff Kirsher s32 ret_val; 267dee1ad47SJeff Kirsher 268dee1ad47SJeff Kirsher memset(msgbuf, 0, sizeof(msgbuf)); 269dee1ad47SJeff Kirsher msgbuf[0] = IXGBE_VF_SET_MAC_ADDR; 270dee1ad47SJeff Kirsher memcpy(msg_addr, addr, 6); 271dee1ad47SJeff Kirsher ret_val = mbx->ops.write_posted(hw, msgbuf, 3); 272dee1ad47SJeff Kirsher 273dee1ad47SJeff Kirsher if (!ret_val) 274dee1ad47SJeff Kirsher ret_val = mbx->ops.read_posted(hw, msgbuf, 3); 275dee1ad47SJeff Kirsher 276dee1ad47SJeff Kirsher msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS; 277dee1ad47SJeff Kirsher 278dee1ad47SJeff Kirsher /* if nacked the address was rejected, use "perm_addr" */ 279dee1ad47SJeff Kirsher if (!ret_val && 280dee1ad47SJeff Kirsher (msgbuf[0] == (IXGBE_VF_SET_MAC_ADDR | IXGBE_VT_MSGTYPE_NACK))) 281dee1ad47SJeff Kirsher ixgbevf_get_mac_addr_vf(hw, hw->mac.addr); 282dee1ad47SJeff Kirsher 283dee1ad47SJeff Kirsher return ret_val; 284dee1ad47SJeff Kirsher } 285dee1ad47SJeff Kirsher 2863a2c4033SGreg Rose static void ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, 2873a2c4033SGreg Rose u32 *msg, u16 size) 2883a2c4033SGreg Rose { 2893a2c4033SGreg Rose struct ixgbe_mbx_info *mbx = &hw->mbx; 2903a2c4033SGreg Rose u32 retmsg[IXGBE_VFMAILBOX_SIZE]; 2913a2c4033SGreg Rose s32 retval = mbx->ops.write_posted(hw, msg, size); 2923a2c4033SGreg Rose 2933a2c4033SGreg Rose if (!retval) 2943a2c4033SGreg Rose mbx->ops.read_posted(hw, retmsg, size); 2953a2c4033SGreg Rose } 2963a2c4033SGreg Rose 297dee1ad47SJeff Kirsher /** 298dee1ad47SJeff Kirsher * ixgbevf_update_mc_addr_list_vf - Update Multicast addresses 299dee1ad47SJeff Kirsher * @hw: pointer to the HW structure 300dee1ad47SJeff Kirsher * @netdev: pointer to net device structure 301dee1ad47SJeff Kirsher * 302dee1ad47SJeff Kirsher * Updates the Multicast Table Array. 303dee1ad47SJeff Kirsher **/ 304dee1ad47SJeff Kirsher static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw, 305dee1ad47SJeff Kirsher struct net_device *netdev) 306dee1ad47SJeff Kirsher { 307dee1ad47SJeff Kirsher struct netdev_hw_addr *ha; 308dee1ad47SJeff Kirsher u32 msgbuf[IXGBE_VFMAILBOX_SIZE]; 309dee1ad47SJeff Kirsher u16 *vector_list = (u16 *)&msgbuf[1]; 310dee1ad47SJeff Kirsher u32 cnt, i; 311dee1ad47SJeff Kirsher 312dee1ad47SJeff Kirsher /* Each entry in the list uses 1 16 bit word. We have 30 313dee1ad47SJeff Kirsher * 16 bit words available in our HW msg buffer (minus 1 for the 314dee1ad47SJeff Kirsher * msg type). That's 30 hash values if we pack 'em right. If 315dee1ad47SJeff Kirsher * there are more than 30 MC addresses to add then punt the 316dee1ad47SJeff Kirsher * extras for now and then add code to handle more than 30 later. 317dee1ad47SJeff Kirsher * It would be unusual for a server to request that many multi-cast 318dee1ad47SJeff Kirsher * addresses except for in large enterprise network environments. 319dee1ad47SJeff Kirsher */ 320dee1ad47SJeff Kirsher 321dee1ad47SJeff Kirsher cnt = netdev_mc_count(netdev); 322dee1ad47SJeff Kirsher if (cnt > 30) 323dee1ad47SJeff Kirsher cnt = 30; 324dee1ad47SJeff Kirsher msgbuf[0] = IXGBE_VF_SET_MULTICAST; 325dee1ad47SJeff Kirsher msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT; 326dee1ad47SJeff Kirsher 327dee1ad47SJeff Kirsher i = 0; 328dee1ad47SJeff Kirsher netdev_for_each_mc_addr(ha, netdev) { 329dee1ad47SJeff Kirsher if (i == cnt) 330dee1ad47SJeff Kirsher break; 331dee1ad47SJeff Kirsher vector_list[i++] = ixgbevf_mta_vector(hw, ha->addr); 332dee1ad47SJeff Kirsher } 333dee1ad47SJeff Kirsher 3343a2c4033SGreg Rose ixgbevf_write_msg_read_ack(hw, msgbuf, IXGBE_VFMAILBOX_SIZE); 335dee1ad47SJeff Kirsher 336dee1ad47SJeff Kirsher return 0; 337dee1ad47SJeff Kirsher } 338dee1ad47SJeff Kirsher 339dee1ad47SJeff Kirsher /** 340dee1ad47SJeff Kirsher * ixgbevf_set_vfta_vf - Set/Unset vlan filter table address 341dee1ad47SJeff Kirsher * @hw: pointer to the HW structure 342dee1ad47SJeff Kirsher * @vlan: 12 bit VLAN ID 343dee1ad47SJeff Kirsher * @vind: unused by VF drivers 344dee1ad47SJeff Kirsher * @vlan_on: if true then set bit, else clear bit 345dee1ad47SJeff Kirsher **/ 346dee1ad47SJeff Kirsher static s32 ixgbevf_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind, 347dee1ad47SJeff Kirsher bool vlan_on) 348dee1ad47SJeff Kirsher { 349dee1ad47SJeff Kirsher u32 msgbuf[2]; 350dee1ad47SJeff Kirsher 351dee1ad47SJeff Kirsher msgbuf[0] = IXGBE_VF_SET_VLAN; 352dee1ad47SJeff Kirsher msgbuf[1] = vlan; 353dee1ad47SJeff Kirsher /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */ 354dee1ad47SJeff Kirsher msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT; 355dee1ad47SJeff Kirsher 3563a2c4033SGreg Rose ixgbevf_write_msg_read_ack(hw, msgbuf, 2); 3573a2c4033SGreg Rose 3583a2c4033SGreg Rose return 0; 359dee1ad47SJeff Kirsher } 360dee1ad47SJeff Kirsher 361dee1ad47SJeff Kirsher /** 362dee1ad47SJeff Kirsher * ixgbevf_setup_mac_link_vf - Setup MAC link settings 363dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 364dee1ad47SJeff Kirsher * @speed: Unused in this implementation 365dee1ad47SJeff Kirsher * @autoneg: Unused in this implementation 366dee1ad47SJeff Kirsher * @autoneg_wait_to_complete: Unused in this implementation 367dee1ad47SJeff Kirsher * 368dee1ad47SJeff Kirsher * Do nothing and return success. VF drivers are not allowed to change 369dee1ad47SJeff Kirsher * global settings. Maintained for driver compatibility. 370dee1ad47SJeff Kirsher **/ 371dee1ad47SJeff Kirsher static s32 ixgbevf_setup_mac_link_vf(struct ixgbe_hw *hw, 372dee1ad47SJeff Kirsher ixgbe_link_speed speed, bool autoneg, 373dee1ad47SJeff Kirsher bool autoneg_wait_to_complete) 374dee1ad47SJeff Kirsher { 375dee1ad47SJeff Kirsher return 0; 376dee1ad47SJeff Kirsher } 377dee1ad47SJeff Kirsher 378dee1ad47SJeff Kirsher /** 379dee1ad47SJeff Kirsher * ixgbevf_check_mac_link_vf - Get link/speed status 380dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 381dee1ad47SJeff Kirsher * @speed: pointer to link speed 382dee1ad47SJeff Kirsher * @link_up: true is link is up, false otherwise 383dee1ad47SJeff Kirsher * @autoneg_wait_to_complete: true when waiting for completion is needed 384dee1ad47SJeff Kirsher * 385dee1ad47SJeff Kirsher * Reads the links register to determine if link is up and the current speed 386dee1ad47SJeff Kirsher **/ 387dee1ad47SJeff Kirsher static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw, 388dee1ad47SJeff Kirsher ixgbe_link_speed *speed, 389dee1ad47SJeff Kirsher bool *link_up, 390dee1ad47SJeff Kirsher bool autoneg_wait_to_complete) 391dee1ad47SJeff Kirsher { 392dee1ad47SJeff Kirsher u32 links_reg; 393dee1ad47SJeff Kirsher 394dee1ad47SJeff Kirsher if (!(hw->mbx.ops.check_for_rst(hw))) { 395dee1ad47SJeff Kirsher *link_up = false; 396dee1ad47SJeff Kirsher *speed = 0; 397dee1ad47SJeff Kirsher return -1; 398dee1ad47SJeff Kirsher } 399dee1ad47SJeff Kirsher 400dee1ad47SJeff Kirsher links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS); 401dee1ad47SJeff Kirsher 402dee1ad47SJeff Kirsher if (links_reg & IXGBE_LINKS_UP) 403dee1ad47SJeff Kirsher *link_up = true; 404dee1ad47SJeff Kirsher else 405dee1ad47SJeff Kirsher *link_up = false; 406dee1ad47SJeff Kirsher 407dee1ad47SJeff Kirsher if ((links_reg & IXGBE_LINKS_SPEED_82599) == 408dee1ad47SJeff Kirsher IXGBE_LINKS_SPEED_10G_82599) 409dee1ad47SJeff Kirsher *speed = IXGBE_LINK_SPEED_10GB_FULL; 410dee1ad47SJeff Kirsher else 411dee1ad47SJeff Kirsher *speed = IXGBE_LINK_SPEED_1GB_FULL; 412dee1ad47SJeff Kirsher 413dee1ad47SJeff Kirsher return 0; 414dee1ad47SJeff Kirsher } 415dee1ad47SJeff Kirsher 4163d8fe98fSStephen Hemminger static const struct ixgbe_mac_operations ixgbevf_mac_ops = { 417dee1ad47SJeff Kirsher .init_hw = ixgbevf_init_hw_vf, 418dee1ad47SJeff Kirsher .reset_hw = ixgbevf_reset_hw_vf, 419dee1ad47SJeff Kirsher .start_hw = ixgbevf_start_hw_vf, 420dee1ad47SJeff Kirsher .get_mac_addr = ixgbevf_get_mac_addr_vf, 421dee1ad47SJeff Kirsher .stop_adapter = ixgbevf_stop_hw_vf, 422dee1ad47SJeff Kirsher .setup_link = ixgbevf_setup_mac_link_vf, 423dee1ad47SJeff Kirsher .check_link = ixgbevf_check_mac_link_vf, 424dee1ad47SJeff Kirsher .set_rar = ixgbevf_set_rar_vf, 425dee1ad47SJeff Kirsher .update_mc_addr_list = ixgbevf_update_mc_addr_list_vf, 426dee1ad47SJeff Kirsher .set_uc_addr = ixgbevf_set_uc_addr_vf, 427dee1ad47SJeff Kirsher .set_vfta = ixgbevf_set_vfta_vf, 428dee1ad47SJeff Kirsher }; 429dee1ad47SJeff Kirsher 4303d8fe98fSStephen Hemminger const struct ixgbevf_info ixgbevf_82599_vf_info = { 431dee1ad47SJeff Kirsher .mac = ixgbe_mac_82599_vf, 432dee1ad47SJeff Kirsher .mac_ops = &ixgbevf_mac_ops, 433dee1ad47SJeff Kirsher }; 434dee1ad47SJeff Kirsher 4353d8fe98fSStephen Hemminger const struct ixgbevf_info ixgbevf_X540_vf_info = { 436dee1ad47SJeff Kirsher .mac = ixgbe_mac_X540_vf, 437dee1ad47SJeff Kirsher .mac_ops = &ixgbevf_mac_ops, 438dee1ad47SJeff Kirsher }; 439