diff options
Diffstat (limited to 'drivers/net')
45 files changed, 246 insertions, 101 deletions
diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c index e5fac368068a..131026fbc2d7 100644 --- a/drivers/net/can/sja1000/peak_pci.c +++ b/drivers/net/can/sja1000/peak_pci.c | |||
@@ -87,6 +87,7 @@ static const struct pci_device_id peak_pci_tbl[] = { | |||
87 | {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 87 | {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
88 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 88 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
89 | {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 89 | {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
90 | {PEAK_PCI_VENDOR_ID, PEAK_PCIE_OEM_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
90 | #ifdef CONFIG_CAN_PEAK_PCIEC | 91 | #ifdef CONFIG_CAN_PEAK_PCIEC |
91 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 92 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
92 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC34_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | 93 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC34_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-debugfs.c b/drivers/net/ethernet/amd/xgbe/xgbe-debugfs.c index 2c063b60db4b..96f485ab612e 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-debugfs.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-debugfs.c | |||
@@ -327,9 +327,13 @@ void xgbe_debugfs_init(struct xgbe_prv_data *pdata) | |||
327 | pdata->debugfs_xpcs_reg = 0; | 327 | pdata->debugfs_xpcs_reg = 0; |
328 | 328 | ||
329 | buf = kasprintf(GFP_KERNEL, "amd-xgbe-%s", pdata->netdev->name); | 329 | buf = kasprintf(GFP_KERNEL, "amd-xgbe-%s", pdata->netdev->name); |
330 | if (!buf) | ||
331 | return; | ||
332 | |||
330 | pdata->xgbe_debugfs = debugfs_create_dir(buf, NULL); | 333 | pdata->xgbe_debugfs = debugfs_create_dir(buf, NULL); |
331 | if (!pdata->xgbe_debugfs) { | 334 | if (!pdata->xgbe_debugfs) { |
332 | netdev_err(pdata->netdev, "debugfs_create_dir failed\n"); | 335 | netdev_err(pdata->netdev, "debugfs_create_dir failed\n"); |
336 | kfree(buf); | ||
333 | return; | 337 | return; |
334 | } | 338 | } |
335 | 339 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index a2bc5314a62b..d84efcd34fac 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | |||
@@ -3347,6 +3347,13 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info) | |||
3347 | udp_rss_requested = 0; | 3347 | udp_rss_requested = 0; |
3348 | else | 3348 | else |
3349 | return -EINVAL; | 3349 | return -EINVAL; |
3350 | |||
3351 | if (CHIP_IS_E1x(bp) && udp_rss_requested) { | ||
3352 | DP(BNX2X_MSG_ETHTOOL, | ||
3353 | "57710, 57711 boards don't support RSS according to UDP 4-tuple\n"); | ||
3354 | return -EINVAL; | ||
3355 | } | ||
3356 | |||
3350 | if ((info->flow_type == UDP_V4_FLOW) && | 3357 | if ((info->flow_type == UDP_V4_FLOW) && |
3351 | (bp->rss_conf_obj.udp_rss_v4 != udp_rss_requested)) { | 3358 | (bp->rss_conf_obj.udp_rss_v4 != udp_rss_requested)) { |
3352 | bp->rss_conf_obj.udp_rss_v4 = udp_rss_requested; | 3359 | bp->rss_conf_obj.udp_rss_v4 = udp_rss_requested; |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 410995cd7ea4..50f63b7f3c3e 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
@@ -1831,6 +1831,24 @@ static void bcmgenet_intr_disable(struct bcmgenet_priv *priv) | |||
1831 | bcmgenet_intrl2_1_writel(priv, 0, INTRL2_CPU_MASK_CLEAR); | 1831 | bcmgenet_intrl2_1_writel(priv, 0, INTRL2_CPU_MASK_CLEAR); |
1832 | } | 1832 | } |
1833 | 1833 | ||
1834 | static void bcmgenet_link_intr_enable(struct bcmgenet_priv *priv) | ||
1835 | { | ||
1836 | u32 int0_enable = 0; | ||
1837 | |||
1838 | /* Monitor cable plug/unplugged event for internal PHY, external PHY | ||
1839 | * and MoCA PHY | ||
1840 | */ | ||
1841 | if (priv->internal_phy) { | ||
1842 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1843 | } else if (priv->ext_phy) { | ||
1844 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1845 | } else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) { | ||
1846 | if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) | ||
1847 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1848 | } | ||
1849 | bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR); | ||
1850 | } | ||
1851 | |||
1834 | static int init_umac(struct bcmgenet_priv *priv) | 1852 | static int init_umac(struct bcmgenet_priv *priv) |
1835 | { | 1853 | { |
1836 | struct device *kdev = &priv->pdev->dev; | 1854 | struct device *kdev = &priv->pdev->dev; |
@@ -1871,15 +1889,8 @@ static int init_umac(struct bcmgenet_priv *priv) | |||
1871 | /* Enable Tx default queue 16 interrupts */ | 1889 | /* Enable Tx default queue 16 interrupts */ |
1872 | int0_enable |= UMAC_IRQ_TXDMA_DONE; | 1890 | int0_enable |= UMAC_IRQ_TXDMA_DONE; |
1873 | 1891 | ||
1874 | /* Monitor cable plug/unplugged event for internal PHY */ | 1892 | /* Configure backpressure vectors for MoCA */ |
1875 | if (priv->internal_phy) { | 1893 | if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) { |
1876 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1877 | } else if (priv->ext_phy) { | ||
1878 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1879 | } else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) { | ||
1880 | if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) | ||
1881 | int0_enable |= UMAC_IRQ_LINK_EVENT; | ||
1882 | |||
1883 | reg = bcmgenet_bp_mc_get(priv); | 1894 | reg = bcmgenet_bp_mc_get(priv); |
1884 | reg |= BIT(priv->hw_params->bp_in_en_shift); | 1895 | reg |= BIT(priv->hw_params->bp_in_en_shift); |
1885 | 1896 | ||
@@ -2793,6 +2804,9 @@ static void bcmgenet_netif_start(struct net_device *dev) | |||
2793 | 2804 | ||
2794 | netif_tx_start_all_queues(dev); | 2805 | netif_tx_start_all_queues(dev); |
2795 | 2806 | ||
2807 | /* Monitor link interrupts now */ | ||
2808 | bcmgenet_link_intr_enable(priv); | ||
2809 | |||
2796 | phy_start(priv->phydev); | 2810 | phy_start(priv->phydev); |
2797 | } | 2811 | } |
2798 | 2812 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 821540913343..d463563e1f70 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -592,6 +592,7 @@ struct be_adapter { | |||
592 | int be_get_temp_freq; | 592 | int be_get_temp_freq; |
593 | struct be_hwmon hwmon_info; | 593 | struct be_hwmon hwmon_info; |
594 | u8 pf_number; | 594 | u8 pf_number; |
595 | u8 pci_func_num; | ||
595 | struct rss_info rss_info; | 596 | struct rss_info rss_info; |
596 | /* Filters for packets that need to be sent to BMC */ | 597 | /* Filters for packets that need to be sent to BMC */ |
597 | u32 bmc_filt_mask; | 598 | u32 bmc_filt_mask; |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index eb323913cd39..1795c935ff02 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -851,8 +851,10 @@ static int be_cmd_notify_wait(struct be_adapter *adapter, | |||
851 | return status; | 851 | return status; |
852 | 852 | ||
853 | dest_wrb = be_cmd_copy(adapter, wrb); | 853 | dest_wrb = be_cmd_copy(adapter, wrb); |
854 | if (!dest_wrb) | 854 | if (!dest_wrb) { |
855 | return -EBUSY; | 855 | status = -EBUSY; |
856 | goto unlock; | ||
857 | } | ||
856 | 858 | ||
857 | if (use_mcc(adapter)) | 859 | if (use_mcc(adapter)) |
858 | status = be_mcc_notify_wait(adapter); | 860 | status = be_mcc_notify_wait(adapter); |
@@ -862,6 +864,7 @@ static int be_cmd_notify_wait(struct be_adapter *adapter, | |||
862 | if (!status) | 864 | if (!status) |
863 | memcpy(wrb, dest_wrb, sizeof(*wrb)); | 865 | memcpy(wrb, dest_wrb, sizeof(*wrb)); |
864 | 866 | ||
867 | unlock: | ||
865 | be_cmd_unlock(adapter); | 868 | be_cmd_unlock(adapter); |
866 | return status; | 869 | return status; |
867 | } | 870 | } |
@@ -1984,6 +1987,8 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value) | |||
1984 | be_if_cap_flags(adapter)); | 1987 | be_if_cap_flags(adapter)); |
1985 | } | 1988 | } |
1986 | flags &= be_if_cap_flags(adapter); | 1989 | flags &= be_if_cap_flags(adapter); |
1990 | if (!flags) | ||
1991 | return -ENOTSUPP; | ||
1987 | 1992 | ||
1988 | return __be_cmd_rx_filter(adapter, flags, value); | 1993 | return __be_cmd_rx_filter(adapter, flags, value); |
1989 | } | 1994 | } |
@@ -2887,6 +2892,7 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) | |||
2887 | if (!status) { | 2892 | if (!status) { |
2888 | attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr); | 2893 | attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr); |
2889 | adapter->hba_port_num = attribs->hba_attribs.phy_port; | 2894 | adapter->hba_port_num = attribs->hba_attribs.phy_port; |
2895 | adapter->pci_func_num = attribs->pci_func_num; | ||
2890 | serial_num = attribs->hba_attribs.controller_serial_number; | 2896 | serial_num = attribs->hba_attribs.controller_serial_number; |
2891 | for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++) | 2897 | for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++) |
2892 | adapter->serial_num[i] = le32_to_cpu(serial_num[i]) & | 2898 | adapter->serial_num[i] = le32_to_cpu(serial_num[i]) & |
@@ -3709,7 +3715,6 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res) | |||
3709 | status = -EINVAL; | 3715 | status = -EINVAL; |
3710 | goto err; | 3716 | goto err; |
3711 | } | 3717 | } |
3712 | |||
3713 | adapter->pf_number = desc->pf_num; | 3718 | adapter->pf_number = desc->pf_num; |
3714 | be_copy_nic_desc(res, desc); | 3719 | be_copy_nic_desc(res, desc); |
3715 | } | 3720 | } |
@@ -3721,7 +3726,10 @@ err: | |||
3721 | return status; | 3726 | return status; |
3722 | } | 3727 | } |
3723 | 3728 | ||
3724 | /* Will use MBOX only if MCCQ has not been created */ | 3729 | /* Will use MBOX only if MCCQ has not been created |
3730 | * non-zero domain => a PF is querying this on behalf of a VF | ||
3731 | * zero domain => a PF or a VF is querying this for itself | ||
3732 | */ | ||
3725 | int be_cmd_get_profile_config(struct be_adapter *adapter, | 3733 | int be_cmd_get_profile_config(struct be_adapter *adapter, |
3726 | struct be_resources *res, u8 query, u8 domain) | 3734 | struct be_resources *res, u8 query, u8 domain) |
3727 | { | 3735 | { |
@@ -3748,10 +3756,15 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, | |||
3748 | OPCODE_COMMON_GET_PROFILE_CONFIG, | 3756 | OPCODE_COMMON_GET_PROFILE_CONFIG, |
3749 | cmd.size, &wrb, &cmd); | 3757 | cmd.size, &wrb, &cmd); |
3750 | 3758 | ||
3751 | req->hdr.domain = domain; | ||
3752 | if (!lancer_chip(adapter)) | 3759 | if (!lancer_chip(adapter)) |
3753 | req->hdr.version = 1; | 3760 | req->hdr.version = 1; |
3754 | req->type = ACTIVE_PROFILE_TYPE; | 3761 | req->type = ACTIVE_PROFILE_TYPE; |
3762 | /* When a function is querying profile information relating to | ||
3763 | * itself hdr.pf_number must be set to it's pci_func_num + 1 | ||
3764 | */ | ||
3765 | req->hdr.domain = domain; | ||
3766 | if (domain == 0) | ||
3767 | req->hdr.pf_num = adapter->pci_func_num + 1; | ||
3755 | 3768 | ||
3756 | /* When QUERY_MODIFIABLE_FIELDS_TYPE bit is set, cmd returns the | 3769 | /* When QUERY_MODIFIABLE_FIELDS_TYPE bit is set, cmd returns the |
3757 | * descriptors with all bits set to "1" for the fields which can be | 3770 | * descriptors with all bits set to "1" for the fields which can be |
@@ -3921,12 +3934,16 @@ static void be_fill_vf_res_template(struct be_adapter *adapter, | |||
3921 | vf_if_cap_flags &= ~(BE_IF_FLAGS_RSS | | 3934 | vf_if_cap_flags &= ~(BE_IF_FLAGS_RSS | |
3922 | BE_IF_FLAGS_DEFQ_RSS); | 3935 | BE_IF_FLAGS_DEFQ_RSS); |
3923 | } | 3936 | } |
3924 | |||
3925 | nic_vft->cap_flags = cpu_to_le32(vf_if_cap_flags); | ||
3926 | } else { | 3937 | } else { |
3927 | num_vf_qs = 1; | 3938 | num_vf_qs = 1; |
3928 | } | 3939 | } |
3929 | 3940 | ||
3941 | if (res_mod.vf_if_cap_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS) { | ||
3942 | nic_vft->flags |= BIT(IF_CAPS_FLAGS_VALID_SHIFT); | ||
3943 | vf_if_cap_flags &= ~BE_IF_FLAGS_VLAN_PROMISCUOUS; | ||
3944 | } | ||
3945 | |||
3946 | nic_vft->cap_flags = cpu_to_le32(vf_if_cap_flags); | ||
3930 | nic_vft->rq_count = cpu_to_le16(num_vf_qs); | 3947 | nic_vft->rq_count = cpu_to_le16(num_vf_qs); |
3931 | nic_vft->txq_count = cpu_to_le16(num_vf_qs); | 3948 | nic_vft->txq_count = cpu_to_le16(num_vf_qs); |
3932 | nic_vft->rssq_count = cpu_to_le16(num_vf_qs); | 3949 | nic_vft->rssq_count = cpu_to_le16(num_vf_qs); |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index 7d178bdb112e..91155ea74f34 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -289,7 +289,9 @@ struct be_cmd_req_hdr { | |||
289 | u32 timeout; /* dword 1 */ | 289 | u32 timeout; /* dword 1 */ |
290 | u32 request_length; /* dword 2 */ | 290 | u32 request_length; /* dword 2 */ |
291 | u8 version; /* dword 3 */ | 291 | u8 version; /* dword 3 */ |
292 | u8 rsvd[3]; /* dword 3 */ | 292 | u8 rsvd1; /* dword 3 */ |
293 | u8 pf_num; /* dword 3 */ | ||
294 | u8 rsvd2; /* dword 3 */ | ||
293 | }; | 295 | }; |
294 | 296 | ||
295 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ | 297 | #define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */ |
@@ -1652,7 +1654,11 @@ struct mgmt_hba_attribs { | |||
1652 | 1654 | ||
1653 | struct mgmt_controller_attrib { | 1655 | struct mgmt_controller_attrib { |
1654 | struct mgmt_hba_attribs hba_attribs; | 1656 | struct mgmt_hba_attribs hba_attribs; |
1655 | u32 rsvd0[10]; | 1657 | u32 rsvd0[2]; |
1658 | u16 rsvd1; | ||
1659 | u8 pci_func_num; | ||
1660 | u8 rsvd2; | ||
1661 | u32 rsvd3[7]; | ||
1656 | } __packed; | 1662 | } __packed; |
1657 | 1663 | ||
1658 | struct be_cmd_req_cntl_attribs { | 1664 | struct be_cmd_req_cntl_attribs { |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 7bf51a1a0a77..eb48a977f8da 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -1123,11 +1123,12 @@ static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, | |||
1123 | struct sk_buff *skb, | 1123 | struct sk_buff *skb, |
1124 | struct be_wrb_params *wrb_params) | 1124 | struct be_wrb_params *wrb_params) |
1125 | { | 1125 | { |
1126 | /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or | 1126 | /* Lancer, SH and BE3 in SRIOV mode have a bug wherein |
1127 | * less may cause a transmit stall on that port. So the work-around is | 1127 | * packets that are 32b or less may cause a transmit stall |
1128 | * to pad short packets (<= 32 bytes) to a 36-byte length. | 1128 | * on that port. The workaround is to pad such packets |
1129 | * (len <= 32 bytes) to a minimum length of 36b. | ||
1129 | */ | 1130 | */ |
1130 | if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { | 1131 | if (skb->len <= 32) { |
1131 | if (skb_put_padto(skb, 36)) | 1132 | if (skb_put_padto(skb, 36)) |
1132 | return NULL; | 1133 | return NULL; |
1133 | } | 1134 | } |
@@ -4205,10 +4206,6 @@ static int be_get_config(struct be_adapter *adapter) | |||
4205 | int status, level; | 4206 | int status, level; |
4206 | u16 profile_id; | 4207 | u16 profile_id; |
4207 | 4208 | ||
4208 | status = be_cmd_get_cntl_attributes(adapter); | ||
4209 | if (status) | ||
4210 | return status; | ||
4211 | |||
4212 | status = be_cmd_query_fw_cfg(adapter); | 4209 | status = be_cmd_query_fw_cfg(adapter); |
4213 | if (status) | 4210 | if (status) |
4214 | return status; | 4211 | return status; |
@@ -4407,6 +4404,11 @@ static int be_setup(struct be_adapter *adapter) | |||
4407 | if (!lancer_chip(adapter)) | 4404 | if (!lancer_chip(adapter)) |
4408 | be_cmd_req_native_mode(adapter); | 4405 | be_cmd_req_native_mode(adapter); |
4409 | 4406 | ||
4407 | /* Need to invoke this cmd first to get the PCI Function Number */ | ||
4408 | status = be_cmd_get_cntl_attributes(adapter); | ||
4409 | if (status) | ||
4410 | return status; | ||
4411 | |||
4410 | if (!BE2_chip(adapter) && be_physfn(adapter)) | 4412 | if (!BE2_chip(adapter) && be_physfn(adapter)) |
4411 | be_alloc_sriov_res(adapter); | 4413 | be_alloc_sriov_res(adapter); |
4412 | 4414 | ||
@@ -4999,7 +5001,15 @@ static bool be_check_ufi_compatibility(struct be_adapter *adapter, | |||
4999 | return false; | 5001 | return false; |
5000 | } | 5002 | } |
5001 | 5003 | ||
5002 | return (fhdr->asic_type_rev >= adapter->asic_rev); | 5004 | /* In BE3 FW images the "asic_type_rev" field doesn't track the |
5005 | * asic_rev of the chips it is compatible with. | ||
5006 | * When asic_type_rev is 0 the image is compatible only with | ||
5007 | * pre-BE3-R chips (asic_rev < 0x10) | ||
5008 | */ | ||
5009 | if (BEx_chip(adapter) && fhdr->asic_type_rev == 0) | ||
5010 | return adapter->asic_rev < 0x10; | ||
5011 | else | ||
5012 | return (fhdr->asic_type_rev >= adapter->asic_rev); | ||
5003 | } | 5013 | } |
5004 | 5014 | ||
5005 | static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) | 5015 | static int be_fw_download(struct be_adapter *adapter, const struct firmware* fw) |
diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c index 3c40f6b99224..55c36230e176 100644 --- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c +++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c | |||
@@ -198,11 +198,13 @@ static int fsl_pq_mdio_reset(struct mii_bus *bus) | |||
198 | 198 | ||
199 | #if defined(CONFIG_GIANFAR) || defined(CONFIG_GIANFAR_MODULE) | 199 | #if defined(CONFIG_GIANFAR) || defined(CONFIG_GIANFAR_MODULE) |
200 | /* | 200 | /* |
201 | * Return the TBIPA address, starting from the address | ||
202 | * of the mapped GFAR MDIO registers (struct gfar) | ||
201 | * This is mildly evil, but so is our hardware for doing this. | 203 | * This is mildly evil, but so is our hardware for doing this. |
202 | * Also, we have to cast back to struct gfar because of | 204 | * Also, we have to cast back to struct gfar because of |
203 | * definition weirdness done in gianfar.h. | 205 | * definition weirdness done in gianfar.h. |
204 | */ | 206 | */ |
205 | static uint32_t __iomem *get_gfar_tbipa(void __iomem *p) | 207 | static uint32_t __iomem *get_gfar_tbipa_from_mdio(void __iomem *p) |
206 | { | 208 | { |
207 | struct gfar __iomem *enet_regs = p; | 209 | struct gfar __iomem *enet_regs = p; |
208 | 210 | ||
@@ -210,6 +212,15 @@ static uint32_t __iomem *get_gfar_tbipa(void __iomem *p) | |||
210 | } | 212 | } |
211 | 213 | ||
212 | /* | 214 | /* |
215 | * Return the TBIPA address, starting from the address | ||
216 | * of the mapped GFAR MII registers (gfar_mii_regs[] within struct gfar) | ||
217 | */ | ||
218 | static uint32_t __iomem *get_gfar_tbipa_from_mii(void __iomem *p) | ||
219 | { | ||
220 | return get_gfar_tbipa_from_mdio(container_of(p, struct gfar, gfar_mii_regs)); | ||
221 | } | ||
222 | |||
223 | /* | ||
213 | * Return the TBIPAR address for an eTSEC2 node | 224 | * Return the TBIPAR address for an eTSEC2 node |
214 | */ | 225 | */ |
215 | static uint32_t __iomem *get_etsec_tbipa(void __iomem *p) | 226 | static uint32_t __iomem *get_etsec_tbipa(void __iomem *p) |
@@ -220,11 +231,12 @@ static uint32_t __iomem *get_etsec_tbipa(void __iomem *p) | |||
220 | 231 | ||
221 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_UCC_GETH_MODULE) | 232 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_UCC_GETH_MODULE) |
222 | /* | 233 | /* |
223 | * Return the TBIPAR address for a QE MDIO node | 234 | * Return the TBIPAR address for a QE MDIO node, starting from the address |
235 | * of the mapped MII registers (struct fsl_pq_mii) | ||
224 | */ | 236 | */ |
225 | static uint32_t __iomem *get_ucc_tbipa(void __iomem *p) | 237 | static uint32_t __iomem *get_ucc_tbipa(void __iomem *p) |
226 | { | 238 | { |
227 | struct fsl_pq_mdio __iomem *mdio = p; | 239 | struct fsl_pq_mdio __iomem *mdio = container_of(p, struct fsl_pq_mdio, mii); |
228 | 240 | ||
229 | return &mdio->utbipar; | 241 | return &mdio->utbipar; |
230 | } | 242 | } |
@@ -300,14 +312,14 @@ static const struct of_device_id fsl_pq_mdio_match[] = { | |||
300 | .compatible = "fsl,gianfar-tbi", | 312 | .compatible = "fsl,gianfar-tbi", |
301 | .data = &(struct fsl_pq_mdio_data) { | 313 | .data = &(struct fsl_pq_mdio_data) { |
302 | .mii_offset = 0, | 314 | .mii_offset = 0, |
303 | .get_tbipa = get_gfar_tbipa, | 315 | .get_tbipa = get_gfar_tbipa_from_mii, |
304 | }, | 316 | }, |
305 | }, | 317 | }, |
306 | { | 318 | { |
307 | .compatible = "fsl,gianfar-mdio", | 319 | .compatible = "fsl,gianfar-mdio", |
308 | .data = &(struct fsl_pq_mdio_data) { | 320 | .data = &(struct fsl_pq_mdio_data) { |
309 | .mii_offset = 0, | 321 | .mii_offset = 0, |
310 | .get_tbipa = get_gfar_tbipa, | 322 | .get_tbipa = get_gfar_tbipa_from_mii, |
311 | }, | 323 | }, |
312 | }, | 324 | }, |
313 | { | 325 | { |
@@ -315,7 +327,7 @@ static const struct of_device_id fsl_pq_mdio_match[] = { | |||
315 | .compatible = "gianfar", | 327 | .compatible = "gianfar", |
316 | .data = &(struct fsl_pq_mdio_data) { | 328 | .data = &(struct fsl_pq_mdio_data) { |
317 | .mii_offset = offsetof(struct fsl_pq_mdio, mii), | 329 | .mii_offset = offsetof(struct fsl_pq_mdio, mii), |
318 | .get_tbipa = get_gfar_tbipa, | 330 | .get_tbipa = get_gfar_tbipa_from_mdio, |
319 | }, | 331 | }, |
320 | }, | 332 | }, |
321 | { | 333 | { |
@@ -445,6 +457,16 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev) | |||
445 | 457 | ||
446 | tbipa = data->get_tbipa(priv->map); | 458 | tbipa = data->get_tbipa(priv->map); |
447 | 459 | ||
460 | /* | ||
461 | * Add consistency check to make sure TBI is contained | ||
462 | * within the mapped range (not because we would get a | ||
463 | * segfault, rather to catch bugs in computing TBI | ||
464 | * address). Print error message but continue anyway. | ||
465 | */ | ||
466 | if ((void *)tbipa > priv->map + resource_size(&res) - 4) | ||
467 | dev_err(&pdev->dev, "invalid register map (should be at least 0x%04x to contain TBI address)\n", | ||
468 | ((void *)tbipa - priv->map) + 4); | ||
469 | |||
448 | iowrite32be(be32_to_cpup(prop), tbipa); | 470 | iowrite32be(be32_to_cpup(prop), tbipa); |
449 | } | 471 | } |
450 | } | 472 | } |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c index 5c950e20f2ee..0ff8f01e57ee 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c | |||
@@ -386,7 +386,6 @@ static i40e_status i40e_init_asq(struct i40e_hw *hw) | |||
386 | 386 | ||
387 | hw->aq.asq.next_to_use = 0; | 387 | hw->aq.asq.next_to_use = 0; |
388 | hw->aq.asq.next_to_clean = 0; | 388 | hw->aq.asq.next_to_clean = 0; |
389 | hw->aq.asq.count = hw->aq.num_asq_entries; | ||
390 | 389 | ||
391 | /* allocate the ring memory */ | 390 | /* allocate the ring memory */ |
392 | ret_code = i40e_alloc_adminq_asq_ring(hw); | 391 | ret_code = i40e_alloc_adminq_asq_ring(hw); |
@@ -404,6 +403,7 @@ static i40e_status i40e_init_asq(struct i40e_hw *hw) | |||
404 | goto init_adminq_free_rings; | 403 | goto init_adminq_free_rings; |
405 | 404 | ||
406 | /* success! */ | 405 | /* success! */ |
406 | hw->aq.asq.count = hw->aq.num_asq_entries; | ||
407 | goto init_adminq_exit; | 407 | goto init_adminq_exit; |
408 | 408 | ||
409 | init_adminq_free_rings: | 409 | init_adminq_free_rings: |
@@ -445,7 +445,6 @@ static i40e_status i40e_init_arq(struct i40e_hw *hw) | |||
445 | 445 | ||
446 | hw->aq.arq.next_to_use = 0; | 446 | hw->aq.arq.next_to_use = 0; |
447 | hw->aq.arq.next_to_clean = 0; | 447 | hw->aq.arq.next_to_clean = 0; |
448 | hw->aq.arq.count = hw->aq.num_arq_entries; | ||
449 | 448 | ||
450 | /* allocate the ring memory */ | 449 | /* allocate the ring memory */ |
451 | ret_code = i40e_alloc_adminq_arq_ring(hw); | 450 | ret_code = i40e_alloc_adminq_arq_ring(hw); |
@@ -463,6 +462,7 @@ static i40e_status i40e_init_arq(struct i40e_hw *hw) | |||
463 | goto init_adminq_free_rings; | 462 | goto init_adminq_free_rings; |
464 | 463 | ||
465 | /* success! */ | 464 | /* success! */ |
465 | hw->aq.arq.count = hw->aq.num_arq_entries; | ||
466 | goto init_adminq_exit; | 466 | goto init_adminq_exit; |
467 | 467 | ||
468 | init_adminq_free_rings: | 468 | init_adminq_free_rings: |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 87a5d09cb087..f7ed3131d037 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -8445,6 +8445,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi) | |||
8445 | 8445 | ||
8446 | netdev->hw_enc_features |= NETIF_F_IP_CSUM | | 8446 | netdev->hw_enc_features |= NETIF_F_IP_CSUM | |
8447 | NETIF_F_GSO_UDP_TUNNEL | | 8447 | NETIF_F_GSO_UDP_TUNNEL | |
8448 | NETIF_F_GSO_GRE | | ||
8448 | NETIF_F_TSO; | 8449 | NETIF_F_TSO; |
8449 | 8450 | ||
8450 | netdev->features = NETIF_F_SG | | 8451 | netdev->features = NETIF_F_SG | |
@@ -8452,6 +8453,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi) | |||
8452 | NETIF_F_SCTP_CSUM | | 8453 | NETIF_F_SCTP_CSUM | |
8453 | NETIF_F_HIGHDMA | | 8454 | NETIF_F_HIGHDMA | |
8454 | NETIF_F_GSO_UDP_TUNNEL | | 8455 | NETIF_F_GSO_UDP_TUNNEL | |
8456 | NETIF_F_GSO_GRE | | ||
8455 | NETIF_F_HW_VLAN_CTAG_TX | | 8457 | NETIF_F_HW_VLAN_CTAG_TX | |
8456 | NETIF_F_HW_VLAN_CTAG_RX | | 8458 | NETIF_F_HW_VLAN_CTAG_RX | |
8457 | NETIF_F_HW_VLAN_CTAG_FILTER | | 8459 | NETIF_F_HW_VLAN_CTAG_FILTER | |
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c index 3eba36913c1d..fd123ca60761 100644 --- a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c | |||
@@ -373,7 +373,6 @@ static i40e_status i40e_init_asq(struct i40e_hw *hw) | |||
373 | 373 | ||
374 | hw->aq.asq.next_to_use = 0; | 374 | hw->aq.asq.next_to_use = 0; |
375 | hw->aq.asq.next_to_clean = 0; | 375 | hw->aq.asq.next_to_clean = 0; |
376 | hw->aq.asq.count = hw->aq.num_asq_entries; | ||
377 | 376 | ||
378 | /* allocate the ring memory */ | 377 | /* allocate the ring memory */ |
379 | ret_code = i40e_alloc_adminq_asq_ring(hw); | 378 | ret_code = i40e_alloc_adminq_asq_ring(hw); |
@@ -391,6 +390,7 @@ static i40e_status i40e_init_asq(struct i40e_hw *hw) | |||
391 | goto init_adminq_free_rings; | 390 | goto init_adminq_free_rings; |
392 | 391 | ||
393 | /* success! */ | 392 | /* success! */ |
393 | hw->aq.asq.count = hw->aq.num_asq_entries; | ||
394 | goto init_adminq_exit; | 394 | goto init_adminq_exit; |
395 | 395 | ||
396 | init_adminq_free_rings: | 396 | init_adminq_free_rings: |
@@ -432,7 +432,6 @@ static i40e_status i40e_init_arq(struct i40e_hw *hw) | |||
432 | 432 | ||
433 | hw->aq.arq.next_to_use = 0; | 433 | hw->aq.arq.next_to_use = 0; |
434 | hw->aq.arq.next_to_clean = 0; | 434 | hw->aq.arq.next_to_clean = 0; |
435 | hw->aq.arq.count = hw->aq.num_arq_entries; | ||
436 | 435 | ||
437 | /* allocate the ring memory */ | 436 | /* allocate the ring memory */ |
438 | ret_code = i40e_alloc_adminq_arq_ring(hw); | 437 | ret_code = i40e_alloc_adminq_arq_ring(hw); |
@@ -450,6 +449,7 @@ static i40e_status i40e_init_arq(struct i40e_hw *hw) | |||
450 | goto init_adminq_free_rings; | 449 | goto init_adminq_free_rings; |
451 | 450 | ||
452 | /* success! */ | 451 | /* success! */ |
452 | hw->aq.arq.count = hw->aq.num_arq_entries; | ||
453 | goto init_adminq_exit; | 453 | goto init_adminq_exit; |
454 | 454 | ||
455 | init_adminq_free_rings: | 455 | init_adminq_free_rings: |
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 8e81e53c370e..c34488479365 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
@@ -1364,6 +1364,10 @@ int mlx4_test_interrupts(struct mlx4_dev *dev) | |||
1364 | * and performing a NOP command | 1364 | * and performing a NOP command |
1365 | */ | 1365 | */ |
1366 | for(i = 0; !err && (i < dev->caps.num_comp_vectors); ++i) { | 1366 | for(i = 0; !err && (i < dev->caps.num_comp_vectors); ++i) { |
1367 | /* Make sure request_irq was called */ | ||
1368 | if (!priv->eq_table.eq[i].have_irq) | ||
1369 | continue; | ||
1370 | |||
1367 | /* Temporary use polling for command completions */ | 1371 | /* Temporary use polling for command completions */ |
1368 | mlx4_cmd_use_polling(dev); | 1372 | mlx4_cmd_use_polling(dev); |
1369 | 1373 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index bcbdfab1fe19..85f1b1e7e505 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -2671,14 +2671,11 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) | |||
2671 | 2671 | ||
2672 | if (msi_x) { | 2672 | if (msi_x) { |
2673 | int nreq = dev->caps.num_ports * num_online_cpus() + 1; | 2673 | int nreq = dev->caps.num_ports * num_online_cpus() + 1; |
2674 | bool shared_ports = false; | ||
2675 | 2674 | ||
2676 | nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs, | 2675 | nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs, |
2677 | nreq); | 2676 | nreq); |
2678 | if (nreq > MAX_MSIX) { | 2677 | if (nreq > MAX_MSIX) |
2679 | nreq = MAX_MSIX; | 2678 | nreq = MAX_MSIX; |
2680 | shared_ports = true; | ||
2681 | } | ||
2682 | 2679 | ||
2683 | entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL); | 2680 | entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL); |
2684 | if (!entries) | 2681 | if (!entries) |
@@ -2701,9 +2698,6 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) | |||
2701 | bitmap_zero(priv->eq_table.eq[MLX4_EQ_ASYNC].actv_ports.ports, | 2698 | bitmap_zero(priv->eq_table.eq[MLX4_EQ_ASYNC].actv_ports.ports, |
2702 | dev->caps.num_ports); | 2699 | dev->caps.num_ports); |
2703 | 2700 | ||
2704 | if (MLX4_IS_LEGACY_EQ_MODE(dev->caps)) | ||
2705 | shared_ports = true; | ||
2706 | |||
2707 | for (i = 0; i < dev->caps.num_comp_vectors + 1; i++) { | 2701 | for (i = 0; i < dev->caps.num_comp_vectors + 1; i++) { |
2708 | if (i == MLX4_EQ_ASYNC) | 2702 | if (i == MLX4_EQ_ASYNC) |
2709 | continue; | 2703 | continue; |
@@ -2711,7 +2705,7 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) | |||
2711 | priv->eq_table.eq[i].irq = | 2705 | priv->eq_table.eq[i].irq = |
2712 | entries[i + 1 - !!(i > MLX4_EQ_ASYNC)].vector; | 2706 | entries[i + 1 - !!(i > MLX4_EQ_ASYNC)].vector; |
2713 | 2707 | ||
2714 | if (shared_ports) { | 2708 | if (MLX4_IS_LEGACY_EQ_MODE(dev->caps)) { |
2715 | bitmap_fill(priv->eq_table.eq[i].actv_ports.ports, | 2709 | bitmap_fill(priv->eq_table.eq[i].actv_ports.ports, |
2716 | dev->caps.num_ports); | 2710 | dev->caps.num_ports); |
2717 | /* We don't set affinity hint when there | 2711 | /* We don't set affinity hint when there |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_flow_table.c b/drivers/net/ethernet/mellanox/mlx5/core/en_flow_table.c index e71563ce05d1..22d603f78273 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_flow_table.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_flow_table.c | |||
@@ -598,6 +598,8 @@ void mlx5e_enable_vlan_filter(struct mlx5e_priv *priv) | |||
598 | return; | 598 | return; |
599 | 599 | ||
600 | priv->vlan.filter_disabled = false; | 600 | priv->vlan.filter_disabled = false; |
601 | if (priv->netdev->flags & IFF_PROMISC) | ||
602 | return; | ||
601 | mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0); | 603 | mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0); |
602 | } | 604 | } |
603 | 605 | ||
@@ -607,6 +609,8 @@ void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv) | |||
607 | return; | 609 | return; |
608 | 610 | ||
609 | priv->vlan.filter_disabled = true; | 611 | priv->vlan.filter_disabled = true; |
612 | if (priv->netdev->flags & IFF_PROMISC) | ||
613 | return; | ||
610 | mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0); | 614 | mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0); |
611 | } | 615 | } |
612 | 616 | ||
@@ -717,8 +721,12 @@ void mlx5e_set_rx_mode_work(struct work_struct *work) | |||
717 | bool enable_broadcast = !ea->broadcast_enabled && broadcast_enabled; | 721 | bool enable_broadcast = !ea->broadcast_enabled && broadcast_enabled; |
718 | bool disable_broadcast = ea->broadcast_enabled && !broadcast_enabled; | 722 | bool disable_broadcast = ea->broadcast_enabled && !broadcast_enabled; |
719 | 723 | ||
720 | if (enable_promisc) | 724 | if (enable_promisc) { |
721 | mlx5e_add_eth_addr_rule(priv, &ea->promisc, MLX5E_PROMISC); | 725 | mlx5e_add_eth_addr_rule(priv, &ea->promisc, MLX5E_PROMISC); |
726 | if (!priv->vlan.filter_disabled) | ||
727 | mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, | ||
728 | 0); | ||
729 | } | ||
722 | if (enable_allmulti) | 730 | if (enable_allmulti) |
723 | mlx5e_add_eth_addr_rule(priv, &ea->allmulti, MLX5E_ALLMULTI); | 731 | mlx5e_add_eth_addr_rule(priv, &ea->allmulti, MLX5E_ALLMULTI); |
724 | if (enable_broadcast) | 732 | if (enable_broadcast) |
@@ -730,8 +738,12 @@ void mlx5e_set_rx_mode_work(struct work_struct *work) | |||
730 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->broadcast); | 738 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->broadcast); |
731 | if (disable_allmulti) | 739 | if (disable_allmulti) |
732 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->allmulti); | 740 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->allmulti); |
733 | if (disable_promisc) | 741 | if (disable_promisc) { |
742 | if (!priv->vlan.filter_disabled) | ||
743 | mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, | ||
744 | 0); | ||
734 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->promisc); | 745 | mlx5e_del_eth_addr_from_flow_table(priv, &ea->promisc); |
746 | } | ||
735 | 747 | ||
736 | ea->promisc_enabled = promisc_enabled; | 748 | ea->promisc_enabled = promisc_enabled; |
737 | ea->allmulti_enabled = allmulti_enabled; | 749 | ea->allmulti_enabled = allmulti_enabled; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c index ae302614e74b..a87e773e93f3 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c | |||
@@ -302,7 +302,7 @@ static int mlx5_query_port_pvlc(struct mlx5_core_dev *dev, u32 *pvlc, | |||
302 | u32 in[MLX5_ST_SZ_DW(pvlc_reg)]; | 302 | u32 in[MLX5_ST_SZ_DW(pvlc_reg)]; |
303 | 303 | ||
304 | memset(in, 0, sizeof(in)); | 304 | memset(in, 0, sizeof(in)); |
305 | MLX5_SET(ptys_reg, in, local_port, local_port); | 305 | MLX5_SET(pvlc_reg, in, local_port, local_port); |
306 | 306 | ||
307 | return mlx5_core_access_reg(dev, in, sizeof(in), pvlc, | 307 | return mlx5_core_access_reg(dev, in, sizeof(in), pvlc, |
308 | pvlc_size, MLX5_REG_PVLC, 0, 0); | 308 | pvlc_size, MLX5_REG_PVLC, 0, 0); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 9f4a0bf01336..bd80ac714a8a 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
@@ -374,26 +374,31 @@ static int __mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core, | |||
374 | int err; | 374 | int err; |
375 | int ret; | 375 | int ret; |
376 | 376 | ||
377 | mlxsw_core->emad.trans_active = true; | ||
378 | |||
377 | err = mlxsw_core_skb_transmit(mlxsw_core->driver_priv, skb, tx_info); | 379 | err = mlxsw_core_skb_transmit(mlxsw_core->driver_priv, skb, tx_info); |
378 | if (err) { | 380 | if (err) { |
379 | dev_err(mlxsw_core->bus_info->dev, "Failed to transmit EMAD (tid=%llx)\n", | 381 | dev_err(mlxsw_core->bus_info->dev, "Failed to transmit EMAD (tid=%llx)\n", |
380 | mlxsw_core->emad.tid); | 382 | mlxsw_core->emad.tid); |
381 | dev_kfree_skb(skb); | 383 | dev_kfree_skb(skb); |
382 | return err; | 384 | goto trans_inactive_out; |
383 | } | 385 | } |
384 | 386 | ||
385 | mlxsw_core->emad.trans_active = true; | ||
386 | ret = wait_event_timeout(mlxsw_core->emad.wait, | 387 | ret = wait_event_timeout(mlxsw_core->emad.wait, |
387 | !(mlxsw_core->emad.trans_active), | 388 | !(mlxsw_core->emad.trans_active), |
388 | msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS)); | 389 | msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS)); |
389 | if (!ret) { | 390 | if (!ret) { |
390 | dev_warn(mlxsw_core->bus_info->dev, "EMAD timed-out (tid=%llx)\n", | 391 | dev_warn(mlxsw_core->bus_info->dev, "EMAD timed-out (tid=%llx)\n", |
391 | mlxsw_core->emad.tid); | 392 | mlxsw_core->emad.tid); |
392 | mlxsw_core->emad.trans_active = false; | 393 | err = -EIO; |
393 | return -EIO; | 394 | goto trans_inactive_out; |
394 | } | 395 | } |
395 | 396 | ||
396 | return 0; | 397 | return 0; |
398 | |||
399 | trans_inactive_out: | ||
400 | mlxsw_core->emad.trans_active = false; | ||
401 | return err; | ||
397 | } | 402 | } |
398 | 403 | ||
399 | static int mlxsw_emad_process_status(struct mlxsw_core *mlxsw_core, | 404 | static int mlxsw_emad_process_status(struct mlxsw_core *mlxsw_core, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/item.h b/drivers/net/ethernet/mellanox/mlxsw/item.h index 1c5e43eb9b4f..a94dbda6590b 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/item.h +++ b/drivers/net/ethernet/mellanox/mlxsw/item.h | |||
@@ -193,6 +193,7 @@ __mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift) | |||
193 | { | 193 | { |
194 | u16 max_index, be_index; | 194 | u16 max_index, be_index; |
195 | u16 offset; /* byte offset inside the array */ | 195 | u16 offset; /* byte offset inside the array */ |
196 | u8 in_byte_index; | ||
196 | 197 | ||
197 | BUG_ON(index && !item->element_size); | 198 | BUG_ON(index && !item->element_size); |
198 | if (item->offset % sizeof(u32) != 0 || | 199 | if (item->offset % sizeof(u32) != 0 || |
@@ -205,7 +206,8 @@ __mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift) | |||
205 | max_index = (item->size.bytes << 3) / item->element_size - 1; | 206 | max_index = (item->size.bytes << 3) / item->element_size - 1; |
206 | be_index = max_index - index; | 207 | be_index = max_index - index; |
207 | offset = be_index * item->element_size >> 3; | 208 | offset = be_index * item->element_size >> 3; |
208 | *shift = index % (BITS_PER_BYTE / item->element_size) << 1; | 209 | in_byte_index = index % (BITS_PER_BYTE / item->element_size); |
210 | *shift = in_byte_index * item->element_size; | ||
209 | 211 | ||
210 | return item->offset + offset; | 212 | return item->offset + offset; |
211 | } | 213 | } |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/pci.c b/drivers/net/ethernet/mellanox/mlxsw/pci.c index 879e000684c3..371ea3f56aed 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/pci.c +++ b/drivers/net/ethernet/mellanox/mlxsw/pci.c | |||
@@ -1602,11 +1602,11 @@ static int mlxsw_pci_cmd_exec(void *bus_priv, u16 opcode, u8 opcode_mod, | |||
1602 | 1602 | ||
1603 | if (in_mbox) | 1603 | if (in_mbox) |
1604 | memcpy(mlxsw_pci->cmd.in_mbox.buf, in_mbox, in_mbox_size); | 1604 | memcpy(mlxsw_pci->cmd.in_mbox.buf, in_mbox, in_mbox_size); |
1605 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_PARAM_HI, in_mapaddr >> 32); | 1605 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_PARAM_HI, upper_32_bits(in_mapaddr)); |
1606 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_PARAM_LO, in_mapaddr); | 1606 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_PARAM_LO, lower_32_bits(in_mapaddr)); |
1607 | 1607 | ||
1608 | mlxsw_pci_write32(mlxsw_pci, CIR_OUT_PARAM_HI, out_mapaddr >> 32); | 1608 | mlxsw_pci_write32(mlxsw_pci, CIR_OUT_PARAM_HI, upper_32_bits(out_mapaddr)); |
1609 | mlxsw_pci_write32(mlxsw_pci, CIR_OUT_PARAM_LO, out_mapaddr); | 1609 | mlxsw_pci_write32(mlxsw_pci, CIR_OUT_PARAM_LO, lower_32_bits(out_mapaddr)); |
1610 | 1610 | ||
1611 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_MODIFIER, in_mod); | 1611 | mlxsw_pci_write32(mlxsw_pci, CIR_IN_MODIFIER, in_mod); |
1612 | mlxsw_pci_write32(mlxsw_pci, CIR_TOKEN, 0); | 1612 | mlxsw_pci_write32(mlxsw_pci, CIR_TOKEN, 0); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c index 2fd2279b628e..50e29c4879db 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c +++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c | |||
@@ -1068,9 +1068,9 @@ static int mlxsw_sx_port_create(struct mlxsw_sx *mlxsw_sx, u8 local_port) | |||
1068 | return 0; | 1068 | return 0; |
1069 | 1069 | ||
1070 | err_register_netdev: | 1070 | err_register_netdev: |
1071 | err_port_admin_status_set: | ||
1072 | err_port_mac_learning_mode_set: | 1071 | err_port_mac_learning_mode_set: |
1073 | err_port_stp_state_set: | 1072 | err_port_stp_state_set: |
1073 | err_port_admin_status_set: | ||
1074 | err_port_mtu_set: | 1074 | err_port_mtu_set: |
1075 | err_port_speed_set: | 1075 | err_port_speed_set: |
1076 | err_port_swid_set: | 1076 | err_port_swid_set: |
diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c index 66fd868152e5..b159ef8303cc 100644 --- a/drivers/net/ethernet/nxp/lpc_eth.c +++ b/drivers/net/ethernet/nxp/lpc_eth.c | |||
@@ -476,13 +476,12 @@ static void __lpc_get_mac(struct netdata_local *pldat, u8 *mac) | |||
476 | mac[5] = tmp >> 8; | 476 | mac[5] = tmp >> 8; |
477 | } | 477 | } |
478 | 478 | ||
479 | static void __lpc_eth_clock_enable(struct netdata_local *pldat, | 479 | static void __lpc_eth_clock_enable(struct netdata_local *pldat, bool enable) |
480 | bool enable) | ||
481 | { | 480 | { |
482 | if (enable) | 481 | if (enable) |
483 | clk_enable(pldat->clk); | 482 | clk_prepare_enable(pldat->clk); |
484 | else | 483 | else |
485 | clk_disable(pldat->clk); | 484 | clk_disable_unprepare(pldat->clk); |
486 | } | 485 | } |
487 | 486 | ||
488 | static void __lpc_params_setup(struct netdata_local *pldat) | 487 | static void __lpc_params_setup(struct netdata_local *pldat) |
@@ -1494,7 +1493,7 @@ err_out_free_irq: | |||
1494 | err_out_iounmap: | 1493 | err_out_iounmap: |
1495 | iounmap(pldat->net_base); | 1494 | iounmap(pldat->net_base); |
1496 | err_out_disable_clocks: | 1495 | err_out_disable_clocks: |
1497 | clk_disable(pldat->clk); | 1496 | clk_disable_unprepare(pldat->clk); |
1498 | clk_put(pldat->clk); | 1497 | clk_put(pldat->clk); |
1499 | err_out_free_dev: | 1498 | err_out_free_dev: |
1500 | free_netdev(ndev); | 1499 | free_netdev(ndev); |
@@ -1519,7 +1518,7 @@ static int lpc_eth_drv_remove(struct platform_device *pdev) | |||
1519 | iounmap(pldat->net_base); | 1518 | iounmap(pldat->net_base); |
1520 | mdiobus_unregister(pldat->mii_bus); | 1519 | mdiobus_unregister(pldat->mii_bus); |
1521 | mdiobus_free(pldat->mii_bus); | 1520 | mdiobus_free(pldat->mii_bus); |
1522 | clk_disable(pldat->clk); | 1521 | clk_disable_unprepare(pldat->clk); |
1523 | clk_put(pldat->clk); | 1522 | clk_put(pldat->clk); |
1524 | free_netdev(ndev); | 1523 | free_netdev(ndev); |
1525 | 1524 | ||
@@ -1540,7 +1539,7 @@ static int lpc_eth_drv_suspend(struct platform_device *pdev, | |||
1540 | if (netif_running(ndev)) { | 1539 | if (netif_running(ndev)) { |
1541 | netif_device_detach(ndev); | 1540 | netif_device_detach(ndev); |
1542 | __lpc_eth_shutdown(pldat); | 1541 | __lpc_eth_shutdown(pldat); |
1543 | clk_disable(pldat->clk); | 1542 | clk_disable_unprepare(pldat->clk); |
1544 | 1543 | ||
1545 | /* | 1544 | /* |
1546 | * Reset again now clock is disable to be sure | 1545 | * Reset again now clock is disable to be sure |
diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c index a83263743665..2b7550c43f78 100644 --- a/drivers/net/ethernet/via/via-rhine.c +++ b/drivers/net/ethernet/via/via-rhine.c | |||
@@ -2134,10 +2134,11 @@ static int rhine_rx(struct net_device *dev, int limit) | |||
2134 | } | 2134 | } |
2135 | 2135 | ||
2136 | skb_put(skb, pkt_len); | 2136 | skb_put(skb, pkt_len); |
2137 | skb->protocol = eth_type_trans(skb, dev); | ||
2138 | 2137 | ||
2139 | rhine_rx_vlan_tag(skb, desc, data_size); | 2138 | rhine_rx_vlan_tag(skb, desc, data_size); |
2140 | 2139 | ||
2140 | skb->protocol = eth_type_trans(skb, dev); | ||
2141 | |||
2141 | netif_receive_skb(skb); | 2142 | netif_receive_skb(skb); |
2142 | 2143 | ||
2143 | u64_stats_update_begin(&rp->rx_stats.syncp); | 2144 | u64_stats_update_begin(&rp->rx_stats.syncp); |
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 8f5c02eed47d..cde29f8a37bf 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -870,14 +870,14 @@ static int geneve_newlink(struct net *net, struct net_device *dev, | |||
870 | __be16 dst_port = htons(GENEVE_UDP_PORT); | 870 | __be16 dst_port = htons(GENEVE_UDP_PORT); |
871 | __u8 ttl = 0, tos = 0; | 871 | __u8 ttl = 0, tos = 0; |
872 | bool metadata = false; | 872 | bool metadata = false; |
873 | __be32 rem_addr; | 873 | __be32 rem_addr = 0; |
874 | __u32 vni; | 874 | __u32 vni = 0; |
875 | 875 | ||
876 | if (!data[IFLA_GENEVE_ID] || !data[IFLA_GENEVE_REMOTE]) | 876 | if (data[IFLA_GENEVE_ID]) |
877 | return -EINVAL; | 877 | vni = nla_get_u32(data[IFLA_GENEVE_ID]); |
878 | 878 | ||
879 | vni = nla_get_u32(data[IFLA_GENEVE_ID]); | 879 | if (data[IFLA_GENEVE_REMOTE]) |
880 | rem_addr = nla_get_in_addr(data[IFLA_GENEVE_REMOTE]); | 880 | rem_addr = nla_get_in_addr(data[IFLA_GENEVE_REMOTE]); |
881 | 881 | ||
882 | if (data[IFLA_GENEVE_TTL]) | 882 | if (data[IFLA_GENEVE_TTL]) |
883 | ttl = nla_get_u8(data[IFLA_GENEVE_TTL]); | 883 | ttl = nla_get_u8(data[IFLA_GENEVE_TTL]); |
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 9d097ae54fb2..a7fb66580cee 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig | |||
@@ -187,8 +187,6 @@ config MDIO_OCTEON | |||
187 | busses. It is required by the Octeon and ThunderX ethernet device | 187 | busses. It is required by the Octeon and ThunderX ethernet device |
188 | drivers. | 188 | drivers. |
189 | 189 | ||
190 | If in doubt, say Y. | ||
191 | |||
192 | config MDIO_SUN4I | 190 | config MDIO_SUN4I |
193 | tristate "Allwinner sun4i MDIO interface support" | 191 | tristate "Allwinner sun4i MDIO interface support" |
194 | depends on ARCH_SUNXI | 192 | depends on ARCH_SUNXI |
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index 3837ae344f63..2ed75060da50 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c | |||
@@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_device *dev) | |||
313 | if (po->pppoe_dev == dev && | 313 | if (po->pppoe_dev == dev && |
314 | sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { | 314 | sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { |
315 | pppox_unbind_sock(sk); | 315 | pppox_unbind_sock(sk); |
316 | sk->sk_state = PPPOX_ZOMBIE; | ||
317 | sk->sk_state_change(sk); | 316 | sk->sk_state_change(sk); |
318 | po->pppoe_dev = NULL; | 317 | po->pppoe_dev = NULL; |
319 | dev_put(dev); | 318 | dev_put(dev); |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 3a8a36c8ded1..7f83504dfa69 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -166,6 +166,7 @@ config USB_NET_AX8817X | |||
166 | * Aten UC210T | 166 | * Aten UC210T |
167 | * ASIX AX88172 | 167 | * ASIX AX88172 |
168 | * Billionton Systems, USB2AR | 168 | * Billionton Systems, USB2AR |
169 | * Billionton Systems, GUSB2AM-1G-B | ||
169 | * Buffalo LUA-U2-KTX | 170 | * Buffalo LUA-U2-KTX |
170 | * Corega FEther USB2-TX | 171 | * Corega FEther USB2-TX |
171 | * D-Link DUB-E100 | 172 | * D-Link DUB-E100 |
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 1173a24feda3..5cabefc23494 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c | |||
@@ -959,6 +959,10 @@ static const struct usb_device_id products [] = { | |||
959 | USB_DEVICE (0x08dd, 0x90ff), | 959 | USB_DEVICE (0x08dd, 0x90ff), |
960 | .driver_info = (unsigned long) &ax8817x_info, | 960 | .driver_info = (unsigned long) &ax8817x_info, |
961 | }, { | 961 | }, { |
962 | // Billionton Systems, GUSB2AM-1G-B | ||
963 | USB_DEVICE(0x08dd, 0x0114), | ||
964 | .driver_info = (unsigned long) &ax88178_info, | ||
965 | }, { | ||
962 | // ATEN UC210T | 966 | // ATEN UC210T |
963 | USB_DEVICE (0x0557, 0x2009), | 967 | USB_DEVICE (0x0557, 0x2009), |
964 | .driver_info = (unsigned long) &ax8817x_info, | 968 | .driver_info = (unsigned long) &ax8817x_info, |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index ce704df7681b..cf262ccf5047 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -2794,11 +2794,10 @@ static int vxlan_newlink(struct net *src_net, struct net_device *dev, | |||
2794 | struct vxlan_config conf; | 2794 | struct vxlan_config conf; |
2795 | int err; | 2795 | int err; |
2796 | 2796 | ||
2797 | if (!data[IFLA_VXLAN_ID]) | ||
2798 | return -EINVAL; | ||
2799 | |||
2800 | memset(&conf, 0, sizeof(conf)); | 2797 | memset(&conf, 0, sizeof(conf)); |
2801 | conf.vni = nla_get_u32(data[IFLA_VXLAN_ID]); | 2798 | |
2799 | if (data[IFLA_VXLAN_ID]) | ||
2800 | conf.vni = nla_get_u32(data[IFLA_VXLAN_ID]); | ||
2802 | 2801 | ||
2803 | if (data[IFLA_VXLAN_GROUP]) { | 2802 | if (data[IFLA_VXLAN_GROUP]) { |
2804 | conf.remote_ip.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_GROUP]); | 2803 | conf.remote_ip.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_GROUP]); |
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h index bc421a5c5356..80c174ff6b7b 100644 --- a/drivers/net/wireless/ath/ath10k/hw.h +++ b/drivers/net/wireless/ath/ath10k/hw.h | |||
@@ -337,7 +337,7 @@ enum ath10k_hw_rate_cck { | |||
337 | #define TARGET_10X_MAX_FRAG_ENTRIES 0 | 337 | #define TARGET_10X_MAX_FRAG_ENTRIES 0 |
338 | 338 | ||
339 | /* 10.2 parameters */ | 339 | /* 10.2 parameters */ |
340 | #define TARGET_10_2_DMA_BURST_SIZE 1 | 340 | #define TARGET_10_2_DMA_BURST_SIZE 0 |
341 | 341 | ||
342 | /* Target specific defines for WMI-TLV firmware */ | 342 | /* Target specific defines for WMI-TLV firmware */ |
343 | #define TARGET_TLV_NUM_VDEVS 4 | 343 | #define TARGET_TLV_NUM_VDEVS 4 |
@@ -391,7 +391,7 @@ enum ath10k_hw_rate_cck { | |||
391 | 391 | ||
392 | #define TARGET_10_4_TX_DBG_LOG_SIZE 1024 | 392 | #define TARGET_10_4_TX_DBG_LOG_SIZE 1024 |
393 | #define TARGET_10_4_NUM_WDS_ENTRIES 32 | 393 | #define TARGET_10_4_NUM_WDS_ENTRIES 32 |
394 | #define TARGET_10_4_DMA_BURST_SIZE 1 | 394 | #define TARGET_10_4_DMA_BURST_SIZE 0 |
395 | #define TARGET_10_4_MAC_AGGR_DELIM 0 | 395 | #define TARGET_10_4_MAC_AGGR_DELIM 0 |
396 | #define TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1 | 396 | #define TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1 |
397 | #define TARGET_10_4_VOW_CONFIG 0 | 397 | #define TARGET_10_4_VOW_CONFIG 0 |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 5d532c7b813f..2e2b92ba96b8 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -881,6 +881,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
881 | hw->max_rate_tries = 10; | 881 | hw->max_rate_tries = 10; |
882 | hw->sta_data_size = sizeof(struct ath_node); | 882 | hw->sta_data_size = sizeof(struct ath_node); |
883 | hw->vif_data_size = sizeof(struct ath_vif); | 883 | hw->vif_data_size = sizeof(struct ath_vif); |
884 | hw->extra_tx_headroom = 4; | ||
884 | 885 | ||
885 | hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; | 886 | hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; |
886 | hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1; | 887 | hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 28490702124a..71d3e9adbf3c 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -120,6 +120,7 @@ MODULE_PARM_DESC(allhwsupport, "Enable support for all hardware (even it if over | |||
120 | #ifdef CONFIG_B43_BCMA | 120 | #ifdef CONFIG_B43_BCMA |
121 | static const struct bcma_device_id b43_bcma_tbl[] = { | 121 | static const struct bcma_device_id b43_bcma_tbl[] = { |
122 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS), | 122 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS), |
123 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x15, BCMA_ANY_CLASS), | ||
123 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS), | 124 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS), |
124 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS), | 125 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS), |
125 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1C, BCMA_ANY_CLASS), | 126 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1C, BCMA_ANY_CLASS), |
diff --git a/drivers/net/wireless/iwlwifi/dvm/lib.c b/drivers/net/wireless/iwlwifi/dvm/lib.c index ab45819c1fbb..e18629a16fb0 100644 --- a/drivers/net/wireless/iwlwifi/dvm/lib.c +++ b/drivers/net/wireless/iwlwifi/dvm/lib.c | |||
@@ -1020,7 +1020,7 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw, | |||
1020 | u8 *pn = seq.ccmp.pn; | 1020 | u8 *pn = seq.ccmp.pn; |
1021 | 1021 | ||
1022 | ieee80211_get_key_rx_seq(key, i, &seq); | 1022 | ieee80211_get_key_rx_seq(key, i, &seq); |
1023 | aes_sc->pn = cpu_to_le64( | 1023 | aes_sc[i].pn = cpu_to_le64( |
1024 | (u64)pn[5] | | 1024 | (u64)pn[5] | |
1025 | ((u64)pn[4] << 8) | | 1025 | ((u64)pn[4] << 8) | |
1026 | ((u64)pn[3] << 16) | | 1026 | ((u64)pn[3] << 16) | |
diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c index d561181f2cff..1a73c7a1da77 100644 --- a/drivers/net/wireless/iwlwifi/iwl-7000.c +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c | |||
@@ -341,6 +341,6 @@ const struct iwl_cfg iwl7265d_n_cfg = { | |||
341 | }; | 341 | }; |
342 | 342 | ||
343 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 343 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
344 | MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); | 344 | MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
345 | MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 345 | MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
346 | MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); | 346 | MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c index 1d54355ad76a..85ae902df7c0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/iwlwifi/mvm/d3.c | |||
@@ -274,18 +274,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
274 | break; | 274 | break; |
275 | case WLAN_CIPHER_SUITE_CCMP: | 275 | case WLAN_CIPHER_SUITE_CCMP: |
276 | if (sta) { | 276 | if (sta) { |
277 | u8 *pn = seq.ccmp.pn; | 277 | u64 pn64; |
278 | 278 | ||
279 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; | 279 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; |
280 | aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; | 280 | aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; |
281 | 281 | ||
282 | ieee80211_get_key_tx_seq(key, &seq); | 282 | pn64 = atomic64_read(&key->tx_pn); |
283 | aes_tx_sc->pn = cpu_to_le64((u64)pn[5] | | 283 | aes_tx_sc->pn = cpu_to_le64(pn64); |
284 | ((u64)pn[4] << 8) | | ||
285 | ((u64)pn[3] << 16) | | ||
286 | ((u64)pn[2] << 24) | | ||
287 | ((u64)pn[1] << 32) | | ||
288 | ((u64)pn[0] << 40)); | ||
289 | } else { | 284 | } else { |
290 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; | 285 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; |
291 | } | 286 | } |
@@ -298,12 +293,12 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
298 | u8 *pn = seq.ccmp.pn; | 293 | u8 *pn = seq.ccmp.pn; |
299 | 294 | ||
300 | ieee80211_get_key_rx_seq(key, i, &seq); | 295 | ieee80211_get_key_rx_seq(key, i, &seq); |
301 | aes_sc->pn = cpu_to_le64((u64)pn[5] | | 296 | aes_sc[i].pn = cpu_to_le64((u64)pn[5] | |
302 | ((u64)pn[4] << 8) | | 297 | ((u64)pn[4] << 8) | |
303 | ((u64)pn[3] << 16) | | 298 | ((u64)pn[3] << 16) | |
304 | ((u64)pn[2] << 24) | | 299 | ((u64)pn[2] << 24) | |
305 | ((u64)pn[1] << 32) | | 300 | ((u64)pn[1] << 32) | |
306 | ((u64)pn[0] << 40)); | 301 | ((u64)pn[0] << 40)); |
307 | } | 302 | } |
308 | data->use_rsc_tsc = true; | 303 | data->use_rsc_tsc = true; |
309 | break; | 304 | break; |
@@ -1456,15 +1451,15 @@ static void iwl_mvm_d3_update_gtks(struct ieee80211_hw *hw, | |||
1456 | 1451 | ||
1457 | switch (key->cipher) { | 1452 | switch (key->cipher) { |
1458 | case WLAN_CIPHER_SUITE_CCMP: | 1453 | case WLAN_CIPHER_SUITE_CCMP: |
1459 | iwl_mvm_aes_sc_to_seq(&sc->aes.tsc, &seq); | ||
1460 | iwl_mvm_set_aes_rx_seq(sc->aes.unicast_rsc, key); | 1454 | iwl_mvm_set_aes_rx_seq(sc->aes.unicast_rsc, key); |
1455 | atomic64_set(&key->tx_pn, le64_to_cpu(sc->aes.tsc.pn)); | ||
1461 | break; | 1456 | break; |
1462 | case WLAN_CIPHER_SUITE_TKIP: | 1457 | case WLAN_CIPHER_SUITE_TKIP: |
1463 | iwl_mvm_tkip_sc_to_seq(&sc->tkip.tsc, &seq); | 1458 | iwl_mvm_tkip_sc_to_seq(&sc->tkip.tsc, &seq); |
1464 | iwl_mvm_set_tkip_rx_seq(sc->tkip.unicast_rsc, key); | 1459 | iwl_mvm_set_tkip_rx_seq(sc->tkip.unicast_rsc, key); |
1460 | ieee80211_set_key_tx_seq(key, &seq); | ||
1465 | break; | 1461 | break; |
1466 | } | 1462 | } |
1467 | ieee80211_set_key_tx_seq(key, &seq); | ||
1468 | 1463 | ||
1469 | /* that's it for this key */ | 1464 | /* that's it for this key */ |
1470 | return; | 1465 | return; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c index 834641e250fb..d906fa13ba97 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c | |||
@@ -699,7 +699,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) | |||
699 | * abort after reading the nvm in case RF Kill is on, we will complete | 699 | * abort after reading the nvm in case RF Kill is on, we will complete |
700 | * the init seq later when RF kill will switch to off | 700 | * the init seq later when RF kill will switch to off |
701 | */ | 701 | */ |
702 | if (iwl_mvm_is_radio_killed(mvm)) { | 702 | if (iwl_mvm_is_radio_hw_killed(mvm)) { |
703 | IWL_DEBUG_RF_KILL(mvm, | 703 | IWL_DEBUG_RF_KILL(mvm, |
704 | "jump over all phy activities due to RF kill\n"); | 704 | "jump over all phy activities due to RF kill\n"); |
705 | iwl_remove_notification(&mvm->notif_wait, &calib_wait); | 705 | iwl_remove_notification(&mvm->notif_wait, &calib_wait); |
@@ -732,7 +732,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) | |||
732 | ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait, | 732 | ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait, |
733 | MVM_UCODE_CALIB_TIMEOUT); | 733 | MVM_UCODE_CALIB_TIMEOUT); |
734 | 734 | ||
735 | if (ret && iwl_mvm_is_radio_killed(mvm)) { | 735 | if (ret && iwl_mvm_is_radio_hw_killed(mvm)) { |
736 | IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n"); | 736 | IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n"); |
737 | ret = 1; | 737 | ret = 1; |
738 | } | 738 | } |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index 8443e14101cf..a38e07bb137f 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -2373,6 +2373,7 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw, | |||
2373 | iwl_mvm_remove_time_event(mvm, mvmvif, | 2373 | iwl_mvm_remove_time_event(mvm, mvmvif, |
2374 | &mvmvif->time_event_data); | 2374 | &mvmvif->time_event_data); |
2375 | RCU_INIT_POINTER(mvm->csa_vif, NULL); | 2375 | RCU_INIT_POINTER(mvm->csa_vif, NULL); |
2376 | mvmvif->csa_countdown = false; | ||
2376 | } | 2377 | } |
2377 | 2378 | ||
2378 | if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) { | 2379 | if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) { |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h index 0d3aff1b4bad..16c5a6d7e0c9 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h | |||
@@ -870,6 +870,11 @@ static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm) | |||
870 | test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status); | 870 | test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status); |
871 | } | 871 | } |
872 | 872 | ||
873 | static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm) | ||
874 | { | ||
875 | return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status); | ||
876 | } | ||
877 | |||
873 | /* Must be called with rcu_read_lock() held and it can only be | 878 | /* Must be called with rcu_read_lock() held and it can only be |
874 | * released when mvmsta is not needed anymore. | 879 | * released when mvmsta is not needed anymore. |
875 | */ | 880 | */ |
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c index 064c100e45fe..7fcd2c24a0a4 100644 --- a/drivers/net/wireless/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | |||
@@ -602,6 +602,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, | |||
602 | ieee80211_unregister_hw(mvm->hw); | 602 | ieee80211_unregister_hw(mvm->hw); |
603 | iwl_mvm_leds_exit(mvm); | 603 | iwl_mvm_leds_exit(mvm); |
604 | out_free: | 604 | out_free: |
605 | flush_delayed_work(&mvm->fw_dump_wk); | ||
605 | iwl_phy_db_free(mvm->phy_db); | 606 | iwl_phy_db_free(mvm->phy_db); |
606 | kfree(mvm->scan_cmd); | 607 | kfree(mvm->scan_cmd); |
607 | if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name) | 608 | if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index b0825c402c73..644b58bc5226 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
@@ -414,6 +414,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
414 | {IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)}, | 414 | {IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)}, |
415 | {IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)}, | 415 | {IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)}, |
416 | {IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)}, | 416 | {IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)}, |
417 | {IWL_PCI_DEVICE(0x095A, 0x5F10, iwl7265_2ac_cfg)}, | ||
418 | {IWL_PCI_DEVICE(0x095B, 0x5212, iwl7265_2ac_cfg)}, | ||
419 | {IWL_PCI_DEVICE(0x095B, 0x520A, iwl7265_2ac_cfg)}, | ||
420 | {IWL_PCI_DEVICE(0x095A, 0x9000, iwl7265_2ac_cfg)}, | ||
421 | {IWL_PCI_DEVICE(0x095A, 0x9400, iwl7265_2ac_cfg)}, | ||
417 | 422 | ||
418 | /* 8000 Series */ | 423 | /* 8000 Series */ |
419 | {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, | 424 | {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 5932306084fd..bf9afbf46c1b 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -1114,6 +1114,7 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
1114 | { USB_DEVICE(0x0db0, 0x871c) }, | 1114 | { USB_DEVICE(0x0db0, 0x871c) }, |
1115 | { USB_DEVICE(0x0db0, 0x899a) }, | 1115 | { USB_DEVICE(0x0db0, 0x899a) }, |
1116 | /* Ovislink */ | 1116 | /* Ovislink */ |
1117 | { USB_DEVICE(0x1b75, 0x3070) }, | ||
1117 | { USB_DEVICE(0x1b75, 0x3071) }, | 1118 | { USB_DEVICE(0x1b75, 0x3071) }, |
1118 | { USB_DEVICE(0x1b75, 0x3072) }, | 1119 | { USB_DEVICE(0x1b75, 0x3072) }, |
1119 | { USB_DEVICE(0x1b75, 0xa200) }, | 1120 | { USB_DEVICE(0x1b75, 0xa200) }, |
diff --git a/drivers/net/wireless/rtlwifi/pci.h b/drivers/net/wireless/rtlwifi/pci.h index d4567d12e07e..5da6703942d9 100644 --- a/drivers/net/wireless/rtlwifi/pci.h +++ b/drivers/net/wireless/rtlwifi/pci.h | |||
@@ -247,6 +247,8 @@ struct rtl_pci { | |||
247 | /* MSI support */ | 247 | /* MSI support */ |
248 | bool msi_support; | 248 | bool msi_support; |
249 | bool using_msi; | 249 | bool using_msi; |
250 | /* interrupt clear before set */ | ||
251 | bool int_clear; | ||
250 | }; | 252 | }; |
251 | 253 | ||
252 | struct mp_adapter { | 254 | struct mp_adapter { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c index b7f18e2155eb..6e9418ed90c2 100644 --- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c | |||
@@ -2253,11 +2253,28 @@ void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci) | |||
2253 | } | 2253 | } |
2254 | } | 2254 | } |
2255 | 2255 | ||
2256 | static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw) | ||
2257 | { | ||
2258 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
2259 | u32 tmp = rtl_read_dword(rtlpriv, REG_HISR); | ||
2260 | |||
2261 | rtl_write_dword(rtlpriv, REG_HISR, tmp); | ||
2262 | |||
2263 | tmp = rtl_read_dword(rtlpriv, REG_HISRE); | ||
2264 | rtl_write_dword(rtlpriv, REG_HISRE, tmp); | ||
2265 | |||
2266 | tmp = rtl_read_dword(rtlpriv, REG_HSISR); | ||
2267 | rtl_write_dword(rtlpriv, REG_HSISR, tmp); | ||
2268 | } | ||
2269 | |||
2256 | void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw) | 2270 | void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw) |
2257 | { | 2271 | { |
2258 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 2272 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
2259 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | 2273 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
2260 | 2274 | ||
2275 | if (!rtlpci->int_clear) | ||
2276 | rtl8821ae_clear_interrupt(hw);/*clear it here first*/ | ||
2277 | |||
2261 | rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); | 2278 | rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); |
2262 | rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); | 2279 | rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); |
2263 | rtlpci->irq_enabled = true; | 2280 | rtlpci->irq_enabled = true; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c index a4988121e1ab..8ee141a55bc5 100644 --- a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c | |||
@@ -96,6 +96,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw) | |||
96 | 96 | ||
97 | rtl8821ae_bt_reg_init(hw); | 97 | rtl8821ae_bt_reg_init(hw); |
98 | rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; | 98 | rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; |
99 | rtlpci->int_clear = rtlpriv->cfg->mod_params->int_clear; | ||
99 | rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer(); | 100 | rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer(); |
100 | 101 | ||
101 | rtlpriv->dm.dm_initialgain_enable = 1; | 102 | rtlpriv->dm.dm_initialgain_enable = 1; |
@@ -167,6 +168,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw) | |||
167 | rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; | 168 | rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; |
168 | rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; | 169 | rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; |
169 | rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; | 170 | rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; |
171 | rtlpci->msi_support = rtlpriv->cfg->mod_params->int_clear; | ||
170 | if (rtlpriv->cfg->mod_params->disable_watchdog) | 172 | if (rtlpriv->cfg->mod_params->disable_watchdog) |
171 | pr_info("watchdog disabled\n"); | 173 | pr_info("watchdog disabled\n"); |
172 | rtlpriv->psc.reg_fwctrl_lps = 3; | 174 | rtlpriv->psc.reg_fwctrl_lps = 3; |
@@ -308,6 +310,7 @@ static struct rtl_mod_params rtl8821ae_mod_params = { | |||
308 | .swctrl_lps = false, | 310 | .swctrl_lps = false, |
309 | .fwctrl_lps = true, | 311 | .fwctrl_lps = true, |
310 | .msi_support = true, | 312 | .msi_support = true, |
313 | .int_clear = true, | ||
311 | .debug = DBG_EMERG, | 314 | .debug = DBG_EMERG, |
312 | .disable_watchdog = 0, | 315 | .disable_watchdog = 0, |
313 | }; | 316 | }; |
@@ -437,6 +440,7 @@ module_param_named(fwlps, rtl8821ae_mod_params.fwctrl_lps, bool, 0444); | |||
437 | module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444); | 440 | module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444); |
438 | module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog, | 441 | module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog, |
439 | bool, 0444); | 442 | bool, 0444); |
443 | module_param_named(int_clear, rtl8821ae_mod_params.int_clear, bool, 0444); | ||
440 | MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); | 444 | MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); |
441 | MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); | 445 | MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); |
442 | MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); | 446 | MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); |
@@ -444,6 +448,7 @@ MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); | |||
444 | MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n"); | 448 | MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n"); |
445 | MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); | 449 | MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); |
446 | MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n"); | 450 | MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n"); |
451 | MODULE_PARM_DESC(int_clear, "Set to 1 to disable interrupt clear before set (default 0)\n"); | ||
447 | 452 | ||
448 | static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); | 453 | static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); |
449 | 454 | ||
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index b90ca618b123..4544752a2ba8 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h | |||
@@ -2249,6 +2249,9 @@ struct rtl_mod_params { | |||
2249 | 2249 | ||
2250 | /* default 0: 1 means disable */ | 2250 | /* default 0: 1 means disable */ |
2251 | bool disable_watchdog; | 2251 | bool disable_watchdog; |
2252 | |||
2253 | /* default 0: 1 means do not disable interrupts */ | ||
2254 | bool int_clear; | ||
2252 | }; | 2255 | }; |
2253 | 2256 | ||
2254 | struct rtl_hal_usbint_cfg { | 2257 | struct rtl_hal_usbint_cfg { |
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 929a6e7e5ecf..56ebd8267386 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c | |||
@@ -788,6 +788,12 @@ static void connect(struct backend_info *be) | |||
788 | /* Use the number of queues requested by the frontend */ | 788 | /* Use the number of queues requested by the frontend */ |
789 | be->vif->queues = vzalloc(requested_num_queues * | 789 | be->vif->queues = vzalloc(requested_num_queues * |
790 | sizeof(struct xenvif_queue)); | 790 | sizeof(struct xenvif_queue)); |
791 | if (!be->vif->queues) { | ||
792 | xenbus_dev_fatal(dev, -ENOMEM, | ||
793 | "allocating queues"); | ||
794 | return; | ||
795 | } | ||
796 | |||
791 | be->vif->num_queues = requested_num_queues; | 797 | be->vif->num_queues = requested_num_queues; |
792 | be->vif->stalled_queues = requested_num_queues; | 798 | be->vif->stalled_queues = requested_num_queues; |
793 | 799 | ||