Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8028fcb authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: add missing ide_rate_filter() calls to ->speedproc()-s



* Fix icside, cris-ide, au1xxx-ide, amd74xx, via82cxxx and pmac host drivers
  to use ide_rate_filter().

  This results in the following modes (from user requests) being clipped down:
  - invalid modes (values 0x46-0xFF)  [ for all hosts ]
  - unsupported by a host UDMA modes  [ for hosts which support UDMA]
  - all UDMA modes and MWDMA3-4 modes [ for hosts which don't support UDMA ]
  - invalid modes (values 0x25-0x39)  [ for hosts which don't support UDMA ]

* Host driver specific changes in behavior:

  icside:
    - no change

  cris-ide
    - clip unsupported UDMA3-6 modes down
    - fix BUG() on trying to set unsupported UDMA3-6 modes

  au1xxx-ide/pmac
    - clip unsupported UDMA modes down

  amd74xx/via82cxxx
    - clip unsupported UDMA modes down
    - fix random PIO timings being set for unsupported/invalid modes
    - fix unsupported/invalid modes being set on the device

* While at it remove no longer needed checks from pmac.c driver.

Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 851dd33b
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -255,8 +255,7 @@ static int icside_set_speed(ide_drive_t *drive, u8 xfer_mode)
	/*
	/*
	 * Limit the transfer speed to MW_DMA_2.
	 * Limit the transfer speed to MW_DMA_2.
	 */
	 */
	if (xfer_mode > XFER_MW_DMA_2)
	xfer_mode = ide_rate_filter(drive, xfer_mode);
		xfer_mode = XFER_MW_DMA_2;


	switch (xfer_mode) {
	switch (xfer_mode) {
	case XFER_MW_DMA_2:
	case XFER_MW_DMA_2:
+2 −0
Original line number Original line Diff line number Diff line
@@ -726,6 +726,8 @@ static int speed_cris_ide(ide_drive_t *drive, u8 speed)
{
{
	int cyc = 0, dvs = 0, strobe = 0, hold = 0;
	int cyc = 0, dvs = 0, strobe = 0, hold = 0;


	speed = ide_rate_filter(drive, speed);

	if (speed >= XFER_PIO_0 && speed <= XFER_PIO_4) {
	if (speed >= XFER_PIO_0 && speed <= XFER_PIO_4) {
		tune_cris_ide(drive, speed - XFER_PIO_0);
		tune_cris_ide(drive, speed - XFER_PIO_0);
		return ide_config_drive_speed(drive, speed);
		return ide_config_drive_speed(drive, speed);
+2 −0
Original line number Original line Diff line number Diff line
@@ -180,6 +180,8 @@ static int auide_tune_chipset (ide_drive_t *drive, u8 speed)
	int mem_sttime;
	int mem_sttime;
	int mem_stcfg;
	int mem_stcfg;


	speed = ide_rate_filter(drive, speed);

	mem_sttime = 0;
	mem_sttime = 0;
	mem_stcfg  = au_readl(MEM_STCFG2);
	mem_stcfg  = au_readl(MEM_STCFG2);


+2 −0
Original line number Original line Diff line number Diff line
@@ -240,6 +240,8 @@ static int amd_set_drive(ide_drive_t *drive, u8 speed)
	struct ide_timing t, p;
	struct ide_timing t, p;
	int T, UT;
	int T, UT;


	speed = ide_rate_filter(drive, speed);

	if (speed != XFER_PIO_SLOW)
	if (speed != XFER_PIO_SLOW)
		ide_config_drive_speed(drive, speed);
		ide_config_drive_speed(drive, speed);


+2 −0
Original line number Original line Diff line number Diff line
@@ -165,6 +165,8 @@ static int via_set_drive(ide_drive_t *drive, u8 speed)
	struct ide_timing t, p;
	struct ide_timing t, p;
	unsigned int T, UT;
	unsigned int T, UT;


	speed = ide_rate_filter(drive, speed);

	if (speed != XFER_PIO_SLOW)
	if (speed != XFER_PIO_SLOW)
		ide_config_drive_speed(drive, speed);
		ide_config_drive_speed(drive, speed);


Loading