9
0
Fork 0

mci: add max_req_size support

Some controller such as the ARM AMBA pl181 can not handle more than 16bits
data length request.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2013-10-22 16:35:23 +02:00 committed by Sascha Hauer
parent cf9b0c6927
commit ed78b8dbbc
2 changed files with 31 additions and 8 deletions

View File

@ -1199,6 +1199,11 @@ static int __maybe_unused mci_sd_write(struct block_device *blk,
struct mci *mci = part->mci;
struct mci_host *host = mci->host;
int rc;
unsigned max_req_block = num_blocks;
int write_block;
if (mci->host->max_req_size)
max_req_block = mci->host->max_req_size / mci->write_bl_len;
mci_blk_part_switch(part);
@ -1222,10 +1227,16 @@ static int __maybe_unused mci_sd_write(struct block_device *blk,
return -EINVAL;
}
rc = mci_block_write(mci, buffer, block, num_blocks);
if (rc != 0) {
dev_dbg(&mci->dev, "Writing block %d failed with %d\n", block, rc);
return rc;
while (num_blocks) {
write_block = min_t(int, num_blocks, max_req_block);
rc = mci_block_write(mci, buffer, block, write_block);
if (rc != 0) {
dev_dbg(&mci->dev, "Writing block %d failed with %d\n", block, rc);
return rc;
}
num_blocks -= write_block;
block += write_block;
buffer += write_block * mci->write_bl_len;
}
return 0;
@ -1246,8 +1257,13 @@ static int mci_sd_read(struct block_device *blk, void *buffer, int block,
{
struct mci_part *part = container_of(blk, struct mci_part, blk);
struct mci *mci = part->mci;
unsigned max_req_block = num_blocks;
int read_block;
int rc;
if (mci->host->max_req_size)
max_req_block = mci->host->max_req_size / mci->read_bl_len;
mci_blk_part_switch(part);
dev_dbg(&mci->dev, "%s: Read %d block(s), starting at %d\n",
@ -1264,10 +1280,16 @@ static int mci_sd_read(struct block_device *blk, void *buffer, int block,
return -EINVAL;
}
rc = mci_read_block(mci, buffer, block, num_blocks);
if (rc != 0) {
dev_dbg(&mci->dev, "Reading block %d failed with %d\n", block, rc);
return rc;
while (num_blocks) {
read_block = min_t(int, num_blocks, max_req_block);
rc = mci_read_block(mci, buffer, block, read_block);
if (rc != 0) {
dev_dbg(&mci->dev, "Reading block %d failed with %d\n", block, rc);
return rc;
}
num_blocks -= read_block;
block += read_block;
buffer += read_block * mci->read_bl_len;
}
return 0;

View File

@ -293,6 +293,7 @@ struct mci_host {
unsigned f_max; /**< host interface upper limit */
unsigned clock; /**< Current clock used to talk to the card */
unsigned bus_width; /**< used data bus width to the card */
unsigned max_req_size;
/** init the host interface */
int (*init)(struct mci_host*, struct device_d*);