net/bnxt: add HWRM VNIC configure
This patch configures the properties and actions of the VNIC allocated by vnic_alloc function from the previous patch. bnxt_hwrm_vnic_cfg: Configure the VNIC structure in hardware. Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com> Signed-off-by: Stephen Hurd <stephen.hurd@broadcom.com> Reviewed-by: David Christensen <david.christensen@broadcom.com>
This commit is contained in:
parent
b7390d4388
commit
db678d5c2b
@ -553,6 +553,40 @@ int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
||||
return rc;
|
||||
}
|
||||
|
||||
int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
||||
{
|
||||
int rc = 0;
|
||||
struct hwrm_vnic_cfg_input req = {.req_type = 0 };
|
||||
struct hwrm_vnic_cfg_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
|
||||
HWRM_PREP(req, VNIC_CFG, -1, resp);
|
||||
|
||||
/* Only RSS support for now TBD: COS & LB */
|
||||
req.enables =
|
||||
rte_cpu_to_le_32(HWRM_VNIC_CFG_INPUT_ENABLES_DFLT_RING_GRP |
|
||||
HWRM_VNIC_CFG_INPUT_ENABLES_RSS_RULE |
|
||||
HWRM_VNIC_CFG_INPUT_ENABLES_MRU);
|
||||
req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
|
||||
req.dflt_ring_grp =
|
||||
rte_cpu_to_le_16(bp->grp_info[vnic->start_grp_id].fw_grp_id);
|
||||
req.rss_rule = rte_cpu_to_le_16(vnic->fw_rss_cos_lb_ctx);
|
||||
req.cos_rule = rte_cpu_to_le_16(0xffff);
|
||||
req.lb_rule = rte_cpu_to_le_16(0xffff);
|
||||
req.mru = rte_cpu_to_le_16(bp->eth_dev->data->mtu + ETHER_HDR_LEN +
|
||||
ETHER_CRC_LEN + VLAN_TAG_SIZE);
|
||||
if (vnic->func_default)
|
||||
req.flags = 1;
|
||||
if (vnic->vlan_strip)
|
||||
req.flags |=
|
||||
rte_cpu_to_le_32(HWRM_VNIC_CFG_INPUT_FLAGS_VLAN_STRIP_MODE);
|
||||
|
||||
rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
|
||||
|
||||
HWRM_CHECK_RESULT;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
||||
{
|
||||
int rc = 0;
|
||||
|
@ -63,8 +63,9 @@ int bnxt_hwrm_stat_clear(struct bnxt *bp, struct bnxt_cp_ring_info *cpr);
|
||||
|
||||
int bnxt_hwrm_ver_get(struct bnxt *bp);
|
||||
|
||||
int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic);
|
||||
int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic);
|
||||
int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic);
|
||||
int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic);
|
||||
|
||||
int bnxt_clear_all_hwrm_stat_ctxs(struct bnxt *bp);
|
||||
void bnxt_free_hwrm_resources(struct bnxt *bp);
|
||||
|
@ -91,6 +91,7 @@ struct ctx_hw_stats64 {
|
||||
#define HWRM_QUEUE_QPORTCFG (UINT32_C(0x30))
|
||||
#define HWRM_VNIC_ALLOC (UINT32_C(0x40))
|
||||
#define HWRM_VNIC_FREE (UINT32_C(0x41))
|
||||
#define HWRM_VNIC_CFG (UINT32_C(0x42))
|
||||
#define HWRM_CFA_L2_FILTER_ALLOC (UINT32_C(0x90))
|
||||
#define HWRM_CFA_L2_FILTER_FREE (UINT32_C(0x91))
|
||||
#define HWRM_CFA_L2_FILTER_CFG (UINT32_C(0x92))
|
||||
@ -3219,6 +3220,160 @@ struct hwrm_vnic_alloc_output {
|
||||
uint8_t valid;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* hwrm_vnic_cfg */
|
||||
/* Description: Configure the RX VNIC structure. */
|
||||
|
||||
/* Input (40 bytes) */
|
||||
struct hwrm_vnic_cfg_input {
|
||||
/*
|
||||
* This value indicates what type of request this is. The format for the
|
||||
* rest of the command is determined by this field.
|
||||
*/
|
||||
uint16_t req_type;
|
||||
|
||||
/*
|
||||
* This value indicates the what completion ring the request will be
|
||||
* optionally completed on. If the value is -1, then no CR completion
|
||||
* will be generated. Any other value must be a valid CR ring_id value
|
||||
* for this function.
|
||||
*/
|
||||
uint16_t cmpl_ring;
|
||||
|
||||
/* This value indicates the command sequence number. */
|
||||
uint16_t seq_id;
|
||||
|
||||
/*
|
||||
* Target ID of this command. 0x0 - 0xFFF8 - Used for function ids
|
||||
* 0xFFF8 - 0xFFFE - Reserved for internal processors 0xFFFF - HWRM
|
||||
*/
|
||||
uint16_t target_id;
|
||||
|
||||
/*
|
||||
* This is the host address where the response will be written when the
|
||||
* request is complete. This area must be 16B aligned and must be
|
||||
* cleared to zero before the request is made.
|
||||
*/
|
||||
uint64_t resp_addr;
|
||||
|
||||
/*
|
||||
* When this bit is '1', the VNIC is requested to be the default VNIC
|
||||
* for the function.
|
||||
*/
|
||||
#define HWRM_VNIC_CFG_INPUT_FLAGS_DEFAULT UINT32_C(0x1)
|
||||
/*
|
||||
* When this bit is '1', the VNIC is being configured to strip VLAN in
|
||||
* the RX path. If set to '0', then VLAN stripping is disabled on this
|
||||
* VNIC.
|
||||
*/
|
||||
#define HWRM_VNIC_CFG_INPUT_FLAGS_VLAN_STRIP_MODE UINT32_C(0x2)
|
||||
/*
|
||||
* When this bit is '1', the VNIC is being configured to buffer receive
|
||||
* packets in the hardware until the host posts new receive buffers. If
|
||||
* set to '0', then bd_stall is being configured to be disabled on this
|
||||
* VNIC.
|
||||
*/
|
||||
#define HWRM_VNIC_CFG_INPUT_FLAGS_BD_STALL_MODE UINT32_C(0x4)
|
||||
/*
|
||||
* When this bit is '1', the VNIC is being configured to receive both
|
||||
* RoCE and non-RoCE traffic. If set to '0', then this VNIC is not
|
||||
* configured to be operating in dual VNIC mode.
|
||||
*/
|
||||
#define HWRM_VNIC_CFG_INPUT_FLAGS_ROCE_DUAL_VNIC_MODE UINT32_C(0x8)
|
||||
/*
|
||||
* When this flag is set to '1', the VNIC is requested to be configured
|
||||
* to receive only RoCE traffic. If this flag is set to '0', then this
|
||||
* flag shall be ignored by the HWRM. If roce_dual_vnic_mode flag is set
|
||||
* to '1', then the HWRM client shall not set this flag to '1'.
|
||||
*/
|
||||
#define HWRM_VNIC_CFG_INPUT_FLAGS_ROCE_ONLY_VNIC_MODE UINT32_C(0x10)
|
||||
uint32_t flags;
|
||||
|
||||
/* This bit must be '1' for the dflt_ring_grp field to be configured. */
|
||||
#define HWRM_VNIC_CFG_INPUT_ENABLES_DFLT_RING_GRP UINT32_C(0x1)
|
||||
/* This bit must be '1' for the rss_rule field to be configured. */
|
||||
#define HWRM_VNIC_CFG_INPUT_ENABLES_RSS_RULE UINT32_C(0x2)
|
||||
/* This bit must be '1' for the cos_rule field to be configured. */
|
||||
#define HWRM_VNIC_CFG_INPUT_ENABLES_COS_RULE UINT32_C(0x4)
|
||||
/* This bit must be '1' for the lb_rule field to be configured. */
|
||||
#define HWRM_VNIC_CFG_INPUT_ENABLES_LB_RULE UINT32_C(0x8)
|
||||
/* This bit must be '1' for the mru field to be configured. */
|
||||
#define HWRM_VNIC_CFG_INPUT_ENABLES_MRU UINT32_C(0x10)
|
||||
uint32_t enables;
|
||||
|
||||
/* Logical vnic ID */
|
||||
uint16_t vnic_id;
|
||||
|
||||
/*
|
||||
* Default Completion ring for the VNIC. This ring will be chosen if
|
||||
* packet does not match any RSS rules and if there is no COS rule.
|
||||
*/
|
||||
uint16_t dflt_ring_grp;
|
||||
|
||||
/*
|
||||
* RSS ID for RSS rule/table structure. 0xFF... (All Fs) if there is no
|
||||
* RSS rule.
|
||||
*/
|
||||
uint16_t rss_rule;
|
||||
|
||||
/*
|
||||
* RSS ID for COS rule/table structure. 0xFF... (All Fs) if there is no
|
||||
* COS rule.
|
||||
*/
|
||||
uint16_t cos_rule;
|
||||
|
||||
/*
|
||||
* RSS ID for load balancing rule/table structure. 0xFF... (All Fs) if
|
||||
* there is no LB rule.
|
||||
*/
|
||||
uint16_t lb_rule;
|
||||
|
||||
/*
|
||||
* The maximum receive unit of the vnic. Each vnic is associated with a
|
||||
* function. The vnic mru value overwrites the mru setting of the
|
||||
* associated function. The HWRM shall make sure that vnic mru does not
|
||||
* exceed the mru of the port the function is associated with.
|
||||
*/
|
||||
uint16_t mru;
|
||||
|
||||
uint32_t unused_0;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Output (16 bytes) */
|
||||
struct hwrm_vnic_cfg_output {
|
||||
/*
|
||||
* Pass/Fail or error type Note: receiver to verify the in parameters,
|
||||
* and fail the call with an error when appropriate
|
||||
*/
|
||||
uint16_t error_code;
|
||||
|
||||
/* This field returns the type of original request. */
|
||||
uint16_t req_type;
|
||||
|
||||
/* This field provides original sequence number of the command. */
|
||||
uint16_t seq_id;
|
||||
|
||||
/*
|
||||
* This field is the length of the response in bytes. The last byte of
|
||||
* the response is a valid flag that will read as '1' when the command
|
||||
* has been completely written to memory.
|
||||
*/
|
||||
uint16_t resp_len;
|
||||
|
||||
uint32_t unused_0;
|
||||
uint8_t unused_1;
|
||||
uint8_t unused_2;
|
||||
uint8_t unused_3;
|
||||
|
||||
/*
|
||||
* This field is used in Output records to indicate that the output is
|
||||
* completely written to RAM. This field should be read as '1' to
|
||||
* indicate that the output has been completely written. When writing a
|
||||
* command completion or response to an internal processor, the order of
|
||||
* writes has to be such that this field is written last.
|
||||
*/
|
||||
uint8_t valid;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* hwrm_vnic_free */
|
||||
/*
|
||||
* Description: Free a VNIC resource. Idle any resources associated with the
|
||||
|
Loading…
Reference in New Issue
Block a user