ixgbe_vf.c revision 1.14 1 1.14 msaitoh /* $NetBSD: ixgbe_vf.c,v 1.14 2017/10/13 08:17:44 msaitoh Exp $ */
2 1.13 msaitoh
3 1.1 dyoung /******************************************************************************
4 1.1 dyoung
5 1.13 msaitoh Copyright (c) 2001-2017, Intel Corporation
6 1.1 dyoung All rights reserved.
7 1.13 msaitoh
8 1.13 msaitoh Redistribution and use in source and binary forms, with or without
9 1.1 dyoung modification, are permitted provided that the following conditions are met:
10 1.13 msaitoh
11 1.13 msaitoh 1. Redistributions of source code must retain the above copyright notice,
12 1.1 dyoung this list of conditions and the following disclaimer.
13 1.13 msaitoh
14 1.13 msaitoh 2. Redistributions in binary form must reproduce the above copyright
15 1.13 msaitoh notice, this list of conditions and the following disclaimer in the
16 1.1 dyoung documentation and/or other materials provided with the distribution.
17 1.13 msaitoh
18 1.13 msaitoh 3. Neither the name of the Intel Corporation nor the names of its
19 1.13 msaitoh contributors may be used to endorse or promote products derived from
20 1.1 dyoung this software without specific prior written permission.
21 1.13 msaitoh
22 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 1.13 msaitoh AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.13 msaitoh IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.13 msaitoh ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 1.13 msaitoh LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 1.13 msaitoh CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 1.13 msaitoh SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 1.13 msaitoh INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 1.13 msaitoh CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
33 1.1 dyoung
34 1.1 dyoung ******************************************************************************/
35 1.13 msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_vf.c 320688 2017-07-05 17:27:03Z erj $*/
36 1.1 dyoung
37 1.1 dyoung
38 1.1 dyoung #include "ixgbe_api.h"
39 1.1 dyoung #include "ixgbe_type.h"
40 1.1 dyoung #include "ixgbe_vf.h"
41 1.1 dyoung
42 1.1 dyoung #ifndef IXGBE_VFWRITE_REG
43 1.1 dyoung #define IXGBE_VFWRITE_REG IXGBE_WRITE_REG
44 1.1 dyoung #endif
45 1.1 dyoung #ifndef IXGBE_VFREAD_REG
46 1.1 dyoung #define IXGBE_VFREAD_REG IXGBE_READ_REG
47 1.1 dyoung #endif
48 1.1 dyoung
49 1.1 dyoung /**
50 1.1 dyoung * ixgbe_init_ops_vf - Initialize the pointers for vf
51 1.1 dyoung * @hw: pointer to hardware structure
52 1.1 dyoung *
53 1.1 dyoung * This will assign function pointers, adapter-specific functions can
54 1.1 dyoung * override the assignment of generic function pointers by assigning
55 1.1 dyoung * their own adapter-specific function pointers.
56 1.1 dyoung * Does not touch the hardware.
57 1.1 dyoung **/
58 1.1 dyoung s32 ixgbe_init_ops_vf(struct ixgbe_hw *hw)
59 1.1 dyoung {
60 1.1 dyoung /* MAC */
61 1.1 dyoung hw->mac.ops.init_hw = ixgbe_init_hw_vf;
62 1.1 dyoung hw->mac.ops.reset_hw = ixgbe_reset_hw_vf;
63 1.1 dyoung hw->mac.ops.start_hw = ixgbe_start_hw_vf;
64 1.1 dyoung /* Cannot clear stats on VF */
65 1.1 dyoung hw->mac.ops.clear_hw_cntrs = NULL;
66 1.1 dyoung hw->mac.ops.get_media_type = NULL;
67 1.1 dyoung hw->mac.ops.get_mac_addr = ixgbe_get_mac_addr_vf;
68 1.2 msaitoh hw->mac.ops.stop_adapter = ixgbe_stop_adapter_vf;
69 1.1 dyoung hw->mac.ops.get_bus_info = NULL;
70 1.13 msaitoh hw->mac.ops.negotiate_api_version = ixgbevf_negotiate_api_version;
71 1.1 dyoung
72 1.1 dyoung /* Link */
73 1.1 dyoung hw->mac.ops.setup_link = ixgbe_setup_mac_link_vf;
74 1.1 dyoung hw->mac.ops.check_link = ixgbe_check_mac_link_vf;
75 1.1 dyoung hw->mac.ops.get_link_capabilities = NULL;
76 1.1 dyoung
77 1.1 dyoung /* RAR, Multicast, VLAN */
78 1.1 dyoung hw->mac.ops.set_rar = ixgbe_set_rar_vf;
79 1.2 msaitoh hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf;
80 1.1 dyoung hw->mac.ops.init_rx_addrs = NULL;
81 1.1 dyoung hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf;
82 1.13 msaitoh hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode;
83 1.1 dyoung hw->mac.ops.enable_mc = NULL;
84 1.1 dyoung hw->mac.ops.disable_mc = NULL;
85 1.1 dyoung hw->mac.ops.clear_vfta = NULL;
86 1.1 dyoung hw->mac.ops.set_vfta = ixgbe_set_vfta_vf;
87 1.13 msaitoh hw->mac.ops.set_rlpml = ixgbevf_rlpml_set_vf;
88 1.1 dyoung
89 1.1 dyoung hw->mac.max_tx_queues = 1;
90 1.1 dyoung hw->mac.max_rx_queues = 1;
91 1.1 dyoung
92 1.1 dyoung hw->mbx.ops.init_params = ixgbe_init_mbx_params_vf;
93 1.1 dyoung
94 1.1 dyoung return IXGBE_SUCCESS;
95 1.1 dyoung }
96 1.1 dyoung
97 1.7 msaitoh /* ixgbe_virt_clr_reg - Set register to default (power on) state.
98 1.7 msaitoh * @hw: pointer to hardware structure
99 1.7 msaitoh */
100 1.7 msaitoh static void ixgbe_virt_clr_reg(struct ixgbe_hw *hw)
101 1.7 msaitoh {
102 1.7 msaitoh int i;
103 1.7 msaitoh u32 vfsrrctl;
104 1.7 msaitoh u32 vfdca_rxctrl;
105 1.7 msaitoh u32 vfdca_txctrl;
106 1.7 msaitoh
107 1.7 msaitoh /* VRSRRCTL default values (BSIZEPACKET = 2048, BSIZEHEADER = 256) */
108 1.7 msaitoh vfsrrctl = 0x100 << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT;
109 1.7 msaitoh vfsrrctl |= 0x800 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
110 1.7 msaitoh
111 1.7 msaitoh /* DCA_RXCTRL default value */
112 1.7 msaitoh vfdca_rxctrl = IXGBE_DCA_RXCTRL_DESC_RRO_EN |
113 1.7 msaitoh IXGBE_DCA_RXCTRL_DATA_WRO_EN |
114 1.7 msaitoh IXGBE_DCA_RXCTRL_HEAD_WRO_EN;
115 1.7 msaitoh
116 1.7 msaitoh /* DCA_TXCTRL default value */
117 1.7 msaitoh vfdca_txctrl = IXGBE_DCA_TXCTRL_DESC_RRO_EN |
118 1.7 msaitoh IXGBE_DCA_TXCTRL_DESC_WRO_EN |
119 1.7 msaitoh IXGBE_DCA_TXCTRL_DATA_RRO_EN;
120 1.7 msaitoh
121 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0);
122 1.7 msaitoh
123 1.7 msaitoh for (i = 0; i < 7; i++) {
124 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDH(i), 0);
125 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), 0);
126 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), 0);
127 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), vfsrrctl);
128 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDH(i), 0);
129 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDT(i), 0);
130 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), 0);
131 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDWBAH(i), 0);
132 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFTDWBAL(i), 0);
133 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFDCA_RXCTRL(i), vfdca_rxctrl);
134 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), vfdca_txctrl);
135 1.7 msaitoh }
136 1.7 msaitoh
137 1.7 msaitoh IXGBE_WRITE_FLUSH(hw);
138 1.7 msaitoh }
139 1.7 msaitoh
140 1.1 dyoung /**
141 1.1 dyoung * ixgbe_start_hw_vf - Prepare hardware for Tx/Rx
142 1.1 dyoung * @hw: pointer to hardware structure
143 1.1 dyoung *
144 1.1 dyoung * Starts the hardware by filling the bus info structure and media type, clears
145 1.1 dyoung * all on chip counters, initializes receive address registers, multicast
146 1.1 dyoung * table, VLAN filter table, calls routine to set up link and flow control
147 1.1 dyoung * settings, and leaves transmit and receive units disabled and uninitialized
148 1.1 dyoung **/
149 1.1 dyoung s32 ixgbe_start_hw_vf(struct ixgbe_hw *hw)
150 1.1 dyoung {
151 1.1 dyoung /* Clear adapter stopped flag */
152 1.1 dyoung hw->adapter_stopped = FALSE;
153 1.1 dyoung
154 1.1 dyoung return IXGBE_SUCCESS;
155 1.1 dyoung }
156 1.1 dyoung
157 1.1 dyoung /**
158 1.1 dyoung * ixgbe_init_hw_vf - virtual function hardware initialization
159 1.1 dyoung * @hw: pointer to hardware structure
160 1.1 dyoung *
161 1.1 dyoung * Initialize the hardware by resetting the hardware and then starting
162 1.1 dyoung * the hardware
163 1.1 dyoung **/
164 1.1 dyoung s32 ixgbe_init_hw_vf(struct ixgbe_hw *hw)
165 1.1 dyoung {
166 1.1 dyoung s32 status = hw->mac.ops.start_hw(hw);
167 1.1 dyoung
168 1.1 dyoung hw->mac.ops.get_mac_addr(hw, hw->mac.addr);
169 1.1 dyoung
170 1.1 dyoung return status;
171 1.1 dyoung }
172 1.1 dyoung
173 1.1 dyoung /**
174 1.1 dyoung * ixgbe_reset_hw_vf - Performs hardware reset
175 1.1 dyoung * @hw: pointer to hardware structure
176 1.1 dyoung *
177 1.1 dyoung * Resets the hardware by reseting the transmit and receive units, masks and
178 1.1 dyoung * clears all interrupts.
179 1.1 dyoung **/
180 1.1 dyoung s32 ixgbe_reset_hw_vf(struct ixgbe_hw *hw)
181 1.1 dyoung {
182 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
183 1.1 dyoung u32 timeout = IXGBE_VF_INIT_TIMEOUT;
184 1.1 dyoung s32 ret_val = IXGBE_ERR_INVALID_MAC_ADDR;
185 1.7 msaitoh u32 msgbuf[IXGBE_VF_PERMADDR_MSG_LEN];
186 1.1 dyoung u8 *addr = (u8 *)(&msgbuf[1]);
187 1.1 dyoung
188 1.1 dyoung DEBUGFUNC("ixgbevf_reset_hw_vf");
189 1.1 dyoung
190 1.1 dyoung /* Call adapter stop to disable tx/rx and clear interrupts */
191 1.1 dyoung hw->mac.ops.stop_adapter(hw);
192 1.1 dyoung
193 1.9 msaitoh /* reset the api version */
194 1.9 msaitoh hw->api_version = ixgbe_mbox_api_10;
195 1.4 msaitoh
196 1.1 dyoung DEBUGOUT("Issuing a function level reset to MAC\n");
197 1.1 dyoung
198 1.7 msaitoh IXGBE_VFWRITE_REG(hw, IXGBE_VFCTRL, IXGBE_CTRL_RST);
199 1.2 msaitoh IXGBE_WRITE_FLUSH(hw);
200 1.2 msaitoh
201 1.2 msaitoh msec_delay(50);
202 1.1 dyoung
203 1.1 dyoung /* we cannot reset while the RSTI / RSTD bits are asserted */
204 1.1 dyoung while (!mbx->ops.check_for_rst(hw, 0) && timeout) {
205 1.1 dyoung timeout--;
206 1.1 dyoung usec_delay(5);
207 1.1 dyoung }
208 1.1 dyoung
209 1.5 msaitoh if (!timeout)
210 1.5 msaitoh return IXGBE_ERR_RESET_FAILED;
211 1.5 msaitoh
212 1.7 msaitoh /* Reset VF registers to initial values */
213 1.7 msaitoh ixgbe_virt_clr_reg(hw);
214 1.7 msaitoh
215 1.5 msaitoh /* mailbox timeout can now become active */
216 1.5 msaitoh mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT;
217 1.5 msaitoh
218 1.5 msaitoh msgbuf[0] = IXGBE_VF_RESET;
219 1.5 msaitoh mbx->ops.write_posted(hw, msgbuf, 1, 0);
220 1.5 msaitoh
221 1.5 msaitoh msec_delay(10);
222 1.5 msaitoh
223 1.5 msaitoh /*
224 1.5 msaitoh * set our "perm_addr" based on info provided by PF
225 1.5 msaitoh * also set up the mc_filter_type which is piggy backed
226 1.5 msaitoh * on the mac address in word 3
227 1.5 msaitoh */
228 1.5 msaitoh ret_val = mbx->ops.read_posted(hw, msgbuf,
229 1.5 msaitoh IXGBE_VF_PERMADDR_MSG_LEN, 0);
230 1.5 msaitoh if (ret_val)
231 1.5 msaitoh return ret_val;
232 1.5 msaitoh
233 1.5 msaitoh if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK) &&
234 1.5 msaitoh msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_NACK))
235 1.5 msaitoh return IXGBE_ERR_INVALID_MAC_ADDR;
236 1.5 msaitoh
237 1.13 msaitoh if (msgbuf[0] == (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK))
238 1.13 msaitoh memcpy(hw->mac.perm_addr, addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
239 1.13 msaitoh
240 1.5 msaitoh hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD];
241 1.1 dyoung
242 1.1 dyoung return ret_val;
243 1.1 dyoung }
244 1.1 dyoung
245 1.1 dyoung /**
246 1.2 msaitoh * ixgbe_stop_adapter_vf - Generic stop Tx/Rx units
247 1.1 dyoung * @hw: pointer to hardware structure
248 1.1 dyoung *
249 1.1 dyoung * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts,
250 1.1 dyoung * disables transmit and receive units. The adapter_stopped flag is used by
251 1.1 dyoung * the shared code and drivers to determine if the adapter is in a stopped
252 1.1 dyoung * state and should not touch the hardware.
253 1.1 dyoung **/
254 1.2 msaitoh s32 ixgbe_stop_adapter_vf(struct ixgbe_hw *hw)
255 1.1 dyoung {
256 1.1 dyoung u32 reg_val;
257 1.1 dyoung u16 i;
258 1.1 dyoung
259 1.1 dyoung /*
260 1.1 dyoung * Set the adapter_stopped flag so other driver functions stop touching
261 1.1 dyoung * the hardware
262 1.1 dyoung */
263 1.1 dyoung hw->adapter_stopped = TRUE;
264 1.1 dyoung
265 1.1 dyoung /* Clear interrupt mask to stop from interrupts being generated */
266 1.1 dyoung IXGBE_VFWRITE_REG(hw, IXGBE_VTEIMC, IXGBE_VF_IRQ_CLEAR_MASK);
267 1.1 dyoung
268 1.2 msaitoh /* Clear any pending interrupts, flush previous writes */
269 1.1 dyoung IXGBE_VFREAD_REG(hw, IXGBE_VTEICR);
270 1.1 dyoung
271 1.1 dyoung /* Disable the transmit unit. Each queue must be disabled. */
272 1.2 msaitoh for (i = 0; i < hw->mac.max_tx_queues; i++)
273 1.2 msaitoh IXGBE_VFWRITE_REG(hw, IXGBE_VFTXDCTL(i), IXGBE_TXDCTL_SWFLSH);
274 1.2 msaitoh
275 1.2 msaitoh /* Disable the receive unit by stopping each queue */
276 1.2 msaitoh for (i = 0; i < hw->mac.max_rx_queues; i++) {
277 1.2 msaitoh reg_val = IXGBE_VFREAD_REG(hw, IXGBE_VFRXDCTL(i));
278 1.2 msaitoh reg_val &= ~IXGBE_RXDCTL_ENABLE;
279 1.2 msaitoh IXGBE_VFWRITE_REG(hw, IXGBE_VFRXDCTL(i), reg_val);
280 1.1 dyoung }
281 1.7 msaitoh /* Clear packet split and pool config */
282 1.7 msaitoh IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0);
283 1.1 dyoung
284 1.2 msaitoh /* flush all queues disables */
285 1.2 msaitoh IXGBE_WRITE_FLUSH(hw);
286 1.2 msaitoh msec_delay(2);
287 1.2 msaitoh
288 1.1 dyoung return IXGBE_SUCCESS;
289 1.1 dyoung }
290 1.1 dyoung
291 1.1 dyoung /**
292 1.1 dyoung * ixgbe_mta_vector - Determines bit-vector in multicast table to set
293 1.1 dyoung * @hw: pointer to hardware structure
294 1.1 dyoung * @mc_addr: the multicast address
295 1.1 dyoung *
296 1.1 dyoung * Extracts the 12 bits, from a multicast address, to determine which
297 1.1 dyoung * bit-vector to set in the multicast table. The hardware uses 12 bits, from
298 1.1 dyoung * incoming rx multicast addresses, to determine the bit-vector to check in
299 1.1 dyoung * the MTA. Which of the 4 combination, of 12-bits, the hardware uses is set
300 1.1 dyoung * by the MO field of the MCSTCTRL. The MO field is set during initialization
301 1.1 dyoung * to mc_filter_type.
302 1.1 dyoung **/
303 1.1 dyoung static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr)
304 1.1 dyoung {
305 1.1 dyoung u32 vector = 0;
306 1.1 dyoung
307 1.1 dyoung switch (hw->mac.mc_filter_type) {
308 1.1 dyoung case 0: /* use bits [47:36] of the address */
309 1.1 dyoung vector = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4));
310 1.1 dyoung break;
311 1.1 dyoung case 1: /* use bits [46:35] of the address */
312 1.1 dyoung vector = ((mc_addr[4] >> 3) | (((u16)mc_addr[5]) << 5));
313 1.1 dyoung break;
314 1.1 dyoung case 2: /* use bits [45:34] of the address */
315 1.1 dyoung vector = ((mc_addr[4] >> 2) | (((u16)mc_addr[5]) << 6));
316 1.1 dyoung break;
317 1.1 dyoung case 3: /* use bits [43:32] of the address */
318 1.1 dyoung vector = ((mc_addr[4]) | (((u16)mc_addr[5]) << 8));
319 1.1 dyoung break;
320 1.1 dyoung default: /* Invalid mc_filter_type */
321 1.1 dyoung DEBUGOUT("MC filter type param set incorrectly\n");
322 1.1 dyoung ASSERT(0);
323 1.1 dyoung break;
324 1.1 dyoung }
325 1.1 dyoung
326 1.1 dyoung /* vector can only be 12-bits or boundary will be exceeded */
327 1.1 dyoung vector &= 0xFFF;
328 1.1 dyoung return vector;
329 1.1 dyoung }
330 1.1 dyoung
331 1.13 msaitoh static s32 ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, u32 *msg,
332 1.13 msaitoh u32 *retmsg, u16 size)
333 1.4 msaitoh {
334 1.4 msaitoh struct ixgbe_mbx_info *mbx = &hw->mbx;
335 1.4 msaitoh s32 retval = mbx->ops.write_posted(hw, msg, size, 0);
336 1.4 msaitoh
337 1.13 msaitoh if (retval)
338 1.13 msaitoh return retval;
339 1.13 msaitoh
340 1.13 msaitoh return mbx->ops.read_posted(hw, retmsg, size, 0);
341 1.4 msaitoh }
342 1.4 msaitoh
343 1.1 dyoung /**
344 1.1 dyoung * ixgbe_set_rar_vf - set device MAC address
345 1.1 dyoung * @hw: pointer to hardware structure
346 1.1 dyoung * @index: Receive address register to write
347 1.1 dyoung * @addr: Address to put into receive address register
348 1.1 dyoung * @vmdq: VMDq "set" or "pool" index
349 1.1 dyoung * @enable_addr: set flag that address is active
350 1.1 dyoung **/
351 1.1 dyoung s32 ixgbe_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
352 1.2 msaitoh u32 enable_addr)
353 1.1 dyoung {
354 1.1 dyoung u32 msgbuf[3];
355 1.1 dyoung u8 *msg_addr = (u8 *)(&msgbuf[1]);
356 1.1 dyoung s32 ret_val;
357 1.2 msaitoh UNREFERENCED_3PARAMETER(vmdq, enable_addr, index);
358 1.1 dyoung
359 1.1 dyoung memset(msgbuf, 0, 12);
360 1.1 dyoung msgbuf[0] = IXGBE_VF_SET_MAC_ADDR;
361 1.1 dyoung memcpy(msg_addr, addr, 6);
362 1.13 msaitoh ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3);
363 1.1 dyoung
364 1.1 dyoung msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
365 1.1 dyoung
366 1.1 dyoung /* if nacked the address was rejected, use "perm_addr" */
367 1.1 dyoung if (!ret_val &&
368 1.13 msaitoh (msgbuf[0] == (IXGBE_VF_SET_MAC_ADDR | IXGBE_VT_MSGTYPE_NACK))) {
369 1.1 dyoung ixgbe_get_mac_addr_vf(hw, hw->mac.addr);
370 1.13 msaitoh return IXGBE_ERR_MBX;
371 1.13 msaitoh }
372 1.1 dyoung
373 1.1 dyoung return ret_val;
374 1.1 dyoung }
375 1.1 dyoung
376 1.1 dyoung /**
377 1.1 dyoung * ixgbe_update_mc_addr_list_vf - Update Multicast addresses
378 1.1 dyoung * @hw: pointer to the HW structure
379 1.1 dyoung * @mc_addr_list: array of multicast addresses to program
380 1.1 dyoung * @mc_addr_count: number of multicast addresses to program
381 1.1 dyoung * @next: caller supplied function to return next address in list
382 1.1 dyoung *
383 1.1 dyoung * Updates the Multicast Table Array.
384 1.1 dyoung **/
385 1.1 dyoung s32 ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, u8 *mc_addr_list,
386 1.2 msaitoh u32 mc_addr_count, ixgbe_mc_addr_itr next,
387 1.2 msaitoh bool clear)
388 1.1 dyoung {
389 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
390 1.1 dyoung u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
391 1.1 dyoung u16 *vector_list = (u16 *)&msgbuf[1];
392 1.1 dyoung u32 vector;
393 1.1 dyoung u32 cnt, i;
394 1.1 dyoung u32 vmdq;
395 1.1 dyoung
396 1.2 msaitoh UNREFERENCED_1PARAMETER(clear);
397 1.2 msaitoh
398 1.1 dyoung DEBUGFUNC("ixgbe_update_mc_addr_list_vf");
399 1.1 dyoung
400 1.1 dyoung /* Each entry in the list uses 1 16 bit word. We have 30
401 1.1 dyoung * 16 bit words available in our HW msg buffer (minus 1 for the
402 1.1 dyoung * msg type). That's 30 hash values if we pack 'em right. If
403 1.1 dyoung * there are more than 30 MC addresses to add then punt the
404 1.1 dyoung * extras for now and then add code to handle more than 30 later.
405 1.1 dyoung * It would be unusual for a server to request that many multi-cast
406 1.1 dyoung * addresses except for in large enterprise network environments.
407 1.1 dyoung */
408 1.1 dyoung
409 1.1 dyoung DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count);
410 1.1 dyoung
411 1.1 dyoung cnt = (mc_addr_count > 30) ? 30 : mc_addr_count;
412 1.1 dyoung msgbuf[0] = IXGBE_VF_SET_MULTICAST;
413 1.1 dyoung msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT;
414 1.1 dyoung
415 1.1 dyoung for (i = 0; i < cnt; i++) {
416 1.1 dyoung vector = ixgbe_mta_vector(hw, next(hw, &mc_addr_list, &vmdq));
417 1.1 dyoung DEBUGOUT1("Hash value = 0x%03X\n", vector);
418 1.1 dyoung vector_list[i] = (u16)vector;
419 1.1 dyoung }
420 1.1 dyoung
421 1.1 dyoung return mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE, 0);
422 1.1 dyoung }
423 1.1 dyoung
424 1.1 dyoung /**
425 1.13 msaitoh * ixgbevf_update_xcast_mode - Update Multicast mode
426 1.13 msaitoh * @hw: pointer to the HW structure
427 1.13 msaitoh * @xcast_mode: new multicast mode
428 1.13 msaitoh *
429 1.13 msaitoh * Updates the Multicast Mode of VF.
430 1.13 msaitoh **/
431 1.13 msaitoh s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode)
432 1.13 msaitoh {
433 1.13 msaitoh u32 msgbuf[2];
434 1.13 msaitoh s32 err;
435 1.13 msaitoh
436 1.13 msaitoh switch (hw->api_version) {
437 1.13 msaitoh case ixgbe_mbox_api_12:
438 1.13 msaitoh /* New modes were introduced in 1.3 version */
439 1.13 msaitoh if (xcast_mode > IXGBEVF_XCAST_MODE_ALLMULTI)
440 1.13 msaitoh return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
441 1.13 msaitoh /* Fall through */
442 1.13 msaitoh case ixgbe_mbox_api_13:
443 1.13 msaitoh break;
444 1.13 msaitoh default:
445 1.13 msaitoh return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
446 1.13 msaitoh }
447 1.13 msaitoh
448 1.13 msaitoh msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
449 1.13 msaitoh msgbuf[1] = xcast_mode;
450 1.13 msaitoh
451 1.13 msaitoh err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
452 1.13 msaitoh if (err)
453 1.13 msaitoh return err;
454 1.13 msaitoh
455 1.13 msaitoh msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
456 1.13 msaitoh if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
457 1.13 msaitoh return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
458 1.13 msaitoh return IXGBE_SUCCESS;
459 1.13 msaitoh }
460 1.13 msaitoh
461 1.13 msaitoh /**
462 1.1 dyoung * ixgbe_set_vfta_vf - Set/Unset vlan filter table address
463 1.1 dyoung * @hw: pointer to the HW structure
464 1.1 dyoung * @vlan: 12 bit VLAN ID
465 1.1 dyoung * @vind: unused by VF drivers
466 1.1 dyoung * @vlan_on: if TRUE then set bit, else clear bit
467 1.13 msaitoh * @vlvf_bypass: boolean flag indicating updating default pool is okay
468 1.13 msaitoh *
469 1.13 msaitoh * Turn on/off specified VLAN in the VLAN filter table.
470 1.1 dyoung **/
471 1.13 msaitoh s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
472 1.13 msaitoh bool vlan_on, bool vlvf_bypass)
473 1.1 dyoung {
474 1.1 dyoung u32 msgbuf[2];
475 1.3 msaitoh s32 ret_val;
476 1.13 msaitoh UNREFERENCED_2PARAMETER(vind, vlvf_bypass);
477 1.1 dyoung
478 1.1 dyoung msgbuf[0] = IXGBE_VF_SET_VLAN;
479 1.1 dyoung msgbuf[1] = vlan;
480 1.1 dyoung /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
481 1.6 riastrad msgbuf[0] |= (u32)vlan_on << IXGBE_VT_MSGINFO_SHIFT;
482 1.1 dyoung
483 1.13 msaitoh ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
484 1.3 msaitoh if (!ret_val && (msgbuf[0] & IXGBE_VT_MSGTYPE_ACK))
485 1.3 msaitoh return IXGBE_SUCCESS;
486 1.3 msaitoh
487 1.3 msaitoh return ret_val | (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK);
488 1.1 dyoung }
489 1.1 dyoung
490 1.1 dyoung /**
491 1.1 dyoung * ixgbe_get_num_of_tx_queues_vf - Get number of TX queues
492 1.1 dyoung * @hw: pointer to hardware structure
493 1.1 dyoung *
494 1.1 dyoung * Returns the number of transmit queues for the given adapter.
495 1.1 dyoung **/
496 1.1 dyoung u32 ixgbe_get_num_of_tx_queues_vf(struct ixgbe_hw *hw)
497 1.1 dyoung {
498 1.2 msaitoh UNREFERENCED_1PARAMETER(hw);
499 1.1 dyoung return IXGBE_VF_MAX_TX_QUEUES;
500 1.1 dyoung }
501 1.1 dyoung
502 1.1 dyoung /**
503 1.1 dyoung * ixgbe_get_num_of_rx_queues_vf - Get number of RX queues
504 1.1 dyoung * @hw: pointer to hardware structure
505 1.1 dyoung *
506 1.1 dyoung * Returns the number of receive queues for the given adapter.
507 1.1 dyoung **/
508 1.1 dyoung u32 ixgbe_get_num_of_rx_queues_vf(struct ixgbe_hw *hw)
509 1.1 dyoung {
510 1.2 msaitoh UNREFERENCED_1PARAMETER(hw);
511 1.1 dyoung return IXGBE_VF_MAX_RX_QUEUES;
512 1.1 dyoung }
513 1.1 dyoung
514 1.1 dyoung /**
515 1.1 dyoung * ixgbe_get_mac_addr_vf - Read device MAC address
516 1.1 dyoung * @hw: pointer to the HW structure
517 1.1 dyoung **/
518 1.1 dyoung s32 ixgbe_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr)
519 1.1 dyoung {
520 1.1 dyoung int i;
521 1.1 dyoung
522 1.1 dyoung for (i = 0; i < IXGBE_ETH_LENGTH_OF_ADDRESS; i++)
523 1.1 dyoung mac_addr[i] = hw->mac.perm_addr[i];
524 1.1 dyoung
525 1.1 dyoung return IXGBE_SUCCESS;
526 1.1 dyoung }
527 1.1 dyoung
528 1.2 msaitoh s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
529 1.2 msaitoh {
530 1.13 msaitoh u32 msgbuf[3], msgbuf_chk;
531 1.2 msaitoh u8 *msg_addr = (u8 *)(&msgbuf[1]);
532 1.2 msaitoh s32 ret_val;
533 1.2 msaitoh
534 1.2 msaitoh memset(msgbuf, 0, sizeof(msgbuf));
535 1.2 msaitoh /*
536 1.2 msaitoh * If index is one then this is the start of a new list and needs
537 1.2 msaitoh * indication to the PF so it can do it's own list management.
538 1.2 msaitoh * If it is zero then that tells the PF to just clear all of
539 1.2 msaitoh * this VF's macvlans and there is no new list.
540 1.2 msaitoh */
541 1.2 msaitoh msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT;
542 1.2 msaitoh msgbuf[0] |= IXGBE_VF_SET_MACVLAN;
543 1.13 msaitoh msgbuf_chk = msgbuf[0];
544 1.2 msaitoh if (addr)
545 1.2 msaitoh memcpy(msg_addr, addr, 6);
546 1.2 msaitoh
547 1.13 msaitoh ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3);
548 1.13 msaitoh if (!ret_val) {
549 1.13 msaitoh msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
550 1.2 msaitoh
551 1.13 msaitoh if (msgbuf[0] == (msgbuf_chk | IXGBE_VT_MSGTYPE_NACK))
552 1.13 msaitoh return IXGBE_ERR_OUT_OF_MEM;
553 1.13 msaitoh }
554 1.2 msaitoh
555 1.2 msaitoh return ret_val;
556 1.2 msaitoh }
557 1.2 msaitoh
558 1.1 dyoung /**
559 1.1 dyoung * ixgbe_setup_mac_link_vf - Setup MAC link settings
560 1.1 dyoung * @hw: pointer to hardware structure
561 1.1 dyoung * @speed: new link speed
562 1.1 dyoung * @autoneg: TRUE if autonegotiation enabled
563 1.1 dyoung * @autoneg_wait_to_complete: TRUE when waiting for completion is needed
564 1.1 dyoung *
565 1.1 dyoung * Set the link speed in the AUTOC register and restarts link.
566 1.1 dyoung **/
567 1.4 msaitoh s32 ixgbe_setup_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed speed,
568 1.2 msaitoh bool autoneg_wait_to_complete)
569 1.1 dyoung {
570 1.4 msaitoh UNREFERENCED_3PARAMETER(hw, speed, autoneg_wait_to_complete);
571 1.1 dyoung return IXGBE_SUCCESS;
572 1.1 dyoung }
573 1.1 dyoung
574 1.1 dyoung /**
575 1.1 dyoung * ixgbe_check_mac_link_vf - Get link/speed status
576 1.1 dyoung * @hw: pointer to hardware structure
577 1.1 dyoung * @speed: pointer to link speed
578 1.1 dyoung * @link_up: TRUE is link is up, FALSE otherwise
579 1.1 dyoung * @autoneg_wait_to_complete: TRUE when waiting for completion is needed
580 1.1 dyoung *
581 1.1 dyoung * Reads the links register to determine if link is up and the current speed
582 1.1 dyoung **/
583 1.1 dyoung s32 ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
584 1.2 msaitoh bool *link_up, bool autoneg_wait_to_complete)
585 1.1 dyoung {
586 1.4 msaitoh struct ixgbe_mbx_info *mbx = &hw->mbx;
587 1.4 msaitoh struct ixgbe_mac_info *mac = &hw->mac;
588 1.4 msaitoh s32 ret_val = IXGBE_SUCCESS;
589 1.1 dyoung u32 links_reg;
590 1.4 msaitoh u32 in_msg = 0;
591 1.2 msaitoh UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
592 1.1 dyoung
593 1.4 msaitoh /* If we were hit with a reset drop the link */
594 1.4 msaitoh if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout)
595 1.4 msaitoh mac->get_link_status = TRUE;
596 1.4 msaitoh
597 1.4 msaitoh if (!mac->get_link_status)
598 1.4 msaitoh goto out;
599 1.4 msaitoh
600 1.4 msaitoh /* if link status is down no point in checking to see if pf is up */
601 1.4 msaitoh links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
602 1.4 msaitoh if (!(links_reg & IXGBE_LINKS_UP))
603 1.4 msaitoh goto out;
604 1.1 dyoung
605 1.7 msaitoh /* for SFP+ modules and DA cables on 82599 it can take up to 500usecs
606 1.7 msaitoh * before the link status is correct
607 1.7 msaitoh */
608 1.7 msaitoh if (mac->type == ixgbe_mac_82599_vf) {
609 1.7 msaitoh int i;
610 1.7 msaitoh
611 1.7 msaitoh for (i = 0; i < 5; i++) {
612 1.7 msaitoh usec_delay(100);
613 1.7 msaitoh links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
614 1.7 msaitoh
615 1.7 msaitoh if (!(links_reg & IXGBE_LINKS_UP))
616 1.7 msaitoh goto out;
617 1.7 msaitoh }
618 1.7 msaitoh }
619 1.7 msaitoh
620 1.4 msaitoh switch (links_reg & IXGBE_LINKS_SPEED_82599) {
621 1.3 msaitoh case IXGBE_LINKS_SPEED_10G_82599:
622 1.1 dyoung *speed = IXGBE_LINK_SPEED_10GB_FULL;
623 1.13 msaitoh if (hw->mac.type >= ixgbe_mac_X550) {
624 1.13 msaitoh if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
625 1.13 msaitoh *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
626 1.13 msaitoh }
627 1.3 msaitoh break;
628 1.3 msaitoh case IXGBE_LINKS_SPEED_1G_82599:
629 1.1 dyoung *speed = IXGBE_LINK_SPEED_1GB_FULL;
630 1.3 msaitoh break;
631 1.3 msaitoh case IXGBE_LINKS_SPEED_100_82599:
632 1.3 msaitoh *speed = IXGBE_LINK_SPEED_100_FULL;
633 1.14 msaitoh if (hw->mac.type >= ixgbe_mac_X550) {
634 1.13 msaitoh if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
635 1.13 msaitoh *speed = IXGBE_LINK_SPEED_5GB_FULL;
636 1.13 msaitoh }
637 1.13 msaitoh break;
638 1.13 msaitoh case IXGBE_LINKS_SPEED_10_X550EM_A:
639 1.13 msaitoh *speed = IXGBE_LINK_SPEED_UNKNOWN;
640 1.13 msaitoh /* Since Reserved in older MAC's */
641 1.13 msaitoh if (hw->mac.type >= ixgbe_mac_X550)
642 1.13 msaitoh *speed = IXGBE_LINK_SPEED_10_FULL;
643 1.3 msaitoh break;
644 1.13 msaitoh default:
645 1.13 msaitoh *speed = IXGBE_LINK_SPEED_UNKNOWN;
646 1.3 msaitoh }
647 1.1 dyoung
648 1.4 msaitoh /* if the read failed it could just be a mailbox collision, best wait
649 1.4 msaitoh * until we are called again and don't report an error
650 1.4 msaitoh */
651 1.4 msaitoh if (mbx->ops.read(hw, &in_msg, 1, 0))
652 1.4 msaitoh goto out;
653 1.4 msaitoh
654 1.4 msaitoh if (!(in_msg & IXGBE_VT_MSGTYPE_CTS)) {
655 1.4 msaitoh /* msg is not CTS and is NACK we must have lost CTS status */
656 1.4 msaitoh if (in_msg & IXGBE_VT_MSGTYPE_NACK)
657 1.4 msaitoh ret_val = -1;
658 1.4 msaitoh goto out;
659 1.4 msaitoh }
660 1.4 msaitoh
661 1.4 msaitoh /* the pf is talking, if we timed out in the past we reinit */
662 1.4 msaitoh if (!mbx->timeout) {
663 1.4 msaitoh ret_val = -1;
664 1.4 msaitoh goto out;
665 1.4 msaitoh }
666 1.4 msaitoh
667 1.4 msaitoh /* if we passed all the tests above then the link is up and we no
668 1.4 msaitoh * longer need to check for link
669 1.4 msaitoh */
670 1.4 msaitoh mac->get_link_status = FALSE;
671 1.4 msaitoh
672 1.4 msaitoh out:
673 1.4 msaitoh *link_up = !mac->get_link_status;
674 1.4 msaitoh return ret_val;
675 1.4 msaitoh }
676 1.4 msaitoh
677 1.4 msaitoh /**
678 1.4 msaitoh * ixgbevf_rlpml_set_vf - Set the maximum receive packet length
679 1.4 msaitoh * @hw: pointer to the HW structure
680 1.4 msaitoh * @max_size: value to assign to max frame size
681 1.4 msaitoh **/
682 1.13 msaitoh s32 ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size)
683 1.4 msaitoh {
684 1.4 msaitoh u32 msgbuf[2];
685 1.13 msaitoh s32 retval;
686 1.4 msaitoh
687 1.4 msaitoh msgbuf[0] = IXGBE_VF_SET_LPE;
688 1.4 msaitoh msgbuf[1] = max_size;
689 1.13 msaitoh
690 1.13 msaitoh retval = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
691 1.13 msaitoh if (retval)
692 1.13 msaitoh return retval;
693 1.13 msaitoh if ((msgbuf[0] & IXGBE_VF_SET_LPE) &&
694 1.13 msaitoh (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK))
695 1.13 msaitoh return IXGBE_ERR_MBX;
696 1.13 msaitoh
697 1.13 msaitoh return 0;
698 1.4 msaitoh }
699 1.4 msaitoh
700 1.4 msaitoh /**
701 1.4 msaitoh * ixgbevf_negotiate_api_version - Negotiate supported API version
702 1.4 msaitoh * @hw: pointer to the HW structure
703 1.4 msaitoh * @api: integer containing requested API version
704 1.4 msaitoh **/
705 1.4 msaitoh int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api)
706 1.4 msaitoh {
707 1.4 msaitoh int err;
708 1.4 msaitoh u32 msg[3];
709 1.4 msaitoh
710 1.4 msaitoh /* Negotiate the mailbox API version */
711 1.4 msaitoh msg[0] = IXGBE_VF_API_NEGOTIATE;
712 1.4 msaitoh msg[1] = api;
713 1.4 msaitoh msg[2] = 0;
714 1.4 msaitoh
715 1.13 msaitoh err = ixgbevf_write_msg_read_ack(hw, msg, msg, 3);
716 1.4 msaitoh if (!err) {
717 1.4 msaitoh msg[0] &= ~IXGBE_VT_MSGTYPE_CTS;
718 1.4 msaitoh
719 1.4 msaitoh /* Store value and return 0 on success */
720 1.4 msaitoh if (msg[0] == (IXGBE_VF_API_NEGOTIATE | IXGBE_VT_MSGTYPE_ACK)) {
721 1.4 msaitoh hw->api_version = api;
722 1.4 msaitoh return 0;
723 1.4 msaitoh }
724 1.4 msaitoh
725 1.4 msaitoh err = IXGBE_ERR_INVALID_ARGUMENT;
726 1.4 msaitoh }
727 1.4 msaitoh
728 1.4 msaitoh return err;
729 1.4 msaitoh }
730 1.4 msaitoh
731 1.4 msaitoh int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
732 1.4 msaitoh unsigned int *default_tc)
733 1.4 msaitoh {
734 1.9 msaitoh int err;
735 1.9 msaitoh u32 msg[5];
736 1.9 msaitoh
737 1.9 msaitoh /* do nothing if API doesn't support ixgbevf_get_queues */
738 1.9 msaitoh switch (hw->api_version) {
739 1.9 msaitoh case ixgbe_mbox_api_11:
740 1.13 msaitoh case ixgbe_mbox_api_12:
741 1.13 msaitoh case ixgbe_mbox_api_13:
742 1.9 msaitoh break;
743 1.9 msaitoh default:
744 1.9 msaitoh return 0;
745 1.9 msaitoh }
746 1.9 msaitoh
747 1.9 msaitoh /* Fetch queue configuration from the PF */
748 1.9 msaitoh msg[0] = IXGBE_VF_GET_QUEUES;
749 1.9 msaitoh msg[1] = msg[2] = msg[3] = msg[4] = 0;
750 1.9 msaitoh
751 1.13 msaitoh err = ixgbevf_write_msg_read_ack(hw, msg, msg, 5);
752 1.9 msaitoh if (!err) {
753 1.9 msaitoh msg[0] &= ~IXGBE_VT_MSGTYPE_CTS;
754 1.9 msaitoh
755 1.9 msaitoh /*
756 1.9 msaitoh * if we we didn't get an ACK there must have been
757 1.9 msaitoh * some sort of mailbox error so we should treat it
758 1.9 msaitoh * as such
759 1.9 msaitoh */
760 1.9 msaitoh if (msg[0] != (IXGBE_VF_GET_QUEUES | IXGBE_VT_MSGTYPE_ACK))
761 1.9 msaitoh return IXGBE_ERR_MBX;
762 1.9 msaitoh
763 1.9 msaitoh /* record and validate values from message */
764 1.9 msaitoh hw->mac.max_tx_queues = msg[IXGBE_VF_TX_QUEUES];
765 1.9 msaitoh if (hw->mac.max_tx_queues == 0 ||
766 1.9 msaitoh hw->mac.max_tx_queues > IXGBE_VF_MAX_TX_QUEUES)
767 1.9 msaitoh hw->mac.max_tx_queues = IXGBE_VF_MAX_TX_QUEUES;
768 1.9 msaitoh
769 1.9 msaitoh hw->mac.max_rx_queues = msg[IXGBE_VF_RX_QUEUES];
770 1.9 msaitoh if (hw->mac.max_rx_queues == 0 ||
771 1.9 msaitoh hw->mac.max_rx_queues > IXGBE_VF_MAX_RX_QUEUES)
772 1.9 msaitoh hw->mac.max_rx_queues = IXGBE_VF_MAX_RX_QUEUES;
773 1.9 msaitoh
774 1.9 msaitoh *num_tcs = msg[IXGBE_VF_TRANS_VLAN];
775 1.9 msaitoh /* in case of unknown state assume we cannot tag frames */
776 1.9 msaitoh if (*num_tcs > hw->mac.max_rx_queues)
777 1.9 msaitoh *num_tcs = 1;
778 1.9 msaitoh
779 1.9 msaitoh *default_tc = msg[IXGBE_VF_DEF_QUEUE];
780 1.9 msaitoh /* default to queue 0 on out-of-bounds queue number */
781 1.9 msaitoh if (*default_tc >= hw->mac.max_tx_queues)
782 1.9 msaitoh *default_tc = 0;
783 1.9 msaitoh }
784 1.9 msaitoh
785 1.9 msaitoh return err;
786 1.1 dyoung }
787