提交 1a1f4a28 编写于 作者: D David S. Miller

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

Jeff Kirsher says:

====================
40GbE Intel Wired LAN Driver Updates 2018-04-30

This series contains updates to i40e and i40evf only.

Jia-Ju Bai replaces an instance of GFP_ATOMIC to GFP_KERNEL, since
i40evf is not in atomic context when i40evf_add_vlan() is called.

Jake cleans up function header comments to ensure that the function
parameter comments actually match the function parameters.  Fixed a
possible overflow error in the PTP clock code.  Fixed warnings regarding
restricted __be32 type usage.

Mariusz fixes the reading of the LLDP configuration, which moves from
using relative values to calculating the absolute address.

Jakub adds a check for 10G LR mode for i40e.

Paweł fixes an issue, where changing the MTU would turn on TSO, GSO and
GRO.

Alex fixes a couple of issues with the UDP tunnel filter configuration.
First being that the tunnels did not have mutual exclusion in place to
prevent a race condition between a user request to add/remove a port and
an update.  The second issue was we were deleting filters that were not
associated with the actual filter we wanted to delete.

Harshitha ensures that the queue map sent by the VF is taken into
account when enabling/disabling queues in the VF VSI.
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -310,10 +310,12 @@ struct i40e_tc_configuration { ...@@ -310,10 +310,12 @@ struct i40e_tc_configuration {
struct i40e_tc_info tc_info[I40E_MAX_TRAFFIC_CLASS]; struct i40e_tc_info tc_info[I40E_MAX_TRAFFIC_CLASS];
}; };
#define I40E_UDP_PORT_INDEX_UNUSED 255
struct i40e_udp_port_config { struct i40e_udp_port_config {
/* AdminQ command interface expects port number in Host byte order */ /* AdminQ command interface expects port number in Host byte order */
u16 port; u16 port;
u8 type; u8 type;
u8 filter_index;
}; };
/* macros related to FLX_PIT */ /* macros related to FLX_PIT */
...@@ -584,7 +586,7 @@ struct i40e_pf { ...@@ -584,7 +586,7 @@ struct i40e_pf {
unsigned long ptp_tx_start; unsigned long ptp_tx_start;
struct hwtstamp_config tstamp_config; struct hwtstamp_config tstamp_config;
struct mutex tmreg_lock; /* Used to protect the SYSTIME registers. */ struct mutex tmreg_lock; /* Used to protect the SYSTIME registers. */
u64 ptp_base_adj; u32 ptp_adj_mult;
u32 tx_hwtstamp_timeouts; u32 tx_hwtstamp_timeouts;
u32 tx_hwtstamp_skipped; u32 tx_hwtstamp_skipped;
u32 rx_hwtstamp_cleared; u32 rx_hwtstamp_cleared;
...@@ -985,6 +987,9 @@ void i40e_service_event_schedule(struct i40e_pf *pf); ...@@ -985,6 +987,9 @@ void i40e_service_event_schedule(struct i40e_pf *pf);
void i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id, void i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id,
u8 *msg, u16 len); u8 *msg, u16 len);
int i40e_control_wait_tx_q(int seid, struct i40e_pf *pf, int pf_q, bool is_xdp,
bool enable);
int i40e_control_wait_rx_q(struct i40e_pf *pf, int pf_q, bool enable);
int i40e_vsi_start_rings(struct i40e_vsi *vsi); int i40e_vsi_start_rings(struct i40e_vsi *vsi);
void i40e_vsi_stop_rings(struct i40e_vsi *vsi); void i40e_vsi_stop_rings(struct i40e_vsi *vsi);
void i40e_vsi_stop_rings_no_wait(struct i40e_vsi *vsi); void i40e_vsi_stop_rings_no_wait(struct i40e_vsi *vsi);
......
...@@ -40,7 +40,7 @@ static struct i40e_ops i40e_lan_ops = { ...@@ -40,7 +40,7 @@ static struct i40e_ops i40e_lan_ops = {
/** /**
* i40e_client_get_params - Get the params that can change at runtime * i40e_client_get_params - Get the params that can change at runtime
* @vsi: the VSI with the message * @vsi: the VSI with the message
* @param: clinet param struct * @params: client param struct
* *
**/ **/
static static
...@@ -566,7 +566,7 @@ static int i40e_client_virtchnl_send(struct i40e_info *ldev, ...@@ -566,7 +566,7 @@ static int i40e_client_virtchnl_send(struct i40e_info *ldev,
* i40e_client_setup_qvlist * i40e_client_setup_qvlist
* @ldev: pointer to L2 context. * @ldev: pointer to L2 context.
* @client: Client pointer. * @client: Client pointer.
* @qv_info: queue and vector list * @qvlist_info: queue and vector list
* *
* Return 0 on success or < 0 on error * Return 0 on success or < 0 on error
**/ **/
...@@ -641,7 +641,7 @@ static int i40e_client_setup_qvlist(struct i40e_info *ldev, ...@@ -641,7 +641,7 @@ static int i40e_client_setup_qvlist(struct i40e_info *ldev,
* i40e_client_request_reset * i40e_client_request_reset
* @ldev: pointer to L2 context. * @ldev: pointer to L2 context.
* @client: Client pointer. * @client: Client pointer.
* @level: reset level * @reset_level: reset level
**/ **/
static void i40e_client_request_reset(struct i40e_info *ldev, static void i40e_client_request_reset(struct i40e_info *ldev,
struct i40e_client *client, struct i40e_client *client,
......
...@@ -1671,6 +1671,8 @@ enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw, ...@@ -1671,6 +1671,8 @@ enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
/** /**
* i40e_set_fc * i40e_set_fc
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @aq_failures: buffer to return AdminQ failure information
* @atomic_restart: whether to enable atomic link restart
* *
* Set the requested flow control mode using set_phy_config. * Set the requested flow control mode using set_phy_config.
**/ **/
...@@ -2807,8 +2809,8 @@ i40e_status i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid, ...@@ -2807,8 +2809,8 @@ i40e_status i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
* @mr_list: list of mirrored VSI SEIDs or VLAN IDs * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
* @rule_id: Rule ID returned from FW * @rule_id: Rule ID returned from FW
* @rule_used: Number of rules used in internal switch * @rules_used: Number of rules used in internal switch
* @rule_free: Number of rules free in internal switch * @rules_free: Number of rules free in internal switch
* *
* Add/Delete a mirror rule to a specific switch. Mirror rules are supported for * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
* VEBs/VEPA elements only * VEBs/VEPA elements only
...@@ -2868,8 +2870,8 @@ static i40e_status i40e_mirrorrule_op(struct i40e_hw *hw, ...@@ -2868,8 +2870,8 @@ static i40e_status i40e_mirrorrule_op(struct i40e_hw *hw,
* @mr_list: list of mirrored VSI SEIDs or VLAN IDs * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
* @rule_id: Rule ID returned from FW * @rule_id: Rule ID returned from FW
* @rule_used: Number of rules used in internal switch * @rules_used: Number of rules used in internal switch
* @rule_free: Number of rules free in internal switch * @rules_free: Number of rules free in internal switch
* *
* Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
**/ **/
...@@ -2899,8 +2901,8 @@ i40e_status i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid, ...@@ -2899,8 +2901,8 @@ i40e_status i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
* add_mirrorrule. * add_mirrorrule.
* @mr_list: list of mirrored VLAN IDs to be removed * @mr_list: list of mirrored VLAN IDs to be removed
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
* @rule_used: Number of rules used in internal switch * @rules_used: Number of rules used in internal switch
* @rule_free: Number of rules free in internal switch * @rules_free: Number of rules free in internal switch
* *
* Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
**/ **/
...@@ -3648,6 +3650,8 @@ i40e_status i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent, ...@@ -3648,6 +3650,8 @@ i40e_status i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
/** /**
* i40e_aq_start_lldp * i40e_aq_start_lldp
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @buff: buffer for result
* @buff_size: buffer size
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
* *
* Start the embedded LLDP Agent on all ports. * Start the embedded LLDP Agent on all ports.
...@@ -3728,7 +3732,6 @@ i40e_status i40e_aq_get_cee_dcb_config(struct i40e_hw *hw, ...@@ -3728,7 +3732,6 @@ i40e_status i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
* i40e_aq_add_udp_tunnel * i40e_aq_add_udp_tunnel
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @udp_port: the UDP port to add in Host byte order * @udp_port: the UDP port to add in Host byte order
* @header_len: length of the tunneling header length in DWords
* @protocol_index: protocol index type * @protocol_index: protocol index type
* @filter_index: pointer to filter index * @filter_index: pointer to filter index
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
...@@ -3947,6 +3950,7 @@ i40e_status i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw, ...@@ -3947,6 +3950,7 @@ i40e_status i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @seid: seid of the switching component connected to Physical Port * @seid: seid of the switching component connected to Physical Port
* @ets_data: Buffer holding ETS parameters * @ets_data: Buffer holding ETS parameters
* @opcode: Tx scheduler AQ command opcode
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
**/ **/
i40e_status i40e_aq_config_switch_comp_ets(struct i40e_hw *hw, i40e_status i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
...@@ -4290,10 +4294,10 @@ i40e_status i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw, ...@@ -4290,10 +4294,10 @@ i40e_status i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @seid: VSI seid to add ethertype filter from * @seid: VSI seid to add ethertype filter from
**/ **/
#define I40E_FLOW_CONTROL_ETHTYPE 0x8808
void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw, void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
u16 seid) u16 seid)
{ {
#define I40E_FLOW_CONTROL_ETHTYPE 0x8808
u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC | u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP | I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX; I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
...@@ -4424,6 +4428,7 @@ void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status) ...@@ -4424,6 +4428,7 @@ void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
* @ret_buff_size: actual buffer size returned * @ret_buff_size: actual buffer size returned
* @ret_next_table: next block to read * @ret_next_table: next block to read
* @ret_next_index: next index to read * @ret_next_index: next index to read
* @cmd_details: pointer to command details structure or NULL
* *
* Dump internal FW/HW data for debug purposes. * Dump internal FW/HW data for debug purposes.
* *
...@@ -4550,7 +4555,7 @@ i40e_status i40e_aq_configure_partition_bw(struct i40e_hw *hw, ...@@ -4550,7 +4555,7 @@ i40e_status i40e_aq_configure_partition_bw(struct i40e_hw *hw,
* i40e_read_phy_register_clause22 * i40e_read_phy_register_clause22
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Reads specified PHY register value * Reads specified PHY register value
...@@ -4595,7 +4600,7 @@ i40e_status i40e_read_phy_register_clause22(struct i40e_hw *hw, ...@@ -4595,7 +4600,7 @@ i40e_status i40e_read_phy_register_clause22(struct i40e_hw *hw,
* i40e_write_phy_register_clause22 * i40e_write_phy_register_clause22
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Writes specified PHY register value * Writes specified PHY register value
...@@ -4636,7 +4641,7 @@ i40e_status i40e_write_phy_register_clause22(struct i40e_hw *hw, ...@@ -4636,7 +4641,7 @@ i40e_status i40e_write_phy_register_clause22(struct i40e_hw *hw,
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @page: registers page number * @page: registers page number
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Reads specified PHY register value * Reads specified PHY register value
...@@ -4710,7 +4715,7 @@ i40e_status i40e_read_phy_register_clause45(struct i40e_hw *hw, ...@@ -4710,7 +4715,7 @@ i40e_status i40e_read_phy_register_clause45(struct i40e_hw *hw,
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @page: registers page number * @page: registers page number
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Writes value to specified PHY register * Writes value to specified PHY register
...@@ -4777,7 +4782,7 @@ i40e_status i40e_write_phy_register_clause45(struct i40e_hw *hw, ...@@ -4777,7 +4782,7 @@ i40e_status i40e_write_phy_register_clause45(struct i40e_hw *hw,
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @page: registers page number * @page: registers page number
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Writes value to specified PHY register * Writes value to specified PHY register
...@@ -4813,7 +4818,7 @@ i40e_status i40e_write_phy_register(struct i40e_hw *hw, ...@@ -4813,7 +4818,7 @@ i40e_status i40e_write_phy_register(struct i40e_hw *hw,
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @page: registers page number * @page: registers page number
* @reg: register address in the page * @reg: register address in the page
* @phy_adr: PHY address on MDIO interface * @phy_addr: PHY address on MDIO interface
* @value: PHY register value * @value: PHY register value
* *
* Reads specified PHY register value * Reads specified PHY register value
...@@ -4848,7 +4853,6 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw, ...@@ -4848,7 +4853,6 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
* i40e_get_phy_address * i40e_get_phy_address
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @dev_num: PHY port num that address we want * @dev_num: PHY port num that address we want
* @phy_addr: Returned PHY address
* *
* Gets PHY address for current port * Gets PHY address for current port
**/ **/
...@@ -5058,7 +5062,9 @@ i40e_status i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr, ...@@ -5058,7 +5062,9 @@ i40e_status i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
* i40e_led_set_phy * i40e_led_set_phy
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
* @on: true or false * @on: true or false
* @led_addr: address of led register to use
* @mode: original val plus bit for set or ignore * @mode: original val plus bit for set or ignore
*
* Set led's on or off when controlled by the PHY * Set led's on or off when controlled by the PHY
* *
**/ **/
...@@ -5347,6 +5353,7 @@ i40e_status_code i40e_aq_write_ddp(struct i40e_hw *hw, void *buff, ...@@ -5347,6 +5353,7 @@ i40e_status_code i40e_aq_write_ddp(struct i40e_hw *hw, void *buff,
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @buff: command buffer (size in bytes = buff_size) * @buff: command buffer (size in bytes = buff_size)
* @buff_size: buffer size in bytes * @buff_size: buffer size in bytes
* @flags: AdminQ command flags
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
**/ **/
enum enum
......
...@@ -920,6 +920,70 @@ i40e_status i40e_init_dcb(struct i40e_hw *hw) ...@@ -920,6 +920,70 @@ i40e_status i40e_init_dcb(struct i40e_hw *hw)
return ret; return ret;
} }
/**
* _i40e_read_lldp_cfg - generic read of LLDP Configuration data from NVM
* @hw: pointer to the HW structure
* @lldp_cfg: pointer to hold lldp configuration variables
* @module: address of the module pointer
* @word_offset: offset of LLDP configuration
*
* Reads the LLDP configuration data from NVM using passed addresses
**/
static i40e_status _i40e_read_lldp_cfg(struct i40e_hw *hw,
struct i40e_lldp_variables *lldp_cfg,
u8 module, u32 word_offset)
{
u32 address, offset = (2 * word_offset);
i40e_status ret;
__le16 raw_mem;
u16 mem;
ret = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
if (ret)
return ret;
ret = i40e_aq_read_nvm(hw, 0x0, module * 2, sizeof(raw_mem), &raw_mem,
true, NULL);
i40e_release_nvm(hw);
if (ret)
return ret;
mem = le16_to_cpu(raw_mem);
/* Check if this pointer needs to be read in word size or 4K sector
* units.
*/
if (mem & I40E_PTR_TYPE)
address = (0x7FFF & mem) * 4096;
else
address = (0x7FFF & mem) * 2;
ret = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
if (ret)
goto err_lldp_cfg;
ret = i40e_aq_read_nvm(hw, module, offset, sizeof(raw_mem), &raw_mem,
true, NULL);
i40e_release_nvm(hw);
if (ret)
return ret;
mem = le16_to_cpu(raw_mem);
offset = mem + word_offset;
offset *= 2;
ret = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
if (ret)
goto err_lldp_cfg;
ret = i40e_aq_read_nvm(hw, 0, address + offset,
sizeof(struct i40e_lldp_variables), lldp_cfg,
true, NULL);
i40e_release_nvm(hw);
err_lldp_cfg:
return ret;
}
/** /**
* i40e_read_lldp_cfg - read LLDP Configuration data from NVM * i40e_read_lldp_cfg - read LLDP Configuration data from NVM
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
...@@ -931,21 +995,34 @@ i40e_status i40e_read_lldp_cfg(struct i40e_hw *hw, ...@@ -931,21 +995,34 @@ i40e_status i40e_read_lldp_cfg(struct i40e_hw *hw,
struct i40e_lldp_variables *lldp_cfg) struct i40e_lldp_variables *lldp_cfg)
{ {
i40e_status ret = 0; i40e_status ret = 0;
u32 offset = (2 * I40E_NVM_LLDP_CFG_PTR); u32 mem;
if (!lldp_cfg) if (!lldp_cfg)
return I40E_ERR_PARAM; return I40E_ERR_PARAM;
ret = i40e_acquire_nvm(hw, I40E_RESOURCE_READ); ret = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
if (ret) if (ret)
goto err_lldp_cfg; return ret;
ret = i40e_aq_read_nvm(hw, I40E_SR_EMP_MODULE_PTR, offset, ret = i40e_aq_read_nvm(hw, I40E_SR_NVM_CONTROL_WORD, 0, sizeof(mem),
sizeof(struct i40e_lldp_variables), &mem, true, NULL);
(u8 *)lldp_cfg,
true, NULL);
i40e_release_nvm(hw); i40e_release_nvm(hw);
if (ret)
return ret;
/* Read a bit that holds information whether we are running flat or
* structured NVM image. Flat image has LLDP configuration in shadow
* ram, so there is a need to pass different addresses for both cases.
*/
if (mem & I40E_SR_NVM_MAP_STRUCTURE_TYPE) {
/* Flat NVM case */
ret = _i40e_read_lldp_cfg(hw, lldp_cfg, I40E_SR_EMP_MODULE_PTR,
I40E_SR_LLDP_CFG_PTR);
} else {
/* Good old structured NVM image */
ret = _i40e_read_lldp_cfg(hw, lldp_cfg, I40E_EMP_MODULE_PTR,
I40E_NVM_LLDP_CFG_PTR);
}
err_lldp_cfg:
return ret; return ret;
} }
...@@ -23,7 +23,7 @@ static void i40e_get_pfc_delay(struct i40e_hw *hw, u16 *delay) ...@@ -23,7 +23,7 @@ static void i40e_get_pfc_delay(struct i40e_hw *hw, u16 *delay)
/** /**
* i40e_dcbnl_ieee_getets - retrieve local IEEE ETS configuration * i40e_dcbnl_ieee_getets - retrieve local IEEE ETS configuration
* @netdev: the corresponding netdev * @dev: the corresponding netdev
* @ets: structure to hold the ETS information * @ets: structure to hold the ETS information
* *
* Returns local IEEE ETS configuration * Returns local IEEE ETS configuration
...@@ -62,8 +62,8 @@ static int i40e_dcbnl_ieee_getets(struct net_device *dev, ...@@ -62,8 +62,8 @@ static int i40e_dcbnl_ieee_getets(struct net_device *dev,
/** /**
* i40e_dcbnl_ieee_getpfc - retrieve local IEEE PFC configuration * i40e_dcbnl_ieee_getpfc - retrieve local IEEE PFC configuration
* @netdev: the corresponding netdev * @dev: the corresponding netdev
* @ets: structure to hold the PFC information * @pfc: structure to hold the PFC information
* *
* Returns local IEEE PFC configuration * Returns local IEEE PFC configuration
**/ **/
...@@ -95,7 +95,7 @@ static int i40e_dcbnl_ieee_getpfc(struct net_device *dev, ...@@ -95,7 +95,7 @@ static int i40e_dcbnl_ieee_getpfc(struct net_device *dev,
/** /**
* i40e_dcbnl_getdcbx - retrieve current DCBx capability * i40e_dcbnl_getdcbx - retrieve current DCBx capability
* @netdev: the corresponding netdev * @dev: the corresponding netdev
* *
* Returns DCBx capability features * Returns DCBx capability features
**/ **/
...@@ -108,7 +108,8 @@ static u8 i40e_dcbnl_getdcbx(struct net_device *dev) ...@@ -108,7 +108,8 @@ static u8 i40e_dcbnl_getdcbx(struct net_device *dev)
/** /**
* i40e_dcbnl_get_perm_hw_addr - MAC address used by DCBx * i40e_dcbnl_get_perm_hw_addr - MAC address used by DCBx
* @netdev: the corresponding netdev * @dev: the corresponding netdev
* @perm_addr: buffer to store the MAC address
* *
* Returns the SAN MAC address used for LLDP exchange * Returns the SAN MAC address used for LLDP exchange
**/ **/
......
...@@ -12,8 +12,8 @@ static struct dentry *i40e_dbg_root; ...@@ -12,8 +12,8 @@ static struct dentry *i40e_dbg_root;
/** /**
* i40e_dbg_find_vsi - searches for the vsi with the given seid * i40e_dbg_find_vsi - searches for the vsi with the given seid
* @pf - the PF structure to search for the vsi * @pf: the PF structure to search for the vsi
* @seid - seid of the vsi it is searching for * @seid: seid of the vsi it is searching for
**/ **/
static struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid) static struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid)
{ {
...@@ -31,8 +31,8 @@ static struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid) ...@@ -31,8 +31,8 @@ static struct i40e_vsi *i40e_dbg_find_vsi(struct i40e_pf *pf, int seid)
/** /**
* i40e_dbg_find_veb - searches for the veb with the given seid * i40e_dbg_find_veb - searches for the veb with the given seid
* @pf - the PF structure to search for the veb * @pf: the PF structure to search for the veb
* @seid - seid of the veb it is searching for * @seid: seid of the veb it is searching for
**/ **/
static struct i40e_veb *i40e_dbg_find_veb(struct i40e_pf *pf, int seid) static struct i40e_veb *i40e_dbg_find_veb(struct i40e_pf *pf, int seid)
{ {
......
...@@ -953,7 +953,9 @@ static int i40e_set_link_ksettings(struct net_device *netdev, ...@@ -953,7 +953,9 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
ethtool_link_ksettings_test_link_mode(ks, advertising, ethtool_link_ksettings_test_link_mode(ks, advertising,
10000baseCR_Full) || 10000baseCR_Full) ||
ethtool_link_ksettings_test_link_mode(ks, advertising, ethtool_link_ksettings_test_link_mode(ks, advertising,
10000baseSR_Full)) 10000baseSR_Full) ||
ethtool_link_ksettings_test_link_mode(ks, advertising,
10000baseLR_Full))
config.link_speed |= I40E_LINK_SPEED_10GB; config.link_speed |= I40E_LINK_SPEED_10GB;
if (ethtool_link_ksettings_test_link_mode(ks, advertising, if (ethtool_link_ksettings_test_link_mode(ks, advertising,
20000baseKR2_Full)) 20000baseKR2_Full))
...@@ -1055,6 +1057,9 @@ static int i40e_nway_reset(struct net_device *netdev) ...@@ -1055,6 +1057,9 @@ static int i40e_nway_reset(struct net_device *netdev)
/** /**
* i40e_get_pauseparam - Get Flow Control status * i40e_get_pauseparam - Get Flow Control status
* @netdev: netdevice structure
* @pause: buffer to return pause parameters
*
* Return tx/rx-pause status * Return tx/rx-pause status
**/ **/
static void i40e_get_pauseparam(struct net_device *netdev, static void i40e_get_pauseparam(struct net_device *netdev,
...@@ -2526,7 +2531,7 @@ static int i40e_get_rss_hash_opts(struct i40e_pf *pf, struct ethtool_rxnfc *cmd) ...@@ -2526,7 +2531,7 @@ static int i40e_get_rss_hash_opts(struct i40e_pf *pf, struct ethtool_rxnfc *cmd)
/** /**
* i40e_check_mask - Check whether a mask field is set * i40e_check_mask - Check whether a mask field is set
* @mask: the full mask value * @mask: the full mask value
* @field; mask of the field to check * @field: mask of the field to check
* *
* If the given mask is fully set, return positive value. If the mask for the * If the given mask is fully set, return positive value. If the mask for the
* field is fully unset, return zero. Otherwise return a negative error code. * field is fully unset, return zero. Otherwise return a negative error code.
...@@ -2597,6 +2602,7 @@ static int i40e_parse_rx_flow_user_data(struct ethtool_rx_flow_spec *fsp, ...@@ -2597,6 +2602,7 @@ static int i40e_parse_rx_flow_user_data(struct ethtool_rx_flow_spec *fsp,
/** /**
* i40e_fill_rx_flow_user_data - Fill in user-defined data field * i40e_fill_rx_flow_user_data - Fill in user-defined data field
* @fsp: pointer to rx_flow specification * @fsp: pointer to rx_flow specification
* @data: pointer to return userdef data
* *
* Reads the userdef data structure and properly fills in the user defined * Reads the userdef data structure and properly fills in the user defined
* fields of the rx_flow_spec. * fields of the rx_flow_spec.
...@@ -2775,6 +2781,7 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf, ...@@ -2775,6 +2781,7 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf,
* i40e_get_rxnfc - command to get RX flow classification rules * i40e_get_rxnfc - command to get RX flow classification rules
* @netdev: network interface device structure * @netdev: network interface device structure
* @cmd: ethtool rxnfc command * @cmd: ethtool rxnfc command
* @rule_locs: pointer to store rule data
* *
* Returns Success if the command is supported. * Returns Success if the command is supported.
**/ **/
...@@ -2816,7 +2823,7 @@ static int i40e_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd, ...@@ -2816,7 +2823,7 @@ static int i40e_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd,
/** /**
* i40e_get_rss_hash_bits - Read RSS Hash bits from register * i40e_get_rss_hash_bits - Read RSS Hash bits from register
* @nfc: pointer to user request * @nfc: pointer to user request
* @i_setc bits currently set * @i_setc: bits currently set
* *
* Returns value of bits to be set per user request * Returns value of bits to be set per user request
**/ **/
...@@ -2861,7 +2868,7 @@ static u64 i40e_get_rss_hash_bits(struct ethtool_rxnfc *nfc, u64 i_setc) ...@@ -2861,7 +2868,7 @@ static u64 i40e_get_rss_hash_bits(struct ethtool_rxnfc *nfc, u64 i_setc)
/** /**
* i40e_set_rss_hash_opt - Enable/Disable flow types for RSS hash * i40e_set_rss_hash_opt - Enable/Disable flow types for RSS hash
* @pf: pointer to the physical function struct * @pf: pointer to the physical function struct
* @cmd: ethtool rxnfc command * @nfc: ethtool rxnfc command
* *
* Returns Success if the flow input set is supported. * Returns Success if the flow input set is supported.
**/ **/
...@@ -3260,7 +3267,7 @@ static int i40e_add_flex_offset(struct list_head *flex_pit_list, ...@@ -3260,7 +3267,7 @@ static int i40e_add_flex_offset(struct list_head *flex_pit_list,
* __i40e_reprogram_flex_pit - Re-program specific FLX_PIT table * __i40e_reprogram_flex_pit - Re-program specific FLX_PIT table
* @pf: Pointer to the PF structure * @pf: Pointer to the PF structure
* @flex_pit_list: list of flexible src offsets in use * @flex_pit_list: list of flexible src offsets in use
* #flex_pit_start: index to first entry for this section of the table * @flex_pit_start: index to first entry for this section of the table
* *
* In order to handle flexible data, the hardware uses a table of values * In order to handle flexible data, the hardware uses a table of values
* called the FLX_PIT table. This table is used to indicate which sections of * called the FLX_PIT table. This table is used to indicate which sections of
...@@ -3374,7 +3381,7 @@ static void i40e_reprogram_flex_pit(struct i40e_pf *pf) ...@@ -3374,7 +3381,7 @@ static void i40e_reprogram_flex_pit(struct i40e_pf *pf)
/** /**
* i40e_flow_str - Converts a flow_type into a human readable string * i40e_flow_str - Converts a flow_type into a human readable string
* @flow_type: the flow type from a flow specification * @fsp: the flow specification
* *
* Currently only flow types we support are included here, and the string * Currently only flow types we support are included here, and the string
* value attempts to match what ethtool would use to configure this flow type. * value attempts to match what ethtool would use to configure this flow type.
...@@ -4079,7 +4086,7 @@ static unsigned int i40e_max_channels(struct i40e_vsi *vsi) ...@@ -4079,7 +4086,7 @@ static unsigned int i40e_max_channels(struct i40e_vsi *vsi)
/** /**
* i40e_get_channels - Get the current channels enabled and max supported etc. * i40e_get_channels - Get the current channels enabled and max supported etc.
* @netdev: network interface device structure * @dev: network interface device structure
* @ch: ethtool channels structure * @ch: ethtool channels structure
* *
* We don't support separate tx and rx queues as channels. The other count * We don't support separate tx and rx queues as channels. The other count
...@@ -4088,7 +4095,7 @@ static unsigned int i40e_max_channels(struct i40e_vsi *vsi) ...@@ -4088,7 +4095,7 @@ static unsigned int i40e_max_channels(struct i40e_vsi *vsi)
* q_vectors since we support a lot more queue pairs than q_vectors. * q_vectors since we support a lot more queue pairs than q_vectors.
**/ **/
static void i40e_get_channels(struct net_device *dev, static void i40e_get_channels(struct net_device *dev,
struct ethtool_channels *ch) struct ethtool_channels *ch)
{ {
struct i40e_netdev_priv *np = netdev_priv(dev); struct i40e_netdev_priv *np = netdev_priv(dev);
struct i40e_vsi *vsi = np->vsi; struct i40e_vsi *vsi = np->vsi;
...@@ -4107,14 +4114,14 @@ static void i40e_get_channels(struct net_device *dev, ...@@ -4107,14 +4114,14 @@ static void i40e_get_channels(struct net_device *dev,
/** /**
* i40e_set_channels - Set the new channels count. * i40e_set_channels - Set the new channels count.
* @netdev: network interface device structure * @dev: network interface device structure
* @ch: ethtool channels structure * @ch: ethtool channels structure
* *
* The new channels count may not be the same as requested by the user * The new channels count may not be the same as requested by the user
* since it gets rounded down to a power of 2 value. * since it gets rounded down to a power of 2 value.
**/ **/
static int i40e_set_channels(struct net_device *dev, static int i40e_set_channels(struct net_device *dev,
struct ethtool_channels *ch) struct ethtool_channels *ch)
{ {
const u8 drop = I40E_FILTER_PROGRAM_DESC_DEST_DROP_PACKET; const u8 drop = I40E_FILTER_PROGRAM_DESC_DEST_DROP_PACKET;
struct i40e_netdev_priv *np = netdev_priv(dev); struct i40e_netdev_priv *np = netdev_priv(dev);
...@@ -4249,6 +4256,7 @@ static int i40e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, ...@@ -4249,6 +4256,7 @@ static int i40e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
* @netdev: network interface device structure * @netdev: network interface device structure
* @indir: indirection table * @indir: indirection table
* @key: hash key * @key: hash key
* @hfunc: hash function to use
* *
* Returns -EINVAL if the table specifies an invalid queue id, otherwise * Returns -EINVAL if the table specifies an invalid queue id, otherwise
* returns 0 after programming the table. * returns 0 after programming the table.
......
...@@ -174,7 +174,6 @@ i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw, ...@@ -174,7 +174,6 @@ i40e_status i40e_add_pd_table_entry(struct i40e_hw *hw,
* @hw: pointer to our HW structure * @hw: pointer to our HW structure
* @hmc_info: pointer to the HMC configuration information structure * @hmc_info: pointer to the HMC configuration information structure
* @idx: the page index * @idx: the page index
* @is_pf: distinguishes a VF from a PF
* *
* This function: * This function:
* 1. Marks the entry in pd tabe (for paged address mode) or in sd table * 1. Marks the entry in pd tabe (for paged address mode) or in sd table
......
...@@ -254,8 +254,8 @@ static int i40e_put_lump(struct i40e_lump_tracking *pile, u16 index, u16 id) ...@@ -254,8 +254,8 @@ static int i40e_put_lump(struct i40e_lump_tracking *pile, u16 index, u16 id)
/** /**
* i40e_find_vsi_from_id - searches for the vsi with the given id * i40e_find_vsi_from_id - searches for the vsi with the given id
* @pf - the pf structure to search for the vsi * @pf: the pf structure to search for the vsi
* @id - id of the vsi it is searching for * @id: id of the vsi it is searching for
**/ **/
struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id) struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id)
{ {
...@@ -411,6 +411,7 @@ static void i40e_get_netdev_stats_struct_tx(struct i40e_ring *ring, ...@@ -411,6 +411,7 @@ static void i40e_get_netdev_stats_struct_tx(struct i40e_ring *ring,
/** /**
* i40e_get_netdev_stats_struct - Get statistics for netdev interface * i40e_get_netdev_stats_struct - Get statistics for netdev interface
* @netdev: network interface device structure * @netdev: network interface device structure
* @stats: data structure to store statistics
* *
* Returns the address of the device statistics structure. * Returns the address of the device statistics structure.
* The statistics are actually updated from the service task. * The statistics are actually updated from the service task.
...@@ -2003,7 +2004,7 @@ struct i40e_new_mac_filter *i40e_next_filter(struct i40e_new_mac_filter *next) ...@@ -2003,7 +2004,7 @@ struct i40e_new_mac_filter *i40e_next_filter(struct i40e_new_mac_filter *next)
* from firmware * from firmware
* @count: Number of filters added * @count: Number of filters added
* @add_list: return data from fw * @add_list: return data from fw
* @head: pointer to first filter in current batch * @add_head: pointer to first filter in current batch
* *
* MAC filter entries from list were slated to be added to device. Returns * MAC filter entries from list were slated to be added to device. Returns
* number of successful filters. Note that 0 does NOT mean success! * number of successful filters. Note that 0 does NOT mean success!
...@@ -2110,6 +2111,7 @@ void i40e_aqc_add_filters(struct i40e_vsi *vsi, const char *vsi_name, ...@@ -2110,6 +2111,7 @@ void i40e_aqc_add_filters(struct i40e_vsi *vsi, const char *vsi_name,
/** /**
* i40e_aqc_broadcast_filter - Set promiscuous broadcast flags * i40e_aqc_broadcast_filter - Set promiscuous broadcast flags
* @vsi: pointer to the VSI * @vsi: pointer to the VSI
* @vsi_name: the VSI name
* @f: filter data * @f: filter data
* *
* This function sets or clears the promiscuous broadcast flags for VLAN * This function sets or clears the promiscuous broadcast flags for VLAN
...@@ -2816,6 +2818,7 @@ void i40e_vsi_kill_vlan(struct i40e_vsi *vsi, u16 vid) ...@@ -2816,6 +2818,7 @@ void i40e_vsi_kill_vlan(struct i40e_vsi *vsi, u16 vid)
/** /**
* i40e_vlan_rx_add_vid - Add a vlan id filter to HW offload * i40e_vlan_rx_add_vid - Add a vlan id filter to HW offload
* @netdev: network interface to be adjusted * @netdev: network interface to be adjusted
* @proto: unused protocol value
* @vid: vlan id to be added * @vid: vlan id to be added
* *
* net_device_ops implementation for adding vlan ids * net_device_ops implementation for adding vlan ids
...@@ -2840,6 +2843,7 @@ static int i40e_vlan_rx_add_vid(struct net_device *netdev, ...@@ -2840,6 +2843,7 @@ static int i40e_vlan_rx_add_vid(struct net_device *netdev,
/** /**
* i40e_vlan_rx_kill_vid - Remove a vlan id filter from HW offload * i40e_vlan_rx_kill_vid - Remove a vlan id filter from HW offload
* @netdev: network interface to be adjusted * @netdev: network interface to be adjusted
* @proto: unused protocol value
* @vid: vlan id to be removed * @vid: vlan id to be removed
* *
* net_device_ops implementation for removing vlan ids * net_device_ops implementation for removing vlan ids
...@@ -3461,7 +3465,7 @@ static void i40e_vsi_configure_msix(struct i40e_vsi *vsi) ...@@ -3461,7 +3465,7 @@ static void i40e_vsi_configure_msix(struct i40e_vsi *vsi)
/** /**
* i40e_enable_misc_int_causes - enable the non-queue interrupts * i40e_enable_misc_int_causes - enable the non-queue interrupts
* @hw: ptr to the hardware info * @pf: pointer to private device data structure
**/ **/
static void i40e_enable_misc_int_causes(struct i40e_pf *pf) static void i40e_enable_misc_int_causes(struct i40e_pf *pf)
{ {
...@@ -4231,8 +4235,8 @@ static void i40e_control_tx_q(struct i40e_pf *pf, int pf_q, bool enable) ...@@ -4231,8 +4235,8 @@ static void i40e_control_tx_q(struct i40e_pf *pf, int pf_q, bool enable)
* @is_xdp: true if the queue is used for XDP * @is_xdp: true if the queue is used for XDP
* @enable: start or stop the queue * @enable: start or stop the queue
**/ **/
static int i40e_control_wait_tx_q(int seid, struct i40e_pf *pf, int pf_q, int i40e_control_wait_tx_q(int seid, struct i40e_pf *pf, int pf_q,
bool is_xdp, bool enable) bool is_xdp, bool enable)
{ {
int ret; int ret;
...@@ -4277,7 +4281,6 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable) ...@@ -4277,7 +4281,6 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
if (ret) if (ret)
break; break;
} }
return ret; return ret;
} }
...@@ -4316,9 +4319,9 @@ static int i40e_pf_rxq_wait(struct i40e_pf *pf, int pf_q, bool enable) ...@@ -4316,9 +4319,9 @@ static int i40e_pf_rxq_wait(struct i40e_pf *pf, int pf_q, bool enable)
* @pf_q: the PF queue to configure * @pf_q: the PF queue to configure
* @enable: start or stop the queue * @enable: start or stop the queue
* *
* This function enables or disables a single queue. Note that any delay * This function enables or disables a single queue. Note that
* required after the operation is expected to be handled by the caller of * any delay required after the operation is expected to be
* this function. * handled by the caller of this function.
**/ **/
static void i40e_control_rx_q(struct i40e_pf *pf, int pf_q, bool enable) static void i40e_control_rx_q(struct i40e_pf *pf, int pf_q, bool enable)
{ {
...@@ -4347,6 +4350,30 @@ static void i40e_control_rx_q(struct i40e_pf *pf, int pf_q, bool enable) ...@@ -4347,6 +4350,30 @@ static void i40e_control_rx_q(struct i40e_pf *pf, int pf_q, bool enable)
wr32(hw, I40E_QRX_ENA(pf_q), rx_reg); wr32(hw, I40E_QRX_ENA(pf_q), rx_reg);
} }
/**
* i40e_control_wait_rx_q
* @pf: the PF structure
* @pf_q: queue being configured
* @enable: start or stop the rings
*
* This function enables or disables a single queue along with waiting
* for the change to finish. The caller of this function should handle
* the delays needed in the case of disabling queues.
**/
int i40e_control_wait_rx_q(struct i40e_pf *pf, int pf_q, bool enable)
{
int ret = 0;
i40e_control_rx_q(pf, pf_q, enable);
/* wait for the change to finish */
ret = i40e_pf_rxq_wait(pf, pf_q, enable);
if (ret)
return ret;
return ret;
}
/** /**
* i40e_vsi_control_rx - Start or stop a VSI's rings * i40e_vsi_control_rx - Start or stop a VSI's rings
* @vsi: the VSI being configured * @vsi: the VSI being configured
...@@ -4359,10 +4386,7 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable) ...@@ -4359,10 +4386,7 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
pf_q = vsi->base_queue; pf_q = vsi->base_queue;
for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) {
i40e_control_rx_q(pf, pf_q, enable); ret = i40e_control_wait_rx_q(pf, pf_q, enable);
/* wait for the change to finish */
ret = i40e_pf_rxq_wait(pf, pf_q, enable);
if (ret) { if (ret) {
dev_info(&pf->pdev->dev, dev_info(&pf->pdev->dev,
"VSI seid %d Rx ring %d %sable timeout\n", "VSI seid %d Rx ring %d %sable timeout\n",
...@@ -5072,7 +5096,7 @@ static int i40e_vsi_get_bw_info(struct i40e_vsi *vsi) ...@@ -5072,7 +5096,7 @@ static int i40e_vsi_get_bw_info(struct i40e_vsi *vsi)
* i40e_vsi_configure_bw_alloc - Configure VSI BW allocation per TC * i40e_vsi_configure_bw_alloc - Configure VSI BW allocation per TC
* @vsi: the VSI being configured * @vsi: the VSI being configured
* @enabled_tc: TC bitmap * @enabled_tc: TC bitmap
* @bw_credits: BW shared credits per TC * @bw_share: BW shared credits per TC
* *
* Returns 0 on success, negative value on failure * Returns 0 on success, negative value on failure
**/ **/
...@@ -6329,6 +6353,7 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf) ...@@ -6329,6 +6353,7 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf)
/** /**
* i40e_print_link_message - print link up or down * i40e_print_link_message - print link up or down
* @vsi: the VSI for which link needs a message * @vsi: the VSI for which link needs a message
* @isup: true of link is up, false otherwise
*/ */
void i40e_print_link_message(struct i40e_vsi *vsi, bool isup) void i40e_print_link_message(struct i40e_vsi *vsi, bool isup)
{ {
...@@ -7188,8 +7213,7 @@ static int i40e_parse_cls_flower(struct i40e_vsi *vsi, ...@@ -7188,8 +7213,7 @@ static int i40e_parse_cls_flower(struct i40e_vsi *vsi,
if (mask->dst == cpu_to_be32(0xffffffff)) { if (mask->dst == cpu_to_be32(0xffffffff)) {
field_flags |= I40E_CLOUD_FIELD_IIP; field_flags |= I40E_CLOUD_FIELD_IIP;
} else { } else {
mask->dst = be32_to_cpu(mask->dst); dev_err(&pf->pdev->dev, "Bad ip dst mask %pI4b\n",
dev_err(&pf->pdev->dev, "Bad ip dst mask %pI4\n",
&mask->dst); &mask->dst);
return I40E_ERR_CONFIG; return I40E_ERR_CONFIG;
} }
...@@ -7199,8 +7223,7 @@ static int i40e_parse_cls_flower(struct i40e_vsi *vsi, ...@@ -7199,8 +7223,7 @@ static int i40e_parse_cls_flower(struct i40e_vsi *vsi,
if (mask->src == cpu_to_be32(0xffffffff)) { if (mask->src == cpu_to_be32(0xffffffff)) {
field_flags |= I40E_CLOUD_FIELD_IIP; field_flags |= I40E_CLOUD_FIELD_IIP;
} else { } else {
mask->src = be32_to_cpu(mask->src); dev_err(&pf->pdev->dev, "Bad ip src mask %pI4b\n",
dev_err(&pf->pdev->dev, "Bad ip src mask %pI4\n",
&mask->src); &mask->src);
return I40E_ERR_CONFIG; return I40E_ERR_CONFIG;
} }
...@@ -9667,9 +9690,9 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf) ...@@ -9667,9 +9690,9 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
i40e_flush(hw); i40e_flush(hw);
} }
static const char *i40e_tunnel_name(struct i40e_udp_port_config *port) static const char *i40e_tunnel_name(u8 type)
{ {
switch (port->type) { switch (type) {
case UDP_TUNNEL_TYPE_VXLAN: case UDP_TUNNEL_TYPE_VXLAN:
return "vxlan"; return "vxlan";
case UDP_TUNNEL_TYPE_GENEVE: case UDP_TUNNEL_TYPE_GENEVE:
...@@ -9703,37 +9726,68 @@ static void i40e_sync_udp_filters(struct i40e_pf *pf) ...@@ -9703,37 +9726,68 @@ static void i40e_sync_udp_filters(struct i40e_pf *pf)
static void i40e_sync_udp_filters_subtask(struct i40e_pf *pf) static void i40e_sync_udp_filters_subtask(struct i40e_pf *pf)
{ {
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
i40e_status ret; u8 filter_index, type;
u16 port; u16 port;
int i; int i;
if (!test_and_clear_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state)) if (!test_and_clear_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state))
return; return;
/* acquire RTNL to maintain state of flags and port requests */
rtnl_lock();
for (i = 0; i < I40E_MAX_PF_UDP_OFFLOAD_PORTS; i++) { for (i = 0; i < I40E_MAX_PF_UDP_OFFLOAD_PORTS; i++) {
if (pf->pending_udp_bitmap & BIT_ULL(i)) { if (pf->pending_udp_bitmap & BIT_ULL(i)) {
struct i40e_udp_port_config *udp_port;
i40e_status ret = 0;
udp_port = &pf->udp_ports[i];
pf->pending_udp_bitmap &= ~BIT_ULL(i); pf->pending_udp_bitmap &= ~BIT_ULL(i);
port = pf->udp_ports[i].port;
port = READ_ONCE(udp_port->port);
type = READ_ONCE(udp_port->type);
filter_index = READ_ONCE(udp_port->filter_index);
/* release RTNL while we wait on AQ command */
rtnl_unlock();
if (port) if (port)
ret = i40e_aq_add_udp_tunnel(hw, port, ret = i40e_aq_add_udp_tunnel(hw, port,
pf->udp_ports[i].type, type,
NULL, NULL); &filter_index,
else NULL);
ret = i40e_aq_del_udp_tunnel(hw, i, NULL); else if (filter_index != I40E_UDP_PORT_INDEX_UNUSED)
ret = i40e_aq_del_udp_tunnel(hw, filter_index,
NULL);
/* reacquire RTNL so we can update filter_index */
rtnl_lock();
if (ret) { if (ret) {
dev_info(&pf->pdev->dev, dev_info(&pf->pdev->dev,
"%s %s port %d, index %d failed, err %s aq_err %s\n", "%s %s port %d, index %d failed, err %s aq_err %s\n",
i40e_tunnel_name(&pf->udp_ports[i]), i40e_tunnel_name(type),
port ? "add" : "delete", port ? "add" : "delete",
port, i, port,
filter_index,
i40e_stat_str(&pf->hw, ret), i40e_stat_str(&pf->hw, ret),
i40e_aq_str(&pf->hw, i40e_aq_str(&pf->hw,
pf->hw.aq.asq_last_status)); pf->hw.aq.asq_last_status));
pf->udp_ports[i].port = 0; if (port) {
/* failed to add, just reset port,
* drop pending bit for any deletion
*/
udp_port->port = 0;
pf->pending_udp_bitmap &= ~BIT_ULL(i);
}
} else if (port) {
/* record filter index on success */
udp_port->filter_index = filter_index;
} }
} }
} }
rtnl_unlock();
} }
/** /**
...@@ -9980,7 +10034,7 @@ static int i40e_vsi_mem_alloc(struct i40e_pf *pf, enum i40e_vsi_type type) ...@@ -9980,7 +10034,7 @@ static int i40e_vsi_mem_alloc(struct i40e_pf *pf, enum i40e_vsi_type type)
/** /**
* i40e_vsi_free_arrays - Free queue and vector pointer arrays for the VSI * i40e_vsi_free_arrays - Free queue and vector pointer arrays for the VSI
* @type: VSI pointer * @vsi: VSI pointer
* @free_qvectors: a bool to specify if q_vectors need to be freed. * @free_qvectors: a bool to specify if q_vectors need to be freed.
* *
* On error: returns error code (negative) * On error: returns error code (negative)
...@@ -10776,7 +10830,7 @@ int i40e_config_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size) ...@@ -10776,7 +10830,7 @@ int i40e_config_rss(struct i40e_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size)
* @vsi: Pointer to VSI structure * @vsi: Pointer to VSI structure
* @seed: Buffer to store the keys * @seed: Buffer to store the keys
* @lut: Buffer to store the lookup table entries * @lut: Buffer to store the lookup table entries
* lut_size: Size of buffer to store the lookup table entries * @lut_size: Size of buffer to store the lookup table entries
* *
* Returns 0 on success, negative on failure * Returns 0 on success, negative on failure
*/ */
...@@ -11350,6 +11404,11 @@ static u8 i40e_get_udp_port_idx(struct i40e_pf *pf, u16 port) ...@@ -11350,6 +11404,11 @@ static u8 i40e_get_udp_port_idx(struct i40e_pf *pf, u16 port)
u8 i; u8 i;
for (i = 0; i < I40E_MAX_PF_UDP_OFFLOAD_PORTS; i++) { for (i = 0; i < I40E_MAX_PF_UDP_OFFLOAD_PORTS; i++) {
/* Do not report ports with pending deletions as
* being available.
*/
if (!port && (pf->pending_udp_bitmap & BIT_ULL(i)))
continue;
if (pf->udp_ports[i].port == port) if (pf->udp_ports[i].port == port)
return i; return i;
} }
...@@ -11404,6 +11463,7 @@ static void i40e_udp_tunnel_add(struct net_device *netdev, ...@@ -11404,6 +11463,7 @@ static void i40e_udp_tunnel_add(struct net_device *netdev,
/* New port: add it and mark its index in the bitmap */ /* New port: add it and mark its index in the bitmap */
pf->udp_ports[next_idx].port = port; pf->udp_ports[next_idx].port = port;
pf->udp_ports[next_idx].filter_index = I40E_UDP_PORT_INDEX_UNUSED;
pf->pending_udp_bitmap |= BIT_ULL(next_idx); pf->pending_udp_bitmap |= BIT_ULL(next_idx);
set_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state); set_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state);
} }
...@@ -11445,7 +11505,12 @@ static void i40e_udp_tunnel_del(struct net_device *netdev, ...@@ -11445,7 +11505,12 @@ static void i40e_udp_tunnel_del(struct net_device *netdev,
* and make it pending * and make it pending
*/ */
pf->udp_ports[idx].port = 0; pf->udp_ports[idx].port = 0;
pf->pending_udp_bitmap |= BIT_ULL(idx);
/* Toggle pending bit instead of setting it. This way if we are
* deleting a port that has yet to be added we just clear the pending
* bit and don't have to worry about it.
*/
pf->pending_udp_bitmap ^= BIT_ULL(idx);
set_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state); set_bit(__I40E_UDP_FILTER_SYNC_PENDING, pf->state);
return; return;
...@@ -11476,6 +11541,7 @@ static int i40e_get_phys_port_id(struct net_device *netdev, ...@@ -11476,6 +11541,7 @@ static int i40e_get_phys_port_id(struct net_device *netdev,
* @tb: pointer to array of nladdr (unused) * @tb: pointer to array of nladdr (unused)
* @dev: the net device pointer * @dev: the net device pointer
* @addr: the MAC address entry being added * @addr: the MAC address entry being added
* @vid: VLAN ID
* @flags: instructions from stack about fdb operation * @flags: instructions from stack about fdb operation
*/ */
static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
...@@ -11521,6 +11587,7 @@ static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], ...@@ -11521,6 +11587,7 @@ static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
* i40e_ndo_bridge_setlink - Set the hardware bridge mode * i40e_ndo_bridge_setlink - Set the hardware bridge mode
* @dev: the netdev being configured * @dev: the netdev being configured
* @nlh: RTNL message * @nlh: RTNL message
* @flags: bridge flags
* *
* Inserts a new hardware bridge if not already created and * Inserts a new hardware bridge if not already created and
* enables the bridging mode requested (VEB or VEPA). If the * enables the bridging mode requested (VEB or VEPA). If the
...@@ -14094,6 +14161,7 @@ static void i40e_remove(struct pci_dev *pdev) ...@@ -14094,6 +14161,7 @@ static void i40e_remove(struct pci_dev *pdev)
/** /**
* i40e_pci_error_detected - warning that something funky happened in PCI land * i40e_pci_error_detected - warning that something funky happened in PCI land
* @pdev: PCI device information struct * @pdev: PCI device information struct
* @error: the type of PCI error
* *
* Called to warn that something happened and the error handling steps * Called to warn that something happened and the error handling steps
* are in progress. Allows the driver to quiesce things, be ready for * are in progress. Allows the driver to quiesce things, be ready for
......
...@@ -1149,6 +1149,7 @@ void i40e_nvmupd_clear_wait_state(struct i40e_hw *hw) ...@@ -1149,6 +1149,7 @@ void i40e_nvmupd_clear_wait_state(struct i40e_hw *hw)
* i40e_nvmupd_check_wait_event - handle NVM update operation events * i40e_nvmupd_check_wait_event - handle NVM update operation events
* @hw: pointer to the hardware structure * @hw: pointer to the hardware structure
* @opcode: the event that just happened * @opcode: the event that just happened
* @desc: AdminQ descriptor
**/ **/
void i40e_nvmupd_check_wait_event(struct i40e_hw *hw, u16 opcode, void i40e_nvmupd_check_wait_event(struct i40e_hw *hw, u16 opcode,
struct i40e_aq_desc *desc) struct i40e_aq_desc *desc)
......
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
* At 1Gb link, the period is multiplied by 20. (32ns) * At 1Gb link, the period is multiplied by 20. (32ns)
* 1588 functionality is not supported at 100Mbps. * 1588 functionality is not supported at 100Mbps.
*/ */
#define I40E_PTP_40GB_INCVAL 0x0199999999ULL #define I40E_PTP_40GB_INCVAL 0x0199999999ULL
#define I40E_PTP_10GB_INCVAL 0x0333333333ULL #define I40E_PTP_10GB_INCVAL_MULT 2
#define I40E_PTP_1GB_INCVAL 0x2000000000ULL #define I40E_PTP_1GB_INCVAL_MULT 20
#define I40E_PRTTSYN_CTL1_TSYNTYPE_V1 BIT(I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT) #define I40E_PRTTSYN_CTL1_TSYNTYPE_V1 BIT(I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT)
#define I40E_PRTTSYN_CTL1_TSYNTYPE_V2 (2 << \ #define I40E_PRTTSYN_CTL1_TSYNTYPE_V2 (2 << \
...@@ -106,17 +106,24 @@ static int i40e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) ...@@ -106,17 +106,24 @@ static int i40e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
ppb = -ppb; ppb = -ppb;
} }
smp_mb(); /* Force any pending update before accessing. */ freq = I40E_PTP_40GB_INCVAL;
adj = READ_ONCE(pf->ptp_base_adj);
freq = adj;
freq *= ppb; freq *= ppb;
diff = div_u64(freq, 1000000000ULL); diff = div_u64(freq, 1000000000ULL);
if (neg_adj) if (neg_adj)
adj -= diff; adj = I40E_PTP_40GB_INCVAL - diff;
else else
adj += diff; adj = I40E_PTP_40GB_INCVAL + diff;
/* At some link speeds, the base incval is so large that directly
* multiplying by ppb would result in arithmetic overflow even when
* using a u64. Avoid this by instead calculating the new incval
* always in terms of the 40GbE clock rate and then multiplying by the
* link speed factor afterwards. This does result in slightly lower
* precision at lower link speeds, but it is fairly minor.
*/
smp_mb(); /* Force any pending update before accessing. */
adj *= READ_ONCE(pf->ptp_adj_mult);
wr32(hw, I40E_PRTTSYN_INC_L, adj & 0xFFFFFFFF); wr32(hw, I40E_PRTTSYN_INC_L, adj & 0xFFFFFFFF);
wr32(hw, I40E_PRTTSYN_INC_H, adj >> 32); wr32(hw, I40E_PRTTSYN_INC_H, adj >> 32);
...@@ -438,6 +445,7 @@ void i40e_ptp_set_increment(struct i40e_pf *pf) ...@@ -438,6 +445,7 @@ void i40e_ptp_set_increment(struct i40e_pf *pf)
struct i40e_link_status *hw_link_info; struct i40e_link_status *hw_link_info;
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
u64 incval; u64 incval;
u32 mult;
hw_link_info = &hw->phy.link_info; hw_link_info = &hw->phy.link_info;
...@@ -445,10 +453,10 @@ void i40e_ptp_set_increment(struct i40e_pf *pf) ...@@ -445,10 +453,10 @@ void i40e_ptp_set_increment(struct i40e_pf *pf)
switch (hw_link_info->link_speed) { switch (hw_link_info->link_speed) {
case I40E_LINK_SPEED_10GB: case I40E_LINK_SPEED_10GB:
incval = I40E_PTP_10GB_INCVAL; mult = I40E_PTP_10GB_INCVAL_MULT;
break; break;
case I40E_LINK_SPEED_1GB: case I40E_LINK_SPEED_1GB:
incval = I40E_PTP_1GB_INCVAL; mult = I40E_PTP_1GB_INCVAL_MULT;
break; break;
case I40E_LINK_SPEED_100MB: case I40E_LINK_SPEED_100MB:
{ {
...@@ -459,15 +467,20 @@ void i40e_ptp_set_increment(struct i40e_pf *pf) ...@@ -459,15 +467,20 @@ void i40e_ptp_set_increment(struct i40e_pf *pf)
"1588 functionality is not supported at 100 Mbps. Stopping the PHC.\n"); "1588 functionality is not supported at 100 Mbps. Stopping the PHC.\n");
warn_once++; warn_once++;
} }
incval = 0; mult = 0;
break; break;
} }
case I40E_LINK_SPEED_40GB: case I40E_LINK_SPEED_40GB:
default: default:
incval = I40E_PTP_40GB_INCVAL; mult = 1;
break; break;
} }
/* The increment value is calculated by taking the base 40GbE incvalue
* and multiplying it by a factor based on the link speed.
*/
incval = I40E_PTP_40GB_INCVAL * mult;
/* Write the new increment value into the increment register. The /* Write the new increment value into the increment register. The
* hardware will not update the clock until both registers have been * hardware will not update the clock until both registers have been
* written. * written.
...@@ -476,14 +489,14 @@ void i40e_ptp_set_increment(struct i40e_pf *pf) ...@@ -476,14 +489,14 @@ void i40e_ptp_set_increment(struct i40e_pf *pf)
wr32(hw, I40E_PRTTSYN_INC_H, incval >> 32); wr32(hw, I40E_PRTTSYN_INC_H, incval >> 32);
/* Update the base adjustement value. */ /* Update the base adjustement value. */
WRITE_ONCE(pf->ptp_base_adj, incval); WRITE_ONCE(pf->ptp_adj_mult, mult);
smp_mb(); /* Force the above update. */ smp_mb(); /* Force the above update. */
} }
/** /**
* i40e_ptp_get_ts_config - ioctl interface to read the HW timestamping * i40e_ptp_get_ts_config - ioctl interface to read the HW timestamping
* @pf: Board private structure * @pf: Board private structure
* @ifreq: ioctl data * @ifr: ioctl data
* *
* Obtain the current hardware timestamping settigs as requested. To do this, * Obtain the current hardware timestamping settigs as requested. To do this,
* keep a shadow copy of the timestamp settings rather than attempting to * keep a shadow copy of the timestamp settings rather than attempting to
...@@ -627,7 +640,7 @@ static int i40e_ptp_set_timestamp_mode(struct i40e_pf *pf, ...@@ -627,7 +640,7 @@ static int i40e_ptp_set_timestamp_mode(struct i40e_pf *pf,
/** /**
* i40e_ptp_set_ts_config - ioctl interface to control the HW timestamping * i40e_ptp_set_ts_config - ioctl interface to control the HW timestamping
* @pf: Board private structure * @pf: Board private structure
* @ifreq: ioctl data * @ifr: ioctl data
* *
* Respond to the user filter requests and make the appropriate hardware * Respond to the user filter requests and make the appropriate hardware
* changes here. The XL710 cannot support splitting of the Tx/Rx timestamping * changes here. The XL710 cannot support splitting of the Tx/Rx timestamping
......
...@@ -471,7 +471,7 @@ static int i40e_add_del_fdir_ipv4(struct i40e_vsi *vsi, ...@@ -471,7 +471,7 @@ static int i40e_add_del_fdir_ipv4(struct i40e_vsi *vsi,
/** /**
* i40e_add_del_fdir - Build raw packets to add/del fdir filter * i40e_add_del_fdir - Build raw packets to add/del fdir filter
* @vsi: pointer to the targeted VSI * @vsi: pointer to the targeted VSI
* @cmd: command to get or set RX flow classification rules * @input: filter to add or delete
* @add: true adds a filter, false removes it * @add: true adds a filter, false removes it
* *
**/ **/
...@@ -689,7 +689,7 @@ void i40e_free_tx_resources(struct i40e_ring *tx_ring) ...@@ -689,7 +689,7 @@ void i40e_free_tx_resources(struct i40e_ring *tx_ring)
/** /**
* i40e_get_tx_pending - how many tx descriptors not processed * i40e_get_tx_pending - how many tx descriptors not processed
* @tx_ring: the ring of descriptors * @ring: the ring of descriptors
* @in_sw: use SW variables * @in_sw: use SW variables
* *
* Since there is no access to the ring head register * Since there is no access to the ring head register
...@@ -1771,6 +1771,8 @@ static inline int i40e_ptype_to_htype(u8 ptype) ...@@ -1771,6 +1771,8 @@ static inline int i40e_ptype_to_htype(u8 ptype)
* i40e_rx_hash - set the hash value in the skb * i40e_rx_hash - set the hash value in the skb
* @ring: descriptor ring * @ring: descriptor ring
* @rx_desc: specific descriptor * @rx_desc: specific descriptor
* @skb: skb currently being received and modified
* @rx_ptype: Rx packet type
**/ **/
static inline void i40e_rx_hash(struct i40e_ring *ring, static inline void i40e_rx_hash(struct i40e_ring *ring,
union i40e_rx_desc *rx_desc, union i40e_rx_desc *rx_desc,
......
...@@ -1294,7 +1294,8 @@ struct i40e_hw_port_stats { ...@@ -1294,7 +1294,8 @@ struct i40e_hw_port_stats {
/* Checksum and Shadow RAM pointers */ /* Checksum and Shadow RAM pointers */
#define I40E_SR_NVM_CONTROL_WORD 0x00 #define I40E_SR_NVM_CONTROL_WORD 0x00
#define I40E_SR_EMP_MODULE_PTR 0x0F #define I40E_EMP_MODULE_PTR 0x0F
#define I40E_SR_EMP_MODULE_PTR 0x48
#define I40E_SR_PBA_FLAGS 0x15 #define I40E_SR_PBA_FLAGS 0x15
#define I40E_SR_PBA_BLOCK_PTR 0x16 #define I40E_SR_PBA_BLOCK_PTR 0x16
#define I40E_SR_BOOT_CONFIG_PTR 0x17 #define I40E_SR_BOOT_CONFIG_PTR 0x17
...@@ -1313,6 +1314,8 @@ struct i40e_hw_port_stats { ...@@ -1313,6 +1314,8 @@ struct i40e_hw_port_stats {
#define I40E_SR_PCIE_ALT_MODULE_MAX_SIZE 1024 #define I40E_SR_PCIE_ALT_MODULE_MAX_SIZE 1024
#define I40E_SR_CONTROL_WORD_1_SHIFT 0x06 #define I40E_SR_CONTROL_WORD_1_SHIFT 0x06
#define I40E_SR_CONTROL_WORD_1_MASK (0x03 << I40E_SR_CONTROL_WORD_1_SHIFT) #define I40E_SR_CONTROL_WORD_1_MASK (0x03 << I40E_SR_CONTROL_WORD_1_SHIFT)
#define I40E_SR_CONTROL_WORD_1_NVM_BANK_VALID BIT(5)
#define I40E_SR_NVM_MAP_STRUCTURE_TYPE BIT(12)
#define I40E_PTR_TYPE BIT(15) #define I40E_PTR_TYPE BIT(15)
#define I40E_SR_OCP_CFG_WORD0 0x2B #define I40E_SR_OCP_CFG_WORD0 0x2B
#define I40E_SR_OCP_ENABLED BIT(15) #define I40E_SR_OCP_ENABLED BIT(15)
...@@ -1430,7 +1433,8 @@ enum i40e_reset_type { ...@@ -1430,7 +1433,8 @@ enum i40e_reset_type {
}; };
/* IEEE 802.1AB LLDP Agent Variables from NVM */ /* IEEE 802.1AB LLDP Agent Variables from NVM */
#define I40E_NVM_LLDP_CFG_PTR 0xD #define I40E_NVM_LLDP_CFG_PTR 0x06
#define I40E_SR_LLDP_CFG_PTR 0x31
struct i40e_lldp_variables { struct i40e_lldp_variables {
u16 length; u16 length;
u16 adminstatus; u16 adminstatus;
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
/** /**
* i40e_vc_vf_broadcast * i40e_vc_vf_broadcast
* @pf: pointer to the PF structure * @pf: pointer to the PF structure
* @opcode: operation code * @v_opcode: operation code
* @retval: return value * @v_retval: return value
* @msg: pointer to the msg buffer * @msg: pointer to the msg buffer
* @msglen: msg length * @msglen: msg length
* *
...@@ -1639,6 +1639,7 @@ static int i40e_vc_send_resp_to_vf(struct i40e_vf *vf, ...@@ -1639,6 +1639,7 @@ static int i40e_vc_send_resp_to_vf(struct i40e_vf *vf,
/** /**
* i40e_vc_get_version_msg * i40e_vc_get_version_msg
* @vf: pointer to the VF info * @vf: pointer to the VF info
* @msg: pointer to the msg buffer
* *
* called from the VF to request the API version used by the PF * called from the VF to request the API version used by the PF
**/ **/
...@@ -1682,7 +1683,6 @@ static void i40e_del_qch(struct i40e_vf *vf) ...@@ -1682,7 +1683,6 @@ static void i40e_del_qch(struct i40e_vf *vf)
* i40e_vc_get_vf_resources_msg * i40e_vc_get_vf_resources_msg
* @vf: pointer to the VF info * @vf: pointer to the VF info
* @msg: pointer to the msg buffer * @msg: pointer to the msg buffer
* @msglen: msg length
* *
* called from the VF to request its resources * called from the VF to request its resources
**/ **/
...@@ -1806,8 +1806,6 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg) ...@@ -1806,8 +1806,6 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)
/** /**
* i40e_vc_reset_vf_msg * i40e_vc_reset_vf_msg
* @vf: pointer to the VF info * @vf: pointer to the VF info
* @msg: pointer to the msg buffer
* @msglen: msg length
* *
* called from the VF to reset itself, * called from the VF to reset itself,
* unlike other virtchnl messages, PF driver * unlike other virtchnl messages, PF driver
...@@ -2155,6 +2153,51 @@ static int i40e_vc_config_irq_map_msg(struct i40e_vf *vf, u8 *msg, u16 msglen) ...@@ -2155,6 +2153,51 @@ static int i40e_vc_config_irq_map_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)
aq_ret); aq_ret);
} }
/**
* i40e_ctrl_vf_tx_rings
* @vsi: the SRIOV VSI being configured
* @q_map: bit map of the queues to be enabled
* @enable: start or stop the queue
**/
static int i40e_ctrl_vf_tx_rings(struct i40e_vsi *vsi, unsigned long q_map,
bool enable)
{
struct i40e_pf *pf = vsi->back;
int ret = 0;
u16 q_id;
for_each_set_bit(q_id, &q_map, I40E_MAX_VF_QUEUES) {
ret = i40e_control_wait_tx_q(vsi->seid, pf,
vsi->base_queue + q_id,
false /*is xdp*/, enable);
if (ret)
break;
}
return ret;
}
/**
* i40e_ctrl_vf_rx_rings
* @vsi: the SRIOV VSI being configured
* @q_map: bit map of the queues to be enabled
* @enable: start or stop the queue
**/
static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, unsigned long q_map,
bool enable)
{
struct i40e_pf *pf = vsi->back;
int ret = 0;
u16 q_id;
for_each_set_bit(q_id, &q_map, I40E_MAX_VF_QUEUES) {
ret = i40e_control_wait_rx_q(pf, vsi->base_queue + q_id,
enable);
if (ret)
break;
}
return ret;
}
/** /**
* i40e_vc_enable_queues_msg * i40e_vc_enable_queues_msg
* @vf: pointer to the VF info * @vf: pointer to the VF info
...@@ -2187,8 +2230,17 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg, u16 msglen) ...@@ -2187,8 +2230,17 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)
goto error_param; goto error_param;
} }
if (i40e_vsi_start_rings(pf->vsi[vf->lan_vsi_idx])) /* Use the queue bit map sent by the VF */
if (i40e_ctrl_vf_rx_rings(pf->vsi[vf->lan_vsi_idx], vqs->rx_queues,
true)) {
aq_ret = I40E_ERR_TIMEOUT; aq_ret = I40E_ERR_TIMEOUT;
goto error_param;
}
if (i40e_ctrl_vf_tx_rings(pf->vsi[vf->lan_vsi_idx], vqs->tx_queues,
true)) {
aq_ret = I40E_ERR_TIMEOUT;
goto error_param;
}
/* need to start the rings for additional ADq VSI's as well */ /* need to start the rings for additional ADq VSI's as well */
if (vf->adq_enabled) { if (vf->adq_enabled) {
...@@ -2236,8 +2288,17 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg, u16 msglen) ...@@ -2236,8 +2288,17 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)
goto error_param; goto error_param;
} }
i40e_vsi_stop_rings(pf->vsi[vf->lan_vsi_idx]); /* Use the queue bit map sent by the VF */
if (i40e_ctrl_vf_tx_rings(pf->vsi[vf->lan_vsi_idx], vqs->tx_queues,
false)) {
aq_ret = I40E_ERR_TIMEOUT;
goto error_param;
}
if (i40e_ctrl_vf_rx_rings(pf->vsi[vf->lan_vsi_idx], vqs->rx_queues,
false)) {
aq_ret = I40E_ERR_TIMEOUT;
goto error_param;
}
error_param: error_param:
/* send the response to the VF */ /* send the response to the VF */
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_DISABLE_QUEUES, return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_DISABLE_QUEUES,
...@@ -3532,15 +3593,16 @@ static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg) ...@@ -3532,15 +3593,16 @@ static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg)
* i40e_vc_process_vf_msg * i40e_vc_process_vf_msg
* @pf: pointer to the PF structure * @pf: pointer to the PF structure
* @vf_id: source VF id * @vf_id: source VF id
* @v_opcode: operation code
* @v_retval: unused return value code
* @msg: pointer to the msg buffer * @msg: pointer to the msg buffer
* @msglen: msg length * @msglen: msg length
* @msghndl: msg handle
* *
* called from the common aeq/arq handler to * called from the common aeq/arq handler to
* process request from VF * process request from VF
**/ **/
int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode, int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,
u32 v_retval, u8 *msg, u16 msglen) u32 __always_unused v_retval, u8 *msg, u16 msglen)
{ {
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
int local_vf_id = vf_id - (s16)hw->func_caps.vf_base_id; int local_vf_id = vf_id - (s16)hw->func_caps.vf_base_id;
...@@ -3991,7 +4053,8 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id, ...@@ -3991,7 +4053,8 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
* i40e_ndo_set_vf_bw * i40e_ndo_set_vf_bw
* @netdev: network interface device structure * @netdev: network interface device structure
* @vf_id: VF identifier * @vf_id: VF identifier
* @tx_rate: Tx rate * @min_tx_rate: Minimum Tx rate
* @max_tx_rate: Maximum Tx rate
* *
* configure VF Tx rate * configure VF Tx rate
**/ **/
......
...@@ -1231,6 +1231,7 @@ i40e_status_code i40evf_aq_write_ddp(struct i40e_hw *hw, void *buff, ...@@ -1231,6 +1231,7 @@ i40e_status_code i40evf_aq_write_ddp(struct i40e_hw *hw, void *buff,
* @hw: pointer to the hw struct * @hw: pointer to the hw struct
* @buff: command buffer (size in bytes = buff_size) * @buff: command buffer (size in bytes = buff_size)
* @buff_size: buffer size in bytes * @buff_size: buffer size in bytes
* @flags: AdminQ command flags
* @cmd_details: pointer to command details structure or NULL * @cmd_details: pointer to command details structure or NULL
**/ **/
enum enum
......
...@@ -105,7 +105,7 @@ void i40evf_free_tx_resources(struct i40e_ring *tx_ring) ...@@ -105,7 +105,7 @@ void i40evf_free_tx_resources(struct i40e_ring *tx_ring)
/** /**
* i40evf_get_tx_pending - how many Tx descriptors not processed * i40evf_get_tx_pending - how many Tx descriptors not processed
* @tx_ring: the ring of descriptors * @ring: the ring of descriptors
* @in_sw: is tx_pending being checked in SW or HW * @in_sw: is tx_pending being checked in SW or HW
* *
* Since there is no access to the ring head register * Since there is no access to the ring head register
...@@ -1046,6 +1046,8 @@ static inline int i40e_ptype_to_htype(u8 ptype) ...@@ -1046,6 +1046,8 @@ static inline int i40e_ptype_to_htype(u8 ptype)
* i40e_rx_hash - set the hash value in the skb * i40e_rx_hash - set the hash value in the skb
* @ring: descriptor ring * @ring: descriptor ring
* @rx_desc: specific descriptor * @rx_desc: specific descriptor
* @skb: skb currently being received and modified
* @rx_ptype: Rx packet type
**/ **/
static inline void i40e_rx_hash(struct i40e_ring *ring, static inline void i40e_rx_hash(struct i40e_ring *ring,
union i40e_rx_desc *rx_desc, union i40e_rx_desc *rx_desc,
......
...@@ -1233,7 +1233,8 @@ struct i40e_hw_port_stats { ...@@ -1233,7 +1233,8 @@ struct i40e_hw_port_stats {
/* Checksum and Shadow RAM pointers */ /* Checksum and Shadow RAM pointers */
#define I40E_SR_NVM_CONTROL_WORD 0x00 #define I40E_SR_NVM_CONTROL_WORD 0x00
#define I40E_SR_EMP_MODULE_PTR 0x0F #define I40E_EMP_MODULE_PTR 0x0F
#define I40E_SR_EMP_MODULE_PTR 0x48
#define I40E_NVM_OEM_VER_OFF 0x83 #define I40E_NVM_OEM_VER_OFF 0x83
#define I40E_SR_NVM_DEV_STARTER_VERSION 0x18 #define I40E_SR_NVM_DEV_STARTER_VERSION 0x18
#define I40E_SR_NVM_WAKE_ON_LAN 0x19 #define I40E_SR_NVM_WAKE_ON_LAN 0x19
...@@ -1249,6 +1250,9 @@ struct i40e_hw_port_stats { ...@@ -1249,6 +1250,9 @@ struct i40e_hw_port_stats {
#define I40E_SR_PCIE_ALT_MODULE_MAX_SIZE 1024 #define I40E_SR_PCIE_ALT_MODULE_MAX_SIZE 1024
#define I40E_SR_CONTROL_WORD_1_SHIFT 0x06 #define I40E_SR_CONTROL_WORD_1_SHIFT 0x06
#define I40E_SR_CONTROL_WORD_1_MASK (0x03 << I40E_SR_CONTROL_WORD_1_SHIFT) #define I40E_SR_CONTROL_WORD_1_MASK (0x03 << I40E_SR_CONTROL_WORD_1_SHIFT)
#define I40E_SR_CONTROL_WORD_1_NVM_BANK_VALID BIT(5)
#define I40E_SR_NVM_MAP_STRUCTURE_TYPE BIT(12)
#define I40E_PTR_TYPE BIT(15)
/* Shadow RAM related */ /* Shadow RAM related */
#define I40E_SR_SECTOR_SIZE_IN_WORDS 0x800 #define I40E_SR_SECTOR_SIZE_IN_WORDS 0x800
...@@ -1362,6 +1366,10 @@ enum i40e_reset_type { ...@@ -1362,6 +1366,10 @@ enum i40e_reset_type {
I40E_RESET_EMPR = 3, I40E_RESET_EMPR = 3,
}; };
/* IEEE 802.1AB LLDP Agent Variables from NVM */
#define I40E_NVM_LLDP_CFG_PTR 0x06
#define I40E_SR_LLDP_CFG_PTR 0x31
/* RSS Hash Table Size */ /* RSS Hash Table Size */
#define I40E_PFQF_CTL_0_HASHLUTSIZE_512 0x00010000 #define I40E_PFQF_CTL_0_HASHLUTSIZE_512 0x00010000
......
...@@ -178,7 +178,6 @@ void i40evf_notify_client_close(struct i40e_vsi *vsi, bool reset) ...@@ -178,7 +178,6 @@ void i40evf_notify_client_close(struct i40e_vsi *vsi, bool reset)
/** /**
* i40evf_client_add_instance - add a client instance to the instance list * i40evf_client_add_instance - add a client instance to the instance list
* @adapter: pointer to the board struct * @adapter: pointer to the board struct
* @client: pointer to a client struct in the client list.
* *
* Returns cinst ptr on success, NULL on failure * Returns cinst ptr on success, NULL on failure
**/ **/
...@@ -236,7 +235,6 @@ i40evf_client_add_instance(struct i40evf_adapter *adapter) ...@@ -236,7 +235,6 @@ i40evf_client_add_instance(struct i40evf_adapter *adapter)
/** /**
* i40evf_client_del_instance - removes a client instance from the list * i40evf_client_del_instance - removes a client instance from the list
* @adapter: pointer to the board struct * @adapter: pointer to the board struct
* @client: pointer to the client struct
* *
**/ **/
static static
...@@ -440,7 +438,7 @@ static u32 i40evf_client_virtchnl_send(struct i40e_info *ldev, ...@@ -440,7 +438,7 @@ static u32 i40evf_client_virtchnl_send(struct i40e_info *ldev,
* i40evf_client_setup_qvlist - send a message to the PF to setup iwarp qv map * i40evf_client_setup_qvlist - send a message to the PF to setup iwarp qv map
* @ldev: pointer to L2 context. * @ldev: pointer to L2 context.
* @client: Client pointer. * @client: Client pointer.
* @qv_info: queue and vector list * @qvlist_info: queue and vector list
* *
* Return 0 on success or < 0 on error * Return 0 on success or < 0 on error
**/ **/
......
...@@ -202,7 +202,7 @@ static void i40evf_get_strings(struct net_device *netdev, u32 sset, u8 *data) ...@@ -202,7 +202,7 @@ static void i40evf_get_strings(struct net_device *netdev, u32 sset, u8 *data)
/** /**
* i40evf_get_priv_flags - report device private flags * i40evf_get_priv_flags - report device private flags
* @dev: network interface device structure * @netdev: network interface device structure
* *
* The get string set count and the string set should be matched for each * The get string set count and the string set should be matched for each
* flag returned. Add new strings for each flag to the i40e_gstrings_priv_flags * flag returned. Add new strings for each flag to the i40e_gstrings_priv_flags
...@@ -229,7 +229,7 @@ static u32 i40evf_get_priv_flags(struct net_device *netdev) ...@@ -229,7 +229,7 @@ static u32 i40evf_get_priv_flags(struct net_device *netdev)
/** /**
* i40evf_set_priv_flags - set private flags * i40evf_set_priv_flags - set private flags
* @dev: network interface device structure * @netdev: network interface device structure
* @flags: bit flags to be set * @flags: bit flags to be set
**/ **/
static int i40evf_set_priv_flags(struct net_device *netdev, u32 flags) static int i40evf_set_priv_flags(struct net_device *netdev, u32 flags)
...@@ -603,6 +603,7 @@ static int i40evf_set_per_queue_coalesce(struct net_device *netdev, ...@@ -603,6 +603,7 @@ static int i40evf_set_per_queue_coalesce(struct net_device *netdev,
* i40evf_get_rxnfc - command to get RX flow classification rules * i40evf_get_rxnfc - command to get RX flow classification rules
* @netdev: network interface device structure * @netdev: network interface device structure
* @cmd: ethtool rxnfc command * @cmd: ethtool rxnfc command
* @rule_locs: pointer to store rule locations
* *
* Returns Success if the command is supported. * Returns Success if the command is supported.
**/ **/
...@@ -722,6 +723,7 @@ static u32 i40evf_get_rxfh_indir_size(struct net_device *netdev) ...@@ -722,6 +723,7 @@ static u32 i40evf_get_rxfh_indir_size(struct net_device *netdev)
* @netdev: network interface device structure * @netdev: network interface device structure
* @indir: indirection table * @indir: indirection table
* @key: hash key * @key: hash key
* @hfunc: hash function in use
* *
* Reads the indirection table directly from the hardware. Always returns 0. * Reads the indirection table directly from the hardware. Always returns 0.
**/ **/
...@@ -750,6 +752,7 @@ static int i40evf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, ...@@ -750,6 +752,7 @@ static int i40evf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
* @netdev: network interface device structure * @netdev: network interface device structure
* @indir: indirection table * @indir: indirection table
* @key: hash key * @key: hash key
* @hfunc: hash function to use
* *
* Returns -EINVAL if the table specifies an inavlid queue id, otherwise * Returns -EINVAL if the table specifies an inavlid queue id, otherwise
* returns 0 after programming the table. * returns 0 after programming the table.
......
...@@ -449,6 +449,7 @@ static void i40evf_irq_affinity_release(struct kref *ref) {} ...@@ -449,6 +449,7 @@ static void i40evf_irq_affinity_release(struct kref *ref) {}
/** /**
* i40evf_request_traffic_irqs - Initialize MSI-X interrupts * i40evf_request_traffic_irqs - Initialize MSI-X interrupts
* @adapter: board private structure * @adapter: board private structure
* @basename: device basename
* *
* Allocates MSI-X vectors for tx and rx handling, and requests * Allocates MSI-X vectors for tx and rx handling, and requests
* interrupts from the kernel. * interrupts from the kernel.
...@@ -681,7 +682,7 @@ i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan) ...@@ -681,7 +682,7 @@ i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan)
f = i40evf_find_vlan(adapter, vlan); f = i40evf_find_vlan(adapter, vlan);
if (!f) { if (!f) {
f = kzalloc(sizeof(*f), GFP_ATOMIC); f = kzalloc(sizeof(*f), GFP_KERNEL);
if (!f) if (!f)
goto clearout; goto clearout;
...@@ -721,6 +722,7 @@ static void i40evf_del_vlan(struct i40evf_adapter *adapter, u16 vlan) ...@@ -721,6 +722,7 @@ static void i40evf_del_vlan(struct i40evf_adapter *adapter, u16 vlan)
/** /**
* i40evf_vlan_rx_add_vid - Add a VLAN filter to a device * i40evf_vlan_rx_add_vid - Add a VLAN filter to a device
* @netdev: network device struct * @netdev: network device struct
* @proto: unused protocol data
* @vid: VLAN tag * @vid: VLAN tag
**/ **/
static int i40evf_vlan_rx_add_vid(struct net_device *netdev, static int i40evf_vlan_rx_add_vid(struct net_device *netdev,
...@@ -738,6 +740,7 @@ static int i40evf_vlan_rx_add_vid(struct net_device *netdev, ...@@ -738,6 +740,7 @@ static int i40evf_vlan_rx_add_vid(struct net_device *netdev,
/** /**
* i40evf_vlan_rx_kill_vid - Remove a VLAN filter from a device * i40evf_vlan_rx_kill_vid - Remove a VLAN filter from a device
* @netdev: network device struct * @netdev: network device struct
* @proto: unused protocol data
* @vid: VLAN tag * @vid: VLAN tag
**/ **/
static int i40evf_vlan_rx_kill_vid(struct net_device *netdev, static int i40evf_vlan_rx_kill_vid(struct net_device *netdev,
...@@ -3136,7 +3139,7 @@ static int i40evf_set_features(struct net_device *netdev, ...@@ -3136,7 +3139,7 @@ static int i40evf_set_features(struct net_device *netdev,
/** /**
* i40evf_features_check - Validate encapsulated packet conforms to limits * i40evf_features_check - Validate encapsulated packet conforms to limits
* @skb: skb buff * @skb: skb buff
* @netdev: This physical port's netdev * @dev: This physical port's netdev
* @features: Offload features that the stack believes apply * @features: Offload features that the stack believes apply
**/ **/
static netdev_features_t i40evf_features_check(struct sk_buff *skb, static netdev_features_t i40evf_features_check(struct sk_buff *skb,
...@@ -3354,6 +3357,24 @@ int i40evf_process_config(struct i40evf_adapter *adapter) ...@@ -3354,6 +3357,24 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) if (vfres->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN)
netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
/* Do not turn on offloads when they are requested to be turned off.
* TSO needs minimum 576 bytes to work correctly.
*/
if (netdev->wanted_features) {
if (!(netdev->wanted_features & NETIF_F_TSO) ||
netdev->mtu < 576)
netdev->features &= ~NETIF_F_TSO;
if (!(netdev->wanted_features & NETIF_F_TSO6) ||
netdev->mtu < 576)
netdev->features &= ~NETIF_F_TSO6;
if (!(netdev->wanted_features & NETIF_F_TSO_ECN))
netdev->features &= ~NETIF_F_TSO_ECN;
if (!(netdev->wanted_features & NETIF_F_GRO))
netdev->features &= ~NETIF_F_GRO;
if (!(netdev->wanted_features & NETIF_F_GSO))
netdev->features &= ~NETIF_F_GSO;
}
adapter->vsi.id = adapter->vsi_res->vsi_id; adapter->vsi.id = adapter->vsi_res->vsi_id;
adapter->vsi.back = adapter; adapter->vsi.back = adapter;
......
...@@ -155,8 +155,7 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter) ...@@ -155,8 +155,7 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)
/** /**
* i40evf_get_vf_config * i40evf_get_vf_config
* @hw: pointer to the hardware structure * @adapter: private adapter structure
* @len: length of buffer
* *
* Get VF configuration from PF and populate hw structure. Must be called after * Get VF configuration from PF and populate hw structure. Must be called after
* admin queue is initialized. Busy waits until response is received from PF, * admin queue is initialized. Busy waits until response is received from PF,
...@@ -399,8 +398,6 @@ int i40evf_request_queues(struct i40evf_adapter *adapter, int num) ...@@ -399,8 +398,6 @@ int i40evf_request_queues(struct i40evf_adapter *adapter, int num)
/** /**
* i40evf_add_ether_addrs * i40evf_add_ether_addrs
* @adapter: adapter structure * @adapter: adapter structure
* @addrs: the MAC address filters to add (contiguous)
* @count: number of filters
* *
* Request that the PF add one or more addresses to our filters. * Request that the PF add one or more addresses to our filters.
**/ **/
...@@ -473,8 +470,6 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter) ...@@ -473,8 +470,6 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
/** /**
* i40evf_del_ether_addrs * i40evf_del_ether_addrs
* @adapter: adapter structure * @adapter: adapter structure
* @addrs: the MAC address filters to remove (contiguous)
* @count: number of filtes
* *
* Request that the PF remove one or more addresses from our filters. * Request that the PF remove one or more addresses from our filters.
**/ **/
...@@ -547,8 +542,6 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter) ...@@ -547,8 +542,6 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
/** /**
* i40evf_add_vlans * i40evf_add_vlans
* @adapter: adapter structure * @adapter: adapter structure
* @vlans: the VLANs to add
* @count: number of VLANs
* *
* Request that the PF add one or more VLAN filters to our VSI. * Request that the PF add one or more VLAN filters to our VSI.
**/ **/
...@@ -619,8 +612,6 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter) ...@@ -619,8 +612,6 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter)
/** /**
* i40evf_del_vlans * i40evf_del_vlans
* @adapter: adapter structure * @adapter: adapter structure
* @vlans: the VLANs to remove
* @count: number of VLANs
* *
* Request that the PF remove one or more VLAN filters from our VSI. * Request that the PF remove one or more VLAN filters from our VSI.
**/ **/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册