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