diff options
Diffstat (limited to 'drivers/net')
25 files changed, 155 insertions, 58 deletions
diff --git a/drivers/net/dsa/bcm_sf2_cfp.c b/drivers/net/dsa/bcm_sf2_cfp.c index e6234d209787..4212bc4a5f31 100644 --- a/drivers/net/dsa/bcm_sf2_cfp.c +++ b/drivers/net/dsa/bcm_sf2_cfp.c | |||
@@ -886,6 +886,9 @@ static int bcm_sf2_cfp_rule_set(struct dsa_switch *ds, int port, | |||
886 | fs->m_ext.data[1])) | 886 | fs->m_ext.data[1])) |
887 | return -EINVAL; | 887 | return -EINVAL; |
888 | 888 | ||
889 | if (fs->location != RX_CLS_LOC_ANY && fs->location >= CFP_NUM_RULES) | ||
890 | return -EINVAL; | ||
891 | |||
889 | if (fs->location != RX_CLS_LOC_ANY && | 892 | if (fs->location != RX_CLS_LOC_ANY && |
890 | test_bit(fs->location, priv->cfp.used)) | 893 | test_bit(fs->location, priv->cfp.used)) |
891 | return -EBUSY; | 894 | return -EBUSY; |
@@ -974,6 +977,9 @@ static int bcm_sf2_cfp_rule_del(struct bcm_sf2_priv *priv, int port, u32 loc) | |||
974 | struct cfp_rule *rule; | 977 | struct cfp_rule *rule; |
975 | int ret; | 978 | int ret; |
976 | 979 | ||
980 | if (loc >= CFP_NUM_RULES) | ||
981 | return -EINVAL; | ||
982 | |||
977 | /* Refuse deleting unused rules, and those that are not unique since | 983 | /* Refuse deleting unused rules, and those that are not unique since |
978 | * that could leave IPv6 rules with one of the chained rule in the | 984 | * that could leave IPv6 rules with one of the chained rule in the |
979 | * table. | 985 | * table. |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 526f36dcb204..a0de3c368f4a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
@@ -1625,7 +1625,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, | |||
1625 | netdev_warn(bp->dev, "RX buffer error %x\n", rx_err); | 1625 | netdev_warn(bp->dev, "RX buffer error %x\n", rx_err); |
1626 | bnxt_sched_reset(bp, rxr); | 1626 | bnxt_sched_reset(bp, rxr); |
1627 | } | 1627 | } |
1628 | goto next_rx; | 1628 | goto next_rx_no_len; |
1629 | } | 1629 | } |
1630 | 1630 | ||
1631 | len = le32_to_cpu(rxcmp->rx_cmp_len_flags_type) >> RX_CMP_LEN_SHIFT; | 1631 | len = le32_to_cpu(rxcmp->rx_cmp_len_flags_type) >> RX_CMP_LEN_SHIFT; |
@@ -1706,12 +1706,13 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, | |||
1706 | rc = 1; | 1706 | rc = 1; |
1707 | 1707 | ||
1708 | next_rx: | 1708 | next_rx: |
1709 | rxr->rx_prod = NEXT_RX(prod); | ||
1710 | rxr->rx_next_cons = NEXT_RX(cons); | ||
1711 | |||
1712 | cpr->rx_packets += 1; | 1709 | cpr->rx_packets += 1; |
1713 | cpr->rx_bytes += len; | 1710 | cpr->rx_bytes += len; |
1714 | 1711 | ||
1712 | next_rx_no_len: | ||
1713 | rxr->rx_prod = NEXT_RX(prod); | ||
1714 | rxr->rx_next_cons = NEXT_RX(cons); | ||
1715 | |||
1715 | next_rx_no_prod_no_len: | 1716 | next_rx_no_prod_no_len: |
1716 | *raw_cons = tmp_raw_cons; | 1717 | *raw_cons = tmp_raw_cons; |
1717 | 1718 | ||
@@ -5135,10 +5136,10 @@ static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path) | |||
5135 | for (i = 0; i < bp->tx_nr_rings; i++) { | 5136 | for (i = 0; i < bp->tx_nr_rings; i++) { |
5136 | struct bnxt_tx_ring_info *txr = &bp->tx_ring[i]; | 5137 | struct bnxt_tx_ring_info *txr = &bp->tx_ring[i]; |
5137 | struct bnxt_ring_struct *ring = &txr->tx_ring_struct; | 5138 | struct bnxt_ring_struct *ring = &txr->tx_ring_struct; |
5138 | u32 cmpl_ring_id; | ||
5139 | 5139 | ||
5140 | cmpl_ring_id = bnxt_cp_ring_for_tx(bp, txr); | ||
5141 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { | 5140 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { |
5141 | u32 cmpl_ring_id = bnxt_cp_ring_for_tx(bp, txr); | ||
5142 | |||
5142 | hwrm_ring_free_send_msg(bp, ring, | 5143 | hwrm_ring_free_send_msg(bp, ring, |
5143 | RING_FREE_REQ_RING_TYPE_TX, | 5144 | RING_FREE_REQ_RING_TYPE_TX, |
5144 | close_path ? cmpl_ring_id : | 5145 | close_path ? cmpl_ring_id : |
@@ -5151,10 +5152,10 @@ static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path) | |||
5151 | struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; | 5152 | struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; |
5152 | struct bnxt_ring_struct *ring = &rxr->rx_ring_struct; | 5153 | struct bnxt_ring_struct *ring = &rxr->rx_ring_struct; |
5153 | u32 grp_idx = rxr->bnapi->index; | 5154 | u32 grp_idx = rxr->bnapi->index; |
5154 | u32 cmpl_ring_id; | ||
5155 | 5155 | ||
5156 | cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr); | ||
5157 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { | 5156 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { |
5157 | u32 cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr); | ||
5158 | |||
5158 | hwrm_ring_free_send_msg(bp, ring, | 5159 | hwrm_ring_free_send_msg(bp, ring, |
5159 | RING_FREE_REQ_RING_TYPE_RX, | 5160 | RING_FREE_REQ_RING_TYPE_RX, |
5160 | close_path ? cmpl_ring_id : | 5161 | close_path ? cmpl_ring_id : |
@@ -5173,10 +5174,10 @@ static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path) | |||
5173 | struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; | 5174 | struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; |
5174 | struct bnxt_ring_struct *ring = &rxr->rx_agg_ring_struct; | 5175 | struct bnxt_ring_struct *ring = &rxr->rx_agg_ring_struct; |
5175 | u32 grp_idx = rxr->bnapi->index; | 5176 | u32 grp_idx = rxr->bnapi->index; |
5176 | u32 cmpl_ring_id; | ||
5177 | 5177 | ||
5178 | cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr); | ||
5179 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { | 5178 | if (ring->fw_ring_id != INVALID_HW_RING_ID) { |
5179 | u32 cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr); | ||
5180 | |||
5180 | hwrm_ring_free_send_msg(bp, ring, type, | 5181 | hwrm_ring_free_send_msg(bp, ring, type, |
5181 | close_path ? cmpl_ring_id : | 5182 | close_path ? cmpl_ring_id : |
5182 | INVALID_HW_RING_ID); | 5183 | INVALID_HW_RING_ID); |
@@ -5315,17 +5316,16 @@ __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct hwrm_func_cfg_input *req, | |||
5315 | req->num_tx_rings = cpu_to_le16(tx_rings); | 5316 | req->num_tx_rings = cpu_to_le16(tx_rings); |
5316 | if (BNXT_NEW_RM(bp)) { | 5317 | if (BNXT_NEW_RM(bp)) { |
5317 | enables |= rx_rings ? FUNC_CFG_REQ_ENABLES_NUM_RX_RINGS : 0; | 5318 | enables |= rx_rings ? FUNC_CFG_REQ_ENABLES_NUM_RX_RINGS : 0; |
5319 | enables |= stats ? FUNC_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5318 | if (bp->flags & BNXT_FLAG_CHIP_P5) { | 5320 | if (bp->flags & BNXT_FLAG_CHIP_P5) { |
5319 | enables |= cp_rings ? FUNC_CFG_REQ_ENABLES_NUM_MSIX : 0; | 5321 | enables |= cp_rings ? FUNC_CFG_REQ_ENABLES_NUM_MSIX : 0; |
5320 | enables |= tx_rings + ring_grps ? | 5322 | enables |= tx_rings + ring_grps ? |
5321 | FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS | | 5323 | FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0; |
5322 | FUNC_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5323 | enables |= rx_rings ? | 5324 | enables |= rx_rings ? |
5324 | FUNC_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; | 5325 | FUNC_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; |
5325 | } else { | 5326 | } else { |
5326 | enables |= cp_rings ? | 5327 | enables |= cp_rings ? |
5327 | FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS | | 5328 | FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0; |
5328 | FUNC_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5329 | enables |= ring_grps ? | 5329 | enables |= ring_grps ? |
5330 | FUNC_CFG_REQ_ENABLES_NUM_HW_RING_GRPS | | 5330 | FUNC_CFG_REQ_ENABLES_NUM_HW_RING_GRPS | |
5331 | FUNC_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; | 5331 | FUNC_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; |
@@ -5365,14 +5365,13 @@ __bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, | |||
5365 | enables |= tx_rings ? FUNC_VF_CFG_REQ_ENABLES_NUM_TX_RINGS : 0; | 5365 | enables |= tx_rings ? FUNC_VF_CFG_REQ_ENABLES_NUM_TX_RINGS : 0; |
5366 | enables |= rx_rings ? FUNC_VF_CFG_REQ_ENABLES_NUM_RX_RINGS | | 5366 | enables |= rx_rings ? FUNC_VF_CFG_REQ_ENABLES_NUM_RX_RINGS | |
5367 | FUNC_VF_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; | 5367 | FUNC_VF_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0; |
5368 | enables |= stats ? FUNC_VF_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5368 | if (bp->flags & BNXT_FLAG_CHIP_P5) { | 5369 | if (bp->flags & BNXT_FLAG_CHIP_P5) { |
5369 | enables |= tx_rings + ring_grps ? | 5370 | enables |= tx_rings + ring_grps ? |
5370 | FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS | | 5371 | FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0; |
5371 | FUNC_VF_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5372 | } else { | 5372 | } else { |
5373 | enables |= cp_rings ? | 5373 | enables |= cp_rings ? |
5374 | FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS | | 5374 | FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0; |
5375 | FUNC_VF_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0; | ||
5376 | enables |= ring_grps ? | 5375 | enables |= ring_grps ? |
5377 | FUNC_VF_CFG_REQ_ENABLES_NUM_HW_RING_GRPS : 0; | 5376 | FUNC_VF_CFG_REQ_ENABLES_NUM_HW_RING_GRPS : 0; |
5378 | } | 5377 | } |
@@ -6753,6 +6752,7 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp) | |||
6753 | struct hwrm_queue_pri2cos_qcfg_input req2 = {0}; | 6752 | struct hwrm_queue_pri2cos_qcfg_input req2 = {0}; |
6754 | struct hwrm_port_qstats_ext_input req = {0}; | 6753 | struct hwrm_port_qstats_ext_input req = {0}; |
6755 | struct bnxt_pf_info *pf = &bp->pf; | 6754 | struct bnxt_pf_info *pf = &bp->pf; |
6755 | u32 tx_stat_size; | ||
6756 | int rc; | 6756 | int rc; |
6757 | 6757 | ||
6758 | if (!(bp->flags & BNXT_FLAG_PORT_STATS_EXT)) | 6758 | if (!(bp->flags & BNXT_FLAG_PORT_STATS_EXT)) |
@@ -6762,13 +6762,16 @@ static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp) | |||
6762 | req.port_id = cpu_to_le16(pf->port_id); | 6762 | req.port_id = cpu_to_le16(pf->port_id); |
6763 | req.rx_stat_size = cpu_to_le16(sizeof(struct rx_port_stats_ext)); | 6763 | req.rx_stat_size = cpu_to_le16(sizeof(struct rx_port_stats_ext)); |
6764 | req.rx_stat_host_addr = cpu_to_le64(bp->hw_rx_port_stats_ext_map); | 6764 | req.rx_stat_host_addr = cpu_to_le64(bp->hw_rx_port_stats_ext_map); |
6765 | req.tx_stat_size = cpu_to_le16(sizeof(struct tx_port_stats_ext)); | 6765 | tx_stat_size = bp->hw_tx_port_stats_ext ? |
6766 | sizeof(*bp->hw_tx_port_stats_ext) : 0; | ||
6767 | req.tx_stat_size = cpu_to_le16(tx_stat_size); | ||
6766 | req.tx_stat_host_addr = cpu_to_le64(bp->hw_tx_port_stats_ext_map); | 6768 | req.tx_stat_host_addr = cpu_to_le64(bp->hw_tx_port_stats_ext_map); |
6767 | mutex_lock(&bp->hwrm_cmd_lock); | 6769 | mutex_lock(&bp->hwrm_cmd_lock); |
6768 | rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); | 6770 | rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); |
6769 | if (!rc) { | 6771 | if (!rc) { |
6770 | bp->fw_rx_stats_ext_size = le16_to_cpu(resp->rx_stat_size) / 8; | 6772 | bp->fw_rx_stats_ext_size = le16_to_cpu(resp->rx_stat_size) / 8; |
6771 | bp->fw_tx_stats_ext_size = le16_to_cpu(resp->tx_stat_size) / 8; | 6773 | bp->fw_tx_stats_ext_size = tx_stat_size ? |
6774 | le16_to_cpu(resp->tx_stat_size) / 8 : 0; | ||
6772 | } else { | 6775 | } else { |
6773 | bp->fw_rx_stats_ext_size = 0; | 6776 | bp->fw_rx_stats_ext_size = 0; |
6774 | bp->fw_tx_stats_ext_size = 0; | 6777 | bp->fw_tx_stats_ext_size = 0; |
@@ -8961,8 +8964,15 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) | |||
8961 | 8964 | ||
8962 | skip_uc: | 8965 | skip_uc: |
8963 | rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0); | 8966 | rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0); |
8967 | if (rc && vnic->mc_list_count) { | ||
8968 | netdev_info(bp->dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n", | ||
8969 | rc); | ||
8970 | vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; | ||
8971 | vnic->mc_list_count = 0; | ||
8972 | rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0); | ||
8973 | } | ||
8964 | if (rc) | 8974 | if (rc) |
8965 | netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %x\n", | 8975 | netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %d\n", |
8966 | rc); | 8976 | rc); |
8967 | 8977 | ||
8968 | return rc; | 8978 | return rc; |
@@ -10699,6 +10709,7 @@ init_err_cleanup_tc: | |||
10699 | bnxt_clear_int_mode(bp); | 10709 | bnxt_clear_int_mode(bp); |
10700 | 10710 | ||
10701 | init_err_pci_clean: | 10711 | init_err_pci_clean: |
10712 | bnxt_free_hwrm_short_cmd_req(bp); | ||
10702 | bnxt_free_hwrm_resources(bp); | 10713 | bnxt_free_hwrm_resources(bp); |
10703 | bnxt_free_ctx_mem(bp); | 10714 | bnxt_free_ctx_mem(bp); |
10704 | kfree(bp->ctx); | 10715 | kfree(bp->ctx); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c index 062a600fa5a7..21428537e231 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c | |||
@@ -333,6 +333,9 @@ static int stm32mp1_parse_data(struct stm32_dwmac *dwmac, | |||
333 | */ | 333 | */ |
334 | dwmac->irq_pwr_wakeup = platform_get_irq_byname(pdev, | 334 | dwmac->irq_pwr_wakeup = platform_get_irq_byname(pdev, |
335 | "stm32_pwr_wakeup"); | 335 | "stm32_pwr_wakeup"); |
336 | if (dwmac->irq_pwr_wakeup == -EPROBE_DEFER) | ||
337 | return -EPROBE_DEFER; | ||
338 | |||
336 | if (!dwmac->clk_eth_ck && dwmac->irq_pwr_wakeup >= 0) { | 339 | if (!dwmac->clk_eth_ck && dwmac->irq_pwr_wakeup >= 0) { |
337 | err = device_init_wakeup(&pdev->dev, true); | 340 | err = device_init_wakeup(&pdev->dev, true); |
338 | if (err) { | 341 | if (err) { |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index cc1e887e47b5..26db6aa002d1 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
@@ -160,7 +160,7 @@ static const struct dmi_system_id quark_pci_dmi[] = { | |||
160 | .driver_data = (void *)&galileo_stmmac_dmi_data, | 160 | .driver_data = (void *)&galileo_stmmac_dmi_data, |
161 | }, | 161 | }, |
162 | /* | 162 | /* |
163 | * There are 2 types of SIMATIC IOT2000: IOT20202 and IOT2040. | 163 | * There are 2 types of SIMATIC IOT2000: IOT2020 and IOT2040. |
164 | * The asset tag "6ES7647-0AA00-0YA2" is only for IOT2020 which | 164 | * The asset tag "6ES7647-0AA00-0YA2" is only for IOT2020 which |
165 | * has only one pci network device while other asset tags are | 165 | * has only one pci network device while other asset tags are |
166 | * for IOT2040 which has two. | 166 | * for IOT2040 which has two. |
diff --git a/drivers/net/ieee802154/mcr20a.c b/drivers/net/ieee802154/mcr20a.c index c589f5ae75bb..8bb53ec8d9cf 100644 --- a/drivers/net/ieee802154/mcr20a.c +++ b/drivers/net/ieee802154/mcr20a.c | |||
@@ -533,6 +533,8 @@ mcr20a_start(struct ieee802154_hw *hw) | |||
533 | dev_dbg(printdev(lp), "no slotted operation\n"); | 533 | dev_dbg(printdev(lp), "no slotted operation\n"); |
534 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1, | 534 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1, |
535 | DAR_PHY_CTRL1_SLOTTED, 0x0); | 535 | DAR_PHY_CTRL1_SLOTTED, 0x0); |
536 | if (ret < 0) | ||
537 | return ret; | ||
536 | 538 | ||
537 | /* enable irq */ | 539 | /* enable irq */ |
538 | enable_irq(lp->spi->irq); | 540 | enable_irq(lp->spi->irq); |
@@ -540,11 +542,15 @@ mcr20a_start(struct ieee802154_hw *hw) | |||
540 | /* Unmask SEQ interrupt */ | 542 | /* Unmask SEQ interrupt */ |
541 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL2, | 543 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL2, |
542 | DAR_PHY_CTRL2_SEQMSK, 0x0); | 544 | DAR_PHY_CTRL2_SEQMSK, 0x0); |
545 | if (ret < 0) | ||
546 | return ret; | ||
543 | 547 | ||
544 | /* Start the RX sequence */ | 548 | /* Start the RX sequence */ |
545 | dev_dbg(printdev(lp), "start the RX sequence\n"); | 549 | dev_dbg(printdev(lp), "start the RX sequence\n"); |
546 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1, | 550 | ret = regmap_update_bits(lp->regmap_dar, DAR_PHY_CTRL1, |
547 | DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_RX); | 551 | DAR_PHY_CTRL1_XCVSEQ_MASK, MCR20A_XCVSEQ_RX); |
552 | if (ret < 0) | ||
553 | return ret; | ||
548 | 554 | ||
549 | return 0; | 555 | return 0; |
550 | } | 556 | } |
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index a7e8c8113d97..a7796134e3be 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c | |||
@@ -1597,9 +1597,10 @@ static int marvell_get_sset_count(struct phy_device *phydev) | |||
1597 | 1597 | ||
1598 | static void marvell_get_strings(struct phy_device *phydev, u8 *data) | 1598 | static void marvell_get_strings(struct phy_device *phydev, u8 *data) |
1599 | { | 1599 | { |
1600 | int count = marvell_get_sset_count(phydev); | ||
1600 | int i; | 1601 | int i; |
1601 | 1602 | ||
1602 | for (i = 0; i < ARRAY_SIZE(marvell_hw_stats); i++) { | 1603 | for (i = 0; i < count; i++) { |
1603 | strlcpy(data + i * ETH_GSTRING_LEN, | 1604 | strlcpy(data + i * ETH_GSTRING_LEN, |
1604 | marvell_hw_stats[i].string, ETH_GSTRING_LEN); | 1605 | marvell_hw_stats[i].string, ETH_GSTRING_LEN); |
1605 | } | 1606 | } |
@@ -1627,9 +1628,10 @@ static u64 marvell_get_stat(struct phy_device *phydev, int i) | |||
1627 | static void marvell_get_stats(struct phy_device *phydev, | 1628 | static void marvell_get_stats(struct phy_device *phydev, |
1628 | struct ethtool_stats *stats, u64 *data) | 1629 | struct ethtool_stats *stats, u64 *data) |
1629 | { | 1630 | { |
1631 | int count = marvell_get_sset_count(phydev); | ||
1630 | int i; | 1632 | int i; |
1631 | 1633 | ||
1632 | for (i = 0; i < ARRAY_SIZE(marvell_hw_stats); i++) | 1634 | for (i = 0; i < count; i++) |
1633 | data[i] = marvell_get_stat(phydev, i); | 1635 | data[i] = marvell_get_stat(phydev, i); |
1634 | } | 1636 | } |
1635 | 1637 | ||
diff --git a/drivers/net/slip/slhc.c b/drivers/net/slip/slhc.c index f4e93f5fc204..ea90db3c7705 100644 --- a/drivers/net/slip/slhc.c +++ b/drivers/net/slip/slhc.c | |||
@@ -153,7 +153,7 @@ out_fail: | |||
153 | void | 153 | void |
154 | slhc_free(struct slcompress *comp) | 154 | slhc_free(struct slcompress *comp) |
155 | { | 155 | { |
156 | if ( comp == NULLSLCOMPR ) | 156 | if ( IS_ERR_OR_NULL(comp) ) |
157 | return; | 157 | return; |
158 | 158 | ||
159 | if ( comp->tstate != NULLSLSTATE ) | 159 | if ( comp->tstate != NULLSLSTATE ) |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 18c4e5d17b05..5c3ac97519b7 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -1131,9 +1131,16 @@ static const struct usb_device_id products[] = { | |||
1131 | {QMI_FIXED_INTF(0x0846, 0x68d3, 8)}, /* Netgear Aircard 779S */ | 1131 | {QMI_FIXED_INTF(0x0846, 0x68d3, 8)}, /* Netgear Aircard 779S */ |
1132 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 1132 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
1133 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ | 1133 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
1134 | {QMI_FIXED_INTF(0x1435, 0x0918, 3)}, /* Wistron NeWeb D16Q1 */ | ||
1135 | {QMI_FIXED_INTF(0x1435, 0x0918, 4)}, /* Wistron NeWeb D16Q1 */ | ||
1136 | {QMI_FIXED_INTF(0x1435, 0x0918, 5)}, /* Wistron NeWeb D16Q1 */ | ||
1137 | {QMI_FIXED_INTF(0x1435, 0x3185, 4)}, /* Wistron NeWeb M18Q5 */ | ||
1138 | {QMI_FIXED_INTF(0x1435, 0xd111, 4)}, /* M9615A DM11-1 D51QC */ | ||
1134 | {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ | 1139 | {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ |
1135 | {QMI_FIXED_INTF(0x1435, 0xd181, 4)}, /* Wistron NeWeb D18Q1 */ | 1140 | {QMI_FIXED_INTF(0x1435, 0xd181, 4)}, /* Wistron NeWeb D18Q1 */ |
1136 | {QMI_FIXED_INTF(0x1435, 0xd181, 5)}, /* Wistron NeWeb D18Q1 */ | 1141 | {QMI_FIXED_INTF(0x1435, 0xd181, 5)}, /* Wistron NeWeb D18Q1 */ |
1142 | {QMI_FIXED_INTF(0x1435, 0xd182, 4)}, /* Wistron NeWeb D18 */ | ||
1143 | {QMI_FIXED_INTF(0x1435, 0xd182, 5)}, /* Wistron NeWeb D18 */ | ||
1137 | {QMI_FIXED_INTF(0x1435, 0xd191, 4)}, /* Wistron NeWeb D19Q1 */ | 1144 | {QMI_FIXED_INTF(0x1435, 0xd191, 4)}, /* Wistron NeWeb D19Q1 */ |
1138 | {QMI_QUIRK_SET_DTR(0x1508, 0x1001, 4)}, /* Fibocom NL668 series */ | 1145 | {QMI_QUIRK_SET_DTR(0x1508, 0x1001, 4)}, /* Fibocom NL668 series */ |
1139 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ | 1146 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ |
@@ -1189,6 +1196,7 @@ static const struct usb_device_id products[] = { | |||
1189 | {QMI_FIXED_INTF(0x19d2, 0x0265, 4)}, /* ONDA MT8205 4G LTE */ | 1196 | {QMI_FIXED_INTF(0x19d2, 0x0265, 4)}, /* ONDA MT8205 4G LTE */ |
1190 | {QMI_FIXED_INTF(0x19d2, 0x0284, 4)}, /* ZTE MF880 */ | 1197 | {QMI_FIXED_INTF(0x19d2, 0x0284, 4)}, /* ZTE MF880 */ |
1191 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ | 1198 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ |
1199 | {QMI_FIXED_INTF(0x19d2, 0x0396, 3)}, /* ZTE ZM8620 */ | ||
1192 | {QMI_FIXED_INTF(0x19d2, 0x0412, 4)}, /* Telewell TW-LTE 4G */ | 1200 | {QMI_FIXED_INTF(0x19d2, 0x0412, 4)}, /* Telewell TW-LTE 4G */ |
1193 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ | 1201 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ |
1194 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ | 1202 | {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */ |
@@ -1209,7 +1217,9 @@ static const struct usb_device_id products[] = { | |||
1209 | {QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, | 1217 | {QMI_FIXED_INTF(0x19d2, 0x1425, 2)}, |
1210 | {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ | 1218 | {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ |
1211 | {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ | 1219 | {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ |
1220 | {QMI_FIXED_INTF(0x19d2, 0x1432, 3)}, /* ZTE ME3620 */ | ||
1212 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ | 1221 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ |
1222 | {QMI_FIXED_INTF(0x2001, 0x7e16, 3)}, /* D-Link DWM-221 */ | ||
1213 | {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ | 1223 | {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ |
1214 | {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ | 1224 | {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ |
1215 | {QMI_FIXED_INTF(0x2020, 0x2031, 4)}, /* Olicard 600 */ | 1225 | {QMI_FIXED_INTF(0x2020, 0x2031, 4)}, /* Olicard 600 */ |
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c index 24b983edb357..eca87f7c5b6c 100644 --- a/drivers/net/wireless/ath/ath10k/ce.c +++ b/drivers/net/wireless/ath/ath10k/ce.c | |||
@@ -1855,7 +1855,7 @@ void ath10k_ce_dump_registers(struct ath10k *ar, | |||
1855 | struct ath10k_ce_crash_data ce_data; | 1855 | struct ath10k_ce_crash_data ce_data; |
1856 | u32 addr, id; | 1856 | u32 addr, id; |
1857 | 1857 | ||
1858 | lockdep_assert_held(&ar->data_lock); | 1858 | lockdep_assert_held(&ar->dump_mutex); |
1859 | 1859 | ||
1860 | ath10k_err(ar, "Copy Engine register dump:\n"); | 1860 | ath10k_err(ar, "Copy Engine register dump:\n"); |
1861 | 1861 | ||
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c index 835b8de92d55..aff585658fc0 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c | |||
@@ -3119,6 +3119,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev, | |||
3119 | goto err_free_wq; | 3119 | goto err_free_wq; |
3120 | 3120 | ||
3121 | mutex_init(&ar->conf_mutex); | 3121 | mutex_init(&ar->conf_mutex); |
3122 | mutex_init(&ar->dump_mutex); | ||
3122 | spin_lock_init(&ar->data_lock); | 3123 | spin_lock_init(&ar->data_lock); |
3123 | 3124 | ||
3124 | INIT_LIST_HEAD(&ar->peers); | 3125 | INIT_LIST_HEAD(&ar->peers); |
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index e08a17b01e03..e35aae5146f1 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h | |||
@@ -1063,6 +1063,9 @@ struct ath10k { | |||
1063 | /* prevents concurrent FW reconfiguration */ | 1063 | /* prevents concurrent FW reconfiguration */ |
1064 | struct mutex conf_mutex; | 1064 | struct mutex conf_mutex; |
1065 | 1065 | ||
1066 | /* protects coredump data */ | ||
1067 | struct mutex dump_mutex; | ||
1068 | |||
1066 | /* protects shared structure data */ | 1069 | /* protects shared structure data */ |
1067 | spinlock_t data_lock; | 1070 | spinlock_t data_lock; |
1068 | 1071 | ||
diff --git a/drivers/net/wireless/ath/ath10k/coredump.c b/drivers/net/wireless/ath/ath10k/coredump.c index 33838d9c1cb6..45a355fb62b9 100644 --- a/drivers/net/wireless/ath/ath10k/coredump.c +++ b/drivers/net/wireless/ath/ath10k/coredump.c | |||
@@ -1102,7 +1102,7 @@ struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar) | |||
1102 | { | 1102 | { |
1103 | struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data; | 1103 | struct ath10k_fw_crash_data *crash_data = ar->coredump.fw_crash_data; |
1104 | 1104 | ||
1105 | lockdep_assert_held(&ar->data_lock); | 1105 | lockdep_assert_held(&ar->dump_mutex); |
1106 | 1106 | ||
1107 | if (ath10k_coredump_mask == 0) | 1107 | if (ath10k_coredump_mask == 0) |
1108 | /* coredump disabled */ | 1108 | /* coredump disabled */ |
@@ -1146,7 +1146,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) | |||
1146 | if (!buf) | 1146 | if (!buf) |
1147 | return NULL; | 1147 | return NULL; |
1148 | 1148 | ||
1149 | spin_lock_bh(&ar->data_lock); | 1149 | mutex_lock(&ar->dump_mutex); |
1150 | 1150 | ||
1151 | dump_data = (struct ath10k_dump_file_data *)(buf); | 1151 | dump_data = (struct ath10k_dump_file_data *)(buf); |
1152 | strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP", | 1152 | strlcpy(dump_data->df_magic, "ATH10K-FW-DUMP", |
@@ -1213,7 +1213,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) | |||
1213 | sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len; | 1213 | sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len; |
1214 | } | 1214 | } |
1215 | 1215 | ||
1216 | spin_unlock_bh(&ar->data_lock); | 1216 | mutex_unlock(&ar->dump_mutex); |
1217 | 1217 | ||
1218 | return dump_data; | 1218 | return dump_data; |
1219 | } | 1219 | } |
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index 41e89db244d2..9c703d287333 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c | |||
@@ -5774,7 +5774,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, | |||
5774 | } | 5774 | } |
5775 | 5775 | ||
5776 | if (changed & BSS_CHANGED_MCAST_RATE && | 5776 | if (changed & BSS_CHANGED_MCAST_RATE && |
5777 | !WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def))) { | 5777 | !ath10k_mac_vif_chan(arvif->vif, &def)) { |
5778 | band = def.chan->band; | 5778 | band = def.chan->band; |
5779 | rateidx = vif->bss_conf.mcast_rate[band] - 1; | 5779 | rateidx = vif->bss_conf.mcast_rate[band] - 1; |
5780 | 5780 | ||
@@ -5812,7 +5812,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, | |||
5812 | } | 5812 | } |
5813 | 5813 | ||
5814 | if (changed & BSS_CHANGED_BASIC_RATES) { | 5814 | if (changed & BSS_CHANGED_BASIC_RATES) { |
5815 | if (WARN_ON(ath10k_mac_vif_chan(vif, &def))) { | 5815 | if (ath10k_mac_vif_chan(vif, &def)) { |
5816 | mutex_unlock(&ar->conf_mutex); | 5816 | mutex_unlock(&ar->conf_mutex); |
5817 | return; | 5817 | return; |
5818 | } | 5818 | } |
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 271f92c24d44..2c27f407a851 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c | |||
@@ -1441,7 +1441,7 @@ static void ath10k_pci_dump_registers(struct ath10k *ar, | |||
1441 | __le32 reg_dump_values[REG_DUMP_COUNT_QCA988X] = {}; | 1441 | __le32 reg_dump_values[REG_DUMP_COUNT_QCA988X] = {}; |
1442 | int i, ret; | 1442 | int i, ret; |
1443 | 1443 | ||
1444 | lockdep_assert_held(&ar->data_lock); | 1444 | lockdep_assert_held(&ar->dump_mutex); |
1445 | 1445 | ||
1446 | ret = ath10k_pci_diag_read_hi(ar, ®_dump_values[0], | 1446 | ret = ath10k_pci_diag_read_hi(ar, ®_dump_values[0], |
1447 | hi_failure_state, | 1447 | hi_failure_state, |
@@ -1656,7 +1656,7 @@ static void ath10k_pci_dump_memory(struct ath10k *ar, | |||
1656 | int ret, i; | 1656 | int ret, i; |
1657 | u8 *buf; | 1657 | u8 *buf; |
1658 | 1658 | ||
1659 | lockdep_assert_held(&ar->data_lock); | 1659 | lockdep_assert_held(&ar->dump_mutex); |
1660 | 1660 | ||
1661 | if (!crash_data) | 1661 | if (!crash_data) |
1662 | return; | 1662 | return; |
@@ -1734,14 +1734,19 @@ static void ath10k_pci_dump_memory(struct ath10k *ar, | |||
1734 | } | 1734 | } |
1735 | } | 1735 | } |
1736 | 1736 | ||
1737 | static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) | 1737 | static void ath10k_pci_fw_dump_work(struct work_struct *work) |
1738 | { | 1738 | { |
1739 | struct ath10k_pci *ar_pci = container_of(work, struct ath10k_pci, | ||
1740 | dump_work); | ||
1739 | struct ath10k_fw_crash_data *crash_data; | 1741 | struct ath10k_fw_crash_data *crash_data; |
1742 | struct ath10k *ar = ar_pci->ar; | ||
1740 | char guid[UUID_STRING_LEN + 1]; | 1743 | char guid[UUID_STRING_LEN + 1]; |
1741 | 1744 | ||
1742 | spin_lock_bh(&ar->data_lock); | 1745 | mutex_lock(&ar->dump_mutex); |
1743 | 1746 | ||
1747 | spin_lock_bh(&ar->data_lock); | ||
1744 | ar->stats.fw_crash_counter++; | 1748 | ar->stats.fw_crash_counter++; |
1749 | spin_unlock_bh(&ar->data_lock); | ||
1745 | 1750 | ||
1746 | crash_data = ath10k_coredump_new(ar); | 1751 | crash_data = ath10k_coredump_new(ar); |
1747 | 1752 | ||
@@ -1756,11 +1761,18 @@ static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) | |||
1756 | ath10k_ce_dump_registers(ar, crash_data); | 1761 | ath10k_ce_dump_registers(ar, crash_data); |
1757 | ath10k_pci_dump_memory(ar, crash_data); | 1762 | ath10k_pci_dump_memory(ar, crash_data); |
1758 | 1763 | ||
1759 | spin_unlock_bh(&ar->data_lock); | 1764 | mutex_unlock(&ar->dump_mutex); |
1760 | 1765 | ||
1761 | queue_work(ar->workqueue, &ar->restart_work); | 1766 | queue_work(ar->workqueue, &ar->restart_work); |
1762 | } | 1767 | } |
1763 | 1768 | ||
1769 | static void ath10k_pci_fw_crashed_dump(struct ath10k *ar) | ||
1770 | { | ||
1771 | struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); | ||
1772 | |||
1773 | queue_work(ar->workqueue, &ar_pci->dump_work); | ||
1774 | } | ||
1775 | |||
1764 | void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe, | 1776 | void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe, |
1765 | int force) | 1777 | int force) |
1766 | { | 1778 | { |
@@ -3442,6 +3454,8 @@ int ath10k_pci_setup_resource(struct ath10k *ar) | |||
3442 | spin_lock_init(&ar_pci->ps_lock); | 3454 | spin_lock_init(&ar_pci->ps_lock); |
3443 | mutex_init(&ar_pci->ce_diag_mutex); | 3455 | mutex_init(&ar_pci->ce_diag_mutex); |
3444 | 3456 | ||
3457 | INIT_WORK(&ar_pci->dump_work, ath10k_pci_fw_dump_work); | ||
3458 | |||
3445 | timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0); | 3459 | timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0); |
3446 | 3460 | ||
3447 | if (QCA_REV_6174(ar) || QCA_REV_9377(ar)) | 3461 | if (QCA_REV_6174(ar) || QCA_REV_9377(ar)) |
diff --git a/drivers/net/wireless/ath/ath10k/pci.h b/drivers/net/wireless/ath/ath10k/pci.h index 3773c79f322f..4455ed6c5275 100644 --- a/drivers/net/wireless/ath/ath10k/pci.h +++ b/drivers/net/wireless/ath/ath10k/pci.h | |||
@@ -121,6 +121,8 @@ struct ath10k_pci { | |||
121 | /* For protecting ce_diag */ | 121 | /* For protecting ce_diag */ |
122 | struct mutex ce_diag_mutex; | 122 | struct mutex ce_diag_mutex; |
123 | 123 | ||
124 | struct work_struct dump_work; | ||
125 | |||
124 | struct ath10k_ce ce; | 126 | struct ath10k_ce ce; |
125 | struct timer_list rx_post_retry; | 127 | struct timer_list rx_post_retry; |
126 | 128 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c index fc915ecfb06e..17b34f6e4515 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c | |||
@@ -207,7 +207,7 @@ static const struct iwl_ht_params iwl_22000_ht_params = { | |||
207 | #define IWL_DEVICE_AX210 \ | 207 | #define IWL_DEVICE_AX210 \ |
208 | IWL_DEVICE_AX200_COMMON, \ | 208 | IWL_DEVICE_AX200_COMMON, \ |
209 | .device_family = IWL_DEVICE_FAMILY_AX210, \ | 209 | .device_family = IWL_DEVICE_FAMILY_AX210, \ |
210 | .base_params = &iwl_22000_base_params, \ | 210 | .base_params = &iwl_22560_base_params, \ |
211 | .csr = &iwl_csr_v1, \ | 211 | .csr = &iwl_csr_v1, \ |
212 | .min_txq_size = 128, \ | 212 | .min_txq_size = 128, \ |
213 | .gp2_reg_addr = 0xd02c68, \ | 213 | .gp2_reg_addr = 0xd02c68, \ |
diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/5000.c b/drivers/net/wireless/intel/iwlwifi/cfg/5000.c index 575a7022d045..3846064d51a5 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/5000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/5000.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * | 2 | * |
3 | * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved. | 3 | * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved. |
4 | * Copyright(c) 2018 Intel Corporation | 4 | * Copyright(c) 2018 - 2019 Intel Corporation |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of version 2 of the GNU General Public License as | 7 | * under the terms of version 2 of the GNU General Public License as |
@@ -136,6 +136,7 @@ const struct iwl_cfg iwl5350_agn_cfg = { | |||
136 | .ht_params = &iwl5000_ht_params, | 136 | .ht_params = &iwl5000_ht_params, |
137 | .led_mode = IWL_LED_BLINK, | 137 | .led_mode = IWL_LED_BLINK, |
138 | .internal_wimax_coex = true, | 138 | .internal_wimax_coex = true, |
139 | .csr = &iwl_csr_v1, | ||
139 | }; | 140 | }; |
140 | 141 | ||
141 | #define IWL_DEVICE_5150 \ | 142 | #define IWL_DEVICE_5150 \ |
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h index abfdcabdcbf7..cd622af90077 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/file.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h | |||
@@ -93,7 +93,7 @@ struct iwl_ucode_header { | |||
93 | } u; | 93 | } u; |
94 | }; | 94 | }; |
95 | 95 | ||
96 | #define IWL_UCODE_INI_TLV_GROUP BIT(24) | 96 | #define IWL_UCODE_INI_TLV_GROUP 0x1000000 |
97 | 97 | ||
98 | /* | 98 | /* |
99 | * new TLV uCode file layout | 99 | * new TLV uCode file layout |
@@ -148,11 +148,14 @@ enum iwl_ucode_tlv_type { | |||
148 | IWL_UCODE_TLV_UMAC_DEBUG_ADDRS = 54, | 148 | IWL_UCODE_TLV_UMAC_DEBUG_ADDRS = 54, |
149 | IWL_UCODE_TLV_LMAC_DEBUG_ADDRS = 55, | 149 | IWL_UCODE_TLV_LMAC_DEBUG_ADDRS = 55, |
150 | IWL_UCODE_TLV_FW_RECOVERY_INFO = 57, | 150 | IWL_UCODE_TLV_FW_RECOVERY_INFO = 57, |
151 | IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION = IWL_UCODE_INI_TLV_GROUP | 0x1, | 151 | |
152 | IWL_UCODE_TLV_TYPE_HCMD = IWL_UCODE_INI_TLV_GROUP | 0x2, | 152 | IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION = IWL_UCODE_INI_TLV_GROUP + 0x1, |
153 | IWL_UCODE_TLV_TYPE_REGIONS = IWL_UCODE_INI_TLV_GROUP | 0x3, | 153 | IWL_UCODE_TLV_DEBUG_BASE = IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION, |
154 | IWL_UCODE_TLV_TYPE_TRIGGERS = IWL_UCODE_INI_TLV_GROUP | 0x4, | 154 | IWL_UCODE_TLV_TYPE_HCMD = IWL_UCODE_INI_TLV_GROUP + 0x2, |
155 | IWL_UCODE_TLV_TYPE_DEBUG_FLOW = IWL_UCODE_INI_TLV_GROUP | 0x5, | 155 | IWL_UCODE_TLV_TYPE_REGIONS = IWL_UCODE_INI_TLV_GROUP + 0x3, |
156 | IWL_UCODE_TLV_TYPE_TRIGGERS = IWL_UCODE_INI_TLV_GROUP + 0x4, | ||
157 | IWL_UCODE_TLV_TYPE_DEBUG_FLOW = IWL_UCODE_INI_TLV_GROUP + 0x5, | ||
158 | IWL_UCODE_TLV_DEBUG_MAX = IWL_UCODE_TLV_TYPE_DEBUG_FLOW, | ||
156 | 159 | ||
157 | /* TLVs 0x1000-0x2000 are for internal driver usage */ | 160 | /* TLVs 0x1000-0x2000 are for internal driver usage */ |
158 | IWL_UCODE_TLV_FW_DBG_DUMP_LST = 0x1000, | 161 | IWL_UCODE_TLV_FW_DBG_DUMP_LST = 0x1000, |
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c index 9107302cc444..0e8664375298 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | |||
@@ -129,7 +129,8 @@ void iwl_alloc_dbg_tlv(struct iwl_trans *trans, size_t len, const u8 *data, | |||
129 | len -= ALIGN(tlv_len, 4); | 129 | len -= ALIGN(tlv_len, 4); |
130 | data += sizeof(*tlv) + ALIGN(tlv_len, 4); | 130 | data += sizeof(*tlv) + ALIGN(tlv_len, 4); |
131 | 131 | ||
132 | if (!(tlv_type & IWL_UCODE_INI_TLV_GROUP)) | 132 | if (tlv_type < IWL_UCODE_TLV_DEBUG_BASE || |
133 | tlv_type > IWL_UCODE_TLV_DEBUG_MAX) | ||
133 | continue; | 134 | continue; |
134 | 135 | ||
135 | hdr = (void *)&tlv->data[0]; | 136 | hdr = (void *)&tlv->data[0]; |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c index 9bf2407c9b4b..f043eefabb4e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c | |||
@@ -773,6 +773,11 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | |||
773 | return; | 773 | return; |
774 | 774 | ||
775 | mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir); | 775 | mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir); |
776 | if (IS_ERR_OR_NULL(mvmvif->dbgfs_dir)) { | ||
777 | IWL_ERR(mvm, "Failed to create debugfs directory under %pd\n", | ||
778 | dbgfs_dir); | ||
779 | return; | ||
780 | } | ||
776 | 781 | ||
777 | if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM && | 782 | if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM && |
778 | ((vif->type == NL80211_IFTYPE_STATION && !vif->p2p) || | 783 | ((vif->type == NL80211_IFTYPE_STATION && !vif->p2p) || |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c index 00a47f6f1d81..ab68b5d53ec9 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
@@ -1121,7 +1121,9 @@ int iwl_mvm_up(struct iwl_mvm *mvm) | |||
1121 | ret = iwl_mvm_load_rt_fw(mvm); | 1121 | ret = iwl_mvm_load_rt_fw(mvm); |
1122 | if (ret) { | 1122 | if (ret) { |
1123 | IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret); | 1123 | IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret); |
1124 | iwl_fw_dbg_error_collect(&mvm->fwrt, FW_DBG_TRIGGER_DRIVER); | 1124 | if (ret != -ERFKILL) |
1125 | iwl_fw_dbg_error_collect(&mvm->fwrt, | ||
1126 | FW_DBG_TRIGGER_DRIVER); | ||
1125 | goto error; | 1127 | goto error; |
1126 | } | 1128 | } |
1127 | 1129 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c index 55d399899d1c..8da9e5572fcf 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c | |||
@@ -834,7 +834,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, | |||
834 | mutex_lock(&mvm->mutex); | 834 | mutex_lock(&mvm->mutex); |
835 | iwl_mvm_ref(mvm, IWL_MVM_REF_INIT_UCODE); | 835 | iwl_mvm_ref(mvm, IWL_MVM_REF_INIT_UCODE); |
836 | err = iwl_run_init_mvm_ucode(mvm, true); | 836 | err = iwl_run_init_mvm_ucode(mvm, true); |
837 | if (err) | 837 | if (err && err != -ERFKILL) |
838 | iwl_fw_dbg_error_collect(&mvm->fwrt, FW_DBG_TRIGGER_DRIVER); | 838 | iwl_fw_dbg_error_collect(&mvm->fwrt, FW_DBG_TRIGGER_DRIVER); |
839 | if (!iwlmvm_mod_params.init_dbg || !err) | 839 | if (!iwlmvm_mod_params.init_dbg || !err) |
840 | iwl_mvm_stop_device(mvm); | 840 | iwl_mvm_stop_device(mvm); |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index 0b1b208de767..1824566d08fc 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
@@ -169,9 +169,9 @@ static inline int iwl_mvm_check_pn(struct iwl_mvm *mvm, struct sk_buff *skb, | |||
169 | } | 169 | } |
170 | 170 | ||
171 | /* iwl_mvm_create_skb Adds the rxb to a new skb */ | 171 | /* iwl_mvm_create_skb Adds the rxb to a new skb */ |
172 | static void iwl_mvm_create_skb(struct sk_buff *skb, struct ieee80211_hdr *hdr, | 172 | static int iwl_mvm_create_skb(struct iwl_mvm *mvm, struct sk_buff *skb, |
173 | u16 len, u8 crypt_len, | 173 | struct ieee80211_hdr *hdr, u16 len, u8 crypt_len, |
174 | struct iwl_rx_cmd_buffer *rxb) | 174 | struct iwl_rx_cmd_buffer *rxb) |
175 | { | 175 | { |
176 | struct iwl_rx_packet *pkt = rxb_addr(rxb); | 176 | struct iwl_rx_packet *pkt = rxb_addr(rxb); |
177 | struct iwl_rx_mpdu_desc *desc = (void *)pkt->data; | 177 | struct iwl_rx_mpdu_desc *desc = (void *)pkt->data; |
@@ -204,6 +204,20 @@ static void iwl_mvm_create_skb(struct sk_buff *skb, struct ieee80211_hdr *hdr, | |||
204 | * present before copying packet data. | 204 | * present before copying packet data. |
205 | */ | 205 | */ |
206 | hdrlen += crypt_len; | 206 | hdrlen += crypt_len; |
207 | |||
208 | if (WARN_ONCE(headlen < hdrlen, | ||
209 | "invalid packet lengths (hdrlen=%d, len=%d, crypt_len=%d)\n", | ||
210 | hdrlen, len, crypt_len)) { | ||
211 | /* | ||
212 | * We warn and trace because we want to be able to see | ||
213 | * it in trace-cmd as well. | ||
214 | */ | ||
215 | IWL_DEBUG_RX(mvm, | ||
216 | "invalid packet lengths (hdrlen=%d, len=%d, crypt_len=%d)\n", | ||
217 | hdrlen, len, crypt_len); | ||
218 | return -EINVAL; | ||
219 | } | ||
220 | |||
207 | skb_put_data(skb, hdr, hdrlen); | 221 | skb_put_data(skb, hdr, hdrlen); |
208 | skb_put_data(skb, (u8 *)hdr + hdrlen + pad_len, headlen - hdrlen); | 222 | skb_put_data(skb, (u8 *)hdr + hdrlen + pad_len, headlen - hdrlen); |
209 | 223 | ||
@@ -216,6 +230,8 @@ static void iwl_mvm_create_skb(struct sk_buff *skb, struct ieee80211_hdr *hdr, | |||
216 | skb_add_rx_frag(skb, 0, rxb_steal_page(rxb), offset, | 230 | skb_add_rx_frag(skb, 0, rxb_steal_page(rxb), offset, |
217 | fraglen, rxb->truesize); | 231 | fraglen, rxb->truesize); |
218 | } | 232 | } |
233 | |||
234 | return 0; | ||
219 | } | 235 | } |
220 | 236 | ||
221 | static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm, | 237 | static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm, |
@@ -1671,7 +1687,11 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi, | |||
1671 | rx_status->boottime_ns = ktime_get_boot_ns(); | 1687 | rx_status->boottime_ns = ktime_get_boot_ns(); |
1672 | } | 1688 | } |
1673 | 1689 | ||
1674 | iwl_mvm_create_skb(skb, hdr, len, crypt_len, rxb); | 1690 | if (iwl_mvm_create_skb(mvm, skb, hdr, len, crypt_len, rxb)) { |
1691 | kfree_skb(skb); | ||
1692 | goto out; | ||
1693 | } | ||
1694 | |||
1675 | if (!iwl_mvm_reorder(mvm, napi, queue, sta, skb, desc)) | 1695 | if (!iwl_mvm_reorder(mvm, napi, queue, sta, skb, desc)) |
1676 | iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, | 1696 | iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, |
1677 | sta, csi); | 1697 | sta, csi); |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index c5baaae8d38e..cccb8bbd7ea7 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
@@ -3654,20 +3654,27 @@ out_no_pci: | |||
3654 | 3654 | ||
3655 | void iwl_trans_pcie_sync_nmi(struct iwl_trans *trans) | 3655 | void iwl_trans_pcie_sync_nmi(struct iwl_trans *trans) |
3656 | { | 3656 | { |
3657 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
3657 | unsigned long timeout = jiffies + IWL_TRANS_NMI_TIMEOUT; | 3658 | unsigned long timeout = jiffies + IWL_TRANS_NMI_TIMEOUT; |
3659 | u32 inta_addr, sw_err_bit; | ||
3660 | |||
3661 | if (trans_pcie->msix_enabled) { | ||
3662 | inta_addr = CSR_MSIX_HW_INT_CAUSES_AD; | ||
3663 | sw_err_bit = MSIX_HW_INT_CAUSES_REG_SW_ERR; | ||
3664 | } else { | ||
3665 | inta_addr = CSR_INT; | ||
3666 | sw_err_bit = CSR_INT_BIT_SW_ERR; | ||
3667 | } | ||
3658 | 3668 | ||
3659 | iwl_disable_interrupts(trans); | 3669 | iwl_disable_interrupts(trans); |
3660 | iwl_force_nmi(trans); | 3670 | iwl_force_nmi(trans); |
3661 | while (time_after(timeout, jiffies)) { | 3671 | while (time_after(timeout, jiffies)) { |
3662 | u32 inta_hw = iwl_read32(trans, | 3672 | u32 inta_hw = iwl_read32(trans, inta_addr); |
3663 | CSR_MSIX_HW_INT_CAUSES_AD); | ||
3664 | 3673 | ||
3665 | /* Error detected by uCode */ | 3674 | /* Error detected by uCode */ |
3666 | if (inta_hw & MSIX_HW_INT_CAUSES_REG_SW_ERR) { | 3675 | if (inta_hw & sw_err_bit) { |
3667 | /* Clear causes register */ | 3676 | /* Clear causes register */ |
3668 | iwl_write32(trans, CSR_MSIX_HW_INT_CAUSES_AD, | 3677 | iwl_write32(trans, inta_addr, inta_hw & sw_err_bit); |
3669 | inta_hw & | ||
3670 | MSIX_HW_INT_CAUSES_REG_SW_ERR); | ||
3671 | break; | 3678 | break; |
3672 | } | 3679 | } |
3673 | 3680 | ||
diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c index a85648342d15..d5a70340a945 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.c +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c | |||
@@ -181,7 +181,7 @@ static int mwifiex_sdio_resume(struct device *dev) | |||
181 | 181 | ||
182 | adapter = card->adapter; | 182 | adapter = card->adapter; |
183 | 183 | ||
184 | if (test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { | 184 | if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { |
185 | mwifiex_dbg(adapter, WARN, | 185 | mwifiex_dbg(adapter, WARN, |
186 | "device already resumed\n"); | 186 | "device already resumed\n"); |
187 | return 0; | 187 | return 0; |