From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D183214533A; Sun, 28 Jul 2024 16:07:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722182839; cv=none; b=m3uRdaiTRgY4Q75EGMBY2beflPjhcUUnKLFbVCb/JRAcRyjCC/ZZJmVzpxfpuXmcN7j3sBB14zGCru+3APOs+ePXy/Gw/7PhyfyMdZHgZTe9dFwobCCfOavCKN5iiXuE+yn4j+Lia+SMmdcFi0+do4Ymw7jtdtybx/CFmIXh5ds= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722182839; c=relaxed/simple; bh=I71RhIvgEqR6UJ8qpGNNIsV0J7ZZfLtX4YiU7/tSzKU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EAm7cd32Q/8oL8aqPHnTL+gAO5W3ICPjPcbx9/tTnu/DqYXFkoPNzbLQTm/S3h4g2GRwMh8hfGORxZibyHicVSjzyTtB2jqpXxKZZlhF6QnJXchzRjIDyUfUI9lBFStCygzIIazWCsULxM0P43hfV0rcoEHrP4KT1haoZ/imhG0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QwIIBAG9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QwIIBAG9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C7DBC4AF0B; Sun, 28 Jul 2024 16:07:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722182839; bh=I71RhIvgEqR6UJ8qpGNNIsV0J7ZZfLtX4YiU7/tSzKU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QwIIBAG9iHF2SBKdMjNoTs+eSGGtT6UEaZaB32dHPIoJsxTSbRngVQsdl8NgECwGm u6dnLBnvtwwNrrlZqnYYW8XirQnM+V3Xpgp4yEH0EH2DJeZgIts6VQaIjQbUjn2a5i fASbY59YsXo8OxjMmx4STBYFtEgd2259ly3DO3GjYBozDC1RcuHQFQ/OSARjr7FRgE 8Q+zjzLNd74H+mNJjZdpq7CpYVGYOhUinhURjcaLpNeceyQVxJv8RwrU5Ga3VEo83d h9XS3RahwCPO8bX4khKjFeEviGv7E8ZX9nNaq+rj8avbaCuyPGDFdRS3sBDyCP1f2r yptFxV7+8s7vQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Peng Hongchi , Greg Kroah-Hartman , Sasha Levin , hminas@synopsys.com, linux-usb@vger.kernel.org Subject: [PATCH AUTOSEL 6.6 05/17] usb: dwc2: gadget: Don't write invalid mapped sg entries into dma_desc with iommu enabled Date: Sun, 28 Jul 2024 12:06:41 -0400 Message-ID: <20240728160709.2052627-5-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240728160709.2052627-1-sashal@kernel.org> References: <20240728160709.2052627-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.6.43 Content-Transfer-Encoding: 8bit From: Peng Hongchi [ Upstream commit 1134289b6b93d73721340b66c310fd985385e8fa ] When using dma_map_sg() to map the scatterlist with iommu enabled, the entries in the scatterlist can be mergerd into less but longer entries in the function __finalise_sg(). So that the number of valid mapped entries is actually smaller than ureq->num_reqs,and there are still some invalid entries in the scatterlist with dma_addr=0xffffffff and len=0. Writing these invalid sg entries into the dma_desc can cause a data transmission error. The function dma_map_sg() returns the number of valid map entries and the return value is assigned to usb_request::num_mapped_sgs in function usb_gadget_map_request_by_dev(). So that just write valid mapped entries into dma_desc according to the usb_request::num_mapped_sgs, and set the IOC bit if it's the last valid mapped entry. This patch poses no risk to no-iommu situation, cause ureq->num_mapped_sgs equals ureq->num_sgs while using dma_direct_map_sg() to map the scatterlist whith iommu disabled. Signed-off-by: Peng Hongchi Link: https://lore.kernel.org/r/20240523100315.7226-1-hongchi.peng@siengine.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/dwc2/gadget.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index b2f6da5b65ccd..b26de09f6b6d5 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -885,10 +885,10 @@ static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, } /* DMA sg buffer */ - for_each_sg(ureq->sg, sg, ureq->num_sgs, i) { + for_each_sg(ureq->sg, sg, ureq->num_mapped_sgs, i) { dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &desc, sg_dma_address(sg) + sg->offset, sg_dma_len(sg), - sg_is_last(sg)); + (i == (ureq->num_mapped_sgs - 1))); desc_count += hs_ep->desc_count; } -- 2.43.0