ixgbe_mbx.c revision 1.1 1 1.1 dyoung /******************************************************************************
2 1.1 dyoung
3 1.1 dyoung Copyright (c) 2001-2010, 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.1 dyoung /*$NetBSD: ixgbe_mbx.c,v 1.1 2011/08/12 21:55:29 dyoung 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.1 dyoung 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.1 dyoung UNREFERENCED_PARAMETER(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.1 dyoung UNREFERENCED_PARAMETER(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.1 dyoung UNREFERENCED_PARAMETER(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.1 dyoung 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.1 dyoung 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.1 dyoung UNREFERENCED_PARAMETER(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.1 dyoung 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.1 dyoung UNREFERENCED_PARAMETER(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.1 dyoung 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.1 dyoung 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.1 dyoung default:
601 1.1 dyoung goto out;
602 1.1 dyoung break;
603 1.1 dyoung }
604 1.1 dyoung
605 1.1 dyoung if (vflre & (1 << vf_shift)) {
606 1.1 dyoung ret_val = IXGBE_SUCCESS;
607 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift));
608 1.1 dyoung hw->mbx.stats.rsts++;
609 1.1 dyoung }
610 1.1 dyoung
611 1.1 dyoung out:
612 1.1 dyoung return ret_val;
613 1.1 dyoung }
614 1.1 dyoung
615 1.1 dyoung /**
616 1.1 dyoung * ixgbe_obtain_mbx_lock_pf - obtain mailbox lock
617 1.1 dyoung * @hw: pointer to the HW structure
618 1.1 dyoung * @vf_number: the VF index
619 1.1 dyoung *
620 1.1 dyoung * return SUCCESS if we obtained the mailbox lock
621 1.1 dyoung **/
622 1.1 dyoung static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
623 1.1 dyoung {
624 1.1 dyoung s32 ret_val = IXGBE_ERR_MBX;
625 1.1 dyoung u32 p2v_mailbox;
626 1.1 dyoung
627 1.1 dyoung DEBUGFUNC("ixgbe_obtain_mbx_lock_pf");
628 1.1 dyoung
629 1.1 dyoung /* Take ownership of the buffer */
630 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU);
631 1.1 dyoung
632 1.1 dyoung /* reserve mailbox for vf use */
633 1.1 dyoung p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
634 1.1 dyoung if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
635 1.1 dyoung ret_val = IXGBE_SUCCESS;
636 1.1 dyoung
637 1.1 dyoung return ret_val;
638 1.1 dyoung }
639 1.1 dyoung
640 1.1 dyoung /**
641 1.1 dyoung * ixgbe_write_mbx_pf - Places a message in the mailbox
642 1.1 dyoung * @hw: pointer to the HW structure
643 1.1 dyoung * @msg: The message buffer
644 1.1 dyoung * @size: Length of buffer
645 1.1 dyoung * @vf_number: the VF index
646 1.1 dyoung *
647 1.1 dyoung * returns SUCCESS if it successfully copied message into the buffer
648 1.1 dyoung **/
649 1.1 dyoung static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
650 1.1 dyoung u16 vf_number)
651 1.1 dyoung {
652 1.1 dyoung s32 ret_val;
653 1.1 dyoung u16 i;
654 1.1 dyoung
655 1.1 dyoung DEBUGFUNC("ixgbe_write_mbx_pf");
656 1.1 dyoung
657 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
658 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
659 1.1 dyoung if (ret_val)
660 1.1 dyoung goto out_no_write;
661 1.1 dyoung
662 1.1 dyoung /* flush msg and acks as we are overwriting the message buffer */
663 1.1 dyoung ixgbe_check_for_msg_pf(hw, vf_number);
664 1.1 dyoung ixgbe_check_for_ack_pf(hw, vf_number);
665 1.1 dyoung
666 1.1 dyoung /* copy the caller specified message to the mailbox memory buffer */
667 1.1 dyoung for (i = 0; i < size; i++)
668 1.1 dyoung IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i, msg[i]);
669 1.1 dyoung
670 1.1 dyoung /* Interrupt VF to tell it a message has been sent and release buffer*/
671 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_STS);
672 1.1 dyoung
673 1.1 dyoung /* update stats */
674 1.1 dyoung hw->mbx.stats.msgs_tx++;
675 1.1 dyoung
676 1.1 dyoung out_no_write:
677 1.1 dyoung return ret_val;
678 1.1 dyoung
679 1.1 dyoung }
680 1.1 dyoung
681 1.1 dyoung /**
682 1.1 dyoung * ixgbe_read_mbx_pf - Read a message from the mailbox
683 1.1 dyoung * @hw: pointer to the HW structure
684 1.1 dyoung * @msg: The message buffer
685 1.1 dyoung * @size: Length of buffer
686 1.1 dyoung * @vf_number: the VF index
687 1.1 dyoung *
688 1.1 dyoung * This function copies a message from the mailbox buffer to the caller's
689 1.1 dyoung * memory buffer. The presumption is that the caller knows that there was
690 1.1 dyoung * a message due to a VF request so no polling for message is needed.
691 1.1 dyoung **/
692 1.1 dyoung static s32 ixgbe_read_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
693 1.1 dyoung u16 vf_number)
694 1.1 dyoung {
695 1.1 dyoung s32 ret_val;
696 1.1 dyoung u16 i;
697 1.1 dyoung
698 1.1 dyoung DEBUGFUNC("ixgbe_read_mbx_pf");
699 1.1 dyoung
700 1.1 dyoung /* lock the mailbox to prevent pf/vf race condition */
701 1.1 dyoung ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
702 1.1 dyoung if (ret_val)
703 1.1 dyoung goto out_no_read;
704 1.1 dyoung
705 1.1 dyoung /* copy the message to the mailbox memory buffer */
706 1.1 dyoung for (i = 0; i < size; i++)
707 1.1 dyoung msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i);
708 1.1 dyoung
709 1.1 dyoung /* Acknowledge the message and release buffer */
710 1.1 dyoung IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_ACK);
711 1.1 dyoung
712 1.1 dyoung /* update stats */
713 1.1 dyoung hw->mbx.stats.msgs_rx++;
714 1.1 dyoung
715 1.1 dyoung out_no_read:
716 1.1 dyoung return ret_val;
717 1.1 dyoung }
718 1.1 dyoung
719 1.1 dyoung /**
720 1.1 dyoung * ixgbe_init_mbx_params_pf - set initial values for pf mailbox
721 1.1 dyoung * @hw: pointer to the HW structure
722 1.1 dyoung *
723 1.1 dyoung * Initializes the hw->mbx struct to correct values for pf mailbox
724 1.1 dyoung */
725 1.1 dyoung void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
726 1.1 dyoung {
727 1.1 dyoung struct ixgbe_mbx_info *mbx = &hw->mbx;
728 1.1 dyoung
729 1.1 dyoung if (hw->mac.type != ixgbe_mac_82599EB)
730 1.1 dyoung return;
731 1.1 dyoung
732 1.1 dyoung mbx->timeout = 0;
733 1.1 dyoung mbx->usec_delay = 0;
734 1.1 dyoung
735 1.1 dyoung mbx->size = IXGBE_VFMAILBOX_SIZE;
736 1.1 dyoung
737 1.1 dyoung mbx->ops.read = ixgbe_read_mbx_pf;
738 1.1 dyoung mbx->ops.write = ixgbe_write_mbx_pf;
739 1.1 dyoung mbx->ops.read_posted = ixgbe_read_posted_mbx;
740 1.1 dyoung mbx->ops.write_posted = ixgbe_write_posted_mbx;
741 1.1 dyoung mbx->ops.check_for_msg = ixgbe_check_for_msg_pf;
742 1.1 dyoung mbx->ops.check_for_ack = ixgbe_check_for_ack_pf;
743 1.1 dyoung mbx->ops.check_for_rst = ixgbe_check_for_rst_pf;
744 1.1 dyoung
745 1.1 dyoung mbx->stats.msgs_tx = 0;
746 1.1 dyoung mbx->stats.msgs_rx = 0;
747 1.1 dyoung mbx->stats.reqs = 0;
748 1.1 dyoung mbx->stats.acks = 0;
749 1.1 dyoung mbx->stats.rsts = 0;
750 1.1 dyoung }
751 1.1 dyoung
752