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/