diff options
Diffstat (limited to 'drivers/mmc/core/mmc.c')
-rw-r--r-- | drivers/mmc/core/mmc.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index fe483d5af74..258fe73eeaa 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
@@ -176,14 +176,20 @@ static int mmc_read_ext_csd(struct mmc_card *card) | |||
176 | ext_csd = kmalloc(512, GFP_KERNEL); | 176 | ext_csd = kmalloc(512, GFP_KERNEL); |
177 | if (!ext_csd) { | 177 | if (!ext_csd) { |
178 | printk(KERN_ERR "%s: could not allocate a buffer to " | 178 | printk(KERN_ERR "%s: could not allocate a buffer to " |
179 | "receive the ext_csd. mmc v4 cards will be " | 179 | "receive the ext_csd.\n", mmc_hostname(card->host)); |
180 | "treated as v3.\n", mmc_hostname(card->host)); | ||
181 | return -ENOMEM; | 180 | return -ENOMEM; |
182 | } | 181 | } |
183 | 182 | ||
184 | err = mmc_send_ext_csd(card, ext_csd); | 183 | err = mmc_send_ext_csd(card, ext_csd); |
185 | if (err) { | 184 | if (err) { |
186 | /* | 185 | /* |
186 | * We all hosts that cannot perform the command | ||
187 | * to fail more gracefully | ||
188 | */ | ||
189 | if (err != -EINVAL) | ||
190 | goto out; | ||
191 | |||
192 | /* | ||
187 | * High capacity cards should have this "magic" size | 193 | * High capacity cards should have this "magic" size |
188 | * stored in their CSD. | 194 | * stored in their CSD. |
189 | */ | 195 | */ |
@@ -199,6 +205,7 @@ static int mmc_read_ext_csd(struct mmc_card *card) | |||
199 | mmc_hostname(card->host)); | 205 | mmc_hostname(card->host)); |
200 | err = 0; | 206 | err = 0; |
201 | } | 207 | } |
208 | |||
202 | goto out; | 209 | goto out; |
203 | } | 210 | } |
204 | 211 | ||
@@ -269,8 +276,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
269 | goto err; | 276 | goto err; |
270 | 277 | ||
271 | if (oldcard) { | 278 | if (oldcard) { |
272 | if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) | 279 | if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) { |
280 | err = -ENOENT; | ||
273 | goto err; | 281 | goto err; |
282 | } | ||
274 | 283 | ||
275 | card = oldcard; | 284 | card = oldcard; |
276 | } else { | 285 | } else { |
@@ -278,8 +287,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
278 | * Allocate card structure. | 287 | * Allocate card structure. |
279 | */ | 288 | */ |
280 | card = mmc_alloc_card(host); | 289 | card = mmc_alloc_card(host); |
281 | if (IS_ERR(card)) | 290 | if (IS_ERR(card)) { |
291 | err = PTR_ERR(card); | ||
282 | goto err; | 292 | goto err; |
293 | } | ||
283 | 294 | ||
284 | card->type = MMC_TYPE_MMC; | 295 | card->type = MMC_TYPE_MMC; |
285 | card->rca = 1; | 296 | card->rca = 1; |
@@ -304,10 +315,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
304 | goto free_card; | 315 | goto free_card; |
305 | 316 | ||
306 | err = mmc_decode_csd(card); | 317 | err = mmc_decode_csd(card); |
307 | if (err < 0) | 318 | if (err) |
308 | goto free_card; | 319 | goto free_card; |
309 | err = mmc_decode_cid(card); | 320 | err = mmc_decode_cid(card); |
310 | if (err < 0) | 321 | if (err) |
311 | goto free_card; | 322 | goto free_card; |
312 | } | 323 | } |
313 | 324 | ||
@@ -379,7 +390,7 @@ free_card: | |||
379 | mmc_remove_card(card); | 390 | mmc_remove_card(card); |
380 | err: | 391 | err: |
381 | 392 | ||
382 | return -EIO; | 393 | return err; |
383 | } | 394 | } |
384 | 395 | ||
385 | /* | 396 | /* |
@@ -587,6 +598,6 @@ err: | |||
587 | printk(KERN_ERR "%s: error %d whilst initialising MMC card\n", | 598 | printk(KERN_ERR "%s: error %d whilst initialising MMC card\n", |
588 | mmc_hostname(host), err); | 599 | mmc_hostname(host), err); |
589 | 600 | ||
590 | return 0; | 601 | return err; |
591 | } | 602 | } |
592 | 603 | ||