Commit 3b8f56ee authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch '100GbE-Intel-Wired-LAN-Driver-Updates-2020-10-07'

Tony Nguyen says:

====================
100GbE Intel Wired LAN Driver Updates 2020-10-07

This series contains updates to ice driver only.

Andy Shevchenko changes usage to %*phD format to print small buffer as hex
string.

Bruce removes repeated words reported by checkpatch.

Ani changes ice_info_get_dsn() to return void as it always returns
success.

Jake adds devlink reporting of fw.app.bundle_id. Moves devlink_port
structure to ice_vsi to resolve issues with cleanup. Adds additional
debug info for firmware updates.

Bixuan Cui resolves -Wpointer-to-int-cast warnings.

Dan adds additional packet type masks and checks to prevent overwriting
existing Flow Director rules.
====================
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 5d3b8ec9 051d2b5c
...@@ -69,6 +69,11 @@ The ``ice`` driver reports the following versions ...@@ -69,6 +69,11 @@ The ``ice`` driver reports the following versions
- The version of the DDP package that is active in the device. Note - The version of the DDP package that is active in the device. Note
that both the name (as reported by ``fw.app.name``) and version are that both the name (as reported by ``fw.app.name``) and version are
required to uniquely identify the package. required to uniquely identify the package.
* - ``fw.app.bundle_id``
- 0xc0000001
- Unique identifier for the DDP package loaded in the device. Also
referred to as the DDP Track ID. Can be used to uniquely identify
the specific DDP package.
* - ``fw.netlist`` * - ``fw.netlist``
- running - running
- 1.1.2000-6.7.0 - 1.1.2000-6.7.0
......
...@@ -284,6 +284,10 @@ struct ice_vsi { ...@@ -284,6 +284,10 @@ struct ice_vsi {
spinlock_t arfs_lock; /* protects aRFS hash table and filter state */ spinlock_t arfs_lock; /* protects aRFS hash table and filter state */
atomic_t *arfs_last_fltr_id; atomic_t *arfs_last_fltr_id;
/* devlink port data */
struct devlink_port devlink_port;
bool devlink_port_registered;
u16 max_frame; u16 max_frame;
u16 rx_buf_len; u16 rx_buf_len;
...@@ -375,9 +379,6 @@ enum ice_pf_flags { ...@@ -375,9 +379,6 @@ enum ice_pf_flags {
struct ice_pf { struct ice_pf {
struct pci_dev *pdev; struct pci_dev *pdev;
/* devlink port data */
struct devlink_port devlink_port;
struct devlink_region *nvm_region; struct devlink_region *nvm_region;
struct devlink_region *devcaps_region; struct devlink_region *devcaps_region;
......
...@@ -6,18 +6,14 @@ ...@@ -6,18 +6,14 @@
#include "ice_devlink.h" #include "ice_devlink.h"
#include "ice_fw_update.h" #include "ice_fw_update.h"
static int ice_info_get_dsn(struct ice_pf *pf, char *buf, size_t len) static void ice_info_get_dsn(struct ice_pf *pf, char *buf, size_t len)
{ {
u8 dsn[8]; u8 dsn[8];
/* Copy the DSN into an array in Big Endian format */ /* Copy the DSN into an array in Big Endian format */
put_unaligned_be64(pci_get_dsn(pf->pdev), dsn); put_unaligned_be64(pci_get_dsn(pf->pdev), dsn);
snprintf(buf, len, "%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x", snprintf(buf, len, "%8phD", dsn);
dsn[0], dsn[1], dsn[2], dsn[3],
dsn[4], dsn[5], dsn[6], dsn[7]);
return 0;
} }
static int ice_info_pba(struct ice_pf *pf, char *buf, size_t len) static int ice_info_pba(struct ice_pf *pf, char *buf, size_t len)
...@@ -106,6 +102,13 @@ static int ice_info_ddp_pkg_version(struct ice_pf *pf, char *buf, size_t len) ...@@ -106,6 +102,13 @@ static int ice_info_ddp_pkg_version(struct ice_pf *pf, char *buf, size_t len)
return 0; return 0;
} }
static int ice_info_ddp_pkg_bundle_id(struct ice_pf *pf, char *buf, size_t len)
{
snprintf(buf, len, "0x%08x", pf->hw.active_track_id);
return 0;
}
static int ice_info_netlist_ver(struct ice_pf *pf, char *buf, size_t len) static int ice_info_netlist_ver(struct ice_pf *pf, char *buf, size_t len)
{ {
struct ice_netlist_ver_info *netlist = &pf->hw.netlist_ver; struct ice_netlist_ver_info *netlist = &pf->hw.netlist_ver;
...@@ -150,6 +153,7 @@ static const struct ice_devlink_version { ...@@ -150,6 +153,7 @@ static const struct ice_devlink_version {
running(DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID, ice_info_eetrack), running(DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID, ice_info_eetrack),
running("fw.app.name", ice_info_ddp_pkg_name), running("fw.app.name", ice_info_ddp_pkg_name),
running(DEVLINK_INFO_VERSION_GENERIC_FW_APP, ice_info_ddp_pkg_version), running(DEVLINK_INFO_VERSION_GENERIC_FW_APP, ice_info_ddp_pkg_version),
running("fw.app.bundle_id", ice_info_ddp_pkg_bundle_id),
running("fw.netlist", ice_info_netlist_ver), running("fw.netlist", ice_info_netlist_ver),
running("fw.netlist.build", ice_info_netlist_build), running("fw.netlist.build", ice_info_netlist_build),
}; };
...@@ -180,11 +184,7 @@ static int ice_devlink_info_get(struct devlink *devlink, ...@@ -180,11 +184,7 @@ static int ice_devlink_info_get(struct devlink *devlink,
return err; return err;
} }
err = ice_info_get_dsn(pf, buf, sizeof(buf)); ice_info_get_dsn(pf, buf, sizeof(buf));
if (err) {
NL_SET_ERR_MSG_MOD(extack, "Unable to obtain serial number");
return err;
}
err = devlink_info_serial_number_put(req, buf); err = devlink_info_serial_number_put(req, buf);
if (err) { if (err) {
...@@ -283,6 +283,8 @@ ice_devlink_flash_update(struct devlink *devlink, ...@@ -283,6 +283,8 @@ ice_devlink_flash_update(struct devlink *devlink,
return err; return err;
} }
dev_dbg(dev, "Beginning flash update with file '%s'\n", params->file_name);
devlink_flash_update_begin_notify(devlink); devlink_flash_update_begin_notify(devlink);
devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0); devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0);
err = ice_flash_pldm_image(pf, fw, preservation, extack); err = ice_flash_pldm_image(pf, fw, preservation, extack);
...@@ -364,50 +366,60 @@ void ice_devlink_unregister(struct ice_pf *pf) ...@@ -364,50 +366,60 @@ void ice_devlink_unregister(struct ice_pf *pf)
} }
/** /**
* ice_devlink_create_port - Create a devlink port for this PF * ice_devlink_create_port - Create a devlink port for this VSI
* @pf: the PF to create a port for * @vsi: the VSI to create a port for
* *
* Create and register a devlink_port for this PF. Note that although each * Create and register a devlink_port for this VSI.
* physical function is connected to a separate devlink instance, the port
* will still be numbered according to the physical function ID.
* *
* Return: zero on success or an error code on failure. * Return: zero on success or an error code on failure.
*/ */
int ice_devlink_create_port(struct ice_pf *pf) int ice_devlink_create_port(struct ice_vsi *vsi)
{ {
struct devlink *devlink = priv_to_devlink(pf);
struct ice_vsi *vsi = ice_get_main_vsi(pf);
struct device *dev = ice_pf_to_dev(pf);
struct devlink_port_attrs attrs = {}; struct devlink_port_attrs attrs = {};
struct ice_port_info *pi;
struct devlink *devlink;
struct device *dev;
struct ice_pf *pf;
int err; int err;
if (!vsi) { /* Currently we only create devlink_port instances for PF VSIs */
dev_err(dev, "%s: unable to find main VSI\n", __func__); if (vsi->type != ICE_VSI_PF)
return -EIO; return -EINVAL;
}
pf = vsi->back;
devlink = priv_to_devlink(pf);
dev = ice_pf_to_dev(pf);
pi = pf->hw.port_info;
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
attrs.phys.port_number = pf->hw.pf_id; attrs.phys.port_number = pi->lport;
devlink_port_attrs_set(&pf->devlink_port, &attrs); devlink_port_attrs_set(&vsi->devlink_port, &attrs);
err = devlink_port_register(devlink, &pf->devlink_port, pf->hw.pf_id); err = devlink_port_register(devlink, &vsi->devlink_port, vsi->idx);
if (err) { if (err) {
dev_err(dev, "devlink_port_register failed: %d\n", err); dev_err(dev, "devlink_port_register failed: %d\n", err);
return err; return err;
} }
vsi->devlink_port_registered = true;
return 0; return 0;
} }
/** /**
* ice_devlink_destroy_port - Destroy the devlink_port for this PF * ice_devlink_destroy_port - Destroy the devlink_port for this VSI
* @pf: the PF to cleanup * @vsi: the VSI to cleanup
* *
* Unregisters the devlink_port structure associated with this PF. * Unregisters the devlink_port structure associated with this VSI.
*/ */
void ice_devlink_destroy_port(struct ice_pf *pf) void ice_devlink_destroy_port(struct ice_vsi *vsi)
{ {
devlink_port_type_clear(&pf->devlink_port); if (!vsi->devlink_port_registered)
devlink_port_unregister(&pf->devlink_port); return;
devlink_port_type_clear(&vsi->devlink_port);
devlink_port_unregister(&vsi->devlink_port);
vsi->devlink_port_registered = false;
} }
/** /**
......
...@@ -8,8 +8,8 @@ struct ice_pf *ice_allocate_pf(struct device *dev); ...@@ -8,8 +8,8 @@ struct ice_pf *ice_allocate_pf(struct device *dev);
int ice_devlink_register(struct ice_pf *pf); int ice_devlink_register(struct ice_pf *pf);
void ice_devlink_unregister(struct ice_pf *pf); void ice_devlink_unregister(struct ice_pf *pf);
int ice_devlink_create_port(struct ice_pf *pf); int ice_devlink_create_port(struct ice_vsi *vsi);
void ice_devlink_destroy_port(struct ice_pf *pf); void ice_devlink_destroy_port(struct ice_vsi *vsi);
void ice_devlink_init_regions(struct ice_pf *pf); void ice_devlink_init_regions(struct ice_pf *pf);
void ice_devlink_destroy_regions(struct ice_pf *pf); void ice_devlink_destroy_regions(struct ice_pf *pf);
......
...@@ -4876,7 +4876,7 @@ ice_rem_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl) ...@@ -4876,7 +4876,7 @@ ice_rem_prof_id_flow(struct ice_hw *hw, enum ice_block blk, u16 vsi, u64 hdl)
if (last_profile) { if (last_profile) {
/* If there are no profiles left for this VSIG, /* If there are no profiles left for this VSIG,
* then simply remove the the VSIG. * then simply remove the VSIG.
*/ */
status = ice_rem_vsig(hw, blk, vsig, &chg); status = ice_rem_vsig(hw, blk, vsig, &chg);
if (status) if (status)
......
...@@ -99,6 +99,54 @@ static const u32 ice_ptypes_ipv6_il[] = { ...@@ -99,6 +99,54 @@ static const u32 ice_ptypes_ipv6_il[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
}; };
/* Packet types for packets with an Outer/First/Single IPv4 header - no L4 */
static const u32 ice_ipv4_ofos_no_l4[] = {
0x10C00000, 0x04000800, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
/* Packet types for packets with an Innermost/Last IPv4 header - no L4 */
static const u32 ice_ipv4_il_no_l4[] = {
0x60000000, 0x18043008, 0x80000002, 0x6010c021,
0x00000008, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
/* Packet types for packets with an Outer/First/Single IPv6 header - no L4 */
static const u32 ice_ipv6_ofos_no_l4[] = {
0x00000000, 0x00000000, 0x43000000, 0x10002000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
/* Packet types for packets with an Innermost/Last IPv6 header - no L4 */
static const u32 ice_ipv6_il_no_l4[] = {
0x00000000, 0x02180430, 0x0000010c, 0x086010c0,
0x00000430, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
/* UDP Packet types for non-tunneled packets or tunneled /* UDP Packet types for non-tunneled packets or tunneled
* packets with inner UDP. * packets with inner UDP.
*/ */
...@@ -250,11 +298,23 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params) ...@@ -250,11 +298,23 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params)
hdrs = prof->segs[i].hdrs; hdrs = prof->segs[i].hdrs;
if (hdrs & ICE_FLOW_SEG_HDR_IPV4) { if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) &&
!(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK)) {
src = !i ? (const unsigned long *)ice_ipv4_ofos_no_l4 :
(const unsigned long *)ice_ipv4_il_no_l4;
bitmap_and(params->ptypes, params->ptypes, src,
ICE_FLOW_PTYPE_MAX);
} else if (hdrs & ICE_FLOW_SEG_HDR_IPV4) {
src = !i ? (const unsigned long *)ice_ptypes_ipv4_ofos : src = !i ? (const unsigned long *)ice_ptypes_ipv4_ofos :
(const unsigned long *)ice_ptypes_ipv4_il; (const unsigned long *)ice_ptypes_ipv4_il;
bitmap_and(params->ptypes, params->ptypes, src, bitmap_and(params->ptypes, params->ptypes, src,
ICE_FLOW_PTYPE_MAX); ICE_FLOW_PTYPE_MAX);
} else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) &&
!(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK)) {
src = !i ? (const unsigned long *)ice_ipv6_ofos_no_l4 :
(const unsigned long *)ice_ipv6_il_no_l4;
bitmap_and(params->ptypes, params->ptypes, src,
ICE_FLOW_PTYPE_MAX);
} else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) { } else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) {
src = !i ? (const unsigned long *)ice_ptypes_ipv6_ofos : src = !i ? (const unsigned long *)ice_ptypes_ipv6_ofos :
(const unsigned long *)ice_ptypes_ipv6_il; (const unsigned long *)ice_ptypes_ipv6_il;
...@@ -385,7 +445,7 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, ...@@ -385,7 +445,7 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params,
* ice_flow_xtract_raws - Create extract sequence entries for raw bytes * ice_flow_xtract_raws - Create extract sequence entries for raw bytes
* @hw: pointer to the HW struct * @hw: pointer to the HW struct
* @params: information about the flow to be processed * @params: information about the flow to be processed
* @seg: index of packet segment whose raw fields are to be be extracted * @seg: index of packet segment whose raw fields are to be extracted
*/ */
static enum ice_status static enum ice_status
ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params, ice_flow_xtract_raws(struct ice_hw *hw, struct ice_flow_prof_params *params,
...@@ -999,7 +1059,7 @@ enum ice_status ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, ...@@ -999,7 +1059,7 @@ enum ice_status ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk,
* *
* This helper function stores information of a field being matched, including * This helper function stores information of a field being matched, including
* the type of the field and the locations of the value to match, the mask, and * the type of the field and the locations of the value to match, the mask, and
* and the upper-bound value in the start of the input buffer for a flow entry. * the upper-bound value in the start of the input buffer for a flow entry.
* This function should only be used for fixed-size data structures. * This function should only be used for fixed-size data structures.
* *
* This function also opportunistically determines the protocol headers to be * This function also opportunistically determines the protocol headers to be
......
...@@ -194,8 +194,8 @@ struct ice_flow_entry { ...@@ -194,8 +194,8 @@ struct ice_flow_entry {
u16 entry_sz; u16 entry_sz;
}; };
#define ICE_FLOW_ENTRY_HNDL(e) ((u64)e) #define ICE_FLOW_ENTRY_HNDL(e) ((u64)(uintptr_t)e)
#define ICE_FLOW_ENTRY_PTR(h) ((struct ice_flow_entry *)(h)) #define ICE_FLOW_ENTRY_PTR(h) ((struct ice_flow_entry *)(uintptr_t)(h))
struct ice_flow_prof { struct ice_flow_prof {
struct list_head l_entry; struct list_head l_entry;
......
...@@ -43,6 +43,8 @@ ice_send_package_data(struct pldmfw *context, const u8 *data, u16 length) ...@@ -43,6 +43,8 @@ ice_send_package_data(struct pldmfw *context, const u8 *data, u16 length)
enum ice_status status; enum ice_status status;
u8 *package_data; u8 *package_data;
dev_dbg(dev, "Sending PLDM record package data to firmware\n");
package_data = kmemdup(data, length, GFP_KERNEL); package_data = kmemdup(data, length, GFP_KERNEL);
if (!package_data) if (!package_data)
return -ENOMEM; return -ENOMEM;
...@@ -229,6 +231,8 @@ ice_send_component_table(struct pldmfw *context, struct pldmfw_component *compon ...@@ -229,6 +231,8 @@ ice_send_component_table(struct pldmfw *context, struct pldmfw_component *compon
comp_tbl->cvs_len = component->version_len; comp_tbl->cvs_len = component->version_len;
memcpy(comp_tbl->cvs, component->version_string, component->version_len); memcpy(comp_tbl->cvs, component->version_string, component->version_len);
dev_dbg(dev, "Sending component table to firmware:\n");
status = ice_nvm_pass_component_tbl(hw, (u8 *)comp_tbl, length, status = ice_nvm_pass_component_tbl(hw, (u8 *)comp_tbl, length,
transfer_flag, &comp_response, transfer_flag, &comp_response,
&comp_response_code, NULL); &comp_response_code, NULL);
...@@ -279,11 +283,14 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset, ...@@ -279,11 +283,14 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset,
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
dev_dbg(dev, "Writing block of %u bytes for module 0x%02x at offset %u\n",
block_size, module, offset);
status = ice_aq_update_nvm(hw, module, offset, block_size, block, status = ice_aq_update_nvm(hw, module, offset, block_size, block,
last_cmd, 0, NULL); last_cmd, 0, NULL);
if (status) { if (status) {
dev_err(dev, "Failed to program flash module 0x%02x at offset %u, err %s aq_err %s\n", dev_err(dev, "Failed to flash module 0x%02x with block of size %u at offset %u, err %s aq_err %s\n",
module, offset, ice_stat_str(status), module, block_size, offset, ice_stat_str(status),
ice_aq_str(hw->adminq.sq_last_status)); ice_aq_str(hw->adminq.sq_last_status));
NL_SET_ERR_MSG_MOD(extack, "Failed to program flash module"); NL_SET_ERR_MSG_MOD(extack, "Failed to program flash module");
return -EIO; return -EIO;
...@@ -297,8 +304,8 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset, ...@@ -297,8 +304,8 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset,
*/ */
err = ice_aq_wait_for_event(pf, ice_aqc_opc_nvm_write, 15 * HZ, &event); err = ice_aq_wait_for_event(pf, ice_aqc_opc_nvm_write, 15 * HZ, &event);
if (err) { if (err) {
dev_err(dev, "Timed out waiting for firmware write completion for module 0x%02x, err %d\n", dev_err(dev, "Timed out while trying to flash module 0x%02x with block of size %u at offset %u, err %d\n",
module, err); module, block_size, offset, err);
NL_SET_ERR_MSG_MOD(extack, "Timed out waiting for firmware"); NL_SET_ERR_MSG_MOD(extack, "Timed out waiting for firmware");
return -EIO; return -EIO;
} }
...@@ -324,8 +331,8 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset, ...@@ -324,8 +331,8 @@ ice_write_one_nvm_block(struct ice_pf *pf, u16 module, u32 offset,
} }
if (completion_retval) { if (completion_retval) {
dev_err(dev, "Firmware failed to program flash module 0x%02x at offset %u, completion err %s\n", dev_err(dev, "Firmware failed to flash module 0x%02x with block of size %u at offset %u, err %s\n",
module, offset, module, block_size, offset,
ice_aq_str((enum ice_aq_err)completion_retval)); ice_aq_str((enum ice_aq_err)completion_retval));
NL_SET_ERR_MSG_MOD(extack, "Firmware failed to program flash module"); NL_SET_ERR_MSG_MOD(extack, "Firmware failed to program flash module");
return -EIO; return -EIO;
...@@ -356,12 +363,15 @@ ice_write_nvm_module(struct ice_pf *pf, u16 module, const char *component, ...@@ -356,12 +363,15 @@ ice_write_nvm_module(struct ice_pf *pf, u16 module, const char *component,
const u8 *image, u32 length, const u8 *image, u32 length,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct device *dev = ice_pf_to_dev(pf);
struct devlink *devlink; struct devlink *devlink;
u32 offset = 0; u32 offset = 0;
bool last_cmd; bool last_cmd;
u8 *block; u8 *block;
int err; int err;
dev_dbg(dev, "Beginning write of flash component '%s', module 0x%02x\n", component, module);
devlink = priv_to_devlink(pf); devlink = priv_to_devlink(pf);
devlink_flash_update_status_notify(devlink, "Flashing", devlink_flash_update_status_notify(devlink, "Flashing",
...@@ -394,6 +404,8 @@ ice_write_nvm_module(struct ice_pf *pf, u16 module, const char *component, ...@@ -394,6 +404,8 @@ ice_write_nvm_module(struct ice_pf *pf, u16 module, const char *component,
component, offset, length); component, offset, length);
} while (!last_cmd); } while (!last_cmd);
dev_dbg(dev, "Completed write of flash component '%s', module 0x%02x\n", component, module);
if (err) if (err)
devlink_flash_update_status_notify(devlink, "Flashing failed", devlink_flash_update_status_notify(devlink, "Flashing failed",
component, length, length); component, length, length);
...@@ -431,6 +443,8 @@ ice_erase_nvm_module(struct ice_pf *pf, u16 module, const char *component, ...@@ -431,6 +443,8 @@ ice_erase_nvm_module(struct ice_pf *pf, u16 module, const char *component,
enum ice_status status; enum ice_status status;
int err; int err;
dev_dbg(dev, "Beginning erase of flash component '%s', module 0x%02x\n", component, module);
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
devlink = priv_to_devlink(pf); devlink = priv_to_devlink(pf);
...@@ -476,6 +490,8 @@ ice_erase_nvm_module(struct ice_pf *pf, u16 module, const char *component, ...@@ -476,6 +490,8 @@ ice_erase_nvm_module(struct ice_pf *pf, u16 module, const char *component,
goto out_notify_devlink; goto out_notify_devlink;
} }
dev_dbg(dev, "Completed erase of flash component '%s', module 0x%02x\n", component, module);
out_notify_devlink: out_notify_devlink:
if (err) if (err)
devlink_flash_update_status_notify(devlink, "Erasing failed", devlink_flash_update_status_notify(devlink, "Erasing failed",
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "ice_lib.h" #include "ice_lib.h"
#include "ice_fltr.h" #include "ice_fltr.h"
#include "ice_dcb_lib.h" #include "ice_dcb_lib.h"
#include "ice_devlink.h"
/** /**
* ice_vsi_type_str - maps VSI type enum to string equivalents * ice_vsi_type_str - maps VSI type enum to string equivalents
...@@ -2616,8 +2617,10 @@ int ice_vsi_release(struct ice_vsi *vsi) ...@@ -2616,8 +2617,10 @@ int ice_vsi_release(struct ice_vsi *vsi)
* PF that is running the work queue items currently. This is done to * PF that is running the work queue items currently. This is done to
* avoid check_flush_dependency() warning on this wq * avoid check_flush_dependency() warning on this wq
*/ */
if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) {
unregister_netdev(vsi->netdev); unregister_netdev(vsi->netdev);
ice_devlink_destroy_port(vsi);
}
if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) if (test_bit(ICE_FLAG_RSS_ENA, pf->flags))
ice_rss_clean(vsi); ice_rss_clean(vsi);
......
...@@ -1056,7 +1056,9 @@ struct ice_aq_task { ...@@ -1056,7 +1056,9 @@ struct ice_aq_task {
int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout, int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout,
struct ice_rq_event_info *event) struct ice_rq_event_info *event)
{ {
struct device *dev = ice_pf_to_dev(pf);
struct ice_aq_task *task; struct ice_aq_task *task;
unsigned long start;
long ret; long ret;
int err; int err;
...@@ -1073,6 +1075,8 @@ int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout, ...@@ -1073,6 +1075,8 @@ int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout,
hlist_add_head(&task->entry, &pf->aq_wait_list); hlist_add_head(&task->entry, &pf->aq_wait_list);
spin_unlock_bh(&pf->aq_wait_lock); spin_unlock_bh(&pf->aq_wait_lock);
start = jiffies;
ret = wait_event_interruptible_timeout(pf->aq_wait_queue, task->state, ret = wait_event_interruptible_timeout(pf->aq_wait_queue, task->state,
timeout); timeout);
switch (task->state) { switch (task->state) {
...@@ -1091,6 +1095,11 @@ int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout, ...@@ -1091,6 +1095,11 @@ int ice_aq_wait_for_event(struct ice_pf *pf, u16 opcode, unsigned long timeout,
break; break;
} }
dev_dbg(dev, "Waited %u msecs (max %u msecs) for firmware response to op 0x%04x\n",
jiffies_to_msecs(jiffies - start),
jiffies_to_msecs(timeout),
opcode);
spin_lock_bh(&pf->aq_wait_lock); spin_lock_bh(&pf->aq_wait_lock);
hlist_del(&task->entry); hlist_del(&task->entry);
spin_unlock_bh(&pf->aq_wait_lock); spin_unlock_bh(&pf->aq_wait_lock);
...@@ -2416,7 +2425,7 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi) ...@@ -2416,7 +2425,7 @@ int ice_destroy_xdp_rings(struct ice_vsi *vsi)
int i, v_idx; int i, v_idx;
/* q_vectors are freed in reset path so there's no point in detaching /* q_vectors are freed in reset path so there's no point in detaching
* rings; in case of rebuild being triggered not from reset reset bits * rings; in case of rebuild being triggered not from reset bits
* in pf->state won't be set, so additionally check first q_vector * in pf->state won't be set, so additionally check first q_vector
* against NULL * against NULL
*/ */
...@@ -2953,7 +2962,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi) ...@@ -2953,7 +2962,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
int err; int err;
err = ice_devlink_create_port(pf); err = ice_devlink_create_port(vsi);
if (err) if (err)
return err; return err;
...@@ -2994,7 +3003,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi) ...@@ -2994,7 +3003,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
if (err) if (err)
goto err_free_netdev; goto err_free_netdev;
devlink_port_type_eth_set(&pf->devlink_port, vsi->netdev); devlink_port_type_eth_set(&vsi->devlink_port, vsi->netdev);
netif_carrier_off(vsi->netdev); netif_carrier_off(vsi->netdev);
...@@ -3007,7 +3016,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi) ...@@ -3007,7 +3016,7 @@ static int ice_cfg_netdev(struct ice_vsi *vsi)
free_netdev(vsi->netdev); free_netdev(vsi->netdev);
vsi->netdev = NULL; vsi->netdev = NULL;
err_destroy_devlink_port: err_destroy_devlink_port:
ice_devlink_destroy_port(pf); ice_devlink_destroy_port(vsi);
return err; return err;
} }
...@@ -4242,7 +4251,6 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent) ...@@ -4242,7 +4251,6 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
err_send_version_unroll: err_send_version_unroll:
ice_vsi_release_all(pf); ice_vsi_release_all(pf);
err_alloc_sw_unroll: err_alloc_sw_unroll:
ice_devlink_destroy_port(pf);
set_bit(__ICE_SERVICE_DIS, pf->state); set_bit(__ICE_SERVICE_DIS, pf->state);
set_bit(__ICE_DOWN, pf->state); set_bit(__ICE_DOWN, pf->state);
devm_kfree(dev, pf->first_sw); devm_kfree(dev, pf->first_sw);
...@@ -4357,7 +4365,6 @@ static void ice_remove(struct pci_dev *pdev) ...@@ -4357,7 +4365,6 @@ static void ice_remove(struct pci_dev *pdev)
if (!ice_is_safe_mode(pf)) if (!ice_is_safe_mode(pf))
ice_remove_arfs(pf); ice_remove_arfs(pf);
ice_setup_mc_magic_wake(pf); ice_setup_mc_magic_wake(pf);
ice_devlink_destroy_port(pf);
ice_vsi_release_all(pf); ice_vsi_release_all(pf);
ice_set_wake(pf); ice_set_wake(pf);
ice_free_irq_msix_misc(pf); ice_free_irq_msix_misc(pf);
......
...@@ -871,7 +871,7 @@ static int ice_get_max_valid_res_idx(struct ice_res_tracker *res) ...@@ -871,7 +871,7 @@ static int ice_get_max_valid_res_idx(struct ice_res_tracker *res)
* If there are not enough resources available, return an error. This should * If there are not enough resources available, return an error. This should
* always be caught by ice_set_per_vf_res(). * always be caught by ice_set_per_vf_res().
* *
* Return 0 on success, and -EINVAL when there are not enough MSIX vectors in * Return 0 on success, and -EINVAL when there are not enough MSIX vectors
* in the PF's space available for SR-IOV. * in the PF's space available for SR-IOV.
*/ */
static int ice_sriov_set_msix_res(struct ice_pf *pf, u16 num_msix_needed) static int ice_sriov_set_msix_res(struct ice_pf *pf, u16 num_msix_needed)
......
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