net/ixgbe: add application callback on VF to PF messsage
call _rte_eth_dev_callback_process from ixgbe_rcv_msg_from_vf function. The callback asks the user application if it is allowed to perform the function. If the cb_param.retval is RTE_PMD_IXGBE_MB_EVENT_PROCEED then continue, if 0, do nothing and send ACK to VF if > 1, do nothing and send NAK to VF. Signed-off-by: Alex Zelezniak <alexz@att.com> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
This commit is contained in:
parent
c1ceaf3ad0
commit
57bee54e5a
@ -1,7 +1,7 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -51,6 +51,7 @@
|
||||
|
||||
#include "base/ixgbe_common.h"
|
||||
#include "ixgbe_ethdev.h"
|
||||
#include "rte_pmd_ixgbe.h"
|
||||
|
||||
#define IXGBE_MAX_VFTA (128)
|
||||
#define IXGBE_VF_MSG_SIZE_DEFAULT 1
|
||||
@ -660,6 +661,7 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
|
||||
struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
struct ixgbe_vf_info *vfinfo =
|
||||
*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
|
||||
struct rte_pmd_ixgbe_mb_event_param cb_param;
|
||||
|
||||
retval = ixgbe_read_mbx(hw, msgbuf, mbx_size, vf);
|
||||
if (retval) {
|
||||
@ -674,27 +676,54 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
|
||||
/* flush the ack before we write any messages back */
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
|
||||
/**
|
||||
* initialise structure to send to user application
|
||||
* will return response from user in retval field
|
||||
*/
|
||||
cb_param.retval = RTE_PMD_IXGBE_MB_EVENT_PROCEED;
|
||||
cb_param.vfid = vf;
|
||||
cb_param.msg_type = msgbuf[0] & 0xFFFF;
|
||||
cb_param.msg = (void *)msgbuf;
|
||||
|
||||
/* perform VF reset */
|
||||
if (msgbuf[0] == IXGBE_VF_RESET) {
|
||||
int ret = ixgbe_vf_reset(dev, vf, msgbuf);
|
||||
|
||||
vfinfo[vf].clear_to_send = true;
|
||||
|
||||
/* notify application about VF reset */
|
||||
_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_VF_MBOX, &cb_param);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* ask user application if we allowed to perform those functions
|
||||
* if we get cb_param.retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED
|
||||
* then business as usual,
|
||||
* if 0, do nothing and send ACK to VF
|
||||
* if cb_param.retval > 1, do nothing and send NAK to VF
|
||||
*/
|
||||
_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_VF_MBOX, &cb_param);
|
||||
|
||||
retval = cb_param.retval;
|
||||
|
||||
/* check & process VF to PF mailbox message */
|
||||
switch ((msgbuf[0] & 0xFFFF)) {
|
||||
case IXGBE_VF_SET_MAC_ADDR:
|
||||
retval = ixgbe_vf_set_mac_addr(dev, vf, msgbuf);
|
||||
if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
|
||||
retval = ixgbe_vf_set_mac_addr(dev, vf, msgbuf);
|
||||
break;
|
||||
case IXGBE_VF_SET_MULTICAST:
|
||||
retval = ixgbe_vf_set_multicast(dev, vf, msgbuf);
|
||||
if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
|
||||
retval = ixgbe_vf_set_multicast(dev, vf, msgbuf);
|
||||
break;
|
||||
case IXGBE_VF_SET_LPE:
|
||||
retval = ixgbe_set_vf_lpe(dev, vf, msgbuf);
|
||||
if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
|
||||
retval = ixgbe_set_vf_lpe(dev, vf, msgbuf);
|
||||
break;
|
||||
case IXGBE_VF_SET_VLAN:
|
||||
retval = ixgbe_vf_set_vlan(dev, vf, msgbuf);
|
||||
if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
|
||||
retval = ixgbe_vf_set_vlan(dev, vf, msgbuf);
|
||||
break;
|
||||
case IXGBE_VF_API_NEGOTIATE:
|
||||
retval = ixgbe_negotiate_vf_api(dev, vf, msgbuf);
|
||||
@ -704,7 +733,8 @@ ixgbe_rcv_msg_from_vf(struct rte_eth_dev *dev, uint16_t vf)
|
||||
msg_size = IXGBE_VF_GET_QUEUE_MSG_SIZE;
|
||||
break;
|
||||
case IXGBE_VF_UPDATE_XCAST_MODE:
|
||||
retval = ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);
|
||||
if (retval == RTE_PMD_IXGBE_MB_EVENT_PROCEED)
|
||||
retval = ixgbe_set_vf_mc_promisc(dev, vf, msgbuf);
|
||||
break;
|
||||
default:
|
||||
PMD_DRV_LOG(DEBUG, "Unhandled Msg %8.8x", (unsigned)msgbuf[0]);
|
||||
|
@ -180,4 +180,24 @@ int rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on);
|
||||
*/
|
||||
int
|
||||
rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on);
|
||||
|
||||
/**
|
||||
* Response sent back to ixgbe driver from user app after callback
|
||||
*/
|
||||
enum rte_pmd_ixgbe_mb_event_rsp {
|
||||
RTE_PMD_IXGBE_MB_EVENT_NOOP_ACK, /**< skip mbox request and ACK */
|
||||
RTE_PMD_IXGBE_MB_EVENT_NOOP_NACK, /**< skip mbox request and NACK */
|
||||
RTE_PMD_IXGBE_MB_EVENT_PROCEED, /**< proceed with mbox request */
|
||||
RTE_PMD_IXGBE_MB_EVENT_MAX /**< max value of this enum */
|
||||
};
|
||||
|
||||
/**
|
||||
* Data sent to the user application when the callback is executed.
|
||||
*/
|
||||
struct rte_pmd_ixgbe_mb_event_param {
|
||||
uint16_t vfid; /**< Virtual Function number */
|
||||
uint16_t msg_type; /**< VF to PF message type, defined in ixgbe_mbx.h */
|
||||
uint16_t retval; /**< return value */
|
||||
void *msg; /**< pointer to message */
|
||||
};
|
||||
#endif /* _PMD_IXGBE_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user