ixgbe_mbx.c revision 1.2 1 1.1 dyoung /******************************************************************************
2 1.1 dyoung
3 1.2 msaitoh Copyright (c) 2001-2012, Intel Corporation
4 1.1 dyoung All rights reserved.
5 1.1 dyoung
6 1.1 dyoung Redistribution and use in source and binary forms, with or without
7 1.1 dyoung modification, are permitted provided that the following conditions are met:
8 1.1 dyoung
9 1.1 dyoung 1. Redistributions of source code must retain the above copyright notice,
10 1.1 dyoung this list of conditions and the following disclaimer.
11 1.1 dyoung
12 1.1 dyoung 2. Redistributions in binary form must reproduce the above copyright
13 1.1 dyoung notice, this list of conditions and the following disclaimer in the
14 1.1 dyoung documentation and/or other materials provided with the distribution.
15 1.1 dyoung
16 1.1 dyoung 3. Neither the name of the Intel Corporation nor the names of its
17 1.1 dyoung contributors may be used to endorse or promote products derived from
18 1.1 dyoung this software without specific prior written permission.
19 1.1 dyoung
20 1.1 dyoung THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 1.1 dyoung AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 1.1 dyoung IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 1.1 dyoung ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 1.1 dyoung LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 1.1 dyoung CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 1.1 dyoung SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 1.1 dyoung INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 1.1 dyoung CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 1.1 dyoung ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 1.1 dyoung POSSIBILITY OF SUCH DAMAGE.
31 1.1 dyoung
32 1.1 dyoung ******************************************************************************/
33 1.1 dyoung /*$FreeBSD: src/sys/dev/ixgbe/ixgbe_mbx.c,v 1.2 2011/01/19 19:36:27 jfv Exp $*/
34 1.2 msaitoh /*$NetBSD: ixgbe_mbx.c,v 1.2 2015/03/27 05:57:28 msaitoh Exp $*/
35 1.1 dyoung
36 1.1 dyoung #include "ixgbe_type.h"
37 1.1 dyoung #include "ixgbe_mbx.h"
38 1.1 dyoung
39 1.1 dyoung /**
40 1.1 dyoung * ixgbe_read_mbx - Reads a message from the mailbox
41 1.1 dyoung * @hw: pointer to the HW structure
42 1.1 dyoung * @msg: The message buffer
43 1.1 dyoung * @size: Length of buffer
44 1.1 dyoung * @mbx_id: id of mailbox to read
45 1.1 dyoung *
46 1.1 dyoung * returns SUCCESS if it successfuly read message from buffer
47 1.1 dyoung **/
48 1.1 dyoung s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
49 1.1 dyoung {
50 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
51 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
52 1.1 dyoung
53 1.1 dyoung DEBUGFUNC("ixgbe_read_mbx");
54 1.1 dyoung
55 1.1 dyoung /* limit read to size of mailbox */
56 1.1 dyoung if (size > mbx->size)
57 1.1 dyoung size = mbx->size;
58 1.1 dyoung
59 1.1 dyoung if (mbx->ops.read)
60 1.1 dyoung ret_val = mbx->ops.read(hw, msg, size, mbx_id);
61 1.1 dyoung
62 1.1 dyoung return ret_val;
63 1.1 dyoung }
64 1.1 dyoung
65 1.1 dyoung /**
66 1.1 dyoung * ixgbe_write_mbx - Write a message to the mailbox
67 1.1 dyoung * @hw: pointer to the HW structure
68 1.1 dyoung * @msg: The message buffer
69 1.1 dyoung * @size: Length of buffer
70 1.1 dyoung * @mbx_id: id of mailbox to write
71 1.1 dyoung *
72 1.1 dyoung * returns SUCCESS if it successfully copied message into the buffer
73 1.1 dyoung **/
74 1.1 dyoung s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
75 1.1 dyoung {
76 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
77 1.1 dyoung s32 ret_val = IXGBE_SUCCESS;
78 1.1 dyoung
79 1.1 dyoung DEBUGFUNC("ixgbe_write_mbx");
80 1.1 dyoung
81 1.1 dyoung if (size > mbx->size)
82 1.1 dyoung ret_val = IXGBE_ERR_MBX;
83 1.1 dyoung
84 1.1 dyoung else if (mbx->ops.write)
85 1.1 dyoung ret_val = mbx->ops.write(hw, msg, size, mbx_id);
86 1.1 dyoung
87 1.1 dyoung return ret_val;
88 1.1 dyoung }
89 1.1 dyoung
90 1.1 dyoung /**
91 1.1 dyoung * ixgbe_check_for_msg - checks to see if someone sent us mail
92 1.1 dyoung * @hw: pointer to the HW structure
93 1.1 dyoung * @mbx_id: id of mailbox to check
94 1.1 dyoung *
95 1.1 dyoung * returns SUCCESS if the Status bit was found or else ERR_MBX
96 1.1 dyoung **/
97 1.1 dyoung s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
98 1.1 dyoung {
99 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
100 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
101 1.1 dyoung
102 1.1 dyoung DEBUGFUNC("ixgbe_check_for_msg");
103 1.1 dyoung
104 1.1 dyoung if (mbx->ops.check_for_msg)
105 1.1 dyoung ret_val = mbx->ops.check_for_msg(hw, mbx_id);
106 1.1 dyoung
107 1.1 dyoung return ret_val;
108 1.1 dyoung }
109 1.1 dyoung
110 1.1 dyoung /**
111 1.1 dyoung * ixgbe_check_for_ack - checks to see if someone sent us ACK
112 1.1 dyoung * @hw: pointer to the HW structure
113 1.1 dyoung * @mbx_id: id of mailbox to check
114 1.1 dyoung *
115 1.1 dyoung * returns SUCCESS if the Status bit was found or else ERR_MBX
116 1.1 dyoung **/
117 1.1 dyoung s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
118 1.1 dyoung {
119 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
120 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
121 1.1 dyoung
122 1.1 dyoung DEBUGFUNC("ixgbe_check_for_ack");
123 1.1 dyoung
124 1.1 dyoung if (mbx->ops.check_for_ack)
125 1.1 dyoung ret_val = mbx->ops.check_for_ack(hw, mbx_id);
126 1.1 dyoung
127 1.1 dyoung return ret_val;
128 1.1 dyoung }
129 1.1 dyoung
130 1.1 dyoung /**
131 1.1 dyoung * ixgbe_check_for_rst - checks to see if other side has reset
132 1.1 dyoung * @hw: pointer to the HW structure
133 1.1 dyoung * @mbx_id: id of mailbox to check
134 1.1 dyoung *
135 1.1 dyoung * returns SUCCESS if the Status bit was found or else ERR_MBX
136 1.1 dyoung **/
137 1.1 dyoung s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)
138 1.1 dyoung {
139 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
140 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
141 1.1 dyoung
142 1.1 dyoung DEBUGFUNC("ixgbe_check_for_rst");
143 1.1 dyoung
144 1.1 dyoung if (mbx->ops.check_for_rst)
145 1.1 dyoung ret_val = mbx->ops.check_for_rst(hw, mbx_id);
146 1.1 dyoung
147 1.1 dyoung return ret_val;
148 1.1 dyoung }
149 1.1 dyoung
150 1.1 dyoung /**
151 1.1 dyoung * ixgbe_poll_for_msg - Wait for message notification
152 1.1 dyoung * @hw: pointer to the HW structure
153 1.1 dyoung * @mbx_id: id of mailbox to write
154 1.1 dyoung *
155 1.1 dyoung * returns SUCCESS if it successfully received a message notification
156 1.1 dyoung **/
157 1.1 dyoung static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
158 1.1 dyoung {
159 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
160 1.1 dyoung int countdown = mbx->timeout;
161 1.1 dyoung
162 1.1 dyoung DEBUGFUNC("ixgbe_poll_for_msg");
163 1.1 dyoung
164 1.1 dyoung if (!countdown || !mbx->ops.check_for_msg)
165 1.1 dyoung goto out;
166 1.1 dyoung
167 1.1 dyoung while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
168 1.1 dyoung countdown--;
169 1.1 dyoung if (!countdown)
170 1.1 dyoung break;
171 1.1 dyoung usec_delay(mbx->usec_delay);
172 1.1 dyoung }
173 1.1 dyoung
174 1.1 dyoung out:
175 1.1 dyoung return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
176 1.1 dyoung }
177 1.1 dyoung
178 1.1 dyoung /**
179 1.1 dyoung * ixgbe_poll_for_ack - Wait for message acknowledgement
180 1.1 dyoung * @hw: pointer to the HW structure
181 1.1 dyoung * @mbx_id: id of mailbox to write
182 1.1 dyoung *
183 1.1 dyoung * returns SUCCESS if it successfully received a message acknowledgement
184 1.1 dyoung **/
185 1.1 dyoung static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
186 1.1 dyoung {
187 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
188 1.1 dyoung int countdown = mbx->timeout;
189 1.1 dyoung
190 1.1 dyoung DEBUGFUNC("ixgbe_poll_for_ack");
191 1.1 dyoung
192 1.1 dyoung if (!countdown || !mbx->ops.check_for_ack)
193 1.1 dyoung goto out;
194 1.1 dyoung
195 1.1 dyoung while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
196 1.1 dyoung countdown--;
197 1.1 dyoung if (!countdown)
198 1.1 dyoung break;
199 1.1 dyoung usec_delay(mbx->usec_delay);
200 1.1 dyoung }
201 1.1 dyoung
202 1.1 dyoung out:
203 1.1 dyoung return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
204 1.1 dyoung }
205 1.1 dyoung
206 1.1 dyoung /**
207 1.1 dyoung * ixgbe_read_posted_mbx - Wait for message notification and receive message
208 1.1 dyoung * @hw: pointer to the HW structure
209 1.1 dyoung * @msg: The message buffer
210 1.1 dyoung * @size: Length of buffer
211 1.1 dyoung * @mbx_id: id of mailbox to write
212 1.1 dyoung *
213 1.1 dyoung * returns SUCCESS if it successfully received a message notification and
214 1.1 dyoung * copied it into the receive buffer.
215 1.1 dyoung **/
216 1.1 dyoung s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
217 1.1 dyoung {
218 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
219 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
220 1.1 dyoung
221 1.1 dyoung DEBUGFUNC("ixgbe_read_posted_mbx");
222 1.1 dyoung
223 1.1 dyoung if (!mbx->ops.read)
224 1.1 dyoung goto out;
225 1.1 dyoung
226 1.1 dyoung ret_val = ixgbe_poll_for_msg(hw, mbx_id);
227 1.1 dyoung
228 1.1 dyoung /* if ack received read message, otherwise we timed out */
229 1.1 dyoung if (!ret_val)
230 1.1 dyoung ret_val = mbx->ops.read(hw, msg, size, mbx_id);
231 1.1 dyoung out:
232 1.1 dyoung return ret_val;
233 1.1 dyoung }
234 1.1 dyoung
235 1.1 dyoung /**
236 1.1 dyoung * ixgbe_write_posted_mbx - Write a message to the mailbox, wait for ack
237 1.1 dyoung * @hw: pointer to the HW structure
238 1.1 dyoung * @msg: The message buffer
239 1.1 dyoung * @size: Length of buffer
240 1.1 dyoung * @mbx_id: id of mailbox to write
241 1.1 dyoung *
242 1.1 dyoung * returns SUCCESS if it successfully copied message into the buffer and
243 1.1 dyoung * received an ack to that message within delay * timeout period
244 1.1 dyoung **/
245 1.1 dyoung s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,
246 1.2 msaitoh u16 mbx_id)
247 1.1 dyoung {
248 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
249 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
250 1.1 dyoung
251 1.1 dyoung DEBUGFUNC("ixgbe_write_posted_mbx");
252 1.1 dyoung
253 1.1 dyoung /* exit if either we can't write or there isn't a defined timeout */
254 1.1 dyoung if (!mbx->ops.write || !mbx->timeout)
255 1.1 dyoung goto out;
256 1.1 dyoung
257 1.1 dyoung /* send msg */
258 1.1 dyoung ret_val = mbx->ops.write(hw, msg, size, mbx_id);
259 1.1 dyoung
260 1.1 dyoung /* if msg sent wait until we receive an ack */
261 1.1 dyoung if (!ret_val)
262 1.1 dyoung ret_val = ixgbe_poll_for_ack(hw, mbx_id);
263 1.1 dyoung out:
264 1.1 dyoung return ret_val;
265 1.1 dyoung }
266 1.1 dyoung
267 1.1 dyoung /**
268 1.1 dyoung * ixgbe_init_mbx_ops_generic - Initialize MB function pointers
269 1.1 dyoung * @hw: pointer to the HW structure
270 1.1 dyoung *
271 1.1 dyoung * Setups up the mailbox read and write message function pointers
272 1.1 dyoung **/
273 1.1 dyoung void ixgbe_init_mbx_ops_generic(struct ixgbe_hw *hw)
274 1.1 dyoung {
275 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
276 1.1 dyoung
277 1.1 dyoung mbx->ops.read_posted = ixgbe_read_posted_mbx;
278 1.1 dyoung mbx->ops.write_posted = ixgbe_write_posted_mbx;
279 1.1 dyoung }
280 1.1 dyoung
281 1.1 dyoung /**
282 1.1 dyoung * ixgbe_read_v2p_mailbox - read v2p mailbox
283 1.1 dyoung * @hw: pointer to the HW structure
284 1.1 dyoung *
285 1.1 dyoung * This function is used to read the v2p mailbox without losing the read to
286 1.1 dyoung * clear status bits.
287 1.1 dyoung **/
288 1.1 dyoung static u32 ixgbe_read_v2p_mailbox(struct ixgbe_hw *hw)
289 1.1 dyoung {
290 1.1 dyoung u32 v2p_mailbox = IXGBE_READ_REG(hw, IXGBE_VFMAILBOX);
291 1.1 dyoung
292 1.1 dyoung v2p_mailbox |= hw->mbx.v2p_mailbox;
293 1.1 dyoung hw->mbx.v2p_mailbox |= v2p_mailbox & IXGBE_VFMAILBOX_R2C_BITS;
294 1.1 dyoung
295 1.1 dyoung return v2p_mailbox;
296 1.1 dyoung }
297 1.1 dyoung
298 1.1 dyoung /**
299 1.1 dyoung * ixgbe_check_for_bit_vf - Determine if a status bit was set
300 1.1 dyoung * @hw: pointer to the HW structure
301 1.1 dyoung * @mask: bitmask for bits to be tested and cleared
302 1.1 dyoung *
303 1.1 dyoung * This function is used to check for the read to clear bits within
304 1.1 dyoung * the V2P mailbox.
305 1.1 dyoung **/
306 1.1 dyoung static s32 ixgbe_check_for_bit_vf(struct ixgbe_hw *hw, u32 mask)
307 1.1 dyoung {
308 1.1 dyoung u32 v2p_mailbox = ixgbe_read_v2p_mailbox(hw);
309 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
310 1.1 dyoung
311 1.1 dyoung if (v2p_mailbox & mask)
312 1.1 dyoung ret_val = IXGBE_SUCCESS;
313 1.1 dyoung
314 1.1 dyoung hw->mbx.v2p_mailbox &= ~mask;
315 1.1 dyoung
316 1.1 dyoung return ret_val;
317 1.1 dyoung }
318 1.1 dyoung
319 1.1 dyoung /**
320 1.1 dyoung * ixgbe_check_for_msg_vf - checks to see if the PF has sent mail
321 1.1 dyoung * @hw: pointer to the HW structure
322 1.1 dyoung * @mbx_id: id of mailbox to check
323 1.1 dyoung *
324 1.1 dyoung * returns SUCCESS if the PF has set the Status bit or else ERR_MBX
325 1.1 dyoung **/
326 1.1 dyoung static s32 ixgbe_check_for_msg_vf(struct ixgbe_hw *hw, u16 mbx_id)
327 1.1 dyoung {
328 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
329 1.1 dyoung
330 1.2 msaitoh UNREFERENCED_1PARAMETER(mbx_id);
331 1.1 dyoung DEBUGFUNC("ixgbe_check_for_msg_vf");
332 1.1 dyoung
333 1.1 dyoung if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFSTS)) {
334 1.1 dyoung ret_val = IXGBE_SUCCESS;
335 1.1 dyoung hw->mbx.stats.reqs++;
336 1.1 dyoung }
337 1.1 dyoung
338 1.1 dyoung return ret_val;
339 1.1 dyoung }
340 1.1 dyoung
341 1.1 dyoung /**
342 1.1 dyoung * ixgbe_check_for_ack_vf - checks to see if the PF has ACK'd
343 1.1 dyoung * @hw: pointer to the HW structure
344 1.1 dyoung * @mbx_id: id of mailbox to check
345 1.1 dyoung *
346 1.1 dyoung * returns SUCCESS if the PF has set the ACK bit or else ERR_MBX
347 1.1 dyoung **/
348 1.1 dyoung static s32 ixgbe_check_for_ack_vf(struct ixgbe_hw *hw, u16 mbx_id)
349 1.1 dyoung {
350 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
351 1.1 dyoung
352 1.2 msaitoh UNREFERENCED_1PARAMETER(mbx_id);
353 1.1 dyoung DEBUGFUNC("ixgbe_check_for_ack_vf");
354 1.1 dyoung
355 1.1 dyoung if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFACK)) {
356 1.1 dyoung ret_val = IXGBE_SUCCESS;
357 1.1 dyoung hw->mbx.stats.acks++;
358 1.1 dyoung }
359 1.1 dyoung
360 1.1 dyoung return ret_val;
361 1.1 dyoung }
362 1.1 dyoung
363 1.1 dyoung /**
364 1.1 dyoung * ixgbe_check_for_rst_vf - checks to see if the PF has reset
365 1.1 dyoung * @hw: pointer to the HW structure
366 1.1 dyoung * @mbx_id: id of mailbox to check
367 1.1 dyoung *
368 1.1 dyoung * returns TRUE if the PF has set the reset done bit or else FALSE
369 1.1 dyoung **/
370 1.1 dyoung static s32 ixgbe_check_for_rst_vf(struct ixgbe_hw *hw, u16 mbx_id)
371 1.1 dyoung {
372 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
373 1.1 dyoung
374 1.2 msaitoh UNREFERENCED_1PARAMETER(mbx_id);
375 1.1 dyoung DEBUGFUNC("ixgbe_check_for_rst_vf");
376 1.1 dyoung
377 1.1 dyoung if (!ixgbe_check_for_bit_vf(hw, (IXGBE_VFMAILBOX_RSTD |
378 1.2 msaitoh IXGBE_VFMAILBOX_RSTI))) {
379 1.1 dyoung ret_val = IXGBE_SUCCESS;
380 1.1 dyoung hw->mbx.stats.rsts++;
381 1.1 dyoung }
382 1.1 dyoung
383 1.1 dyoung return ret_val;
384 1.1 dyoung }
385 1.1 dyoung
386 1.1 dyoung /**
387 1.1 dyoung * ixgbe_obtain_mbx_lock_vf - obtain mailbox lock
388 1.1 dyoung * @hw: pointer to the HW structure
389 1.1 dyoung *
390 1.1 dyoung * return SUCCESS if we obtained the mailbox lock
391 1.1 dyoung **/
392 1.1 dyoung static s32 ixgbe_obtain_mbx_lock_vf(struct ixgbe_hw *hw)
393 1.1 dyoung {
394 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
395 1.1 dyoung
396 1.1 dyoung DEBUGFUNC("ixgbe_obtain_mbx_lock_vf");
397 1.1 dyoung
398 1.1 dyoung /* Take ownership of the buffer */
399 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_VFU);
400 1.1 dyoung
401 1.1 dyoung /* reserve mailbox for vf use */
402 1.1 dyoung if (ixgbe_read_v2p_mailbox(hw) & IXGBE_VFMAILBOX_VFU)
403 1.1 dyoung ret_val = IXGBE_SUCCESS;
404 1.1 dyoung
405 1.1 dyoung return ret_val;
406 1.1 dyoung }
407 1.1 dyoung
408 1.1 dyoung /**
409 1.1 dyoung * ixgbe_write_mbx_vf - Write a message to the mailbox
410 1.1 dyoung * @hw: pointer to the HW structure
411 1.1 dyoung * @msg: The message buffer
412 1.1 dyoung * @size: Length of buffer
413 1.1 dyoung * @mbx_id: id of mailbox to write
414 1.1 dyoung *
415 1.1 dyoung * returns SUCCESS if it successfully copied message into the buffer
416 1.1 dyoung **/
417 1.1 dyoung static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
418 1.2 msaitoh u16 mbx_id)
419 1.1 dyoung {
420 1.1 dyoung s32 ret_val;
421 1.1 dyoung u16 i;
422 1.1 dyoung
423 1.2 msaitoh UNREFERENCED_1PARAMETER(mbx_id);
424 1.1 dyoung
425 1.1 dyoung DEBUGFUNC("ixgbe_write_mbx_vf");
426 1.1 dyoung
427 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
428 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_vf(hw);
429 1.1 dyoung if (ret_val)
430 1.1 dyoung goto out_no_write;
431 1.1 dyoung
432 1.1 dyoung /* flush msg and acks as we are overwriting the message buffer */
433 1.1 dyoung ixgbe_check_for_msg_vf(hw, 0);
434 1.1 dyoung ixgbe_check_for_ack_vf(hw, 0);
435 1.1 dyoung
436 1.1 dyoung /* copy the caller specified message to the mailbox memory buffer */
437 1.1 dyoung for (i = 0; i < size; i++)
438 1.1 dyoung IXGBE_WRITE_REG_ARRAY(hw, IXGBE_VFMBMEM, i, msg[i]);
439 1.1 dyoung
440 1.1 dyoung /* update stats */
441 1.1 dyoung hw->mbx.stats.msgs_tx++;
442 1.1 dyoung
443 1.1 dyoung /* Drop VFU and interrupt the PF to tell it a message has been sent */
444 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ);
445 1.1 dyoung
446 1.1 dyoung out_no_write:
447 1.1 dyoung return ret_val;
448 1.1 dyoung }
449 1.1 dyoung
450 1.1 dyoung /**
451 1.1 dyoung * ixgbe_read_mbx_vf - Reads a message from the inbox intended for vf
452 1.1 dyoung * @hw: pointer to the HW structure
453 1.1 dyoung * @msg: The message buffer
454 1.1 dyoung * @size: Length of buffer
455 1.1 dyoung * @mbx_id: id of mailbox to read
456 1.1 dyoung *
457 1.1 dyoung * returns SUCCESS if it successfuly read message from buffer
458 1.1 dyoung **/
459 1.1 dyoung static s32 ixgbe_read_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
460 1.2 msaitoh u16 mbx_id)
461 1.1 dyoung {
462 1.1 dyoung s32 ret_val = IXGBE_SUCCESS;
463 1.1 dyoung u16 i;
464 1.1 dyoung
465 1.1 dyoung DEBUGFUNC("ixgbe_read_mbx_vf");
466 1.2 msaitoh UNREFERENCED_1PARAMETER(mbx_id);
467 1.1 dyoung
468 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
469 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_vf(hw);
470 1.1 dyoung if (ret_val)
471 1.1 dyoung goto out_no_read;
472 1.1 dyoung
473 1.1 dyoung /* copy the message from the mailbox memory buffer */
474 1.1 dyoung for (i = 0; i < size; i++)
475 1.1 dyoung msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_VFMBMEM, i);
476 1.1 dyoung
477 1.1 dyoung /* Acknowledge receipt and release mailbox, then we're done */
478 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_ACK);
479 1.1 dyoung
480 1.1 dyoung /* update stats */
481 1.1 dyoung hw->mbx.stats.msgs_rx++;
482 1.1 dyoung
483 1.1 dyoung out_no_read:
484 1.1 dyoung return ret_val;
485 1.1 dyoung }
486 1.1 dyoung
487 1.1 dyoung /**
488 1.1 dyoung * ixgbe_init_mbx_params_vf - set initial values for vf mailbox
489 1.1 dyoung * @hw: pointer to the HW structure
490 1.1 dyoung *
491 1.1 dyoung * Initializes the hw->mbx struct to correct values for vf mailbox
492 1.1 dyoung */
493 1.1 dyoung void ixgbe_init_mbx_params_vf(struct ixgbe_hw *hw)
494 1.1 dyoung {
495 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
496 1.1 dyoung
497 1.1 dyoung /* start mailbox as timed out and let the reset_hw call set the timeout
498 1.1 dyoung * value to begin communications */
499 1.1 dyoung mbx->timeout = 0;
500 1.1 dyoung mbx->usec_delay = IXGBE_VF_MBX_INIT_DELAY;
501 1.1 dyoung
502 1.1 dyoung mbx->size = IXGBE_VFMAILBOX_SIZE;
503 1.1 dyoung
504 1.1 dyoung mbx->ops.read = ixgbe_read_mbx_vf;
505 1.1 dyoung mbx->ops.write = ixgbe_write_mbx_vf;
506 1.1 dyoung mbx->ops.read_posted = ixgbe_read_posted_mbx;
507 1.1 dyoung mbx->ops.write_posted = ixgbe_write_posted_mbx;
508 1.1 dyoung mbx->ops.check_for_msg = ixgbe_check_for_msg_vf;
509 1.1 dyoung mbx->ops.check_for_ack = ixgbe_check_for_ack_vf;
510 1.1 dyoung mbx->ops.check_for_rst = ixgbe_check_for_rst_vf;
511 1.1 dyoung
512 1.1 dyoung mbx->stats.msgs_tx = 0;
513 1.1 dyoung mbx->stats.msgs_rx = 0;
514 1.1 dyoung mbx->stats.reqs = 0;
515 1.1 dyoung mbx->stats.acks = 0;
516 1.1 dyoung mbx->stats.rsts = 0;
517 1.1 dyoung }
518 1.1 dyoung
519 1.1 dyoung static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)
520 1.1 dyoung {
521 1.1 dyoung u32 mbvficr = IXGBE_READ_REG(hw, IXGBE_MBVFICR(index));
522 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
523 1.1 dyoung
524 1.1 dyoung if (mbvficr & mask) {
525 1.1 dyoung ret_val = IXGBE_SUCCESS;
526 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_MBVFICR(index), mask);
527 1.1 dyoung }
528 1.1 dyoung
529 1.1 dyoung return ret_val;
530 1.1 dyoung }
531 1.1 dyoung
532 1.1 dyoung /**
533 1.1 dyoung * ixgbe_check_for_msg_pf - checks to see if the VF has sent mail
534 1.1 dyoung * @hw: pointer to the HW structure
535 1.1 dyoung * @vf_number: the VF index
536 1.1 dyoung *
537 1.1 dyoung * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
538 1.1 dyoung **/
539 1.1 dyoung static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)
540 1.1 dyoung {
541 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
542 1.1 dyoung s32 index = IXGBE_MBVFICR_INDEX(vf_number);
543 1.1 dyoung u32 vf_bit = vf_number % 16;
544 1.1 dyoung
545 1.1 dyoung DEBUGFUNC("ixgbe_check_for_msg_pf");
546 1.1 dyoung
547 1.1 dyoung if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFREQ_VF1 << vf_bit,
548 1.2 msaitoh index)) {
549 1.1 dyoung ret_val = IXGBE_SUCCESS;
550 1.1 dyoung hw->mbx.stats.reqs++;
551 1.1 dyoung }
552 1.1 dyoung
553 1.1 dyoung return ret_val;
554 1.1 dyoung }
555 1.1 dyoung
556 1.1 dyoung /**
557 1.1 dyoung * ixgbe_check_for_ack_pf - checks to see if the VF has ACKed
558 1.1 dyoung * @hw: pointer to the HW structure
559 1.1 dyoung * @vf_number: the VF index
560 1.1 dyoung *
561 1.1 dyoung * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
562 1.1 dyoung **/
563 1.1 dyoung static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)
564 1.1 dyoung {
565 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
566 1.1 dyoung s32 index = IXGBE_MBVFICR_INDEX(vf_number);
567 1.1 dyoung u32 vf_bit = vf_number % 16;
568 1.1 dyoung
569 1.1 dyoung DEBUGFUNC("ixgbe_check_for_ack_pf");
570 1.1 dyoung
571 1.1 dyoung if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFACK_VF1 << vf_bit,
572 1.2 msaitoh index)) {
573 1.1 dyoung ret_val = IXGBE_SUCCESS;
574 1.1 dyoung hw->mbx.stats.acks++;
575 1.1 dyoung }
576 1.1 dyoung
577 1.1 dyoung return ret_val;
578 1.1 dyoung }
579 1.1 dyoung
580 1.1 dyoung /**
581 1.1 dyoung * ixgbe_check_for_rst_pf - checks to see if the VF has reset
582 1.1 dyoung * @hw: pointer to the HW structure
583 1.1 dyoung * @vf_number: the VF index
584 1.1 dyoung *
585 1.1 dyoung * returns SUCCESS if the VF has set the Status bit or else ERR_MBX
586 1.1 dyoung **/
587 1.1 dyoung static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
588 1.1 dyoung {
589 1.1 dyoung u32 reg_offset = (vf_number < 32) ? 0 : 1;
590 1.1 dyoung u32 vf_shift = vf_number % 32;
591 1.1 dyoung u32 vflre = 0;
592 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
593 1.1 dyoung
594 1.1 dyoung DEBUGFUNC("ixgbe_check_for_rst_pf");
595 1.1 dyoung
596 1.1 dyoung switch (hw->mac.type) {
597 1.1 dyoung case ixgbe_mac_82599EB:
598 1.1 dyoung vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset));
599 1.1 dyoung break;
600 1.2 msaitoh case ixgbe_mac_X540:
601 1.2 msaitoh vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset));
602 1.2 msaitoh break;
603 1.1 dyoung default:
604 1.1 dyoung break;
605 1.1 dyoung }
606 1.1 dyoung
607 1.1 dyoung if (vflre & (1 << vf_shift)) {
608 1.1 dyoung ret_val = IXGBE_SUCCESS;
609 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift));
610 1.1 dyoung hw->mbx.stats.rsts++;
611 1.1 dyoung }
612 1.1 dyoung
613 1.1 dyoung return ret_val;
614 1.1 dyoung }
615 1.1 dyoung
616 1.1 dyoung /**
617 1.1 dyoung * ixgbe_obtain_mbx_lock_pf - obtain mailbox lock
618 1.1 dyoung * @hw: pointer to the HW structure
619 1.1 dyoung * @vf_number: the VF index
620 1.1 dyoung *
621 1.1 dyoung * return SUCCESS if we obtained the mailbox lock
622 1.1 dyoung **/
623 1.1 dyoung static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
624 1.1 dyoung {
625 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
626 1.1 dyoung u32 p2v_mailbox;
627 1.1 dyoung
628 1.1 dyoung DEBUGFUNC("ixgbe_obtain_mbx_lock_pf");
629 1.1 dyoung
630 1.1 dyoung /* Take ownership of the buffer */
631 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU);
632 1.1 dyoung
633 1.1 dyoung /* reserve mailbox for vf use */
634 1.1 dyoung p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
635 1.1 dyoung if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
636 1.1 dyoung ret_val = IXGBE_SUCCESS;
637 1.1 dyoung
638 1.1 dyoung return ret_val;
639 1.1 dyoung }
640 1.1 dyoung
641 1.1 dyoung /**
642 1.1 dyoung * ixgbe_write_mbx_pf - Places a message in the mailbox
643 1.1 dyoung * @hw: pointer to the HW structure
644 1.1 dyoung * @msg: The message buffer
645 1.1 dyoung * @size: Length of buffer
646 1.1 dyoung * @vf_number: the VF index
647 1.1 dyoung *
648 1.1 dyoung * returns SUCCESS if it successfully copied message into the buffer
649 1.1 dyoung **/
650 1.1 dyoung static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
651 1.2 msaitoh u16 vf_number)
652 1.1 dyoung {
653 1.1 dyoung s32 ret_val;
654 1.1 dyoung u16 i;
655 1.1 dyoung
656 1.1 dyoung DEBUGFUNC("ixgbe_write_mbx_pf");
657 1.1 dyoung
658 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
659 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
660 1.1 dyoung if (ret_val)
661 1.1 dyoung goto out_no_write;
662 1.1 dyoung
663 1.1 dyoung /* flush msg and acks as we are overwriting the message buffer */
664 1.1 dyoung ixgbe_check_for_msg_pf(hw, vf_number);
665 1.1 dyoung ixgbe_check_for_ack_pf(hw, vf_number);
666 1.1 dyoung
667 1.1 dyoung /* copy the caller specified message to the mailbox memory buffer */
668 1.1 dyoung for (i = 0; i < size; i++)
669 1.1 dyoung IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i, msg[i]);
670 1.1 dyoung
671 1.1 dyoung /* Interrupt VF to tell it a message has been sent and release buffer*/
672 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_STS);
673 1.1 dyoung
674 1.1 dyoung /* update stats */
675 1.1 dyoung hw->mbx.stats.msgs_tx++;
676 1.1 dyoung
677 1.1 dyoung out_no_write:
678 1.1 dyoung return ret_val;
679 1.1 dyoung
680 1.1 dyoung }
681 1.1 dyoung
682 1.1 dyoung /**
683 1.1 dyoung * ixgbe_read_mbx_pf - Read a message from the mailbox
684 1.1 dyoung * @hw: pointer to the HW structure
685 1.1 dyoung * @msg: The message buffer
686 1.1 dyoung * @size: Length of buffer
687 1.1 dyoung * @vf_number: the VF index
688 1.1 dyoung *
689 1.1 dyoung * This function copies a message from the mailbox buffer to the caller's
690 1.1 dyoung * memory buffer. The presumption is that the caller knows that there was
691 1.1 dyoung * a message due to a VF request so no polling for message is needed.
692 1.1 dyoung **/
693 1.1 dyoung static s32 ixgbe_read_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
694 1.2 msaitoh u16 vf_number)
695 1.1 dyoung {
696 1.1 dyoung s32 ret_val;
697 1.1 dyoung u16 i;
698 1.1 dyoung
699 1.1 dyoung DEBUGFUNC("ixgbe_read_mbx_pf");
700 1.1 dyoung
701 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
702 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
703 1.1 dyoung if (ret_val)
704 1.1 dyoung goto out_no_read;
705 1.1 dyoung
706 1.1 dyoung /* copy the message to the mailbox memory buffer */
707 1.1 dyoung for (i = 0; i < size; i++)
708 1.1 dyoung msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i);
709 1.1 dyoung
710 1.1 dyoung /* Acknowledge the message and release buffer */
711 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_ACK);
712 1.1 dyoung
713 1.1 dyoung /* update stats */
714 1.1 dyoung hw->mbx.stats.msgs_rx++;
715 1.1 dyoung
716 1.1 dyoung out_no_read:
717 1.1 dyoung return ret_val;
718 1.1 dyoung }
719 1.1 dyoung
720 1.1 dyoung /**
721 1.1 dyoung * ixgbe_init_mbx_params_pf - set initial values for pf mailbox
722 1.1 dyoung * @hw: pointer to the HW structure
723 1.1 dyoung *
724 1.1 dyoung * Initializes the hw->mbx struct to correct values for pf mailbox
725 1.1 dyoung */
726 1.1 dyoung void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
727 1.1 dyoung {
728 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
729 1.1 dyoung
730 1.2 msaitoh if (hw->mac.type != ixgbe_mac_82599EB &&
731 1.2 msaitoh hw->mac.type != ixgbe_mac_X540)
732 1.1 dyoung return;
733 1.1 dyoung
734 1.1 dyoung mbx->timeout = 0;
735 1.1 dyoung mbx->usec_delay = 0;
736 1.1 dyoung
737 1.1 dyoung mbx->size = IXGBE_VFMAILBOX_SIZE;
738 1.1 dyoung
739 1.1 dyoung mbx->ops.read = ixgbe_read_mbx_pf;
740 1.1 dyoung mbx->ops.write = ixgbe_write_mbx_pf;
741 1.1 dyoung mbx->ops.read_posted = ixgbe_read_posted_mbx;
742 1.1 dyoung mbx->ops.write_posted = ixgbe_write_posted_mbx;
743 1.1 dyoung mbx->ops.check_for_msg = ixgbe_check_for_msg_pf;
744 1.1 dyoung mbx->ops.check_for_ack = ixgbe_check_for_ack_pf;
745 1.1 dyoung mbx->ops.check_for_rst = ixgbe_check_for_rst_pf;
746 1.1 dyoung
747 1.1 dyoung mbx->stats.msgs_tx = 0;
748 1.1 dyoung mbx->stats.msgs_rx = 0;
749 1.1 dyoung mbx->stats.reqs = 0;
750 1.1 dyoung mbx->stats.acks = 0;
751 1.1 dyoung mbx->stats.rsts = 0;
752 1.1 dyoung }
753