From: Qi Zhang <qi.z.zhang@intel.com> To: qiming.yang@intel.com Cc: dev@dpdk.org, Qi Zhang <qi.z.zhang@intel.com>, Jacob Keller <jacob.e.keller@intel.com>, Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com> Subject: [dpdk-dev] [PATCH 5/8] net/ice/base: add capability list AQ function Date: Sat, 27 Jun 2020 23:06:12 +0800 Message-ID: <20200627150615.2233-6-qi.z.zhang@intel.com> (raw) In-Reply-To: <20200627150615.2233-1-qi.z.zhang@intel.com> The current implementation for reading device and function capabilities from firmware, ice_aq_discover_caps, has potentially undesirable side effects. ice_aq_discover_caps calls ice_parse_caps, resulting in overwriting the capabilities stored in the hw structure. This is ok during initialization, but means that code which wants to read the capabilities after initialization cannot use ice_aq_discover_caps without being careful of the side effects. Factor out the AQ command logic into a new ice_aq_list_caps function. This will be used by the ice_aq_discover_caps function. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com> --- drivers/net/ice/base/ice_common.c | 62 +++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/drivers/net/ice/base/ice_common.c b/drivers/net/ice/base/ice_common.c index cab81e0fc..33e29bc0e 100644 --- a/drivers/net/ice/base/ice_common.c +++ b/drivers/net/ice/base/ice_common.c @@ -2007,20 +2007,27 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count, } /** - * ice_aq_discover_caps - query function/device capabilities + * ice_aq_list_caps - query function/device capabilities * @hw: pointer to the HW struct - * @buf: a virtual buffer to hold the capabilities - * @buf_size: Size of the virtual buffer - * @cap_count: cap count needed if AQ err==ENOMEM - * @opc: capabilities type to discover - pass in the command opcode + * @buf: a buffer to hold the capabilities + * @buf_size: size of the buffer + * @cap_count: if not NULL, set to the number of capabilities reported + * @opc: capabilities type to discover, device or function * @cd: pointer to command details structure or NULL * - * Get the function(0x000a)/device(0x000b) capabilities description from - * the firmware. + * Get the function (0x000A) or device (0x000B) capabilities description from + * firmware and store it in the buffer. + * + * If the cap_count pointer is not NULL, then it is set to the number of + * capabilities firmware will report. Note that if the buffer size is too + * small, it is possible the command will return ICE_AQ_ERR_ENOMEM. The + * cap_count will still be updated in this case. It is recommended that the + * buffer size be set to ICE_AQ_MAX_BUF_LEN (the largest possible buffer that + * firmware could return) to avoid this. */ static enum ice_status -ice_aq_discover_caps(struct ice_hw *hw, void *buf, u16 buf_size, u32 *cap_count, - enum ice_adminq_opc opc, struct ice_sq_cd *cd) +ice_aq_list_caps(struct ice_hw *hw, void *buf, u16 buf_size, u32 *cap_count, + enum ice_adminq_opc opc, struct ice_sq_cd *cd) { struct ice_aqc_list_caps *cmd; struct ice_aq_desc desc; @@ -2033,12 +2040,43 @@ ice_aq_discover_caps(struct ice_hw *hw, void *buf, u16 buf_size, u32 *cap_count, return ICE_ERR_PARAM; ice_fill_dflt_direct_cmd_desc(&desc, opc); - status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + + if (cap_count) + *cap_count = LE32_TO_CPU(cmd->count); + + return status; +} + +/** + * ice_aq_discover_caps - query function/device capabilities + * @hw: pointer to the HW struct + * @buf: a virtual buffer to hold the capabilities + * @buf_size: Size of the virtual buffer + * @cap_count: cap count needed if AQ err==ENOMEM + * @opc: capabilities type to discover - pass in the command opcode + * @cd: pointer to command details structure or NULL + * + * Get the function(0x000a)/device(0x000b) capabilities description from + * the firmware. + * + * NOTE: this function has the side effect of updating the hw->dev_caps or + * hw->func_caps by way of calling ice_parse_caps. + */ +static enum ice_status +ice_aq_discover_caps(struct ice_hw *hw, void *buf, u16 buf_size, u32 *cap_count, + enum ice_adminq_opc opc, struct ice_sq_cd *cd) +{ + u32 local_cap_count = 0; + enum ice_status status; + + status = ice_aq_list_caps(hw, buf, buf_size, &local_cap_count, + opc, cd); if (!status) - ice_parse_caps(hw, buf, LE32_TO_CPU(cmd->count), opc); + ice_parse_caps(hw, buf, local_cap_count, opc); else if (hw->adminq.sq_last_status == ICE_AQ_RC_ENOMEM) - *cap_count = LE32_TO_CPU(cmd->count); + *cap_count = local_cap_count; + return status; } -- 2.13.6
next prev parent reply other threads:[~2020-06-27 15:03 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-06-27 15:06 [dpdk-dev] [PATCH 0/8] update base code batch 3 Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 1/8] net/ice/base: fix GTP-U inner RSS IPv4 IPv6 co-exist Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 2/8] net/ice/base: cleanup some code style Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 3/8] net/ice/base: move lldp function to common module Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 4/8] net/ice/base: code clean in FDIR module Qi Zhang 2020-06-29 2:46 ` Yang, Qiming 2020-06-27 15:06 ` Qi Zhang [this message] 2020-06-27 15:06 ` [dpdk-dev] [PATCH 6/8] net/ice/base: split capability parse into separate functions Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 7/8] net/ice/base: clear and free XLT entries on reset Qi Zhang 2020-06-27 15:06 ` [dpdk-dev] [PATCH 8/8] net/ice/base: update version Qi Zhang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200627150615.2233-6-qi.z.zhang@intel.com \ --to=qi.z.zhang@intel.com \ --cc=dev@dpdk.org \ --cc=jacob.e.keller@intel.com \ --cc=paul.m.stillwell.jr@intel.com \ --cc=qiming.yang@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
DPDK patches and discussions This inbox may be cloned and mirrored by anyone: git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \ dev@dpdk.org public-inbox-index dev Example config snippet for mirrors. Newsgroup available over NNTP: nntp://inbox.dpdk.org/inbox.dpdk.dev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git