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

Commit 9c88b702 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6:
  ide: use correct IDE error recovery
  pdc202xx_new: Enable ATAPI DMA
  ide: cosmetic adaption of drivers/ide/Kconfig concerning SATA
  ide: fix locking for manual DMA enable/disable ("hdparm -d")
  ide: revert "ide: fix drive side 80c cable check, take 2" for now
parents 291bc047 513daadd
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -103,8 +103,10 @@ config BLK_DEV_IDE_SATA
	---help---
	  There are two drivers for Serial ATA controllers.

	  The main driver, "libata", exists inside the SCSI subsystem
	  and supports most modern SATA controllers.
	  The main driver, "libata", uses the SCSI subsystem
	  and supports most modern SATA controllers. In order to use it
	  you may take a look at "Serial ATA (prod) and Parallel ATA
	  (experimental) drivers".

	  The IDE driver (which you are currently configuring) supports
	  a few first-generation SATA controllers.
+21 −11
Original line number Diff line number Diff line
@@ -519,21 +519,24 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
	if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ && hwif->err_stops_fifo == 0)
		try_to_flush_leftover_data(drive);

	if (rq->errors >= ERROR_MAX || blk_noretry_request(rq)) {
		ide_kill_rq(drive, rq);
		return ide_stopped;
	}

	if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT))
		/* force an abort */
		hwif->OUTB(WIN_IDLEIMMEDIATE, IDE_COMMAND_REG);
		rq->errors |= ERROR_RESET;

	if (rq->errors >= ERROR_MAX || blk_noretry_request(rq))
		ide_kill_rq(drive, rq);
	else {
	if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
		++rq->errors;
		return ide_do_reset(drive);
	}

	if ((rq->errors & ERROR_RECAL) == ERROR_RECAL)
		drive->special.b.recalibrate = 1;

	++rq->errors;
	}

	return ide_stopped;
}

@@ -1025,6 +1028,13 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
	if (!drive->special.all) {
		ide_driver_t *drv;

		/*
		 * We reset the drive so we need to issue a SETFEATURES.
		 * Do it _after_ do_special() restored device parameters.
		 */
		if (drive->current_speed == 0xff)
			ide_config_drive_speed(drive, drive->desired_speed);

		if (rq->cmd_type == REQ_TYPE_ATA_CMD ||
		    rq->cmd_type == REQ_TYPE_ATA_TASK ||
		    rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
+9 −2
Original line number Diff line number Diff line
@@ -583,8 +583,12 @@ u8 eighty_ninty_three (ide_drive_t *drive)
	if(!(drive->id->hw_config & 0x4000))
		return 0;
#endif /* CONFIG_IDEDMA_IVB */
	if (!(drive->id->hw_config & 0x2000))
		return 0;
	/*
	 * FIXME:
	 * - change master/slave IDENTIFY order
	 * - force bit13 (80c cable present) check
	 *   (unless the slave device is pre-ATA3)
	 */
	return 1;
}

@@ -1090,6 +1094,9 @@ static void pre_reset(ide_drive_t *drive)
	if (HWIF(drive)->pre_reset != NULL)
		HWIF(drive)->pre_reset(drive);

	if (drive->current_speed != 0xff)
		drive->desired_speed = drive->current_speed;
	drive->current_speed = 0xff;
}

/*
+30 −7
Original line number Diff line number Diff line
@@ -1124,17 +1124,40 @@ static int set_io_32bit(ide_drive_t *drive, int arg)
static int set_using_dma (ide_drive_t *drive, int arg)
{
#ifdef CONFIG_BLK_DEV_IDEDMA
	ide_hwif_t *hwif = drive->hwif;
	int err = -EPERM;

	if (!drive->id || !(drive->id->capability & 1))
		return -EPERM;
	if (HWIF(drive)->ide_dma_check == NULL)
		return -EPERM;
		goto out;

	if (hwif->ide_dma_check == NULL)
		goto out;

	err = -EBUSY;
	if (ide_spin_wait_hwgroup(drive))
		goto out;
	/*
	 * set ->busy flag, unlock and let it ride
	 */
	hwif->hwgroup->busy = 1;
	spin_unlock_irq(&ide_lock);

	err = 0;

	if (arg) {
		if (ide_set_dma(drive))
			return -EIO;
		if (HWIF(drive)->ide_dma_on(drive)) return -EIO;
		if (ide_set_dma(drive) || hwif->ide_dma_on(drive))
			err = -EIO;
	} else
		ide_dma_off(drive);
	return 0;

	/*
	 * lock, clear ->busy flag and unlock before leaving
	 */
	spin_lock_irq(&ide_lock);
	hwif->hwgroup->busy = 0;
	spin_unlock_irq(&ide_lock);
out:
	return err;
#else
	return -EPERM;
#endif
+2 −1
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ static int config_chipset_for_dma(ide_drive_t *drive)
		printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name);
	}

	if (drive->media != ide_disk)
	if (drive->media != ide_disk && drive->media != ide_cdrom)
		return 0;

	if (id->capability & 4) {
@@ -545,6 +545,7 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)

	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;

	hwif->atapi_dma  = 1;
	hwif->ultra_mask = 0x7f;
	hwif->mwdma_mask = 0x07;

Loading