forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kerne…
…l/git/bart/ide-2.6 * 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (34 commits) ide-cd: prevent null pointer deref via cdrom_newpc_intr ide: BUG() on unknown requests ide: filter out invalid DMA xfer mode changes in HDIO_DRIVE_CMD ioctl handler ide: do not access ide_drive_t 'drive_data' field directly sl82c105: implement test_irq() method siimage: implement test_irq() method pdc202xx_old: implement test_irq() method (take 2) cmd64x: implement test_irq() method cmd640: implement test_irq() method ide: move ack_intr() method into 'struct ide_port_ops' (take 2) ide: move IRQ clearing from ack_intr() method to clear_irq() method (take 2) siimage: use ide_dma_test_irq() (take 2) cmd64x: implement clear_irq() method (take 2) ide: call clear_irq() method in ide_timer_expiry() sgiioc4: coding style cleanup ide: don't enable IORDY at a probe time ide: IORDY handling fixes ata: add ata_id_pio_need_iordy() helper (v2) ide-tape: fix build issue ide: unify interrupt reason checking ...
- Loading branch information
Showing
34 changed files
with
598 additions
and
574 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ | |
* Copyright (C) 1998 David S. Miller ([email protected]) | ||
* | ||
* Copyright (C) 1999-2002 Andre Hedrick <[email protected]> | ||
* Copyright (C) 2007 MontaVista Software, Inc. <[email protected]> | ||
* Copyright (C) 2007,2009 MontaVista Software, Inc. <[email protected]> | ||
*/ | ||
|
||
#include <linux/module.h> | ||
|
@@ -118,8 +118,9 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |
ide_hwif_t *hwif = drive->hwif; | ||
struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
unsigned long setup_count; | ||
unsigned int cycle_time; | ||
u8 setup_count, arttim = 0; | ||
u8 arttim = 0; | ||
|
||
static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0}; | ||
static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23}; | ||
|
@@ -140,10 +141,11 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |
if (hwif->channel) { | ||
ide_drive_t *pair = ide_get_pair_dev(drive); | ||
|
||
drive->drive_data = setup_count; | ||
ide_set_drivedata(drive, (void *)setup_count); | ||
|
||
if (pair) | ||
setup_count = max_t(u8, setup_count, pair->drive_data); | ||
setup_count = max_t(u8, setup_count, | ||
(unsigned long)ide_get_drivedata(pair)); | ||
} | ||
|
||
if (setup_count > 5) /* shouldn't actually happen... */ | ||
|
@@ -226,86 +228,62 @@ static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed) | |
(void) pci_write_config_byte(dev, pciU, regU); | ||
} | ||
|
||
static int cmd648_dma_end(ide_drive_t *drive) | ||
static void cmd648_clear_irq(ide_drive_t *drive) | ||
{ | ||
ide_hwif_t *hwif = drive->hwif; | ||
unsigned long base = hwif->dma_base - (hwif->channel * 8); | ||
int err = ide_dma_end(drive); | ||
struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
unsigned long base = pci_resource_start(dev, 4); | ||
u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : | ||
MRDMODE_INTR_CH0; | ||
u8 mrdmode = inb(base + 1); | ||
|
||
/* clear the interrupt bit */ | ||
outb((mrdmode & ~(MRDMODE_INTR_CH0 | MRDMODE_INTR_CH1)) | irq_mask, | ||
base + 1); | ||
|
||
return err; | ||
} | ||
|
||
static int cmd64x_dma_end(ide_drive_t *drive) | ||
static void cmd64x_clear_irq(ide_drive_t *drive) | ||
{ | ||
ide_hwif_t *hwif = drive->hwif; | ||
struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
int irq_reg = hwif->channel ? ARTTIM23 : CFR; | ||
u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : | ||
CFR_INTR_CH0; | ||
u8 irq_stat = 0; | ||
int err = ide_dma_end(drive); | ||
|
||
(void) pci_read_config_byte(dev, irq_reg, &irq_stat); | ||
/* clear the interrupt bit */ | ||
(void) pci_write_config_byte(dev, irq_reg, irq_stat | irq_mask); | ||
|
||
return err; | ||
} | ||
|
||
static int cmd648_dma_test_irq(ide_drive_t *drive) | ||
static int cmd648_test_irq(ide_hwif_t *hwif) | ||
{ | ||
ide_hwif_t *hwif = drive->hwif; | ||
unsigned long base = hwif->dma_base - (hwif->channel * 8); | ||
struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
unsigned long base = pci_resource_start(dev, 4); | ||
u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : | ||
MRDMODE_INTR_CH0; | ||
u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS); | ||
u8 mrdmode = inb(base + 1); | ||
|
||
#ifdef DEBUG | ||
printk("%s: dma_stat: 0x%02x mrdmode: 0x%02x irq_mask: 0x%02x\n", | ||
drive->name, dma_stat, mrdmode, irq_mask); | ||
#endif | ||
if (!(mrdmode & irq_mask)) | ||
return 0; | ||
|
||
/* return 1 if INTR asserted */ | ||
if (dma_stat & 4) | ||
return 1; | ||
pr_debug("%s: mrdmode: 0x%02x irq_mask: 0x%02x\n", | ||
hwif->name, mrdmode, irq_mask); | ||
|
||
return 0; | ||
return (mrdmode & irq_mask) ? 1 : 0; | ||
} | ||
|
||
static int cmd64x_dma_test_irq(ide_drive_t *drive) | ||
static int cmd64x_test_irq(ide_hwif_t *hwif) | ||
{ | ||
ide_hwif_t *hwif = drive->hwif; | ||
struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
int irq_reg = hwif->channel ? ARTTIM23 : CFR; | ||
u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : | ||
CFR_INTR_CH0; | ||
u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS); | ||
u8 irq_stat = 0; | ||
|
||
(void) pci_read_config_byte(dev, irq_reg, &irq_stat); | ||
|
||
#ifdef DEBUG | ||
printk("%s: dma_stat: 0x%02x irq_stat: 0x%02x irq_mask: 0x%02x\n", | ||
drive->name, dma_stat, irq_stat, irq_mask); | ||
#endif | ||
if (!(irq_stat & irq_mask)) | ||
return 0; | ||
|
||
/* return 1 if INTR asserted */ | ||
if (dma_stat & 4) | ||
return 1; | ||
pr_debug("%s: irq_stat: 0x%02x irq_mask: 0x%02x\n", | ||
hwif->name, irq_stat, irq_mask); | ||
|
||
return 0; | ||
return (irq_stat & irq_mask) ? 1 : 0; | ||
} | ||
|
||
/* | ||
|
@@ -370,18 +348,17 @@ static u8 cmd64x_cable_detect(ide_hwif_t *hwif) | |
static const struct ide_port_ops cmd64x_port_ops = { | ||
.set_pio_mode = cmd64x_set_pio_mode, | ||
.set_dma_mode = cmd64x_set_dma_mode, | ||
.clear_irq = cmd64x_clear_irq, | ||
.test_irq = cmd64x_test_irq, | ||
.cable_detect = cmd64x_cable_detect, | ||
}; | ||
|
||
static const struct ide_dma_ops cmd64x_dma_ops = { | ||
.dma_host_set = ide_dma_host_set, | ||
.dma_setup = ide_dma_setup, | ||
.dma_start = ide_dma_start, | ||
.dma_end = cmd64x_dma_end, | ||
.dma_test_irq = cmd64x_dma_test_irq, | ||
.dma_lost_irq = ide_dma_lost_irq, | ||
.dma_timer_expiry = ide_dma_sff_timer_expiry, | ||
.dma_sff_read_status = ide_dma_sff_read_status, | ||
static const struct ide_port_ops cmd648_port_ops = { | ||
.set_pio_mode = cmd64x_set_pio_mode, | ||
.set_dma_mode = cmd64x_set_dma_mode, | ||
.clear_irq = cmd648_clear_irq, | ||
.test_irq = cmd648_test_irq, | ||
.cable_detect = cmd64x_cable_detect, | ||
}; | ||
|
||
static const struct ide_dma_ops cmd646_rev1_dma_ops = { | ||
|
@@ -395,24 +372,12 @@ static const struct ide_dma_ops cmd646_rev1_dma_ops = { | |
.dma_sff_read_status = ide_dma_sff_read_status, | ||
}; | ||
|
||
static const struct ide_dma_ops cmd648_dma_ops = { | ||
.dma_host_set = ide_dma_host_set, | ||
.dma_setup = ide_dma_setup, | ||
.dma_start = ide_dma_start, | ||
.dma_end = cmd648_dma_end, | ||
.dma_test_irq = cmd648_dma_test_irq, | ||
.dma_lost_irq = ide_dma_lost_irq, | ||
.dma_timer_expiry = ide_dma_sff_timer_expiry, | ||
.dma_sff_read_status = ide_dma_sff_read_status, | ||
}; | ||
|
||
static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | ||
{ /* 0: CMD643 */ | ||
.name = DRV_NAME, | ||
.init_chipset = init_chipset_cmd64x, | ||
.enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, | ||
.port_ops = &cmd64x_port_ops, | ||
.dma_ops = &cmd64x_dma_ops, | ||
.host_flags = IDE_HFLAG_CLEAR_SIMPLEX | | ||
IDE_HFLAG_ABUSE_PREFETCH, | ||
.pio_mask = ATA_PIO5, | ||
|
@@ -423,8 +388,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |
.name = DRV_NAME, | ||
.init_chipset = init_chipset_cmd64x, | ||
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | ||
.port_ops = &cmd64x_port_ops, | ||
.dma_ops = &cmd648_dma_ops, | ||
.port_ops = &cmd648_port_ops, | ||
.host_flags = IDE_HFLAG_SERIALIZE | | ||
IDE_HFLAG_ABUSE_PREFETCH, | ||
.pio_mask = ATA_PIO5, | ||
|
@@ -435,8 +399,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |
.name = DRV_NAME, | ||
.init_chipset = init_chipset_cmd64x, | ||
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | ||
.port_ops = &cmd64x_port_ops, | ||
.dma_ops = &cmd648_dma_ops, | ||
.port_ops = &cmd648_port_ops, | ||
.host_flags = IDE_HFLAG_ABUSE_PREFETCH, | ||
.pio_mask = ATA_PIO5, | ||
.mwdma_mask = ATA_MWDMA2, | ||
|
@@ -446,8 +409,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |
.name = DRV_NAME, | ||
.init_chipset = init_chipset_cmd64x, | ||
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | ||
.port_ops = &cmd64x_port_ops, | ||
.dma_ops = &cmd648_dma_ops, | ||
.port_ops = &cmd648_port_ops, | ||
.host_flags = IDE_HFLAG_ABUSE_PREFETCH, | ||
.pio_mask = ATA_PIO5, | ||
.mwdma_mask = ATA_MWDMA2, | ||
|
@@ -484,10 +446,9 @@ static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_devic | |
*/ | ||
if (dev->revision < 3) { | ||
d.enablebits[0].reg = 0; | ||
d.port_ops = &cmd64x_port_ops; | ||
if (dev->revision == 1) | ||
d.dma_ops = &cmd646_rev1_dma_ops; | ||
else | ||
d.dma_ops = &cmd64x_dma_ops; | ||
} | ||
} | ||
} | ||
|
Oops, something went wrong.