diff options
author | Tejun Heo <htejun@gmail.com> | 2006-02-15 04:24:09 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2006-02-20 05:07:52 -0500 |
commit | 6aff8f1f07a7fff48121d1ad4a550f3af24ccc81 (patch) | |
tree | 3b02003f45b43c81b395c4a07e8c708599304bdd /drivers/scsi/libata-core.c | |
parent | 6a62a04d4705df4f9f9bee39e889b9e920eeca47 (diff) |
[PATCH] libata: update ata_dev_init_params()
Update ata_dev_init_params() such that it doesn't disable port
directly but return with appropriate error mask on failure. This is
preparation for splitting ata_dev_identify(). Note that this patch
changes behavior of dev_init_params failure such that only failing
devices are taken offline not the whole port. This change is
intended.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/scsi/libata-core.c')
-rw-r--r-- | drivers/scsi/libata-core.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index d694b20e81bf..76621463b499 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -62,7 +62,8 @@ | |||
62 | #include "libata.h" | 62 | #include "libata.h" |
63 | 63 | ||
64 | static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev); | 64 | static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev); |
65 | static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev); | 65 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
66 | struct ata_device *dev); | ||
66 | static void ata_set_mode(struct ata_port *ap); | 67 | static void ata_set_mode(struct ata_port *ap); |
67 | static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev); | 68 | static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev); |
68 | static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift); | 69 | static unsigned int ata_get_mode_mask(const struct ata_port *ap, int shift); |
@@ -1041,7 +1042,12 @@ retry: | |||
1041 | * Some drives were very specific about that exact sequence. | 1042 | * Some drives were very specific about that exact sequence. |
1042 | */ | 1043 | */ |
1043 | if (major_version < 4 || (!ata_id_has_lba(dev->id))) { | 1044 | if (major_version < 4 || (!ata_id_has_lba(dev->id))) { |
1044 | ata_dev_init_params(ap, dev); | 1045 | err_mask = ata_dev_init_params(ap, dev); |
1046 | if (err_mask) { | ||
1047 | printk(KERN_ERR "ata%u: failed to init " | ||
1048 | "parameters, disabled\n", ap->id); | ||
1049 | goto err_out; | ||
1050 | } | ||
1045 | 1051 | ||
1046 | /* current CHS translation info (id[53-58]) might be | 1052 | /* current CHS translation info (id[53-58]) might be |
1047 | * changed. reread the identify device info. | 1053 | * changed. reread the identify device info. |
@@ -2530,17 +2536,23 @@ err_out: | |||
2530 | * @dev: Device to which command will be sent | 2536 | * @dev: Device to which command will be sent |
2531 | * | 2537 | * |
2532 | * LOCKING: | 2538 | * LOCKING: |
2539 | * Kernel thread context (may sleep) | ||
2540 | * | ||
2541 | * RETURNS: | ||
2542 | * 0 on success, AC_ERR_* mask otherwise. | ||
2533 | */ | 2543 | */ |
2534 | 2544 | ||
2535 | static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev) | 2545 | static unsigned int ata_dev_init_params(struct ata_port *ap, |
2546 | struct ata_device *dev) | ||
2536 | { | 2547 | { |
2537 | struct ata_taskfile tf; | 2548 | struct ata_taskfile tf; |
2549 | unsigned int err_mask; | ||
2538 | u16 sectors = dev->id[6]; | 2550 | u16 sectors = dev->id[6]; |
2539 | u16 heads = dev->id[3]; | 2551 | u16 heads = dev->id[3]; |
2540 | 2552 | ||
2541 | /* Number of sectors per track 1-255. Number of heads 1-16 */ | 2553 | /* Number of sectors per track 1-255. Number of heads 1-16 */ |
2542 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) | 2554 | if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16) |
2543 | return; | 2555 | return 0; |
2544 | 2556 | ||
2545 | /* set up init dev params taskfile */ | 2557 | /* set up init dev params taskfile */ |
2546 | DPRINTK("init dev params \n"); | 2558 | DPRINTK("init dev params \n"); |
@@ -2552,13 +2564,10 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev) | |||
2552 | tf.nsect = sectors; | 2564 | tf.nsect = sectors; |
2553 | tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */ | 2565 | tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */ |
2554 | 2566 | ||
2555 | if (ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0)) { | 2567 | err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); |
2556 | printk(KERN_ERR "ata%u: failed to init parameters, disabled\n", | ||
2557 | ap->id); | ||
2558 | ata_port_disable(ap); | ||
2559 | } | ||
2560 | 2568 | ||
2561 | DPRINTK("EXIT\n"); | 2569 | DPRINTK("EXIT, err_mask=%x\n", err_mask); |
2570 | return err_mask; | ||
2562 | } | 2571 | } |
2563 | 2572 | ||
2564 | /** | 2573 | /** |