From patchwork Tue Mar 26 07:04:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Drake X-Patchwork-Id: 10870483 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AF88214DE for ; Tue, 26 Mar 2019 07:04:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 97D911FF14 for ; Tue, 26 Mar 2019 07:04:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 88B5F28EC5; Tue, 26 Mar 2019 07:04:23 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,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 655611FF14 for ; Tue, 26 Mar 2019 07:04:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726042AbfCZHEV (ORCPT ); Tue, 26 Mar 2019 03:04:21 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:38143 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725497AbfCZHEV (ORCPT ); Tue, 26 Mar 2019 03:04:21 -0400 Received: by mail-pf1-f194.google.com with SMTP id 10so7661722pfo.5 for ; Tue, 26 Mar 2019 00:04:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=endlessm-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=GnfVdpSZ9zZKUvQyyZeQVEg0IpG3ttUb72DRaEIKCgg=; b=CEb8GcteNjakXCUEMDBMq8ezaGvORcJ8TMI1rbI2kuiWJuUtrM4CIWHV+lx/Rp/+TW mwLAgFUl6FLuch+w8ylQn6pAdmP9m9H8n3nilzi2PhR3nDCnMfL4RotcNFgOdABVMogv hiIjAGFZfAH1Ap1LbPVcMLNO8uEWB7TQYDlckek1AwJdjkh7/Tazs22rEsacMu1WPeOp 5ggy/x05xEM+O+b8zFioUZESyve/lTY6y+5euxGuq4LS40dr410gFe87W5iXRyUmxbMO Xz4h9ROf9NdV5yF69iB3G0rUVEbupp8Hb7htI+uskS0FvAUNF8DLJsVUwolovh1K41GE qVPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=GnfVdpSZ9zZKUvQyyZeQVEg0IpG3ttUb72DRaEIKCgg=; b=F5Xu3RTfoEd+XzLgTmsHCyKO3wZER6Ab6twXUkcDXxTL1d6v9jLUlQdRJBNM29XzKK x4xxb9OdUZD+8X6hoHjE3k6d21RItYlHDkMKDMsPdxsuc+E+MhivsALrUhSqbxy8RHvi r0vrGIJSdNMOPN+WLyHLMmWIieKvxjcQ1h1TwI5ZUXDaYBqGCQauPu1M5Y1XQpiSCOm0 8YpEEJRCe4k83XzrPGzJ2wWZQTSg+4RviFiE/jcGnE2vpqFzXONZP0AXypGQ4nv0PNG/ Rarh1iuNXGDEmxcARkHEqHiUbRNkKUoS+FkcPO+qv7dZ4aWd/mOm39zpLNXL4acLyv+q 8NQA== X-Gm-Message-State: APjAAAUoslfssOvVqKAGHGLh+B/AtmmbO00Z5OshlT/eetp9gM3QtikF fPn+QYNpbP6xBP9Z/croSI9zHw== X-Google-Smtp-Source: APXvYqx/YI6W08bklxAI4h3ERbnlbDlKBOig4VD7ofGBMTlxxvJChRLBOENlD2cduSGcmJUNhfRJTA== X-Received: by 2002:a63:2141:: with SMTP id s1mr27562678pgm.430.1553583860316; Tue, 26 Mar 2019 00:04:20 -0700 (PDT) Received: from limbo.local (123-204-46-122.static.seed.net.tw. [123.204.46.122]) by smtp.gmail.com with ESMTPSA id v7sm10451059pgh.53.2019.03.26.00.04.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Mar 2019 00:04:19 -0700 (PDT) From: Daniel Drake To: linux@rempel-privat.de, ulf.hansson@linaro.org Cc: linux-mmc@vger.kernel.org, jin.tsai@alcorlink.com Subject: [PATCH 1/2] mmc: alcor: don't write data before command has completed Date: Tue, 26 Mar 2019 15:04:14 +0800 Message-Id: <20190326070415.11492-1-drake@endlessm.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The alcor driver is setting up data transfer and submitting the associated MMC command at the same time. While this works most of the time, it occasionally causes problems upon write. In the working case, after setting up the data transfer and submitting the MMC command, an interrupt comes in a moment later with CMD_END and WRITE_BUF_RDY bits set. The data transfer then happens without problem. However, on occasion, the interrupt that arrives at that point only has WRITE_BUF_RDY set. The hardware notifies that it's ready to write data, but the associated MMC command is still running. Regardless, the driver was proceeding to write data immediately, and that would then cause another interrupt indicating data CRC error, and the write would fail. Additionally, the transfer setup function alcor_trigger_data_transfer() was being called 3 times for each write operation, which was confusing and may be contributing to this issue. Solve this by tweaking the driver behaviour to follow the sequence observed in the original ampe_stor vendor driver: 1. When starting request handling, write 0 to DATA_XFER_CTRL 2. Submit the command 3. Wait for CMD_END interrupt and then trigger data transfer 4. For the PIO case, trigger the next step of the data transfer only upon the following DATA_END interrupt, which occurs after the block has been written. I confirmed that the read path still works (DMA & PIO) and also now presents more consistency with the operations performed by ampe_stor. Signed-off-by: Daniel Drake --- drivers/mmc/host/alcor.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/drivers/mmc/host/alcor.c b/drivers/mmc/host/alcor.c index 82a97866e0cf4..7c8f203f9a24d 100644 --- a/drivers/mmc/host/alcor.c +++ b/drivers/mmc/host/alcor.c @@ -48,7 +48,6 @@ struct alcor_sdmmc_host { struct mmc_command *cmd; struct mmc_data *data; unsigned int dma_on:1; - unsigned int early_data:1; struct mutex cmd_mutex; @@ -144,8 +143,7 @@ static void alcor_data_set_dma(struct alcor_sdmmc_host *host) host->sg_count--; } -static void alcor_trigger_data_transfer(struct alcor_sdmmc_host *host, - bool early) +static void alcor_trigger_data_transfer(struct alcor_sdmmc_host *host) { struct alcor_pci_priv *priv = host->alcor_pci; struct mmc_data *data = host->data; @@ -155,13 +153,6 @@ static void alcor_trigger_data_transfer(struct alcor_sdmmc_host *host, ctrl |= AU6601_DATA_WRITE; if (data->host_cookie == COOKIE_MAPPED) { - if (host->early_data) { - host->early_data = false; - return; - } - - host->early_data = early; - alcor_data_set_dma(host); ctrl |= AU6601_DATA_DMA_MODE; host->dma_on = 1; @@ -231,6 +222,7 @@ static void alcor_prepare_sg_miter(struct alcor_sdmmc_host *host) static void alcor_prepare_data(struct alcor_sdmmc_host *host, struct mmc_command *cmd) { + struct alcor_pci_priv *priv = host->alcor_pci; struct mmc_data *data = cmd->data; if (!data) @@ -248,7 +240,7 @@ static void alcor_prepare_data(struct alcor_sdmmc_host *host, if (data->host_cookie != COOKIE_MAPPED) alcor_prepare_sg_miter(host); - alcor_trigger_data_transfer(host, true); + alcor_write8(priv, 0, AU6601_DATA_XFER_CTRL); } static void alcor_send_cmd(struct alcor_sdmmc_host *host, @@ -435,7 +427,7 @@ static int alcor_cmd_irq_done(struct alcor_sdmmc_host *host, u32 intmask) if (!host->data) return false; - alcor_trigger_data_transfer(host, false); + alcor_trigger_data_transfer(host); host->cmd = NULL; return true; } @@ -456,7 +448,7 @@ static void alcor_cmd_irq_thread(struct alcor_sdmmc_host *host, u32 intmask) if (!host->data) alcor_request_complete(host, 1); else - alcor_trigger_data_transfer(host, false); + alcor_trigger_data_transfer(host); host->cmd = NULL; } @@ -487,15 +479,9 @@ static int alcor_data_irq_done(struct alcor_sdmmc_host *host, u32 intmask) break; case AU6601_INT_READ_BUF_RDY: alcor_trf_block_pio(host, true); - if (!host->blocks) - break; - alcor_trigger_data_transfer(host, false); return 1; case AU6601_INT_WRITE_BUF_RDY: alcor_trf_block_pio(host, false); - if (!host->blocks) - break; - alcor_trigger_data_transfer(host, false); return 1; case AU6601_INT_DMA_END: if (!host->sg_count) @@ -508,8 +494,14 @@ static int alcor_data_irq_done(struct alcor_sdmmc_host *host, u32 intmask) break; } - if (intmask & AU6601_INT_DATA_END) - return 0; + if (intmask & AU6601_INT_DATA_END) { + if (!host->dma_on && host->blocks) { + alcor_trigger_data_transfer(host); + return 1; + } else { + return 0; + } + } return 1; } From patchwork Tue Mar 26 07:04:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Drake X-Patchwork-Id: 10870485 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2C27917E6 for ; Tue, 26 Mar 2019 07:04:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 148271FF14 for ; Tue, 26 Mar 2019 07:04:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 08E2928EBB; Tue, 26 Mar 2019 07:04:24 +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=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,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 AB7DC28EC6 for ; Tue, 26 Mar 2019 07:04:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730362AbfCZHEX (ORCPT ); Tue, 26 Mar 2019 03:04:23 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:40416 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725497AbfCZHEX (ORCPT ); Tue, 26 Mar 2019 03:04:23 -0400 Received: by mail-pg1-f194.google.com with SMTP id u9so7814918pgo.7 for ; Tue, 26 Mar 2019 00:04:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=endlessm-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=piksQfcRS/pgQTrlEexlfS1qom8nK1s2eUbab66G2BU=; b=K0B/5W+fczXa5APxs+RghsU6fRwZtsLC5i0i8z/rTJHqObVVTsDcG6u2PCHD+6n493 EzMagK+dLsyKNVKP1RWs22Z0Y77SM9Q7hOsRleuI14zA8PJiBBSrPpHfD4KV8UEEdMeK 8Ixic2/dbosBrhkbXIoCFwWyFvlUrh++gykpX7/Noa757LclOWupvxBDb0mu69OATMcg xtoeh6oICH5FPDKqqkmblFBTd6qW2LGneD0zdyc6PZO1b+yCbTKoMZw1ymm5+qPhAxsy EDuCkzm0K6kJCLpVA0BMn0EqE2cv249ZlAGFAW8XlgDa3PbBNCABndGAkS4bBmNtzPbL Zl0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=piksQfcRS/pgQTrlEexlfS1qom8nK1s2eUbab66G2BU=; b=dskz2NotYqtm2mZPJ1yP/mP1XK3GojStLXTdd5iwLGBPpkCHCQNIwL/9WniNjODxrD AsZibEl6DltlrS6f7VNit3KRrr1lmbKFMU8VpjmCv9zdrZjO9rG+OuGIszDzh+4ilZCE 33CKOAMXz0W5ueuxjWgmUkbUuun4B1Tkyeot4pAziDtCh5MQ7Oh1XXfqejlpYk+trXu1 SK5XE6Osf+zYnrZcpzp52EMsP341kBoCeHthe+HemebbW6ii9KMwNXyQjORgPeuhja8g 11SdqTI0PIgaRZc27g61UGxfM+TBCkkz85UD9AnyTsIojv3daMcop7iopZ4oqqDX194l HlYQ== X-Gm-Message-State: APjAAAUpSrsEe9IoviWMwkL1ozij6dyYhdvPqqSSaSNZAspOgDdTdB3u gKikrIzFt7J68UN7BYkDvwO0LpaATJs= X-Google-Smtp-Source: APXvYqx4RtpqBbG2Z9j09fpuJiBPQVu+5cqX7dx45aee7zWEhPTygIyl9MpOXGC21UiK1cbXJRs6Tw== X-Received: by 2002:a63:2045:: with SMTP id r5mr26967801pgm.394.1553583862254; Tue, 26 Mar 2019 00:04:22 -0700 (PDT) Received: from limbo.local (123-204-46-122.static.seed.net.tw. [123.204.46.122]) by smtp.gmail.com with ESMTPSA id v7sm10451059pgh.53.2019.03.26.00.04.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Mar 2019 00:04:21 -0700 (PDT) From: Daniel Drake To: linux@rempel-privat.de, ulf.hansson@linaro.org Cc: linux-mmc@vger.kernel.org, jin.tsai@alcorlink.com Subject: [PATCH 2/2] mmc: alcor: enable DMA for writes Date: Tue, 26 Mar 2019 15:04:15 +0800 Message-Id: <20190326070415.11492-2-drake@endlessm.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190326070415.11492-1-drake@endlessm.com> References: <20190326070415.11492-1-drake@endlessm.com> MIME-Version: 1.0 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Enable the DMA codepath for writes as well as reads. This improves write speed from 1mb/sec to 2mb/sec (tested with dd). The original ampe_stor vendor driver also uses DMA for writes. Signed-off-by: Daniel Drake --- drivers/mmc/host/alcor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/alcor.c b/drivers/mmc/host/alcor.c index 7c8f203f9a24d..3e2efbf3cf8cd 100644 --- a/drivers/mmc/host/alcor.c +++ b/drivers/mmc/host/alcor.c @@ -771,7 +771,8 @@ static void alcor_pre_req(struct mmc_host *mmc, data->host_cookie = COOKIE_UNMAPPED; /* FIXME: looks like the DMA engine works only with CMD18 */ - if (cmd->opcode != 18) + if (cmd->opcode != MMC_READ_MULTIPLE_BLOCK + && cmd->opcode != MMC_WRITE_MULTIPLE_BLOCK) return; /* * We don't do DMA on "complex" transfers, i.e. with