From a22735e628c1944457d6fa9f6f4fce310da88883 Mon Sep 17 00:00:00 2001 From: Selvin Xavier Date: Thu, 2 Nov 2017 02:33:36 -0700 Subject: [PATCH] bnxt_en: BZ 2649 Enabling DCB parameter for bnxt_en Enabling CONFIG_BNXT_DCB for adding Host based DCB support. Also including the latest patches related to DCB support. Signed-off-by: Selvin Xavier --- configure | 18 + ...ck-if-firmware-LLDP-agent-is-running.patch | 59 ++ ...e-firmware-interface-spec-to-1.7.6.2.patch | 541 ++++++++++++++++++ ...ss-DCB-RoCE-app-priority-to-firmware.patch | 183 ++++++ ...e-FW_LLDP_AGENT-flag-before-allowing.patch | 32 ++ ...t_dcb_init-after-getting-firmware-DC.patch | 41 ++ ...atus-of-firmware-DCBX-agent-before-s.patch | 35 ++ ...llback-to-inform-RDMA-driver-during-.patch | 82 +++ ...-min_bw-parameter-for-older-firmware.patch | 47 ++ ...19-bnxt_en-Add-define-for-ETH_P_IBOE.patch | 27 + 10 files changed, 1065 insertions(+) create mode 100644 linux-next-cherry-picks/0064-bnxt_en-Check-if-firmware-LLDP-agent-is-running.patch create mode 100644 linux-next-cherry-picks/0065-bnxt_en-Update-firmware-interface-spec-to-1.7.6.2.patch create mode 100644 linux-next-cherry-picks/0066-bnxt_en-Pass-DCB-RoCE-app-priority-to-firmware.patch create mode 100644 linux-next-cherry-picks/0067-bnxt_en-Check-the-FW_LLDP_AGENT-flag-before-allowing.patch create mode 100644 linux-next-cherry-picks/0068-bnxt_en-Call-bnxt_dcb_init-after-getting-firmware-DC.patch create mode 100644 linux-next-cherry-picks/0069-bnxt_en-Check-status-of-firmware-DCBX-agent-before-s.patch create mode 100644 linux-next-cherry-picks/0070-bnxt_en-Add-a-callback-to-inform-RDMA-driver-during-.patch create mode 100644 linux-next-cherry-picks/0071-bnxt_en-Set-ETS-min_bw-parameter-for-older-firmware.patch create mode 100644 patches/0019-bnxt_en-Add-define-for-ETH_P_IBOE.patch diff --git a/configure b/configure index f6b8fc3..5913119 100755 --- a/configure +++ b/configure @@ -729,6 +729,7 @@ main() ;; --with-bnxt_en-mod) CONFIG_BNXT="m" + CONFIG_BNXT_DCB="y" ;; --without-bnxt_en-mod) CONFIG_BNXT= @@ -924,6 +925,7 @@ CONFIG_INFINIBAND_OCRDMA=${CONFIG_INFINIBAND_OCRDMA:-''} CONFIG_BE2NET=${CONFIG_BE2NET:-''} CONFIG_INFINIBAND_BNXT_RE=${CONFIG_INFINIBAND_BNXT_RE:-''} CONFIG_BNXT=${CONFIG_BNXT:-''} +CONFIG_BNXT_DCB=${CONFIG_BNXT_DCB:-''} CONFIG_INFINIBAND_VMWARE_PVRDMA=${CONFIG_INFINIBAND_VMWARE_PVRDMA:-''} CONFIG_SUNRPC_XPRT_RDMA=${CONFIG_SUNRPC_XPRT_RDMA:-''} @@ -963,6 +965,13 @@ if [ "X${CONFIG_MLX4_EN}" == "Xm" ]; then fi fi +if [ "X${CONFIG_BNXT}" == "Xm" ]; then + check_autofconf CONFIG_DCB + if [ X${CONFIG_DCB} == "X1" ]; then + CONFIG_BNXT_DCB=y + fi +fi + # Check for minimal supported kernel version if ! check_kerver ${KVERSION} ${MIN_KVERSION}; then echo "Kernel version ${KVERSION} is less then supported kernel ${MIN_KVERSION}. Exiting..." @@ -1070,6 +1079,7 @@ CONFIG_INFINIBAND_OCRDMA=${CONFIG_INFINIBAND_OCRDMA} CONFIG_BE2NET=${CONFIG_BE2NET} CONFIG_INFINIBAND_BNXT_RE=${CONFIG_INFINIBAND_BNXT_RE} CONFIG_BNXT=${CONFIG_BNXT} +CONFIG_BNXT_DCB=${CONFIG_BNXT_DCB} CONFIG_INFINIBAND_VMWARE_PVRDMA=${CONFIG_INFINIBAND_VMWARE_PVRDMA} CONFIG_SUNRPC_XPRT_RDMA=${CONFIG_SUNRPC_XPRT_RDMA} @@ -1395,6 +1405,11 @@ if [ "X${CONFIG_BNXT}" == "Xm" ]; then else DEFINE_BNXT="#undef CONFIG_BNXT" fi +if [ "X${CONFIG_BNXT_DCB}" == "Xy" ]; then + DEFINE_BNXT_DCB="#undef CONFIG_BNXT_DCB\n#define CONFIG_BNXT_DCB 1" +else + DEFINE_BNXT_DCB="#undef CONFIG_BNXT_DCB" +fi if [ "X${CONFIG_INFINIBAND_NES_DEBUG}" == "Xy" ]; then DEFINE_INFINIBAND_NES_DEBUG="#undef CONFIG_INFINIBAND_NES_DEBUG\n#define CONFIG_INFINIBAND_NES_DEBUG 1" else @@ -1503,6 +1518,7 @@ $(echo -e "${DEFINE_INFINIBAND_OCRDMA}" | grep -v undef) $(echo -e "${DEFINE_BE2NET}" | grep -v undef) $(echo -e "${DEFINE_INFINIBAND_BNXT_RE}" | grep -v undef) $(echo -e "${DEFINE_BNXT}" | grep -v undef) +$(echo -e "${DEFINE_BNXT_DCB}" | grep -v undef) $(echo -e "${DEFINE_INFINIBAND_VMWARE_PVRDMA}" | grep -v undef) $(echo -e "${DEFINE_SUNRPC_XPRT_RDMA}" | grep -v undef) @@ -1620,6 +1636,7 @@ $(echo -e "${DEFINE_INFINIBAND_QEDR}" | grep -v undef) #undef CONFIG_BE2NET #undef CONFIG_INFINIBAND_BNXT_RE #undef CONFIG_BNXT +#undef CONFIG_BNXT_DCB #undef CONFIG_INFINIBAND_VMWARE_PVRDMA #undef CONFIG_SUNRPC_XPRT_RDMA @@ -1672,6 +1689,7 @@ $(echo -e "${DEFINE_INFINIBAND_OCRDMA}") $(echo -e "${DEFINE_BE2NET}") $(echo -e "${DEFINE_INFINIBAND_BNXT_RE}") $(echo -e "${DEFINE_BNXT}") +$(echo -e "${DEFINE_BNXT_DCB}") $(echo -e "${DEFINE_INFINIBAND_VMWARE_PVRDMA}") $(echo -e "${DEFINE_SUNRPC_XPRT_RDMA}") diff --git a/linux-next-cherry-picks/0064-bnxt_en-Check-if-firmware-LLDP-agent-is-running.patch b/linux-next-cherry-picks/0064-bnxt_en-Check-if-firmware-LLDP-agent-is-running.patch new file mode 100644 index 0000000..1be8d67 --- /dev/null +++ b/linux-next-cherry-picks/0064-bnxt_en-Check-if-firmware-LLDP-agent-is-running.patch @@ -0,0 +1,59 @@ +From 8f189bb79c1551a2e070a69f386c66e002581f6e Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Wed, 8 Mar 2017 18:44:34 -0500 +Subject: [PATCH 1/8] bnxt_en: Check if firmware LLDP agent is running. + +Set DCB_CAP_DCBX_HOST capability flag only if the firmware LLDP agent +is not running. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 2 +- + 3 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index ae4c76a..53570eb 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -4247,6 +4247,10 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp) + vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; + } + #endif ++ if (BNXT_PF(bp) && (le16_to_cpu(resp->flags) & ++ FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED)) ++ bp->flags |= BNXT_FLAG_FW_LLDP_AGENT; ++ + switch (resp->port_partition_type) { + case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_0: + case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5: +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +index 9a55668..8440f7a 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +@@ -962,6 +962,7 @@ struct bnxt { + #define BNXT_FLAG_ROCEV2_CAP 0x10000 + #define BNXT_FLAG_ROCE_CAP (BNXT_FLAG_ROCEV1_CAP | \ + BNXT_FLAG_ROCEV2_CAP) ++ #define BNXT_FLAG_FW_LLDP_AGENT 0x80000 + #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000 + + #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \ +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +index fdf2d8c..0353206 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +@@ -474,7 +474,7 @@ void bnxt_dcb_init(struct bnxt *bp) + return; + + bp->dcbx_cap = DCB_CAP_DCBX_VER_IEEE; +- if (BNXT_PF(bp)) ++ if (BNXT_PF(bp) && !(bp->flags & BNXT_FLAG_FW_LLDP_AGENT)) + bp->dcbx_cap |= DCB_CAP_DCBX_HOST; + else + bp->dcbx_cap |= DCB_CAP_DCBX_LLD_MANAGED; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0065-bnxt_en-Update-firmware-interface-spec-to-1.7.6.2.patch b/linux-next-cherry-picks/0065-bnxt_en-Update-firmware-interface-spec-to-1.7.6.2.patch new file mode 100644 index 0000000..5246aed --- /dev/null +++ b/linux-next-cherry-picks/0065-bnxt_en-Update-firmware-interface-spec-to-1.7.6.2.patch @@ -0,0 +1,541 @@ +From 6665f0eabfa6feb5a93afd123f442b34e82c67ee Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Tue, 4 Apr 2017 18:14:06 -0400 +Subject: [PATCH 2/8] bnxt_en: Update firmware interface spec to 1.7.6.2. + +Features added include WoL and selftest. + +Signed-off-by: Deepak Khungar +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h | 325 +++++++++++++++++++++--- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 8 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h | 1 + + 3 files changed, 297 insertions(+), 37 deletions(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h +index 6e275c2..7dc71bb 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h +@@ -11,19 +11,21 @@ + #ifndef BNXT_HSI_H + #define BNXT_HSI_H + +-/* HSI and HWRM Specification 1.7.0 */ ++/* HSI and HWRM Specification 1.7.6 */ + #define HWRM_VERSION_MAJOR 1 + #define HWRM_VERSION_MINOR 7 +-#define HWRM_VERSION_UPDATE 0 ++#define HWRM_VERSION_UPDATE 6 + +-#define HWRM_VERSION_STR "1.7.0" ++#define HWRM_VERSION_RSVD 2 /* non-zero means beta version */ ++ ++#define HWRM_VERSION_STR "1.7.6.2" + /* + * Following is the signature for HWRM message field that indicates not + * applicable (All F's). Need to cast it the size of the field if needed. + */ + #define HWRM_NA_SIGNATURE ((__le32)(-1)) + #define HWRM_MAX_REQ_LEN (128) /* hwrm_func_buf_rgtr */ +-#define HWRM_MAX_RESP_LEN (176) /* hwrm_func_qstats */ ++#define HWRM_MAX_RESP_LEN (248) /* hwrm_selftest_qlist */ + #define HW_HASH_INDEX_SIZE 0x80 /* 7 bit indirection table index. */ + #define HW_HASH_KEY_SIZE 40 + #define HWRM_RESP_VALID_KEY 1 /* valid key for HWRM response */ +@@ -571,9 +573,10 @@ struct hwrm_ver_get_output { + __le16 max_req_win_len; + __le16 max_resp_len; + __le16 def_req_timeout; ++ u8 init_pending; ++ #define VER_GET_RESP_INIT_PENDING_DEV_NOT_RDY 0x1UL + u8 unused_0; + u8 unused_1; +- u8 unused_2; + u8 valid; + }; + +@@ -809,6 +812,8 @@ struct hwrm_func_qcfg_output { + #define FUNC_QCFG_RESP_FLAGS_OOB_WOL_BMP_ENABLED 0x2UL + #define FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED 0x4UL + #define FUNC_QCFG_RESP_FLAGS_STD_TX_RING_MODE_ENABLED 0x8UL ++ #define FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED 0x10UL ++ #define FUNC_QCFG_RESP_FLAGS_MULTI_HOST 0x20UL + u8 mac_address[6]; + __le16 pci_id; + __le16 alloc_rsscos_ctx; +@@ -827,10 +832,12 @@ struct hwrm_func_qcfg_output { + #define FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5 0x3UL + #define FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR2_0 0x4UL + #define FUNC_QCFG_RESP_PORT_PARTITION_TYPE_UNKNOWN 0xffUL +- u8 unused_0; ++ u8 port_pf_cnt; ++ #define FUNC_QCFG_RESP_PORT_PF_CNT_UNAVAIL 0x0UL + __le16 dflt_vnic_id; +- u8 unused_1; +- u8 unused_2; ++ u8 host_cnt; ++ #define FUNC_QCFG_RESP_HOST_CNT_UNAVAIL 0x0UL ++ u8 unused_0; + __le32 min_bw; + #define FUNC_QCFG_RESP_MIN_BW_BW_VALUE_MASK 0xfffffffUL + #define FUNC_QCFG_RESP_MIN_BW_BW_VALUE_SFT 0 +@@ -867,12 +874,12 @@ struct hwrm_func_qcfg_output { + #define FUNC_QCFG_RESP_EVB_MODE_NO_EVB 0x0UL + #define FUNC_QCFG_RESP_EVB_MODE_VEB 0x1UL + #define FUNC_QCFG_RESP_EVB_MODE_VEPA 0x2UL +- u8 unused_3; ++ u8 unused_1; + __le16 alloc_vfs; + __le32 alloc_mcast_filters; + __le32 alloc_hw_ring_grps; + __le16 alloc_sp_tx_rings; +- u8 unused_4; ++ u8 unused_2; + u8 valid; + }; + +@@ -888,16 +895,13 @@ struct hwrm_func_cfg_input { + u8 unused_0; + u8 unused_1; + __le32 flags; +- #define FUNC_CFG_REQ_FLAGS_PROM_MODE 0x1UL +- #define FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK 0x2UL +- #define FUNC_CFG_REQ_FLAGS_SRC_IP_ADDR_CHECK 0x4UL +- #define FUNC_CFG_REQ_FLAGS_VLAN_PRI_MATCH 0x8UL +- #define FUNC_CFG_REQ_FLAGS_DFLT_PRI_NOMATCH 0x10UL +- #define FUNC_CFG_REQ_FLAGS_DISABLE_PAUSE 0x20UL +- #define FUNC_CFG_REQ_FLAGS_DISABLE_STP 0x40UL +- #define FUNC_CFG_REQ_FLAGS_DISABLE_LLDP 0x80UL +- #define FUNC_CFG_REQ_FLAGS_DISABLE_PTPV2 0x100UL +- #define FUNC_CFG_REQ_FLAGS_STD_TX_RING_MODE 0x200UL ++ #define FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK_DISABLE 0x1UL ++ #define FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK_ENABLE 0x2UL ++ #define FUNC_CFG_REQ_FLAGS_RSVD_MASK 0x1fcUL ++ #define FUNC_CFG_REQ_FLAGS_RSVD_SFT 2 ++ #define FUNC_CFG_REQ_FLAGS_STD_TX_RING_MODE_ENABLE 0x200UL ++ #define FUNC_CFG_REQ_FLAGS_STD_TX_RING_MODE_DISABLE 0x400UL ++ #define FUNC_CFG_REQ_FLAGS_VIRT_MAC_PERSIST 0x800UL + __le32 enables; + #define FUNC_CFG_REQ_ENABLES_MTU 0x1UL + #define FUNC_CFG_REQ_ENABLES_MRU 0x2UL +@@ -1013,7 +1017,7 @@ struct hwrm_func_qstats_output { + __le64 tx_ucast_pkts; + __le64 tx_mcast_pkts; + __le64 tx_bcast_pkts; +- __le64 tx_err_pkts; ++ __le64 tx_discard_pkts; + __le64 tx_drop_pkts; + __le64 tx_ucast_bytes; + __le64 tx_mcast_bytes; +@@ -1021,7 +1025,7 @@ struct hwrm_func_qstats_output { + __le64 rx_ucast_pkts; + __le64 rx_mcast_pkts; + __le64 rx_bcast_pkts; +- __le64 rx_err_pkts; ++ __le64 rx_discard_pkts; + __le64 rx_drop_pkts; + __le64 rx_ucast_bytes; + __le64 rx_mcast_bytes; +@@ -4743,25 +4747,72 @@ struct hwrm_temp_monitor_query_output { + u8 valid; + }; + +-/* hwrm_nvm_read */ +-/* Input (40 bytes) */ +-struct hwrm_nvm_read_input { ++/* hwrm_wol_filter_alloc */ ++/* Input (64 bytes) */ ++struct hwrm_wol_filter_alloc_input { + __le16 req_type; + __le16 cmpl_ring; + __le16 seq_id; + __le16 target_id; + __le64 resp_addr; +- __le64 host_dest_addr; +- __le16 dir_idx; ++ __le32 flags; ++ __le32 enables; ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_MAC_ADDRESS 0x1UL ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_PATTERN_OFFSET 0x2UL ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_PATTERN_BUF_SIZE 0x4UL ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_PATTERN_BUF_ADDR 0x8UL ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_PATTERN_MASK_ADDR 0x10UL ++ #define WOL_FILTER_ALLOC_REQ_ENABLES_PATTERN_MASK_SIZE 0x20UL ++ __le16 port_id; ++ u8 wol_type; ++ #define WOL_FILTER_ALLOC_REQ_WOL_TYPE_MAGICPKT 0x0UL ++ #define WOL_FILTER_ALLOC_REQ_WOL_TYPE_BMP 0x1UL ++ #define WOL_FILTER_ALLOC_REQ_WOL_TYPE_INVALID 0xffUL + u8 unused_0; +- u8 unused_1; +- __le32 offset; +- __le32 len; ++ __le32 unused_1; ++ u8 mac_address[6]; ++ __le16 pattern_offset; ++ __le16 pattern_buf_size; ++ __le16 pattern_mask_size; + __le32 unused_2; ++ __le64 pattern_buf_addr; ++ __le64 pattern_mask_addr; + }; + + /* Output (16 bytes) */ +-struct hwrm_nvm_read_output { ++struct hwrm_wol_filter_alloc_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ u8 wol_filter_id; ++ u8 unused_0; ++ __le16 unused_1; ++ u8 unused_2; ++ u8 unused_3; ++ u8 unused_4; ++ u8 valid; ++}; ++ ++/* hwrm_wol_filter_free */ ++/* Input (32 bytes) */ ++struct hwrm_wol_filter_free_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ __le32 flags; ++ #define WOL_FILTER_FREE_REQ_FLAGS_FREE_ALL_WOL_FILTERS 0x1UL ++ __le32 enables; ++ #define WOL_FILTER_FREE_REQ_ENABLES_WOL_FILTER_ID 0x1UL ++ __le16 port_id; ++ u8 wol_filter_id; ++ u8 unused_0[5]; ++}; ++ ++/* Output (16 bytes) */ ++struct hwrm_wol_filter_free_output { + __le16 error_code; + __le16 req_type; + __le16 seq_id; +@@ -4773,21 +4824,107 @@ struct hwrm_nvm_read_output { + u8 valid; + }; + +-/* hwrm_nvm_raw_dump */ +-/* Input (32 bytes) */ +-struct hwrm_nvm_raw_dump_input { ++/* hwrm_wol_filter_qcfg */ ++/* Input (56 bytes) */ ++struct hwrm_wol_filter_qcfg_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ __le16 port_id; ++ __le16 handle; ++ __le32 unused_0; ++ __le64 pattern_buf_addr; ++ __le16 pattern_buf_size; ++ u8 unused_1; ++ u8 unused_2; ++ u8 unused_3[3]; ++ u8 unused_4; ++ __le64 pattern_mask_addr; ++ __le16 pattern_mask_size; ++ __le16 unused_5[3]; ++}; ++ ++/* Output (32 bytes) */ ++struct hwrm_wol_filter_qcfg_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ __le16 next_handle; ++ u8 wol_filter_id; ++ u8 wol_type; ++ #define WOL_FILTER_QCFG_RESP_WOL_TYPE_MAGICPKT 0x0UL ++ #define WOL_FILTER_QCFG_RESP_WOL_TYPE_BMP 0x1UL ++ #define WOL_FILTER_QCFG_RESP_WOL_TYPE_INVALID 0xffUL ++ __le32 unused_0; ++ u8 mac_address[6]; ++ __le16 pattern_offset; ++ __le16 pattern_size; ++ __le16 pattern_mask_size; ++ u8 unused_1; ++ u8 unused_2; ++ u8 unused_3; ++ u8 valid; ++}; ++ ++/* hwrm_wol_reason_qcfg */ ++/* Input (40 bytes) */ ++struct hwrm_wol_reason_qcfg_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ __le16 port_id; ++ u8 unused_0; ++ u8 unused_1; ++ u8 unused_2[3]; ++ u8 unused_3; ++ __le64 wol_pkt_buf_addr; ++ __le16 wol_pkt_buf_size; ++ __le16 unused_4[3]; ++}; ++ ++/* Output (16 bytes) */ ++struct hwrm_wol_reason_qcfg_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ u8 wol_filter_id; ++ u8 wol_reason; ++ #define WOL_REASON_QCFG_RESP_WOL_REASON_MAGICPKT 0x0UL ++ #define WOL_REASON_QCFG_RESP_WOL_REASON_BMP 0x1UL ++ #define WOL_REASON_QCFG_RESP_WOL_REASON_INVALID 0xffUL ++ u8 wol_pkt_len; ++ u8 unused_0; ++ u8 unused_1; ++ u8 unused_2; ++ u8 unused_3; ++ u8 valid; ++}; ++ ++/* hwrm_nvm_read */ ++/* Input (40 bytes) */ ++struct hwrm_nvm_read_input { + __le16 req_type; + __le16 cmpl_ring; + __le16 seq_id; + __le16 target_id; + __le64 resp_addr; + __le64 host_dest_addr; ++ __le16 dir_idx; ++ u8 unused_0; ++ u8 unused_1; + __le32 offset; + __le32 len; ++ __le32 unused_2; + }; + + /* Output (16 bytes) */ +-struct hwrm_nvm_raw_dump_output { ++struct hwrm_nvm_read_output { + __le16 error_code; + __le16 req_type; + __le16 seq_id; +@@ -4881,6 +5018,15 @@ struct hwrm_nvm_write_output { + u8 valid; + }; + ++/* Command specific Error Codes (8 bytes) */ ++struct hwrm_nvm_write_cmd_err { ++ u8 code; ++ #define NVM_WRITE_CMD_ERR_CODE_UNKNOWN 0x0UL ++ #define NVM_WRITE_CMD_ERR_CODE_FRAG_ERR 0x1UL ++ #define NVM_WRITE_CMD_ERR_CODE_NO_SPACE 0x2UL ++ u8 unused_0[7]; ++}; ++ + /* hwrm_nvm_modify */ + /* Input (40 bytes) */ + struct hwrm_nvm_modify_input { +@@ -5112,6 +5258,100 @@ struct hwrm_nvm_install_update_cmd_err { + u8 unused_0[7]; + }; + ++/* hwrm_selftest_qlist */ ++/* Input (16 bytes) */ ++struct hwrm_selftest_qlist_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++}; ++ ++/* Output (248 bytes) */ ++struct hwrm_selftest_qlist_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ u8 num_tests; ++ u8 available_tests; ++ #define SELFTEST_QLIST_RESP_AVAILABLE_TESTS_NVM_TEST 0x1UL ++ #define SELFTEST_QLIST_RESP_AVAILABLE_TESTS_LINK_TEST 0x2UL ++ #define SELFTEST_QLIST_RESP_AVAILABLE_TESTS_REGISTER_TEST 0x4UL ++ #define SELFTEST_QLIST_RESP_AVAILABLE_TESTS_MEMORY_TEST 0x8UL ++ u8 offline_tests; ++ #define SELFTEST_QLIST_RESP_OFFLINE_TESTS_NVM_TEST 0x1UL ++ #define SELFTEST_QLIST_RESP_OFFLINE_TESTS_LINK_TEST 0x2UL ++ #define SELFTEST_QLIST_RESP_OFFLINE_TESTS_REGISTER_TEST 0x4UL ++ #define SELFTEST_QLIST_RESP_OFFLINE_TESTS_MEMORY_TEST 0x8UL ++ u8 unused_0; ++ __le16 test_timeout; ++ u8 unused_1; ++ u8 unused_2; ++ char test0_name[32]; ++ char test1_name[32]; ++ char test2_name[32]; ++ char test3_name[32]; ++ char test4_name[32]; ++ char test5_name[32]; ++ char test6_name[32]; ++ char test7_name[32]; ++}; ++ ++/* hwrm_selftest_exec */ ++/* Input (24 bytes) */ ++struct hwrm_selftest_exec_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ u8 flags; ++ #define SELFTEST_EXEC_REQ_FLAGS_NVM_TEST 0x1UL ++ #define SELFTEST_EXEC_REQ_FLAGS_LINK_TEST 0x2UL ++ #define SELFTEST_EXEC_REQ_FLAGS_REGISTER_TEST 0x4UL ++ #define SELFTEST_EXEC_REQ_FLAGS_MEMORY_TEST 0x8UL ++ u8 unused_0[7]; ++}; ++ ++/* Output (16 bytes) */ ++struct hwrm_selftest_exec_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ u8 requested_tests; ++ #define SELFTEST_EXEC_RESP_REQUESTED_TESTS_NVM_TEST 0x1UL ++ #define SELFTEST_EXEC_RESP_REQUESTED_TESTS_LINK_TEST 0x2UL ++ #define SELFTEST_EXEC_RESP_REQUESTED_TESTS_REGISTER_TEST 0x4UL ++ #define SELFTEST_EXEC_RESP_REQUESTED_TESTS_MEMORY_TEST 0x8UL ++ u8 test_success; ++ #define SELFTEST_EXEC_RESP_TEST_SUCCESS_NVM_TEST 0x1UL ++ #define SELFTEST_EXEC_RESP_TEST_SUCCESS_LINK_TEST 0x2UL ++ #define SELFTEST_EXEC_RESP_TEST_SUCCESS_REGISTER_TEST 0x4UL ++ #define SELFTEST_EXEC_RESP_TEST_SUCCESS_MEMORY_TEST 0x8UL ++ __le16 unused_0[3]; ++}; ++ ++/* hwrm_selftest_irq */ ++/* Input (16 bytes) */ ++struct hwrm_selftest_irq_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++}; ++ ++/* Output (8 bytes) */ ++struct hwrm_selftest_irq_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++}; ++ + /* Hardware Resource Manager Specification */ + /* Input (16 bytes) */ + struct input { +@@ -5130,6 +5370,16 @@ struct output { + __le16 resp_len; + }; + ++/* Short Command Structure (16 bytes) */ ++struct hwrm_short_input { ++ __le16 req_type; ++ __le16 signature; ++ #define SHORT_REQ_SIGNATURE_SHORT_CMD 0x4321UL ++ __le16 unused_0; ++ __le16 size; ++ __le64 req_addr; ++}; ++ + /* Command numbering (8 bytes) */ + struct cmd_nums { + __le16 req_type; +@@ -5252,11 +5502,15 @@ struct cmd_nums { + #define HWRM_CFA_FLOW_FLUSH (0x105UL) + #define HWRM_CFA_FLOW_STATS (0x106UL) + #define HWRM_CFA_FLOW_INFO (0x107UL) ++ #define HWRM_SELFTEST_QLIST (0x200UL) ++ #define HWRM_SELFTEST_EXEC (0x201UL) ++ #define HWRM_SELFTEST_IRQ (0x202UL) + #define HWRM_DBG_READ_DIRECT (0xff10UL) + #define HWRM_DBG_READ_INDIRECT (0xff11UL) + #define HWRM_DBG_WRITE_DIRECT (0xff12UL) + #define HWRM_DBG_WRITE_INDIRECT (0xff13UL) + #define HWRM_DBG_DUMP (0xff14UL) ++ #define HWRM_NVM_FACTORY_DEFAULTS (0xffeeUL) + #define HWRM_NVM_VALIDATE_OPTION (0xffefUL) + #define HWRM_NVM_FLUSH (0xfff0UL) + #define HWRM_NVM_GET_VARIABLE (0xfff1UL) +@@ -5464,6 +5718,7 @@ struct hwrm_struct_hdr { + #define STRUCT_HDR_STRUCT_ID_DCBX_FEATURE_STATE 0x422UL + #define STRUCT_HDR_STRUCT_ID_LLDP_GENERIC 0x424UL + #define STRUCT_HDR_STRUCT_ID_LLDP_DEVICE 0x426UL ++ #define STRUCT_HDR_STRUCT_ID_AFM_OPAQUE 0x1UL + #define STRUCT_HDR_STRUCT_ID_PORT_DESCRIPTION 0xaUL + __le16 len; + u8 version; +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +index 477e265..79984c8 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +@@ -1,6 +1,7 @@ + /* Broadcom NetXtreme-C/E network driver. + * + * Copyright (c) 2014-2016 Broadcom Corporation ++ * Copyright (c) 2016-2017 Broadcom Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -83,6 +84,9 @@ int bnxt_set_vf_spoofchk(struct net_device *dev, int vf_id, bool setting) + u32 func_flags; + int rc; + ++ if (bp->hwrm_spec_code < 0x10701) ++ return -ENOTSUPP; ++ + rc = bnxt_vf_ndo_prep(bp, vf_id); + if (rc) + return rc; +@@ -95,9 +99,9 @@ int bnxt_set_vf_spoofchk(struct net_device *dev, int vf_id, bool setting) + + func_flags = vf->func_flags; + if (setting) +- func_flags |= FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK; ++ func_flags |= FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK_ENABLE; + else +- func_flags &= ~FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK; ++ func_flags |= FUNC_CFG_REQ_FLAGS_SRC_MAC_ADDR_CHECK_DISABLE; + /*TODO: if the driver supports VLAN filter on guest VLAN, + * the spoof check should also include vlan anti-spoofing + */ +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h +index 0392670..6042bb3 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h +@@ -1,6 +1,7 @@ + /* Broadcom NetXtreme-C/E network driver. + * + * Copyright (c) 2014-2016 Broadcom Corporation ++ * Copyright (c) 2016-2017 Broadcom Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0066-bnxt_en-Pass-DCB-RoCE-app-priority-to-firmware.patch b/linux-next-cherry-picks/0066-bnxt_en-Pass-DCB-RoCE-app-priority-to-firmware.patch new file mode 100644 index 0000000..76d912f --- /dev/null +++ b/linux-next-cherry-picks/0066-bnxt_en-Pass-DCB-RoCE-app-priority-to-firmware.patch @@ -0,0 +1,183 @@ +From d72ed9c651b37e8db3b688c2136438533658bd09 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Fri, 21 Apr 2017 20:11:22 -0400 +Subject: [PATCH 3/8] bnxt_en: Pass DCB RoCE app priority to firmware. + +When the driver gets the RoCE app priority set/delete call through DCBNL, +the driver will send the information to the firmware to set up the +priority VLAN tag for RDMA traffic. + +[ New version using the common ETH_P_IBOE constant in if_ether.h ] + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 108 +++++++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h | 1 + + 2 files changed, 108 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +index 0353206..46de2f8 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +@@ -1,6 +1,7 @@ + /* Broadcom NetXtreme-C/E network driver. + * + * Copyright (c) 2014-2016 Broadcom Corporation ++ * Copyright (c) 2016-2017 Broadcom Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -14,6 +15,7 @@ + #include + #include + #include ++#include + #include "bnxt_hsi.h" + #include "bnxt.h" + #include "bnxt_dcb.h" +@@ -241,6 +243,92 @@ static int bnxt_hwrm_queue_pfc_qcfg(struct bnxt *bp, struct ieee_pfc *pfc) + return 0; + } + ++static int bnxt_hwrm_set_dcbx_app(struct bnxt *bp, struct dcb_app *app, ++ bool add) ++{ ++ struct hwrm_fw_set_structured_data_input set = {0}; ++ struct hwrm_fw_get_structured_data_input get = {0}; ++ struct hwrm_struct_data_dcbx_app *fw_app; ++ struct hwrm_struct_hdr *data; ++ dma_addr_t mapping; ++ size_t data_len; ++ int rc, n, i; ++ ++ if (bp->hwrm_spec_code < 0x10601) ++ return 0; ++ ++ n = IEEE_8021QAZ_MAX_TCS; ++ data_len = sizeof(*data) + sizeof(*fw_app) * n; ++ data = dma_alloc_coherent(&bp->pdev->dev, data_len, &mapping, ++ GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; ++ ++ memset(data, 0, data_len); ++ bnxt_hwrm_cmd_hdr_init(bp, &get, HWRM_FW_GET_STRUCTURED_DATA, -1, -1); ++ get.dest_data_addr = cpu_to_le64(mapping); ++ get.structure_id = cpu_to_le16(STRUCT_HDR_STRUCT_ID_DCBX_APP); ++ get.subtype = cpu_to_le16(HWRM_STRUCT_DATA_SUBTYPE_HOST_OPERATIONAL); ++ get.count = 0; ++ rc = hwrm_send_message(bp, &get, sizeof(get), HWRM_CMD_TIMEOUT); ++ if (rc) ++ goto set_app_exit; ++ ++ fw_app = (struct hwrm_struct_data_dcbx_app *)(data + 1); ++ ++ if (data->struct_id != cpu_to_le16(STRUCT_HDR_STRUCT_ID_DCBX_APP)) { ++ rc = -ENODEV; ++ goto set_app_exit; ++ } ++ ++ n = data->count; ++ for (i = 0; i < n; i++, fw_app++) { ++ if (fw_app->protocol_id == cpu_to_be16(app->protocol) && ++ fw_app->protocol_selector == app->selector && ++ fw_app->priority == app->priority) { ++ if (add) ++ goto set_app_exit; ++ else ++ break; ++ } ++ } ++ if (add) { ++ /* append */ ++ n++; ++ fw_app->protocol_id = cpu_to_be16(app->protocol); ++ fw_app->protocol_selector = app->selector; ++ fw_app->priority = app->priority; ++ fw_app->valid = 1; ++ } else { ++ size_t len = 0; ++ ++ /* not found, nothing to delete */ ++ if (n == i) ++ goto set_app_exit; ++ ++ len = (n - 1 - i) * sizeof(*fw_app); ++ if (len) ++ memmove(fw_app, fw_app + 1, len); ++ n--; ++ memset(fw_app + n, 0, sizeof(*fw_app)); ++ } ++ data->count = n; ++ data->len = cpu_to_le16(sizeof(*fw_app) * n); ++ data->subtype = cpu_to_le16(HWRM_STRUCT_DATA_SUBTYPE_HOST_OPERATIONAL); ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &set, HWRM_FW_SET_STRUCTURED_DATA, -1, -1); ++ set.src_data_addr = cpu_to_le64(mapping); ++ set.data_len = cpu_to_le16(sizeof(*data) + sizeof(*fw_app) * n); ++ set.hdr_cnt = 1; ++ rc = hwrm_send_message(bp, &set, sizeof(set), HWRM_CMD_TIMEOUT); ++ if (rc) ++ rc = -EIO; ++ ++set_app_exit: ++ dma_free_coherent(&bp->pdev->dev, data_len, data, mapping); ++ return rc; ++} ++ + static int bnxt_ets_validate(struct bnxt *bp, struct ieee_ets *ets, u8 *tc) + { + int total_ets_bw = 0; +@@ -417,6 +505,15 @@ static int bnxt_dcbnl_ieee_setapp(struct net_device *dev, struct dcb_app *app) + return -EINVAL; + + rc = dcb_ieee_setapp(dev, app); ++ if (rc) ++ return rc; ++ ++ if ((app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && ++ app->protocol == ETH_P_IBOE) || ++ (app->selector == IEEE_8021QAZ_APP_SEL_DGRAM && ++ app->protocol == ROCE_V2_UDP_DPORT)) ++ rc = bnxt_hwrm_set_dcbx_app(bp, app, true); ++ + return rc; + } + +@@ -425,10 +522,19 @@ static int bnxt_dcbnl_ieee_delapp(struct net_device *dev, struct dcb_app *app) + struct bnxt *bp = netdev_priv(dev); + int rc; + +- if (!(bp->dcbx_cap & DCB_CAP_DCBX_VER_IEEE)) ++ if (!(bp->dcbx_cap & DCB_CAP_DCBX_VER_IEEE) || ++ !(bp->dcbx_cap & DCB_CAP_DCBX_HOST)) + return -EINVAL; + + rc = dcb_ieee_delapp(dev, app); ++ if (rc) ++ return rc; ++ if ((app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE && ++ app->protocol == ETH_P_IBOE) || ++ (app->selector == IEEE_8021QAZ_APP_SEL_DGRAM && ++ app->protocol == ROCE_V2_UDP_DPORT)) ++ rc = bnxt_hwrm_set_dcbx_app(bp, app, false); ++ + return rc; + } + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h +index 35a0d28..ecd0a5e 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h +@@ -1,6 +1,7 @@ + /* Broadcom NetXtreme-C/E network driver. + * + * Copyright (c) 2014-2016 Broadcom Corporation ++ * Copyright (c) 2016-2017 Broadcom Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0067-bnxt_en-Check-the-FW_LLDP_AGENT-flag-before-allowing.patch b/linux-next-cherry-picks/0067-bnxt_en-Check-the-FW_LLDP_AGENT-flag-before-allowing.patch new file mode 100644 index 0000000..2b8f7be --- /dev/null +++ b/linux-next-cherry-picks/0067-bnxt_en-Check-the-FW_LLDP_AGENT-flag-before-allowing.patch @@ -0,0 +1,32 @@ +From 070ed54900d6c8977fb9cc3bc28907659e03d360 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Fri, 21 Apr 2017 20:11:25 -0400 +Subject: [PATCH 4/8] bnxt_en: Check the FW_LLDP_AGENT flag before allowing + DCBX host agent. + +Check the additional flag in bnxt_hwrm_func_qcfg() before allowing +DCBX to be done in host mode. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 53570eb..0b456ea 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -4248,7 +4248,8 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp) + } + #endif + if (BNXT_PF(bp) && (le16_to_cpu(resp->flags) & +- FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED)) ++ (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED | ++ FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED))) + bp->flags |= BNXT_FLAG_FW_LLDP_AGENT; + + switch (resp->port_partition_type) { +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0068-bnxt_en-Call-bnxt_dcb_init-after-getting-firmware-DC.patch b/linux-next-cherry-picks/0068-bnxt_en-Call-bnxt_dcb_init-after-getting-firmware-DC.patch new file mode 100644 index 0000000..89ef524 --- /dev/null +++ b/linux-next-cherry-picks/0068-bnxt_en-Call-bnxt_dcb_init-after-getting-firmware-DC.patch @@ -0,0 +1,41 @@ +From 58561599d8074059b324469654cef29dd0130d10 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Tue, 16 May 2017 16:39:43 -0400 +Subject: [PATCH 5/8] bnxt_en: Call bnxt_dcb_init() after getting firmware DCBX + configuration. + +In the current code, bnxt_dcb_init() is called too early before we +determine if the firmware DCBX agent is running or not. As a result, +we are not setting the DCB_CAP_DCBX_HOST and DCB_CAP_DCBX_LLD_MANAGED +flags properly to report to DCBNL. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 0b456ea..0e8da47 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -7283,8 +7283,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + //dev->min_mtu = ETH_ZLEN; + //dev->max_mtu = 9500; + +- bnxt_dcb_init(bp); +- + #ifdef CONFIG_BNXT_SRIOV + init_waitqueue_head(&bp->sriov_cfg_wait); + #endif +@@ -7320,6 +7318,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + } + + bnxt_hwrm_func_qcfg(bp); ++ bnxt_dcb_init(bp); + + bnxt_set_tpa_flags(bp); + bnxt_set_ring_params(bp); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0069-bnxt_en-Check-status-of-firmware-DCBX-agent-before-s.patch b/linux-next-cherry-picks/0069-bnxt_en-Check-status-of-firmware-DCBX-agent-before-s.patch new file mode 100644 index 0000000..489ab4d --- /dev/null +++ b/linux-next-cherry-picks/0069-bnxt_en-Check-status-of-firmware-DCBX-agent-before-s.patch @@ -0,0 +1,35 @@ +From 00a7975db7d4d6df674fc710e1b6d87fdd947acd Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Tue, 16 May 2017 16:39:44 -0400 +Subject: [PATCH 6/8] bnxt_en: Check status of firmware DCBX agent before + setting DCB_CAP_DCBX_HOST. + +Otherwise, all the host based DCBX settings from lldpad will fail if the +firmware DCBX agent is running. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +index 46de2f8..5c6dd0c 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +@@ -553,8 +553,10 @@ static u8 bnxt_dcbnl_setdcbx(struct net_device *dev, u8 mode) + if ((mode & DCB_CAP_DCBX_VER_CEE) || !(mode & DCB_CAP_DCBX_VER_IEEE)) + return 1; + +- if ((mode & DCB_CAP_DCBX_HOST) && BNXT_VF(bp)) +- return 1; ++ if (mode & DCB_CAP_DCBX_HOST) { ++ if (BNXT_VF(bp) || (bp->flags & BNXT_FLAG_FW_LLDP_AGENT)) ++ return 1; ++ } + + if (mode == bp->dcbx_cap) + return 0; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0070-bnxt_en-Add-a-callback-to-inform-RDMA-driver-during-.patch b/linux-next-cherry-picks/0070-bnxt_en-Add-a-callback-to-inform-RDMA-driver-during-.patch new file mode 100644 index 0000000..6e310de --- /dev/null +++ b/linux-next-cherry-picks/0070-bnxt_en-Add-a-callback-to-inform-RDMA-driver-during-.patch @@ -0,0 +1,82 @@ +From 9799051c7e1ef9c7da8218b1c91b1f7291645002 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Mon, 29 May 2017 19:06:06 -0400 +Subject: [PATCH 7/8] bnxt_en: Add a callback to inform RDMA driver during PCI + shutdown. + +When bnxt_en gets a PCI shutdown call, we need to have a new callback +to inform the RDMA driver to do proper shutdown and removal. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 19 +++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 2 ++ + 3 files changed, 22 insertions(+) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 0e8da47..562f101 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -6986,6 +6986,7 @@ static void bnxt_remove_one(struct pci_dev *pdev) + cancel_work_sync(&bp->sp_task); + bp->sp_event = 0; + ++ bnxt_ulp_shutdown(bp); + bnxt_clear_int_mode(bp); + bnxt_hwrm_func_drv_unrgtr(bp); + bnxt_free_hwrm_resources(bp); +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +index 8b7464b..77da75a 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +@@ -266,6 +266,25 @@ void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs) + } + } + ++void bnxt_ulp_shutdown(struct bnxt *bp) ++{ ++ struct bnxt_en_dev *edev = bp->edev; ++ struct bnxt_ulp_ops *ops; ++ int i; ++ ++ if (!edev) ++ return; ++ ++ for (i = 0; i < BNXT_MAX_ULP; i++) { ++ struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; ++ ++ ops = rtnl_dereference(ulp->ulp_ops); ++ if (!ops || !ops->ulp_shutdown) ++ continue; ++ ops->ulp_shutdown(ulp->handle); ++ } ++} ++ + void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl) + { + u16 event_id = le16_to_cpu(cmpl->event_id); +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +index 74f816e..d247106 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +@@ -26,6 +26,7 @@ struct bnxt_ulp_ops { + void (*ulp_stop)(void *); + void (*ulp_start)(void *); + void (*ulp_sriov_config)(void *, int); ++ void (*ulp_shutdown)(void *); + }; + + struct bnxt_msix_entry { +@@ -87,6 +88,7 @@ void bnxt_subtract_ulp_resources(struct bnxt *bp, int ulp_id); + void bnxt_ulp_stop(struct bnxt *bp); + void bnxt_ulp_start(struct bnxt *bp); + void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs); ++void bnxt_ulp_shutdown(struct bnxt *bp); + void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl); + struct bnxt_en_dev *bnxt_ulp_probe(struct net_device *dev); + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0071-bnxt_en-Set-ETS-min_bw-parameter-for-older-firmware.patch b/linux-next-cherry-picks/0071-bnxt_en-Set-ETS-min_bw-parameter-for-older-firmware.patch new file mode 100644 index 0000000..e10025e --- /dev/null +++ b/linux-next-cherry-picks/0071-bnxt_en-Set-ETS-min_bw-parameter-for-older-firmware.patch @@ -0,0 +1,47 @@ +From d1d840cbe64977830ce17dc06b2e0546083fe036 Mon Sep 17 00:00:00 2001 +From: Michael Chan +Date: Mon, 24 Jul 2017 12:34:26 -0400 +Subject: [PATCH 8/8] bnxt_en: Set ETS min_bw parameter for older firmware. + +In addition to the ETS weight, older firmware also requires the min_bw +parameter to be set for it to work properly. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 6 ++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h | 1 + + 2 files changed, 7 insertions(+) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +index 5c6dd0c..1f1cc45 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +@@ -93,6 +93,12 @@ static int bnxt_hwrm_queue_cos2bw_cfg(struct bnxt *bp, struct ieee_ets *ets, + cos2bw.tsa = + QUEUE_COS2BW_QCFG_RESP_QUEUE_ID0_TSA_ASSIGN_ETS; + cos2bw.bw_weight = ets->tc_tx_bw[i]; ++ /* older firmware requires min_bw to be set to the ++ * same weight value in percent. ++ */ ++ cos2bw.min_bw = ++ cpu_to_le32((ets->tc_tx_bw[i] * 100) | ++ BW_VALUE_UNIT_PERCENT1_100); + } + memcpy(data, &cos2bw.queue_id, sizeof(cos2bw) - 4); + if (i == 0) { +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h +index ecd0a5e..d2e0af9 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.h +@@ -26,6 +26,7 @@ struct bnxt_cos2bw_cfg { + u8 queue_id; + __le32 min_bw; + __le32 max_bw; ++#define BW_VALUE_UNIT_PERCENT1_100 (0x1UL << 29) + u8 tsa; + u8 pri_lvl; + u8 bw_weight; +-- +1.8.3.1 + diff --git a/patches/0019-bnxt_en-Add-define-for-ETH_P_IBOE.patch b/patches/0019-bnxt_en-Add-define-for-ETH_P_IBOE.patch new file mode 100644 index 0000000..036a6ee --- /dev/null +++ b/patches/0019-bnxt_en-Add-define-for-ETH_P_IBOE.patch @@ -0,0 +1,27 @@ +From 1b0d810bb135f3a52db011653db5b496be1c546d Mon Sep 17 00:00:00 2001 +From: Selvin Xavier +Date: Thu, 2 Nov 2017 03:16:11 -0700 +Subject: [PATCH] bnxt_en: Add define for ETH_P_IBOE + +Adding define for ETH_P_IBOE(0x8915) + +Signed-off-by: Selvin Xavier +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +index 9a55668..8fe4150 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +@@ -1264,4 +1264,7 @@ int bnxt_close_nic(struct bnxt *, bool, bool); + int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); + int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); + void bnxt_restore_pf_fw_resources(struct bnxt *bp); ++#ifndef ETH_P_IBOE ++#define ETH_P_IBOE 0x8915 ++#endif + #endif +-- +2.5.5 + -- 2.41.0