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