Commit 051913da authored by Ben Dooks's avatar Ben Dooks Committed by Pierre Ossman

mmc_block: do not DMA to stack

In the write recovery routine, the data to get from the card
is allocated from the stack. The DMA mapping documentation says
explicitly stack memory is not mappable by any of the DMA calls.

Change to using kmalloc() to allocate the memory for the result
from the card and then free it once we've finished with the
transaction.

[ Changed to GFP_KERNEL allocation - Pierre Ossman ]
Signed-off-by: default avatarBen Dooks <ben@simtec.co.uk>
Signed-off-by: default avatarPierre Ossman <pierre@ossman.eu>
parent be3f4ae0
...@@ -147,7 +147,8 @@ struct mmc_blk_request { ...@@ -147,7 +147,8 @@ struct mmc_blk_request {
static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
{ {
int err; int err;
__be32 blocks; u32 result;
__be32 *blocks;
struct mmc_request mrq; struct mmc_request mrq;
struct mmc_command cmd; struct mmc_command cmd;
...@@ -199,14 +200,21 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) ...@@ -199,14 +200,21 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
mrq.cmd = &cmd; mrq.cmd = &cmd;
mrq.data = &data; mrq.data = &data;
sg_init_one(&sg, &blocks, 4); blocks = kmalloc(4, GFP_KERNEL);
if (!blocks)
return (u32)-1;
sg_init_one(&sg, blocks, 4);
mmc_wait_for_req(card->host, &mrq); mmc_wait_for_req(card->host, &mrq);
result = ntohl(*blocks);
kfree(blocks);
if (cmd.error || data.error) if (cmd.error || data.error)
return (u32)-1; result = (u32)-1;
return ntohl(blocks); return result;
} }
static u32 get_card_status(struct mmc_card *card, struct request *req) static u32 get_card_status(struct mmc_card *card, struct request *req)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment