All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Marc Pignat <marc.pignat@hevs.ch>
Cc: Kumar Gala <galak@kernel.crashing.org>,
	David Brownell <dbrownell@users.sourceforge.net>,
	Pierre Ossman <drzeus-mmc@drzeus.cx>,
	Jochen Friedrich <jochen@scram.de>,
	Timur Tabi <timur@freescale.com>,
	linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
	spi-devel-general@lists.sourceforge.net
Subject: [PATCH] mmc: toughen get_ro() and get_cd() return values
Date: Thu, 5 Jun 2008 21:10:13 +0400	[thread overview]
Message-ID: <20080605171013.GA10513@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <200806051759.00202.marc.pignat@hevs.ch>

For the sake of safety, document that drivers should return only
1 or 0 from the get_ro() and get_cd() callbacks. Also document context
in which these callbacks should be executed.

wbsd driver modified to comply with this requirement.

Also, fix mmc_spi driver to not return raw values from the platform
get_cd hook (oops).

Suggested-by: Marc Pignat <marc.pignat@hevs.ch>
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---

On Thu, Jun 05, 2008 at 05:58:59PM +0200, Marc Pignat wrote:
[...]
> > >  * get_ro will return:
> > >  *   0 for a read/write card
> > >  *   1 for a read-only card 
> > 
> > This isn't always practical. For example, host is using u8 register for
> > the status, so it might safely return u8 & mask, that will always fit
> > into int. Or very smart/adventurous authors might be aware that, for the
> > particular host, mask's bit isn't last, and safely do uXX & mask. :-)
> > 
> > The above is weak argument of course, since it is about optimization.
> 
> Ack, we will gain at most 1-4 assembly instructions, in a function that
> is unlikely to be called more than once a second.
> 
> > 
> > As an counter-evidence, the strict scheme that you described probably
> > less error prone. But is it? To implement it we'll need something like
> > WARN_ON(ret > 0 && ret != 1) to catch erroneous users. Take a closer
> > look though, will it catch uXX & lastbit case? Nope. :-)
> 
> WARN_ON(ret > 0 && ret != 1 || ret == INT_MIN) will do ;)
> 
> I agree with you once more, I never thinked about a runtime check.
> 
> I don't really want to see a WARN_ON(foo) after each call to get_ro or get_cd.
> 
> But I'm sure if we specify "give me a positive value when a card is detected",
> someone will write gpio & bit, and three years later, someone will fall in
> the (gpio & lastbit < 0 case).
> 
> So we should specify: "give me 1 whan a card is present, 0 when not, -ENOSYS if
> you don't know and a negative errno when something else goes wrong".

Well, ok.

Pierre, I see you didn't yet pushed out the mmc tree, so.. would you
prefer this patch folded into 0/3 series and resent?

 drivers/mmc/host/mmc_spi.c |    2 +-
 drivers/mmc/host/wbsd.c    |    2 +-
 include/linux/mmc/host.h   |   16 ++++++++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 85d9853..4e82f64 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -1139,7 +1139,7 @@ static int mmc_spi_get_cd(struct mmc_host *mmc)
 	struct mmc_spi_host *host = mmc_priv(mmc);
 
 	if (host->pdata && host->pdata->get_cd)
-		return host->pdata->get_cd(mmc->parent);
+		return !!host->pdata->get_cd(mmc->parent);
 	return -ENOSYS;
 }
 
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c
index be624a0..9283b85 100644
--- a/drivers/mmc/host/wbsd.c
+++ b/drivers/mmc/host/wbsd.c
@@ -939,7 +939,7 @@ static int wbsd_get_ro(struct mmc_host *mmc)
 
 	spin_unlock_bh(&host->lock);
 
-	return csr & WBSD_WRPT;
+	return !!(csr & WBSD_WRPT);
 }
 
 static const struct mmc_host_ops wbsd_ops = {
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index ef3b773..753b723 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -56,8 +56,20 @@ struct mmc_host_ops {
 	 * since underlaying controller might implement them in an expensive
 	 * and/or slow way.
 	 *
-	 * .get_ro and .get_cd should return >= 0 for their logical values,
-	 * or negative errno value in case of error.
+	 * Also note that these functions might sleep, so don't call them
+	 * in the atomic contexts!
+	 *
+	 * Return values for the get_ro callback should be:
+	 *   0 for a read/write card
+	 *   1 for a read-only card
+	 *   -ENOSYS when not supported (equal to NULL callback)
+	 *   or a negative errno value when something bad happened
+	 *
+	 * Return values for the get_ro callback should be:
+	 *   0 for a absent card
+	 *   1 for a present card
+	 *   -ENOSYS when not supported (equal to NULL callback)
+	 *   or a negative errno value when something bad happened
 	 */
 	void	(*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
 	int	(*get_ro)(struct mmc_host *host);
-- 
1.5.5.1

WARNING: multiple messages have this Message-ID (diff)
From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Marc Pignat <marc.pignat@hevs.ch>
Cc: David Brownell <dbrownell@users.sourceforge.net>,
	linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org,
	spi-devel-general@lists.sourceforge.net,
	Timur Tabi <timur@freescale.com>,
	Pierre Ossman <drzeus-mmc@drzeus.cx>
Subject: [PATCH] mmc: toughen get_ro() and get_cd() return values
Date: Thu, 5 Jun 2008 21:10:13 +0400	[thread overview]
Message-ID: <20080605171013.GA10513@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <200806051759.00202.marc.pignat@hevs.ch>

For the sake of safety, document that drivers should return only
1 or 0 from the get_ro() and get_cd() callbacks. Also document context
in which these callbacks should be executed.

wbsd driver modified to comply with this requirement.

Also, fix mmc_spi driver to not return raw values from the platform
get_cd hook (oops).

Suggested-by: Marc Pignat <marc.pignat@hevs.ch>
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---

On Thu, Jun 05, 2008 at 05:58:59PM +0200, Marc Pignat wrote:
[...]
> > >  * get_ro will return:
> > >  *   0 for a read/write card
> > >  *   1 for a read-only card 
> > 
> > This isn't always practical. For example, host is using u8 register for
> > the status, so it might safely return u8 & mask, that will always fit
> > into int. Or very smart/adventurous authors might be aware that, for the
> > particular host, mask's bit isn't last, and safely do uXX & mask. :-)
> > 
> > The above is weak argument of course, since it is about optimization.
> 
> Ack, we will gain at most 1-4 assembly instructions, in a function that
> is unlikely to be called more than once a second.
> 
> > 
> > As an counter-evidence, the strict scheme that you described probably
> > less error prone. But is it? To implement it we'll need something like
> > WARN_ON(ret > 0 && ret != 1) to catch erroneous users. Take a closer
> > look though, will it catch uXX & lastbit case? Nope. :-)
> 
> WARN_ON(ret > 0 && ret != 1 || ret == INT_MIN) will do ;)
> 
> I agree with you once more, I never thinked about a runtime check.
> 
> I don't really want to see a WARN_ON(foo) after each call to get_ro or get_cd.
> 
> But I'm sure if we specify "give me a positive value when a card is detected",
> someone will write gpio & bit, and three years later, someone will fall in
> the (gpio & lastbit < 0 case).
> 
> So we should specify: "give me 1 whan a card is present, 0 when not, -ENOSYS if
> you don't know and a negative errno when something else goes wrong".

Well, ok.

Pierre, I see you didn't yet pushed out the mmc tree, so.. would you
prefer this patch folded into 0/3 series and resent?

 drivers/mmc/host/mmc_spi.c |    2 +-
 drivers/mmc/host/wbsd.c    |    2 +-
 include/linux/mmc/host.h   |   16 ++++++++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 85d9853..4e82f64 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -1139,7 +1139,7 @@ static int mmc_spi_get_cd(struct mmc_host *mmc)
 	struct mmc_spi_host *host = mmc_priv(mmc);
 
 	if (host->pdata && host->pdata->get_cd)
-		return host->pdata->get_cd(mmc->parent);
+		return !!host->pdata->get_cd(mmc->parent);
 	return -ENOSYS;
 }
 
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c
index be624a0..9283b85 100644
--- a/drivers/mmc/host/wbsd.c
+++ b/drivers/mmc/host/wbsd.c
@@ -939,7 +939,7 @@ static int wbsd_get_ro(struct mmc_host *mmc)
 
 	spin_unlock_bh(&host->lock);
 
-	return csr & WBSD_WRPT;
+	return !!(csr & WBSD_WRPT);
 }
 
 static const struct mmc_host_ops wbsd_ops = {
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index ef3b773..753b723 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -56,8 +56,20 @@ struct mmc_host_ops {
 	 * since underlaying controller might implement them in an expensive
 	 * and/or slow way.
 	 *
-	 * .get_ro and .get_cd should return >= 0 for their logical values,
-	 * or negative errno value in case of error.
+	 * Also note that these functions might sleep, so don't call them
+	 * in the atomic contexts!
+	 *
+	 * Return values for the get_ro callback should be:
+	 *   0 for a read/write card
+	 *   1 for a read-only card
+	 *   -ENOSYS when not supported (equal to NULL callback)
+	 *   or a negative errno value when something bad happened
+	 *
+	 * Return values for the get_ro callback should be:
+	 *   0 for a absent card
+	 *   1 for a present card
+	 *   -ENOSYS when not supported (equal to NULL callback)
+	 *   or a negative errno value when something bad happened
 	 */
 	void	(*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
 	int	(*get_ro)(struct mmc_host *host);
-- 
1.5.5.1

  reply	other threads:[~2008-06-05 17:10 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-16 16:50 [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Anton Vorontsov
2008-05-16 16:50 ` Anton Vorontsov
     [not found] ` <20080516165057.GC24196-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-17 11:36   ` Pierre Ossman
2008-05-17 11:36     ` Pierre Ossman
2008-05-17 11:36     ` Pierre Ossman
     [not found]     ` <20080517133633.5aa26938-OhHrUh4vRMSnewYJFaQfwJ5kstrrjoWp@public.gmane.org>
2008-05-21 18:47       ` Anton Vorontsov
2008-05-21 18:47         ` Anton Vorontsov
2008-05-21 18:47         ` Anton Vorontsov
     [not found]         ` <20080521184713.GA30284-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-21 18:47           ` [PATCH 1/2] mmc: add support for card-detection polling Anton Vorontsov
2008-05-21 18:47             ` Anton Vorontsov
2008-05-21 18:47             ` Anton Vorontsov
2008-05-21 18:47           ` [PATCH 2/2] mmc_spi: " Anton Vorontsov
2008-05-21 18:47             ` Anton Vorontsov
2008-05-21 18:47             ` Anton Vorontsov
2008-05-21 19:28           ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-21 19:28             ` Pierre Ossman
2008-05-22 18:17             ` Anton Vorontsov
2008-05-22 18:17               ` Anton Vorontsov
     [not found]               ` <20080522181713.GA26918-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 18:18                 ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-22 18:18                   ` Anton Vorontsov
2008-05-22 18:18                   ` Anton Vorontsov
2008-05-22 18:18                 ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-22 18:18                   ` Anton Vorontsov
2008-05-22 18:18                   ` Anton Vorontsov
2008-05-22 19:34                 ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detect line Pierre Ossman
2008-05-22 19:34                   ` Pierre Ossman
2008-05-23 15:42                   ` Anton Vorontsov
2008-05-23 15:42                     ` Anton Vorontsov
2008-05-23 15:43                     ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-05-23 15:43                       ` Anton Vorontsov
     [not found]                       ` <20080523154340.GA24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-01 10:23                         ` Pierre Ossman
2008-06-01 10:23                           ` Pierre Ossman
     [not found]                     ` <20080523154204.GA19803-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-23 15:43                       ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-05-23 15:43                         ` Anton Vorontsov
2008-05-23 15:43                         ` Anton Vorontsov
2008-05-23 15:43                       ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-23 15:43                         ` Anton Vorontsov
2008-05-23 15:43                         ` Anton Vorontsov
     [not found]                         ` <20080523154347.GC24862-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-03 10:07                           ` Marc Pignat
2008-06-03 10:07                             ` Marc Pignat
2008-06-03 10:07                             ` Marc Pignat
2008-06-05 14:43                             ` Anton Vorontsov
2008-06-05 14:43                               ` Anton Vorontsov
     [not found]                               ` <20080605144310.GA31596-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-05 15:58                                 ` Marc Pignat
2008-06-05 15:58                                   ` Marc Pignat
2008-06-05 15:58                                   ` Marc Pignat
2008-06-05 17:10                                   ` Anton Vorontsov [this message]
2008-06-05 17:10                                     ` [PATCH] mmc: toughen get_ro() and get_cd() return values Anton Vorontsov
     [not found]                                     ` <20080605171013.GA10513-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-06-14 14:36                                       ` Pierre Ossman
2008-06-14 14:36                                         ` Pierre Ossman
2008-06-17 14:16                                         ` Anton Vorontsov
2008-06-17 14:17                                           ` [PATCH 1/3] mmc: add support for card-detection polling Anton Vorontsov
2008-06-17 14:17                                           ` [PATCH 2/3] mmc_spi: " Anton Vorontsov
2008-06-17 14:17                                           ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-06-20 15:40                                           ` [PATCH] mmc: toughen get_ro() and get_cd() return values Pierre Ossman
2008-05-22 18:18               ` [PATCH 3/3] mmc: change .get_ro() callback semantics Anton Vorontsov
2008-05-22 18:18                 ` Anton Vorontsov
2008-05-19  3:02   ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the card detectline Chen Gong
2008-05-19  3:02     ` Chen Gong
2008-05-19  3:02     ` Chen Gong
     [not found]     ` <58A20A281BAF1047B4EAE68DE5C0BDC2F16E6A-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-22 12:38       ` Anton Vorontsov
2008-05-22 12:38         ` Anton Vorontsov
2008-05-22 12:38         ` Anton Vorontsov
     [not found]         ` <20080522123838.GA27149-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-22 13:44           ` [PATCH 3/4] [MMC] mmc_spi: add polling support for the carddetectline Chen Gong
2008-05-22 13:44             ` Chen Gong
2008-05-22 13:44             ` Chen Gong
     [not found]             ` <58A20A281BAF1047B4EAE68DE5C0BDC2F176EF-bKEhWGtIRULiD3AT8lUqWFjVikpgYyvb5NbjCUgZEJk@public.gmane.org>
2008-05-26 15:37               ` Anton Vorontsov
2008-05-26 15:37                 ` Anton Vorontsov
2008-05-26 15:37                 ` Anton Vorontsov
     [not found]                 ` <20080526153747.GA31663-PHTr8nzUCjejyJ0x5qLZdcN33GVbZNy3@public.gmane.org>
2008-05-27  2:11                   ` [PATCH 3/4] [MMC] mmc_spi: add polling support for thecarddetectline Chen Gong
2008-05-27  2:11                     ` Chen Gong
2008-05-27  2:11                     ` Chen Gong

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=20080605171013.GA10513@polina.dev.rtsoft.ru \
    --to=avorontsov@ru.mvista.com \
    --cc=dbrownell@users.sourceforge.net \
    --cc=drzeus-mmc@drzeus.cx \
    --cc=galak@kernel.crashing.org \
    --cc=jochen@scram.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=marc.pignat@hevs.ch \
    --cc=spi-devel-general@lists.sourceforge.net \
    --cc=timur@freescale.com \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.