LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Dragan Cvetic <draganc@xilinx.com>
To: Greg KH <gregkh@linuxfoundation.org>
Cc: "arnd@arndb.de" <arnd@arndb.de>,
	Michal Simek <michals@xilinx.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"mark.rutland@arm.com" <mark.rutland@arm.com>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Derek Kiernan <dkiernan@xilinx.com>
Subject: RE: [PATCH V4 10/12] misc: xilinx_sdfec: Add stats & status ioctls
Date: Thu, 6 Jun 2019 18:27:23 +0000	[thread overview]
Message-ID: <CH2PR02MB635905A42F3F667E81D30E27CB170@CH2PR02MB6359.namprd02.prod.outlook.com> (raw)
In-Reply-To: <20190606141138.GD7943@kroah.com>



> -----Original Message-----
> From: Greg KH [mailto:gregkh@linuxfoundation.org]
> Sent: Thursday 6 June 2019 15:12
> To: Dragan Cvetic <draganc@xilinx.com>
> Cc: arnd@arndb.de; Michal Simek <michals@xilinx.com>; linux-arm-kernel@lists.infradead.org; robh+dt@kernel.org;
> mark.rutland@arm.com; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; Derek Kiernan <dkiernan@xilinx.com>
> Subject: Re: [PATCH V4 10/12] misc: xilinx_sdfec: Add stats & status ioctls
> 
> On Sat, May 25, 2019 at 12:37:23PM +0100, Dragan Cvetic wrote:
> > SD-FEC statistic data are:
> > - count of data interface errors (isr_err_count)
> > - count of Correctable ECC errors (cecc_count)
> > - count of Uncorrectable ECC errors (uecc_count)
> >
> > Add support:
> > 1. clear stats ioctl callback which clears collected
> > statistic data,
> > 2. get stats ioctl callback which reads a collected
> > statistic data,
> > 3. set default configuration ioctl callback,
> > 4. start ioctl callback enables SD-FEC HW,
> > 5. stop ioctl callback disables SD-FEC HW.
> >
> > In a failed state driver enables the following ioctls:
> > - get status
> > - get statistics
> > - clear stats
> > - set default SD-FEC device configuration
> >
> > Tested-by: Santhosh Dyavanapally <SDYAVANA@xilinx.com>
> > Tested by: Punnaiah Choudary Kalluri <punnaia@xilinx.com>
> > Tested-by: Derek Kiernan <derek.kiernan@xilinx.com>
> > Tested-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
> > Signed-off-by: Derek Kiernan <derek.kiernan@xilinx.com>
> > Signed-off-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
> > ---
> >  drivers/misc/xilinx_sdfec.c      | 121 +++++++++++++++++++++++++++++++++++++++
> >  include/uapi/misc/xilinx_sdfec.h |  75 ++++++++++++++++++++++++
> >  2 files changed, 196 insertions(+)
> >
> > diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c
> > index 544e746..6e04492 100644
> > --- a/drivers/misc/xilinx_sdfec.c
> > +++ b/drivers/misc/xilinx_sdfec.c
> > @@ -189,6 +189,7 @@ struct xsdfec_clks {
> >   * @dev: pointer to device struct
> >   * @state: State of the SDFEC device
> >   * @config: Configuration of the SDFEC device
> > + * @intr_enabled: indicates IRQ enabled
> >   * @state_updated: indicates State updated by interrupt handler
> >   * @stats_updated: indicates Stats updated by interrupt handler
> >   * @isr_err_count: Count of ISR errors
> > @@ -207,6 +208,7 @@ struct xsdfec_dev {
> >  	struct device *dev;
> >  	enum xsdfec_state state;
> >  	struct xsdfec_config config;
> > +	bool intr_enabled;
> >  	bool state_updated;
> >  	bool stats_updated;
> >  	atomic_t isr_err_count;
> > @@ -290,6 +292,26 @@ static int xsdfec_dev_release(struct inode *iptr, struct file *fptr)
> >  	return 0;
> >  }
> >
> > +static int xsdfec_get_status(struct xsdfec_dev *xsdfec, void __user *arg)
> > +{
> > +	struct xsdfec_status status;
> > +	int err;
> > +
> > +	status.fec_id = xsdfec->config.fec_id;
> > +	spin_lock_irqsave(&xsdfec->irq_lock, xsdfec->flags);
> > +	status.state = xsdfec->state;
> > +	xsdfec->state_updated = false;
> > +	spin_unlock_irqrestore(&xsdfec->irq_lock, xsdfec->flags);
> > +	status.activity = (xsdfec_regread(xsdfec, XSDFEC_ACTIVE_ADDR) &
> > +			   XSDFEC_IS_ACTIVITY_SET);
> > +
> > +	err = copy_to_user(arg, &status, sizeof(status));
> > +	if (err)
> > +		err = -EFAULT;
> > +
> > +	return err;
> > +}
> > +
> >  static int xsdfec_get_config(struct xsdfec_dev *xsdfec, void __user *arg)
> >  {
> >  	int err;
> > @@ -850,6 +872,80 @@ static int xsdfec_cfg_axi_streams(struct xsdfec_dev *xsdfec)
> >  	return 0;
> >  }
> >
> > +static int xsdfec_start(struct xsdfec_dev *xsdfec)
> > +{
> > +	u32 regread;
> > +
> > +	regread = xsdfec_regread(xsdfec, XSDFEC_FEC_CODE_ADDR);
> > +	regread &= 0x1;
> > +	if (regread != xsdfec->config.code) {
> > +		dev_dbg(xsdfec->dev,
> > +			"%s SDFEC HW code does not match driver code, reg %d, code %d",
> > +			__func__, regread, xsdfec->config.code);
> > +		return -EINVAL;
> > +	}
> > +
> > +	/* Set AXIS enable */
> > +	xsdfec_regwrite(xsdfec, XSDFEC_AXIS_ENABLE_ADDR,
> > +			XSDFEC_AXIS_ENABLE_MASK);
> > +	/* Done */
> > +	xsdfec->state = XSDFEC_STARTED;
> > +	return 0;
> > +}
> > +
> > +static int xsdfec_stop(struct xsdfec_dev *xsdfec)
> > +{
> > +	u32 regread;
> > +
> > +	if (xsdfec->state != XSDFEC_STARTED)
> > +		dev_dbg(xsdfec->dev, "Device not started correctly");
> > +	/* Disable AXIS_ENABLE Input interfaces only */
> > +	regread = xsdfec_regread(xsdfec, XSDFEC_AXIS_ENABLE_ADDR);
> > +	regread &= (~XSDFEC_AXIS_IN_ENABLE_MASK);
> > +	xsdfec_regwrite(xsdfec, XSDFEC_AXIS_ENABLE_ADDR, regread);
> > +	/* Stop */
> > +	xsdfec->state = XSDFEC_STOPPED;
> > +	return 0;
> > +}
> > +
> > +static int xsdfec_clear_stats(struct xsdfec_dev *xsdfec)
> > +{
> > +	atomic_set(&xsdfec->isr_err_count, 0);
> > +	atomic_set(&xsdfec->uecc_count, 0);
> > +	atomic_set(&xsdfec->cecc_count, 0);
> 
> Atomics for counters?  Are you sure?  Don't we have some sort of sane
> counter api these days for stuff like this instead of abusing atomic
> variables?  What does the networking people use?  How often/fast do
> these change that you need to synchronize things?

Accepted.
No need to have them atomic. They are lock protected already.

> 
> > +
> > +	return 0;
> > +}
> > +
> > +static int xsdfec_get_stats(struct xsdfec_dev *xsdfec, void __user *arg)
> > +{
> > +	int err;
> > +	struct xsdfec_stats user_stats;
> > +
> > +	spin_lock_irqsave(&xsdfec->irq_lock, xsdfec->flags);
> > +	user_stats.isr_err_count = atomic_read(&xsdfec->isr_err_count);
> > +	user_stats.cecc_count = atomic_read(&xsdfec->cecc_count);
> > +	user_stats.uecc_count = atomic_read(&xsdfec->uecc_count);
> > +	xsdfec->stats_updated = false;
> > +	spin_unlock_irqrestore(&xsdfec->irq_lock, xsdfec->flags);
> 
> Wait, you just grabbed a lock, and then read atomic variables, why?  Why
> do these need to be atomic variables if you are already locking around
> them?  Unless you want to be "extra sure" they are safe?  :)

Accepted.
Absolutely no need for atomic variables.
 
> 
> Please fix up.
> 
> thanks,
> 
> greg k-h

  reply	other threads:[~2019-06-06 18:27 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-25 11:37 [PATCH V4 00/12] misc: xilinx sd-fec drive Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 01/12] dt-bindings: xilinx-sdfec: Add SDFEC binding Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 02/12] misc: xilinx-sdfec: add core driver Dragan Cvetic
2019-06-06 13:25   ` Greg KH
2019-06-06 18:16     ` Dragan Cvetic
2019-06-06 19:04       ` Greg KH
2019-05-25 11:37 ` [PATCH V4 03/12] misc: xilinx_sdfec: Add CCF support Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 04/12] misc: xilinx_sdfec: Add open, close and ioctl Dragan Cvetic
2019-06-06 13:26   ` Greg KH
2019-06-06 18:18     ` Dragan Cvetic
2019-06-06 13:28   ` Greg KH
2019-06-06 18:22     ` Dragan Cvetic
2019-06-07 10:58     ` Dragan Cvetic
2019-06-07 15:57       ` Greg KH
2019-06-08 19:40         ` Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 05/12] misc: xilinx_sdfec: Store driver config and state Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 06/12] misc: xilinx_sdfec: Add ability to configure turbo Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 07/12] misc: xilinx_sdfec: Add ability to configure LDPC Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 08/12] misc: xilinx_sdfec: Add ability to get/set config Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 09/12] misc: xilinx_sdfec: Support poll file operation Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 10/12] misc: xilinx_sdfec: Add stats & status ioctls Dragan Cvetic
2019-06-06 14:11   ` Greg KH
2019-06-06 18:27     ` Dragan Cvetic [this message]
2019-05-25 11:37 ` [PATCH V4 11/12] Docs: misc: xilinx_sdfec: Add documentation Dragan Cvetic
2019-05-25 11:37 ` [PATCH V4 12/12] MAINTAINERS: add maintainer for SD-FEC Dragan Cvetic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CH2PR02MB635905A42F3F667E81D30E27CB170@CH2PR02MB6359.namprd02.prod.outlook.com \
    --to=draganc@xilinx.com \
    --cc=arnd@arndb.de \
    --cc=devicetree@vger.kernel.org \
    --cc=dkiernan@xilinx.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=michals@xilinx.com \
    --cc=robh+dt@kernel.org \
    --subject='RE: [PATCH V4 10/12] misc: xilinx_sdfec: Add stats & status ioctls' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).