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