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

Commit 05fafbfb authored by Yuval Mintz's avatar Yuval Mintz Committed by David S. Miller
Browse files

qed: utilize FW 8.10.10.0



This new firmware for the qed* adpaters fixes several issues:
 - Better blocking of malicious VFs.
 - After FLR, Tx-switching [internal routing] of packets might
   be incorrect.
 - Deletion of unicast MAC filters would sometime have side-effect
   of corrupting the MAC filters configred for a device.
It also contains fixes for future qed* drivers that *hopefully* would be
sent for review in the near future.

In addition, it would allow driver some new functionality, including:
 - Allowing PF/VF driver compaitibility with old drivers [running
   pre-8.10.5.0 firmware].
 - Better debug facilities.

This would also bump the qed* driver versions to 8.10.9.20.

Signed-off-by: default avatarYuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 75d67207
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
#include "qed_hsi.h"

extern const struct qed_common_ops qed_common_ops_pass;
#define DRV_MODULE_VERSION "8.7.1.20"
#define DRV_MODULE_VERSION "8.10.9.20"

#define MAX_HWFNS_PER_DEVICE    (4)
#define NAME_SIZE 16
+5 −43
Original line number Diff line number Diff line
@@ -772,6 +772,9 @@ static int qed_hw_init_common(struct qed_hwfn *p_hwfn,
		concrete_fid = qed_vfid_to_concrete(p_hwfn, vf_id);
		qed_fid_pretend(p_hwfn, p_ptt, (u16) concrete_fid);
		qed_wr(p_hwfn, p_ptt, CCFC_REG_STRONG_ENABLE_VF, 0x1);
		qed_wr(p_hwfn, p_ptt, CCFC_REG_WEAK_ENABLE_VF, 0x0);
		qed_wr(p_hwfn, p_ptt, TCFC_REG_STRONG_ENABLE_VF, 0x1);
		qed_wr(p_hwfn, p_ptt, TCFC_REG_WEAK_ENABLE_VF, 0x0);
	}
	/* pretend to original PF */
	qed_fid_pretend(p_hwfn, p_ptt, p_hwfn->rel_pf_id);
@@ -782,34 +785,8 @@ static int qed_hw_init_common(struct qed_hwfn *p_hwfn,
static int qed_hw_init_port(struct qed_hwfn *p_hwfn,
			    struct qed_ptt *p_ptt, int hw_mode)
{
	int rc = 0;

	rc = qed_init_run(p_hwfn, p_ptt, PHASE_PORT, p_hwfn->port_id, hw_mode);
	if (rc)
		return rc;

	if (hw_mode & (1 << MODE_MF_SI)) {
		u8 pf_id = 0;

		if (!qed_hw_init_first_eth(p_hwfn, p_ptt, &pf_id)) {
			DP_VERBOSE(p_hwfn, NETIF_MSG_IFUP,
				   "PF[%08x] is first eth on engine\n", pf_id);

			/* We should have configured BIT for ppfid, i.e., the
			 * relative function number in the port. But there's a
			 * bug in LLH in BB where the ppfid is actually engine
			 * based, so we need to take this into account.
			 */
			qed_wr(p_hwfn, p_ptt,
			       NIG_REG_LLH_TAGMAC_DEF_PF_VECTOR, 1 << pf_id);
		}

		/* Take the protocol-based hit vector if there is a hit,
		 * otherwise take the other vector.
		 */
		qed_wr(p_hwfn, p_ptt, NIG_REG_LLH_CLS_TYPE_DUALMODE, 0x2);
	}
	return rc;
	return qed_init_run(p_hwfn, p_ptt, PHASE_PORT,
			    p_hwfn->port_id, hw_mode);
}

static int qed_hw_init_pf(struct qed_hwfn *p_hwfn,
@@ -878,21 +855,6 @@ static int qed_hw_init_pf(struct qed_hwfn *p_hwfn,
	/* Pure runtime initializations - directly to the HW  */
	qed_int_igu_init_pure_rt(p_hwfn, p_ptt, true, true);

	if (hw_mode & (1 << MODE_MF_SI)) {
		u8 pf_id = 0;
		u32 val = 0;

		if (!qed_hw_init_first_eth(p_hwfn, p_ptt, &pf_id)) {
			if (p_hwfn->rel_pf_id == pf_id) {
				DP_VERBOSE(p_hwfn, NETIF_MSG_IFUP,
					   "PF[%d] is first ETH on engine\n",
					   pf_id);
				val = 1;
			}
			qed_wr(p_hwfn, p_ptt, PRS_REG_MSG_INFO, val);
		}
	}

	if (b_hw_start) {
		/* enable interrupts */
		qed_int_igu_enable(p_hwfn, p_ptt, int_mode);
+912 −512

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -534,7 +534,7 @@ int qed_init_fw_data(struct qed_dev *cdev, const u8 *data)
	/* First Dword contains metadata and should be skipped */
	buf_hdr = (struct bin_buffer_hdr *)(data + sizeof(u32));

	offset = buf_hdr[BIN_BUF_FW_VER_INFO].offset;
	offset = buf_hdr[BIN_BUF_INIT_FW_VER_INFO].offset;
	fw->fw_ver_info = (struct fw_ver_info *)(data + offset);

	offset = buf_hdr[BIN_BUF_INIT_CMD].offset;
+0 −28
Original line number Diff line number Diff line
@@ -802,34 +802,6 @@ static u32 qed_mcp_get_shmem_func(struct qed_hwfn *p_hwfn,
	return size;
}

int qed_hw_init_first_eth(struct qed_hwfn *p_hwfn,
			  struct qed_ptt *p_ptt, u8 *p_pf)
{
	struct public_func shmem_info;
	int i;

	/* Find first Ethernet interface in port */
	for (i = 0; i < NUM_OF_ENG_PFS(p_hwfn->cdev);
	     i += p_hwfn->cdev->num_ports_in_engines) {
		qed_mcp_get_shmem_func(p_hwfn, p_ptt, &shmem_info,
				       MCP_PF_ID_BY_REL(p_hwfn, i));

		if (shmem_info.config & FUNC_MF_CFG_FUNC_HIDE)
			continue;

		if ((shmem_info.config & FUNC_MF_CFG_PROTOCOL_MASK) ==
		    FUNC_MF_CFG_PROTOCOL_ETHERNET) {
			*p_pf = (u8)i;
			return 0;
		}
	}

	DP_NOTICE(p_hwfn,
		  "Failed to find on port an ethernet interface in MF_SI mode\n");

	return -EINVAL;
}

static void qed_mcp_update_bw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
{
	struct qed_mcp_function_info *p_info;
Loading