forked from luck/tmp_suning_uos_patched
wbsd: remove block crc test
Block completion interrupts occur faster than we can process them, so just ignore them competely. Commit also fixes up some incorrect register defines. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
parent
976d9276c8
commit
5721dbf217
|
@ -178,9 +178,8 @@ static void wbsd_init_device(struct wbsd_host *host)
|
||||||
ier = 0;
|
ier = 0;
|
||||||
ier |= WBSD_EINT_CARD;
|
ier |= WBSD_EINT_CARD;
|
||||||
ier |= WBSD_EINT_FIFO_THRE;
|
ier |= WBSD_EINT_FIFO_THRE;
|
||||||
ier |= WBSD_EINT_CCRC;
|
|
||||||
ier |= WBSD_EINT_TIMEOUT;
|
|
||||||
ier |= WBSD_EINT_CRC;
|
ier |= WBSD_EINT_CRC;
|
||||||
|
ier |= WBSD_EINT_TIMEOUT;
|
||||||
ier |= WBSD_EINT_TC;
|
ier |= WBSD_EINT_TC;
|
||||||
|
|
||||||
outb(ier, host->base + WBSD_EIR);
|
outb(ier, host->base + WBSD_EIR);
|
||||||
|
@ -1166,30 +1165,6 @@ static void wbsd_tasklet_finish(unsigned long param)
|
||||||
spin_unlock(&host->lock);
|
spin_unlock(&host->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wbsd_tasklet_block(unsigned long param)
|
|
||||||
{
|
|
||||||
struct wbsd_host *host = (struct wbsd_host *)param;
|
|
||||||
struct mmc_data *data;
|
|
||||||
|
|
||||||
spin_lock(&host->lock);
|
|
||||||
|
|
||||||
if ((wbsd_read_index(host, WBSD_IDX_CRCSTATUS) & WBSD_CRC_MASK) !=
|
|
||||||
WBSD_CRC_OK) {
|
|
||||||
data = wbsd_get_data(host);
|
|
||||||
if (!data)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
DBGF("CRC error\n");
|
|
||||||
|
|
||||||
data->error = MMC_ERR_BADCRC;
|
|
||||||
|
|
||||||
tasklet_schedule(&host->finish_tasklet);
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
spin_unlock(&host->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interrupt handling
|
* Interrupt handling
|
||||||
*/
|
*/
|
||||||
|
@ -1220,8 +1195,6 @@ static irqreturn_t wbsd_irq(int irq, void *dev_id)
|
||||||
tasklet_hi_schedule(&host->crc_tasklet);
|
tasklet_hi_schedule(&host->crc_tasklet);
|
||||||
if (isr & WBSD_INT_TIMEOUT)
|
if (isr & WBSD_INT_TIMEOUT)
|
||||||
tasklet_hi_schedule(&host->timeout_tasklet);
|
tasklet_hi_schedule(&host->timeout_tasklet);
|
||||||
if (isr & WBSD_INT_BUSYEND)
|
|
||||||
tasklet_hi_schedule(&host->block_tasklet);
|
|
||||||
if (isr & WBSD_INT_TC)
|
if (isr & WBSD_INT_TC)
|
||||||
tasklet_schedule(&host->finish_tasklet);
|
tasklet_schedule(&host->finish_tasklet);
|
||||||
|
|
||||||
|
@ -1522,8 +1495,6 @@ static int __devinit wbsd_request_irq(struct wbsd_host *host, int irq)
|
||||||
(unsigned long)host);
|
(unsigned long)host);
|
||||||
tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish,
|
tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish,
|
||||||
(unsigned long)host);
|
(unsigned long)host);
|
||||||
tasklet_init(&host->block_tasklet, wbsd_tasklet_block,
|
|
||||||
(unsigned long)host);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1542,7 +1513,6 @@ static void __devexit wbsd_release_irq(struct wbsd_host *host)
|
||||||
tasklet_kill(&host->crc_tasklet);
|
tasklet_kill(&host->crc_tasklet);
|
||||||
tasklet_kill(&host->timeout_tasklet);
|
tasklet_kill(&host->timeout_tasklet);
|
||||||
tasklet_kill(&host->finish_tasklet);
|
tasklet_kill(&host->finish_tasklet);
|
||||||
tasklet_kill(&host->block_tasklet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -46,10 +46,10 @@
|
||||||
|
|
||||||
#define WBSD_EINT_CARD 0x40
|
#define WBSD_EINT_CARD 0x40
|
||||||
#define WBSD_EINT_FIFO_THRE 0x20
|
#define WBSD_EINT_FIFO_THRE 0x20
|
||||||
#define WBSD_EINT_CCRC 0x10
|
#define WBSD_EINT_CRC 0x10
|
||||||
#define WBSD_EINT_TIMEOUT 0x08
|
#define WBSD_EINT_TIMEOUT 0x08
|
||||||
#define WBSD_EINT_PROGEND 0x04
|
#define WBSD_EINT_PROGEND 0x04
|
||||||
#define WBSD_EINT_CRC 0x02
|
#define WBSD_EINT_BUSYEND 0x02
|
||||||
#define WBSD_EINT_TC 0x01
|
#define WBSD_EINT_TC 0x01
|
||||||
|
|
||||||
#define WBSD_INT_PENDING 0x80
|
#define WBSD_INT_PENDING 0x80
|
||||||
|
@ -180,7 +180,6 @@ struct wbsd_host
|
||||||
struct tasklet_struct crc_tasklet;
|
struct tasklet_struct crc_tasklet;
|
||||||
struct tasklet_struct timeout_tasklet;
|
struct tasklet_struct timeout_tasklet;
|
||||||
struct tasklet_struct finish_tasklet;
|
struct tasklet_struct finish_tasklet;
|
||||||
struct tasklet_struct block_tasklet;
|
|
||||||
|
|
||||||
struct timer_list ignore_timer; /* Ignore detection timer */
|
struct timer_list ignore_timer; /* Ignore detection timer */
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user