From patchwork Fri Jan 20 15:32:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrea Merello X-Patchwork-Id: 9528821 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 62644601AE for ; Fri, 20 Jan 2017 15:33:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B22E2842F for ; Fri, 20 Jan 2017 15:33:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0E42728527; Fri, 20 Jan 2017 15:33:12 +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.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 F2AB52842F for ; Fri, 20 Jan 2017 15:33:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752683AbdATPdE (ORCPT ); Fri, 20 Jan 2017 10:33:04 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33492 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752670AbdATPdC (ORCPT ); Fri, 20 Jan 2017 10:33:02 -0500 Received: by mail-wm0-f66.google.com with SMTP id r144so7543196wme.0 for ; Fri, 20 Jan 2017 07:33:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zktC6b9jRq2VfYgT0whAeJ5No6Z5k5d3sQvTh8mwIyw=; b=XmGl7MIrvqkj8MYPQdwfWnpYJByFcoDZz4ay+eoQE7BCQcQvYHyhLUQ8qJoHSXf3h+ iWTvjZNBODDgC8To2ngm00m4cxNB6arqzVvzdQuxzCI5C3Fz3zxf645Nt+uem5R0pCqV m9gvY4Fhe4UNbYCxEL6/W7In7Nfqoe0273MkDrQA9nGi35xB+j4qrIuAfbTmz2LvfN4K +o16myPCZOF6LKZzUVXL94xI5xd5srXXD0ccY4nS8bmLQQHIxaS4NqPa/Df0LWdQtHie neh7ROoVC8VW84j7BUoqo83mFhks8Gnv6WxJtsTpbEqUecjJw1l/2xpZg29ELnVy3hxQ ts6Q== 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; bh=zktC6b9jRq2VfYgT0whAeJ5No6Z5k5d3sQvTh8mwIyw=; b=T1KnYJEwWhy1f6pIiLP1fD8Xmp/OkWDF9F3Y92/xBYgVbG65ypDPE9sSQZcCNUmiCJ wSzwrW7NgKOmF3+RocnaCgUZg04d/IW7U37SyhQ7h+yn+AgX4GO5iugYNEYZUDySYxsw LR6gQ4WIy/H5sFmXhFSKF2xRxW+yQITDaT3x5yt+B5dmief4uTVh/8+zuu5qkvkTDye1 tp41likCS6p30lAEka2ogyQYBa10ocYis7hTtxSM47PbqPR2kyHOEQH0mZB7A0EFrKk6 XdarVjN72K6vDHnVcGnk82UPXLWNBf2T+stWIlDlWOJA3YPNuVDYUTmVPNs2GfLFDaqK mkdA== X-Gm-Message-State: AIkVDXJC75iKQyVPPN6dbTPvA/e1t6EilPSlJ7q0a5Rr0wfm0w6kmYQVL21nSSb082kDcw== X-Received: by 10.223.168.111 with SMTP id l102mr12126717wrc.150.1484926381548; Fri, 20 Jan 2017 07:33:01 -0800 (PST) Received: from NewMoon.iit.local ([90.147.180.254]) by smtp.googlemail.com with ESMTPSA id l74sm6734899wmg.2.2017.01.20.07.33.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 20 Jan 2017 07:33:01 -0800 (PST) From: Andrea Merello To: vinod.koul@intel.com, michal.simek@xilinx.com, soren.brinkmann@xilinx.com Cc: dmaengine@vger.kernel.org, Andrea Merello Subject: [PATCH 2/5] dmaengine: xilinx_dma: fix working on wrong tail segment Date: Fri, 20 Jan 2017 16:32:46 +0100 Message-Id: <1484926369-30910-2-git-send-email-andrea.merello@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1484926369-30910-1-git-send-email-andrea.merello@gmail.com> References: <1484926369-30910-1-git-send-email-andrea.merello@gmail.com> Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP xilinx_dma_start_transfer() locally buffered the tail segment of the pending list, then it operated over the head. However In case of a 1-length descriptor list, where head and tail are the same, the tail segment changes. The local buffering at the beginning is thus broken. This patch fixes this. Signed-off-by: Andrea Merello --- drivers/dma/xilinx/xilinx_dma.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c index b99094c..4ae2c10 100644 --- a/drivers/dma/xilinx/xilinx_dma.c +++ b/drivers/dma/xilinx/xilinx_dma.c @@ -1206,11 +1206,7 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan) } head_desc = list_first_entry(&chan->pending_list, - struct xilinx_dma_tx_descriptor, node); - tail_desc = list_last_entry(&chan->pending_list, - struct xilinx_dma_tx_descriptor, node); - tail_segment = list_last_entry(&tail_desc->segments, - struct xilinx_axidma_tx_segment, node); + struct xilinx_dma_tx_descriptor, node); if (chan->has_sg && !chan->xdev->mcdma) { old_head = list_first_entry(&head_desc->segments, @@ -1223,8 +1219,18 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan) list_replace_init(&old_head->node, &new_head->node); chan->seg_v = old_head; + tail_desc = list_last_entry(&chan->pending_list, + struct xilinx_dma_tx_descriptor, node); + tail_segment = list_last_entry(&tail_desc->segments, + struct xilinx_axidma_tx_segment, node); + tail_segment->hw.next_desc = chan->seg_v->phys; head_desc->async_tx.phys = new_head->phys; + } else { + tail_desc = list_last_entry(&chan->pending_list, + struct xilinx_dma_tx_descriptor, node); + tail_segment = list_last_entry(&tail_desc->segments, + struct xilinx_axidma_tx_segment, node); } reg = dma_ctrl_read(chan, XILINX_DMA_REG_DMACR);