Skip to content

Commit

Permalink
ide: add ide_tune_dma() helper
Browse files Browse the repository at this point in the history
After reworking the code responsible for selecting the best DMA
transfer mode it is now possible to add generic ide_tune_dma() helper.

Convert some IDE PCI host drivers to use it (the ones left need more work).

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
  • Loading branch information
Bartlomiej Zolnierkiewicz committed May 9, 2007
1 parent 2d5eaa6 commit 29e744d
Show file tree
Hide file tree
Showing 14 changed files with 34 additions and 206 deletions.
20 changes: 20 additions & 0 deletions drivers/ide/ide-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -779,6 +779,26 @@ u8 ide_max_dma_mode(ide_drive_t *drive)

EXPORT_SYMBOL_GPL(ide_max_dma_mode);

int ide_tune_dma(ide_drive_t *drive)
{
u8 speed;

/* TODO: use only ide_max_dma_mode() */
if (!ide_use_dma(drive))
return 0;

speed = ide_max_dma_mode(drive);

if (!speed)
return 0;

drive->hwif->speedproc(drive, speed);

return ide_dma_enable(drive);
}

EXPORT_SYMBOL_GPL(ide_tune_dma);

void ide_dma_verbose(ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
Expand Down
13 changes: 1 addition & 12 deletions drivers/ide/pci/aec62xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,17 +155,6 @@ static int aec62xx_tune_chipset (ide_drive_t *drive, u8 speed)
}
}

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

if (!(speed))
return 0;

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

static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio)
{
pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
Expand All @@ -174,7 +163,7 @@ static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio)

static int aec62xx_config_drive_xfer_rate (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
22 changes: 1 addition & 21 deletions drivers/ide/pci/atiixp.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,26 +206,6 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed)
return ide_config_drive_speed(drive, speed);
}

/**
* atiixp_config_drive_for_dma - configure drive for DMA
* @drive: IDE drive to configure
*
* Set up a ATIIXP interface channel for the best available speed.
* We prefer UDMA if it is available and then MWDMA. If DMA is
* not available we switch to PIO and return 0.
*/

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

if (!speed)
return 0;

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

/**
* atiixp_dma_check - set up an IDE device
* @drive: IDE drive to configure
Expand All @@ -240,7 +220,7 @@ static int atiixp_dma_check(ide_drive_t *drive)

drive->init_speed = 0;

if (ide_use_dma(drive) && atiixp_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

if (ide_use_fast_pio(drive)) {
Expand Down
15 changes: 1 addition & 14 deletions drivers/ide/pci/cs5535.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,26 +164,13 @@ static void cs5535_tuneproc(ide_drive_t *drive, u8 xferspeed)
cs5535_set_speed(drive, xferspeed);
}

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

/* If no DMA speed was available then let dma_check hit pio */
if (!speed) {
return 0;
}

cs5535_set_drive(drive, speed);
return ide_dma_enable(drive);
}

static int cs5535_dma_check(ide_drive_t *drive)
{
u8 speed;

drive->init_speed = 0;

if (ide_use_dma(drive) && cs5535_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

if (ide_use_fast_pio(drive)) {
Expand Down
20 changes: 1 addition & 19 deletions drivers/ide/pci/hpt34x.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,29 +84,11 @@ static void hpt34x_tune_drive (ide_drive_t *drive, u8 pio)
(void) hpt34x_tune_chipset(drive, (XFER_PIO_0 + pio));
}

/*
* This allows the configuration of ide_pci chipset registers
* for cards that learn about the drive's UDMA, DMA, PIO capabilities
* after the drive is reported by the OS. Initially for designed for
* HPT343 UDMA chipset by HighPoint|Triones Technologies, Inc.
*/

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

if (!(speed))
return 0;

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

static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive)
{
drive->init_speed = 0;

if (ide_use_dma(drive) && config_chipset_for_dma(drive))
if (ide_tune_dma(drive))
#ifndef CONFIG_HPT34X_AUTODMA
return -1;
#else
Expand Down
20 changes: 1 addition & 19 deletions drivers/ide/pci/hpt366.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,24 +669,6 @@ static void hpt3xx_tune_drive(ide_drive_t *drive, u8 pio)
(void) hpt3xx_tune_chipset (drive, XFER_PIO_0 + pio);
}

/*
* This allows the configuration of ide_pci chipset registers
* for cards that learn about the drive's UDMA, DMA, PIO capabilities
* after the drive is reported by the OS. Initially designed for
* HPT366 UDMA chipset by HighPoint|Triones Technologies, Inc.
*
*/
static int config_chipset_for_dma(ide_drive_t *drive)
{
u8 speed = ide_max_dma_mode(drive);

if (!speed)
return 0;

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

static int hpt3xx_quirkproc(ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
Expand Down Expand Up @@ -741,7 +723,7 @@ static int hpt366_config_drive_xfer_rate(ide_drive_t *drive)
{
drive->init_speed = 0;

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
21 changes: 1 addition & 20 deletions drivers/ide/pci/it8213.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,25 +197,6 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed)
return ide_config_drive_speed(drive, speed);
}

/*
* config_chipset_for_dma - configure for DMA
* @drive: drive to configure
*
* Called by the IDE layer when it wants the timings set up.
*/

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

if (!speed)
return 0;

it8213_tune_chipset(drive, speed);

return ide_dma_enable(drive);
}

/**
* it8213_configure_drive_for_dma - set up for DMA transfers
* @drive: drive we are going to set up
Expand All @@ -230,7 +211,7 @@ static int it8213_config_drive_for_dma (ide_drive_t *drive)
{
u8 pio;

if (ide_use_dma(drive) && config_chipset_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

pio = ide_get_best_pio_mode(drive, 255, 4, NULL);
Expand Down
21 changes: 1 addition & 20 deletions drivers/ide/pci/jmicron.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,25 +118,6 @@ static int jmicron_tune_chipset (ide_drive_t *drive, byte xferspeed)
return ide_config_drive_speed(drive, speed);
}

/**
* config_chipset_for_dma - configure for DMA
* @drive: drive to configure
*
* As the JMicron snoops for timings all we actually need to do is
* make sure we don't set an invalid mode.
*/

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

if (!speed)
return 0;

jmicron_tune_chipset(drive, speed);
return ide_dma_enable(drive);
}

/**
* jmicron_configure_drive_for_dma - set up for DMA transfers
* @drive: drive we are going to set up
Expand All @@ -147,7 +128,7 @@ static int config_chipset_for_dma (ide_drive_t *drive)

static int jmicron_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;

config_jmicron_chipset_for_pio(drive, 1);
Expand Down
26 changes: 1 addition & 25 deletions drivers/ide/pci/piix.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,30 +303,6 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed)
return ide_config_drive_speed(drive, speed);
}

/**
* piix_config_drive_for_dma - configure drive for DMA
* @drive: IDE drive to configure
*
* Set up a PIIX interface channel for the best available speed.
* We prefer UDMA if it is available and then MWDMA. If DMA is
* not available we switch to PIO and return 0.
*/

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

/*
* If no DMA speed was available or the chipset has DMA bugs
* then disable DMA and use PIO
*/
if (!speed)
return 0;

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

/**
* piix_config_drive_xfer_rate - set up an IDE device
* @drive: IDE drive to configure
Expand All @@ -339,7 +315,7 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive)
{
drive->init_speed = 0;

if (ide_use_dma(drive) && piix_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

if (ide_use_fast_pio(drive))
Expand Down
21 changes: 1 addition & 20 deletions drivers/ide/pci/sis5513.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,32 +638,13 @@ static void sis5513_tune_drive (ide_drive_t *drive, u8 pio)
(void) config_chipset_for_pio(drive, pio);
}

/*
* ((id->hw_config & 0x4000|0x2000) && (HWIF(drive)->udma_four))
*/
static int config_chipset_for_dma (ide_drive_t *drive)
{
u8 speed = ide_max_dma_mode(drive);

#ifdef DEBUG
printk("SIS5513: config_chipset_for_dma, drive %d, ultra %x\n",
drive->dn, drive->id->dma_ultra);
#endif

if (!(speed))
return 0;

sis5513_tune_chipset(drive, speed);
return ide_dma_enable(drive);
}

static int sis5513_config_xfer_rate(ide_drive_t *drive)
{
config_art_rwp_pio(drive, 5);

drive->init_speed = 0;

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
13 changes: 1 addition & 12 deletions drivers/ide/pci/slc90e66.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,22 +160,11 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed)
return ide_config_drive_speed(drive, speed);
}

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

if (!speed)
return 0;

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

static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
{
drive->init_speed = 0;

if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

if (ide_use_fast_pio(drive))
Expand Down
13 changes: 1 addition & 12 deletions drivers/ide/pci/tc86c001.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,20 +167,9 @@ static int tc86c001_busproc(ide_drive_t *drive, int state)
return 0;
}

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

if (!speed)
return 0;

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

static int tc86c001_config_drive_xfer_rate(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
13 changes: 1 addition & 12 deletions drivers/ide/pci/triflex.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,9 @@ static void triflex_tune_drive(ide_drive_t *drive, u8 pio)
(void) triflex_tune_chipset(drive, (XFER_PIO_0 + use_pio));
}

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

if (!speed)
return 0;

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

static int triflex_config_drive_xfer_rate(ide_drive_t *drive)
{
if (ide_use_dma(drive) && triflex_config_drive_for_dma(drive))
if (ide_tune_dma(drive))
return 0;

triflex_tune_drive(drive, 255);
Expand Down
Loading

0 comments on commit 29e744d

Please sign in to comment.