From: Pierre Ossman <drzeus-mmc-p3sGCRWkH8CeZLLa646FqQ@public.gmane.org>
To: David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
Cc: Hans-Peter Nilsson
<hans-peter.nilsson-VrBV9hrLPhE@public.gmane.org>,
Mikael Starvik <mikael.starvik-VrBV9hrLPhE@public.gmane.org>,
Mike Lavender
<mike-UTnDXsALFwNjMdQLN6DIHgC/G2K4zDHf@public.gmane.org>,
spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [patch 2.6.22-git5 4/4] mmc_spi host driver
Date: Thu, 26 Jul 2007 20:02:02 +0200 [thread overview]
Message-ID: <20070726200202.5e5dcf62@poseidon.drzeus.cx> (raw)
In-Reply-To: <200707141508.07555.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
On Sat, 14 Jul 2007 15:08:06 -0700
David Brownell <david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org> wrote:
> --- g26.orig/drivers/mmc/host/Kconfig 2007-07-14 14:47:11.000000000 -0700
> +++ g26/drivers/mmc/host/Kconfig 2007-07-14 14:47:57.000000000 -0700
> @@ -100,3 +100,16 @@ config MMC_TIFM_SD
> To compile this driver as a module, choose M here: the
> module will be called tifm_sd.
>
> +config MMC_SPI
> + tristate "MMC/SD over SPI"
> + depends on MMC && SPI_MASTER && !HIGHMEM && EXPERIMENTAL
> + select CRC7
> + select CRC_ITU_T
> + help
> + Some systems accss MMC/SD cards using a SPI controller instead of
> + using a "native" MMC/SD controller. This has a disadvantage of
> + being relatively high overhead, but a compensating advantage of
> + working on many systems without dedicated MMC/SD controllers.
> +
> + If unsure, or if your system has no SPI master driver, say N.
> +
It is customary to have "(Experimental)" in the description aswell.
> +
> +static int
> +mmc_spi_readbytes(struct mmc_spi_host *host, unsigned len)
> +{
> + int status;
> +
> + if (len > sizeof *host->data) {
> + WARN_ON(1);
> + return -EIO;
> + }
sizeof without parenthesis? Heathen!
> +
> +/*
> + * Note that for SPI, cmd->resp[0] is not the same data as "native" protocol
> + * hosts return! The low byte holds R1_SPI bits. The next byte may hold
> + * R2_SPI bits ... for SEND_STATUS, or after data read errors.
> + *
> + * cmd->resp[1] holds any four-byte response, for R3 (READ_OCR) and on
> + * newer cards R7 (IF_COND).
> + */
> +
> +static char *maptype(struct mmc_command *cmd)
> +{
> + switch (mmc_spi_resp_type(cmd)) {
> + case MMC_RSP_SPI_R1: return "R1";
> + case MMC_RSP_SPI_R1B: return "R1B";
> + case MMC_RSP_SPI_R2: return "R2";
> + case MMC_RSP_SPI_R3: return "R3/R7";
> + default: return "?";
> + }
> +}
> +
I'm trying to move all generic debugging code into the core, so I would prefer if you would have a look at extending that to fit your needs. That way everyone wins.
> +
> + /* Status byte: the entire seven-bit R1 response. */
> + if (cmd->resp[0] != 0) {
> + if (R1_SPI_COM_CRC & cmd->resp[0]) {
> + cmd->error = MMC_ERR_BADCRC;
> + value = -EILSEQ;
> + } else if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS
> + | R1_SPI_ILLEGAL_COMMAND)
> + & cmd->resp[0]) {
> + cmd->error = MMC_ERR_INVALID;
> + value = -EINVAL;
> + } else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET)
> + & cmd->resp[0]) {
> + cmd->error = MMC_ERR_FAILED;
> + value = -EINVAL;
> + } /* else R1_SPI_IDLE, "it's resetting" */
> +
> + if (value < 0)
> + goto fail;
> + }
I'd still preferred that you'd didn't try to decode this here. And your code demostrates why; CRC error and illegal command both signal problems with the previous command, not the current one, so this code would be failing the wrong request.
> +
> + switch (mmc_spi_resp_type(cmd)) {
> +
> + /* SPI R1B == R1 + busy; STOP_TRANSMISSION (for multiblock reads)
> + * and less-common stuff like various erase operations.
> + */
> + case MMC_RSP_SPI_R1B:
for (i = 0;i < mmc_spi_resp_size(cmd);i++)
cmd->resp[i/4] |= *cp++ << (24 - (i % 4) * 8);
if (cmd->flags & MMC_SPI_RSP_BUSY)
mmc_spi_wait_unbusy();
That's the whole point of hacking up the response types into components, so that the host driver doesn't have to care.
You can keep your design if you'd like, but I really think this is cleaner and more layered.
> +
> + /* We can handle most commands (except block reads) in one full
> + * duplex I/O operation before either starting the next transfer
> + * (data block or command) or else deselecting the card.
> + *
> + * First, write 7 bytes:
> + * - an all-ones byte to ensure the card is ready
> + * - opcode byte (plus start and transmission bits)
> + * - four bytes of big-endian argument
> + * - crc7 (plus end bit) ... always computed, it's cheap
> + *
I thought your argument against always using crc7 was that it wasn't cheap? Colour me confused.
> + if (status == -EILSEQ)
> + data->error = MMC_ERR_BADCRC;
> + else if (status == -ETIMEDOUT)
> + data->error = MMC_ERR_TIMEOUT;
> + else if (status == -EINVAL)
> + data->error = MMC_ERR_INVALID;
> + else if (data->error == MMC_ERR_NONE)
> + data->error = MMC_ERR_FAILED;
> + break;
> + }
At least we agree on error codes. This is precisely the change I have pending in my patch set to remove the MMC_ERR_* mess. :)
There are a few outstanding issues, but they are really minor so this could very soon get into my -mm branch. I need a MAINTAINERS entry aswell.
I'd like to see those REVISIT things attended to before I push the stuff to Linus though.
Rgds
--
-- Pierre Ossman
Linux kernel, MMC maintainer http://www.kernel.org
PulseAudio, core developer http://pulseaudio.org
rdesktop, core developer http://www.rdesktop.org
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
next prev parent reply other threads:[~2007-07-26 18:02 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-14 22:04 [patch 2.6.22-git5 0/4] MMC-over-SPI David Brownell
[not found] ` <200707141504.51950.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-14 22:05 ` [patch 2.6.22-git5 1/4] MMC headers learn about SPI David Brownell
[not found] ` <200707141506.00262.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 16:31 ` Pierre Ossman
[not found] ` <20070726183150.024930aa-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 16:55 ` David Brownell
[not found] ` <200707260955.22967.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 18:05 ` Pierre Ossman
[not found] ` <20070726200525.6a5b7d72-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 20:08 ` David Brownell
2007-07-14 22:06 ` [patch 2.6.22-git5 2/4] MMC block learns " David Brownell
[not found] ` <200707141506.42880.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 16:33 ` Pierre Ossman
[not found] ` <20070726183339.6631243f-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 17:00 ` David Brownell
[not found] ` <200707261000.17339.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 18:06 ` Pierre Ossman
[not found] ` <20070726200639.06242858-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 20:15 ` David Brownell
2007-07-14 22:07 ` [patch 2.6.22-git5 3/4] MMC core " David Brownell
[not found] ` <200707141507.17484.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 17:18 ` Pierre Ossman
[not found] ` <20070726191824.569542fd-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 21:58 ` David Brownell
[not found] ` <200707261458.55558.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 22:22 ` David Brownell
2007-08-01 15:02 ` Pierre Ossman
[not found] ` <20070801170220.3c5ccff6-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-08-01 17:02 ` David Brownell
[not found] ` <200708011002.28801.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-08-02 12:54 ` Pierre Ossman
[not found] ` <20070802145445.1118d1e7-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-08-02 19:23 ` David Brownell
2007-07-14 22:08 ` [patch 2.6.22-git5 4/4] mmc_spi host driver David Brownell
[not found] ` <200707141508.07555.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-26 18:02 ` Pierre Ossman [this message]
[not found] ` <20070726200202.5e5dcf62-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-26 23:32 ` David Brownell
[not found] ` <200707261632.37011.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-08-01 15:12 ` Pierre Ossman
[not found] ` <20070801171217.1478267b-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-08-01 18:17 ` David Brownell
[not found] ` <200708011117.24664.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-08-02 13:06 ` Pierre Ossman
[not found] ` <20070802150615.36e073c6-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-08-02 20:34 ` David Brownell
[not found] ` <200708021334.50670.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-08-04 13:14 ` Pierre Ossman
[not found] ` <20070804151452.0efaa5a9-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-08-04 17:32 ` David Brownell
[not found] ` <200708041032.10001.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-08-04 21:32 ` Pierre Ossman
2007-08-07 12:35 ` Pierre Ossman
2007-08-01 18:40 ` David Brownell
2007-07-16 16:48 ` [patch 2.6.22-git5 0/4] MMC-over-SPI Anton Vorontsov
[not found] ` <20070716164837.GA18707-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-07-16 18:54 ` David Brownell
[not found] ` <200707161154.54728.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-17 15:13 ` Anton Vorontsov
[not found] ` <20070717151350.GA3752-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-07-17 16:11 ` David Brownell
[not found] ` <200707170911.16715.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-18 7:35 ` Jan Nikitenko
[not found] ` <469DC2BC.5070305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2007-07-18 17:06 ` David Brownell
2007-07-18 10:00 ` Anton Vorontsov
[not found] ` <20070718100047.GA9544-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-07-18 14:05 ` Anton Vorontsov
2007-07-18 14:44 ` Pierre Ossman
[not found] ` <20070718164409.56ca0019-mgABNEgzgxm+PRNnhPf8W5YgPPQkE1Si@public.gmane.org>
2007-07-18 17:27 ` David Brownell
[not found] ` <200707181027.17819.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-19 16:15 ` Anton Vorontsov
[not found] ` <20070719161553.GA15756-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-07-19 20:28 ` David Brownell
[not found] ` <200707191328.18846.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-23 14:29 ` Anton Vorontsov
[not found] ` <20070723142923.GA28979-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-07-23 17:33 ` David Brownell
[not found] ` <200707231033.31717.david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org>
2007-07-24 10:23 ` Anton Vorontsov
2007-08-07 3:21 ` David Brownell
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=20070726200202.5e5dcf62@poseidon.drzeus.cx \
--to=drzeus-mmc-p3sgcrwkh8cezlla646fqq@public.gmane.org \
--cc=david-b-yBeKhBN/0LDR7s880joybQ@public.gmane.org \
--cc=hans-peter.nilsson-VrBV9hrLPhE@public.gmane.org \
--cc=mikael.starvik-VrBV9hrLPhE@public.gmane.org \
--cc=mike-UTnDXsALFwNjMdQLN6DIHgC/G2K4zDHf@public.gmane.org \
--cc=spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
/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 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).