diff options
| author | Albert Lee <albertcc@tw.ibm.com> | 2006-03-27 03:39:18 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-03-29 19:30:28 -0500 |
| commit | 00b6f5e9e04b2186a71a5892640bb2d8e09a030e (patch) | |
| tree | f486ef99a0a7e5db563176eda559a8a332297df1 | |
| parent | 17efc5f7237995295cbe008828788d187fea3c88 (diff) | |
[PATCH] libata: ata_dev_init_params() fixes
ata_dev_init_params() fixes:
- Get the "heads" and "sectors" parameters from caller instead of implicitly from dev->id[].
- Return AC_ERR_INVALID instead of 0 if an invalid parameter is found
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
| -rw-r--r-- | drivers/scsi/libata-core.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index ac19505f7f1f..21b0ed583b8a 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -62,7 +62,9 @@ | |||
| 62 | #include "libata.h" | 62 | #include "libata.h" |
| 63 | 63 | ||
| 64 | static unsigned int ata_dev_init_params(struct ata_port *ap, | 64 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
| 65 | struct ata_device *dev); | 65 | struct ata_device *dev, |
| 66 | u16 heads, | ||
| 67 | u16 sectors); | ||
| 66 | static void ata_set_mode(struct ata_port *ap); | 68 | static void ata_set_mode(struct ata_port *ap); |
| 67 | static unsigned int ata_dev_set_xfermode(struct ata_port *ap, | 69 | static unsigned int ata_dev_set_xfermode(struct ata_port *ap, |
| 68 | struct ata_device *dev); | 70 | struct ata_device *dev); |
| @@ -1156,7 +1158,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev, | |||
| 1156 | * Some drives were very specific about that exact sequence. | 1158 | * Some drives were very specific about that exact sequence. |
| 1157 | */ | 1159 | */ |
| 1158 | if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) { | 1160 | if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) { |
| 1159 | err_mask = ata_dev_init_params(ap, dev); | 1161 | err_mask = ata_dev_init_params(ap, dev, id[3], id[6]); |
| 1160 | if (err_mask) { | 1162 | if (err_mask) { |
| 1161 | rc = -EIO; | 1163 | rc = -EIO; |
| 1162 | reason = "INIT_DEV_PARAMS failed"; | 1164 | reason = "INIT_DEV_PARAMS failed"; |
| @@ -2748,16 +2750,16 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap, | |||
| 2748 | */ | 2750 | */ |
| 2749 | 2751 | ||
| 2750 | static unsigned int ata_dev_init_params(struct ata_port *ap, | 2752 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
| 2751 | struct ata_device *dev) | 2753 | struct ata_device *dev, |
| 2754 | u16 heads, | ||
| 2755 | u16 sectors) | ||
| 2752 | { | 2756 | { |
| 2753 | struct ata_taskfile tf; | 2757 | struct ata_taskfile tf; |
| 2754 | unsigned int err_mask; | 2758 | unsigned int err_mask; |
| 2755 | u16 sectors = dev->id[6]; | ||
| 2756 | u16 heads = dev->id[3]; | ||
| 2757 | 2759 | ||
| 2758 | /* Number of sectors per track 1-255. Number of heads 1-16 */ | 2760 | /* Number of sectors per track 1-255. Number of heads 1-16 */ |
| 2759 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) | 2761 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) |
| 2760 | return 0; | 2762 | return AC_ERR_INVALID; |
| 2761 | 2763 | ||
| 2762 | /* set up init dev params taskfile */ | 2764 | /* set up init dev params taskfile */ |
| 2763 | DPRINTK("init dev params \n"); | 2765 | DPRINTK("init dev params \n"); |
