Browse Source

libata: set_mode, Fix the FIXME

When set_mode() changed ->set_mode didn't adapt. This makes the needed
changes and removes the relevant FIXME case.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Alan 18 years ago
parent
commit
b229a7b0ae

+ 4 - 2
drivers/ata/ata_generic.c

@@ -64,6 +64,7 @@ static void generic_error_handler(struct ata_port *ap)
 /**
 /**
  *	generic_set_mode	-	mode setting
  *	generic_set_mode	-	mode setting
  *	@ap: interface to set up
  *	@ap: interface to set up
+ *	@unused: returned device on error
  *
  *
  *	Use a non standard set_mode function. We don't want to be tuned.
  *	Use a non standard set_mode function. We don't want to be tuned.
  *	The BIOS configured everything. Our job is not to fiddle. We
  *	The BIOS configured everything. Our job is not to fiddle. We
@@ -71,7 +72,7 @@ static void generic_error_handler(struct ata_port *ap)
  *	and respect them.
  *	and respect them.
  */
  */
 
 
-static void generic_set_mode(struct ata_port *ap)
+static int generic_set_mode(struct ata_port *ap, struct ata_device **unused)
 {
 {
 	int dma_enabled = 0;
 	int dma_enabled = 0;
 	int i;
 	int i;
@@ -82,7 +83,7 @@ static void generic_set_mode(struct ata_port *ap)
 
 
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
 		struct ata_device *dev = &ap->device[i];
 		struct ata_device *dev = &ap->device[i];
-		if (ata_dev_enabled(dev)) {
+		if (ata_dev_ready(dev)) {
 			/* We don't really care */
 			/* We don't really care */
 			dev->pio_mode = XFER_PIO_0;
 			dev->pio_mode = XFER_PIO_0;
 			dev->dma_mode = XFER_MW_DMA_0;
 			dev->dma_mode = XFER_MW_DMA_0;
@@ -99,6 +100,7 @@ static void generic_set_mode(struct ata_port *ap)
 			}
 			}
 		}
 		}
 	}
 	}
+	return 0;
 }
 }
 
 
 static struct scsi_host_template generic_sht = {
 static struct scsi_host_template generic_sht = {

+ 2 - 12
drivers/ata/libata-core.c

@@ -2431,18 +2431,8 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
 	int i, rc = 0, used_dma = 0, found = 0;
 	int i, rc = 0, used_dma = 0, found = 0;
 
 
 	/* has private set_mode? */
 	/* has private set_mode? */
-	if (ap->ops->set_mode) {
-		/* FIXME: make ->set_mode handle no device case and
-		 * return error code and failing device on failure.
-		 */
-		for (i = 0; i < ATA_MAX_DEVICES; i++) {
-			if (ata_dev_ready(&ap->device[i])) {
-				ap->ops->set_mode(ap);
-				break;
-			}
-		}
-		return 0;
-	}
+	if (ap->ops->set_mode)
+		return ap->ops->set_mode(ap, r_failed_dev);
 
 
 	/* step 1: calculate xfer_mask */
 	/* step 1: calculate xfer_mask */
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {

+ 3 - 1
drivers/ata/pata_it821x.c

@@ -476,6 +476,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc)
 /**
 /**
  *	it821x_smart_set_mode	-	mode setting
  *	it821x_smart_set_mode	-	mode setting
  *	@ap: interface to set up
  *	@ap: interface to set up
+ *	@unused: device that failed (error only)
  *
  *
  *	Use a non standard set_mode function. We don't want to be tuned.
  *	Use a non standard set_mode function. We don't want to be tuned.
  *	The BIOS configured everything. Our job is not to fiddle. We
  *	The BIOS configured everything. Our job is not to fiddle. We
@@ -483,7 +484,7 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc)
  *	and respect them.
  *	and respect them.
  */
  */
 
 
-static void it821x_smart_set_mode(struct ata_port *ap)
+static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused)
 {
 {
 	int dma_enabled = 0;
 	int dma_enabled = 0;
 	int i;
 	int i;
@@ -512,6 +513,7 @@ static void it821x_smart_set_mode(struct ata_port *ap)
 			}
 			}
 		}
 		}
 	}
 	}
+	return 0;
 }
 }
 
 
 /**
 /**

+ 3 - 2
drivers/ata/pata_ixp4xx_cf.c

@@ -23,9 +23,9 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_host.h>
 
 
 #define DRV_NAME	"pata_ixp4xx_cf"
 #define DRV_NAME	"pata_ixp4xx_cf"
-#define DRV_VERSION	"0.1.1"
+#define DRV_VERSION	"0.1.1ac1"
 
 
-static void ixp4xx_set_mode(struct ata_port *ap)
+static int ixp4xx_set_mode(struct ata_port *ap, struct ata_device *adev)
 {
 {
 	int i;
 	int i;
 
 
@@ -38,6 +38,7 @@ static void ixp4xx_set_mode(struct ata_port *ap)
 			dev->flags |= ATA_DFLAG_PIO;
 			dev->flags |= ATA_DFLAG_PIO;
 		}
 		}
 	}
 	}
+	return 0;
 }
 }
 
 
 static void ixp4xx_phy_reset(struct ata_port *ap)
 static void ixp4xx_phy_reset(struct ata_port *ap)

+ 3 - 1
drivers/ata/pata_legacy.c

@@ -96,6 +96,7 @@ static int pio_mask = 0x1F;		/* PIO range for autospeed devices */
 /**
 /**
  *	legacy_set_mode		-	mode setting
  *	legacy_set_mode		-	mode setting
  *	@ap: IDE interface
  *	@ap: IDE interface
+ *	@unused: Device that failed when error is returned
  *
  *
  *	Use a non standard set_mode function. We don't want to be tuned.
  *	Use a non standard set_mode function. We don't want to be tuned.
  *
  *
@@ -105,7 +106,7 @@ static int pio_mask = 0x1F;		/* PIO range for autospeed devices */
  *	expand on this as per hdparm in the base kernel.
  *	expand on this as per hdparm in the base kernel.
  */
  */
 
 
-static void legacy_set_mode(struct ata_port *ap)
+static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
 {
 {
 	int i;
 	int i;
 
 
@@ -118,6 +119,7 @@ static void legacy_set_mode(struct ata_port *ap)
 			dev->flags |= ATA_DFLAG_PIO;
 			dev->flags |= ATA_DFLAG_PIO;
 		}
 		}
 	}
 	}
+	return 0;
 }
 }
 
 
 static struct scsi_host_template legacy_sht = {
 static struct scsi_host_template legacy_sht = {

+ 4 - 2
drivers/ata/pata_rz1000.c

@@ -52,19 +52,20 @@ static void rz1000_error_handler(struct ata_port *ap)
 /**
 /**
  *	rz1000_set_mode		-	mode setting function
  *	rz1000_set_mode		-	mode setting function
  *	@ap: ATA interface
  *	@ap: ATA interface
+ *	@unused: returned device on set_mode failure
  *
  *
  *	Use a non standard set_mode function. We don't want to be tuned. We
  *	Use a non standard set_mode function. We don't want to be tuned. We
  *	would prefer to be BIOS generic but for the fact our hardware is
  *	would prefer to be BIOS generic but for the fact our hardware is
  *	whacked out.
  *	whacked out.
  */
  */
 
 
-static void rz1000_set_mode(struct ata_port *ap)
+static int rz1000_set_mode(struct ata_port *ap, struct ata_device **unused)
 {
 {
 	int i;
 	int i;
 
 
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
 		struct ata_device *dev = &ap->device[i];
 		struct ata_device *dev = &ap->device[i];
-		if (ata_dev_enabled(dev)) {
+		if (ata_dev_ready(dev)) {
 			/* We don't really care */
 			/* We don't really care */
 			dev->pio_mode = XFER_PIO_0;
 			dev->pio_mode = XFER_PIO_0;
 			dev->xfer_mode = XFER_PIO_0;
 			dev->xfer_mode = XFER_PIO_0;
@@ -72,6 +73,7 @@ static void rz1000_set_mode(struct ata_port *ap)
 			dev->flags |= ATA_DFLAG_PIO;
 			dev->flags |= ATA_DFLAG_PIO;
 		}
 		}
 	}
 	}
+	return 0;
 }
 }
 
 
 
 

+ 2 - 2
include/linux/libata.h

@@ -612,11 +612,11 @@ struct ata_port_operations {
 	void (*dev_select)(struct ata_port *ap, unsigned int device);
 	void (*dev_select)(struct ata_port *ap, unsigned int device);
 
 
 	void (*phy_reset) (struct ata_port *ap); /* obsolete */
 	void (*phy_reset) (struct ata_port *ap); /* obsolete */
-	void (*set_mode) (struct ata_port *ap);
+	int  (*set_mode) (struct ata_port *ap, struct ata_device **r_failed_dev);
 
 
 	void (*post_set_mode) (struct ata_port *ap);
 	void (*post_set_mode) (struct ata_port *ap);
 
 
-	int (*check_atapi_dma) (struct ata_queued_cmd *qc);
+	int  (*check_atapi_dma) (struct ata_queued_cmd *qc);
 
 
 	void (*bmdma_setup) (struct ata_queued_cmd *qc);
 	void (*bmdma_setup) (struct ata_queued_cmd *qc);
 	void (*bmdma_start) (struct ata_queued_cmd *qc);
 	void (*bmdma_start) (struct ata_queued_cmd *qc);