Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f5fdfe9 authored by Mayank Rana's avatar Mayank Rana
Browse files

usb: f_gsi: Use gadget->dev.parent->parent instead of gadget->dev.parent



Currently TRB buffer is allocated using gadget->dev.parent node
(e.g a600000.dwc3) instead of device node (e.g a600000.ssusb)
which is used to create IOMMU based context bank. Hence use
gadget->dev.parent->parent to allocate buffer to avoid unmapped
SMMU page fault while enabling USB SMMU stage S1 functionality.

Change-Id: I6bf9510c7bf6d1daf62e117e2470ed9dc6f7e038
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 5c199f1d
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -1944,9 +1944,11 @@ static int gsi_alloc_trb_buffer(struct f_gsi *gsi)
{
	u32 len_in = 0, len_out = 0;
	int ret = 0;
	struct device *dev;

	log_event_dbg("allocate trb's buffer\n");

	dev = gsi->d_port.gadget->dev.parent;
	if (gsi->d_port.in_ep && !gsi->d_port.in_request.buf_base_addr) {
		log_event_dbg("IN: num_bufs:=%zu, buf_len=%zu\n",
			gsi->d_port.in_request.num_bufs,
@@ -1955,7 +1957,7 @@ static int gsi_alloc_trb_buffer(struct f_gsi *gsi)
		len_in = gsi->d_port.in_request.buf_len *
				gsi->d_port.in_request.num_bufs;
		gsi->d_port.in_request.buf_base_addr =
			dma_zalloc_coherent(gsi->d_port.gadget->dev.parent,
			dma_zalloc_coherent(dev->parent,
			len_in, &gsi->d_port.in_request.dma, GFP_KERNEL);
		if (!gsi->d_port.in_request.buf_base_addr) {
			dev_err(&gsi->d_port.gadget->dev,
@@ -1974,7 +1976,7 @@ static int gsi_alloc_trb_buffer(struct f_gsi *gsi)
		len_out = gsi->d_port.out_request.buf_len *
				gsi->d_port.out_request.num_bufs;
		gsi->d_port.out_request.buf_base_addr =
			dma_zalloc_coherent(gsi->d_port.gadget->dev.parent,
			dma_zalloc_coherent(dev->parent,
			len_out, &gsi->d_port.out_request.dma, GFP_KERNEL);
		if (!gsi->d_port.out_request.buf_base_addr) {
			dev_err(&gsi->d_port.gadget->dev,
@@ -1990,7 +1992,7 @@ static int gsi_alloc_trb_buffer(struct f_gsi *gsi)

fail:
	if (len_in && gsi->d_port.in_request.buf_base_addr) {
		dma_free_coherent(gsi->d_port.gadget->dev.parent, len_in,
		dma_free_coherent(dev->parent, len_in,
				gsi->d_port.in_request.buf_base_addr,
				gsi->d_port.in_request.dma);
		gsi->d_port.in_request.buf_base_addr = NULL;
@@ -2009,7 +2011,7 @@ static void gsi_free_trb_buffer(struct f_gsi *gsi)
			gsi->d_port.out_request.buf_base_addr) {
		len = gsi->d_port.out_request.buf_len *
			gsi->d_port.out_request.num_bufs;
		dma_free_coherent(gsi->d_port.gadget->dev.parent, len,
		dma_free_coherent(gsi->d_port.gadget->dev.parent->parent, len,
			gsi->d_port.out_request.buf_base_addr,
			gsi->d_port.out_request.dma);
		gsi->d_port.out_request.buf_base_addr = NULL;
@@ -2019,7 +2021,7 @@ static void gsi_free_trb_buffer(struct f_gsi *gsi)
			gsi->d_port.in_request.buf_base_addr) {
		len = gsi->d_port.in_request.buf_len *
			gsi->d_port.in_request.num_bufs;
		dma_free_coherent(gsi->d_port.gadget->dev.parent, len,
		dma_free_coherent(gsi->d_port.gadget->dev.parent->parent, len,
			gsi->d_port.in_request.buf_base_addr,
			gsi->d_port.in_request.dma);
		gsi->d_port.in_request.buf_base_addr = NULL;