xref: /openbmc/linux/drivers/message/fusion/mptsas.c (revision 0c380187)
1 /*
2  *  linux/drivers/message/fusion/mptsas.c
3  *      For use with LSI PCI chip/adapter(s)
4  *      running LSI Fusion MPT (Message Passing Technology) firmware.
5  *
6  *  Copyright (c) 1999-2008 LSI Corporation
7  *  (mailto:DL-MPTFusionLinux@lsi.com)
8  */
9 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
10 /*
11     This program is free software; you can redistribute it and/or modify
12     it under the terms of the GNU General Public License as published by
13     the Free Software Foundation; version 2 of the License.
14 
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
19 
20     NO WARRANTY
21     THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
22     CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
23     LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
24     MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
25     solely responsible for determining the appropriateness of using and
26     distributing the Program and assumes all risks associated with its
27     exercise of rights under this Agreement, including but not limited to
28     the risks and costs of program errors, damage to or loss of data,
29     programs or equipment, and unavailability or interruption of operations.
30 
31     DISCLAIMER OF LIABILITY
32     NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
33     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34     DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
35     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
36     TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
37     USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
38     HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
39 
40     You should have received a copy of the GNU General Public License
41     along with this program; if not, write to the Free Software
42     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
43 */
44 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
45 
46 #include <linux/module.h>
47 #include <linux/kernel.h>
48 #include <linux/slab.h>
49 #include <linux/init.h>
50 #include <linux/errno.h>
51 #include <linux/jiffies.h>
52 #include <linux/workqueue.h>
53 #include <linux/delay.h>	/* for mdelay */
54 
55 #include <scsi/scsi.h>
56 #include <scsi/scsi_cmnd.h>
57 #include <scsi/scsi_device.h>
58 #include <scsi/scsi_host.h>
59 #include <scsi/scsi_transport_sas.h>
60 #include <scsi/scsi_transport.h>
61 #include <scsi/scsi_dbg.h>
62 
63 #include "mptbase.h"
64 #include "mptscsih.h"
65 #include "mptsas.h"
66 
67 
68 #define my_NAME		"Fusion MPT SAS Host driver"
69 #define my_VERSION	MPT_LINUX_VERSION_COMMON
70 #define MYNAM		"mptsas"
71 
72 /*
73  * Reserved channel for integrated raid
74  */
75 #define MPTSAS_RAID_CHANNEL	1
76 
77 #define SAS_CONFIG_PAGE_TIMEOUT		30
78 MODULE_AUTHOR(MODULEAUTHOR);
79 MODULE_DESCRIPTION(my_NAME);
80 MODULE_LICENSE("GPL");
81 MODULE_VERSION(my_VERSION);
82 
83 static int mpt_pt_clear;
84 module_param(mpt_pt_clear, int, 0);
85 MODULE_PARM_DESC(mpt_pt_clear,
86 		" Clear persistency table: enable=1  "
87 		"(default=MPTSCSIH_PT_CLEAR=0)");
88 
89 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
90 #define MPTSAS_MAX_LUN (16895)
91 static int max_lun = MPTSAS_MAX_LUN;
92 module_param(max_lun, int, 0);
93 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
94 
95 static int mpt_loadtime_max_sectors = 8192;
96 module_param(mpt_loadtime_max_sectors, int, 0);
97 MODULE_PARM_DESC(mpt_loadtime_max_sectors,
98 		" Maximum sector define for Host Bus Adaptor.Range 64 to 8192 default=8192");
99 
100 static u8	mptsasDoneCtx = MPT_MAX_PROTOCOL_DRIVERS;
101 static u8	mptsasTaskCtx = MPT_MAX_PROTOCOL_DRIVERS;
102 static u8	mptsasInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; /* Used only for internal commands */
103 static u8	mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;
104 static u8	mptsasDeviceResetCtx = MPT_MAX_PROTOCOL_DRIVERS;
105 
106 static void mptsas_firmware_event_work(struct work_struct *work);
107 static void mptsas_send_sas_event(struct fw_event_work *fw_event);
108 static void mptsas_send_raid_event(struct fw_event_work *fw_event);
109 static void mptsas_send_ir2_event(struct fw_event_work *fw_event);
110 static void mptsas_parse_device_info(struct sas_identify *identify,
111 		struct mptsas_devinfo *device_info);
112 static inline void mptsas_set_rphy(MPT_ADAPTER *ioc,
113 		struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy);
114 static struct mptsas_phyinfo	*mptsas_find_phyinfo_by_sas_address
115 		(MPT_ADAPTER *ioc, u64 sas_address);
116 static int mptsas_sas_device_pg0(MPT_ADAPTER *ioc,
117 	struct mptsas_devinfo *device_info, u32 form, u32 form_specific);
118 static int mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc,
119 	struct mptsas_enclosure *enclosure, u32 form, u32 form_specific);
120 static int mptsas_add_end_device(MPT_ADAPTER *ioc,
121 	struct mptsas_phyinfo *phy_info);
122 static void mptsas_del_end_device(MPT_ADAPTER *ioc,
123 	struct mptsas_phyinfo *phy_info);
124 static void mptsas_send_link_status_event(struct fw_event_work *fw_event);
125 static struct mptsas_portinfo	*mptsas_find_portinfo_by_sas_address
126 		(MPT_ADAPTER *ioc, u64 sas_address);
127 static void mptsas_expander_delete(MPT_ADAPTER *ioc,
128 		struct mptsas_portinfo *port_info, u8 force);
129 static void mptsas_send_expander_event(struct fw_event_work *fw_event);
130 static void mptsas_not_responding_devices(MPT_ADAPTER *ioc);
131 static void mptsas_scan_sas_topology(MPT_ADAPTER *ioc);
132 static void mptsas_broadcast_primative_work(struct fw_event_work *fw_event);
133 static void mptsas_handle_queue_full_event(struct fw_event_work *fw_event);
134 static void mptsas_volume_delete(MPT_ADAPTER *ioc, u8 id);
135 void	mptsas_schedule_target_reset(void *ioc);
136 
137 static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
138 					MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
139 {
140 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
141 	    "---- IO UNIT PAGE 0 ------------\n", ioc->name));
142 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
143 	    ioc->name, le16_to_cpu(phy_data->AttachedDeviceHandle)));
144 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Controller Handle=0x%X\n",
145 	    ioc->name, le16_to_cpu(phy_data->ControllerDevHandle)));
146 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port=0x%X\n",
147 	    ioc->name, phy_data->Port));
148 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Port Flags=0x%X\n",
149 	    ioc->name, phy_data->PortFlags));
150 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Flags=0x%X\n",
151 	    ioc->name, phy_data->PhyFlags));
152 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
153 	    ioc->name, phy_data->NegotiatedLinkRate));
154 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
155 	    "Controller PHY Device Info=0x%X\n", ioc->name,
156 	    le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
157 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DiscoveryStatus=0x%X\n\n",
158 	    ioc->name, le32_to_cpu(phy_data->DiscoveryStatus)));
159 }
160 
161 static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
162 {
163 	__le64 sas_address;
164 
165 	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
166 
167 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
168 	    "---- SAS PHY PAGE 0 ------------\n", ioc->name));
169 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
170 	    "Attached Device Handle=0x%X\n", ioc->name,
171 	    le16_to_cpu(pg0->AttachedDevHandle)));
172 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
173 	    ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
174 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
175 	    "Attached PHY Identifier=0x%X\n", ioc->name,
176 	    pg0->AttachedPhyIdentifier));
177 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Attached Device Info=0x%X\n",
178 	    ioc->name, le32_to_cpu(pg0->AttachedDeviceInfo)));
179 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
180 	    ioc->name,  pg0->ProgrammedLinkRate));
181 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Change Count=0x%X\n",
182 	    ioc->name, pg0->ChangeCount));
183 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Info=0x%X\n\n",
184 	    ioc->name, le32_to_cpu(pg0->PhyInfo)));
185 }
186 
187 static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
188 {
189 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
190 	    "---- SAS PHY PAGE 1 ------------\n", ioc->name));
191 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Invalid Dword Count=0x%x\n",
192 	    ioc->name,  pg1->InvalidDwordCount));
193 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
194 	    "Running Disparity Error Count=0x%x\n", ioc->name,
195 	    pg1->RunningDisparityErrorCount));
196 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
197 	    "Loss Dword Synch Count=0x%x\n", ioc->name,
198 	    pg1->LossDwordSynchCount));
199 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
200 	    "PHY Reset Problem Count=0x%x\n\n", ioc->name,
201 	    pg1->PhyResetProblemCount));
202 }
203 
204 static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
205 {
206 	__le64 sas_address;
207 
208 	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
209 
210 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
211 	    "---- SAS DEVICE PAGE 0 ---------\n", ioc->name));
212 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handle=0x%X\n",
213 	    ioc->name, le16_to_cpu(pg0->DevHandle)));
214 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Handle=0x%X\n",
215 	    ioc->name, le16_to_cpu(pg0->ParentDevHandle)));
216 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Enclosure Handle=0x%X\n",
217 	    ioc->name, le16_to_cpu(pg0->EnclosureHandle)));
218 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Slot=0x%X\n",
219 	    ioc->name, le16_to_cpu(pg0->Slot)));
220 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SAS Address=0x%llX\n",
221 	    ioc->name, (unsigned long long)le64_to_cpu(sas_address)));
222 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Target ID=0x%X\n",
223 	    ioc->name, pg0->TargetID));
224 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Bus=0x%X\n",
225 	    ioc->name, pg0->Bus));
226 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Parent Phy Num=0x%X\n",
227 	    ioc->name, pg0->PhyNum));
228 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Access Status=0x%X\n",
229 	    ioc->name, le16_to_cpu(pg0->AccessStatus)));
230 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Device Info=0x%X\n",
231 	    ioc->name, le32_to_cpu(pg0->DeviceInfo)));
232 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Flags=0x%X\n",
233 	    ioc->name, le16_to_cpu(pg0->Flags)));
234 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n\n",
235 	    ioc->name, pg0->PhysicalPort));
236 }
237 
238 static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
239 {
240 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
241 	    "---- SAS EXPANDER PAGE 1 ------------\n", ioc->name));
242 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Physical Port=0x%X\n",
243 	    ioc->name, pg1->PhysicalPort));
244 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PHY Identifier=0x%X\n",
245 	    ioc->name, pg1->PhyIdentifier));
246 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Negotiated Link Rate=0x%X\n",
247 	    ioc->name, pg1->NegotiatedLinkRate));
248 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Programmed Link Rate=0x%X\n",
249 	    ioc->name, pg1->ProgrammedLinkRate));
250 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Hardware Link Rate=0x%X\n",
251 	    ioc->name, pg1->HwLinkRate));
252 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Owner Device Handle=0x%X\n",
253 	    ioc->name, le16_to_cpu(pg1->OwnerDevHandle)));
254 	dsasprintk(ioc, printk(MYIOC_s_DEBUG_FMT
255 	    "Attached Device Handle=0x%X\n\n", ioc->name,
256 	    le16_to_cpu(pg1->AttachedDevHandle)));
257 }
258 
259 /* inhibit sas firmware event handling */
260 static void
261 mptsas_fw_event_off(MPT_ADAPTER *ioc)
262 {
263 	unsigned long flags;
264 
265 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
266 	ioc->fw_events_off = 1;
267 	ioc->sas_discovery_quiesce_io = 0;
268 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
269 
270 }
271 
272 /* enable sas firmware event handling */
273 static void
274 mptsas_fw_event_on(MPT_ADAPTER *ioc)
275 {
276 	unsigned long flags;
277 
278 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
279 	ioc->fw_events_off = 0;
280 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
281 }
282 
283 /* queue a sas firmware event */
284 static void
285 mptsas_add_fw_event(MPT_ADAPTER *ioc, struct fw_event_work *fw_event,
286     unsigned long delay)
287 {
288 	unsigned long flags;
289 
290 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
291 	list_add_tail(&fw_event->list, &ioc->fw_event_list);
292 	INIT_DELAYED_WORK(&fw_event->work, mptsas_firmware_event_work);
293 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: add (fw_event=0x%p)"
294 		"on cpuid %d\n", ioc->name, __func__,
295 		fw_event, smp_processor_id()));
296 	queue_delayed_work_on(smp_processor_id(), ioc->fw_event_q,
297 	    &fw_event->work, delay);
298 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
299 }
300 
301 /* requeue a sas firmware event */
302 static void
303 mptsas_requeue_fw_event(MPT_ADAPTER *ioc, struct fw_event_work *fw_event,
304     unsigned long delay)
305 {
306 	unsigned long flags;
307 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
308 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: reschedule task "
309 	    "(fw_event=0x%p)on cpuid %d\n", ioc->name, __func__,
310 		fw_event, smp_processor_id()));
311 	fw_event->retries++;
312 	queue_delayed_work_on(smp_processor_id(), ioc->fw_event_q,
313 	    &fw_event->work, msecs_to_jiffies(delay));
314 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
315 }
316 
317 /* free memory associated to a sas firmware event */
318 static void
319 mptsas_free_fw_event(MPT_ADAPTER *ioc, struct fw_event_work *fw_event)
320 {
321 	unsigned long flags;
322 
323 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
324 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: kfree (fw_event=0x%p)\n",
325 	    ioc->name, __func__, fw_event));
326 	list_del(&fw_event->list);
327 	kfree(fw_event);
328 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
329 }
330 
331 /* walk the firmware event queue, and either stop or wait for
332  * outstanding events to complete */
333 static void
334 mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc)
335 {
336 	struct fw_event_work *fw_event, *next;
337 	struct mptsas_target_reset_event *target_reset_list, *n;
338 	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);
339 
340 	/* flush the target_reset_list */
341 	if (!list_empty(&hd->target_reset_list)) {
342 		list_for_each_entry_safe(target_reset_list, n,
343 		    &hd->target_reset_list, list) {
344 			dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
345 			    "%s: removing target reset for id=%d\n",
346 			    ioc->name, __func__,
347 			   target_reset_list->sas_event_data.TargetID));
348 			list_del(&target_reset_list->list);
349 			kfree(target_reset_list);
350 		}
351 	}
352 
353 	if (list_empty(&ioc->fw_event_list) ||
354 	     !ioc->fw_event_q || in_interrupt())
355 		return;
356 
357 	list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) {
358 		if (cancel_delayed_work(&fw_event->work))
359 			mptsas_free_fw_event(ioc, fw_event);
360 	}
361 }
362 
363 
364 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
365 {
366 	struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
367 	return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
368 }
369 
370 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
371 {
372 	struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
373 	return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
374 }
375 
376 /*
377  * mptsas_find_portinfo_by_handle
378  *
379  * This function should be called with the sas_topology_mutex already held
380  */
381 static struct mptsas_portinfo *
382 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
383 {
384 	struct mptsas_portinfo *port_info, *rc=NULL;
385 	int i;
386 
387 	list_for_each_entry(port_info, &ioc->sas_topology, list)
388 		for (i = 0; i < port_info->num_phys; i++)
389 			if (port_info->phy_info[i].identify.handle == handle) {
390 				rc = port_info;
391 				goto out;
392 			}
393  out:
394 	return rc;
395 }
396 
397 /**
398  *	mptsas_find_portinfo_by_sas_address -
399  *	@ioc: Pointer to MPT_ADAPTER structure
400  *	@handle:
401  *
402  *	This function should be called with the sas_topology_mutex already held
403  *
404  **/
405 static struct mptsas_portinfo *
406 mptsas_find_portinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
407 {
408 	struct mptsas_portinfo *port_info, *rc = NULL;
409 	int i;
410 
411 	if (sas_address >= ioc->hba_port_sas_addr &&
412 	    sas_address < (ioc->hba_port_sas_addr +
413 	    ioc->hba_port_num_phy))
414 		return ioc->hba_port_info;
415 
416 	mutex_lock(&ioc->sas_topology_mutex);
417 	list_for_each_entry(port_info, &ioc->sas_topology, list)
418 		for (i = 0; i < port_info->num_phys; i++)
419 			if (port_info->phy_info[i].identify.sas_address ==
420 			    sas_address) {
421 				rc = port_info;
422 				goto out;
423 			}
424  out:
425 	mutex_unlock(&ioc->sas_topology_mutex);
426 	return rc;
427 }
428 
429 /*
430  * Returns true if there is a scsi end device
431  */
432 static inline int
433 mptsas_is_end_device(struct mptsas_devinfo * attached)
434 {
435 	if ((attached->sas_address) &&
436 	    (attached->device_info &
437 	    MPI_SAS_DEVICE_INFO_END_DEVICE) &&
438 	    ((attached->device_info &
439 	    MPI_SAS_DEVICE_INFO_SSP_TARGET) |
440 	    (attached->device_info &
441 	    MPI_SAS_DEVICE_INFO_STP_TARGET) |
442 	    (attached->device_info &
443 	    MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
444 		return 1;
445 	else
446 		return 0;
447 }
448 
449 /* no mutex */
450 static void
451 mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details)
452 {
453 	struct mptsas_portinfo *port_info;
454 	struct mptsas_phyinfo *phy_info;
455 	u8	i;
456 
457 	if (!port_details)
458 		return;
459 
460 	port_info = port_details->port_info;
461 	phy_info = port_info->phy_info;
462 
463 	dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: [%p]: num_phys=%02d "
464 	    "bitmask=0x%016llX\n", ioc->name, __func__, port_details,
465 	    port_details->num_phys, (unsigned long long)
466 	    port_details->phy_bitmask));
467 
468 	for (i = 0; i < port_info->num_phys; i++, phy_info++) {
469 		if(phy_info->port_details != port_details)
470 			continue;
471 		memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
472 		mptsas_set_rphy(ioc, phy_info, NULL);
473 		phy_info->port_details = NULL;
474 	}
475 	kfree(port_details);
476 }
477 
478 static inline struct sas_rphy *
479 mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
480 {
481 	if (phy_info->port_details)
482 		return phy_info->port_details->rphy;
483 	else
484 		return NULL;
485 }
486 
487 static inline void
488 mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
489 {
490 	if (phy_info->port_details) {
491 		phy_info->port_details->rphy = rphy;
492 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n",
493 		    ioc->name, rphy));
494 	}
495 
496 	if (rphy) {
497 		dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
498 		    &rphy->dev, MYIOC_s_FMT "add:", ioc->name));
499 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n",
500 		    ioc->name, rphy, rphy->dev.release));
501 	}
502 }
503 
504 static inline struct sas_port *
505 mptsas_get_port(struct mptsas_phyinfo *phy_info)
506 {
507 	if (phy_info->port_details)
508 		return phy_info->port_details->port;
509 	else
510 		return NULL;
511 }
512 
513 static inline void
514 mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_port *port)
515 {
516 	if (phy_info->port_details)
517 		phy_info->port_details->port = port;
518 
519 	if (port) {
520 		dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
521 		    &port->dev, MYIOC_s_FMT "add:", ioc->name));
522 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "port=%p release=%p\n",
523 		    ioc->name, port, port->dev.release));
524 	}
525 }
526 
527 static inline struct scsi_target *
528 mptsas_get_starget(struct mptsas_phyinfo *phy_info)
529 {
530 	if (phy_info->port_details)
531 		return phy_info->port_details->starget;
532 	else
533 		return NULL;
534 }
535 
536 static inline void
537 mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target *
538 starget)
539 {
540 	if (phy_info->port_details)
541 		phy_info->port_details->starget = starget;
542 }
543 
544 /**
545  *	mptsas_add_device_component -
546  *	@ioc: Pointer to MPT_ADAPTER structure
547  *	@channel: fw mapped id's
548  *	@id:
549  *	@sas_address:
550  *	@device_info:
551  *
552  **/
553 static void
554 mptsas_add_device_component(MPT_ADAPTER *ioc, u8 channel, u8 id,
555 	u64 sas_address, u32 device_info, u16 slot, u64 enclosure_logical_id)
556 {
557 	struct mptsas_device_info	*sas_info, *next;
558 	struct scsi_device	*sdev;
559 	struct scsi_target	*starget;
560 	struct sas_rphy	*rphy;
561 
562 	/*
563 	 * Delete all matching devices out of the list
564 	 */
565 	mutex_lock(&ioc->sas_device_info_mutex);
566 	list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list,
567 	    list) {
568 		if (!sas_info->is_logical_volume &&
569 		    (sas_info->sas_address == sas_address ||
570 		    (sas_info->fw.channel == channel &&
571 		     sas_info->fw.id == id))) {
572 			list_del(&sas_info->list);
573 			kfree(sas_info);
574 		}
575 	}
576 
577 	sas_info = kzalloc(sizeof(struct mptsas_device_info), GFP_KERNEL);
578 	if (!sas_info)
579 		goto out;
580 
581 	/*
582 	 * Set Firmware mapping
583 	 */
584 	sas_info->fw.id = id;
585 	sas_info->fw.channel = channel;
586 
587 	sas_info->sas_address = sas_address;
588 	sas_info->device_info = device_info;
589 	sas_info->slot = slot;
590 	sas_info->enclosure_logical_id = enclosure_logical_id;
591 	INIT_LIST_HEAD(&sas_info->list);
592 	list_add_tail(&sas_info->list, &ioc->sas_device_info_list);
593 
594 	/*
595 	 * Set OS mapping
596 	 */
597 	shost_for_each_device(sdev, ioc->sh) {
598 		starget = scsi_target(sdev);
599 		rphy = dev_to_rphy(starget->dev.parent);
600 		if (rphy->identify.sas_address == sas_address) {
601 			sas_info->os.id = starget->id;
602 			sas_info->os.channel = starget->channel;
603 		}
604 	}
605 
606  out:
607 	mutex_unlock(&ioc->sas_device_info_mutex);
608 	return;
609 }
610 
611 /**
612  *	mptsas_add_device_component_by_fw -
613  *	@ioc: Pointer to MPT_ADAPTER structure
614  *	@channel:  fw mapped id's
615  *	@id:
616  *
617  **/
618 static void
619 mptsas_add_device_component_by_fw(MPT_ADAPTER *ioc, u8 channel, u8 id)
620 {
621 	struct mptsas_devinfo sas_device;
622 	struct mptsas_enclosure enclosure_info;
623 	int rc;
624 
625 	rc = mptsas_sas_device_pg0(ioc, &sas_device,
626 	    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
627 	     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
628 	    (channel << 8) + id);
629 	if (rc)
630 		return;
631 
632 	memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
633 	mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
634 	    (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
635 	     MPI_SAS_ENCLOS_PGAD_FORM_SHIFT),
636 	     sas_device.handle_enclosure);
637 
638 	mptsas_add_device_component(ioc, sas_device.channel,
639 	    sas_device.id, sas_device.sas_address, sas_device.device_info,
640 	    sas_device.slot, enclosure_info.enclosure_logical_id);
641 }
642 
643 /**
644  *	mptsas_add_device_component_starget_ir - Handle Integrated RAID, adding each individual device to list
645  *	@ioc: Pointer to MPT_ADAPTER structure
646  *	@channel: fw mapped id's
647  *	@id:
648  *
649  **/
650 static void
651 mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc,
652 		struct scsi_target *starget)
653 {
654 	CONFIGPARMS			cfg;
655 	ConfigPageHeader_t		hdr;
656 	dma_addr_t			dma_handle;
657 	pRaidVolumePage0_t		buffer = NULL;
658 	int				i;
659 	RaidPhysDiskPage0_t 		phys_disk;
660 	struct mptsas_device_info	*sas_info, *next;
661 
662 	memset(&cfg, 0 , sizeof(CONFIGPARMS));
663 	memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
664 	hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
665 	/* assumption that all volumes on channel = 0 */
666 	cfg.pageAddr = starget->id;
667 	cfg.cfghdr.hdr = &hdr;
668 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
669 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
670 
671 	if (mpt_config(ioc, &cfg) != 0)
672 		goto out;
673 
674 	if (!hdr.PageLength)
675 		goto out;
676 
677 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
678 	    &dma_handle);
679 
680 	if (!buffer)
681 		goto out;
682 
683 	cfg.physAddr = dma_handle;
684 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
685 
686 	if (mpt_config(ioc, &cfg) != 0)
687 		goto out;
688 
689 	if (!buffer->NumPhysDisks)
690 		goto out;
691 
692 	/*
693 	 * Adding entry for hidden components
694 	 */
695 	for (i = 0; i < buffer->NumPhysDisks; i++) {
696 
697 		if (mpt_raid_phys_disk_pg0(ioc,
698 		    buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
699 			continue;
700 
701 		mptsas_add_device_component_by_fw(ioc, phys_disk.PhysDiskBus,
702 		    phys_disk.PhysDiskID);
703 
704 		mutex_lock(&ioc->sas_device_info_mutex);
705 		list_for_each_entry(sas_info, &ioc->sas_device_info_list,
706 		    list) {
707 			if (!sas_info->is_logical_volume &&
708 			    (sas_info->fw.channel == phys_disk.PhysDiskBus &&
709 			    sas_info->fw.id == phys_disk.PhysDiskID)) {
710 				sas_info->is_hidden_raid_component = 1;
711 				sas_info->volume_id = starget->id;
712 			}
713 		}
714 		mutex_unlock(&ioc->sas_device_info_mutex);
715 
716 	}
717 
718 	/*
719 	 * Delete all matching devices out of the list
720 	 */
721 	mutex_lock(&ioc->sas_device_info_mutex);
722 	list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list,
723 	    list) {
724 		if (sas_info->is_logical_volume && sas_info->fw.id ==
725 		    starget->id) {
726 			list_del(&sas_info->list);
727 			kfree(sas_info);
728 		}
729 	}
730 
731 	sas_info = kzalloc(sizeof(struct mptsas_device_info), GFP_KERNEL);
732 	if (sas_info) {
733 		sas_info->fw.id = starget->id;
734 		sas_info->os.id = starget->id;
735 		sas_info->os.channel = starget->channel;
736 		sas_info->is_logical_volume = 1;
737 		INIT_LIST_HEAD(&sas_info->list);
738 		list_add_tail(&sas_info->list, &ioc->sas_device_info_list);
739 	}
740 	mutex_unlock(&ioc->sas_device_info_mutex);
741 
742  out:
743 	if (buffer)
744 		pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
745 		    dma_handle);
746 }
747 
748 /**
749  *	mptsas_add_device_component_starget -
750  *	@ioc: Pointer to MPT_ADAPTER structure
751  *	@starget:
752  *
753  **/
754 static void
755 mptsas_add_device_component_starget(MPT_ADAPTER *ioc,
756 	struct scsi_target *starget)
757 {
758 	VirtTarget	*vtarget;
759 	struct sas_rphy	*rphy;
760 	struct mptsas_phyinfo	*phy_info = NULL;
761 	struct mptsas_enclosure	enclosure_info;
762 
763 	rphy = dev_to_rphy(starget->dev.parent);
764 	vtarget = starget->hostdata;
765 	phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
766 			rphy->identify.sas_address);
767 	if (!phy_info)
768 		return;
769 
770 	memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
771 	mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
772 		(MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
773 		MPI_SAS_ENCLOS_PGAD_FORM_SHIFT),
774 		phy_info->attached.handle_enclosure);
775 
776 	mptsas_add_device_component(ioc, phy_info->attached.channel,
777 		phy_info->attached.id, phy_info->attached.sas_address,
778 		phy_info->attached.device_info,
779 		phy_info->attached.slot, enclosure_info.enclosure_logical_id);
780 }
781 
782 /**
783  *	mptsas_del_device_component_by_os - Once a device has been removed, we mark the entry in the list as being cached
784  *	@ioc: Pointer to MPT_ADAPTER structure
785  *	@channel: os mapped id's
786  *	@id:
787  *
788  **/
789 static void
790 mptsas_del_device_component_by_os(MPT_ADAPTER *ioc, u8 channel, u8 id)
791 {
792 	struct mptsas_device_info	*sas_info, *next;
793 
794 	/*
795 	 * Set is_cached flag
796 	 */
797 	list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list,
798 		list) {
799 		if (sas_info->os.channel == channel && sas_info->os.id == id)
800 			sas_info->is_cached = 1;
801 	}
802 }
803 
804 /**
805  *	mptsas_del_device_components - Cleaning the list
806  *	@ioc: Pointer to MPT_ADAPTER structure
807  *
808  **/
809 static void
810 mptsas_del_device_components(MPT_ADAPTER *ioc)
811 {
812 	struct mptsas_device_info	*sas_info, *next;
813 
814 	mutex_lock(&ioc->sas_device_info_mutex);
815 	list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list,
816 		list) {
817 		list_del(&sas_info->list);
818 		kfree(sas_info);
819 	}
820 	mutex_unlock(&ioc->sas_device_info_mutex);
821 }
822 
823 
824 /*
825  * mptsas_setup_wide_ports
826  *
827  * Updates for new and existing narrow/wide port configuration
828  * in the sas_topology
829  */
830 static void
831 mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
832 {
833 	struct mptsas_portinfo_details * port_details;
834 	struct mptsas_phyinfo *phy_info, *phy_info_cmp;
835 	u64	sas_address;
836 	int	i, j;
837 
838 	mutex_lock(&ioc->sas_topology_mutex);
839 
840 	phy_info = port_info->phy_info;
841 	for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
842 		if (phy_info->attached.handle)
843 			continue;
844 		port_details = phy_info->port_details;
845 		if (!port_details)
846 			continue;
847 		if (port_details->num_phys < 2)
848 			continue;
849 		/*
850 		 * Removing a phy from a port, letting the last
851 		 * phy be removed by firmware events.
852 		 */
853 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
854 		    "%s: [%p]: deleting phy = %d\n",
855 		    ioc->name, __func__, port_details, i));
856 		port_details->num_phys--;
857 		port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
858 		memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
859 		if (phy_info->phy) {
860 			devtprintk(ioc, dev_printk(KERN_DEBUG,
861 				&phy_info->phy->dev, MYIOC_s_FMT
862 				"delete phy %d, phy-obj (0x%p)\n", ioc->name,
863 				phy_info->phy_id, phy_info->phy));
864 			sas_port_delete_phy(port_details->port, phy_info->phy);
865 		}
866 		phy_info->port_details = NULL;
867 	}
868 
869 	/*
870 	 * Populate and refresh the tree
871 	 */
872 	phy_info = port_info->phy_info;
873 	for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
874 		sas_address = phy_info->attached.sas_address;
875 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "phy_id=%d sas_address=0x%018llX\n",
876 		    ioc->name, i, (unsigned long long)sas_address));
877 		if (!sas_address)
878 			continue;
879 		port_details = phy_info->port_details;
880 		/*
881 		 * Forming a port
882 		 */
883 		if (!port_details) {
884 			port_details = kzalloc(sizeof(struct
885 				mptsas_portinfo_details), GFP_KERNEL);
886 			if (!port_details)
887 				goto out;
888 			port_details->num_phys = 1;
889 			port_details->port_info = port_info;
890 			if (phy_info->phy_id < 64 )
891 				port_details->phy_bitmask |=
892 				    (1 << phy_info->phy_id);
893 			phy_info->sas_port_add_phy=1;
894 			dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tForming port\n\t\t"
895 			    "phy_id=%d sas_address=0x%018llX\n",
896 			    ioc->name, i, (unsigned long long)sas_address));
897 			phy_info->port_details = port_details;
898 		}
899 
900 		if (i == port_info->num_phys - 1)
901 			continue;
902 		phy_info_cmp = &port_info->phy_info[i + 1];
903 		for (j = i + 1 ; j < port_info->num_phys ; j++,
904 		    phy_info_cmp++) {
905 			if (!phy_info_cmp->attached.sas_address)
906 				continue;
907 			if (sas_address != phy_info_cmp->attached.sas_address)
908 				continue;
909 			if (phy_info_cmp->port_details == port_details )
910 				continue;
911 			dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
912 			    "\t\tphy_id=%d sas_address=0x%018llX\n",
913 			    ioc->name, j, (unsigned long long)
914 			    phy_info_cmp->attached.sas_address));
915 			if (phy_info_cmp->port_details) {
916 				port_details->rphy =
917 				    mptsas_get_rphy(phy_info_cmp);
918 				port_details->port =
919 				    mptsas_get_port(phy_info_cmp);
920 				port_details->starget =
921 				    mptsas_get_starget(phy_info_cmp);
922 				port_details->num_phys =
923 					phy_info_cmp->port_details->num_phys;
924 				if (!phy_info_cmp->port_details->num_phys)
925 					kfree(phy_info_cmp->port_details);
926 			} else
927 				phy_info_cmp->sas_port_add_phy=1;
928 			/*
929 			 * Adding a phy to a port
930 			 */
931 			phy_info_cmp->port_details = port_details;
932 			if (phy_info_cmp->phy_id < 64 )
933 				port_details->phy_bitmask |=
934 				(1 << phy_info_cmp->phy_id);
935 			port_details->num_phys++;
936 		}
937 	}
938 
939  out:
940 
941 	for (i = 0; i < port_info->num_phys; i++) {
942 		port_details = port_info->phy_info[i].port_details;
943 		if (!port_details)
944 			continue;
945 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
946 		    "%s: [%p]: phy_id=%02d num_phys=%02d "
947 		    "bitmask=0x%016llX\n", ioc->name, __func__,
948 		    port_details, i, port_details->num_phys,
949 		    (unsigned long long)port_details->phy_bitmask));
950 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\t\tport = %p rphy=%p\n",
951 		    ioc->name, port_details->port, port_details->rphy));
952 	}
953 	dsaswideprintk(ioc, printk("\n"));
954 	mutex_unlock(&ioc->sas_topology_mutex);
955 }
956 
957 /**
958  * csmisas_find_vtarget
959  *
960  * @ioc
961  * @volume_id
962  * @volume_bus
963  *
964  **/
965 static VirtTarget *
966 mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
967 {
968 	struct scsi_device 		*sdev;
969 	VirtDevice			*vdevice;
970 	VirtTarget 			*vtarget = NULL;
971 
972 	shost_for_each_device(sdev, ioc->sh) {
973 		vdevice = sdev->hostdata;
974 		if ((vdevice == NULL) ||
975 			(vdevice->vtarget == NULL))
976 			continue;
977 		if ((vdevice->vtarget->tflags &
978 		    MPT_TARGET_FLAGS_RAID_COMPONENT ||
979 		    vdevice->vtarget->raidVolume))
980 			continue;
981 		if (vdevice->vtarget->id == id &&
982 			vdevice->vtarget->channel == channel)
983 			vtarget = vdevice->vtarget;
984 	}
985 	return vtarget;
986 }
987 
988 static void
989 mptsas_queue_device_delete(MPT_ADAPTER *ioc,
990 	MpiEventDataSasDeviceStatusChange_t *sas_event_data)
991 {
992 	struct fw_event_work *fw_event;
993 
994 	fw_event = kzalloc(sizeof(*fw_event) +
995 			   sizeof(MpiEventDataSasDeviceStatusChange_t),
996 			   GFP_ATOMIC);
997 	if (!fw_event) {
998 		printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n",
999 		    ioc->name, __func__, __LINE__);
1000 		return;
1001 	}
1002 	memcpy(fw_event->event_data, sas_event_data,
1003 	    sizeof(MpiEventDataSasDeviceStatusChange_t));
1004 	fw_event->event = MPI_EVENT_SAS_DEVICE_STATUS_CHANGE;
1005 	fw_event->ioc = ioc;
1006 	mptsas_add_fw_event(ioc, fw_event, msecs_to_jiffies(1));
1007 }
1008 
1009 static void
1010 mptsas_queue_rescan(MPT_ADAPTER *ioc)
1011 {
1012 	struct fw_event_work *fw_event;
1013 
1014 	fw_event = kzalloc(sizeof(*fw_event), GFP_ATOMIC);
1015 	if (!fw_event) {
1016 		printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n",
1017 		    ioc->name, __func__, __LINE__);
1018 		return;
1019 	}
1020 	fw_event->event = -1;
1021 	fw_event->ioc = ioc;
1022 	mptsas_add_fw_event(ioc, fw_event, msecs_to_jiffies(1));
1023 }
1024 
1025 
1026 /**
1027  * mptsas_target_reset
1028  *
1029  * Issues TARGET_RESET to end device using handshaking method
1030  *
1031  * @ioc
1032  * @channel
1033  * @id
1034  *
1035  * Returns (1) success
1036  *         (0) failure
1037  *
1038  **/
1039 static int
1040 mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
1041 {
1042 	MPT_FRAME_HDR	*mf;
1043 	SCSITaskMgmt_t	*pScsiTm;
1044 	if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0)
1045 		return 0;
1046 
1047 
1048 	mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc);
1049 	if (mf == NULL) {
1050 		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
1051 			"%s, no msg frames @%d!!\n", ioc->name,
1052 			__func__, __LINE__));
1053 		goto out_fail;
1054 	}
1055 
1056 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request (mf=%p)\n",
1057 		ioc->name, mf));
1058 
1059 	/* Format the Request
1060 	 */
1061 	pScsiTm = (SCSITaskMgmt_t *) mf;
1062 	memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
1063 	pScsiTm->TargetID = id;
1064 	pScsiTm->Bus = channel;
1065 	pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
1066 	pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
1067 	pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
1068 
1069 	DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
1070 
1071 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1072 	   "TaskMgmt type=%d (sas device delete) fw_channel = %d fw_id = %d)\n",
1073 	   ioc->name, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET, channel, id));
1074 
1075 	mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx, ioc, mf);
1076 
1077 	return 1;
1078 
1079  out_fail:
1080 
1081 	mpt_clear_taskmgmt_in_progress_flag(ioc);
1082 	return 0;
1083 }
1084 
1085 static void
1086 mptsas_block_io_sdev(struct scsi_device *sdev, void *data)
1087 {
1088 	scsi_device_set_state(sdev, SDEV_BLOCK);
1089 }
1090 
1091 static void
1092 mptsas_block_io_starget(struct scsi_target *starget)
1093 {
1094 	if (starget)
1095 		starget_for_each_device(starget, NULL, mptsas_block_io_sdev);
1096 }
1097 
1098 /**
1099  * mptsas_target_reset_queue
1100  *
1101  * Receive request for TARGET_RESET after receiving an firmware
1102  * event NOT_RESPONDING_EVENT, then put command in link list
1103  * and queue if task_queue already in use.
1104  *
1105  * @ioc
1106  * @sas_event_data
1107  *
1108  **/
1109 static void
1110 mptsas_target_reset_queue(MPT_ADAPTER *ioc,
1111     EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
1112 {
1113 	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);
1114 	VirtTarget *vtarget = NULL;
1115 	struct mptsas_target_reset_event *target_reset_list;
1116 	u8		id, channel;
1117 
1118 	id = sas_event_data->TargetID;
1119 	channel = sas_event_data->Bus;
1120 
1121 	vtarget = mptsas_find_vtarget(ioc, channel, id);
1122 	if (vtarget) {
1123 		mptsas_block_io_starget(vtarget->starget);
1124 		vtarget->deleted = 1; /* block IO */
1125 	}
1126 
1127 	target_reset_list = kzalloc(sizeof(struct mptsas_target_reset_event),
1128 	    GFP_ATOMIC);
1129 	if (!target_reset_list) {
1130 		dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
1131 			"%s, failed to allocate mem @%d..!!\n",
1132 			ioc->name, __func__, __LINE__));
1133 		return;
1134 	}
1135 
1136 	memcpy(&target_reset_list->sas_event_data, sas_event_data,
1137 		sizeof(*sas_event_data));
1138 	list_add_tail(&target_reset_list->list, &hd->target_reset_list);
1139 
1140 	target_reset_list->time_count = jiffies;
1141 
1142 	if (mptsas_target_reset(ioc, channel, id)) {
1143 		target_reset_list->target_reset_issued = 1;
1144 	}
1145 }
1146 
1147 /**
1148  * mptsas_schedule_target_reset- send pending target reset
1149  * @iocp: per adapter object
1150  *
1151  * This function will delete scheduled target reset from the list and
1152  * try to send next target reset. This will be called from completion
1153  * context of any Task management command.
1154  */
1155 
1156 void
1157 mptsas_schedule_target_reset(void *iocp)
1158 {
1159 	MPT_ADAPTER *ioc = (MPT_ADAPTER *)(iocp);
1160 	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);
1161 	struct list_head *head = &hd->target_reset_list;
1162 	struct mptsas_target_reset_event	*target_reset_list;
1163 	u8		id, channel;
1164 	/*
1165 	 * issue target reset to next device in the queue
1166 	 */
1167 
1168 	head = &hd->target_reset_list;
1169 	if (list_empty(head))
1170 		return;
1171 
1172 	target_reset_list = list_entry(head->next,
1173 		struct mptsas_target_reset_event, list);
1174 
1175 	id = target_reset_list->sas_event_data.TargetID;
1176 	channel = target_reset_list->sas_event_data.Bus;
1177 	target_reset_list->time_count = jiffies;
1178 
1179 	if (mptsas_target_reset(ioc, channel, id))
1180 		target_reset_list->target_reset_issued = 1;
1181 	return;
1182 }
1183 
1184 
1185 /**
1186  *	mptsas_taskmgmt_complete - complete SAS task management function
1187  *	@ioc: Pointer to MPT_ADAPTER structure
1188  *
1189  *	Completion for TARGET_RESET after NOT_RESPONDING_EVENT, enable work
1190  *	queue to finish off removing device from upper layers. then send next
1191  *	TARGET_RESET in the queue.
1192  **/
1193 static int
1194 mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
1195 {
1196 	MPT_SCSI_HOST	*hd = shost_priv(ioc->sh);
1197         struct list_head *head = &hd->target_reset_list;
1198 	u8		id, channel;
1199 	struct mptsas_target_reset_event	*target_reset_list;
1200 	SCSITaskMgmtReply_t *pScsiTmReply;
1201 
1202 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt completed: "
1203 	    "(mf = %p, mr = %p)\n", ioc->name, mf, mr));
1204 
1205 	pScsiTmReply = (SCSITaskMgmtReply_t *)mr;
1206 	if (!pScsiTmReply)
1207 		return 0;
1208 
1209 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1210 	    "\tTaskMgmt completed: fw_channel = %d, fw_id = %d,\n"
1211 	    "\ttask_type = 0x%02X, iocstatus = 0x%04X "
1212 	    "loginfo = 0x%08X,\n\tresponse_code = 0x%02X, "
1213 	    "term_cmnds = %d\n", ioc->name,
1214 	    pScsiTmReply->Bus, pScsiTmReply->TargetID,
1215 	    pScsiTmReply->TaskType,
1216 	    le16_to_cpu(pScsiTmReply->IOCStatus),
1217 	    le32_to_cpu(pScsiTmReply->IOCLogInfo),
1218 	    pScsiTmReply->ResponseCode,
1219 	    le32_to_cpu(pScsiTmReply->TerminationCount)));
1220 
1221 	if (pScsiTmReply->ResponseCode)
1222 		mptscsih_taskmgmt_response_code(ioc,
1223 		pScsiTmReply->ResponseCode);
1224 
1225 	if (pScsiTmReply->TaskType ==
1226 	    MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK || pScsiTmReply->TaskType ==
1227 	     MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET) {
1228 		ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
1229 		ioc->taskmgmt_cmds.status |= MPT_MGMT_STATUS_RF_VALID;
1230 		memcpy(ioc->taskmgmt_cmds.reply, mr,
1231 		    min(MPT_DEFAULT_FRAME_SIZE, 4 * mr->u.reply.MsgLength));
1232 		if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_PENDING) {
1233 			ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING;
1234 			complete(&ioc->taskmgmt_cmds.done);
1235 			return 1;
1236 		}
1237 		return 0;
1238 	}
1239 
1240 	mpt_clear_taskmgmt_in_progress_flag(ioc);
1241 
1242 	if (list_empty(head))
1243 		return 1;
1244 
1245 	target_reset_list = list_entry(head->next,
1246 	    struct mptsas_target_reset_event, list);
1247 
1248 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1249 	    "TaskMgmt: completed (%d seconds)\n",
1250 	    ioc->name, jiffies_to_msecs(jiffies -
1251 	    target_reset_list->time_count)/1000));
1252 
1253 	id = pScsiTmReply->TargetID;
1254 	channel = pScsiTmReply->Bus;
1255 	target_reset_list->time_count = jiffies;
1256 
1257 	/*
1258 	 * retry target reset
1259 	 */
1260 	if (!target_reset_list->target_reset_issued) {
1261 		if (mptsas_target_reset(ioc, channel, id))
1262 			target_reset_list->target_reset_issued = 1;
1263 		return 1;
1264 	}
1265 
1266 	/*
1267 	 * enable work queue to remove device from upper layers
1268 	 */
1269 	list_del(&target_reset_list->list);
1270 	if (!ioc->fw_events_off)
1271 		mptsas_queue_device_delete(ioc,
1272 			&target_reset_list->sas_event_data);
1273 
1274 
1275 	ioc->schedule_target_reset(ioc);
1276 
1277 	return 1;
1278 }
1279 
1280 /**
1281  * mptscsih_ioc_reset
1282  *
1283  * @ioc
1284  * @reset_phase
1285  *
1286  **/
1287 static int
1288 mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
1289 {
1290 	MPT_SCSI_HOST	*hd;
1291 	int rc;
1292 
1293 	rc = mptscsih_ioc_reset(ioc, reset_phase);
1294 	if ((ioc->bus_type != SAS) || (!rc))
1295 		return rc;
1296 
1297 	hd = shost_priv(ioc->sh);
1298 	if (!hd->ioc)
1299 		goto out;
1300 
1301 	switch (reset_phase) {
1302 	case MPT_IOC_SETUP_RESET:
1303 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1304 		    "%s: MPT_IOC_SETUP_RESET\n", ioc->name, __func__));
1305 		mptsas_fw_event_off(ioc);
1306 		break;
1307 	case MPT_IOC_PRE_RESET:
1308 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1309 		    "%s: MPT_IOC_PRE_RESET\n", ioc->name, __func__));
1310 		break;
1311 	case MPT_IOC_POST_RESET:
1312 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1313 		    "%s: MPT_IOC_POST_RESET\n", ioc->name, __func__));
1314 		if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_PENDING) {
1315 			ioc->sas_mgmt.status |= MPT_MGMT_STATUS_DID_IOCRESET;
1316 			complete(&ioc->sas_mgmt.done);
1317 		}
1318 		mptsas_cleanup_fw_event_q(ioc);
1319 		mptsas_queue_rescan(ioc);
1320 		break;
1321 	default:
1322 		break;
1323 	}
1324 
1325  out:
1326 	return rc;
1327 }
1328 
1329 
1330 /**
1331  * enum device_state -
1332  * @DEVICE_RETRY: need to retry the TUR
1333  * @DEVICE_ERROR: TUR return error, don't add device
1334  * @DEVICE_READY: device can be added
1335  *
1336  */
1337 enum device_state{
1338 	DEVICE_RETRY,
1339 	DEVICE_ERROR,
1340 	DEVICE_READY,
1341 };
1342 
1343 static int
1344 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
1345 		u32 form, u32 form_specific)
1346 {
1347 	ConfigExtendedPageHeader_t hdr;
1348 	CONFIGPARMS cfg;
1349 	SasEnclosurePage0_t *buffer;
1350 	dma_addr_t dma_handle;
1351 	int error;
1352 	__le64 le_identifier;
1353 
1354 	memset(&hdr, 0, sizeof(hdr));
1355 	hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
1356 	hdr.PageNumber = 0;
1357 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1358 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
1359 
1360 	cfg.cfghdr.ehdr = &hdr;
1361 	cfg.physAddr = -1;
1362 	cfg.pageAddr = form + form_specific;
1363 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1364 	cfg.dir = 0;	/* read */
1365 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
1366 
1367 	error = mpt_config(ioc, &cfg);
1368 	if (error)
1369 		goto out;
1370 	if (!hdr.ExtPageLength) {
1371 		error = -ENXIO;
1372 		goto out;
1373 	}
1374 
1375 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1376 			&dma_handle);
1377 	if (!buffer) {
1378 		error = -ENOMEM;
1379 		goto out;
1380 	}
1381 
1382 	cfg.physAddr = dma_handle;
1383 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1384 
1385 	error = mpt_config(ioc, &cfg);
1386 	if (error)
1387 		goto out_free_consistent;
1388 
1389 	/* save config data */
1390 	memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
1391 	enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
1392 	enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
1393 	enclosure->flags = le16_to_cpu(buffer->Flags);
1394 	enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
1395 	enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
1396 	enclosure->start_id = buffer->StartTargetID;
1397 	enclosure->start_channel = buffer->StartBus;
1398 	enclosure->sep_id = buffer->SEPTargetID;
1399 	enclosure->sep_channel = buffer->SEPBus;
1400 
1401  out_free_consistent:
1402 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1403 			    buffer, dma_handle);
1404  out:
1405 	return error;
1406 }
1407 
1408 /**
1409  *	mptsas_add_end_device - report a new end device to sas transport layer
1410  *	@ioc: Pointer to MPT_ADAPTER structure
1411  *	@phy_info: describes attached device
1412  *
1413  *	return (0) success (1) failure
1414  *
1415  **/
1416 static int
1417 mptsas_add_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info)
1418 {
1419 	struct sas_rphy *rphy;
1420 	struct sas_port *port;
1421 	struct sas_identify identify;
1422 	char *ds = NULL;
1423 	u8 fw_id;
1424 
1425 	if (!phy_info) {
1426 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1427 			"%s: exit at line=%d\n", ioc->name,
1428 			 __func__, __LINE__));
1429 		return 1;
1430 	}
1431 
1432 	fw_id = phy_info->attached.id;
1433 
1434 	if (mptsas_get_rphy(phy_info)) {
1435 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1436 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1437 			 __func__, fw_id, __LINE__));
1438 		return 2;
1439 	}
1440 
1441 	port = mptsas_get_port(phy_info);
1442 	if (!port) {
1443 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1444 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1445 			 __func__, fw_id, __LINE__));
1446 		return 3;
1447 	}
1448 
1449 	if (phy_info->attached.device_info &
1450 	    MPI_SAS_DEVICE_INFO_SSP_TARGET)
1451 		ds = "ssp";
1452 	if (phy_info->attached.device_info &
1453 	    MPI_SAS_DEVICE_INFO_STP_TARGET)
1454 		ds = "stp";
1455 	if (phy_info->attached.device_info &
1456 	    MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1457 		ds = "sata";
1458 
1459 	printk(MYIOC_s_INFO_FMT "attaching %s device: fw_channel %d, fw_id %d,"
1460 	    " phy %d, sas_addr 0x%llx\n", ioc->name, ds,
1461 	    phy_info->attached.channel, phy_info->attached.id,
1462 	    phy_info->attached.phy_id, (unsigned long long)
1463 	    phy_info->attached.sas_address);
1464 
1465 	mptsas_parse_device_info(&identify, &phy_info->attached);
1466 	rphy = sas_end_device_alloc(port);
1467 	if (!rphy) {
1468 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1469 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1470 			 __func__, fw_id, __LINE__));
1471 		return 5; /* non-fatal: an rphy can be added later */
1472 	}
1473 
1474 	rphy->identify = identify;
1475 	if (sas_rphy_add(rphy)) {
1476 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1477 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1478 			 __func__, fw_id, __LINE__));
1479 		sas_rphy_free(rphy);
1480 		return 6;
1481 	}
1482 	mptsas_set_rphy(ioc, phy_info, rphy);
1483 	return 0;
1484 }
1485 
1486 /**
1487  *	mptsas_del_end_device - report a deleted end device to sas transport layer
1488  *	@ioc: Pointer to MPT_ADAPTER structure
1489  *	@phy_info: describes attached device
1490  *
1491  **/
1492 static void
1493 mptsas_del_end_device(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info)
1494 {
1495 	struct sas_rphy *rphy;
1496 	struct sas_port *port;
1497 	struct mptsas_portinfo *port_info;
1498 	struct mptsas_phyinfo *phy_info_parent;
1499 	int i;
1500 	char *ds = NULL;
1501 	u8 fw_id;
1502 	u64 sas_address;
1503 
1504 	if (!phy_info)
1505 		return;
1506 
1507 	fw_id = phy_info->attached.id;
1508 	sas_address = phy_info->attached.sas_address;
1509 
1510 	if (!phy_info->port_details) {
1511 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1512 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1513 			 __func__, fw_id, __LINE__));
1514 		return;
1515 	}
1516 	rphy = mptsas_get_rphy(phy_info);
1517 	if (!rphy) {
1518 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1519 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1520 			 __func__, fw_id, __LINE__));
1521 		return;
1522 	}
1523 
1524 	if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_INITIATOR
1525 		|| phy_info->attached.device_info
1526 			& MPI_SAS_DEVICE_INFO_SMP_INITIATOR
1527 		|| phy_info->attached.device_info
1528 			& MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1529 		ds = "initiator";
1530 	if (phy_info->attached.device_info &
1531 	    MPI_SAS_DEVICE_INFO_SSP_TARGET)
1532 		ds = "ssp";
1533 	if (phy_info->attached.device_info &
1534 	    MPI_SAS_DEVICE_INFO_STP_TARGET)
1535 		ds = "stp";
1536 	if (phy_info->attached.device_info &
1537 	    MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1538 		ds = "sata";
1539 
1540 	dev_printk(KERN_DEBUG, &rphy->dev, MYIOC_s_FMT
1541 	    "removing %s device: fw_channel %d, fw_id %d, phy %d,"
1542 	    "sas_addr 0x%llx\n", ioc->name, ds, phy_info->attached.channel,
1543 	    phy_info->attached.id, phy_info->attached.phy_id,
1544 	    (unsigned long long) sas_address);
1545 
1546 	port = mptsas_get_port(phy_info);
1547 	if (!port) {
1548 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
1549 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
1550 			 __func__, fw_id, __LINE__));
1551 		return;
1552 	}
1553 	port_info = phy_info->portinfo;
1554 	phy_info_parent = port_info->phy_info;
1555 	for (i = 0; i < port_info->num_phys; i++, phy_info_parent++) {
1556 		if (!phy_info_parent->phy)
1557 			continue;
1558 		if (phy_info_parent->attached.sas_address !=
1559 		    sas_address)
1560 			continue;
1561 		dev_printk(KERN_DEBUG, &phy_info_parent->phy->dev,
1562 		    MYIOC_s_FMT "delete phy %d, phy-obj (0x%p)\n",
1563 		    ioc->name, phy_info_parent->phy_id,
1564 		    phy_info_parent->phy);
1565 		sas_port_delete_phy(port, phy_info_parent->phy);
1566 	}
1567 
1568 	dev_printk(KERN_DEBUG, &port->dev, MYIOC_s_FMT
1569 	    "delete port %d, sas_addr (0x%llx)\n", ioc->name,
1570 	     port->port_identifier, (unsigned long long)sas_address);
1571 	sas_port_delete(port);
1572 	mptsas_set_port(ioc, phy_info, NULL);
1573 	mptsas_port_delete(ioc, phy_info->port_details);
1574 }
1575 
1576 static struct mptsas_phyinfo *
1577 mptsas_refreshing_device_handles(MPT_ADAPTER *ioc,
1578 	struct mptsas_devinfo *sas_device)
1579 {
1580 	struct mptsas_phyinfo *phy_info;
1581 	struct mptsas_portinfo *port_info;
1582 	int i;
1583 
1584 	phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
1585 	    sas_device->sas_address);
1586 	if (!phy_info)
1587 		goto out;
1588 	port_info = phy_info->portinfo;
1589 	if (!port_info)
1590 		goto out;
1591 	mutex_lock(&ioc->sas_topology_mutex);
1592 	for (i = 0; i < port_info->num_phys; i++) {
1593 		if (port_info->phy_info[i].attached.sas_address !=
1594 			sas_device->sas_address)
1595 			continue;
1596 		port_info->phy_info[i].attached.channel = sas_device->channel;
1597 		port_info->phy_info[i].attached.id = sas_device->id;
1598 		port_info->phy_info[i].attached.sas_address =
1599 		    sas_device->sas_address;
1600 		port_info->phy_info[i].attached.handle = sas_device->handle;
1601 		port_info->phy_info[i].attached.handle_parent =
1602 		    sas_device->handle_parent;
1603 		port_info->phy_info[i].attached.handle_enclosure =
1604 		    sas_device->handle_enclosure;
1605 	}
1606 	mutex_unlock(&ioc->sas_topology_mutex);
1607  out:
1608 	return phy_info;
1609 }
1610 
1611 /**
1612  * mptsas_firmware_event_work - work thread for processing fw events
1613  * @work: work queue payload containing info describing the event
1614  * Context: user
1615  *
1616  */
1617 static void
1618 mptsas_firmware_event_work(struct work_struct *work)
1619 {
1620 	struct fw_event_work *fw_event =
1621 		container_of(work, struct fw_event_work, work.work);
1622 	MPT_ADAPTER *ioc = fw_event->ioc;
1623 
1624 	/* special rescan topology handling */
1625 	if (fw_event->event == -1) {
1626 		if (ioc->in_rescan) {
1627 			devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
1628 				"%s: rescan ignored as it is in progress\n",
1629 				ioc->name, __func__));
1630 			return;
1631 		}
1632 		devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: rescan after "
1633 		    "reset\n", ioc->name, __func__));
1634 		ioc->in_rescan = 1;
1635 		mptsas_not_responding_devices(ioc);
1636 		mptsas_scan_sas_topology(ioc);
1637 		ioc->in_rescan = 0;
1638 		mptsas_free_fw_event(ioc, fw_event);
1639 		mptsas_fw_event_on(ioc);
1640 		return;
1641 	}
1642 
1643 	/* events handling turned off during host reset */
1644 	if (ioc->fw_events_off) {
1645 		mptsas_free_fw_event(ioc, fw_event);
1646 		return;
1647 	}
1648 
1649 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: fw_event=(0x%p), "
1650 	    "event = (0x%02x)\n", ioc->name, __func__, fw_event,
1651 	    (fw_event->event & 0xFF)));
1652 
1653 	switch (fw_event->event) {
1654 	case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
1655 		mptsas_send_sas_event(fw_event);
1656 		break;
1657 	case MPI_EVENT_INTEGRATED_RAID:
1658 		mptsas_send_raid_event(fw_event);
1659 		break;
1660 	case MPI_EVENT_IR2:
1661 		mptsas_send_ir2_event(fw_event);
1662 		break;
1663 	case MPI_EVENT_PERSISTENT_TABLE_FULL:
1664 		mptbase_sas_persist_operation(ioc,
1665 		    MPI_SAS_OP_CLEAR_NOT_PRESENT);
1666 		mptsas_free_fw_event(ioc, fw_event);
1667 		break;
1668 	case MPI_EVENT_SAS_BROADCAST_PRIMITIVE:
1669 		mptsas_broadcast_primative_work(fw_event);
1670 		break;
1671 	case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE:
1672 		mptsas_send_expander_event(fw_event);
1673 		break;
1674 	case MPI_EVENT_SAS_PHY_LINK_STATUS:
1675 		mptsas_send_link_status_event(fw_event);
1676 		break;
1677 	case MPI_EVENT_QUEUE_FULL:
1678 		mptsas_handle_queue_full_event(fw_event);
1679 		break;
1680 	}
1681 }
1682 
1683 
1684 
1685 static int
1686 mptsas_slave_configure(struct scsi_device *sdev)
1687 {
1688 	struct Scsi_Host	*host = sdev->host;
1689 	MPT_SCSI_HOST	*hd = shost_priv(host);
1690 	MPT_ADAPTER	*ioc = hd->ioc;
1691 	VirtDevice	*vdevice = sdev->hostdata;
1692 
1693 	if (vdevice->vtarget->deleted) {
1694 		sdev_printk(KERN_INFO, sdev, "clearing deleted flag\n");
1695 		vdevice->vtarget->deleted = 0;
1696 	}
1697 
1698 	/*
1699 	 * RAID volumes placed beyond the last expected port.
1700 	 * Ignore sending sas mode pages in that case..
1701 	 */
1702 	if (sdev->channel == MPTSAS_RAID_CHANNEL) {
1703 		mptsas_add_device_component_starget_ir(ioc, scsi_target(sdev));
1704 		goto out;
1705 	}
1706 
1707 	sas_read_port_mode_page(sdev);
1708 
1709 	mptsas_add_device_component_starget(ioc, scsi_target(sdev));
1710 
1711  out:
1712 	return mptscsih_slave_configure(sdev);
1713 }
1714 
1715 static int
1716 mptsas_target_alloc(struct scsi_target *starget)
1717 {
1718 	struct Scsi_Host *host = dev_to_shost(&starget->dev);
1719 	MPT_SCSI_HOST		*hd = shost_priv(host);
1720 	VirtTarget		*vtarget;
1721 	u8			id, channel;
1722 	struct sas_rphy		*rphy;
1723 	struct mptsas_portinfo	*p;
1724 	int 			 i;
1725 	MPT_ADAPTER		*ioc = hd->ioc;
1726 
1727 	vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
1728 	if (!vtarget)
1729 		return -ENOMEM;
1730 
1731 	vtarget->starget = starget;
1732 	vtarget->ioc_id = ioc->id;
1733 	vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
1734 	id = starget->id;
1735 	channel = 0;
1736 
1737 	/*
1738 	 * RAID volumes placed beyond the last expected port.
1739 	 */
1740 	if (starget->channel == MPTSAS_RAID_CHANNEL) {
1741 		if (!ioc->raid_data.pIocPg2) {
1742 			kfree(vtarget);
1743 			return -ENXIO;
1744 		}
1745 		for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
1746 			if (id == ioc->raid_data.pIocPg2->
1747 					RaidVolume[i].VolumeID) {
1748 				channel = ioc->raid_data.pIocPg2->
1749 					RaidVolume[i].VolumeBus;
1750 			}
1751 		}
1752 		vtarget->raidVolume = 1;
1753 		goto out;
1754 	}
1755 
1756 	rphy = dev_to_rphy(starget->dev.parent);
1757 	mutex_lock(&ioc->sas_topology_mutex);
1758 	list_for_each_entry(p, &ioc->sas_topology, list) {
1759 		for (i = 0; i < p->num_phys; i++) {
1760 			if (p->phy_info[i].attached.sas_address !=
1761 					rphy->identify.sas_address)
1762 				continue;
1763 			id = p->phy_info[i].attached.id;
1764 			channel = p->phy_info[i].attached.channel;
1765 			mptsas_set_starget(&p->phy_info[i], starget);
1766 
1767 			/*
1768 			 * Exposing hidden raid components
1769 			 */
1770 			if (mptscsih_is_phys_disk(ioc, channel, id)) {
1771 				id = mptscsih_raid_id_to_num(ioc,
1772 						channel, id);
1773 				vtarget->tflags |=
1774 				    MPT_TARGET_FLAGS_RAID_COMPONENT;
1775 				p->phy_info[i].attached.phys_disk_num = id;
1776 			}
1777 			mutex_unlock(&ioc->sas_topology_mutex);
1778 			goto out;
1779 		}
1780 	}
1781 	mutex_unlock(&ioc->sas_topology_mutex);
1782 
1783 	kfree(vtarget);
1784 	return -ENXIO;
1785 
1786  out:
1787 	vtarget->id = id;
1788 	vtarget->channel = channel;
1789 	starget->hostdata = vtarget;
1790 	return 0;
1791 }
1792 
1793 static void
1794 mptsas_target_destroy(struct scsi_target *starget)
1795 {
1796 	struct Scsi_Host *host = dev_to_shost(&starget->dev);
1797 	MPT_SCSI_HOST		*hd = shost_priv(host);
1798 	struct sas_rphy		*rphy;
1799 	struct mptsas_portinfo	*p;
1800 	int 			 i;
1801 	MPT_ADAPTER	*ioc = hd->ioc;
1802 	VirtTarget	*vtarget;
1803 
1804 	if (!starget->hostdata)
1805 		return;
1806 
1807 	vtarget = starget->hostdata;
1808 
1809 	mptsas_del_device_component_by_os(ioc, starget->channel,
1810 	    starget->id);
1811 
1812 
1813 	if (starget->channel == MPTSAS_RAID_CHANNEL)
1814 		goto out;
1815 
1816 	rphy = dev_to_rphy(starget->dev.parent);
1817 	list_for_each_entry(p, &ioc->sas_topology, list) {
1818 		for (i = 0; i < p->num_phys; i++) {
1819 			if (p->phy_info[i].attached.sas_address !=
1820 					rphy->identify.sas_address)
1821 				continue;
1822 
1823 			starget_printk(KERN_INFO, starget, MYIOC_s_FMT
1824 			"delete device: fw_channel %d, fw_id %d, phy %d, "
1825 			"sas_addr 0x%llx\n", ioc->name,
1826 			p->phy_info[i].attached.channel,
1827 			p->phy_info[i].attached.id,
1828 			p->phy_info[i].attached.phy_id, (unsigned long long)
1829 			p->phy_info[i].attached.sas_address);
1830 
1831 			mptsas_set_starget(&p->phy_info[i], NULL);
1832 		}
1833 	}
1834 
1835  out:
1836 	vtarget->starget = NULL;
1837 	kfree(starget->hostdata);
1838 	starget->hostdata = NULL;
1839 }
1840 
1841 
1842 static int
1843 mptsas_slave_alloc(struct scsi_device *sdev)
1844 {
1845 	struct Scsi_Host	*host = sdev->host;
1846 	MPT_SCSI_HOST		*hd = shost_priv(host);
1847 	struct sas_rphy		*rphy;
1848 	struct mptsas_portinfo	*p;
1849 	VirtDevice		*vdevice;
1850 	struct scsi_target 	*starget;
1851 	int 			i;
1852 	MPT_ADAPTER *ioc = hd->ioc;
1853 
1854 	vdevice = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
1855 	if (!vdevice) {
1856 		printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
1857 				ioc->name, sizeof(VirtDevice));
1858 		return -ENOMEM;
1859 	}
1860 	starget = scsi_target(sdev);
1861 	vdevice->vtarget = starget->hostdata;
1862 
1863 	if (sdev->channel == MPTSAS_RAID_CHANNEL)
1864 		goto out;
1865 
1866 	rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
1867 	mutex_lock(&ioc->sas_topology_mutex);
1868 	list_for_each_entry(p, &ioc->sas_topology, list) {
1869 		for (i = 0; i < p->num_phys; i++) {
1870 			if (p->phy_info[i].attached.sas_address !=
1871 					rphy->identify.sas_address)
1872 				continue;
1873 			vdevice->lun = sdev->lun;
1874 			/*
1875 			 * Exposing hidden raid components
1876 			 */
1877 			if (mptscsih_is_phys_disk(ioc,
1878 			    p->phy_info[i].attached.channel,
1879 			    p->phy_info[i].attached.id))
1880 				sdev->no_uld_attach = 1;
1881 			mutex_unlock(&ioc->sas_topology_mutex);
1882 			goto out;
1883 		}
1884 	}
1885 	mutex_unlock(&ioc->sas_topology_mutex);
1886 
1887 	kfree(vdevice);
1888 	return -ENXIO;
1889 
1890  out:
1891 	vdevice->vtarget->num_luns++;
1892 	sdev->hostdata = vdevice;
1893 	return 0;
1894 }
1895 
1896 static int
1897 mptsas_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)
1898 {
1899 	MPT_SCSI_HOST	*hd;
1900 	MPT_ADAPTER	*ioc;
1901 	VirtDevice	*vdevice = SCpnt->device->hostdata;
1902 
1903 	if (!vdevice || !vdevice->vtarget || vdevice->vtarget->deleted) {
1904 		SCpnt->result = DID_NO_CONNECT << 16;
1905 		SCpnt->scsi_done(SCpnt);
1906 		return 0;
1907 	}
1908 
1909 	hd = shost_priv(shost);
1910 	ioc = hd->ioc;
1911 
1912 	if (ioc->sas_discovery_quiesce_io)
1913 		return SCSI_MLQUEUE_HOST_BUSY;
1914 
1915 	if (ioc->debug_level & MPT_DEBUG_SCSI)
1916 		scsi_print_command(SCpnt);
1917 
1918 	return mptscsih_qcmd(SCpnt);
1919 }
1920 
1921 /**
1922  *	mptsas_mptsas_eh_timed_out - resets the scsi_cmnd timeout
1923  *		if the device under question is currently in the
1924  *		device removal delay.
1925  *	@sc: scsi command that the midlayer is about to time out
1926  *
1927  **/
1928 static enum blk_eh_timer_return mptsas_eh_timed_out(struct scsi_cmnd *sc)
1929 {
1930 	MPT_SCSI_HOST *hd;
1931 	MPT_ADAPTER   *ioc;
1932 	VirtDevice    *vdevice;
1933 	enum blk_eh_timer_return rc = BLK_EH_NOT_HANDLED;
1934 
1935 	hd = shost_priv(sc->device->host);
1936 	if (hd == NULL) {
1937 		printk(KERN_ERR MYNAM ": %s: Can't locate host! (sc=%p)\n",
1938 		    __func__, sc);
1939 		goto done;
1940 	}
1941 
1942 	ioc = hd->ioc;
1943 	if (ioc->bus_type != SAS) {
1944 		printk(KERN_ERR MYNAM ": %s: Wrong bus type (sc=%p)\n",
1945 		    __func__, sc);
1946 		goto done;
1947 	}
1948 
1949 	/* In case if IOC is in reset from internal context.
1950 	*  Do not execute EEH for the same IOC. SML should to reset timer.
1951 	*/
1952 	if (ioc->ioc_reset_in_progress) {
1953 		dtmprintk(ioc, printk(MYIOC_s_WARN_FMT ": %s: ioc is in reset,"
1954 		    "SML need to reset the timer (sc=%p)\n",
1955 		    ioc->name, __func__, sc));
1956 		rc = BLK_EH_RESET_TIMER;
1957 	}
1958 	vdevice = sc->device->hostdata;
1959 	if (vdevice && vdevice->vtarget && (vdevice->vtarget->inDMD
1960 		|| vdevice->vtarget->deleted)) {
1961 		dtmprintk(ioc, printk(MYIOC_s_WARN_FMT ": %s: target removed "
1962 		    "or in device removal delay (sc=%p)\n",
1963 		    ioc->name, __func__, sc));
1964 		rc = BLK_EH_RESET_TIMER;
1965 		goto done;
1966 	}
1967 
1968 done:
1969 	return rc;
1970 }
1971 
1972 
1973 static struct scsi_host_template mptsas_driver_template = {
1974 	.module				= THIS_MODULE,
1975 	.proc_name			= "mptsas",
1976 	.show_info			= mptscsih_show_info,
1977 	.name				= "MPT SAS Host",
1978 	.info				= mptscsih_info,
1979 	.queuecommand			= mptsas_qcmd,
1980 	.target_alloc			= mptsas_target_alloc,
1981 	.slave_alloc			= mptsas_slave_alloc,
1982 	.slave_configure		= mptsas_slave_configure,
1983 	.target_destroy			= mptsas_target_destroy,
1984 	.slave_destroy			= mptscsih_slave_destroy,
1985 	.change_queue_depth 		= mptscsih_change_queue_depth,
1986 	.eh_timed_out			= mptsas_eh_timed_out,
1987 	.eh_abort_handler		= mptscsih_abort,
1988 	.eh_device_reset_handler	= mptscsih_dev_reset,
1989 	.eh_host_reset_handler		= mptscsih_host_reset,
1990 	.bios_param			= mptscsih_bios_param,
1991 	.can_queue			= MPT_SAS_CAN_QUEUE,
1992 	.this_id			= -1,
1993 	.sg_tablesize			= MPT_SCSI_SG_DEPTH,
1994 	.max_sectors			= 8192,
1995 	.cmd_per_lun			= 7,
1996 	.use_clustering			= ENABLE_CLUSTERING,
1997 	.shost_attrs			= mptscsih_host_attrs,
1998 };
1999 
2000 static int mptsas_get_linkerrors(struct sas_phy *phy)
2001 {
2002 	MPT_ADAPTER *ioc = phy_to_ioc(phy);
2003 	ConfigExtendedPageHeader_t hdr;
2004 	CONFIGPARMS cfg;
2005 	SasPhyPage1_t *buffer;
2006 	dma_addr_t dma_handle;
2007 	int error;
2008 
2009 	/* FIXME: only have link errors on local phys */
2010 	if (!scsi_is_sas_phy_local(phy))
2011 		return -EINVAL;
2012 
2013 	hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
2014 	hdr.ExtPageLength = 0;
2015 	hdr.PageNumber = 1 /* page number 1*/;
2016 	hdr.Reserved1 = 0;
2017 	hdr.Reserved2 = 0;
2018 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2019 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
2020 
2021 	cfg.cfghdr.ehdr = &hdr;
2022 	cfg.physAddr = -1;
2023 	cfg.pageAddr = phy->identify.phy_identifier;
2024 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2025 	cfg.dir = 0;    /* read */
2026 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2027 
2028 	error = mpt_config(ioc, &cfg);
2029 	if (error)
2030 		return error;
2031 	if (!hdr.ExtPageLength)
2032 		return -ENXIO;
2033 
2034 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2035 				      &dma_handle);
2036 	if (!buffer)
2037 		return -ENOMEM;
2038 
2039 	cfg.physAddr = dma_handle;
2040 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2041 
2042 	error = mpt_config(ioc, &cfg);
2043 	if (error)
2044 		goto out_free_consistent;
2045 
2046 	mptsas_print_phy_pg1(ioc, buffer);
2047 
2048 	phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
2049 	phy->running_disparity_error_count =
2050 		le32_to_cpu(buffer->RunningDisparityErrorCount);
2051 	phy->loss_of_dword_sync_count =
2052 		le32_to_cpu(buffer->LossDwordSynchCount);
2053 	phy->phy_reset_problem_count =
2054 		le32_to_cpu(buffer->PhyResetProblemCount);
2055 
2056  out_free_consistent:
2057 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2058 			    buffer, dma_handle);
2059 	return error;
2060 }
2061 
2062 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
2063 		MPT_FRAME_HDR *reply)
2064 {
2065 	ioc->sas_mgmt.status |= MPT_MGMT_STATUS_COMMAND_GOOD;
2066 	if (reply != NULL) {
2067 		ioc->sas_mgmt.status |= MPT_MGMT_STATUS_RF_VALID;
2068 		memcpy(ioc->sas_mgmt.reply, reply,
2069 		    min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
2070 	}
2071 
2072 	if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_PENDING) {
2073 		ioc->sas_mgmt.status &= ~MPT_MGMT_STATUS_PENDING;
2074 		complete(&ioc->sas_mgmt.done);
2075 		return 1;
2076 	}
2077 	return 0;
2078 }
2079 
2080 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
2081 {
2082 	MPT_ADAPTER *ioc = phy_to_ioc(phy);
2083 	SasIoUnitControlRequest_t *req;
2084 	SasIoUnitControlReply_t *reply;
2085 	MPT_FRAME_HDR *mf;
2086 	MPIHeader_t *hdr;
2087 	unsigned long timeleft;
2088 	int error = -ERESTARTSYS;
2089 
2090 	/* FIXME: fusion doesn't allow non-local phy reset */
2091 	if (!scsi_is_sas_phy_local(phy))
2092 		return -EINVAL;
2093 
2094 	/* not implemented for expanders */
2095 	if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
2096 		return -ENXIO;
2097 
2098 	if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
2099 		goto out;
2100 
2101 	mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
2102 	if (!mf) {
2103 		error = -ENOMEM;
2104 		goto out_unlock;
2105 	}
2106 
2107 	hdr = (MPIHeader_t *) mf;
2108 	req = (SasIoUnitControlRequest_t *)mf;
2109 	memset(req, 0, sizeof(SasIoUnitControlRequest_t));
2110 	req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
2111 	req->MsgContext = hdr->MsgContext;
2112 	req->Operation = hard_reset ?
2113 		MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
2114 	req->PhyNum = phy->identify.phy_identifier;
2115 
2116 	INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status)
2117 	mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
2118 
2119 	timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
2120 			10 * HZ);
2121 	if (!(ioc->sas_mgmt.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2122 		error = -ETIME;
2123 		mpt_free_msg_frame(ioc, mf);
2124 		if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_DID_IOCRESET)
2125 			goto out_unlock;
2126 		if (!timeleft)
2127 			mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
2128 		goto out_unlock;
2129 	}
2130 
2131 	/* a reply frame is expected */
2132 	if ((ioc->sas_mgmt.status &
2133 	    MPT_MGMT_STATUS_RF_VALID) == 0) {
2134 		error = -ENXIO;
2135 		goto out_unlock;
2136 	}
2137 
2138 	/* process the completed Reply Message Frame */
2139 	reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
2140 	if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
2141 		printk(MYIOC_s_INFO_FMT "%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
2142 		    ioc->name, __func__, reply->IOCStatus, reply->IOCLogInfo);
2143 		error = -ENXIO;
2144 		goto out_unlock;
2145 	}
2146 
2147 	error = 0;
2148 
2149  out_unlock:
2150 	CLEAR_MGMT_STATUS(ioc->sas_mgmt.status)
2151 	mutex_unlock(&ioc->sas_mgmt.mutex);
2152  out:
2153 	return error;
2154 }
2155 
2156 static int
2157 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
2158 {
2159 	MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
2160 	int i, error;
2161 	struct mptsas_portinfo *p;
2162 	struct mptsas_enclosure enclosure_info;
2163 	u64 enclosure_handle;
2164 
2165 	mutex_lock(&ioc->sas_topology_mutex);
2166 	list_for_each_entry(p, &ioc->sas_topology, list) {
2167 		for (i = 0; i < p->num_phys; i++) {
2168 			if (p->phy_info[i].attached.sas_address ==
2169 			    rphy->identify.sas_address) {
2170 				enclosure_handle = p->phy_info[i].
2171 					attached.handle_enclosure;
2172 				goto found_info;
2173 			}
2174 		}
2175 	}
2176 	mutex_unlock(&ioc->sas_topology_mutex);
2177 	return -ENXIO;
2178 
2179  found_info:
2180 	mutex_unlock(&ioc->sas_topology_mutex);
2181 	memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
2182 	error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
2183 			(MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
2184 			 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
2185 	if (!error)
2186 		*identifier = enclosure_info.enclosure_logical_id;
2187 	return error;
2188 }
2189 
2190 static int
2191 mptsas_get_bay_identifier(struct sas_rphy *rphy)
2192 {
2193 	MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
2194 	struct mptsas_portinfo *p;
2195 	int i, rc;
2196 
2197 	mutex_lock(&ioc->sas_topology_mutex);
2198 	list_for_each_entry(p, &ioc->sas_topology, list) {
2199 		for (i = 0; i < p->num_phys; i++) {
2200 			if (p->phy_info[i].attached.sas_address ==
2201 			    rphy->identify.sas_address) {
2202 				rc = p->phy_info[i].attached.slot;
2203 				goto out;
2204 			}
2205 		}
2206 	}
2207 	rc = -ENXIO;
2208  out:
2209 	mutex_unlock(&ioc->sas_topology_mutex);
2210 	return rc;
2211 }
2212 
2213 static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
2214 			      struct request *req)
2215 {
2216 	MPT_ADAPTER *ioc = ((MPT_SCSI_HOST *) shost->hostdata)->ioc;
2217 	MPT_FRAME_HDR *mf;
2218 	SmpPassthroughRequest_t *smpreq;
2219 	struct request *rsp = req->next_rq;
2220 	int ret;
2221 	int flagsLength;
2222 	unsigned long timeleft;
2223 	char *psge;
2224 	dma_addr_t dma_addr_in = 0;
2225 	dma_addr_t dma_addr_out = 0;
2226 	u64 sas_address = 0;
2227 
2228 	if (!rsp) {
2229 		printk(MYIOC_s_ERR_FMT "%s: the smp response space is missing\n",
2230 		    ioc->name, __func__);
2231 		return -EINVAL;
2232 	}
2233 
2234 	/* do we need to support multiple segments? */
2235 	if (bio_multiple_segments(req->bio) ||
2236 	    bio_multiple_segments(rsp->bio)) {
2237 		printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u, rsp %u\n",
2238 		    ioc->name, __func__, blk_rq_bytes(req), blk_rq_bytes(rsp));
2239 		return -EINVAL;
2240 	}
2241 
2242 	ret = mutex_lock_interruptible(&ioc->sas_mgmt.mutex);
2243 	if (ret)
2244 		goto out;
2245 
2246 	mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
2247 	if (!mf) {
2248 		ret = -ENOMEM;
2249 		goto out_unlock;
2250 	}
2251 
2252 	smpreq = (SmpPassthroughRequest_t *)mf;
2253 	memset(smpreq, 0, sizeof(*smpreq));
2254 
2255 	smpreq->RequestDataLength = cpu_to_le16(blk_rq_bytes(req) - 4);
2256 	smpreq->Function = MPI_FUNCTION_SMP_PASSTHROUGH;
2257 
2258 	if (rphy)
2259 		sas_address = rphy->identify.sas_address;
2260 	else {
2261 		struct mptsas_portinfo *port_info;
2262 
2263 		mutex_lock(&ioc->sas_topology_mutex);
2264 		port_info = ioc->hba_port_info;
2265 		if (port_info && port_info->phy_info)
2266 			sas_address =
2267 				port_info->phy_info[0].phy->identify.sas_address;
2268 		mutex_unlock(&ioc->sas_topology_mutex);
2269 	}
2270 
2271 	*((u64 *)&smpreq->SASAddress) = cpu_to_le64(sas_address);
2272 
2273 	psge = (char *)
2274 		(((int *) mf) + (offsetof(SmpPassthroughRequest_t, SGL) / 4));
2275 
2276 	/* request */
2277 	flagsLength = (MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2278 		       MPI_SGE_FLAGS_END_OF_BUFFER |
2279 		       MPI_SGE_FLAGS_DIRECTION)
2280 		       << MPI_SGE_FLAGS_SHIFT;
2281 	flagsLength |= (blk_rq_bytes(req) - 4);
2282 
2283 	dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio),
2284 				      blk_rq_bytes(req), PCI_DMA_BIDIRECTIONAL);
2285 	if (pci_dma_mapping_error(ioc->pcidev, dma_addr_out))
2286 		goto put_mf;
2287 	ioc->add_sge(psge, flagsLength, dma_addr_out);
2288 	psge += ioc->SGE_size;
2289 
2290 	/* response */
2291 	flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2292 		MPI_SGE_FLAGS_SYSTEM_ADDRESS |
2293 		MPI_SGE_FLAGS_IOC_TO_HOST |
2294 		MPI_SGE_FLAGS_END_OF_BUFFER;
2295 
2296 	flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT;
2297 	flagsLength |= blk_rq_bytes(rsp) + 4;
2298 	dma_addr_in =  pci_map_single(ioc->pcidev, bio_data(rsp->bio),
2299 				      blk_rq_bytes(rsp), PCI_DMA_BIDIRECTIONAL);
2300 	if (pci_dma_mapping_error(ioc->pcidev, dma_addr_in))
2301 		goto unmap;
2302 	ioc->add_sge(psge, flagsLength, dma_addr_in);
2303 
2304 	INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status)
2305 	mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
2306 
2307 	timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
2308 	if (!(ioc->sas_mgmt.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2309 		ret = -ETIME;
2310 		mpt_free_msg_frame(ioc, mf);
2311 		mf = NULL;
2312 		if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_DID_IOCRESET)
2313 			goto unmap;
2314 		if (!timeleft)
2315 			mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
2316 		goto unmap;
2317 	}
2318 	mf = NULL;
2319 
2320 	if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_RF_VALID) {
2321 		SmpPassthroughReply_t *smprep;
2322 
2323 		smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply;
2324 		memcpy(scsi_req(req)->sense, smprep, sizeof(*smprep));
2325 		scsi_req(req)->sense_len = sizeof(*smprep);
2326 		scsi_req(req)->resid_len = 0;
2327 		scsi_req(rsp)->resid_len -= smprep->ResponseDataLength;
2328 	} else {
2329 		printk(MYIOC_s_ERR_FMT
2330 		    "%s: smp passthru reply failed to be returned\n",
2331 		    ioc->name, __func__);
2332 		ret = -ENXIO;
2333 	}
2334 unmap:
2335 	if (dma_addr_out)
2336 		pci_unmap_single(ioc->pcidev, dma_addr_out, blk_rq_bytes(req),
2337 				 PCI_DMA_BIDIRECTIONAL);
2338 	if (dma_addr_in)
2339 		pci_unmap_single(ioc->pcidev, dma_addr_in, blk_rq_bytes(rsp),
2340 				 PCI_DMA_BIDIRECTIONAL);
2341 put_mf:
2342 	if (mf)
2343 		mpt_free_msg_frame(ioc, mf);
2344 out_unlock:
2345 	CLEAR_MGMT_STATUS(ioc->sas_mgmt.status)
2346 	mutex_unlock(&ioc->sas_mgmt.mutex);
2347 out:
2348 	return ret;
2349 }
2350 
2351 static struct sas_function_template mptsas_transport_functions = {
2352 	.get_linkerrors		= mptsas_get_linkerrors,
2353 	.get_enclosure_identifier = mptsas_get_enclosure_identifier,
2354 	.get_bay_identifier	= mptsas_get_bay_identifier,
2355 	.phy_reset		= mptsas_phy_reset,
2356 	.smp_handler		= mptsas_smp_handler,
2357 };
2358 
2359 static struct scsi_transport_template *mptsas_transport_template;
2360 
2361 static int
2362 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
2363 {
2364 	ConfigExtendedPageHeader_t hdr;
2365 	CONFIGPARMS cfg;
2366 	SasIOUnitPage0_t *buffer;
2367 	dma_addr_t dma_handle;
2368 	int error, i;
2369 
2370 	hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
2371 	hdr.ExtPageLength = 0;
2372 	hdr.PageNumber = 0;
2373 	hdr.Reserved1 = 0;
2374 	hdr.Reserved2 = 0;
2375 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2376 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
2377 
2378 	cfg.cfghdr.ehdr = &hdr;
2379 	cfg.physAddr = -1;
2380 	cfg.pageAddr = 0;
2381 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2382 	cfg.dir = 0;	/* read */
2383 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2384 
2385 	error = mpt_config(ioc, &cfg);
2386 	if (error)
2387 		goto out;
2388 	if (!hdr.ExtPageLength) {
2389 		error = -ENXIO;
2390 		goto out;
2391 	}
2392 
2393 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2394 					    &dma_handle);
2395 	if (!buffer) {
2396 		error = -ENOMEM;
2397 		goto out;
2398 	}
2399 
2400 	cfg.physAddr = dma_handle;
2401 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2402 
2403 	error = mpt_config(ioc, &cfg);
2404 	if (error)
2405 		goto out_free_consistent;
2406 
2407 	port_info->num_phys = buffer->NumPhys;
2408 	port_info->phy_info = kcalloc(port_info->num_phys,
2409 		sizeof(struct mptsas_phyinfo), GFP_KERNEL);
2410 	if (!port_info->phy_info) {
2411 		error = -ENOMEM;
2412 		goto out_free_consistent;
2413 	}
2414 
2415 	ioc->nvdata_version_persistent =
2416 	    le16_to_cpu(buffer->NvdataVersionPersistent);
2417 	ioc->nvdata_version_default =
2418 	    le16_to_cpu(buffer->NvdataVersionDefault);
2419 
2420 	for (i = 0; i < port_info->num_phys; i++) {
2421 		mptsas_print_phy_data(ioc, &buffer->PhyData[i]);
2422 		port_info->phy_info[i].phy_id = i;
2423 		port_info->phy_info[i].port_id =
2424 		    buffer->PhyData[i].Port;
2425 		port_info->phy_info[i].negotiated_link_rate =
2426 		    buffer->PhyData[i].NegotiatedLinkRate;
2427 		port_info->phy_info[i].portinfo = port_info;
2428 		port_info->phy_info[i].handle =
2429 		    le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
2430 	}
2431 
2432  out_free_consistent:
2433 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2434 			    buffer, dma_handle);
2435  out:
2436 	return error;
2437 }
2438 
2439 static int
2440 mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc)
2441 {
2442 	ConfigExtendedPageHeader_t hdr;
2443 	CONFIGPARMS cfg;
2444 	SasIOUnitPage1_t *buffer;
2445 	dma_addr_t dma_handle;
2446 	int error;
2447 	u8 device_missing_delay;
2448 
2449 	memset(&hdr, 0, sizeof(ConfigExtendedPageHeader_t));
2450 	memset(&cfg, 0, sizeof(CONFIGPARMS));
2451 
2452 	cfg.cfghdr.ehdr = &hdr;
2453 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2454 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2455 	cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2456 	cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
2457 	cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION;
2458 	cfg.cfghdr.ehdr->PageNumber = 1;
2459 
2460 	error = mpt_config(ioc, &cfg);
2461 	if (error)
2462 		goto out;
2463 	if (!hdr.ExtPageLength) {
2464 		error = -ENXIO;
2465 		goto out;
2466 	}
2467 
2468 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2469 					    &dma_handle);
2470 	if (!buffer) {
2471 		error = -ENOMEM;
2472 		goto out;
2473 	}
2474 
2475 	cfg.physAddr = dma_handle;
2476 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2477 
2478 	error = mpt_config(ioc, &cfg);
2479 	if (error)
2480 		goto out_free_consistent;
2481 
2482 	ioc->io_missing_delay  =
2483 	    le16_to_cpu(buffer->IODeviceMissingDelay);
2484 	device_missing_delay = buffer->ReportDeviceMissingDelay;
2485 	ioc->device_missing_delay = (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) ?
2486 	    (device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16 :
2487 	    device_missing_delay & MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK;
2488 
2489  out_free_consistent:
2490 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2491 			    buffer, dma_handle);
2492  out:
2493 	return error;
2494 }
2495 
2496 static int
2497 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
2498 		u32 form, u32 form_specific)
2499 {
2500 	ConfigExtendedPageHeader_t hdr;
2501 	CONFIGPARMS cfg;
2502 	SasPhyPage0_t *buffer;
2503 	dma_addr_t dma_handle;
2504 	int error;
2505 
2506 	hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
2507 	hdr.ExtPageLength = 0;
2508 	hdr.PageNumber = 0;
2509 	hdr.Reserved1 = 0;
2510 	hdr.Reserved2 = 0;
2511 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2512 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
2513 
2514 	cfg.cfghdr.ehdr = &hdr;
2515 	cfg.dir = 0;	/* read */
2516 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2517 
2518 	/* Get Phy Pg 0 for each Phy. */
2519 	cfg.physAddr = -1;
2520 	cfg.pageAddr = form + form_specific;
2521 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2522 
2523 	error = mpt_config(ioc, &cfg);
2524 	if (error)
2525 		goto out;
2526 
2527 	if (!hdr.ExtPageLength) {
2528 		error = -ENXIO;
2529 		goto out;
2530 	}
2531 
2532 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2533 				      &dma_handle);
2534 	if (!buffer) {
2535 		error = -ENOMEM;
2536 		goto out;
2537 	}
2538 
2539 	cfg.physAddr = dma_handle;
2540 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2541 
2542 	error = mpt_config(ioc, &cfg);
2543 	if (error)
2544 		goto out_free_consistent;
2545 
2546 	mptsas_print_phy_pg0(ioc, buffer);
2547 
2548 	phy_info->hw_link_rate = buffer->HwLinkRate;
2549 	phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
2550 	phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
2551 	phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
2552 
2553  out_free_consistent:
2554 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2555 			    buffer, dma_handle);
2556  out:
2557 	return error;
2558 }
2559 
2560 static int
2561 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
2562 		u32 form, u32 form_specific)
2563 {
2564 	ConfigExtendedPageHeader_t hdr;
2565 	CONFIGPARMS cfg;
2566 	SasDevicePage0_t *buffer;
2567 	dma_addr_t dma_handle;
2568 	__le64 sas_address;
2569 	int error=0;
2570 
2571 	hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
2572 	hdr.ExtPageLength = 0;
2573 	hdr.PageNumber = 0;
2574 	hdr.Reserved1 = 0;
2575 	hdr.Reserved2 = 0;
2576 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2577 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
2578 
2579 	cfg.cfghdr.ehdr = &hdr;
2580 	cfg.pageAddr = form + form_specific;
2581 	cfg.physAddr = -1;
2582 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2583 	cfg.dir = 0;	/* read */
2584 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2585 
2586 	memset(device_info, 0, sizeof(struct mptsas_devinfo));
2587 	error = mpt_config(ioc, &cfg);
2588 	if (error)
2589 		goto out;
2590 	if (!hdr.ExtPageLength) {
2591 		error = -ENXIO;
2592 		goto out;
2593 	}
2594 
2595 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2596 				      &dma_handle);
2597 	if (!buffer) {
2598 		error = -ENOMEM;
2599 		goto out;
2600 	}
2601 
2602 	cfg.physAddr = dma_handle;
2603 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2604 
2605 	error = mpt_config(ioc, &cfg);
2606 
2607 	if (error == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
2608 		error = -ENODEV;
2609 		goto out_free_consistent;
2610 	}
2611 
2612 	if (error)
2613 		goto out_free_consistent;
2614 
2615 	mptsas_print_device_pg0(ioc, buffer);
2616 
2617 	memset(device_info, 0, sizeof(struct mptsas_devinfo));
2618 	device_info->handle = le16_to_cpu(buffer->DevHandle);
2619 	device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
2620 	device_info->handle_enclosure =
2621 	    le16_to_cpu(buffer->EnclosureHandle);
2622 	device_info->slot = le16_to_cpu(buffer->Slot);
2623 	device_info->phy_id = buffer->PhyNum;
2624 	device_info->port_id = buffer->PhysicalPort;
2625 	device_info->id = buffer->TargetID;
2626 	device_info->phys_disk_num = ~0;
2627 	device_info->channel = buffer->Bus;
2628 	memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
2629 	device_info->sas_address = le64_to_cpu(sas_address);
2630 	device_info->device_info =
2631 	    le32_to_cpu(buffer->DeviceInfo);
2632 	device_info->flags = le16_to_cpu(buffer->Flags);
2633 
2634  out_free_consistent:
2635 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2636 			    buffer, dma_handle);
2637  out:
2638 	return error;
2639 }
2640 
2641 static int
2642 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
2643 		u32 form, u32 form_specific)
2644 {
2645 	ConfigExtendedPageHeader_t hdr;
2646 	CONFIGPARMS cfg;
2647 	SasExpanderPage0_t *buffer;
2648 	dma_addr_t dma_handle;
2649 	int i, error;
2650 	__le64 sas_address;
2651 
2652 	memset(port_info, 0, sizeof(struct mptsas_portinfo));
2653 	hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
2654 	hdr.ExtPageLength = 0;
2655 	hdr.PageNumber = 0;
2656 	hdr.Reserved1 = 0;
2657 	hdr.Reserved2 = 0;
2658 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2659 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
2660 
2661 	cfg.cfghdr.ehdr = &hdr;
2662 	cfg.physAddr = -1;
2663 	cfg.pageAddr = form + form_specific;
2664 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2665 	cfg.dir = 0;	/* read */
2666 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2667 
2668 	memset(port_info, 0, sizeof(struct mptsas_portinfo));
2669 	error = mpt_config(ioc, &cfg);
2670 	if (error)
2671 		goto out;
2672 
2673 	if (!hdr.ExtPageLength) {
2674 		error = -ENXIO;
2675 		goto out;
2676 	}
2677 
2678 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2679 				      &dma_handle);
2680 	if (!buffer) {
2681 		error = -ENOMEM;
2682 		goto out;
2683 	}
2684 
2685 	cfg.physAddr = dma_handle;
2686 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2687 
2688 	error = mpt_config(ioc, &cfg);
2689 	if (error == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
2690 		error = -ENODEV;
2691 		goto out_free_consistent;
2692 	}
2693 
2694 	if (error)
2695 		goto out_free_consistent;
2696 
2697 	/* save config data */
2698 	port_info->num_phys = (buffer->NumPhys) ? buffer->NumPhys : 1;
2699 	port_info->phy_info = kcalloc(port_info->num_phys,
2700 		sizeof(struct mptsas_phyinfo), GFP_KERNEL);
2701 	if (!port_info->phy_info) {
2702 		error = -ENOMEM;
2703 		goto out_free_consistent;
2704 	}
2705 
2706 	memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
2707 	for (i = 0; i < port_info->num_phys; i++) {
2708 		port_info->phy_info[i].portinfo = port_info;
2709 		port_info->phy_info[i].handle =
2710 		    le16_to_cpu(buffer->DevHandle);
2711 		port_info->phy_info[i].identify.sas_address =
2712 		    le64_to_cpu(sas_address);
2713 		port_info->phy_info[i].identify.handle_parent =
2714 		    le16_to_cpu(buffer->ParentDevHandle);
2715 	}
2716 
2717  out_free_consistent:
2718 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2719 			    buffer, dma_handle);
2720  out:
2721 	return error;
2722 }
2723 
2724 static int
2725 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
2726 		u32 form, u32 form_specific)
2727 {
2728 	ConfigExtendedPageHeader_t hdr;
2729 	CONFIGPARMS cfg;
2730 	SasExpanderPage1_t *buffer;
2731 	dma_addr_t dma_handle;
2732 	int error=0;
2733 
2734 	hdr.PageVersion = MPI_SASEXPANDER1_PAGEVERSION;
2735 	hdr.ExtPageLength = 0;
2736 	hdr.PageNumber = 1;
2737 	hdr.Reserved1 = 0;
2738 	hdr.Reserved2 = 0;
2739 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
2740 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
2741 
2742 	cfg.cfghdr.ehdr = &hdr;
2743 	cfg.physAddr = -1;
2744 	cfg.pageAddr = form + form_specific;
2745 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2746 	cfg.dir = 0;	/* read */
2747 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
2748 
2749 	error = mpt_config(ioc, &cfg);
2750 	if (error)
2751 		goto out;
2752 
2753 	if (!hdr.ExtPageLength) {
2754 		error = -ENXIO;
2755 		goto out;
2756 	}
2757 
2758 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2759 				      &dma_handle);
2760 	if (!buffer) {
2761 		error = -ENOMEM;
2762 		goto out;
2763 	}
2764 
2765 	cfg.physAddr = dma_handle;
2766 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2767 
2768 	error = mpt_config(ioc, &cfg);
2769 
2770 	if (error == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
2771 		error = -ENODEV;
2772 		goto out_free_consistent;
2773 	}
2774 
2775 	if (error)
2776 		goto out_free_consistent;
2777 
2778 
2779 	mptsas_print_expander_pg1(ioc, buffer);
2780 
2781 	/* save config data */
2782 	phy_info->phy_id = buffer->PhyIdentifier;
2783 	phy_info->port_id = buffer->PhysicalPort;
2784 	phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
2785 	phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
2786 	phy_info->hw_link_rate = buffer->HwLinkRate;
2787 	phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
2788 	phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
2789 
2790  out_free_consistent:
2791 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
2792 			    buffer, dma_handle);
2793  out:
2794 	return error;
2795 }
2796 
2797 struct rep_manu_request{
2798 	u8 smp_frame_type;
2799 	u8 function;
2800 	u8 reserved;
2801 	u8 request_length;
2802 };
2803 
2804 struct rep_manu_reply{
2805 	u8 smp_frame_type; /* 0x41 */
2806 	u8 function; /* 0x01 */
2807 	u8 function_result;
2808 	u8 response_length;
2809 	u16 expander_change_count;
2810 	u8 reserved0[2];
2811 	u8 sas_format:1;
2812 	u8 reserved1:7;
2813 	u8 reserved2[3];
2814 	u8 vendor_id[SAS_EXPANDER_VENDOR_ID_LEN];
2815 	u8 product_id[SAS_EXPANDER_PRODUCT_ID_LEN];
2816 	u8 product_rev[SAS_EXPANDER_PRODUCT_REV_LEN];
2817 	u8 component_vendor_id[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN];
2818 	u16 component_id;
2819 	u8 component_revision_id;
2820 	u8 reserved3;
2821 	u8 vendor_specific[8];
2822 };
2823 
2824 /**
2825   * mptsas_exp_repmanufacture_info -
2826   * @ioc: per adapter object
2827   * @sas_address: expander sas address
2828   * @edev: the sas_expander_device object
2829   *
2830   * Fills in the sas_expander_device object when SMP port is created.
2831   *
2832   * Returns 0 for success, non-zero for failure.
2833   */
2834 static int
2835 mptsas_exp_repmanufacture_info(MPT_ADAPTER *ioc,
2836 	u64 sas_address, struct sas_expander_device *edev)
2837 {
2838 	MPT_FRAME_HDR *mf;
2839 	SmpPassthroughRequest_t *smpreq;
2840 	SmpPassthroughReply_t *smprep;
2841 	struct rep_manu_reply *manufacture_reply;
2842 	struct rep_manu_request *manufacture_request;
2843 	int ret;
2844 	int flagsLength;
2845 	unsigned long timeleft;
2846 	char *psge;
2847 	unsigned long flags;
2848 	void *data_out = NULL;
2849 	dma_addr_t data_out_dma = 0;
2850 	u32 sz;
2851 
2852 	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
2853 	if (ioc->ioc_reset_in_progress) {
2854 		spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
2855 		printk(MYIOC_s_INFO_FMT "%s: host reset in progress!\n",
2856 			__func__, ioc->name);
2857 		return -EFAULT;
2858 	}
2859 	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
2860 
2861 	ret = mutex_lock_interruptible(&ioc->sas_mgmt.mutex);
2862 	if (ret)
2863 		goto out;
2864 
2865 	mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
2866 	if (!mf) {
2867 		ret = -ENOMEM;
2868 		goto out_unlock;
2869 	}
2870 
2871 	smpreq = (SmpPassthroughRequest_t *)mf;
2872 	memset(smpreq, 0, sizeof(*smpreq));
2873 
2874 	sz = sizeof(struct rep_manu_request) + sizeof(struct rep_manu_reply);
2875 
2876 	data_out = pci_alloc_consistent(ioc->pcidev, sz, &data_out_dma);
2877 	if (!data_out) {
2878 		printk(KERN_ERR "Memory allocation failure at %s:%d/%s()!\n",
2879 			__FILE__, __LINE__, __func__);
2880 		ret = -ENOMEM;
2881 		goto put_mf;
2882 	}
2883 
2884 	manufacture_request = data_out;
2885 	manufacture_request->smp_frame_type = 0x40;
2886 	manufacture_request->function = 1;
2887 	manufacture_request->reserved = 0;
2888 	manufacture_request->request_length = 0;
2889 
2890 	smpreq->Function = MPI_FUNCTION_SMP_PASSTHROUGH;
2891 	smpreq->PhysicalPort = 0xFF;
2892 	*((u64 *)&smpreq->SASAddress) = cpu_to_le64(sas_address);
2893 	smpreq->RequestDataLength = sizeof(struct rep_manu_request);
2894 
2895 	psge = (char *)
2896 		(((int *) mf) + (offsetof(SmpPassthroughRequest_t, SGL) / 4));
2897 
2898 	flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2899 		MPI_SGE_FLAGS_SYSTEM_ADDRESS |
2900 		MPI_SGE_FLAGS_HOST_TO_IOC |
2901 		MPI_SGE_FLAGS_END_OF_BUFFER;
2902 	flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT;
2903 	flagsLength |= sizeof(struct rep_manu_request);
2904 
2905 	ioc->add_sge(psge, flagsLength, data_out_dma);
2906 	psge += ioc->SGE_size;
2907 
2908 	flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
2909 		MPI_SGE_FLAGS_SYSTEM_ADDRESS |
2910 		MPI_SGE_FLAGS_IOC_TO_HOST |
2911 		MPI_SGE_FLAGS_END_OF_BUFFER;
2912 	flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT;
2913 	flagsLength |= sizeof(struct rep_manu_reply);
2914 	ioc->add_sge(psge, flagsLength, data_out_dma +
2915 	sizeof(struct rep_manu_request));
2916 
2917 	INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status)
2918 	mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
2919 
2920 	timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
2921 	if (!(ioc->sas_mgmt.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
2922 		ret = -ETIME;
2923 		mpt_free_msg_frame(ioc, mf);
2924 		mf = NULL;
2925 		if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_DID_IOCRESET)
2926 			goto out_free;
2927 		if (!timeleft)
2928 			mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
2929 		goto out_free;
2930 	}
2931 
2932 	mf = NULL;
2933 
2934 	if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_RF_VALID) {
2935 		u8 *tmp;
2936 
2937 	smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply;
2938 	if (le16_to_cpu(smprep->ResponseDataLength) !=
2939 		sizeof(struct rep_manu_reply))
2940 			goto out_free;
2941 
2942 	manufacture_reply = data_out + sizeof(struct rep_manu_request);
2943 	strncpy(edev->vendor_id, manufacture_reply->vendor_id,
2944 		SAS_EXPANDER_VENDOR_ID_LEN);
2945 	strncpy(edev->product_id, manufacture_reply->product_id,
2946 		SAS_EXPANDER_PRODUCT_ID_LEN);
2947 	strncpy(edev->product_rev, manufacture_reply->product_rev,
2948 		SAS_EXPANDER_PRODUCT_REV_LEN);
2949 	edev->level = manufacture_reply->sas_format;
2950 	if (manufacture_reply->sas_format) {
2951 		strncpy(edev->component_vendor_id,
2952 			manufacture_reply->component_vendor_id,
2953 				SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN);
2954 		tmp = (u8 *)&manufacture_reply->component_id;
2955 		edev->component_id = tmp[0] << 8 | tmp[1];
2956 		edev->component_revision_id =
2957 			manufacture_reply->component_revision_id;
2958 		}
2959 	} else {
2960 		printk(MYIOC_s_ERR_FMT
2961 			"%s: smp passthru reply failed to be returned\n",
2962 			ioc->name, __func__);
2963 		ret = -ENXIO;
2964 	}
2965 out_free:
2966 	if (data_out_dma)
2967 		pci_free_consistent(ioc->pcidev, sz, data_out, data_out_dma);
2968 put_mf:
2969 	if (mf)
2970 		mpt_free_msg_frame(ioc, mf);
2971 out_unlock:
2972 	CLEAR_MGMT_STATUS(ioc->sas_mgmt.status)
2973 	mutex_unlock(&ioc->sas_mgmt.mutex);
2974 out:
2975 	return ret;
2976  }
2977 
2978 static void
2979 mptsas_parse_device_info(struct sas_identify *identify,
2980 		struct mptsas_devinfo *device_info)
2981 {
2982 	u16 protocols;
2983 
2984 	identify->sas_address = device_info->sas_address;
2985 	identify->phy_identifier = device_info->phy_id;
2986 
2987 	/*
2988 	 * Fill in Phy Initiator Port Protocol.
2989 	 * Bits 6:3, more than one bit can be set, fall through cases.
2990 	 */
2991 	protocols = device_info->device_info & 0x78;
2992 	identify->initiator_port_protocols = 0;
2993 	if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
2994 		identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
2995 	if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
2996 		identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
2997 	if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
2998 		identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
2999 	if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
3000 		identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
3001 
3002 	/*
3003 	 * Fill in Phy Target Port Protocol.
3004 	 * Bits 10:7, more than one bit can be set, fall through cases.
3005 	 */
3006 	protocols = device_info->device_info & 0x780;
3007 	identify->target_port_protocols = 0;
3008 	if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
3009 		identify->target_port_protocols |= SAS_PROTOCOL_SSP;
3010 	if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
3011 		identify->target_port_protocols |= SAS_PROTOCOL_STP;
3012 	if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
3013 		identify->target_port_protocols |= SAS_PROTOCOL_SMP;
3014 	if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
3015 		identify->target_port_protocols |= SAS_PROTOCOL_SATA;
3016 
3017 	/*
3018 	 * Fill in Attached device type.
3019 	 */
3020 	switch (device_info->device_info &
3021 			MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
3022 	case MPI_SAS_DEVICE_INFO_NO_DEVICE:
3023 		identify->device_type = SAS_PHY_UNUSED;
3024 		break;
3025 	case MPI_SAS_DEVICE_INFO_END_DEVICE:
3026 		identify->device_type = SAS_END_DEVICE;
3027 		break;
3028 	case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
3029 		identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
3030 		break;
3031 	case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
3032 		identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
3033 		break;
3034 	}
3035 }
3036 
3037 static int mptsas_probe_one_phy(struct device *dev,
3038 		struct mptsas_phyinfo *phy_info, int index, int local)
3039 {
3040 	MPT_ADAPTER *ioc;
3041 	struct sas_phy *phy;
3042 	struct sas_port *port;
3043 	int error = 0;
3044 	VirtTarget *vtarget;
3045 
3046 	if (!dev) {
3047 		error = -ENODEV;
3048 		goto out;
3049 	}
3050 
3051 	if (!phy_info->phy) {
3052 		phy = sas_phy_alloc(dev, index);
3053 		if (!phy) {
3054 			error = -ENOMEM;
3055 			goto out;
3056 		}
3057 	} else
3058 		phy = phy_info->phy;
3059 
3060 	mptsas_parse_device_info(&phy->identify, &phy_info->identify);
3061 
3062 	/*
3063 	 * Set Negotiated link rate.
3064 	 */
3065 	switch (phy_info->negotiated_link_rate) {
3066 	case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
3067 		phy->negotiated_linkrate = SAS_PHY_DISABLED;
3068 		break;
3069 	case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
3070 		phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
3071 		break;
3072 	case MPI_SAS_IOUNIT0_RATE_1_5:
3073 		phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
3074 		break;
3075 	case MPI_SAS_IOUNIT0_RATE_3_0:
3076 		phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
3077 		break;
3078 	case MPI_SAS_IOUNIT0_RATE_6_0:
3079 		phy->negotiated_linkrate = SAS_LINK_RATE_6_0_GBPS;
3080 		break;
3081 	case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
3082 	case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
3083 	default:
3084 		phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
3085 		break;
3086 	}
3087 
3088 	/*
3089 	 * Set Max hardware link rate.
3090 	 */
3091 	switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
3092 	case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
3093 		phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
3094 		break;
3095 	case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
3096 		phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
3097 		break;
3098 	default:
3099 		break;
3100 	}
3101 
3102 	/*
3103 	 * Set Max programmed link rate.
3104 	 */
3105 	switch (phy_info->programmed_link_rate &
3106 			MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
3107 	case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
3108 		phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
3109 		break;
3110 	case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
3111 		phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
3112 		break;
3113 	default:
3114 		break;
3115 	}
3116 
3117 	/*
3118 	 * Set Min hardware link rate.
3119 	 */
3120 	switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
3121 	case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
3122 		phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
3123 		break;
3124 	case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
3125 		phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
3126 		break;
3127 	default:
3128 		break;
3129 	}
3130 
3131 	/*
3132 	 * Set Min programmed link rate.
3133 	 */
3134 	switch (phy_info->programmed_link_rate &
3135 			MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
3136 	case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
3137 		phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
3138 		break;
3139 	case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
3140 		phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
3141 		break;
3142 	default:
3143 		break;
3144 	}
3145 
3146 	if (!phy_info->phy) {
3147 
3148 		error = sas_phy_add(phy);
3149 		if (error) {
3150 			sas_phy_free(phy);
3151 			goto out;
3152 		}
3153 		phy_info->phy = phy;
3154 	}
3155 
3156 	if (!phy_info->attached.handle ||
3157 			!phy_info->port_details)
3158 		goto out;
3159 
3160 	port = mptsas_get_port(phy_info);
3161 	ioc = phy_to_ioc(phy_info->phy);
3162 
3163 	if (phy_info->sas_port_add_phy) {
3164 
3165 		if (!port) {
3166 			port = sas_port_alloc_num(dev);
3167 			if (!port) {
3168 				error = -ENOMEM;
3169 				goto out;
3170 			}
3171 			error = sas_port_add(port);
3172 			if (error) {
3173 				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
3174 					"%s: exit at line=%d\n", ioc->name,
3175 					__func__, __LINE__));
3176 				goto out;
3177 			}
3178 			mptsas_set_port(ioc, phy_info, port);
3179 			devtprintk(ioc, dev_printk(KERN_DEBUG, &port->dev,
3180 			    MYIOC_s_FMT "add port %d, sas_addr (0x%llx)\n",
3181 			    ioc->name, port->port_identifier,
3182 			    (unsigned long long)phy_info->
3183 			    attached.sas_address));
3184 		}
3185 		dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3186 			"sas_port_add_phy: phy_id=%d\n",
3187 			ioc->name, phy_info->phy_id));
3188 		sas_port_add_phy(port, phy_info->phy);
3189 		phy_info->sas_port_add_phy = 0;
3190 		devtprintk(ioc, dev_printk(KERN_DEBUG, &phy_info->phy->dev,
3191 		    MYIOC_s_FMT "add phy %d, phy-obj (0x%p)\n", ioc->name,
3192 		     phy_info->phy_id, phy_info->phy));
3193 	}
3194 	if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
3195 
3196 		struct sas_rphy *rphy;
3197 		struct device *parent;
3198 		struct sas_identify identify;
3199 
3200 		parent = dev->parent->parent;
3201 		/*
3202 		 * Let the hotplug_work thread handle processing
3203 		 * the adding/removing of devices that occur
3204 		 * after start of day.
3205 		 */
3206 		if (mptsas_is_end_device(&phy_info->attached) &&
3207 		    phy_info->attached.handle_parent) {
3208 			goto out;
3209 		}
3210 
3211 		mptsas_parse_device_info(&identify, &phy_info->attached);
3212 		if (scsi_is_host_device(parent)) {
3213 			struct mptsas_portinfo *port_info;
3214 			int i;
3215 
3216 			port_info = ioc->hba_port_info;
3217 
3218 			for (i = 0; i < port_info->num_phys; i++)
3219 				if (port_info->phy_info[i].identify.sas_address ==
3220 				    identify.sas_address) {
3221 					sas_port_mark_backlink(port);
3222 					goto out;
3223 				}
3224 
3225 		} else if (scsi_is_sas_rphy(parent)) {
3226 			struct sas_rphy *parent_rphy = dev_to_rphy(parent);
3227 			if (identify.sas_address ==
3228 			    parent_rphy->identify.sas_address) {
3229 				sas_port_mark_backlink(port);
3230 				goto out;
3231 			}
3232 		}
3233 
3234 		switch (identify.device_type) {
3235 		case SAS_END_DEVICE:
3236 			rphy = sas_end_device_alloc(port);
3237 			break;
3238 		case SAS_EDGE_EXPANDER_DEVICE:
3239 		case SAS_FANOUT_EXPANDER_DEVICE:
3240 			rphy = sas_expander_alloc(port, identify.device_type);
3241 			break;
3242 		default:
3243 			rphy = NULL;
3244 			break;
3245 		}
3246 		if (!rphy) {
3247 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
3248 				"%s: exit at line=%d\n", ioc->name,
3249 				__func__, __LINE__));
3250 			goto out;
3251 		}
3252 
3253 		rphy->identify = identify;
3254 		error = sas_rphy_add(rphy);
3255 		if (error) {
3256 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
3257 				"%s: exit at line=%d\n", ioc->name,
3258 				__func__, __LINE__));
3259 			sas_rphy_free(rphy);
3260 			goto out;
3261 		}
3262 		mptsas_set_rphy(ioc, phy_info, rphy);
3263 		if (identify.device_type == SAS_EDGE_EXPANDER_DEVICE ||
3264 			identify.device_type == SAS_FANOUT_EXPANDER_DEVICE)
3265 				mptsas_exp_repmanufacture_info(ioc,
3266 					identify.sas_address,
3267 					rphy_to_expander_device(rphy));
3268 	}
3269 
3270 	/* If the device exists,verify it wasn't previously flagged
3271 	as a missing device.  If so, clear it */
3272 	vtarget = mptsas_find_vtarget(ioc,
3273 	    phy_info->attached.channel,
3274 	    phy_info->attached.id);
3275 	if (vtarget && vtarget->inDMD) {
3276 		printk(KERN_INFO "Device returned, unsetting inDMD\n");
3277 		vtarget->inDMD = 0;
3278 	}
3279 
3280  out:
3281 	return error;
3282 }
3283 
3284 static int
3285 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
3286 {
3287 	struct mptsas_portinfo *port_info, *hba;
3288 	int error = -ENOMEM, i;
3289 
3290 	hba = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL);
3291 	if (! hba)
3292 		goto out;
3293 
3294 	error = mptsas_sas_io_unit_pg0(ioc, hba);
3295 	if (error)
3296 		goto out_free_port_info;
3297 
3298 	mptsas_sas_io_unit_pg1(ioc);
3299 	mutex_lock(&ioc->sas_topology_mutex);
3300 	port_info = ioc->hba_port_info;
3301 	if (!port_info) {
3302 		ioc->hba_port_info = port_info = hba;
3303 		ioc->hba_port_num_phy = port_info->num_phys;
3304 		list_add_tail(&port_info->list, &ioc->sas_topology);
3305 	} else {
3306 		for (i = 0; i < hba->num_phys; i++) {
3307 			port_info->phy_info[i].negotiated_link_rate =
3308 				hba->phy_info[i].negotiated_link_rate;
3309 			port_info->phy_info[i].handle =
3310 				hba->phy_info[i].handle;
3311 			port_info->phy_info[i].port_id =
3312 				hba->phy_info[i].port_id;
3313 		}
3314 		kfree(hba->phy_info);
3315 		kfree(hba);
3316 		hba = NULL;
3317 	}
3318 	mutex_unlock(&ioc->sas_topology_mutex);
3319 #if defined(CPQ_CIM)
3320 	ioc->num_ports = port_info->num_phys;
3321 #endif
3322 	for (i = 0; i < port_info->num_phys; i++) {
3323 		mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
3324 			(MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
3325 			 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
3326 		port_info->phy_info[i].identify.handle =
3327 		    port_info->phy_info[i].handle;
3328 		mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
3329 			(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
3330 			 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
3331 			 port_info->phy_info[i].identify.handle);
3332 		if (!ioc->hba_port_sas_addr)
3333 			ioc->hba_port_sas_addr =
3334 			    port_info->phy_info[i].identify.sas_address;
3335 		port_info->phy_info[i].identify.phy_id =
3336 		    port_info->phy_info[i].phy_id = i;
3337 		if (port_info->phy_info[i].attached.handle)
3338 			mptsas_sas_device_pg0(ioc,
3339 				&port_info->phy_info[i].attached,
3340 				(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
3341 				 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
3342 				port_info->phy_info[i].attached.handle);
3343 	}
3344 
3345 	mptsas_setup_wide_ports(ioc, port_info);
3346 
3347 	for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
3348 		mptsas_probe_one_phy(&ioc->sh->shost_gendev,
3349 		    &port_info->phy_info[i], ioc->sas_index, 1);
3350 
3351 	return 0;
3352 
3353  out_free_port_info:
3354 	kfree(hba);
3355  out:
3356 	return error;
3357 }
3358 
3359 static void
3360 mptsas_expander_refresh(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
3361 {
3362 	struct mptsas_portinfo *parent;
3363 	struct device *parent_dev;
3364 	struct sas_rphy	*rphy;
3365 	int		i;
3366 	u64		sas_address; /* expander sas address */
3367 	u32		handle;
3368 
3369 	handle = port_info->phy_info[0].handle;
3370 	sas_address = port_info->phy_info[0].identify.sas_address;
3371 	for (i = 0; i < port_info->num_phys; i++) {
3372 		mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
3373 		    (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
3374 		    MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + handle);
3375 
3376 		mptsas_sas_device_pg0(ioc,
3377 		    &port_info->phy_info[i].identify,
3378 		    (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
3379 		    MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
3380 		    port_info->phy_info[i].identify.handle);
3381 		port_info->phy_info[i].identify.phy_id =
3382 		    port_info->phy_info[i].phy_id;
3383 
3384 		if (port_info->phy_info[i].attached.handle) {
3385 			mptsas_sas_device_pg0(ioc,
3386 			    &port_info->phy_info[i].attached,
3387 			    (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
3388 			     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
3389 			    port_info->phy_info[i].attached.handle);
3390 			port_info->phy_info[i].attached.phy_id =
3391 			    port_info->phy_info[i].phy_id;
3392 		}
3393 	}
3394 
3395 	mutex_lock(&ioc->sas_topology_mutex);
3396 	parent = mptsas_find_portinfo_by_handle(ioc,
3397 	    port_info->phy_info[0].identify.handle_parent);
3398 	if (!parent) {
3399 		mutex_unlock(&ioc->sas_topology_mutex);
3400 		return;
3401 	}
3402 	for (i = 0, parent_dev = NULL; i < parent->num_phys && !parent_dev;
3403 	    i++) {
3404 		if (parent->phy_info[i].attached.sas_address == sas_address) {
3405 			rphy = mptsas_get_rphy(&parent->phy_info[i]);
3406 			parent_dev = &rphy->dev;
3407 		}
3408 	}
3409 	mutex_unlock(&ioc->sas_topology_mutex);
3410 
3411 	mptsas_setup_wide_ports(ioc, port_info);
3412 	for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
3413 		mptsas_probe_one_phy(parent_dev, &port_info->phy_info[i],
3414 		    ioc->sas_index, 0);
3415 }
3416 
3417 static void
3418 mptsas_expander_event_add(MPT_ADAPTER *ioc,
3419     MpiEventDataSasExpanderStatusChange_t *expander_data)
3420 {
3421 	struct mptsas_portinfo *port_info;
3422 	int i;
3423 	__le64 sas_address;
3424 
3425 	port_info = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL);
3426 	if (!port_info)
3427 		BUG();
3428 	port_info->num_phys = (expander_data->NumPhys) ?
3429 	    expander_data->NumPhys : 1;
3430 	port_info->phy_info = kcalloc(port_info->num_phys,
3431 	    sizeof(struct mptsas_phyinfo), GFP_KERNEL);
3432 	if (!port_info->phy_info)
3433 		BUG();
3434 	memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64));
3435 	for (i = 0; i < port_info->num_phys; i++) {
3436 		port_info->phy_info[i].portinfo = port_info;
3437 		port_info->phy_info[i].handle =
3438 		    le16_to_cpu(expander_data->DevHandle);
3439 		port_info->phy_info[i].identify.sas_address =
3440 		    le64_to_cpu(sas_address);
3441 		port_info->phy_info[i].identify.handle_parent =
3442 		    le16_to_cpu(expander_data->ParentDevHandle);
3443 	}
3444 
3445 	mutex_lock(&ioc->sas_topology_mutex);
3446 	list_add_tail(&port_info->list, &ioc->sas_topology);
3447 	mutex_unlock(&ioc->sas_topology_mutex);
3448 
3449 	printk(MYIOC_s_INFO_FMT "add expander: num_phys %d, "
3450 	    "sas_addr (0x%llx)\n", ioc->name, port_info->num_phys,
3451 	    (unsigned long long)sas_address);
3452 
3453 	mptsas_expander_refresh(ioc, port_info);
3454 }
3455 
3456 /**
3457  * mptsas_delete_expander_siblings - remove siblings attached to expander
3458  * @ioc: Pointer to MPT_ADAPTER structure
3459  * @parent: the parent port_info object
3460  * @expander: the expander port_info object
3461  **/
3462 static void
3463 mptsas_delete_expander_siblings(MPT_ADAPTER *ioc, struct mptsas_portinfo
3464     *parent, struct mptsas_portinfo *expander)
3465 {
3466 	struct mptsas_phyinfo *phy_info;
3467 	struct mptsas_portinfo *port_info;
3468 	struct sas_rphy *rphy;
3469 	int i;
3470 
3471 	phy_info = expander->phy_info;
3472 	for (i = 0; i < expander->num_phys; i++, phy_info++) {
3473 		rphy = mptsas_get_rphy(phy_info);
3474 		if (!rphy)
3475 			continue;
3476 		if (rphy->identify.device_type == SAS_END_DEVICE)
3477 			mptsas_del_end_device(ioc, phy_info);
3478 	}
3479 
3480 	phy_info = expander->phy_info;
3481 	for (i = 0; i < expander->num_phys; i++, phy_info++) {
3482 		rphy = mptsas_get_rphy(phy_info);
3483 		if (!rphy)
3484 			continue;
3485 		if (rphy->identify.device_type ==
3486 		    MPI_SAS_DEVICE_INFO_EDGE_EXPANDER ||
3487 		    rphy->identify.device_type ==
3488 		    MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER) {
3489 			port_info = mptsas_find_portinfo_by_sas_address(ioc,
3490 			    rphy->identify.sas_address);
3491 			if (!port_info)
3492 				continue;
3493 			if (port_info == parent) /* backlink rphy */
3494 				continue;
3495 			/*
3496 			Delete this expander even if the expdevpage is exists
3497 			because the parent expander is already deleted
3498 			*/
3499 			mptsas_expander_delete(ioc, port_info, 1);
3500 		}
3501 	}
3502 }
3503 
3504 
3505 /**
3506  *	mptsas_expander_delete - remove this expander
3507  *	@ioc: Pointer to MPT_ADAPTER structure
3508  *	@port_info: expander port_info struct
3509  *	@force: Flag to forcefully delete the expander
3510  *
3511  **/
3512 
3513 static void mptsas_expander_delete(MPT_ADAPTER *ioc,
3514 		struct mptsas_portinfo *port_info, u8 force)
3515 {
3516 
3517 	struct mptsas_portinfo *parent;
3518 	int		i;
3519 	u64		expander_sas_address;
3520 	struct mptsas_phyinfo *phy_info;
3521 	struct mptsas_portinfo buffer;
3522 	struct mptsas_portinfo_details *port_details;
3523 	struct sas_port *port;
3524 
3525 	if (!port_info)
3526 		return;
3527 
3528 	/* see if expander is still there before deleting */
3529 	mptsas_sas_expander_pg0(ioc, &buffer,
3530 	    (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
3531 	    MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
3532 	    port_info->phy_info[0].identify.handle);
3533 
3534 	if (buffer.num_phys) {
3535 		kfree(buffer.phy_info);
3536 		if (!force)
3537 			return;
3538 	}
3539 
3540 
3541 	/*
3542 	 * Obtain the port_info instance to the parent port
3543 	 */
3544 	port_details = NULL;
3545 	expander_sas_address =
3546 	    port_info->phy_info[0].identify.sas_address;
3547 	parent = mptsas_find_portinfo_by_handle(ioc,
3548 	    port_info->phy_info[0].identify.handle_parent);
3549 	mptsas_delete_expander_siblings(ioc, parent, port_info);
3550 	if (!parent)
3551 		goto out;
3552 
3553 	/*
3554 	 * Delete rphys in the parent that point
3555 	 * to this expander.
3556 	 */
3557 	phy_info = parent->phy_info;
3558 	port = NULL;
3559 	for (i = 0; i < parent->num_phys; i++, phy_info++) {
3560 		if (!phy_info->phy)
3561 			continue;
3562 		if (phy_info->attached.sas_address !=
3563 		    expander_sas_address)
3564 			continue;
3565 		if (!port) {
3566 			port = mptsas_get_port(phy_info);
3567 			port_details = phy_info->port_details;
3568 		}
3569 		dev_printk(KERN_DEBUG, &phy_info->phy->dev,
3570 		    MYIOC_s_FMT "delete phy %d, phy-obj (0x%p)\n", ioc->name,
3571 		    phy_info->phy_id, phy_info->phy);
3572 		sas_port_delete_phy(port, phy_info->phy);
3573 	}
3574 	if (port) {
3575 		dev_printk(KERN_DEBUG, &port->dev,
3576 		    MYIOC_s_FMT "delete port %d, sas_addr (0x%llx)\n",
3577 		    ioc->name, port->port_identifier,
3578 		    (unsigned long long)expander_sas_address);
3579 		sas_port_delete(port);
3580 		mptsas_port_delete(ioc, port_details);
3581 	}
3582  out:
3583 
3584 	printk(MYIOC_s_INFO_FMT "delete expander: num_phys %d, "
3585 	    "sas_addr (0x%llx)\n",  ioc->name, port_info->num_phys,
3586 	    (unsigned long long)expander_sas_address);
3587 
3588 	/*
3589 	 * free link
3590 	 */
3591 	list_del(&port_info->list);
3592 	kfree(port_info->phy_info);
3593 	kfree(port_info);
3594 }
3595 
3596 
3597 /**
3598  * mptsas_send_expander_event - expanders events
3599  * @ioc: Pointer to MPT_ADAPTER structure
3600  * @expander_data: event data
3601  *
3602  *
3603  * This function handles adding, removing, and refreshing
3604  * device handles within the expander objects.
3605  */
3606 static void
3607 mptsas_send_expander_event(struct fw_event_work *fw_event)
3608 {
3609 	MPT_ADAPTER *ioc;
3610 	MpiEventDataSasExpanderStatusChange_t *expander_data;
3611 	struct mptsas_portinfo *port_info;
3612 	__le64 sas_address;
3613 	int i;
3614 
3615 	ioc = fw_event->ioc;
3616 	expander_data = (MpiEventDataSasExpanderStatusChange_t *)
3617 	    fw_event->event_data;
3618 	memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64));
3619 	sas_address = le64_to_cpu(sas_address);
3620 	port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address);
3621 
3622 	if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) {
3623 		if (port_info) {
3624 			for (i = 0; i < port_info->num_phys; i++) {
3625 				port_info->phy_info[i].portinfo = port_info;
3626 				port_info->phy_info[i].handle =
3627 				    le16_to_cpu(expander_data->DevHandle);
3628 				port_info->phy_info[i].identify.sas_address =
3629 				    le64_to_cpu(sas_address);
3630 				port_info->phy_info[i].identify.handle_parent =
3631 				    le16_to_cpu(expander_data->ParentDevHandle);
3632 			}
3633 			mptsas_expander_refresh(ioc, port_info);
3634 		} else if (!port_info && expander_data->NumPhys)
3635 			mptsas_expander_event_add(ioc, expander_data);
3636 	} else if (expander_data->ReasonCode ==
3637 	    MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING)
3638 		mptsas_expander_delete(ioc, port_info, 0);
3639 
3640 	mptsas_free_fw_event(ioc, fw_event);
3641 }
3642 
3643 
3644 /**
3645  * mptsas_expander_add -
3646  * @ioc: Pointer to MPT_ADAPTER structure
3647  * @handle:
3648  *
3649  */
3650 static struct mptsas_portinfo *
3651 mptsas_expander_add(MPT_ADAPTER *ioc, u16 handle)
3652 {
3653 	struct mptsas_portinfo buffer, *port_info;
3654 	int i;
3655 
3656 	if ((mptsas_sas_expander_pg0(ioc, &buffer,
3657 	    (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
3658 	    MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle)))
3659 		return NULL;
3660 
3661 	port_info = kzalloc(sizeof(struct mptsas_portinfo), GFP_ATOMIC);
3662 	if (!port_info) {
3663 		dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
3664 		"%s: exit at line=%d\n", ioc->name,
3665 		__func__, __LINE__));
3666 		return NULL;
3667 	}
3668 	port_info->num_phys = buffer.num_phys;
3669 	port_info->phy_info = buffer.phy_info;
3670 	for (i = 0; i < port_info->num_phys; i++)
3671 		port_info->phy_info[i].portinfo = port_info;
3672 	mutex_lock(&ioc->sas_topology_mutex);
3673 	list_add_tail(&port_info->list, &ioc->sas_topology);
3674 	mutex_unlock(&ioc->sas_topology_mutex);
3675 	printk(MYIOC_s_INFO_FMT "add expander: num_phys %d, "
3676 	    "sas_addr (0x%llx)\n", ioc->name, port_info->num_phys,
3677 	    (unsigned long long)buffer.phy_info[0].identify.sas_address);
3678 	mptsas_expander_refresh(ioc, port_info);
3679 	return port_info;
3680 }
3681 
3682 static void
3683 mptsas_send_link_status_event(struct fw_event_work *fw_event)
3684 {
3685 	MPT_ADAPTER *ioc;
3686 	MpiEventDataSasPhyLinkStatus_t *link_data;
3687 	struct mptsas_portinfo *port_info;
3688 	struct mptsas_phyinfo *phy_info = NULL;
3689 	__le64 sas_address;
3690 	u8 phy_num;
3691 	u8 link_rate;
3692 
3693 	ioc = fw_event->ioc;
3694 	link_data = (MpiEventDataSasPhyLinkStatus_t *)fw_event->event_data;
3695 
3696 	memcpy(&sas_address, &link_data->SASAddress, sizeof(__le64));
3697 	sas_address = le64_to_cpu(sas_address);
3698 	link_rate = link_data->LinkRates >> 4;
3699 	phy_num = link_data->PhyNum;
3700 
3701 	port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address);
3702 	if (port_info) {
3703 		phy_info = &port_info->phy_info[phy_num];
3704 		if (phy_info)
3705 			phy_info->negotiated_link_rate = link_rate;
3706 	}
3707 
3708 	if (link_rate == MPI_SAS_IOUNIT0_RATE_1_5 ||
3709 	    link_rate == MPI_SAS_IOUNIT0_RATE_3_0 ||
3710 	    link_rate == MPI_SAS_IOUNIT0_RATE_6_0) {
3711 
3712 		if (!port_info) {
3713 			if (ioc->old_sas_discovery_protocal) {
3714 				port_info = mptsas_expander_add(ioc,
3715 					le16_to_cpu(link_data->DevHandle));
3716 				if (port_info)
3717 					goto out;
3718 			}
3719 			goto out;
3720 		}
3721 
3722 		if (port_info == ioc->hba_port_info)
3723 			mptsas_probe_hba_phys(ioc);
3724 		else
3725 			mptsas_expander_refresh(ioc, port_info);
3726 	} else if (phy_info && phy_info->phy) {
3727 		if (link_rate ==  MPI_SAS_IOUNIT0_RATE_PHY_DISABLED)
3728 			phy_info->phy->negotiated_linkrate =
3729 			    SAS_PHY_DISABLED;
3730 		else if (link_rate ==
3731 		    MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION)
3732 			phy_info->phy->negotiated_linkrate =
3733 			    SAS_LINK_RATE_FAILED;
3734 		else {
3735 			phy_info->phy->negotiated_linkrate =
3736 			    SAS_LINK_RATE_UNKNOWN;
3737 			if (ioc->device_missing_delay &&
3738 			    mptsas_is_end_device(&phy_info->attached)) {
3739 				struct scsi_device		*sdev;
3740 				VirtDevice			*vdevice;
3741 				u8	channel, id;
3742 				id = phy_info->attached.id;
3743 				channel = phy_info->attached.channel;
3744 				devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3745 				"Link down for fw_id %d:fw_channel %d\n",
3746 				    ioc->name, phy_info->attached.id,
3747 				    phy_info->attached.channel));
3748 
3749 				shost_for_each_device(sdev, ioc->sh) {
3750 					vdevice = sdev->hostdata;
3751 					if ((vdevice == NULL) ||
3752 						(vdevice->vtarget == NULL))
3753 						continue;
3754 					if ((vdevice->vtarget->tflags &
3755 					    MPT_TARGET_FLAGS_RAID_COMPONENT ||
3756 					    vdevice->vtarget->raidVolume))
3757 						continue;
3758 					if (vdevice->vtarget->id == id &&
3759 						vdevice->vtarget->channel ==
3760 						channel)
3761 						devtprintk(ioc,
3762 						printk(MYIOC_s_DEBUG_FMT
3763 						"SDEV OUTSTANDING CMDS"
3764 						"%d\n", ioc->name,
3765 						atomic_read(&sdev->device_busy)));
3766 				}
3767 
3768 			}
3769 		}
3770 	}
3771  out:
3772 	mptsas_free_fw_event(ioc, fw_event);
3773 }
3774 
3775 static void
3776 mptsas_not_responding_devices(MPT_ADAPTER *ioc)
3777 {
3778 	struct mptsas_portinfo buffer, *port_info;
3779 	struct mptsas_device_info	*sas_info;
3780 	struct mptsas_devinfo sas_device;
3781 	u32	handle;
3782 	VirtTarget *vtarget = NULL;
3783 	struct mptsas_phyinfo *phy_info;
3784 	u8 found_expander;
3785 	int retval, retry_count;
3786 	unsigned long flags;
3787 
3788 	mpt_findImVolumes(ioc);
3789 
3790 	spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
3791 	if (ioc->ioc_reset_in_progress) {
3792 		dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3793 		   "%s: exiting due to a parallel reset \n", ioc->name,
3794 		    __func__));
3795 		spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
3796 		return;
3797 	}
3798 	spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
3799 
3800 	/* devices, logical volumes */
3801 	mutex_lock(&ioc->sas_device_info_mutex);
3802  redo_device_scan:
3803 	list_for_each_entry(sas_info, &ioc->sas_device_info_list, list) {
3804 		if (sas_info->is_cached)
3805 			continue;
3806 		if (!sas_info->is_logical_volume) {
3807 			sas_device.handle = 0;
3808 			retry_count = 0;
3809 retry_page:
3810 			retval = mptsas_sas_device_pg0(ioc, &sas_device,
3811 				(MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID
3812 				<< MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
3813 				(sas_info->fw.channel << 8) +
3814 				sas_info->fw.id);
3815 
3816 			if (sas_device.handle)
3817 				continue;
3818 			if (retval == -EBUSY) {
3819 				spin_lock_irqsave(&ioc->taskmgmt_lock, flags);
3820 				if (ioc->ioc_reset_in_progress) {
3821 					dfailprintk(ioc,
3822 					printk(MYIOC_s_DEBUG_FMT
3823 					"%s: exiting due to reset\n",
3824 					ioc->name, __func__));
3825 					spin_unlock_irqrestore
3826 					(&ioc->taskmgmt_lock, flags);
3827 					mutex_unlock(&ioc->
3828 					sas_device_info_mutex);
3829 					return;
3830 				}
3831 				spin_unlock_irqrestore(&ioc->taskmgmt_lock,
3832 				flags);
3833 			}
3834 
3835 			if (retval && (retval != -ENODEV)) {
3836 				if (retry_count < 10) {
3837 					retry_count++;
3838 					goto retry_page;
3839 				} else {
3840 					devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
3841 					"%s: Config page retry exceeded retry "
3842 					"count deleting device 0x%llx\n",
3843 					ioc->name, __func__,
3844 					sas_info->sas_address));
3845 				}
3846 			}
3847 
3848 			/* delete device */
3849 			vtarget = mptsas_find_vtarget(ioc,
3850 				sas_info->fw.channel, sas_info->fw.id);
3851 
3852 			if (vtarget)
3853 				vtarget->deleted = 1;
3854 
3855 			phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
3856 					sas_info->sas_address);
3857 
3858 			mptsas_del_end_device(ioc, phy_info);
3859 			goto redo_device_scan;
3860 		} else
3861 			mptsas_volume_delete(ioc, sas_info->fw.id);
3862 	}
3863 	mutex_unlock(&ioc->sas_device_info_mutex);
3864 
3865 	/* expanders */
3866 	mutex_lock(&ioc->sas_topology_mutex);
3867  redo_expander_scan:
3868 	list_for_each_entry(port_info, &ioc->sas_topology, list) {
3869 
3870 		if (!(port_info->phy_info[0].identify.device_info &
3871 		    MPI_SAS_DEVICE_INFO_SMP_TARGET))
3872 			continue;
3873 		found_expander = 0;
3874 		handle = 0xFFFF;
3875 		while (!mptsas_sas_expander_pg0(ioc, &buffer,
3876 		    (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
3877 		     MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle) &&
3878 		    !found_expander) {
3879 
3880 			handle = buffer.phy_info[0].handle;
3881 			if (buffer.phy_info[0].identify.sas_address ==
3882 			    port_info->phy_info[0].identify.sas_address) {
3883 				found_expander = 1;
3884 			}
3885 			kfree(buffer.phy_info);
3886 		}
3887 
3888 		if (!found_expander) {
3889 			mptsas_expander_delete(ioc, port_info, 0);
3890 			goto redo_expander_scan;
3891 		}
3892 	}
3893 	mutex_unlock(&ioc->sas_topology_mutex);
3894 }
3895 
3896 /**
3897  *	mptsas_probe_expanders - adding expanders
3898  *	@ioc: Pointer to MPT_ADAPTER structure
3899  *
3900  **/
3901 static void
3902 mptsas_probe_expanders(MPT_ADAPTER *ioc)
3903 {
3904 	struct mptsas_portinfo buffer, *port_info;
3905 	u32 			handle;
3906 	int i;
3907 
3908 	handle = 0xFFFF;
3909 	while (!mptsas_sas_expander_pg0(ioc, &buffer,
3910 	    (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
3911 	     MPI_SAS_EXPAND_PGAD_FORM_SHIFT), handle)) {
3912 
3913 		handle = buffer.phy_info[0].handle;
3914 		port_info = mptsas_find_portinfo_by_sas_address(ioc,
3915 		    buffer.phy_info[0].identify.sas_address);
3916 
3917 		if (port_info) {
3918 			/* refreshing handles */
3919 			for (i = 0; i < buffer.num_phys; i++) {
3920 				port_info->phy_info[i].handle = handle;
3921 				port_info->phy_info[i].identify.handle_parent =
3922 				    buffer.phy_info[0].identify.handle_parent;
3923 			}
3924 			mptsas_expander_refresh(ioc, port_info);
3925 			kfree(buffer.phy_info);
3926 			continue;
3927 		}
3928 
3929 		port_info = kzalloc(sizeof(struct mptsas_portinfo), GFP_KERNEL);
3930 		if (!port_info) {
3931 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
3932 			"%s: exit at line=%d\n", ioc->name,
3933 			__func__, __LINE__));
3934 			return;
3935 		}
3936 		port_info->num_phys = buffer.num_phys;
3937 		port_info->phy_info = buffer.phy_info;
3938 		for (i = 0; i < port_info->num_phys; i++)
3939 			port_info->phy_info[i].portinfo = port_info;
3940 		mutex_lock(&ioc->sas_topology_mutex);
3941 		list_add_tail(&port_info->list, &ioc->sas_topology);
3942 		mutex_unlock(&ioc->sas_topology_mutex);
3943 		printk(MYIOC_s_INFO_FMT "add expander: num_phys %d, "
3944 		    "sas_addr (0x%llx)\n", ioc->name, port_info->num_phys,
3945 	    (unsigned long long)buffer.phy_info[0].identify.sas_address);
3946 		mptsas_expander_refresh(ioc, port_info);
3947 	}
3948 }
3949 
3950 static void
3951 mptsas_probe_devices(MPT_ADAPTER *ioc)
3952 {
3953 	u16 handle;
3954 	struct mptsas_devinfo sas_device;
3955 	struct mptsas_phyinfo *phy_info;
3956 
3957 	handle = 0xFFFF;
3958 	while (!(mptsas_sas_device_pg0(ioc, &sas_device,
3959 	    MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE, handle))) {
3960 
3961 		handle = sas_device.handle;
3962 
3963 		if ((sas_device.device_info &
3964 		     (MPI_SAS_DEVICE_INFO_SSP_TARGET |
3965 		      MPI_SAS_DEVICE_INFO_STP_TARGET |
3966 		      MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0)
3967 			continue;
3968 
3969 		/* If there is no FW B_T mapping for this device then continue
3970 		 * */
3971 		if (!(sas_device.flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)
3972 			|| !(sas_device.flags &
3973 			MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED))
3974 			continue;
3975 
3976 		phy_info = mptsas_refreshing_device_handles(ioc, &sas_device);
3977 		if (!phy_info)
3978 			continue;
3979 
3980 		if (mptsas_get_rphy(phy_info))
3981 			continue;
3982 
3983 		mptsas_add_end_device(ioc, phy_info);
3984 	}
3985 }
3986 
3987 /**
3988  *	mptsas_scan_sas_topology -
3989  *	@ioc: Pointer to MPT_ADAPTER structure
3990  *	@sas_address:
3991  *
3992  **/
3993 static void
3994 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
3995 {
3996 	struct scsi_device *sdev;
3997 	int i;
3998 
3999 	mptsas_probe_hba_phys(ioc);
4000 	mptsas_probe_expanders(ioc);
4001 	mptsas_probe_devices(ioc);
4002 
4003 	/*
4004 	  Reporting RAID volumes.
4005 	*/
4006 	if (!ioc->ir_firmware || !ioc->raid_data.pIocPg2 ||
4007 	    !ioc->raid_data.pIocPg2->NumActiveVolumes)
4008 		return;
4009 	for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
4010 		sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
4011 		    ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
4012 		if (sdev) {
4013 			scsi_device_put(sdev);
4014 			continue;
4015 		}
4016 		printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, "
4017 		    "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL,
4018 		    ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID);
4019 		scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
4020 		    ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
4021 	}
4022 }
4023 
4024 
4025 static void
4026 mptsas_handle_queue_full_event(struct fw_event_work *fw_event)
4027 {
4028 	MPT_ADAPTER *ioc;
4029 	EventDataQueueFull_t *qfull_data;
4030 	struct mptsas_device_info *sas_info;
4031 	struct scsi_device	*sdev;
4032 	int depth;
4033 	int id = -1;
4034 	int channel = -1;
4035 	int fw_id, fw_channel;
4036 	u16 current_depth;
4037 
4038 
4039 	ioc = fw_event->ioc;
4040 	qfull_data = (EventDataQueueFull_t *)fw_event->event_data;
4041 	fw_id = qfull_data->TargetID;
4042 	fw_channel = qfull_data->Bus;
4043 	current_depth = le16_to_cpu(qfull_data->CurrentDepth);
4044 
4045 	/* if hidden raid component, look for the volume id */
4046 	mutex_lock(&ioc->sas_device_info_mutex);
4047 	if (mptscsih_is_phys_disk(ioc, fw_channel, fw_id)) {
4048 		list_for_each_entry(sas_info, &ioc->sas_device_info_list,
4049 		    list) {
4050 			if (sas_info->is_cached ||
4051 			    sas_info->is_logical_volume)
4052 				continue;
4053 			if (sas_info->is_hidden_raid_component &&
4054 			    (sas_info->fw.channel == fw_channel &&
4055 			    sas_info->fw.id == fw_id)) {
4056 				id = sas_info->volume_id;
4057 				channel = MPTSAS_RAID_CHANNEL;
4058 				goto out;
4059 			}
4060 		}
4061 	} else {
4062 		list_for_each_entry(sas_info, &ioc->sas_device_info_list,
4063 		    list) {
4064 			if (sas_info->is_cached ||
4065 			    sas_info->is_hidden_raid_component ||
4066 			    sas_info->is_logical_volume)
4067 				continue;
4068 			if (sas_info->fw.channel == fw_channel &&
4069 			    sas_info->fw.id == fw_id) {
4070 				id = sas_info->os.id;
4071 				channel = sas_info->os.channel;
4072 				goto out;
4073 			}
4074 		}
4075 
4076 	}
4077 
4078  out:
4079 	mutex_unlock(&ioc->sas_device_info_mutex);
4080 
4081 	if (id != -1) {
4082 		shost_for_each_device(sdev, ioc->sh) {
4083 			if (sdev->id == id && sdev->channel == channel) {
4084 				if (current_depth > sdev->queue_depth) {
4085 					sdev_printk(KERN_INFO, sdev,
4086 					    "strange observation, the queue "
4087 					    "depth is (%d) meanwhile fw queue "
4088 					    "depth (%d)\n", sdev->queue_depth,
4089 					    current_depth);
4090 					continue;
4091 				}
4092 				depth = scsi_track_queue_full(sdev,
4093 					sdev->queue_depth - 1);
4094 				if (depth > 0)
4095 					sdev_printk(KERN_INFO, sdev,
4096 					"Queue depth reduced to (%d)\n",
4097 					   depth);
4098 				else if (depth < 0)
4099 					sdev_printk(KERN_INFO, sdev,
4100 					"Tagged Command Queueing is being "
4101 					"disabled\n");
4102 				else if (depth == 0)
4103 					sdev_printk(KERN_DEBUG, sdev,
4104 					"Queue depth not changed yet\n");
4105 			}
4106 		}
4107 	}
4108 
4109 	mptsas_free_fw_event(ioc, fw_event);
4110 }
4111 
4112 
4113 static struct mptsas_phyinfo *
4114 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
4115 {
4116 	struct mptsas_portinfo *port_info;
4117 	struct mptsas_phyinfo *phy_info = NULL;
4118 	int i;
4119 
4120 	mutex_lock(&ioc->sas_topology_mutex);
4121 	list_for_each_entry(port_info, &ioc->sas_topology, list) {
4122 		for (i = 0; i < port_info->num_phys; i++) {
4123 			if (!mptsas_is_end_device(
4124 				&port_info->phy_info[i].attached))
4125 				continue;
4126 			if (port_info->phy_info[i].attached.sas_address
4127 			    != sas_address)
4128 				continue;
4129 			phy_info = &port_info->phy_info[i];
4130 			break;
4131 		}
4132 	}
4133 	mutex_unlock(&ioc->sas_topology_mutex);
4134 	return phy_info;
4135 }
4136 
4137 /**
4138  *	mptsas_find_phyinfo_by_phys_disk_num -
4139  *	@ioc: Pointer to MPT_ADAPTER structure
4140  *	@phys_disk_num:
4141  *	@channel:
4142  *	@id:
4143  *
4144  **/
4145 static struct mptsas_phyinfo *
4146 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 phys_disk_num,
4147 	u8 channel, u8 id)
4148 {
4149 	struct mptsas_phyinfo *phy_info = NULL;
4150 	struct mptsas_portinfo *port_info;
4151 	RaidPhysDiskPage1_t *phys_disk = NULL;
4152 	int num_paths;
4153 	u64 sas_address = 0;
4154 	int i;
4155 
4156 	phy_info = NULL;
4157 	if (!ioc->raid_data.pIocPg3)
4158 		return NULL;
4159 	/* dual port support */
4160 	num_paths = mpt_raid_phys_disk_get_num_paths(ioc, phys_disk_num);
4161 	if (!num_paths)
4162 		goto out;
4163 	phys_disk = kzalloc(offsetof(RaidPhysDiskPage1_t, Path) +
4164 	   (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL);
4165 	if (!phys_disk)
4166 		goto out;
4167 	mpt_raid_phys_disk_pg1(ioc, phys_disk_num, phys_disk);
4168 	for (i = 0; i < num_paths; i++) {
4169 		if ((phys_disk->Path[i].Flags & 1) != 0)
4170 			/* entry no longer valid */
4171 			continue;
4172 		if ((id == phys_disk->Path[i].PhysDiskID) &&
4173 		    (channel == phys_disk->Path[i].PhysDiskBus)) {
4174 			memcpy(&sas_address, &phys_disk->Path[i].WWID,
4175 				sizeof(u64));
4176 			phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
4177 					sas_address);
4178 			goto out;
4179 		}
4180 	}
4181 
4182  out:
4183 	kfree(phys_disk);
4184 	if (phy_info)
4185 		return phy_info;
4186 
4187 	/*
4188 	 * Extra code to handle RAID0 case, where the sas_address is not updated
4189 	 * in phys_disk_page_1 when hotswapped
4190 	 */
4191 	mutex_lock(&ioc->sas_topology_mutex);
4192 	list_for_each_entry(port_info, &ioc->sas_topology, list) {
4193 		for (i = 0; i < port_info->num_phys && !phy_info; i++) {
4194 			if (!mptsas_is_end_device(
4195 				&port_info->phy_info[i].attached))
4196 				continue;
4197 			if (port_info->phy_info[i].attached.phys_disk_num == ~0)
4198 				continue;
4199 			if ((port_info->phy_info[i].attached.phys_disk_num ==
4200 			    phys_disk_num) &&
4201 			    (port_info->phy_info[i].attached.id == id) &&
4202 			    (port_info->phy_info[i].attached.channel ==
4203 			     channel))
4204 				phy_info = &port_info->phy_info[i];
4205 		}
4206 	}
4207 	mutex_unlock(&ioc->sas_topology_mutex);
4208 	return phy_info;
4209 }
4210 
4211 static void
4212 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
4213 {
4214 	int rc;
4215 
4216 	sdev->no_uld_attach = data ? 1 : 0;
4217 	rc = scsi_device_reprobe(sdev);
4218 }
4219 
4220 static void
4221 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
4222 {
4223 	starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
4224 			mptsas_reprobe_lun);
4225 }
4226 
4227 static void
4228 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
4229 {
4230 	CONFIGPARMS			cfg;
4231 	ConfigPageHeader_t		hdr;
4232 	dma_addr_t			dma_handle;
4233 	pRaidVolumePage0_t		buffer = NULL;
4234 	RaidPhysDiskPage0_t 		phys_disk;
4235 	int				i;
4236 	struct mptsas_phyinfo	*phy_info;
4237 	struct mptsas_devinfo		sas_device;
4238 
4239 	memset(&cfg, 0 , sizeof(CONFIGPARMS));
4240 	memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
4241 	hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
4242 	cfg.pageAddr = (channel << 8) + id;
4243 	cfg.cfghdr.hdr = &hdr;
4244 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
4245 	cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
4246 
4247 	if (mpt_config(ioc, &cfg) != 0)
4248 		goto out;
4249 
4250 	if (!hdr.PageLength)
4251 		goto out;
4252 
4253 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
4254 	    &dma_handle);
4255 
4256 	if (!buffer)
4257 		goto out;
4258 
4259 	cfg.physAddr = dma_handle;
4260 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
4261 
4262 	if (mpt_config(ioc, &cfg) != 0)
4263 		goto out;
4264 
4265 	if (!(buffer->VolumeStatus.Flags &
4266 	    MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
4267 		goto out;
4268 
4269 	if (!buffer->NumPhysDisks)
4270 		goto out;
4271 
4272 	for (i = 0; i < buffer->NumPhysDisks; i++) {
4273 
4274 		if (mpt_raid_phys_disk_pg0(ioc,
4275 		    buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
4276 			continue;
4277 
4278 		if (mptsas_sas_device_pg0(ioc, &sas_device,
4279 		    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
4280 		     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
4281 			(phys_disk.PhysDiskBus << 8) +
4282 			phys_disk.PhysDiskID))
4283 			continue;
4284 
4285 		/* If there is no FW B_T mapping for this device then continue
4286 		 * */
4287 		if (!(sas_device.flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)
4288 			|| !(sas_device.flags &
4289 			MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED))
4290 			continue;
4291 
4292 
4293 		phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
4294 		    sas_device.sas_address);
4295 		mptsas_add_end_device(ioc, phy_info);
4296 	}
4297 
4298  out:
4299 	if (buffer)
4300 		pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
4301 		    dma_handle);
4302 }
4303 /*
4304  * Work queue thread to handle SAS hotplug events
4305  */
4306 static void
4307 mptsas_hotplug_work(MPT_ADAPTER *ioc, struct fw_event_work *fw_event,
4308     struct mptsas_hotplug_event *hot_plug_info)
4309 {
4310 	struct mptsas_phyinfo *phy_info;
4311 	struct scsi_target * starget;
4312 	struct mptsas_devinfo sas_device;
4313 	VirtTarget *vtarget;
4314 	int i;
4315 	struct mptsas_portinfo *port_info;
4316 
4317 	switch (hot_plug_info->event_type) {
4318 
4319 	case MPTSAS_ADD_PHYSDISK:
4320 
4321 		if (!ioc->raid_data.pIocPg2)
4322 			break;
4323 
4324 		for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
4325 			if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID ==
4326 			    hot_plug_info->id) {
4327 				printk(MYIOC_s_WARN_FMT "firmware bug: unable "
4328 				    "to add hidden disk - target_id matchs "
4329 				    "volume_id\n", ioc->name);
4330 				mptsas_free_fw_event(ioc, fw_event);
4331 				return;
4332 			}
4333 		}
4334 		mpt_findImVolumes(ioc);
4335 
4336 	case MPTSAS_ADD_DEVICE:
4337 		memset(&sas_device, 0, sizeof(struct mptsas_devinfo));
4338 		mptsas_sas_device_pg0(ioc, &sas_device,
4339 		    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
4340 		    MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
4341 		    (hot_plug_info->channel << 8) +
4342 		    hot_plug_info->id);
4343 
4344 		/* If there is no FW B_T mapping for this device then break
4345 		 * */
4346 		if (!(sas_device.flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)
4347 			|| !(sas_device.flags &
4348 			MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED))
4349 			break;
4350 
4351 		if (!sas_device.handle)
4352 			return;
4353 
4354 		phy_info = mptsas_refreshing_device_handles(ioc, &sas_device);
4355 		/* Only For SATA Device ADD */
4356 		if (!phy_info && (sas_device.device_info &
4357 				MPI_SAS_DEVICE_INFO_SATA_DEVICE)) {
4358 			devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
4359 				"%s %d SATA HOT PLUG: "
4360 				"parent handle of device %x\n", ioc->name,
4361 				__func__, __LINE__, sas_device.handle_parent));
4362 			port_info = mptsas_find_portinfo_by_handle(ioc,
4363 				sas_device.handle_parent);
4364 
4365 			if (port_info == ioc->hba_port_info)
4366 				mptsas_probe_hba_phys(ioc);
4367 			else if (port_info)
4368 				mptsas_expander_refresh(ioc, port_info);
4369 			else {
4370 				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4371 					"%s %d port info is NULL\n",
4372 					ioc->name, __func__, __LINE__));
4373 				break;
4374 			}
4375 			phy_info = mptsas_refreshing_device_handles
4376 				(ioc, &sas_device);
4377 		}
4378 
4379 		if (!phy_info) {
4380 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4381 				"%s %d phy info is NULL\n",
4382 				ioc->name, __func__, __LINE__));
4383 			break;
4384 		}
4385 
4386 		if (mptsas_get_rphy(phy_info))
4387 			break;
4388 
4389 		mptsas_add_end_device(ioc, phy_info);
4390 		break;
4391 
4392 	case MPTSAS_DEL_DEVICE:
4393 		phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
4394 		    hot_plug_info->sas_address);
4395 		mptsas_del_end_device(ioc, phy_info);
4396 		break;
4397 
4398 	case MPTSAS_DEL_PHYSDISK:
4399 
4400 		mpt_findImVolumes(ioc);
4401 
4402 		phy_info = mptsas_find_phyinfo_by_phys_disk_num(
4403 				ioc, hot_plug_info->phys_disk_num,
4404 				hot_plug_info->channel,
4405 				hot_plug_info->id);
4406 		mptsas_del_end_device(ioc, phy_info);
4407 		break;
4408 
4409 	case MPTSAS_ADD_PHYSDISK_REPROBE:
4410 
4411 		if (mptsas_sas_device_pg0(ioc, &sas_device,
4412 		    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
4413 		     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
4414 		    (hot_plug_info->channel << 8) + hot_plug_info->id)) {
4415 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4416 			"%s: fw_id=%d exit at line=%d\n", ioc->name,
4417 				 __func__, hot_plug_info->id, __LINE__));
4418 			break;
4419 		}
4420 
4421 		/* If there is no FW B_T mapping for this device then break
4422 		 * */
4423 		if (!(sas_device.flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)
4424 			|| !(sas_device.flags &
4425 			MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED))
4426 			break;
4427 
4428 		phy_info = mptsas_find_phyinfo_by_sas_address(
4429 		    ioc, sas_device.sas_address);
4430 
4431 		if (!phy_info) {
4432 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4433 				"%s: fw_id=%d exit at line=%d\n", ioc->name,
4434 				 __func__, hot_plug_info->id, __LINE__));
4435 			break;
4436 		}
4437 
4438 		starget = mptsas_get_starget(phy_info);
4439 		if (!starget) {
4440 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4441 				"%s: fw_id=%d exit at line=%d\n", ioc->name,
4442 				 __func__, hot_plug_info->id, __LINE__));
4443 			break;
4444 		}
4445 
4446 		vtarget = starget->hostdata;
4447 		if (!vtarget) {
4448 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4449 				"%s: fw_id=%d exit at line=%d\n", ioc->name,
4450 				 __func__, hot_plug_info->id, __LINE__));
4451 			break;
4452 		}
4453 
4454 		mpt_findImVolumes(ioc);
4455 
4456 		starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Hidding: "
4457 		    "fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4458 		    ioc->name, hot_plug_info->channel, hot_plug_info->id,
4459 		    hot_plug_info->phys_disk_num, (unsigned long long)
4460 		    sas_device.sas_address);
4461 
4462 		vtarget->id = hot_plug_info->phys_disk_num;
4463 		vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
4464 		phy_info->attached.phys_disk_num = hot_plug_info->phys_disk_num;
4465 		mptsas_reprobe_target(starget, 1);
4466 		break;
4467 
4468 	case MPTSAS_DEL_PHYSDISK_REPROBE:
4469 
4470 		if (mptsas_sas_device_pg0(ioc, &sas_device,
4471 		    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
4472 		     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
4473 			(hot_plug_info->channel << 8) + hot_plug_info->id)) {
4474 				dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4475 				    "%s: fw_id=%d exit at line=%d\n",
4476 				    ioc->name, __func__,
4477 				    hot_plug_info->id, __LINE__));
4478 			break;
4479 		}
4480 
4481 		/* If there is no FW B_T mapping for this device then break
4482 		 * */
4483 		if (!(sas_device.flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)
4484 			|| !(sas_device.flags &
4485 			MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED))
4486 			break;
4487 
4488 		phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
4489 				sas_device.sas_address);
4490 		if (!phy_info) {
4491 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4492 			    "%s: fw_id=%d exit at line=%d\n", ioc->name,
4493 			 __func__, hot_plug_info->id, __LINE__));
4494 			break;
4495 		}
4496 
4497 		starget = mptsas_get_starget(phy_info);
4498 		if (!starget) {
4499 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4500 			    "%s: fw_id=%d exit at line=%d\n", ioc->name,
4501 			 __func__, hot_plug_info->id, __LINE__));
4502 			break;
4503 		}
4504 
4505 		vtarget = starget->hostdata;
4506 		if (!vtarget) {
4507 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4508 			    "%s: fw_id=%d exit at line=%d\n", ioc->name,
4509 			 __func__, hot_plug_info->id, __LINE__));
4510 			break;
4511 		}
4512 
4513 		if (!(vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT)) {
4514 			dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
4515 			    "%s: fw_id=%d exit at line=%d\n", ioc->name,
4516 			 __func__, hot_plug_info->id, __LINE__));
4517 			break;
4518 		}
4519 
4520 		mpt_findImVolumes(ioc);
4521 
4522 		starget_printk(KERN_INFO, starget, MYIOC_s_FMT "RAID Exposing:"
4523 		    " fw_channel=%d, fw_id=%d, physdsk %d, sas_addr 0x%llx\n",
4524 		    ioc->name, hot_plug_info->channel, hot_plug_info->id,
4525 		    hot_plug_info->phys_disk_num, (unsigned long long)
4526 		    sas_device.sas_address);
4527 
4528 		vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT;
4529 		vtarget->id = hot_plug_info->id;
4530 		phy_info->attached.phys_disk_num = ~0;
4531 		mptsas_reprobe_target(starget, 0);
4532 		mptsas_add_device_component_by_fw(ioc,
4533 		    hot_plug_info->channel, hot_plug_info->id);
4534 		break;
4535 
4536 	case MPTSAS_ADD_RAID:
4537 
4538 		mpt_findImVolumes(ioc);
4539 		printk(MYIOC_s_INFO_FMT "attaching raid volume, channel %d, "
4540 		    "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL,
4541 		    hot_plug_info->id);
4542 		scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
4543 		    hot_plug_info->id, 0);
4544 		break;
4545 
4546 	case MPTSAS_DEL_RAID:
4547 
4548 		mpt_findImVolumes(ioc);
4549 		printk(MYIOC_s_INFO_FMT "removing raid volume, channel %d, "
4550 		    "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL,
4551 		    hot_plug_info->id);
4552 		scsi_remove_device(hot_plug_info->sdev);
4553 		scsi_device_put(hot_plug_info->sdev);
4554 		break;
4555 
4556 	case MPTSAS_ADD_INACTIVE_VOLUME:
4557 
4558 		mpt_findImVolumes(ioc);
4559 		mptsas_adding_inactive_raid_components(ioc,
4560 		    hot_plug_info->channel, hot_plug_info->id);
4561 		break;
4562 
4563 	default:
4564 		break;
4565 	}
4566 
4567 	mptsas_free_fw_event(ioc, fw_event);
4568 }
4569 
4570 static void
4571 mptsas_send_sas_event(struct fw_event_work *fw_event)
4572 {
4573 	MPT_ADAPTER *ioc;
4574 	struct mptsas_hotplug_event hot_plug_info;
4575 	EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
4576 	u32 device_info;
4577 	u64 sas_address;
4578 
4579 	ioc = fw_event->ioc;
4580 	sas_event_data = (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)
4581 	    fw_event->event_data;
4582 	device_info = le32_to_cpu(sas_event_data->DeviceInfo);
4583 
4584 	if ((device_info &
4585 		(MPI_SAS_DEVICE_INFO_SSP_TARGET |
4586 		MPI_SAS_DEVICE_INFO_STP_TARGET |
4587 		MPI_SAS_DEVICE_INFO_SATA_DEVICE)) == 0) {
4588 		mptsas_free_fw_event(ioc, fw_event);
4589 		return;
4590 	}
4591 
4592 	if (sas_event_data->ReasonCode ==
4593 		MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED) {
4594 		mptbase_sas_persist_operation(ioc,
4595 		MPI_SAS_OP_CLEAR_NOT_PRESENT);
4596 		mptsas_free_fw_event(ioc, fw_event);
4597 		return;
4598 	}
4599 
4600 	switch (sas_event_data->ReasonCode) {
4601 	case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
4602 	case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
4603 		memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event));
4604 		hot_plug_info.handle = le16_to_cpu(sas_event_data->DevHandle);
4605 		hot_plug_info.channel = sas_event_data->Bus;
4606 		hot_plug_info.id = sas_event_data->TargetID;
4607 		hot_plug_info.phy_id = sas_event_data->PhyNum;
4608 		memcpy(&sas_address, &sas_event_data->SASAddress,
4609 		    sizeof(u64));
4610 		hot_plug_info.sas_address = le64_to_cpu(sas_address);
4611 		hot_plug_info.device_info = device_info;
4612 		if (sas_event_data->ReasonCode &
4613 		    MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
4614 			hot_plug_info.event_type = MPTSAS_ADD_DEVICE;
4615 		else
4616 			hot_plug_info.event_type = MPTSAS_DEL_DEVICE;
4617 		mptsas_hotplug_work(ioc, fw_event, &hot_plug_info);
4618 		break;
4619 
4620 	case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
4621 		mptbase_sas_persist_operation(ioc,
4622 		    MPI_SAS_OP_CLEAR_NOT_PRESENT);
4623 		mptsas_free_fw_event(ioc, fw_event);
4624 		break;
4625 
4626 	case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
4627 	/* TODO */
4628 	case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
4629 	/* TODO */
4630 	default:
4631 		mptsas_free_fw_event(ioc, fw_event);
4632 		break;
4633 	}
4634 }
4635 
4636 static void
4637 mptsas_send_raid_event(struct fw_event_work *fw_event)
4638 {
4639 	MPT_ADAPTER *ioc;
4640 	EVENT_DATA_RAID *raid_event_data;
4641 	struct mptsas_hotplug_event hot_plug_info;
4642 	int status;
4643 	int state;
4644 	struct scsi_device *sdev = NULL;
4645 	VirtDevice *vdevice = NULL;
4646 	RaidPhysDiskPage0_t phys_disk;
4647 
4648 	ioc = fw_event->ioc;
4649 	raid_event_data = (EVENT_DATA_RAID *)fw_event->event_data;
4650 	status = le32_to_cpu(raid_event_data->SettingsStatus);
4651 	state = (status >> 8) & 0xff;
4652 
4653 	memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event));
4654 	hot_plug_info.id = raid_event_data->VolumeID;
4655 	hot_plug_info.channel = raid_event_data->VolumeBus;
4656 	hot_plug_info.phys_disk_num = raid_event_data->PhysDiskNum;
4657 
4658 	if (raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_DELETED ||
4659 	    raid_event_data->ReasonCode == MPI_EVENT_RAID_RC_VOLUME_CREATED ||
4660 	    raid_event_data->ReasonCode ==
4661 	    MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED) {
4662 		sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
4663 		    hot_plug_info.id, 0);
4664 		hot_plug_info.sdev = sdev;
4665 		if (sdev)
4666 			vdevice = sdev->hostdata;
4667 	}
4668 
4669 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Entering %s: "
4670 	    "ReasonCode=%02x\n", ioc->name, __func__,
4671 	    raid_event_data->ReasonCode));
4672 
4673 	switch (raid_event_data->ReasonCode) {
4674 	case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
4675 		hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK_REPROBE;
4676 		break;
4677 	case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
4678 		hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK_REPROBE;
4679 		break;
4680 	case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
4681 		switch (state) {
4682 		case MPI_PD_STATE_ONLINE:
4683 		case MPI_PD_STATE_NOT_COMPATIBLE:
4684 			mpt_raid_phys_disk_pg0(ioc,
4685 			    raid_event_data->PhysDiskNum, &phys_disk);
4686 			hot_plug_info.id = phys_disk.PhysDiskID;
4687 			hot_plug_info.channel = phys_disk.PhysDiskBus;
4688 			hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK;
4689 			break;
4690 		case MPI_PD_STATE_FAILED:
4691 		case MPI_PD_STATE_MISSING:
4692 		case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
4693 		case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
4694 		case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
4695 			hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK;
4696 			break;
4697 		default:
4698 			break;
4699 		}
4700 		break;
4701 	case MPI_EVENT_RAID_RC_VOLUME_DELETED:
4702 		if (!sdev)
4703 			break;
4704 		vdevice->vtarget->deleted = 1; /* block IO */
4705 		hot_plug_info.event_type = MPTSAS_DEL_RAID;
4706 		break;
4707 	case MPI_EVENT_RAID_RC_VOLUME_CREATED:
4708 		if (sdev) {
4709 			scsi_device_put(sdev);
4710 			break;
4711 		}
4712 		hot_plug_info.event_type = MPTSAS_ADD_RAID;
4713 		break;
4714 	case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
4715 		if (!(status & MPI_RAIDVOL0_STATUS_FLAG_ENABLED)) {
4716 			if (!sdev)
4717 				break;
4718 			vdevice->vtarget->deleted = 1; /* block IO */
4719 			hot_plug_info.event_type = MPTSAS_DEL_RAID;
4720 			break;
4721 		}
4722 		switch (state) {
4723 		case MPI_RAIDVOL0_STATUS_STATE_FAILED:
4724 		case MPI_RAIDVOL0_STATUS_STATE_MISSING:
4725 			if (!sdev)
4726 				break;
4727 			vdevice->vtarget->deleted = 1; /* block IO */
4728 			hot_plug_info.event_type = MPTSAS_DEL_RAID;
4729 			break;
4730 		case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
4731 		case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
4732 			if (sdev) {
4733 				scsi_device_put(sdev);
4734 				break;
4735 			}
4736 			hot_plug_info.event_type = MPTSAS_ADD_RAID;
4737 			break;
4738 		default:
4739 			break;
4740 		}
4741 		break;
4742 	default:
4743 		break;
4744 	}
4745 
4746 	if (hot_plug_info.event_type != MPTSAS_IGNORE_EVENT)
4747 		mptsas_hotplug_work(ioc, fw_event, &hot_plug_info);
4748 	else
4749 		mptsas_free_fw_event(ioc, fw_event);
4750 }
4751 
4752 /**
4753  *	mptsas_issue_tm - send mptsas internal tm request
4754  *	@ioc: Pointer to MPT_ADAPTER structure
4755  *	@type: Task Management type
4756  *	@channel: channel number for task management
4757  *	@id: Logical Target ID for reset (if appropriate)
4758  *	@lun: Logical unit for reset (if appropriate)
4759  *	@task_context: Context for the task to be aborted
4760  *	@timeout: timeout for task management control
4761  *
4762  *	return 0 on success and -1 on failure:
4763  *
4764  */
4765 static int
4766 mptsas_issue_tm(MPT_ADAPTER *ioc, u8 type, u8 channel, u8 id, u64 lun,
4767 	int task_context, ulong timeout, u8 *issue_reset)
4768 {
4769 	MPT_FRAME_HDR	*mf;
4770 	SCSITaskMgmt_t	*pScsiTm;
4771 	int		 retval;
4772 	unsigned long	 timeleft;
4773 
4774 	*issue_reset = 0;
4775 	mf = mpt_get_msg_frame(mptsasDeviceResetCtx, ioc);
4776 	if (mf == NULL) {
4777 		retval = -1; /* return failure */
4778 		dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "TaskMgmt request: no "
4779 		    "msg frames!!\n", ioc->name));
4780 		goto out;
4781 	}
4782 
4783 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt request: mr = %p, "
4784 	    "task_type = 0x%02X,\n\t timeout = %ld, fw_channel = %d, "
4785 	    "fw_id = %d, lun = %lld,\n\t task_context = 0x%x\n", ioc->name, mf,
4786 	     type, timeout, channel, id, (unsigned long long)lun,
4787 	     task_context));
4788 
4789 	pScsiTm = (SCSITaskMgmt_t *) mf;
4790 	memset(pScsiTm, 0, sizeof(SCSITaskMgmt_t));
4791 	pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
4792 	pScsiTm->TaskType = type;
4793 	pScsiTm->MsgFlags = 0;
4794 	pScsiTm->TargetID = id;
4795 	pScsiTm->Bus = channel;
4796 	pScsiTm->ChainOffset = 0;
4797 	pScsiTm->Reserved = 0;
4798 	pScsiTm->Reserved1 = 0;
4799 	pScsiTm->TaskMsgContext = task_context;
4800 	int_to_scsilun(lun, (struct scsi_lun *)pScsiTm->LUN);
4801 
4802 	INITIALIZE_MGMT_STATUS(ioc->taskmgmt_cmds.status)
4803 	CLEAR_MGMT_STATUS(ioc->internal_cmds.status)
4804 	retval = 0;
4805 	mpt_put_msg_frame_hi_pri(mptsasDeviceResetCtx, ioc, mf);
4806 
4807 	/* Now wait for the command to complete */
4808 	timeleft = wait_for_completion_timeout(&ioc->taskmgmt_cmds.done,
4809 	    timeout*HZ);
4810 	if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
4811 		retval = -1; /* return failure */
4812 		dtmprintk(ioc, printk(MYIOC_s_ERR_FMT
4813 		    "TaskMgmt request: TIMED OUT!(mr=%p)\n", ioc->name, mf));
4814 		mpt_free_msg_frame(ioc, mf);
4815 		if (ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET)
4816 			goto out;
4817 		*issue_reset = 1;
4818 		goto out;
4819 	}
4820 
4821 	if (!(ioc->taskmgmt_cmds.status & MPT_MGMT_STATUS_RF_VALID)) {
4822 		retval = -1; /* return failure */
4823 		dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
4824 		    "TaskMgmt request: failed with no reply\n", ioc->name));
4825 		goto out;
4826 	}
4827 
4828  out:
4829 	CLEAR_MGMT_STATUS(ioc->taskmgmt_cmds.status)
4830 	return retval;
4831 }
4832 
4833 /**
4834  *	mptsas_broadcast_primative_work - Handle broadcast primitives
4835  *	@work: work queue payload containing info describing the event
4836  *
4837  *	this will be handled in workqueue context.
4838  */
4839 static void
4840 mptsas_broadcast_primative_work(struct fw_event_work *fw_event)
4841 {
4842 	MPT_ADAPTER *ioc = fw_event->ioc;
4843 	MPT_FRAME_HDR	*mf;
4844 	VirtDevice	*vdevice;
4845 	int			ii;
4846 	struct scsi_cmnd	*sc;
4847 	SCSITaskMgmtReply_t	*pScsiTmReply;
4848 	u8			issue_reset;
4849 	int			task_context;
4850 	u8			channel, id;
4851 	int			 lun;
4852 	u32			 termination_count;
4853 	u32			 query_count;
4854 
4855 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
4856 	    "%s - enter\n", ioc->name, __func__));
4857 
4858 	mutex_lock(&ioc->taskmgmt_cmds.mutex);
4859 	if (mpt_set_taskmgmt_in_progress_flag(ioc) != 0) {
4860 		mutex_unlock(&ioc->taskmgmt_cmds.mutex);
4861 		mptsas_requeue_fw_event(ioc, fw_event, 1000);
4862 		return;
4863 	}
4864 
4865 	issue_reset = 0;
4866 	termination_count = 0;
4867 	query_count = 0;
4868 	mpt_findImVolumes(ioc);
4869 	pScsiTmReply = (SCSITaskMgmtReply_t *) ioc->taskmgmt_cmds.reply;
4870 
4871 	for (ii = 0; ii < ioc->req_depth; ii++) {
4872 		if (ioc->fw_events_off)
4873 			goto out;
4874 		sc = mptscsih_get_scsi_lookup(ioc, ii);
4875 		if (!sc)
4876 			continue;
4877 		mf = MPT_INDEX_2_MFPTR(ioc, ii);
4878 		if (!mf)
4879 			continue;
4880 		task_context = mf->u.frame.hwhdr.msgctxu.MsgContext;
4881 		vdevice = sc->device->hostdata;
4882 		if (!vdevice || !vdevice->vtarget)
4883 			continue;
4884 		if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT)
4885 			continue; /* skip hidden raid components */
4886 		if (vdevice->vtarget->raidVolume)
4887 			continue; /* skip hidden raid components */
4888 		channel = vdevice->vtarget->channel;
4889 		id = vdevice->vtarget->id;
4890 		lun = vdevice->lun;
4891 		if (mptsas_issue_tm(ioc, MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK,
4892 		    channel, id, (u64)lun, task_context, 30, &issue_reset))
4893 			goto out;
4894 		query_count++;
4895 		termination_count +=
4896 		    le32_to_cpu(pScsiTmReply->TerminationCount);
4897 		if ((pScsiTmReply->IOCStatus == MPI_IOCSTATUS_SUCCESS) &&
4898 		    (pScsiTmReply->ResponseCode ==
4899 		    MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED ||
4900 		    pScsiTmReply->ResponseCode ==
4901 		    MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC))
4902 			continue;
4903 		if (mptsas_issue_tm(ioc,
4904 		    MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET,
4905 		    channel, id, (u64)lun, 0, 30, &issue_reset))
4906 			goto out;
4907 		termination_count +=
4908 		    le32_to_cpu(pScsiTmReply->TerminationCount);
4909 	}
4910 
4911  out:
4912 	dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
4913 	    "%s - exit, query_count = %d termination_count = %d\n",
4914 	    ioc->name, __func__, query_count, termination_count));
4915 
4916 	ioc->broadcast_aen_busy = 0;
4917 	mpt_clear_taskmgmt_in_progress_flag(ioc);
4918 	mutex_unlock(&ioc->taskmgmt_cmds.mutex);
4919 
4920 	if (issue_reset) {
4921 		printk(MYIOC_s_WARN_FMT
4922 		       "Issuing Reset from %s!! doorbell=0x%08x\n",
4923 		       ioc->name, __func__, mpt_GetIocState(ioc, 0));
4924 		mpt_Soft_Hard_ResetHandler(ioc, CAN_SLEEP);
4925 	}
4926 	mptsas_free_fw_event(ioc, fw_event);
4927 }
4928 
4929 /*
4930  * mptsas_send_ir2_event - handle exposing hidden disk when
4931  * an inactive raid volume is added
4932  *
4933  * @ioc: Pointer to MPT_ADAPTER structure
4934  * @ir2_data
4935  *
4936  */
4937 static void
4938 mptsas_send_ir2_event(struct fw_event_work *fw_event)
4939 {
4940 	MPT_ADAPTER	*ioc;
4941 	struct mptsas_hotplug_event hot_plug_info;
4942 	MPI_EVENT_DATA_IR2	*ir2_data;
4943 	u8 reasonCode;
4944 	RaidPhysDiskPage0_t phys_disk;
4945 
4946 	ioc = fw_event->ioc;
4947 	ir2_data = (MPI_EVENT_DATA_IR2 *)fw_event->event_data;
4948 	reasonCode = ir2_data->ReasonCode;
4949 
4950 	devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Entering %s: "
4951 	    "ReasonCode=%02x\n", ioc->name, __func__, reasonCode));
4952 
4953 	memset(&hot_plug_info, 0, sizeof(struct mptsas_hotplug_event));
4954 	hot_plug_info.id = ir2_data->TargetID;
4955 	hot_plug_info.channel = ir2_data->Bus;
4956 	switch (reasonCode) {
4957 	case MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED:
4958 		hot_plug_info.event_type = MPTSAS_ADD_INACTIVE_VOLUME;
4959 		break;
4960 	case MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED:
4961 		hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum;
4962 		hot_plug_info.event_type = MPTSAS_DEL_PHYSDISK;
4963 		break;
4964 	case MPI_EVENT_IR2_RC_DUAL_PORT_ADDED:
4965 		hot_plug_info.phys_disk_num = ir2_data->PhysDiskNum;
4966 		mpt_raid_phys_disk_pg0(ioc,
4967 		    ir2_data->PhysDiskNum, &phys_disk);
4968 		hot_plug_info.id = phys_disk.PhysDiskID;
4969 		hot_plug_info.event_type = MPTSAS_ADD_PHYSDISK;
4970 		break;
4971 	default:
4972 		mptsas_free_fw_event(ioc, fw_event);
4973 		return;
4974 	}
4975 	mptsas_hotplug_work(ioc, fw_event, &hot_plug_info);
4976 }
4977 
4978 static int
4979 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
4980 {
4981 	u32 event = le32_to_cpu(reply->Event);
4982 	int event_data_sz;
4983 	struct fw_event_work *fw_event;
4984 	unsigned long delay;
4985 
4986 	if (ioc->bus_type != SAS)
4987 		return 0;
4988 
4989 	/* events turned off due to host reset or driver unloading */
4990 	if (ioc->fw_events_off)
4991 		return 0;
4992 
4993 	delay = msecs_to_jiffies(1);
4994 	switch (event) {
4995 	case MPI_EVENT_SAS_BROADCAST_PRIMITIVE:
4996 	{
4997 		EVENT_DATA_SAS_BROADCAST_PRIMITIVE *broadcast_event_data =
4998 		    (EVENT_DATA_SAS_BROADCAST_PRIMITIVE *)reply->Data;
4999 		if (broadcast_event_data->Primitive !=
5000 		    MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT)
5001 			return 0;
5002 		if (ioc->broadcast_aen_busy)
5003 			return 0;
5004 		ioc->broadcast_aen_busy = 1;
5005 		break;
5006 	}
5007 	case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
5008 	{
5009 		EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data =
5010 		    (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data;
5011 		u16	ioc_stat;
5012 		ioc_stat = le16_to_cpu(reply->IOCStatus);
5013 
5014 		if (sas_event_data->ReasonCode ==
5015 		    MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING) {
5016 			mptsas_target_reset_queue(ioc, sas_event_data);
5017 			return 0;
5018 		}
5019 		if (sas_event_data->ReasonCode ==
5020 			MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET &&
5021 			ioc->device_missing_delay &&
5022 			(ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)) {
5023 			VirtTarget *vtarget = NULL;
5024 			u8		id, channel;
5025 
5026 			id = sas_event_data->TargetID;
5027 			channel = sas_event_data->Bus;
5028 
5029 			vtarget = mptsas_find_vtarget(ioc, channel, id);
5030 			if (vtarget) {
5031 				devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
5032 				    "LogInfo (0x%x) available for "
5033 				   "INTERNAL_DEVICE_RESET"
5034 				   "fw_id %d fw_channel %d\n", ioc->name,
5035 				   le32_to_cpu(reply->IOCLogInfo),
5036 				   id, channel));
5037 				if (vtarget->raidVolume) {
5038 					devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
5039 					"Skipping Raid Volume for inDMD\n",
5040 					ioc->name));
5041 				} else {
5042 					devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT
5043 					"Setting device flag inDMD\n",
5044 					ioc->name));
5045 					vtarget->inDMD = 1;
5046 				}
5047 
5048 			}
5049 
5050 		}
5051 
5052 		break;
5053 	}
5054 	case MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE:
5055 	{
5056 		MpiEventDataSasExpanderStatusChange_t *expander_data =
5057 		    (MpiEventDataSasExpanderStatusChange_t *)reply->Data;
5058 
5059 		if (ioc->old_sas_discovery_protocal)
5060 			return 0;
5061 
5062 		if (expander_data->ReasonCode ==
5063 		    MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING &&
5064 		    ioc->device_missing_delay)
5065 			delay = HZ * ioc->device_missing_delay;
5066 		break;
5067 	}
5068 	case MPI_EVENT_SAS_DISCOVERY:
5069 	{
5070 		u32 discovery_status;
5071 		EventDataSasDiscovery_t *discovery_data =
5072 		    (EventDataSasDiscovery_t *)reply->Data;
5073 
5074 		discovery_status = le32_to_cpu(discovery_data->DiscoveryStatus);
5075 		ioc->sas_discovery_quiesce_io = discovery_status ? 1 : 0;
5076 		if (ioc->old_sas_discovery_protocal && !discovery_status)
5077 			mptsas_queue_rescan(ioc);
5078 		return 0;
5079 	}
5080 	case MPI_EVENT_INTEGRATED_RAID:
5081 	case MPI_EVENT_PERSISTENT_TABLE_FULL:
5082 	case MPI_EVENT_IR2:
5083 	case MPI_EVENT_SAS_PHY_LINK_STATUS:
5084 	case MPI_EVENT_QUEUE_FULL:
5085 		break;
5086 	default:
5087 		return 0;
5088 	}
5089 
5090 	event_data_sz = ((reply->MsgLength * 4) -
5091 	    offsetof(EventNotificationReply_t, Data));
5092 	fw_event = kzalloc(sizeof(*fw_event) + event_data_sz, GFP_ATOMIC);
5093 	if (!fw_event) {
5094 		printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", ioc->name,
5095 		 __func__, __LINE__);
5096 		return 0;
5097 	}
5098 	memcpy(fw_event->event_data, reply->Data, event_data_sz);
5099 	fw_event->event = event;
5100 	fw_event->ioc = ioc;
5101 	mptsas_add_fw_event(ioc, fw_event, delay);
5102 	return 0;
5103 }
5104 
5105 /* Delete a volume when no longer listed in ioc pg2
5106  */
5107 static void mptsas_volume_delete(MPT_ADAPTER *ioc, u8 id)
5108 {
5109 	struct scsi_device *sdev;
5110 	int i;
5111 
5112 	sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, id, 0);
5113 	if (!sdev)
5114 		return;
5115 	if (!ioc->raid_data.pIocPg2)
5116 		goto out;
5117 	if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
5118 		goto out;
5119 	for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
5120 		if (ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id)
5121 			goto release_sdev;
5122  out:
5123 	printk(MYIOC_s_INFO_FMT "removing raid volume, channel %d, "
5124 	    "id %d\n", ioc->name, MPTSAS_RAID_CHANNEL, id);
5125 	scsi_remove_device(sdev);
5126  release_sdev:
5127 	scsi_device_put(sdev);
5128 }
5129 
5130 static int
5131 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
5132 {
5133 	struct Scsi_Host	*sh;
5134 	MPT_SCSI_HOST		*hd;
5135 	MPT_ADAPTER 		*ioc;
5136 	unsigned long		 flags;
5137 	int			 ii;
5138 	int			 numSGE = 0;
5139 	int			 scale;
5140 	int			 ioc_cap;
5141 	int			error=0;
5142 	int			r;
5143 
5144 	r = mpt_attach(pdev,id);
5145 	if (r)
5146 		return r;
5147 
5148 	ioc = pci_get_drvdata(pdev);
5149 	mptsas_fw_event_off(ioc);
5150 	ioc->DoneCtx = mptsasDoneCtx;
5151 	ioc->TaskCtx = mptsasTaskCtx;
5152 	ioc->InternalCtx = mptsasInternalCtx;
5153 	ioc->schedule_target_reset = &mptsas_schedule_target_reset;
5154 	ioc->schedule_dead_ioc_flush_running_cmds =
5155 				&mptscsih_flush_running_cmds;
5156 	/*  Added sanity check on readiness of the MPT adapter.
5157 	 */
5158 	if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
5159 		printk(MYIOC_s_WARN_FMT
5160 		  "Skipping because it's not operational!\n",
5161 		  ioc->name);
5162 		error = -ENODEV;
5163 		goto out_mptsas_probe;
5164 	}
5165 
5166 	if (!ioc->active) {
5167 		printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
5168 		  ioc->name);
5169 		error = -ENODEV;
5170 		goto out_mptsas_probe;
5171 	}
5172 
5173 	/*  Sanity check - ensure at least 1 port is INITIATOR capable
5174 	 */
5175 	ioc_cap = 0;
5176 	for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
5177 		if (ioc->pfacts[ii].ProtocolFlags &
5178 				MPI_PORTFACTS_PROTOCOL_INITIATOR)
5179 			ioc_cap++;
5180 	}
5181 
5182 	if (!ioc_cap) {
5183 		printk(MYIOC_s_WARN_FMT
5184 			"Skipping ioc=%p because SCSI Initiator mode "
5185 			"is NOT enabled!\n", ioc->name, ioc);
5186 		return 0;
5187 	}
5188 
5189 	sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
5190 	if (!sh) {
5191 		printk(MYIOC_s_WARN_FMT
5192 			"Unable to register controller with SCSI subsystem\n",
5193 			ioc->name);
5194 		error = -1;
5195 		goto out_mptsas_probe;
5196         }
5197 
5198 	spin_lock_irqsave(&ioc->FreeQlock, flags);
5199 
5200 	/* Attach the SCSI Host to the IOC structure
5201 	 */
5202 	ioc->sh = sh;
5203 
5204 	sh->io_port = 0;
5205 	sh->n_io_port = 0;
5206 	sh->irq = 0;
5207 
5208 	/* set 16 byte cdb's */
5209 	sh->max_cmd_len = 16;
5210 	sh->can_queue = min_t(int, ioc->req_depth - 10, sh->can_queue);
5211 	sh->max_id = -1;
5212 	sh->max_lun = max_lun;
5213 	sh->transportt = mptsas_transport_template;
5214 
5215 	/* Required entry.
5216 	 */
5217 	sh->unique_id = ioc->id;
5218 
5219 	INIT_LIST_HEAD(&ioc->sas_topology);
5220 	mutex_init(&ioc->sas_topology_mutex);
5221 	mutex_init(&ioc->sas_discovery_mutex);
5222 	mutex_init(&ioc->sas_mgmt.mutex);
5223 	init_completion(&ioc->sas_mgmt.done);
5224 
5225 	/* Verify that we won't exceed the maximum
5226 	 * number of chain buffers
5227 	 * We can optimize:  ZZ = req_sz/sizeof(SGE)
5228 	 * For 32bit SGE's:
5229 	 *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
5230 	 *               + (req_sz - 64)/sizeof(SGE)
5231 	 * A slightly different algorithm is required for
5232 	 * 64bit SGEs.
5233 	 */
5234 	scale = ioc->req_sz/ioc->SGE_size;
5235 	if (ioc->sg_addr_size == sizeof(u64)) {
5236 		numSGE = (scale - 1) *
5237 		  (ioc->facts.MaxChainDepth-1) + scale +
5238 		  (ioc->req_sz - 60) / ioc->SGE_size;
5239 	} else {
5240 		numSGE = 1 + (scale - 1) *
5241 		  (ioc->facts.MaxChainDepth-1) + scale +
5242 		  (ioc->req_sz - 64) / ioc->SGE_size;
5243 	}
5244 
5245 	if (numSGE < sh->sg_tablesize) {
5246 		/* Reset this value */
5247 		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
5248 		  "Resetting sg_tablesize to %d from %d\n",
5249 		  ioc->name, numSGE, sh->sg_tablesize));
5250 		sh->sg_tablesize = numSGE;
5251 	}
5252 
5253 	if (mpt_loadtime_max_sectors) {
5254 		if (mpt_loadtime_max_sectors < 64 ||
5255 			mpt_loadtime_max_sectors > 8192) {
5256 			printk(MYIOC_s_INFO_FMT "Invalid value passed for"
5257 				"mpt_loadtime_max_sectors %d."
5258 				"Range from 64 to 8192\n", ioc->name,
5259 				mpt_loadtime_max_sectors);
5260 		}
5261 		mpt_loadtime_max_sectors &=  0xFFFFFFFE;
5262 		dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
5263 			"Resetting max sector to %d from %d\n",
5264 		  ioc->name, mpt_loadtime_max_sectors, sh->max_sectors));
5265 		sh->max_sectors = mpt_loadtime_max_sectors;
5266 	}
5267 
5268 	hd = shost_priv(sh);
5269 	hd->ioc = ioc;
5270 
5271 	/* SCSI needs scsi_cmnd lookup table!
5272 	 * (with size equal to req_depth*PtrSz!)
5273 	 */
5274 	ioc->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
5275 	if (!ioc->ScsiLookup) {
5276 		error = -ENOMEM;
5277 		spin_unlock_irqrestore(&ioc->FreeQlock, flags);
5278 		goto out_mptsas_probe;
5279 	}
5280 	spin_lock_init(&ioc->scsi_lookup_lock);
5281 
5282 	dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
5283 		 ioc->name, ioc->ScsiLookup));
5284 
5285 	ioc->sas_data.ptClear = mpt_pt_clear;
5286 
5287 	hd->last_queue_full = 0;
5288 	INIT_LIST_HEAD(&hd->target_reset_list);
5289 	INIT_LIST_HEAD(&ioc->sas_device_info_list);
5290 	mutex_init(&ioc->sas_device_info_mutex);
5291 
5292 	spin_unlock_irqrestore(&ioc->FreeQlock, flags);
5293 
5294 	if (ioc->sas_data.ptClear==1) {
5295 		mptbase_sas_persist_operation(
5296 		    ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
5297 	}
5298 
5299 	error = scsi_add_host(sh, &ioc->pcidev->dev);
5300 	if (error) {
5301 		dprintk(ioc, printk(MYIOC_s_ERR_FMT
5302 		  "scsi_add_host failed\n", ioc->name));
5303 		goto out_mptsas_probe;
5304 	}
5305 
5306 	/* older firmware doesn't support expander events */
5307 	if ((ioc->facts.HeaderVersion >> 8) < 0xE)
5308 		ioc->old_sas_discovery_protocal = 1;
5309 	mptsas_scan_sas_topology(ioc);
5310 	mptsas_fw_event_on(ioc);
5311 	return 0;
5312 
5313  out_mptsas_probe:
5314 
5315 	mptscsih_remove(pdev);
5316 	return error;
5317 }
5318 
5319 static void
5320 mptsas_shutdown(struct pci_dev *pdev)
5321 {
5322 	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
5323 
5324 	mptsas_fw_event_off(ioc);
5325 	mptsas_cleanup_fw_event_q(ioc);
5326 }
5327 
5328 static void mptsas_remove(struct pci_dev *pdev)
5329 {
5330 	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
5331 	struct mptsas_portinfo *p, *n;
5332 	int i;
5333 
5334 	if (!ioc->sh) {
5335 		printk(MYIOC_s_INFO_FMT "IOC is in Target mode\n", ioc->name);
5336 		mpt_detach(pdev);
5337 		return;
5338 	}
5339 
5340 	mptsas_shutdown(pdev);
5341 
5342 	mptsas_del_device_components(ioc);
5343 
5344 	ioc->sas_discovery_ignore_events = 1;
5345 	sas_remove_host(ioc->sh);
5346 
5347 	mutex_lock(&ioc->sas_topology_mutex);
5348 	list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
5349 		list_del(&p->list);
5350 		for (i = 0 ; i < p->num_phys ; i++)
5351 			mptsas_port_delete(ioc, p->phy_info[i].port_details);
5352 
5353 		kfree(p->phy_info);
5354 		kfree(p);
5355 	}
5356 	mutex_unlock(&ioc->sas_topology_mutex);
5357 	ioc->hba_port_info = NULL;
5358 	mptscsih_remove(pdev);
5359 }
5360 
5361 static struct pci_device_id mptsas_pci_table[] = {
5362 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
5363 		PCI_ANY_ID, PCI_ANY_ID },
5364 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
5365 		PCI_ANY_ID, PCI_ANY_ID },
5366 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
5367 		PCI_ANY_ID, PCI_ANY_ID },
5368 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
5369 		PCI_ANY_ID, PCI_ANY_ID },
5370 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
5371 		PCI_ANY_ID, PCI_ANY_ID },
5372 	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068_820XELP,
5373 		PCI_ANY_ID, PCI_ANY_ID },
5374 	{0}	/* Terminating entry */
5375 };
5376 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
5377 
5378 
5379 static struct pci_driver mptsas_driver = {
5380 	.name		= "mptsas",
5381 	.id_table	= mptsas_pci_table,
5382 	.probe		= mptsas_probe,
5383 	.remove		= mptsas_remove,
5384 	.shutdown	= mptsas_shutdown,
5385 #ifdef CONFIG_PM
5386 	.suspend	= mptscsih_suspend,
5387 	.resume		= mptscsih_resume,
5388 #endif
5389 };
5390 
5391 static int __init
5392 mptsas_init(void)
5393 {
5394 	int error;
5395 
5396 	show_mptmod_ver(my_NAME, my_VERSION);
5397 
5398 	mptsas_transport_template =
5399 	    sas_attach_transport(&mptsas_transport_functions);
5400 	if (!mptsas_transport_template)
5401 		return -ENODEV;
5402 
5403 	mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER,
5404 	    "mptscsih_io_done");
5405 	mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER,
5406 	    "mptscsih_taskmgmt_complete");
5407 	mptsasInternalCtx =
5408 		mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER,
5409 		    "mptscsih_scandv_complete");
5410 	mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER,
5411 	    "mptsas_mgmt_done");
5412 	mptsasDeviceResetCtx =
5413 		mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER,
5414 		    "mptsas_taskmgmt_complete");
5415 
5416 	mpt_event_register(mptsasDoneCtx, mptsas_event_process);
5417 	mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset);
5418 
5419 	error = pci_register_driver(&mptsas_driver);
5420 	if (error)
5421 		sas_release_transport(mptsas_transport_template);
5422 
5423 	return error;
5424 }
5425 
5426 static void __exit
5427 mptsas_exit(void)
5428 {
5429 	pci_unregister_driver(&mptsas_driver);
5430 	sas_release_transport(mptsas_transport_template);
5431 
5432 	mpt_reset_deregister(mptsasDoneCtx);
5433 	mpt_event_deregister(mptsasDoneCtx);
5434 
5435 	mpt_deregister(mptsasMgmtCtx);
5436 	mpt_deregister(mptsasInternalCtx);
5437 	mpt_deregister(mptsasTaskCtx);
5438 	mpt_deregister(mptsasDoneCtx);
5439 	mpt_deregister(mptsasDeviceResetCtx);
5440 }
5441 
5442 module_init(mptsas_init);
5443 module_exit(mptsas_exit);
5444