From 401e1486b7e6fd739ac3cf2f7326bfbcd515ff29 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Sun, 2 Jul 2006 16:52:10 +0100 Subject: [PATCH] --- yaml --- r: 31655 b: refs/heads/master c: 1d676e02970d9e511c9b96101501da90954ee265 h: refs/heads/master i: 31653: d4d0374ae999dec0716a470f96f2194f97503804 31651: b89bed4fda9b35d39bb99f6a024fdc7e4fd5f607 31647: 1d012a245f0f60688e5b22fc84756e090fdc59e7 v: v3 --- [refs] | 2 +- trunk/drivers/mmc/sdhci.c | 11 +++++++++++ trunk/drivers/mmc/sdhci.h | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 85e23d9654c0..76a7081fb065 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bab7696184bbf0ea48d56902bd1f9ac983079ad2 +refs/heads/master: 1d676e02970d9e511c9b96101501da90954ee265 diff --git a/trunk/drivers/mmc/sdhci.c b/trunk/drivers/mmc/sdhci.c index 95fe0fdac484..302dd5bde751 100644 --- a/trunk/drivers/mmc/sdhci.c +++ b/trunk/drivers/mmc/sdhci.c @@ -328,6 +328,8 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data) /* Sanity checks */ BUG_ON(data->blksz * data->blocks > 524288); + BUG_ON(data->blksz > host->max_block); + BUG_ON(data->blocks > 65535); /* timeout in us */ target_timeout = data->timeout_ns / 1000 + @@ -1158,6 +1160,15 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) if (caps & SDHCI_TIMEOUT_CLK_UNIT) host->timeout_clk *= 1000; + host->max_block = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT; + if (host->max_block >= 3) { + printk(KERN_ERR "%s: Invalid maximum block size.\n", + host->slot_descr); + ret = -ENODEV; + goto unmap; + } + host->max_block = 512 << host->max_block; + /* * Set host parameters. */ diff --git a/trunk/drivers/mmc/sdhci.h b/trunk/drivers/mmc/sdhci.h index 8ed2a8973db6..b1aa3acf0906 100644 --- a/trunk/drivers/mmc/sdhci.h +++ b/trunk/drivers/mmc/sdhci.h @@ -131,6 +131,8 @@ #define SDHCI_TIMEOUT_CLK_UNIT 0x00000080 #define SDHCI_CLOCK_BASE_MASK 0x00003F00 #define SDHCI_CLOCK_BASE_SHIFT 8 +#define SDHCI_MAX_BLOCK_MASK 0x00030000 +#define SDHCI_MAX_BLOCK_SHIFT 16 #define SDHCI_CAN_DO_DMA 0x00400000 #define SDHCI_CAN_VDD_330 0x01000000 #define SDHCI_CAN_VDD_300 0x02000000 @@ -161,6 +163,7 @@ struct sdhci_host { unsigned int max_clk; /* Max possible freq (MHz) */ unsigned int timeout_clk; /* Timeout freq (KHz) */ + unsigned int max_block; /* Max block size (bytes) */ unsigned int clock; /* Current clock (MHz) */ unsigned short power; /* Current voltage */