Skip to content

Commit

Permalink
mmc: remove old card states
Browse files Browse the repository at this point in the history
Remove card states that no longer make any sense.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
  • Loading branch information
Pierre Ossman committed May 1, 2007
1 parent 6abaa0c commit bd76631
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 28 deletions.
22 changes: 14 additions & 8 deletions drivers/mmc/core/mmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ static const unsigned int tacc_mant[] = {
/*
* Given the decoded CSD structure, decode the raw CID to our CID structure.
*/
static void mmc_decode_cid(struct mmc_card *card)
static int mmc_decode_cid(struct mmc_card *card)
{
u32 *resp = card->raw_cid;

Expand Down Expand Up @@ -101,15 +101,16 @@ static void mmc_decode_cid(struct mmc_card *card)
default:
printk("%s: card has unknown MMCA version %d\n",
mmc_hostname(card->host), card->csd.mmca_vsn);
mmc_card_set_bad(card);
break;
return -EINVAL;
}

return 0;
}

/*
* Given a 128-bit response, decode to our card CSD structure.
*/
static void mmc_decode_csd(struct mmc_card *card)
static int mmc_decode_csd(struct mmc_card *card)
{
struct mmc_csd *csd = &card->csd;
unsigned int e, m, csd_struct;
Expand All @@ -123,8 +124,7 @@ static void mmc_decode_csd(struct mmc_card *card)
if (csd_struct != 1 && csd_struct != 2) {
printk("%s: unrecognised CSD structure version %d\n",
mmc_hostname(card->host), csd_struct);
mmc_card_set_bad(card);
return;
return -EINVAL;
}

csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4);
Expand All @@ -149,6 +149,8 @@ static void mmc_decode_csd(struct mmc_card *card)
csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3);
csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4);
csd->write_partial = UNSTUFF_BITS(resp, 21, 1);

return 0;
}

/*
Expand Down Expand Up @@ -300,8 +302,12 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
if (err != MMC_ERR_NONE)
goto free_card;

mmc_decode_csd(card);
mmc_decode_cid(card);
err = mmc_decode_csd(card);
if (err < 0)
goto free_card;
err = mmc_decode_cid(card);
if (err < 0)
goto free_card;
}

/*
Expand Down
23 changes: 15 additions & 8 deletions drivers/mmc/core/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ static void mmc_decode_cid(struct mmc_card *card)
/*
* Given a 128-bit response, decode to our card CSD structure.
*/
static void mmc_decode_csd(struct mmc_card *card)
static int mmc_decode_csd(struct mmc_card *card)
{
struct mmc_csd *csd = &card->csd;
unsigned int e, m, csd_struct;
Expand Down Expand Up @@ -151,15 +151,16 @@ static void mmc_decode_csd(struct mmc_card *card)
default:
printk("%s: unrecognised CSD structure version %d\n",
mmc_hostname(card->host), csd_struct);
mmc_card_set_bad(card);
return;
return -EINVAL;
}

return 0;
}

/*
* Given a 64-bit response, decode to our card SCR structure.
*/
static void mmc_decode_scr(struct mmc_card *card)
static int mmc_decode_scr(struct mmc_card *card)
{
struct sd_scr *scr = &card->scr;
unsigned int scr_struct;
Expand All @@ -174,12 +175,13 @@ static void mmc_decode_scr(struct mmc_card *card)
if (scr_struct != 0) {
printk("%s: unrecognised SCR structure version %d\n",
mmc_hostname(card->host), scr_struct);
mmc_card_set_bad(card);
return;
return -EINVAL;
}

scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4);
scr->bus_widths = UNSTUFF_BITS(resp, 48, 4);

return 0;
}

/*
Expand Down Expand Up @@ -342,7 +344,10 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
if (err != MMC_ERR_NONE)
goto free_card;

mmc_decode_csd(card);
err = mmc_decode_csd(card);
if (err < 0)
goto free_card;

mmc_decode_cid(card);
}

Expand All @@ -361,7 +366,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
if (err != MMC_ERR_NONE)
goto free_card;

mmc_decode_scr(card);
err = mmc_decode_scr(card);
if (err < 0)
goto free_card;

/*
* Fetch switch information from card.
Expand Down
5 changes: 2 additions & 3 deletions drivers/mmc/core/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,11 @@ static void mmc_release_card(struct device *dev)
/*
* This currently matches any MMC driver to any MMC card - drivers
* themselves make the decision whether to drive this card in their
* probe method. However, we force "bad" cards to fail.
* probe method.
*/
static int mmc_bus_match(struct device *dev, struct device_driver *drv)
{
struct mmc_card *card = dev_to_mmc_card(dev);
return !mmc_card_bad(card);
return 1;
}

static int
Expand Down
12 changes: 3 additions & 9 deletions include/linux/mmc/card.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,9 @@ struct mmc_card {
#define MMC_TYPE_SD 1 /* SD card */
unsigned int state; /* (our) card state */
#define MMC_STATE_PRESENT (1<<0) /* present in sysfs */
#define MMC_STATE_DEAD (1<<1) /* device no longer in stack */
#define MMC_STATE_BAD (1<<2) /* unrecognised device */
#define MMC_STATE_READONLY (1<<3) /* card is read-only */
#define MMC_STATE_HIGHSPEED (1<<4) /* card is in high speed mode */
#define MMC_STATE_BLOCKADDR (1<<5) /* card uses block-addressing */
#define MMC_STATE_READONLY (1<<1) /* card is read-only */
#define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */
#define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */
u32 raw_cid[4]; /* raw card CID */
u32 raw_csd[4]; /* raw card CSD */
u32 raw_scr[2]; /* raw card SCR */
Expand All @@ -88,15 +86,11 @@ struct mmc_card {
#define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD)

#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT)
#define mmc_card_dead(c) ((c)->state & MMC_STATE_DEAD)
#define mmc_card_bad(c) ((c)->state & MMC_STATE_BAD)
#define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY)
#define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED)
#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)

#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
#define mmc_card_set_dead(c) ((c)->state |= MMC_STATE_DEAD)
#define mmc_card_set_bad(c) ((c)->state |= MMC_STATE_BAD)
#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
Expand Down

0 comments on commit bd76631

Please sign in to comment.