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