Hi Xenia,
I get a checkpatch warning when I attempt to commit this change:
Applying: xhci: fix dma mask setup in xhci.c
WARNING: line over 80 characters
#23: FILE: drivers/usb/host/xhci.c:4686:
+ if (dma_set_mask(hcd-self.controller,
DMA_BIT_MASK(32)))
Can you fix that up by adding a newline after the comma and resubmit?
Thanks,
Sarah Sharp
On Sun, May 26, 2013 at 01:08:14PM +0300, Xenia Ragiadakou wrote:
This patch adds a check on whether the host machine
supports the xHC DMA address mask and sets the DMA
mask for coherent DMA address allocation via an
explicit call to dma_set_coherent_mask().
According to DMA-API-HOWTO, if coherent DMA address
mask has not been set explicitly via dma_set_coherent_mask(),
and the driver calls dma_alloc_coherent() or
dma_pool_create() to allocate consistent DMA memory
blocks, the consistent DMA mapping interface will
return by default DMA addresses which are 32-bit
addressable.
Hence, if 64-bit DMA mapping is supported, it
is appropriate to call dma_set_coherent_mask()
with DMA_BIT_MASK(64) to take advantage of it.
Also, according to DMA-API-HOWTO, dma_set_coherent_mask()
is guaranteed to set successfully the same or a smaller
mask as dma_set_mask().
Signed-off-by: Xenia Ragiadakou burzalod...@gmail.com
---
After this change, (i have a 64-bit machine) the
consistent_dma_mask_bits entry for xhci controller
that appears under:
/sys/devices/pci:00/:00:device.function/
changed from 32 to 64.
I did not find another way to test this change.
drivers/usb/host/xhci.c | 32 ++--
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index b4aa79d..887db65 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4662,11 +4662,21 @@ int xhci_gen_setup(struct usb_hcd *hcd,
xhci_get_quirks_t get_quirks)
*/
xhci = hcd_to_xhci(hcd);
temp = xhci_readl(xhci, xhci-cap_regs-hcc_params);
- if (HCC_64BIT_ADDR(temp)) {
+ /*
+ * Check if host machine supports 64 bit DMA address mask
+ * and enable it for both streaming and coherent DMA transfers.
+ * Otherwise, use 32bit DMA mask, if it is supported.
+ */
+ if (HCC_64BIT_ADDR(temp)
+ !dma_set_mask(hcd-self.controller, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, Enabling 64-bit DMA addresses.\n);
- dma_set_mask(hcd-self.controller, DMA_BIT_MASK(64));
+ dma_set_coherent_mask(hcd-self.controller,
+ DMA_BIT_MASK(64));
} else {
- dma_set_mask(hcd-self.controller, DMA_BIT_MASK(32));
+ if (dma_set_mask(hcd-self.controller,
DMA_BIT_MASK(32)))
+ goto error;
+ dma_set_coherent_mask(hcd-self.controller,
+ DMA_BIT_MASK(32));
}
return 0;
}
@@ -4700,11 +4710,21 @@ int xhci_gen_setup(struct usb_hcd *hcd,
xhci_get_quirks_t get_quirks)
xhci_dbg(xhci, Reset complete\n);
temp = xhci_readl(xhci, xhci-cap_regs-hcc_params);
- if (HCC_64BIT_ADDR(temp)) {
+ /*
+ * Check if host machine supports 64 bit DMA address mask
+ * and enable it for both streaming and coherent DMA transfers.
+ * Otherwise, use 32bit DMA mask, if it is supported.
+ */
+ if (HCC_64BIT_ADDR(temp)
+ !dma_set_mask(hcd-self.controller, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, Enabling 64-bit DMA addresses.\n);
- dma_set_mask(hcd-self.controller, DMA_BIT_MASK(64));
+ dma_set_coherent_mask(hcd-self.controller,
+ DMA_BIT_MASK(64));
} else {
- dma_set_mask(hcd-self.controller, DMA_BIT_MASK(32));
+ if (dma_set_mask(hcd-self.controller, DMA_BIT_MASK(32)))
+ goto error;
+ dma_set_coherent_mask(hcd-self.controller,
+ DMA_BIT_MASK(32));
}
xhci_dbg(xhci, Calling HCD init\n);
--
1.7.10.4
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html