+++ /dev/null
-From 36d3502aceebd28e13b6465b9ca280dfc5aca573 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 7 May 2021 18:50:19 +0200
-Subject: mt76: mt76x0e: fix device hang during suspend/resume
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit 509559c35bcd23d5a046624b225cb3e99a9f1481 ]
-
-Similar to usb device, re-initialize mt76x0e device after resume in order
-to fix mt7630e hang during suspend/resume
-
-Reported-by: Luca Trombin <luca.trombin@gmail.com>
-Fixes: c2a4d9fbabfb9 ("mt76x0: inital split between pci and usb")
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/4812f9611624b34053c1592fd9c175b67d4ffcb4.1620406022.git.lorenzo@kernel.org
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 81 ++++++++++++++++++-
- 1 file changed, 77 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
-index b87d8e136cb9..a594ae11b1f7 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
-@@ -87,7 +87,7 @@ static const struct ieee80211_ops mt76x0e_ops = {
- .reconfig_complete = mt76x02_reconfig_complete,
- };
-
--static int mt76x0e_register_device(struct mt76x02_dev *dev)
-+static int mt76x0e_init_hardware(struct mt76x02_dev *dev, bool resume)
- {
- int err;
-
-@@ -100,9 +100,11 @@ static int mt76x0e_register_device(struct mt76x02_dev *dev)
- if (err < 0)
- return err;
-
-- err = mt76x02_dma_init(dev);
-- if (err < 0)
-- return err;
-+ if (!resume) {
-+ err = mt76x02_dma_init(dev);
-+ if (err < 0)
-+ return err;
-+ }
-
- err = mt76x0_init_hardware(dev);
- if (err < 0)
-@@ -123,6 +125,17 @@ static int mt76x0e_register_device(struct mt76x02_dev *dev)
- mt76_clear(dev, 0x110, BIT(9));
- mt76_set(dev, MT_MAX_LEN_CFG, BIT(13));
-
-+ return 0;
-+}
-+
-+static int mt76x0e_register_device(struct mt76x02_dev *dev)
-+{
-+ int err;
-+
-+ err = mt76x0e_init_hardware(dev, false);
-+ if (err < 0)
-+ return err;
-+
- err = mt76x0_register_device(dev);
- if (err < 0)
- return err;
-@@ -167,6 +180,8 @@ mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id)
- if (ret)
- return ret;
-
-+ mt76_pci_disable_aspm(pdev);
-+
- mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt76x0e_ops,
- &drv_ops);
- if (!mdev)
-@@ -220,6 +235,60 @@ mt76x0e_remove(struct pci_dev *pdev)
- mt76_free_device(mdev);
- }
-
-+#ifdef CONFIG_PM
-+static int mt76x0e_suspend(struct pci_dev *pdev, pm_message_t state)
-+{
-+ struct mt76_dev *mdev = pci_get_drvdata(pdev);
-+ struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
-+ int i;
-+
-+ mt76_worker_disable(&mdev->tx_worker);
-+ for (i = 0; i < ARRAY_SIZE(mdev->phy.q_tx); i++)
-+ mt76_queue_tx_cleanup(dev, mdev->phy.q_tx[i], true);
-+ for (i = 0; i < ARRAY_SIZE(mdev->q_mcu); i++)
-+ mt76_queue_tx_cleanup(dev, mdev->q_mcu[i], true);
-+ napi_disable(&mdev->tx_napi);
-+
-+ mt76_for_each_q_rx(mdev, i)
-+ napi_disable(&mdev->napi[i]);
-+
-+ mt76x02_dma_disable(dev);
-+ mt76x02_mcu_cleanup(dev);
-+ mt76x0_chip_onoff(dev, false, false);
-+
-+ pci_enable_wake(pdev, pci_choose_state(pdev, state), true);
-+ pci_save_state(pdev);
-+
-+ return pci_set_power_state(pdev, pci_choose_state(pdev, state));
-+}
-+
-+static int mt76x0e_resume(struct pci_dev *pdev)
-+{
-+ struct mt76_dev *mdev = pci_get_drvdata(pdev);
-+ struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
-+ int err, i;
-+
-+ err = pci_set_power_state(pdev, PCI_D0);
-+ if (err)
-+ return err;
-+
-+ pci_restore_state(pdev);
-+
-+ mt76_worker_enable(&mdev->tx_worker);
-+
-+ mt76_for_each_q_rx(mdev, i) {
-+ mt76_queue_rx_reset(dev, i);
-+ napi_enable(&mdev->napi[i]);
-+ napi_schedule(&mdev->napi[i]);
-+ }
-+
-+ napi_enable(&mdev->tx_napi);
-+ napi_schedule(&mdev->tx_napi);
-+
-+ return mt76x0e_init_hardware(dev, true);
-+}
-+#endif /* CONFIG_PM */
-+
- static const struct pci_device_id mt76x0e_device_table[] = {
- { PCI_DEVICE(0x14c3, 0x7610) },
- { PCI_DEVICE(0x14c3, 0x7630) },
-@@ -237,6 +306,10 @@ static struct pci_driver mt76x0e_driver = {
- .id_table = mt76x0e_device_table,
- .probe = mt76x0e_probe,
- .remove = mt76x0e_remove,
-+#ifdef CONFIG_PM
-+ .suspend = mt76x0e_suspend,
-+ .resume = mt76x0e_resume,
-+#endif /* CONFIG_PM */
- };
-
- module_pci_driver(mt76x0e_driver);
---
-2.30.2
-
+++ /dev/null
-From ae7489922492dcc2272199a53d4787b68a0d39d2 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 13 Apr 2021 14:35:22 +0300
-Subject: net/mlx5e: Check for needed capability for cvlan matching
-
-From: Roi Dayan <roid@nvidia.com>
-
-[ Upstream commit afe93f71b5d3cdae7209213ec8ef25210b837b93 ]
-
-If not supported show an error and return instead of trying to offload
-to the hardware and fail.
-
-Fixes: 699e96ddf47f ("net/mlx5e: Support offloading tc double vlan headers match")
-Reported-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Roi Dayan <roid@nvidia.com>
-Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
-index fe7342e8a043..1a8990b1563e 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
-@@ -1812,10 +1812,12 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
- misc_parameters);
- struct flow_rule *rule = flow_cls_offload_flow_rule(f);
- struct flow_dissector *dissector = rule->match.dissector;
-+ enum fs_flow_table_type fs_type;
- u16 addr_type = 0;
- u8 ip_proto = 0;
- u8 *match_level;
-
-+ fs_type = mlx5e_is_eswitch_flow(flow) ? FS_FT_FDB : FS_FT_NIC_RX;
- match_level = outer_match_level;
-
- if (dissector->used_keys &
-@@ -1930,6 +1932,13 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
- if (match.mask->vlan_id ||
- match.mask->vlan_priority ||
- match.mask->vlan_tpid) {
-+ if (!MLX5_CAP_FLOWTABLE_TYPE(priv->mdev, ft_field_support.outer_second_vid,
-+ fs_type)) {
-+ NL_SET_ERR_MSG_MOD(extack,
-+ "Matching on CVLAN is not supported");
-+ return -EOPNOTSUPP;
-+ }
-+
- if (match.key->vlan_tpid == htons(ETH_P_8021AD)) {
- MLX5_SET(fte_match_set_misc, misc_c,
- outer_second_svlan_tag, 1);
---
-2.30.2
-