Commit a5e7d9bb authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
40GbE Intel Wired LAN Driver Updates 2022-01-07

This series contains updates to i40e and iavf drivers.

Karen limits per VF MAC filters so that one VF does not consume all
filters for i40e.

Jedrzej reduces busy wait time for admin queue calls for i40e.

Mateusz updates firmware versions to reflect new supported NVM images
and renames an error to remove non-inclusive language for i40e.

Yang Li fixes a set but not used warning for i40e.

Jason Wang removes an unneeded variable for iavf.

* '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue:
  iavf: remove an unneeded variable
  i40e: remove variables set but not used
  i40e: Remove non-inclusive language
  i40e: Update FW API version
  i40e: Minimize amount of busy-waiting during AQ send
  i40e: Add ensurance of MacVlan resources for every trusted VF
====================

Link: https://lore.kernel.org/r/20220107175704.438387-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents ffef737f 5322c68e
...@@ -769,21 +769,22 @@ static bool i40e_asq_done(struct i40e_hw *hw) ...@@ -769,21 +769,22 @@ static bool i40e_asq_done(struct i40e_hw *hw)
} }
/** /**
* i40e_asq_send_command - send command to Admin Queue * i40e_asq_send_command_atomic - send command to Admin Queue
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @desc: prefilled descriptor describing the command (non DMA mem) * @desc: prefilled descriptor describing the command (non DMA mem)
* @buff: buffer to use for indirect commands * @buff: buffer to use for indirect commands
* @buff_size: size of buffer for indirect commands * @buff_size: size of buffer for indirect commands
* @cmd_details: pointer to command details structure * @cmd_details: pointer to command details structure
* @is_atomic_context: is the function called in an atomic context?
* *
* This is the main send command driver routine for the Admin Queue send * This is the main send command driver routine for the Admin Queue send
* queue. It runs the queue, cleans the queue, etc * queue. It runs the queue, cleans the queue, etc
**/ **/
i40e_status i40e_asq_send_command(struct i40e_hw *hw, i40e_status
struct i40e_aq_desc *desc, i40e_asq_send_command_atomic(struct i40e_hw *hw, struct i40e_aq_desc *desc,
void *buff, /* can be NULL */ void *buff, /* can be NULL */ u16 buff_size,
u16 buff_size, struct i40e_asq_cmd_details *cmd_details,
struct i40e_asq_cmd_details *cmd_details) bool is_atomic_context)
{ {
i40e_status status = 0; i40e_status status = 0;
struct i40e_dma_mem *dma_buff = NULL; struct i40e_dma_mem *dma_buff = NULL;
...@@ -910,7 +911,12 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw, ...@@ -910,7 +911,12 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
*/ */
if (i40e_asq_done(hw)) if (i40e_asq_done(hw))
break; break;
if (is_atomic_context)
udelay(50); udelay(50);
else
usleep_range(40, 60);
total_delay += 50; total_delay += 50;
} while (total_delay < hw->aq.asq_cmd_timeout); } while (total_delay < hw->aq.asq_cmd_timeout);
} }
...@@ -967,6 +973,15 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw, ...@@ -967,6 +973,15 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
return status; return status;
} }
i40e_status
i40e_asq_send_command(struct i40e_hw *hw, struct i40e_aq_desc *desc,
void *buff, /* can be NULL */ u16 buff_size,
struct i40e_asq_cmd_details *cmd_details)
{
return i40e_asq_send_command_atomic(hw, desc, buff, buff_size,
cmd_details, false);
}
/** /**
* i40e_fill_default_direct_cmd_desc - AQ descriptor helper function * i40e_fill_default_direct_cmd_desc - AQ descriptor helper function
* @desc: pointer to the temp descriptor (non DMA mem) * @desc: pointer to the temp descriptor (non DMA mem)
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
*/ */
#define I40E_FW_API_VERSION_MAJOR 0x0001 #define I40E_FW_API_VERSION_MAJOR 0x0001
#define I40E_FW_API_VERSION_MINOR_X722 0x0009 #define I40E_FW_API_VERSION_MINOR_X722 0x000C
#define I40E_FW_API_VERSION_MINOR_X710 0x0009 #define I40E_FW_API_VERSION_MINOR_X710 0x000F
#define I40E_FW_MINOR_VERSION(_h) ((_h)->mac.type == I40E_MAC_XL710 ? \ #define I40E_FW_MINOR_VERSION(_h) ((_h)->mac.type == I40E_MAC_XL710 ? \
I40E_FW_API_VERSION_MINOR_X710 : \ I40E_FW_API_VERSION_MINOR_X710 : \
......
...@@ -154,8 +154,8 @@ const char *i40e_stat_str(struct i40e_hw *hw, i40e_status stat_err) ...@@ -154,8 +154,8 @@ const char *i40e_stat_str(struct i40e_hw *hw, i40e_status stat_err)
return "I40E_ERR_INVALID_MAC_ADDR"; return "I40E_ERR_INVALID_MAC_ADDR";
case I40E_ERR_DEVICE_NOT_SUPPORTED: case I40E_ERR_DEVICE_NOT_SUPPORTED:
return "I40E_ERR_DEVICE_NOT_SUPPORTED"; return "I40E_ERR_DEVICE_NOT_SUPPORTED";
case I40E_ERR_MASTER_REQUESTS_PENDING: case I40E_ERR_PRIMARY_REQUESTS_PENDING:
return "I40E_ERR_MASTER_REQUESTS_PENDING"; return "I40E_ERR_PRIMARY_REQUESTS_PENDING";
case I40E_ERR_INVALID_LINK_SETTINGS: case I40E_ERR_INVALID_LINK_SETTINGS:
return "I40E_ERR_INVALID_LINK_SETTINGS"; return "I40E_ERR_INVALID_LINK_SETTINGS";
case I40E_ERR_AUTONEG_NOT_COMPLETE: case I40E_ERR_AUTONEG_NOT_COMPLETE:
...@@ -2073,7 +2073,8 @@ enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw, ...@@ -2073,7 +2073,8 @@ enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
cmd->seid = cpu_to_le16(seid); cmd->seid = cpu_to_le16(seid);
cmd->vlan_tag = cpu_to_le16(vid | I40E_AQC_SET_VSI_VLAN_VALID); cmd->vlan_tag = cpu_to_le16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); status = i40e_asq_send_command_atomic(hw, &desc, NULL, 0,
cmd_details, true);
return status; return status;
} }
...@@ -2114,7 +2115,8 @@ enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw, ...@@ -2114,7 +2115,8 @@ enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
cmd->seid = cpu_to_le16(seid); cmd->seid = cpu_to_le16(seid);
cmd->vlan_tag = cpu_to_le16(vid | I40E_AQC_SET_VSI_VLAN_VALID); cmd->vlan_tag = cpu_to_le16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); status = i40e_asq_send_command_atomic(hw, &desc, NULL, 0,
cmd_details, true);
return status; return status;
} }
...@@ -4136,7 +4138,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw, ...@@ -4136,7 +4138,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw,
struct i40e_filter_control_settings *settings) struct i40e_filter_control_settings *settings)
{ {
u32 fcoe_cntx_size, fcoe_filt_size; u32 fcoe_cntx_size, fcoe_filt_size;
u32 pe_cntx_size, pe_filt_size;
u32 fcoe_fmax; u32 fcoe_fmax;
u32 val; u32 val;
...@@ -4180,8 +4181,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw, ...@@ -4180,8 +4181,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw,
case I40E_HASH_FILTER_SIZE_256K: case I40E_HASH_FILTER_SIZE_256K:
case I40E_HASH_FILTER_SIZE_512K: case I40E_HASH_FILTER_SIZE_512K:
case I40E_HASH_FILTER_SIZE_1M: case I40E_HASH_FILTER_SIZE_1M:
pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
pe_filt_size <<= (u32)settings->pe_filt_num;
break; break;
default: default:
return I40E_ERR_PARAM; return I40E_ERR_PARAM;
...@@ -4198,8 +4197,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw, ...@@ -4198,8 +4197,6 @@ static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw,
case I40E_DMA_CNTX_SIZE_64K: case I40E_DMA_CNTX_SIZE_64K:
case I40E_DMA_CNTX_SIZE_128K: case I40E_DMA_CNTX_SIZE_128K:
case I40E_DMA_CNTX_SIZE_256K: case I40E_DMA_CNTX_SIZE_256K:
pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
pe_cntx_size <<= (u32)settings->pe_cntx_num;
break; break;
default: default:
return I40E_ERR_PARAM; return I40E_ERR_PARAM;
......
...@@ -22,11 +22,15 @@ void i40e_adminq_init_ring_data(struct i40e_hw *hw); ...@@ -22,11 +22,15 @@ void i40e_adminq_init_ring_data(struct i40e_hw *hw);
i40e_status i40e_clean_arq_element(struct i40e_hw *hw, i40e_status i40e_clean_arq_element(struct i40e_hw *hw,
struct i40e_arq_event_info *e, struct i40e_arq_event_info *e,
u16 *events_pending); u16 *events_pending);
i40e_status i40e_asq_send_command(struct i40e_hw *hw, i40e_status
struct i40e_aq_desc *desc, i40e_asq_send_command(struct i40e_hw *hw, struct i40e_aq_desc *desc,
void *buff, /* can be NULL */ void *buff, /* can be NULL */ u16 buff_size,
u16 buff_size,
struct i40e_asq_cmd_details *cmd_details); struct i40e_asq_cmd_details *cmd_details);
i40e_status
i40e_asq_send_command_atomic(struct i40e_hw *hw, struct i40e_aq_desc *desc,
void *buff, /* can be NULL */ u16 buff_size,
struct i40e_asq_cmd_details *cmd_details,
bool is_atomic_context);
/* debug function for adminq */ /* debug function for adminq */
void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask,
......
...@@ -18,7 +18,7 @@ enum i40e_status_code { ...@@ -18,7 +18,7 @@ enum i40e_status_code {
I40E_ERR_ADAPTER_STOPPED = -9, I40E_ERR_ADAPTER_STOPPED = -9,
I40E_ERR_INVALID_MAC_ADDR = -10, I40E_ERR_INVALID_MAC_ADDR = -10,
I40E_ERR_DEVICE_NOT_SUPPORTED = -11, I40E_ERR_DEVICE_NOT_SUPPORTED = -11,
I40E_ERR_MASTER_REQUESTS_PENDING = -12, I40E_ERR_PRIMARY_REQUESTS_PENDING = -12,
I40E_ERR_INVALID_LINK_SETTINGS = -13, I40E_ERR_INVALID_LINK_SETTINGS = -13,
I40E_ERR_AUTONEG_NOT_COMPLETE = -14, I40E_ERR_AUTONEG_NOT_COMPLETE = -14,
I40E_ERR_RESET_FAILED = -15, I40E_ERR_RESET_FAILED = -15,
......
...@@ -2704,12 +2704,21 @@ static int i40e_vc_get_stats_msg(struct i40e_vf *vf, u8 *msg) ...@@ -2704,12 +2704,21 @@ static int i40e_vc_get_stats_msg(struct i40e_vf *vf, u8 *msg)
(u8 *)&stats, sizeof(stats)); (u8 *)&stats, sizeof(stats));
} }
#define I40E_MAX_MACVLAN_PER_HW 3072
#define I40E_MAX_MACVLAN_PER_PF(num_ports) (I40E_MAX_MACVLAN_PER_HW / \
(num_ports))
/* If the VF is not trusted restrict the number of MAC/VLAN it can program /* If the VF is not trusted restrict the number of MAC/VLAN it can program
* MAC filters: 16 for multicast, 1 for MAC, 1 for broadcast * MAC filters: 16 for multicast, 1 for MAC, 1 for broadcast
*/ */
#define I40E_VC_MAX_MAC_ADDR_PER_VF (16 + 1 + 1) #define I40E_VC_MAX_MAC_ADDR_PER_VF (16 + 1 + 1)
#define I40E_VC_MAX_VLAN_PER_VF 16 #define I40E_VC_MAX_VLAN_PER_VF 16
#define I40E_VC_MAX_MACVLAN_PER_TRUSTED_VF(vf_num, num_ports) \
({ typeof(vf_num) vf_num_ = (vf_num); \
typeof(num_ports) num_ports_ = (num_ports); \
((I40E_MAX_MACVLAN_PER_PF(num_ports_) - vf_num_ * \
I40E_VC_MAX_MAC_ADDR_PER_VF) / vf_num_) + \
I40E_VC_MAX_MAC_ADDR_PER_VF; })
/** /**
* i40e_check_vf_permission * i40e_check_vf_permission
* @vf: pointer to the VF info * @vf: pointer to the VF info
...@@ -2734,6 +2743,7 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf, ...@@ -2734,6 +2743,7 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
{ {
struct i40e_pf *pf = vf->pf; struct i40e_pf *pf = vf->pf;
struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx]; struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];
struct i40e_hw *hw = &pf->hw;
int mac2add_cnt = 0; int mac2add_cnt = 0;
int i; int i;
...@@ -2775,13 +2785,27 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf, ...@@ -2775,13 +2785,27 @@ static inline int i40e_check_vf_permission(struct i40e_vf *vf,
* number of addresses. Check to make sure that the additions do not * number of addresses. Check to make sure that the additions do not
* push us over the limit. * push us over the limit.
*/ */
if (!test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps) && if (!test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps)) {
(i40e_count_filters(vsi) + mac2add_cnt) > if ((i40e_count_filters(vsi) + mac2add_cnt) >
I40E_VC_MAX_MAC_ADDR_PER_VF) { I40E_VC_MAX_MAC_ADDR_PER_VF) {
dev_err(&pf->pdev->dev, dev_err(&pf->pdev->dev,
"Cannot add more MAC addresses, VF is not trusted, switch the VF to trusted to add more functionality\n"); "Cannot add more MAC addresses, VF is not trusted, switch the VF to trusted to add more functionality\n");
return -EPERM; return -EPERM;
} }
/* If this VF is trusted, it can use more resources than untrusted.
* However to ensure that every trusted VF has appropriate number of
* resources, divide whole pool of resources per port and then across
* all VFs.
*/
} else {
if ((i40e_count_filters(vsi) + mac2add_cnt) >
I40E_VC_MAX_MACVLAN_PER_TRUSTED_VF(pf->num_alloc_vfs,
hw->num_ports)) {
dev_err(&pf->pdev->dev,
"Cannot add more MAC addresses, trusted VF exhausted it's resources\n");
return -EPERM;
}
}
return 0; return 0;
} }
......
...@@ -551,15 +551,13 @@ enum iavf_status iavf_init_adminq(struct iavf_hw *hw) ...@@ -551,15 +551,13 @@ enum iavf_status iavf_init_adminq(struct iavf_hw *hw)
**/ **/
enum iavf_status iavf_shutdown_adminq(struct iavf_hw *hw) enum iavf_status iavf_shutdown_adminq(struct iavf_hw *hw)
{ {
enum iavf_status ret_code = 0;
if (iavf_check_asq_alive(hw)) if (iavf_check_asq_alive(hw))
iavf_aq_queue_shutdown(hw, true); iavf_aq_queue_shutdown(hw, true);
iavf_shutdown_asq(hw); iavf_shutdown_asq(hw);
iavf_shutdown_arq(hw); iavf_shutdown_arq(hw);
return ret_code; return 0;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment