From patchwork Tue Nov 8 07:49:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kiwoong Kim X-Patchwork-Id: 9416811 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BE5EE60459 for ; Tue, 8 Nov 2016 07:49:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B04E128ADF for ; Tue, 8 Nov 2016 07:49:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A514128B1F; Tue, 8 Nov 2016 07:49:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F6C128B30 for ; Tue, 8 Nov 2016 07:49:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752857AbcKHHtm convert rfc822-to-8bit (ORCPT ); Tue, 8 Nov 2016 02:49:42 -0500 Received: from mailout1.samsung.com ([203.254.224.24]:48942 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752167AbcKHHtc (ORCPT ); Tue, 8 Nov 2016 02:49:32 -0500 Received: from epcpsbgm2new.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OGB00QX7CEAR370@mailout1.samsung.com> for linux-scsi@vger.kernel.org; Tue, 08 Nov 2016 16:49:26 +0900 (KST) X-AuditID: cbfee61b-f796f6d000004092-7f-58218386c5f6 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id FE.75.16530.68381285; Tue, 8 Nov 2016 16:49:26 +0900 (KST) Received: from DOKWMADKIM02 ([12.36.166.218]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OGB0084MCEE0L30@mmp1.samsung.com>; Tue, 08 Nov 2016 16:49:26 +0900 (KST) From: Kiwoong Kim To: "James E.J. Bottomley" , linux-scsi@vger.kernel.org, "Martin K. Petersen" , vinholikatti@gmail.com Cc: =?UTF-8?B?7LaU7ZeM6rSR?= Subject: [PATCH v1] ufs: introduce UFSHCD_QUIRK_BROKEN_DWORD_UTRD quirk Date: Tue, 08 Nov 2016 16:49:26 +0900 Message-id: <002101d23994$a1026f00$e3074d00$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: 8BIT X-Mailer: Microsoft Outlook 15.0 Thread-index: AdI5lJ2ODMSf81lEQUu5YyejfNuyWQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrCIsWRmVeSWpSXmKPExsVy+t9jAd22ZsUIg6ebtC1mX2hitFg1Mc+i +/oONovlx/8xWexYWOXA6rFz1l12jweHNrN4fHx6i8Wjb8sqRo/Pm+QCWKPcbDJSE1NSixRS 85LzUzLz0m2VQkPcdC2UFPISc1NtlSJ0fUOClBTKEnNKgTwjAzTg4BzgHqykb5fgljH5Sxtb wRHhittb5jA2MC4U6GLk4JAQMJFYvCu3i5ETyBSTuHBvPVsXIxeHkMBSRon7X+ewQzjvGSUe Nr5hAaliE9CUeHpzKhNIQkRgPqPEoh07wRLMAoYSG+5PZgSZKizgLjHvtQRImEVAVaJnymNG EJtXwFKitaGPDcIWlPgx+R5Uq7rEpHmLmCFsbYkn7y6wQlykILH701EwW0RAT+Lsok9MEDUi EvtevGOcwCgwC8moWUhGzUIyahaSlgWMLKsYJVILkguKk9JzjfJSy/WKE3OLS/PS9ZLzczcx gmPsmfQOxsO73A8xCnAwKvHwOtxViBBiTSwrrsw9xCjBwawkwstdrRghxJuSWFmVWpQfX1Sa k1p8iNEU6NmJzFKiyfnA+M8riTc0MTcxNzawMLe0NDFSEudtnP0sXEggPbEkNTs1tSC1CKaP iYNTqoGRLcifv2lF8HGm1fMvWGTvZbc7pxDkW+G0UpRp0wGXfsVLWm41315ZfDx2+zjzdD3O qvz3tvOit8zZwrTp+q63N854fpg22ztES8L6UN+S+sAT6mnvjUvS9Pbm+C6qlf//yWhSKFfy VMnUj59m1ycbP1jGmfa1MvqCu+yNrdXldeeFPHRO3FNUYinOSDTUYi4qTgQACEd62scCAAA= X-MTR: 20000000000000000@CPGS Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some UFS host controllers may think granularitys of PRDT length and offset as bytes, not double words. Signed-off-by: Kiwoong Kim --- drivers/scsi/ufs/ufshcd.c | 24 +++++++++++++++++++----- drivers/scsi/ufs/ufshcd.h | 2 ++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 8e19631..549e3e8 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -1161,8 +1161,13 @@ static int ufshcd_map_sg(struct ufshcd_lrb *lrbp) return sg_segments; if (sg_segments) { - lrbp->utr_descriptor_ptr->prd_table_length = - cpu_to_le16((u16) (sg_segments)); + if (hba->quirks & UFSHCD_QUIRK_BROKEN_DWORD_UTRD) + lrbp->utr_descriptor_ptr->prd_table_length = + cpu_to_le16((u16)(sg_segments * + sizeof(struct ufshcd_sg_entry))); + else + lrbp->utr_descriptor_ptr->prd_table_length = + cpu_to_le16((u16) (sg_segments)); prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr; @@ -2385,12 +2390,21 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba) cpu_to_le32(upper_32_bits(cmd_desc_element_addr)); /* Response upiu and prdt offset should be in double words */ - utrdlp[i].response_upiu_offset = + if (hba->quirks & UFSHCD_QUIRK_BROKEN_DWORD_UTRD) { + utrdlp[i].response_upiu_offset = + cpu_to_le16(response_offset); + utrdlp[i].prd_table_offset = + cpu_to_le16(prdt_offset); + utrdlp[i].response_upiu_length = + cpu_to_le16(ALIGNED_UPIU_SIZE); + } else { + utrdlp[i].response_upiu_offset = cpu_to_le16((response_offset >> 2)); - utrdlp[i].prd_table_offset = + utrdlp[i].prd_table_offset = cpu_to_le16((prdt_offset >> 2)); - utrdlp[i].response_upiu_length = + utrdlp[i].response_upiu_length = cpu_to_le16(ALIGNED_UPIU_SIZE >> 2); + } hba->lrb[i].utr_descriptor_ptr = (utrdlp + i); hba->lrb[i].ucd_req_ptr = diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 8cf3991..565f005 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -494,6 +494,8 @@ struct ufs_hba { #define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION UFS_BIT(5) #define UFSHCD_QUIRK_GET_VS_RESULT UFS_BIT(6) + #define UFSHCD_QUIRK_BROKEN_DWORD_UTRD UFS_BIT(7) + unsigned int quirks; /* Deviations from standard UFSHCI spec. */