ide: rework the code for selecting the best DMA transfer mode (v3)
Depends on the "ide: fix UDMA/MWDMA/SWDMA masks" patch. * add ide_hwif_t.udma_filter hook for filtering UDMA mask (use it in alim15x3, hpt366, siimage and serverworks drivers) * add ide_max_dma_mode() for finding best DMA mode for the device (loosely based on some older libata-core.c code) * convert ide_dma_speed() users to use ide_max_dma_mode() * make ide_rate_filter() take "ide_drive_t *drive" as an argument instead of "u8 mode" and teach it to how to use UDMA mask to do filtering * use ide_rate_filter() in hpt366 driver * remove no longer needed ide_dma_speed() and *_ratemask() * unexport eighty_ninty_three() v2: * rename ->filter_udma_mask to ->udma_filter [ Suggested by Sergei Shtylyov <sshtylyov@ru.mvista.com>. ] v3: * updated for scc_pata driver (fixes XFER_UDMA_6 filtering for user-space originated transfer mode change requests when 100MHz clock is used) Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
@ -189,23 +189,6 @@ scc_ide_outsl(unsigned long port, void *addr, u32 count)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* scc_ratemask - Compute available modes
|
||||
* @drive: IDE drive
|
||||
*
|
||||
* Compute the available speeds for the devices on the interface.
|
||||
* Enforce UDMA33 as a limit if there is no 80pin cable present.
|
||||
*/
|
||||
|
||||
static u8 scc_ratemask(ide_drive_t *drive)
|
||||
{
|
||||
u8 mode = 4;
|
||||
|
||||
if (!eighty_ninty_three(drive))
|
||||
mode = min(mode, (u8)1);
|
||||
return mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* scc_tuneproc - tune a drive PIO mode
|
||||
* @drive: drive to tune
|
||||
@ -273,7 +256,7 @@ static void scc_tuneproc(ide_drive_t *drive, byte mode_wanted)
|
||||
static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed)
|
||||
{
|
||||
ide_hwif_t *hwif = HWIF(drive);
|
||||
u8 speed = ide_rate_filter(scc_ratemask(drive), xferspeed);
|
||||
u8 speed = ide_rate_filter(drive, xferspeed);
|
||||
struct scc_ports *ports = ide_get_hwifdata(hwif);
|
||||
unsigned long ctl_base = ports->ctl;
|
||||
unsigned long cckctrl_port = ctl_base + 0xff0;
|
||||
@ -347,7 +330,7 @@ static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed)
|
||||
|
||||
static int scc_config_chipset_for_dma(ide_drive_t *drive)
|
||||
{
|
||||
u8 speed = ide_dma_speed(drive, scc_ratemask(drive));
|
||||
u8 speed = ide_max_dma_mode(drive);
|
||||
|
||||
if (!speed)
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user