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: Yuval Mintz <Yuval.Mintz@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
75d67207bf
commit
05fafbfb3d
@@ -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
|
||||
|
@@ -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);
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -500,6 +500,4 @@ int __qed_configure_pf_min_bandwidth(struct qed_hwfn *p_hwfn,
|
||||
struct qed_mcp_link_state *p_link,
|
||||
u8 min_bw);
|
||||
|
||||
int qed_hw_init_first_eth(struct qed_hwfn *p_hwfn,
|
||||
struct qed_ptt *p_ptt, u8 *p_pf);
|
||||
#endif
|
||||
|
@@ -116,8 +116,14 @@
|
||||
0x1009c4UL
|
||||
#define QM_REG_PF_EN \
|
||||
0x2f2ea4UL
|
||||
#define TCFC_REG_WEAK_ENABLE_VF \
|
||||
0x2d0704UL
|
||||
#define TCFC_REG_STRONG_ENABLE_PF \
|
||||
0x2d0708UL
|
||||
#define TCFC_REG_STRONG_ENABLE_VF \
|
||||
0x2d070cUL
|
||||
#define CCFC_REG_WEAK_ENABLE_VF \
|
||||
0x2e0704UL
|
||||
#define CCFC_REG_STRONG_ENABLE_PF \
|
||||
0x2e0708UL
|
||||
#define PGLUE_B_REG_PGL_ADDR_88_F0 \
|
||||
|
@@ -1280,6 +1280,13 @@ static void qed_iov_vf_mbx_acquire(struct qed_hwfn *p_hwfn,
|
||||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
|
||||
/* Write the PF version so that VF would know which version
|
||||
* is supported - might be later overriden. This guarantees that
|
||||
* VF could recognize legacy PF based on lack of versions in reply.
|
||||
*/
|
||||
pfdev_info->major_fp_hsi = ETH_HSI_VER_MAJOR;
|
||||
pfdev_info->minor_fp_hsi = ETH_HSI_VER_MINOR;
|
||||
|
||||
/* Validate FW compatibility */
|
||||
if (req->vfdev_info.eth_fp_hsi_major != ETH_HSI_VER_MAJOR) {
|
||||
DP_INFO(p_hwfn,
|
||||
@@ -1289,12 +1296,6 @@ static void qed_iov_vf_mbx_acquire(struct qed_hwfn *p_hwfn,
|
||||
req->vfdev_info.eth_fp_hsi_minor,
|
||||
ETH_HSI_VER_MAJOR, ETH_HSI_VER_MINOR);
|
||||
|
||||
/* Write the PF version so that VF would know which version
|
||||
* is supported.
|
||||
*/
|
||||
pfdev_info->major_fp_hsi = ETH_HSI_VER_MAJOR;
|
||||
pfdev_info->minor_fp_hsi = ETH_HSI_VER_MINOR;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@@ -25,7 +25,7 @@
|
||||
|
||||
#define QEDE_MAJOR_VERSION 8
|
||||
#define QEDE_MINOR_VERSION 10
|
||||
#define QEDE_REVISION_VERSION 1
|
||||
#define QEDE_REVISION_VERSION 9
|
||||
#define QEDE_ENGINEERING_VERSION 20
|
||||
#define DRV_MODULE_VERSION __stringify(QEDE_MAJOR_VERSION) "." \
|
||||
__stringify(QEDE_MINOR_VERSION) "." \
|
||||
|
Reference in New Issue
Block a user