diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_common.c | 34 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 18 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_prototype.h | 2 | 
4 files changed, 48 insertions, 7 deletions
| diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h index 76d872b91a38..cc02a85ad42b 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h @@ -1561,6 +1561,7 @@ I40E_CHECK_CMD_LENGTH(i40e_aq_set_phy_config);  struct i40e_aq_set_mac_config {  	__le16	max_frame_size;  	u8	params; +#define I40E_AQ_SET_MAC_CONFIG_CRC_EN	BIT(2)  	u8	tx_timer_priority; /* bitmap */  	__le16	tx_timer_value;  	__le16	fc_refresh_threshold; diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index 270e7e8cf9cf..59f5c1e810eb 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c @@ -1190,6 +1190,40 @@ int i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,  }  /** + * i40e_aq_set_mac_config - Configure MAC settings + * @hw: pointer to the hw struct + * @max_frame_size: Maximum Frame Size to be supported by the port + * @cmd_details: pointer to command details structure or NULL + * + * Set MAC configuration (0x0603). Note that max_frame_size must be greater + * than zero. + * + * Return: 0 on success, or a negative error code on failure. + */ +int i40e_aq_set_mac_config(struct i40e_hw *hw, u16 max_frame_size, +			   struct i40e_asq_cmd_details *cmd_details) +{ +	struct i40e_aq_set_mac_config *cmd; +	struct libie_aq_desc desc; + +	cmd = libie_aq_raw(&desc); + +	if (max_frame_size == 0) +		return -EINVAL; + +	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_mac_config); + +	cmd->max_frame_size = cpu_to_le16(max_frame_size); +	cmd->params = I40E_AQ_SET_MAC_CONFIG_CRC_EN; + +#define I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD	0x7FFF +	cmd->fc_refresh_threshold = +		cpu_to_le16(I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD); + +	return i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); +} + +/**   * i40e_aq_clear_pxe_mode   * @hw: pointer to the hw struct   * @cmd_details: pointer to command details structure or NULL diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index b83f823e4917..b14019d44b58 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -4156,7 +4156,7 @@ free_queue_irqs:  		irq_num = pf->msix_entries[base + vector].vector;  		irq_set_affinity_notifier(irq_num, NULL);  		irq_update_affinity_hint(irq_num, NULL); -		free_irq(irq_num, &vsi->q_vectors[vector]); +		free_irq(irq_num, vsi->q_vectors[vector]);  	}  	return err;  } @@ -16045,13 +16045,17 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  		dev_dbg(&pf->pdev->dev, "get supported phy types ret =  %pe last_status =  %s\n",  			ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); -	/* make sure the MFS hasn't been set lower than the default */  #define MAX_FRAME_SIZE_DEFAULT 0x2600 -	val = FIELD_GET(I40E_PRTGL_SAH_MFS_MASK, -			rd32(&pf->hw, I40E_PRTGL_SAH)); -	if (val < MAX_FRAME_SIZE_DEFAULT) -		dev_warn(&pdev->dev, "MFS for port %x (%d) has been set below the default (%d)\n", -			 pf->hw.port, val, MAX_FRAME_SIZE_DEFAULT); + +	err = i40e_aq_set_mac_config(hw, MAX_FRAME_SIZE_DEFAULT, NULL); +	if (err) +		dev_warn(&pdev->dev, "set mac config ret = %pe last_status = %s\n", +			 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); + +	/* Make sure the MFS is set to the expected value */ +	val = rd32(hw, I40E_PRTGL_SAH); +	FIELD_MODIFY(I40E_PRTGL_SAH_MFS_MASK, &val, MAX_FRAME_SIZE_DEFAULT); +	wr32(hw, I40E_PRTGL_SAH, val);  	/* Add a filter to drop all Flow control frames from any VSI from being  	 * transmitted. By doing so we stop a malicious VF from sending out diff --git a/drivers/net/ethernet/intel/i40e/i40e_prototype.h b/drivers/net/ethernet/intel/i40e/i40e_prototype.h index aef5de53ce3b..26bb7bffe361 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_prototype.h +++ b/drivers/net/ethernet/intel/i40e/i40e_prototype.h @@ -98,6 +98,8 @@ int i40e_aq_set_mac_loopback(struct i40e_hw *hw,  			     struct i40e_asq_cmd_details *cmd_details);  int i40e_aq_set_phy_int_mask(struct i40e_hw *hw, u16 mask,  			     struct i40e_asq_cmd_details *cmd_details); +int i40e_aq_set_mac_config(struct i40e_hw *hw, u16 max_frame_size, +			   struct i40e_asq_cmd_details *cmd_details);  int i40e_aq_clear_pxe_mode(struct i40e_hw *hw,  			   struct i40e_asq_cmd_details *cmd_details);  int i40e_aq_set_link_restart_an(struct i40e_hw *hw, | 
