From: Marc Kleine-Budde <mkl@pengutronix.de>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, linux-can@vger.kernel.org,
kernel@pengutronix.de,
Stephane Grosjean <s.grosjean@peak-system.com>,
linux-stable <stable@vger.kernel.org>,
Marc Kleine-Budde <mkl@pengutronix.de>
Subject: [PATCH 01/12] can: peak_canfd: fix firmware < v3.3.0: limit allocation to 32-bit DMA addr only
Date: Mon, 23 Jul 2018 14:58:32 +0200 [thread overview]
Message-ID: <20180723125843.391-2-mkl@pengutronix.de> (raw)
In-Reply-To: <20180723125843.391-1-mkl@pengutronix.de>
From: Stephane Grosjean <s.grosjean@peak-system.com>
The DMA logic in firmwares < v3.3.0 embedded in the PCAN-PCIe FD cards
family is not capable of handling a mix of 32-bit and 64-bit logical
addresses. If the board is equipped with 2 or 4 CAN ports, then such a
situation might lead to a PCIe Bus Error "Malformed TLP" packet
as well as "irq xx: nobody cared" issue.
This patch adds a workaround that requests only 32-bit DMA addresses
when these might be allocated outside of the 4 GB area.
This issue has been fixed in firmware v3.3.0 and next.
Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
drivers/net/can/peak_canfd/peak_pciefd_main.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/net/can/peak_canfd/peak_pciefd_main.c b/drivers/net/can/peak_canfd/peak_pciefd_main.c
index b9e28578bc7b..455a3797a200 100644
--- a/drivers/net/can/peak_canfd/peak_pciefd_main.c
+++ b/drivers/net/can/peak_canfd/peak_pciefd_main.c
@@ -58,6 +58,10 @@ MODULE_LICENSE("GPL v2");
#define PCIEFD_REG_SYS_VER1 0x0040 /* version reg #1 */
#define PCIEFD_REG_SYS_VER2 0x0044 /* version reg #2 */
+#define PCIEFD_FW_VERSION(x, y, z) (((u32)(x) << 24) | \
+ ((u32)(y) << 16) | \
+ ((u32)(z) << 8))
+
/* System Control Registers Bits */
#define PCIEFD_SYS_CTL_TS_RST 0x00000001 /* timestamp clock */
#define PCIEFD_SYS_CTL_CLK_EN 0x00000002 /* system clock */
@@ -782,6 +786,21 @@ static int peak_pciefd_probe(struct pci_dev *pdev,
"%ux CAN-FD PCAN-PCIe FPGA v%u.%u.%u:\n", can_count,
hw_ver_major, hw_ver_minor, hw_ver_sub);
+#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
+ /* FW < v3.3.0 DMA logic doesn't handle correctly the mix of 32-bit and
+ * 64-bit logical addresses: this workaround forces usage of 32-bit
+ * DMA addresses only when such a fw is detected.
+ */
+ if (PCIEFD_FW_VERSION(hw_ver_major, hw_ver_minor, hw_ver_sub) <
+ PCIEFD_FW_VERSION(3, 3, 0)) {
+ err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+ if (err)
+ dev_warn(&pdev->dev,
+ "warning: can't set DMA mask %llxh (err %d)\n",
+ DMA_BIT_MASK(32), err);
+ }
+#endif
+
/* stop system clock */
pciefd_sys_writereg(pciefd, PCIEFD_SYS_CTL_CLK_EN,
PCIEFD_REG_SYS_CTL_CLR);
--
2.18.0
next prev parent reply other threads:[~2018-07-23 12:58 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-23 12:58 pull-request: can 2018-07-23 Marc Kleine-Budde
2018-07-23 12:58 ` Marc Kleine-Budde [this message]
2018-07-23 12:58 ` [PATCH 02/12] can: m_can.c: fix setup of CCCR register: clear CCCR NISO bit before checking can.ctrlmode Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 03/12] can: mpc5xxx_can: check of_iomap return before use Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 04/12] can: m_can: Fix runtime resume call Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 05/12] can: m_can: Move accessing of message ram to after clocks are enabled Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 06/12] can: xilinx_can: fix device dropping off bus on RX overrun Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 07/12] can: xilinx_can: fix RX loop if RXNEMP is asserted without RXOK Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 08/12] can: xilinx_can: fix recovery from error states not being propagated Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 09/12] can: xilinx_can: keep only 1-2 frames in TX FIFO to fix TX accounting Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 10/12] can: xilinx_can: fix RX overflow interrupt not being enabled Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 11/12] can: xilinx_can: fix incorrect clear of non-processed interrupts Marc Kleine-Budde
2018-07-23 12:58 ` [PATCH 12/12] can: xilinx_can: fix power management handling Marc Kleine-Budde
2018-07-23 18:02 ` pull-request: can 2018-07-23 David Miller
2018-07-24 7:27 ` Marc Kleine-Budde
2018-07-25 23:26 ` David Miller
2018-07-26 6:12 ` Marc Kleine-Budde
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180723125843.391-2-mkl@pengutronix.de \
--to=mkl@pengutronix.de \
--cc=davem@davemloft.net \
--cc=kernel@pengutronix.de \
--cc=linux-can@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=s.grosjean@peak-system.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).