bnxt_en: Enable NPAR (NIC Partitioning) Support.
authorSatish Baddipadige <sbaddipa@broadcom.com>
Mon, 13 Jun 2016 06:25:31 +0000 (02:25 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Jun 2016 23:16:13 +0000 (19:16 -0400)
NPAR type is read from bnxt_hwrm_func_qcfg.  Do not allow changing link
parameters if in NPAR mode sinc ethe port is shared among multiple
partitions.  The link parameters are set up by firmware.

Signed-off-by: Satish Baddipadige <sbaddipa@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.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 51f9e3839ee9247f3181edd762a1d10d88e730b1..9d785e6d194fd288c3d62765e656f3e260078cc3 100644 (file)
@@ -3850,6 +3850,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
 static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
 {
        struct hwrm_func_qcfg_input req = {0};
+       struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
        int rc;
 
        bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCFG, -1, -1);
@@ -3861,12 +3862,18 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
 
 #ifdef CONFIG_BNXT_SRIOV
        if (BNXT_VF(bp)) {
-               struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
                struct bnxt_vf_info *vf = &bp->vf;
 
                vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
        }
 #endif
+       switch (resp->port_partition_type) {
+       case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_0:
+       case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5:
+       case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR2_0:
+               bp->port_partition_type = resp->port_partition_type;
+               break;
+       }
 
 func_qcfg_exit:
        mutex_unlock(&bp->hwrm_cmd_lock);
@@ -4965,7 +4972,7 @@ static int bnxt_hwrm_shutdown_link(struct bnxt *bp)
 {
        struct hwrm_port_phy_cfg_input req = {0};
 
-       if (BNXT_VF(bp))
+       if (!BNXT_SINGLE_PF(bp))
                return 0;
 
        if (pci_num_vf(bp->pdev))
@@ -6427,6 +6434,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto init_err;
        }
 
+       bnxt_hwrm_func_qcfg(bp);
+
        bnxt_set_tpa_flags(bp);
        bnxt_set_ring_params(bp);
        if (BNXT_PF(bp))
index 538eb1c52d944b0d9829174f135718977d945ec8..ec18a07f90b4cc328e2767b4d00be1e9d150e602 100644 (file)
@@ -907,6 +907,8 @@ struct bnxt {
 
 #define BNXT_PF(bp)            (!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)            ((bp)->flags & BNXT_FLAG_VF)
+#define BNXT_NPAR(bp)          ((bp)->port_partition_type)
+#define BNXT_SINGLE_PF(bp)     (BNXT_PF(bp) && !BNXT_NPAR(bp))
 
        struct bnxt_napi        **bnapi;
 
@@ -993,6 +995,7 @@ struct bnxt {
        __le16                  vxlan_fw_dst_port_id;
        u8                      nge_port_cnt;
        __le16                  nge_fw_dst_port_id;
+       u8                      port_partition_type;
 
        u16                     rx_coal_ticks;
        u16                     rx_coal_ticks_irq;
index a38cb047b54083897fa6e8df5c098c7e1b98d7ac..89050ed2046ff4a9ba3c36dea004a24ea19b6c62 100644 (file)
@@ -823,7 +823,7 @@ static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
        u32 speed, fw_advertising = 0;
        bool set_pause = false;
 
-       if (BNXT_VF(bp))
+       if (!BNXT_SINGLE_PF(bp))
                return rc;
 
        if (cmd->autoneg == AUTONEG_ENABLE) {
@@ -911,7 +911,7 @@ static int bnxt_set_pauseparam(struct net_device *dev,
        struct bnxt *bp = netdev_priv(dev);
        struct bnxt_link_info *link_info = &bp->link_info;
 
-       if (BNXT_VF(bp))
+       if (!BNXT_SINGLE_PF(bp))
                return rc;
 
        if (epause->autoneg) {
@@ -1433,7 +1433,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata)
                 _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
        int rc = 0;
 
-       if (BNXT_VF(bp))
+       if (!BNXT_SINGLE_PF(bp))
                return 0;
 
        if (!(bp->flags & BNXT_FLAG_EEE_CAP))