Enabling CONFIG_BNXT_DCB for adding Host based DCB support.
Also including the latest patches related to DCB support.
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
;;
--with-bnxt_en-mod)
CONFIG_BNXT="m"
+ CONFIG_BNXT_DCB="y"
;;
--without-bnxt_en-mod)
CONFIG_BNXT=
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:-''}
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..."
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}
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
$(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)
#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
$(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}")
--- /dev/null
+From 8f189bb79c1551a2e070a69f386c66e002581f6e Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From 6665f0eabfa6feb5a93afd123f442b34e82c67ee Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <deepak.khungar@broadcom.com>
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From d72ed9c651b37e8db3b688c2136438533658bd09 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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 <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <linux/etherdevice.h>
++#include <rdma/ib_verbs.h>
+ #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
+
--- /dev/null
+From 070ed54900d6c8977fb9cc3bc28907659e03d360 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From 58561599d8074059b324469654cef29dd0130d10 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From 00a7975db7d4d6df674fc710e1b6d87fdd947acd Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From 9799051c7e1ef9c7da8218b1c91b1f7291645002 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From d1d840cbe64977830ce17dc06b2e0546083fe036 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+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 <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+
--- /dev/null
+From 1b0d810bb135f3a52db011653db5b496be1c546d Mon Sep 17 00:00:00 2001
+From: Selvin Xavier <selvin.xavier@broadcom.com>
+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 <selvin.xavier@broadcom.com>
+---
+ 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
+