Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ixgbe/ixgbe_mbx.c
/****************************************************************************** | /****************************************************************************** | ||||
Copyright (c) 2001-2015, Intel Corporation | Copyright (c) 2001-2017, Intel Corporation | ||||
All rights reserved. | All rights reserved. | ||||
Redistribution and use in source and binary forms, with or without | Redistribution and use in source and binary forms, with or without | ||||
modification, are permitted provided that the following conditions are met: | modification, are permitted provided that the following conditions are met: | ||||
1. Redistributions of source code must retain the above copyright notice, | 1. Redistributions of source code must retain the above copyright notice, | ||||
this list of conditions and the following disclaimer. | this list of conditions and the following disclaimer. | ||||
2. Redistributions in binary form must reproduce the above copyright | 2. Redistributions in binary form must reproduce the above copyright | ||||
notice, this list of conditions and the following disclaimer in the | notice, this list of conditions and the following disclaimer in the | ||||
documentation and/or other materials provided with the distribution. | documentation and/or other materials provided with the distribution. | ||||
3. Neither the name of the Intel Corporation nor the names of its | 3. Neither the name of the Intel Corporation nor the names of its | ||||
contributors may be used to endorse or promote products derived from | contributors may be used to endorse or promote products derived from | ||||
this software without specific prior written permission. | this software without specific prior written permission. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
POSSIBILITY OF SUCH DAMAGE. | POSSIBILITY OF SUCH DAMAGE. | ||||
******************************************************************************/ | ******************************************************************************/ | ||||
/*$FreeBSD$*/ | /*$FreeBSD$*/ | ||||
#include "ixgbe_type.h" | #include "ixgbe_type.h" | ||||
#include "ixgbe_mbx.h" | #include "ixgbe_mbx.h" | ||||
/** | /** | ||||
* ixgbe_read_mbx - Reads a message from the mailbox | |||||
* @hw: pointer to the HW structure | |||||
* @msg: The message buffer | |||||
* @size: Length of buffer | |||||
* @mbx_id: id of mailbox to read | |||||
* | |||||
* returns SUCCESS if it successfully read message from buffer | |||||
**/ | |||||
s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id) | |||||
{ | |||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | |||||
s32 ret_val = IXGBE_ERR_MBX; | |||||
DEBUGFUNC("ixgbe_read_mbx"); | |||||
/* limit read to size of mailbox */ | |||||
if (size > mbx->size) | |||||
size = mbx->size; | |||||
if (mbx->ops.read) | |||||
ret_val = mbx->ops.read(hw, msg, size, mbx_id); | |||||
return ret_val; | |||||
} | |||||
/** | |||||
* ixgbe_write_mbx - Write a message to the mailbox | |||||
* @hw: pointer to the HW structure | |||||
* @msg: The message buffer | |||||
* @size: Length of buffer | |||||
* @mbx_id: id of mailbox to write | |||||
* | |||||
* returns SUCCESS if it successfully copied message into the buffer | |||||
**/ | |||||
s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id) | |||||
{ | |||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | |||||
s32 ret_val = IXGBE_SUCCESS; | |||||
DEBUGFUNC("ixgbe_write_mbx"); | |||||
if (size > mbx->size) { | |||||
ret_val = IXGBE_ERR_MBX; | |||||
ERROR_REPORT2(IXGBE_ERROR_ARGUMENT, | |||||
"Invalid mailbox message size %d", size); | |||||
} else if (mbx->ops.write) | |||||
ret_val = mbx->ops.write(hw, msg, size, mbx_id); | |||||
return ret_val; | |||||
} | |||||
/** | |||||
* ixgbe_check_for_msg - checks to see if someone sent us mail | |||||
* @hw: pointer to the HW structure | |||||
* @mbx_id: id of mailbox to check | |||||
* | |||||
* returns SUCCESS if the Status bit was found or else ERR_MBX | |||||
**/ | |||||
s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id) | |||||
{ | |||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | |||||
s32 ret_val = IXGBE_ERR_MBX; | |||||
DEBUGFUNC("ixgbe_check_for_msg"); | |||||
if (mbx->ops.check_for_msg) | |||||
ret_val = mbx->ops.check_for_msg(hw, mbx_id); | |||||
return ret_val; | |||||
} | |||||
/** | |||||
* ixgbe_check_for_ack - checks to see if someone sent us ACK | |||||
* @hw: pointer to the HW structure | |||||
* @mbx_id: id of mailbox to check | |||||
* | |||||
* returns SUCCESS if the Status bit was found or else ERR_MBX | |||||
**/ | |||||
s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id) | |||||
{ | |||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | |||||
s32 ret_val = IXGBE_ERR_MBX; | |||||
DEBUGFUNC("ixgbe_check_for_ack"); | |||||
if (mbx->ops.check_for_ack) | |||||
ret_val = mbx->ops.check_for_ack(hw, mbx_id); | |||||
return ret_val; | |||||
} | |||||
/** | |||||
* ixgbe_check_for_rst - checks to see if other side has reset | |||||
* @hw: pointer to the HW structure | |||||
* @mbx_id: id of mailbox to check | |||||
* | |||||
* returns SUCCESS if the Status bit was found or else ERR_MBX | |||||
**/ | |||||
s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id) | |||||
{ | |||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | |||||
s32 ret_val = IXGBE_ERR_MBX; | |||||
DEBUGFUNC("ixgbe_check_for_rst"); | |||||
if (mbx->ops.check_for_rst) | |||||
ret_val = mbx->ops.check_for_rst(hw, mbx_id); | |||||
return ret_val; | |||||
} | |||||
/** | |||||
* ixgbe_poll_for_msg - Wait for message notification | * ixgbe_poll_for_msg - Wait for message notification | ||||
* @hw: pointer to the HW structure | * @hw: pointer to the HW structure | ||||
* @mbx_id: id of mailbox to write | * @mbx_id: id of mailbox to write | ||||
* | * | ||||
* returns SUCCESS if it successfully received a message notification | * returns SUCCESS if it successfully received a message notification | ||||
**/ | **/ | ||||
static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id) | static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
* @hw: pointer to the HW structure | * @hw: pointer to the HW structure | ||||
* @msg: The message buffer | * @msg: The message buffer | ||||
* @size: Length of buffer | * @size: Length of buffer | ||||
* @mbx_id: id of mailbox to write | * @mbx_id: id of mailbox to write | ||||
* | * | ||||
* returns SUCCESS if it successfully received a message notification and | * returns SUCCESS if it successfully received a message notification and | ||||
* copied it into the receive buffer. | * copied it into the receive buffer. | ||||
**/ | **/ | ||||
s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id) | static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, | ||||
u16 mbx_id) | |||||
{ | { | ||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | struct ixgbe_mbx_info *mbx = &hw->mbx; | ||||
s32 ret_val = IXGBE_ERR_MBX; | s32 ret_val = IXGBE_ERR_MBX; | ||||
DEBUGFUNC("ixgbe_read_posted_mbx"); | DEBUGFUNC("ixgbe_read_posted_mbx"); | ||||
if (!mbx->ops.read) | if (!mbx->ops.read) | ||||
goto out; | goto out; | ||||
Show All 12 Lines | |||||
* @hw: pointer to the HW structure | * @hw: pointer to the HW structure | ||||
* @msg: The message buffer | * @msg: The message buffer | ||||
* @size: Length of buffer | * @size: Length of buffer | ||||
* @mbx_id: id of mailbox to write | * @mbx_id: id of mailbox to write | ||||
* | * | ||||
* returns SUCCESS if it successfully copied message into the buffer and | * returns SUCCESS if it successfully copied message into the buffer and | ||||
* received an ack to that message within delay * timeout period | * received an ack to that message within delay * timeout period | ||||
**/ | **/ | ||||
s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, | static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, | ||||
u16 mbx_id) | u16 mbx_id) | ||||
{ | { | ||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | struct ixgbe_mbx_info *mbx = &hw->mbx; | ||||
s32 ret_val = IXGBE_ERR_MBX; | s32 ret_val = IXGBE_ERR_MBX; | ||||
DEBUGFUNC("ixgbe_write_posted_mbx"); | DEBUGFUNC("ixgbe_write_posted_mbx"); | ||||
/* exit if either we can't write or there isn't a defined timeout */ | /* exit if either we can't write or there isn't a defined timeout */ | ||||
if (!mbx->ops.write || !mbx->timeout) | if (!mbx->ops.write || !mbx->timeout) | ||||
▲ Show 20 Lines • Show All 339 Lines • ▼ Show 20 Lines | static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number) | ||||
DEBUGFUNC("ixgbe_check_for_rst_pf"); | DEBUGFUNC("ixgbe_check_for_rst_pf"); | ||||
switch (hw->mac.type) { | switch (hw->mac.type) { | ||||
case ixgbe_mac_82599EB: | case ixgbe_mac_82599EB: | ||||
vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset)); | vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset)); | ||||
break; | break; | ||||
case ixgbe_mac_X550: | case ixgbe_mac_X550: | ||||
case ixgbe_mac_X550EM_x: | case ixgbe_mac_X550EM_x: | ||||
case ixgbe_mac_X550EM_a: | |||||
case ixgbe_mac_X540: | case ixgbe_mac_X540: | ||||
vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset)); | vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset)); | ||||
break; | break; | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
if (vflre & (1 << vf_shift)) { | if (vflre & (1 << vf_shift)) { | ||||
▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw) | void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw) | ||||
{ | { | ||||
struct ixgbe_mbx_info *mbx = &hw->mbx; | struct ixgbe_mbx_info *mbx = &hw->mbx; | ||||
if (hw->mac.type != ixgbe_mac_82599EB && | if (hw->mac.type != ixgbe_mac_82599EB && | ||||
hw->mac.type != ixgbe_mac_X550 && | hw->mac.type != ixgbe_mac_X550 && | ||||
hw->mac.type != ixgbe_mac_X550EM_x && | hw->mac.type != ixgbe_mac_X550EM_x && | ||||
hw->mac.type != ixgbe_mac_X550EM_a && | |||||
hw->mac.type != ixgbe_mac_X540) | hw->mac.type != ixgbe_mac_X540) | ||||
return; | return; | ||||
mbx->timeout = 0; | mbx->timeout = 0; | ||||
mbx->usec_delay = 0; | mbx->usec_delay = 0; | ||||
mbx->size = IXGBE_VFMAILBOX_SIZE; | mbx->size = IXGBE_VFMAILBOX_SIZE; | ||||
Show All 14 Lines |