
Hi Reinhard,
On Mon, Sep 6, 2010 at 7:50 PM, Reinhard Meyer u-boot@emk-elektronik.de wrote:
Lei Wen schrieb:
Where does this limitation supposedly come from?
This limitation comes from the SD/MMC sepc. You could find one and check the 0x6 offset register(BLOCK COUNT REGISTER).
This might refer to certain HOST controllers, but not to Cards!
You are right, this comes from HOST, not card. But since the host spec define so, then is there any host don't follow the sepc? ...
Any that use bit banging, or SPI, and at least: ATMELs MCI. Probably any number of others that do not copy Intel/PC centered register structures...
If you had read my first mail on this, there was an example of a 98304 blocks transfer...
I know that maybe the mmc specific hardware may have no such limitation, but for our hardware it is sd&mmc cocompatible one, which should follow both spec and their limitation.
And you still do not explain why the buffer size shall be limited to 512KB?
The 512 KB comes from the SDMA boundary, and this value is also adopt by Linux. You could refer to drivers/mmc/host/sdhci.c in Linux code.
What hardware, again? sdhci.c? SDMA?
My hardware is pxa168, which has sdhci controller for control both mmc and sd.
You are trying to change a GENERIC function of U-Boot here to suit a particular hardware, not a particular hardware driver.
As such, changes should be generic/configurable and not suited to a specific hardware.
Although the common code is named as mmc.c, I think a lot of people use it to work for sd too, since they are compatible in most case.
I also try to put this limitation in the driver level, but no lucky, without the generic change, the driver cannot do nothing unless a mess change. For multi-write, it should first send multi-write command, then follow stop transmission command. If I implement the seperation in driver, I need to send the stop transmission command by self... Then the "generic" one would make no sense...
If a specific hardware needs the generic part to obey some limitations, those limitations should be configurable, like maybe:
#define CONFIG_SYS_MMC_BLOCKLIMIT 65535 #define CONFIG_SYS_MMC_BUFFERLIMIT (512<<10)
I am ok with set a macro for this.
Best regards, Lei