Skip to content

Commit

Permalink
Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6
Browse files Browse the repository at this point in the history
* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6:
  Use menuconfig objects: IDE
  sl82c105: Switch to ref counting API
  ide: remove ide_use_dma()
  ide: add missing validity checks for identify words 62 and 63
  ide: remove ide_dma_enable()
  sl82c105: add speedproc() method and MWDMA0/1 support
  cs5530/sc1200: add ->speedproc support
  cs5530/sc1200: DMA support cleanup
  ide: use ide_tune_dma() part #2
  cs5530/sc1200: add ->udma_filter methods
  ide: always disable DMA before tuning it
  pdc202xx_new: use ide_tune_dma()
  alim15x3: use ide_tune_dma()
  sis5513: PIO mode setup fixes
  serverworks: PIO mode setup fixes
  pdc202xx_old: rewrite mode programming code (v2)
  • Loading branch information
Linus Torvalds committed May 16, 2007
2 parents 0e402c6 + e0ff9cd commit e089d43
Show file tree
Hide file tree
Showing 19 changed files with 340 additions and 682 deletions.
15 changes: 4 additions & 11 deletions drivers/ide/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@
# Andre Hedrick <andre@linux-ide.org>
#

if BLOCK

menu "ATA/ATAPI/MFM/RLL support"
depends on HAS_IOMEM

config IDE
menuconfig IDE
tristate "ATA/ATAPI/MFM/RLL support"
depends on BLOCK
depends on HAS_IOMEM
---help---
If you say Y here, your kernel will be able to manage low cost mass
storage units such as ATA/(E)IDE and ATAPI units. The most common
Expand Down Expand Up @@ -1099,8 +1096,4 @@ config BLK_DEV_HD_ONLY
config BLK_DEV_HD
def_bool BLK_DEV_HD_IDE || BLK_DEV_HD_ONLY

endif

endmenu

endif
endif # IDE
14 changes: 1 addition & 13 deletions drivers/ide/cris/ide-cris.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,18 +1002,6 @@ static int cris_ide_build_dmatable (ide_drive_t *drive)
return 1; /* let the PIO routines handle this weirdness */
}

static int cris_config_drive_for_dma (ide_drive_t *drive)
{
u8 speed = ide_max_dma_mode(drive);

if (!speed)
return 0;

speed_cris_ide(drive, speed);

return ide_dma_enable(drive);
}

/*
* cris_dma_intr() is the handler for disk read/write DMA interrupts
*/
Expand Down Expand Up @@ -1043,7 +1031,7 @@ static ide_startstop_t cris_dma_intr (ide_drive_t *drive)

static int cris_dma_check(ide_drive_t *drive)
{
if (ide_use_dma(drive) && cris_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

return -1;
Expand Down
53 changes: 12 additions & 41 deletions drivers/ide/ide-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -670,41 +670,6 @@ int __ide_dma_good_drive (ide_drive_t *drive)

EXPORT_SYMBOL(__ide_dma_good_drive);

int ide_use_dma(ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
ide_hwif_t *hwif = drive->hwif;

if ((id->capability & 1) == 0 || drive->autodma == 0)
return 0;

/* consult the list of known "bad" drives */
if (__ide_dma_bad_drive(drive))
return 0;

/* capable of UltraDMA modes */
if (id->field_valid & 4) {
if (hwif->ultra_mask & id->dma_ultra)
return 1;
}

/* capable of regular DMA modes */
if (id->field_valid & 2) {
if (hwif->mwdma_mask & id->dma_mword)
return 1;
if (hwif->swdma_mask & id->dma_1word)
return 1;
}

/* consult the list of known "good" drives */
if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150)
return 1;

return 0;
}

EXPORT_SYMBOL_GPL(ide_use_dma);

static const u8 xfer_mode_bases[] = {
XFER_UDMA_0,
XFER_MW_DMA_0,
Expand All @@ -731,10 +696,12 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base)
mask &= 0x07;
break;
case XFER_MW_DMA_0:
mask = id->dma_mword & hwif->mwdma_mask;
if (id->field_valid & 2)
mask = id->dma_mword & hwif->mwdma_mask;
break;
case XFER_SW_DMA_0:
mask = id->dma_1word & hwif->swdma_mask;
if (id->field_valid & 2)
mask = id->dma_1word & hwif->swdma_mask;
break;
default:
BUG();
Expand Down Expand Up @@ -783,18 +750,22 @@ int ide_tune_dma(ide_drive_t *drive)
{
u8 speed;

/* TODO: use only ide_max_dma_mode() */
if (!ide_use_dma(drive))
if ((drive->id->capability & 1) == 0 || drive->autodma == 0)
return 0;

/* consult the list of known "bad" drives */
if (__ide_dma_bad_drive(drive))
return 0;

speed = ide_max_dma_mode(drive);

if (!speed)
return 0;

drive->hwif->speedproc(drive, speed);
if (drive->hwif->speedproc(drive, speed))
return 0;

return ide_dma_enable(drive);
return 1;
}

EXPORT_SYMBOL_GPL(ide_tune_dma);
Expand Down
1 change: 1 addition & 0 deletions drivers/ide/ide-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
break;
if (drive->hwif->ide_dma_check == NULL)
break;
drive->hwif->dma_off_quietly(drive);
ide_set_dma(drive);
break;
}
Expand Down
12 changes: 0 additions & 12 deletions drivers/ide/ide-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,18 +111,6 @@ u8 ide_rate_filter(ide_drive_t *drive, u8 speed)

EXPORT_SYMBOL(ide_rate_filter);

int ide_dma_enable (ide_drive_t *drive)
{
ide_hwif_t *hwif = HWIF(drive);
struct hd_driveid *id = drive->id;

return ((int) ((((id->dma_ultra >> 8) & hwif->ultra_mask) ||
((id->dma_mword >> 8) & hwif->mwdma_mask) ||
((id->dma_1word >> 8) & hwif->swdma_mask)) ? 1 : 0));
}

EXPORT_SYMBOL(ide_dma_enable);

int ide_use_fast_pio(ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
Expand Down
1 change: 1 addition & 0 deletions drivers/ide/ide.c
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,7 @@ int set_using_dma(ide_drive_t *drive, int arg)
err = 0;

if (arg) {
hwif->dma_off_quietly(drive);
if (ide_set_dma(drive) || hwif->ide_dma_on(drive))
err = -EIO;
} else
Expand Down
69 changes: 7 additions & 62 deletions drivers/ide/pci/alim15x3.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,28 +455,6 @@ static int ali15x3_tune_chipset (ide_drive_t *drive, u8 xferspeed)
return (ide_config_drive_speed(drive, speed));
}


/**
* config_chipset_for_dma - set up DMA mode
* @drive: drive to configure for
*
* Place a drive into DMA mode and tune the chipset for
* the selected speed.
*
* Returns true if DMA mode can be used
*/

static int config_chipset_for_dma (ide_drive_t *drive)
{
u8 speed = ide_max_dma_mode(drive);

if (!(speed))
return 0;

(void) ali15x3_tune_chipset(drive, speed);
return ide_dma_enable(drive);
}

/**
* ali15x3_config_drive_for_dma - configure for DMA
* @drive: drive to configure
Expand All @@ -487,48 +465,14 @@ static int config_chipset_for_dma (ide_drive_t *drive)

static int ali15x3_config_drive_for_dma(ide_drive_t *drive)
{
ide_hwif_t *hwif = HWIF(drive);
struct hd_driveid *id = drive->id;

if ((m5229_revision<=0x20) && (drive->media!=ide_disk))
goto ata_pio;

drive->init_speed = 0;

if ((id != NULL) && ((id->capability & 1) != 0) && drive->autodma) {
/* Consult the list of known "bad" drives */
if (__ide_dma_bad_drive(drive))
goto ata_pio;
if ((id->field_valid & 4) && (m5229_revision >= 0xC2)) {
if (id->dma_ultra & hwif->ultra_mask) {
/* Force if Capable UltraDMA */
int dma = config_chipset_for_dma(drive);
if ((id->field_valid & 2) && !dma)
goto try_dma_modes;
}
} else if (id->field_valid & 2) {
try_dma_modes:
if ((id->dma_mword & hwif->mwdma_mask) ||
(id->dma_1word & hwif->swdma_mask)) {
/* Force if Capable regular DMA modes */
if (!config_chipset_for_dma(drive))
goto ata_pio;
}
} else if (__ide_dma_good_drive(drive) &&
(id->eide_dma_time < 150)) {
/* Consult the list of known "good" drives */
if (!config_chipset_for_dma(drive))
goto ata_pio;
} else {
goto ata_pio;
}
} else {
ata_pio:
hwif->tuneproc(drive, 255);
return -1;
}
if (ide_tune_dma(drive))
return 0;

return 0;
ali15x3_tune_drive(drive, 255);

return -1;
}

/**
Expand Down Expand Up @@ -739,7 +683,8 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)
return;
}

hwif->atapi_dma = 1;
if (m5229_revision > 0x20)
hwif->atapi_dma = 1;

if (m5229_revision <= 0x20)
hwif->ultra_mask = 0x00; /* no udma */
Expand Down
15 changes: 1 addition & 14 deletions drivers/ide/pci/cmd64x.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,22 +352,9 @@ static int cmd64x_tune_chipset (ide_drive_t *drive, u8 speed)
return ide_config_drive_speed(drive, speed);
}

static int config_chipset_for_dma (ide_drive_t *drive)
{
u8 speed = ide_max_dma_mode(drive);

if (!speed)
return 0;

if (cmd64x_tune_chipset(drive, speed))
return 0;

return ide_dma_enable(drive);
}

static int cmd64x_config_drive_for_dma (ide_drive_t *drive)
{
if (ide_use_dma(drive) && config_chipset_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

if (ide_use_fast_pio(drive))
Expand Down
Loading

0 comments on commit e089d43

Please sign in to comment.