liquidio: do not reset Octeon if NIC firmware was preloaded
The PF driver is incorrectly resetting Octeon when the module parameter "fw_type=none" is there. "fw_type=none" means the PF should not load any firmware to the NIC because Octeon is already running preloaded firmware. Fix it by putting an if (fw_type != none) around the reset code. Because the Octeon reset is now conditionally gone, when unloading the driver, conditionally send the RESET_PF command to the firmware who will then free up PF-related data structures. Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com> Signed-off-by: Satanand Burla <satananda.burla@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
dddb64bcb3
commit
7cc61db9c7
@ -1380,6 +1380,12 @@ liquidio_probe(struct pci_dev *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool fw_type_is_none(void)
|
||||
{
|
||||
return strncmp(fw_type, LIO_FW_NAME_TYPE_NONE,
|
||||
sizeof(LIO_FW_NAME_TYPE_NONE)) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*\brief Destroy resources associated with octeon device
|
||||
* @param pdev PCI device structure
|
||||
@ -1522,9 +1528,12 @@ static void octeon_destroy_resources(struct octeon_device *oct)
|
||||
|
||||
/* fallthrough */
|
||||
case OCT_DEV_PCI_MAP_DONE:
|
||||
/* Soft reset the octeon device before exiting */
|
||||
if ((!OCTEON_CN23XX_PF(oct)) || !oct->octeon_id)
|
||||
oct->fn_list.soft_reset(oct);
|
||||
if (!fw_type_is_none()) {
|
||||
/* Soft reset the octeon device before exiting */
|
||||
if (!OCTEON_CN23XX_PF(oct) ||
|
||||
(OCTEON_CN23XX_PF(oct) && !oct->octeon_id))
|
||||
oct->fn_list.soft_reset(oct);
|
||||
}
|
||||
|
||||
octeon_unmap_pci_barx(oct, 0);
|
||||
octeon_unmap_pci_barx(oct, 1);
|
||||
@ -1657,6 +1666,15 @@ static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx)
|
||||
if (atomic_read(&lio->ifstate) & LIO_IFSTATE_RUNNING)
|
||||
liquidio_stop(netdev);
|
||||
|
||||
if (fw_type_is_none()) {
|
||||
struct octnic_ctrl_pkt nctrl;
|
||||
|
||||
memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
|
||||
nctrl.ncmd.s.cmd = OCTNET_CMD_RESET_PF;
|
||||
nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
|
||||
octnet_send_nic_ctrl_pkt(oct, &nctrl);
|
||||
}
|
||||
|
||||
if (oct->props[lio->ifidx].napi_enabled == 1) {
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
napi_disable(napi);
|
||||
@ -2142,8 +2160,7 @@ static int load_firmware(struct octeon_device *oct)
|
||||
char fw_name[LIO_MAX_FW_FILENAME_LEN];
|
||||
char *tmp_fw_type;
|
||||
|
||||
if (strncmp(fw_type, LIO_FW_NAME_TYPE_NONE,
|
||||
sizeof(LIO_FW_NAME_TYPE_NONE)) == 0) {
|
||||
if (fw_type_is_none()) {
|
||||
dev_info(&oct->pci_dev->dev, "Skipping firmware load\n");
|
||||
return ret;
|
||||
}
|
||||
@ -4479,14 +4496,16 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
||||
if (OCTEON_CN23XX_PF(octeon_dev)) {
|
||||
if (!cn23xx_fw_loaded(octeon_dev)) {
|
||||
fw_loaded = 0;
|
||||
/* Do a soft reset of the Octeon device. */
|
||||
if (octeon_dev->fn_list.soft_reset(octeon_dev))
|
||||
return 1;
|
||||
/* things might have changed */
|
||||
if (!cn23xx_fw_loaded(octeon_dev))
|
||||
fw_loaded = 0;
|
||||
else
|
||||
fw_loaded = 1;
|
||||
if (!fw_type_is_none()) {
|
||||
/* Do a soft reset of the Octeon device. */
|
||||
if (octeon_dev->fn_list.soft_reset(octeon_dev))
|
||||
return 1;
|
||||
/* things might have changed */
|
||||
if (!cn23xx_fw_loaded(octeon_dev))
|
||||
fw_loaded = 0;
|
||||
else
|
||||
fw_loaded = 1;
|
||||
}
|
||||
} else {
|
||||
fw_loaded = 1;
|
||||
}
|
||||
|
@ -186,6 +186,7 @@ static inline void add_sg_size(struct octeon_sg_entry *sg_entry,
|
||||
#define OCTNET_CMD_Q 0
|
||||
|
||||
/* NIC Command types */
|
||||
#define OCTNET_CMD_RESET_PF 0x0
|
||||
#define OCTNET_CMD_CHANGE_MTU 0x1
|
||||
#define OCTNET_CMD_CHANGE_MACADDR 0x2
|
||||
#define OCTNET_CMD_CHANGE_DEVFLAGS 0x3
|
||||
|
Loading…
Reference in New Issue
Block a user