lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 17 Nov 2017 01:56:30 -0800
From:   Wang Dongsheng <wdsch86@...il.com>
To:     timur@...eaurora.org
Cc:     netdev@...r.kernel.org, Wang Dongsheng <wdsch86@...il.com>
Subject: [PATCH v2] net: qcom/emac: extend DMA mask to 46bits

Since PTP doesn't support yet, so extend the DMA address to 46bits.
When PTP is supported, the dma_mask should be fixed dynamically.

Signed-off-by: Wang Dongsheng <wdsch86@...il.com>
---
v2:
- Changes PATCH subject.
- Dynamic fix TPD_BUFFER_ADDR_H_SET size.
- Modify DMA MASK to 46bits.
- Add Comments for DMA MASK.
---
 drivers/net/ethernet/qualcomm/emac/emac-mac.c | 9 ++++++---
 drivers/net/ethernet/qualcomm/emac/emac-mac.h | 5 ++++-
 drivers/net/ethernet/qualcomm/emac/emac.c     | 8 ++++++--
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
index 9cbb2726..db73348 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
@@ -1362,7 +1362,8 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt,
 			goto error;
 
 		TPD_BUFFER_ADDR_L_SET(tpd, lower_32_bits(tpbuf->dma_addr));
-		TPD_BUFFER_ADDR_H_SET(tpd, upper_32_bits(tpbuf->dma_addr));
+		TPD_BUFFER_ADDR_H_SET(adpt, tpd,
+				      upper_32_bits(tpbuf->dma_addr));
 		TPD_BUF_LEN_SET(tpd, tpbuf->length);
 		emac_tx_tpd_create(adpt, tx_q, tpd);
 		count++;
@@ -1380,7 +1381,8 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt,
 			goto error;
 
 		TPD_BUFFER_ADDR_L_SET(tpd, lower_32_bits(tpbuf->dma_addr));
-		TPD_BUFFER_ADDR_H_SET(tpd, upper_32_bits(tpbuf->dma_addr));
+		TPD_BUFFER_ADDR_H_SET(adpt, tpd,
+				      upper_32_bits(tpbuf->dma_addr));
 		TPD_BUF_LEN_SET(tpd, tpbuf->length);
 		emac_tx_tpd_create(adpt, tx_q, tpd);
 		count++;
@@ -1402,7 +1404,8 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt,
 			goto error;
 
 		TPD_BUFFER_ADDR_L_SET(tpd, lower_32_bits(tpbuf->dma_addr));
-		TPD_BUFFER_ADDR_H_SET(tpd, upper_32_bits(tpbuf->dma_addr));
+		TPD_BUFFER_ADDR_H_SET(adpt, tpd,
+				      upper_32_bits(tpbuf->dma_addr));
 		TPD_BUF_LEN_SET(tpd, tpbuf->length);
 		emac_tx_tpd_create(adpt, tx_q, tpd);
 		count++;
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.h b/drivers/net/ethernet/qualcomm/emac/emac-mac.h
index 5028fb4..31c1f21 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.h
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.h
@@ -115,7 +115,10 @@ struct emac_tpd {
 /* High-14bit Buffer Address, So, the 64b-bit address is
  * {DESC_CTRL_11_TX_DATA_HIADDR[17:0],(register) BUFFER_ADDR_H, BUFFER_ADDR_L}
  */
-#define TPD_BUFFER_ADDR_H_SET(tpd, val)	BITS_SET((tpd)->word[3], 18, 30, val)
+#define TPD_BUFFER_ADDR_H_SET(adpt, tpd, val)	BITS_SET((tpd)->word[3], 18, \
+						TX_TS_ENABLE & \
+				readl((adpt)->csr + EMAC_EMAC_WRAPPER_CSR1) ? \
+						30 : 31, val)
 /* Format D. Word offset from the 1st byte of this packet to start to calculate
  * the custom checksum.
  */
diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c b/drivers/net/ethernet/qualcomm/emac/emac.c
index 70c92b6..de5a4fb 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac.c
@@ -615,8 +615,12 @@ static int emac_probe(struct platform_device *pdev)
 	u32 reg;
 	int ret;
 
-	/* The TPD buffer address is limited to 45 bits. */
-	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(45));
+	/*
+	 * The TPD buffer address is limited to:
+	 * 1. PTP:	45bits. (Driver doesn't support yet.)
+	 * 2. NON-PTP:	46bits.
+	 */
+	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(46));
 	if (ret) {
 		dev_err(&pdev->dev, "could not set DMA mask\n");
 		return ret;
-- 
2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ