Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2984225imu; Sun, 9 Dec 2018 14:17:21 -0800 (PST) X-Google-Smtp-Source: AFSGD/V+hAMC1oKnGXnF181sicAJRltwU4LOnbkjArIOkPWKggJMvQIIo4IPMplyszZ3lcguqvjh X-Received: by 2002:a17:902:c85:: with SMTP id 5mr10049454plt.339.1544393841789; Sun, 09 Dec 2018 14:17:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544393841; cv=none; d=google.com; s=arc-20160816; b=CSFuZOOooLLiresoNPBBocHLci+R1T92Q3DYehRlt2PxmU2WWqyf8XiTQMARBhMn0w HUKUSzPmIkt10DKxjzutxEgH9XUtvHJz0AdjpQPJBmQJN/1OBJPOFg3ZB8/JRwnR30bL r7+1Ydv+TbzUbMkyZx9oAvQAlQdDQSgnY+MKndWDfUuUaE1GM/SefgmzGwUmw8RlmcNh Pus/8oHrgwoEH53Ii0S7ZZuEPd6UPT8Nneh2TUea0mufJ3Az/BM6beho0R990SYB6OTH oVjOEFFrIy/nDblrb8u9JjY4P6IvK+oqb8nDhPZPBDQ3wN3dzFT/eXhcSWrevfykxj22 lN4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=I90WV/3td/ma8GunEfUqlBF/0qSC5v/E2H9bR6SATkQ=; b=yBRwdctXSJ1oUikyU/UFehBx9cvfqN8xJ07MDyo4Wv9H+UL6XHkIxVTqcv07YdNUdB 9OdKONL2KHCXjulP8IHGYVPHU8VUtsGqURM1SOoXp2tkmClzLsGqfvLCDl+dL6ifzaJ5 ZgofRpH5rs2SMcgiBwxiDAOz/KGI3hFDqikKvJxK2z5ABBSwZGchJ9xy0/bmu/VxZ1rD Jrsas/pNpQa5P7cGBMlVOO3Mf/1RDRxvVRby1ZiKWoolkvQAGf7g6f13HYSKHwXlf8ZA IOV9OIB9CZz6rqpFCWsJmGgUKWkHEmls7PaV4n2kgsn6M7wz52pniSLdR02l2Gax0HmH YVZA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j20si7342129pgg.162.2018.12.09.14.17.06; Sun, 09 Dec 2018 14:17:21 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728480AbeLIWOD (ORCPT + 99 others); Sun, 9 Dec 2018 17:14:03 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:38000 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727862AbeLIWOB (ORCPT ); Sun, 9 Dec 2018 17:14:01 -0500 Received: from pub.yeoldevic.com ([81.174.156.145] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gW735-0002il-6e; Sun, 09 Dec 2018 21:55:39 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gW72g-0003VL-9B; Sun, 09 Dec 2018 21:55:14 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Laurent Pinchart" , "Geert Uytterhoeven" , "Mark Brown" Date: Sun, 09 Dec 2018 21:50:33 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 203/328] spi: rspi: Handle dmaengine_prep_slave_sg() failures gracefully In-Reply-To: X-SA-Exim-Connect-IP: 81.174.156.145 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.62-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Geert Uytterhoeven commit 85912a88c1ebcad04a5cfec971771195ce8d6691 upstream. As typically a shmobile SoC has less DMA channels than devices that can use DMA, we may want to prioritize access to the DMA channels in the future. This means that dmaengine_prep_slave_sg() may start failing arbitrarily. Handle dmaengine_prep_slave_sg() failures gracefully by falling back to PIO. Signed-off-by: Geert Uytterhoeven Acked-by: Laurent Pinchart Signed-off-by: Mark Brown Signed-off-by: Ben Hutchings --- drivers/spi/spi-rspi.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c @@ -477,7 +477,7 @@ static int rspi_dma_transfer(struct rspi tx->sgl, tx->nents, DMA_TO_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_tx) - return -EIO; + goto no_dma; irq_mask |= SPCR_SPTIE; } @@ -486,7 +486,7 @@ static int rspi_dma_transfer(struct rspi rx->sgl, rx->nents, DMA_FROM_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_rx) - return -EIO; + goto no_dma; irq_mask |= SPCR_SPRIE; } @@ -540,6 +540,12 @@ static int rspi_dma_transfer(struct rspi enable_irq(rspi->rx_irq); return ret; + +no_dma: + pr_warn_once("%s %s: DMA not available, falling back to PIO\n", + dev_driver_string(&rspi->master->dev), + dev_name(&rspi->master->dev)); + return -EAGAIN; } static void rspi_receive_init(const struct rspi_data *rspi) @@ -593,8 +599,10 @@ static int rspi_common_transfer(struct r if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ - return rspi_dma_transfer(rspi, &xfer->tx_sg, - xfer->rx_buf ? &xfer->rx_sg : NULL); + ret = rspi_dma_transfer(rspi, &xfer->tx_sg, + xfer->rx_buf ? &xfer->rx_sg : NULL); + if (ret != -EAGAIN) + return ret; } ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); @@ -648,8 +656,11 @@ static int qspi_transfer_out(struct rspi { int ret; - if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) - return rspi_dma_transfer(rspi, &xfer->tx_sg, NULL); + if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { + ret = rspi_dma_transfer(rspi, &xfer->tx_sg, NULL); + if (ret != -EAGAIN) + return ret; + } ret = rspi_pio_transfer(rspi, xfer->tx_buf, NULL, xfer->len); if (ret < 0) @@ -663,8 +674,11 @@ static int qspi_transfer_out(struct rspi static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer) { - if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) - return rspi_dma_transfer(rspi, NULL, &xfer->rx_sg); + if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { + int ret = rspi_dma_transfer(rspi, NULL, &xfer->rx_sg); + if (ret != -EAGAIN) + return ret; + } return rspi_pio_transfer(rspi, NULL, xfer->rx_buf, xfer->len); }