ide: ->ide_dma_clear_irq() -> ->clear_irq()
* Rename ->ide_dma_clear_irq method to ->clear_irq and move it from ide_hwif_t to struct ide_port_ops. * Move ->waiting_for_dma check inside ->clear_irq method. * Move ->dma_base check inside ->clear_irq method. piix.c: * Add ich_port_ops and remove init_hwif_ich() wrapper. There should be no functional changes caused by this patch. Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
Родитель
a9ab09e260
Коммит
bfa7d8e55f
|
@ -1418,23 +1418,16 @@ irqreturn_t ide_intr (int irq, void *dev_id)
|
|||
del_timer(&hwgroup->timer);
|
||||
spin_unlock(&ide_lock);
|
||||
|
||||
/* Some controllers might set DMA INTR no matter DMA or PIO;
|
||||
* bmdma status might need to be cleared even for
|
||||
* PIO interrupts to prevent spurious/lost irq.
|
||||
*/
|
||||
if (hwif->ide_dma_clear_irq && !(drive->waiting_for_dma))
|
||||
/* ide_dma_end() needs bmdma status for error checking.
|
||||
* So, skip clearing bmdma status here and leave it
|
||||
* to ide_dma_end() if this is dma interrupt.
|
||||
*/
|
||||
hwif->ide_dma_clear_irq(drive);
|
||||
if (hwif->port_ops && hwif->port_ops->clear_irq)
|
||||
hwif->port_ops->clear_irq(drive);
|
||||
|
||||
if (drive->dev_flags & IDE_DFLAG_UNMASK)
|
||||
local_irq_enable_in_hardirq();
|
||||
|
||||
/* service this interrupt, may set handler for next interrupt */
|
||||
startstop = handler(drive);
|
||||
spin_lock_irq(&ide_lock);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
/*
|
||||
* Note that handler() may have set things up for another
|
||||
* interrupt to occur soon, but it cannot happen until
|
||||
|
|
|
@ -215,17 +215,26 @@ static unsigned int init_chipset_ich(struct pci_dev *dev)
|
|||
}
|
||||
|
||||
/**
|
||||
* piix_dma_clear_irq - clear BMDMA status
|
||||
* @drive: IDE drive to clear
|
||||
* ich_clear_irq - clear BMDMA status
|
||||
* @drive: IDE drive
|
||||
*
|
||||
* Called from ide_intr() for PIO interrupts
|
||||
* to clear BMDMA status as needed by ICHx
|
||||
* ICHx contollers set DMA INTR no matter DMA or PIO.
|
||||
* BMDMA status might need to be cleared even for
|
||||
* PIO interrupts to prevent spurious/lost IRQ.
|
||||
*/
|
||||
static void piix_dma_clear_irq(ide_drive_t *drive)
|
||||
static void ich_clear_irq(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
u8 dma_stat;
|
||||
|
||||
/*
|
||||
* ide_dma_end() needs BMDMA status for error checking.
|
||||
* So, skip clearing BMDMA status here and leave it
|
||||
* to ide_dma_end() if this is DMA interrupt.
|
||||
*/
|
||||
if (drive->waiting_for_dma || hwif->dma_base == 0)
|
||||
return;
|
||||
|
||||
/* clear the INTR & ERROR bits */
|
||||
dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
|
||||
/* Should we force the bit as well ? */
|
||||
|
@ -293,21 +302,19 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif)
|
|||
hwif->ultra_mask = hwif->mwdma_mask = hwif->swdma_mask = 0;
|
||||
}
|
||||
|
||||
static void __devinit init_hwif_ich(ide_hwif_t *hwif)
|
||||
{
|
||||
init_hwif_piix(hwif);
|
||||
|
||||
/* ICHx need to clear the BMDMA status for all interrupts */
|
||||
if (hwif->dma_base)
|
||||
hwif->ide_dma_clear_irq = &piix_dma_clear_irq;
|
||||
}
|
||||
|
||||
static const struct ide_port_ops piix_port_ops = {
|
||||
.set_pio_mode = piix_set_pio_mode,
|
||||
.set_dma_mode = piix_set_dma_mode,
|
||||
.cable_detect = piix_cable_detect,
|
||||
};
|
||||
|
||||
static const struct ide_port_ops ich_port_ops = {
|
||||
.set_pio_mode = piix_set_pio_mode,
|
||||
.set_dma_mode = piix_set_dma_mode,
|
||||
.clear_irq = ich_clear_irq,
|
||||
.cable_detect = piix_cable_detect,
|
||||
};
|
||||
|
||||
#ifndef CONFIG_IA64
|
||||
#define IDE_HFLAGS_PIIX IDE_HFLAG_LEGACY_IRQS
|
||||
#else
|
||||
|
@ -331,9 +338,9 @@ static const struct ide_port_ops piix_port_ops = {
|
|||
{ \
|
||||
.name = DRV_NAME, \
|
||||
.init_chipset = init_chipset_ich, \
|
||||
.init_hwif = init_hwif_ich, \
|
||||
.init_hwif = init_hwif_piix, \
|
||||
.enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \
|
||||
.port_ops = &piix_port_ops, \
|
||||
.port_ops = &ich_port_ops, \
|
||||
.host_flags = IDE_HFLAGS_PIIX, \
|
||||
.pio_mask = ATA_PIO4, \
|
||||
.swdma_mask = ATA_SWDMA2_ONLY, \
|
||||
|
|
|
@ -704,6 +704,7 @@ extern const struct ide_tp_ops default_tp_ops;
|
|||
* @resetproc: routine to reset controller after a disk reset
|
||||
* @maskproc: special host masking for drive selection
|
||||
* @quirkproc: check host's drive quirk list
|
||||
* @clear_irq: clear IRQ
|
||||
*
|
||||
* @mdma_filter: filter MDMA modes
|
||||
* @udma_filter: filter UDMA modes
|
||||
|
@ -720,6 +721,7 @@ struct ide_port_ops {
|
|||
void (*resetproc)(ide_drive_t *);
|
||||
void (*maskproc)(ide_drive_t *, int);
|
||||
void (*quirkproc)(ide_drive_t *);
|
||||
void (*clear_irq)(ide_drive_t *);
|
||||
|
||||
u8 (*mdma_filter)(ide_drive_t *);
|
||||
u8 (*udma_filter)(ide_drive_t *);
|
||||
|
@ -782,8 +784,6 @@ typedef struct hwif_s {
|
|||
const struct ide_port_ops *port_ops;
|
||||
const struct ide_dma_ops *dma_ops;
|
||||
|
||||
void (*ide_dma_clear_irq)(ide_drive_t *drive);
|
||||
|
||||
/* dma physical region descriptor table (cpu view) */
|
||||
unsigned int *dmatable_cpu;
|
||||
/* dma physical region descriptor table (dma view) */
|
||||
|
|
Загрузка…
Ссылка в новой задаче