Commit 567b2abe authored by Satish Baddipadige's avatar Satish Baddipadige Committed by David S. Miller

bnxt_en: Enable NPAR (NIC Partitioning) Support.

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: default avatarSatish Baddipadige <sbaddipa@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fc0f1929
...@@ -3850,6 +3850,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp) ...@@ -3850,6 +3850,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
static int bnxt_hwrm_func_qcfg(struct bnxt *bp) static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
{ {
struct hwrm_func_qcfg_input req = {0}; struct hwrm_func_qcfg_input req = {0};
struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCFG, -1, -1); 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) ...@@ -3861,12 +3862,18 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
#ifdef CONFIG_BNXT_SRIOV #ifdef CONFIG_BNXT_SRIOV
if (BNXT_VF(bp)) { if (BNXT_VF(bp)) {
struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
struct bnxt_vf_info *vf = &bp->vf; struct bnxt_vf_info *vf = &bp->vf;
vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
} }
#endif #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: func_qcfg_exit:
mutex_unlock(&bp->hwrm_cmd_lock); mutex_unlock(&bp->hwrm_cmd_lock);
...@@ -4965,7 +4972,7 @@ static int bnxt_hwrm_shutdown_link(struct bnxt *bp) ...@@ -4965,7 +4972,7 @@ static int bnxt_hwrm_shutdown_link(struct bnxt *bp)
{ {
struct hwrm_port_phy_cfg_input req = {0}; struct hwrm_port_phy_cfg_input req = {0};
if (BNXT_VF(bp)) if (!BNXT_SINGLE_PF(bp))
return 0; return 0;
if (pci_num_vf(bp->pdev)) 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) ...@@ -6427,6 +6434,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
goto init_err; goto init_err;
} }
bnxt_hwrm_func_qcfg(bp);
bnxt_set_tpa_flags(bp); bnxt_set_tpa_flags(bp);
bnxt_set_ring_params(bp); bnxt_set_ring_params(bp);
if (BNXT_PF(bp)) if (BNXT_PF(bp))
......
...@@ -907,6 +907,8 @@ struct bnxt { ...@@ -907,6 +907,8 @@ struct bnxt {
#define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF)) #define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF))
#define BNXT_VF(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; struct bnxt_napi **bnapi;
...@@ -993,6 +995,7 @@ struct bnxt { ...@@ -993,6 +995,7 @@ struct bnxt {
__le16 vxlan_fw_dst_port_id; __le16 vxlan_fw_dst_port_id;
u8 nge_port_cnt; u8 nge_port_cnt;
__le16 nge_fw_dst_port_id; __le16 nge_fw_dst_port_id;
u8 port_partition_type;
u16 rx_coal_ticks; u16 rx_coal_ticks;
u16 rx_coal_ticks_irq; u16 rx_coal_ticks_irq;
......
...@@ -823,7 +823,7 @@ static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -823,7 +823,7 @@ static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
u32 speed, fw_advertising = 0; u32 speed, fw_advertising = 0;
bool set_pause = false; bool set_pause = false;
if (BNXT_VF(bp)) if (!BNXT_SINGLE_PF(bp))
return rc; return rc;
if (cmd->autoneg == AUTONEG_ENABLE) { if (cmd->autoneg == AUTONEG_ENABLE) {
...@@ -911,7 +911,7 @@ static int bnxt_set_pauseparam(struct net_device *dev, ...@@ -911,7 +911,7 @@ static int bnxt_set_pauseparam(struct net_device *dev,
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
struct bnxt_link_info *link_info = &bp->link_info; struct bnxt_link_info *link_info = &bp->link_info;
if (BNXT_VF(bp)) if (!BNXT_SINGLE_PF(bp))
return rc; return rc;
if (epause->autoneg) { if (epause->autoneg) {
...@@ -1433,7 +1433,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata) ...@@ -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); _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
int rc = 0; int rc = 0;
if (BNXT_VF(bp)) if (!BNXT_SINGLE_PF(bp))
return 0; return 0;
if (!(bp->flags & BNXT_FLAG_EEE_CAP)) if (!(bp->flags & BNXT_FLAG_EEE_CAP))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment