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