Hi Pierre,

Thanks for information.

My card does support 256 byte transfers in byte mode but I was expecting
block mode to be used as block mode is supported by the card. Indeed,
sdio_io_rw_ext_helper() checks for support of block mode before using
byte mode. eg. block mode is preferred over byte mode in the design of
sdio_io_rw_ext_helper().

Yes, I do think single block transfers is broken :(

Both sdio_io_rw_ext_helper() and mmc_io_rw_extended() are broken for
single block transfers.

Will you be doing a fix or how does a fix get proposed ?

Thanks,

Regards,
Dean.


On Thu, 2007-11-22 at 12:42 +0100, Pierre Ossman wrote: 
> On Thu, 22 Nov 2007 10:41:43 +0000
> Dean Jenkins <[EMAIL PROTECTED]> wrote:
> 
> > Hi Pierre,
> > 
> > I've been checking my SDIO CMD53 data transfers and I notice the
> > following:
> > 
> > block size = 256 bytes for my SDIO card.
> > 
> > transfers of 256 bytes uses byte mode ( I expected block mode )
> > transfers of 512 bytes uses block mode ( because blocks = 2 )
> > 
> > From the SD spec a single block transfer seems to be valid.
> > 
> 
> Both are valid, which is the source of the problem. The API was designed 
> under the assumption that hardware actually followed the register interface 
> and didn't distinguish between byte and block transfers. Unfortunately, it 
> seems to be quite common that they do. Your situation is a problematic corner 
> case.
> 
> > 
> > If it is a bug then I suggest the sdio_io_rw_ext_helper() in sdio_io.c
> > be able to select byte mode by setting blocks to 0 and then blocks can
> > be set to 1 to select block mode for a single block.
> > 
> 
> I'm afraid I don't follow. Do you want to add another parameter? Even if you 
> do, sdio_io_rw_ext_helper() is an internal API. Changing it won't make things 
> better for the function drivers.
> 
> > 
> > Technically, there is a bug in sdio_io_rw_ext_helper() in sdio_io.c
> > 
> > 211         while (remainder > func->cur_blksize) {
> > 
> > should be, = missing
> > 
> > 211         while (remainder >= func->cur_blksize) {
> > 
> 
> Unless some hardware is quirky in the opposite way and needs to be able to do 
> byte transfer of 256 bytes. Proper cards won't care either way, but as you 
> can see, we can't support both types of buggy cards.
> 
> > however the resulting call to mmc_io_rw_extended() is the same as blocks
> > = 1 for both the "block mode" while loop (with the "fix") and the "byte
> > mode" while loop (without the "fix"). The "byte mode" while loop has a
> > hard coded value of 1 for the blocks parameter. So the bug is masked. As
> > I said above, I think the "byte mode" should use a value of 0 for the
> > blocks parameter.
> > 
> 
> Ah. mmc_io_rw_extended() is indeed broken in that it can't do single block 
> requests. That should be fixed.
> 
> However, it still won't affect what your function driver can do as 
> mmc_io_rw_extended() is a bunch of layers down.
> 
> I guess I'll have to consider adding a more low-level API. The big problem 
> with such a call would be that it can fail requests because the host or card 
> cannot satisfy them. So a function driver using such an API would have to use 
> a much more defensive programming (which can incur a performance hit).
> 
> Rgds
-- 
Dean Jenkins
Embedded Software Engineer
MontaVista Software (UK)
Professional Services Division

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to