Commit cec88ea3 authored by David S. Miller's avatar David S. Miller

Merge branch 'bnxt_en-next'

Michael Chan says:

====================
bnxt_en updates for net-next.

Mostly small miscellaneous changes.

Please review for net-next.  Thanks.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents efb15c39 51f30785
...@@ -3414,7 +3414,8 @@ static int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id) ...@@ -3414,7 +3414,8 @@ static int bnxt_hwrm_vnic_cfg(struct bnxt *bp, u16 vnic_id)
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_VNIC_CFG, -1, -1); bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_VNIC_CFG, -1, -1);
/* Only RSS support for now TBD: COS & LB */ /* Only RSS support for now TBD: COS & LB */
req.enables = cpu_to_le32(VNIC_CFG_REQ_ENABLES_DFLT_RING_GRP | req.enables = cpu_to_le32(VNIC_CFG_REQ_ENABLES_DFLT_RING_GRP |
VNIC_CFG_REQ_ENABLES_RSS_RULE); VNIC_CFG_REQ_ENABLES_RSS_RULE |
VNIC_CFG_REQ_ENABLES_MRU);
req.rss_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx); req.rss_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx);
req.cos_rule = cpu_to_le16(0xffff); req.cos_rule = cpu_to_le16(0xffff);
if (vnic->flags & BNXT_VNIC_RSS_FLAG) if (vnic->flags & BNXT_VNIC_RSS_FLAG)
...@@ -3951,7 +3952,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp) ...@@ -3951,7 +3952,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_ALLOC, -1, -1); bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_ALLOC, -1, -1);
req.update_period_ms = cpu_to_le32(1000); req.update_period_ms = cpu_to_le32(bp->stats_coal_ticks / 1000);
mutex_lock(&bp->hwrm_cmd_lock); mutex_lock(&bp->hwrm_cmd_lock);
for (i = 0; i < bp->cp_nr_rings; i++) { for (i = 0; i < bp->cp_nr_rings; i++) {
...@@ -4025,6 +4026,7 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp) ...@@ -4025,6 +4026,7 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
pf->fw_fid = le16_to_cpu(resp->fid); pf->fw_fid = le16_to_cpu(resp->fid);
pf->port_id = le16_to_cpu(resp->port_id); pf->port_id = le16_to_cpu(resp->port_id);
bp->dev->dev_port = pf->port_id;
memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN); memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN);
memcpy(bp->dev->dev_addr, pf->mac_addr, ETH_ALEN); memcpy(bp->dev->dev_addr, pf->mac_addr, ETH_ALEN);
pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx); pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
...@@ -4315,6 +4317,16 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp) ...@@ -4315,6 +4317,16 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
#endif #endif
} }
/* Allow PF and VF with default VLAN to be in promiscuous mode */
static bool bnxt_promisc_ok(struct bnxt *bp)
{
#ifdef CONFIG_BNXT_SRIOV
if (BNXT_VF(bp) && !bp->vf.vlan)
return false;
#endif
return true;
}
static int bnxt_cfg_rx_mode(struct bnxt *); static int bnxt_cfg_rx_mode(struct bnxt *);
static bool bnxt_mc_list_updated(struct bnxt *, u32 *); static bool bnxt_mc_list_updated(struct bnxt *, u32 *);
...@@ -4380,7 +4392,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init) ...@@ -4380,7 +4392,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
vnic->rx_mask = CFA_L2_SET_RX_MASK_REQ_MASK_BCAST; vnic->rx_mask = CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
if ((bp->dev->flags & IFF_PROMISC) && BNXT_PF(bp)) if ((bp->dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
if (bp->dev->flags & IFF_ALLMULTI) { if (bp->dev->flags & IFF_ALLMULTI) {
...@@ -5295,13 +5307,20 @@ static int bnxt_open(struct net_device *dev) ...@@ -5295,13 +5307,20 @@ static int bnxt_open(struct net_device *dev)
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
int rc = 0; int rc = 0;
if (!test_bit(BNXT_STATE_FN_RST_DONE, &bp->state)) {
rc = bnxt_hwrm_func_reset(bp); rc = bnxt_hwrm_func_reset(bp);
if (rc) { if (rc) {
netdev_err(bp->dev, "hwrm chip reset failure rc: %x\n", netdev_err(bp->dev, "hwrm chip reset failure rc: %x\n",
rc); rc);
rc = -1; rc = -EBUSY;
return rc; return rc;
} }
/* Do func_reset during the 1st PF open only to prevent killing
* the VFs when the PF is brought down and up.
*/
if (BNXT_PF(bp))
set_bit(BNXT_STATE_FN_RST_DONE, &bp->state);
}
return __bnxt_open_nic(bp, true, true); return __bnxt_open_nic(bp, true, true);
} }
...@@ -5520,8 +5539,7 @@ static void bnxt_set_rx_mode(struct net_device *dev) ...@@ -5520,8 +5539,7 @@ static void bnxt_set_rx_mode(struct net_device *dev)
CFA_L2_SET_RX_MASK_REQ_MASK_MCAST | CFA_L2_SET_RX_MASK_REQ_MASK_MCAST |
CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST); CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST);
/* Only allow PF to be in promiscuous mode */ if ((dev->flags & IFF_PROMISC) && bnxt_promisc_ok(bp))
if ((dev->flags & IFF_PROMISC) && BNXT_PF(bp))
mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
uc_update = bnxt_uc_list_updated(bp); uc_update = bnxt_uc_list_updated(bp);
...@@ -5976,6 +5994,8 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev) ...@@ -5976,6 +5994,8 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
bp->tx_coal_ticks_irq = 2; bp->tx_coal_ticks_irq = 2;
bp->tx_coal_bufs_irq = 2; bp->tx_coal_bufs_irq = 2;
bp->stats_coal_ticks = BNXT_DEF_STATS_COAL_TICKS;
init_timer(&bp->timer); init_timer(&bp->timer);
bp->timer.data = (unsigned long)bp; bp->timer.data = (unsigned long)bp;
bp->timer.function = bnxt_timer; bp->timer.function = bnxt_timer;
...@@ -6041,7 +6061,7 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu) ...@@ -6041,7 +6061,7 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
{ {
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
if (new_mtu < 60 || new_mtu > 9000) if (new_mtu < 60 || new_mtu > 9500)
return -EINVAL; return -EINVAL;
if (netif_running(dev)) if (netif_running(dev))
...@@ -6676,6 +6696,7 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev, ...@@ -6676,6 +6696,7 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
pci_channel_state_t state) pci_channel_state_t state)
{ {
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct bnxt *bp = netdev_priv(netdev);
netdev_info(netdev, "PCI I/O error detected\n"); netdev_info(netdev, "PCI I/O error detected\n");
...@@ -6690,6 +6711,8 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev, ...@@ -6690,6 +6711,8 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
if (netif_running(netdev)) if (netif_running(netdev))
bnxt_close(netdev); bnxt_close(netdev);
/* So that func_reset will be done during slot_reset */
clear_bit(BNXT_STATE_FN_RST_DONE, &bp->state);
pci_disable_device(pdev); pci_disable_device(pdev);
rtnl_unlock(); rtnl_unlock();
......
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
#define BNXT_H #define BNXT_H
#define DRV_MODULE_NAME "bnxt_en" #define DRV_MODULE_NAME "bnxt_en"
#define DRV_MODULE_VERSION "1.2.0" #define DRV_MODULE_VERSION "1.3.0"
#define DRV_VER_MAJ 1 #define DRV_VER_MAJ 1
#define DRV_VER_MIN 0 #define DRV_VER_MIN 3
#define DRV_VER_UPD 0 #define DRV_VER_UPD 0
struct tx_bd { struct tx_bd {
...@@ -359,7 +359,8 @@ struct rx_tpa_end_cmp { ...@@ -359,7 +359,8 @@ struct rx_tpa_end_cmp {
RX_TPA_END_CMP_FLAGS_PLACEMENT_ANY_GRO) RX_TPA_END_CMP_FLAGS_PLACEMENT_ANY_GRO)
#define TPA_END_GRO_TS(rx_tpa_end) \ #define TPA_END_GRO_TS(rx_tpa_end) \
((rx_tpa_end)->rx_tpa_end_cmp_tsdelta & cpu_to_le32(RX_TPA_END_GRO_TS)) (!!((rx_tpa_end)->rx_tpa_end_cmp_tsdelta & \
cpu_to_le32(RX_TPA_END_GRO_TS)))
struct rx_tpa_end_cmp_ext { struct rx_tpa_end_cmp_ext {
__le32 rx_tpa_end_cmp_dup_acks; __le32 rx_tpa_end_cmp_dup_acks;
...@@ -753,8 +754,8 @@ struct bnxt_vf_info { ...@@ -753,8 +754,8 @@ struct bnxt_vf_info {
struct bnxt_pf_info { struct bnxt_pf_info {
#define BNXT_FIRST_PF_FID 1 #define BNXT_FIRST_PF_FID 1
#define BNXT_FIRST_VF_FID 128 #define BNXT_FIRST_VF_FID 128
u32 fw_fid; u16 fw_fid;
u8 port_id; u16 port_id;
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
u16 max_rsscos_ctxs; u16 max_rsscos_ctxs;
u16 max_cp_rings; u16 max_cp_rings;
...@@ -1017,6 +1018,7 @@ struct bnxt { ...@@ -1017,6 +1018,7 @@ struct bnxt {
unsigned long state; unsigned long state;
#define BNXT_STATE_OPEN 0 #define BNXT_STATE_OPEN 0
#define BNXT_STATE_IN_SP_TASK 1 #define BNXT_STATE_IN_SP_TASK 1
#define BNXT_STATE_FN_RST_DONE 2
struct bnxt_irq *irq_tbl; struct bnxt_irq *irq_tbl;
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
...@@ -1065,6 +1067,11 @@ struct bnxt { ...@@ -1065,6 +1067,11 @@ struct bnxt {
#define BNXT_USEC_TO_COAL_TIMER(x) ((x) * 25 / 2) #define BNXT_USEC_TO_COAL_TIMER(x) ((x) * 25 / 2)
u32 stats_coal_ticks;
#define BNXT_DEF_STATS_COAL_TICKS 1000000
#define BNXT_MIN_STATS_COAL_TICKS 250000
#define BNXT_MAX_STATS_COAL_TICKS 1000000
struct work_struct sp_task; struct work_struct sp_task;
unsigned long sp_event; unsigned long sp_event;
#define BNXT_RX_MASK_SP_EVENT 0 #define BNXT_RX_MASK_SP_EVENT 0
......
...@@ -56,6 +56,8 @@ static int bnxt_get_coalesce(struct net_device *dev, ...@@ -56,6 +56,8 @@ static int bnxt_get_coalesce(struct net_device *dev,
coal->tx_coalesce_usecs_irq = bp->tx_coal_ticks_irq; coal->tx_coalesce_usecs_irq = bp->tx_coal_ticks_irq;
coal->tx_max_coalesced_frames_irq = bp->tx_coal_bufs_irq; coal->tx_max_coalesced_frames_irq = bp->tx_coal_bufs_irq;
coal->stats_block_coalesce_usecs = bp->stats_coal_ticks;
return 0; return 0;
} }
...@@ -63,6 +65,7 @@ static int bnxt_set_coalesce(struct net_device *dev, ...@@ -63,6 +65,7 @@ static int bnxt_set_coalesce(struct net_device *dev,
struct ethtool_coalesce *coal) struct ethtool_coalesce *coal)
{ {
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
bool update_stats = false;
int rc = 0; int rc = 0;
bp->rx_coal_ticks = coal->rx_coalesce_usecs; bp->rx_coal_ticks = coal->rx_coalesce_usecs;
...@@ -76,8 +79,26 @@ static int bnxt_set_coalesce(struct net_device *dev, ...@@ -76,8 +79,26 @@ static int bnxt_set_coalesce(struct net_device *dev,
bp->tx_coal_ticks_irq = coal->tx_coalesce_usecs_irq; bp->tx_coal_ticks_irq = coal->tx_coalesce_usecs_irq;
bp->tx_coal_bufs_irq = coal->tx_max_coalesced_frames_irq; bp->tx_coal_bufs_irq = coal->tx_max_coalesced_frames_irq;
if (netif_running(dev)) if (bp->stats_coal_ticks != coal->stats_block_coalesce_usecs) {
u32 stats_ticks = coal->stats_block_coalesce_usecs;
stats_ticks = clamp_t(u32, stats_ticks,
BNXT_MIN_STATS_COAL_TICKS,
BNXT_MAX_STATS_COAL_TICKS);
stats_ticks = rounddown(stats_ticks, BNXT_MIN_STATS_COAL_TICKS);
bp->stats_coal_ticks = stats_ticks;
update_stats = true;
}
if (netif_running(dev)) {
if (update_stats) {
rc = bnxt_close_nic(bp, true, false);
if (!rc)
rc = bnxt_open_nic(bp, true, false);
} else {
rc = bnxt_hwrm_set_coal(bp); rc = bnxt_hwrm_set_coal(bp);
}
}
return rc; return rc;
} }
...@@ -961,7 +982,7 @@ static int bnxt_set_pauseparam(struct net_device *dev, ...@@ -961,7 +982,7 @@ static int bnxt_set_pauseparam(struct net_device *dev,
struct bnxt_link_info *link_info = &bp->link_info; struct bnxt_link_info *link_info = &bp->link_info;
if (!BNXT_SINGLE_PF(bp)) if (!BNXT_SINGLE_PF(bp))
return rc; return -EOPNOTSUPP;
if (epause->autoneg) { if (epause->autoneg) {
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) if (!(link_info->autoneg & BNXT_AUTONEG_SPEED))
...@@ -1059,6 +1080,8 @@ static int bnxt_firmware_reset(struct net_device *dev, ...@@ -1059,6 +1080,8 @@ static int bnxt_firmware_reset(struct net_device *dev,
case BNX_DIR_TYPE_APE_FW: case BNX_DIR_TYPE_APE_FW:
case BNX_DIR_TYPE_APE_PATCH: case BNX_DIR_TYPE_APE_PATCH:
req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_MGMT; req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_MGMT;
/* Self-reset APE upon next PCIe reset: */
req.selfrst_status = FW_RESET_REQ_SELFRST_STATUS_SELFRSTPCIERST;
break; break;
case BNX_DIR_TYPE_KONG_FW: case BNX_DIR_TYPE_KONG_FW:
case BNX_DIR_TYPE_KONG_PATCH: case BNX_DIR_TYPE_KONG_PATCH:
...@@ -1092,9 +1115,27 @@ static int bnxt_flash_firmware(struct net_device *dev, ...@@ -1092,9 +1115,27 @@ static int bnxt_flash_firmware(struct net_device *dev,
case BNX_DIR_TYPE_BOOTCODE_2: case BNX_DIR_TYPE_BOOTCODE_2:
code_type = CODE_BOOT; code_type = CODE_BOOT;
break; break;
case BNX_DIR_TYPE_CHIMP_PATCH:
code_type = CODE_CHIMP_PATCH;
break;
case BNX_DIR_TYPE_APE_FW: case BNX_DIR_TYPE_APE_FW:
code_type = CODE_MCTP_PASSTHRU; code_type = CODE_MCTP_PASSTHRU;
break; break;
case BNX_DIR_TYPE_APE_PATCH:
code_type = CODE_APE_PATCH;
break;
case BNX_DIR_TYPE_KONG_FW:
code_type = CODE_KONG_FW;
break;
case BNX_DIR_TYPE_KONG_PATCH:
code_type = CODE_KONG_PATCH;
break;
case BNX_DIR_TYPE_BONO_FW:
code_type = CODE_BONO_FW;
break;
case BNX_DIR_TYPE_BONO_PATCH:
code_type = CODE_BONO_PATCH;
break;
default: default:
netdev_err(dev, "Unsupported directory entry type: %u\n", netdev_err(dev, "Unsupported directory entry type: %u\n",
dir_type); dir_type);
...@@ -1149,6 +1190,8 @@ static bool bnxt_dir_type_is_ape_bin_format(u16 dir_type) ...@@ -1149,6 +1190,8 @@ static bool bnxt_dir_type_is_ape_bin_format(u16 dir_type)
case BNX_DIR_TYPE_APE_PATCH: case BNX_DIR_TYPE_APE_PATCH:
case BNX_DIR_TYPE_KONG_FW: case BNX_DIR_TYPE_KONG_FW:
case BNX_DIR_TYPE_KONG_PATCH: case BNX_DIR_TYPE_KONG_PATCH:
case BNX_DIR_TYPE_BONO_FW:
case BNX_DIR_TYPE_BONO_PATCH:
return true; return true;
} }
...@@ -1186,7 +1229,8 @@ static int bnxt_flash_firmware_from_file(struct net_device *dev, ...@@ -1186,7 +1229,8 @@ static int bnxt_flash_firmware_from_file(struct net_device *dev,
const struct firmware *fw; const struct firmware *fw;
int rc; int rc;
if (bnxt_dir_type_is_executable(dir_type) == false) if (dir_type != BNX_DIR_TYPE_UPDATE &&
bnxt_dir_type_is_executable(dir_type) == false)
return -EINVAL; return -EINVAL;
rc = request_firmware(&fw, filename, &dev->dev); rc = request_firmware(&fw, filename, &dev->dev);
...@@ -1483,7 +1527,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata) ...@@ -1483,7 +1527,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata)
int rc = 0; int rc = 0;
if (!BNXT_SINGLE_PF(bp)) if (!BNXT_SINGLE_PF(bp))
return 0; return -EOPNOTSUPP;
if (!(bp->flags & BNXT_FLAG_EEE_CAP)) if (!(bp->flags & BNXT_FLAG_EEE_CAP))
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -70,6 +70,7 @@ enum SUPPORTED_CODE { ...@@ -70,6 +70,7 @@ enum SUPPORTED_CODE {
CODE_KONG_PATCH, /* 18 - KONG Patch firmware */ CODE_KONG_PATCH, /* 18 - KONG Patch firmware */
CODE_BONO_FW, /* 19 - BONO firmware */ CODE_BONO_FW, /* 19 - BONO firmware */
CODE_BONO_PATCH, /* 20 - BONO Patch firmware */ CODE_BONO_PATCH, /* 20 - BONO Patch firmware */
CODE_CHIMP_PATCH, /* 21 - ChiMP Patch firmware */
MAX_CODE_TYPE, MAX_CODE_TYPE,
}; };
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
enum bnxt_nvm_directory_type { enum bnxt_nvm_directory_type {
BNX_DIR_TYPE_UNUSED = 0, BNX_DIR_TYPE_UNUSED = 0,
BNX_DIR_TYPE_PKG_LOG = 1, BNX_DIR_TYPE_PKG_LOG = 1,
BNX_DIR_TYPE_UPDATE = 2,
BNX_DIR_TYPE_CHIMP_PATCH = 3, BNX_DIR_TYPE_CHIMP_PATCH = 3,
BNX_DIR_TYPE_BOOTCODE = 4, BNX_DIR_TYPE_BOOTCODE = 4,
BNX_DIR_TYPE_VPD = 5, BNX_DIR_TYPE_VPD = 5,
......
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