fe0bd1c23d589e0ff98be5775829b0376924fb2c
[openwrt/svn-archive/archive.git] / target / linux / generic-2.6 / patches-2.6.23 / 301-mmc_sdhci_fixes.patch
1 Index: linux-2.6.23.17/drivers/mmc/host/sdhci.c
2 ===================================================================
3 --- linux-2.6.23.17.orig/drivers/mmc/host/sdhci.c
4 +++ linux-2.6.23.17/drivers/mmc/host/sdhci.c
5 @@ -481,16 +481,16 @@ static void sdhci_finish_data(struct sdh
6 * Controller doesn't count down when in single block mode.
7 */
8 if (data->blocks == 1)
9 - blocks = (data->error == MMC_ERR_NONE) ? 0 : 1;
10 + blocks = (data->error == 0) ? 0 : 1;
11 else
12 blocks = readw(host->ioaddr + SDHCI_BLOCK_COUNT);
13 data->bytes_xfered = data->blksz * (data->blocks - blocks);
14
15 - if ((data->error == MMC_ERR_NONE) && blocks) {
16 + if (!data->error && blocks) {
17 printk(KERN_ERR "%s: Controller signalled completion even "
18 "though there were blocks left.\n",
19 mmc_hostname(host->mmc));
20 - data->error = MMC_ERR_FAILED;
21 + data->error = -EIO;
22 }
23
24 if (data->stop) {
25 @@ -498,7 +498,7 @@ static void sdhci_finish_data(struct sdh
26 * The controller needs a reset of internal state machines
27 * upon error conditions.
28 */
29 - if (data->error != MMC_ERR_NONE) {
30 + if (data->error) {
31 sdhci_reset(host, SDHCI_RESET_CMD);
32 sdhci_reset(host, SDHCI_RESET_DATA);
33 }
34 @@ -533,7 +533,7 @@ static void sdhci_send_command(struct sd
35 printk(KERN_ERR "%s: Controller never released "
36 "inhibit bit(s).\n", mmc_hostname(host->mmc));
37 sdhci_dumpregs(host);
38 - cmd->error = MMC_ERR_FAILED;
39 + cmd->error = -EIO;
40 tasklet_schedule(&host->finish_tasklet);
41 return;
42 }
43 @@ -554,7 +554,7 @@ static void sdhci_send_command(struct sd
44 if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
45 printk(KERN_ERR "%s: Unsupported response type!\n",
46 mmc_hostname(host->mmc));
47 - cmd->error = MMC_ERR_INVALID;
48 + cmd->error = -EINVAL;
49 tasklet_schedule(&host->finish_tasklet);
50 return;
51 }
52 @@ -601,7 +601,7 @@ static void sdhci_finish_command(struct
53 }
54 }
55
56 - host->cmd->error = MMC_ERR_NONE;
57 + host->cmd->error = 0;
58
59 if (host->data && host->data_early)
60 sdhci_finish_data(host);
61 @@ -722,7 +722,7 @@ static void sdhci_request(struct mmc_hos
62 host->mrq = mrq;
63
64 if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
65 - host->mrq->cmd->error = MMC_ERR_TIMEOUT;
66 + host->mrq->cmd->error = -ENOMEDIUM;
67 tasklet_schedule(&host->finish_tasklet);
68 } else
69 sdhci_send_command(host, mrq->cmd);
70 @@ -831,7 +831,7 @@ static void sdhci_tasklet_card(unsigned
71 sdhci_reset(host, SDHCI_RESET_CMD);
72 sdhci_reset(host, SDHCI_RESET_DATA);
73
74 - host->mrq->cmd->error = MMC_ERR_FAILED;
75 + host->mrq->cmd->error = -ENOMEDIUM;
76 tasklet_schedule(&host->finish_tasklet);
77 }
78 }
79 @@ -859,9 +859,9 @@ static void sdhci_tasklet_finish(unsigne
80 * The controller needs a reset of internal state machines
81 * upon error conditions.
82 */
83 - if ((mrq->cmd->error != MMC_ERR_NONE) ||
84 - (mrq->data && ((mrq->data->error != MMC_ERR_NONE) ||
85 - (mrq->data->stop && (mrq->data->stop->error != MMC_ERR_NONE))))) {
86 + if (mrq->cmd->error ||
87 + (mrq->data && (mrq->data->error ||
88 + (mrq->data->stop && mrq->data->stop->error)))) {
89
90 /* Some controllers need this kick or reset won't work here */
91 if (host->chip->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) {
92 @@ -906,13 +906,13 @@ static void sdhci_timeout_timer(unsigned
93 sdhci_dumpregs(host);
94
95 if (host->data) {
96 - host->data->error = MMC_ERR_TIMEOUT;
97 + host->data->error = -ETIMEDOUT;
98 sdhci_finish_data(host);
99 } else {
100 if (host->cmd)
101 - host->cmd->error = MMC_ERR_TIMEOUT;
102 + host->cmd->error = -ETIMEDOUT;
103 else
104 - host->mrq->cmd->error = MMC_ERR_TIMEOUT;
105 + host->mrq->cmd->error = -ETIMEDOUT;
106
107 tasklet_schedule(&host->finish_tasklet);
108 }
109 @@ -941,13 +941,12 @@ static void sdhci_cmd_irq(struct sdhci_h
110 }
111
112 if (intmask & SDHCI_INT_TIMEOUT)
113 - host->cmd->error = MMC_ERR_TIMEOUT;
114 - else if (intmask & SDHCI_INT_CRC)
115 - host->cmd->error = MMC_ERR_BADCRC;
116 - else if (intmask & (SDHCI_INT_END_BIT | SDHCI_INT_INDEX))
117 - host->cmd->error = MMC_ERR_FAILED;
118 + host->cmd->error = -ETIMEDOUT;
119 + else if (intmask & (SDHCI_INT_CRC | SDHCI_INT_END_BIT |
120 + SDHCI_INT_INDEX))
121 + host->cmd->error = -EILSEQ;
122
123 - if (host->cmd->error != MMC_ERR_NONE)
124 + if (host->cmd->error)
125 tasklet_schedule(&host->finish_tasklet);
126 else if (intmask & SDHCI_INT_RESPONSE)
127 sdhci_finish_command(host);
128 @@ -974,13 +973,11 @@ static void sdhci_data_irq(struct sdhci_
129 }
130
131 if (intmask & SDHCI_INT_DATA_TIMEOUT)
132 - host->data->error = MMC_ERR_TIMEOUT;
133 - else if (intmask & SDHCI_INT_DATA_CRC)
134 - host->data->error = MMC_ERR_BADCRC;
135 - else if (intmask & SDHCI_INT_DATA_END_BIT)
136 - host->data->error = MMC_ERR_FAILED;
137 + host->data->error = -ETIMEDOUT;
138 + else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT))
139 + host->data->error = -EILSEQ;
140
141 - if (host->data->error != MMC_ERR_NONE)
142 + if (host->data->error)
143 sdhci_finish_data(host);
144 else {
145 if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
146 @@ -1312,7 +1309,7 @@ static int __devinit sdhci_probe_slot(st
147 mmc->ops = &sdhci_ops;
148 mmc->f_min = host->max_clk / 256;
149 mmc->f_max = host->max_clk;
150 - mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE | MMC_CAP_BYTEBLOCK;
151 + mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE;
152
153 if (caps & SDHCI_CAN_DO_HISPD)
154 mmc->caps |= MMC_CAP_SD_HIGHSPEED;