X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fiavf%2Fiavf.h;h=f413dbed833afa231139b0faf076464d7a7db6c1;hb=9086ac093ab6bb25df7aa4008738dfd148c00ddf;hp=8f795f2bed5da75c43304ad16863b56f403c686d;hpb=627b3c5a39eb5c5461bdf0f0013817c34be98944;p=dpdk.git diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index 8f795f2bed..f413dbed83 100644 --- a/drivers/net/iavf/iavf.h +++ b/drivers/net/iavf/iavf.h @@ -31,6 +31,8 @@ #define IAVF_NUM_MACADDR_MAX 64 +#define IAVF_DEV_WATCHDOG_PERIOD 0 + #define IAVF_DEFAULT_RX_PTHRESH 8 #define IAVF_DEFAULT_RX_HTHRESH 8 #define IAVF_DEFAULT_RX_WTHRESH 0 @@ -96,6 +98,25 @@ struct iavf_adapter; struct iavf_rx_queue; struct iavf_tx_queue; + +struct iavf_ipsec_crypto_stats { + uint64_t icount; + uint64_t ibytes; + struct { + uint64_t count; + uint64_t sad_miss; + uint64_t not_processed; + uint64_t icv_check; + uint64_t ipsec_length; + uint64_t misc; + } ierrors; +}; + +struct iavf_eth_xstats { + struct virtchnl_eth_stats eth_stats; + struct iavf_ipsec_crypto_stats ips_stats; +}; + /* Structure that defines a VSI, associated with a adapter. */ struct iavf_vsi { struct iavf_adapter *adapter; /* Backreference to associated adapter */ @@ -105,7 +126,7 @@ struct iavf_vsi { uint16_t max_macaddrs; /* Maximum number of MAC addresses */ uint16_t base_vector; uint16_t msix_intr; /* The MSIX interrupt binds to VSI */ - struct virtchnl_eth_stats eth_stats_offset; + struct iavf_eth_xstats eth_stats_offset; }; struct rte_flow; @@ -193,9 +214,13 @@ struct iavf_info { uint64_t supported_rxdid; uint8_t *proto_xtr; /* proto xtr type for all queues */ volatile enum virtchnl_ops pend_cmd; /* pending command not finished */ + uint32_t pend_cmd_count; int cmd_retval; /* return value of the cmd response from PF */ uint8_t *aq_resp; /* buffer to store the adminq response from PF */ + /** iAVF watchdog enable */ + bool watchdog_enabled; + /* Event from pf */ bool dev_closed; bool link_up; @@ -220,6 +245,7 @@ struct iavf_info { rte_spinlock_t flow_ops_lock; struct iavf_parser_list rss_parser_list; struct iavf_parser_list dist_parser_list; + struct iavf_parser_list ipsec_crypto_parser_list; struct iavf_fdir_info fdir; /* flow director info */ /* indicate large VF support enabled or not */ @@ -244,6 +270,7 @@ enum iavf_proto_xtr_type { IAVF_PROTO_XTR_IPV6_FLOW, IAVF_PROTO_XTR_TCP, IAVF_PROTO_XTR_IP_OFFSET, + IAVF_PROTO_XTR_IPSEC_CRYPTO_SAID, IAVF_PROTO_XTR_MAX, }; @@ -255,11 +282,14 @@ struct iavf_devargs { uint8_t proto_xtr[IAVF_MAX_QUEUE_NUM]; }; +struct iavf_security_ctx; + /* Structure to store private data for each VF instance. */ struct iavf_adapter { struct iavf_hw hw; struct rte_eth_dev_data *dev_data; struct iavf_info vf; + struct iavf_security_ctx *security_ctx; bool rx_bulk_alloc_allowed; /* For vector PMD */ @@ -278,6 +308,8 @@ struct iavf_adapter { (&((struct iavf_adapter *)adapter)->vf) #define IAVF_DEV_PRIVATE_TO_HW(adapter) \ (&((struct iavf_adapter *)adapter)->hw) +#define IAVF_DEV_PRIVATE_TO_IAVF_SECURITY_CTX(adapter) \ + (((struct iavf_adapter *)adapter)->security_ctx) /* IAVF_VSI_TO */ #define IAVF_VSI_TO_HW(vsi) \ @@ -339,15 +371,33 @@ _clear_cmd(struct iavf_info *vf) static inline int _atomic_set_cmd(struct iavf_info *vf, enum virtchnl_ops ops) { - int ret = rte_atomic32_cmpset((volatile uint32_t *)&vf->pend_cmd, - VIRTCHNL_OP_UNKNOWN, ops); + enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN; + int ret = __atomic_compare_exchange(&vf->pend_cmd, &op_unk, &ops, + 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); if (!ret) PMD_DRV_LOG(ERR, "There is incomplete cmd %d", vf->pend_cmd); + __atomic_store_n(&vf->pend_cmd_count, 1, __ATOMIC_RELAXED); + return !ret; } +/* Check there is pending cmd in execution. If none, set new command. */ +static inline int +_atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops) +{ + enum virtchnl_ops op_unk = VIRTCHNL_OP_UNKNOWN; + int ret = __atomic_compare_exchange(&vf->pend_cmd, &op_unk, &ops, + 0, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); + + if (!ret) + PMD_DRV_LOG(ERR, "There is incomplete cmd %d", vf->pend_cmd); + + __atomic_store_n(&vf->pend_cmd_count, 2, __ATOMIC_RELAXED); + + return !ret; +} int iavf_check_api_version(struct iavf_adapter *adapter); int iavf_get_vf_resource(struct iavf_adapter *adapter); void iavf_handle_virtchnl_msg(struct rte_eth_dev *dev); @@ -405,5 +455,8 @@ int iavf_set_q_tc_map(struct rte_eth_dev *dev, uint16_t size); void iavf_tm_conf_init(struct rte_eth_dev *dev); void iavf_tm_conf_uninit(struct rte_eth_dev *dev); +int iavf_ipsec_crypto_request(struct iavf_adapter *adapter, + uint8_t *msg, size_t msg_len, + uint8_t *resp_msg, size_t resp_msg_len); extern const struct rte_tm_ops iavf_tm_ops; #endif /* _IAVF_ETHDEV_H_ */