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