diff options
author | Tejun Heo <htejun@gmail.com> | 2007-08-06 05:36:23 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:30 -0400 |
commit | f58229f8060055b08b34008ea08f31de1e2f003c (patch) | |
tree | 6ca5ef546671cb975ef3632fb032c238eaf1bb4c /drivers/ata/libata-scsi.c | |
parent | 9af5c9c97dc9d599281778864c72b385f0c63341 (diff) |
libata-link: implement and use link/device iterators
Multiple links and different number of devices per link should be
considered to iterate over links and devices. This patch implements
and uses link and device iterators - ata_port_for_each_link() and
ata_link_for_each_dev() - and ata_link_max_devices().
This change makes a lot of functions iterate over only possible
devices instead of from dev 0 to dev ATA_MAX_DEVICES. All such
changes have been examined and nothing should be broken.
While at it, add a separating comment before device helpers to
distinguish them better from link helpers and others.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-scsi.c')
-rw-r--r-- | drivers/ata/libata-scsi.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index ec0e2638200e..3d6d5f737994 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -2425,7 +2425,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2425 | 2425 | ||
2426 | static struct ata_device * ata_find_dev(struct ata_port *ap, int id) | 2426 | static struct ata_device * ata_find_dev(struct ata_port *ap, int id) |
2427 | { | 2427 | { |
2428 | if (likely(id < ATA_MAX_DEVICES)) | 2428 | if (likely(id < ata_link_max_devices(&ap->link))) |
2429 | return &ap->link.device[id]; | 2429 | return &ap->link.device[id]; |
2430 | return NULL; | 2430 | return NULL; |
2431 | } | 2431 | } |
@@ -2952,21 +2952,18 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync) | |||
2952 | int tries = 5; | 2952 | int tries = 5; |
2953 | struct ata_device *last_failed_dev = NULL; | 2953 | struct ata_device *last_failed_dev = NULL; |
2954 | struct ata_device *dev; | 2954 | struct ata_device *dev; |
2955 | unsigned int i; | ||
2956 | 2955 | ||
2957 | if (ap->flags & ATA_FLAG_DISABLED) | 2956 | if (ap->flags & ATA_FLAG_DISABLED) |
2958 | return; | 2957 | return; |
2959 | 2958 | ||
2960 | repeat: | 2959 | repeat: |
2961 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 2960 | ata_link_for_each_dev(dev, &ap->link) { |
2962 | struct scsi_device *sdev; | 2961 | struct scsi_device *sdev; |
2963 | 2962 | ||
2964 | dev = &ap->link.device[i]; | ||
2965 | |||
2966 | if (!ata_dev_enabled(dev) || dev->sdev) | 2963 | if (!ata_dev_enabled(dev) || dev->sdev) |
2967 | continue; | 2964 | continue; |
2968 | 2965 | ||
2969 | sdev = __scsi_add_device(ap->scsi_host, 0, i, 0, NULL); | 2966 | sdev = __scsi_add_device(ap->scsi_host, 0, dev->devno, 0, NULL); |
2970 | if (!IS_ERR(sdev)) { | 2967 | if (!IS_ERR(sdev)) { |
2971 | dev->sdev = sdev; | 2968 | dev->sdev = sdev; |
2972 | scsi_device_put(sdev); | 2969 | scsi_device_put(sdev); |
@@ -2977,12 +2974,11 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync) | |||
2977 | * failure occurred, scan would have failed silently. Check | 2974 | * failure occurred, scan would have failed silently. Check |
2978 | * whether all devices are attached. | 2975 | * whether all devices are attached. |
2979 | */ | 2976 | */ |
2980 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 2977 | ata_link_for_each_dev(dev, &ap->link) { |
2981 | dev = &ap->link.device[i]; | ||
2982 | if (ata_dev_enabled(dev) && !dev->sdev) | 2978 | if (ata_dev_enabled(dev) && !dev->sdev) |
2983 | break; | 2979 | break; |
2984 | } | 2980 | } |
2985 | if (i == ATA_MAX_DEVICES) | 2981 | if (!dev) |
2986 | return; | 2982 | return; |
2987 | 2983 | ||
2988 | /* we're missing some SCSI devices */ | 2984 | /* we're missing some SCSI devices */ |
@@ -3112,7 +3108,7 @@ void ata_scsi_hotplug(struct work_struct *work) | |||
3112 | { | 3108 | { |
3113 | struct ata_port *ap = | 3109 | struct ata_port *ap = |
3114 | container_of(work, struct ata_port, hotplug_task.work); | 3110 | container_of(work, struct ata_port, hotplug_task.work); |
3115 | int i; | 3111 | struct ata_device *dev; |
3116 | 3112 | ||
3117 | if (ap->pflags & ATA_PFLAG_UNLOADING) { | 3113 | if (ap->pflags & ATA_PFLAG_UNLOADING) { |
3118 | DPRINTK("ENTER/EXIT - unloading\n"); | 3114 | DPRINTK("ENTER/EXIT - unloading\n"); |
@@ -3122,8 +3118,7 @@ void ata_scsi_hotplug(struct work_struct *work) | |||
3122 | DPRINTK("ENTER\n"); | 3118 | DPRINTK("ENTER\n"); |
3123 | 3119 | ||
3124 | /* unplug detached devices */ | 3120 | /* unplug detached devices */ |
3125 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 3121 | ata_link_for_each_dev(dev, &ap->link) { |
3126 | struct ata_device *dev = &ap->link.device[i]; | ||
3127 | unsigned long flags; | 3122 | unsigned long flags; |
3128 | 3123 | ||
3129 | if (!(dev->flags & ATA_DFLAG_DETACHED)) | 3124 | if (!(dev->flags & ATA_DFLAG_DETACHED)) |
@@ -3176,7 +3171,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, | |||
3176 | spin_lock_irqsave(ap->lock, flags); | 3171 | spin_lock_irqsave(ap->lock, flags); |
3177 | 3172 | ||
3178 | if (id == SCAN_WILD_CARD) { | 3173 | if (id == SCAN_WILD_CARD) { |
3179 | ehi->probe_mask |= (1 << ATA_MAX_DEVICES) - 1; | 3174 | ehi->probe_mask |= (1 << ata_link_max_devices(&ap->link)) - 1; |
3180 | ehi->action |= ATA_EH_SOFTRESET; | 3175 | ehi->action |= ATA_EH_SOFTRESET; |
3181 | } else { | 3176 | } else { |
3182 | struct ata_device *dev = ata_find_dev(ap, id); | 3177 | struct ata_device *dev = ata_find_dev(ap, id); |
@@ -3215,13 +3210,12 @@ void ata_scsi_dev_rescan(struct work_struct *work) | |||
3215 | { | 3210 | { |
3216 | struct ata_port *ap = | 3211 | struct ata_port *ap = |
3217 | container_of(work, struct ata_port, scsi_rescan_task); | 3212 | container_of(work, struct ata_port, scsi_rescan_task); |
3213 | struct ata_device *dev; | ||
3218 | unsigned long flags; | 3214 | unsigned long flags; |
3219 | unsigned int i; | ||
3220 | 3215 | ||
3221 | spin_lock_irqsave(ap->lock, flags); | 3216 | spin_lock_irqsave(ap->lock, flags); |
3222 | 3217 | ||
3223 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 3218 | ata_link_for_each_dev(dev, &ap->link) { |
3224 | struct ata_device *dev = &ap->link.device[i]; | ||
3225 | struct scsi_device *sdev = dev->sdev; | 3219 | struct scsi_device *sdev = dev->sdev; |
3226 | 3220 | ||
3227 | if (!ata_dev_enabled(dev) || !sdev) | 3221 | if (!ata_dev_enabled(dev) || !sdev) |