Print this page
6064 ixgbe needs X550 support
   1 /******************************************************************************
   2 
   3   Copyright (c) 2001-2012, 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 


  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 "ixgbe_type.h"
  36 #include "ixgbe_mbx.h"
  37 
  38 /**
  39  *  ixgbe_read_mbx - Reads a message from the mailbox
  40  *  @hw: pointer to the HW structure
  41  *  @msg: The message buffer
  42  *  @size: Length of buffer
  43  *  @mbx_id: id of mailbox to read
  44  *
  45  *  returns SUCCESS if it successfuly read message from buffer
  46  **/
  47 s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  48 {
  49         struct ixgbe_mbx_info *mbx = &hw->mbx;
  50         s32 ret_val = IXGBE_ERR_MBX;
  51 
  52         DEBUGFUNC("ixgbe_read_mbx");
  53 
  54         /* limit read to size of mailbox */
  55         if (size > mbx->size)
  56                 size = mbx->size;
  57 
  58         if (mbx->ops.read)
  59                 ret_val = mbx->ops.read(hw, msg, size, mbx_id);
  60 
  61         return ret_val;
  62 }
  63 
  64 /**
  65  *  ixgbe_write_mbx - Write a message to the mailbox
  66  *  @hw: pointer to the HW structure
  67  *  @msg: The message buffer
  68  *  @size: Length of buffer
  69  *  @mbx_id: id of mailbox to write
  70  *
  71  *  returns SUCCESS if it successfully copied message into the buffer
  72  **/
  73 s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  74 {
  75         struct ixgbe_mbx_info *mbx = &hw->mbx;
  76         s32 ret_val = IXGBE_SUCCESS;
  77 
  78         DEBUGFUNC("ixgbe_write_mbx");
  79 
  80         if (size > mbx->size)
  81                 ret_val = IXGBE_ERR_MBX;
  82 
  83         else if (mbx->ops.write)

  84                 ret_val = mbx->ops.write(hw, msg, size, mbx_id);
  85 
  86         return ret_val;
  87 }
  88 
  89 /**
  90  *  ixgbe_check_for_msg - checks to see if someone sent us mail
  91  *  @hw: pointer to the HW structure
  92  *  @mbx_id: id of mailbox to check
  93  *
  94  *  returns SUCCESS if the Status bit was found or else ERR_MBX
  95  **/
  96 s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
  97 {
  98         struct ixgbe_mbx_info *mbx = &hw->mbx;
  99         s32 ret_val = IXGBE_ERR_MBX;
 100 
 101         DEBUGFUNC("ixgbe_check_for_msg");
 102 
 103         if (mbx->ops.check_for_msg)


 153  *
 154  *  returns SUCCESS if it successfully received a message notification
 155  **/
 156 static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
 157 {
 158         struct ixgbe_mbx_info *mbx = &hw->mbx;
 159         int countdown = mbx->timeout;
 160 
 161         DEBUGFUNC("ixgbe_poll_for_msg");
 162 
 163         if (!countdown || !mbx->ops.check_for_msg)
 164                 goto out;
 165 
 166         while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
 167                 countdown--;
 168                 if (!countdown)
 169                         break;
 170                 usec_delay(mbx->usec_delay);
 171         }
 172 




 173 out:
 174         return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 175 }
 176 
 177 /**
 178  *  ixgbe_poll_for_ack - Wait for message acknowledgement
 179  *  @hw: pointer to the HW structure
 180  *  @mbx_id: id of mailbox to write
 181  *
 182  *  returns SUCCESS if it successfully received a message acknowledgement
 183  **/
 184 static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
 185 {
 186         struct ixgbe_mbx_info *mbx = &hw->mbx;
 187         int countdown = mbx->timeout;
 188 
 189         DEBUGFUNC("ixgbe_poll_for_ack");
 190 
 191         if (!countdown || !mbx->ops.check_for_ack)
 192                 goto out;
 193 
 194         while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
 195                 countdown--;
 196                 if (!countdown)
 197                         break;
 198                 usec_delay(mbx->usec_delay);
 199         }
 200 




 201 out:
 202         return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 203 }
 204 
 205 /**
 206  *  ixgbe_read_posted_mbx - Wait for message notification and receive message
 207  *  @hw: pointer to the HW structure
 208  *  @msg: The message buffer
 209  *  @size: Length of buffer
 210  *  @mbx_id: id of mailbox to write
 211  *
 212  *  returns SUCCESS if it successfully received a message notification and
 213  *  copied it into the receive buffer.
 214  **/
 215 s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
 216 {
 217         struct ixgbe_mbx_info *mbx = &hw->mbx;
 218         s32 ret_val = IXGBE_ERR_MBX;
 219 
 220         DEBUGFUNC("ixgbe_read_posted_mbx");


 412  *  @mbx_id: id of mailbox to write
 413  *
 414  *  returns SUCCESS if it successfully copied message into the buffer
 415  **/
 416 static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 417                               u16 mbx_id)
 418 {
 419         s32 ret_val;
 420         u16 i;
 421 
 422         UNREFERENCED_1PARAMETER(mbx_id);
 423 
 424         DEBUGFUNC("ixgbe_write_mbx_vf");
 425 
 426         /* lock the mailbox to prevent pf/vf race condition */
 427         ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 428         if (ret_val)
 429                 goto out_no_write;
 430 
 431         /* flush msg and acks as we are overwriting the message buffer */
 432         ret_val = ixgbe_check_for_msg_vf(hw, 0);
 433         if (ret_val)
 434                 goto out_no_write;
 435         ret_val = ixgbe_check_for_ack_vf(hw, 0);
 436         if (ret_val)
 437                 goto out_no_write;
 438 
 439         /* copy the caller specified message to the mailbox memory buffer */
 440         for (i = 0; i < size; i++)
 441                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_VFMBMEM, i, msg[i]);
 442 
 443         /* update stats */
 444         hw->mbx.stats.msgs_tx++;
 445 
 446         /* Drop VFU and interrupt the PF to tell it a message has been sent */
 447         IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ);
 448 
 449 out_no_write:
 450         return ret_val;
 451 }
 452 
 453 /**
 454  *  ixgbe_read_mbx_vf - Reads a message from the inbox intended for vf
 455  *  @hw: pointer to the HW structure
 456  *  @msg: The message buffer
 457  *  @size: Length of buffer
 458  *  @mbx_id: id of mailbox to read
 459  *
 460  *  returns SUCCESS if it successfuly read message from buffer
 461  **/
 462 static s32 ixgbe_read_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 463                              u16 mbx_id)
 464 {
 465         s32 ret_val = IXGBE_SUCCESS;
 466         u16 i;
 467 
 468         DEBUGFUNC("ixgbe_read_mbx_vf");
 469         UNREFERENCED_1PARAMETER(mbx_id);
 470 
 471         /* lock the mailbox to prevent pf/vf race condition */
 472         ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 473         if (ret_val)
 474                 goto out_no_read;
 475 
 476         /* copy the message from the mailbox memory buffer */
 477         for (i = 0; i < size; i++)
 478                 msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_VFMBMEM, i);
 479 
 480         /* Acknowledge receipt and release mailbox, then we're done */


 583 /**
 584  *  ixgbe_check_for_rst_pf - checks to see if the VF has reset
 585  *  @hw: pointer to the HW structure
 586  *  @vf_number: the VF index
 587  *
 588  *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX
 589  **/
 590 static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
 591 {
 592         u32 reg_offset = (vf_number < 32) ? 0 : 1;
 593         u32 vf_shift = vf_number % 32;
 594         u32 vflre = 0;
 595         s32 ret_val = IXGBE_ERR_MBX;
 596 
 597         DEBUGFUNC("ixgbe_check_for_rst_pf");
 598 
 599         switch (hw->mac.type) {
 600         case ixgbe_mac_82599EB:
 601                 vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset));
 602                 break;


 603         case ixgbe_mac_X540:
 604                 vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset));
 605                 break;
 606         default:
 607                 break;
 608         }
 609 
 610         if (vflre & (1 << vf_shift)) {
 611                 ret_val = IXGBE_SUCCESS;
 612                 IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift));
 613                 hw->mbx.stats.rsts++;
 614         }
 615 
 616         return ret_val;
 617 }
 618 
 619 /**
 620  *  ixgbe_obtain_mbx_lock_pf - obtain mailbox lock
 621  *  @hw: pointer to the HW structure
 622  *  @vf_number: the VF index
 623  *
 624  *  return SUCCESS if we obtained the mailbox lock
 625  **/
 626 static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
 627 {
 628         s32 ret_val = IXGBE_ERR_MBX;
 629         u32 p2v_mailbox;
 630 
 631         DEBUGFUNC("ixgbe_obtain_mbx_lock_pf");
 632 
 633         /* Take ownership of the buffer */
 634         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU);
 635 
 636         /* reserve mailbox for vf use */
 637         p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
 638         if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
 639                 ret_val = IXGBE_SUCCESS;



 640 

 641         return ret_val;
 642 }
 643 
 644 /**
 645  *  ixgbe_write_mbx_pf - Places a message in the mailbox
 646  *  @hw: pointer to the HW structure
 647  *  @msg: The message buffer
 648  *  @size: Length of buffer
 649  *  @vf_number: the VF index
 650  *
 651  *  returns SUCCESS if it successfully copied message into the buffer
 652  **/
 653 static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 654                               u16 vf_number)
 655 {
 656         s32 ret_val;
 657         u16 i;
 658 
 659         DEBUGFUNC("ixgbe_write_mbx_pf");
 660 
 661         /* lock the mailbox to prevent pf/vf race condition */
 662         ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
 663         if (ret_val)
 664                 goto out_no_write;
 665 
 666         /* flush msg and acks as we are overwriting the message buffer */
 667         ret_val = ixgbe_check_for_msg_vf(hw, 0);
 668         if (ret_val)
 669                 goto out_no_write;
 670         ret_val = ixgbe_check_for_ack_vf(hw, 0);
 671         if (ret_val)
 672                 goto out_no_write;
 673 
 674         /* copy the caller specified message to the mailbox memory buffer */
 675         for (i = 0; i < size; i++)
 676                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i, msg[i]);
 677 
 678         /* Interrupt VF to tell it a message has been sent and release buffer*/
 679         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_STS);
 680 
 681         /* update stats */
 682         hw->mbx.stats.msgs_tx++;
 683 
 684 out_no_write:
 685         return ret_val;
 686 
 687 }
 688 
 689 /**
 690  *  ixgbe_read_mbx_pf - Read a message from the mailbox
 691  *  @hw: pointer to the HW structure
 692  *  @msg: The message buffer


 718         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_ACK);
 719 
 720         /* update stats */
 721         hw->mbx.stats.msgs_rx++;
 722 
 723 out_no_read:
 724         return ret_val;
 725 }
 726 
 727 /**
 728  *  ixgbe_init_mbx_params_pf - set initial values for pf mailbox
 729  *  @hw: pointer to the HW structure
 730  *
 731  *  Initializes the hw->mbx struct to correct values for pf mailbox
 732  */
 733 void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
 734 {
 735         struct ixgbe_mbx_info *mbx = &hw->mbx;
 736 
 737         if (hw->mac.type != ixgbe_mac_82599EB &&


 738             hw->mac.type != ixgbe_mac_X540)
 739                 return;
 740 
 741         mbx->timeout = 0;
 742         mbx->usec_delay = 0;
 743 
 744         mbx->size = IXGBE_VFMAILBOX_SIZE;
 745 
 746         mbx->ops.read = ixgbe_read_mbx_pf;
 747         mbx->ops.write = ixgbe_write_mbx_pf;
 748         mbx->ops.read_posted = ixgbe_read_posted_mbx;
 749         mbx->ops.write_posted = ixgbe_write_posted_mbx;
 750         mbx->ops.check_for_msg = ixgbe_check_for_msg_pf;
 751         mbx->ops.check_for_ack = ixgbe_check_for_ack_pf;
 752         mbx->ops.check_for_rst = ixgbe_check_for_rst_pf;
 753 
 754         mbx->stats.msgs_tx = 0;
 755         mbx->stats.msgs_rx = 0;
 756         mbx->stats.reqs = 0;
 757         mbx->stats.acks = 0;
   1 /******************************************************************************
   2 
   3   Copyright (c) 2001-2015, 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 


  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 "ixgbe_type.h"
  36 #include "ixgbe_mbx.h"
  37 
  38 /**
  39  *  ixgbe_read_mbx - Reads a message from the mailbox
  40  *  @hw: pointer to the HW structure
  41  *  @msg: The message buffer
  42  *  @size: Length of buffer
  43  *  @mbx_id: id of mailbox to read
  44  *
  45  *  returns SUCCESS if it successfully read message from buffer
  46  **/
  47 s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  48 {
  49         struct ixgbe_mbx_info *mbx = &hw->mbx;
  50         s32 ret_val = IXGBE_ERR_MBX;
  51 
  52         DEBUGFUNC("ixgbe_read_mbx");
  53 
  54         /* limit read to size of mailbox */
  55         if (size > mbx->size)
  56                 size = mbx->size;
  57 
  58         if (mbx->ops.read)
  59                 ret_val = mbx->ops.read(hw, msg, size, mbx_id);
  60 
  61         return ret_val;
  62 }
  63 
  64 /**
  65  *  ixgbe_write_mbx - Write a message to the mailbox
  66  *  @hw: pointer to the HW structure
  67  *  @msg: The message buffer
  68  *  @size: Length of buffer
  69  *  @mbx_id: id of mailbox to write
  70  *
  71  *  returns SUCCESS if it successfully copied message into the buffer
  72  **/
  73 s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
  74 {
  75         struct ixgbe_mbx_info *mbx = &hw->mbx;
  76         s32 ret_val = IXGBE_SUCCESS;
  77 
  78         DEBUGFUNC("ixgbe_write_mbx");
  79 
  80         if (size > mbx->size) {
  81                 ret_val = IXGBE_ERR_MBX;
  82                 ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
  83                              "Invalid mailbox message size %d", size);
  84         } else if (mbx->ops.write)
  85                 ret_val = mbx->ops.write(hw, msg, size, mbx_id);
  86 
  87         return ret_val;
  88 }
  89 
  90 /**
  91  *  ixgbe_check_for_msg - checks to see if someone sent us mail
  92  *  @hw: pointer to the HW structure
  93  *  @mbx_id: id of mailbox to check
  94  *
  95  *  returns SUCCESS if the Status bit was found or else ERR_MBX
  96  **/
  97 s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
  98 {
  99         struct ixgbe_mbx_info *mbx = &hw->mbx;
 100         s32 ret_val = IXGBE_ERR_MBX;
 101 
 102         DEBUGFUNC("ixgbe_check_for_msg");
 103 
 104         if (mbx->ops.check_for_msg)


 154  *
 155  *  returns SUCCESS if it successfully received a message notification
 156  **/
 157 static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)
 158 {
 159         struct ixgbe_mbx_info *mbx = &hw->mbx;
 160         int countdown = mbx->timeout;
 161 
 162         DEBUGFUNC("ixgbe_poll_for_msg");
 163 
 164         if (!countdown || !mbx->ops.check_for_msg)
 165                 goto out;
 166 
 167         while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) {
 168                 countdown--;
 169                 if (!countdown)
 170                         break;
 171                 usec_delay(mbx->usec_delay);
 172         }
 173 
 174         if (countdown == 0)
 175                 ERROR_REPORT2(IXGBE_ERROR_POLLING,
 176                            "Polling for VF%d mailbox message timedout", mbx_id);
 177 
 178 out:
 179         return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 180 }
 181 
 182 /**
 183  *  ixgbe_poll_for_ack - Wait for message acknowledgement
 184  *  @hw: pointer to the HW structure
 185  *  @mbx_id: id of mailbox to write
 186  *
 187  *  returns SUCCESS if it successfully received a message acknowledgement
 188  **/
 189 static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)
 190 {
 191         struct ixgbe_mbx_info *mbx = &hw->mbx;
 192         int countdown = mbx->timeout;
 193 
 194         DEBUGFUNC("ixgbe_poll_for_ack");
 195 
 196         if (!countdown || !mbx->ops.check_for_ack)
 197                 goto out;
 198 
 199         while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) {
 200                 countdown--;
 201                 if (!countdown)
 202                         break;
 203                 usec_delay(mbx->usec_delay);
 204         }
 205 
 206         if (countdown == 0)
 207                 ERROR_REPORT2(IXGBE_ERROR_POLLING,
 208                              "Polling for VF%d mailbox ack timedout", mbx_id);
 209 
 210 out:
 211         return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX;
 212 }
 213 
 214 /**
 215  *  ixgbe_read_posted_mbx - Wait for message notification and receive message
 216  *  @hw: pointer to the HW structure
 217  *  @msg: The message buffer
 218  *  @size: Length of buffer
 219  *  @mbx_id: id of mailbox to write
 220  *
 221  *  returns SUCCESS if it successfully received a message notification and
 222  *  copied it into the receive buffer.
 223  **/
 224 s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)
 225 {
 226         struct ixgbe_mbx_info *mbx = &hw->mbx;
 227         s32 ret_val = IXGBE_ERR_MBX;
 228 
 229         DEBUGFUNC("ixgbe_read_posted_mbx");


 421  *  @mbx_id: id of mailbox to write
 422  *
 423  *  returns SUCCESS if it successfully copied message into the buffer
 424  **/
 425 static s32 ixgbe_write_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 426                               u16 mbx_id)
 427 {
 428         s32 ret_val;
 429         u16 i;
 430 
 431         UNREFERENCED_1PARAMETER(mbx_id);
 432 
 433         DEBUGFUNC("ixgbe_write_mbx_vf");
 434 
 435         /* lock the mailbox to prevent pf/vf race condition */
 436         ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 437         if (ret_val)
 438                 goto out_no_write;
 439 
 440         /* flush msg and acks as we are overwriting the message buffer */
 441         ixgbe_check_for_msg_vf(hw, 0);
 442         ixgbe_check_for_ack_vf(hw, 0);




 443 
 444         /* copy the caller specified message to the mailbox memory buffer */
 445         for (i = 0; i < size; i++)
 446                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_VFMBMEM, i, msg[i]);
 447 
 448         /* update stats */
 449         hw->mbx.stats.msgs_tx++;
 450 
 451         /* Drop VFU and interrupt the PF to tell it a message has been sent */
 452         IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ);
 453 
 454 out_no_write:
 455         return ret_val;
 456 }
 457 
 458 /**
 459  *  ixgbe_read_mbx_vf - Reads a message from the inbox intended for vf
 460  *  @hw: pointer to the HW structure
 461  *  @msg: The message buffer
 462  *  @size: Length of buffer
 463  *  @mbx_id: id of mailbox to read
 464  *
 465  *  returns SUCCESS if it successfully read message from buffer
 466  **/
 467 static s32 ixgbe_read_mbx_vf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 468                              u16 mbx_id)
 469 {
 470         s32 ret_val = IXGBE_SUCCESS;
 471         u16 i;
 472 
 473         DEBUGFUNC("ixgbe_read_mbx_vf");
 474         UNREFERENCED_1PARAMETER(mbx_id);
 475 
 476         /* lock the mailbox to prevent pf/vf race condition */
 477         ret_val = ixgbe_obtain_mbx_lock_vf(hw);
 478         if (ret_val)
 479                 goto out_no_read;
 480 
 481         /* copy the message from the mailbox memory buffer */
 482         for (i = 0; i < size; i++)
 483                 msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_VFMBMEM, i);
 484 
 485         /* Acknowledge receipt and release mailbox, then we're done */


 588 /**
 589  *  ixgbe_check_for_rst_pf - checks to see if the VF has reset
 590  *  @hw: pointer to the HW structure
 591  *  @vf_number: the VF index
 592  *
 593  *  returns SUCCESS if the VF has set the Status bit or else ERR_MBX
 594  **/
 595 static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
 596 {
 597         u32 reg_offset = (vf_number < 32) ? 0 : 1;
 598         u32 vf_shift = vf_number % 32;
 599         u32 vflre = 0;
 600         s32 ret_val = IXGBE_ERR_MBX;
 601 
 602         DEBUGFUNC("ixgbe_check_for_rst_pf");
 603 
 604         switch (hw->mac.type) {
 605         case ixgbe_mac_82599EB:
 606                 vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset));
 607                 break;
 608         case ixgbe_mac_X550:
 609         case ixgbe_mac_X550EM_x:
 610         case ixgbe_mac_X540:
 611                 vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset));
 612                 break;
 613         default:
 614                 break;
 615         }
 616 
 617         if (vflre & (1 << vf_shift)) {
 618                 ret_val = IXGBE_SUCCESS;
 619                 IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift));
 620                 hw->mbx.stats.rsts++;
 621         }
 622 
 623         return ret_val;
 624 }
 625 
 626 /**
 627  *  ixgbe_obtain_mbx_lock_pf - obtain mailbox lock
 628  *  @hw: pointer to the HW structure
 629  *  @vf_number: the VF index
 630  *
 631  *  return SUCCESS if we obtained the mailbox lock
 632  **/
 633 static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)
 634 {
 635         s32 ret_val = IXGBE_ERR_MBX;
 636         u32 p2v_mailbox;
 637 
 638         DEBUGFUNC("ixgbe_obtain_mbx_lock_pf");
 639 
 640         /* Take ownership of the buffer */
 641         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU);
 642 
 643         /* reserve mailbox for vf use */
 644         p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number));
 645         if (p2v_mailbox & IXGBE_PFMAILBOX_PFU)
 646                 ret_val = IXGBE_SUCCESS;
 647         else
 648                 ERROR_REPORT2(IXGBE_ERROR_POLLING,
 649                            "Failed to obtain mailbox lock for VF%d", vf_number);
 650 
 651 
 652         return ret_val;
 653 }
 654 
 655 /**
 656  *  ixgbe_write_mbx_pf - Places a message in the mailbox
 657  *  @hw: pointer to the HW structure
 658  *  @msg: The message buffer
 659  *  @size: Length of buffer
 660  *  @vf_number: the VF index
 661  *
 662  *  returns SUCCESS if it successfully copied message into the buffer
 663  **/
 664 static s32 ixgbe_write_mbx_pf(struct ixgbe_hw *hw, u32 *msg, u16 size,
 665                               u16 vf_number)
 666 {
 667         s32 ret_val;
 668         u16 i;
 669 
 670         DEBUGFUNC("ixgbe_write_mbx_pf");
 671 
 672         /* lock the mailbox to prevent pf/vf race condition */
 673         ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number);
 674         if (ret_val)
 675                 goto out_no_write;
 676 
 677         /* flush msg and acks as we are overwriting the message buffer */
 678         ixgbe_check_for_msg_pf(hw, vf_number);
 679         ixgbe_check_for_ack_pf(hw, vf_number);




 680 
 681         /* copy the caller specified message to the mailbox memory buffer */
 682         for (i = 0; i < size; i++)
 683                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i, msg[i]);
 684 
 685         /* Interrupt VF to tell it a message has been sent and release buffer*/
 686         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_STS);
 687 
 688         /* update stats */
 689         hw->mbx.stats.msgs_tx++;
 690 
 691 out_no_write:
 692         return ret_val;
 693 
 694 }
 695 
 696 /**
 697  *  ixgbe_read_mbx_pf - Read a message from the mailbox
 698  *  @hw: pointer to the HW structure
 699  *  @msg: The message buffer


 725         IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_ACK);
 726 
 727         /* update stats */
 728         hw->mbx.stats.msgs_rx++;
 729 
 730 out_no_read:
 731         return ret_val;
 732 }
 733 
 734 /**
 735  *  ixgbe_init_mbx_params_pf - set initial values for pf mailbox
 736  *  @hw: pointer to the HW structure
 737  *
 738  *  Initializes the hw->mbx struct to correct values for pf mailbox
 739  */
 740 void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
 741 {
 742         struct ixgbe_mbx_info *mbx = &hw->mbx;
 743 
 744         if (hw->mac.type != ixgbe_mac_82599EB &&
 745             hw->mac.type != ixgbe_mac_X550 &&
 746             hw->mac.type != ixgbe_mac_X550EM_x &&
 747             hw->mac.type != ixgbe_mac_X540)
 748                 return;
 749 
 750         mbx->timeout = 0;
 751         mbx->usec_delay = 0;
 752 
 753         mbx->size = IXGBE_VFMAILBOX_SIZE;
 754 
 755         mbx->ops.read = ixgbe_read_mbx_pf;
 756         mbx->ops.write = ixgbe_write_mbx_pf;
 757         mbx->ops.read_posted = ixgbe_read_posted_mbx;
 758         mbx->ops.write_posted = ixgbe_write_posted_mbx;
 759         mbx->ops.check_for_msg = ixgbe_check_for_msg_pf;
 760         mbx->ops.check_for_ack = ixgbe_check_for_ack_pf;
 761         mbx->ops.check_for_rst = ixgbe_check_for_rst_pf;
 762 
 763         mbx->stats.msgs_tx = 0;
 764         mbx->stats.msgs_rx = 0;
 765         mbx->stats.reqs = 0;
 766         mbx->stats.acks = 0;