]> git.openfabrics.org - compat-rdma/compat-rdma.git/commitdiff
bnxt_en: BZ 2649 Enabling DCB parameter for bnxt_en
authorSelvin Xavier <selvin.xavier@broadcom.com>
Thu, 2 Nov 2017 09:33:36 +0000 (02:33 -0700)
committerSelvin Xavier <selvin.xavier@broadcom.com>
Thu, 2 Nov 2017 10:19:08 +0000 (03:19 -0700)
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>
configure
linux-next-cherry-picks/0064-bnxt_en-Check-if-firmware-LLDP-agent-is-running.patch [new file with mode: 0644]
linux-next-cherry-picks/0065-bnxt_en-Update-firmware-interface-spec-to-1.7.6.2.patch [new file with mode: 0644]
linux-next-cherry-picks/0066-bnxt_en-Pass-DCB-RoCE-app-priority-to-firmware.patch [new file with mode: 0644]
linux-next-cherry-picks/0067-bnxt_en-Check-the-FW_LLDP_AGENT-flag-before-allowing.patch [new file with mode: 0644]
linux-next-cherry-picks/0068-bnxt_en-Call-bnxt_dcb_init-after-getting-firmware-DC.patch [new file with mode: 0644]
linux-next-cherry-picks/0069-bnxt_en-Check-status-of-firmware-DCBX-agent-before-s.patch [new file with mode: 0644]
linux-next-cherry-picks/0070-bnxt_en-Add-a-callback-to-inform-RDMA-driver-during-.patch [new file with mode: 0644]
linux-next-cherry-picks/0071-bnxt_en-Set-ETS-min_bw-parameter-for-older-firmware.patch [new file with mode: 0644]
patches/0019-bnxt_en-Add-define-for-ETH_P_IBOE.patch [new file with mode: 0644]

index f6b8fc33bb3a5ccada00f140d777298d354ffffc..59131197dab39c17454077363d8ffd4ef66aeb8d 100755 (executable)
--- 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 (file)
index 0000000..1be8d67
--- /dev/null
@@ -0,0 +1,59 @@
+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
+
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 (file)
index 0000000..5246aed
--- /dev/null
@@ -0,0 +1,541 @@
+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
+
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 (file)
index 0000000..76d912f
--- /dev/null
@@ -0,0 +1,183 @@
+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
+
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 (file)
index 0000000..2b8f7be
--- /dev/null
@@ -0,0 +1,32 @@
+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
+
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 (file)
index 0000000..89ef524
--- /dev/null
@@ -0,0 +1,41 @@
+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
+
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 (file)
index 0000000..489ab4d
--- /dev/null
@@ -0,0 +1,35 @@
+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
+
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 (file)
index 0000000..6e310de
--- /dev/null
@@ -0,0 +1,82 @@
+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
+
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 (file)
index 0000000..e10025e
--- /dev/null
@@ -0,0 +1,47 @@
+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
+
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 (file)
index 0000000..036a6ee
--- /dev/null
@@ -0,0 +1,27 @@
+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
+