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