All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 wireless-drivers 0/2] fix mt76x2e hangs on U7612E mini-pcie
@ 2019-10-25 18:54 Lorenzo Bianconi
  2019-10-25 18:54 ` [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default Lorenzo Bianconi
  2019-10-25 18:54 ` [PATCH v2 wireless-drivers 2/2] mt76: dma: fix buffer unmap with non-linear skbs Lorenzo Bianconi
  0 siblings, 2 replies; 5+ messages in thread
From: Lorenzo Bianconi @ 2019-10-25 18:54 UTC (permalink / raw)
  To: kvalo
  Cc: linux-wireless, nbd, hkallweit1, sgruszka, lorenzo.bianconi,
	oleksandr, netdev

Various mt76x2e issues have been reported on U7612E mini-pcie card [1].
On U7612E-H1 PCIE_ASPM causes continuous mcu hangs and instability and
so patch 1/2 disable it by default.
Moreover mt76 does not properly unmap dma buffers for non-linear skbs.
This issue may result in hw hangs if the system relies on IOMMU.
Patch 2/2 fix the problem properly unmapping data fragments on
non-linear skbs. 

Changes since v1:
- simplify buf0 unmap condition
- use IS_ENABLED(CONFIG_PCIEASPM) instead of ifdef CONFIG_PCIEASPM
- check pci_disable_link_state return value

[1]: https://lore.kernel.org/netdev/deaafa7a3e9ea2111ebb5106430849c6@natalenko.name/

Lorenzo Bianconi (2):
  mt76: mt76x2e: disable pcie_aspm by default
  mt76: dma: fix buffer unmap with non-linear skbs

 drivers/net/wireless/mediatek/mt76/dma.c      |  6 ++-
 drivers/net/wireless/mediatek/mt76/mmio.c     | 42 +++++++++++++++++++
 drivers/net/wireless/mediatek/mt76/mt76.h     |  6 ++-
 .../net/wireless/mediatek/mt76/mt76x2/pci.c   |  2 +
 4 files changed, 52 insertions(+), 4 deletions(-)

-- 
2.21.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default
  2019-10-25 18:54 [PATCH v2 wireless-drivers 0/2] fix mt76x2e hangs on U7612E mini-pcie Lorenzo Bianconi
@ 2019-10-25 18:54 ` Lorenzo Bianconi
  2019-10-28 21:33     ` kbuild test robot
  2019-10-25 18:54 ` [PATCH v2 wireless-drivers 2/2] mt76: dma: fix buffer unmap with non-linear skbs Lorenzo Bianconi
  1 sibling, 1 reply; 5+ messages in thread
From: Lorenzo Bianconi @ 2019-10-25 18:54 UTC (permalink / raw)
  To: kvalo
  Cc: linux-wireless, nbd, hkallweit1, sgruszka, lorenzo.bianconi,
	oleksandr, netdev

On same device (e.g. U7612E-H1) PCIE_ASPM causes continuous mcu hangs and
instability. Since mt76x2 series does not manage PCIE PS states, first we
try to disable ASPM using pci_disable_link_state. If it fails, we will
disable PCIE PS configuring PCI registers.
This patch has been successfully tested on U7612E-H1 mini-pice card

Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mmio.c     | 42 +++++++++++++++++++
 drivers/net/wireless/mediatek/mt76/mt76.h     |  1 +
 .../net/wireless/mediatek/mt76/mt76x2/pci.c   |  2 +
 3 files changed, 45 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mmio.c b/drivers/net/wireless/mediatek/mt76/mmio.c
index 1c974df1fe25..218b139563b7 100644
--- a/drivers/net/wireless/mediatek/mt76/mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mmio.c
@@ -3,6 +3,8 @@
  * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
  */
 
+#include <linux/pci.h>
+
 #include "mt76.h"
 #include "trace.h"
 
@@ -78,6 +80,46 @@ void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr,
 }
 EXPORT_SYMBOL_GPL(mt76_set_irq_mask);
 
+void mt76_mmio_disable_aspm(struct pci_dev *pdev)
+{
+	struct pci_dev *parent = pdev->bus->self;
+	u16 aspm_conf, parent_aspm_conf = 0;
+
+	pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
+	aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
+	if (parent) {
+		pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
+					  &parent_aspm_conf);
+		parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
+	}
+
+	if (!aspm_conf && (!parent || !parent_aspm_conf)) {
+		/* aspm already disabled */
+		return;
+	}
+
+	dev_info(&pdev->dev, "disabling ASPM %s %s\n",
+		 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L0S) ? "L0s" : "",
+		 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L1) ? "L1" : "");
+
+	if (IS_ENABLED(CONFIG_PCIEASPM)) {
+		int err;
+
+		err = pci_disable_link_state(pdev, aspm_conf);
+		if (!err)
+			return;
+	}
+
+	/* both device and parent should have the same ASPM setting.
+	 * disable ASPM in downstream component first and then upstream.
+	 */
+	pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
+	if (parent)
+		pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
+					   aspm_conf);
+}
+EXPORT_SYMBOL_GPL(mt76_mmio_disable_aspm);
+
 void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs)
 {
 	static const struct mt76_bus_ops mt76_mmio_ops = {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 570c159515a0..962812b6247d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -578,6 +578,7 @@ bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
 #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__)
 
 void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs);
+void mt76_mmio_disable_aspm(struct pci_dev *pdev);
 
 static inline u16 mt76_chip(struct mt76_dev *dev)
 {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
index 73c3104f8858..264bef87e5c7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
@@ -81,6 +81,8 @@ mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	/* RG_SSUSB_CDR_BR_PE1D = 0x3 */
 	mt76_rmw_field(dev, 0x15c58, 0x3 << 6, 0x3);
 
+	mt76_mmio_disable_aspm(pdev);
+
 	return 0;
 
 error:
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 wireless-drivers 2/2] mt76: dma: fix buffer unmap with non-linear skbs
  2019-10-25 18:54 [PATCH v2 wireless-drivers 0/2] fix mt76x2e hangs on U7612E mini-pcie Lorenzo Bianconi
  2019-10-25 18:54 ` [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default Lorenzo Bianconi
@ 2019-10-25 18:54 ` Lorenzo Bianconi
  1 sibling, 0 replies; 5+ messages in thread
From: Lorenzo Bianconi @ 2019-10-25 18:54 UTC (permalink / raw)
  To: kvalo
  Cc: linux-wireless, nbd, hkallweit1, sgruszka, lorenzo.bianconi,
	oleksandr, netdev

mt76 dma layer is supposed to unmap skb data buffers while keep txwi
mapped on hw dma ring. At the moment mt76 wrongly unmap txwi or does
not unmap data fragments in even positions for non-linear skbs. This
issue may result in hw hangs with A-MSDU if the system relies on IOMMU
or SWIOTLB. Fix this behaviour properly unmapping data fragments on
non-linear skbs.

Fixes: 17f1de56df05 ("mt76: add common code shared between multiple chipsets")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/wireless/mediatek/mt76/dma.c  | 6 ++++--
 drivers/net/wireless/mediatek/mt76/mt76.h | 5 +++--
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
index c747eb24581c..8f69d00bd940 100644
--- a/drivers/net/wireless/mediatek/mt76/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/dma.c
@@ -53,8 +53,10 @@ mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
 	u32 ctrl;
 	int i, idx = -1;
 
-	if (txwi)
+	if (txwi) {
 		q->entry[q->head].txwi = DMA_DUMMY_DATA;
+		q->entry[q->head].skip_buf0 = true;
+	}
 
 	for (i = 0; i < nbufs; i += 2, buf += 2) {
 		u32 buf0 = buf[0].addr, buf1 = 0;
@@ -97,7 +99,7 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,
 	__le32 __ctrl = READ_ONCE(q->desc[idx].ctrl);
 	u32 ctrl = le32_to_cpu(__ctrl);
 
-	if (!e->txwi || !e->skb) {
+	if (!e->skip_buf0) {
 		__le32 addr = READ_ONCE(q->desc[idx].buf0);
 		u32 len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctrl);
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 962812b6247d..67a1515583fa 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -93,8 +93,9 @@ struct mt76_queue_entry {
 		struct urb *urb;
 	};
 	enum mt76_txq_id qid;
-	bool schedule;
-	bool done;
+	bool skip_buf0:1;
+	bool schedule:1;
+	bool done:1;
 };
 
 struct mt76_queue_regs {
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default
  2019-10-25 18:54 ` [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default Lorenzo Bianconi
@ 2019-10-28 21:33     ` kbuild test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kbuild test robot @ 2019-10-28 21:33 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: kbuild-all, kvalo, linux-wireless, nbd, hkallweit1, sgruszka,
	lorenzo.bianconi, oleksandr, netdev

[-- Attachment #1: Type: text/plain, Size: 3465 bytes --]

Hi Lorenzo,

I love your patch! Yet something to improve:

[auto build test ERROR on wireless-drivers/master]

url:    https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/fix-mt76x2e-hangs-on-U7612E-mini-pcie/20191029-024127
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git master
config: c6x-allyesconfig (attached as .config)
compiler: c6x-elf-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=c6x 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/net//wireless/mediatek/mt76/mmio.c: In function 'mt76_mmio_disable_aspm':
   drivers/net//wireless/mediatek/mt76/mmio.c:88:2: error: implicit declaration of function 'pcie_capability_read_word'; did you mean 'has_capability_noaudit'? [-Werror=implicit-function-declaration]
     pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
     ^~~~~~~~~~~~~~~~~~~~~~~~~
     has_capability_noaudit
>> drivers/net//wireless/mediatek/mt76/mmio.c:108:9: error: implicit declaration of function 'pci_disable_link_state'; did you mean 'pci_disable_ats'? [-Werror=implicit-function-declaration]
      err = pci_disable_link_state(pdev, aspm_conf);
            ^~~~~~~~~~~~~~~~~~~~~~
            pci_disable_ats
   drivers/net//wireless/mediatek/mt76/mmio.c:116:2: error: implicit declaration of function 'pcie_capability_clear_word'; did you mean 'has_capability_noaudit'? [-Werror=implicit-function-declaration]
     pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~
     has_capability_noaudit
   cc1: some warnings being treated as errors

vim +108 drivers/net//wireless/mediatek/mt76/mmio.c

    82	
    83	void mt76_mmio_disable_aspm(struct pci_dev *pdev)
    84	{
    85		struct pci_dev *parent = pdev->bus->self;
    86		u16 aspm_conf, parent_aspm_conf = 0;
    87	
  > 88		pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
    89		aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
    90		if (parent) {
    91			pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
    92						  &parent_aspm_conf);
    93			parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
    94		}
    95	
    96		if (!aspm_conf && (!parent || !parent_aspm_conf)) {
    97			/* aspm already disabled */
    98			return;
    99		}
   100	
   101		dev_info(&pdev->dev, "disabling ASPM %s %s\n",
   102			 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L0S) ? "L0s" : "",
   103			 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L1) ? "L1" : "");
   104	
   105		if (IS_ENABLED(CONFIG_PCIEASPM)) {
   106			int err;
   107	
 > 108			err = pci_disable_link_state(pdev, aspm_conf);
   109			if (!err)
   110				return;
   111		}
   112	
   113		/* both device and parent should have the same ASPM setting.
   114		 * disable ASPM in downstream component first and then upstream.
   115		 */
   116		pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
   117		if (parent)
   118			pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
   119						   aspm_conf);
   120	}
   121	EXPORT_SYMBOL_GPL(mt76_mmio_disable_aspm);
   122	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 50155 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default
@ 2019-10-28 21:33     ` kbuild test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kbuild test robot @ 2019-10-28 21:33 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 3548 bytes --]

Hi Lorenzo,

I love your patch! Yet something to improve:

[auto build test ERROR on wireless-drivers/master]

url:    https://github.com/0day-ci/linux/commits/Lorenzo-Bianconi/fix-mt76x2e-hangs-on-U7612E-mini-pcie/20191029-024127
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git master
config: c6x-allyesconfig (attached as .config)
compiler: c6x-elf-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=c6x 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/net//wireless/mediatek/mt76/mmio.c: In function 'mt76_mmio_disable_aspm':
   drivers/net//wireless/mediatek/mt76/mmio.c:88:2: error: implicit declaration of function 'pcie_capability_read_word'; did you mean 'has_capability_noaudit'? [-Werror=implicit-function-declaration]
     pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
     ^~~~~~~~~~~~~~~~~~~~~~~~~
     has_capability_noaudit
>> drivers/net//wireless/mediatek/mt76/mmio.c:108:9: error: implicit declaration of function 'pci_disable_link_state'; did you mean 'pci_disable_ats'? [-Werror=implicit-function-declaration]
      err = pci_disable_link_state(pdev, aspm_conf);
            ^~~~~~~~~~~~~~~~~~~~~~
            pci_disable_ats
   drivers/net//wireless/mediatek/mt76/mmio.c:116:2: error: implicit declaration of function 'pcie_capability_clear_word'; did you mean 'has_capability_noaudit'? [-Werror=implicit-function-declaration]
     pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~
     has_capability_noaudit
   cc1: some warnings being treated as errors

vim +108 drivers/net//wireless/mediatek/mt76/mmio.c

    82	
    83	void mt76_mmio_disable_aspm(struct pci_dev *pdev)
    84	{
    85		struct pci_dev *parent = pdev->bus->self;
    86		u16 aspm_conf, parent_aspm_conf = 0;
    87	
  > 88		pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
    89		aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
    90		if (parent) {
    91			pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
    92						  &parent_aspm_conf);
    93			parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
    94		}
    95	
    96		if (!aspm_conf && (!parent || !parent_aspm_conf)) {
    97			/* aspm already disabled */
    98			return;
    99		}
   100	
   101		dev_info(&pdev->dev, "disabling ASPM %s %s\n",
   102			 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L0S) ? "L0s" : "",
   103			 (aspm_conf & PCI_EXP_LNKCTL_ASPM_L1) ? "L1" : "");
   104	
   105		if (IS_ENABLED(CONFIG_PCIEASPM)) {
   106			int err;
   107	
 > 108			err = pci_disable_link_state(pdev, aspm_conf);
   109			if (!err)
   110				return;
   111		}
   112	
   113		/* both device and parent should have the same ASPM setting.
   114		 * disable ASPM in downstream component first and then upstream.
   115		 */
   116		pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, aspm_conf);
   117		if (parent)
   118			pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
   119						   aspm_conf);
   120	}
   121	EXPORT_SYMBOL_GPL(mt76_mmio_disable_aspm);
   122	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 50155 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-10-28 21:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-25 18:54 [PATCH v2 wireless-drivers 0/2] fix mt76x2e hangs on U7612E mini-pcie Lorenzo Bianconi
2019-10-25 18:54 ` [PATCH v2 wireless-drivers 1/2] mt76: mt76x2e: disable pcie_aspm by default Lorenzo Bianconi
2019-10-28 21:33   ` kbuild test robot
2019-10-28 21:33     ` kbuild test robot
2019-10-25 18:54 ` [PATCH v2 wireless-drivers 2/2] mt76: dma: fix buffer unmap with non-linear skbs Lorenzo Bianconi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.