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$*/ 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