Received: by 10.192.165.156 with SMTP id m28csp2923850imm; Sun, 15 Apr 2018 12:26:40 -0700 (PDT) X-Google-Smtp-Source: AIpwx48yQ57bkGCT5OwiSqx0GWL9O3+oz5IVMZy+C1yuwNWgO4HBTqnigARSpkc88TRiEj7DN5JF X-Received: by 10.98.72.74 with SMTP id v71mr18944675pfa.241.1523820400132; Sun, 15 Apr 2018 12:26:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523820400; cv=none; d=google.com; s=arc-20160816; b=p+GujYfEXqoxh8Dy7XIYnEayc9tyR1YpR9LKZcT4tKAVRrCQkCV9wdcXQ06qhETvf3 uEDVGRc3CfqOrpXmey6a8DFVorP47j069stzYBVPPLdwTFtYfSM0napKcF1OtIrxGOfa J77+BHHCPy/tkgJIHOaDUf0SvwAEXsR9aDBtHEQ0DzZ7Ofn9PBx0eKqj0lRIc+qNXofs JeQpTnzzJTI0EHt5ylr+G5nkoVa/7wZfaEaPibvSJh4r4vN6qAQbQorKMkge185oFpaa LujxFkTe001IOze5b/B8oNZq+IN8YZ4GCntQ+qileQFZcDV5uc7LDkoom7ck8Pmwwbkx Gh+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dmarc-filter:arc-authentication-results; bh=K5jNWEVqAi9XkUgb3Qp0uytLuTncFJyEcfapTARGJs8=; b=RdMilymqXV4g8r+nU2ZWKls4xWjykast9TMtUIPm/zDQIrPTJrNIwMDX9S4vamLDsi BskWpE46c3ZQZgOngpwz13Cv+tq+g1RarwTnTPzJIAeXkZ9N+n45Yj766zNeQucrIYhj H2DP2m5VdE+Zpvq3W/gy5KxL44MCQ5XE4KFb8g6/jOqc4IsDqk8NKPQkAGSv3Ja/wvHh OTesdEeUM7WaAURA0GDMlWeAjq9H/0Tm7CUrj4T6QJhy2OJHrr/WxOayaHkfLbohd6Ji YmZJ9MlXq1cuTKDSG8ZP+6s4d4Vk9HGtLH10gTauaC7Tn88AwintRa6cThUFlfNcWUxC e0kw== 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 g3-v6si10563140pld.513.2018.04.15.12.26.26; Sun, 15 Apr 2018 12:26:40 -0700 (PDT) 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 S1752802AbeDOTXU (ORCPT + 99 others); Sun, 15 Apr 2018 15:23:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:51706 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752464AbeDOTXR (ORCPT ); Sun, 15 Apr 2018 15:23:17 -0400 Received: from archlinux (cpc91196-cmbg18-2-0-cust659.5-4.cable.virginm.net [81.96.234.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 883A42177F; Sun, 15 Apr 2018 19:23:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 883A42177F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jic23@kernel.org Date: Sun, 15 Apr 2018 20:23:11 +0100 From: Jonathan Cameron To: Eugen Hristev Cc: , , , , , , , , , Subject: Re: [PATCH v3 01/11] iio: adc: at91-sama5d2_adc: fix channel configuration for differential channels Message-ID: <20180415202311.148463be@archlinux> In-Reply-To: <1523350677-27106-2-git-send-email-eugen.hristev@microchip.com> References: <1523350677-27106-1-git-send-email-eugen.hristev@microchip.com> <1523350677-27106-2-git-send-email-eugen.hristev@microchip.com> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 10 Apr 2018 11:57:47 +0300 Eugen Hristev wrote: > When iterating through the channels, the index in the array is not the > scan index. Added an xlate function to translate to the proper index. > The result of the bug is that the channel array is indexed with a wrong index, > thus instead of the proper channel, we access invalid memory, which may > lead to invalid results and/or corruption. > This will be used also for devicetree channel xlate. > > Fixes: 5e1a1da0f ("iio: adc: at91-sama5d2_adc: add hw trigger and buffer support") > Fixes: 073c66201 ("iio: adc: at91-sama5d2_adc: add support for DMA") > Signed-off-by: Eugen Hristev This fix obviously stands on it's own so I have applied it to the fixes-togreg branch of iio.git and will send out a pull request with it in after the merge window is closed and rc1 is out. Marked for stable. Note this will delay the rest of the series being applied but that is no bad thing as I would like a little more time for people to consider it anyway and we are obviously in no rush given the time in the cycle! Thanks, Jonathan > --- > drivers/iio/adc/at91-sama5d2_adc.c | 41 ++++++++++++++++++++++++++++++++++---- > 1 file changed, 37 insertions(+), 4 deletions(-) > > diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c > index 4eff835..8729d65 100644 > --- a/drivers/iio/adc/at91-sama5d2_adc.c > +++ b/drivers/iio/adc/at91-sama5d2_adc.c > @@ -333,6 +333,27 @@ static const struct iio_chan_spec at91_adc_channels[] = { > + AT91_SAMA5D2_DIFF_CHAN_CNT + 1), > }; > > +static int at91_adc_chan_xlate(struct iio_dev *indio_dev, int chan) > +{ > + int i; > + > + for (i = 0; i < indio_dev->num_channels; i++) { > + if (indio_dev->channels[i].scan_index == chan) > + return i; > + } > + return -EINVAL; > +} > + > +static inline struct iio_chan_spec const * > +at91_adc_chan_get(struct iio_dev *indio_dev, int chan) > +{ > + int index = at91_adc_chan_xlate(indio_dev, chan); > + > + if (index < 0) > + return NULL; > + return indio_dev->channels + index; > +} > + > static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) > { > struct iio_dev *indio = iio_trigger_get_drvdata(trig); > @@ -350,8 +371,10 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state) > at91_adc_writel(st, AT91_SAMA5D2_TRGR, status); > > for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { > - struct iio_chan_spec const *chan = indio->channels + bit; > + struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); > > + if (!chan) > + continue; > if (state) { > at91_adc_writel(st, AT91_SAMA5D2_CHER, > BIT(chan->channel)); > @@ -448,7 +471,11 @@ static int at91_adc_dma_start(struct iio_dev *indio_dev) > > for_each_set_bit(bit, indio_dev->active_scan_mask, > indio_dev->num_channels) { > - struct iio_chan_spec const *chan = indio_dev->channels + bit; > + struct iio_chan_spec const *chan = > + at91_adc_chan_get(indio_dev, bit); > + > + if (!chan) > + continue; > > st->dma_st.rx_buf_sz += chan->scan_type.storagebits / 8; > } > @@ -526,8 +553,11 @@ static int at91_adc_buffer_predisable(struct iio_dev *indio_dev) > */ > for_each_set_bit(bit, indio_dev->active_scan_mask, > indio_dev->num_channels) { > - struct iio_chan_spec const *chan = indio_dev->channels + bit; > + struct iio_chan_spec const *chan = > + at91_adc_chan_get(indio_dev, bit); > > + if (!chan) > + continue; > if (st->dma_st.dma_chan) > at91_adc_readl(st, chan->address); > } > @@ -587,8 +617,11 @@ static void at91_adc_trigger_handler_nodma(struct iio_dev *indio_dev, > > for_each_set_bit(bit, indio_dev->active_scan_mask, > indio_dev->num_channels) { > - struct iio_chan_spec const *chan = indio_dev->channels + bit; > + struct iio_chan_spec const *chan = > + at91_adc_chan_get(indio_dev, bit); > > + if (!chan) > + continue; > st->buffer[i] = at91_adc_readl(st, chan->address); > i++; > }