Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7cc61db9 authored by Felix Manlunas's avatar Felix Manlunas Committed by David S. Miller
Browse files

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: default avatarFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dddb64bc
Loading
Loading
Loading
Loading
+32 −13
Original line number Diff line number Diff line
@@ -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:
		if (!fw_type_is_none()) {
			/* Soft reset the octeon device before exiting */
		if ((!OCTEON_CN23XX_PF(oct)) || !oct->octeon_id)
			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,6 +4496,7 @@ 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;
			if (!fw_type_is_none()) {
				/* Do a soft reset of the Octeon device. */
				if (octeon_dev->fn_list.soft_reset(octeon_dev))
					return 1;
@@ -4487,6 +4505,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
					fw_loaded = 0;
				else
					fw_loaded = 1;
			}
		} else {
			fw_loaded = 1;
		}
+1 −0
Original line number Diff line number Diff line
@@ -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