diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 22:52:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 22:52:57 -0400 |
commit | 426048313dfa7d65dbd2379b1665755511f9544f (patch) | |
tree | dc727b9e41eb3d9dfe8e68f14b027c776d8aba98 /drivers/scsi/libsas/sas_port.c | |
parent | 2a56d2220284b0e4dd8569fa475d7053f1c40a63 (diff) | |
parent | 7ad20aa9d39a525542b0840ac38bfc77be831e19 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (60 commits)
[SCSI] lpfc 8.3.24: Extend BSG infrastructure and add link diagnostics
[SCSI] lpfc 8.3.24: Add resource extent support
[SCSI] lpfc 8.3.24: Add request-firmware support
[SCSI] lpfc 8.3.24: Add SR-IOV control
[SCSI] lpfc 8.3.24: Extended hardware support and support dump images
[SCSI] lpfc 8.3.24: Miscellaneous Fixes and Corrections
[SCSI] libsas: Add option for SATA soft reset
[SCSI] libsas: check dev->gone before submitting sata i/o
[SCSI] libsas: fix/amend device gone notification in sas_deform_port()
[SCSI] MAINTAINERS update for SCSI (new email address)
[SCSI] Fix Ultrastor asm snippet
[SCSI] osst: fix warning
[SCSI] osst: wrong index used in inner loop
[SCSI] aic94xx: world-writable sysfs update_bios file
[SCSI] MAINTAINERS: Add drivers/target/ entry
[SCSI] target: Convert TASK_ATTR to scsi_tcq.h definitions
[SCSI] target: Convert REPORT_LUNs to use int_to_scsilun
[SCSI] target: Fix task->task_execute_queue=1 clear bug + LUN_RESET OOPs
[SCSI] target: Fix bug with task_sg chained transport_free_dev_tasks release
[SCSI] target: Fix interrupt context bug with stats_lock and core_tmr_alloc_req
...
Diffstat (limited to 'drivers/scsi/libsas/sas_port.c')
-rw-r--r-- | drivers/scsi/libsas/sas_port.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c index 5257fdfe699..42fd1f25b66 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c | |||
@@ -57,7 +57,7 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
57 | 57 | ||
58 | if (port) { | 58 | if (port) { |
59 | if (!phy_is_wideport_member(port, phy)) | 59 | if (!phy_is_wideport_member(port, phy)) |
60 | sas_deform_port(phy); | 60 | sas_deform_port(phy, 0); |
61 | else { | 61 | else { |
62 | SAS_DPRINTK("%s: phy%d belongs to port%d already(%d)!\n", | 62 | SAS_DPRINTK("%s: phy%d belongs to port%d already(%d)!\n", |
63 | __func__, phy->id, phy->port->id, | 63 | __func__, phy->id, phy->port->id, |
@@ -153,28 +153,31 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
153 | * This is called when the physical link to the other phy has been | 153 | * This is called when the physical link to the other phy has been |
154 | * lost (on this phy), in Event thread context. We cannot delay here. | 154 | * lost (on this phy), in Event thread context. We cannot delay here. |
155 | */ | 155 | */ |
156 | void sas_deform_port(struct asd_sas_phy *phy) | 156 | void sas_deform_port(struct asd_sas_phy *phy, int gone) |
157 | { | 157 | { |
158 | struct sas_ha_struct *sas_ha = phy->ha; | 158 | struct sas_ha_struct *sas_ha = phy->ha; |
159 | struct asd_sas_port *port = phy->port; | 159 | struct asd_sas_port *port = phy->port; |
160 | struct sas_internal *si = | 160 | struct sas_internal *si = |
161 | to_sas_internal(sas_ha->core.shost->transportt); | 161 | to_sas_internal(sas_ha->core.shost->transportt); |
162 | struct domain_device *dev; | ||
162 | unsigned long flags; | 163 | unsigned long flags; |
163 | 164 | ||
164 | if (!port) | 165 | if (!port) |
165 | return; /* done by a phy event */ | 166 | return; /* done by a phy event */ |
166 | 167 | ||
167 | if (port->port_dev) | 168 | dev = port->port_dev; |
168 | port->port_dev->pathways--; | 169 | if (dev) |
170 | dev->pathways--; | ||
169 | 171 | ||
170 | if (port->num_phys == 1) { | 172 | if (port->num_phys == 1) { |
173 | if (dev && gone) | ||
174 | dev->gone = 1; | ||
171 | sas_unregister_domain_devices(port); | 175 | sas_unregister_domain_devices(port); |
172 | sas_port_delete(port->port); | 176 | sas_port_delete(port->port); |
173 | port->port = NULL; | 177 | port->port = NULL; |
174 | } else | 178 | } else |
175 | sas_port_delete_phy(port->port, phy->phy); | 179 | sas_port_delete_phy(port->port, phy->phy); |
176 | 180 | ||
177 | |||
178 | if (si->dft->lldd_port_deformed) | 181 | if (si->dft->lldd_port_deformed) |
179 | si->dft->lldd_port_deformed(phy); | 182 | si->dft->lldd_port_deformed(phy); |
180 | 183 | ||
@@ -244,7 +247,7 @@ void sas_porte_link_reset_err(struct work_struct *work) | |||
244 | sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock, | 247 | sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock, |
245 | &phy->port_events_pending); | 248 | &phy->port_events_pending); |
246 | 249 | ||
247 | sas_deform_port(phy); | 250 | sas_deform_port(phy, 1); |
248 | } | 251 | } |
249 | 252 | ||
250 | void sas_porte_timer_event(struct work_struct *work) | 253 | void sas_porte_timer_event(struct work_struct *work) |
@@ -256,7 +259,7 @@ void sas_porte_timer_event(struct work_struct *work) | |||
256 | sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock, | 259 | sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock, |
257 | &phy->port_events_pending); | 260 | &phy->port_events_pending); |
258 | 261 | ||
259 | sas_deform_port(phy); | 262 | sas_deform_port(phy, 1); |
260 | } | 263 | } |
261 | 264 | ||
262 | void sas_porte_hard_reset(struct work_struct *work) | 265 | void sas_porte_hard_reset(struct work_struct *work) |
@@ -268,7 +271,7 @@ void sas_porte_hard_reset(struct work_struct *work) | |||
268 | sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock, | 271 | sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock, |
269 | &phy->port_events_pending); | 272 | &phy->port_events_pending); |
270 | 273 | ||
271 | sas_deform_port(phy); | 274 | sas_deform_port(phy, 1); |
272 | } | 275 | } |
273 | 276 | ||
274 | /* ---------- SAS port registration ---------- */ | 277 | /* ---------- SAS port registration ---------- */ |
@@ -306,6 +309,6 @@ void sas_unregister_ports(struct sas_ha_struct *sas_ha) | |||
306 | 309 | ||
307 | for (i = 0; i < sas_ha->num_phys; i++) | 310 | for (i = 0; i < sas_ha->num_phys; i++) |
308 | if (sas_ha->sas_phy[i]->port) | 311 | if (sas_ha->sas_phy[i]->port) |
309 | sas_deform_port(sas_ha->sas_phy[i]); | 312 | sas_deform_port(sas_ha->sas_phy[i], 0); |
310 | 313 | ||
311 | } | 314 | } |