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

Commit d61a044a authored by Mayank Rana's avatar Mayank Rana Committed by Ashwini Muduganti
Browse files

dwc3-msm: Don't unmap IPA GSI channel related doorbell register mapping



IPA GSI channels are statically allocated for USB tethered and DPL
functions. Currently code keeps doorbell register address mapped with
used USB endpoint until same USB endpoint is being re-enabled where it
performs unmap and re-map of same before programming it with USB GSI
wrapper. With this functionality sometime smmu page fault is seen when
unmap is called and re-map is going through while USB GSI wrapper is
trying to access previously mapped address. Hence to fix this issue
don't unmap IPA GSI channel doorbell register and keep using it. With
this change, it enforces restrictions of not supporting below USB
compositions:
a. dynamic composition switch from RMNET/RNDIS + DPL to DPL only
b. dynamic composition switch from RMNET/RNDIS + DPL to DPL + RMNET/RNDIS

Change-Id: I4b5daf6a36797784e99bf6aa6f8fb6f0ddfddf58
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 30a99a27
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -937,21 +937,24 @@ static void gsi_store_ringbase_dbl_info(struct usb_ep *ep,
		GSI_RING_BASE_ADDR_L(mdwc->gsi_reg[RING_BASE_ADDR_L], (n)),
		dwc3_trb_dma_offset(dep, &dep->trb_pool[0]));

	if (request->mapped_db_reg_phs_addr_lsb)
		dma_unmap_resource(dwc->sysdev,
			request->mapped_db_reg_phs_addr_lsb,
	if (!request->mapped_db_reg_phs_addr_lsb) {
		request->mapped_db_reg_phs_addr_lsb =
			dma_map_resource(dwc->sysdev,
				(phys_addr_t)request->db_reg_phs_addr_lsb,
				PAGE_SIZE, DMA_BIDIRECTIONAL, 0);

	request->mapped_db_reg_phs_addr_lsb = dma_map_resource(dwc->sysdev,
			(phys_addr_t)request->db_reg_phs_addr_lsb, PAGE_SIZE,
			DMA_BIDIRECTIONAL, 0);
	if (dma_mapping_error(dwc->sysdev, request->mapped_db_reg_phs_addr_lsb))
		if (dma_mapping_error(dwc->sysdev,
				request->mapped_db_reg_phs_addr_lsb))
			dev_err(mdwc->dev, "mapping error for db_reg_phs_addr_lsb\n");
	}

	dev_dbg(mdwc->dev, "ep:%s dbl_addr_lsb:%x mapped_dbl_addr_lsb:%llx\n",
		ep->name, request->db_reg_phs_addr_lsb,
		(unsigned long long)request->mapped_db_reg_phs_addr_lsb);

	dbg_log_string("ep:%s dbl_addr_lsb:%x mapped_addr:%llx\n",
		ep->name, request->db_reg_phs_addr_lsb,
		(unsigned long long)request->mapped_db_reg_phs_addr_lsb);

	dwc3_msm_write_reg(mdwc->base,
		GSI_DBL_ADDR_L(mdwc->gsi_reg[DBL_ADDR_L], (n)),
		(u32)request->mapped_db_reg_phs_addr_lsb);