xref: /linux/drivers/message/fusion/mptsas.c (revision 7b12b9137930eb821b68e1bfa11e9de692208620)
1 /*
2  *  linux/drivers/message/fusion/mptsas.c
3  *      For use with LSI Logic PCI chip/adapter(s)
4  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
5  *
6  *  Copyright (c) 1999-2005 LSI Logic Corporation
7  *  (mailto:mpt_linux_developer@lsil.com)
8  *  Copyright (c) 2005-2006 Dell
9  */
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 /*
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; version 2 of the License.
15 
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20 
21     NO WARRANTY
22     THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23     CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24     LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25     MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26     solely responsible for determining the appropriateness of using and
27     distributing the Program and assumes all risks associated with its
28     exercise of rights under this Agreement, including but not limited to
29     the risks and costs of program errors, damage to or loss of data,
30     programs or equipment, and unavailability or interruption of operations.
31 
32     DISCLAIMER OF LIABILITY
33     NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
34     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35     DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
36     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
37     TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
38     USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
39     HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40 
41     You should have received a copy of the GNU General Public License
42     along with this program; if not, write to the Free Software
43     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
44 */
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
46 
47 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/init.h>
50 #include <linux/errno.h>
51 #include <linux/sched.h>
52 #include <linux/workqueue.h>
53 
54 #include <scsi/scsi_cmnd.h>
55 #include <scsi/scsi_device.h>
56 #include <scsi/scsi_host.h>
57 #include <scsi/scsi_transport_sas.h>
58 
59 #include "mptbase.h"
60 #include "mptscsih.h"
61 
62 
63 #define my_NAME		"Fusion MPT SAS Host driver"
64 #define my_VERSION	MPT_LINUX_VERSION_COMMON
65 #define MYNAM		"mptsas"
66 
67 MODULE_AUTHOR(MODULEAUTHOR);
68 MODULE_DESCRIPTION(my_NAME);
69 MODULE_LICENSE("GPL");
70 
71 static int mpt_pq_filter;
72 module_param(mpt_pq_filter, int, 0);
73 MODULE_PARM_DESC(mpt_pq_filter,
74 		"Enable peripheral qualifier filter: enable=1  "
75 		"(default=0)");
76 
77 static int mpt_pt_clear;
78 module_param(mpt_pt_clear, int, 0);
79 MODULE_PARM_DESC(mpt_pt_clear,
80 		"Clear persistency table: enable=1  "
81 		"(default=MPTSCSIH_PT_CLEAR=0)");
82 
83 static int	mptsasDoneCtx = -1;
84 static int	mptsasTaskCtx = -1;
85 static int	mptsasInternalCtx = -1; /* Used only for internal commands */
86 static int	mptsasMgmtCtx = -1;
87 
88 
89 enum mptsas_hotplug_action {
90 	MPTSAS_ADD_DEVICE,
91 	MPTSAS_DEL_DEVICE,
92 	MPTSAS_ADD_RAID,
93 	MPTSAS_DEL_RAID,
94 };
95 
96 struct mptsas_hotplug_event {
97 	struct work_struct	work;
98 	MPT_ADAPTER		*ioc;
99 	enum mptsas_hotplug_action event_type;
100 	u64			sas_address;
101 	u32			channel;
102 	u32			id;
103 	u32			device_info;
104 	u16			handle;
105 	u16			parent_handle;
106 	u8			phy_id;
107 	u8			phys_disk_num;
108 	u8			phys_disk_num_valid;
109 };
110 
111 struct mptsas_discovery_event {
112 	struct work_struct	work;
113 	MPT_ADAPTER		*ioc;
114 };
115 
116 /*
117  * SAS topology structures
118  *
119  * The MPT Fusion firmware interface spreads information about the
120  * SAS topology over many manufacture pages, thus we need some data
121  * structure to collect it and process it for the SAS transport class.
122  */
123 
124 struct mptsas_devinfo {
125 	u16	handle;		/* unique id to address this device */
126 	u16	handle_parent;	/* unique id to address parent device */
127 	u16	handle_enclosure; /* enclosure identifier of the enclosure */
128 	u16	slot;		/* physical slot in enclosure */
129 	u8	phy_id;		/* phy number of parent device */
130 	u8	port_id;	/* sas physical port this device
131 				   is assoc'd with */
132 	u8	id;		/* logical target id of this device */
133 	u8	channel;	/* logical bus number of this device */
134 	u64	sas_address;    /* WWN of this device,
135 				   SATA is assigned by HBA,expander */
136 	u32	device_info;	/* bitfield detailed info about this device */
137 };
138 
139 struct mptsas_phyinfo {
140 	u8	phy_id; 		/* phy index */
141 	u8	port_id; 		/* port number this phy is part of */
142 	u8	negotiated_link_rate;	/* nego'd link rate for this phy */
143 	u8	hw_link_rate; 		/* hardware max/min phys link rate */
144 	u8	programmed_link_rate;	/* programmed max/min phy link rate */
145 	struct mptsas_devinfo identify;	/* point to phy device info */
146 	struct mptsas_devinfo attached;	/* point to attached device info */
147 	struct sas_phy *phy;
148 	struct sas_rphy *rphy;
149 	struct scsi_target *starget;
150 };
151 
152 struct mptsas_portinfo {
153 	struct list_head list;
154 	u16		handle;		/* unique id to address this */
155 	u8		num_phys;	/* number of phys */
156 	struct mptsas_phyinfo *phy_info;
157 };
158 
159 struct mptsas_enclosure {
160 	u64	enclosure_logical_id;	/* The WWN for the enclosure */
161 	u16	enclosure_handle;	/* unique id to address this */
162 	u16	flags;			/* details enclosure management */
163 	u16	num_slot;		/* num slots */
164 	u16	start_slot;		/* first slot */
165 	u8	start_id;		/* starting logical target id */
166 	u8	start_channel;		/* starting logical channel id */
167 	u8	sep_id;			/* SEP device logical target id */
168 	u8	sep_channel;		/* SEP channel logical channel id */
169 };
170 
171 #ifdef SASDEBUG
172 static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
173 {
174 	printk("---- IO UNIT PAGE 0 ------------\n");
175 	printk("Handle=0x%X\n",
176 		le16_to_cpu(phy_data->AttachedDeviceHandle));
177 	printk("Controller Handle=0x%X\n",
178 		le16_to_cpu(phy_data->ControllerDevHandle));
179 	printk("Port=0x%X\n", phy_data->Port);
180 	printk("Port Flags=0x%X\n", phy_data->PortFlags);
181 	printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
182 	printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
183 	printk("Controller PHY Device Info=0x%X\n",
184 		le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
185 	printk("DiscoveryStatus=0x%X\n",
186 		le32_to_cpu(phy_data->DiscoveryStatus));
187 	printk("\n");
188 }
189 
190 static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
191 {
192 	__le64 sas_address;
193 
194 	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
195 
196 	printk("---- SAS PHY PAGE 0 ------------\n");
197 	printk("Attached Device Handle=0x%X\n",
198 			le16_to_cpu(pg0->AttachedDevHandle));
199 	printk("SAS Address=0x%llX\n",
200 			(unsigned long long)le64_to_cpu(sas_address));
201 	printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
202 	printk("Attached Device Info=0x%X\n",
203 			le32_to_cpu(pg0->AttachedDeviceInfo));
204 	printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
205 	printk("Change Count=0x%X\n", pg0->ChangeCount);
206 	printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
207 	printk("\n");
208 }
209 
210 static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
211 {
212 	printk("---- SAS PHY PAGE 1 ------------\n");
213 	printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
214 	printk("Running Disparity Error Count=0x%x\n",
215 			pg1->RunningDisparityErrorCount);
216 	printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
217 	printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
218 	printk("\n");
219 }
220 
221 static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
222 {
223 	__le64 sas_address;
224 
225 	memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
226 
227 	printk("---- SAS DEVICE PAGE 0 ---------\n");
228 	printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
229 	printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle));
230 	printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
231 	printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
232 	printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address));
233 	printk("Target ID=0x%X\n", pg0->TargetID);
234 	printk("Bus=0x%X\n", pg0->Bus);
235 	/* The PhyNum field specifies the PHY number of the parent
236 	 * device this device is linked to
237 	 */
238 	printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
239 	printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
240 	printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
241 	printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
242 	printk("Physical Port=0x%X\n", pg0->PhysicalPort);
243 	printk("\n");
244 }
245 
246 static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
247 {
248 	printk("---- SAS EXPANDER PAGE 1 ------------\n");
249 
250 	printk("Physical Port=0x%X\n", pg1->PhysicalPort);
251 	printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
252 	printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
253 	printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
254 	printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
255 	printk("Owner Device Handle=0x%X\n",
256 			le16_to_cpu(pg1->OwnerDevHandle));
257 	printk("Attached Device Handle=0x%X\n",
258 			le16_to_cpu(pg1->AttachedDevHandle));
259 }
260 #else
261 #define mptsas_print_phy_data(phy_data)		do { } while (0)
262 #define mptsas_print_phy_pg0(pg0)		do { } while (0)
263 #define mptsas_print_phy_pg1(pg1)		do { } while (0)
264 #define mptsas_print_device_pg0(pg0)		do { } while (0)
265 #define mptsas_print_expander_pg1(pg1)		do { } while (0)
266 #endif
267 
268 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
269 {
270 	struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
271 	return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
272 }
273 
274 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
275 {
276 	struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
277 	return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
278 }
279 
280 /*
281  * mptsas_find_portinfo_by_handle
282  *
283  * This function should be called with the sas_topology_mutex already held
284  */
285 static struct mptsas_portinfo *
286 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
287 {
288 	struct mptsas_portinfo *port_info, *rc=NULL;
289 	int i;
290 
291 	list_for_each_entry(port_info, &ioc->sas_topology, list)
292 		for (i = 0; i < port_info->num_phys; i++)
293 			if (port_info->phy_info[i].identify.handle == handle) {
294 				rc = port_info;
295 				goto out;
296 			}
297  out:
298 	return rc;
299 }
300 
301 static int
302 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
303 		u32 form, u32 form_specific)
304 {
305 	ConfigExtendedPageHeader_t hdr;
306 	CONFIGPARMS cfg;
307 	SasEnclosurePage0_t *buffer;
308 	dma_addr_t dma_handle;
309 	int error;
310 	__le64 le_identifier;
311 
312 	memset(&hdr, 0, sizeof(hdr));
313 	hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
314 	hdr.PageNumber = 0;
315 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
316 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
317 
318 	cfg.cfghdr.ehdr = &hdr;
319 	cfg.physAddr = -1;
320 	cfg.pageAddr = form + form_specific;
321 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
322 	cfg.dir = 0;	/* read */
323 	cfg.timeout = 10;
324 
325 	error = mpt_config(ioc, &cfg);
326 	if (error)
327 		goto out;
328 	if (!hdr.ExtPageLength) {
329 		error = -ENXIO;
330 		goto out;
331 	}
332 
333 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
334 			&dma_handle);
335 	if (!buffer) {
336 		error = -ENOMEM;
337 		goto out;
338 	}
339 
340 	cfg.physAddr = dma_handle;
341 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
342 
343 	error = mpt_config(ioc, &cfg);
344 	if (error)
345 		goto out_free_consistent;
346 
347 	/* save config data */
348 	memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
349 	enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
350 	enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
351 	enclosure->flags = le16_to_cpu(buffer->Flags);
352 	enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
353 	enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
354 	enclosure->start_id = buffer->StartTargetID;
355 	enclosure->start_channel = buffer->StartBus;
356 	enclosure->sep_id = buffer->SEPTargetID;
357 	enclosure->sep_channel = buffer->SEPBus;
358 
359  out_free_consistent:
360 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
361 			    buffer, dma_handle);
362  out:
363 	return error;
364 }
365 
366 static int
367 mptsas_slave_configure(struct scsi_device *sdev)
368 {
369 	struct Scsi_Host	*host = sdev->host;
370 	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata;
371 
372 	/*
373 	 * RAID volumes placed beyond the last expected port.
374 	 * Ignore sending sas mode pages in that case..
375 	 */
376 	if (sdev->channel < hd->ioc->num_ports)
377 		sas_read_port_mode_page(sdev);
378 
379 	return mptscsih_slave_configure(sdev);
380 }
381 
382 /*
383  * This is pretty ugly.  We will be able to seriously clean it up
384  * once the DV code in mptscsih goes away and we can properly
385  * implement ->target_alloc.
386  */
387 static int
388 mptsas_slave_alloc(struct scsi_device *sdev)
389 {
390 	struct Scsi_Host	*host = sdev->host;
391 	MPT_SCSI_HOST		*hd = (MPT_SCSI_HOST *)host->hostdata;
392 	struct sas_rphy		*rphy;
393 	struct mptsas_portinfo	*p;
394 	VirtTarget		*vtarget;
395 	VirtDevice		*vdev;
396 	struct scsi_target 	*starget;
397 	u32			target_id;
398 	int i;
399 
400 	vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
401 	if (!vdev) {
402 		printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
403 				hd->ioc->name, sizeof(VirtDevice));
404 		return -ENOMEM;
405 	}
406 	sdev->hostdata = vdev;
407 	starget = scsi_target(sdev);
408 	vtarget = starget->hostdata;
409 	vtarget->ioc_id = hd->ioc->id;
410 	vdev->vtarget = vtarget;
411 	if (vtarget->num_luns == 0) {
412 		vtarget->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY;
413 		hd->Targets[sdev->id] = vtarget;
414 	}
415 
416 	/*
417 	  RAID volumes placed beyond the last expected port.
418 	*/
419 	if (sdev->channel == hd->ioc->num_ports) {
420 		target_id = sdev->id;
421 		vtarget->bus_id = 0;
422 		vdev->lun = 0;
423 		goto out;
424 	}
425 
426 	rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
427 	mutex_lock(&hd->ioc->sas_topology_mutex);
428 	list_for_each_entry(p, &hd->ioc->sas_topology, list) {
429 		for (i = 0; i < p->num_phys; i++) {
430 			if (p->phy_info[i].attached.sas_address ==
431 					rphy->identify.sas_address) {
432 				target_id = p->phy_info[i].attached.id;
433 				vtarget->bus_id = p->phy_info[i].attached.channel;
434 				vdev->lun = sdev->lun;
435 				p->phy_info[i].starget = sdev->sdev_target;
436 				/*
437 				 * Exposing hidden disk (RAID)
438 				 */
439 				if (mptscsih_is_phys_disk(hd->ioc, target_id)) {
440 					target_id = mptscsih_raid_id_to_num(hd,
441 							target_id);
442 					vdev->vtarget->tflags |=
443 					    MPT_TARGET_FLAGS_RAID_COMPONENT;
444 					sdev->no_uld_attach = 1;
445 				}
446 				mutex_unlock(&hd->ioc->sas_topology_mutex);
447 				goto out;
448 			}
449 		}
450 	}
451 	mutex_unlock(&hd->ioc->sas_topology_mutex);
452 
453 	kfree(vdev);
454 	return -ENXIO;
455 
456  out:
457 	vtarget->target_id = target_id;
458 	vtarget->num_luns++;
459 	return 0;
460 }
461 
462 static void
463 mptsas_slave_destroy(struct scsi_device *sdev)
464 {
465 	struct Scsi_Host *host = sdev->host;
466 	MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
467 	VirtDevice *vdev;
468 
469 	/*
470 	 * Issue target reset to flush firmware outstanding commands.
471 	 */
472 	vdev = sdev->hostdata;
473 	if (vdev->configured_lun){
474 		if (mptscsih_TMHandler(hd,
475 		     MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
476 		     vdev->vtarget->bus_id,
477 		     vdev->vtarget->target_id,
478 		     0, 0, 5 /* 5 second timeout */)
479 		     < 0){
480 
481 			/* The TM request failed!
482 			 * Fatal error case.
483 			 */
484 			printk(MYIOC_s_WARN_FMT
485 		       "Error processing TaskMgmt id=%d TARGET_RESET\n",
486 				hd->ioc->name,
487 				vdev->vtarget->target_id);
488 
489 			hd->tmPending = 0;
490 			hd->tmState = TM_STATE_NONE;
491 		}
492 	}
493 	mptscsih_slave_destroy(sdev);
494 }
495 
496 static struct scsi_host_template mptsas_driver_template = {
497 	.module				= THIS_MODULE,
498 	.proc_name			= "mptsas",
499 	.proc_info			= mptscsih_proc_info,
500 	.name				= "MPT SPI Host",
501 	.info				= mptscsih_info,
502 	.queuecommand			= mptscsih_qcmd,
503 	.target_alloc			= mptscsih_target_alloc,
504 	.slave_alloc			= mptsas_slave_alloc,
505 	.slave_configure		= mptsas_slave_configure,
506 	.target_destroy			= mptscsih_target_destroy,
507 	.slave_destroy			= mptsas_slave_destroy,
508 	.change_queue_depth 		= mptscsih_change_queue_depth,
509 	.eh_abort_handler		= mptscsih_abort,
510 	.eh_device_reset_handler	= mptscsih_dev_reset,
511 	.eh_bus_reset_handler		= mptscsih_bus_reset,
512 	.eh_host_reset_handler		= mptscsih_host_reset,
513 	.bios_param			= mptscsih_bios_param,
514 	.can_queue			= MPT_FC_CAN_QUEUE,
515 	.this_id			= -1,
516 	.sg_tablesize			= MPT_SCSI_SG_DEPTH,
517 	.max_sectors			= 8192,
518 	.cmd_per_lun			= 7,
519 	.use_clustering			= ENABLE_CLUSTERING,
520 };
521 
522 static int mptsas_get_linkerrors(struct sas_phy *phy)
523 {
524 	MPT_ADAPTER *ioc = phy_to_ioc(phy);
525 	ConfigExtendedPageHeader_t hdr;
526 	CONFIGPARMS cfg;
527 	SasPhyPage1_t *buffer;
528 	dma_addr_t dma_handle;
529 	int error;
530 
531 	hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
532 	hdr.ExtPageLength = 0;
533 	hdr.PageNumber = 1 /* page number 1*/;
534 	hdr.Reserved1 = 0;
535 	hdr.Reserved2 = 0;
536 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
537 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
538 
539 	cfg.cfghdr.ehdr = &hdr;
540 	cfg.physAddr = -1;
541 	cfg.pageAddr = phy->identify.phy_identifier;
542 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
543 	cfg.dir = 0;    /* read */
544 	cfg.timeout = 10;
545 
546 	error = mpt_config(ioc, &cfg);
547 	if (error)
548 		return error;
549 	if (!hdr.ExtPageLength)
550 		return -ENXIO;
551 
552 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
553 				      &dma_handle);
554 	if (!buffer)
555 		return -ENOMEM;
556 
557 	cfg.physAddr = dma_handle;
558 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
559 
560 	error = mpt_config(ioc, &cfg);
561 	if (error)
562 		goto out_free_consistent;
563 
564 	mptsas_print_phy_pg1(buffer);
565 
566 	phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
567 	phy->running_disparity_error_count =
568 		le32_to_cpu(buffer->RunningDisparityErrorCount);
569 	phy->loss_of_dword_sync_count =
570 		le32_to_cpu(buffer->LossDwordSynchCount);
571 	phy->phy_reset_problem_count =
572 		le32_to_cpu(buffer->PhyResetProblemCount);
573 
574  out_free_consistent:
575 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
576 			    buffer, dma_handle);
577 	return error;
578 }
579 
580 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
581 		MPT_FRAME_HDR *reply)
582 {
583 	ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
584 	if (reply != NULL) {
585 		ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
586 		memcpy(ioc->sas_mgmt.reply, reply,
587 		    min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
588 	}
589 	complete(&ioc->sas_mgmt.done);
590 	return 1;
591 }
592 
593 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
594 {
595 	MPT_ADAPTER *ioc = phy_to_ioc(phy);
596 	SasIoUnitControlRequest_t *req;
597 	SasIoUnitControlReply_t *reply;
598 	MPT_FRAME_HDR *mf;
599 	MPIHeader_t *hdr;
600 	unsigned long timeleft;
601 	int error = -ERESTARTSYS;
602 
603 	/* not implemented for expanders */
604 	if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
605 		return -ENXIO;
606 
607 	if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
608 		goto out;
609 
610 	mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
611 	if (!mf) {
612 		error = -ENOMEM;
613 		goto out_unlock;
614 	}
615 
616 	hdr = (MPIHeader_t *) mf;
617 	req = (SasIoUnitControlRequest_t *)mf;
618 	memset(req, 0, sizeof(SasIoUnitControlRequest_t));
619 	req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
620 	req->MsgContext = hdr->MsgContext;
621 	req->Operation = hard_reset ?
622 		MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
623 	req->PhyNum = phy->identify.phy_identifier;
624 
625 	mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
626 
627 	timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
628 			10 * HZ);
629 	if (!timeleft) {
630 		/* On timeout reset the board */
631 		mpt_free_msg_frame(ioc, mf);
632 		mpt_HardResetHandler(ioc, CAN_SLEEP);
633 		error = -ETIMEDOUT;
634 		goto out_unlock;
635 	}
636 
637 	/* a reply frame is expected */
638 	if ((ioc->sas_mgmt.status &
639 	    MPT_IOCTL_STATUS_RF_VALID) == 0) {
640 		error = -ENXIO;
641 		goto out_unlock;
642 	}
643 
644 	/* process the completed Reply Message Frame */
645 	reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
646 	if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
647 		printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
648 		    __FUNCTION__,
649 		    reply->IOCStatus,
650 		    reply->IOCLogInfo);
651 		error = -ENXIO;
652 		goto out_unlock;
653 	}
654 
655 	error = 0;
656 
657  out_unlock:
658 	mutex_unlock(&ioc->sas_mgmt.mutex);
659  out:
660 	return error;
661 }
662 
663 static int
664 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
665 {
666 	MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
667 	int i, error;
668 	struct mptsas_portinfo *p;
669 	struct mptsas_enclosure enclosure_info;
670 	u64 enclosure_handle;
671 
672 	mutex_lock(&ioc->sas_topology_mutex);
673 	list_for_each_entry(p, &ioc->sas_topology, list) {
674 		for (i = 0; i < p->num_phys; i++) {
675 			if (p->phy_info[i].attached.sas_address ==
676 			    rphy->identify.sas_address) {
677 				enclosure_handle = p->phy_info[i].
678 					attached.handle_enclosure;
679 				goto found_info;
680 			}
681 		}
682 	}
683 	mutex_unlock(&ioc->sas_topology_mutex);
684 	return -ENXIO;
685 
686  found_info:
687 	mutex_unlock(&ioc->sas_topology_mutex);
688 	memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
689 	error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
690 			(MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
691 			 MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
692 	if (!error)
693 		*identifier = enclosure_info.enclosure_logical_id;
694 	return error;
695 }
696 
697 static int
698 mptsas_get_bay_identifier(struct sas_rphy *rphy)
699 {
700 	MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
701 	struct mptsas_portinfo *p;
702 	int i, rc;
703 
704 	mutex_lock(&ioc->sas_topology_mutex);
705 	list_for_each_entry(p, &ioc->sas_topology, list) {
706 		for (i = 0; i < p->num_phys; i++) {
707 			if (p->phy_info[i].attached.sas_address ==
708 			    rphy->identify.sas_address) {
709 				rc = p->phy_info[i].attached.slot;
710 				goto out;
711 			}
712 		}
713 	}
714 	rc = -ENXIO;
715  out:
716 	mutex_unlock(&ioc->sas_topology_mutex);
717 	return rc;
718 }
719 
720 static struct sas_function_template mptsas_transport_functions = {
721 	.get_linkerrors		= mptsas_get_linkerrors,
722 	.get_enclosure_identifier = mptsas_get_enclosure_identifier,
723 	.get_bay_identifier	= mptsas_get_bay_identifier,
724 	.phy_reset		= mptsas_phy_reset,
725 };
726 
727 static struct scsi_transport_template *mptsas_transport_template;
728 
729 static int
730 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
731 {
732 	ConfigExtendedPageHeader_t hdr;
733 	CONFIGPARMS cfg;
734 	SasIOUnitPage0_t *buffer;
735 	dma_addr_t dma_handle;
736 	int error, i;
737 
738 	hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
739 	hdr.ExtPageLength = 0;
740 	hdr.PageNumber = 0;
741 	hdr.Reserved1 = 0;
742 	hdr.Reserved2 = 0;
743 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
744 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
745 
746 	cfg.cfghdr.ehdr = &hdr;
747 	cfg.physAddr = -1;
748 	cfg.pageAddr = 0;
749 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
750 	cfg.dir = 0;	/* read */
751 	cfg.timeout = 10;
752 
753 	error = mpt_config(ioc, &cfg);
754 	if (error)
755 		goto out;
756 	if (!hdr.ExtPageLength) {
757 		error = -ENXIO;
758 		goto out;
759 	}
760 
761 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
762 					    &dma_handle);
763 	if (!buffer) {
764 		error = -ENOMEM;
765 		goto out;
766 	}
767 
768 	cfg.physAddr = dma_handle;
769 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
770 
771 	error = mpt_config(ioc, &cfg);
772 	if (error)
773 		goto out_free_consistent;
774 
775 	port_info->num_phys = buffer->NumPhys;
776 	port_info->phy_info = kcalloc(port_info->num_phys,
777 		sizeof(struct mptsas_phyinfo),GFP_KERNEL);
778 	if (!port_info->phy_info) {
779 		error = -ENOMEM;
780 		goto out_free_consistent;
781 	}
782 
783 	if (port_info->num_phys)
784 		port_info->handle =
785 		    le16_to_cpu(buffer->PhyData[0].ControllerDevHandle);
786 	for (i = 0; i < port_info->num_phys; i++) {
787 		mptsas_print_phy_data(&buffer->PhyData[i]);
788 		port_info->phy_info[i].phy_id = i;
789 		port_info->phy_info[i].port_id =
790 		    buffer->PhyData[i].Port;
791 		port_info->phy_info[i].negotiated_link_rate =
792 		    buffer->PhyData[i].NegotiatedLinkRate;
793 	}
794 
795  out_free_consistent:
796 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
797 			    buffer, dma_handle);
798  out:
799 	return error;
800 }
801 
802 static int
803 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
804 		u32 form, u32 form_specific)
805 {
806 	ConfigExtendedPageHeader_t hdr;
807 	CONFIGPARMS cfg;
808 	SasPhyPage0_t *buffer;
809 	dma_addr_t dma_handle;
810 	int error;
811 
812 	hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
813 	hdr.ExtPageLength = 0;
814 	hdr.PageNumber = 0;
815 	hdr.Reserved1 = 0;
816 	hdr.Reserved2 = 0;
817 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
818 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
819 
820 	cfg.cfghdr.ehdr = &hdr;
821 	cfg.dir = 0;	/* read */
822 	cfg.timeout = 10;
823 
824 	/* Get Phy Pg 0 for each Phy. */
825 	cfg.physAddr = -1;
826 	cfg.pageAddr = form + form_specific;
827 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
828 
829 	error = mpt_config(ioc, &cfg);
830 	if (error)
831 		goto out;
832 
833 	if (!hdr.ExtPageLength) {
834 		error = -ENXIO;
835 		goto out;
836 	}
837 
838 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
839 				      &dma_handle);
840 	if (!buffer) {
841 		error = -ENOMEM;
842 		goto out;
843 	}
844 
845 	cfg.physAddr = dma_handle;
846 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
847 
848 	error = mpt_config(ioc, &cfg);
849 	if (error)
850 		goto out_free_consistent;
851 
852 	mptsas_print_phy_pg0(buffer);
853 
854 	phy_info->hw_link_rate = buffer->HwLinkRate;
855 	phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
856 	phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
857 	phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
858 
859  out_free_consistent:
860 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
861 			    buffer, dma_handle);
862  out:
863 	return error;
864 }
865 
866 static int
867 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
868 		u32 form, u32 form_specific)
869 {
870 	ConfigExtendedPageHeader_t hdr;
871 	CONFIGPARMS cfg;
872 	SasDevicePage0_t *buffer;
873 	dma_addr_t dma_handle;
874 	__le64 sas_address;
875 	int error;
876 
877 	hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
878 	hdr.ExtPageLength = 0;
879 	hdr.PageNumber = 0;
880 	hdr.Reserved1 = 0;
881 	hdr.Reserved2 = 0;
882 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
883 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
884 
885 	cfg.cfghdr.ehdr = &hdr;
886 	cfg.pageAddr = form + form_specific;
887 	cfg.physAddr = -1;
888 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
889 	cfg.dir = 0;	/* read */
890 	cfg.timeout = 10;
891 
892 	memset(device_info, 0, sizeof(struct mptsas_devinfo));
893 	error = mpt_config(ioc, &cfg);
894 	if (error)
895 		goto out;
896 	if (!hdr.ExtPageLength) {
897 		error = -ENXIO;
898 		goto out;
899 	}
900 
901 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
902 				      &dma_handle);
903 	if (!buffer) {
904 		error = -ENOMEM;
905 		goto out;
906 	}
907 
908 	cfg.physAddr = dma_handle;
909 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
910 
911 	error = mpt_config(ioc, &cfg);
912 	if (error)
913 		goto out_free_consistent;
914 
915 	mptsas_print_device_pg0(buffer);
916 
917 	device_info->handle = le16_to_cpu(buffer->DevHandle);
918 	device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
919 	device_info->handle_enclosure =
920 	    le16_to_cpu(buffer->EnclosureHandle);
921 	device_info->slot = le16_to_cpu(buffer->Slot);
922 	device_info->phy_id = buffer->PhyNum;
923 	device_info->port_id = buffer->PhysicalPort;
924 	device_info->id = buffer->TargetID;
925 	device_info->channel = buffer->Bus;
926 	memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
927 	device_info->sas_address = le64_to_cpu(sas_address);
928 	device_info->device_info =
929 	    le32_to_cpu(buffer->DeviceInfo);
930 
931  out_free_consistent:
932 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
933 			    buffer, dma_handle);
934  out:
935 	return error;
936 }
937 
938 static int
939 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
940 		u32 form, u32 form_specific)
941 {
942 	ConfigExtendedPageHeader_t hdr;
943 	CONFIGPARMS cfg;
944 	SasExpanderPage0_t *buffer;
945 	dma_addr_t dma_handle;
946 	int error;
947 
948 	hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
949 	hdr.ExtPageLength = 0;
950 	hdr.PageNumber = 0;
951 	hdr.Reserved1 = 0;
952 	hdr.Reserved2 = 0;
953 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
954 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
955 
956 	cfg.cfghdr.ehdr = &hdr;
957 	cfg.physAddr = -1;
958 	cfg.pageAddr = form + form_specific;
959 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
960 	cfg.dir = 0;	/* read */
961 	cfg.timeout = 10;
962 
963 	memset(port_info, 0, sizeof(struct mptsas_portinfo));
964 	error = mpt_config(ioc, &cfg);
965 	if (error)
966 		goto out;
967 
968 	if (!hdr.ExtPageLength) {
969 		error = -ENXIO;
970 		goto out;
971 	}
972 
973 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
974 				      &dma_handle);
975 	if (!buffer) {
976 		error = -ENOMEM;
977 		goto out;
978 	}
979 
980 	cfg.physAddr = dma_handle;
981 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
982 
983 	error = mpt_config(ioc, &cfg);
984 	if (error)
985 		goto out_free_consistent;
986 
987 	/* save config data */
988 	port_info->num_phys = buffer->NumPhys;
989 	port_info->handle = le16_to_cpu(buffer->DevHandle);
990 	port_info->phy_info = kcalloc(port_info->num_phys,
991 		sizeof(struct mptsas_phyinfo),GFP_KERNEL);
992 	if (!port_info->phy_info) {
993 		error = -ENOMEM;
994 		goto out_free_consistent;
995 	}
996 
997  out_free_consistent:
998 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
999 			    buffer, dma_handle);
1000  out:
1001 	return error;
1002 }
1003 
1004 static int
1005 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1006 		u32 form, u32 form_specific)
1007 {
1008 	ConfigExtendedPageHeader_t hdr;
1009 	CONFIGPARMS cfg;
1010 	SasExpanderPage1_t *buffer;
1011 	dma_addr_t dma_handle;
1012 	int error;
1013 
1014 	hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1015 	hdr.ExtPageLength = 0;
1016 	hdr.PageNumber = 1;
1017 	hdr.Reserved1 = 0;
1018 	hdr.Reserved2 = 0;
1019 	hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1020 	hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1021 
1022 	cfg.cfghdr.ehdr = &hdr;
1023 	cfg.physAddr = -1;
1024 	cfg.pageAddr = form + form_specific;
1025 	cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1026 	cfg.dir = 0;	/* read */
1027 	cfg.timeout = 10;
1028 
1029 	error = mpt_config(ioc, &cfg);
1030 	if (error)
1031 		goto out;
1032 
1033 	if (!hdr.ExtPageLength) {
1034 		error = -ENXIO;
1035 		goto out;
1036 	}
1037 
1038 	buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1039 				      &dma_handle);
1040 	if (!buffer) {
1041 		error = -ENOMEM;
1042 		goto out;
1043 	}
1044 
1045 	cfg.physAddr = dma_handle;
1046 	cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1047 
1048 	error = mpt_config(ioc, &cfg);
1049 	if (error)
1050 		goto out_free_consistent;
1051 
1052 
1053 	mptsas_print_expander_pg1(buffer);
1054 
1055 	/* save config data */
1056 	phy_info->phy_id = buffer->PhyIdentifier;
1057 	phy_info->port_id = buffer->PhysicalPort;
1058 	phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1059 	phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1060 	phy_info->hw_link_rate = buffer->HwLinkRate;
1061 	phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1062 	phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1063 
1064  out_free_consistent:
1065 	pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1066 			    buffer, dma_handle);
1067  out:
1068 	return error;
1069 }
1070 
1071 /*
1072  * Returns true if there is a scsi end device
1073  */
1074 static inline int
1075 mptsas_is_end_device(struct mptsas_devinfo * attached)
1076 {
1077 	if ((attached->handle) &&
1078 	    (attached->device_info &
1079 	    MPI_SAS_DEVICE_INFO_END_DEVICE) &&
1080 	    ((attached->device_info &
1081 	    MPI_SAS_DEVICE_INFO_SSP_TARGET) |
1082 	    (attached->device_info &
1083 	    MPI_SAS_DEVICE_INFO_STP_TARGET) |
1084 	    (attached->device_info &
1085 	    MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
1086 		return 1;
1087 	else
1088 		return 0;
1089 }
1090 
1091 static void
1092 mptsas_parse_device_info(struct sas_identify *identify,
1093 		struct mptsas_devinfo *device_info)
1094 {
1095 	u16 protocols;
1096 
1097 	identify->sas_address = device_info->sas_address;
1098 	identify->phy_identifier = device_info->phy_id;
1099 
1100 	/*
1101 	 * Fill in Phy Initiator Port Protocol.
1102 	 * Bits 6:3, more than one bit can be set, fall through cases.
1103 	 */
1104 	protocols = device_info->device_info & 0x78;
1105 	identify->initiator_port_protocols = 0;
1106 	if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1107 		identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1108 	if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1109 		identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1110 	if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1111 		identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1112 	if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1113 		identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1114 
1115 	/*
1116 	 * Fill in Phy Target Port Protocol.
1117 	 * Bits 10:7, more than one bit can be set, fall through cases.
1118 	 */
1119 	protocols = device_info->device_info & 0x780;
1120 	identify->target_port_protocols = 0;
1121 	if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1122 		identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1123 	if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1124 		identify->target_port_protocols |= SAS_PROTOCOL_STP;
1125 	if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1126 		identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1127 	if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1128 		identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1129 
1130 	/*
1131 	 * Fill in Attached device type.
1132 	 */
1133 	switch (device_info->device_info &
1134 			MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1135 	case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1136 		identify->device_type = SAS_PHY_UNUSED;
1137 		break;
1138 	case MPI_SAS_DEVICE_INFO_END_DEVICE:
1139 		identify->device_type = SAS_END_DEVICE;
1140 		break;
1141 	case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1142 		identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1143 		break;
1144 	case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1145 		identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1146 		break;
1147 	}
1148 }
1149 
1150 static int mptsas_probe_one_phy(struct device *dev,
1151 		struct mptsas_phyinfo *phy_info, int index, int local)
1152 {
1153 	MPT_ADAPTER *ioc;
1154 	struct sas_phy *phy;
1155 	int error;
1156 
1157 	if (!dev)
1158 		return -ENODEV;
1159 
1160 	if (!phy_info->phy) {
1161 		phy = sas_phy_alloc(dev, index);
1162 		if (!phy)
1163 			return -ENOMEM;
1164 	} else
1165 		phy = phy_info->phy;
1166 
1167 	phy->port_identifier = phy_info->port_id;
1168 	mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1169 
1170 	/*
1171 	 * Set Negotiated link rate.
1172 	 */
1173 	switch (phy_info->negotiated_link_rate) {
1174 	case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1175 		phy->negotiated_linkrate = SAS_PHY_DISABLED;
1176 		break;
1177 	case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1178 		phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1179 		break;
1180 	case MPI_SAS_IOUNIT0_RATE_1_5:
1181 		phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1182 		break;
1183 	case MPI_SAS_IOUNIT0_RATE_3_0:
1184 		phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1185 		break;
1186 	case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1187 	case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1188 	default:
1189 		phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1190 		break;
1191 	}
1192 
1193 	/*
1194 	 * Set Max hardware link rate.
1195 	 */
1196 	switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1197 	case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1198 		phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1199 		break;
1200 	case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1201 		phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1202 		break;
1203 	default:
1204 		break;
1205 	}
1206 
1207 	/*
1208 	 * Set Max programmed link rate.
1209 	 */
1210 	switch (phy_info->programmed_link_rate &
1211 			MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1212 	case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1213 		phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1214 		break;
1215 	case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1216 		phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1217 		break;
1218 	default:
1219 		break;
1220 	}
1221 
1222 	/*
1223 	 * Set Min hardware link rate.
1224 	 */
1225 	switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1226 	case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1227 		phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1228 		break;
1229 	case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1230 		phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1231 		break;
1232 	default:
1233 		break;
1234 	}
1235 
1236 	/*
1237 	 * Set Min programmed link rate.
1238 	 */
1239 	switch (phy_info->programmed_link_rate &
1240 			MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1241 	case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1242 		phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1243 		break;
1244 	case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1245 		phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1246 		break;
1247 	default:
1248 		break;
1249 	}
1250 
1251 	if (!phy_info->phy) {
1252 
1253 		if (local)
1254 			phy->local_attached = 1;
1255 
1256 		error = sas_phy_add(phy);
1257 		if (error) {
1258 			sas_phy_free(phy);
1259 			return error;
1260 		}
1261 		phy_info->phy = phy;
1262 	}
1263 
1264 	if ((phy_info->attached.handle) &&
1265 	    (!phy_info->rphy)) {
1266 
1267 		struct sas_rphy *rphy;
1268 		struct sas_identify identify;
1269 
1270 		ioc = phy_to_ioc(phy_info->phy);
1271 
1272 		/*
1273 		 * Let the hotplug_work thread handle processing
1274 		 * the adding/removing of devices that occur
1275 		 * after start of day.
1276 		 */
1277 		if (ioc->sas_discovery_runtime &&
1278 			mptsas_is_end_device(&phy_info->attached))
1279 			return 0;
1280 
1281 		mptsas_parse_device_info(&identify, &phy_info->attached);
1282 		switch (identify.device_type) {
1283 		case SAS_END_DEVICE:
1284 			rphy = sas_end_device_alloc(phy);
1285 			break;
1286 		case SAS_EDGE_EXPANDER_DEVICE:
1287 		case SAS_FANOUT_EXPANDER_DEVICE:
1288 			rphy = sas_expander_alloc(phy, identify.device_type);
1289 			break;
1290 		default:
1291 			rphy = NULL;
1292 			break;
1293 		}
1294 		if (!rphy)
1295 			return 0; /* non-fatal: an rphy can be added later */
1296 
1297 		rphy->identify = identify;
1298 
1299 		error = sas_rphy_add(rphy);
1300 		if (error) {
1301 			sas_rphy_free(rphy);
1302 			return error;
1303 		}
1304 
1305 		phy_info->rphy = rphy;
1306 	}
1307 
1308 	return 0;
1309 }
1310 
1311 static int
1312 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
1313 {
1314 	struct mptsas_portinfo *port_info, *hba;
1315 	u32 handle = 0xFFFF;
1316 	int error = -ENOMEM, i;
1317 
1318 	hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
1319 	if (! hba)
1320 		goto out;
1321 
1322 	error = mptsas_sas_io_unit_pg0(ioc, hba);
1323 	if (error)
1324 		goto out_free_port_info;
1325 
1326 	mutex_lock(&ioc->sas_topology_mutex);
1327 	port_info = mptsas_find_portinfo_by_handle(ioc, hba->handle);
1328 	if (!port_info) {
1329 		port_info = hba;
1330 		list_add_tail(&port_info->list, &ioc->sas_topology);
1331 	} else {
1332 		port_info->handle = hba->handle;
1333 		for (i = 0; i < hba->num_phys; i++)
1334 			port_info->phy_info[i].negotiated_link_rate =
1335 				hba->phy_info[i].negotiated_link_rate;
1336 		if (hba->phy_info)
1337 			kfree(hba->phy_info);
1338 		kfree(hba);
1339 		hba = NULL;
1340 	}
1341 	mutex_unlock(&ioc->sas_topology_mutex);
1342 	ioc->num_ports = port_info->num_phys;
1343 
1344 	for (i = 0; i < port_info->num_phys; i++) {
1345 		mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
1346 			(MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
1347 			 MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
1348 
1349 		mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
1350 			(MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE <<
1351 			 MPI_SAS_DEVICE_PGAD_FORM_SHIFT), handle);
1352 		port_info->phy_info[i].identify.phy_id =
1353 		    port_info->phy_info[i].phy_id;
1354 		handle = port_info->phy_info[i].identify.handle;
1355 
1356 		if (port_info->phy_info[i].attached.handle) {
1357 			mptsas_sas_device_pg0(ioc,
1358 				&port_info->phy_info[i].attached,
1359 				(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
1360 				 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
1361 				port_info->phy_info[i].attached.handle);
1362 		}
1363 
1364 		mptsas_probe_one_phy(&ioc->sh->shost_gendev,
1365 		    &port_info->phy_info[i], ioc->sas_index, 1);
1366 		ioc->sas_index++;
1367 	}
1368 
1369 	return 0;
1370 
1371  out_free_port_info:
1372 	if (hba)
1373 		kfree(hba);
1374  out:
1375 	return error;
1376 }
1377 
1378 static int
1379 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
1380 {
1381 	struct mptsas_portinfo *port_info, *p, *ex;
1382 	int error = -ENOMEM, i, j;
1383 
1384 	ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
1385 	if (!ex)
1386 		goto out;
1387 
1388 	error = mptsas_sas_expander_pg0(ioc, ex,
1389 		(MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
1390 		 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
1391 	if (error)
1392 		goto out_free_port_info;
1393 
1394 	*handle = ex->handle;
1395 
1396 	mutex_lock(&ioc->sas_topology_mutex);
1397 	port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
1398 	if (!port_info) {
1399 		port_info = ex;
1400 		list_add_tail(&port_info->list, &ioc->sas_topology);
1401 	} else {
1402 		port_info->handle = ex->handle;
1403 		if (ex->phy_info)
1404 			kfree(ex->phy_info);
1405 		kfree(ex);
1406 		ex = NULL;
1407 	}
1408 	mutex_unlock(&ioc->sas_topology_mutex);
1409 
1410 	for (i = 0; i < port_info->num_phys; i++) {
1411 		struct device *parent;
1412 
1413 		mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
1414 			(MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
1415 			 MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
1416 
1417 		if (port_info->phy_info[i].identify.handle) {
1418 			mptsas_sas_device_pg0(ioc,
1419 				&port_info->phy_info[i].identify,
1420 				(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
1421 				 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
1422 				port_info->phy_info[i].identify.handle);
1423 			port_info->phy_info[i].identify.phy_id =
1424 			    port_info->phy_info[i].phy_id;
1425 		}
1426 
1427 		if (port_info->phy_info[i].attached.handle) {
1428 			mptsas_sas_device_pg0(ioc,
1429 				&port_info->phy_info[i].attached,
1430 				(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
1431 				 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
1432 				port_info->phy_info[i].attached.handle);
1433 			port_info->phy_info[i].attached.phy_id =
1434 			    port_info->phy_info[i].phy_id;
1435 		}
1436 
1437 		/*
1438 		 * If we find a parent port handle this expander is
1439 		 * attached to another expander, else it hangs of the
1440 		 * HBA phys.
1441 		 */
1442 		parent = &ioc->sh->shost_gendev;
1443 		mutex_lock(&ioc->sas_topology_mutex);
1444 		list_for_each_entry(p, &ioc->sas_topology, list) {
1445 			for (j = 0; j < p->num_phys; j++) {
1446 				if (port_info->phy_info[i].identify.handle ==
1447 						p->phy_info[j].attached.handle)
1448 					parent = &p->phy_info[j].rphy->dev;
1449 			}
1450 		}
1451 		mutex_unlock(&ioc->sas_topology_mutex);
1452 
1453 		mptsas_probe_one_phy(parent, &port_info->phy_info[i],
1454 		    ioc->sas_index, 0);
1455 		ioc->sas_index++;
1456 	}
1457 
1458 	return 0;
1459 
1460  out_free_port_info:
1461 	if (ex) {
1462 		if (ex->phy_info)
1463 			kfree(ex->phy_info);
1464 		kfree(ex);
1465 	}
1466  out:
1467 	return error;
1468 }
1469 
1470 /*
1471  * mptsas_delete_expander_phys
1472  *
1473  *
1474  * This will traverse topology, and remove expanders
1475  * that are no longer present
1476  */
1477 static void
1478 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
1479 {
1480 	struct mptsas_portinfo buffer;
1481 	struct mptsas_portinfo *port_info, *n, *parent;
1482 	int i;
1483 
1484 	mutex_lock(&ioc->sas_topology_mutex);
1485 	list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
1486 
1487 		if (port_info->phy_info &&
1488 		    (!(port_info->phy_info[0].identify.device_info &
1489 		    MPI_SAS_DEVICE_INFO_SMP_TARGET)))
1490 			continue;
1491 
1492 		if (mptsas_sas_expander_pg0(ioc, &buffer,
1493 		     (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
1494 		     MPI_SAS_EXPAND_PGAD_FORM_SHIFT), port_info->handle)) {
1495 
1496 			/*
1497 			 * Obtain the port_info instance to the parent port
1498 			 */
1499 			parent = mptsas_find_portinfo_by_handle(ioc,
1500 			    port_info->phy_info[0].identify.handle_parent);
1501 
1502 			if (!parent)
1503 				goto next_port;
1504 
1505 			/*
1506 			 * Delete rphys in the parent that point
1507 			 * to this expander.  The transport layer will
1508 			 * cleanup all the children.
1509 			 */
1510 			for (i = 0; i < parent->num_phys; i++) {
1511 				if ((!parent->phy_info[i].rphy) ||
1512 				    (parent->phy_info[i].attached.sas_address !=
1513 				   port_info->phy_info[i].identify.sas_address))
1514 					continue;
1515 				sas_rphy_delete(parent->phy_info[i].rphy);
1516 				memset(&parent->phy_info[i].attached, 0,
1517 				    sizeof(struct mptsas_devinfo));
1518 				parent->phy_info[i].rphy = NULL;
1519 				parent->phy_info[i].starget = NULL;
1520 			}
1521  next_port:
1522 			list_del(&port_info->list);
1523 			if (port_info->phy_info)
1524 				kfree(port_info->phy_info);
1525 			kfree(port_info);
1526 		}
1527 		/*
1528 		* Free this memory allocated from inside
1529 		* mptsas_sas_expander_pg0
1530 		*/
1531 		if (buffer.phy_info)
1532 			kfree(buffer.phy_info);
1533 	}
1534 	mutex_unlock(&ioc->sas_topology_mutex);
1535 }
1536 
1537 /*
1538  * Start of day discovery
1539  */
1540 static void
1541 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
1542 {
1543 	u32 handle = 0xFFFF;
1544 	int i;
1545 
1546 	mutex_lock(&ioc->sas_discovery_mutex);
1547 	mptsas_probe_hba_phys(ioc);
1548 	while (!mptsas_probe_expander_phys(ioc, &handle))
1549 		;
1550 	/*
1551 	  Reporting RAID volumes.
1552 	*/
1553 	if (!ioc->raid_data.pIocPg2)
1554 		goto out;
1555 	if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
1556 		goto out;
1557 	for (i=0; i<ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
1558 		scsi_add_device(ioc->sh, ioc->num_ports,
1559 		    ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
1560 	}
1561  out:
1562 	mutex_unlock(&ioc->sas_discovery_mutex);
1563 }
1564 
1565 /*
1566  * Work queue thread to handle Runtime discovery
1567  * Mere purpose is the hot add/delete of expanders
1568  */
1569 static void
1570 mptscsih_discovery_work(void * arg)
1571 {
1572 	struct mptsas_discovery_event *ev = arg;
1573 	MPT_ADAPTER *ioc = ev->ioc;
1574 	u32 handle = 0xFFFF;
1575 
1576 	mutex_lock(&ioc->sas_discovery_mutex);
1577 	ioc->sas_discovery_runtime=1;
1578 	mptsas_delete_expander_phys(ioc);
1579 	mptsas_probe_hba_phys(ioc);
1580 	while (!mptsas_probe_expander_phys(ioc, &handle))
1581 		;
1582 	kfree(ev);
1583 	ioc->sas_discovery_runtime=0;
1584 	mutex_unlock(&ioc->sas_discovery_mutex);
1585 }
1586 
1587 static struct mptsas_phyinfo *
1588 mptsas_find_phyinfo_by_parent(MPT_ADAPTER *ioc, u16 parent_handle, u8 phy_id)
1589 {
1590 	struct mptsas_portinfo *port_info;
1591 	struct mptsas_devinfo device_info;
1592 	struct mptsas_phyinfo *phy_info = NULL;
1593 	int i, error;
1594 
1595 	/*
1596 	 * Retrieve the parent sas_address
1597 	 */
1598 	error = mptsas_sas_device_pg0(ioc, &device_info,
1599 		(MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
1600 		 MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
1601 		parent_handle);
1602 	if (error)
1603 		return NULL;
1604 
1605 	/*
1606 	 * The phy_info structures are never deallocated during lifetime of
1607 	 * a host, so the code below is safe without additional refcounting.
1608 	 */
1609 	mutex_lock(&ioc->sas_topology_mutex);
1610 	list_for_each_entry(port_info, &ioc->sas_topology, list) {
1611 		for (i = 0; i < port_info->num_phys; i++) {
1612 			if (port_info->phy_info[i].identify.sas_address ==
1613 			    device_info.sas_address &&
1614 			    port_info->phy_info[i].phy_id == phy_id) {
1615 				phy_info = &port_info->phy_info[i];
1616 				break;
1617 			}
1618 		}
1619 	}
1620 	mutex_unlock(&ioc->sas_topology_mutex);
1621 
1622 	return phy_info;
1623 }
1624 
1625 static struct mptsas_phyinfo *
1626 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u32 id)
1627 {
1628 	struct mptsas_portinfo *port_info;
1629 	struct mptsas_phyinfo *phy_info = NULL;
1630 	int i;
1631 
1632 	/*
1633 	 * The phy_info structures are never deallocated during lifetime of
1634 	 * a host, so the code below is safe without additional refcounting.
1635 	 */
1636 	mutex_lock(&ioc->sas_topology_mutex);
1637 	list_for_each_entry(port_info, &ioc->sas_topology, list) {
1638 		for (i = 0; i < port_info->num_phys; i++)
1639 			if (mptsas_is_end_device(&port_info->phy_info[i].attached))
1640 				if (port_info->phy_info[i].attached.id == id) {
1641 					phy_info = &port_info->phy_info[i];
1642 					break;
1643 				}
1644 	}
1645 	mutex_unlock(&ioc->sas_topology_mutex);
1646 
1647 	return phy_info;
1648 }
1649 
1650 /*
1651  * Work queue thread to clear the persitency table
1652  */
1653 static void
1654 mptscsih_sas_persist_clear_table(void * arg)
1655 {
1656 	MPT_ADAPTER *ioc = (MPT_ADAPTER *)arg;
1657 
1658 	mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
1659 }
1660 
1661 static void
1662 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
1663 {
1664 	sdev->no_uld_attach = data ? 1 : 0;
1665 	scsi_device_reprobe(sdev);
1666 }
1667 
1668 static void
1669 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
1670 {
1671 	starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
1672 			mptsas_reprobe_lun);
1673 }
1674 
1675 
1676 /*
1677  * Work queue thread to handle SAS hotplug events
1678  */
1679 static void
1680 mptsas_hotplug_work(void *arg)
1681 {
1682 	struct mptsas_hotplug_event *ev = arg;
1683 	MPT_ADAPTER *ioc = ev->ioc;
1684 	struct mptsas_phyinfo *phy_info;
1685 	struct sas_rphy *rphy;
1686 	struct scsi_device *sdev;
1687 	struct sas_identify identify;
1688 	char *ds = NULL;
1689 	struct mptsas_devinfo sas_device;
1690 	VirtTarget *vtarget;
1691 
1692 	mutex_lock(&ioc->sas_discovery_mutex);
1693 
1694 	switch (ev->event_type) {
1695 	case MPTSAS_DEL_DEVICE:
1696 
1697 		phy_info = mptsas_find_phyinfo_by_target(ioc, ev->id);
1698 
1699 		/*
1700 		 * Sanity checks, for non-existing phys and remote rphys.
1701 		 */
1702 		if (!phy_info)
1703 			break;
1704 		if (!phy_info->rphy)
1705 			break;
1706 		if (phy_info->starget) {
1707 			vtarget = phy_info->starget->hostdata;
1708 
1709 			if (!vtarget)
1710 				break;
1711 			/*
1712 			 * Handling  RAID components
1713 			 */
1714 			if (ev->phys_disk_num_valid) {
1715 				vtarget->target_id = ev->phys_disk_num;
1716 				vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
1717 				mptsas_reprobe_target(vtarget->starget, 1);
1718 				break;
1719 			}
1720 		}
1721 
1722 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1723 			ds = "ssp";
1724 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_STP_TARGET)
1725 			ds = "stp";
1726 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1727 			ds = "sata";
1728 
1729 		printk(MYIOC_s_INFO_FMT
1730 		       "removing %s device, channel %d, id %d, phy %d\n",
1731 		       ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
1732 
1733 		sas_rphy_delete(phy_info->rphy);
1734 		memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
1735 		phy_info->rphy = NULL;
1736 		phy_info->starget = NULL;
1737 		break;
1738 	case MPTSAS_ADD_DEVICE:
1739 
1740 		/*
1741 		 * Refresh sas device pg0 data
1742 		 */
1743 		if (mptsas_sas_device_pg0(ioc, &sas_device,
1744 		    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
1745 		     MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ev->id))
1746 			break;
1747 
1748 		phy_info = mptsas_find_phyinfo_by_parent(ioc,
1749 				sas_device.handle_parent, sas_device.phy_id);
1750 
1751 		if (!phy_info) {
1752 			u32 handle = 0xFFFF;
1753 
1754 			/*
1755 			* Its possible when an expander has been hot added
1756 			* containing attached devices, the sas firmware
1757 			* may send a RC_ADDED event prior to the
1758 			* DISCOVERY STOP event. If that occurs, our
1759 			* view of the topology in the driver in respect to this
1760 			* expander might of not been setup, and we hit this
1761 			* condition.
1762 			* Therefore, this code kicks off discovery to
1763 			* refresh the data.
1764 			* Then again, we check whether the parent phy has
1765 			* been created.
1766 			*/
1767 			ioc->sas_discovery_runtime=1;
1768 			mptsas_delete_expander_phys(ioc);
1769 			mptsas_probe_hba_phys(ioc);
1770 			while (!mptsas_probe_expander_phys(ioc, &handle))
1771 				;
1772 			ioc->sas_discovery_runtime=0;
1773 
1774 			phy_info = mptsas_find_phyinfo_by_parent(ioc,
1775 				sas_device.handle_parent, sas_device.phy_id);
1776 			if (!phy_info)
1777 				break;
1778 		}
1779 
1780 		if (phy_info->starget) {
1781 			vtarget = phy_info->starget->hostdata;
1782 
1783 			if (!vtarget)
1784 				break;
1785 			/*
1786 			 * Handling  RAID components
1787 			 */
1788 			if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
1789 				vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT;
1790 				vtarget->target_id = ev->id;
1791 				mptsas_reprobe_target(phy_info->starget, 0);
1792 			}
1793 			break;
1794 		}
1795 
1796 		if (phy_info->rphy)
1797 			break;
1798 
1799 		memcpy(&phy_info->attached, &sas_device,
1800 		    sizeof(struct mptsas_devinfo));
1801 
1802 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1803 			ds = "ssp";
1804 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_STP_TARGET)
1805 			ds = "stp";
1806 		if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1807 			ds = "sata";
1808 
1809 		printk(MYIOC_s_INFO_FMT
1810 		       "attaching %s device, channel %d, id %d, phy %d\n",
1811 		       ioc->name, ds, ev->channel, ev->id, ev->phy_id);
1812 
1813 		mptsas_parse_device_info(&identify, &phy_info->attached);
1814 		switch (identify.device_type) {
1815 		case SAS_END_DEVICE:
1816 			rphy = sas_end_device_alloc(phy_info->phy);
1817 			break;
1818 		case SAS_EDGE_EXPANDER_DEVICE:
1819 		case SAS_FANOUT_EXPANDER_DEVICE:
1820 			rphy = sas_expander_alloc(phy_info->phy, identify.device_type);
1821 			break;
1822 		default:
1823 			rphy = NULL;
1824 			break;
1825 		}
1826 		if (!rphy)
1827 			break; /* non-fatal: an rphy can be added later */
1828 
1829 		rphy->identify = identify;
1830 		if (sas_rphy_add(rphy)) {
1831 			sas_rphy_free(rphy);
1832 			break;
1833 		}
1834 
1835 		phy_info->rphy = rphy;
1836 		break;
1837 	case MPTSAS_ADD_RAID:
1838 		sdev = scsi_device_lookup(
1839 			ioc->sh,
1840 			ioc->num_ports,
1841 			ev->id,
1842 			0);
1843 		if (sdev) {
1844 			scsi_device_put(sdev);
1845 			break;
1846 		}
1847 		printk(MYIOC_s_INFO_FMT
1848 		       "attaching raid volume, channel %d, id %d\n",
1849 		       ioc->name, ioc->num_ports, ev->id);
1850 		scsi_add_device(ioc->sh,
1851 			ioc->num_ports,
1852 			ev->id,
1853 			0);
1854 		mpt_findImVolumes(ioc);
1855 		break;
1856 	case MPTSAS_DEL_RAID:
1857 		sdev = scsi_device_lookup(
1858 			ioc->sh,
1859 			ioc->num_ports,
1860 			ev->id,
1861 			0);
1862 		if (!sdev)
1863 			break;
1864 		printk(MYIOC_s_INFO_FMT
1865 		       "removing raid volume, channel %d, id %d\n",
1866 		       ioc->name, ioc->num_ports, ev->id);
1867 		scsi_remove_device(sdev);
1868 		scsi_device_put(sdev);
1869 		mpt_findImVolumes(ioc);
1870 		break;
1871 	}
1872 
1873 	kfree(ev);
1874 	mutex_unlock(&ioc->sas_discovery_mutex);
1875 }
1876 
1877 static void
1878 mptscsih_send_sas_event(MPT_ADAPTER *ioc,
1879 		EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
1880 {
1881 	struct mptsas_hotplug_event *ev;
1882 	u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
1883 	__le64 sas_address;
1884 
1885 	if ((device_info &
1886 	     (MPI_SAS_DEVICE_INFO_SSP_TARGET |
1887 	      MPI_SAS_DEVICE_INFO_STP_TARGET |
1888 	      MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
1889 		return;
1890 
1891 	switch (sas_event_data->ReasonCode) {
1892 	case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
1893 	case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
1894 		ev = kmalloc(sizeof(*ev), GFP_ATOMIC);
1895 		if (!ev) {
1896 			printk(KERN_WARNING "mptsas: lost hotplug event\n");
1897 			break;
1898 		}
1899 
1900 		INIT_WORK(&ev->work, mptsas_hotplug_work, ev);
1901 		ev->ioc = ioc;
1902 		ev->handle = le16_to_cpu(sas_event_data->DevHandle);
1903 		ev->parent_handle =
1904 		    le16_to_cpu(sas_event_data->ParentDevHandle);
1905 		ev->channel = sas_event_data->Bus;
1906 		ev->id = sas_event_data->TargetID;
1907 		ev->phy_id = sas_event_data->PhyNum;
1908 		memcpy(&sas_address, &sas_event_data->SASAddress,
1909 		    sizeof(__le64));
1910 		ev->sas_address = le64_to_cpu(sas_address);
1911 		ev->device_info = device_info;
1912 
1913 		if (sas_event_data->ReasonCode &
1914 		    MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
1915 			ev->event_type = MPTSAS_ADD_DEVICE;
1916 		else
1917 			ev->event_type = MPTSAS_DEL_DEVICE;
1918 		schedule_work(&ev->work);
1919 		break;
1920 	case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
1921 	/*
1922 	 * Persistent table is full.
1923 	 */
1924 		INIT_WORK(&ioc->mptscsih_persistTask,
1925 		    mptscsih_sas_persist_clear_table,
1926 		    (void *)ioc);
1927 		schedule_work(&ioc->mptscsih_persistTask);
1928 		break;
1929 	case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
1930 	/* TODO */
1931 	case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
1932 	/* TODO */
1933 	default:
1934 		break;
1935 	}
1936 }
1937 
1938 static void
1939 mptscsih_send_raid_event(MPT_ADAPTER *ioc,
1940 		EVENT_DATA_RAID *raid_event_data)
1941 {
1942 	struct mptsas_hotplug_event *ev;
1943 	RAID_VOL0_STATUS * volumeStatus;
1944 
1945 	if (ioc->bus_type != SAS)
1946 		return;
1947 
1948 	ev = kmalloc(sizeof(*ev), GFP_ATOMIC);
1949 	if (!ev) {
1950 		printk(KERN_WARNING "mptsas: lost hotplug event\n");
1951 		return;
1952 	}
1953 
1954 	memset(ev,0,sizeof(struct mptsas_hotplug_event));
1955 	INIT_WORK(&ev->work, mptsas_hotplug_work, ev);
1956 	ev->ioc = ioc;
1957 	ev->id = raid_event_data->VolumeID;
1958 
1959 	switch (raid_event_data->ReasonCode) {
1960 	case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
1961 		ev->event_type = MPTSAS_ADD_DEVICE;
1962 		break;
1963 	case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
1964 		ioc->raid_data.isRaid = 1;
1965 		ev->phys_disk_num_valid = 1;
1966 		ev->phys_disk_num = raid_event_data->PhysDiskNum;
1967 		ev->event_type = MPTSAS_DEL_DEVICE;
1968 		break;
1969 	case MPI_EVENT_RAID_RC_VOLUME_DELETED:
1970 		ev->event_type = MPTSAS_DEL_RAID;
1971 		break;
1972 	case MPI_EVENT_RAID_RC_VOLUME_CREATED:
1973 		ev->event_type = MPTSAS_ADD_RAID;
1974 		break;
1975 	case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
1976 		volumeStatus = (RAID_VOL0_STATUS *) &
1977 		    raid_event_data->SettingsStatus;
1978 		ev->event_type = (volumeStatus->State ==
1979 		    MPI_RAIDVOL0_STATUS_STATE_FAILED) ?
1980 		    MPTSAS_DEL_RAID : MPTSAS_ADD_RAID;
1981 		break;
1982 	default:
1983 		break;
1984 	}
1985 	schedule_work(&ev->work);
1986 }
1987 
1988 static void
1989 mptscsih_send_discovery(MPT_ADAPTER *ioc,
1990 	EVENT_DATA_SAS_DISCOVERY *discovery_data)
1991 {
1992 	struct mptsas_discovery_event *ev;
1993 
1994 	/*
1995 	 * DiscoveryStatus
1996 	 *
1997 	 * This flag will be non-zero when firmware
1998 	 * kicks off discovery, and return to zero
1999 	 * once its completed.
2000 	 */
2001 	if (discovery_data->DiscoveryStatus)
2002 		return;
2003 
2004 	ev = kmalloc(sizeof(*ev), GFP_ATOMIC);
2005 	if (!ev)
2006 		return;
2007 	memset(ev,0,sizeof(struct mptsas_discovery_event));
2008 	INIT_WORK(&ev->work, mptscsih_discovery_work, ev);
2009 	ev->ioc = ioc;
2010 	schedule_work(&ev->work);
2011 };
2012 
2013 
2014 static int
2015 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
2016 {
2017 	int rc=1;
2018 	u8 event = le32_to_cpu(reply->Event) & 0xFF;
2019 
2020 	if (!ioc->sh)
2021 		goto out;
2022 
2023 	/*
2024 	 * sas_discovery_ignore_events
2025 	 *
2026 	 * This flag is to prevent anymore processing of
2027 	 * sas events once mptsas_remove function is called.
2028 	 */
2029 	if (ioc->sas_discovery_ignore_events) {
2030 		rc = mptscsih_event_process(ioc, reply);
2031 		goto out;
2032 	}
2033 
2034 	switch (event) {
2035 	case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
2036 		mptscsih_send_sas_event(ioc,
2037 			(EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
2038 		break;
2039 	case MPI_EVENT_INTEGRATED_RAID:
2040 		mptscsih_send_raid_event(ioc,
2041 			(EVENT_DATA_RAID *)reply->Data);
2042 		break;
2043 	case MPI_EVENT_PERSISTENT_TABLE_FULL:
2044 		INIT_WORK(&ioc->mptscsih_persistTask,
2045 		    mptscsih_sas_persist_clear_table,
2046 		    (void *)ioc);
2047 		schedule_work(&ioc->mptscsih_persistTask);
2048 		break;
2049 	 case MPI_EVENT_SAS_DISCOVERY:
2050 		mptscsih_send_discovery(ioc,
2051 			(EVENT_DATA_SAS_DISCOVERY *)reply->Data);
2052 		break;
2053 	default:
2054 		rc = mptscsih_event_process(ioc, reply);
2055 		break;
2056 	}
2057  out:
2058 
2059 	return rc;
2060 }
2061 
2062 static int
2063 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2064 {
2065 	struct Scsi_Host	*sh;
2066 	MPT_SCSI_HOST		*hd;
2067 	MPT_ADAPTER 		*ioc;
2068 	unsigned long		 flags;
2069 	int			 ii;
2070 	int			 numSGE = 0;
2071 	int			 scale;
2072 	int			 ioc_cap;
2073 	int			error=0;
2074 	int			r;
2075 
2076 	r = mpt_attach(pdev,id);
2077 	if (r)
2078 		return r;
2079 
2080 	ioc = pci_get_drvdata(pdev);
2081 	ioc->DoneCtx = mptsasDoneCtx;
2082 	ioc->TaskCtx = mptsasTaskCtx;
2083 	ioc->InternalCtx = mptsasInternalCtx;
2084 
2085 	/*  Added sanity check on readiness of the MPT adapter.
2086 	 */
2087 	if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
2088 		printk(MYIOC_s_WARN_FMT
2089 		  "Skipping because it's not operational!\n",
2090 		  ioc->name);
2091 		error = -ENODEV;
2092 		goto out_mptsas_probe;
2093 	}
2094 
2095 	if (!ioc->active) {
2096 		printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
2097 		  ioc->name);
2098 		error = -ENODEV;
2099 		goto out_mptsas_probe;
2100 	}
2101 
2102 	/*  Sanity check - ensure at least 1 port is INITIATOR capable
2103 	 */
2104 	ioc_cap = 0;
2105 	for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
2106 		if (ioc->pfacts[ii].ProtocolFlags &
2107 				MPI_PORTFACTS_PROTOCOL_INITIATOR)
2108 			ioc_cap++;
2109 	}
2110 
2111 	if (!ioc_cap) {
2112 		printk(MYIOC_s_WARN_FMT
2113 			"Skipping ioc=%p because SCSI Initiator mode "
2114 			"is NOT enabled!\n", ioc->name, ioc);
2115 		return 0;
2116 	}
2117 
2118 	sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
2119 	if (!sh) {
2120 		printk(MYIOC_s_WARN_FMT
2121 			"Unable to register controller with SCSI subsystem\n",
2122 			ioc->name);
2123 		error = -1;
2124 		goto out_mptsas_probe;
2125         }
2126 
2127 	spin_lock_irqsave(&ioc->FreeQlock, flags);
2128 
2129 	/* Attach the SCSI Host to the IOC structure
2130 	 */
2131 	ioc->sh = sh;
2132 
2133 	sh->io_port = 0;
2134 	sh->n_io_port = 0;
2135 	sh->irq = 0;
2136 
2137 	/* set 16 byte cdb's */
2138 	sh->max_cmd_len = 16;
2139 
2140 	sh->max_id = ioc->pfacts->MaxDevices + 1;
2141 
2142 	sh->transportt = mptsas_transport_template;
2143 
2144 	sh->max_lun = MPT_LAST_LUN + 1;
2145 	sh->max_channel = 0;
2146 	sh->this_id = ioc->pfacts[0].PortSCSIID;
2147 
2148 	/* Required entry.
2149 	 */
2150 	sh->unique_id = ioc->id;
2151 
2152 	INIT_LIST_HEAD(&ioc->sas_topology);
2153 	mutex_init(&ioc->sas_topology_mutex);
2154 	mutex_init(&ioc->sas_discovery_mutex);
2155 	mutex_init(&ioc->sas_mgmt.mutex);
2156 	init_completion(&ioc->sas_mgmt.done);
2157 
2158 	/* Verify that we won't exceed the maximum
2159 	 * number of chain buffers
2160 	 * We can optimize:  ZZ = req_sz/sizeof(SGE)
2161 	 * For 32bit SGE's:
2162 	 *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
2163 	 *               + (req_sz - 64)/sizeof(SGE)
2164 	 * A slightly different algorithm is required for
2165 	 * 64bit SGEs.
2166 	 */
2167 	scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
2168 	if (sizeof(dma_addr_t) == sizeof(u64)) {
2169 		numSGE = (scale - 1) *
2170 		  (ioc->facts.MaxChainDepth-1) + scale +
2171 		  (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
2172 		  sizeof(u32));
2173 	} else {
2174 		numSGE = 1 + (scale - 1) *
2175 		  (ioc->facts.MaxChainDepth-1) + scale +
2176 		  (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
2177 		  sizeof(u32));
2178 	}
2179 
2180 	if (numSGE < sh->sg_tablesize) {
2181 		/* Reset this value */
2182 		dprintk((MYIOC_s_INFO_FMT
2183 		  "Resetting sg_tablesize to %d from %d\n",
2184 		  ioc->name, numSGE, sh->sg_tablesize));
2185 		sh->sg_tablesize = numSGE;
2186 	}
2187 
2188 	spin_unlock_irqrestore(&ioc->FreeQlock, flags);
2189 
2190 	hd = (MPT_SCSI_HOST *) sh->hostdata;
2191 	hd->ioc = ioc;
2192 
2193 	/* SCSI needs scsi_cmnd lookup table!
2194 	 * (with size equal to req_depth*PtrSz!)
2195 	 */
2196 	hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
2197 	if (!hd->ScsiLookup) {
2198 		error = -ENOMEM;
2199 		goto out_mptsas_probe;
2200 	}
2201 
2202 	dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
2203 		 ioc->name, hd->ScsiLookup));
2204 
2205 	/* Allocate memory for the device structures.
2206 	 * A non-Null pointer at an offset
2207 	 * indicates a device exists.
2208 	 * max_id = 1 + maximum id (hosts.h)
2209 	 */
2210 	hd->Targets = kcalloc(sh->max_id, sizeof(void *), GFP_ATOMIC);
2211 	if (!hd->Targets) {
2212 		error = -ENOMEM;
2213 		goto out_mptsas_probe;
2214 	}
2215 
2216 	dprintk((KERN_INFO "  vtarget @ %p\n", hd->Targets));
2217 
2218 	/* Clear the TM flags
2219 	 */
2220 	hd->tmPending = 0;
2221 	hd->tmState = TM_STATE_NONE;
2222 	hd->resetPending = 0;
2223 	hd->abortSCpnt = NULL;
2224 
2225 	/* Clear the pointer used to store
2226 	 * single-threaded commands, i.e., those
2227 	 * issued during a bus scan, dv and
2228 	 * configuration pages.
2229 	 */
2230 	hd->cmdPtr = NULL;
2231 
2232 	/* Initialize this SCSI Hosts' timers
2233 	 * To use, set the timer expires field
2234 	 * and add_timer
2235 	 */
2236 	init_timer(&hd->timer);
2237 	hd->timer.data = (unsigned long) hd;
2238 	hd->timer.function = mptscsih_timer_expired;
2239 
2240 	hd->mpt_pq_filter = mpt_pq_filter;
2241 	ioc->sas_data.ptClear = mpt_pt_clear;
2242 
2243 	if (ioc->sas_data.ptClear==1) {
2244 		mptbase_sas_persist_operation(
2245 		    ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
2246 	}
2247 
2248 	ddvprintk((MYIOC_s_INFO_FMT
2249 		"mpt_pq_filter %x mpt_pq_filter %x\n",
2250 		ioc->name,
2251 		mpt_pq_filter,
2252 		mpt_pq_filter));
2253 
2254 	init_waitqueue_head(&hd->scandv_waitq);
2255 	hd->scandv_wait_done = 0;
2256 	hd->last_queue_full = 0;
2257 
2258 	error = scsi_add_host(sh, &ioc->pcidev->dev);
2259 	if (error) {
2260 		dprintk((KERN_ERR MYNAM
2261 		  "scsi_add_host failed\n"));
2262 		goto out_mptsas_probe;
2263 	}
2264 
2265 	mptsas_scan_sas_topology(ioc);
2266 
2267 	return 0;
2268 
2269 out_mptsas_probe:
2270 
2271 	mptscsih_remove(pdev);
2272 	return error;
2273 }
2274 
2275 static void __devexit mptsas_remove(struct pci_dev *pdev)
2276 {
2277 	MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
2278 	struct mptsas_portinfo *p, *n;
2279 
2280 	ioc->sas_discovery_ignore_events=1;
2281 	sas_remove_host(ioc->sh);
2282 
2283 	mutex_lock(&ioc->sas_topology_mutex);
2284 	list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
2285 		list_del(&p->list);
2286 		if (p->phy_info)
2287 			kfree(p->phy_info);
2288 		kfree(p);
2289 	}
2290 	mutex_unlock(&ioc->sas_topology_mutex);
2291 
2292 	mptscsih_remove(pdev);
2293 }
2294 
2295 static struct pci_device_id mptsas_pci_table[] = {
2296 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064,
2297 		PCI_ANY_ID, PCI_ANY_ID },
2298 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1066,
2299 		PCI_ANY_ID, PCI_ANY_ID },
2300 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1068,
2301 		PCI_ANY_ID, PCI_ANY_ID },
2302 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064E,
2303 		PCI_ANY_ID, PCI_ANY_ID },
2304 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1066E,
2305 		PCI_ANY_ID, PCI_ANY_ID },
2306 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1068E,
2307 		PCI_ANY_ID, PCI_ANY_ID },
2308 	{0}	/* Terminating entry */
2309 };
2310 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
2311 
2312 
2313 static struct pci_driver mptsas_driver = {
2314 	.name		= "mptsas",
2315 	.id_table	= mptsas_pci_table,
2316 	.probe		= mptsas_probe,
2317 	.remove		= __devexit_p(mptsas_remove),
2318 	.shutdown	= mptscsih_shutdown,
2319 #ifdef CONFIG_PM
2320 	.suspend	= mptscsih_suspend,
2321 	.resume		= mptscsih_resume,
2322 #endif
2323 };
2324 
2325 static int __init
2326 mptsas_init(void)
2327 {
2328 	show_mptmod_ver(my_NAME, my_VERSION);
2329 
2330 	mptsas_transport_template =
2331 	    sas_attach_transport(&mptsas_transport_functions);
2332 	if (!mptsas_transport_template)
2333 		return -ENODEV;
2334 
2335 	mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
2336 	mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER);
2337 	mptsasInternalCtx =
2338 		mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
2339 	mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
2340 
2341 	if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) {
2342 		devtverboseprintk((KERN_INFO MYNAM
2343 		  ": Registered for IOC event notifications\n"));
2344 	}
2345 
2346 	if (mpt_reset_register(mptsasDoneCtx, mptscsih_ioc_reset) == 0) {
2347 		dprintk((KERN_INFO MYNAM
2348 		  ": Registered for IOC reset notifications\n"));
2349 	}
2350 
2351 	return pci_register_driver(&mptsas_driver);
2352 }
2353 
2354 static void __exit
2355 mptsas_exit(void)
2356 {
2357 	pci_unregister_driver(&mptsas_driver);
2358 	sas_release_transport(mptsas_transport_template);
2359 
2360 	mpt_reset_deregister(mptsasDoneCtx);
2361 	mpt_event_deregister(mptsasDoneCtx);
2362 
2363 	mpt_deregister(mptsasMgmtCtx);
2364 	mpt_deregister(mptsasInternalCtx);
2365 	mpt_deregister(mptsasTaskCtx);
2366 	mpt_deregister(mptsasDoneCtx);
2367 }
2368 
2369 module_init(mptsas_init);
2370 module_exit(mptsas_exit);
2371