1 /******************************************************************************
2
3 Copyright (c) 2001-2010, 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: releng/9.0/sys/dev/e1000/e1000_mbx.c 218530 2011-02-11 01:00:26Z jfv $*/
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
Cache object: aea09a6eed074a74ede0a8841288f0f4
|