1 /*
2  * Scsi Host Layer for MPT (Message Passing Technology) based controllers
3  *
4  * This code is based on drivers/scsi/mpt3sas/mpt3sas_scsih.c
5  * Copyright (C) 2012-2014  LSI Corporation
6  * Copyright (C) 2013-2014 Avago Technologies
7  *  (mailto: MPT-FusionLinux.pdl@avagotech.com)
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * NO WARRANTY
20  * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
21  * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
22  * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
23  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
24  * solely responsible for determining the appropriateness of using and
25  * distributing the Program and assumes all risks associated with its
26  * exercise of rights under this Agreement, including but not limited to
27  * the risks and costs of program errors, damage to or loss of data,
28  * programs or equipment, and unavailability or interruption of operations.
29 
30  * DISCLAIMER OF LIABILITY
31  * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
32  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
34  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
35  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
36  * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
37  * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
38 
39  * You should have received a copy of the GNU General Public License
40  * along with this program; if not, write to the Free Software
41  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
42  * USA.
43  */
44 
45 #include <linux/module.h>
46 #include <linux/kernel.h>
47 #include <linux/init.h>
48 #include <linux/errno.h>
49 #include <linux/blkdev.h>
50 #include <linux/sched.h>
51 #include <linux/workqueue.h>
52 #include <linux/delay.h>
53 #include <linux/pci.h>
54 #include <linux/interrupt.h>
55 #include <linux/raid_class.h>
56 #include <linux/blk-mq-pci.h>
57 #include <asm/unaligned.h>
58 
59 #include "mpt3sas_base.h"
60 
61 #define RAID_CHANNEL 1
62 
63 #define PCIE_CHANNEL 2
64 
65 /* forward proto's */
66 static void _scsih_expander_node_remove(struct MPT3SAS_ADAPTER *ioc,
67 	struct _sas_node *sas_expander);
68 static void _firmware_event_work(struct work_struct *work);
69 
70 static void _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
71 	struct _sas_device *sas_device);
72 static int _scsih_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle,
73 	u8 retry_count, u8 is_pd);
74 static int _scsih_pcie_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle);
75 static void _scsih_pcie_device_remove_from_sml(struct MPT3SAS_ADAPTER *ioc,
76 	struct _pcie_device *pcie_device);
77 static void
78 _scsih_pcie_check_device(struct MPT3SAS_ADAPTER *ioc, u16 handle);
79 static u8 _scsih_check_for_pending_tm(struct MPT3SAS_ADAPTER *ioc, u16 smid);
80 static void _scsih_complete_devices_scanning(struct MPT3SAS_ADAPTER *ioc);
81 
82 /* global parameters */
83 LIST_HEAD(mpt3sas_ioc_list);
84 /* global ioc lock for list operations */
85 DEFINE_SPINLOCK(gioc_lock);
86 
87 MODULE_AUTHOR(MPT3SAS_AUTHOR);
88 MODULE_DESCRIPTION(MPT3SAS_DESCRIPTION);
89 MODULE_LICENSE("GPL");
90 MODULE_VERSION(MPT3SAS_DRIVER_VERSION);
91 MODULE_ALIAS("mpt2sas");
92 
93 /* local parameters */
94 static u8 scsi_io_cb_idx = -1;
95 static u8 tm_cb_idx = -1;
96 static u8 ctl_cb_idx = -1;
97 static u8 base_cb_idx = -1;
98 static u8 port_enable_cb_idx = -1;
99 static u8 transport_cb_idx = -1;
100 static u8 scsih_cb_idx = -1;
101 static u8 config_cb_idx = -1;
102 static int mpt2_ids;
103 static int mpt3_ids;
104 
105 static u8 tm_tr_cb_idx = -1 ;
106 static u8 tm_tr_volume_cb_idx = -1 ;
107 static u8 tm_sas_control_cb_idx = -1;
108 
109 /* command line options */
110 static u32 logging_level;
111 MODULE_PARM_DESC(logging_level,
112 	" bits for enabling additional logging info (default=0)");
113 
114 
115 static ushort max_sectors = 0xFFFF;
116 module_param(max_sectors, ushort, 0444);
117 MODULE_PARM_DESC(max_sectors, "max sectors, range 64 to 32767  default=32767");
118 
119 
120 static int missing_delay[2] = {-1, -1};
121 module_param_array(missing_delay, int, NULL, 0444);
122 MODULE_PARM_DESC(missing_delay, " device missing delay , io missing delay");
123 
124 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
125 #define MPT3SAS_MAX_LUN (16895)
126 static u64 max_lun = MPT3SAS_MAX_LUN;
127 module_param(max_lun, ullong, 0444);
128 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
129 
130 static ushort hbas_to_enumerate;
131 module_param(hbas_to_enumerate, ushort, 0444);
132 MODULE_PARM_DESC(hbas_to_enumerate,
133 		" 0 - enumerates both SAS 2.0 & SAS 3.0 generation HBAs\n \
134 		  1 - enumerates only SAS 2.0 generation HBAs\n \
135 		  2 - enumerates only SAS 3.0 generation HBAs (default=0)");
136 
137 /* diag_buffer_enable is bitwise
138  * bit 0 set = TRACE
139  * bit 1 set = SNAPSHOT
140  * bit 2 set = EXTENDED
141  *
142  * Either bit can be set, or both
143  */
144 static int diag_buffer_enable = -1;
145 module_param(diag_buffer_enable, int, 0444);
146 MODULE_PARM_DESC(diag_buffer_enable,
147 	" post diag buffers (TRACE=1/SNAPSHOT=2/EXTENDED=4/default=0)");
148 static int disable_discovery = -1;
149 module_param(disable_discovery, int, 0444);
150 MODULE_PARM_DESC(disable_discovery, " disable discovery ");
151 
152 
153 /* permit overriding the host protection capabilities mask (EEDP/T10 PI) */
154 static int prot_mask = -1;
155 module_param(prot_mask, int, 0444);
156 MODULE_PARM_DESC(prot_mask, " host protection capabilities mask, def=7 ");
157 
158 static bool enable_sdev_max_qd;
159 module_param(enable_sdev_max_qd, bool, 0444);
160 MODULE_PARM_DESC(enable_sdev_max_qd,
161 	"Enable sdev max qd as can_queue, def=disabled(0)");
162 
163 static int multipath_on_hba = -1;
164 module_param(multipath_on_hba, int, 0);
165 MODULE_PARM_DESC(multipath_on_hba,
166 	"Multipath support to add same target device\n\t\t"
167 	"as many times as it is visible to HBA from various paths\n\t\t"
168 	"(by default:\n\t\t"
169 	"\t SAS 2.0 & SAS 3.0 HBA - This will be disabled,\n\t\t"
170 	"\t SAS 3.5 HBA - This will be enabled)");
171 
172 static int host_tagset_enable = 1;
173 module_param(host_tagset_enable, int, 0444);
174 MODULE_PARM_DESC(host_tagset_enable,
175 	"Shared host tagset enable/disable Default: enable(1)");
176 
177 /* raid transport support */
178 static struct raid_template *mpt3sas_raid_template;
179 static struct raid_template *mpt2sas_raid_template;
180 
181 
182 /**
183  * struct sense_info - common structure for obtaining sense keys
184  * @skey: sense key
185  * @asc: additional sense code
186  * @ascq: additional sense code qualifier
187  */
188 struct sense_info {
189 	u8 skey;
190 	u8 asc;
191 	u8 ascq;
192 };
193 
194 #define MPT3SAS_PROCESS_TRIGGER_DIAG (0xFFFB)
195 #define MPT3SAS_TURN_ON_PFA_LED (0xFFFC)
196 #define MPT3SAS_PORT_ENABLE_COMPLETE (0xFFFD)
197 #define MPT3SAS_ABRT_TASK_SET (0xFFFE)
198 #define MPT3SAS_REMOVE_UNRESPONDING_DEVICES (0xFFFF)
199 /**
200  * struct fw_event_work - firmware event struct
201  * @list: link list framework
202  * @work: work object (ioc->fault_reset_work_q)
203  * @ioc: per adapter object
204  * @device_handle: device handle
205  * @VF_ID: virtual function id
206  * @VP_ID: virtual port id
207  * @ignore: flag meaning this event has been marked to ignore
208  * @event: firmware event MPI2_EVENT_XXX defined in mpi2_ioc.h
209  * @refcount: kref for this event
210  * @event_data: reply event data payload follows
211  *
212  * This object stored on ioc->fw_event_list.
213  */
214 struct fw_event_work {
215 	struct list_head	list;
216 	struct work_struct	work;
217 
218 	struct MPT3SAS_ADAPTER *ioc;
219 	u16			device_handle;
220 	u8			VF_ID;
221 	u8			VP_ID;
222 	u8			ignore;
223 	u16			event;
224 	struct kref		refcount;
225 	char			event_data[] __aligned(4);
226 };
227 
228 static void fw_event_work_free(struct kref *r)
229 {
230 	kfree(container_of(r, struct fw_event_work, refcount));
231 }
232 
233 static void fw_event_work_get(struct fw_event_work *fw_work)
234 {
235 	kref_get(&fw_work->refcount);
236 }
237 
238 static void fw_event_work_put(struct fw_event_work *fw_work)
239 {
240 	kref_put(&fw_work->refcount, fw_event_work_free);
241 }
242 
243 static struct fw_event_work *alloc_fw_event_work(int len)
244 {
245 	struct fw_event_work *fw_event;
246 
247 	fw_event = kzalloc(sizeof(*fw_event) + len, GFP_ATOMIC);
248 	if (!fw_event)
249 		return NULL;
250 
251 	kref_init(&fw_event->refcount);
252 	return fw_event;
253 }
254 
255 /**
256  * struct _scsi_io_transfer - scsi io transfer
257  * @handle: sas device handle (assigned by firmware)
258  * @is_raid: flag set for hidden raid components
259  * @dir: DMA_TO_DEVICE, DMA_FROM_DEVICE,
260  * @data_length: data transfer length
261  * @data_dma: dma pointer to data
262  * @sense: sense data
263  * @lun: lun number
264  * @cdb_length: cdb length
265  * @cdb: cdb contents
266  * @timeout: timeout for this command
267  * @VF_ID: virtual function id
268  * @VP_ID: virtual port id
269  * @valid_reply: flag set for reply message
270  * @sense_length: sense length
271  * @ioc_status: ioc status
272  * @scsi_state: scsi state
273  * @scsi_status: scsi staus
274  * @log_info: log information
275  * @transfer_length: data length transfer when there is a reply message
276  *
277  * Used for sending internal scsi commands to devices within this module.
278  * Refer to _scsi_send_scsi_io().
279  */
280 struct _scsi_io_transfer {
281 	u16	handle;
282 	u8	is_raid;
283 	enum dma_data_direction dir;
284 	u32	data_length;
285 	dma_addr_t data_dma;
286 	u8	sense[SCSI_SENSE_BUFFERSIZE];
287 	u32	lun;
288 	u8	cdb_length;
289 	u8	cdb[32];
290 	u8	timeout;
291 	u8	VF_ID;
292 	u8	VP_ID;
293 	u8	valid_reply;
294   /* the following bits are only valid when 'valid_reply = 1' */
295 	u32	sense_length;
296 	u16	ioc_status;
297 	u8	scsi_state;
298 	u8	scsi_status;
299 	u32	log_info;
300 	u32	transfer_length;
301 };
302 
303 /**
304  * _scsih_set_debug_level - global setting of ioc->logging_level.
305  * @val: ?
306  * @kp: ?
307  *
308  * Note: The logging levels are defined in mpt3sas_debug.h.
309  */
310 static int
311 _scsih_set_debug_level(const char *val, const struct kernel_param *kp)
312 {
313 	int ret = param_set_int(val, kp);
314 	struct MPT3SAS_ADAPTER *ioc;
315 
316 	if (ret)
317 		return ret;
318 
319 	pr_info("setting logging_level(0x%08x)\n", logging_level);
320 	spin_lock(&gioc_lock);
321 	list_for_each_entry(ioc, &mpt3sas_ioc_list, list)
322 		ioc->logging_level = logging_level;
323 	spin_unlock(&gioc_lock);
324 	return 0;
325 }
326 module_param_call(logging_level, _scsih_set_debug_level, param_get_int,
327 	&logging_level, 0644);
328 
329 /**
330  * _scsih_srch_boot_sas_address - search based on sas_address
331  * @sas_address: sas address
332  * @boot_device: boot device object from bios page 2
333  *
334  * Return: 1 when there's a match, 0 means no match.
335  */
336 static inline int
337 _scsih_srch_boot_sas_address(u64 sas_address,
338 	Mpi2BootDeviceSasWwid_t *boot_device)
339 {
340 	return (sas_address == le64_to_cpu(boot_device->SASAddress)) ?  1 : 0;
341 }
342 
343 /**
344  * _scsih_srch_boot_device_name - search based on device name
345  * @device_name: device name specified in INDENTIFY fram
346  * @boot_device: boot device object from bios page 2
347  *
348  * Return: 1 when there's a match, 0 means no match.
349  */
350 static inline int
351 _scsih_srch_boot_device_name(u64 device_name,
352 	Mpi2BootDeviceDeviceName_t *boot_device)
353 {
354 	return (device_name == le64_to_cpu(boot_device->DeviceName)) ? 1 : 0;
355 }
356 
357 /**
358  * _scsih_srch_boot_encl_slot - search based on enclosure_logical_id/slot
359  * @enclosure_logical_id: enclosure logical id
360  * @slot_number: slot number
361  * @boot_device: boot device object from bios page 2
362  *
363  * Return: 1 when there's a match, 0 means no match.
364  */
365 static inline int
366 _scsih_srch_boot_encl_slot(u64 enclosure_logical_id, u16 slot_number,
367 	Mpi2BootDeviceEnclosureSlot_t *boot_device)
368 {
369 	return (enclosure_logical_id == le64_to_cpu(boot_device->
370 	    EnclosureLogicalID) && slot_number == le16_to_cpu(boot_device->
371 	    SlotNumber)) ? 1 : 0;
372 }
373 
374 /**
375  * mpt3sas_get_port_by_id - get hba port entry corresponding to provided
376  *			  port number from port list
377  * @ioc: per adapter object
378  * @port_id: port number
379  * @bypass_dirty_port_flag: when set look the matching hba port entry even
380  *			if hba port entry is marked as dirty.
381  *
382  * Search for hba port entry corresponding to provided port number,
383  * if available return port object otherwise return NULL.
384  */
385 struct hba_port *
386 mpt3sas_get_port_by_id(struct MPT3SAS_ADAPTER *ioc,
387 	u8 port_id, u8 bypass_dirty_port_flag)
388 {
389 	struct hba_port *port, *port_next;
390 
391 	/*
392 	 * When multipath_on_hba is disabled then
393 	 * search the hba_port entry using default
394 	 * port id i.e. 255
395 	 */
396 	if (!ioc->multipath_on_hba)
397 		port_id = MULTIPATH_DISABLED_PORT_ID;
398 
399 	list_for_each_entry_safe(port, port_next,
400 	    &ioc->port_table_list, list) {
401 		if (port->port_id != port_id)
402 			continue;
403 		if (bypass_dirty_port_flag)
404 			return port;
405 		if (port->flags & HBA_PORT_FLAG_DIRTY_PORT)
406 			continue;
407 		return port;
408 	}
409 
410 	/*
411 	 * Allocate hba_port object for default port id (i.e. 255)
412 	 * when multipath_on_hba is disabled for the HBA.
413 	 * And add this object to port_table_list.
414 	 */
415 	if (!ioc->multipath_on_hba) {
416 		port = kzalloc(sizeof(struct hba_port), GFP_ATOMIC);
417 		if (!port)
418 			return NULL;
419 
420 		port->port_id = port_id;
421 		ioc_info(ioc,
422 		   "hba_port entry: %p, port: %d is added to hba_port list\n",
423 		   port, port->port_id);
424 		list_add_tail(&port->list,
425 		    &ioc->port_table_list);
426 		return port;
427 	}
428 	return NULL;
429 }
430 
431 /**
432  * mpt3sas_get_vphy_by_phy - get virtual_phy object corresponding to phy number
433  * @ioc: per adapter object
434  * @port: hba_port object
435  * @phy: phy number
436  *
437  * Return virtual_phy object corresponding to phy number.
438  */
439 struct virtual_phy *
440 mpt3sas_get_vphy_by_phy(struct MPT3SAS_ADAPTER *ioc,
441 	struct hba_port *port, u32 phy)
442 {
443 	struct virtual_phy *vphy, *vphy_next;
444 
445 	if (!port->vphys_mask)
446 		return NULL;
447 
448 	list_for_each_entry_safe(vphy, vphy_next, &port->vphys_list, list) {
449 		if (vphy->phy_mask & (1 << phy))
450 			return vphy;
451 	}
452 	return NULL;
453 }
454 
455 /**
456  * _scsih_is_boot_device - search for matching boot device.
457  * @sas_address: sas address
458  * @device_name: device name specified in INDENTIFY fram
459  * @enclosure_logical_id: enclosure logical id
460  * @slot: slot number
461  * @form: specifies boot device form
462  * @boot_device: boot device object from bios page 2
463  *
464  * Return: 1 when there's a match, 0 means no match.
465  */
466 static int
467 _scsih_is_boot_device(u64 sas_address, u64 device_name,
468 	u64 enclosure_logical_id, u16 slot, u8 form,
469 	Mpi2BiosPage2BootDevice_t *boot_device)
470 {
471 	int rc = 0;
472 
473 	switch (form) {
474 	case MPI2_BIOSPAGE2_FORM_SAS_WWID:
475 		if (!sas_address)
476 			break;
477 		rc = _scsih_srch_boot_sas_address(
478 		    sas_address, &boot_device->SasWwid);
479 		break;
480 	case MPI2_BIOSPAGE2_FORM_ENCLOSURE_SLOT:
481 		if (!enclosure_logical_id)
482 			break;
483 		rc = _scsih_srch_boot_encl_slot(
484 		    enclosure_logical_id,
485 		    slot, &boot_device->EnclosureSlot);
486 		break;
487 	case MPI2_BIOSPAGE2_FORM_DEVICE_NAME:
488 		if (!device_name)
489 			break;
490 		rc = _scsih_srch_boot_device_name(
491 		    device_name, &boot_device->DeviceName);
492 		break;
493 	case MPI2_BIOSPAGE2_FORM_NO_DEVICE_SPECIFIED:
494 		break;
495 	}
496 
497 	return rc;
498 }
499 
500 /**
501  * _scsih_get_sas_address - set the sas_address for given device handle
502  * @ioc: ?
503  * @handle: device handle
504  * @sas_address: sas address
505  *
506  * Return: 0 success, non-zero when failure
507  */
508 static int
509 _scsih_get_sas_address(struct MPT3SAS_ADAPTER *ioc, u16 handle,
510 	u64 *sas_address)
511 {
512 	Mpi2SasDevicePage0_t sas_device_pg0;
513 	Mpi2ConfigReply_t mpi_reply;
514 	u32 ioc_status;
515 
516 	*sas_address = 0;
517 
518 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
519 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
520 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
521 			__FILE__, __LINE__, __func__);
522 		return -ENXIO;
523 	}
524 
525 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
526 	if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
527 		/* For HBA, vSES doesn't return HBA SAS address. Instead return
528 		 * vSES's sas address.
529 		 */
530 		if ((handle <= ioc->sas_hba.num_phys) &&
531 		   (!(le32_to_cpu(sas_device_pg0.DeviceInfo) &
532 		   MPI2_SAS_DEVICE_INFO_SEP)))
533 			*sas_address = ioc->sas_hba.sas_address;
534 		else
535 			*sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
536 		return 0;
537 	}
538 
539 	/* we hit this because the given parent handle doesn't exist */
540 	if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
541 		return -ENXIO;
542 
543 	/* else error case */
544 	ioc_err(ioc, "handle(0x%04x), ioc_status(0x%04x), failure at %s:%d/%s()!\n",
545 		handle, ioc_status, __FILE__, __LINE__, __func__);
546 	return -EIO;
547 }
548 
549 /**
550  * _scsih_determine_boot_device - determine boot device.
551  * @ioc: per adapter object
552  * @device: sas_device or pcie_device object
553  * @channel: SAS or PCIe channel
554  *
555  * Determines whether this device should be first reported device to
556  * to scsi-ml or sas transport, this purpose is for persistent boot device.
557  * There are primary, alternate, and current entries in bios page 2. The order
558  * priority is primary, alternate, then current.  This routine saves
559  * the corresponding device object.
560  * The saved data to be used later in _scsih_probe_boot_devices().
561  */
562 static void
563 _scsih_determine_boot_device(struct MPT3SAS_ADAPTER *ioc, void *device,
564 	u32 channel)
565 {
566 	struct _sas_device *sas_device;
567 	struct _pcie_device *pcie_device;
568 	struct _raid_device *raid_device;
569 	u64 sas_address;
570 	u64 device_name;
571 	u64 enclosure_logical_id;
572 	u16 slot;
573 
574 	 /* only process this function when driver loads */
575 	if (!ioc->is_driver_loading)
576 		return;
577 
578 	 /* no Bios, return immediately */
579 	if (!ioc->bios_pg3.BiosVersion)
580 		return;
581 
582 	if (channel == RAID_CHANNEL) {
583 		raid_device = device;
584 		sas_address = raid_device->wwid;
585 		device_name = 0;
586 		enclosure_logical_id = 0;
587 		slot = 0;
588 	} else if (channel == PCIE_CHANNEL) {
589 		pcie_device = device;
590 		sas_address = pcie_device->wwid;
591 		device_name = 0;
592 		enclosure_logical_id = 0;
593 		slot = 0;
594 	} else {
595 		sas_device = device;
596 		sas_address = sas_device->sas_address;
597 		device_name = sas_device->device_name;
598 		enclosure_logical_id = sas_device->enclosure_logical_id;
599 		slot = sas_device->slot;
600 	}
601 
602 	if (!ioc->req_boot_device.device) {
603 		if (_scsih_is_boot_device(sas_address, device_name,
604 		    enclosure_logical_id, slot,
605 		    (ioc->bios_pg2.ReqBootDeviceForm &
606 		    MPI2_BIOSPAGE2_FORM_MASK),
607 		    &ioc->bios_pg2.RequestedBootDevice)) {
608 			dinitprintk(ioc,
609 				    ioc_info(ioc, "%s: req_boot_device(0x%016llx)\n",
610 					     __func__, (u64)sas_address));
611 			ioc->req_boot_device.device = device;
612 			ioc->req_boot_device.channel = channel;
613 		}
614 	}
615 
616 	if (!ioc->req_alt_boot_device.device) {
617 		if (_scsih_is_boot_device(sas_address, device_name,
618 		    enclosure_logical_id, slot,
619 		    (ioc->bios_pg2.ReqAltBootDeviceForm &
620 		    MPI2_BIOSPAGE2_FORM_MASK),
621 		    &ioc->bios_pg2.RequestedAltBootDevice)) {
622 			dinitprintk(ioc,
623 				    ioc_info(ioc, "%s: req_alt_boot_device(0x%016llx)\n",
624 					     __func__, (u64)sas_address));
625 			ioc->req_alt_boot_device.device = device;
626 			ioc->req_alt_boot_device.channel = channel;
627 		}
628 	}
629 
630 	if (!ioc->current_boot_device.device) {
631 		if (_scsih_is_boot_device(sas_address, device_name,
632 		    enclosure_logical_id, slot,
633 		    (ioc->bios_pg2.CurrentBootDeviceForm &
634 		    MPI2_BIOSPAGE2_FORM_MASK),
635 		    &ioc->bios_pg2.CurrentBootDevice)) {
636 			dinitprintk(ioc,
637 				    ioc_info(ioc, "%s: current_boot_device(0x%016llx)\n",
638 					     __func__, (u64)sas_address));
639 			ioc->current_boot_device.device = device;
640 			ioc->current_boot_device.channel = channel;
641 		}
642 	}
643 }
644 
645 static struct _sas_device *
646 __mpt3sas_get_sdev_from_target(struct MPT3SAS_ADAPTER *ioc,
647 		struct MPT3SAS_TARGET *tgt_priv)
648 {
649 	struct _sas_device *ret;
650 
651 	assert_spin_locked(&ioc->sas_device_lock);
652 
653 	ret = tgt_priv->sas_dev;
654 	if (ret)
655 		sas_device_get(ret);
656 
657 	return ret;
658 }
659 
660 static struct _sas_device *
661 mpt3sas_get_sdev_from_target(struct MPT3SAS_ADAPTER *ioc,
662 		struct MPT3SAS_TARGET *tgt_priv)
663 {
664 	struct _sas_device *ret;
665 	unsigned long flags;
666 
667 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
668 	ret = __mpt3sas_get_sdev_from_target(ioc, tgt_priv);
669 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
670 
671 	return ret;
672 }
673 
674 static struct _pcie_device *
675 __mpt3sas_get_pdev_from_target(struct MPT3SAS_ADAPTER *ioc,
676 	struct MPT3SAS_TARGET *tgt_priv)
677 {
678 	struct _pcie_device *ret;
679 
680 	assert_spin_locked(&ioc->pcie_device_lock);
681 
682 	ret = tgt_priv->pcie_dev;
683 	if (ret)
684 		pcie_device_get(ret);
685 
686 	return ret;
687 }
688 
689 /**
690  * mpt3sas_get_pdev_from_target - pcie device search
691  * @ioc: per adapter object
692  * @tgt_priv: starget private object
693  *
694  * Context: This function will acquire ioc->pcie_device_lock and will release
695  * before returning the pcie_device object.
696  *
697  * This searches for pcie_device from target, then return pcie_device object.
698  */
699 static struct _pcie_device *
700 mpt3sas_get_pdev_from_target(struct MPT3SAS_ADAPTER *ioc,
701 	struct MPT3SAS_TARGET *tgt_priv)
702 {
703 	struct _pcie_device *ret;
704 	unsigned long flags;
705 
706 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
707 	ret = __mpt3sas_get_pdev_from_target(ioc, tgt_priv);
708 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
709 
710 	return ret;
711 }
712 
713 
714 /**
715  * __mpt3sas_get_sdev_by_rphy - sas device search
716  * @ioc: per adapter object
717  * @rphy: sas_rphy pointer
718  *
719  * Context: This function will acquire ioc->sas_device_lock and will release
720  * before returning the sas_device object.
721  *
722  * This searches for sas_device from rphy object
723  * then return sas_device object.
724  */
725 struct _sas_device *
726 __mpt3sas_get_sdev_by_rphy(struct MPT3SAS_ADAPTER *ioc,
727 	struct sas_rphy *rphy)
728 {
729 	struct _sas_device *sas_device;
730 
731 	assert_spin_locked(&ioc->sas_device_lock);
732 
733 	list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
734 		if (sas_device->rphy != rphy)
735 			continue;
736 		sas_device_get(sas_device);
737 		return sas_device;
738 	}
739 
740 	sas_device = NULL;
741 	list_for_each_entry(sas_device, &ioc->sas_device_init_list, list) {
742 		if (sas_device->rphy != rphy)
743 			continue;
744 		sas_device_get(sas_device);
745 		return sas_device;
746 	}
747 
748 	return NULL;
749 }
750 
751 /**
752  * __mpt3sas_get_sdev_by_addr - get _sas_device object corresponding to provided
753  *				sas address from sas_device_list list
754  * @ioc: per adapter object
755  * @sas_address: device sas address
756  * @port: port number
757  *
758  * Search for _sas_device object corresponding to provided sas address,
759  * if available return _sas_device object address otherwise return NULL.
760  */
761 struct _sas_device *
762 __mpt3sas_get_sdev_by_addr(struct MPT3SAS_ADAPTER *ioc,
763 	u64 sas_address, struct hba_port *port)
764 {
765 	struct _sas_device *sas_device;
766 
767 	if (!port)
768 		return NULL;
769 
770 	assert_spin_locked(&ioc->sas_device_lock);
771 
772 	list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
773 		if (sas_device->sas_address != sas_address)
774 			continue;
775 		if (sas_device->port != port)
776 			continue;
777 		sas_device_get(sas_device);
778 		return sas_device;
779 	}
780 
781 	list_for_each_entry(sas_device, &ioc->sas_device_init_list, list) {
782 		if (sas_device->sas_address != sas_address)
783 			continue;
784 		if (sas_device->port != port)
785 			continue;
786 		sas_device_get(sas_device);
787 		return sas_device;
788 	}
789 
790 	return NULL;
791 }
792 
793 /**
794  * mpt3sas_get_sdev_by_addr - sas device search
795  * @ioc: per adapter object
796  * @sas_address: sas address
797  * @port: hba port entry
798  * Context: Calling function should acquire ioc->sas_device_lock
799  *
800  * This searches for sas_device based on sas_address & port number,
801  * then return sas_device object.
802  */
803 struct _sas_device *
804 mpt3sas_get_sdev_by_addr(struct MPT3SAS_ADAPTER *ioc,
805 	u64 sas_address, struct hba_port *port)
806 {
807 	struct _sas_device *sas_device;
808 	unsigned long flags;
809 
810 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
811 	sas_device = __mpt3sas_get_sdev_by_addr(ioc,
812 	    sas_address, port);
813 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
814 
815 	return sas_device;
816 }
817 
818 static struct _sas_device *
819 __mpt3sas_get_sdev_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
820 {
821 	struct _sas_device *sas_device;
822 
823 	assert_spin_locked(&ioc->sas_device_lock);
824 
825 	list_for_each_entry(sas_device, &ioc->sas_device_list, list)
826 		if (sas_device->handle == handle)
827 			goto found_device;
828 
829 	list_for_each_entry(sas_device, &ioc->sas_device_init_list, list)
830 		if (sas_device->handle == handle)
831 			goto found_device;
832 
833 	return NULL;
834 
835 found_device:
836 	sas_device_get(sas_device);
837 	return sas_device;
838 }
839 
840 /**
841  * mpt3sas_get_sdev_by_handle - sas device search
842  * @ioc: per adapter object
843  * @handle: sas device handle (assigned by firmware)
844  * Context: Calling function should acquire ioc->sas_device_lock
845  *
846  * This searches for sas_device based on sas_address, then return sas_device
847  * object.
848  */
849 struct _sas_device *
850 mpt3sas_get_sdev_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
851 {
852 	struct _sas_device *sas_device;
853 	unsigned long flags;
854 
855 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
856 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
857 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
858 
859 	return sas_device;
860 }
861 
862 /**
863  * _scsih_display_enclosure_chassis_info - display device location info
864  * @ioc: per adapter object
865  * @sas_device: per sas device object
866  * @sdev: scsi device struct
867  * @starget: scsi target struct
868  */
869 static void
870 _scsih_display_enclosure_chassis_info(struct MPT3SAS_ADAPTER *ioc,
871 	struct _sas_device *sas_device, struct scsi_device *sdev,
872 	struct scsi_target *starget)
873 {
874 	if (sdev) {
875 		if (sas_device->enclosure_handle != 0)
876 			sdev_printk(KERN_INFO, sdev,
877 			    "enclosure logical id (0x%016llx), slot(%d) \n",
878 			    (unsigned long long)
879 			    sas_device->enclosure_logical_id,
880 			    sas_device->slot);
881 		if (sas_device->connector_name[0] != '\0')
882 			sdev_printk(KERN_INFO, sdev,
883 			    "enclosure level(0x%04x), connector name( %s)\n",
884 			    sas_device->enclosure_level,
885 			    sas_device->connector_name);
886 		if (sas_device->is_chassis_slot_valid)
887 			sdev_printk(KERN_INFO, sdev, "chassis slot(0x%04x)\n",
888 			    sas_device->chassis_slot);
889 	} else if (starget) {
890 		if (sas_device->enclosure_handle != 0)
891 			starget_printk(KERN_INFO, starget,
892 			    "enclosure logical id(0x%016llx), slot(%d) \n",
893 			    (unsigned long long)
894 			    sas_device->enclosure_logical_id,
895 			    sas_device->slot);
896 		if (sas_device->connector_name[0] != '\0')
897 			starget_printk(KERN_INFO, starget,
898 			    "enclosure level(0x%04x), connector name( %s)\n",
899 			    sas_device->enclosure_level,
900 			    sas_device->connector_name);
901 		if (sas_device->is_chassis_slot_valid)
902 			starget_printk(KERN_INFO, starget,
903 			    "chassis slot(0x%04x)\n",
904 			    sas_device->chassis_slot);
905 	} else {
906 		if (sas_device->enclosure_handle != 0)
907 			ioc_info(ioc, "enclosure logical id(0x%016llx), slot(%d)\n",
908 				 (u64)sas_device->enclosure_logical_id,
909 				 sas_device->slot);
910 		if (sas_device->connector_name[0] != '\0')
911 			ioc_info(ioc, "enclosure level(0x%04x), connector name( %s)\n",
912 				 sas_device->enclosure_level,
913 				 sas_device->connector_name);
914 		if (sas_device->is_chassis_slot_valid)
915 			ioc_info(ioc, "chassis slot(0x%04x)\n",
916 				 sas_device->chassis_slot);
917 	}
918 }
919 
920 /**
921  * _scsih_sas_device_remove - remove sas_device from list.
922  * @ioc: per adapter object
923  * @sas_device: the sas_device object
924  * Context: This function will acquire ioc->sas_device_lock.
925  *
926  * If sas_device is on the list, remove it and decrement its reference count.
927  */
928 static void
929 _scsih_sas_device_remove(struct MPT3SAS_ADAPTER *ioc,
930 	struct _sas_device *sas_device)
931 {
932 	unsigned long flags;
933 
934 	if (!sas_device)
935 		return;
936 	ioc_info(ioc, "removing handle(0x%04x), sas_addr(0x%016llx)\n",
937 		 sas_device->handle, (u64)sas_device->sas_address);
938 
939 	_scsih_display_enclosure_chassis_info(ioc, sas_device, NULL, NULL);
940 
941 	/*
942 	 * The lock serializes access to the list, but we still need to verify
943 	 * that nobody removed the entry while we were waiting on the lock.
944 	 */
945 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
946 	if (!list_empty(&sas_device->list)) {
947 		list_del_init(&sas_device->list);
948 		sas_device_put(sas_device);
949 	}
950 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
951 }
952 
953 /**
954  * _scsih_device_remove_by_handle - removing device object by handle
955  * @ioc: per adapter object
956  * @handle: device handle
957  */
958 static void
959 _scsih_device_remove_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
960 {
961 	struct _sas_device *sas_device;
962 	unsigned long flags;
963 
964 	if (ioc->shost_recovery)
965 		return;
966 
967 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
968 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
969 	if (sas_device) {
970 		list_del_init(&sas_device->list);
971 		sas_device_put(sas_device);
972 	}
973 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
974 	if (sas_device) {
975 		_scsih_remove_device(ioc, sas_device);
976 		sas_device_put(sas_device);
977 	}
978 }
979 
980 /**
981  * mpt3sas_device_remove_by_sas_address - removing device object by
982  *					sas address & port number
983  * @ioc: per adapter object
984  * @sas_address: device sas_address
985  * @port: hba port entry
986  *
987  * Return nothing.
988  */
989 void
990 mpt3sas_device_remove_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
991 	u64 sas_address, struct hba_port *port)
992 {
993 	struct _sas_device *sas_device;
994 	unsigned long flags;
995 
996 	if (ioc->shost_recovery)
997 		return;
998 
999 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
1000 	sas_device = __mpt3sas_get_sdev_by_addr(ioc, sas_address, port);
1001 	if (sas_device) {
1002 		list_del_init(&sas_device->list);
1003 		sas_device_put(sas_device);
1004 	}
1005 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1006 	if (sas_device) {
1007 		_scsih_remove_device(ioc, sas_device);
1008 		sas_device_put(sas_device);
1009 	}
1010 }
1011 
1012 /**
1013  * _scsih_sas_device_add - insert sas_device to the list.
1014  * @ioc: per adapter object
1015  * @sas_device: the sas_device object
1016  * Context: This function will acquire ioc->sas_device_lock.
1017  *
1018  * Adding new object to the ioc->sas_device_list.
1019  */
1020 static void
1021 _scsih_sas_device_add(struct MPT3SAS_ADAPTER *ioc,
1022 	struct _sas_device *sas_device)
1023 {
1024 	unsigned long flags;
1025 
1026 	dewtprintk(ioc,
1027 		   ioc_info(ioc, "%s: handle(0x%04x), sas_addr(0x%016llx)\n",
1028 			    __func__, sas_device->handle,
1029 			    (u64)sas_device->sas_address));
1030 
1031 	dewtprintk(ioc, _scsih_display_enclosure_chassis_info(ioc, sas_device,
1032 	    NULL, NULL));
1033 
1034 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
1035 	sas_device_get(sas_device);
1036 	list_add_tail(&sas_device->list, &ioc->sas_device_list);
1037 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1038 
1039 	if (ioc->hide_drives) {
1040 		clear_bit(sas_device->handle, ioc->pend_os_device_add);
1041 		return;
1042 	}
1043 
1044 	if (!mpt3sas_transport_port_add(ioc, sas_device->handle,
1045 	     sas_device->sas_address_parent, sas_device->port)) {
1046 		_scsih_sas_device_remove(ioc, sas_device);
1047 	} else if (!sas_device->starget) {
1048 		/*
1049 		 * When asyn scanning is enabled, its not possible to remove
1050 		 * devices while scanning is turned on due to an oops in
1051 		 * scsi_sysfs_add_sdev()->add_device()->sysfs_addrm_start()
1052 		 */
1053 		if (!ioc->is_driver_loading) {
1054 			mpt3sas_transport_port_remove(ioc,
1055 			    sas_device->sas_address,
1056 			    sas_device->sas_address_parent,
1057 			    sas_device->port);
1058 			_scsih_sas_device_remove(ioc, sas_device);
1059 		}
1060 	} else
1061 		clear_bit(sas_device->handle, ioc->pend_os_device_add);
1062 }
1063 
1064 /**
1065  * _scsih_sas_device_init_add - insert sas_device to the list.
1066  * @ioc: per adapter object
1067  * @sas_device: the sas_device object
1068  * Context: This function will acquire ioc->sas_device_lock.
1069  *
1070  * Adding new object at driver load time to the ioc->sas_device_init_list.
1071  */
1072 static void
1073 _scsih_sas_device_init_add(struct MPT3SAS_ADAPTER *ioc,
1074 	struct _sas_device *sas_device)
1075 {
1076 	unsigned long flags;
1077 
1078 	dewtprintk(ioc,
1079 		   ioc_info(ioc, "%s: handle(0x%04x), sas_addr(0x%016llx)\n",
1080 			    __func__, sas_device->handle,
1081 			    (u64)sas_device->sas_address));
1082 
1083 	dewtprintk(ioc, _scsih_display_enclosure_chassis_info(ioc, sas_device,
1084 	    NULL, NULL));
1085 
1086 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
1087 	sas_device_get(sas_device);
1088 	list_add_tail(&sas_device->list, &ioc->sas_device_init_list);
1089 	_scsih_determine_boot_device(ioc, sas_device, 0);
1090 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1091 }
1092 
1093 
1094 static struct _pcie_device *
1095 __mpt3sas_get_pdev_by_wwid(struct MPT3SAS_ADAPTER *ioc, u64 wwid)
1096 {
1097 	struct _pcie_device *pcie_device;
1098 
1099 	assert_spin_locked(&ioc->pcie_device_lock);
1100 
1101 	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list)
1102 		if (pcie_device->wwid == wwid)
1103 			goto found_device;
1104 
1105 	list_for_each_entry(pcie_device, &ioc->pcie_device_init_list, list)
1106 		if (pcie_device->wwid == wwid)
1107 			goto found_device;
1108 
1109 	return NULL;
1110 
1111 found_device:
1112 	pcie_device_get(pcie_device);
1113 	return pcie_device;
1114 }
1115 
1116 
1117 /**
1118  * mpt3sas_get_pdev_by_wwid - pcie device search
1119  * @ioc: per adapter object
1120  * @wwid: wwid
1121  *
1122  * Context: This function will acquire ioc->pcie_device_lock and will release
1123  * before returning the pcie_device object.
1124  *
1125  * This searches for pcie_device based on wwid, then return pcie_device object.
1126  */
1127 static struct _pcie_device *
1128 mpt3sas_get_pdev_by_wwid(struct MPT3SAS_ADAPTER *ioc, u64 wwid)
1129 {
1130 	struct _pcie_device *pcie_device;
1131 	unsigned long flags;
1132 
1133 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1134 	pcie_device = __mpt3sas_get_pdev_by_wwid(ioc, wwid);
1135 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1136 
1137 	return pcie_device;
1138 }
1139 
1140 
1141 static struct _pcie_device *
1142 __mpt3sas_get_pdev_by_idchannel(struct MPT3SAS_ADAPTER *ioc, int id,
1143 	int channel)
1144 {
1145 	struct _pcie_device *pcie_device;
1146 
1147 	assert_spin_locked(&ioc->pcie_device_lock);
1148 
1149 	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list)
1150 		if (pcie_device->id == id && pcie_device->channel == channel)
1151 			goto found_device;
1152 
1153 	list_for_each_entry(pcie_device, &ioc->pcie_device_init_list, list)
1154 		if (pcie_device->id == id && pcie_device->channel == channel)
1155 			goto found_device;
1156 
1157 	return NULL;
1158 
1159 found_device:
1160 	pcie_device_get(pcie_device);
1161 	return pcie_device;
1162 }
1163 
1164 static struct _pcie_device *
1165 __mpt3sas_get_pdev_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1166 {
1167 	struct _pcie_device *pcie_device;
1168 
1169 	assert_spin_locked(&ioc->pcie_device_lock);
1170 
1171 	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list)
1172 		if (pcie_device->handle == handle)
1173 			goto found_device;
1174 
1175 	list_for_each_entry(pcie_device, &ioc->pcie_device_init_list, list)
1176 		if (pcie_device->handle == handle)
1177 			goto found_device;
1178 
1179 	return NULL;
1180 
1181 found_device:
1182 	pcie_device_get(pcie_device);
1183 	return pcie_device;
1184 }
1185 
1186 
1187 /**
1188  * mpt3sas_get_pdev_by_handle - pcie device search
1189  * @ioc: per adapter object
1190  * @handle: Firmware device handle
1191  *
1192  * Context: This function will acquire ioc->pcie_device_lock and will release
1193  * before returning the pcie_device object.
1194  *
1195  * This searches for pcie_device based on handle, then return pcie_device
1196  * object.
1197  */
1198 struct _pcie_device *
1199 mpt3sas_get_pdev_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1200 {
1201 	struct _pcie_device *pcie_device;
1202 	unsigned long flags;
1203 
1204 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1205 	pcie_device = __mpt3sas_get_pdev_by_handle(ioc, handle);
1206 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1207 
1208 	return pcie_device;
1209 }
1210 
1211 /**
1212  * _scsih_set_nvme_max_shutdown_latency - Update max_shutdown_latency.
1213  * @ioc: per adapter object
1214  * Context: This function will acquire ioc->pcie_device_lock
1215  *
1216  * Update ioc->max_shutdown_latency to that NVMe drives RTD3 Entry Latency
1217  * which has reported maximum among all available NVMe drives.
1218  * Minimum max_shutdown_latency will be six seconds.
1219  */
1220 static void
1221 _scsih_set_nvme_max_shutdown_latency(struct MPT3SAS_ADAPTER *ioc)
1222 {
1223 	struct _pcie_device *pcie_device;
1224 	unsigned long flags;
1225 	u16 shutdown_latency = IO_UNIT_CONTROL_SHUTDOWN_TIMEOUT;
1226 
1227 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1228 	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list) {
1229 		if (pcie_device->shutdown_latency) {
1230 			if (shutdown_latency < pcie_device->shutdown_latency)
1231 				shutdown_latency =
1232 					pcie_device->shutdown_latency;
1233 		}
1234 	}
1235 	ioc->max_shutdown_latency = shutdown_latency;
1236 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1237 }
1238 
1239 /**
1240  * _scsih_pcie_device_remove - remove pcie_device from list.
1241  * @ioc: per adapter object
1242  * @pcie_device: the pcie_device object
1243  * Context: This function will acquire ioc->pcie_device_lock.
1244  *
1245  * If pcie_device is on the list, remove it and decrement its reference count.
1246  */
1247 static void
1248 _scsih_pcie_device_remove(struct MPT3SAS_ADAPTER *ioc,
1249 	struct _pcie_device *pcie_device)
1250 {
1251 	unsigned long flags;
1252 	int was_on_pcie_device_list = 0;
1253 	u8 update_latency = 0;
1254 
1255 	if (!pcie_device)
1256 		return;
1257 	ioc_info(ioc, "removing handle(0x%04x), wwid(0x%016llx)\n",
1258 		 pcie_device->handle, (u64)pcie_device->wwid);
1259 	if (pcie_device->enclosure_handle != 0)
1260 		ioc_info(ioc, "removing enclosure logical id(0x%016llx), slot(%d)\n",
1261 			 (u64)pcie_device->enclosure_logical_id,
1262 			 pcie_device->slot);
1263 	if (pcie_device->connector_name[0] != '\0')
1264 		ioc_info(ioc, "removing enclosure level(0x%04x), connector name( %s)\n",
1265 			 pcie_device->enclosure_level,
1266 			 pcie_device->connector_name);
1267 
1268 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1269 	if (!list_empty(&pcie_device->list)) {
1270 		list_del_init(&pcie_device->list);
1271 		was_on_pcie_device_list = 1;
1272 	}
1273 	if (pcie_device->shutdown_latency == ioc->max_shutdown_latency)
1274 		update_latency = 1;
1275 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1276 	if (was_on_pcie_device_list) {
1277 		kfree(pcie_device->serial_number);
1278 		pcie_device_put(pcie_device);
1279 	}
1280 
1281 	/*
1282 	 * This device's RTD3 Entry Latency matches IOC's
1283 	 * max_shutdown_latency. Recalculate IOC's max_shutdown_latency
1284 	 * from the available drives as current drive is getting removed.
1285 	 */
1286 	if (update_latency)
1287 		_scsih_set_nvme_max_shutdown_latency(ioc);
1288 }
1289 
1290 
1291 /**
1292  * _scsih_pcie_device_remove_by_handle - removing pcie device object by handle
1293  * @ioc: per adapter object
1294  * @handle: device handle
1295  */
1296 static void
1297 _scsih_pcie_device_remove_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1298 {
1299 	struct _pcie_device *pcie_device;
1300 	unsigned long flags;
1301 	int was_on_pcie_device_list = 0;
1302 	u8 update_latency = 0;
1303 
1304 	if (ioc->shost_recovery)
1305 		return;
1306 
1307 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1308 	pcie_device = __mpt3sas_get_pdev_by_handle(ioc, handle);
1309 	if (pcie_device) {
1310 		if (!list_empty(&pcie_device->list)) {
1311 			list_del_init(&pcie_device->list);
1312 			was_on_pcie_device_list = 1;
1313 			pcie_device_put(pcie_device);
1314 		}
1315 		if (pcie_device->shutdown_latency == ioc->max_shutdown_latency)
1316 			update_latency = 1;
1317 	}
1318 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1319 	if (was_on_pcie_device_list) {
1320 		_scsih_pcie_device_remove_from_sml(ioc, pcie_device);
1321 		pcie_device_put(pcie_device);
1322 	}
1323 
1324 	/*
1325 	 * This device's RTD3 Entry Latency matches IOC's
1326 	 * max_shutdown_latency. Recalculate IOC's max_shutdown_latency
1327 	 * from the available drives as current drive is getting removed.
1328 	 */
1329 	if (update_latency)
1330 		_scsih_set_nvme_max_shutdown_latency(ioc);
1331 }
1332 
1333 /**
1334  * _scsih_pcie_device_add - add pcie_device object
1335  * @ioc: per adapter object
1336  * @pcie_device: pcie_device object
1337  *
1338  * This is added to the pcie_device_list link list.
1339  */
1340 static void
1341 _scsih_pcie_device_add(struct MPT3SAS_ADAPTER *ioc,
1342 	struct _pcie_device *pcie_device)
1343 {
1344 	unsigned long flags;
1345 
1346 	dewtprintk(ioc,
1347 		   ioc_info(ioc, "%s: handle (0x%04x), wwid(0x%016llx)\n",
1348 			    __func__,
1349 			    pcie_device->handle, (u64)pcie_device->wwid));
1350 	if (pcie_device->enclosure_handle != 0)
1351 		dewtprintk(ioc,
1352 			   ioc_info(ioc, "%s: enclosure logical id(0x%016llx), slot( %d)\n",
1353 				    __func__,
1354 				    (u64)pcie_device->enclosure_logical_id,
1355 				    pcie_device->slot));
1356 	if (pcie_device->connector_name[0] != '\0')
1357 		dewtprintk(ioc,
1358 			   ioc_info(ioc, "%s: enclosure level(0x%04x), connector name( %s)\n",
1359 				    __func__, pcie_device->enclosure_level,
1360 				    pcie_device->connector_name));
1361 
1362 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1363 	pcie_device_get(pcie_device);
1364 	list_add_tail(&pcie_device->list, &ioc->pcie_device_list);
1365 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1366 
1367 	if (pcie_device->access_status ==
1368 	    MPI26_PCIEDEV0_ASTATUS_DEVICE_BLOCKED) {
1369 		clear_bit(pcie_device->handle, ioc->pend_os_device_add);
1370 		return;
1371 	}
1372 	if (scsi_add_device(ioc->shost, PCIE_CHANNEL, pcie_device->id, 0)) {
1373 		_scsih_pcie_device_remove(ioc, pcie_device);
1374 	} else if (!pcie_device->starget) {
1375 		if (!ioc->is_driver_loading) {
1376 /*TODO-- Need to find out whether this condition will occur or not*/
1377 			clear_bit(pcie_device->handle, ioc->pend_os_device_add);
1378 		}
1379 	} else
1380 		clear_bit(pcie_device->handle, ioc->pend_os_device_add);
1381 }
1382 
1383 /*
1384  * _scsih_pcie_device_init_add - insert pcie_device to the init list.
1385  * @ioc: per adapter object
1386  * @pcie_device: the pcie_device object
1387  * Context: This function will acquire ioc->pcie_device_lock.
1388  *
1389  * Adding new object at driver load time to the ioc->pcie_device_init_list.
1390  */
1391 static void
1392 _scsih_pcie_device_init_add(struct MPT3SAS_ADAPTER *ioc,
1393 				struct _pcie_device *pcie_device)
1394 {
1395 	unsigned long flags;
1396 
1397 	dewtprintk(ioc,
1398 		   ioc_info(ioc, "%s: handle (0x%04x), wwid(0x%016llx)\n",
1399 			    __func__,
1400 			    pcie_device->handle, (u64)pcie_device->wwid));
1401 	if (pcie_device->enclosure_handle != 0)
1402 		dewtprintk(ioc,
1403 			   ioc_info(ioc, "%s: enclosure logical id(0x%016llx), slot( %d)\n",
1404 				    __func__,
1405 				    (u64)pcie_device->enclosure_logical_id,
1406 				    pcie_device->slot));
1407 	if (pcie_device->connector_name[0] != '\0')
1408 		dewtprintk(ioc,
1409 			   ioc_info(ioc, "%s: enclosure level(0x%04x), connector name( %s)\n",
1410 				    __func__, pcie_device->enclosure_level,
1411 				    pcie_device->connector_name));
1412 
1413 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1414 	pcie_device_get(pcie_device);
1415 	list_add_tail(&pcie_device->list, &ioc->pcie_device_init_list);
1416 	if (pcie_device->access_status !=
1417 	    MPI26_PCIEDEV0_ASTATUS_DEVICE_BLOCKED)
1418 		_scsih_determine_boot_device(ioc, pcie_device, PCIE_CHANNEL);
1419 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1420 }
1421 /**
1422  * _scsih_raid_device_find_by_id - raid device search
1423  * @ioc: per adapter object
1424  * @id: sas device target id
1425  * @channel: sas device channel
1426  * Context: Calling function should acquire ioc->raid_device_lock
1427  *
1428  * This searches for raid_device based on target id, then return raid_device
1429  * object.
1430  */
1431 static struct _raid_device *
1432 _scsih_raid_device_find_by_id(struct MPT3SAS_ADAPTER *ioc, int id, int channel)
1433 {
1434 	struct _raid_device *raid_device, *r;
1435 
1436 	r = NULL;
1437 	list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
1438 		if (raid_device->id == id && raid_device->channel == channel) {
1439 			r = raid_device;
1440 			goto out;
1441 		}
1442 	}
1443 
1444  out:
1445 	return r;
1446 }
1447 
1448 /**
1449  * mpt3sas_raid_device_find_by_handle - raid device search
1450  * @ioc: per adapter object
1451  * @handle: sas device handle (assigned by firmware)
1452  * Context: Calling function should acquire ioc->raid_device_lock
1453  *
1454  * This searches for raid_device based on handle, then return raid_device
1455  * object.
1456  */
1457 struct _raid_device *
1458 mpt3sas_raid_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1459 {
1460 	struct _raid_device *raid_device, *r;
1461 
1462 	r = NULL;
1463 	list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
1464 		if (raid_device->handle != handle)
1465 			continue;
1466 		r = raid_device;
1467 		goto out;
1468 	}
1469 
1470  out:
1471 	return r;
1472 }
1473 
1474 /**
1475  * _scsih_raid_device_find_by_wwid - raid device search
1476  * @ioc: per adapter object
1477  * @wwid: ?
1478  * Context: Calling function should acquire ioc->raid_device_lock
1479  *
1480  * This searches for raid_device based on wwid, then return raid_device
1481  * object.
1482  */
1483 static struct _raid_device *
1484 _scsih_raid_device_find_by_wwid(struct MPT3SAS_ADAPTER *ioc, u64 wwid)
1485 {
1486 	struct _raid_device *raid_device, *r;
1487 
1488 	r = NULL;
1489 	list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
1490 		if (raid_device->wwid != wwid)
1491 			continue;
1492 		r = raid_device;
1493 		goto out;
1494 	}
1495 
1496  out:
1497 	return r;
1498 }
1499 
1500 /**
1501  * _scsih_raid_device_add - add raid_device object
1502  * @ioc: per adapter object
1503  * @raid_device: raid_device object
1504  *
1505  * This is added to the raid_device_list link list.
1506  */
1507 static void
1508 _scsih_raid_device_add(struct MPT3SAS_ADAPTER *ioc,
1509 	struct _raid_device *raid_device)
1510 {
1511 	unsigned long flags;
1512 
1513 	dewtprintk(ioc,
1514 		   ioc_info(ioc, "%s: handle(0x%04x), wwid(0x%016llx)\n",
1515 			    __func__,
1516 			    raid_device->handle, (u64)raid_device->wwid));
1517 
1518 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
1519 	list_add_tail(&raid_device->list, &ioc->raid_device_list);
1520 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1521 }
1522 
1523 /**
1524  * _scsih_raid_device_remove - delete raid_device object
1525  * @ioc: per adapter object
1526  * @raid_device: raid_device object
1527  *
1528  */
1529 static void
1530 _scsih_raid_device_remove(struct MPT3SAS_ADAPTER *ioc,
1531 	struct _raid_device *raid_device)
1532 {
1533 	unsigned long flags;
1534 
1535 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
1536 	list_del(&raid_device->list);
1537 	kfree(raid_device);
1538 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1539 }
1540 
1541 /**
1542  * mpt3sas_scsih_expander_find_by_handle - expander device search
1543  * @ioc: per adapter object
1544  * @handle: expander handle (assigned by firmware)
1545  * Context: Calling function should acquire ioc->sas_device_lock
1546  *
1547  * This searches for expander device based on handle, then returns the
1548  * sas_node object.
1549  */
1550 struct _sas_node *
1551 mpt3sas_scsih_expander_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1552 {
1553 	struct _sas_node *sas_expander, *r;
1554 
1555 	r = NULL;
1556 	list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
1557 		if (sas_expander->handle != handle)
1558 			continue;
1559 		r = sas_expander;
1560 		goto out;
1561 	}
1562  out:
1563 	return r;
1564 }
1565 
1566 /**
1567  * mpt3sas_scsih_enclosure_find_by_handle - exclosure device search
1568  * @ioc: per adapter object
1569  * @handle: enclosure handle (assigned by firmware)
1570  * Context: Calling function should acquire ioc->sas_device_lock
1571  *
1572  * This searches for enclosure device based on handle, then returns the
1573  * enclosure object.
1574  */
1575 static struct _enclosure_node *
1576 mpt3sas_scsih_enclosure_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1577 {
1578 	struct _enclosure_node *enclosure_dev, *r;
1579 
1580 	r = NULL;
1581 	list_for_each_entry(enclosure_dev, &ioc->enclosure_list, list) {
1582 		if (le16_to_cpu(enclosure_dev->pg0.EnclosureHandle) != handle)
1583 			continue;
1584 		r = enclosure_dev;
1585 		goto out;
1586 	}
1587 out:
1588 	return r;
1589 }
1590 /**
1591  * mpt3sas_scsih_expander_find_by_sas_address - expander device search
1592  * @ioc: per adapter object
1593  * @sas_address: sas address
1594  * @port: hba port entry
1595  * Context: Calling function should acquire ioc->sas_node_lock.
1596  *
1597  * This searches for expander device based on sas_address & port number,
1598  * then returns the sas_node object.
1599  */
1600 struct _sas_node *
1601 mpt3sas_scsih_expander_find_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
1602 	u64 sas_address, struct hba_port *port)
1603 {
1604 	struct _sas_node *sas_expander, *r = NULL;
1605 
1606 	if (!port)
1607 		return r;
1608 
1609 	list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
1610 		if (sas_expander->sas_address != sas_address)
1611 			continue;
1612 		if (sas_expander->port != port)
1613 			continue;
1614 		r = sas_expander;
1615 		goto out;
1616 	}
1617  out:
1618 	return r;
1619 }
1620 
1621 /**
1622  * _scsih_expander_node_add - insert expander device to the list.
1623  * @ioc: per adapter object
1624  * @sas_expander: the sas_device object
1625  * Context: This function will acquire ioc->sas_node_lock.
1626  *
1627  * Adding new object to the ioc->sas_expander_list.
1628  */
1629 static void
1630 _scsih_expander_node_add(struct MPT3SAS_ADAPTER *ioc,
1631 	struct _sas_node *sas_expander)
1632 {
1633 	unsigned long flags;
1634 
1635 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
1636 	list_add_tail(&sas_expander->list, &ioc->sas_expander_list);
1637 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
1638 }
1639 
1640 /**
1641  * _scsih_is_end_device - determines if device is an end device
1642  * @device_info: bitfield providing information about the device.
1643  * Context: none
1644  *
1645  * Return: 1 if end device.
1646  */
1647 static int
1648 _scsih_is_end_device(u32 device_info)
1649 {
1650 	if (device_info & MPI2_SAS_DEVICE_INFO_END_DEVICE &&
1651 		((device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) |
1652 		(device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET) |
1653 		(device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)))
1654 		return 1;
1655 	else
1656 		return 0;
1657 }
1658 
1659 /**
1660  * _scsih_is_nvme_pciescsi_device - determines if
1661  *			device is an pcie nvme/scsi device
1662  * @device_info: bitfield providing information about the device.
1663  * Context: none
1664  *
1665  * Returns 1 if device is pcie device type nvme/scsi.
1666  */
1667 static int
1668 _scsih_is_nvme_pciescsi_device(u32 device_info)
1669 {
1670 	if (((device_info & MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE)
1671 	    == MPI26_PCIE_DEVINFO_NVME) ||
1672 	    ((device_info & MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE)
1673 	    == MPI26_PCIE_DEVINFO_SCSI))
1674 		return 1;
1675 	else
1676 		return 0;
1677 }
1678 
1679 /**
1680  * _scsih_scsi_lookup_find_by_target - search for matching channel:id
1681  * @ioc: per adapter object
1682  * @id: target id
1683  * @channel: channel
1684  * Context: This function will acquire ioc->scsi_lookup_lock.
1685  *
1686  * This will search for a matching channel:id in the scsi_lookup array,
1687  * returning 1 if found.
1688  */
1689 static u8
1690 _scsih_scsi_lookup_find_by_target(struct MPT3SAS_ADAPTER *ioc, int id,
1691 	int channel)
1692 {
1693 	int smid;
1694 	struct scsi_cmnd *scmd;
1695 
1696 	for (smid = 1;
1697 	     smid <= ioc->shost->can_queue; smid++) {
1698 		scmd = mpt3sas_scsih_scsi_lookup_get(ioc, smid);
1699 		if (!scmd)
1700 			continue;
1701 		if (scmd->device->id == id &&
1702 		    scmd->device->channel == channel)
1703 			return 1;
1704 	}
1705 	return 0;
1706 }
1707 
1708 /**
1709  * _scsih_scsi_lookup_find_by_lun - search for matching channel:id:lun
1710  * @ioc: per adapter object
1711  * @id: target id
1712  * @lun: lun number
1713  * @channel: channel
1714  * Context: This function will acquire ioc->scsi_lookup_lock.
1715  *
1716  * This will search for a matching channel:id:lun in the scsi_lookup array,
1717  * returning 1 if found.
1718  */
1719 static u8
1720 _scsih_scsi_lookup_find_by_lun(struct MPT3SAS_ADAPTER *ioc, int id,
1721 	unsigned int lun, int channel)
1722 {
1723 	int smid;
1724 	struct scsi_cmnd *scmd;
1725 
1726 	for (smid = 1; smid <= ioc->shost->can_queue; smid++) {
1727 
1728 		scmd = mpt3sas_scsih_scsi_lookup_get(ioc, smid);
1729 		if (!scmd)
1730 			continue;
1731 		if (scmd->device->id == id &&
1732 		    scmd->device->channel == channel &&
1733 		    scmd->device->lun == lun)
1734 			return 1;
1735 	}
1736 	return 0;
1737 }
1738 
1739 /**
1740  * mpt3sas_scsih_scsi_lookup_get - returns scmd entry
1741  * @ioc: per adapter object
1742  * @smid: system request message index
1743  *
1744  * Return: the smid stored scmd pointer.
1745  * Then will dereference the stored scmd pointer.
1746  */
1747 struct scsi_cmnd *
1748 mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, u16 smid)
1749 {
1750 	struct scsi_cmnd *scmd = NULL;
1751 	struct scsiio_tracker *st;
1752 	Mpi25SCSIIORequest_t *mpi_request;
1753 	u16 tag = smid - 1;
1754 
1755 	if (smid > 0  &&
1756 	    smid <= ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT) {
1757 		u32 unique_tag =
1758 		    ioc->io_queue_num[tag] << BLK_MQ_UNIQUE_TAG_BITS | tag;
1759 
1760 		mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
1761 
1762 		/*
1763 		 * If SCSI IO request is outstanding at driver level then
1764 		 * DevHandle filed must be non-zero. If DevHandle is zero
1765 		 * then it means that this smid is free at driver level,
1766 		 * so return NULL.
1767 		 */
1768 		if (!mpi_request->DevHandle)
1769 			return scmd;
1770 
1771 		scmd = scsi_host_find_tag(ioc->shost, unique_tag);
1772 		if (scmd) {
1773 			st = scsi_cmd_priv(scmd);
1774 			if (st->cb_idx == 0xFF || st->smid == 0)
1775 				scmd = NULL;
1776 		}
1777 	}
1778 	return scmd;
1779 }
1780 
1781 /**
1782  * scsih_change_queue_depth - setting device queue depth
1783  * @sdev: scsi device struct
1784  * @qdepth: requested queue depth
1785  *
1786  * Return: queue depth.
1787  */
1788 static int
1789 scsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
1790 {
1791 	struct Scsi_Host *shost = sdev->host;
1792 	int max_depth;
1793 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1794 	struct MPT3SAS_DEVICE *sas_device_priv_data;
1795 	struct MPT3SAS_TARGET *sas_target_priv_data;
1796 	struct _sas_device *sas_device;
1797 	unsigned long flags;
1798 
1799 	max_depth = shost->can_queue;
1800 
1801 	/*
1802 	 * limit max device queue for SATA to 32 if enable_sdev_max_qd
1803 	 * is disabled.
1804 	 */
1805 	if (ioc->enable_sdev_max_qd || ioc->is_gen35_ioc)
1806 		goto not_sata;
1807 
1808 	sas_device_priv_data = sdev->hostdata;
1809 	if (!sas_device_priv_data)
1810 		goto not_sata;
1811 	sas_target_priv_data = sas_device_priv_data->sas_target;
1812 	if (!sas_target_priv_data)
1813 		goto not_sata;
1814 	if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME))
1815 		goto not_sata;
1816 
1817 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
1818 	sas_device = __mpt3sas_get_sdev_from_target(ioc, sas_target_priv_data);
1819 	if (sas_device) {
1820 		if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
1821 			max_depth = MPT3SAS_SATA_QUEUE_DEPTH;
1822 
1823 		sas_device_put(sas_device);
1824 	}
1825 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1826 
1827  not_sata:
1828 
1829 	if (!sdev->tagged_supported)
1830 		max_depth = 1;
1831 	if (qdepth > max_depth)
1832 		qdepth = max_depth;
1833 	scsi_change_queue_depth(sdev, qdepth);
1834 	sdev_printk(KERN_INFO, sdev,
1835 	    "qdepth(%d), tagged(%d), scsi_level(%d), cmd_que(%d)\n",
1836 	    sdev->queue_depth, sdev->tagged_supported,
1837 	    sdev->scsi_level, ((sdev->inquiry[7] & 2) >> 1));
1838 	return sdev->queue_depth;
1839 }
1840 
1841 /**
1842  * mpt3sas_scsih_change_queue_depth - setting device queue depth
1843  * @sdev: scsi device struct
1844  * @qdepth: requested queue depth
1845  *
1846  * Returns nothing.
1847  */
1848 void
1849 mpt3sas_scsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
1850 {
1851 	struct Scsi_Host *shost = sdev->host;
1852 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1853 
1854 	if (ioc->enable_sdev_max_qd)
1855 		qdepth = shost->can_queue;
1856 
1857 	scsih_change_queue_depth(sdev, qdepth);
1858 }
1859 
1860 /**
1861  * scsih_target_alloc - target add routine
1862  * @starget: scsi target struct
1863  *
1864  * Return: 0 if ok. Any other return is assumed to be an error and
1865  * the device is ignored.
1866  */
1867 static int
1868 scsih_target_alloc(struct scsi_target *starget)
1869 {
1870 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1871 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1872 	struct MPT3SAS_TARGET *sas_target_priv_data;
1873 	struct _sas_device *sas_device;
1874 	struct _raid_device *raid_device;
1875 	struct _pcie_device *pcie_device;
1876 	unsigned long flags;
1877 	struct sas_rphy *rphy;
1878 
1879 	sas_target_priv_data = kzalloc(sizeof(*sas_target_priv_data),
1880 				       GFP_KERNEL);
1881 	if (!sas_target_priv_data)
1882 		return -ENOMEM;
1883 
1884 	starget->hostdata = sas_target_priv_data;
1885 	sas_target_priv_data->starget = starget;
1886 	sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
1887 
1888 	/* RAID volumes */
1889 	if (starget->channel == RAID_CHANNEL) {
1890 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
1891 		raid_device = _scsih_raid_device_find_by_id(ioc, starget->id,
1892 		    starget->channel);
1893 		if (raid_device) {
1894 			sas_target_priv_data->handle = raid_device->handle;
1895 			sas_target_priv_data->sas_address = raid_device->wwid;
1896 			sas_target_priv_data->flags |= MPT_TARGET_FLAGS_VOLUME;
1897 			if (ioc->is_warpdrive)
1898 				sas_target_priv_data->raid_device = raid_device;
1899 			raid_device->starget = starget;
1900 		}
1901 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1902 		return 0;
1903 	}
1904 
1905 	/* PCIe devices */
1906 	if (starget->channel == PCIE_CHANNEL) {
1907 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1908 		pcie_device = __mpt3sas_get_pdev_by_idchannel(ioc, starget->id,
1909 			starget->channel);
1910 		if (pcie_device) {
1911 			sas_target_priv_data->handle = pcie_device->handle;
1912 			sas_target_priv_data->sas_address = pcie_device->wwid;
1913 			sas_target_priv_data->port = NULL;
1914 			sas_target_priv_data->pcie_dev = pcie_device;
1915 			pcie_device->starget = starget;
1916 			pcie_device->id = starget->id;
1917 			pcie_device->channel = starget->channel;
1918 			sas_target_priv_data->flags |=
1919 				MPT_TARGET_FLAGS_PCIE_DEVICE;
1920 			if (pcie_device->fast_path)
1921 				sas_target_priv_data->flags |=
1922 					MPT_TARGET_FASTPATH_IO;
1923 		}
1924 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
1925 		return 0;
1926 	}
1927 
1928 	/* sas/sata devices */
1929 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
1930 	rphy = dev_to_rphy(starget->dev.parent);
1931 	sas_device = __mpt3sas_get_sdev_by_rphy(ioc, rphy);
1932 
1933 	if (sas_device) {
1934 		sas_target_priv_data->handle = sas_device->handle;
1935 		sas_target_priv_data->sas_address = sas_device->sas_address;
1936 		sas_target_priv_data->port = sas_device->port;
1937 		sas_target_priv_data->sas_dev = sas_device;
1938 		sas_device->starget = starget;
1939 		sas_device->id = starget->id;
1940 		sas_device->channel = starget->channel;
1941 		if (test_bit(sas_device->handle, ioc->pd_handles))
1942 			sas_target_priv_data->flags |=
1943 			    MPT_TARGET_FLAGS_RAID_COMPONENT;
1944 		if (sas_device->fast_path)
1945 			sas_target_priv_data->flags |=
1946 					MPT_TARGET_FASTPATH_IO;
1947 	}
1948 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1949 
1950 	return 0;
1951 }
1952 
1953 /**
1954  * scsih_target_destroy - target destroy routine
1955  * @starget: scsi target struct
1956  */
1957 static void
1958 scsih_target_destroy(struct scsi_target *starget)
1959 {
1960 	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1961 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1962 	struct MPT3SAS_TARGET *sas_target_priv_data;
1963 	struct _sas_device *sas_device;
1964 	struct _raid_device *raid_device;
1965 	struct _pcie_device *pcie_device;
1966 	unsigned long flags;
1967 
1968 	sas_target_priv_data = starget->hostdata;
1969 	if (!sas_target_priv_data)
1970 		return;
1971 
1972 	if (starget->channel == RAID_CHANNEL) {
1973 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
1974 		raid_device = _scsih_raid_device_find_by_id(ioc, starget->id,
1975 		    starget->channel);
1976 		if (raid_device) {
1977 			raid_device->starget = NULL;
1978 			raid_device->sdev = NULL;
1979 		}
1980 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1981 		goto out;
1982 	}
1983 
1984 	if (starget->channel == PCIE_CHANNEL) {
1985 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
1986 		pcie_device = __mpt3sas_get_pdev_from_target(ioc,
1987 							sas_target_priv_data);
1988 		if (pcie_device && (pcie_device->starget == starget) &&
1989 			(pcie_device->id == starget->id) &&
1990 			(pcie_device->channel == starget->channel))
1991 			pcie_device->starget = NULL;
1992 
1993 		if (pcie_device) {
1994 			/*
1995 			 * Corresponding get() is in _scsih_target_alloc()
1996 			 */
1997 			sas_target_priv_data->pcie_dev = NULL;
1998 			pcie_device_put(pcie_device);
1999 			pcie_device_put(pcie_device);
2000 		}
2001 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
2002 		goto out;
2003 	}
2004 
2005 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
2006 	sas_device = __mpt3sas_get_sdev_from_target(ioc, sas_target_priv_data);
2007 	if (sas_device && (sas_device->starget == starget) &&
2008 	    (sas_device->id == starget->id) &&
2009 	    (sas_device->channel == starget->channel))
2010 		sas_device->starget = NULL;
2011 
2012 	if (sas_device) {
2013 		/*
2014 		 * Corresponding get() is in _scsih_target_alloc()
2015 		 */
2016 		sas_target_priv_data->sas_dev = NULL;
2017 		sas_device_put(sas_device);
2018 
2019 		sas_device_put(sas_device);
2020 	}
2021 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2022 
2023  out:
2024 	kfree(sas_target_priv_data);
2025 	starget->hostdata = NULL;
2026 }
2027 
2028 /**
2029  * scsih_slave_alloc - device add routine
2030  * @sdev: scsi device struct
2031  *
2032  * Return: 0 if ok. Any other return is assumed to be an error and
2033  * the device is ignored.
2034  */
2035 static int
2036 scsih_slave_alloc(struct scsi_device *sdev)
2037 {
2038 	struct Scsi_Host *shost;
2039 	struct MPT3SAS_ADAPTER *ioc;
2040 	struct MPT3SAS_TARGET *sas_target_priv_data;
2041 	struct MPT3SAS_DEVICE *sas_device_priv_data;
2042 	struct scsi_target *starget;
2043 	struct _raid_device *raid_device;
2044 	struct _sas_device *sas_device;
2045 	struct _pcie_device *pcie_device;
2046 	unsigned long flags;
2047 
2048 	sas_device_priv_data = kzalloc(sizeof(*sas_device_priv_data),
2049 				       GFP_KERNEL);
2050 	if (!sas_device_priv_data)
2051 		return -ENOMEM;
2052 
2053 	sas_device_priv_data->lun = sdev->lun;
2054 	sas_device_priv_data->flags = MPT_DEVICE_FLAGS_INIT;
2055 
2056 	starget = scsi_target(sdev);
2057 	sas_target_priv_data = starget->hostdata;
2058 	sas_target_priv_data->num_luns++;
2059 	sas_device_priv_data->sas_target = sas_target_priv_data;
2060 	sdev->hostdata = sas_device_priv_data;
2061 	if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT))
2062 		sdev->no_uld_attach = 1;
2063 
2064 	shost = dev_to_shost(&starget->dev);
2065 	ioc = shost_priv(shost);
2066 	if (starget->channel == RAID_CHANNEL) {
2067 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
2068 		raid_device = _scsih_raid_device_find_by_id(ioc,
2069 		    starget->id, starget->channel);
2070 		if (raid_device)
2071 			raid_device->sdev = sdev; /* raid is single lun */
2072 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
2073 	}
2074 	if (starget->channel == PCIE_CHANNEL) {
2075 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
2076 		pcie_device = __mpt3sas_get_pdev_by_wwid(ioc,
2077 				sas_target_priv_data->sas_address);
2078 		if (pcie_device && (pcie_device->starget == NULL)) {
2079 			sdev_printk(KERN_INFO, sdev,
2080 			    "%s : pcie_device->starget set to starget @ %d\n",
2081 			    __func__, __LINE__);
2082 			pcie_device->starget = starget;
2083 		}
2084 
2085 		if (pcie_device)
2086 			pcie_device_put(pcie_device);
2087 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
2088 
2089 	} else  if (!(sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)) {
2090 		spin_lock_irqsave(&ioc->sas_device_lock, flags);
2091 		sas_device = __mpt3sas_get_sdev_by_addr(ioc,
2092 		    sas_target_priv_data->sas_address,
2093 		    sas_target_priv_data->port);
2094 		if (sas_device && (sas_device->starget == NULL)) {
2095 			sdev_printk(KERN_INFO, sdev,
2096 			"%s : sas_device->starget set to starget @ %d\n",
2097 			     __func__, __LINE__);
2098 			sas_device->starget = starget;
2099 		}
2100 
2101 		if (sas_device)
2102 			sas_device_put(sas_device);
2103 
2104 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2105 	}
2106 
2107 	return 0;
2108 }
2109 
2110 /**
2111  * scsih_slave_destroy - device destroy routine
2112  * @sdev: scsi device struct
2113  */
2114 static void
2115 scsih_slave_destroy(struct scsi_device *sdev)
2116 {
2117 	struct MPT3SAS_TARGET *sas_target_priv_data;
2118 	struct scsi_target *starget;
2119 	struct Scsi_Host *shost;
2120 	struct MPT3SAS_ADAPTER *ioc;
2121 	struct _sas_device *sas_device;
2122 	struct _pcie_device *pcie_device;
2123 	unsigned long flags;
2124 
2125 	if (!sdev->hostdata)
2126 		return;
2127 
2128 	starget = scsi_target(sdev);
2129 	sas_target_priv_data = starget->hostdata;
2130 	sas_target_priv_data->num_luns--;
2131 
2132 	shost = dev_to_shost(&starget->dev);
2133 	ioc = shost_priv(shost);
2134 
2135 	if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_PCIE_DEVICE) {
2136 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
2137 		pcie_device = __mpt3sas_get_pdev_from_target(ioc,
2138 				sas_target_priv_data);
2139 		if (pcie_device && !sas_target_priv_data->num_luns)
2140 			pcie_device->starget = NULL;
2141 
2142 		if (pcie_device)
2143 			pcie_device_put(pcie_device);
2144 
2145 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
2146 
2147 	} else if (!(sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)) {
2148 		spin_lock_irqsave(&ioc->sas_device_lock, flags);
2149 		sas_device = __mpt3sas_get_sdev_from_target(ioc,
2150 				sas_target_priv_data);
2151 		if (sas_device && !sas_target_priv_data->num_luns)
2152 			sas_device->starget = NULL;
2153 
2154 		if (sas_device)
2155 			sas_device_put(sas_device);
2156 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2157 	}
2158 
2159 	kfree(sdev->hostdata);
2160 	sdev->hostdata = NULL;
2161 }
2162 
2163 /**
2164  * _scsih_display_sata_capabilities - sata capabilities
2165  * @ioc: per adapter object
2166  * @handle: device handle
2167  * @sdev: scsi device struct
2168  */
2169 static void
2170 _scsih_display_sata_capabilities(struct MPT3SAS_ADAPTER *ioc,
2171 	u16 handle, struct scsi_device *sdev)
2172 {
2173 	Mpi2ConfigReply_t mpi_reply;
2174 	Mpi2SasDevicePage0_t sas_device_pg0;
2175 	u32 ioc_status;
2176 	u16 flags;
2177 	u32 device_info;
2178 
2179 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
2180 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
2181 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
2182 			__FILE__, __LINE__, __func__);
2183 		return;
2184 	}
2185 
2186 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
2187 	    MPI2_IOCSTATUS_MASK;
2188 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
2189 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
2190 			__FILE__, __LINE__, __func__);
2191 		return;
2192 	}
2193 
2194 	flags = le16_to_cpu(sas_device_pg0.Flags);
2195 	device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
2196 
2197 	sdev_printk(KERN_INFO, sdev,
2198 	    "atapi(%s), ncq(%s), asyn_notify(%s), smart(%s), fua(%s), "
2199 	    "sw_preserve(%s)\n",
2200 	    (device_info & MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE) ? "y" : "n",
2201 	    (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED) ? "y" : "n",
2202 	    (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY) ? "y" :
2203 	    "n",
2204 	    (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED) ? "y" : "n",
2205 	    (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED) ? "y" : "n",
2206 	    (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE) ? "y" : "n");
2207 }
2208 
2209 /*
2210  * raid transport support -
2211  * Enabled for SLES11 and newer, in older kernels the driver will panic when
2212  * unloading the driver followed by a load - I believe that the subroutine
2213  * raid_class_release() is not cleaning up properly.
2214  */
2215 
2216 /**
2217  * scsih_is_raid - return boolean indicating device is raid volume
2218  * @dev: the device struct object
2219  */
2220 static int
2221 scsih_is_raid(struct device *dev)
2222 {
2223 	struct scsi_device *sdev = to_scsi_device(dev);
2224 	struct MPT3SAS_ADAPTER *ioc = shost_priv(sdev->host);
2225 
2226 	if (ioc->is_warpdrive)
2227 		return 0;
2228 	return (sdev->channel == RAID_CHANNEL) ? 1 : 0;
2229 }
2230 
2231 static int
2232 scsih_is_nvme(struct device *dev)
2233 {
2234 	struct scsi_device *sdev = to_scsi_device(dev);
2235 
2236 	return (sdev->channel == PCIE_CHANNEL) ? 1 : 0;
2237 }
2238 
2239 /**
2240  * scsih_get_resync - get raid volume resync percent complete
2241  * @dev: the device struct object
2242  */
2243 static void
2244 scsih_get_resync(struct device *dev)
2245 {
2246 	struct scsi_device *sdev = to_scsi_device(dev);
2247 	struct MPT3SAS_ADAPTER *ioc = shost_priv(sdev->host);
2248 	static struct _raid_device *raid_device;
2249 	unsigned long flags;
2250 	Mpi2RaidVolPage0_t vol_pg0;
2251 	Mpi2ConfigReply_t mpi_reply;
2252 	u32 volume_status_flags;
2253 	u8 percent_complete;
2254 	u16 handle;
2255 
2256 	percent_complete = 0;
2257 	handle = 0;
2258 	if (ioc->is_warpdrive)
2259 		goto out;
2260 
2261 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
2262 	raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id,
2263 	    sdev->channel);
2264 	if (raid_device) {
2265 		handle = raid_device->handle;
2266 		percent_complete = raid_device->percent_complete;
2267 	}
2268 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
2269 
2270 	if (!handle)
2271 		goto out;
2272 
2273 	if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0,
2274 	     MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
2275 	     sizeof(Mpi2RaidVolPage0_t))) {
2276 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
2277 			__FILE__, __LINE__, __func__);
2278 		percent_complete = 0;
2279 		goto out;
2280 	}
2281 
2282 	volume_status_flags = le32_to_cpu(vol_pg0.VolumeStatusFlags);
2283 	if (!(volume_status_flags &
2284 	    MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS))
2285 		percent_complete = 0;
2286 
2287  out:
2288 
2289 	switch (ioc->hba_mpi_version_belonged) {
2290 	case MPI2_VERSION:
2291 		raid_set_resync(mpt2sas_raid_template, dev, percent_complete);
2292 		break;
2293 	case MPI25_VERSION:
2294 	case MPI26_VERSION:
2295 		raid_set_resync(mpt3sas_raid_template, dev, percent_complete);
2296 		break;
2297 	}
2298 }
2299 
2300 /**
2301  * scsih_get_state - get raid volume level
2302  * @dev: the device struct object
2303  */
2304 static void
2305 scsih_get_state(struct device *dev)
2306 {
2307 	struct scsi_device *sdev = to_scsi_device(dev);
2308 	struct MPT3SAS_ADAPTER *ioc = shost_priv(sdev->host);
2309 	static struct _raid_device *raid_device;
2310 	unsigned long flags;
2311 	Mpi2RaidVolPage0_t vol_pg0;
2312 	Mpi2ConfigReply_t mpi_reply;
2313 	u32 volstate;
2314 	enum raid_state state = RAID_STATE_UNKNOWN;
2315 	u16 handle = 0;
2316 
2317 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
2318 	raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id,
2319 	    sdev->channel);
2320 	if (raid_device)
2321 		handle = raid_device->handle;
2322 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
2323 
2324 	if (!raid_device)
2325 		goto out;
2326 
2327 	if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0,
2328 	     MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
2329 	     sizeof(Mpi2RaidVolPage0_t))) {
2330 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
2331 			__FILE__, __LINE__, __func__);
2332 		goto out;
2333 	}
2334 
2335 	volstate = le32_to_cpu(vol_pg0.VolumeStatusFlags);
2336 	if (volstate & MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) {
2337 		state = RAID_STATE_RESYNCING;
2338 		goto out;
2339 	}
2340 
2341 	switch (vol_pg0.VolumeState) {
2342 	case MPI2_RAID_VOL_STATE_OPTIMAL:
2343 	case MPI2_RAID_VOL_STATE_ONLINE:
2344 		state = RAID_STATE_ACTIVE;
2345 		break;
2346 	case  MPI2_RAID_VOL_STATE_DEGRADED:
2347 		state = RAID_STATE_DEGRADED;
2348 		break;
2349 	case MPI2_RAID_VOL_STATE_FAILED:
2350 	case MPI2_RAID_VOL_STATE_MISSING:
2351 		state = RAID_STATE_OFFLINE;
2352 		break;
2353 	}
2354  out:
2355 	switch (ioc->hba_mpi_version_belonged) {
2356 	case MPI2_VERSION:
2357 		raid_set_state(mpt2sas_raid_template, dev, state);
2358 		break;
2359 	case MPI25_VERSION:
2360 	case MPI26_VERSION:
2361 		raid_set_state(mpt3sas_raid_template, dev, state);
2362 		break;
2363 	}
2364 }
2365 
2366 /**
2367  * _scsih_set_level - set raid level
2368  * @ioc: ?
2369  * @sdev: scsi device struct
2370  * @volume_type: volume type
2371  */
2372 static void
2373 _scsih_set_level(struct MPT3SAS_ADAPTER *ioc,
2374 	struct scsi_device *sdev, u8 volume_type)
2375 {
2376 	enum raid_level level = RAID_LEVEL_UNKNOWN;
2377 
2378 	switch (volume_type) {
2379 	case MPI2_RAID_VOL_TYPE_RAID0:
2380 		level = RAID_LEVEL_0;
2381 		break;
2382 	case MPI2_RAID_VOL_TYPE_RAID10:
2383 		level = RAID_LEVEL_10;
2384 		break;
2385 	case MPI2_RAID_VOL_TYPE_RAID1E:
2386 		level = RAID_LEVEL_1E;
2387 		break;
2388 	case MPI2_RAID_VOL_TYPE_RAID1:
2389 		level = RAID_LEVEL_1;
2390 		break;
2391 	}
2392 
2393 	switch (ioc->hba_mpi_version_belonged) {
2394 	case MPI2_VERSION:
2395 		raid_set_level(mpt2sas_raid_template,
2396 			&sdev->sdev_gendev, level);
2397 		break;
2398 	case MPI25_VERSION:
2399 	case MPI26_VERSION:
2400 		raid_set_level(mpt3sas_raid_template,
2401 			&sdev->sdev_gendev, level);
2402 		break;
2403 	}
2404 }
2405 
2406 
2407 /**
2408  * _scsih_get_volume_capabilities - volume capabilities
2409  * @ioc: per adapter object
2410  * @raid_device: the raid_device object
2411  *
2412  * Return: 0 for success, else 1
2413  */
2414 static int
2415 _scsih_get_volume_capabilities(struct MPT3SAS_ADAPTER *ioc,
2416 	struct _raid_device *raid_device)
2417 {
2418 	Mpi2RaidVolPage0_t *vol_pg0;
2419 	Mpi2RaidPhysDiskPage0_t pd_pg0;
2420 	Mpi2SasDevicePage0_t sas_device_pg0;
2421 	Mpi2ConfigReply_t mpi_reply;
2422 	u16 sz;
2423 	u8 num_pds;
2424 
2425 	if ((mpt3sas_config_get_number_pds(ioc, raid_device->handle,
2426 	    &num_pds)) || !num_pds) {
2427 		dfailprintk(ioc,
2428 			    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2429 				     __FILE__, __LINE__, __func__));
2430 		return 1;
2431 	}
2432 
2433 	raid_device->num_pds = num_pds;
2434 	sz = offsetof(Mpi2RaidVolPage0_t, PhysDisk) + (num_pds *
2435 	    sizeof(Mpi2RaidVol0PhysDisk_t));
2436 	vol_pg0 = kzalloc(sz, GFP_KERNEL);
2437 	if (!vol_pg0) {
2438 		dfailprintk(ioc,
2439 			    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2440 				     __FILE__, __LINE__, __func__));
2441 		return 1;
2442 	}
2443 
2444 	if ((mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, vol_pg0,
2445 	     MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle, sz))) {
2446 		dfailprintk(ioc,
2447 			    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2448 				     __FILE__, __LINE__, __func__));
2449 		kfree(vol_pg0);
2450 		return 1;
2451 	}
2452 
2453 	raid_device->volume_type = vol_pg0->VolumeType;
2454 
2455 	/* figure out what the underlying devices are by
2456 	 * obtaining the device_info bits for the 1st device
2457 	 */
2458 	if (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
2459 	    &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM,
2460 	    vol_pg0->PhysDisk[0].PhysDiskNum))) {
2461 		if (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
2462 		    &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
2463 		    le16_to_cpu(pd_pg0.DevHandle)))) {
2464 			raid_device->device_info =
2465 			    le32_to_cpu(sas_device_pg0.DeviceInfo);
2466 		}
2467 	}
2468 
2469 	kfree(vol_pg0);
2470 	return 0;
2471 }
2472 
2473 /**
2474  * _scsih_enable_tlr - setting TLR flags
2475  * @ioc: per adapter object
2476  * @sdev: scsi device struct
2477  *
2478  * Enabling Transaction Layer Retries for tape devices when
2479  * vpd page 0x90 is present
2480  *
2481  */
2482 static void
2483 _scsih_enable_tlr(struct MPT3SAS_ADAPTER *ioc, struct scsi_device *sdev)
2484 {
2485 
2486 	/* only for TAPE */
2487 	if (sdev->type != TYPE_TAPE)
2488 		return;
2489 
2490 	if (!(ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR))
2491 		return;
2492 
2493 	sas_enable_tlr(sdev);
2494 	sdev_printk(KERN_INFO, sdev, "TLR %s\n",
2495 	    sas_is_tlr_enabled(sdev) ? "Enabled" : "Disabled");
2496 	return;
2497 
2498 }
2499 
2500 /**
2501  * scsih_slave_configure - device configure routine.
2502  * @sdev: scsi device struct
2503  *
2504  * Return: 0 if ok. Any other return is assumed to be an error and
2505  * the device is ignored.
2506  */
2507 static int
2508 scsih_slave_configure(struct scsi_device *sdev)
2509 {
2510 	struct Scsi_Host *shost = sdev->host;
2511 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
2512 	struct MPT3SAS_DEVICE *sas_device_priv_data;
2513 	struct MPT3SAS_TARGET *sas_target_priv_data;
2514 	struct _sas_device *sas_device;
2515 	struct _pcie_device *pcie_device;
2516 	struct _raid_device *raid_device;
2517 	unsigned long flags;
2518 	int qdepth;
2519 	u8 ssp_target = 0;
2520 	char *ds = "";
2521 	char *r_level = "";
2522 	u16 handle, volume_handle = 0;
2523 	u64 volume_wwid = 0;
2524 
2525 	qdepth = 1;
2526 	sas_device_priv_data = sdev->hostdata;
2527 	sas_device_priv_data->configured_lun = 1;
2528 	sas_device_priv_data->flags &= ~MPT_DEVICE_FLAGS_INIT;
2529 	sas_target_priv_data = sas_device_priv_data->sas_target;
2530 	handle = sas_target_priv_data->handle;
2531 
2532 	/* raid volume handling */
2533 	if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME) {
2534 
2535 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
2536 		raid_device = mpt3sas_raid_device_find_by_handle(ioc, handle);
2537 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
2538 		if (!raid_device) {
2539 			dfailprintk(ioc,
2540 				    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2541 					     __FILE__, __LINE__, __func__));
2542 			return 1;
2543 		}
2544 
2545 		if (_scsih_get_volume_capabilities(ioc, raid_device)) {
2546 			dfailprintk(ioc,
2547 				    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2548 					     __FILE__, __LINE__, __func__));
2549 			return 1;
2550 		}
2551 
2552 		/*
2553 		 * WARPDRIVE: Initialize the required data for Direct IO
2554 		 */
2555 		mpt3sas_init_warpdrive_properties(ioc, raid_device);
2556 
2557 		/* RAID Queue Depth Support
2558 		 * IS volume = underlying qdepth of drive type, either
2559 		 *    MPT3SAS_SAS_QUEUE_DEPTH or MPT3SAS_SATA_QUEUE_DEPTH
2560 		 * IM/IME/R10 = 128 (MPT3SAS_RAID_QUEUE_DEPTH)
2561 		 */
2562 		if (raid_device->device_info &
2563 		    MPI2_SAS_DEVICE_INFO_SSP_TARGET) {
2564 			qdepth = MPT3SAS_SAS_QUEUE_DEPTH;
2565 			ds = "SSP";
2566 		} else {
2567 			qdepth = MPT3SAS_SATA_QUEUE_DEPTH;
2568 			if (raid_device->device_info &
2569 			    MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
2570 				ds = "SATA";
2571 			else
2572 				ds = "STP";
2573 		}
2574 
2575 		switch (raid_device->volume_type) {
2576 		case MPI2_RAID_VOL_TYPE_RAID0:
2577 			r_level = "RAID0";
2578 			break;
2579 		case MPI2_RAID_VOL_TYPE_RAID1E:
2580 			qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
2581 			if (ioc->manu_pg10.OEMIdentifier &&
2582 			    (le32_to_cpu(ioc->manu_pg10.GenericFlags0) &
2583 			    MFG10_GF0_R10_DISPLAY) &&
2584 			    !(raid_device->num_pds % 2))
2585 				r_level = "RAID10";
2586 			else
2587 				r_level = "RAID1E";
2588 			break;
2589 		case MPI2_RAID_VOL_TYPE_RAID1:
2590 			qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
2591 			r_level = "RAID1";
2592 			break;
2593 		case MPI2_RAID_VOL_TYPE_RAID10:
2594 			qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
2595 			r_level = "RAID10";
2596 			break;
2597 		case MPI2_RAID_VOL_TYPE_UNKNOWN:
2598 		default:
2599 			qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
2600 			r_level = "RAIDX";
2601 			break;
2602 		}
2603 
2604 		if (!ioc->hide_ir_msg)
2605 			sdev_printk(KERN_INFO, sdev,
2606 			   "%s: handle(0x%04x), wwid(0x%016llx),"
2607 			    " pd_count(%d), type(%s)\n",
2608 			    r_level, raid_device->handle,
2609 			    (unsigned long long)raid_device->wwid,
2610 			    raid_device->num_pds, ds);
2611 
2612 		if (shost->max_sectors > MPT3SAS_RAID_MAX_SECTORS) {
2613 			blk_queue_max_hw_sectors(sdev->request_queue,
2614 						MPT3SAS_RAID_MAX_SECTORS);
2615 			sdev_printk(KERN_INFO, sdev,
2616 					"Set queue's max_sector to: %u\n",
2617 						MPT3SAS_RAID_MAX_SECTORS);
2618 		}
2619 
2620 		mpt3sas_scsih_change_queue_depth(sdev, qdepth);
2621 
2622 		/* raid transport support */
2623 		if (!ioc->is_warpdrive)
2624 			_scsih_set_level(ioc, sdev, raid_device->volume_type);
2625 		return 0;
2626 	}
2627 
2628 	/* non-raid handling */
2629 	if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2630 		if (mpt3sas_config_get_volume_handle(ioc, handle,
2631 		    &volume_handle)) {
2632 			dfailprintk(ioc,
2633 				    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2634 					     __FILE__, __LINE__, __func__));
2635 			return 1;
2636 		}
2637 		if (volume_handle && mpt3sas_config_get_volume_wwid(ioc,
2638 		    volume_handle, &volume_wwid)) {
2639 			dfailprintk(ioc,
2640 				    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2641 					     __FILE__, __LINE__, __func__));
2642 			return 1;
2643 		}
2644 	}
2645 
2646 	/* PCIe handling */
2647 	if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_PCIE_DEVICE) {
2648 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
2649 		pcie_device = __mpt3sas_get_pdev_by_wwid(ioc,
2650 				sas_device_priv_data->sas_target->sas_address);
2651 		if (!pcie_device) {
2652 			spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
2653 			dfailprintk(ioc,
2654 				    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2655 					     __FILE__, __LINE__, __func__));
2656 			return 1;
2657 		}
2658 
2659 		qdepth = ioc->max_nvme_qd;
2660 		ds = "NVMe";
2661 		sdev_printk(KERN_INFO, sdev,
2662 			"%s: handle(0x%04x), wwid(0x%016llx), port(%d)\n",
2663 			ds, handle, (unsigned long long)pcie_device->wwid,
2664 			pcie_device->port_num);
2665 		if (pcie_device->enclosure_handle != 0)
2666 			sdev_printk(KERN_INFO, sdev,
2667 			"%s: enclosure logical id(0x%016llx), slot(%d)\n",
2668 			ds,
2669 			(unsigned long long)pcie_device->enclosure_logical_id,
2670 			pcie_device->slot);
2671 		if (pcie_device->connector_name[0] != '\0')
2672 			sdev_printk(KERN_INFO, sdev,
2673 				"%s: enclosure level(0x%04x),"
2674 				"connector name( %s)\n", ds,
2675 				pcie_device->enclosure_level,
2676 				pcie_device->connector_name);
2677 
2678 		if (pcie_device->nvme_mdts)
2679 			blk_queue_max_hw_sectors(sdev->request_queue,
2680 					pcie_device->nvme_mdts/512);
2681 
2682 		pcie_device_put(pcie_device);
2683 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
2684 		mpt3sas_scsih_change_queue_depth(sdev, qdepth);
2685 		/* Enable QUEUE_FLAG_NOMERGES flag, so that IOs won't be
2686 		 ** merged and can eliminate holes created during merging
2687 		 ** operation.
2688 		 **/
2689 		blk_queue_flag_set(QUEUE_FLAG_NOMERGES,
2690 				sdev->request_queue);
2691 		blk_queue_virt_boundary(sdev->request_queue,
2692 				ioc->page_size - 1);
2693 		return 0;
2694 	}
2695 
2696 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
2697 	sas_device = __mpt3sas_get_sdev_by_addr(ioc,
2698 	   sas_device_priv_data->sas_target->sas_address,
2699 	   sas_device_priv_data->sas_target->port);
2700 	if (!sas_device) {
2701 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2702 		dfailprintk(ioc,
2703 			    ioc_warn(ioc, "failure at %s:%d/%s()!\n",
2704 				     __FILE__, __LINE__, __func__));
2705 		return 1;
2706 	}
2707 
2708 	sas_device->volume_handle = volume_handle;
2709 	sas_device->volume_wwid = volume_wwid;
2710 	if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) {
2711 		qdepth = (sas_device->port_type > 1) ?
2712 			ioc->max_wideport_qd : ioc->max_narrowport_qd;
2713 		ssp_target = 1;
2714 		if (sas_device->device_info &
2715 				MPI2_SAS_DEVICE_INFO_SEP) {
2716 			sdev_printk(KERN_WARNING, sdev,
2717 			"set ignore_delay_remove for handle(0x%04x)\n",
2718 			sas_device_priv_data->sas_target->handle);
2719 			sas_device_priv_data->ignore_delay_remove = 1;
2720 			ds = "SES";
2721 		} else
2722 			ds = "SSP";
2723 	} else {
2724 		qdepth = ioc->max_sata_qd;
2725 		if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET)
2726 			ds = "STP";
2727 		else if (sas_device->device_info &
2728 		    MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
2729 			ds = "SATA";
2730 	}
2731 
2732 	sdev_printk(KERN_INFO, sdev, "%s: handle(0x%04x), " \
2733 	    "sas_addr(0x%016llx), phy(%d), device_name(0x%016llx)\n",
2734 	    ds, handle, (unsigned long long)sas_device->sas_address,
2735 	    sas_device->phy, (unsigned long long)sas_device->device_name);
2736 
2737 	_scsih_display_enclosure_chassis_info(NULL, sas_device, sdev, NULL);
2738 
2739 	sas_device_put(sas_device);
2740 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2741 
2742 	if (!ssp_target)
2743 		_scsih_display_sata_capabilities(ioc, handle, sdev);
2744 
2745 
2746 	mpt3sas_scsih_change_queue_depth(sdev, qdepth);
2747 
2748 	if (ssp_target) {
2749 		sas_read_port_mode_page(sdev);
2750 		_scsih_enable_tlr(ioc, sdev);
2751 	}
2752 
2753 	return 0;
2754 }
2755 
2756 /**
2757  * scsih_bios_param - fetch head, sector, cylinder info for a disk
2758  * @sdev: scsi device struct
2759  * @bdev: pointer to block device context
2760  * @capacity: device size (in 512 byte sectors)
2761  * @params: three element array to place output:
2762  *              params[0] number of heads (max 255)
2763  *              params[1] number of sectors (max 63)
2764  *              params[2] number of cylinders
2765  */
2766 static int
2767 scsih_bios_param(struct scsi_device *sdev, struct block_device *bdev,
2768 	sector_t capacity, int params[])
2769 {
2770 	int		heads;
2771 	int		sectors;
2772 	sector_t	cylinders;
2773 	ulong		dummy;
2774 
2775 	heads = 64;
2776 	sectors = 32;
2777 
2778 	dummy = heads * sectors;
2779 	cylinders = capacity;
2780 	sector_div(cylinders, dummy);
2781 
2782 	/*
2783 	 * Handle extended translation size for logical drives
2784 	 * > 1Gb
2785 	 */
2786 	if ((ulong)capacity >= 0x200000) {
2787 		heads = 255;
2788 		sectors = 63;
2789 		dummy = heads * sectors;
2790 		cylinders = capacity;
2791 		sector_div(cylinders, dummy);
2792 	}
2793 
2794 	/* return result */
2795 	params[0] = heads;
2796 	params[1] = sectors;
2797 	params[2] = cylinders;
2798 
2799 	return 0;
2800 }
2801 
2802 /**
2803  * _scsih_response_code - translation of device response code
2804  * @ioc: per adapter object
2805  * @response_code: response code returned by the device
2806  */
2807 static void
2808 _scsih_response_code(struct MPT3SAS_ADAPTER *ioc, u8 response_code)
2809 {
2810 	char *desc;
2811 
2812 	switch (response_code) {
2813 	case MPI2_SCSITASKMGMT_RSP_TM_COMPLETE:
2814 		desc = "task management request completed";
2815 		break;
2816 	case MPI2_SCSITASKMGMT_RSP_INVALID_FRAME:
2817 		desc = "invalid frame";
2818 		break;
2819 	case MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED:
2820 		desc = "task management request not supported";
2821 		break;
2822 	case MPI2_SCSITASKMGMT_RSP_TM_FAILED:
2823 		desc = "task management request failed";
2824 		break;
2825 	case MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED:
2826 		desc = "task management request succeeded";
2827 		break;
2828 	case MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN:
2829 		desc = "invalid lun";
2830 		break;
2831 	case 0xA:
2832 		desc = "overlapped tag attempted";
2833 		break;
2834 	case MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC:
2835 		desc = "task queued, however not sent to target";
2836 		break;
2837 	default:
2838 		desc = "unknown";
2839 		break;
2840 	}
2841 	ioc_warn(ioc, "response_code(0x%01x): %s\n", response_code, desc);
2842 }
2843 
2844 /**
2845  * _scsih_tm_done - tm completion routine
2846  * @ioc: per adapter object
2847  * @smid: system request message index
2848  * @msix_index: MSIX table index supplied by the OS
2849  * @reply: reply message frame(lower 32bit addr)
2850  * Context: none.
2851  *
2852  * The callback handler when using scsih_issue_tm.
2853  *
2854  * Return: 1 meaning mf should be freed from _base_interrupt
2855  *         0 means the mf is freed from this function.
2856  */
2857 static u8
2858 _scsih_tm_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
2859 {
2860 	MPI2DefaultReply_t *mpi_reply;
2861 
2862 	if (ioc->tm_cmds.status == MPT3_CMD_NOT_USED)
2863 		return 1;
2864 	if (ioc->tm_cmds.smid != smid)
2865 		return 1;
2866 	ioc->tm_cmds.status |= MPT3_CMD_COMPLETE;
2867 	mpi_reply =  mpt3sas_base_get_reply_virt_addr(ioc, reply);
2868 	if (mpi_reply) {
2869 		memcpy(ioc->tm_cmds.reply, mpi_reply, mpi_reply->MsgLength*4);
2870 		ioc->tm_cmds.status |= MPT3_CMD_REPLY_VALID;
2871 	}
2872 	ioc->tm_cmds.status &= ~MPT3_CMD_PENDING;
2873 	complete(&ioc->tm_cmds.done);
2874 	return 1;
2875 }
2876 
2877 /**
2878  * mpt3sas_scsih_set_tm_flag - set per target tm_busy
2879  * @ioc: per adapter object
2880  * @handle: device handle
2881  *
2882  * During taskmangement request, we need to freeze the device queue.
2883  */
2884 void
2885 mpt3sas_scsih_set_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
2886 {
2887 	struct MPT3SAS_DEVICE *sas_device_priv_data;
2888 	struct scsi_device *sdev;
2889 	u8 skip = 0;
2890 
2891 	shost_for_each_device(sdev, ioc->shost) {
2892 		if (skip)
2893 			continue;
2894 		sas_device_priv_data = sdev->hostdata;
2895 		if (!sas_device_priv_data)
2896 			continue;
2897 		if (sas_device_priv_data->sas_target->handle == handle) {
2898 			sas_device_priv_data->sas_target->tm_busy = 1;
2899 			skip = 1;
2900 			ioc->ignore_loginfos = 1;
2901 		}
2902 	}
2903 }
2904 
2905 /**
2906  * mpt3sas_scsih_clear_tm_flag - clear per target tm_busy
2907  * @ioc: per adapter object
2908  * @handle: device handle
2909  *
2910  * During taskmangement request, we need to freeze the device queue.
2911  */
2912 void
2913 mpt3sas_scsih_clear_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
2914 {
2915 	struct MPT3SAS_DEVICE *sas_device_priv_data;
2916 	struct scsi_device *sdev;
2917 	u8 skip = 0;
2918 
2919 	shost_for_each_device(sdev, ioc->shost) {
2920 		if (skip)
2921 			continue;
2922 		sas_device_priv_data = sdev->hostdata;
2923 		if (!sas_device_priv_data)
2924 			continue;
2925 		if (sas_device_priv_data->sas_target->handle == handle) {
2926 			sas_device_priv_data->sas_target->tm_busy = 0;
2927 			skip = 1;
2928 			ioc->ignore_loginfos = 0;
2929 		}
2930 	}
2931 }
2932 
2933 /**
2934  * scsih_tm_cmd_map_status - map the target reset & LUN reset TM status
2935  * @ioc: per adapter object
2936  * @channel: the channel assigned by the OS
2937  * @id: the id assigned by the OS
2938  * @lun: lun number
2939  * @type: MPI2_SCSITASKMGMT_TASKTYPE__XXX (defined in mpi2_init.h)
2940  * @smid_task: smid assigned to the task
2941  *
2942  * Look whether TM has aborted the timed out SCSI command, if
2943  * TM has aborted the IO then return SUCCESS else return FAILED.
2944  */
2945 static int
2946 scsih_tm_cmd_map_status(struct MPT3SAS_ADAPTER *ioc, uint channel,
2947 	uint id, uint lun, u8 type, u16 smid_task)
2948 {
2949 
2950 	if (smid_task <= ioc->shost->can_queue) {
2951 		switch (type) {
2952 		case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
2953 			if (!(_scsih_scsi_lookup_find_by_target(ioc,
2954 			    id, channel)))
2955 				return SUCCESS;
2956 			break;
2957 		case MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET:
2958 		case MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET:
2959 			if (!(_scsih_scsi_lookup_find_by_lun(ioc, id,
2960 			    lun, channel)))
2961 				return SUCCESS;
2962 			break;
2963 		default:
2964 			return SUCCESS;
2965 		}
2966 	} else if (smid_task == ioc->scsih_cmds.smid) {
2967 		if ((ioc->scsih_cmds.status & MPT3_CMD_COMPLETE) ||
2968 		    (ioc->scsih_cmds.status & MPT3_CMD_NOT_USED))
2969 			return SUCCESS;
2970 	} else if (smid_task == ioc->ctl_cmds.smid) {
2971 		if ((ioc->ctl_cmds.status & MPT3_CMD_COMPLETE) ||
2972 		    (ioc->ctl_cmds.status & MPT3_CMD_NOT_USED))
2973 			return SUCCESS;
2974 	}
2975 
2976 	return FAILED;
2977 }
2978 
2979 /**
2980  * scsih_tm_post_processing - post processing of target & LUN reset
2981  * @ioc: per adapter object
2982  * @handle: device handle
2983  * @channel: the channel assigned by the OS
2984  * @id: the id assigned by the OS
2985  * @lun: lun number
2986  * @type: MPI2_SCSITASKMGMT_TASKTYPE__XXX (defined in mpi2_init.h)
2987  * @smid_task: smid assigned to the task
2988  *
2989  * Post processing of target & LUN reset. Due to interrupt latency
2990  * issue it possible that interrupt for aborted IO might not be
2991  * received yet. So before returning failure status, poll the
2992  * reply descriptor pools for the reply of timed out SCSI command.
2993  * Return FAILED status if reply for timed out is not received
2994  * otherwise return SUCCESS.
2995  */
2996 static int
2997 scsih_tm_post_processing(struct MPT3SAS_ADAPTER *ioc, u16 handle,
2998 	uint channel, uint id, uint lun, u8 type, u16 smid_task)
2999 {
3000 	int rc;
3001 
3002 	rc = scsih_tm_cmd_map_status(ioc, channel, id, lun, type, smid_task);
3003 	if (rc == SUCCESS)
3004 		return rc;
3005 
3006 	ioc_info(ioc,
3007 	    "Poll ReplyDescriptor queues for completion of"
3008 	    " smid(%d), task_type(0x%02x), handle(0x%04x)\n",
3009 	    smid_task, type, handle);
3010 
3011 	/*
3012 	 * Due to interrupt latency issues, driver may receive interrupt for
3013 	 * TM first and then for aborted SCSI IO command. So, poll all the
3014 	 * ReplyDescriptor pools before returning the FAILED status to SML.
3015 	 */
3016 	mpt3sas_base_mask_interrupts(ioc);
3017 	mpt3sas_base_sync_reply_irqs(ioc, 1);
3018 	mpt3sas_base_unmask_interrupts(ioc);
3019 
3020 	return scsih_tm_cmd_map_status(ioc, channel, id, lun, type, smid_task);
3021 }
3022 
3023 /**
3024  * mpt3sas_scsih_issue_tm - main routine for sending tm requests
3025  * @ioc: per adapter struct
3026  * @handle: device handle
3027  * @channel: the channel assigned by the OS
3028  * @id: the id assigned by the OS
3029  * @lun: lun number
3030  * @type: MPI2_SCSITASKMGMT_TASKTYPE__XXX (defined in mpi2_init.h)
3031  * @smid_task: smid assigned to the task
3032  * @msix_task: MSIX table index supplied by the OS
3033  * @timeout: timeout in seconds
3034  * @tr_method: Target Reset Method
3035  * Context: user
3036  *
3037  * A generic API for sending task management requests to firmware.
3038  *
3039  * The callback index is set inside `ioc->tm_cb_idx`.
3040  * The caller is responsible to check for outstanding commands.
3041  *
3042  * Return: SUCCESS or FAILED.
3043  */
3044 int
3045 mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
3046 	uint id, u64 lun, u8 type, u16 smid_task, u16 msix_task,
3047 	u8 timeout, u8 tr_method)
3048 {
3049 	Mpi2SCSITaskManagementRequest_t *mpi_request;
3050 	Mpi2SCSITaskManagementReply_t *mpi_reply;
3051 	Mpi25SCSIIORequest_t *request;
3052 	u16 smid = 0;
3053 	u32 ioc_state;
3054 	int rc;
3055 	u8 issue_reset = 0;
3056 
3057 	lockdep_assert_held(&ioc->tm_cmds.mutex);
3058 
3059 	if (ioc->tm_cmds.status != MPT3_CMD_NOT_USED) {
3060 		ioc_info(ioc, "%s: tm_cmd busy!!!\n", __func__);
3061 		return FAILED;
3062 	}
3063 
3064 	if (ioc->shost_recovery || ioc->remove_host ||
3065 	    ioc->pci_error_recovery) {
3066 		ioc_info(ioc, "%s: host reset in progress!\n", __func__);
3067 		return FAILED;
3068 	}
3069 
3070 	ioc_state = mpt3sas_base_get_iocstate(ioc, 0);
3071 	if (ioc_state & MPI2_DOORBELL_USED) {
3072 		dhsprintk(ioc, ioc_info(ioc, "unexpected doorbell active!\n"));
3073 		rc = mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
3074 		return (!rc) ? SUCCESS : FAILED;
3075 	}
3076 
3077 	if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
3078 		mpt3sas_print_fault_code(ioc, ioc_state &
3079 		    MPI2_DOORBELL_DATA_MASK);
3080 		rc = mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
3081 		return (!rc) ? SUCCESS : FAILED;
3082 	} else if ((ioc_state & MPI2_IOC_STATE_MASK) ==
3083 	    MPI2_IOC_STATE_COREDUMP) {
3084 		mpt3sas_print_coredump_info(ioc, ioc_state &
3085 		    MPI2_DOORBELL_DATA_MASK);
3086 		rc = mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
3087 		return (!rc) ? SUCCESS : FAILED;
3088 	}
3089 
3090 	smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_cb_idx);
3091 	if (!smid) {
3092 		ioc_err(ioc, "%s: failed obtaining a smid\n", __func__);
3093 		return FAILED;
3094 	}
3095 
3096 	dtmprintk(ioc,
3097 		  ioc_info(ioc, "sending tm: handle(0x%04x), task_type(0x%02x), smid(%d), timeout(%d), tr_method(0x%x)\n",
3098 			   handle, type, smid_task, timeout, tr_method));
3099 	ioc->tm_cmds.status = MPT3_CMD_PENDING;
3100 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
3101 	ioc->tm_cmds.smid = smid;
3102 	memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
3103 	memset(ioc->tm_cmds.reply, 0, sizeof(Mpi2SCSITaskManagementReply_t));
3104 	mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
3105 	mpi_request->DevHandle = cpu_to_le16(handle);
3106 	mpi_request->TaskType = type;
3107 	if (type == MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK ||
3108 	    type == MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK)
3109 		mpi_request->MsgFlags = tr_method;
3110 	mpi_request->TaskMID = cpu_to_le16(smid_task);
3111 	int_to_scsilun(lun, (struct scsi_lun *)mpi_request->LUN);
3112 	mpt3sas_scsih_set_tm_flag(ioc, handle);
3113 	init_completion(&ioc->tm_cmds.done);
3114 	ioc->put_smid_hi_priority(ioc, smid, msix_task);
3115 	wait_for_completion_timeout(&ioc->tm_cmds.done, timeout*HZ);
3116 	if (!(ioc->tm_cmds.status & MPT3_CMD_COMPLETE)) {
3117 		mpt3sas_check_cmd_timeout(ioc,
3118 		    ioc->tm_cmds.status, mpi_request,
3119 		    sizeof(Mpi2SCSITaskManagementRequest_t)/4, issue_reset);
3120 		if (issue_reset) {
3121 			rc = mpt3sas_base_hard_reset_handler(ioc,
3122 					FORCE_BIG_HAMMER);
3123 			rc = (!rc) ? SUCCESS : FAILED;
3124 			goto out;
3125 		}
3126 	}
3127 
3128 	/* sync IRQs in case those were busy during flush. */
3129 	mpt3sas_base_sync_reply_irqs(ioc, 0);
3130 
3131 	if (ioc->tm_cmds.status & MPT3_CMD_REPLY_VALID) {
3132 		mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
3133 		mpi_reply = ioc->tm_cmds.reply;
3134 		dtmprintk(ioc,
3135 			  ioc_info(ioc, "complete tm: ioc_status(0x%04x), loginfo(0x%08x), term_count(0x%08x)\n",
3136 				   le16_to_cpu(mpi_reply->IOCStatus),
3137 				   le32_to_cpu(mpi_reply->IOCLogInfo),
3138 				   le32_to_cpu(mpi_reply->TerminationCount)));
3139 		if (ioc->logging_level & MPT_DEBUG_TM) {
3140 			_scsih_response_code(ioc, mpi_reply->ResponseCode);
3141 			if (mpi_reply->IOCStatus)
3142 				_debug_dump_mf(mpi_request,
3143 				    sizeof(Mpi2SCSITaskManagementRequest_t)/4);
3144 		}
3145 	}
3146 
3147 	switch (type) {
3148 	case MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK:
3149 		rc = SUCCESS;
3150 		/*
3151 		 * If DevHandle filed in smid_task's entry of request pool
3152 		 * doesn't match with device handle on which this task abort
3153 		 * TM is received then it means that TM has successfully
3154 		 * aborted the timed out command. Since smid_task's entry in
3155 		 * request pool will be memset to zero once the timed out
3156 		 * command is returned to the SML. If the command is not
3157 		 * aborted then smid_task’s entry won’t be cleared and it
3158 		 * will have same DevHandle value on which this task abort TM
3159 		 * is received and driver will return the TM status as FAILED.
3160 		 */
3161 		request = mpt3sas_base_get_msg_frame(ioc, smid_task);
3162 		if (le16_to_cpu(request->DevHandle) != handle)
3163 			break;
3164 
3165 		ioc_info(ioc, "Task abort tm failed: handle(0x%04x),"
3166 		    "timeout(%d) tr_method(0x%x) smid(%d) msix_index(%d)\n",
3167 		    handle, timeout, tr_method, smid_task, msix_task);
3168 		rc = FAILED;
3169 		break;
3170 
3171 	case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
3172 	case MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET:
3173 	case MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET:
3174 		rc = scsih_tm_post_processing(ioc, handle, channel, id, lun,
3175 		    type, smid_task);
3176 		break;
3177 	case MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK:
3178 		rc = SUCCESS;
3179 		break;
3180 	default:
3181 		rc = FAILED;
3182 		break;
3183 	}
3184 
3185 out:
3186 	mpt3sas_scsih_clear_tm_flag(ioc, handle);
3187 	ioc->tm_cmds.status = MPT3_CMD_NOT_USED;
3188 	return rc;
3189 }
3190 
3191 int mpt3sas_scsih_issue_locked_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle,
3192 		uint channel, uint id, u64 lun, u8 type, u16 smid_task,
3193 		u16 msix_task, u8 timeout, u8 tr_method)
3194 {
3195 	int ret;
3196 
3197 	mutex_lock(&ioc->tm_cmds.mutex);
3198 	ret = mpt3sas_scsih_issue_tm(ioc, handle, channel, id, lun, type,
3199 			smid_task, msix_task, timeout, tr_method);
3200 	mutex_unlock(&ioc->tm_cmds.mutex);
3201 
3202 	return ret;
3203 }
3204 
3205 /**
3206  * _scsih_tm_display_info - displays info about the device
3207  * @ioc: per adapter struct
3208  * @scmd: pointer to scsi command object
3209  *
3210  * Called by task management callback handlers.
3211  */
3212 static void
3213 _scsih_tm_display_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd)
3214 {
3215 	struct scsi_target *starget = scmd->device->sdev_target;
3216 	struct MPT3SAS_TARGET *priv_target = starget->hostdata;
3217 	struct _sas_device *sas_device = NULL;
3218 	struct _pcie_device *pcie_device = NULL;
3219 	unsigned long flags;
3220 	char *device_str = NULL;
3221 
3222 	if (!priv_target)
3223 		return;
3224 	if (ioc->hide_ir_msg)
3225 		device_str = "WarpDrive";
3226 	else
3227 		device_str = "volume";
3228 
3229 	scsi_print_command(scmd);
3230 	if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
3231 		starget_printk(KERN_INFO, starget,
3232 			"%s handle(0x%04x), %s wwid(0x%016llx)\n",
3233 			device_str, priv_target->handle,
3234 		    device_str, (unsigned long long)priv_target->sas_address);
3235 
3236 	} else if (priv_target->flags & MPT_TARGET_FLAGS_PCIE_DEVICE) {
3237 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
3238 		pcie_device = __mpt3sas_get_pdev_from_target(ioc, priv_target);
3239 		if (pcie_device) {
3240 			starget_printk(KERN_INFO, starget,
3241 				"handle(0x%04x), wwid(0x%016llx), port(%d)\n",
3242 				pcie_device->handle,
3243 				(unsigned long long)pcie_device->wwid,
3244 				pcie_device->port_num);
3245 			if (pcie_device->enclosure_handle != 0)
3246 				starget_printk(KERN_INFO, starget,
3247 					"enclosure logical id(0x%016llx), slot(%d)\n",
3248 					(unsigned long long)
3249 					pcie_device->enclosure_logical_id,
3250 					pcie_device->slot);
3251 			if (pcie_device->connector_name[0] != '\0')
3252 				starget_printk(KERN_INFO, starget,
3253 					"enclosure level(0x%04x), connector name( %s)\n",
3254 					pcie_device->enclosure_level,
3255 					pcie_device->connector_name);
3256 			pcie_device_put(pcie_device);
3257 		}
3258 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
3259 
3260 	} else {
3261 		spin_lock_irqsave(&ioc->sas_device_lock, flags);
3262 		sas_device = __mpt3sas_get_sdev_from_target(ioc, priv_target);
3263 		if (sas_device) {
3264 			if (priv_target->flags &
3265 			    MPT_TARGET_FLAGS_RAID_COMPONENT) {
3266 				starget_printk(KERN_INFO, starget,
3267 				    "volume handle(0x%04x), "
3268 				    "volume wwid(0x%016llx)\n",
3269 				    sas_device->volume_handle,
3270 				   (unsigned long long)sas_device->volume_wwid);
3271 			}
3272 			starget_printk(KERN_INFO, starget,
3273 			    "handle(0x%04x), sas_address(0x%016llx), phy(%d)\n",
3274 			    sas_device->handle,
3275 			    (unsigned long long)sas_device->sas_address,
3276 			    sas_device->phy);
3277 
3278 			_scsih_display_enclosure_chassis_info(NULL, sas_device,
3279 			    NULL, starget);
3280 
3281 			sas_device_put(sas_device);
3282 		}
3283 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3284 	}
3285 }
3286 
3287 /**
3288  * scsih_abort - eh threads main abort routine
3289  * @scmd: pointer to scsi command object
3290  *
3291  * Return: SUCCESS if command aborted else FAILED
3292  */
3293 static int
3294 scsih_abort(struct scsi_cmnd *scmd)
3295 {
3296 	struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
3297 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3298 	struct scsiio_tracker *st = scsi_cmd_priv(scmd);
3299 	u16 handle;
3300 	int r;
3301 
3302 	u8 timeout = 30;
3303 	struct _pcie_device *pcie_device = NULL;
3304 	sdev_printk(KERN_INFO, scmd->device, "attempting task abort!"
3305 	    "scmd(0x%p), outstanding for %u ms & timeout %u ms\n",
3306 	    scmd, jiffies_to_msecs(jiffies - scmd->jiffies_at_alloc),
3307 	    (scsi_cmd_to_rq(scmd)->timeout / HZ) * 1000);
3308 	_scsih_tm_display_info(ioc, scmd);
3309 
3310 	sas_device_priv_data = scmd->device->hostdata;
3311 	if (!sas_device_priv_data || !sas_device_priv_data->sas_target ||
3312 	    ioc->remove_host) {
3313 		sdev_printk(KERN_INFO, scmd->device,
3314 		    "device been deleted! scmd(0x%p)\n", scmd);
3315 		scmd->result = DID_NO_CONNECT << 16;
3316 		scsi_done(scmd);
3317 		r = SUCCESS;
3318 		goto out;
3319 	}
3320 
3321 	/* check for completed command */
3322 	if (st == NULL || st->cb_idx == 0xFF) {
3323 		sdev_printk(KERN_INFO, scmd->device, "No reference found at "
3324 		    "driver, assuming scmd(0x%p) might have completed\n", scmd);
3325 		scmd->result = DID_RESET << 16;
3326 		r = SUCCESS;
3327 		goto out;
3328 	}
3329 
3330 	/* for hidden raid components and volumes this is not supported */
3331 	if (sas_device_priv_data->sas_target->flags &
3332 	    MPT_TARGET_FLAGS_RAID_COMPONENT ||
3333 	    sas_device_priv_data->sas_target->flags & MPT_TARGET_FLAGS_VOLUME) {
3334 		scmd->result = DID_RESET << 16;
3335 		r = FAILED;
3336 		goto out;
3337 	}
3338 
3339 	mpt3sas_halt_firmware(ioc);
3340 
3341 	handle = sas_device_priv_data->sas_target->handle;
3342 	pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
3343 	if (pcie_device && (!ioc->tm_custom_handling) &&
3344 	    (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info))))
3345 		timeout = ioc->nvme_abort_timeout;
3346 	r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->channel,
3347 		scmd->device->id, scmd->device->lun,
3348 		MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
3349 		st->smid, st->msix_io, timeout, 0);
3350 	/* Command must be cleared after abort */
3351 	if (r == SUCCESS && st->cb_idx != 0xFF)
3352 		r = FAILED;
3353  out:
3354 	sdev_printk(KERN_INFO, scmd->device, "task abort: %s scmd(0x%p)\n",
3355 	    ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
3356 	if (pcie_device)
3357 		pcie_device_put(pcie_device);
3358 	return r;
3359 }
3360 
3361 /**
3362  * scsih_dev_reset - eh threads main device reset routine
3363  * @scmd: pointer to scsi command object
3364  *
3365  * Return: SUCCESS if command aborted else FAILED
3366  */
3367 static int
3368 scsih_dev_reset(struct scsi_cmnd *scmd)
3369 {
3370 	struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
3371 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3372 	struct _sas_device *sas_device = NULL;
3373 	struct _pcie_device *pcie_device = NULL;
3374 	u16	handle;
3375 	u8	tr_method = 0;
3376 	u8	tr_timeout = 30;
3377 	int r;
3378 
3379 	struct scsi_target *starget = scmd->device->sdev_target;
3380 	struct MPT3SAS_TARGET *target_priv_data = starget->hostdata;
3381 
3382 	sdev_printk(KERN_INFO, scmd->device,
3383 	    "attempting device reset! scmd(0x%p)\n", scmd);
3384 	_scsih_tm_display_info(ioc, scmd);
3385 
3386 	sas_device_priv_data = scmd->device->hostdata;
3387 	if (!sas_device_priv_data || !sas_device_priv_data->sas_target ||
3388 	    ioc->remove_host) {
3389 		sdev_printk(KERN_INFO, scmd->device,
3390 		    "device been deleted! scmd(0x%p)\n", scmd);
3391 		scmd->result = DID_NO_CONNECT << 16;
3392 		scsi_done(scmd);
3393 		r = SUCCESS;
3394 		goto out;
3395 	}
3396 
3397 	/* for hidden raid components obtain the volume_handle */
3398 	handle = 0;
3399 	if (sas_device_priv_data->sas_target->flags &
3400 	    MPT_TARGET_FLAGS_RAID_COMPONENT) {
3401 		sas_device = mpt3sas_get_sdev_from_target(ioc,
3402 				target_priv_data);
3403 		if (sas_device)
3404 			handle = sas_device->volume_handle;
3405 	} else
3406 		handle = sas_device_priv_data->sas_target->handle;
3407 
3408 	if (!handle) {
3409 		scmd->result = DID_RESET << 16;
3410 		r = FAILED;
3411 		goto out;
3412 	}
3413 
3414 	pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
3415 
3416 	if (pcie_device && (!ioc->tm_custom_handling) &&
3417 	    (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info)))) {
3418 		tr_timeout = pcie_device->reset_timeout;
3419 		tr_method = MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
3420 	} else
3421 		tr_method = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
3422 
3423 	r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->channel,
3424 		scmd->device->id, scmd->device->lun,
3425 		MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, 0, 0,
3426 		tr_timeout, tr_method);
3427 	/* Check for busy commands after reset */
3428 	if (r == SUCCESS && scsi_device_busy(scmd->device))
3429 		r = FAILED;
3430  out:
3431 	sdev_printk(KERN_INFO, scmd->device, "device reset: %s scmd(0x%p)\n",
3432 	    ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
3433 
3434 	if (sas_device)
3435 		sas_device_put(sas_device);
3436 	if (pcie_device)
3437 		pcie_device_put(pcie_device);
3438 
3439 	return r;
3440 }
3441 
3442 /**
3443  * scsih_target_reset - eh threads main target reset routine
3444  * @scmd: pointer to scsi command object
3445  *
3446  * Return: SUCCESS if command aborted else FAILED
3447  */
3448 static int
3449 scsih_target_reset(struct scsi_cmnd *scmd)
3450 {
3451 	struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
3452 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3453 	struct _sas_device *sas_device = NULL;
3454 	struct _pcie_device *pcie_device = NULL;
3455 	u16	handle;
3456 	u8	tr_method = 0;
3457 	u8	tr_timeout = 30;
3458 	int r;
3459 	struct scsi_target *starget = scmd->device->sdev_target;
3460 	struct MPT3SAS_TARGET *target_priv_data = starget->hostdata;
3461 
3462 	starget_printk(KERN_INFO, starget,
3463 	    "attempting target reset! scmd(0x%p)\n", scmd);
3464 	_scsih_tm_display_info(ioc, scmd);
3465 
3466 	sas_device_priv_data = scmd->device->hostdata;
3467 	if (!sas_device_priv_data || !sas_device_priv_data->sas_target ||
3468 	    ioc->remove_host) {
3469 		starget_printk(KERN_INFO, starget,
3470 		    "target been deleted! scmd(0x%p)\n", scmd);
3471 		scmd->result = DID_NO_CONNECT << 16;
3472 		scsi_done(scmd);
3473 		r = SUCCESS;
3474 		goto out;
3475 	}
3476 
3477 	/* for hidden raid components obtain the volume_handle */
3478 	handle = 0;
3479 	if (sas_device_priv_data->sas_target->flags &
3480 	    MPT_TARGET_FLAGS_RAID_COMPONENT) {
3481 		sas_device = mpt3sas_get_sdev_from_target(ioc,
3482 				target_priv_data);
3483 		if (sas_device)
3484 			handle = sas_device->volume_handle;
3485 	} else
3486 		handle = sas_device_priv_data->sas_target->handle;
3487 
3488 	if (!handle) {
3489 		scmd->result = DID_RESET << 16;
3490 		r = FAILED;
3491 		goto out;
3492 	}
3493 
3494 	pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
3495 
3496 	if (pcie_device && (!ioc->tm_custom_handling) &&
3497 	    (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info)))) {
3498 		tr_timeout = pcie_device->reset_timeout;
3499 		tr_method = MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
3500 	} else
3501 		tr_method = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
3502 	r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->channel,
3503 		scmd->device->id, 0,
3504 		MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 0,
3505 	    tr_timeout, tr_method);
3506 	/* Check for busy commands after reset */
3507 	if (r == SUCCESS && atomic_read(&starget->target_busy))
3508 		r = FAILED;
3509  out:
3510 	starget_printk(KERN_INFO, starget, "target reset: %s scmd(0x%p)\n",
3511 	    ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
3512 
3513 	if (sas_device)
3514 		sas_device_put(sas_device);
3515 	if (pcie_device)
3516 		pcie_device_put(pcie_device);
3517 	return r;
3518 }
3519 
3520 
3521 /**
3522  * scsih_host_reset - eh threads main host reset routine
3523  * @scmd: pointer to scsi command object
3524  *
3525  * Return: SUCCESS if command aborted else FAILED
3526  */
3527 static int
3528 scsih_host_reset(struct scsi_cmnd *scmd)
3529 {
3530 	struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
3531 	int r, retval;
3532 
3533 	ioc_info(ioc, "attempting host reset! scmd(0x%p)\n", scmd);
3534 	scsi_print_command(scmd);
3535 
3536 	if (ioc->is_driver_loading || ioc->remove_host) {
3537 		ioc_info(ioc, "Blocking the host reset\n");
3538 		r = FAILED;
3539 		goto out;
3540 	}
3541 
3542 	retval = mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
3543 	r = (retval < 0) ? FAILED : SUCCESS;
3544 out:
3545 	ioc_info(ioc, "host reset: %s scmd(0x%p)\n",
3546 		 r == SUCCESS ? "SUCCESS" : "FAILED", scmd);
3547 
3548 	return r;
3549 }
3550 
3551 /**
3552  * _scsih_fw_event_add - insert and queue up fw_event
3553  * @ioc: per adapter object
3554  * @fw_event: object describing the event
3555  * Context: This function will acquire ioc->fw_event_lock.
3556  *
3557  * This adds the firmware event object into link list, then queues it up to
3558  * be processed from user context.
3559  */
3560 static void
3561 _scsih_fw_event_add(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
3562 {
3563 	unsigned long flags;
3564 
3565 	if (ioc->firmware_event_thread == NULL)
3566 		return;
3567 
3568 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
3569 	fw_event_work_get(fw_event);
3570 	INIT_LIST_HEAD(&fw_event->list);
3571 	list_add_tail(&fw_event->list, &ioc->fw_event_list);
3572 	INIT_WORK(&fw_event->work, _firmware_event_work);
3573 	fw_event_work_get(fw_event);
3574 	queue_work(ioc->firmware_event_thread, &fw_event->work);
3575 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
3576 }
3577 
3578 /**
3579  * _scsih_fw_event_del_from_list - delete fw_event from the list
3580  * @ioc: per adapter object
3581  * @fw_event: object describing the event
3582  * Context: This function will acquire ioc->fw_event_lock.
3583  *
3584  * If the fw_event is on the fw_event_list, remove it and do a put.
3585  */
3586 static void
3587 _scsih_fw_event_del_from_list(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work
3588 	*fw_event)
3589 {
3590 	unsigned long flags;
3591 
3592 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
3593 	if (!list_empty(&fw_event->list)) {
3594 		list_del_init(&fw_event->list);
3595 		fw_event_work_put(fw_event);
3596 	}
3597 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
3598 }
3599 
3600 
3601  /**
3602  * mpt3sas_send_trigger_data_event - send event for processing trigger data
3603  * @ioc: per adapter object
3604  * @event_data: trigger event data
3605  */
3606 void
3607 mpt3sas_send_trigger_data_event(struct MPT3SAS_ADAPTER *ioc,
3608 	struct SL_WH_TRIGGERS_EVENT_DATA_T *event_data)
3609 {
3610 	struct fw_event_work *fw_event;
3611 	u16 sz;
3612 
3613 	if (ioc->is_driver_loading)
3614 		return;
3615 	sz = sizeof(*event_data);
3616 	fw_event = alloc_fw_event_work(sz);
3617 	if (!fw_event)
3618 		return;
3619 	fw_event->event = MPT3SAS_PROCESS_TRIGGER_DIAG;
3620 	fw_event->ioc = ioc;
3621 	memcpy(fw_event->event_data, event_data, sizeof(*event_data));
3622 	_scsih_fw_event_add(ioc, fw_event);
3623 	fw_event_work_put(fw_event);
3624 }
3625 
3626 /**
3627  * _scsih_error_recovery_delete_devices - remove devices not responding
3628  * @ioc: per adapter object
3629  */
3630 static void
3631 _scsih_error_recovery_delete_devices(struct MPT3SAS_ADAPTER *ioc)
3632 {
3633 	struct fw_event_work *fw_event;
3634 
3635 	fw_event = alloc_fw_event_work(0);
3636 	if (!fw_event)
3637 		return;
3638 	fw_event->event = MPT3SAS_REMOVE_UNRESPONDING_DEVICES;
3639 	fw_event->ioc = ioc;
3640 	_scsih_fw_event_add(ioc, fw_event);
3641 	fw_event_work_put(fw_event);
3642 }
3643 
3644 /**
3645  * mpt3sas_port_enable_complete - port enable completed (fake event)
3646  * @ioc: per adapter object
3647  */
3648 void
3649 mpt3sas_port_enable_complete(struct MPT3SAS_ADAPTER *ioc)
3650 {
3651 	struct fw_event_work *fw_event;
3652 
3653 	fw_event = alloc_fw_event_work(0);
3654 	if (!fw_event)
3655 		return;
3656 	fw_event->event = MPT3SAS_PORT_ENABLE_COMPLETE;
3657 	fw_event->ioc = ioc;
3658 	_scsih_fw_event_add(ioc, fw_event);
3659 	fw_event_work_put(fw_event);
3660 }
3661 
3662 static struct fw_event_work *dequeue_next_fw_event(struct MPT3SAS_ADAPTER *ioc)
3663 {
3664 	unsigned long flags;
3665 	struct fw_event_work *fw_event = NULL;
3666 
3667 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
3668 	if (!list_empty(&ioc->fw_event_list)) {
3669 		fw_event = list_first_entry(&ioc->fw_event_list,
3670 				struct fw_event_work, list);
3671 		list_del_init(&fw_event->list);
3672 		fw_event_work_put(fw_event);
3673 	}
3674 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
3675 
3676 	return fw_event;
3677 }
3678 
3679 /**
3680  * _scsih_fw_event_cleanup_queue - cleanup event queue
3681  * @ioc: per adapter object
3682  *
3683  * Walk the firmware event queue, either killing timers, or waiting
3684  * for outstanding events to complete
3685  *
3686  * Context: task, can sleep
3687  */
3688 static void
3689 _scsih_fw_event_cleanup_queue(struct MPT3SAS_ADAPTER *ioc)
3690 {
3691 	struct fw_event_work *fw_event;
3692 
3693 	if ((list_empty(&ioc->fw_event_list) && !ioc->current_event) ||
3694 	    !ioc->firmware_event_thread)
3695 		return;
3696 	/*
3697 	 * Set current running event as ignore, so that
3698 	 * current running event will exit quickly.
3699 	 * As diag reset has occurred it is of no use
3700 	 * to process remaining stale event data entries.
3701 	 */
3702 	if (ioc->shost_recovery && ioc->current_event)
3703 		ioc->current_event->ignore = 1;
3704 
3705 	ioc->fw_events_cleanup = 1;
3706 	while ((fw_event = dequeue_next_fw_event(ioc)) ||
3707 	     (fw_event = ioc->current_event)) {
3708 
3709 		/*
3710 		 * Don't call cancel_work_sync() for current_event
3711 		 * other than MPT3SAS_REMOVE_UNRESPONDING_DEVICES;
3712 		 * otherwise we may observe deadlock if current
3713 		 * hard reset issued as part of processing the current_event.
3714 		 *
3715 		 * Orginal logic of cleaning the current_event is added
3716 		 * for handling the back to back host reset issued by the user.
3717 		 * i.e. during back to back host reset, driver use to process
3718 		 * the two instances of MPT3SAS_REMOVE_UNRESPONDING_DEVICES
3719 		 * event back to back and this made the drives to unregister
3720 		 * the devices from SML.
3721 		 */
3722 
3723 		if (fw_event == ioc->current_event &&
3724 		    ioc->current_event->event !=
3725 		    MPT3SAS_REMOVE_UNRESPONDING_DEVICES) {
3726 			ioc->current_event = NULL;
3727 			continue;
3728 		}
3729 
3730 		/*
3731 		 * Driver has to clear ioc->start_scan flag when
3732 		 * it is cleaning up MPT3SAS_PORT_ENABLE_COMPLETE,
3733 		 * otherwise scsi_scan_host() API waits for the
3734 		 * 5 minute timer to expire. If we exit from
3735 		 * scsi_scan_host() early then we can issue the
3736 		 * new port enable request as part of current diag reset.
3737 		 */
3738 		if (fw_event->event == MPT3SAS_PORT_ENABLE_COMPLETE) {
3739 			ioc->port_enable_cmds.status |= MPT3_CMD_RESET;
3740 			ioc->start_scan = 0;
3741 		}
3742 
3743 		/*
3744 		 * Wait on the fw_event to complete. If this returns 1, then
3745 		 * the event was never executed, and we need a put for the
3746 		 * reference the work had on the fw_event.
3747 		 *
3748 		 * If it did execute, we wait for it to finish, and the put will
3749 		 * happen from _firmware_event_work()
3750 		 */
3751 		if (cancel_work_sync(&fw_event->work))
3752 			fw_event_work_put(fw_event);
3753 
3754 	}
3755 	ioc->fw_events_cleanup = 0;
3756 }
3757 
3758 /**
3759  * _scsih_internal_device_block - block the sdev device
3760  * @sdev: per device object
3761  * @sas_device_priv_data : per device driver private data
3762  *
3763  * make sure device is blocked without error, if not
3764  * print an error
3765  */
3766 static void
3767 _scsih_internal_device_block(struct scsi_device *sdev,
3768 			struct MPT3SAS_DEVICE *sas_device_priv_data)
3769 {
3770 	int r = 0;
3771 
3772 	sdev_printk(KERN_INFO, sdev, "device_block, handle(0x%04x)\n",
3773 	    sas_device_priv_data->sas_target->handle);
3774 	sas_device_priv_data->block = 1;
3775 
3776 	r = scsi_internal_device_block_nowait(sdev);
3777 	if (r == -EINVAL)
3778 		sdev_printk(KERN_WARNING, sdev,
3779 		    "device_block failed with return(%d) for handle(0x%04x)\n",
3780 		    r, sas_device_priv_data->sas_target->handle);
3781 }
3782 
3783 /**
3784  * _scsih_internal_device_unblock - unblock the sdev device
3785  * @sdev: per device object
3786  * @sas_device_priv_data : per device driver private data
3787  * make sure device is unblocked without error, if not retry
3788  * by blocking and then unblocking
3789  */
3790 
3791 static void
3792 _scsih_internal_device_unblock(struct scsi_device *sdev,
3793 			struct MPT3SAS_DEVICE *sas_device_priv_data)
3794 {
3795 	int r = 0;
3796 
3797 	sdev_printk(KERN_WARNING, sdev, "device_unblock and setting to running, "
3798 	    "handle(0x%04x)\n", sas_device_priv_data->sas_target->handle);
3799 	sas_device_priv_data->block = 0;
3800 	r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
3801 	if (r == -EINVAL) {
3802 		/* The device has been set to SDEV_RUNNING by SD layer during
3803 		 * device addition but the request queue is still stopped by
3804 		 * our earlier block call. We need to perform a block again
3805 		 * to get the device to SDEV_BLOCK and then to SDEV_RUNNING */
3806 
3807 		sdev_printk(KERN_WARNING, sdev,
3808 		    "device_unblock failed with return(%d) for handle(0x%04x) "
3809 		    "performing a block followed by an unblock\n",
3810 		    r, sas_device_priv_data->sas_target->handle);
3811 		sas_device_priv_data->block = 1;
3812 		r = scsi_internal_device_block_nowait(sdev);
3813 		if (r)
3814 			sdev_printk(KERN_WARNING, sdev, "retried device_block "
3815 			    "failed with return(%d) for handle(0x%04x)\n",
3816 			    r, sas_device_priv_data->sas_target->handle);
3817 
3818 		sas_device_priv_data->block = 0;
3819 		r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
3820 		if (r)
3821 			sdev_printk(KERN_WARNING, sdev, "retried device_unblock"
3822 			    " failed with return(%d) for handle(0x%04x)\n",
3823 			    r, sas_device_priv_data->sas_target->handle);
3824 	}
3825 }
3826 
3827 /**
3828  * _scsih_ublock_io_all_device - unblock every device
3829  * @ioc: per adapter object
3830  *
3831  * change the device state from block to running
3832  */
3833 static void
3834 _scsih_ublock_io_all_device(struct MPT3SAS_ADAPTER *ioc)
3835 {
3836 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3837 	struct scsi_device *sdev;
3838 
3839 	shost_for_each_device(sdev, ioc->shost) {
3840 		sas_device_priv_data = sdev->hostdata;
3841 		if (!sas_device_priv_data)
3842 			continue;
3843 		if (!sas_device_priv_data->block)
3844 			continue;
3845 
3846 		dewtprintk(ioc, sdev_printk(KERN_INFO, sdev,
3847 			"device_running, handle(0x%04x)\n",
3848 		    sas_device_priv_data->sas_target->handle));
3849 		_scsih_internal_device_unblock(sdev, sas_device_priv_data);
3850 	}
3851 }
3852 
3853 
3854 /**
3855  * _scsih_ublock_io_device - prepare device to be deleted
3856  * @ioc: per adapter object
3857  * @sas_address: sas address
3858  * @port: hba port entry
3859  *
3860  * unblock then put device in offline state
3861  */
3862 static void
3863 _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc,
3864 	u64 sas_address, struct hba_port *port)
3865 {
3866 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3867 	struct scsi_device *sdev;
3868 
3869 	shost_for_each_device(sdev, ioc->shost) {
3870 		sas_device_priv_data = sdev->hostdata;
3871 		if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
3872 			continue;
3873 		if (sas_device_priv_data->sas_target->sas_address
3874 		    != sas_address)
3875 			continue;
3876 		if (sas_device_priv_data->sas_target->port != port)
3877 			continue;
3878 		if (sas_device_priv_data->block)
3879 			_scsih_internal_device_unblock(sdev,
3880 				sas_device_priv_data);
3881 	}
3882 }
3883 
3884 /**
3885  * _scsih_block_io_all_device - set the device state to SDEV_BLOCK
3886  * @ioc: per adapter object
3887  *
3888  * During device pull we need to appropriately set the sdev state.
3889  */
3890 static void
3891 _scsih_block_io_all_device(struct MPT3SAS_ADAPTER *ioc)
3892 {
3893 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3894 	struct scsi_device *sdev;
3895 
3896 	shost_for_each_device(sdev, ioc->shost) {
3897 		sas_device_priv_data = sdev->hostdata;
3898 		if (!sas_device_priv_data)
3899 			continue;
3900 		if (sas_device_priv_data->block)
3901 			continue;
3902 		if (sas_device_priv_data->ignore_delay_remove) {
3903 			sdev_printk(KERN_INFO, sdev,
3904 			"%s skip device_block for SES handle(0x%04x)\n",
3905 			__func__, sas_device_priv_data->sas_target->handle);
3906 			continue;
3907 		}
3908 		_scsih_internal_device_block(sdev, sas_device_priv_data);
3909 	}
3910 }
3911 
3912 /**
3913  * _scsih_block_io_device - set the device state to SDEV_BLOCK
3914  * @ioc: per adapter object
3915  * @handle: device handle
3916  *
3917  * During device pull we need to appropriately set the sdev state.
3918  */
3919 static void
3920 _scsih_block_io_device(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3921 {
3922 	struct MPT3SAS_DEVICE *sas_device_priv_data;
3923 	struct scsi_device *sdev;
3924 	struct _sas_device *sas_device;
3925 
3926 	sas_device = mpt3sas_get_sdev_by_handle(ioc, handle);
3927 
3928 	shost_for_each_device(sdev, ioc->shost) {
3929 		sas_device_priv_data = sdev->hostdata;
3930 		if (!sas_device_priv_data)
3931 			continue;
3932 		if (sas_device_priv_data->sas_target->handle != handle)
3933 			continue;
3934 		if (sas_device_priv_data->block)
3935 			continue;
3936 		if (sas_device && sas_device->pend_sas_rphy_add)
3937 			continue;
3938 		if (sas_device_priv_data->ignore_delay_remove) {
3939 			sdev_printk(KERN_INFO, sdev,
3940 			"%s skip device_block for SES handle(0x%04x)\n",
3941 			__func__, sas_device_priv_data->sas_target->handle);
3942 			continue;
3943 		}
3944 		_scsih_internal_device_block(sdev, sas_device_priv_data);
3945 	}
3946 
3947 	if (sas_device)
3948 		sas_device_put(sas_device);
3949 }
3950 
3951 /**
3952  * _scsih_block_io_to_children_attached_to_ex
3953  * @ioc: per adapter object
3954  * @sas_expander: the sas_device object
3955  *
3956  * This routine set sdev state to SDEV_BLOCK for all devices
3957  * attached to this expander. This function called when expander is
3958  * pulled.
3959  */
3960 static void
3961 _scsih_block_io_to_children_attached_to_ex(struct MPT3SAS_ADAPTER *ioc,
3962 	struct _sas_node *sas_expander)
3963 {
3964 	struct _sas_port *mpt3sas_port;
3965 	struct _sas_device *sas_device;
3966 	struct _sas_node *expander_sibling;
3967 	unsigned long flags;
3968 
3969 	if (!sas_expander)
3970 		return;
3971 
3972 	list_for_each_entry(mpt3sas_port,
3973 	   &sas_expander->sas_port_list, port_list) {
3974 		if (mpt3sas_port->remote_identify.device_type ==
3975 		    SAS_END_DEVICE) {
3976 			spin_lock_irqsave(&ioc->sas_device_lock, flags);
3977 			sas_device = __mpt3sas_get_sdev_by_addr(ioc,
3978 			    mpt3sas_port->remote_identify.sas_address,
3979 			    mpt3sas_port->hba_port);
3980 			if (sas_device) {
3981 				set_bit(sas_device->handle,
3982 						ioc->blocking_handles);
3983 				sas_device_put(sas_device);
3984 			}
3985 			spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3986 		}
3987 	}
3988 
3989 	list_for_each_entry(mpt3sas_port,
3990 	   &sas_expander->sas_port_list, port_list) {
3991 
3992 		if (mpt3sas_port->remote_identify.device_type ==
3993 		    SAS_EDGE_EXPANDER_DEVICE ||
3994 		    mpt3sas_port->remote_identify.device_type ==
3995 		    SAS_FANOUT_EXPANDER_DEVICE) {
3996 			expander_sibling =
3997 			    mpt3sas_scsih_expander_find_by_sas_address(
3998 			    ioc, mpt3sas_port->remote_identify.sas_address,
3999 			    mpt3sas_port->hba_port);
4000 			_scsih_block_io_to_children_attached_to_ex(ioc,
4001 			    expander_sibling);
4002 		}
4003 	}
4004 }
4005 
4006 /**
4007  * _scsih_block_io_to_children_attached_directly
4008  * @ioc: per adapter object
4009  * @event_data: topology change event data
4010  *
4011  * This routine set sdev state to SDEV_BLOCK for all devices
4012  * direct attached during device pull.
4013  */
4014 static void
4015 _scsih_block_io_to_children_attached_directly(struct MPT3SAS_ADAPTER *ioc,
4016 	Mpi2EventDataSasTopologyChangeList_t *event_data)
4017 {
4018 	int i;
4019 	u16 handle;
4020 	u16 reason_code;
4021 
4022 	for (i = 0; i < event_data->NumEntries; i++) {
4023 		handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
4024 		if (!handle)
4025 			continue;
4026 		reason_code = event_data->PHY[i].PhyStatus &
4027 		    MPI2_EVENT_SAS_TOPO_RC_MASK;
4028 		if (reason_code == MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING)
4029 			_scsih_block_io_device(ioc, handle);
4030 	}
4031 }
4032 
4033 /**
4034  * _scsih_block_io_to_pcie_children_attached_directly
4035  * @ioc: per adapter object
4036  * @event_data: topology change event data
4037  *
4038  * This routine set sdev state to SDEV_BLOCK for all devices
4039  * direct attached during device pull/reconnect.
4040  */
4041 static void
4042 _scsih_block_io_to_pcie_children_attached_directly(struct MPT3SAS_ADAPTER *ioc,
4043 		Mpi26EventDataPCIeTopologyChangeList_t *event_data)
4044 {
4045 	int i;
4046 	u16 handle;
4047 	u16 reason_code;
4048 
4049 	for (i = 0; i < event_data->NumEntries; i++) {
4050 		handle =
4051 			le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
4052 		if (!handle)
4053 			continue;
4054 		reason_code = event_data->PortEntry[i].PortStatus;
4055 		if (reason_code ==
4056 				MPI26_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING)
4057 			_scsih_block_io_device(ioc, handle);
4058 	}
4059 }
4060 /**
4061  * _scsih_tm_tr_send - send task management request
4062  * @ioc: per adapter object
4063  * @handle: device handle
4064  * Context: interrupt time.
4065  *
4066  * This code is to initiate the device removal handshake protocol
4067  * with controller firmware.  This function will issue target reset
4068  * using high priority request queue.  It will send a sas iounit
4069  * control request (MPI2_SAS_OP_REMOVE_DEVICE) from this completion.
4070  *
4071  * This is designed to send muliple task management request at the same
4072  * time to the fifo. If the fifo is full, we will append the request,
4073  * and process it in a future completion.
4074  */
4075 static void
4076 _scsih_tm_tr_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
4077 {
4078 	Mpi2SCSITaskManagementRequest_t *mpi_request;
4079 	u16 smid;
4080 	struct _sas_device *sas_device = NULL;
4081 	struct _pcie_device *pcie_device = NULL;
4082 	struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
4083 	u64 sas_address = 0;
4084 	unsigned long flags;
4085 	struct _tr_list *delayed_tr;
4086 	u32 ioc_state;
4087 	u8 tr_method = 0;
4088 	struct hba_port *port = NULL;
4089 
4090 	if (ioc->pci_error_recovery) {
4091 		dewtprintk(ioc,
4092 			   ioc_info(ioc, "%s: host in pci error recovery: handle(0x%04x)\n",
4093 				    __func__, handle));
4094 		return;
4095 	}
4096 	ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
4097 	if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
4098 		dewtprintk(ioc,
4099 			   ioc_info(ioc, "%s: host is not operational: handle(0x%04x)\n",
4100 				    __func__, handle));
4101 		return;
4102 	}
4103 
4104 	/* if PD, then return */
4105 	if (test_bit(handle, ioc->pd_handles))
4106 		return;
4107 
4108 	clear_bit(handle, ioc->pend_os_device_add);
4109 
4110 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
4111 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
4112 	if (sas_device && sas_device->starget &&
4113 	    sas_device->starget->hostdata) {
4114 		sas_target_priv_data = sas_device->starget->hostdata;
4115 		sas_target_priv_data->deleted = 1;
4116 		sas_address = sas_device->sas_address;
4117 		port = sas_device->port;
4118 	}
4119 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4120 	if (!sas_device) {
4121 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
4122 		pcie_device = __mpt3sas_get_pdev_by_handle(ioc, handle);
4123 		if (pcie_device && pcie_device->starget &&
4124 			pcie_device->starget->hostdata) {
4125 			sas_target_priv_data = pcie_device->starget->hostdata;
4126 			sas_target_priv_data->deleted = 1;
4127 			sas_address = pcie_device->wwid;
4128 		}
4129 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
4130 		if (pcie_device && (!ioc->tm_custom_handling) &&
4131 		    (!(mpt3sas_scsih_is_pcie_scsi_device(
4132 		    pcie_device->device_info))))
4133 			tr_method =
4134 			    MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
4135 		else
4136 			tr_method = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
4137 	}
4138 	if (sas_target_priv_data) {
4139 		dewtprintk(ioc,
4140 			   ioc_info(ioc, "setting delete flag: handle(0x%04x), sas_addr(0x%016llx)\n",
4141 				    handle, (u64)sas_address));
4142 		if (sas_device) {
4143 			if (sas_device->enclosure_handle != 0)
4144 				dewtprintk(ioc,
4145 					   ioc_info(ioc, "setting delete flag:enclosure logical id(0x%016llx), slot(%d)\n",
4146 						    (u64)sas_device->enclosure_logical_id,
4147 						    sas_device->slot));
4148 			if (sas_device->connector_name[0] != '\0')
4149 				dewtprintk(ioc,
4150 					   ioc_info(ioc, "setting delete flag: enclosure level(0x%04x), connector name( %s)\n",
4151 						    sas_device->enclosure_level,
4152 						    sas_device->connector_name));
4153 		} else if (pcie_device) {
4154 			if (pcie_device->enclosure_handle != 0)
4155 				dewtprintk(ioc,
4156 					   ioc_info(ioc, "setting delete flag: logical id(0x%016llx), slot(%d)\n",
4157 						    (u64)pcie_device->enclosure_logical_id,
4158 						    pcie_device->slot));
4159 			if (pcie_device->connector_name[0] != '\0')
4160 				dewtprintk(ioc,
4161 					   ioc_info(ioc, "setting delete flag:, enclosure level(0x%04x), connector name( %s)\n",
4162 						    pcie_device->enclosure_level,
4163 						    pcie_device->connector_name));
4164 		}
4165 		_scsih_ublock_io_device(ioc, sas_address, port);
4166 		sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
4167 	}
4168 
4169 	smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx);
4170 	if (!smid) {
4171 		delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
4172 		if (!delayed_tr)
4173 			goto out;
4174 		INIT_LIST_HEAD(&delayed_tr->list);
4175 		delayed_tr->handle = handle;
4176 		list_add_tail(&delayed_tr->list, &ioc->delayed_tr_list);
4177 		dewtprintk(ioc,
4178 			   ioc_info(ioc, "DELAYED:tr:handle(0x%04x), (open)\n",
4179 				    handle));
4180 		goto out;
4181 	}
4182 
4183 	dewtprintk(ioc,
4184 		   ioc_info(ioc, "tr_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
4185 			    handle, smid, ioc->tm_tr_cb_idx));
4186 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4187 	memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
4188 	mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
4189 	mpi_request->DevHandle = cpu_to_le16(handle);
4190 	mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
4191 	mpi_request->MsgFlags = tr_method;
4192 	set_bit(handle, ioc->device_remove_in_progress);
4193 	ioc->put_smid_hi_priority(ioc, smid, 0);
4194 	mpt3sas_trigger_master(ioc, MASTER_TRIGGER_DEVICE_REMOVAL);
4195 
4196 out:
4197 	if (sas_device)
4198 		sas_device_put(sas_device);
4199 	if (pcie_device)
4200 		pcie_device_put(pcie_device);
4201 }
4202 
4203 /**
4204  * _scsih_tm_tr_complete -
4205  * @ioc: per adapter object
4206  * @smid: system request message index
4207  * @msix_index: MSIX table index supplied by the OS
4208  * @reply: reply message frame(lower 32bit addr)
4209  * Context: interrupt time.
4210  *
4211  * This is the target reset completion routine.
4212  * This code is part of the code to initiate the device removal
4213  * handshake protocol with controller firmware.
4214  * It will send a sas iounit control request (MPI2_SAS_OP_REMOVE_DEVICE)
4215  *
4216  * Return: 1 meaning mf should be freed from _base_interrupt
4217  *         0 means the mf is freed from this function.
4218  */
4219 static u8
4220 _scsih_tm_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
4221 	u32 reply)
4222 {
4223 	u16 handle;
4224 	Mpi2SCSITaskManagementRequest_t *mpi_request_tm;
4225 	Mpi2SCSITaskManagementReply_t *mpi_reply =
4226 	    mpt3sas_base_get_reply_virt_addr(ioc, reply);
4227 	Mpi2SasIoUnitControlRequest_t *mpi_request;
4228 	u16 smid_sas_ctrl;
4229 	u32 ioc_state;
4230 	struct _sc_list *delayed_sc;
4231 
4232 	if (ioc->pci_error_recovery) {
4233 		dewtprintk(ioc,
4234 			   ioc_info(ioc, "%s: host in pci error recovery\n",
4235 				    __func__));
4236 		return 1;
4237 	}
4238 	ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
4239 	if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
4240 		dewtprintk(ioc,
4241 			   ioc_info(ioc, "%s: host is not operational\n",
4242 				    __func__));
4243 		return 1;
4244 	}
4245 	if (unlikely(!mpi_reply)) {
4246 		ioc_err(ioc, "mpi_reply not valid at %s:%d/%s()!\n",
4247 			__FILE__, __LINE__, __func__);
4248 		return 1;
4249 	}
4250 	mpi_request_tm = mpt3sas_base_get_msg_frame(ioc, smid);
4251 	handle = le16_to_cpu(mpi_request_tm->DevHandle);
4252 	if (handle != le16_to_cpu(mpi_reply->DevHandle)) {
4253 		dewtprintk(ioc,
4254 			   ioc_err(ioc, "spurious interrupt: handle(0x%04x:0x%04x), smid(%d)!!!\n",
4255 				   handle,
4256 				   le16_to_cpu(mpi_reply->DevHandle), smid));
4257 		return 0;
4258 	}
4259 
4260 	mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
4261 	dewtprintk(ioc,
4262 		   ioc_info(ioc, "tr_complete:handle(0x%04x), (open) smid(%d), ioc_status(0x%04x), loginfo(0x%08x), completed(%d)\n",
4263 			    handle, smid, le16_to_cpu(mpi_reply->IOCStatus),
4264 			    le32_to_cpu(mpi_reply->IOCLogInfo),
4265 			    le32_to_cpu(mpi_reply->TerminationCount)));
4266 
4267 	smid_sas_ctrl = mpt3sas_base_get_smid(ioc, ioc->tm_sas_control_cb_idx);
4268 	if (!smid_sas_ctrl) {
4269 		delayed_sc = kzalloc(sizeof(*delayed_sc), GFP_ATOMIC);
4270 		if (!delayed_sc)
4271 			return _scsih_check_for_pending_tm(ioc, smid);
4272 		INIT_LIST_HEAD(&delayed_sc->list);
4273 		delayed_sc->handle = le16_to_cpu(mpi_request_tm->DevHandle);
4274 		list_add_tail(&delayed_sc->list, &ioc->delayed_sc_list);
4275 		dewtprintk(ioc,
4276 			   ioc_info(ioc, "DELAYED:sc:handle(0x%04x), (open)\n",
4277 				    handle));
4278 		return _scsih_check_for_pending_tm(ioc, smid);
4279 	}
4280 
4281 	dewtprintk(ioc,
4282 		   ioc_info(ioc, "sc_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
4283 			    handle, smid_sas_ctrl, ioc->tm_sas_control_cb_idx));
4284 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid_sas_ctrl);
4285 	memset(mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t));
4286 	mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
4287 	mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
4288 	mpi_request->DevHandle = mpi_request_tm->DevHandle;
4289 	ioc->put_smid_default(ioc, smid_sas_ctrl);
4290 
4291 	return _scsih_check_for_pending_tm(ioc, smid);
4292 }
4293 
4294 /** _scsih_allow_scmd_to_device - check whether scmd needs to
4295  *				 issue to IOC or not.
4296  * @ioc: per adapter object
4297  * @scmd: pointer to scsi command object
4298  *
4299  * Returns true if scmd can be issued to IOC otherwise returns false.
4300  */
4301 inline bool _scsih_allow_scmd_to_device(struct MPT3SAS_ADAPTER *ioc,
4302 	struct scsi_cmnd *scmd)
4303 {
4304 
4305 	if (ioc->pci_error_recovery)
4306 		return false;
4307 
4308 	if (ioc->hba_mpi_version_belonged == MPI2_VERSION) {
4309 		if (ioc->remove_host)
4310 			return false;
4311 
4312 		return true;
4313 	}
4314 
4315 	if (ioc->remove_host) {
4316 
4317 		switch (scmd->cmnd[0]) {
4318 		case SYNCHRONIZE_CACHE:
4319 		case START_STOP:
4320 			return true;
4321 		default:
4322 			return false;
4323 		}
4324 	}
4325 
4326 	return true;
4327 }
4328 
4329 /**
4330  * _scsih_sas_control_complete - completion routine
4331  * @ioc: per adapter object
4332  * @smid: system request message index
4333  * @msix_index: MSIX table index supplied by the OS
4334  * @reply: reply message frame(lower 32bit addr)
4335  * Context: interrupt time.
4336  *
4337  * This is the sas iounit control completion routine.
4338  * This code is part of the code to initiate the device removal
4339  * handshake protocol with controller firmware.
4340  *
4341  * Return: 1 meaning mf should be freed from _base_interrupt
4342  *         0 means the mf is freed from this function.
4343  */
4344 static u8
4345 _scsih_sas_control_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid,
4346 	u8 msix_index, u32 reply)
4347 {
4348 	Mpi2SasIoUnitControlReply_t *mpi_reply =
4349 	    mpt3sas_base_get_reply_virt_addr(ioc, reply);
4350 
4351 	if (likely(mpi_reply)) {
4352 		dewtprintk(ioc,
4353 			   ioc_info(ioc, "sc_complete:handle(0x%04x), (open) smid(%d), ioc_status(0x%04x), loginfo(0x%08x)\n",
4354 				    le16_to_cpu(mpi_reply->DevHandle), smid,
4355 				    le16_to_cpu(mpi_reply->IOCStatus),
4356 				    le32_to_cpu(mpi_reply->IOCLogInfo)));
4357 		if (le16_to_cpu(mpi_reply->IOCStatus) ==
4358 		     MPI2_IOCSTATUS_SUCCESS) {
4359 			clear_bit(le16_to_cpu(mpi_reply->DevHandle),
4360 			    ioc->device_remove_in_progress);
4361 		}
4362 	} else {
4363 		ioc_err(ioc, "mpi_reply not valid at %s:%d/%s()!\n",
4364 			__FILE__, __LINE__, __func__);
4365 	}
4366 	return mpt3sas_check_for_pending_internal_cmds(ioc, smid);
4367 }
4368 
4369 /**
4370  * _scsih_tm_tr_volume_send - send target reset request for volumes
4371  * @ioc: per adapter object
4372  * @handle: device handle
4373  * Context: interrupt time.
4374  *
4375  * This is designed to send muliple task management request at the same
4376  * time to the fifo. If the fifo is full, we will append the request,
4377  * and process it in a future completion.
4378  */
4379 static void
4380 _scsih_tm_tr_volume_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
4381 {
4382 	Mpi2SCSITaskManagementRequest_t *mpi_request;
4383 	u16 smid;
4384 	struct _tr_list *delayed_tr;
4385 
4386 	if (ioc->pci_error_recovery) {
4387 		dewtprintk(ioc,
4388 			   ioc_info(ioc, "%s: host reset in progress!\n",
4389 				    __func__));
4390 		return;
4391 	}
4392 
4393 	smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_tr_volume_cb_idx);
4394 	if (!smid) {
4395 		delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
4396 		if (!delayed_tr)
4397 			return;
4398 		INIT_LIST_HEAD(&delayed_tr->list);
4399 		delayed_tr->handle = handle;
4400 		list_add_tail(&delayed_tr->list, &ioc->delayed_tr_volume_list);
4401 		dewtprintk(ioc,
4402 			   ioc_info(ioc, "DELAYED:tr:handle(0x%04x), (open)\n",
4403 				    handle));
4404 		return;
4405 	}
4406 
4407 	dewtprintk(ioc,
4408 		   ioc_info(ioc, "tr_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
4409 			    handle, smid, ioc->tm_tr_volume_cb_idx));
4410 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4411 	memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
4412 	mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
4413 	mpi_request->DevHandle = cpu_to_le16(handle);
4414 	mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
4415 	ioc->put_smid_hi_priority(ioc, smid, 0);
4416 }
4417 
4418 /**
4419  * _scsih_tm_volume_tr_complete - target reset completion
4420  * @ioc: per adapter object
4421  * @smid: system request message index
4422  * @msix_index: MSIX table index supplied by the OS
4423  * @reply: reply message frame(lower 32bit addr)
4424  * Context: interrupt time.
4425  *
4426  * Return: 1 meaning mf should be freed from _base_interrupt
4427  *         0 means the mf is freed from this function.
4428  */
4429 static u8
4430 _scsih_tm_volume_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid,
4431 	u8 msix_index, u32 reply)
4432 {
4433 	u16 handle;
4434 	Mpi2SCSITaskManagementRequest_t *mpi_request_tm;
4435 	Mpi2SCSITaskManagementReply_t *mpi_reply =
4436 	    mpt3sas_base_get_reply_virt_addr(ioc, reply);
4437 
4438 	if (ioc->shost_recovery || ioc->pci_error_recovery) {
4439 		dewtprintk(ioc,
4440 			   ioc_info(ioc, "%s: host reset in progress!\n",
4441 				    __func__));
4442 		return 1;
4443 	}
4444 	if (unlikely(!mpi_reply)) {
4445 		ioc_err(ioc, "mpi_reply not valid at %s:%d/%s()!\n",
4446 			__FILE__, __LINE__, __func__);
4447 		return 1;
4448 	}
4449 
4450 	mpi_request_tm = mpt3sas_base_get_msg_frame(ioc, smid);
4451 	handle = le16_to_cpu(mpi_request_tm->DevHandle);
4452 	if (handle != le16_to_cpu(mpi_reply->DevHandle)) {
4453 		dewtprintk(ioc,
4454 			   ioc_err(ioc, "spurious interrupt: handle(0x%04x:0x%04x), smid(%d)!!!\n",
4455 				   handle, le16_to_cpu(mpi_reply->DevHandle),
4456 				   smid));
4457 		return 0;
4458 	}
4459 
4460 	dewtprintk(ioc,
4461 		   ioc_info(ioc, "tr_complete:handle(0x%04x), (open) smid(%d), ioc_status(0x%04x), loginfo(0x%08x), completed(%d)\n",
4462 			    handle, smid, le16_to_cpu(mpi_reply->IOCStatus),
4463 			    le32_to_cpu(mpi_reply->IOCLogInfo),
4464 			    le32_to_cpu(mpi_reply->TerminationCount)));
4465 
4466 	return _scsih_check_for_pending_tm(ioc, smid);
4467 }
4468 
4469 /**
4470  * _scsih_issue_delayed_event_ack - issue delayed Event ACK messages
4471  * @ioc: per adapter object
4472  * @smid: system request message index
4473  * @event: Event ID
4474  * @event_context: used to track events uniquely
4475  *
4476  * Context - processed in interrupt context.
4477  */
4478 static void
4479 _scsih_issue_delayed_event_ack(struct MPT3SAS_ADAPTER *ioc, u16 smid, U16 event,
4480 				U32 event_context)
4481 {
4482 	Mpi2EventAckRequest_t *ack_request;
4483 	int i = smid - ioc->internal_smid;
4484 	unsigned long flags;
4485 
4486 	/* Without releasing the smid just update the
4487 	 * call back index and reuse the same smid for
4488 	 * processing this delayed request
4489 	 */
4490 	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
4491 	ioc->internal_lookup[i].cb_idx = ioc->base_cb_idx;
4492 	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
4493 
4494 	dewtprintk(ioc,
4495 		   ioc_info(ioc, "EVENT ACK: event(0x%04x), smid(%d), cb(%d)\n",
4496 			    le16_to_cpu(event), smid, ioc->base_cb_idx));
4497 	ack_request = mpt3sas_base_get_msg_frame(ioc, smid);
4498 	memset(ack_request, 0, sizeof(Mpi2EventAckRequest_t));
4499 	ack_request->Function = MPI2_FUNCTION_EVENT_ACK;
4500 	ack_request->Event = event;
4501 	ack_request->EventContext = event_context;
4502 	ack_request->VF_ID = 0;  /* TODO */
4503 	ack_request->VP_ID = 0;
4504 	ioc->put_smid_default(ioc, smid);
4505 }
4506 
4507 /**
4508  * _scsih_issue_delayed_sas_io_unit_ctrl - issue delayed
4509  *				sas_io_unit_ctrl messages
4510  * @ioc: per adapter object
4511  * @smid: system request message index
4512  * @handle: device handle
4513  *
4514  * Context - processed in interrupt context.
4515  */
4516 static void
4517 _scsih_issue_delayed_sas_io_unit_ctrl(struct MPT3SAS_ADAPTER *ioc,
4518 					u16 smid, u16 handle)
4519 {
4520 	Mpi2SasIoUnitControlRequest_t *mpi_request;
4521 	u32 ioc_state;
4522 	int i = smid - ioc->internal_smid;
4523 	unsigned long flags;
4524 
4525 	if (ioc->remove_host) {
4526 		dewtprintk(ioc,
4527 			   ioc_info(ioc, "%s: host has been removed\n",
4528 				    __func__));
4529 		return;
4530 	} else if (ioc->pci_error_recovery) {
4531 		dewtprintk(ioc,
4532 			   ioc_info(ioc, "%s: host in pci error recovery\n",
4533 				    __func__));
4534 		return;
4535 	}
4536 	ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
4537 	if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
4538 		dewtprintk(ioc,
4539 			   ioc_info(ioc, "%s: host is not operational\n",
4540 				    __func__));
4541 		return;
4542 	}
4543 
4544 	/* Without releasing the smid just update the
4545 	 * call back index and reuse the same smid for
4546 	 * processing this delayed request
4547 	 */
4548 	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
4549 	ioc->internal_lookup[i].cb_idx = ioc->tm_sas_control_cb_idx;
4550 	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
4551 
4552 	dewtprintk(ioc,
4553 		   ioc_info(ioc, "sc_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
4554 			    handle, smid, ioc->tm_sas_control_cb_idx));
4555 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4556 	memset(mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t));
4557 	mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
4558 	mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
4559 	mpi_request->DevHandle = cpu_to_le16(handle);
4560 	ioc->put_smid_default(ioc, smid);
4561 }
4562 
4563 /**
4564  * mpt3sas_check_for_pending_internal_cmds - check for pending internal messages
4565  * @ioc: per adapter object
4566  * @smid: system request message index
4567  *
4568  * Context: Executed in interrupt context
4569  *
4570  * This will check delayed internal messages list, and process the
4571  * next request.
4572  *
4573  * Return: 1 meaning mf should be freed from _base_interrupt
4574  *         0 means the mf is freed from this function.
4575  */
4576 u8
4577 mpt3sas_check_for_pending_internal_cmds(struct MPT3SAS_ADAPTER *ioc, u16 smid)
4578 {
4579 	struct _sc_list *delayed_sc;
4580 	struct _event_ack_list *delayed_event_ack;
4581 
4582 	if (!list_empty(&ioc->delayed_event_ack_list)) {
4583 		delayed_event_ack = list_entry(ioc->delayed_event_ack_list.next,
4584 						struct _event_ack_list, list);
4585 		_scsih_issue_delayed_event_ack(ioc, smid,
4586 		  delayed_event_ack->Event, delayed_event_ack->EventContext);
4587 		list_del(&delayed_event_ack->list);
4588 		kfree(delayed_event_ack);
4589 		return 0;
4590 	}
4591 
4592 	if (!list_empty(&ioc->delayed_sc_list)) {
4593 		delayed_sc = list_entry(ioc->delayed_sc_list.next,
4594 						struct _sc_list, list);
4595 		_scsih_issue_delayed_sas_io_unit_ctrl(ioc, smid,
4596 						 delayed_sc->handle);
4597 		list_del(&delayed_sc->list);
4598 		kfree(delayed_sc);
4599 		return 0;
4600 	}
4601 	return 1;
4602 }
4603 
4604 /**
4605  * _scsih_check_for_pending_tm - check for pending task management
4606  * @ioc: per adapter object
4607  * @smid: system request message index
4608  *
4609  * This will check delayed target reset list, and feed the
4610  * next reqeust.
4611  *
4612  * Return: 1 meaning mf should be freed from _base_interrupt
4613  *         0 means the mf is freed from this function.
4614  */
4615 static u8
4616 _scsih_check_for_pending_tm(struct MPT3SAS_ADAPTER *ioc, u16 smid)
4617 {
4618 	struct _tr_list *delayed_tr;
4619 
4620 	if (!list_empty(&ioc->delayed_tr_volume_list)) {
4621 		delayed_tr = list_entry(ioc->delayed_tr_volume_list.next,
4622 		    struct _tr_list, list);
4623 		mpt3sas_base_free_smid(ioc, smid);
4624 		_scsih_tm_tr_volume_send(ioc, delayed_tr->handle);
4625 		list_del(&delayed_tr->list);
4626 		kfree(delayed_tr);
4627 		return 0;
4628 	}
4629 
4630 	if (!list_empty(&ioc->delayed_tr_list)) {
4631 		delayed_tr = list_entry(ioc->delayed_tr_list.next,
4632 		    struct _tr_list, list);
4633 		mpt3sas_base_free_smid(ioc, smid);
4634 		_scsih_tm_tr_send(ioc, delayed_tr->handle);
4635 		list_del(&delayed_tr->list);
4636 		kfree(delayed_tr);
4637 		return 0;
4638 	}
4639 
4640 	return 1;
4641 }
4642 
4643 /**
4644  * _scsih_check_topo_delete_events - sanity check on topo events
4645  * @ioc: per adapter object
4646  * @event_data: the event data payload
4647  *
4648  * This routine added to better handle cable breaker.
4649  *
4650  * This handles the case where driver receives multiple expander
4651  * add and delete events in a single shot.  When there is a delete event
4652  * the routine will void any pending add events waiting in the event queue.
4653  */
4654 static void
4655 _scsih_check_topo_delete_events(struct MPT3SAS_ADAPTER *ioc,
4656 	Mpi2EventDataSasTopologyChangeList_t *event_data)
4657 {
4658 	struct fw_event_work *fw_event;
4659 	Mpi2EventDataSasTopologyChangeList_t *local_event_data;
4660 	u16 expander_handle;
4661 	struct _sas_node *sas_expander;
4662 	unsigned long flags;
4663 	int i, reason_code;
4664 	u16 handle;
4665 
4666 	for (i = 0 ; i < event_data->NumEntries; i++) {
4667 		handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
4668 		if (!handle)
4669 			continue;
4670 		reason_code = event_data->PHY[i].PhyStatus &
4671 		    MPI2_EVENT_SAS_TOPO_RC_MASK;
4672 		if (reason_code == MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING)
4673 			_scsih_tm_tr_send(ioc, handle);
4674 	}
4675 
4676 	expander_handle = le16_to_cpu(event_data->ExpanderDevHandle);
4677 	if (expander_handle < ioc->sas_hba.num_phys) {
4678 		_scsih_block_io_to_children_attached_directly(ioc, event_data);
4679 		return;
4680 	}
4681 	if (event_data->ExpStatus ==
4682 	    MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING) {
4683 		/* put expander attached devices into blocking state */
4684 		spin_lock_irqsave(&ioc->sas_node_lock, flags);
4685 		sas_expander = mpt3sas_scsih_expander_find_by_handle(ioc,
4686 		    expander_handle);
4687 		_scsih_block_io_to_children_attached_to_ex(ioc, sas_expander);
4688 		spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
4689 		do {
4690 			handle = find_first_bit(ioc->blocking_handles,
4691 			    ioc->facts.MaxDevHandle);
4692 			if (handle < ioc->facts.MaxDevHandle)
4693 				_scsih_block_io_device(ioc, handle);
4694 		} while (test_and_clear_bit(handle, ioc->blocking_handles));
4695 	} else if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_RESPONDING)
4696 		_scsih_block_io_to_children_attached_directly(ioc, event_data);
4697 
4698 	if (event_data->ExpStatus != MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING)
4699 		return;
4700 
4701 	/* mark ignore flag for pending events */
4702 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
4703 	list_for_each_entry(fw_event, &ioc->fw_event_list, list) {
4704 		if (fw_event->event != MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST ||
4705 		    fw_event->ignore)
4706 			continue;
4707 		local_event_data = (Mpi2EventDataSasTopologyChangeList_t *)
4708 				   fw_event->event_data;
4709 		if (local_event_data->ExpStatus ==
4710 		    MPI2_EVENT_SAS_TOPO_ES_ADDED ||
4711 		    local_event_data->ExpStatus ==
4712 		    MPI2_EVENT_SAS_TOPO_ES_RESPONDING) {
4713 			if (le16_to_cpu(local_event_data->ExpanderDevHandle) ==
4714 			    expander_handle) {
4715 				dewtprintk(ioc,
4716 					   ioc_info(ioc, "setting ignoring flag\n"));
4717 				fw_event->ignore = 1;
4718 			}
4719 		}
4720 	}
4721 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
4722 }
4723 
4724 /**
4725  * _scsih_check_pcie_topo_remove_events - sanity check on topo
4726  * events
4727  * @ioc: per adapter object
4728  * @event_data: the event data payload
4729  *
4730  * This handles the case where driver receives multiple switch
4731  * or device add and delete events in a single shot.  When there
4732  * is a delete event the routine will void any pending add
4733  * events waiting in the event queue.
4734  */
4735 static void
4736 _scsih_check_pcie_topo_remove_events(struct MPT3SAS_ADAPTER *ioc,
4737 	Mpi26EventDataPCIeTopologyChangeList_t *event_data)
4738 {
4739 	struct fw_event_work *fw_event;
4740 	Mpi26EventDataPCIeTopologyChangeList_t *local_event_data;
4741 	unsigned long flags;
4742 	int i, reason_code;
4743 	u16 handle, switch_handle;
4744 
4745 	for (i = 0; i < event_data->NumEntries; i++) {
4746 		handle =
4747 			le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
4748 		if (!handle)
4749 			continue;
4750 		reason_code = event_data->PortEntry[i].PortStatus;
4751 		if (reason_code == MPI26_EVENT_PCIE_TOPO_PS_NOT_RESPONDING)
4752 			_scsih_tm_tr_send(ioc, handle);
4753 	}
4754 
4755 	switch_handle = le16_to_cpu(event_data->SwitchDevHandle);
4756 	if (!switch_handle) {
4757 		_scsih_block_io_to_pcie_children_attached_directly(
4758 							ioc, event_data);
4759 		return;
4760 	}
4761     /* TODO We are not supporting cascaded PCIe Switch removal yet*/
4762 	if ((event_data->SwitchStatus
4763 		== MPI26_EVENT_PCIE_TOPO_SS_DELAY_NOT_RESPONDING) ||
4764 		(event_data->SwitchStatus ==
4765 					MPI26_EVENT_PCIE_TOPO_SS_RESPONDING))
4766 		_scsih_block_io_to_pcie_children_attached_directly(
4767 							ioc, event_data);
4768 
4769 	if (event_data->SwitchStatus != MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING)
4770 		return;
4771 
4772 	/* mark ignore flag for pending events */
4773 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
4774 	list_for_each_entry(fw_event, &ioc->fw_event_list, list) {
4775 		if (fw_event->event != MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST ||
4776 			fw_event->ignore)
4777 			continue;
4778 		local_event_data =
4779 			(Mpi26EventDataPCIeTopologyChangeList_t *)
4780 			fw_event->event_data;
4781 		if (local_event_data->SwitchStatus ==
4782 		    MPI2_EVENT_SAS_TOPO_ES_ADDED ||
4783 		    local_event_data->SwitchStatus ==
4784 		    MPI2_EVENT_SAS_TOPO_ES_RESPONDING) {
4785 			if (le16_to_cpu(local_event_data->SwitchDevHandle) ==
4786 				switch_handle) {
4787 				dewtprintk(ioc,
4788 					   ioc_info(ioc, "setting ignoring flag for switch event\n"));
4789 				fw_event->ignore = 1;
4790 			}
4791 		}
4792 	}
4793 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
4794 }
4795 
4796 /**
4797  * _scsih_set_volume_delete_flag - setting volume delete flag
4798  * @ioc: per adapter object
4799  * @handle: device handle
4800  *
4801  * This returns nothing.
4802  */
4803 static void
4804 _scsih_set_volume_delete_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
4805 {
4806 	struct _raid_device *raid_device;
4807 	struct MPT3SAS_TARGET *sas_target_priv_data;
4808 	unsigned long flags;
4809 
4810 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
4811 	raid_device = mpt3sas_raid_device_find_by_handle(ioc, handle);
4812 	if (raid_device && raid_device->starget &&
4813 	    raid_device->starget->hostdata) {
4814 		sas_target_priv_data =
4815 		    raid_device->starget->hostdata;
4816 		sas_target_priv_data->deleted = 1;
4817 		dewtprintk(ioc,
4818 			   ioc_info(ioc, "setting delete flag: handle(0x%04x), wwid(0x%016llx)\n",
4819 				    handle, (u64)raid_device->wwid));
4820 	}
4821 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
4822 }
4823 
4824 /**
4825  * _scsih_set_volume_handle_for_tr - set handle for target reset to volume
4826  * @handle: input handle
4827  * @a: handle for volume a
4828  * @b: handle for volume b
4829  *
4830  * IR firmware only supports two raid volumes.  The purpose of this
4831  * routine is to set the volume handle in either a or b. When the given
4832  * input handle is non-zero, or when a and b have not been set before.
4833  */
4834 static void
4835 _scsih_set_volume_handle_for_tr(u16 handle, u16 *a, u16 *b)
4836 {
4837 	if (!handle || handle == *a || handle == *b)
4838 		return;
4839 	if (!*a)
4840 		*a = handle;
4841 	else if (!*b)
4842 		*b = handle;
4843 }
4844 
4845 /**
4846  * _scsih_check_ir_config_unhide_events - check for UNHIDE events
4847  * @ioc: per adapter object
4848  * @event_data: the event data payload
4849  * Context: interrupt time.
4850  *
4851  * This routine will send target reset to volume, followed by target
4852  * resets to the PDs. This is called when a PD has been removed, or
4853  * volume has been deleted or removed. When the target reset is sent
4854  * to volume, the PD target resets need to be queued to start upon
4855  * completion of the volume target reset.
4856  */
4857 static void
4858 _scsih_check_ir_config_unhide_events(struct MPT3SAS_ADAPTER *ioc,
4859 	Mpi2EventDataIrConfigChangeList_t *event_data)
4860 {
4861 	Mpi2EventIrConfigElement_t *element;
4862 	int i;
4863 	u16 handle, volume_handle, a, b;
4864 	struct _tr_list *delayed_tr;
4865 
4866 	a = 0;
4867 	b = 0;
4868 
4869 	if (ioc->is_warpdrive)
4870 		return;
4871 
4872 	/* Volume Resets for Deleted or Removed */
4873 	element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
4874 	for (i = 0; i < event_data->NumElements; i++, element++) {
4875 		if (le32_to_cpu(event_data->Flags) &
4876 		    MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
4877 			continue;
4878 		if (element->ReasonCode ==
4879 		    MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED ||
4880 		    element->ReasonCode ==
4881 		    MPI2_EVENT_IR_CHANGE_RC_REMOVED) {
4882 			volume_handle = le16_to_cpu(element->VolDevHandle);
4883 			_scsih_set_volume_delete_flag(ioc, volume_handle);
4884 			_scsih_set_volume_handle_for_tr(volume_handle, &a, &b);
4885 		}
4886 	}
4887 
4888 	/* Volume Resets for UNHIDE events */
4889 	element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
4890 	for (i = 0; i < event_data->NumElements; i++, element++) {
4891 		if (le32_to_cpu(event_data->Flags) &
4892 		    MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
4893 			continue;
4894 		if (element->ReasonCode == MPI2_EVENT_IR_CHANGE_RC_UNHIDE) {
4895 			volume_handle = le16_to_cpu(element->VolDevHandle);
4896 			_scsih_set_volume_handle_for_tr(volume_handle, &a, &b);
4897 		}
4898 	}
4899 
4900 	if (a)
4901 		_scsih_tm_tr_volume_send(ioc, a);
4902 	if (b)
4903 		_scsih_tm_tr_volume_send(ioc, b);
4904 
4905 	/* PD target resets */
4906 	element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
4907 	for (i = 0; i < event_data->NumElements; i++, element++) {
4908 		if (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_UNHIDE)
4909 			continue;
4910 		handle = le16_to_cpu(element->PhysDiskDevHandle);
4911 		volume_handle = le16_to_cpu(element->VolDevHandle);
4912 		clear_bit(handle, ioc->pd_handles);
4913 		if (!volume_handle)
4914 			_scsih_tm_tr_send(ioc, handle);
4915 		else if (volume_handle == a || volume_handle == b) {
4916 			delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
4917 			BUG_ON(!delayed_tr);
4918 			INIT_LIST_HEAD(&delayed_tr->list);
4919 			delayed_tr->handle = handle;
4920 			list_add_tail(&delayed_tr->list, &ioc->delayed_tr_list);
4921 			dewtprintk(ioc,
4922 				   ioc_info(ioc, "DELAYED:tr:handle(0x%04x), (open)\n",
4923 					    handle));
4924 		} else
4925 			_scsih_tm_tr_send(ioc, handle);
4926 	}
4927 }
4928 
4929 
4930 /**
4931  * _scsih_check_volume_delete_events - set delete flag for volumes
4932  * @ioc: per adapter object
4933  * @event_data: the event data payload
4934  * Context: interrupt time.
4935  *
4936  * This will handle the case when the cable connected to entire volume is
4937  * pulled. We will take care of setting the deleted flag so normal IO will
4938  * not be sent.
4939  */
4940 static void
4941 _scsih_check_volume_delete_events(struct MPT3SAS_ADAPTER *ioc,
4942 	Mpi2EventDataIrVolume_t *event_data)
4943 {
4944 	u32 state;
4945 
4946 	if (event_data->ReasonCode != MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED)
4947 		return;
4948 	state = le32_to_cpu(event_data->NewValue);
4949 	if (state == MPI2_RAID_VOL_STATE_MISSING || state ==
4950 	    MPI2_RAID_VOL_STATE_FAILED)
4951 		_scsih_set_volume_delete_flag(ioc,
4952 		    le16_to_cpu(event_data->VolDevHandle));
4953 }
4954 
4955 /**
4956  * _scsih_temp_threshold_events - display temperature threshold exceeded events
4957  * @ioc: per adapter object
4958  * @event_data: the temp threshold event data
4959  * Context: interrupt time.
4960  */
4961 static void
4962 _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc,
4963 	Mpi2EventDataTemperature_t *event_data)
4964 {
4965 	u32 doorbell;
4966 	if (ioc->temp_sensors_count >= event_data->SensorNum) {
4967 		ioc_err(ioc, "Temperature Threshold flags %s%s%s%s exceeded for Sensor: %d !!!\n",
4968 			le16_to_cpu(event_data->Status) & 0x1 ? "0 " : " ",
4969 			le16_to_cpu(event_data->Status) & 0x2 ? "1 " : " ",
4970 			le16_to_cpu(event_data->Status) & 0x4 ? "2 " : " ",
4971 			le16_to_cpu(event_data->Status) & 0x8 ? "3 " : " ",
4972 			event_data->SensorNum);
4973 		ioc_err(ioc, "Current Temp In Celsius: %d\n",
4974 			event_data->CurrentTemperature);
4975 		if (ioc->hba_mpi_version_belonged != MPI2_VERSION) {
4976 			doorbell = mpt3sas_base_get_iocstate(ioc, 0);
4977 			if ((doorbell & MPI2_IOC_STATE_MASK) ==
4978 			    MPI2_IOC_STATE_FAULT) {
4979 				mpt3sas_print_fault_code(ioc,
4980 				    doorbell & MPI2_DOORBELL_DATA_MASK);
4981 			} else if ((doorbell & MPI2_IOC_STATE_MASK) ==
4982 			    MPI2_IOC_STATE_COREDUMP) {
4983 				mpt3sas_print_coredump_info(ioc,
4984 				    doorbell & MPI2_DOORBELL_DATA_MASK);
4985 			}
4986 		}
4987 	}
4988 }
4989 
4990 static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending)
4991 {
4992 	struct MPT3SAS_DEVICE *priv = scmd->device->hostdata;
4993 
4994 	if (scmd->cmnd[0] != ATA_12 && scmd->cmnd[0] != ATA_16)
4995 		return 0;
4996 
4997 	if (pending)
4998 		return test_and_set_bit(0, &priv->ata_command_pending);
4999 
5000 	clear_bit(0, &priv->ata_command_pending);
5001 	return 0;
5002 }
5003 
5004 /**
5005  * _scsih_flush_running_cmds - completing outstanding commands.
5006  * @ioc: per adapter object
5007  *
5008  * The flushing out of all pending scmd commands following host reset,
5009  * where all IO is dropped to the floor.
5010  */
5011 static void
5012 _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
5013 {
5014 	struct scsi_cmnd *scmd;
5015 	struct scsiio_tracker *st;
5016 	u16 smid;
5017 	int count = 0;
5018 
5019 	for (smid = 1; smid <= ioc->scsiio_depth; smid++) {
5020 		scmd = mpt3sas_scsih_scsi_lookup_get(ioc, smid);
5021 		if (!scmd)
5022 			continue;
5023 		count++;
5024 		_scsih_set_satl_pending(scmd, false);
5025 		st = scsi_cmd_priv(scmd);
5026 		mpt3sas_base_clear_st(ioc, st);
5027 		scsi_dma_unmap(scmd);
5028 		if (ioc->pci_error_recovery || ioc->remove_host)
5029 			scmd->result = DID_NO_CONNECT << 16;
5030 		else
5031 			scmd->result = DID_RESET << 16;
5032 		scsi_done(scmd);
5033 	}
5034 	dtmprintk(ioc, ioc_info(ioc, "completing %d cmds\n", count));
5035 }
5036 
5037 /**
5038  * _scsih_setup_eedp - setup MPI request for EEDP transfer
5039  * @ioc: per adapter object
5040  * @scmd: pointer to scsi command object
5041  * @mpi_request: pointer to the SCSI_IO request message frame
5042  *
5043  * Supporting protection 1 and 3.
5044  */
5045 static void
5046 _scsih_setup_eedp(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
5047 	Mpi25SCSIIORequest_t *mpi_request)
5048 {
5049 	u16 eedp_flags;
5050 	Mpi25SCSIIORequest_t *mpi_request_3v =
5051 	   (Mpi25SCSIIORequest_t *)mpi_request;
5052 
5053 	switch (scsi_get_prot_op(scmd)) {
5054 	case SCSI_PROT_READ_STRIP:
5055 		eedp_flags = MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP;
5056 		break;
5057 	case SCSI_PROT_WRITE_INSERT:
5058 		eedp_flags = MPI2_SCSIIO_EEDPFLAGS_INSERT_OP;
5059 		break;
5060 	default:
5061 		return;
5062 	}
5063 
5064 	if (scmd->prot_flags & SCSI_PROT_GUARD_CHECK)
5065 		eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD;
5066 
5067 	if (scmd->prot_flags & SCSI_PROT_REF_CHECK)
5068 		eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG;
5069 
5070 	if (scmd->prot_flags & SCSI_PROT_REF_INCREMENT) {
5071 		eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG;
5072 
5073 		mpi_request->CDB.EEDP32.PrimaryReferenceTag =
5074 			cpu_to_be32(scsi_prot_ref_tag(scmd));
5075 	}
5076 
5077 	mpi_request_3v->EEDPBlockSize = cpu_to_le16(scsi_prot_interval(scmd));
5078 
5079 	if (ioc->is_gen35_ioc)
5080 		eedp_flags |= MPI25_SCSIIO_EEDPFLAGS_APPTAG_DISABLE_MODE;
5081 	mpi_request->EEDPFlags = cpu_to_le16(eedp_flags);
5082 }
5083 
5084 /**
5085  * _scsih_eedp_error_handling - return sense code for EEDP errors
5086  * @scmd: pointer to scsi command object
5087  * @ioc_status: ioc status
5088  */
5089 static void
5090 _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
5091 {
5092 	u8 ascq;
5093 
5094 	switch (ioc_status) {
5095 	case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
5096 		ascq = 0x01;
5097 		break;
5098 	case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
5099 		ascq = 0x02;
5100 		break;
5101 	case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
5102 		ascq = 0x03;
5103 		break;
5104 	default:
5105 		ascq = 0x00;
5106 		break;
5107 	}
5108 	scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x10, ascq);
5109 	set_host_byte(scmd, DID_ABORT);
5110 }
5111 
5112 /**
5113  * scsih_qcmd - main scsi request entry point
5114  * @shost: SCSI host pointer
5115  * @scmd: pointer to scsi command object
5116  *
5117  * The callback index is set inside `ioc->scsi_io_cb_idx`.
5118  *
5119  * Return: 0 on success.  If there's a failure, return either:
5120  * SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or
5121  * SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full
5122  */
5123 static int
5124 scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
5125 {
5126 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
5127 	struct MPT3SAS_DEVICE *sas_device_priv_data;
5128 	struct MPT3SAS_TARGET *sas_target_priv_data;
5129 	struct _raid_device *raid_device;
5130 	struct request *rq = scsi_cmd_to_rq(scmd);
5131 	int class;
5132 	Mpi25SCSIIORequest_t *mpi_request;
5133 	struct _pcie_device *pcie_device = NULL;
5134 	u32 mpi_control;
5135 	u16 smid;
5136 	u16 handle;
5137 
5138 	if (ioc->logging_level & MPT_DEBUG_SCSI)
5139 		scsi_print_command(scmd);
5140 
5141 	sas_device_priv_data = scmd->device->hostdata;
5142 	if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
5143 		scmd->result = DID_NO_CONNECT << 16;
5144 		scsi_done(scmd);
5145 		return 0;
5146 	}
5147 
5148 	if (!(_scsih_allow_scmd_to_device(ioc, scmd))) {
5149 		scmd->result = DID_NO_CONNECT << 16;
5150 		scsi_done(scmd);
5151 		return 0;
5152 	}
5153 
5154 	sas_target_priv_data = sas_device_priv_data->sas_target;
5155 
5156 	/* invalid device handle */
5157 	handle = sas_target_priv_data->handle;
5158 
5159 	/*
5160 	 * Avoid error handling escallation when device is disconnected
5161 	 */
5162 	if (handle == MPT3SAS_INVALID_DEVICE_HANDLE || sas_device_priv_data->block) {
5163 		if (scmd->device->host->shost_state == SHOST_RECOVERY &&
5164 		    scmd->cmnd[0] == TEST_UNIT_READY) {
5165 			scsi_build_sense(scmd, 0, UNIT_ATTENTION, 0x29, 0x07);
5166 			scsi_done(scmd);
5167 			return 0;
5168 		}
5169 	}
5170 
5171 	if (handle == MPT3SAS_INVALID_DEVICE_HANDLE) {
5172 		scmd->result = DID_NO_CONNECT << 16;
5173 		scsi_done(scmd);
5174 		return 0;
5175 	}
5176 
5177 
5178 	if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress) {
5179 		/* host recovery or link resets sent via IOCTLs */
5180 		return SCSI_MLQUEUE_HOST_BUSY;
5181 	} else if (sas_target_priv_data->deleted) {
5182 		/* device has been deleted */
5183 		scmd->result = DID_NO_CONNECT << 16;
5184 		scsi_done(scmd);
5185 		return 0;
5186 	} else if (sas_target_priv_data->tm_busy ||
5187 		   sas_device_priv_data->block) {
5188 		/* device busy with task management */
5189 		return SCSI_MLQUEUE_DEVICE_BUSY;
5190 	}
5191 
5192 	/*
5193 	 * Bug work around for firmware SATL handling.  The loop
5194 	 * is based on atomic operations and ensures consistency
5195 	 * since we're lockless at this point
5196 	 */
5197 	do {
5198 		if (test_bit(0, &sas_device_priv_data->ata_command_pending))
5199 			return SCSI_MLQUEUE_DEVICE_BUSY;
5200 	} while (_scsih_set_satl_pending(scmd, true));
5201 
5202 	if (scmd->sc_data_direction == DMA_FROM_DEVICE)
5203 		mpi_control = MPI2_SCSIIO_CONTROL_READ;
5204 	else if (scmd->sc_data_direction == DMA_TO_DEVICE)
5205 		mpi_control = MPI2_SCSIIO_CONTROL_WRITE;
5206 	else
5207 		mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER;
5208 
5209 	/* set tags */
5210 	mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
5211 	/* NCQ Prio supported, make sure control indicated high priority */
5212 	if (sas_device_priv_data->ncq_prio_enable) {
5213 		class = IOPRIO_PRIO_CLASS(req_get_ioprio(rq));
5214 		if (class == IOPRIO_CLASS_RT)
5215 			mpi_control |= 1 << MPI2_SCSIIO_CONTROL_CMDPRI_SHIFT;
5216 	}
5217 	/* Make sure Device is not raid volume.
5218 	 * We do not expose raid functionality to upper layer for warpdrive.
5219 	 */
5220 	if (((!ioc->is_warpdrive && !scsih_is_raid(&scmd->device->sdev_gendev))
5221 		&& !scsih_is_nvme(&scmd->device->sdev_gendev))
5222 		&& sas_is_tlr_enabled(scmd->device) && scmd->cmd_len != 32)
5223 		mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON;
5224 
5225 	smid = mpt3sas_base_get_smid_scsiio(ioc, ioc->scsi_io_cb_idx, scmd);
5226 	if (!smid) {
5227 		ioc_err(ioc, "%s: failed obtaining a smid\n", __func__);
5228 		_scsih_set_satl_pending(scmd, false);
5229 		goto out;
5230 	}
5231 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
5232 	memset(mpi_request, 0, ioc->request_sz);
5233 	_scsih_setup_eedp(ioc, scmd, mpi_request);
5234 
5235 	if (scmd->cmd_len == 32)
5236 		mpi_control |= 4 << MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT;
5237 	mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
5238 	if (sas_device_priv_data->sas_target->flags &
5239 	    MPT_TARGET_FLAGS_RAID_COMPONENT)
5240 		mpi_request->Function = MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
5241 	else
5242 		mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
5243 	mpi_request->DevHandle = cpu_to_le16(handle);
5244 	mpi_request->DataLength = cpu_to_le32(scsi_bufflen(scmd));
5245 	mpi_request->Control = cpu_to_le32(mpi_control);
5246 	mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len);
5247 	mpi_request->MsgFlags = MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR;
5248 	mpi_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE;
5249 	mpi_request->SenseBufferLowAddress =
5250 	    mpt3sas_base_get_sense_buffer_dma(ioc, smid);
5251 	mpi_request->SGLOffset0 = offsetof(Mpi25SCSIIORequest_t, SGL) / 4;
5252 	int_to_scsilun(sas_device_priv_data->lun, (struct scsi_lun *)
5253 	    mpi_request->LUN);
5254 	memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
5255 
5256 	if (mpi_request->DataLength) {
5257 		pcie_device = sas_target_priv_data->pcie_dev;
5258 		if (ioc->build_sg_scmd(ioc, scmd, smid, pcie_device)) {
5259 			mpt3sas_base_free_smid(ioc, smid);
5260 			_scsih_set_satl_pending(scmd, false);
5261 			goto out;
5262 		}
5263 	} else
5264 		ioc->build_zero_len_sge(ioc, &mpi_request->SGL);
5265 
5266 	raid_device = sas_target_priv_data->raid_device;
5267 	if (raid_device && raid_device->direct_io_enabled)
5268 		mpt3sas_setup_direct_io(ioc, scmd,
5269 			raid_device, mpi_request);
5270 
5271 	if (likely(mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST)) {
5272 		if (sas_target_priv_data->flags & MPT_TARGET_FASTPATH_IO) {
5273 			mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len |
5274 			    MPI25_SCSIIO_IOFLAGS_FAST_PATH);
5275 			ioc->put_smid_fast_path(ioc, smid, handle);
5276 		} else
5277 			ioc->put_smid_scsi_io(ioc, smid,
5278 			    le16_to_cpu(mpi_request->DevHandle));
5279 	} else
5280 		ioc->put_smid_default(ioc, smid);
5281 	return 0;
5282 
5283  out:
5284 	return SCSI_MLQUEUE_HOST_BUSY;
5285 }
5286 
5287 /**
5288  * _scsih_normalize_sense - normalize descriptor and fixed format sense data
5289  * @sense_buffer: sense data returned by target
5290  * @data: normalized skey/asc/ascq
5291  */
5292 static void
5293 _scsih_normalize_sense(char *sense_buffer, struct sense_info *data)
5294 {
5295 	if ((sense_buffer[0] & 0x7F) >= 0x72) {
5296 		/* descriptor format */
5297 		data->skey = sense_buffer[1] & 0x0F;
5298 		data->asc = sense_buffer[2];
5299 		data->ascq = sense_buffer[3];
5300 	} else {
5301 		/* fixed format */
5302 		data->skey = sense_buffer[2] & 0x0F;
5303 		data->asc = sense_buffer[12];
5304 		data->ascq = sense_buffer[13];
5305 	}
5306 }
5307 
5308 /**
5309  * _scsih_scsi_ioc_info - translated non-successful SCSI_IO request
5310  * @ioc: per adapter object
5311  * @scmd: pointer to scsi command object
5312  * @mpi_reply: reply mf payload returned from firmware
5313  * @smid: ?
5314  *
5315  * scsi_status - SCSI Status code returned from target device
5316  * scsi_state - state info associated with SCSI_IO determined by ioc
5317  * ioc_status - ioc supplied status info
5318  */
5319 static void
5320 _scsih_scsi_ioc_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
5321 	Mpi2SCSIIOReply_t *mpi_reply, u16 smid)
5322 {
5323 	u32 response_info;
5324 	u8 *response_bytes;
5325 	u16 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) &
5326 	    MPI2_IOCSTATUS_MASK;
5327 	u8 scsi_state = mpi_reply->SCSIState;
5328 	u8 scsi_status = mpi_reply->SCSIStatus;
5329 	char *desc_ioc_state = NULL;
5330 	char *desc_scsi_status = NULL;
5331 	char *desc_scsi_state = ioc->tmp_string;
5332 	u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo);
5333 	struct _sas_device *sas_device = NULL;
5334 	struct _pcie_device *pcie_device = NULL;
5335 	struct scsi_target *starget = scmd->device->sdev_target;
5336 	struct MPT3SAS_TARGET *priv_target = starget->hostdata;
5337 	char *device_str = NULL;
5338 
5339 	if (!priv_target)
5340 		return;
5341 	if (ioc->hide_ir_msg)
5342 		device_str = "WarpDrive";
5343 	else
5344 		device_str = "volume";
5345 
5346 	if (log_info == 0x31170000)
5347 		return;
5348 
5349 	switch (ioc_status) {
5350 	case MPI2_IOCSTATUS_SUCCESS:
5351 		desc_ioc_state = "success";
5352 		break;
5353 	case MPI2_IOCSTATUS_INVALID_FUNCTION:
5354 		desc_ioc_state = "invalid function";
5355 		break;
5356 	case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
5357 		desc_ioc_state = "scsi recovered error";
5358 		break;
5359 	case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE:
5360 		desc_ioc_state = "scsi invalid dev handle";
5361 		break;
5362 	case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
5363 		desc_ioc_state = "scsi device not there";
5364 		break;
5365 	case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
5366 		desc_ioc_state = "scsi data overrun";
5367 		break;
5368 	case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN:
5369 		desc_ioc_state = "scsi data underrun";
5370 		break;
5371 	case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR:
5372 		desc_ioc_state = "scsi io data error";
5373 		break;
5374 	case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
5375 		desc_ioc_state = "scsi protocol error";
5376 		break;
5377 	case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
5378 		desc_ioc_state = "scsi task terminated";
5379 		break;
5380 	case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
5381 		desc_ioc_state = "scsi residual mismatch";
5382 		break;
5383 	case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
5384 		desc_ioc_state = "scsi task mgmt failed";
5385 		break;
5386 	case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
5387 		desc_ioc_state = "scsi ioc terminated";
5388 		break;
5389 	case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
5390 		desc_ioc_state = "scsi ext terminated";
5391 		break;
5392 	case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
5393 		desc_ioc_state = "eedp guard error";
5394 		break;
5395 	case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
5396 		desc_ioc_state = "eedp ref tag error";
5397 		break;
5398 	case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
5399 		desc_ioc_state = "eedp app tag error";
5400 		break;
5401 	case MPI2_IOCSTATUS_INSUFFICIENT_POWER:
5402 		desc_ioc_state = "insufficient power";
5403 		break;
5404 	default:
5405 		desc_ioc_state = "unknown";
5406 		break;
5407 	}
5408 
5409 	switch (scsi_status) {
5410 	case MPI2_SCSI_STATUS_GOOD:
5411 		desc_scsi_status = "good";
5412 		break;
5413 	case MPI2_SCSI_STATUS_CHECK_CONDITION:
5414 		desc_scsi_status = "check condition";
5415 		break;
5416 	case MPI2_SCSI_STATUS_CONDITION_MET:
5417 		desc_scsi_status = "condition met";
5418 		break;
5419 	case MPI2_SCSI_STATUS_BUSY:
5420 		desc_scsi_status = "busy";
5421 		break;
5422 	case MPI2_SCSI_STATUS_INTERMEDIATE:
5423 		desc_scsi_status = "intermediate";
5424 		break;
5425 	case MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET:
5426 		desc_scsi_status = "intermediate condmet";
5427 		break;
5428 	case MPI2_SCSI_STATUS_RESERVATION_CONFLICT:
5429 		desc_scsi_status = "reservation conflict";
5430 		break;
5431 	case MPI2_SCSI_STATUS_COMMAND_TERMINATED:
5432 		desc_scsi_status = "command terminated";
5433 		break;
5434 	case MPI2_SCSI_STATUS_TASK_SET_FULL:
5435 		desc_scsi_status = "task set full";
5436 		break;
5437 	case MPI2_SCSI_STATUS_ACA_ACTIVE:
5438 		desc_scsi_status = "aca active";
5439 		break;
5440 	case MPI2_SCSI_STATUS_TASK_ABORTED:
5441 		desc_scsi_status = "task aborted";
5442 		break;
5443 	default:
5444 		desc_scsi_status = "unknown";
5445 		break;
5446 	}
5447 
5448 	desc_scsi_state[0] = '\0';
5449 	if (!scsi_state)
5450 		desc_scsi_state = " ";
5451 	if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID)
5452 		strcat(desc_scsi_state, "response info ");
5453 	if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
5454 		strcat(desc_scsi_state, "state terminated ");
5455 	if (scsi_state & MPI2_SCSI_STATE_NO_SCSI_STATUS)
5456 		strcat(desc_scsi_state, "no status ");
5457 	if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_FAILED)
5458 		strcat(desc_scsi_state, "autosense failed ");
5459 	if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID)
5460 		strcat(desc_scsi_state, "autosense valid ");
5461 
5462 	scsi_print_command(scmd);
5463 
5464 	if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
5465 		ioc_warn(ioc, "\t%s wwid(0x%016llx)\n",
5466 			 device_str, (u64)priv_target->sas_address);
5467 	} else if (priv_target->flags & MPT_TARGET_FLAGS_PCIE_DEVICE) {
5468 		pcie_device = mpt3sas_get_pdev_from_target(ioc, priv_target);
5469 		if (pcie_device) {
5470 			ioc_info(ioc, "\twwid(0x%016llx), port(%d)\n",
5471 				 (u64)pcie_device->wwid, pcie_device->port_num);
5472 			if (pcie_device->enclosure_handle != 0)
5473 				ioc_info(ioc, "\tenclosure logical id(0x%016llx), slot(%d)\n",
5474 					 (u64)pcie_device->enclosure_logical_id,
5475 					 pcie_device->slot);
5476 			if (pcie_device->connector_name[0])
5477 				ioc_info(ioc, "\tenclosure level(0x%04x), connector name( %s)\n",
5478 					 pcie_device->enclosure_level,
5479 					 pcie_device->connector_name);
5480 			pcie_device_put(pcie_device);
5481 		}
5482 	} else {
5483 		sas_device = mpt3sas_get_sdev_from_target(ioc, priv_target);
5484 		if (sas_device) {
5485 			ioc_warn(ioc, "\tsas_address(0x%016llx), phy(%d)\n",
5486 				 (u64)sas_device->sas_address, sas_device->phy);
5487 
5488 			_scsih_display_enclosure_chassis_info(ioc, sas_device,
5489 			    NULL, NULL);
5490 
5491 			sas_device_put(sas_device);
5492 		}
5493 	}
5494 
5495 	ioc_warn(ioc, "\thandle(0x%04x), ioc_status(%s)(0x%04x), smid(%d)\n",
5496 		 le16_to_cpu(mpi_reply->DevHandle),
5497 		 desc_ioc_state, ioc_status, smid);
5498 	ioc_warn(ioc, "\trequest_len(%d), underflow(%d), resid(%d)\n",
5499 		 scsi_bufflen(scmd), scmd->underflow, scsi_get_resid(scmd));
5500 	ioc_warn(ioc, "\ttag(%d), transfer_count(%d), sc->result(0x%08x)\n",
5501 		 le16_to_cpu(mpi_reply->TaskTag),
5502 		 le32_to_cpu(mpi_reply->TransferCount), scmd->result);
5503 	ioc_warn(ioc, "\tscsi_status(%s)(0x%02x), scsi_state(%s)(0x%02x)\n",
5504 		 desc_scsi_status, scsi_status, desc_scsi_state, scsi_state);
5505 
5506 	if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
5507 		struct sense_info data;
5508 		_scsih_normalize_sense(scmd->sense_buffer, &data);
5509 		ioc_warn(ioc, "\t[sense_key,asc,ascq]: [0x%02x,0x%02x,0x%02x], count(%d)\n",
5510 			 data.skey, data.asc, data.ascq,
5511 			 le32_to_cpu(mpi_reply->SenseCount));
5512 	}
5513 	if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
5514 		response_info = le32_to_cpu(mpi_reply->ResponseInfo);
5515 		response_bytes = (u8 *)&response_info;
5516 		_scsih_response_code(ioc, response_bytes[0]);
5517 	}
5518 }
5519 
5520 /**
5521  * _scsih_turn_on_pfa_led - illuminate PFA LED
5522  * @ioc: per adapter object
5523  * @handle: device handle
5524  * Context: process
5525  */
5526 static void
5527 _scsih_turn_on_pfa_led(struct MPT3SAS_ADAPTER *ioc, u16 handle)
5528 {
5529 	Mpi2SepReply_t mpi_reply;
5530 	Mpi2SepRequest_t mpi_request;
5531 	struct _sas_device *sas_device;
5532 
5533 	sas_device = mpt3sas_get_sdev_by_handle(ioc, handle);
5534 	if (!sas_device)
5535 		return;
5536 
5537 	memset(&mpi_request, 0, sizeof(Mpi2SepRequest_t));
5538 	mpi_request.Function = MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR;
5539 	mpi_request.Action = MPI2_SEP_REQ_ACTION_WRITE_STATUS;
5540 	mpi_request.SlotStatus =
5541 	    cpu_to_le32(MPI2_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT);
5542 	mpi_request.DevHandle = cpu_to_le16(handle);
5543 	mpi_request.Flags = MPI2_SEP_REQ_FLAGS_DEVHANDLE_ADDRESS;
5544 	if ((mpt3sas_base_scsi_enclosure_processor(ioc, &mpi_reply,
5545 	    &mpi_request)) != 0) {
5546 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
5547 			__FILE__, __LINE__, __func__);
5548 		goto out;
5549 	}
5550 	sas_device->pfa_led_on = 1;
5551 
5552 	if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) {
5553 		dewtprintk(ioc,
5554 			   ioc_info(ioc, "enclosure_processor: ioc_status (0x%04x), loginfo(0x%08x)\n",
5555 				    le16_to_cpu(mpi_reply.IOCStatus),
5556 				    le32_to_cpu(mpi_reply.IOCLogInfo)));
5557 		goto out;
5558 	}
5559 out:
5560 	sas_device_put(sas_device);
5561 }
5562 
5563 /**
5564  * _scsih_turn_off_pfa_led - turn off Fault LED
5565  * @ioc: per adapter object
5566  * @sas_device: sas device whose PFA LED has to turned off
5567  * Context: process
5568  */
5569 static void
5570 _scsih_turn_off_pfa_led(struct MPT3SAS_ADAPTER *ioc,
5571 	struct _sas_device *sas_device)
5572 {
5573 	Mpi2SepReply_t mpi_reply;
5574 	Mpi2SepRequest_t mpi_request;
5575 
5576 	memset(&mpi_request, 0, sizeof(Mpi2SepRequest_t));
5577 	mpi_request.Function = MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR;
5578 	mpi_request.Action = MPI2_SEP_REQ_ACTION_WRITE_STATUS;
5579 	mpi_request.SlotStatus = 0;
5580 	mpi_request.Slot = cpu_to_le16(sas_device->slot);
5581 	mpi_request.DevHandle = 0;
5582 	mpi_request.EnclosureHandle = cpu_to_le16(sas_device->enclosure_handle);
5583 	mpi_request.Flags = MPI2_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS;
5584 	if ((mpt3sas_base_scsi_enclosure_processor(ioc, &mpi_reply,
5585 		&mpi_request)) != 0) {
5586 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
5587 			__FILE__, __LINE__, __func__);
5588 		return;
5589 	}
5590 
5591 	if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) {
5592 		dewtprintk(ioc,
5593 			   ioc_info(ioc, "enclosure_processor: ioc_status (0x%04x), loginfo(0x%08x)\n",
5594 				    le16_to_cpu(mpi_reply.IOCStatus),
5595 				    le32_to_cpu(mpi_reply.IOCLogInfo)));
5596 		return;
5597 	}
5598 }
5599 
5600 /**
5601  * _scsih_send_event_to_turn_on_pfa_led - fire delayed event
5602  * @ioc: per adapter object
5603  * @handle: device handle
5604  * Context: interrupt.
5605  */
5606 static void
5607 _scsih_send_event_to_turn_on_pfa_led(struct MPT3SAS_ADAPTER *ioc, u16 handle)
5608 {
5609 	struct fw_event_work *fw_event;
5610 
5611 	fw_event = alloc_fw_event_work(0);
5612 	if (!fw_event)
5613 		return;
5614 	fw_event->event = MPT3SAS_TURN_ON_PFA_LED;
5615 	fw_event->device_handle = handle;
5616 	fw_event->ioc = ioc;
5617 	_scsih_fw_event_add(ioc, fw_event);
5618 	fw_event_work_put(fw_event);
5619 }
5620 
5621 /**
5622  * _scsih_smart_predicted_fault - process smart errors
5623  * @ioc: per adapter object
5624  * @handle: device handle
5625  * Context: interrupt.
5626  */
5627 static void
5628 _scsih_smart_predicted_fault(struct MPT3SAS_ADAPTER *ioc, u16 handle)
5629 {
5630 	struct scsi_target *starget;
5631 	struct MPT3SAS_TARGET *sas_target_priv_data;
5632 	Mpi2EventNotificationReply_t *event_reply;
5633 	Mpi2EventDataSasDeviceStatusChange_t *event_data;
5634 	struct _sas_device *sas_device;
5635 	ssize_t sz;
5636 	unsigned long flags;
5637 
5638 	/* only handle non-raid devices */
5639 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
5640 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
5641 	if (!sas_device)
5642 		goto out_unlock;
5643 
5644 	starget = sas_device->starget;
5645 	sas_target_priv_data = starget->hostdata;
5646 
5647 	if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT) ||
5648 	   ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)))
5649 		goto out_unlock;
5650 
5651 	_scsih_display_enclosure_chassis_info(NULL, sas_device, NULL, starget);
5652 
5653 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5654 
5655 	if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM)
5656 		_scsih_send_event_to_turn_on_pfa_led(ioc, handle);
5657 
5658 	/* insert into event log */
5659 	sz = offsetof(Mpi2EventNotificationReply_t, EventData) +
5660 	     sizeof(Mpi2EventDataSasDeviceStatusChange_t);
5661 	event_reply = kzalloc(sz, GFP_ATOMIC);
5662 	if (!event_reply) {
5663 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
5664 			__FILE__, __LINE__, __func__);
5665 		goto out;
5666 	}
5667 
5668 	event_reply->Function = MPI2_FUNCTION_EVENT_NOTIFICATION;
5669 	event_reply->Event =
5670 	    cpu_to_le16(MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE);
5671 	event_reply->MsgLength = sz/4;
5672 	event_reply->EventDataLength =
5673 	    cpu_to_le16(sizeof(Mpi2EventDataSasDeviceStatusChange_t)/4);
5674 	event_data = (Mpi2EventDataSasDeviceStatusChange_t *)
5675 	    event_reply->EventData;
5676 	event_data->ReasonCode = MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA;
5677 	event_data->ASC = 0x5D;
5678 	event_data->DevHandle = cpu_to_le16(handle);
5679 	event_data->SASAddress = cpu_to_le64(sas_target_priv_data->sas_address);
5680 	mpt3sas_ctl_add_to_event_log(ioc, event_reply);
5681 	kfree(event_reply);
5682 out:
5683 	if (sas_device)
5684 		sas_device_put(sas_device);
5685 	return;
5686 
5687 out_unlock:
5688 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5689 	goto out;
5690 }
5691 
5692 /**
5693  * _scsih_io_done - scsi request callback
5694  * @ioc: per adapter object
5695  * @smid: system request message index
5696  * @msix_index: MSIX table index supplied by the OS
5697  * @reply: reply message frame(lower 32bit addr)
5698  *
5699  * Callback handler when using _scsih_qcmd.
5700  *
5701  * Return: 1 meaning mf should be freed from _base_interrupt
5702  *         0 means the mf is freed from this function.
5703  */
5704 static u8
5705 _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
5706 {
5707 	Mpi25SCSIIORequest_t *mpi_request;
5708 	Mpi2SCSIIOReply_t *mpi_reply;
5709 	struct scsi_cmnd *scmd;
5710 	struct scsiio_tracker *st;
5711 	u16 ioc_status;
5712 	u32 xfer_cnt;
5713 	u8 scsi_state;
5714 	u8 scsi_status;
5715 	u32 log_info;
5716 	struct MPT3SAS_DEVICE *sas_device_priv_data;
5717 	u32 response_code = 0;
5718 
5719 	mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
5720 
5721 	scmd = mpt3sas_scsih_scsi_lookup_get(ioc, smid);
5722 	if (scmd == NULL)
5723 		return 1;
5724 
5725 	_scsih_set_satl_pending(scmd, false);
5726 
5727 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
5728 
5729 	if (mpi_reply == NULL) {
5730 		scmd->result = DID_OK << 16;
5731 		goto out;
5732 	}
5733 
5734 	sas_device_priv_data = scmd->device->hostdata;
5735 	if (!sas_device_priv_data || !sas_device_priv_data->sas_target ||
5736 	     sas_device_priv_data->sas_target->deleted) {
5737 		scmd->result = DID_NO_CONNECT << 16;
5738 		goto out;
5739 	}
5740 	ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
5741 
5742 	/*
5743 	 * WARPDRIVE: If direct_io is set then it is directIO,
5744 	 * the failed direct I/O should be redirected to volume
5745 	 */
5746 	st = scsi_cmd_priv(scmd);
5747 	if (st->direct_io &&
5748 	     ((ioc_status & MPI2_IOCSTATUS_MASK)
5749 	      != MPI2_IOCSTATUS_SCSI_TASK_TERMINATED)) {
5750 		st->direct_io = 0;
5751 		st->scmd = scmd;
5752 		memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
5753 		mpi_request->DevHandle =
5754 		    cpu_to_le16(sas_device_priv_data->sas_target->handle);
5755 		ioc->put_smid_scsi_io(ioc, smid,
5756 		    sas_device_priv_data->sas_target->handle);
5757 		return 0;
5758 	}
5759 	/* turning off TLR */
5760 	scsi_state = mpi_reply->SCSIState;
5761 	if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID)
5762 		response_code =
5763 		    le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF;
5764 	if (!sas_device_priv_data->tlr_snoop_check) {
5765 		sas_device_priv_data->tlr_snoop_check++;
5766 		if ((!ioc->is_warpdrive &&
5767 		    !scsih_is_raid(&scmd->device->sdev_gendev) &&
5768 		    !scsih_is_nvme(&scmd->device->sdev_gendev))
5769 		    && sas_is_tlr_enabled(scmd->device) &&
5770 		    response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME) {
5771 			sas_disable_tlr(scmd->device);
5772 			sdev_printk(KERN_INFO, scmd->device, "TLR disabled\n");
5773 		}
5774 	}
5775 
5776 	xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);
5777 	scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt);
5778 	if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
5779 		log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
5780 	else
5781 		log_info = 0;
5782 	ioc_status &= MPI2_IOCSTATUS_MASK;
5783 	scsi_status = mpi_reply->SCSIStatus;
5784 
5785 	if (ioc_status == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN && xfer_cnt == 0 &&
5786 	    (scsi_status == MPI2_SCSI_STATUS_BUSY ||
5787 	     scsi_status == MPI2_SCSI_STATUS_RESERVATION_CONFLICT ||
5788 	     scsi_status == MPI2_SCSI_STATUS_TASK_SET_FULL)) {
5789 		ioc_status = MPI2_IOCSTATUS_SUCCESS;
5790 	}
5791 
5792 	if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
5793 		struct sense_info data;
5794 		const void *sense_data = mpt3sas_base_get_sense_buffer(ioc,
5795 		    smid);
5796 		u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE,
5797 		    le32_to_cpu(mpi_reply->SenseCount));
5798 		memcpy(scmd->sense_buffer, sense_data, sz);
5799 		_scsih_normalize_sense(scmd->sense_buffer, &data);
5800 		/* failure prediction threshold exceeded */
5801 		if (data.asc == 0x5D)
5802 			_scsih_smart_predicted_fault(ioc,
5803 			    le16_to_cpu(mpi_reply->DevHandle));
5804 		mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
5805 
5806 		if ((ioc->logging_level & MPT_DEBUG_REPLY) &&
5807 		     ((scmd->sense_buffer[2] == UNIT_ATTENTION) ||
5808 		     (scmd->sense_buffer[2] == MEDIUM_ERROR) ||
5809 		     (scmd->sense_buffer[2] == HARDWARE_ERROR)))
5810 			_scsih_scsi_ioc_info(ioc, scmd, mpi_reply, smid);
5811 	}
5812 	switch (ioc_status) {
5813 	case MPI2_IOCSTATUS_BUSY:
5814 	case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES:
5815 		scmd->result = SAM_STAT_BUSY;
5816 		break;
5817 
5818 	case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
5819 		scmd->result = DID_NO_CONNECT << 16;
5820 		break;
5821 
5822 	case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
5823 		if (sas_device_priv_data->block) {
5824 			scmd->result = DID_TRANSPORT_DISRUPTED << 16;
5825 			goto out;
5826 		}
5827 		if (log_info == 0x31110630) {
5828 			if (scmd->retries > 2) {
5829 				scmd->result = DID_NO_CONNECT << 16;
5830 				scsi_device_set_state(scmd->device,
5831 				    SDEV_OFFLINE);
5832 			} else {
5833 				scmd->result = DID_SOFT_ERROR << 16;
5834 				scmd->device->expecting_cc_ua = 1;
5835 			}
5836 			break;
5837 		} else if (log_info == VIRTUAL_IO_FAILED_RETRY) {
5838 			scmd->result = DID_RESET << 16;
5839 			break;
5840 		} else if ((scmd->device->channel == RAID_CHANNEL) &&
5841 		   (scsi_state == (MPI2_SCSI_STATE_TERMINATED |
5842 		   MPI2_SCSI_STATE_NO_SCSI_STATUS))) {
5843 			scmd->result = DID_RESET << 16;
5844 			break;
5845 		}
5846 		scmd->result = DID_SOFT_ERROR << 16;
5847 		break;
5848 	case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
5849 	case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
5850 		scmd->result = DID_RESET << 16;
5851 		break;
5852 
5853 	case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
5854 		if ((xfer_cnt == 0) || (scmd->underflow > xfer_cnt))
5855 			scmd->result = DID_SOFT_ERROR << 16;
5856 		else
5857 			scmd->result = (DID_OK << 16) | scsi_status;
5858 		break;
5859 
5860 	case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN:
5861 		scmd->result = (DID_OK << 16) | scsi_status;
5862 
5863 		if ((scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID))
5864 			break;
5865 
5866 		if (xfer_cnt < scmd->underflow) {
5867 			if (scsi_status == SAM_STAT_BUSY)
5868 				scmd->result = SAM_STAT_BUSY;
5869 			else
5870 				scmd->result = DID_SOFT_ERROR << 16;
5871 		} else if (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED |
5872 		     MPI2_SCSI_STATE_NO_SCSI_STATUS))
5873 			scmd->result = DID_SOFT_ERROR << 16;
5874 		else if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
5875 			scmd->result = DID_RESET << 16;
5876 		else if (!xfer_cnt && scmd->cmnd[0] == REPORT_LUNS) {
5877 			mpi_reply->SCSIState = MPI2_SCSI_STATE_AUTOSENSE_VALID;
5878 			mpi_reply->SCSIStatus = SAM_STAT_CHECK_CONDITION;
5879 			scsi_build_sense(scmd, 0, ILLEGAL_REQUEST,
5880 					 0x20, 0);
5881 		}
5882 		break;
5883 
5884 	case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
5885 		scsi_set_resid(scmd, 0);
5886 		fallthrough;
5887 	case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
5888 	case MPI2_IOCSTATUS_SUCCESS:
5889 		scmd->result = (DID_OK << 16) | scsi_status;
5890 		if (response_code ==
5891 		    MPI2_SCSITASKMGMT_RSP_INVALID_FRAME ||
5892 		    (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED |
5893 		     MPI2_SCSI_STATE_NO_SCSI_STATUS)))
5894 			scmd->result = DID_SOFT_ERROR << 16;
5895 		else if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
5896 			scmd->result = DID_RESET << 16;
5897 		break;
5898 
5899 	case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
5900 	case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
5901 	case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
5902 		_scsih_eedp_error_handling(scmd, ioc_status);
5903 		break;
5904 
5905 	case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
5906 	case MPI2_IOCSTATUS_INVALID_FUNCTION:
5907 	case MPI2_IOCSTATUS_INVALID_SGL:
5908 	case MPI2_IOCSTATUS_INTERNAL_ERROR:
5909 	case MPI2_IOCSTATUS_INVALID_FIELD:
5910 	case MPI2_IOCSTATUS_INVALID_STATE:
5911 	case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR:
5912 	case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
5913 	case MPI2_IOCSTATUS_INSUFFICIENT_POWER:
5914 	default:
5915 		scmd->result = DID_SOFT_ERROR << 16;
5916 		break;
5917 
5918 	}
5919 
5920 	if (scmd->result && (ioc->logging_level & MPT_DEBUG_REPLY))
5921 		_scsih_scsi_ioc_info(ioc , scmd, mpi_reply, smid);
5922 
5923  out:
5924 
5925 	scsi_dma_unmap(scmd);
5926 	mpt3sas_base_free_smid(ioc, smid);
5927 	scsi_done(scmd);
5928 	return 0;
5929 }
5930 
5931 /**
5932  * _scsih_update_vphys_after_reset - update the Port's
5933  *			vphys_list after reset
5934  * @ioc: per adapter object
5935  *
5936  * Returns nothing.
5937  */
5938 static void
5939 _scsih_update_vphys_after_reset(struct MPT3SAS_ADAPTER *ioc)
5940 {
5941 	u16 sz, ioc_status;
5942 	int i;
5943 	Mpi2ConfigReply_t mpi_reply;
5944 	Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
5945 	u16 attached_handle;
5946 	u64 attached_sas_addr;
5947 	u8 found = 0, port_id;
5948 	Mpi2SasPhyPage0_t phy_pg0;
5949 	struct hba_port *port, *port_next, *mport;
5950 	struct virtual_phy *vphy, *vphy_next;
5951 	struct _sas_device *sas_device;
5952 
5953 	/*
5954 	 * Mark all the vphys objects as dirty.
5955 	 */
5956 	list_for_each_entry_safe(port, port_next,
5957 	    &ioc->port_table_list, list) {
5958 		if (!port->vphys_mask)
5959 			continue;
5960 		list_for_each_entry_safe(vphy, vphy_next,
5961 		    &port->vphys_list, list) {
5962 			vphy->flags |= MPT_VPHY_FLAG_DIRTY_PHY;
5963 		}
5964 	}
5965 
5966 	/*
5967 	 * Read SASIOUnitPage0 to get each HBA Phy's data.
5968 	 */
5969 	sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) +
5970 	    (ioc->sas_hba.num_phys * sizeof(Mpi2SasIOUnit0PhyData_t));
5971 	sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
5972 	if (!sas_iounit_pg0) {
5973 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
5974 		    __FILE__, __LINE__, __func__);
5975 		return;
5976 	}
5977 	if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
5978 	    sas_iounit_pg0, sz)) != 0)
5979 		goto out;
5980 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
5981 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
5982 		goto out;
5983 	/*
5984 	 * Loop over each HBA Phy.
5985 	 */
5986 	for (i = 0; i < ioc->sas_hba.num_phys; i++) {
5987 		/*
5988 		 * Check whether Phy's Negotiation Link Rate is > 1.5G or not.
5989 		 */
5990 		if ((sas_iounit_pg0->PhyData[i].NegotiatedLinkRate >> 4) <
5991 		    MPI2_SAS_NEG_LINK_RATE_1_5)
5992 			continue;
5993 		/*
5994 		 * Check whether Phy is connected to SEP device or not,
5995 		 * if it is SEP device then read the Phy's SASPHYPage0 data to
5996 		 * determine whether Phy is a virtual Phy or not. if it is
5997 		 * virtual phy then it is conformed that the attached remote
5998 		 * device is a HBA's vSES device.
5999 		 */
6000 		if (!(le32_to_cpu(
6001 		    sas_iounit_pg0->PhyData[i].ControllerPhyDeviceInfo) &
6002 		    MPI2_SAS_DEVICE_INFO_SEP))
6003 			continue;
6004 
6005 		if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply, &phy_pg0,
6006 		    i))) {
6007 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
6008 			    __FILE__, __LINE__, __func__);
6009 			continue;
6010 		}
6011 
6012 		if (!(le32_to_cpu(phy_pg0.PhyInfo) &
6013 		    MPI2_SAS_PHYINFO_VIRTUAL_PHY))
6014 			continue;
6015 		/*
6016 		 * Get the vSES device's SAS Address.
6017 		 */
6018 		attached_handle = le16_to_cpu(
6019 		    sas_iounit_pg0->PhyData[i].AttachedDevHandle);
6020 		if (_scsih_get_sas_address(ioc, attached_handle,
6021 		    &attached_sas_addr) != 0) {
6022 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
6023 			    __FILE__, __LINE__, __func__);
6024 			continue;
6025 		}
6026 
6027 		found = 0;
6028 		port = port_next = NULL;
6029 		/*
6030 		 * Loop over each virtual_phy object from
6031 		 * each port's vphys_list.
6032 		 */
6033 		list_for_each_entry_safe(port,
6034 		    port_next, &ioc->port_table_list, list) {
6035 			if (!port->vphys_mask)
6036 				continue;
6037 			list_for_each_entry_safe(vphy, vphy_next,
6038 			    &port->vphys_list, list) {
6039 				/*
6040 				 * Continue with next virtual_phy object
6041 				 * if the object is not marked as dirty.
6042 				 */
6043 				if (!(vphy->flags & MPT_VPHY_FLAG_DIRTY_PHY))
6044 					continue;
6045 
6046 				/*
6047 				 * Continue with next virtual_phy object
6048 				 * if the object's SAS Address is not equals
6049 				 * to current Phy's vSES device SAS Address.
6050 				 */
6051 				if (vphy->sas_address != attached_sas_addr)
6052 					continue;
6053 				/*
6054 				 * Enable current Phy number bit in object's
6055 				 * phy_mask field.
6056 				 */
6057 				if (!(vphy->phy_mask & (1 << i)))
6058 					vphy->phy_mask = (1 << i);
6059 				/*
6060 				 * Get hba_port object from hba_port table
6061 				 * corresponding to current phy's Port ID.
6062 				 * if there is no hba_port object corresponding
6063 				 * to Phy's Port ID then create a new hba_port
6064 				 * object & add to hba_port table.
6065 				 */
6066 				port_id = sas_iounit_pg0->PhyData[i].Port;
6067 				mport = mpt3sas_get_port_by_id(ioc, port_id, 1);
6068 				if (!mport) {
6069 					mport = kzalloc(
6070 					    sizeof(struct hba_port), GFP_KERNEL);
6071 					if (!mport)
6072 						break;
6073 					mport->port_id = port_id;
6074 					ioc_info(ioc,
6075 					    "%s: hba_port entry: %p, port: %d is added to hba_port list\n",
6076 					    __func__, mport, mport->port_id);
6077 					list_add_tail(&mport->list,
6078 						&ioc->port_table_list);
6079 				}
6080 				/*
6081 				 * If mport & port pointers are not pointing to
6082 				 * same hba_port object then it means that vSES
6083 				 * device's Port ID got changed after reset and
6084 				 * hence move current virtual_phy object from
6085 				 * port's vphys_list to mport's vphys_list.
6086 				 */
6087 				if (port != mport) {
6088 					if (!mport->vphys_mask)
6089 						INIT_LIST_HEAD(
6090 						    &mport->vphys_list);
6091 					mport->vphys_mask |= (1 << i);
6092 					port->vphys_mask &= ~(1 << i);
6093 					list_move(&vphy->list,
6094 					    &mport->vphys_list);
6095 					sas_device = mpt3sas_get_sdev_by_addr(
6096 					    ioc, attached_sas_addr, port);
6097 					if (sas_device)
6098 						sas_device->port = mport;
6099 				}
6100 				/*
6101 				 * Earlier while updating the hba_port table,
6102 				 * it is determined that there is no other
6103 				 * direct attached device with mport's Port ID,
6104 				 * Hence mport was marked as dirty. Only vSES
6105 				 * device has this Port ID, so unmark the mport
6106 				 * as dirt.
6107 				 */
6108 				if (mport->flags & HBA_PORT_FLAG_DIRTY_PORT) {
6109 					mport->sas_address = 0;
6110 					mport->phy_mask = 0;
6111 					mport->flags &=
6112 					    ~HBA_PORT_FLAG_DIRTY_PORT;
6113 				}
6114 				/*
6115 				 * Unmark current virtual_phy object as dirty.
6116 				 */
6117 				vphy->flags &= ~MPT_VPHY_FLAG_DIRTY_PHY;
6118 				found = 1;
6119 				break;
6120 			}
6121 			if (found)
6122 				break;
6123 		}
6124 	}
6125 out:
6126 	kfree(sas_iounit_pg0);
6127 }
6128 
6129 /**
6130  * _scsih_get_port_table_after_reset - Construct temporary port table
6131  * @ioc: per adapter object
6132  * @port_table: address where port table needs to be constructed
6133  *
6134  * return number of HBA port entries available after reset.
6135  */
6136 static int
6137 _scsih_get_port_table_after_reset(struct MPT3SAS_ADAPTER *ioc,
6138 	struct hba_port *port_table)
6139 {
6140 	u16 sz, ioc_status;
6141 	int i, j;
6142 	Mpi2ConfigReply_t mpi_reply;
6143 	Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
6144 	u16 attached_handle;
6145 	u64 attached_sas_addr;
6146 	u8 found = 0, port_count = 0, port_id;
6147 
6148 	sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys
6149 	    * sizeof(Mpi2SasIOUnit0PhyData_t));
6150 	sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
6151 	if (!sas_iounit_pg0) {
6152 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6153 		    __FILE__, __LINE__, __func__);
6154 		return port_count;
6155 	}
6156 
6157 	if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
6158 	    sas_iounit_pg0, sz)) != 0)
6159 		goto out;
6160 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
6161 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6162 		goto out;
6163 	for (i = 0; i < ioc->sas_hba.num_phys; i++) {
6164 		found = 0;
6165 		if ((sas_iounit_pg0->PhyData[i].NegotiatedLinkRate >> 4) <
6166 		    MPI2_SAS_NEG_LINK_RATE_1_5)
6167 			continue;
6168 		attached_handle =
6169 		    le16_to_cpu(sas_iounit_pg0->PhyData[i].AttachedDevHandle);
6170 		if (_scsih_get_sas_address(
6171 		    ioc, attached_handle, &attached_sas_addr) != 0) {
6172 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
6173 			    __FILE__, __LINE__, __func__);
6174 			continue;
6175 		}
6176 
6177 		for (j = 0; j < port_count; j++) {
6178 			port_id = sas_iounit_pg0->PhyData[i].Port;
6179 			if (port_table[j].port_id == port_id &&
6180 			    port_table[j].sas_address == attached_sas_addr) {
6181 				port_table[j].phy_mask |= (1 << i);
6182 				found = 1;
6183 				break;
6184 			}
6185 		}
6186 
6187 		if (found)
6188 			continue;
6189 
6190 		port_id = sas_iounit_pg0->PhyData[i].Port;
6191 		port_table[port_count].port_id = port_id;
6192 		port_table[port_count].phy_mask = (1 << i);
6193 		port_table[port_count].sas_address = attached_sas_addr;
6194 		port_count++;
6195 	}
6196 out:
6197 	kfree(sas_iounit_pg0);
6198 	return port_count;
6199 }
6200 
6201 enum hba_port_matched_codes {
6202 	NOT_MATCHED = 0,
6203 	MATCHED_WITH_ADDR_AND_PHYMASK,
6204 	MATCHED_WITH_ADDR_SUBPHYMASK_AND_PORT,
6205 	MATCHED_WITH_ADDR_AND_SUBPHYMASK,
6206 	MATCHED_WITH_ADDR,
6207 };
6208 
6209 /**
6210  * _scsih_look_and_get_matched_port_entry - Get matched hba port entry
6211  *					from HBA port table
6212  * @ioc: per adapter object
6213  * @port_entry: hba port entry from temporary port table which needs to be
6214  *		searched for matched entry in the HBA port table
6215  * @matched_port_entry: save matched hba port entry here
6216  * @count: count of matched entries
6217  *
6218  * return type of matched entry found.
6219  */
6220 static enum hba_port_matched_codes
6221 _scsih_look_and_get_matched_port_entry(struct MPT3SAS_ADAPTER *ioc,
6222 	struct hba_port *port_entry,
6223 	struct hba_port **matched_port_entry, int *count)
6224 {
6225 	struct hba_port *port_table_entry, *matched_port = NULL;
6226 	enum hba_port_matched_codes matched_code = NOT_MATCHED;
6227 	int lcount = 0;
6228 	*matched_port_entry = NULL;
6229 
6230 	list_for_each_entry(port_table_entry, &ioc->port_table_list, list) {
6231 		if (!(port_table_entry->flags & HBA_PORT_FLAG_DIRTY_PORT))
6232 			continue;
6233 
6234 		if ((port_table_entry->sas_address == port_entry->sas_address)
6235 		    && (port_table_entry->phy_mask == port_entry->phy_mask)) {
6236 			matched_code = MATCHED_WITH_ADDR_AND_PHYMASK;
6237 			matched_port = port_table_entry;
6238 			break;
6239 		}
6240 
6241 		if ((port_table_entry->sas_address == port_entry->sas_address)
6242 		    && (port_table_entry->phy_mask & port_entry->phy_mask)
6243 		    && (port_table_entry->port_id == port_entry->port_id)) {
6244 			matched_code = MATCHED_WITH_ADDR_SUBPHYMASK_AND_PORT;
6245 			matched_port = port_table_entry;
6246 			continue;
6247 		}
6248 
6249 		if ((port_table_entry->sas_address == port_entry->sas_address)
6250 		    && (port_table_entry->phy_mask & port_entry->phy_mask)) {
6251 			if (matched_code ==
6252 			    MATCHED_WITH_ADDR_SUBPHYMASK_AND_PORT)
6253 				continue;
6254 			matched_code = MATCHED_WITH_ADDR_AND_SUBPHYMASK;
6255 			matched_port = port_table_entry;
6256 			continue;
6257 		}
6258 
6259 		if (port_table_entry->sas_address == port_entry->sas_address) {
6260 			if (matched_code ==
6261 			    MATCHED_WITH_ADDR_SUBPHYMASK_AND_PORT)
6262 				continue;
6263 			if (matched_code == MATCHED_WITH_ADDR_AND_SUBPHYMASK)
6264 				continue;
6265 			matched_code = MATCHED_WITH_ADDR;
6266 			matched_port = port_table_entry;
6267 			lcount++;
6268 		}
6269 	}
6270 
6271 	*matched_port_entry = matched_port;
6272 	if (matched_code ==  MATCHED_WITH_ADDR)
6273 		*count = lcount;
6274 	return matched_code;
6275 }
6276 
6277 /**
6278  * _scsih_del_phy_part_of_anther_port - remove phy if it
6279  *				is a part of anther port
6280  *@ioc: per adapter object
6281  *@port_table: port table after reset
6282  *@index: hba port entry index
6283  *@port_count: number of ports available after host reset
6284  *@offset: HBA phy bit offset
6285  *
6286  */
6287 static void
6288 _scsih_del_phy_part_of_anther_port(struct MPT3SAS_ADAPTER *ioc,
6289 	struct hba_port *port_table,
6290 	int index, u8 port_count, int offset)
6291 {
6292 	struct _sas_node *sas_node = &ioc->sas_hba;
6293 	u32 i, found = 0;
6294 
6295 	for (i = 0; i < port_count; i++) {
6296 		if (i == index)
6297 			continue;
6298 
6299 		if (port_table[i].phy_mask & (1 << offset)) {
6300 			mpt3sas_transport_del_phy_from_an_existing_port(
6301 			    ioc, sas_node, &sas_node->phy[offset]);
6302 			found = 1;
6303 			break;
6304 		}
6305 	}
6306 	if (!found)
6307 		port_table[index].phy_mask |= (1 << offset);
6308 }
6309 
6310 /**
6311  * _scsih_add_or_del_phys_from_existing_port - add/remove phy to/from
6312  *						right port
6313  *@ioc: per adapter object
6314  *@hba_port_entry: hba port table entry
6315  *@port_table: temporary port table
6316  *@index: hba port entry index
6317  *@port_count: number of ports available after host reset
6318  *
6319  */
6320 static void
6321 _scsih_add_or_del_phys_from_existing_port(struct MPT3SAS_ADAPTER *ioc,
6322 	struct hba_port *hba_port_entry, struct hba_port *port_table,
6323 	int index, int port_count)
6324 {
6325 	u32 phy_mask, offset = 0;
6326 	struct _sas_node *sas_node = &ioc->sas_hba;
6327 
6328 	phy_mask = hba_port_entry->phy_mask ^ port_table[index].phy_mask;
6329 
6330 	for (offset = 0; offset < ioc->sas_hba.num_phys; offset++) {
6331 		if (phy_mask & (1 << offset)) {
6332 			if (!(port_table[index].phy_mask & (1 << offset))) {
6333 				_scsih_del_phy_part_of_anther_port(
6334 				    ioc, port_table, index, port_count,
6335 				    offset);
6336 				continue;
6337 			}
6338 			if (sas_node->phy[offset].phy_belongs_to_port)
6339 				mpt3sas_transport_del_phy_from_an_existing_port(
6340 				    ioc, sas_node, &sas_node->phy[offset]);
6341 			mpt3sas_transport_add_phy_to_an_existing_port(
6342 			    ioc, sas_node, &sas_node->phy[offset],
6343 			    hba_port_entry->sas_address,
6344 			    hba_port_entry);
6345 		}
6346 	}
6347 }
6348 
6349 /**
6350  * _scsih_del_dirty_vphy - delete virtual_phy objects marked as dirty.
6351  * @ioc: per adapter object
6352  *
6353  * Returns nothing.
6354  */
6355 static void
6356 _scsih_del_dirty_vphy(struct MPT3SAS_ADAPTER *ioc)
6357 {
6358 	struct hba_port *port, *port_next;
6359 	struct virtual_phy *vphy, *vphy_next;
6360 
6361 	list_for_each_entry_safe(port, port_next,
6362 	    &ioc->port_table_list, list) {
6363 		if (!port->vphys_mask)
6364 			continue;
6365 		list_for_each_entry_safe(vphy, vphy_next,
6366 		    &port->vphys_list, list) {
6367 			if (vphy->flags & MPT_VPHY_FLAG_DIRTY_PHY) {
6368 				drsprintk(ioc, ioc_info(ioc,
6369 				    "Deleting vphy %p entry from port id: %d\t, Phy_mask 0x%08x\n",
6370 				    vphy, port->port_id,
6371 				    vphy->phy_mask));
6372 				port->vphys_mask &= ~vphy->phy_mask;
6373 				list_del(&vphy->list);
6374 				kfree(vphy);
6375 			}
6376 		}
6377 		if (!port->vphys_mask && !port->sas_address)
6378 			port->flags |= HBA_PORT_FLAG_DIRTY_PORT;
6379 	}
6380 }
6381 
6382 /**
6383  * _scsih_del_dirty_port_entries - delete dirty port entries from port list
6384  *					after host reset
6385  *@ioc: per adapter object
6386  *
6387  */
6388 static void
6389 _scsih_del_dirty_port_entries(struct MPT3SAS_ADAPTER *ioc)
6390 {
6391 	struct hba_port *port, *port_next;
6392 
6393 	list_for_each_entry_safe(port, port_next,
6394 	    &ioc->port_table_list, list) {
6395 		if (!(port->flags & HBA_PORT_FLAG_DIRTY_PORT) ||
6396 		    port->flags & HBA_PORT_FLAG_NEW_PORT)
6397 			continue;
6398 
6399 		drsprintk(ioc, ioc_info(ioc,
6400 		    "Deleting port table entry %p having Port: %d\t Phy_mask 0x%08x\n",
6401 		    port, port->port_id, port->phy_mask));
6402 		list_del(&port->list);
6403 		kfree(port);
6404 	}
6405 }
6406 
6407 /**
6408  * _scsih_sas_port_refresh - Update HBA port table after host reset
6409  * @ioc: per adapter object
6410  */
6411 static void
6412 _scsih_sas_port_refresh(struct MPT3SAS_ADAPTER *ioc)
6413 {
6414 	u32 port_count = 0;
6415 	struct hba_port *port_table;
6416 	struct hba_port *port_table_entry;
6417 	struct hba_port *port_entry = NULL;
6418 	int i, j, count = 0, lcount = 0;
6419 	int ret;
6420 	u64 sas_addr;
6421 	u8 num_phys;
6422 
6423 	drsprintk(ioc, ioc_info(ioc,
6424 	    "updating ports for sas_host(0x%016llx)\n",
6425 	    (unsigned long long)ioc->sas_hba.sas_address));
6426 
6427 	mpt3sas_config_get_number_hba_phys(ioc, &num_phys);
6428 	if (!num_phys) {
6429 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6430 		    __FILE__, __LINE__, __func__);
6431 		return;
6432 	}
6433 
6434 	if (num_phys > ioc->sas_hba.nr_phys_allocated) {
6435 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6436 		   __FILE__, __LINE__, __func__);
6437 		return;
6438 	}
6439 	ioc->sas_hba.num_phys = num_phys;
6440 
6441 	port_table = kcalloc(ioc->sas_hba.num_phys,
6442 	    sizeof(struct hba_port), GFP_KERNEL);
6443 	if (!port_table)
6444 		return;
6445 
6446 	port_count = _scsih_get_port_table_after_reset(ioc, port_table);
6447 	if (!port_count)
6448 		return;
6449 
6450 	drsprintk(ioc, ioc_info(ioc, "New Port table\n"));
6451 	for (j = 0; j < port_count; j++)
6452 		drsprintk(ioc, ioc_info(ioc,
6453 		    "Port: %d\t Phy_mask 0x%08x\t sas_addr(0x%016llx)\n",
6454 		    port_table[j].port_id,
6455 		    port_table[j].phy_mask, port_table[j].sas_address));
6456 
6457 	list_for_each_entry(port_table_entry, &ioc->port_table_list, list)
6458 		port_table_entry->flags |= HBA_PORT_FLAG_DIRTY_PORT;
6459 
6460 	drsprintk(ioc, ioc_info(ioc, "Old Port table\n"));
6461 	port_table_entry = NULL;
6462 	list_for_each_entry(port_table_entry, &ioc->port_table_list, list) {
6463 		drsprintk(ioc, ioc_info(ioc,
6464 		    "Port: %d\t Phy_mask 0x%08x\t sas_addr(0x%016llx)\n",
6465 		    port_table_entry->port_id,
6466 		    port_table_entry->phy_mask,
6467 		    port_table_entry->sas_address));
6468 	}
6469 
6470 	for (j = 0; j < port_count; j++) {
6471 		ret = _scsih_look_and_get_matched_port_entry(ioc,
6472 		    &port_table[j], &port_entry, &count);
6473 		if (!port_entry) {
6474 			drsprintk(ioc, ioc_info(ioc,
6475 			    "No Matched entry for sas_addr(0x%16llx), Port:%d\n",
6476 			    port_table[j].sas_address,
6477 			    port_table[j].port_id));
6478 			continue;
6479 		}
6480 
6481 		switch (ret) {
6482 		case MATCHED_WITH_ADDR_SUBPHYMASK_AND_PORT:
6483 		case MATCHED_WITH_ADDR_AND_SUBPHYMASK:
6484 			_scsih_add_or_del_phys_from_existing_port(ioc,
6485 			    port_entry, port_table, j, port_count);
6486 			break;
6487 		case MATCHED_WITH_ADDR:
6488 			sas_addr = port_table[j].sas_address;
6489 			for (i = 0; i < port_count; i++) {
6490 				if (port_table[i].sas_address == sas_addr)
6491 					lcount++;
6492 			}
6493 
6494 			if (count > 1 || lcount > 1)
6495 				port_entry = NULL;
6496 			else
6497 				_scsih_add_or_del_phys_from_existing_port(ioc,
6498 				    port_entry, port_table, j, port_count);
6499 		}
6500 
6501 		if (!port_entry)
6502 			continue;
6503 
6504 		if (port_entry->port_id != port_table[j].port_id)
6505 			port_entry->port_id = port_table[j].port_id;
6506 		port_entry->flags &= ~HBA_PORT_FLAG_DIRTY_PORT;
6507 		port_entry->phy_mask = port_table[j].phy_mask;
6508 	}
6509 
6510 	port_table_entry = NULL;
6511 }
6512 
6513 /**
6514  * _scsih_alloc_vphy - allocate virtual_phy object
6515  * @ioc: per adapter object
6516  * @port_id: Port ID number
6517  * @phy_num: HBA Phy number
6518  *
6519  * Returns allocated virtual_phy object.
6520  */
6521 static struct virtual_phy *
6522 _scsih_alloc_vphy(struct MPT3SAS_ADAPTER *ioc, u8 port_id, u8 phy_num)
6523 {
6524 	struct virtual_phy *vphy;
6525 	struct hba_port *port;
6526 
6527 	port = mpt3sas_get_port_by_id(ioc, port_id, 0);
6528 	if (!port)
6529 		return NULL;
6530 
6531 	vphy = mpt3sas_get_vphy_by_phy(ioc, port, phy_num);
6532 	if (!vphy) {
6533 		vphy = kzalloc(sizeof(struct virtual_phy), GFP_KERNEL);
6534 		if (!vphy)
6535 			return NULL;
6536 
6537 		if (!port->vphys_mask)
6538 			INIT_LIST_HEAD(&port->vphys_list);
6539 
6540 		/*
6541 		 * Enable bit corresponding to HBA phy number on its
6542 		 * parent hba_port object's vphys_mask field.
6543 		 */
6544 		port->vphys_mask |= (1 << phy_num);
6545 		vphy->phy_mask |= (1 << phy_num);
6546 
6547 		list_add_tail(&vphy->list, &port->vphys_list);
6548 
6549 		ioc_info(ioc,
6550 		    "vphy entry: %p, port id: %d, phy:%d is added to port's vphys_list\n",
6551 		    vphy, port->port_id, phy_num);
6552 	}
6553 	return vphy;
6554 }
6555 
6556 /**
6557  * _scsih_sas_host_refresh - refreshing sas host object contents
6558  * @ioc: per adapter object
6559  * Context: user
6560  *
6561  * During port enable, fw will send topology events for every device. Its
6562  * possible that the handles may change from the previous setting, so this
6563  * code keeping handles updating if changed.
6564  */
6565 static void
6566 _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
6567 {
6568 	u16 sz;
6569 	u16 ioc_status;
6570 	int i;
6571 	Mpi2ConfigReply_t mpi_reply;
6572 	Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
6573 	u16 attached_handle;
6574 	u8 link_rate, port_id;
6575 	struct hba_port *port;
6576 	Mpi2SasPhyPage0_t phy_pg0;
6577 
6578 	dtmprintk(ioc,
6579 		  ioc_info(ioc, "updating handles for sas_host(0x%016llx)\n",
6580 			   (u64)ioc->sas_hba.sas_address));
6581 
6582 	sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys
6583 	    * sizeof(Mpi2SasIOUnit0PhyData_t));
6584 	sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
6585 	if (!sas_iounit_pg0) {
6586 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6587 			__FILE__, __LINE__, __func__);
6588 		return;
6589 	}
6590 
6591 	if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
6592 	    sas_iounit_pg0, sz)) != 0)
6593 		goto out;
6594 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
6595 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6596 		goto out;
6597 	for (i = 0; i < ioc->sas_hba.num_phys ; i++) {
6598 		link_rate = sas_iounit_pg0->PhyData[i].NegotiatedLinkRate >> 4;
6599 		if (i == 0)
6600 			ioc->sas_hba.handle = le16_to_cpu(
6601 			    sas_iounit_pg0->PhyData[0].ControllerDevHandle);
6602 		port_id = sas_iounit_pg0->PhyData[i].Port;
6603 		if (!(mpt3sas_get_port_by_id(ioc, port_id, 0))) {
6604 			port = kzalloc(sizeof(struct hba_port), GFP_KERNEL);
6605 			if (!port)
6606 				goto out;
6607 
6608 			port->port_id = port_id;
6609 			ioc_info(ioc,
6610 			    "hba_port entry: %p, port: %d is added to hba_port list\n",
6611 			    port, port->port_id);
6612 			if (ioc->shost_recovery)
6613 				port->flags = HBA_PORT_FLAG_NEW_PORT;
6614 			list_add_tail(&port->list, &ioc->port_table_list);
6615 		}
6616 		/*
6617 		 * Check whether current Phy belongs to HBA vSES device or not.
6618 		 */
6619 		if (le32_to_cpu(sas_iounit_pg0->PhyData[i].ControllerPhyDeviceInfo) &
6620 		    MPI2_SAS_DEVICE_INFO_SEP &&
6621 		    (link_rate >=  MPI2_SAS_NEG_LINK_RATE_1_5)) {
6622 			if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply,
6623 			    &phy_pg0, i))) {
6624 				ioc_err(ioc,
6625 				    "failure at %s:%d/%s()!\n",
6626 				     __FILE__, __LINE__, __func__);
6627 				goto out;
6628 			}
6629 			if (!(le32_to_cpu(phy_pg0.PhyInfo) &
6630 			    MPI2_SAS_PHYINFO_VIRTUAL_PHY))
6631 				continue;
6632 			/*
6633 			 * Allocate a virtual_phy object for vSES device, if
6634 			 * this vSES device is hot added.
6635 			 */
6636 			if (!_scsih_alloc_vphy(ioc, port_id, i))
6637 				goto out;
6638 			ioc->sas_hba.phy[i].hba_vphy = 1;
6639 		}
6640 
6641 		/*
6642 		 * Add new HBA phys to STL if these new phys got added as part
6643 		 * of HBA Firmware upgrade/downgrade operation.
6644 		 */
6645 		if (!ioc->sas_hba.phy[i].phy) {
6646 			if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply,
6647 							&phy_pg0, i))) {
6648 				ioc_err(ioc, "failure at %s:%d/%s()!\n",
6649 					__FILE__, __LINE__, __func__);
6650 				continue;
6651 			}
6652 			ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6653 				MPI2_IOCSTATUS_MASK;
6654 			if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6655 				ioc_err(ioc, "failure at %s:%d/%s()!\n",
6656 					__FILE__, __LINE__, __func__);
6657 				continue;
6658 			}
6659 			ioc->sas_hba.phy[i].phy_id = i;
6660 			mpt3sas_transport_add_host_phy(ioc,
6661 				&ioc->sas_hba.phy[i], phy_pg0,
6662 				ioc->sas_hba.parent_dev);
6663 			continue;
6664 		}
6665 		ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
6666 		attached_handle = le16_to_cpu(sas_iounit_pg0->PhyData[i].
6667 		    AttachedDevHandle);
6668 		if (attached_handle && link_rate < MPI2_SAS_NEG_LINK_RATE_1_5)
6669 			link_rate = MPI2_SAS_NEG_LINK_RATE_1_5;
6670 		ioc->sas_hba.phy[i].port =
6671 		    mpt3sas_get_port_by_id(ioc, port_id, 0);
6672 		mpt3sas_transport_update_links(ioc, ioc->sas_hba.sas_address,
6673 		    attached_handle, i, link_rate,
6674 		    ioc->sas_hba.phy[i].port);
6675 	}
6676 	/*
6677 	 * Clear the phy details if this phy got disabled as part of
6678 	 * HBA Firmware upgrade/downgrade operation.
6679 	 */
6680 	for (i = ioc->sas_hba.num_phys;
6681 	     i < ioc->sas_hba.nr_phys_allocated; i++) {
6682 		if (ioc->sas_hba.phy[i].phy &&
6683 		    ioc->sas_hba.phy[i].phy->negotiated_linkrate >=
6684 		    SAS_LINK_RATE_1_5_GBPS)
6685 			mpt3sas_transport_update_links(ioc,
6686 				ioc->sas_hba.sas_address, 0, i,
6687 				MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED, NULL);
6688 	}
6689  out:
6690 	kfree(sas_iounit_pg0);
6691 }
6692 
6693 /**
6694  * _scsih_sas_host_add - create sas host object
6695  * @ioc: per adapter object
6696  *
6697  * Creating host side data object, stored in ioc->sas_hba
6698  */
6699 static void
6700 _scsih_sas_host_add(struct MPT3SAS_ADAPTER *ioc)
6701 {
6702 	int i;
6703 	Mpi2ConfigReply_t mpi_reply;
6704 	Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
6705 	Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL;
6706 	Mpi2SasPhyPage0_t phy_pg0;
6707 	Mpi2SasDevicePage0_t sas_device_pg0;
6708 	Mpi2SasEnclosurePage0_t enclosure_pg0;
6709 	u16 ioc_status;
6710 	u16 sz;
6711 	u8 device_missing_delay;
6712 	u8 num_phys, port_id;
6713 	struct hba_port *port;
6714 
6715 	mpt3sas_config_get_number_hba_phys(ioc, &num_phys);
6716 	if (!num_phys) {
6717 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6718 			__FILE__, __LINE__, __func__);
6719 		return;
6720 	}
6721 
6722 	ioc->sas_hba.nr_phys_allocated = max_t(u8,
6723 	    MPT_MAX_HBA_NUM_PHYS, num_phys);
6724 	ioc->sas_hba.phy = kcalloc(ioc->sas_hba.nr_phys_allocated,
6725 	    sizeof(struct _sas_phy), GFP_KERNEL);
6726 	if (!ioc->sas_hba.phy) {
6727 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6728 			__FILE__, __LINE__, __func__);
6729 		goto out;
6730 	}
6731 	ioc->sas_hba.num_phys = num_phys;
6732 
6733 	/* sas_iounit page 0 */
6734 	sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys *
6735 	    sizeof(Mpi2SasIOUnit0PhyData_t));
6736 	sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
6737 	if (!sas_iounit_pg0) {
6738 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6739 			__FILE__, __LINE__, __func__);
6740 		return;
6741 	}
6742 	if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
6743 	    sas_iounit_pg0, sz))) {
6744 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6745 			__FILE__, __LINE__, __func__);
6746 		goto out;
6747 	}
6748 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6749 	    MPI2_IOCSTATUS_MASK;
6750 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6751 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6752 			__FILE__, __LINE__, __func__);
6753 		goto out;
6754 	}
6755 
6756 	/* sas_iounit page 1 */
6757 	sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData) + (ioc->sas_hba.num_phys *
6758 	    sizeof(Mpi2SasIOUnit1PhyData_t));
6759 	sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL);
6760 	if (!sas_iounit_pg1) {
6761 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6762 			__FILE__, __LINE__, __func__);
6763 		goto out;
6764 	}
6765 	if ((mpt3sas_config_get_sas_iounit_pg1(ioc, &mpi_reply,
6766 	    sas_iounit_pg1, sz))) {
6767 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6768 			__FILE__, __LINE__, __func__);
6769 		goto out;
6770 	}
6771 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6772 	    MPI2_IOCSTATUS_MASK;
6773 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6774 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6775 			__FILE__, __LINE__, __func__);
6776 		goto out;
6777 	}
6778 
6779 	ioc->io_missing_delay =
6780 	    sas_iounit_pg1->IODeviceMissingDelay;
6781 	device_missing_delay =
6782 	    sas_iounit_pg1->ReportDeviceMissingDelay;
6783 	if (device_missing_delay & MPI2_SASIOUNIT1_REPORT_MISSING_UNIT_16)
6784 		ioc->device_missing_delay = (device_missing_delay &
6785 		    MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16;
6786 	else
6787 		ioc->device_missing_delay = device_missing_delay &
6788 		    MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK;
6789 
6790 	ioc->sas_hba.parent_dev = &ioc->shost->shost_gendev;
6791 	for (i = 0; i < ioc->sas_hba.num_phys ; i++) {
6792 		if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply, &phy_pg0,
6793 		    i))) {
6794 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
6795 				__FILE__, __LINE__, __func__);
6796 			goto out;
6797 		}
6798 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6799 		    MPI2_IOCSTATUS_MASK;
6800 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6801 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
6802 				__FILE__, __LINE__, __func__);
6803 			goto out;
6804 		}
6805 
6806 		if (i == 0)
6807 			ioc->sas_hba.handle = le16_to_cpu(sas_iounit_pg0->
6808 			    PhyData[0].ControllerDevHandle);
6809 
6810 		port_id = sas_iounit_pg0->PhyData[i].Port;
6811 		if (!(mpt3sas_get_port_by_id(ioc, port_id, 0))) {
6812 			port = kzalloc(sizeof(struct hba_port), GFP_KERNEL);
6813 			if (!port)
6814 				goto out;
6815 
6816 			port->port_id = port_id;
6817 			ioc_info(ioc,
6818 			   "hba_port entry: %p, port: %d is added to hba_port list\n",
6819 			   port, port->port_id);
6820 			list_add_tail(&port->list,
6821 			    &ioc->port_table_list);
6822 		}
6823 
6824 		/*
6825 		 * Check whether current Phy belongs to HBA vSES device or not.
6826 		 */
6827 		if ((le32_to_cpu(phy_pg0.PhyInfo) &
6828 		    MPI2_SAS_PHYINFO_VIRTUAL_PHY) &&
6829 		    (phy_pg0.NegotiatedLinkRate >> 4) >=
6830 		    MPI2_SAS_NEG_LINK_RATE_1_5) {
6831 			/*
6832 			 * Allocate a virtual_phy object for vSES device.
6833 			 */
6834 			if (!_scsih_alloc_vphy(ioc, port_id, i))
6835 				goto out;
6836 			ioc->sas_hba.phy[i].hba_vphy = 1;
6837 		}
6838 
6839 		ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
6840 		ioc->sas_hba.phy[i].phy_id = i;
6841 		ioc->sas_hba.phy[i].port =
6842 		    mpt3sas_get_port_by_id(ioc, port_id, 0);
6843 		mpt3sas_transport_add_host_phy(ioc, &ioc->sas_hba.phy[i],
6844 		    phy_pg0, ioc->sas_hba.parent_dev);
6845 	}
6846 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
6847 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, ioc->sas_hba.handle))) {
6848 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6849 			__FILE__, __LINE__, __func__);
6850 		goto out;
6851 	}
6852 	ioc->sas_hba.enclosure_handle =
6853 	    le16_to_cpu(sas_device_pg0.EnclosureHandle);
6854 	ioc->sas_hba.sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
6855 	ioc_info(ioc, "host_add: handle(0x%04x), sas_addr(0x%016llx), phys(%d)\n",
6856 		 ioc->sas_hba.handle,
6857 		 (u64)ioc->sas_hba.sas_address,
6858 		 ioc->sas_hba.num_phys);
6859 
6860 	if (ioc->sas_hba.enclosure_handle) {
6861 		if (!(mpt3sas_config_get_enclosure_pg0(ioc, &mpi_reply,
6862 		    &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
6863 		   ioc->sas_hba.enclosure_handle)))
6864 			ioc->sas_hba.enclosure_logical_id =
6865 			    le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
6866 	}
6867 
6868  out:
6869 	kfree(sas_iounit_pg1);
6870 	kfree(sas_iounit_pg0);
6871 }
6872 
6873 /**
6874  * _scsih_expander_add -  creating expander object
6875  * @ioc: per adapter object
6876  * @handle: expander handle
6877  *
6878  * Creating expander object, stored in ioc->sas_expander_list.
6879  *
6880  * Return: 0 for success, else error.
6881  */
6882 static int
6883 _scsih_expander_add(struct MPT3SAS_ADAPTER *ioc, u16 handle)
6884 {
6885 	struct _sas_node *sas_expander;
6886 	struct _enclosure_node *enclosure_dev;
6887 	Mpi2ConfigReply_t mpi_reply;
6888 	Mpi2ExpanderPage0_t expander_pg0;
6889 	Mpi2ExpanderPage1_t expander_pg1;
6890 	u32 ioc_status;
6891 	u16 parent_handle;
6892 	u64 sas_address, sas_address_parent = 0;
6893 	int i;
6894 	unsigned long flags;
6895 	struct _sas_port *mpt3sas_port = NULL;
6896 	u8 port_id;
6897 
6898 	int rc = 0;
6899 
6900 	if (!handle)
6901 		return -1;
6902 
6903 	if (ioc->shost_recovery || ioc->pci_error_recovery)
6904 		return -1;
6905 
6906 	if ((mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
6907 	    MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) {
6908 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6909 			__FILE__, __LINE__, __func__);
6910 		return -1;
6911 	}
6912 
6913 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6914 	    MPI2_IOCSTATUS_MASK;
6915 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6916 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6917 			__FILE__, __LINE__, __func__);
6918 		return -1;
6919 	}
6920 
6921 	/* handle out of order topology events */
6922 	parent_handle = le16_to_cpu(expander_pg0.ParentDevHandle);
6923 	if (_scsih_get_sas_address(ioc, parent_handle, &sas_address_parent)
6924 	    != 0) {
6925 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6926 			__FILE__, __LINE__, __func__);
6927 		return -1;
6928 	}
6929 
6930 	port_id = expander_pg0.PhysicalPort;
6931 	if (sas_address_parent != ioc->sas_hba.sas_address) {
6932 		spin_lock_irqsave(&ioc->sas_node_lock, flags);
6933 		sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
6934 		    sas_address_parent,
6935 		    mpt3sas_get_port_by_id(ioc, port_id, 0));
6936 		spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
6937 		if (!sas_expander) {
6938 			rc = _scsih_expander_add(ioc, parent_handle);
6939 			if (rc != 0)
6940 				return rc;
6941 		}
6942 	}
6943 
6944 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
6945 	sas_address = le64_to_cpu(expander_pg0.SASAddress);
6946 	sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
6947 	    sas_address, mpt3sas_get_port_by_id(ioc, port_id, 0));
6948 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
6949 
6950 	if (sas_expander)
6951 		return 0;
6952 
6953 	sas_expander = kzalloc(sizeof(struct _sas_node),
6954 	    GFP_KERNEL);
6955 	if (!sas_expander) {
6956 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6957 			__FILE__, __LINE__, __func__);
6958 		return -1;
6959 	}
6960 
6961 	sas_expander->handle = handle;
6962 	sas_expander->num_phys = expander_pg0.NumPhys;
6963 	sas_expander->sas_address_parent = sas_address_parent;
6964 	sas_expander->sas_address = sas_address;
6965 	sas_expander->port = mpt3sas_get_port_by_id(ioc, port_id, 0);
6966 	if (!sas_expander->port) {
6967 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6968 		    __FILE__, __LINE__, __func__);
6969 		rc = -1;
6970 		goto out_fail;
6971 	}
6972 
6973 	ioc_info(ioc, "expander_add: handle(0x%04x), parent(0x%04x), sas_addr(0x%016llx), phys(%d)\n",
6974 		 handle, parent_handle,
6975 		 (u64)sas_expander->sas_address, sas_expander->num_phys);
6976 
6977 	if (!sas_expander->num_phys) {
6978 		rc = -1;
6979 		goto out_fail;
6980 	}
6981 	sas_expander->phy = kcalloc(sas_expander->num_phys,
6982 	    sizeof(struct _sas_phy), GFP_KERNEL);
6983 	if (!sas_expander->phy) {
6984 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6985 			__FILE__, __LINE__, __func__);
6986 		rc = -1;
6987 		goto out_fail;
6988 	}
6989 
6990 	INIT_LIST_HEAD(&sas_expander->sas_port_list);
6991 	mpt3sas_port = mpt3sas_transport_port_add(ioc, handle,
6992 	    sas_address_parent, sas_expander->port);
6993 	if (!mpt3sas_port) {
6994 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
6995 			__FILE__, __LINE__, __func__);
6996 		rc = -1;
6997 		goto out_fail;
6998 	}
6999 	sas_expander->parent_dev = &mpt3sas_port->rphy->dev;
7000 	sas_expander->rphy = mpt3sas_port->rphy;
7001 
7002 	for (i = 0 ; i < sas_expander->num_phys ; i++) {
7003 		if ((mpt3sas_config_get_expander_pg1(ioc, &mpi_reply,
7004 		    &expander_pg1, i, handle))) {
7005 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
7006 				__FILE__, __LINE__, __func__);
7007 			rc = -1;
7008 			goto out_fail;
7009 		}
7010 		sas_expander->phy[i].handle = handle;
7011 		sas_expander->phy[i].phy_id = i;
7012 		sas_expander->phy[i].port =
7013 		    mpt3sas_get_port_by_id(ioc, port_id, 0);
7014 
7015 		if ((mpt3sas_transport_add_expander_phy(ioc,
7016 		    &sas_expander->phy[i], expander_pg1,
7017 		    sas_expander->parent_dev))) {
7018 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
7019 				__FILE__, __LINE__, __func__);
7020 			rc = -1;
7021 			goto out_fail;
7022 		}
7023 	}
7024 
7025 	if (sas_expander->enclosure_handle) {
7026 		enclosure_dev =
7027 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
7028 						sas_expander->enclosure_handle);
7029 		if (enclosure_dev)
7030 			sas_expander->enclosure_logical_id =
7031 			    le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
7032 	}
7033 
7034 	_scsih_expander_node_add(ioc, sas_expander);
7035 	return 0;
7036 
7037  out_fail:
7038 
7039 	if (mpt3sas_port)
7040 		mpt3sas_transport_port_remove(ioc, sas_expander->sas_address,
7041 		    sas_address_parent, sas_expander->port);
7042 	kfree(sas_expander);
7043 	return rc;
7044 }
7045 
7046 /**
7047  * mpt3sas_expander_remove - removing expander object
7048  * @ioc: per adapter object
7049  * @sas_address: expander sas_address
7050  * @port: hba port entry
7051  */
7052 void
7053 mpt3sas_expander_remove(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
7054 	struct hba_port *port)
7055 {
7056 	struct _sas_node *sas_expander;
7057 	unsigned long flags;
7058 
7059 	if (ioc->shost_recovery)
7060 		return;
7061 
7062 	if (!port)
7063 		return;
7064 
7065 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
7066 	sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
7067 	    sas_address, port);
7068 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
7069 	if (sas_expander)
7070 		_scsih_expander_node_remove(ioc, sas_expander);
7071 }
7072 
7073 /**
7074  * _scsih_done -  internal SCSI_IO callback handler.
7075  * @ioc: per adapter object
7076  * @smid: system request message index
7077  * @msix_index: MSIX table index supplied by the OS
7078  * @reply: reply message frame(lower 32bit addr)
7079  *
7080  * Callback handler when sending internal generated SCSI_IO.
7081  * The callback index passed is `ioc->scsih_cb_idx`
7082  *
7083  * Return: 1 meaning mf should be freed from _base_interrupt
7084  *         0 means the mf is freed from this function.
7085  */
7086 static u8
7087 _scsih_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
7088 {
7089 	MPI2DefaultReply_t *mpi_reply;
7090 
7091 	mpi_reply =  mpt3sas_base_get_reply_virt_addr(ioc, reply);
7092 	if (ioc->scsih_cmds.status == MPT3_CMD_NOT_USED)
7093 		return 1;
7094 	if (ioc->scsih_cmds.smid != smid)
7095 		return 1;
7096 	ioc->scsih_cmds.status |= MPT3_CMD_COMPLETE;
7097 	if (mpi_reply) {
7098 		memcpy(ioc->scsih_cmds.reply, mpi_reply,
7099 		    mpi_reply->MsgLength*4);
7100 		ioc->scsih_cmds.status |= MPT3_CMD_REPLY_VALID;
7101 	}
7102 	ioc->scsih_cmds.status &= ~MPT3_CMD_PENDING;
7103 	complete(&ioc->scsih_cmds.done);
7104 	return 1;
7105 }
7106 
7107 
7108 
7109 
7110 #define MPT3_MAX_LUNS (255)
7111 
7112 
7113 /**
7114  * _scsih_check_access_status - check access flags
7115  * @ioc: per adapter object
7116  * @sas_address: sas address
7117  * @handle: sas device handle
7118  * @access_status: errors returned during discovery of the device
7119  *
7120  * Return: 0 for success, else failure
7121  */
7122 static u8
7123 _scsih_check_access_status(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
7124 	u16 handle, u8 access_status)
7125 {
7126 	u8 rc = 1;
7127 	char *desc = NULL;
7128 
7129 	switch (access_status) {
7130 	case MPI2_SAS_DEVICE0_ASTATUS_NO_ERRORS:
7131 	case MPI2_SAS_DEVICE0_ASTATUS_SATA_NEEDS_INITIALIZATION:
7132 		rc = 0;
7133 		break;
7134 	case MPI2_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED:
7135 		desc = "sata capability failed";
7136 		break;
7137 	case MPI2_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT:
7138 		desc = "sata affiliation conflict";
7139 		break;
7140 	case MPI2_SAS_DEVICE0_ASTATUS_ROUTE_NOT_ADDRESSABLE:
7141 		desc = "route not addressable";
7142 		break;
7143 	case MPI2_SAS_DEVICE0_ASTATUS_SMP_ERROR_NOT_ADDRESSABLE:
7144 		desc = "smp error not addressable";
7145 		break;
7146 	case MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED:
7147 		desc = "device blocked";
7148 		break;
7149 	case MPI2_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED:
7150 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN:
7151 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT:
7152 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_DIAG:
7153 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION:
7154 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER:
7155 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_PIO_SN:
7156 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN:
7157 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN:
7158 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION:
7159 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE:
7160 	case MPI2_SAS_DEVICE0_ASTATUS_SIF_MAX:
7161 		desc = "sata initialization failed";
7162 		break;
7163 	default:
7164 		desc = "unknown";
7165 		break;
7166 	}
7167 
7168 	if (!rc)
7169 		return 0;
7170 
7171 	ioc_err(ioc, "discovery errors(%s): sas_address(0x%016llx), handle(0x%04x)\n",
7172 		desc, (u64)sas_address, handle);
7173 	return rc;
7174 }
7175 
7176 /**
7177  * _scsih_check_device - checking device responsiveness
7178  * @ioc: per adapter object
7179  * @parent_sas_address: sas address of parent expander or sas host
7180  * @handle: attached device handle
7181  * @phy_number: phy number
7182  * @link_rate: new link rate
7183  */
7184 static void
7185 _scsih_check_device(struct MPT3SAS_ADAPTER *ioc,
7186 	u64 parent_sas_address, u16 handle, u8 phy_number, u8 link_rate)
7187 {
7188 	Mpi2ConfigReply_t mpi_reply;
7189 	Mpi2SasDevicePage0_t sas_device_pg0;
7190 	struct _sas_device *sas_device = NULL;
7191 	struct _enclosure_node *enclosure_dev = NULL;
7192 	u32 ioc_status;
7193 	unsigned long flags;
7194 	u64 sas_address;
7195 	struct scsi_target *starget;
7196 	struct MPT3SAS_TARGET *sas_target_priv_data;
7197 	u32 device_info;
7198 	struct hba_port *port;
7199 
7200 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
7201 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle)))
7202 		return;
7203 
7204 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
7205 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
7206 		return;
7207 
7208 	/* wide port handling ~ we need only handle device once for the phy that
7209 	 * is matched in sas device page zero
7210 	 */
7211 	if (phy_number != sas_device_pg0.PhyNum)
7212 		return;
7213 
7214 	/* check if this is end device */
7215 	device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
7216 	if (!(_scsih_is_end_device(device_info)))
7217 		return;
7218 
7219 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
7220 	sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
7221 	port = mpt3sas_get_port_by_id(ioc, sas_device_pg0.PhysicalPort, 0);
7222 	if (!port)
7223 		goto out_unlock;
7224 	sas_device = __mpt3sas_get_sdev_by_addr(ioc,
7225 	    sas_address, port);
7226 
7227 	if (!sas_device)
7228 		goto out_unlock;
7229 
7230 	if (unlikely(sas_device->handle != handle)) {
7231 		starget = sas_device->starget;
7232 		sas_target_priv_data = starget->hostdata;
7233 		starget_printk(KERN_INFO, starget,
7234 			"handle changed from(0x%04x) to (0x%04x)!!!\n",
7235 			sas_device->handle, handle);
7236 		sas_target_priv_data->handle = handle;
7237 		sas_device->handle = handle;
7238 		if (le16_to_cpu(sas_device_pg0.Flags) &
7239 		     MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
7240 			sas_device->enclosure_level =
7241 				sas_device_pg0.EnclosureLevel;
7242 			memcpy(sas_device->connector_name,
7243 				sas_device_pg0.ConnectorName, 4);
7244 			sas_device->connector_name[4] = '\0';
7245 		} else {
7246 			sas_device->enclosure_level = 0;
7247 			sas_device->connector_name[0] = '\0';
7248 		}
7249 
7250 		sas_device->enclosure_handle =
7251 				le16_to_cpu(sas_device_pg0.EnclosureHandle);
7252 		sas_device->is_chassis_slot_valid = 0;
7253 		enclosure_dev = mpt3sas_scsih_enclosure_find_by_handle(ioc,
7254 						sas_device->enclosure_handle);
7255 		if (enclosure_dev) {
7256 			sas_device->enclosure_logical_id =
7257 			    le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
7258 			if (le16_to_cpu(enclosure_dev->pg0.Flags) &
7259 			    MPI2_SAS_ENCLS0_FLAGS_CHASSIS_SLOT_VALID) {
7260 				sas_device->is_chassis_slot_valid = 1;
7261 				sas_device->chassis_slot =
7262 					enclosure_dev->pg0.ChassisSlot;
7263 			}
7264 		}
7265 	}
7266 
7267 	/* check if device is present */
7268 	if (!(le16_to_cpu(sas_device_pg0.Flags) &
7269 	    MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)) {
7270 		ioc_err(ioc, "device is not present handle(0x%04x), flags!!!\n",
7271 			handle);
7272 		goto out_unlock;
7273 	}
7274 
7275 	/* check if there were any issues with discovery */
7276 	if (_scsih_check_access_status(ioc, sas_address, handle,
7277 	    sas_device_pg0.AccessStatus))
7278 		goto out_unlock;
7279 
7280 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7281 	_scsih_ublock_io_device(ioc, sas_address, port);
7282 
7283 	if (sas_device)
7284 		sas_device_put(sas_device);
7285 	return;
7286 
7287 out_unlock:
7288 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7289 	if (sas_device)
7290 		sas_device_put(sas_device);
7291 }
7292 
7293 /**
7294  * _scsih_add_device -  creating sas device object
7295  * @ioc: per adapter object
7296  * @handle: sas device handle
7297  * @phy_num: phy number end device attached to
7298  * @is_pd: is this hidden raid component
7299  *
7300  * Creating end device object, stored in ioc->sas_device_list.
7301  *
7302  * Return: 0 for success, non-zero for failure.
7303  */
7304 static int
7305 _scsih_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phy_num,
7306 	u8 is_pd)
7307 {
7308 	Mpi2ConfigReply_t mpi_reply;
7309 	Mpi2SasDevicePage0_t sas_device_pg0;
7310 	struct _sas_device *sas_device;
7311 	struct _enclosure_node *enclosure_dev = NULL;
7312 	u32 ioc_status;
7313 	u64 sas_address;
7314 	u32 device_info;
7315 	u8 port_id;
7316 
7317 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
7318 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
7319 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
7320 			__FILE__, __LINE__, __func__);
7321 		return -1;
7322 	}
7323 
7324 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
7325 	    MPI2_IOCSTATUS_MASK;
7326 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
7327 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
7328 			__FILE__, __LINE__, __func__);
7329 		return -1;
7330 	}
7331 
7332 	/* check if this is end device */
7333 	device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
7334 	if (!(_scsih_is_end_device(device_info)))
7335 		return -1;
7336 	set_bit(handle, ioc->pend_os_device_add);
7337 	sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
7338 
7339 	/* check if device is present */
7340 	if (!(le16_to_cpu(sas_device_pg0.Flags) &
7341 	    MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)) {
7342 		ioc_err(ioc, "device is not present handle(0x04%x)!!!\n",
7343 			handle);
7344 		return -1;
7345 	}
7346 
7347 	/* check if there were any issues with discovery */
7348 	if (_scsih_check_access_status(ioc, sas_address, handle,
7349 	    sas_device_pg0.AccessStatus))
7350 		return -1;
7351 
7352 	port_id = sas_device_pg0.PhysicalPort;
7353 	sas_device = mpt3sas_get_sdev_by_addr(ioc,
7354 	    sas_address, mpt3sas_get_port_by_id(ioc, port_id, 0));
7355 	if (sas_device) {
7356 		clear_bit(handle, ioc->pend_os_device_add);
7357 		sas_device_put(sas_device);
7358 		return -1;
7359 	}
7360 
7361 	if (sas_device_pg0.EnclosureHandle) {
7362 		enclosure_dev =
7363 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
7364 			    le16_to_cpu(sas_device_pg0.EnclosureHandle));
7365 		if (enclosure_dev == NULL)
7366 			ioc_info(ioc, "Enclosure handle(0x%04x) doesn't match with enclosure device!\n",
7367 				 sas_device_pg0.EnclosureHandle);
7368 	}
7369 
7370 	sas_device = kzalloc(sizeof(struct _sas_device),
7371 	    GFP_KERNEL);
7372 	if (!sas_device) {
7373 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
7374 			__FILE__, __LINE__, __func__);
7375 		return 0;
7376 	}
7377 
7378 	kref_init(&sas_device->refcount);
7379 	sas_device->handle = handle;
7380 	if (_scsih_get_sas_address(ioc,
7381 	    le16_to_cpu(sas_device_pg0.ParentDevHandle),
7382 	    &sas_device->sas_address_parent) != 0)
7383 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
7384 			__FILE__, __LINE__, __func__);
7385 	sas_device->enclosure_handle =
7386 	    le16_to_cpu(sas_device_pg0.EnclosureHandle);
7387 	if (sas_device->enclosure_handle != 0)
7388 		sas_device->slot =
7389 		    le16_to_cpu(sas_device_pg0.Slot);
7390 	sas_device->device_info = device_info;
7391 	sas_device->sas_address = sas_address;
7392 	sas_device->phy = sas_device_pg0.PhyNum;
7393 	sas_device->fast_path = (le16_to_cpu(sas_device_pg0.Flags) &
7394 	    MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) ? 1 : 0;
7395 	sas_device->port = mpt3sas_get_port_by_id(ioc, port_id, 0);
7396 	if (!sas_device->port) {
7397 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
7398 		    __FILE__, __LINE__, __func__);
7399 		goto out;
7400 	}
7401 
7402 	if (le16_to_cpu(sas_device_pg0.Flags)
7403 		& MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
7404 		sas_device->enclosure_level =
7405 			sas_device_pg0.EnclosureLevel;
7406 		memcpy(sas_device->connector_name,
7407 			sas_device_pg0.ConnectorName, 4);
7408 		sas_device->connector_name[4] = '\0';
7409 	} else {
7410 		sas_device->enclosure_level = 0;
7411 		sas_device->connector_name[0] = '\0';
7412 	}
7413 	/* get enclosure_logical_id & chassis_slot*/
7414 	sas_device->is_chassis_slot_valid = 0;
7415 	if (enclosure_dev) {
7416 		sas_device->enclosure_logical_id =
7417 		    le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
7418 		if (le16_to_cpu(enclosure_dev->pg0.Flags) &
7419 		    MPI2_SAS_ENCLS0_FLAGS_CHASSIS_SLOT_VALID) {
7420 			sas_device->is_chassis_slot_valid = 1;
7421 			sas_device->chassis_slot =
7422 					enclosure_dev->pg0.ChassisSlot;
7423 		}
7424 	}
7425 
7426 	/* get device name */
7427 	sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName);
7428 	sas_device->port_type = sas_device_pg0.MaxPortConnections;
7429 	ioc_info(ioc,
7430 	    "handle(0x%0x) sas_address(0x%016llx) port_type(0x%0x)\n",
7431 	    handle, sas_device->sas_address, sas_device->port_type);
7432 
7433 	if (ioc->wait_for_discovery_to_complete)
7434 		_scsih_sas_device_init_add(ioc, sas_device);
7435 	else
7436 		_scsih_sas_device_add(ioc, sas_device);
7437 
7438 out:
7439 	sas_device_put(sas_device);
7440 	return 0;
7441 }
7442 
7443 /**
7444  * _scsih_remove_device -  removing sas device object
7445  * @ioc: per adapter object
7446  * @sas_device: the sas_device object
7447  */
7448 static void
7449 _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
7450 	struct _sas_device *sas_device)
7451 {
7452 	struct MPT3SAS_TARGET *sas_target_priv_data;
7453 
7454 	if ((ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM) &&
7455 	     (sas_device->pfa_led_on)) {
7456 		_scsih_turn_off_pfa_led(ioc, sas_device);
7457 		sas_device->pfa_led_on = 0;
7458 	}
7459 
7460 	dewtprintk(ioc,
7461 		   ioc_info(ioc, "%s: enter: handle(0x%04x), sas_addr(0x%016llx)\n",
7462 			    __func__,
7463 			    sas_device->handle, (u64)sas_device->sas_address));
7464 
7465 	dewtprintk(ioc, _scsih_display_enclosure_chassis_info(ioc, sas_device,
7466 	    NULL, NULL));
7467 
7468 	if (sas_device->starget && sas_device->starget->hostdata) {
7469 		sas_target_priv_data = sas_device->starget->hostdata;
7470 		sas_target_priv_data->deleted = 1;
7471 		_scsih_ublock_io_device(ioc, sas_device->sas_address,
7472 		    sas_device->port);
7473 		sas_target_priv_data->handle =
7474 		     MPT3SAS_INVALID_DEVICE_HANDLE;
7475 	}
7476 
7477 	if (!ioc->hide_drives)
7478 		mpt3sas_transport_port_remove(ioc,
7479 		    sas_device->sas_address,
7480 		    sas_device->sas_address_parent,
7481 		    sas_device->port);
7482 
7483 	ioc_info(ioc, "removing handle(0x%04x), sas_addr(0x%016llx)\n",
7484 		 sas_device->handle, (u64)sas_device->sas_address);
7485 
7486 	_scsih_display_enclosure_chassis_info(ioc, sas_device, NULL, NULL);
7487 
7488 	dewtprintk(ioc,
7489 		   ioc_info(ioc, "%s: exit: handle(0x%04x), sas_addr(0x%016llx)\n",
7490 			    __func__,
7491 			    sas_device->handle, (u64)sas_device->sas_address));
7492 	dewtprintk(ioc, _scsih_display_enclosure_chassis_info(ioc, sas_device,
7493 	    NULL, NULL));
7494 }
7495 
7496 /**
7497  * _scsih_sas_topology_change_event_debug - debug for topology event
7498  * @ioc: per adapter object
7499  * @event_data: event data payload
7500  * Context: user.
7501  */
7502 static void
7503 _scsih_sas_topology_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
7504 	Mpi2EventDataSasTopologyChangeList_t *event_data)
7505 {
7506 	int i;
7507 	u16 handle;
7508 	u16 reason_code;
7509 	u8 phy_number;
7510 	char *status_str = NULL;
7511 	u8 link_rate, prev_link_rate;
7512 
7513 	switch (event_data->ExpStatus) {
7514 	case MPI2_EVENT_SAS_TOPO_ES_ADDED:
7515 		status_str = "add";
7516 		break;
7517 	case MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING:
7518 		status_str = "remove";
7519 		break;
7520 	case MPI2_EVENT_SAS_TOPO_ES_RESPONDING:
7521 	case 0:
7522 		status_str =  "responding";
7523 		break;
7524 	case MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING:
7525 		status_str = "remove delay";
7526 		break;
7527 	default:
7528 		status_str = "unknown status";
7529 		break;
7530 	}
7531 	ioc_info(ioc, "sas topology change: (%s)\n", status_str);
7532 	pr_info("\thandle(0x%04x), enclosure_handle(0x%04x) " \
7533 	    "start_phy(%02d), count(%d)\n",
7534 	    le16_to_cpu(event_data->ExpanderDevHandle),
7535 	    le16_to_cpu(event_data->EnclosureHandle),
7536 	    event_data->StartPhyNum, event_data->NumEntries);
7537 	for (i = 0; i < event_data->NumEntries; i++) {
7538 		handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
7539 		if (!handle)
7540 			continue;
7541 		phy_number = event_data->StartPhyNum + i;
7542 		reason_code = event_data->PHY[i].PhyStatus &
7543 		    MPI2_EVENT_SAS_TOPO_RC_MASK;
7544 		switch (reason_code) {
7545 		case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
7546 			status_str = "target add";
7547 			break;
7548 		case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING:
7549 			status_str = "target remove";
7550 			break;
7551 		case MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING:
7552 			status_str = "delay target remove";
7553 			break;
7554 		case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
7555 			status_str = "link rate change";
7556 			break;
7557 		case MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE:
7558 			status_str = "target responding";
7559 			break;
7560 		default:
7561 			status_str = "unknown";
7562 			break;
7563 		}
7564 		link_rate = event_data->PHY[i].LinkRate >> 4;
7565 		prev_link_rate = event_data->PHY[i].LinkRate & 0xF;
7566 		pr_info("\tphy(%02d), attached_handle(0x%04x): %s:" \
7567 		    " link rate: new(0x%02x), old(0x%02x)\n", phy_number,
7568 		    handle, status_str, link_rate, prev_link_rate);
7569 
7570 	}
7571 }
7572 
7573 /**
7574  * _scsih_sas_topology_change_event - handle topology changes
7575  * @ioc: per adapter object
7576  * @fw_event: The fw_event_work object
7577  * Context: user.
7578  *
7579  */
7580 static int
7581 _scsih_sas_topology_change_event(struct MPT3SAS_ADAPTER *ioc,
7582 	struct fw_event_work *fw_event)
7583 {
7584 	int i;
7585 	u16 parent_handle, handle;
7586 	u16 reason_code;
7587 	u8 phy_number, max_phys;
7588 	struct _sas_node *sas_expander;
7589 	u64 sas_address;
7590 	unsigned long flags;
7591 	u8 link_rate, prev_link_rate;
7592 	struct hba_port *port;
7593 	Mpi2EventDataSasTopologyChangeList_t *event_data =
7594 		(Mpi2EventDataSasTopologyChangeList_t *)
7595 		fw_event->event_data;
7596 
7597 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
7598 		_scsih_sas_topology_change_event_debug(ioc, event_data);
7599 
7600 	if (ioc->shost_recovery || ioc->remove_host || ioc->pci_error_recovery)
7601 		return 0;
7602 
7603 	if (!ioc->sas_hba.num_phys)
7604 		_scsih_sas_host_add(ioc);
7605 	else
7606 		_scsih_sas_host_refresh(ioc);
7607 
7608 	if (fw_event->ignore) {
7609 		dewtprintk(ioc, ioc_info(ioc, "ignoring expander event\n"));
7610 		return 0;
7611 	}
7612 
7613 	parent_handle = le16_to_cpu(event_data->ExpanderDevHandle);
7614 	port = mpt3sas_get_port_by_id(ioc, event_data->PhysicalPort, 0);
7615 
7616 	/* handle expander add */
7617 	if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_ADDED)
7618 		if (_scsih_expander_add(ioc, parent_handle) != 0)
7619 			return 0;
7620 
7621 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
7622 	sas_expander = mpt3sas_scsih_expander_find_by_handle(ioc,
7623 	    parent_handle);
7624 	if (sas_expander) {
7625 		sas_address = sas_expander->sas_address;
7626 		max_phys = sas_expander->num_phys;
7627 		port = sas_expander->port;
7628 	} else if (parent_handle < ioc->sas_hba.num_phys) {
7629 		sas_address = ioc->sas_hba.sas_address;
7630 		max_phys = ioc->sas_hba.num_phys;
7631 	} else {
7632 		spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
7633 		return 0;
7634 	}
7635 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
7636 
7637 	/* handle siblings events */
7638 	for (i = 0; i < event_data->NumEntries; i++) {
7639 		if (fw_event->ignore) {
7640 			dewtprintk(ioc,
7641 				   ioc_info(ioc, "ignoring expander event\n"));
7642 			return 0;
7643 		}
7644 		if (ioc->remove_host || ioc->pci_error_recovery)
7645 			return 0;
7646 		phy_number = event_data->StartPhyNum + i;
7647 		if (phy_number >= max_phys)
7648 			continue;
7649 		reason_code = event_data->PHY[i].PhyStatus &
7650 		    MPI2_EVENT_SAS_TOPO_RC_MASK;
7651 		if ((event_data->PHY[i].PhyStatus &
7652 		    MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) && (reason_code !=
7653 		    MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING))
7654 				continue;
7655 		handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
7656 		if (!handle)
7657 			continue;
7658 		link_rate = event_data->PHY[i].LinkRate >> 4;
7659 		prev_link_rate = event_data->PHY[i].LinkRate & 0xF;
7660 		switch (reason_code) {
7661 		case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
7662 
7663 			if (ioc->shost_recovery)
7664 				break;
7665 
7666 			if (link_rate == prev_link_rate)
7667 				break;
7668 
7669 			mpt3sas_transport_update_links(ioc, sas_address,
7670 			    handle, phy_number, link_rate, port);
7671 
7672 			if (link_rate < MPI2_SAS_NEG_LINK_RATE_1_5)
7673 				break;
7674 
7675 			_scsih_check_device(ioc, sas_address, handle,
7676 			    phy_number, link_rate);
7677 
7678 			if (!test_bit(handle, ioc->pend_os_device_add))
7679 				break;
7680 
7681 			fallthrough;
7682 
7683 		case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
7684 
7685 			if (ioc->shost_recovery)
7686 				break;
7687 
7688 			mpt3sas_transport_update_links(ioc, sas_address,
7689 			    handle, phy_number, link_rate, port);
7690 
7691 			_scsih_add_device(ioc, handle, phy_number, 0);
7692 
7693 			break;
7694 		case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING:
7695 
7696 			_scsih_device_remove_by_handle(ioc, handle);
7697 			break;
7698 		}
7699 	}
7700 
7701 	/* handle expander removal */
7702 	if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING &&
7703 	    sas_expander)
7704 		mpt3sas_expander_remove(ioc, sas_address, port);
7705 
7706 	return 0;
7707 }
7708 
7709 /**
7710  * _scsih_sas_device_status_change_event_debug - debug for device event
7711  * @ioc: ?
7712  * @event_data: event data payload
7713  * Context: user.
7714  */
7715 static void
7716 _scsih_sas_device_status_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
7717 	Mpi2EventDataSasDeviceStatusChange_t *event_data)
7718 {
7719 	char *reason_str = NULL;
7720 
7721 	switch (event_data->ReasonCode) {
7722 	case MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
7723 		reason_str = "smart data";
7724 		break;
7725 	case MPI2_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
7726 		reason_str = "unsupported device discovered";
7727 		break;
7728 	case MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
7729 		reason_str = "internal device reset";
7730 		break;
7731 	case MPI2_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
7732 		reason_str = "internal task abort";
7733 		break;
7734 	case MPI2_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
7735 		reason_str = "internal task abort set";
7736 		break;
7737 	case MPI2_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
7738 		reason_str = "internal clear task set";
7739 		break;
7740 	case MPI2_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
7741 		reason_str = "internal query task";
7742 		break;
7743 	case MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE:
7744 		reason_str = "sata init failure";
7745 		break;
7746 	case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET:
7747 		reason_str = "internal device reset complete";
7748 		break;
7749 	case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_TASK_ABORT_INTERNAL:
7750 		reason_str = "internal task abort complete";
7751 		break;
7752 	case MPI2_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION:
7753 		reason_str = "internal async notification";
7754 		break;
7755 	case MPI2_EVENT_SAS_DEV_STAT_RC_EXPANDER_REDUCED_FUNCTIONALITY:
7756 		reason_str = "expander reduced functionality";
7757 		break;
7758 	case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_EXPANDER_REDUCED_FUNCTIONALITY:
7759 		reason_str = "expander reduced functionality complete";
7760 		break;
7761 	default:
7762 		reason_str = "unknown reason";
7763 		break;
7764 	}
7765 	ioc_info(ioc, "device status change: (%s)\thandle(0x%04x), sas address(0x%016llx), tag(%d)",
7766 		 reason_str, le16_to_cpu(event_data->DevHandle),
7767 		 (u64)le64_to_cpu(event_data->SASAddress),
7768 		 le16_to_cpu(event_data->TaskTag));
7769 	if (event_data->ReasonCode == MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA)
7770 		pr_cont(", ASC(0x%x), ASCQ(0x%x)\n",
7771 			event_data->ASC, event_data->ASCQ);
7772 	pr_cont("\n");
7773 }
7774 
7775 /**
7776  * _scsih_sas_device_status_change_event - handle device status change
7777  * @ioc: per adapter object
7778  * @event_data: The fw event
7779  * Context: user.
7780  */
7781 static void
7782 _scsih_sas_device_status_change_event(struct MPT3SAS_ADAPTER *ioc,
7783 	Mpi2EventDataSasDeviceStatusChange_t *event_data)
7784 {
7785 	struct MPT3SAS_TARGET *target_priv_data;
7786 	struct _sas_device *sas_device;
7787 	u64 sas_address;
7788 	unsigned long flags;
7789 
7790 	/* In MPI Revision K (0xC), the internal device reset complete was
7791 	 * implemented, so avoid setting tm_busy flag for older firmware.
7792 	 */
7793 	if ((ioc->facts.HeaderVersion >> 8) < 0xC)
7794 		return;
7795 
7796 	if (event_data->ReasonCode !=
7797 	    MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET &&
7798 	   event_data->ReasonCode !=
7799 	    MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET)
7800 		return;
7801 
7802 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
7803 	sas_address = le64_to_cpu(event_data->SASAddress);
7804 	sas_device = __mpt3sas_get_sdev_by_addr(ioc,
7805 	    sas_address,
7806 	    mpt3sas_get_port_by_id(ioc, event_data->PhysicalPort, 0));
7807 
7808 	if (!sas_device || !sas_device->starget)
7809 		goto out;
7810 
7811 	target_priv_data = sas_device->starget->hostdata;
7812 	if (!target_priv_data)
7813 		goto out;
7814 
7815 	if (event_data->ReasonCode ==
7816 	    MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET)
7817 		target_priv_data->tm_busy = 1;
7818 	else
7819 		target_priv_data->tm_busy = 0;
7820 
7821 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
7822 		ioc_info(ioc,
7823 		    "%s tm_busy flag for handle(0x%04x)\n",
7824 		    (target_priv_data->tm_busy == 1) ? "Enable" : "Disable",
7825 		    target_priv_data->handle);
7826 
7827 out:
7828 	if (sas_device)
7829 		sas_device_put(sas_device);
7830 
7831 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7832 }
7833 
7834 
7835 /**
7836  * _scsih_check_pcie_access_status - check access flags
7837  * @ioc: per adapter object
7838  * @wwid: wwid
7839  * @handle: sas device handle
7840  * @access_status: errors returned during discovery of the device
7841  *
7842  * Return: 0 for success, else failure
7843  */
7844 static u8
7845 _scsih_check_pcie_access_status(struct MPT3SAS_ADAPTER *ioc, u64 wwid,
7846 	u16 handle, u8 access_status)
7847 {
7848 	u8 rc = 1;
7849 	char *desc = NULL;
7850 
7851 	switch (access_status) {
7852 	case MPI26_PCIEDEV0_ASTATUS_NO_ERRORS:
7853 	case MPI26_PCIEDEV0_ASTATUS_NEEDS_INITIALIZATION:
7854 		rc = 0;
7855 		break;
7856 	case MPI26_PCIEDEV0_ASTATUS_CAPABILITY_FAILED:
7857 		desc = "PCIe device capability failed";
7858 		break;
7859 	case MPI26_PCIEDEV0_ASTATUS_DEVICE_BLOCKED:
7860 		desc = "PCIe device blocked";
7861 		ioc_info(ioc,
7862 		    "Device with Access Status (%s): wwid(0x%016llx), "
7863 		    "handle(0x%04x)\n ll only be added to the internal list",
7864 		    desc, (u64)wwid, handle);
7865 		rc = 0;
7866 		break;
7867 	case MPI26_PCIEDEV0_ASTATUS_MEMORY_SPACE_ACCESS_FAILED:
7868 		desc = "PCIe device mem space access failed";
7869 		break;
7870 	case MPI26_PCIEDEV0_ASTATUS_UNSUPPORTED_DEVICE:
7871 		desc = "PCIe device unsupported";
7872 		break;
7873 	case MPI26_PCIEDEV0_ASTATUS_MSIX_REQUIRED:
7874 		desc = "PCIe device MSIx Required";
7875 		break;
7876 	case MPI26_PCIEDEV0_ASTATUS_INIT_FAIL_MAX:
7877 		desc = "PCIe device init fail max";
7878 		break;
7879 	case MPI26_PCIEDEV0_ASTATUS_UNKNOWN:
7880 		desc = "PCIe device status unknown";
7881 		break;
7882 	case MPI26_PCIEDEV0_ASTATUS_NVME_READY_TIMEOUT:
7883 		desc = "nvme ready timeout";
7884 		break;
7885 	case MPI26_PCIEDEV0_ASTATUS_NVME_DEVCFG_UNSUPPORTED:
7886 		desc = "nvme device configuration unsupported";
7887 		break;
7888 	case MPI26_PCIEDEV0_ASTATUS_NVME_IDENTIFY_FAILED:
7889 		desc = "nvme identify failed";
7890 		break;
7891 	case MPI26_PCIEDEV0_ASTATUS_NVME_QCONFIG_FAILED:
7892 		desc = "nvme qconfig failed";
7893 		break;
7894 	case MPI26_PCIEDEV0_ASTATUS_NVME_QCREATION_FAILED:
7895 		desc = "nvme qcreation failed";
7896 		break;
7897 	case MPI26_PCIEDEV0_ASTATUS_NVME_EVENTCFG_FAILED:
7898 		desc = "nvme eventcfg failed";
7899 		break;
7900 	case MPI26_PCIEDEV0_ASTATUS_NVME_GET_FEATURE_STAT_FAILED:
7901 		desc = "nvme get feature stat failed";
7902 		break;
7903 	case MPI26_PCIEDEV0_ASTATUS_NVME_IDLE_TIMEOUT:
7904 		desc = "nvme idle timeout";
7905 		break;
7906 	case MPI26_PCIEDEV0_ASTATUS_NVME_FAILURE_STATUS:
7907 		desc = "nvme failure status";
7908 		break;
7909 	default:
7910 		ioc_err(ioc, "NVMe discovery error(0x%02x): wwid(0x%016llx), handle(0x%04x)\n",
7911 			access_status, (u64)wwid, handle);
7912 		return rc;
7913 	}
7914 
7915 	if (!rc)
7916 		return rc;
7917 
7918 	ioc_info(ioc, "NVMe discovery error(%s): wwid(0x%016llx), handle(0x%04x)\n",
7919 		 desc, (u64)wwid, handle);
7920 	return rc;
7921 }
7922 
7923 /**
7924  * _scsih_pcie_device_remove_from_sml -  removing pcie device
7925  * from SML and free up associated memory
7926  * @ioc: per adapter object
7927  * @pcie_device: the pcie_device object
7928  */
7929 static void
7930 _scsih_pcie_device_remove_from_sml(struct MPT3SAS_ADAPTER *ioc,
7931 	struct _pcie_device *pcie_device)
7932 {
7933 	struct MPT3SAS_TARGET *sas_target_priv_data;
7934 
7935 	dewtprintk(ioc,
7936 		   ioc_info(ioc, "%s: enter: handle(0x%04x), wwid(0x%016llx)\n",
7937 			    __func__,
7938 			    pcie_device->handle, (u64)pcie_device->wwid));
7939 	if (pcie_device->enclosure_handle != 0)
7940 		dewtprintk(ioc,
7941 			   ioc_info(ioc, "%s: enter: enclosure logical id(0x%016llx), slot(%d)\n",
7942 				    __func__,
7943 				    (u64)pcie_device->enclosure_logical_id,
7944 				    pcie_device->slot));
7945 	if (pcie_device->connector_name[0] != '\0')
7946 		dewtprintk(ioc,
7947 			   ioc_info(ioc, "%s: enter: enclosure level(0x%04x), connector name(%s)\n",
7948 				    __func__,
7949 				    pcie_device->enclosure_level,
7950 				    pcie_device->connector_name));
7951 
7952 	if (pcie_device->starget && pcie_device->starget->hostdata) {
7953 		sas_target_priv_data = pcie_device->starget->hostdata;
7954 		sas_target_priv_data->deleted = 1;
7955 		_scsih_ublock_io_device(ioc, pcie_device->wwid, NULL);
7956 		sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
7957 	}
7958 
7959 	ioc_info(ioc, "removing handle(0x%04x), wwid(0x%016llx)\n",
7960 		 pcie_device->handle, (u64)pcie_device->wwid);
7961 	if (pcie_device->enclosure_handle != 0)
7962 		ioc_info(ioc, "removing : enclosure logical id(0x%016llx), slot(%d)\n",
7963 			 (u64)pcie_device->enclosure_logical_id,
7964 			 pcie_device->slot);
7965 	if (pcie_device->connector_name[0] != '\0')
7966 		ioc_info(ioc, "removing: enclosure level(0x%04x), connector name( %s)\n",
7967 			 pcie_device->enclosure_level,
7968 			 pcie_device->connector_name);
7969 
7970 	if (pcie_device->starget && (pcie_device->access_status !=
7971 				MPI26_PCIEDEV0_ASTATUS_DEVICE_BLOCKED))
7972 		scsi_remove_target(&pcie_device->starget->dev);
7973 	dewtprintk(ioc,
7974 		   ioc_info(ioc, "%s: exit: handle(0x%04x), wwid(0x%016llx)\n",
7975 			    __func__,
7976 			    pcie_device->handle, (u64)pcie_device->wwid));
7977 	if (pcie_device->enclosure_handle != 0)
7978 		dewtprintk(ioc,
7979 			   ioc_info(ioc, "%s: exit: enclosure logical id(0x%016llx), slot(%d)\n",
7980 				    __func__,
7981 				    (u64)pcie_device->enclosure_logical_id,
7982 				    pcie_device->slot));
7983 	if (pcie_device->connector_name[0] != '\0')
7984 		dewtprintk(ioc,
7985 			   ioc_info(ioc, "%s: exit: enclosure level(0x%04x), connector name( %s)\n",
7986 				    __func__,
7987 				    pcie_device->enclosure_level,
7988 				    pcie_device->connector_name));
7989 
7990 	kfree(pcie_device->serial_number);
7991 }
7992 
7993 
7994 /**
7995  * _scsih_pcie_check_device - checking device responsiveness
7996  * @ioc: per adapter object
7997  * @handle: attached device handle
7998  */
7999 static void
8000 _scsih_pcie_check_device(struct MPT3SAS_ADAPTER *ioc, u16 handle)
8001 {
8002 	Mpi2ConfigReply_t mpi_reply;
8003 	Mpi26PCIeDevicePage0_t pcie_device_pg0;
8004 	u32 ioc_status;
8005 	struct _pcie_device *pcie_device;
8006 	u64 wwid;
8007 	unsigned long flags;
8008 	struct scsi_target *starget;
8009 	struct MPT3SAS_TARGET *sas_target_priv_data;
8010 	u32 device_info;
8011 
8012 	if ((mpt3sas_config_get_pcie_device_pg0(ioc, &mpi_reply,
8013 		&pcie_device_pg0, MPI26_PCIE_DEVICE_PGAD_FORM_HANDLE, handle)))
8014 		return;
8015 
8016 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
8017 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
8018 		return;
8019 
8020 	/* check if this is end device */
8021 	device_info = le32_to_cpu(pcie_device_pg0.DeviceInfo);
8022 	if (!(_scsih_is_nvme_pciescsi_device(device_info)))
8023 		return;
8024 
8025 	wwid = le64_to_cpu(pcie_device_pg0.WWID);
8026 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
8027 	pcie_device = __mpt3sas_get_pdev_by_wwid(ioc, wwid);
8028 
8029 	if (!pcie_device) {
8030 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8031 		return;
8032 	}
8033 
8034 	if (unlikely(pcie_device->handle != handle)) {
8035 		starget = pcie_device->starget;
8036 		sas_target_priv_data = starget->hostdata;
8037 		pcie_device->access_status = pcie_device_pg0.AccessStatus;
8038 		starget_printk(KERN_INFO, starget,
8039 		    "handle changed from(0x%04x) to (0x%04x)!!!\n",
8040 		    pcie_device->handle, handle);
8041 		sas_target_priv_data->handle = handle;
8042 		pcie_device->handle = handle;
8043 
8044 		if (le32_to_cpu(pcie_device_pg0.Flags) &
8045 		    MPI26_PCIEDEV0_FLAGS_ENCL_LEVEL_VALID) {
8046 			pcie_device->enclosure_level =
8047 			    pcie_device_pg0.EnclosureLevel;
8048 			memcpy(&pcie_device->connector_name[0],
8049 			    &pcie_device_pg0.ConnectorName[0], 4);
8050 		} else {
8051 			pcie_device->enclosure_level = 0;
8052 			pcie_device->connector_name[0] = '\0';
8053 		}
8054 	}
8055 
8056 	/* check if device is present */
8057 	if (!(le32_to_cpu(pcie_device_pg0.Flags) &
8058 	    MPI26_PCIEDEV0_FLAGS_DEVICE_PRESENT)) {
8059 		ioc_info(ioc, "device is not present handle(0x%04x), flags!!!\n",
8060 			 handle);
8061 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8062 		pcie_device_put(pcie_device);
8063 		return;
8064 	}
8065 
8066 	/* check if there were any issues with discovery */
8067 	if (_scsih_check_pcie_access_status(ioc, wwid, handle,
8068 	    pcie_device_pg0.AccessStatus)) {
8069 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8070 		pcie_device_put(pcie_device);
8071 		return;
8072 	}
8073 
8074 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8075 	pcie_device_put(pcie_device);
8076 
8077 	_scsih_ublock_io_device(ioc, wwid, NULL);
8078 
8079 	return;
8080 }
8081 
8082 /**
8083  * _scsih_pcie_add_device -  creating pcie device object
8084  * @ioc: per adapter object
8085  * @handle: pcie device handle
8086  *
8087  * Creating end device object, stored in ioc->pcie_device_list.
8088  *
8089  * Return: 1 means queue the event later, 0 means complete the event
8090  */
8091 static int
8092 _scsih_pcie_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle)
8093 {
8094 	Mpi26PCIeDevicePage0_t pcie_device_pg0;
8095 	Mpi26PCIeDevicePage2_t pcie_device_pg2;
8096 	Mpi2ConfigReply_t mpi_reply;
8097 	struct _pcie_device *pcie_device;
8098 	struct _enclosure_node *enclosure_dev;
8099 	u32 ioc_status;
8100 	u64 wwid;
8101 
8102 	if ((mpt3sas_config_get_pcie_device_pg0(ioc, &mpi_reply,
8103 	    &pcie_device_pg0, MPI26_PCIE_DEVICE_PGAD_FORM_HANDLE, handle))) {
8104 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
8105 			__FILE__, __LINE__, __func__);
8106 		return 0;
8107 	}
8108 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
8109 	    MPI2_IOCSTATUS_MASK;
8110 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
8111 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
8112 			__FILE__, __LINE__, __func__);
8113 		return 0;
8114 	}
8115 
8116 	set_bit(handle, ioc->pend_os_device_add);
8117 	wwid = le64_to_cpu(pcie_device_pg0.WWID);
8118 
8119 	/* check if device is present */
8120 	if (!(le32_to_cpu(pcie_device_pg0.Flags) &
8121 		MPI26_PCIEDEV0_FLAGS_DEVICE_PRESENT)) {
8122 		ioc_err(ioc, "device is not present handle(0x04%x)!!!\n",
8123 			handle);
8124 		return 0;
8125 	}
8126 
8127 	/* check if there were any issues with discovery */
8128 	if (_scsih_check_pcie_access_status(ioc, wwid, handle,
8129 	    pcie_device_pg0.AccessStatus))
8130 		return 0;
8131 
8132 	if (!(_scsih_is_nvme_pciescsi_device(le32_to_cpu
8133 	    (pcie_device_pg0.DeviceInfo))))
8134 		return 0;
8135 
8136 	pcie_device = mpt3sas_get_pdev_by_wwid(ioc, wwid);
8137 	if (pcie_device) {
8138 		clear_bit(handle, ioc->pend_os_device_add);
8139 		pcie_device_put(pcie_device);
8140 		return 0;
8141 	}
8142 
8143 	/* PCIe Device Page 2 contains read-only information about a
8144 	 * specific NVMe device; therefore, this page is only
8145 	 * valid for NVMe devices and skip for pcie devices of type scsi.
8146 	 */
8147 	if (!(mpt3sas_scsih_is_pcie_scsi_device(
8148 		le32_to_cpu(pcie_device_pg0.DeviceInfo)))) {
8149 		if (mpt3sas_config_get_pcie_device_pg2(ioc, &mpi_reply,
8150 		    &pcie_device_pg2, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
8151 		    handle)) {
8152 			ioc_err(ioc,
8153 			    "failure at %s:%d/%s()!\n", __FILE__,
8154 			    __LINE__, __func__);
8155 			return 0;
8156 		}
8157 
8158 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
8159 					MPI2_IOCSTATUS_MASK;
8160 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
8161 			ioc_err(ioc,
8162 			    "failure at %s:%d/%s()!\n", __FILE__,
8163 			    __LINE__, __func__);
8164 			return 0;
8165 		}
8166 	}
8167 
8168 	pcie_device = kzalloc(sizeof(struct _pcie_device), GFP_KERNEL);
8169 	if (!pcie_device) {
8170 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
8171 			__FILE__, __LINE__, __func__);
8172 		return 0;
8173 	}
8174 
8175 	kref_init(&pcie_device->refcount);
8176 	pcie_device->id = ioc->pcie_target_id++;
8177 	pcie_device->channel = PCIE_CHANNEL;
8178 	pcie_device->handle = handle;
8179 	pcie_device->access_status = pcie_device_pg0.AccessStatus;
8180 	pcie_device->device_info = le32_to_cpu(pcie_device_pg0.DeviceInfo);
8181 	pcie_device->wwid = wwid;
8182 	pcie_device->port_num = pcie_device_pg0.PortNum;
8183 	pcie_device->fast_path = (le32_to_cpu(pcie_device_pg0.Flags) &
8184 	    MPI26_PCIEDEV0_FLAGS_FAST_PATH_CAPABLE) ? 1 : 0;
8185 
8186 	pcie_device->enclosure_handle =
8187 	    le16_to_cpu(pcie_device_pg0.EnclosureHandle);
8188 	if (pcie_device->enclosure_handle != 0)
8189 		pcie_device->slot = le16_to_cpu(pcie_device_pg0.Slot);
8190 
8191 	if (le32_to_cpu(pcie_device_pg0.Flags) &
8192 	    MPI26_PCIEDEV0_FLAGS_ENCL_LEVEL_VALID) {
8193 		pcie_device->enclosure_level = pcie_device_pg0.EnclosureLevel;
8194 		memcpy(&pcie_device->connector_name[0],
8195 		    &pcie_device_pg0.ConnectorName[0], 4);
8196 	} else {
8197 		pcie_device->enclosure_level = 0;
8198 		pcie_device->connector_name[0] = '\0';
8199 	}
8200 
8201 	/* get enclosure_logical_id */
8202 	if (pcie_device->enclosure_handle) {
8203 		enclosure_dev =
8204 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
8205 						pcie_device->enclosure_handle);
8206 		if (enclosure_dev)
8207 			pcie_device->enclosure_logical_id =
8208 			    le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
8209 	}
8210 	/* TODO -- Add device name once FW supports it */
8211 	if (!(mpt3sas_scsih_is_pcie_scsi_device(
8212 	    le32_to_cpu(pcie_device_pg0.DeviceInfo)))) {
8213 		pcie_device->nvme_mdts =
8214 		    le32_to_cpu(pcie_device_pg2.MaximumDataTransferSize);
8215 		pcie_device->shutdown_latency =
8216 			le16_to_cpu(pcie_device_pg2.ShutdownLatency);
8217 		/*
8218 		 * Set IOC's max_shutdown_latency to drive's RTD3 Entry Latency
8219 		 * if drive's RTD3 Entry Latency is greater then IOC's
8220 		 * max_shutdown_latency.
8221 		 */
8222 		if (pcie_device->shutdown_latency > ioc->max_shutdown_latency)
8223 			ioc->max_shutdown_latency =
8224 				pcie_device->shutdown_latency;
8225 		if (pcie_device_pg2.ControllerResetTO)
8226 			pcie_device->reset_timeout =
8227 			    pcie_device_pg2.ControllerResetTO;
8228 		else
8229 			pcie_device->reset_timeout = 30;
8230 	} else
8231 		pcie_device->reset_timeout = 30;
8232 
8233 	if (ioc->wait_for_discovery_to_complete)
8234 		_scsih_pcie_device_init_add(ioc, pcie_device);
8235 	else
8236 		_scsih_pcie_device_add(ioc, pcie_device);
8237 
8238 	pcie_device_put(pcie_device);
8239 	return 0;
8240 }
8241 
8242 /**
8243  * _scsih_pcie_topology_change_event_debug - debug for topology
8244  * event
8245  * @ioc: per adapter object
8246  * @event_data: event data payload
8247  * Context: user.
8248  */
8249 static void
8250 _scsih_pcie_topology_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
8251 	Mpi26EventDataPCIeTopologyChangeList_t *event_data)
8252 {
8253 	int i;
8254 	u16 handle;
8255 	u16 reason_code;
8256 	u8 port_number;
8257 	char *status_str = NULL;
8258 	u8 link_rate, prev_link_rate;
8259 
8260 	switch (event_data->SwitchStatus) {
8261 	case MPI26_EVENT_PCIE_TOPO_SS_ADDED:
8262 		status_str = "add";
8263 		break;
8264 	case MPI26_EVENT_PCIE_TOPO_SS_NOT_RESPONDING:
8265 		status_str = "remove";
8266 		break;
8267 	case MPI26_EVENT_PCIE_TOPO_SS_RESPONDING:
8268 	case 0:
8269 		status_str =  "responding";
8270 		break;
8271 	case MPI26_EVENT_PCIE_TOPO_SS_DELAY_NOT_RESPONDING:
8272 		status_str = "remove delay";
8273 		break;
8274 	default:
8275 		status_str = "unknown status";
8276 		break;
8277 	}
8278 	ioc_info(ioc, "pcie topology change: (%s)\n", status_str);
8279 	pr_info("\tswitch_handle(0x%04x), enclosure_handle(0x%04x)"
8280 		"start_port(%02d), count(%d)\n",
8281 		le16_to_cpu(event_data->SwitchDevHandle),
8282 		le16_to_cpu(event_data->EnclosureHandle),
8283 		event_data->StartPortNum, event_data->NumEntries);
8284 	for (i = 0; i < event_data->NumEntries; i++) {
8285 		handle =
8286 			le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
8287 		if (!handle)
8288 			continue;
8289 		port_number = event_data->StartPortNum + i;
8290 		reason_code = event_data->PortEntry[i].PortStatus;
8291 		switch (reason_code) {
8292 		case MPI26_EVENT_PCIE_TOPO_PS_DEV_ADDED:
8293 			status_str = "target add";
8294 			break;
8295 		case MPI26_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:
8296 			status_str = "target remove";
8297 			break;
8298 		case MPI26_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING:
8299 			status_str = "delay target remove";
8300 			break;
8301 		case MPI26_EVENT_PCIE_TOPO_PS_PORT_CHANGED:
8302 			status_str = "link rate change";
8303 			break;
8304 		case MPI26_EVENT_PCIE_TOPO_PS_NO_CHANGE:
8305 			status_str = "target responding";
8306 			break;
8307 		default:
8308 			status_str = "unknown";
8309 			break;
8310 		}
8311 		link_rate = event_data->PortEntry[i].CurrentPortInfo &
8312 			MPI26_EVENT_PCIE_TOPO_PI_RATE_MASK;
8313 		prev_link_rate = event_data->PortEntry[i].PreviousPortInfo &
8314 			MPI26_EVENT_PCIE_TOPO_PI_RATE_MASK;
8315 		pr_info("\tport(%02d), attached_handle(0x%04x): %s:"
8316 			" link rate: new(0x%02x), old(0x%02x)\n", port_number,
8317 			handle, status_str, link_rate, prev_link_rate);
8318 	}
8319 }
8320 
8321 /**
8322  * _scsih_pcie_topology_change_event - handle PCIe topology
8323  *  changes
8324  * @ioc: per adapter object
8325  * @fw_event: The fw_event_work object
8326  * Context: user.
8327  *
8328  */
8329 static void
8330 _scsih_pcie_topology_change_event(struct MPT3SAS_ADAPTER *ioc,
8331 	struct fw_event_work *fw_event)
8332 {
8333 	int i;
8334 	u16 handle;
8335 	u16 reason_code;
8336 	u8 link_rate, prev_link_rate;
8337 	unsigned long flags;
8338 	int rc;
8339 	Mpi26EventDataPCIeTopologyChangeList_t *event_data =
8340 		(Mpi26EventDataPCIeTopologyChangeList_t *) fw_event->event_data;
8341 	struct _pcie_device *pcie_device;
8342 
8343 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
8344 		_scsih_pcie_topology_change_event_debug(ioc, event_data);
8345 
8346 	if (ioc->shost_recovery || ioc->remove_host ||
8347 		ioc->pci_error_recovery)
8348 		return;
8349 
8350 	if (fw_event->ignore) {
8351 		dewtprintk(ioc, ioc_info(ioc, "ignoring switch event\n"));
8352 		return;
8353 	}
8354 
8355 	/* handle siblings events */
8356 	for (i = 0; i < event_data->NumEntries; i++) {
8357 		if (fw_event->ignore) {
8358 			dewtprintk(ioc,
8359 				   ioc_info(ioc, "ignoring switch event\n"));
8360 			return;
8361 		}
8362 		if (ioc->remove_host || ioc->pci_error_recovery)
8363 			return;
8364 		reason_code = event_data->PortEntry[i].PortStatus;
8365 		handle =
8366 			le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
8367 		if (!handle)
8368 			continue;
8369 
8370 		link_rate = event_data->PortEntry[i].CurrentPortInfo
8371 			& MPI26_EVENT_PCIE_TOPO_PI_RATE_MASK;
8372 		prev_link_rate = event_data->PortEntry[i].PreviousPortInfo
8373 			& MPI26_EVENT_PCIE_TOPO_PI_RATE_MASK;
8374 
8375 		switch (reason_code) {
8376 		case MPI26_EVENT_PCIE_TOPO_PS_PORT_CHANGED:
8377 			if (ioc->shost_recovery)
8378 				break;
8379 			if (link_rate == prev_link_rate)
8380 				break;
8381 			if (link_rate < MPI26_EVENT_PCIE_TOPO_PI_RATE_2_5)
8382 				break;
8383 
8384 			_scsih_pcie_check_device(ioc, handle);
8385 
8386 			/* This code after this point handles the test case
8387 			 * where a device has been added, however its returning
8388 			 * BUSY for sometime.  Then before the Device Missing
8389 			 * Delay expires and the device becomes READY, the
8390 			 * device is removed and added back.
8391 			 */
8392 			spin_lock_irqsave(&ioc->pcie_device_lock, flags);
8393 			pcie_device = __mpt3sas_get_pdev_by_handle(ioc, handle);
8394 			spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8395 
8396 			if (pcie_device) {
8397 				pcie_device_put(pcie_device);
8398 				break;
8399 			}
8400 
8401 			if (!test_bit(handle, ioc->pend_os_device_add))
8402 				break;
8403 
8404 			dewtprintk(ioc,
8405 				   ioc_info(ioc, "handle(0x%04x) device not found: convert event to a device add\n",
8406 					    handle));
8407 			event_data->PortEntry[i].PortStatus &= 0xF0;
8408 			event_data->PortEntry[i].PortStatus |=
8409 				MPI26_EVENT_PCIE_TOPO_PS_DEV_ADDED;
8410 			fallthrough;
8411 		case MPI26_EVENT_PCIE_TOPO_PS_DEV_ADDED:
8412 			if (ioc->shost_recovery)
8413 				break;
8414 			if (link_rate < MPI26_EVENT_PCIE_TOPO_PI_RATE_2_5)
8415 				break;
8416 
8417 			rc = _scsih_pcie_add_device(ioc, handle);
8418 			if (!rc) {
8419 				/* mark entry vacant */
8420 				/* TODO This needs to be reviewed and fixed,
8421 				 * we dont have an entry
8422 				 * to make an event void like vacant
8423 				 */
8424 				event_data->PortEntry[i].PortStatus |=
8425 					MPI26_EVENT_PCIE_TOPO_PS_NO_CHANGE;
8426 			}
8427 			break;
8428 		case MPI26_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:
8429 			_scsih_pcie_device_remove_by_handle(ioc, handle);
8430 			break;
8431 		}
8432 	}
8433 }
8434 
8435 /**
8436  * _scsih_pcie_device_status_change_event_debug - debug for device event
8437  * @ioc: ?
8438  * @event_data: event data payload
8439  * Context: user.
8440  */
8441 static void
8442 _scsih_pcie_device_status_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
8443 	Mpi26EventDataPCIeDeviceStatusChange_t *event_data)
8444 {
8445 	char *reason_str = NULL;
8446 
8447 	switch (event_data->ReasonCode) {
8448 	case MPI26_EVENT_PCIDEV_STAT_RC_SMART_DATA:
8449 		reason_str = "smart data";
8450 		break;
8451 	case MPI26_EVENT_PCIDEV_STAT_RC_UNSUPPORTED:
8452 		reason_str = "unsupported device discovered";
8453 		break;
8454 	case MPI26_EVENT_PCIDEV_STAT_RC_INTERNAL_DEVICE_RESET:
8455 		reason_str = "internal device reset";
8456 		break;
8457 	case MPI26_EVENT_PCIDEV_STAT_RC_TASK_ABORT_INTERNAL:
8458 		reason_str = "internal task abort";
8459 		break;
8460 	case MPI26_EVENT_PCIDEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
8461 		reason_str = "internal task abort set";
8462 		break;
8463 	case MPI26_EVENT_PCIDEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
8464 		reason_str = "internal clear task set";
8465 		break;
8466 	case MPI26_EVENT_PCIDEV_STAT_RC_QUERY_TASK_INTERNAL:
8467 		reason_str = "internal query task";
8468 		break;
8469 	case MPI26_EVENT_PCIDEV_STAT_RC_DEV_INIT_FAILURE:
8470 		reason_str = "device init failure";
8471 		break;
8472 	case MPI26_EVENT_PCIDEV_STAT_RC_CMP_INTERNAL_DEV_RESET:
8473 		reason_str = "internal device reset complete";
8474 		break;
8475 	case MPI26_EVENT_PCIDEV_STAT_RC_CMP_TASK_ABORT_INTERNAL:
8476 		reason_str = "internal task abort complete";
8477 		break;
8478 	case MPI26_EVENT_PCIDEV_STAT_RC_ASYNC_NOTIFICATION:
8479 		reason_str = "internal async notification";
8480 		break;
8481 	case MPI26_EVENT_PCIDEV_STAT_RC_PCIE_HOT_RESET_FAILED:
8482 		reason_str = "pcie hot reset failed";
8483 		break;
8484 	default:
8485 		reason_str = "unknown reason";
8486 		break;
8487 	}
8488 
8489 	ioc_info(ioc, "PCIE device status change: (%s)\n"
8490 		 "\thandle(0x%04x), WWID(0x%016llx), tag(%d)",
8491 		 reason_str, le16_to_cpu(event_data->DevHandle),
8492 		 (u64)le64_to_cpu(event_data->WWID),
8493 		 le16_to_cpu(event_data->TaskTag));
8494 	if (event_data->ReasonCode == MPI26_EVENT_PCIDEV_STAT_RC_SMART_DATA)
8495 		pr_cont(", ASC(0x%x), ASCQ(0x%x)\n",
8496 			event_data->ASC, event_data->ASCQ);
8497 	pr_cont("\n");
8498 }
8499 
8500 /**
8501  * _scsih_pcie_device_status_change_event - handle device status
8502  * change
8503  * @ioc: per adapter object
8504  * @fw_event: The fw_event_work object
8505  * Context: user.
8506  */
8507 static void
8508 _scsih_pcie_device_status_change_event(struct MPT3SAS_ADAPTER *ioc,
8509 	struct fw_event_work *fw_event)
8510 {
8511 	struct MPT3SAS_TARGET *target_priv_data;
8512 	struct _pcie_device *pcie_device;
8513 	u64 wwid;
8514 	unsigned long flags;
8515 	Mpi26EventDataPCIeDeviceStatusChange_t *event_data =
8516 		(Mpi26EventDataPCIeDeviceStatusChange_t *)fw_event->event_data;
8517 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
8518 		_scsih_pcie_device_status_change_event_debug(ioc,
8519 			event_data);
8520 
8521 	if (event_data->ReasonCode !=
8522 		MPI26_EVENT_PCIDEV_STAT_RC_INTERNAL_DEVICE_RESET &&
8523 		event_data->ReasonCode !=
8524 		MPI26_EVENT_PCIDEV_STAT_RC_CMP_INTERNAL_DEV_RESET)
8525 		return;
8526 
8527 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
8528 	wwid = le64_to_cpu(event_data->WWID);
8529 	pcie_device = __mpt3sas_get_pdev_by_wwid(ioc, wwid);
8530 
8531 	if (!pcie_device || !pcie_device->starget)
8532 		goto out;
8533 
8534 	target_priv_data = pcie_device->starget->hostdata;
8535 	if (!target_priv_data)
8536 		goto out;
8537 
8538 	if (event_data->ReasonCode ==
8539 		MPI26_EVENT_PCIDEV_STAT_RC_INTERNAL_DEVICE_RESET)
8540 		target_priv_data->tm_busy = 1;
8541 	else
8542 		target_priv_data->tm_busy = 0;
8543 out:
8544 	if (pcie_device)
8545 		pcie_device_put(pcie_device);
8546 
8547 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
8548 }
8549 
8550 /**
8551  * _scsih_sas_enclosure_dev_status_change_event_debug - debug for enclosure
8552  * event
8553  * @ioc: per adapter object
8554  * @event_data: event data payload
8555  * Context: user.
8556  */
8557 static void
8558 _scsih_sas_enclosure_dev_status_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
8559 	Mpi2EventDataSasEnclDevStatusChange_t *event_data)
8560 {
8561 	char *reason_str = NULL;
8562 
8563 	switch (event_data->ReasonCode) {
8564 	case MPI2_EVENT_SAS_ENCL_RC_ADDED:
8565 		reason_str = "enclosure add";
8566 		break;
8567 	case MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING:
8568 		reason_str = "enclosure remove";
8569 		break;
8570 	default:
8571 		reason_str = "unknown reason";
8572 		break;
8573 	}
8574 
8575 	ioc_info(ioc, "enclosure status change: (%s)\n"
8576 		 "\thandle(0x%04x), enclosure logical id(0x%016llx) number slots(%d)\n",
8577 		 reason_str,
8578 		 le16_to_cpu(event_data->EnclosureHandle),
8579 		 (u64)le64_to_cpu(event_data->EnclosureLogicalID),
8580 		 le16_to_cpu(event_data->StartSlot));
8581 }
8582 
8583 /**
8584  * _scsih_sas_enclosure_dev_status_change_event - handle enclosure events
8585  * @ioc: per adapter object
8586  * @fw_event: The fw_event_work object
8587  * Context: user.
8588  */
8589 static void
8590 _scsih_sas_enclosure_dev_status_change_event(struct MPT3SAS_ADAPTER *ioc,
8591 	struct fw_event_work *fw_event)
8592 {
8593 	Mpi2ConfigReply_t mpi_reply;
8594 	struct _enclosure_node *enclosure_dev = NULL;
8595 	Mpi2EventDataSasEnclDevStatusChange_t *event_data =
8596 		(Mpi2EventDataSasEnclDevStatusChange_t *)fw_event->event_data;
8597 	int rc;
8598 	u16 enclosure_handle = le16_to_cpu(event_data->EnclosureHandle);
8599 
8600 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
8601 		_scsih_sas_enclosure_dev_status_change_event_debug(ioc,
8602 		     (Mpi2EventDataSasEnclDevStatusChange_t *)
8603 		     fw_event->event_data);
8604 	if (ioc->shost_recovery)
8605 		return;
8606 
8607 	if (enclosure_handle)
8608 		enclosure_dev =
8609 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
8610 						enclosure_handle);
8611 	switch (event_data->ReasonCode) {
8612 	case MPI2_EVENT_SAS_ENCL_RC_ADDED:
8613 		if (!enclosure_dev) {
8614 			enclosure_dev =
8615 				kzalloc(sizeof(struct _enclosure_node),
8616 					GFP_KERNEL);
8617 			if (!enclosure_dev) {
8618 				ioc_info(ioc, "failure at %s:%d/%s()!\n",
8619 					 __FILE__, __LINE__, __func__);
8620 				return;
8621 			}
8622 			rc = mpt3sas_config_get_enclosure_pg0(ioc, &mpi_reply,
8623 				&enclosure_dev->pg0,
8624 				MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
8625 				enclosure_handle);
8626 
8627 			if (rc || (le16_to_cpu(mpi_reply.IOCStatus) &
8628 						MPI2_IOCSTATUS_MASK)) {
8629 				kfree(enclosure_dev);
8630 				return;
8631 			}
8632 
8633 			list_add_tail(&enclosure_dev->list,
8634 							&ioc->enclosure_list);
8635 		}
8636 		break;
8637 	case MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING:
8638 		if (enclosure_dev) {
8639 			list_del(&enclosure_dev->list);
8640 			kfree(enclosure_dev);
8641 		}
8642 		break;
8643 	default:
8644 		break;
8645 	}
8646 }
8647 
8648 /**
8649  * _scsih_sas_broadcast_primitive_event - handle broadcast events
8650  * @ioc: per adapter object
8651  * @fw_event: The fw_event_work object
8652  * Context: user.
8653  */
8654 static void
8655 _scsih_sas_broadcast_primitive_event(struct MPT3SAS_ADAPTER *ioc,
8656 	struct fw_event_work *fw_event)
8657 {
8658 	struct scsi_cmnd *scmd;
8659 	struct scsi_device *sdev;
8660 	struct scsiio_tracker *st;
8661 	u16 smid, handle;
8662 	u32 lun;
8663 	struct MPT3SAS_DEVICE *sas_device_priv_data;
8664 	u32 termination_count;
8665 	u32 query_count;
8666 	Mpi2SCSITaskManagementReply_t *mpi_reply;
8667 	Mpi2EventDataSasBroadcastPrimitive_t *event_data =
8668 		(Mpi2EventDataSasBroadcastPrimitive_t *)
8669 		fw_event->event_data;
8670 	u16 ioc_status;
8671 	unsigned long flags;
8672 	int r;
8673 	u8 max_retries = 0;
8674 	u8 task_abort_retries;
8675 
8676 	mutex_lock(&ioc->tm_cmds.mutex);
8677 	ioc_info(ioc, "%s: enter: phy number(%d), width(%d)\n",
8678 		 __func__, event_data->PhyNum, event_data->PortWidth);
8679 
8680 	_scsih_block_io_all_device(ioc);
8681 
8682 	spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8683 	mpi_reply = ioc->tm_cmds.reply;
8684  broadcast_aen_retry:
8685 
8686 	/* sanity checks for retrying this loop */
8687 	if (max_retries++ == 5) {
8688 		dewtprintk(ioc, ioc_info(ioc, "%s: giving up\n", __func__));
8689 		goto out;
8690 	} else if (max_retries > 1)
8691 		dewtprintk(ioc,
8692 			   ioc_info(ioc, "%s: %d retry\n",
8693 				    __func__, max_retries - 1));
8694 
8695 	termination_count = 0;
8696 	query_count = 0;
8697 	for (smid = 1; smid <= ioc->scsiio_depth; smid++) {
8698 		if (ioc->shost_recovery)
8699 			goto out;
8700 		scmd = mpt3sas_scsih_scsi_lookup_get(ioc, smid);
8701 		if (!scmd)
8702 			continue;
8703 		st = scsi_cmd_priv(scmd);
8704 		sdev = scmd->device;
8705 		sas_device_priv_data = sdev->hostdata;
8706 		if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
8707 			continue;
8708 		 /* skip hidden raid components */
8709 		if (sas_device_priv_data->sas_target->flags &
8710 		    MPT_TARGET_FLAGS_RAID_COMPONENT)
8711 			continue;
8712 		 /* skip volumes */
8713 		if (sas_device_priv_data->sas_target->flags &
8714 		    MPT_TARGET_FLAGS_VOLUME)
8715 			continue;
8716 		 /* skip PCIe devices */
8717 		if (sas_device_priv_data->sas_target->flags &
8718 		    MPT_TARGET_FLAGS_PCIE_DEVICE)
8719 			continue;
8720 
8721 		handle = sas_device_priv_data->sas_target->handle;
8722 		lun = sas_device_priv_data->lun;
8723 		query_count++;
8724 
8725 		if (ioc->shost_recovery)
8726 			goto out;
8727 
8728 		spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
8729 		r = mpt3sas_scsih_issue_tm(ioc, handle, 0, 0, lun,
8730 			MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, st->smid,
8731 			st->msix_io, 30, 0);
8732 		if (r == FAILED) {
8733 			sdev_printk(KERN_WARNING, sdev,
8734 			    "mpt3sas_scsih_issue_tm: FAILED when sending "
8735 			    "QUERY_TASK: scmd(%p)\n", scmd);
8736 			spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8737 			goto broadcast_aen_retry;
8738 		}
8739 		ioc_status = le16_to_cpu(mpi_reply->IOCStatus)
8740 		    & MPI2_IOCSTATUS_MASK;
8741 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
8742 			sdev_printk(KERN_WARNING, sdev,
8743 				"query task: FAILED with IOCSTATUS(0x%04x), scmd(%p)\n",
8744 				ioc_status, scmd);
8745 			spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8746 			goto broadcast_aen_retry;
8747 		}
8748 
8749 		/* see if IO is still owned by IOC and target */
8750 		if (mpi_reply->ResponseCode ==
8751 		     MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED ||
8752 		     mpi_reply->ResponseCode ==
8753 		     MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC) {
8754 			spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8755 			continue;
8756 		}
8757 		task_abort_retries = 0;
8758  tm_retry:
8759 		if (task_abort_retries++ == 60) {
8760 			dewtprintk(ioc,
8761 				   ioc_info(ioc, "%s: ABORT_TASK: giving up\n",
8762 					    __func__));
8763 			spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8764 			goto broadcast_aen_retry;
8765 		}
8766 
8767 		if (ioc->shost_recovery)
8768 			goto out_no_lock;
8769 
8770 		r = mpt3sas_scsih_issue_tm(ioc, handle, sdev->channel, sdev->id,
8771 			sdev->lun, MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
8772 			st->smid, st->msix_io, 30, 0);
8773 		if (r == FAILED || st->cb_idx != 0xFF) {
8774 			sdev_printk(KERN_WARNING, sdev,
8775 			    "mpt3sas_scsih_issue_tm: ABORT_TASK: FAILED : "
8776 			    "scmd(%p)\n", scmd);
8777 			goto tm_retry;
8778 		}
8779 
8780 		if (task_abort_retries > 1)
8781 			sdev_printk(KERN_WARNING, sdev,
8782 			    "mpt3sas_scsih_issue_tm: ABORT_TASK: RETRIES (%d):"
8783 			    " scmd(%p)\n",
8784 			    task_abort_retries - 1, scmd);
8785 
8786 		termination_count += le32_to_cpu(mpi_reply->TerminationCount);
8787 		spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
8788 	}
8789 
8790 	if (ioc->broadcast_aen_pending) {
8791 		dewtprintk(ioc,
8792 			   ioc_info(ioc,
8793 				    "%s: loop back due to pending AEN\n",
8794 				    __func__));
8795 		 ioc->broadcast_aen_pending = 0;
8796 		 goto broadcast_aen_retry;
8797 	}
8798 
8799  out:
8800 	spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
8801  out_no_lock:
8802 
8803 	dewtprintk(ioc,
8804 		   ioc_info(ioc, "%s - exit, query_count = %d termination_count = %d\n",
8805 			    __func__, query_count, termination_count));
8806 
8807 	ioc->broadcast_aen_busy = 0;
8808 	if (!ioc->shost_recovery)
8809 		_scsih_ublock_io_all_device(ioc);
8810 	mutex_unlock(&ioc->tm_cmds.mutex);
8811 }
8812 
8813 /**
8814  * _scsih_sas_discovery_event - handle discovery events
8815  * @ioc: per adapter object
8816  * @fw_event: The fw_event_work object
8817  * Context: user.
8818  */
8819 static void
8820 _scsih_sas_discovery_event(struct MPT3SAS_ADAPTER *ioc,
8821 	struct fw_event_work *fw_event)
8822 {
8823 	Mpi2EventDataSasDiscovery_t *event_data =
8824 		(Mpi2EventDataSasDiscovery_t *) fw_event->event_data;
8825 
8826 	if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) {
8827 		ioc_info(ioc, "discovery event: (%s)",
8828 			 event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED ?
8829 			 "start" : "stop");
8830 		if (event_data->DiscoveryStatus)
8831 			pr_cont("discovery_status(0x%08x)",
8832 				le32_to_cpu(event_data->DiscoveryStatus));
8833 		pr_cont("\n");
8834 	}
8835 
8836 	if (event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED &&
8837 	    !ioc->sas_hba.num_phys) {
8838 		if (disable_discovery > 0 && ioc->shost_recovery) {
8839 			/* Wait for the reset to complete */
8840 			while (ioc->shost_recovery)
8841 				ssleep(1);
8842 		}
8843 		_scsih_sas_host_add(ioc);
8844 	}
8845 }
8846 
8847 /**
8848  * _scsih_sas_device_discovery_error_event - display SAS device discovery error
8849  *						events
8850  * @ioc: per adapter object
8851  * @fw_event: The fw_event_work object
8852  * Context: user.
8853  */
8854 static void
8855 _scsih_sas_device_discovery_error_event(struct MPT3SAS_ADAPTER *ioc,
8856 	struct fw_event_work *fw_event)
8857 {
8858 	Mpi25EventDataSasDeviceDiscoveryError_t *event_data =
8859 		(Mpi25EventDataSasDeviceDiscoveryError_t *)fw_event->event_data;
8860 
8861 	switch (event_data->ReasonCode) {
8862 	case MPI25_EVENT_SAS_DISC_ERR_SMP_FAILED:
8863 		ioc_warn(ioc, "SMP command sent to the expander (handle:0x%04x, sas_address:0x%016llx, physical_port:0x%02x) has failed\n",
8864 			 le16_to_cpu(event_data->DevHandle),
8865 			 (u64)le64_to_cpu(event_data->SASAddress),
8866 			 event_data->PhysicalPort);
8867 		break;
8868 	case MPI25_EVENT_SAS_DISC_ERR_SMP_TIMEOUT:
8869 		ioc_warn(ioc, "SMP command sent to the expander (handle:0x%04x, sas_address:0x%016llx, physical_port:0x%02x) has timed out\n",
8870 			 le16_to_cpu(event_data->DevHandle),
8871 			 (u64)le64_to_cpu(event_data->SASAddress),
8872 			 event_data->PhysicalPort);
8873 		break;
8874 	default:
8875 		break;
8876 	}
8877 }
8878 
8879 /**
8880  * _scsih_pcie_enumeration_event - handle enumeration events
8881  * @ioc: per adapter object
8882  * @fw_event: The fw_event_work object
8883  * Context: user.
8884  */
8885 static void
8886 _scsih_pcie_enumeration_event(struct MPT3SAS_ADAPTER *ioc,
8887 	struct fw_event_work *fw_event)
8888 {
8889 	Mpi26EventDataPCIeEnumeration_t *event_data =
8890 		(Mpi26EventDataPCIeEnumeration_t *)fw_event->event_data;
8891 
8892 	if (!(ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK))
8893 		return;
8894 
8895 	ioc_info(ioc, "pcie enumeration event: (%s) Flag 0x%02x",
8896 		 (event_data->ReasonCode == MPI26_EVENT_PCIE_ENUM_RC_STARTED) ?
8897 		 "started" : "completed",
8898 		 event_data->Flags);
8899 	if (event_data->EnumerationStatus)
8900 		pr_cont("enumeration_status(0x%08x)",
8901 			le32_to_cpu(event_data->EnumerationStatus));
8902 	pr_cont("\n");
8903 }
8904 
8905 /**
8906  * _scsih_ir_fastpath - turn on fastpath for IR physdisk
8907  * @ioc: per adapter object
8908  * @handle: device handle for physical disk
8909  * @phys_disk_num: physical disk number
8910  *
8911  * Return: 0 for success, else failure.
8912  */
8913 static int
8914 _scsih_ir_fastpath(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phys_disk_num)
8915 {
8916 	Mpi2RaidActionRequest_t *mpi_request;
8917 	Mpi2RaidActionReply_t *mpi_reply;
8918 	u16 smid;
8919 	u8 issue_reset = 0;
8920 	int rc = 0;
8921 	u16 ioc_status;
8922 	u32 log_info;
8923 
8924 	if (ioc->hba_mpi_version_belonged == MPI2_VERSION)
8925 		return rc;
8926 
8927 	mutex_lock(&ioc->scsih_cmds.mutex);
8928 
8929 	if (ioc->scsih_cmds.status != MPT3_CMD_NOT_USED) {
8930 		ioc_err(ioc, "%s: scsih_cmd in use\n", __func__);
8931 		rc = -EAGAIN;
8932 		goto out;
8933 	}
8934 	ioc->scsih_cmds.status = MPT3_CMD_PENDING;
8935 
8936 	smid = mpt3sas_base_get_smid(ioc, ioc->scsih_cb_idx);
8937 	if (!smid) {
8938 		ioc_err(ioc, "%s: failed obtaining a smid\n", __func__);
8939 		ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
8940 		rc = -EAGAIN;
8941 		goto out;
8942 	}
8943 
8944 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
8945 	ioc->scsih_cmds.smid = smid;
8946 	memset(mpi_request, 0, sizeof(Mpi2RaidActionRequest_t));
8947 
8948 	mpi_request->Function = MPI2_FUNCTION_RAID_ACTION;
8949 	mpi_request->Action = MPI2_RAID_ACTION_PHYSDISK_HIDDEN;
8950 	mpi_request->PhysDiskNum = phys_disk_num;
8951 
8952 	dewtprintk(ioc,
8953 		   ioc_info(ioc, "IR RAID_ACTION: turning fast path on for handle(0x%04x), phys_disk_num (0x%02x)\n",
8954 			    handle, phys_disk_num));
8955 
8956 	init_completion(&ioc->scsih_cmds.done);
8957 	ioc->put_smid_default(ioc, smid);
8958 	wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
8959 
8960 	if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
8961 		mpt3sas_check_cmd_timeout(ioc,
8962 		    ioc->scsih_cmds.status, mpi_request,
8963 		    sizeof(Mpi2RaidActionRequest_t)/4, issue_reset);
8964 		rc = -EFAULT;
8965 		goto out;
8966 	}
8967 
8968 	if (ioc->scsih_cmds.status & MPT3_CMD_REPLY_VALID) {
8969 
8970 		mpi_reply = ioc->scsih_cmds.reply;
8971 		ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
8972 		if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
8973 			log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
8974 		else
8975 			log_info = 0;
8976 		ioc_status &= MPI2_IOCSTATUS_MASK;
8977 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
8978 			dewtprintk(ioc,
8979 				   ioc_info(ioc, "IR RAID_ACTION: failed: ioc_status(0x%04x), loginfo(0x%08x)!!!\n",
8980 					    ioc_status, log_info));
8981 			rc = -EFAULT;
8982 		} else
8983 			dewtprintk(ioc,
8984 				   ioc_info(ioc, "IR RAID_ACTION: completed successfully\n"));
8985 	}
8986 
8987  out:
8988 	ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
8989 	mutex_unlock(&ioc->scsih_cmds.mutex);
8990 
8991 	if (issue_reset)
8992 		mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
8993 	return rc;
8994 }
8995 
8996 /**
8997  * _scsih_reprobe_lun - reprobing lun
8998  * @sdev: scsi device struct
8999  * @no_uld_attach: sdev->no_uld_attach flag setting
9000  *
9001  **/
9002 static void
9003 _scsih_reprobe_lun(struct scsi_device *sdev, void *no_uld_attach)
9004 {
9005 	sdev->no_uld_attach = no_uld_attach ? 1 : 0;
9006 	sdev_printk(KERN_INFO, sdev, "%s raid component\n",
9007 	    sdev->no_uld_attach ? "hiding" : "exposing");
9008 	WARN_ON(scsi_device_reprobe(sdev));
9009 }
9010 
9011 /**
9012  * _scsih_sas_volume_add - add new volume
9013  * @ioc: per adapter object
9014  * @element: IR config element data
9015  * Context: user.
9016  */
9017 static void
9018 _scsih_sas_volume_add(struct MPT3SAS_ADAPTER *ioc,
9019 	Mpi2EventIrConfigElement_t *element)
9020 {
9021 	struct _raid_device *raid_device;
9022 	unsigned long flags;
9023 	u64 wwid;
9024 	u16 handle = le16_to_cpu(element->VolDevHandle);
9025 	int rc;
9026 
9027 	mpt3sas_config_get_volume_wwid(ioc, handle, &wwid);
9028 	if (!wwid) {
9029 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
9030 			__FILE__, __LINE__, __func__);
9031 		return;
9032 	}
9033 
9034 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
9035 	raid_device = _scsih_raid_device_find_by_wwid(ioc, wwid);
9036 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
9037 
9038 	if (raid_device)
9039 		return;
9040 
9041 	raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL);
9042 	if (!raid_device) {
9043 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
9044 			__FILE__, __LINE__, __func__);
9045 		return;
9046 	}
9047 
9048 	raid_device->id = ioc->sas_id++;
9049 	raid_device->channel = RAID_CHANNEL;
9050 	raid_device->handle = handle;
9051 	raid_device->wwid = wwid;
9052 	_scsih_raid_device_add(ioc, raid_device);
9053 	if (!ioc->wait_for_discovery_to_complete) {
9054 		rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
9055 		    raid_device->id, 0);
9056 		if (rc)
9057 			_scsih_raid_device_remove(ioc, raid_device);
9058 	} else {
9059 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
9060 		_scsih_determine_boot_device(ioc, raid_device, 1);
9061 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
9062 	}
9063 }
9064 
9065 /**
9066  * _scsih_sas_volume_delete - delete volume
9067  * @ioc: per adapter object
9068  * @handle: volume device handle
9069  * Context: user.
9070  */
9071 static void
9072 _scsih_sas_volume_delete(struct MPT3SAS_ADAPTER *ioc, u16 handle)
9073 {
9074 	struct _raid_device *raid_device;
9075 	unsigned long flags;
9076 	struct MPT3SAS_TARGET *sas_target_priv_data;
9077 	struct scsi_target *starget = NULL;
9078 
9079 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
9080 	raid_device = mpt3sas_raid_device_find_by_handle(ioc, handle);
9081 	if (raid_device) {
9082 		if (raid_device->starget) {
9083 			starget = raid_device->starget;
9084 			sas_target_priv_data = starget->hostdata;
9085 			sas_target_priv_data->deleted = 1;
9086 		}
9087 		ioc_info(ioc, "removing handle(0x%04x), wwid(0x%016llx)\n",
9088 			 raid_device->handle, (u64)raid_device->wwid);
9089 		list_del(&raid_device->list);
9090 		kfree(raid_device);
9091 	}
9092 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
9093 	if (starget)
9094 		scsi_remove_target(&starget->dev);
9095 }
9096 
9097 /**
9098  * _scsih_sas_pd_expose - expose pd component to /dev/sdX
9099  * @ioc: per adapter object
9100  * @element: IR config element data
9101  * Context: user.
9102  */
9103 static void
9104 _scsih_sas_pd_expose(struct MPT3SAS_ADAPTER *ioc,
9105 	Mpi2EventIrConfigElement_t *element)
9106 {
9107 	struct _sas_device *sas_device;
9108 	struct scsi_target *starget = NULL;
9109 	struct MPT3SAS_TARGET *sas_target_priv_data;
9110 	unsigned long flags;
9111 	u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
9112 
9113 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
9114 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
9115 	if (sas_device) {
9116 		sas_device->volume_handle = 0;
9117 		sas_device->volume_wwid = 0;
9118 		clear_bit(handle, ioc->pd_handles);
9119 		if (sas_device->starget && sas_device->starget->hostdata) {
9120 			starget = sas_device->starget;
9121 			sas_target_priv_data = starget->hostdata;
9122 			sas_target_priv_data->flags &=
9123 			    ~MPT_TARGET_FLAGS_RAID_COMPONENT;
9124 		}
9125 	}
9126 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
9127 	if (!sas_device)
9128 		return;
9129 
9130 	/* exposing raid component */
9131 	if (starget)
9132 		starget_for_each_device(starget, NULL, _scsih_reprobe_lun);
9133 
9134 	sas_device_put(sas_device);
9135 }
9136 
9137 /**
9138  * _scsih_sas_pd_hide - hide pd component from /dev/sdX
9139  * @ioc: per adapter object
9140  * @element: IR config element data
9141  * Context: user.
9142  */
9143 static void
9144 _scsih_sas_pd_hide(struct MPT3SAS_ADAPTER *ioc,
9145 	Mpi2EventIrConfigElement_t *element)
9146 {
9147 	struct _sas_device *sas_device;
9148 	struct scsi_target *starget = NULL;
9149 	struct MPT3SAS_TARGET *sas_target_priv_data;
9150 	unsigned long flags;
9151 	u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
9152 	u16 volume_handle = 0;
9153 	u64 volume_wwid = 0;
9154 
9155 	mpt3sas_config_get_volume_handle(ioc, handle, &volume_handle);
9156 	if (volume_handle)
9157 		mpt3sas_config_get_volume_wwid(ioc, volume_handle,
9158 		    &volume_wwid);
9159 
9160 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
9161 	sas_device = __mpt3sas_get_sdev_by_handle(ioc, handle);
9162 	if (sas_device) {
9163 		set_bit(handle, ioc->pd_handles);
9164 		if (sas_device->starget && sas_device->starget->hostdata) {
9165 			starget = sas_device->starget;
9166 			sas_target_priv_data = starget->hostdata;
9167 			sas_target_priv_data->flags |=
9168 			    MPT_TARGET_FLAGS_RAID_COMPONENT;
9169 			sas_device->volume_handle = volume_handle;
9170 			sas_device->volume_wwid = volume_wwid;
9171 		}
9172 	}
9173 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
9174 	if (!sas_device)
9175 		return;
9176 
9177 	/* hiding raid component */
9178 	_scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
9179 
9180 	if (starget)
9181 		starget_for_each_device(starget, (void *)1, _scsih_reprobe_lun);
9182 
9183 	sas_device_put(sas_device);
9184 }
9185 
9186 /**
9187  * _scsih_sas_pd_delete - delete pd component
9188  * @ioc: per adapter object
9189  * @element: IR config element data
9190  * Context: user.
9191  */
9192 static void
9193 _scsih_sas_pd_delete(struct MPT3SAS_ADAPTER *ioc,
9194 	Mpi2EventIrConfigElement_t *element)
9195 {
9196 	u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
9197 
9198 	_scsih_device_remove_by_handle(ioc, handle);
9199 }
9200 
9201 /**
9202  * _scsih_sas_pd_add - remove pd component
9203  * @ioc: per adapter object
9204  * @element: IR config element data
9205  * Context: user.
9206  */
9207 static void
9208 _scsih_sas_pd_add(struct MPT3SAS_ADAPTER *ioc,
9209 	Mpi2EventIrConfigElement_t *element)
9210 {
9211 	struct _sas_device *sas_device;
9212 	u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
9213 	Mpi2ConfigReply_t mpi_reply;
9214 	Mpi2SasDevicePage0_t sas_device_pg0;
9215 	u32 ioc_status;
9216 	u64 sas_address;
9217 	u16 parent_handle;
9218 
9219 	set_bit(handle, ioc->pd_handles);
9220 
9221 	sas_device = mpt3sas_get_sdev_by_handle(ioc, handle);
9222 	if (sas_device) {
9223 		_scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
9224 		sas_device_put(sas_device);
9225 		return;
9226 	}
9227 
9228 	if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
9229 	    MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
9230 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
9231 			__FILE__, __LINE__, __func__);
9232 		return;
9233 	}
9234 
9235 	ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
9236 	    MPI2_IOCSTATUS_MASK;
9237 	if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
9238 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
9239 			__FILE__, __LINE__, __func__);
9240 		return;
9241 	}
9242 
9243 	parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
9244 	if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address))
9245 		mpt3sas_transport_update_links(ioc, sas_address, handle,
9246 		    sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5,
9247 		    mpt3sas_get_port_by_id(ioc,
9248 		    sas_device_pg0.PhysicalPort, 0));
9249 
9250 	_scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
9251 	_scsih_add_device(ioc, handle, 0, 1);
9252 }
9253 
9254 /**
9255  * _scsih_sas_ir_config_change_event_debug - debug for IR Config Change events
9256  * @ioc: per adapter object
9257  * @event_data: event data payload
9258  * Context: user.
9259  */
9260 static void
9261 _scsih_sas_ir_config_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
9262 	Mpi2EventDataIrConfigChangeList_t *event_data)
9263 {
9264 	Mpi2EventIrConfigElement_t *element;
9265 	u8 element_type;
9266 	int i;
9267 	char *reason_str = NULL, *element_str = NULL;
9268 
9269 	element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
9270 
9271 	ioc_info(ioc, "raid config change: (%s), elements(%d)\n",
9272 		 le32_to_cpu(event_data->Flags) & MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG ?
9273 		 "foreign" : "native",
9274 		 event_data->NumElements);
9275 	for (i = 0; i < event_data->NumElements; i++, element++) {
9276 		switch (element->ReasonCode) {
9277 		case MPI2_EVENT_IR_CHANGE_RC_ADDED:
9278 			reason_str = "add";
9279 			break;
9280 		case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
9281 			reason_str = "remove";
9282 			break;
9283 		case MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE:
9284 			reason_str = "no change";
9285 			break;
9286 		case MPI2_EVENT_IR_CHANGE_RC_HIDE:
9287 			reason_str = "hide";
9288 			break;
9289 		case MPI2_EVENT_IR_CHANGE_RC_UNHIDE:
9290 			reason_str = "unhide";
9291 			break;
9292 		case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
9293 			reason_str = "volume_created";
9294 			break;
9295 		case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
9296 			reason_str = "volume_deleted";
9297 			break;
9298 		case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
9299 			reason_str = "pd_created";
9300 			break;
9301 		case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
9302 			reason_str = "pd_deleted";
9303 			break;
9304 		default:
9305 			reason_str = "unknown reason";
9306 			break;
9307 		}
9308 		element_type = le16_to_cpu(element->ElementFlags) &
9309 		    MPI2_EVENT_IR_CHANGE_EFLAGS_ELEMENT_TYPE_MASK;
9310 		switch (element_type) {
9311 		case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLUME_ELEMENT:
9312 			element_str = "volume";
9313 			break;
9314 		case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLPHYSDISK_ELEMENT:
9315 			element_str = "phys disk";
9316 			break;
9317 		case MPI2_EVENT_IR_CHANGE_EFLAGS_HOTSPARE_ELEMENT:
9318 			element_str = "hot spare";
9319 			break;
9320 		default:
9321 			element_str = "unknown element";
9322 			break;
9323 		}
9324 		pr_info("\t(%s:%s), vol handle(0x%04x), " \
9325 		    "pd handle(0x%04x), pd num(0x%02x)\n", element_str,
9326 		    reason_str, le16_to_cpu(element->VolDevHandle),
9327 		    le16_to_cpu(element->PhysDiskDevHandle),
9328 		    element->PhysDiskNum);
9329 	}
9330 }
9331 
9332 /**
9333  * _scsih_sas_ir_config_change_event - handle ir configuration change events
9334  * @ioc: per adapter object
9335  * @fw_event: The fw_event_work object
9336  * Context: user.
9337  */
9338 static void
9339 _scsih_sas_ir_config_change_event(struct MPT3SAS_ADAPTER *ioc,
9340 	struct fw_event_work *fw_event)
9341 {
9342 	Mpi2EventIrConfigElement_t *element;
9343 	int i;
9344 	u8 foreign_config;
9345 	Mpi2EventDataIrConfigChangeList_t *event_data =
9346 		(Mpi2EventDataIrConfigChangeList_t *)
9347 		fw_event->event_data;
9348 
9349 	if ((ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) &&
9350 	     (!ioc->hide_ir_msg))
9351 		_scsih_sas_ir_config_change_event_debug(ioc, event_data);
9352 
9353 	foreign_config = (le32_to_cpu(event_data->Flags) &
9354 	    MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
9355 
9356 	element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
9357 	if (ioc->shost_recovery &&
9358 	    ioc->hba_mpi_version_belonged != MPI2_VERSION) {
9359 		for (i = 0; i < event_data->NumElements; i++, element++) {
9360 			if (element->ReasonCode == MPI2_EVENT_IR_CHANGE_RC_HIDE)
9361 				_scsih_ir_fastpath(ioc,
9362 					le16_to_cpu(element->PhysDiskDevHandle),
9363 					element->PhysDiskNum);
9364 		}
9365 		return;
9366 	}
9367 
9368 	for (i = 0; i < event_data->NumElements; i++, element++) {
9369 
9370 		switch (element->ReasonCode) {
9371 		case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
9372 		case MPI2_EVENT_IR_CHANGE_RC_ADDED:
9373 			if (!foreign_config)
9374 				_scsih_sas_volume_add(ioc, element);
9375 			break;
9376 		case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
9377 		case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
9378 			if (!foreign_config)
9379 				_scsih_sas_volume_delete(ioc,
9380 				    le16_to_cpu(element->VolDevHandle));
9381 			break;
9382 		case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
9383 			if (!ioc->is_warpdrive)
9384 				_scsih_sas_pd_hide(ioc, element);
9385 			break;
9386 		case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
9387 			if (!ioc->is_warpdrive)
9388 				_scsih_sas_pd_expose(ioc, element);
9389 			break;
9390 		case MPI2_EVENT_IR_CHANGE_RC_HIDE:
9391 			if (!ioc->is_warpdrive)
9392 				_scsih_sas_pd_add(ioc, element);
9393 			break;
9394 		case MPI2_EVENT_IR_CHANGE_RC_UNHIDE:
9395 			if (!ioc->is_warpdrive)
9396 				_scsih_sas_pd_delete(ioc, element);
9397 			break;
9398 		}
9399 	}
9400 }
9401 
9402 /**
9403  * _scsih_sas_ir_volume_event - IR volume event
9404  * @ioc: per adapter object
9405  * @fw_event: The fw_event_work object
9406  * Context: user.
9407  */
9408 static void
9409 _scsih_sas_ir_volume_event(struct MPT3SAS_ADAPTER *ioc,
9410 	struct fw_event_work *fw_event)
9411 {
9412 	u64 wwid;
9413 	unsigned long flags;
9414 	struct _raid_device *raid_device;
9415 	u16 handle;
9416 	u32 state;
9417 	int rc;
9418 	Mpi2EventDataIrVolume_t *event_data =
9419 		(Mpi2EventDataIrVolume_t *) fw_event->event_data;
9420 
9421 	if (ioc->shost_recovery)
9422 		return;
9423 
9424 	if (event_data->ReasonCode != MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED)
9425 		return;
9426 
9427 	handle = le16_to_cpu(event_data->VolDevHandle);
9428 	state = le32_to_cpu(event_data->NewValue);
9429 	if (!ioc->hide_ir_msg)
9430 		dewtprintk(ioc,
9431 			   ioc_info(ioc, "%s: handle(0x%04x), old(0x%08x), new(0x%08x)\n",
9432 				    __func__, handle,
9433 				    le32_to_cpu(event_data->PreviousValue),
9434 				    state));
9435 	switch (state) {
9436 	case MPI2_RAID_VOL_STATE_MISSING:
9437 	case MPI2_RAID_VOL_STATE_FAILED:
9438 		_scsih_sas_volume_delete(ioc, handle);
9439 		break;
9440 
9441 	case MPI2_RAID_VOL_STATE_ONLINE:
9442 	case MPI2_RAID_VOL_STATE_DEGRADED:
9443 	case MPI2_RAID_VOL_STATE_OPTIMAL:
9444 
9445 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
9446 		raid_device = mpt3sas_raid_device_find_by_handle(ioc, handle);
9447 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
9448 
9449 		if (raid_device)
9450 			break;
9451 
9452 		mpt3sas_config_get_volume_wwid(ioc, handle, &wwid);
9453 		if (!wwid) {
9454 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
9455 				__FILE__, __LINE__, __func__);
9456 			break;
9457 		}
9458 
9459 		raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL);
9460 		if (!raid_device) {
9461 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
9462 				__FILE__, __LINE__, __func__);
9463 			break;
9464 		}
9465 
9466 		raid_device->id = ioc->sas_id++;
9467 		raid_device->channel = RAID_CHANNEL;
9468 		raid_device->handle = handle;
9469 		raid_device->wwid = wwid;
9470 		_scsih_raid_device_add(ioc, raid_device);
9471 		rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
9472 		    raid_device->id, 0);
9473 		if (rc)
9474 			_scsih_raid_device_remove(ioc, raid_device);
9475 		break;
9476 
9477 	case MPI2_RAID_VOL_STATE_INITIALIZING:
9478 	default:
9479 		break;
9480 	}
9481 }
9482 
9483 /**
9484  * _scsih_sas_ir_physical_disk_event - PD event
9485  * @ioc: per adapter object
9486  * @fw_event: The fw_event_work object
9487  * Context: user.
9488  */
9489 static void
9490 _scsih_sas_ir_physical_disk_event(struct MPT3SAS_ADAPTER *ioc,
9491 	struct fw_event_work *fw_event)
9492 {
9493 	u16 handle, parent_handle;
9494 	u32 state;
9495 	struct _sas_device *sas_device;
9496 	Mpi2ConfigReply_t mpi_reply;
9497 	Mpi2SasDevicePage0_t sas_device_pg0;
9498 	u32 ioc_status;
9499 	Mpi2EventDataIrPhysicalDisk_t *event_data =
9500 		(Mpi2EventDataIrPhysicalDisk_t *) fw_event->event_data;
9501 	u64 sas_address;
9502 
9503 	if (ioc->shost_recovery)
9504 		return;
9505 
9506 	if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
9507 		return;
9508 
9509 	handle = le16_to_cpu(event_data->PhysDiskDevHandle);
9510 	state = le32_to_cpu(event_data->NewValue);
9511 
9512 	if (!ioc->hide_ir_msg)
9513 		dewtprintk(ioc,
9514 			   ioc_info(ioc, "%s: handle(0x%04x), old(0x%08x), new(0x%08x)\n",
9515 				    __func__, handle,
9516 				    le32_to_cpu(event_data->PreviousValue),
9517 				    state));
9518 
9519 	switch (state) {
9520 	case MPI2_RAID_PD_STATE_ONLINE:
9521 	case MPI2_RAID_PD_STATE_DEGRADED:
9522 	case MPI2_RAID_PD_STATE_REBUILDING:
9523 	case MPI2_RAID_PD_STATE_OPTIMAL:
9524 	case MPI2_RAID_PD_STATE_HOT_SPARE:
9525 
9526 		if (!ioc->is_warpdrive)
9527 			set_bit(handle, ioc->pd_handles);
9528 
9529 		sas_device = mpt3sas_get_sdev_by_handle(ioc, handle);
9530 		if (sas_device) {
9531 			sas_device_put(sas_device);
9532 			return;
9533 		}
9534 
9535 		if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
9536 		    &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
9537 		    handle))) {
9538 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
9539 				__FILE__, __LINE__, __func__);
9540 			return;
9541 		}
9542 
9543 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
9544 		    MPI2_IOCSTATUS_MASK;
9545 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
9546 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
9547 				__FILE__, __LINE__, __func__);
9548 			return;
9549 		}
9550 
9551 		parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
9552 		if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address))
9553 			mpt3sas_transport_update_links(ioc, sas_address, handle,
9554 			    sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5,
9555 			    mpt3sas_get_port_by_id(ioc,
9556 			    sas_device_pg0.PhysicalPort, 0));
9557 
9558 		_scsih_add_device(ioc, handle, 0, 1);
9559 
9560 		break;
9561 
9562 	case MPI2_RAID_PD_STATE_OFFLINE:
9563 	case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
9564 	case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
9565 	default:
9566 		break;
9567 	}
9568 }
9569 
9570 /**
9571  * _scsih_sas_ir_operation_status_event_debug - debug for IR op event
9572  * @ioc: per adapter object
9573  * @event_data: event data payload
9574  * Context: user.
9575  */
9576 static void
9577 _scsih_sas_ir_operation_status_event_debug(struct MPT3SAS_ADAPTER *ioc,
9578 	Mpi2EventDataIrOperationStatus_t *event_data)
9579 {
9580 	char *reason_str = NULL;
9581 
9582 	switch (event_data->RAIDOperation) {
9583 	case MPI2_EVENT_IR_RAIDOP_RESYNC:
9584 		reason_str = "resync";
9585 		break;
9586 	case MPI2_EVENT_IR_RAIDOP_ONLINE_CAP_EXPANSION:
9587 		reason_str = "online capacity expansion";
9588 		break;
9589 	case MPI2_EVENT_IR_RAIDOP_CONSISTENCY_CHECK:
9590 		reason_str = "consistency check";
9591 		break;
9592 	case MPI2_EVENT_IR_RAIDOP_BACKGROUND_INIT:
9593 		reason_str = "background init";
9594 		break;
9595 	case MPI2_EVENT_IR_RAIDOP_MAKE_DATA_CONSISTENT:
9596 		reason_str = "make data consistent";
9597 		break;
9598 	}
9599 
9600 	if (!reason_str)
9601 		return;
9602 
9603 	ioc_info(ioc, "raid operational status: (%s)\thandle(0x%04x), percent complete(%d)\n",
9604 		 reason_str,
9605 		 le16_to_cpu(event_data->VolDevHandle),
9606 		 event_data->PercentComplete);
9607 }
9608 
9609 /**
9610  * _scsih_sas_ir_operation_status_event - handle RAID operation events
9611  * @ioc: per adapter object
9612  * @fw_event: The fw_event_work object
9613  * Context: user.
9614  */
9615 static void
9616 _scsih_sas_ir_operation_status_event(struct MPT3SAS_ADAPTER *ioc,
9617 	struct fw_event_work *fw_event)
9618 {
9619 	Mpi2EventDataIrOperationStatus_t *event_data =
9620 		(Mpi2EventDataIrOperationStatus_t *)
9621 		fw_event->event_data;
9622 	static struct _raid_device *raid_device;
9623 	unsigned long flags;
9624 	u16 handle;
9625 
9626 	if ((ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) &&
9627 	    (!ioc->hide_ir_msg))
9628 		_scsih_sas_ir_operation_status_event_debug(ioc,
9629 		     event_data);
9630 
9631 	/* code added for raid transport support */
9632 	if (event_data->RAIDOperation == MPI2_EVENT_IR_RAIDOP_RESYNC) {
9633 
9634 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
9635 		handle = le16_to_cpu(event_data->VolDevHandle);
9636 		raid_device = mpt3sas_raid_device_find_by_handle(ioc, handle);
9637 		if (raid_device)
9638 			raid_device->percent_complete =
9639 			    event_data->PercentComplete;
9640 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
9641 	}
9642 }
9643 
9644 /**
9645  * _scsih_prep_device_scan - initialize parameters prior to device scan
9646  * @ioc: per adapter object
9647  *
9648  * Set the deleted flag prior to device scan.  If the device is found during
9649  * the scan, then we clear the deleted flag.
9650  */
9651 static void
9652 _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
9653 {
9654 	struct MPT3SAS_DEVICE *sas_device_priv_data;
9655 	struct scsi_device *sdev;
9656 
9657 	shost_for_each_device(sdev, ioc->shost) {
9658 		sas_device_priv_data = sdev->hostdata;
9659 		if (sas_device_priv_data && sas_device_priv_data->sas_target)
9660 			sas_device_priv_data->sas_target->deleted = 1;
9661 	}
9662 }
9663 
9664 /**
9665  * _scsih_update_device_qdepth - Update QD during Reset.
9666  * @ioc: per adapter object
9667  *
9668  */
9669 static void
9670 _scsih_update_device_qdepth(struct MPT3SAS_ADAPTER *ioc)
9671 {
9672 	struct MPT3SAS_DEVICE *sas_device_priv_data;
9673 	struct MPT3SAS_TARGET *sas_target_priv_data;
9674 	struct _sas_device *sas_device;
9675 	struct scsi_device *sdev;
9676 	u16 qdepth;
9677 
9678 	ioc_info(ioc, "Update devices with firmware reported queue depth\n");
9679 	shost_for_each_device(sdev, ioc->shost) {
9680 		sas_device_priv_data = sdev->hostdata;
9681 		if (sas_device_priv_data && sas_device_priv_data->sas_target) {
9682 			sas_target_priv_data = sas_device_priv_data->sas_target;
9683 			sas_device = sas_device_priv_data->sas_target->sas_dev;
9684 			if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_PCIE_DEVICE)
9685 				qdepth = ioc->max_nvme_qd;
9686 			else if (sas_device &&
9687 			    sas_device->device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET)
9688 				qdepth = (sas_device->port_type > 1) ?
9689 				    ioc->max_wideport_qd : ioc->max_narrowport_qd;
9690 			else if (sas_device &&
9691 			    sas_device->device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
9692 				qdepth = ioc->max_sata_qd;
9693 			else
9694 				continue;
9695 			mpt3sas_scsih_change_queue_depth(sdev, qdepth);
9696 		}
9697 	}
9698 }
9699 
9700 /**
9701  * _scsih_mark_responding_sas_device - mark a sas_devices as responding
9702  * @ioc: per adapter object
9703  * @sas_device_pg0: SAS Device page 0
9704  *
9705  * After host reset, find out whether devices are still responding.
9706  * Used in _scsih_remove_unresponsive_sas_devices.
9707  */
9708 static void
9709 _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc,
9710 Mpi2SasDevicePage0_t *sas_device_pg0)
9711 {
9712 	struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
9713 	struct scsi_target *starget;
9714 	struct _sas_device *sas_device = NULL;
9715 	struct _enclosure_node *enclosure_dev = NULL;
9716 	unsigned long flags;
9717 	struct hba_port *port = mpt3sas_get_port_by_id(
9718 	    ioc, sas_device_pg0->PhysicalPort, 0);
9719 
9720 	if (sas_device_pg0->EnclosureHandle) {
9721 		enclosure_dev =
9722 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
9723 				le16_to_cpu(sas_device_pg0->EnclosureHandle));
9724 		if (enclosure_dev == NULL)
9725 			ioc_info(ioc, "Enclosure handle(0x%04x) doesn't match with enclosure device!\n",
9726 				 sas_device_pg0->EnclosureHandle);
9727 	}
9728 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
9729 	list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
9730 		if (sas_device->sas_address != le64_to_cpu(
9731 		    sas_device_pg0->SASAddress))
9732 			continue;
9733 		if (sas_device->slot != le16_to_cpu(sas_device_pg0->Slot))
9734 			continue;
9735 		if (sas_device->port != port)
9736 			continue;
9737 		sas_device->responding = 1;
9738 		starget = sas_device->starget;
9739 		if (starget && starget->hostdata) {
9740 			sas_target_priv_data = starget->hostdata;
9741 			sas_target_priv_data->tm_busy = 0;
9742 			sas_target_priv_data->deleted = 0;
9743 		} else
9744 			sas_target_priv_data = NULL;
9745 		if (starget) {
9746 			starget_printk(KERN_INFO, starget,
9747 			    "handle(0x%04x), sas_addr(0x%016llx)\n",
9748 			    le16_to_cpu(sas_device_pg0->DevHandle),
9749 			    (unsigned long long)
9750 			    sas_device->sas_address);
9751 
9752 			if (sas_device->enclosure_handle != 0)
9753 				starget_printk(KERN_INFO, starget,
9754 				 "enclosure logical id(0x%016llx), slot(%d)\n",
9755 				 (unsigned long long)
9756 				 sas_device->enclosure_logical_id,
9757 				 sas_device->slot);
9758 		}
9759 		if (le16_to_cpu(sas_device_pg0->Flags) &
9760 		      MPI2_SAS_DEVICE0_FLAGS_ENCL_LEVEL_VALID) {
9761 			sas_device->enclosure_level =
9762 			   sas_device_pg0->EnclosureLevel;
9763 			memcpy(&sas_device->connector_name[0],
9764 				&sas_device_pg0->ConnectorName[0], 4);
9765 		} else {
9766 			sas_device->enclosure_level = 0;
9767 			sas_device->connector_name[0] = '\0';
9768 		}
9769 
9770 		sas_device->enclosure_handle =
9771 			le16_to_cpu(sas_device_pg0->EnclosureHandle);
9772 		sas_device->is_chassis_slot_valid = 0;
9773 		if (enclosure_dev) {
9774 			sas_device->enclosure_logical_id = le64_to_cpu(
9775 				enclosure_dev->pg0.EnclosureLogicalID);
9776 			if (le16_to_cpu(enclosure_dev->pg0.Flags) &
9777 			    MPI2_SAS_ENCLS0_FLAGS_CHASSIS_SLOT_VALID) {
9778 				sas_device->is_chassis_slot_valid = 1;
9779 				sas_device->chassis_slot =
9780 					enclosure_dev->pg0.ChassisSlot;
9781 			}
9782 		}
9783 
9784 		if (sas_device->handle == le16_to_cpu(
9785 		    sas_device_pg0->DevHandle))
9786 			goto out;
9787 		pr_info("\thandle changed from(0x%04x)!!!\n",
9788 		    sas_device->handle);
9789 		sas_device->handle = le16_to_cpu(
9790 		    sas_device_pg0->DevHandle);
9791 		if (sas_target_priv_data)
9792 			sas_target_priv_data->handle =
9793 			    le16_to_cpu(sas_device_pg0->DevHandle);
9794 		goto out;
9795 	}
9796  out:
9797 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
9798 }
9799 
9800 /**
9801  * _scsih_create_enclosure_list_after_reset - Free Existing list,
9802  *	And create enclosure list by scanning all Enclosure Page(0)s
9803  * @ioc: per adapter object
9804  */
9805 static void
9806 _scsih_create_enclosure_list_after_reset(struct MPT3SAS_ADAPTER *ioc)
9807 {
9808 	struct _enclosure_node *enclosure_dev;
9809 	Mpi2ConfigReply_t mpi_reply;
9810 	u16 enclosure_handle;
9811 	int rc;
9812 
9813 	/* Free existing enclosure list */
9814 	mpt3sas_free_enclosure_list(ioc);
9815 
9816 	/* Re constructing enclosure list after reset*/
9817 	enclosure_handle = 0xFFFF;
9818 	do {
9819 		enclosure_dev =
9820 			kzalloc(sizeof(struct _enclosure_node), GFP_KERNEL);
9821 		if (!enclosure_dev) {
9822 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
9823 				__FILE__, __LINE__, __func__);
9824 			return;
9825 		}
9826 		rc = mpt3sas_config_get_enclosure_pg0(ioc, &mpi_reply,
9827 				&enclosure_dev->pg0,
9828 				MPI2_SAS_ENCLOS_PGAD_FORM_GET_NEXT_HANDLE,
9829 				enclosure_handle);
9830 
9831 		if (rc || (le16_to_cpu(mpi_reply.IOCStatus) &
9832 						MPI2_IOCSTATUS_MASK)) {
9833 			kfree(enclosure_dev);
9834 			return;
9835 		}
9836 		list_add_tail(&enclosure_dev->list,
9837 						&ioc->enclosure_list);
9838 		enclosure_handle =
9839 			le16_to_cpu(enclosure_dev->pg0.EnclosureHandle);
9840 	} while (1);
9841 }
9842 
9843 /**
9844  * _scsih_search_responding_sas_devices -
9845  * @ioc: per adapter object
9846  *
9847  * After host reset, find out whether devices are still responding.
9848  * If not remove.
9849  */
9850 static void
9851 _scsih_search_responding_sas_devices(struct MPT3SAS_ADAPTER *ioc)
9852 {
9853 	Mpi2SasDevicePage0_t sas_device_pg0;
9854 	Mpi2ConfigReply_t mpi_reply;
9855 	u16 ioc_status;
9856 	u16 handle;
9857 	u32 device_info;
9858 
9859 	ioc_info(ioc, "search for end-devices: start\n");
9860 
9861 	if (list_empty(&ioc->sas_device_list))
9862 		goto out;
9863 
9864 	handle = 0xFFFF;
9865 	while (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
9866 	    &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
9867 	    handle))) {
9868 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
9869 		    MPI2_IOCSTATUS_MASK;
9870 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
9871 			break;
9872 		handle = le16_to_cpu(sas_device_pg0.DevHandle);
9873 		device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
9874 		if (!(_scsih_is_end_device(device_info)))
9875 			continue;
9876 		_scsih_mark_responding_sas_device(ioc, &sas_device_pg0);
9877 	}
9878 
9879  out:
9880 	ioc_info(ioc, "search for end-devices: complete\n");
9881 }
9882 
9883 /**
9884  * _scsih_mark_responding_pcie_device - mark a pcie_device as responding
9885  * @ioc: per adapter object
9886  * @pcie_device_pg0: PCIe Device page 0
9887  *
9888  * After host reset, find out whether devices are still responding.
9889  * Used in _scsih_remove_unresponding_devices.
9890  */
9891 static void
9892 _scsih_mark_responding_pcie_device(struct MPT3SAS_ADAPTER *ioc,
9893 	Mpi26PCIeDevicePage0_t *pcie_device_pg0)
9894 {
9895 	struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
9896 	struct scsi_target *starget;
9897 	struct _pcie_device *pcie_device;
9898 	unsigned long flags;
9899 
9900 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
9901 	list_for_each_entry(pcie_device, &ioc->pcie_device_list, list) {
9902 		if ((pcie_device->wwid == le64_to_cpu(pcie_device_pg0->WWID))
9903 		    && (pcie_device->slot == le16_to_cpu(
9904 		    pcie_device_pg0->Slot))) {
9905 			pcie_device->access_status =
9906 					pcie_device_pg0->AccessStatus;
9907 			pcie_device->responding = 1;
9908 			starget = pcie_device->starget;
9909 			if (starget && starget->hostdata) {
9910 				sas_target_priv_data = starget->hostdata;
9911 				sas_target_priv_data->tm_busy = 0;
9912 				sas_target_priv_data->deleted = 0;
9913 			} else
9914 				sas_target_priv_data = NULL;
9915 			if (starget) {
9916 				starget_printk(KERN_INFO, starget,
9917 				    "handle(0x%04x), wwid(0x%016llx) ",
9918 				    pcie_device->handle,
9919 				    (unsigned long long)pcie_device->wwid);
9920 				if (pcie_device->enclosure_handle != 0)
9921 					starget_printk(KERN_INFO, starget,
9922 					    "enclosure logical id(0x%016llx), "
9923 					    "slot(%d)\n",
9924 					    (unsigned long long)
9925 					    pcie_device->enclosure_logical_id,
9926 					    pcie_device->slot);
9927 			}
9928 
9929 			if (((le32_to_cpu(pcie_device_pg0->Flags)) &
9930 			    MPI26_PCIEDEV0_FLAGS_ENCL_LEVEL_VALID) &&
9931 			    (ioc->hba_mpi_version_belonged != MPI2_VERSION)) {
9932 				pcie_device->enclosure_level =
9933 				    pcie_device_pg0->EnclosureLevel;
9934 				memcpy(&pcie_device->connector_name[0],
9935 				    &pcie_device_pg0->ConnectorName[0], 4);
9936 			} else {
9937 				pcie_device->enclosure_level = 0;
9938 				pcie_device->connector_name[0] = '\0';
9939 			}
9940 
9941 			if (pcie_device->handle == le16_to_cpu(
9942 			    pcie_device_pg0->DevHandle))
9943 				goto out;
9944 			pr_info("\thandle changed from(0x%04x)!!!\n",
9945 			    pcie_device->handle);
9946 			pcie_device->handle = le16_to_cpu(
9947 			    pcie_device_pg0->DevHandle);
9948 			if (sas_target_priv_data)
9949 				sas_target_priv_data->handle =
9950 				    le16_to_cpu(pcie_device_pg0->DevHandle);
9951 			goto out;
9952 		}
9953 	}
9954 
9955  out:
9956 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
9957 }
9958 
9959 /**
9960  * _scsih_search_responding_pcie_devices -
9961  * @ioc: per adapter object
9962  *
9963  * After host reset, find out whether devices are still responding.
9964  * If not remove.
9965  */
9966 static void
9967 _scsih_search_responding_pcie_devices(struct MPT3SAS_ADAPTER *ioc)
9968 {
9969 	Mpi26PCIeDevicePage0_t pcie_device_pg0;
9970 	Mpi2ConfigReply_t mpi_reply;
9971 	u16 ioc_status;
9972 	u16 handle;
9973 	u32 device_info;
9974 
9975 	ioc_info(ioc, "search for end-devices: start\n");
9976 
9977 	if (list_empty(&ioc->pcie_device_list))
9978 		goto out;
9979 
9980 	handle = 0xFFFF;
9981 	while (!(mpt3sas_config_get_pcie_device_pg0(ioc, &mpi_reply,
9982 		&pcie_device_pg0, MPI26_PCIE_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
9983 		handle))) {
9984 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
9985 		    MPI2_IOCSTATUS_MASK;
9986 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
9987 			ioc_info(ioc, "\tbreak from %s: ioc_status(0x%04x), loginfo(0x%08x)\n",
9988 				 __func__, ioc_status,
9989 				 le32_to_cpu(mpi_reply.IOCLogInfo));
9990 			break;
9991 		}
9992 		handle = le16_to_cpu(pcie_device_pg0.DevHandle);
9993 		device_info = le32_to_cpu(pcie_device_pg0.DeviceInfo);
9994 		if (!(_scsih_is_nvme_pciescsi_device(device_info)))
9995 			continue;
9996 		_scsih_mark_responding_pcie_device(ioc, &pcie_device_pg0);
9997 	}
9998 out:
9999 	ioc_info(ioc, "search for PCIe end-devices: complete\n");
10000 }
10001 
10002 /**
10003  * _scsih_mark_responding_raid_device - mark a raid_device as responding
10004  * @ioc: per adapter object
10005  * @wwid: world wide identifier for raid volume
10006  * @handle: device handle
10007  *
10008  * After host reset, find out whether devices are still responding.
10009  * Used in _scsih_remove_unresponsive_raid_devices.
10010  */
10011 static void
10012 _scsih_mark_responding_raid_device(struct MPT3SAS_ADAPTER *ioc, u64 wwid,
10013 	u16 handle)
10014 {
10015 	struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
10016 	struct scsi_target *starget;
10017 	struct _raid_device *raid_device;
10018 	unsigned long flags;
10019 
10020 	spin_lock_irqsave(&ioc->raid_device_lock, flags);
10021 	list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
10022 		if (raid_device->wwid == wwid && raid_device->starget) {
10023 			starget = raid_device->starget;
10024 			if (starget && starget->hostdata) {
10025 				sas_target_priv_data = starget->hostdata;
10026 				sas_target_priv_data->deleted = 0;
10027 			} else
10028 				sas_target_priv_data = NULL;
10029 			raid_device->responding = 1;
10030 			spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
10031 			starget_printk(KERN_INFO, raid_device->starget,
10032 			    "handle(0x%04x), wwid(0x%016llx)\n", handle,
10033 			    (unsigned long long)raid_device->wwid);
10034 
10035 			/*
10036 			 * WARPDRIVE: The handles of the PDs might have changed
10037 			 * across the host reset so re-initialize the
10038 			 * required data for Direct IO
10039 			 */
10040 			mpt3sas_init_warpdrive_properties(ioc, raid_device);
10041 			spin_lock_irqsave(&ioc->raid_device_lock, flags);
10042 			if (raid_device->handle == handle) {
10043 				spin_unlock_irqrestore(&ioc->raid_device_lock,
10044 				    flags);
10045 				return;
10046 			}
10047 			pr_info("\thandle changed from(0x%04x)!!!\n",
10048 			    raid_device->handle);
10049 			raid_device->handle = handle;
10050 			if (sas_target_priv_data)
10051 				sas_target_priv_data->handle = handle;
10052 			spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
10053 			return;
10054 		}
10055 	}
10056 	spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
10057 }
10058 
10059 /**
10060  * _scsih_search_responding_raid_devices -
10061  * @ioc: per adapter object
10062  *
10063  * After host reset, find out whether devices are still responding.
10064  * If not remove.
10065  */
10066 static void
10067 _scsih_search_responding_raid_devices(struct MPT3SAS_ADAPTER *ioc)
10068 {
10069 	Mpi2RaidVolPage1_t volume_pg1;
10070 	Mpi2RaidVolPage0_t volume_pg0;
10071 	Mpi2RaidPhysDiskPage0_t pd_pg0;
10072 	Mpi2ConfigReply_t mpi_reply;
10073 	u16 ioc_status;
10074 	u16 handle;
10075 	u8 phys_disk_num;
10076 
10077 	if (!ioc->ir_firmware)
10078 		return;
10079 
10080 	ioc_info(ioc, "search for raid volumes: start\n");
10081 
10082 	if (list_empty(&ioc->raid_device_list))
10083 		goto out;
10084 
10085 	handle = 0xFFFF;
10086 	while (!(mpt3sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
10087 	    &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) {
10088 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10089 		    MPI2_IOCSTATUS_MASK;
10090 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
10091 			break;
10092 		handle = le16_to_cpu(volume_pg1.DevHandle);
10093 
10094 		if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply,
10095 		    &volume_pg0, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
10096 		     sizeof(Mpi2RaidVolPage0_t)))
10097 			continue;
10098 
10099 		if (volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_OPTIMAL ||
10100 		    volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_ONLINE ||
10101 		    volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_DEGRADED)
10102 			_scsih_mark_responding_raid_device(ioc,
10103 			    le64_to_cpu(volume_pg1.WWID), handle);
10104 	}
10105 
10106 	/* refresh the pd_handles */
10107 	if (!ioc->is_warpdrive) {
10108 		phys_disk_num = 0xFF;
10109 		memset(ioc->pd_handles, 0, ioc->pd_handles_sz);
10110 		while (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
10111 		    &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
10112 		    phys_disk_num))) {
10113 			ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10114 			    MPI2_IOCSTATUS_MASK;
10115 			if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
10116 				break;
10117 			phys_disk_num = pd_pg0.PhysDiskNum;
10118 			handle = le16_to_cpu(pd_pg0.DevHandle);
10119 			set_bit(handle, ioc->pd_handles);
10120 		}
10121 	}
10122  out:
10123 	ioc_info(ioc, "search for responding raid volumes: complete\n");
10124 }
10125 
10126 /**
10127  * _scsih_mark_responding_expander - mark a expander as responding
10128  * @ioc: per adapter object
10129  * @expander_pg0:SAS Expander Config Page0
10130  *
10131  * After host reset, find out whether devices are still responding.
10132  * Used in _scsih_remove_unresponsive_expanders.
10133  */
10134 static void
10135 _scsih_mark_responding_expander(struct MPT3SAS_ADAPTER *ioc,
10136 	Mpi2ExpanderPage0_t *expander_pg0)
10137 {
10138 	struct _sas_node *sas_expander = NULL;
10139 	unsigned long flags;
10140 	int i;
10141 	struct _enclosure_node *enclosure_dev = NULL;
10142 	u16 handle = le16_to_cpu(expander_pg0->DevHandle);
10143 	u16 enclosure_handle = le16_to_cpu(expander_pg0->EnclosureHandle);
10144 	u64 sas_address = le64_to_cpu(expander_pg0->SASAddress);
10145 	struct hba_port *port = mpt3sas_get_port_by_id(
10146 	    ioc, expander_pg0->PhysicalPort, 0);
10147 
10148 	if (enclosure_handle)
10149 		enclosure_dev =
10150 			mpt3sas_scsih_enclosure_find_by_handle(ioc,
10151 							enclosure_handle);
10152 
10153 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
10154 	list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
10155 		if (sas_expander->sas_address != sas_address)
10156 			continue;
10157 		if (sas_expander->port != port)
10158 			continue;
10159 		sas_expander->responding = 1;
10160 
10161 		if (enclosure_dev) {
10162 			sas_expander->enclosure_logical_id =
10163 			    le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
10164 			sas_expander->enclosure_handle =
10165 			    le16_to_cpu(expander_pg0->EnclosureHandle);
10166 		}
10167 
10168 		if (sas_expander->handle == handle)
10169 			goto out;
10170 		pr_info("\texpander(0x%016llx): handle changed" \
10171 		    " from(0x%04x) to (0x%04x)!!!\n",
10172 		    (unsigned long long)sas_expander->sas_address,
10173 		    sas_expander->handle, handle);
10174 		sas_expander->handle = handle;
10175 		for (i = 0 ; i < sas_expander->num_phys ; i++)
10176 			sas_expander->phy[i].handle = handle;
10177 		goto out;
10178 	}
10179  out:
10180 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
10181 }
10182 
10183 /**
10184  * _scsih_search_responding_expanders -
10185  * @ioc: per adapter object
10186  *
10187  * After host reset, find out whether devices are still responding.
10188  * If not remove.
10189  */
10190 static void
10191 _scsih_search_responding_expanders(struct MPT3SAS_ADAPTER *ioc)
10192 {
10193 	Mpi2ExpanderPage0_t expander_pg0;
10194 	Mpi2ConfigReply_t mpi_reply;
10195 	u16 ioc_status;
10196 	u64 sas_address;
10197 	u16 handle;
10198 	u8 port;
10199 
10200 	ioc_info(ioc, "search for expanders: start\n");
10201 
10202 	if (list_empty(&ioc->sas_expander_list))
10203 		goto out;
10204 
10205 	handle = 0xFFFF;
10206 	while (!(mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
10207 	    MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) {
10208 
10209 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10210 		    MPI2_IOCSTATUS_MASK;
10211 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
10212 			break;
10213 
10214 		handle = le16_to_cpu(expander_pg0.DevHandle);
10215 		sas_address = le64_to_cpu(expander_pg0.SASAddress);
10216 		port = expander_pg0.PhysicalPort;
10217 		pr_info(
10218 		    "\texpander present: handle(0x%04x), sas_addr(0x%016llx), port:%d\n",
10219 		    handle, (unsigned long long)sas_address,
10220 		    (ioc->multipath_on_hba ?
10221 		    port : MULTIPATH_DISABLED_PORT_ID));
10222 		_scsih_mark_responding_expander(ioc, &expander_pg0);
10223 	}
10224 
10225  out:
10226 	ioc_info(ioc, "search for expanders: complete\n");
10227 }
10228 
10229 /**
10230  * _scsih_remove_unresponding_devices - removing unresponding devices
10231  * @ioc: per adapter object
10232  */
10233 static void
10234 _scsih_remove_unresponding_devices(struct MPT3SAS_ADAPTER *ioc)
10235 {
10236 	struct _sas_device *sas_device, *sas_device_next;
10237 	struct _sas_node *sas_expander, *sas_expander_next;
10238 	struct _raid_device *raid_device, *raid_device_next;
10239 	struct _pcie_device *pcie_device, *pcie_device_next;
10240 	struct list_head tmp_list;
10241 	unsigned long flags;
10242 	LIST_HEAD(head);
10243 
10244 	ioc_info(ioc, "removing unresponding devices: start\n");
10245 
10246 	/* removing unresponding end devices */
10247 	ioc_info(ioc, "removing unresponding devices: end-devices\n");
10248 	/*
10249 	 * Iterate, pulling off devices marked as non-responding. We become the
10250 	 * owner for the reference the list had on any object we prune.
10251 	 */
10252 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
10253 
10254 	/*
10255 	 * Clean up the sas_device_init_list list as
10256 	 * driver goes for fresh scan as part of diag reset.
10257 	 */
10258 	list_for_each_entry_safe(sas_device, sas_device_next,
10259 	    &ioc->sas_device_init_list, list) {
10260 		list_del_init(&sas_device->list);
10261 		sas_device_put(sas_device);
10262 	}
10263 
10264 	list_for_each_entry_safe(sas_device, sas_device_next,
10265 	    &ioc->sas_device_list, list) {
10266 		if (!sas_device->responding)
10267 			list_move_tail(&sas_device->list, &head);
10268 		else
10269 			sas_device->responding = 0;
10270 	}
10271 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
10272 
10273 	/*
10274 	 * Now, uninitialize and remove the unresponding devices we pruned.
10275 	 */
10276 	list_for_each_entry_safe(sas_device, sas_device_next, &head, list) {
10277 		_scsih_remove_device(ioc, sas_device);
10278 		list_del_init(&sas_device->list);
10279 		sas_device_put(sas_device);
10280 	}
10281 
10282 	ioc_info(ioc, "Removing unresponding devices: pcie end-devices\n");
10283 	INIT_LIST_HEAD(&head);
10284 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
10285 	/*
10286 	 * Clean up the pcie_device_init_list list as
10287 	 * driver goes for fresh scan as part of diag reset.
10288 	 */
10289 	list_for_each_entry_safe(pcie_device, pcie_device_next,
10290 	    &ioc->pcie_device_init_list, list) {
10291 		list_del_init(&pcie_device->list);
10292 		pcie_device_put(pcie_device);
10293 	}
10294 
10295 	list_for_each_entry_safe(pcie_device, pcie_device_next,
10296 	    &ioc->pcie_device_list, list) {
10297 		if (!pcie_device->responding)
10298 			list_move_tail(&pcie_device->list, &head);
10299 		else
10300 			pcie_device->responding = 0;
10301 	}
10302 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
10303 
10304 	list_for_each_entry_safe(pcie_device, pcie_device_next, &head, list) {
10305 		_scsih_pcie_device_remove_from_sml(ioc, pcie_device);
10306 		list_del_init(&pcie_device->list);
10307 		pcie_device_put(pcie_device);
10308 	}
10309 
10310 	/* removing unresponding volumes */
10311 	if (ioc->ir_firmware) {
10312 		ioc_info(ioc, "removing unresponding devices: volumes\n");
10313 		list_for_each_entry_safe(raid_device, raid_device_next,
10314 		    &ioc->raid_device_list, list) {
10315 			if (!raid_device->responding)
10316 				_scsih_sas_volume_delete(ioc,
10317 				    raid_device->handle);
10318 			else
10319 				raid_device->responding = 0;
10320 		}
10321 	}
10322 
10323 	/* removing unresponding expanders */
10324 	ioc_info(ioc, "removing unresponding devices: expanders\n");
10325 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
10326 	INIT_LIST_HEAD(&tmp_list);
10327 	list_for_each_entry_safe(sas_expander, sas_expander_next,
10328 	    &ioc->sas_expander_list, list) {
10329 		if (!sas_expander->responding)
10330 			list_move_tail(&sas_expander->list, &tmp_list);
10331 		else
10332 			sas_expander->responding = 0;
10333 	}
10334 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
10335 	list_for_each_entry_safe(sas_expander, sas_expander_next, &tmp_list,
10336 	    list) {
10337 		_scsih_expander_node_remove(ioc, sas_expander);
10338 	}
10339 
10340 	ioc_info(ioc, "removing unresponding devices: complete\n");
10341 
10342 	/* unblock devices */
10343 	_scsih_ublock_io_all_device(ioc);
10344 }
10345 
10346 static void
10347 _scsih_refresh_expander_links(struct MPT3SAS_ADAPTER *ioc,
10348 	struct _sas_node *sas_expander, u16 handle)
10349 {
10350 	Mpi2ExpanderPage1_t expander_pg1;
10351 	Mpi2ConfigReply_t mpi_reply;
10352 	int i;
10353 
10354 	for (i = 0 ; i < sas_expander->num_phys ; i++) {
10355 		if ((mpt3sas_config_get_expander_pg1(ioc, &mpi_reply,
10356 		    &expander_pg1, i, handle))) {
10357 			ioc_err(ioc, "failure at %s:%d/%s()!\n",
10358 				__FILE__, __LINE__, __func__);
10359 			return;
10360 		}
10361 
10362 		mpt3sas_transport_update_links(ioc, sas_expander->sas_address,
10363 		    le16_to_cpu(expander_pg1.AttachedDevHandle), i,
10364 		    expander_pg1.NegotiatedLinkRate >> 4,
10365 		    sas_expander->port);
10366 	}
10367 }
10368 
10369 /**
10370  * _scsih_scan_for_devices_after_reset - scan for devices after host reset
10371  * @ioc: per adapter object
10372  */
10373 static void
10374 _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc)
10375 {
10376 	Mpi2ExpanderPage0_t expander_pg0;
10377 	Mpi2SasDevicePage0_t sas_device_pg0;
10378 	Mpi26PCIeDevicePage0_t pcie_device_pg0;
10379 	Mpi2RaidVolPage1_t *volume_pg1;
10380 	Mpi2RaidVolPage0_t *volume_pg0;
10381 	Mpi2RaidPhysDiskPage0_t pd_pg0;
10382 	Mpi2EventIrConfigElement_t element;
10383 	Mpi2ConfigReply_t mpi_reply;
10384 	u8 phys_disk_num, port_id;
10385 	u16 ioc_status;
10386 	u16 handle, parent_handle;
10387 	u64 sas_address;
10388 	struct _sas_device *sas_device;
10389 	struct _pcie_device *pcie_device;
10390 	struct _sas_node *expander_device;
10391 	static struct _raid_device *raid_device;
10392 	u8 retry_count;
10393 	unsigned long flags;
10394 
10395 	volume_pg0 = kzalloc(sizeof(*volume_pg0), GFP_KERNEL);
10396 	if (!volume_pg0)
10397 		return;
10398 
10399 	volume_pg1 = kzalloc(sizeof(*volume_pg1), GFP_KERNEL);
10400 	if (!volume_pg1) {
10401 		kfree(volume_pg0);
10402 		return;
10403 	}
10404 
10405 	ioc_info(ioc, "scan devices: start\n");
10406 
10407 	_scsih_sas_host_refresh(ioc);
10408 
10409 	ioc_info(ioc, "\tscan devices: expanders start\n");
10410 
10411 	/* expanders */
10412 	handle = 0xFFFF;
10413 	while (!(mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
10414 	    MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) {
10415 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10416 		    MPI2_IOCSTATUS_MASK;
10417 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10418 			ioc_info(ioc, "\tbreak from expander scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10419 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10420 			break;
10421 		}
10422 		handle = le16_to_cpu(expander_pg0.DevHandle);
10423 		spin_lock_irqsave(&ioc->sas_node_lock, flags);
10424 		port_id = expander_pg0.PhysicalPort;
10425 		expander_device = mpt3sas_scsih_expander_find_by_sas_address(
10426 		    ioc, le64_to_cpu(expander_pg0.SASAddress),
10427 		    mpt3sas_get_port_by_id(ioc, port_id, 0));
10428 		spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
10429 		if (expander_device)
10430 			_scsih_refresh_expander_links(ioc, expander_device,
10431 			    handle);
10432 		else {
10433 			ioc_info(ioc, "\tBEFORE adding expander: handle (0x%04x), sas_addr(0x%016llx)\n",
10434 				 handle,
10435 				 (u64)le64_to_cpu(expander_pg0.SASAddress));
10436 			_scsih_expander_add(ioc, handle);
10437 			ioc_info(ioc, "\tAFTER adding expander: handle (0x%04x), sas_addr(0x%016llx)\n",
10438 				 handle,
10439 				 (u64)le64_to_cpu(expander_pg0.SASAddress));
10440 		}
10441 	}
10442 
10443 	ioc_info(ioc, "\tscan devices: expanders complete\n");
10444 
10445 	if (!ioc->ir_firmware)
10446 		goto skip_to_sas;
10447 
10448 	ioc_info(ioc, "\tscan devices: phys disk start\n");
10449 
10450 	/* phys disk */
10451 	phys_disk_num = 0xFF;
10452 	while (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
10453 	    &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
10454 	    phys_disk_num))) {
10455 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10456 		    MPI2_IOCSTATUS_MASK;
10457 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10458 			ioc_info(ioc, "\tbreak from phys disk scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10459 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10460 			break;
10461 		}
10462 		phys_disk_num = pd_pg0.PhysDiskNum;
10463 		handle = le16_to_cpu(pd_pg0.DevHandle);
10464 		sas_device = mpt3sas_get_sdev_by_handle(ioc, handle);
10465 		if (sas_device) {
10466 			sas_device_put(sas_device);
10467 			continue;
10468 		}
10469 		if (mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
10470 		    &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
10471 		    handle) != 0)
10472 			continue;
10473 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10474 		    MPI2_IOCSTATUS_MASK;
10475 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10476 			ioc_info(ioc, "\tbreak from phys disk scan ioc_status(0x%04x), loginfo(0x%08x)\n",
10477 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10478 			break;
10479 		}
10480 		parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
10481 		if (!_scsih_get_sas_address(ioc, parent_handle,
10482 		    &sas_address)) {
10483 			ioc_info(ioc, "\tBEFORE adding phys disk: handle (0x%04x), sas_addr(0x%016llx)\n",
10484 				 handle,
10485 				 (u64)le64_to_cpu(sas_device_pg0.SASAddress));
10486 			port_id = sas_device_pg0.PhysicalPort;
10487 			mpt3sas_transport_update_links(ioc, sas_address,
10488 			    handle, sas_device_pg0.PhyNum,
10489 			    MPI2_SAS_NEG_LINK_RATE_1_5,
10490 			    mpt3sas_get_port_by_id(ioc, port_id, 0));
10491 			set_bit(handle, ioc->pd_handles);
10492 			retry_count = 0;
10493 			/* This will retry adding the end device.
10494 			 * _scsih_add_device() will decide on retries and
10495 			 * return "1" when it should be retried
10496 			 */
10497 			while (_scsih_add_device(ioc, handle, retry_count++,
10498 			    1)) {
10499 				ssleep(1);
10500 			}
10501 			ioc_info(ioc, "\tAFTER adding phys disk: handle (0x%04x), sas_addr(0x%016llx)\n",
10502 				 handle,
10503 				 (u64)le64_to_cpu(sas_device_pg0.SASAddress));
10504 		}
10505 	}
10506 
10507 	ioc_info(ioc, "\tscan devices: phys disk complete\n");
10508 
10509 	ioc_info(ioc, "\tscan devices: volumes start\n");
10510 
10511 	/* volumes */
10512 	handle = 0xFFFF;
10513 	while (!(mpt3sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
10514 	    volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) {
10515 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10516 		    MPI2_IOCSTATUS_MASK;
10517 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10518 			ioc_info(ioc, "\tbreak from volume scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10519 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10520 			break;
10521 		}
10522 		handle = le16_to_cpu(volume_pg1->DevHandle);
10523 		spin_lock_irqsave(&ioc->raid_device_lock, flags);
10524 		raid_device = _scsih_raid_device_find_by_wwid(ioc,
10525 		    le64_to_cpu(volume_pg1->WWID));
10526 		spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
10527 		if (raid_device)
10528 			continue;
10529 		if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply,
10530 		    volume_pg0, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
10531 		     sizeof(Mpi2RaidVolPage0_t)))
10532 			continue;
10533 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10534 		    MPI2_IOCSTATUS_MASK;
10535 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10536 			ioc_info(ioc, "\tbreak from volume scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10537 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10538 			break;
10539 		}
10540 		if (volume_pg0->VolumeState == MPI2_RAID_VOL_STATE_OPTIMAL ||
10541 		    volume_pg0->VolumeState == MPI2_RAID_VOL_STATE_ONLINE ||
10542 		    volume_pg0->VolumeState == MPI2_RAID_VOL_STATE_DEGRADED) {
10543 			memset(&element, 0, sizeof(Mpi2EventIrConfigElement_t));
10544 			element.ReasonCode = MPI2_EVENT_IR_CHANGE_RC_ADDED;
10545 			element.VolDevHandle = volume_pg1->DevHandle;
10546 			ioc_info(ioc, "\tBEFORE adding volume: handle (0x%04x)\n",
10547 				 volume_pg1->DevHandle);
10548 			_scsih_sas_volume_add(ioc, &element);
10549 			ioc_info(ioc, "\tAFTER adding volume: handle (0x%04x)\n",
10550 				 volume_pg1->DevHandle);
10551 		}
10552 	}
10553 
10554 	ioc_info(ioc, "\tscan devices: volumes complete\n");
10555 
10556  skip_to_sas:
10557 
10558 	ioc_info(ioc, "\tscan devices: end devices start\n");
10559 
10560 	/* sas devices */
10561 	handle = 0xFFFF;
10562 	while (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
10563 	    &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
10564 	    handle))) {
10565 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
10566 		    MPI2_IOCSTATUS_MASK;
10567 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10568 			ioc_info(ioc, "\tbreak from end device scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10569 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10570 			break;
10571 		}
10572 		handle = le16_to_cpu(sas_device_pg0.DevHandle);
10573 		if (!(_scsih_is_end_device(
10574 		    le32_to_cpu(sas_device_pg0.DeviceInfo))))
10575 			continue;
10576 		port_id = sas_device_pg0.PhysicalPort;
10577 		sas_device = mpt3sas_get_sdev_by_addr(ioc,
10578 		    le64_to_cpu(sas_device_pg0.SASAddress),
10579 		    mpt3sas_get_port_by_id(ioc, port_id, 0));
10580 		if (sas_device) {
10581 			sas_device_put(sas_device);
10582 			continue;
10583 		}
10584 		parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
10585 		if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address)) {
10586 			ioc_info(ioc, "\tBEFORE adding end device: handle (0x%04x), sas_addr(0x%016llx)\n",
10587 				 handle,
10588 				 (u64)le64_to_cpu(sas_device_pg0.SASAddress));
10589 			mpt3sas_transport_update_links(ioc, sas_address, handle,
10590 			    sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5,
10591 			    mpt3sas_get_port_by_id(ioc, port_id, 0));
10592 			retry_count = 0;
10593 			/* This will retry adding the end device.
10594 			 * _scsih_add_device() will decide on retries and
10595 			 * return "1" when it should be retried
10596 			 */
10597 			while (_scsih_add_device(ioc, handle, retry_count++,
10598 			    0)) {
10599 				ssleep(1);
10600 			}
10601 			ioc_info(ioc, "\tAFTER adding end device: handle (0x%04x), sas_addr(0x%016llx)\n",
10602 				 handle,
10603 				 (u64)le64_to_cpu(sas_device_pg0.SASAddress));
10604 		}
10605 	}
10606 	ioc_info(ioc, "\tscan devices: end devices complete\n");
10607 	ioc_info(ioc, "\tscan devices: pcie end devices start\n");
10608 
10609 	/* pcie devices */
10610 	handle = 0xFFFF;
10611 	while (!(mpt3sas_config_get_pcie_device_pg0(ioc, &mpi_reply,
10612 		&pcie_device_pg0, MPI26_PCIE_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
10613 		handle))) {
10614 		ioc_status = le16_to_cpu(mpi_reply.IOCStatus)
10615 				& MPI2_IOCSTATUS_MASK;
10616 		if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
10617 			ioc_info(ioc, "\tbreak from pcie end device scan: ioc_status(0x%04x), loginfo(0x%08x)\n",
10618 				 ioc_status, le32_to_cpu(mpi_reply.IOCLogInfo));
10619 			break;
10620 		}
10621 		handle = le16_to_cpu(pcie_device_pg0.DevHandle);
10622 		if (!(_scsih_is_nvme_pciescsi_device(
10623 			le32_to_cpu(pcie_device_pg0.DeviceInfo))))
10624 			continue;
10625 		pcie_device = mpt3sas_get_pdev_by_wwid(ioc,
10626 				le64_to_cpu(pcie_device_pg0.WWID));
10627 		if (pcie_device) {
10628 			pcie_device_put(pcie_device);
10629 			continue;
10630 		}
10631 		retry_count = 0;
10632 		parent_handle = le16_to_cpu(pcie_device_pg0.ParentDevHandle);
10633 		_scsih_pcie_add_device(ioc, handle);
10634 
10635 		ioc_info(ioc, "\tAFTER adding pcie end device: handle (0x%04x), wwid(0x%016llx)\n",
10636 			 handle, (u64)le64_to_cpu(pcie_device_pg0.WWID));
10637 	}
10638 
10639 	kfree(volume_pg0);
10640 	kfree(volume_pg1);
10641 
10642 	ioc_info(ioc, "\tpcie devices: pcie end devices complete\n");
10643 	ioc_info(ioc, "scan devices: complete\n");
10644 }
10645 
10646 /**
10647  * mpt3sas_scsih_pre_reset_handler - reset callback handler (for scsih)
10648  * @ioc: per adapter object
10649  *
10650  * The handler for doing any required cleanup or initialization.
10651  */
10652 void mpt3sas_scsih_pre_reset_handler(struct MPT3SAS_ADAPTER *ioc)
10653 {
10654 	dtmprintk(ioc, ioc_info(ioc, "%s: MPT3_IOC_PRE_RESET\n", __func__));
10655 }
10656 
10657 /**
10658  * mpt3sas_scsih_clear_outstanding_scsi_tm_commands - clears outstanding
10659  *							scsi & tm cmds.
10660  * @ioc: per adapter object
10661  *
10662  * The handler for doing any required cleanup or initialization.
10663  */
10664 void
10665 mpt3sas_scsih_clear_outstanding_scsi_tm_commands(struct MPT3SAS_ADAPTER *ioc)
10666 {
10667 	dtmprintk(ioc,
10668 	    ioc_info(ioc, "%s: clear outstanding scsi & tm cmds\n", __func__));
10669 	if (ioc->scsih_cmds.status & MPT3_CMD_PENDING) {
10670 		ioc->scsih_cmds.status |= MPT3_CMD_RESET;
10671 		mpt3sas_base_free_smid(ioc, ioc->scsih_cmds.smid);
10672 		complete(&ioc->scsih_cmds.done);
10673 	}
10674 	if (ioc->tm_cmds.status & MPT3_CMD_PENDING) {
10675 		ioc->tm_cmds.status |= MPT3_CMD_RESET;
10676 		mpt3sas_base_free_smid(ioc, ioc->tm_cmds.smid);
10677 		complete(&ioc->tm_cmds.done);
10678 	}
10679 
10680 	memset(ioc->pend_os_device_add, 0, ioc->pend_os_device_add_sz);
10681 	memset(ioc->device_remove_in_progress, 0,
10682 	       ioc->device_remove_in_progress_sz);
10683 	_scsih_fw_event_cleanup_queue(ioc);
10684 	_scsih_flush_running_cmds(ioc);
10685 }
10686 
10687 /**
10688  * mpt3sas_scsih_reset_done_handler - reset callback handler (for scsih)
10689  * @ioc: per adapter object
10690  *
10691  * The handler for doing any required cleanup or initialization.
10692  */
10693 void
10694 mpt3sas_scsih_reset_done_handler(struct MPT3SAS_ADAPTER *ioc)
10695 {
10696 	dtmprintk(ioc, ioc_info(ioc, "%s: MPT3_IOC_DONE_RESET\n", __func__));
10697 	if (!(disable_discovery > 0 && !ioc->sas_hba.num_phys)) {
10698 		if (ioc->multipath_on_hba) {
10699 			_scsih_sas_port_refresh(ioc);
10700 			_scsih_update_vphys_after_reset(ioc);
10701 		}
10702 		_scsih_prep_device_scan(ioc);
10703 		_scsih_create_enclosure_list_after_reset(ioc);
10704 		_scsih_search_responding_sas_devices(ioc);
10705 		_scsih_search_responding_pcie_devices(ioc);
10706 		_scsih_search_responding_raid_devices(ioc);
10707 		_scsih_search_responding_expanders(ioc);
10708 		_scsih_error_recovery_delete_devices(ioc);
10709 	}
10710 }
10711 
10712 /**
10713  * _mpt3sas_fw_work - delayed task for processing firmware events
10714  * @ioc: per adapter object
10715  * @fw_event: The fw_event_work object
10716  * Context: user.
10717  */
10718 static void
10719 _mpt3sas_fw_work(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
10720 {
10721 	ioc->current_event = fw_event;
10722 	_scsih_fw_event_del_from_list(ioc, fw_event);
10723 
10724 	/* the queue is being flushed so ignore this event */
10725 	if (ioc->remove_host || ioc->pci_error_recovery) {
10726 		fw_event_work_put(fw_event);
10727 		ioc->current_event = NULL;
10728 		return;
10729 	}
10730 
10731 	switch (fw_event->event) {
10732 	case MPT3SAS_PROCESS_TRIGGER_DIAG:
10733 		mpt3sas_process_trigger_data(ioc,
10734 			(struct SL_WH_TRIGGERS_EVENT_DATA_T *)
10735 			fw_event->event_data);
10736 		break;
10737 	case MPT3SAS_REMOVE_UNRESPONDING_DEVICES:
10738 		while (scsi_host_in_recovery(ioc->shost) ||
10739 					 ioc->shost_recovery) {
10740 			/*
10741 			 * If we're unloading or cancelling the work, bail.
10742 			 * Otherwise, this can become an infinite loop.
10743 			 */
10744 			if (ioc->remove_host || ioc->fw_events_cleanup)
10745 				goto out;
10746 			ssleep(1);
10747 		}
10748 		_scsih_remove_unresponding_devices(ioc);
10749 		_scsih_del_dirty_vphy(ioc);
10750 		_scsih_del_dirty_port_entries(ioc);
10751 		if (ioc->is_gen35_ioc)
10752 			_scsih_update_device_qdepth(ioc);
10753 		_scsih_scan_for_devices_after_reset(ioc);
10754 		/*
10755 		 * If diag reset has occurred during the driver load
10756 		 * then driver has to complete the driver load operation
10757 		 * by executing the following items:
10758 		 *- Register the devices from sas_device_init_list to SML
10759 		 *- clear is_driver_loading flag,
10760 		 *- start the watchdog thread.
10761 		 * In happy driver load path, above things are taken care of when
10762 		 * driver executes scsih_scan_finished().
10763 		 */
10764 		if (ioc->is_driver_loading)
10765 			_scsih_complete_devices_scanning(ioc);
10766 		_scsih_set_nvme_max_shutdown_latency(ioc);
10767 		break;
10768 	case MPT3SAS_PORT_ENABLE_COMPLETE:
10769 		ioc->start_scan = 0;
10770 		if (missing_delay[0] != -1 && missing_delay[1] != -1)
10771 			mpt3sas_base_update_missing_delay(ioc, missing_delay[0],
10772 			    missing_delay[1]);
10773 		dewtprintk(ioc,
10774 			   ioc_info(ioc, "port enable: complete from worker thread\n"));
10775 		break;
10776 	case MPT3SAS_TURN_ON_PFA_LED:
10777 		_scsih_turn_on_pfa_led(ioc, fw_event->device_handle);
10778 		break;
10779 	case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
10780 		_scsih_sas_topology_change_event(ioc, fw_event);
10781 		break;
10782 	case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
10783 		if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
10784 			_scsih_sas_device_status_change_event_debug(ioc,
10785 			    (Mpi2EventDataSasDeviceStatusChange_t *)
10786 			    fw_event->event_data);
10787 		break;
10788 	case MPI2_EVENT_SAS_DISCOVERY:
10789 		_scsih_sas_discovery_event(ioc, fw_event);
10790 		break;
10791 	case MPI2_EVENT_SAS_DEVICE_DISCOVERY_ERROR:
10792 		_scsih_sas_device_discovery_error_event(ioc, fw_event);
10793 		break;
10794 	case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
10795 		_scsih_sas_broadcast_primitive_event(ioc, fw_event);
10796 		break;
10797 	case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
10798 		_scsih_sas_enclosure_dev_status_change_event(ioc,
10799 		    fw_event);
10800 		break;
10801 	case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
10802 		_scsih_sas_ir_config_change_event(ioc, fw_event);
10803 		break;
10804 	case MPI2_EVENT_IR_VOLUME:
10805 		_scsih_sas_ir_volume_event(ioc, fw_event);
10806 		break;
10807 	case MPI2_EVENT_IR_PHYSICAL_DISK:
10808 		_scsih_sas_ir_physical_disk_event(ioc, fw_event);
10809 		break;
10810 	case MPI2_EVENT_IR_OPERATION_STATUS:
10811 		_scsih_sas_ir_operation_status_event(ioc, fw_event);
10812 		break;
10813 	case MPI2_EVENT_PCIE_DEVICE_STATUS_CHANGE:
10814 		_scsih_pcie_device_status_change_event(ioc, fw_event);
10815 		break;
10816 	case MPI2_EVENT_PCIE_ENUMERATION:
10817 		_scsih_pcie_enumeration_event(ioc, fw_event);
10818 		break;
10819 	case MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
10820 		_scsih_pcie_topology_change_event(ioc, fw_event);
10821 		ioc->current_event = NULL;
10822 		return;
10823 	}
10824 out:
10825 	fw_event_work_put(fw_event);
10826 	ioc->current_event = NULL;
10827 }
10828 
10829 /**
10830  * _firmware_event_work
10831  * @work: The fw_event_work object
10832  * Context: user.
10833  *
10834  * wrappers for the work thread handling firmware events
10835  */
10836 
10837 static void
10838 _firmware_event_work(struct work_struct *work)
10839 {
10840 	struct fw_event_work *fw_event = container_of(work,
10841 	    struct fw_event_work, work);
10842 
10843 	_mpt3sas_fw_work(fw_event->ioc, fw_event);
10844 }
10845 
10846 /**
10847  * mpt3sas_scsih_event_callback - firmware event handler (called at ISR time)
10848  * @ioc: per adapter object
10849  * @msix_index: MSIX table index supplied by the OS
10850  * @reply: reply message frame(lower 32bit addr)
10851  * Context: interrupt.
10852  *
10853  * This function merely adds a new work task into ioc->firmware_event_thread.
10854  * The tasks are worked from _firmware_event_work in user context.
10855  *
10856  * Return: 1 meaning mf should be freed from _base_interrupt
10857  *         0 means the mf is freed from this function.
10858  */
10859 u8
10860 mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
10861 	u32 reply)
10862 {
10863 	struct fw_event_work *fw_event;
10864 	Mpi2EventNotificationReply_t *mpi_reply;
10865 	u16 event;
10866 	u16 sz;
10867 	Mpi26EventDataActiveCableExcept_t *ActiveCableEventData;
10868 
10869 	/* events turned off due to host reset */
10870 	if (ioc->pci_error_recovery)
10871 		return 1;
10872 
10873 	mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
10874 
10875 	if (unlikely(!mpi_reply)) {
10876 		ioc_err(ioc, "mpi_reply not valid at %s:%d/%s()!\n",
10877 			__FILE__, __LINE__, __func__);
10878 		return 1;
10879 	}
10880 
10881 	event = le16_to_cpu(mpi_reply->Event);
10882 
10883 	if (event != MPI2_EVENT_LOG_ENTRY_ADDED)
10884 		mpt3sas_trigger_event(ioc, event, 0);
10885 
10886 	switch (event) {
10887 	/* handle these */
10888 	case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
10889 	{
10890 		Mpi2EventDataSasBroadcastPrimitive_t *baen_data =
10891 		    (Mpi2EventDataSasBroadcastPrimitive_t *)
10892 		    mpi_reply->EventData;
10893 
10894 		if (baen_data->Primitive !=
10895 		    MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT)
10896 			return 1;
10897 
10898 		if (ioc->broadcast_aen_busy) {
10899 			ioc->broadcast_aen_pending++;
10900 			return 1;
10901 		} else
10902 			ioc->broadcast_aen_busy = 1;
10903 		break;
10904 	}
10905 
10906 	case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
10907 		_scsih_check_topo_delete_events(ioc,
10908 		    (Mpi2EventDataSasTopologyChangeList_t *)
10909 		    mpi_reply->EventData);
10910 		/*
10911 		 * No need to add the topology change list
10912 		 * event to fw event work queue when
10913 		 * diag reset is going on. Since during diag
10914 		 * reset driver scan the devices by reading
10915 		 * sas device page0's not by processing the
10916 		 * events.
10917 		 */
10918 		if (ioc->shost_recovery)
10919 			return 1;
10920 		break;
10921 	case MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
10922 	_scsih_check_pcie_topo_remove_events(ioc,
10923 		    (Mpi26EventDataPCIeTopologyChangeList_t *)
10924 		    mpi_reply->EventData);
10925 		if (ioc->shost_recovery)
10926 			return 1;
10927 		break;
10928 	case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
10929 		_scsih_check_ir_config_unhide_events(ioc,
10930 		    (Mpi2EventDataIrConfigChangeList_t *)
10931 		    mpi_reply->EventData);
10932 		break;
10933 	case MPI2_EVENT_IR_VOLUME:
10934 		_scsih_check_volume_delete_events(ioc,
10935 		    (Mpi2EventDataIrVolume_t *)
10936 		    mpi_reply->EventData);
10937 		break;
10938 	case MPI2_EVENT_LOG_ENTRY_ADDED:
10939 	{
10940 		Mpi2EventDataLogEntryAdded_t *log_entry;
10941 		u32 log_code;
10942 
10943 		if (!ioc->is_warpdrive)
10944 			break;
10945 
10946 		log_entry = (Mpi2EventDataLogEntryAdded_t *)
10947 		    mpi_reply->EventData;
10948 		log_code = le32_to_cpu(*(__le32 *)log_entry->LogData);
10949 
10950 		if (le16_to_cpu(log_entry->LogEntryQualifier)
10951 		    != MPT2_WARPDRIVE_LOGENTRY)
10952 			break;
10953 
10954 		switch (log_code) {
10955 		case MPT2_WARPDRIVE_LC_SSDT:
10956 			ioc_warn(ioc, "WarpDrive Warning: IO Throttling has occurred in the WarpDrive subsystem. Check WarpDrive documentation for additional details.\n");
10957 			break;
10958 		case MPT2_WARPDRIVE_LC_SSDLW:
10959 			ioc_warn(ioc, "WarpDrive Warning: Program/Erase Cycles for the WarpDrive subsystem in degraded range. Check WarpDrive documentation for additional details.\n");
10960 			break;
10961 		case MPT2_WARPDRIVE_LC_SSDLF:
10962 			ioc_err(ioc, "WarpDrive Fatal Error: There are no Program/Erase Cycles for the WarpDrive subsystem. The storage device will be in read-only mode. Check WarpDrive documentation for additional details.\n");
10963 			break;
10964 		case MPT2_WARPDRIVE_LC_BRMF:
10965 			ioc_err(ioc, "WarpDrive Fatal Error: The Backup Rail Monitor has failed on the WarpDrive subsystem. Check WarpDrive documentation for additional details.\n");
10966 			break;
10967 		}
10968 
10969 		break;
10970 	}
10971 	case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
10972 		_scsih_sas_device_status_change_event(ioc,
10973 		    (Mpi2EventDataSasDeviceStatusChange_t *)
10974 		    mpi_reply->EventData);
10975 		break;
10976 	case MPI2_EVENT_IR_OPERATION_STATUS:
10977 	case MPI2_EVENT_SAS_DISCOVERY:
10978 	case MPI2_EVENT_SAS_DEVICE_DISCOVERY_ERROR:
10979 	case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
10980 	case MPI2_EVENT_IR_PHYSICAL_DISK:
10981 	case MPI2_EVENT_PCIE_ENUMERATION:
10982 	case MPI2_EVENT_PCIE_DEVICE_STATUS_CHANGE:
10983 		break;
10984 
10985 	case MPI2_EVENT_TEMP_THRESHOLD:
10986 		_scsih_temp_threshold_events(ioc,
10987 			(Mpi2EventDataTemperature_t *)
10988 			mpi_reply->EventData);
10989 		break;
10990 	case MPI2_EVENT_ACTIVE_CABLE_EXCEPTION:
10991 		ActiveCableEventData =
10992 		    (Mpi26EventDataActiveCableExcept_t *) mpi_reply->EventData;
10993 		switch (ActiveCableEventData->ReasonCode) {
10994 		case MPI26_EVENT_ACTIVE_CABLE_INSUFFICIENT_POWER:
10995 			ioc_notice(ioc, "Currently an active cable with ReceptacleID %d\n",
10996 				   ActiveCableEventData->ReceptacleID);
10997 			pr_notice("cannot be powered and devices connected\n");
10998 			pr_notice("to this active cable will not be seen\n");
10999 			pr_notice("This active cable requires %d mW of power\n",
11000 			    le32_to_cpu(
11001 			    ActiveCableEventData->ActiveCablePowerRequirement));
11002 			break;
11003 
11004 		case MPI26_EVENT_ACTIVE_CABLE_DEGRADED:
11005 			ioc_notice(ioc, "Currently a cable with ReceptacleID %d\n",
11006 				   ActiveCableEventData->ReceptacleID);
11007 			pr_notice(
11008 			    "is not running at optimal speed(12 Gb/s rate)\n");
11009 			break;
11010 		}
11011 
11012 		break;
11013 
11014 	default: /* ignore the rest */
11015 		return 1;
11016 	}
11017 
11018 	sz = le16_to_cpu(mpi_reply->EventDataLength) * 4;
11019 	fw_event = alloc_fw_event_work(sz);
11020 	if (!fw_event) {
11021 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
11022 			__FILE__, __LINE__, __func__);
11023 		return 1;
11024 	}
11025 
11026 	memcpy(fw_event->event_data, mpi_reply->EventData, sz);
11027 	fw_event->ioc = ioc;
11028 	fw_event->VF_ID = mpi_reply->VF_ID;
11029 	fw_event->VP_ID = mpi_reply->VP_ID;
11030 	fw_event->event = event;
11031 	_scsih_fw_event_add(ioc, fw_event);
11032 	fw_event_work_put(fw_event);
11033 	return 1;
11034 }
11035 
11036 /**
11037  * _scsih_expander_node_remove - removing expander device from list.
11038  * @ioc: per adapter object
11039  * @sas_expander: the sas_device object
11040  *
11041  * Removing object and freeing associated memory from the
11042  * ioc->sas_expander_list.
11043  */
11044 static void
11045 _scsih_expander_node_remove(struct MPT3SAS_ADAPTER *ioc,
11046 	struct _sas_node *sas_expander)
11047 {
11048 	struct _sas_port *mpt3sas_port, *next;
11049 	unsigned long flags;
11050 	int port_id;
11051 
11052 	/* remove sibling ports attached to this expander */
11053 	list_for_each_entry_safe(mpt3sas_port, next,
11054 	   &sas_expander->sas_port_list, port_list) {
11055 		if (ioc->shost_recovery)
11056 			return;
11057 		if (mpt3sas_port->remote_identify.device_type ==
11058 		    SAS_END_DEVICE)
11059 			mpt3sas_device_remove_by_sas_address(ioc,
11060 			    mpt3sas_port->remote_identify.sas_address,
11061 			    mpt3sas_port->hba_port);
11062 		else if (mpt3sas_port->remote_identify.device_type ==
11063 		    SAS_EDGE_EXPANDER_DEVICE ||
11064 		    mpt3sas_port->remote_identify.device_type ==
11065 		    SAS_FANOUT_EXPANDER_DEVICE)
11066 			mpt3sas_expander_remove(ioc,
11067 			    mpt3sas_port->remote_identify.sas_address,
11068 			    mpt3sas_port->hba_port);
11069 	}
11070 
11071 	port_id = sas_expander->port->port_id;
11072 
11073 	mpt3sas_transport_port_remove(ioc, sas_expander->sas_address,
11074 	    sas_expander->sas_address_parent, sas_expander->port);
11075 
11076 	ioc_info(ioc,
11077 	    "expander_remove: handle(0x%04x), sas_addr(0x%016llx), port:%d\n",
11078 	    sas_expander->handle, (unsigned long long)
11079 	    sas_expander->sas_address,
11080 	    port_id);
11081 
11082 	spin_lock_irqsave(&ioc->sas_node_lock, flags);
11083 	list_del(&sas_expander->list);
11084 	spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
11085 
11086 	kfree(sas_expander->phy);
11087 	kfree(sas_expander);
11088 }
11089 
11090 /**
11091  * _scsih_nvme_shutdown - NVMe shutdown notification
11092  * @ioc: per adapter object
11093  *
11094  * Sending IoUnitControl request with shutdown operation code to alert IOC that
11095  * the host system is shutting down so that IOC can issue NVMe shutdown to
11096  * NVMe drives attached to it.
11097  */
11098 static void
11099 _scsih_nvme_shutdown(struct MPT3SAS_ADAPTER *ioc)
11100 {
11101 	Mpi26IoUnitControlRequest_t *mpi_request;
11102 	Mpi26IoUnitControlReply_t *mpi_reply;
11103 	u16 smid;
11104 
11105 	/* are there any NVMe devices ? */
11106 	if (list_empty(&ioc->pcie_device_list))
11107 		return;
11108 
11109 	mutex_lock(&ioc->scsih_cmds.mutex);
11110 
11111 	if (ioc->scsih_cmds.status != MPT3_CMD_NOT_USED) {
11112 		ioc_err(ioc, "%s: scsih_cmd in use\n", __func__);
11113 		goto out;
11114 	}
11115 
11116 	ioc->scsih_cmds.status = MPT3_CMD_PENDING;
11117 
11118 	smid = mpt3sas_base_get_smid(ioc, ioc->scsih_cb_idx);
11119 	if (!smid) {
11120 		ioc_err(ioc,
11121 		    "%s: failed obtaining a smid\n", __func__);
11122 		ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
11123 		goto out;
11124 	}
11125 
11126 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
11127 	ioc->scsih_cmds.smid = smid;
11128 	memset(mpi_request, 0, sizeof(Mpi26IoUnitControlRequest_t));
11129 	mpi_request->Function = MPI2_FUNCTION_IO_UNIT_CONTROL;
11130 	mpi_request->Operation = MPI26_CTRL_OP_SHUTDOWN;
11131 
11132 	init_completion(&ioc->scsih_cmds.done);
11133 	ioc->put_smid_default(ioc, smid);
11134 	/* Wait for max_shutdown_latency seconds */
11135 	ioc_info(ioc,
11136 		"Io Unit Control shutdown (sending), Shutdown latency %d sec\n",
11137 		ioc->max_shutdown_latency);
11138 	wait_for_completion_timeout(&ioc->scsih_cmds.done,
11139 			ioc->max_shutdown_latency*HZ);
11140 
11141 	if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
11142 		ioc_err(ioc, "%s: timeout\n", __func__);
11143 		goto out;
11144 	}
11145 
11146 	if (ioc->scsih_cmds.status & MPT3_CMD_REPLY_VALID) {
11147 		mpi_reply = ioc->scsih_cmds.reply;
11148 		ioc_info(ioc, "Io Unit Control shutdown (complete):"
11149 			"ioc_status(0x%04x), loginfo(0x%08x)\n",
11150 			le16_to_cpu(mpi_reply->IOCStatus),
11151 			le32_to_cpu(mpi_reply->IOCLogInfo));
11152 	}
11153  out:
11154 	ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
11155 	mutex_unlock(&ioc->scsih_cmds.mutex);
11156 }
11157 
11158 
11159 /**
11160  * _scsih_ir_shutdown - IR shutdown notification
11161  * @ioc: per adapter object
11162  *
11163  * Sending RAID Action to alert the Integrated RAID subsystem of the IOC that
11164  * the host system is shutting down.
11165  */
11166 static void
11167 _scsih_ir_shutdown(struct MPT3SAS_ADAPTER *ioc)
11168 {
11169 	Mpi2RaidActionRequest_t *mpi_request;
11170 	Mpi2RaidActionReply_t *mpi_reply;
11171 	u16 smid;
11172 
11173 	/* is IR firmware build loaded ? */
11174 	if (!ioc->ir_firmware)
11175 		return;
11176 
11177 	/* are there any volumes ? */
11178 	if (list_empty(&ioc->raid_device_list))
11179 		return;
11180 
11181 	mutex_lock(&ioc->scsih_cmds.mutex);
11182 
11183 	if (ioc->scsih_cmds.status != MPT3_CMD_NOT_USED) {
11184 		ioc_err(ioc, "%s: scsih_cmd in use\n", __func__);
11185 		goto out;
11186 	}
11187 	ioc->scsih_cmds.status = MPT3_CMD_PENDING;
11188 
11189 	smid = mpt3sas_base_get_smid(ioc, ioc->scsih_cb_idx);
11190 	if (!smid) {
11191 		ioc_err(ioc, "%s: failed obtaining a smid\n", __func__);
11192 		ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
11193 		goto out;
11194 	}
11195 
11196 	mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
11197 	ioc->scsih_cmds.smid = smid;
11198 	memset(mpi_request, 0, sizeof(Mpi2RaidActionRequest_t));
11199 
11200 	mpi_request->Function = MPI2_FUNCTION_RAID_ACTION;
11201 	mpi_request->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
11202 
11203 	if (!ioc->hide_ir_msg)
11204 		ioc_info(ioc, "IR shutdown (sending)\n");
11205 	init_completion(&ioc->scsih_cmds.done);
11206 	ioc->put_smid_default(ioc, smid);
11207 	wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
11208 
11209 	if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
11210 		ioc_err(ioc, "%s: timeout\n", __func__);
11211 		goto out;
11212 	}
11213 
11214 	if (ioc->scsih_cmds.status & MPT3_CMD_REPLY_VALID) {
11215 		mpi_reply = ioc->scsih_cmds.reply;
11216 		if (!ioc->hide_ir_msg)
11217 			ioc_info(ioc, "IR shutdown (complete): ioc_status(0x%04x), loginfo(0x%08x)\n",
11218 				 le16_to_cpu(mpi_reply->IOCStatus),
11219 				 le32_to_cpu(mpi_reply->IOCLogInfo));
11220 	}
11221 
11222  out:
11223 	ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
11224 	mutex_unlock(&ioc->scsih_cmds.mutex);
11225 }
11226 
11227 /**
11228  * _scsih_get_shost_and_ioc - get shost and ioc
11229  *			and verify whether they are NULL or not
11230  * @pdev: PCI device struct
11231  * @shost: address of scsi host pointer
11232  * @ioc: address of HBA adapter pointer
11233  *
11234  * Return zero if *shost and *ioc are not NULL otherwise return error number.
11235  */
11236 static int
11237 _scsih_get_shost_and_ioc(struct pci_dev *pdev,
11238 	struct Scsi_Host **shost, struct MPT3SAS_ADAPTER **ioc)
11239 {
11240 	*shost = pci_get_drvdata(pdev);
11241 	if (*shost == NULL) {
11242 		dev_err(&pdev->dev, "pdev's driver data is null\n");
11243 		return -ENXIO;
11244 	}
11245 
11246 	*ioc = shost_priv(*shost);
11247 	if (*ioc == NULL) {
11248 		dev_err(&pdev->dev, "shost's private data is null\n");
11249 		return -ENXIO;
11250 	}
11251 
11252 	return 0;
11253 }
11254 
11255 /**
11256  * scsih_remove - detach and remove add host
11257  * @pdev: PCI device struct
11258  *
11259  * Routine called when unloading the driver.
11260  */
11261 static void scsih_remove(struct pci_dev *pdev)
11262 {
11263 	struct Scsi_Host *shost;
11264 	struct MPT3SAS_ADAPTER *ioc;
11265 	struct _sas_port *mpt3sas_port, *next_port;
11266 	struct _raid_device *raid_device, *next;
11267 	struct MPT3SAS_TARGET *sas_target_priv_data;
11268 	struct _pcie_device *pcie_device, *pcienext;
11269 	struct workqueue_struct	*wq;
11270 	unsigned long flags;
11271 	Mpi2ConfigReply_t mpi_reply;
11272 	struct hba_port *port, *port_next;
11273 
11274 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
11275 		return;
11276 
11277 	ioc->remove_host = 1;
11278 
11279 	if (!pci_device_is_present(pdev)) {
11280 		mpt3sas_base_pause_mq_polling(ioc);
11281 		_scsih_flush_running_cmds(ioc);
11282 	}
11283 
11284 	_scsih_fw_event_cleanup_queue(ioc);
11285 
11286 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
11287 	wq = ioc->firmware_event_thread;
11288 	ioc->firmware_event_thread = NULL;
11289 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
11290 	if (wq)
11291 		destroy_workqueue(wq);
11292 	/*
11293 	 * Copy back the unmodified ioc page1. so that on next driver load,
11294 	 * current modified changes on ioc page1 won't take effect.
11295 	 */
11296 	if (ioc->is_aero_ioc)
11297 		mpt3sas_config_set_ioc_pg1(ioc, &mpi_reply,
11298 				&ioc->ioc_pg1_copy);
11299 	/* release all the volumes */
11300 	_scsih_ir_shutdown(ioc);
11301 	mpt3sas_destroy_debugfs(ioc);
11302 	sas_remove_host(shost);
11303 	list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list,
11304 	    list) {
11305 		if (raid_device->starget) {
11306 			sas_target_priv_data =
11307 			    raid_device->starget->hostdata;
11308 			sas_target_priv_data->deleted = 1;
11309 			scsi_remove_target(&raid_device->starget->dev);
11310 		}
11311 		ioc_info(ioc, "removing handle(0x%04x), wwid(0x%016llx)\n",
11312 			 raid_device->handle, (u64)raid_device->wwid);
11313 		_scsih_raid_device_remove(ioc, raid_device);
11314 	}
11315 	list_for_each_entry_safe(pcie_device, pcienext, &ioc->pcie_device_list,
11316 		list) {
11317 		_scsih_pcie_device_remove_from_sml(ioc, pcie_device);
11318 		list_del_init(&pcie_device->list);
11319 		pcie_device_put(pcie_device);
11320 	}
11321 
11322 	/* free ports attached to the sas_host */
11323 	list_for_each_entry_safe(mpt3sas_port, next_port,
11324 	   &ioc->sas_hba.sas_port_list, port_list) {
11325 		if (mpt3sas_port->remote_identify.device_type ==
11326 		    SAS_END_DEVICE)
11327 			mpt3sas_device_remove_by_sas_address(ioc,
11328 			    mpt3sas_port->remote_identify.sas_address,
11329 			    mpt3sas_port->hba_port);
11330 		else if (mpt3sas_port->remote_identify.device_type ==
11331 		    SAS_EDGE_EXPANDER_DEVICE ||
11332 		    mpt3sas_port->remote_identify.device_type ==
11333 		    SAS_FANOUT_EXPANDER_DEVICE)
11334 			mpt3sas_expander_remove(ioc,
11335 			    mpt3sas_port->remote_identify.sas_address,
11336 			    mpt3sas_port->hba_port);
11337 	}
11338 
11339 	list_for_each_entry_safe(port, port_next,
11340 	    &ioc->port_table_list, list) {
11341 		list_del(&port->list);
11342 		kfree(port);
11343 	}
11344 
11345 	/* free phys attached to the sas_host */
11346 	if (ioc->sas_hba.num_phys) {
11347 		kfree(ioc->sas_hba.phy);
11348 		ioc->sas_hba.phy = NULL;
11349 		ioc->sas_hba.num_phys = 0;
11350 	}
11351 
11352 	mpt3sas_base_detach(ioc);
11353 	spin_lock(&gioc_lock);
11354 	list_del(&ioc->list);
11355 	spin_unlock(&gioc_lock);
11356 	scsi_host_put(shost);
11357 }
11358 
11359 /**
11360  * scsih_shutdown - routine call during system shutdown
11361  * @pdev: PCI device struct
11362  */
11363 static void
11364 scsih_shutdown(struct pci_dev *pdev)
11365 {
11366 	struct Scsi_Host *shost;
11367 	struct MPT3SAS_ADAPTER *ioc;
11368 	struct workqueue_struct	*wq;
11369 	unsigned long flags;
11370 	Mpi2ConfigReply_t mpi_reply;
11371 
11372 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
11373 		return;
11374 
11375 	ioc->remove_host = 1;
11376 
11377 	if (!pci_device_is_present(pdev)) {
11378 		mpt3sas_base_pause_mq_polling(ioc);
11379 		_scsih_flush_running_cmds(ioc);
11380 	}
11381 
11382 	_scsih_fw_event_cleanup_queue(ioc);
11383 
11384 	spin_lock_irqsave(&ioc->fw_event_lock, flags);
11385 	wq = ioc->firmware_event_thread;
11386 	ioc->firmware_event_thread = NULL;
11387 	spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
11388 	if (wq)
11389 		destroy_workqueue(wq);
11390 	/*
11391 	 * Copy back the unmodified ioc page1 so that on next driver load,
11392 	 * current modified changes on ioc page1 won't take effect.
11393 	 */
11394 	if (ioc->is_aero_ioc)
11395 		mpt3sas_config_set_ioc_pg1(ioc, &mpi_reply,
11396 				&ioc->ioc_pg1_copy);
11397 
11398 	_scsih_ir_shutdown(ioc);
11399 	_scsih_nvme_shutdown(ioc);
11400 	mpt3sas_base_mask_interrupts(ioc);
11401 	mpt3sas_base_stop_watchdog(ioc);
11402 	ioc->shost_recovery = 1;
11403 	mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
11404 	ioc->shost_recovery = 0;
11405 	mpt3sas_base_free_irq(ioc);
11406 	mpt3sas_base_disable_msix(ioc);
11407 }
11408 
11409 
11410 /**
11411  * _scsih_probe_boot_devices - reports 1st device
11412  * @ioc: per adapter object
11413  *
11414  * If specified in bios page 2, this routine reports the 1st
11415  * device scsi-ml or sas transport for persistent boot device
11416  * purposes.  Please refer to function _scsih_determine_boot_device()
11417  */
11418 static void
11419 _scsih_probe_boot_devices(struct MPT3SAS_ADAPTER *ioc)
11420 {
11421 	u32 channel;
11422 	void *device;
11423 	struct _sas_device *sas_device;
11424 	struct _raid_device *raid_device;
11425 	struct _pcie_device *pcie_device;
11426 	u16 handle;
11427 	u64 sas_address_parent;
11428 	u64 sas_address;
11429 	unsigned long flags;
11430 	int rc;
11431 	int tid;
11432 	struct hba_port *port;
11433 
11434 	 /* no Bios, return immediately */
11435 	if (!ioc->bios_pg3.BiosVersion)
11436 		return;
11437 
11438 	device = NULL;
11439 	if (ioc->req_boot_device.device) {
11440 		device =  ioc->req_boot_device.device;
11441 		channel = ioc->req_boot_device.channel;
11442 	} else if (ioc->req_alt_boot_device.device) {
11443 		device =  ioc->req_alt_boot_device.device;
11444 		channel = ioc->req_alt_boot_device.channel;
11445 	} else if (ioc->current_boot_device.device) {
11446 		device =  ioc->current_boot_device.device;
11447 		channel = ioc->current_boot_device.channel;
11448 	}
11449 
11450 	if (!device)
11451 		return;
11452 
11453 	if (channel == RAID_CHANNEL) {
11454 		raid_device = device;
11455 		/*
11456 		 * If this boot vd is already registered with SML then
11457 		 * no need to register it again as part of device scanning
11458 		 * after diag reset during driver load operation.
11459 		 */
11460 		if (raid_device->starget)
11461 			return;
11462 		rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
11463 		    raid_device->id, 0);
11464 		if (rc)
11465 			_scsih_raid_device_remove(ioc, raid_device);
11466 	} else if (channel == PCIE_CHANNEL) {
11467 		pcie_device = device;
11468 		/*
11469 		 * If this boot NVMe device is already registered with SML then
11470 		 * no need to register it again as part of device scanning
11471 		 * after diag reset during driver load operation.
11472 		 */
11473 		if (pcie_device->starget)
11474 			return;
11475 		spin_lock_irqsave(&ioc->pcie_device_lock, flags);
11476 		tid = pcie_device->id;
11477 		list_move_tail(&pcie_device->list, &ioc->pcie_device_list);
11478 		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
11479 		rc = scsi_add_device(ioc->shost, PCIE_CHANNEL, tid, 0);
11480 		if (rc)
11481 			_scsih_pcie_device_remove(ioc, pcie_device);
11482 	} else {
11483 		sas_device = device;
11484 		/*
11485 		 * If this boot sas/sata device is already registered with SML
11486 		 * then no need to register it again as part of device scanning
11487 		 * after diag reset during driver load operation.
11488 		 */
11489 		if (sas_device->starget)
11490 			return;
11491 		spin_lock_irqsave(&ioc->sas_device_lock, flags);
11492 		handle = sas_device->handle;
11493 		sas_address_parent = sas_device->sas_address_parent;
11494 		sas_address = sas_device->sas_address;
11495 		port = sas_device->port;
11496 		list_move_tail(&sas_device->list, &ioc->sas_device_list);
11497 		spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
11498 
11499 		if (ioc->hide_drives)
11500 			return;
11501 
11502 		if (!port)
11503 			return;
11504 
11505 		if (!mpt3sas_transport_port_add(ioc, handle,
11506 		    sas_address_parent, port)) {
11507 			_scsih_sas_device_remove(ioc, sas_device);
11508 		} else if (!sas_device->starget) {
11509 			if (!ioc->is_driver_loading) {
11510 				mpt3sas_transport_port_remove(ioc,
11511 				    sas_address,
11512 				    sas_address_parent, port);
11513 				_scsih_sas_device_remove(ioc, sas_device);
11514 			}
11515 		}
11516 	}
11517 }
11518 
11519 /**
11520  * _scsih_probe_raid - reporting raid volumes to scsi-ml
11521  * @ioc: per adapter object
11522  *
11523  * Called during initial loading of the driver.
11524  */
11525 static void
11526 _scsih_probe_raid(struct MPT3SAS_ADAPTER *ioc)
11527 {
11528 	struct _raid_device *raid_device, *raid_next;
11529 	int rc;
11530 
11531 	list_for_each_entry_safe(raid_device, raid_next,
11532 	    &ioc->raid_device_list, list) {
11533 		if (raid_device->starget)
11534 			continue;
11535 		rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
11536 		    raid_device->id, 0);
11537 		if (rc)
11538 			_scsih_raid_device_remove(ioc, raid_device);
11539 	}
11540 }
11541 
11542 static struct _sas_device *get_next_sas_device(struct MPT3SAS_ADAPTER *ioc)
11543 {
11544 	struct _sas_device *sas_device = NULL;
11545 	unsigned long flags;
11546 
11547 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
11548 	if (!list_empty(&ioc->sas_device_init_list)) {
11549 		sas_device = list_first_entry(&ioc->sas_device_init_list,
11550 				struct _sas_device, list);
11551 		sas_device_get(sas_device);
11552 	}
11553 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
11554 
11555 	return sas_device;
11556 }
11557 
11558 static void sas_device_make_active(struct MPT3SAS_ADAPTER *ioc,
11559 		struct _sas_device *sas_device)
11560 {
11561 	unsigned long flags;
11562 
11563 	spin_lock_irqsave(&ioc->sas_device_lock, flags);
11564 
11565 	/*
11566 	 * Since we dropped the lock during the call to port_add(), we need to
11567 	 * be careful here that somebody else didn't move or delete this item
11568 	 * while we were busy with other things.
11569 	 *
11570 	 * If it was on the list, we need a put() for the reference the list
11571 	 * had. Either way, we need a get() for the destination list.
11572 	 */
11573 	if (!list_empty(&sas_device->list)) {
11574 		list_del_init(&sas_device->list);
11575 		sas_device_put(sas_device);
11576 	}
11577 
11578 	sas_device_get(sas_device);
11579 	list_add_tail(&sas_device->list, &ioc->sas_device_list);
11580 
11581 	spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
11582 }
11583 
11584 /**
11585  * _scsih_probe_sas - reporting sas devices to sas transport
11586  * @ioc: per adapter object
11587  *
11588  * Called during initial loading of the driver.
11589  */
11590 static void
11591 _scsih_probe_sas(struct MPT3SAS_ADAPTER *ioc)
11592 {
11593 	struct _sas_device *sas_device;
11594 
11595 	if (ioc->hide_drives)
11596 		return;
11597 
11598 	while ((sas_device = get_next_sas_device(ioc))) {
11599 		if (!mpt3sas_transport_port_add(ioc, sas_device->handle,
11600 		    sas_device->sas_address_parent, sas_device->port)) {
11601 			_scsih_sas_device_remove(ioc, sas_device);
11602 			sas_device_put(sas_device);
11603 			continue;
11604 		} else if (!sas_device->starget) {
11605 			/*
11606 			 * When asyn scanning is enabled, its not possible to
11607 			 * remove devices while scanning is turned on due to an
11608 			 * oops in scsi_sysfs_add_sdev()->add_device()->
11609 			 * sysfs_addrm_start()
11610 			 */
11611 			if (!ioc->is_driver_loading) {
11612 				mpt3sas_transport_port_remove(ioc,
11613 				    sas_device->sas_address,
11614 				    sas_device->sas_address_parent,
11615 				    sas_device->port);
11616 				_scsih_sas_device_remove(ioc, sas_device);
11617 				sas_device_put(sas_device);
11618 				continue;
11619 			}
11620 		}
11621 		sas_device_make_active(ioc, sas_device);
11622 		sas_device_put(sas_device);
11623 	}
11624 }
11625 
11626 /**
11627  * get_next_pcie_device - Get the next pcie device
11628  * @ioc: per adapter object
11629  *
11630  * Get the next pcie device from pcie_device_init_list list.
11631  *
11632  * Return: pcie device structure if pcie_device_init_list list is not empty
11633  * otherwise returns NULL
11634  */
11635 static struct _pcie_device *get_next_pcie_device(struct MPT3SAS_ADAPTER *ioc)
11636 {
11637 	struct _pcie_device *pcie_device = NULL;
11638 	unsigned long flags;
11639 
11640 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
11641 	if (!list_empty(&ioc->pcie_device_init_list)) {
11642 		pcie_device = list_first_entry(&ioc->pcie_device_init_list,
11643 				struct _pcie_device, list);
11644 		pcie_device_get(pcie_device);
11645 	}
11646 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
11647 
11648 	return pcie_device;
11649 }
11650 
11651 /**
11652  * pcie_device_make_active - Add pcie device to pcie_device_list list
11653  * @ioc: per adapter object
11654  * @pcie_device: pcie device object
11655  *
11656  * Add the pcie device which has registered with SCSI Transport Later to
11657  * pcie_device_list list
11658  */
11659 static void pcie_device_make_active(struct MPT3SAS_ADAPTER *ioc,
11660 		struct _pcie_device *pcie_device)
11661 {
11662 	unsigned long flags;
11663 
11664 	spin_lock_irqsave(&ioc->pcie_device_lock, flags);
11665 
11666 	if (!list_empty(&pcie_device->list)) {
11667 		list_del_init(&pcie_device->list);
11668 		pcie_device_put(pcie_device);
11669 	}
11670 	pcie_device_get(pcie_device);
11671 	list_add_tail(&pcie_device->list, &ioc->pcie_device_list);
11672 
11673 	spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
11674 }
11675 
11676 /**
11677  * _scsih_probe_pcie - reporting PCIe devices to scsi-ml
11678  * @ioc: per adapter object
11679  *
11680  * Called during initial loading of the driver.
11681  */
11682 static void
11683 _scsih_probe_pcie(struct MPT3SAS_ADAPTER *ioc)
11684 {
11685 	struct _pcie_device *pcie_device;
11686 	int rc;
11687 
11688 	/* PCIe Device List */
11689 	while ((pcie_device = get_next_pcie_device(ioc))) {
11690 		if (pcie_device->starget) {
11691 			pcie_device_put(pcie_device);
11692 			continue;
11693 		}
11694 		if (pcie_device->access_status ==
11695 		    MPI26_PCIEDEV0_ASTATUS_DEVICE_BLOCKED) {
11696 			pcie_device_make_active(ioc, pcie_device);
11697 			pcie_device_put(pcie_device);
11698 			continue;
11699 		}
11700 		rc = scsi_add_device(ioc->shost, PCIE_CHANNEL,
11701 			pcie_device->id, 0);
11702 		if (rc) {
11703 			_scsih_pcie_device_remove(ioc, pcie_device);
11704 			pcie_device_put(pcie_device);
11705 			continue;
11706 		} else if (!pcie_device->starget) {
11707 			/*
11708 			 * When async scanning is enabled, its not possible to
11709 			 * remove devices while scanning is turned on due to an
11710 			 * oops in scsi_sysfs_add_sdev()->add_device()->
11711 			 * sysfs_addrm_start()
11712 			 */
11713 			if (!ioc->is_driver_loading) {
11714 			/* TODO-- Need to find out whether this condition will
11715 			 * occur or not
11716 			 */
11717 				_scsih_pcie_device_remove(ioc, pcie_device);
11718 				pcie_device_put(pcie_device);
11719 				continue;
11720 			}
11721 		}
11722 		pcie_device_make_active(ioc, pcie_device);
11723 		pcie_device_put(pcie_device);
11724 	}
11725 }
11726 
11727 /**
11728  * _scsih_probe_devices - probing for devices
11729  * @ioc: per adapter object
11730  *
11731  * Called during initial loading of the driver.
11732  */
11733 static void
11734 _scsih_probe_devices(struct MPT3SAS_ADAPTER *ioc)
11735 {
11736 	u16 volume_mapping_flags;
11737 
11738 	if (!(ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR))
11739 		return;  /* return when IOC doesn't support initiator mode */
11740 
11741 	_scsih_probe_boot_devices(ioc);
11742 
11743 	if (ioc->ir_firmware) {
11744 		volume_mapping_flags =
11745 		    le16_to_cpu(ioc->ioc_pg8.IRVolumeMappingFlags) &
11746 		    MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE;
11747 		if (volume_mapping_flags ==
11748 		    MPI2_IOCPAGE8_IRFLAGS_LOW_VOLUME_MAPPING) {
11749 			_scsih_probe_raid(ioc);
11750 			_scsih_probe_sas(ioc);
11751 		} else {
11752 			_scsih_probe_sas(ioc);
11753 			_scsih_probe_raid(ioc);
11754 		}
11755 	} else {
11756 		_scsih_probe_sas(ioc);
11757 		_scsih_probe_pcie(ioc);
11758 	}
11759 }
11760 
11761 /**
11762  * scsih_scan_start - scsi lld callback for .scan_start
11763  * @shost: SCSI host pointer
11764  *
11765  * The shost has the ability to discover targets on its own instead
11766  * of scanning the entire bus.  In our implemention, we will kick off
11767  * firmware discovery.
11768  */
11769 static void
11770 scsih_scan_start(struct Scsi_Host *shost)
11771 {
11772 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
11773 	int rc;
11774 	if (diag_buffer_enable != -1 && diag_buffer_enable != 0)
11775 		mpt3sas_enable_diag_buffer(ioc, diag_buffer_enable);
11776 	else if (ioc->manu_pg11.HostTraceBufferMaxSizeKB != 0)
11777 		mpt3sas_enable_diag_buffer(ioc, 1);
11778 
11779 	if (disable_discovery > 0)
11780 		return;
11781 
11782 	ioc->start_scan = 1;
11783 	rc = mpt3sas_port_enable(ioc);
11784 
11785 	if (rc != 0)
11786 		ioc_info(ioc, "port enable: FAILED\n");
11787 }
11788 
11789 /**
11790  * _scsih_complete_devices_scanning - add the devices to sml and
11791  * complete ioc initialization.
11792  * @ioc: per adapter object
11793  *
11794  * Return nothing.
11795  */
11796 static void _scsih_complete_devices_scanning(struct MPT3SAS_ADAPTER *ioc)
11797 {
11798 
11799 	if (ioc->wait_for_discovery_to_complete) {
11800 		ioc->wait_for_discovery_to_complete = 0;
11801 		_scsih_probe_devices(ioc);
11802 	}
11803 
11804 	mpt3sas_base_start_watchdog(ioc);
11805 	ioc->is_driver_loading = 0;
11806 }
11807 
11808 /**
11809  * scsih_scan_finished - scsi lld callback for .scan_finished
11810  * @shost: SCSI host pointer
11811  * @time: elapsed time of the scan in jiffies
11812  *
11813  * This function will be called periodicallyn until it returns 1 with the
11814  * scsi_host and the elapsed time of the scan in jiffies. In our implemention,
11815  * we wait for firmware discovery to complete, then return 1.
11816  */
11817 static int
11818 scsih_scan_finished(struct Scsi_Host *shost, unsigned long time)
11819 {
11820 	struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
11821 	u32 ioc_state;
11822 	int issue_hard_reset = 0;
11823 
11824 	if (disable_discovery > 0) {
11825 		ioc->is_driver_loading = 0;
11826 		ioc->wait_for_discovery_to_complete = 0;
11827 		return 1;
11828 	}
11829 
11830 	if (time >= (300 * HZ)) {
11831 		ioc->port_enable_cmds.status = MPT3_CMD_NOT_USED;
11832 		ioc_info(ioc, "port enable: FAILED with timeout (timeout=300s)\n");
11833 		ioc->is_driver_loading = 0;
11834 		return 1;
11835 	}
11836 
11837 	if (ioc->start_scan) {
11838 		ioc_state = mpt3sas_base_get_iocstate(ioc, 0);
11839 		if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
11840 			mpt3sas_print_fault_code(ioc, ioc_state &
11841 			    MPI2_DOORBELL_DATA_MASK);
11842 			issue_hard_reset = 1;
11843 			goto out;
11844 		} else if ((ioc_state & MPI2_IOC_STATE_MASK) ==
11845 				MPI2_IOC_STATE_COREDUMP) {
11846 			mpt3sas_base_coredump_info(ioc, ioc_state &
11847 			    MPI2_DOORBELL_DATA_MASK);
11848 			mpt3sas_base_wait_for_coredump_completion(ioc, __func__);
11849 			issue_hard_reset = 1;
11850 			goto out;
11851 		}
11852 		return 0;
11853 	}
11854 
11855 	if (ioc->port_enable_cmds.status & MPT3_CMD_RESET) {
11856 		ioc_info(ioc,
11857 		    "port enable: aborted due to diag reset\n");
11858 		ioc->port_enable_cmds.status = MPT3_CMD_NOT_USED;
11859 		goto out;
11860 	}
11861 	if (ioc->start_scan_failed) {
11862 		ioc_info(ioc, "port enable: FAILED with (ioc_status=0x%08x)\n",
11863 			 ioc->start_scan_failed);
11864 		ioc->is_driver_loading = 0;
11865 		ioc->wait_for_discovery_to_complete = 0;
11866 		ioc->remove_host = 1;
11867 		return 1;
11868 	}
11869 
11870 	ioc_info(ioc, "port enable: SUCCESS\n");
11871 	ioc->port_enable_cmds.status = MPT3_CMD_NOT_USED;
11872 	_scsih_complete_devices_scanning(ioc);
11873 
11874 out:
11875 	if (issue_hard_reset) {
11876 		ioc->port_enable_cmds.status = MPT3_CMD_NOT_USED;
11877 		if (mpt3sas_base_hard_reset_handler(ioc, SOFT_RESET))
11878 			ioc->is_driver_loading = 0;
11879 	}
11880 	return 1;
11881 }
11882 
11883 /**
11884  * scsih_map_queues - map reply queues with request queues
11885  * @shost: SCSI host pointer
11886  */
11887 static void scsih_map_queues(struct Scsi_Host *shost)
11888 {
11889 	struct MPT3SAS_ADAPTER *ioc =
11890 	    (struct MPT3SAS_ADAPTER *)shost->hostdata;
11891 	struct blk_mq_queue_map *map;
11892 	int i, qoff, offset;
11893 	int nr_msix_vectors = ioc->iopoll_q_start_index;
11894 	int iopoll_q_count = ioc->reply_queue_count - nr_msix_vectors;
11895 
11896 	if (shost->nr_hw_queues == 1)
11897 		return;
11898 
11899 	for (i = 0, qoff = 0; i < shost->nr_maps; i++) {
11900 		map = &shost->tag_set.map[i];
11901 		map->nr_queues = 0;
11902 		offset = 0;
11903 		if (i == HCTX_TYPE_DEFAULT) {
11904 			map->nr_queues =
11905 			    nr_msix_vectors - ioc->high_iops_queues;
11906 			offset = ioc->high_iops_queues;
11907 		} else if (i == HCTX_TYPE_POLL)
11908 			map->nr_queues = iopoll_q_count;
11909 
11910 		if (!map->nr_queues)
11911 			BUG_ON(i == HCTX_TYPE_DEFAULT);
11912 
11913 		/*
11914 		 * The poll queue(s) doesn't have an IRQ (and hence IRQ
11915 		 * affinity), so use the regular blk-mq cpu mapping
11916 		 */
11917 		map->queue_offset = qoff;
11918 		if (i != HCTX_TYPE_POLL)
11919 			blk_mq_pci_map_queues(map, ioc->pdev, offset);
11920 		else
11921 			blk_mq_map_queues(map);
11922 
11923 		qoff += map->nr_queues;
11924 	}
11925 }
11926 
11927 /* shost template for SAS 2.0 HBA devices */
11928 static const struct scsi_host_template mpt2sas_driver_template = {
11929 	.module				= THIS_MODULE,
11930 	.name				= "Fusion MPT SAS Host",
11931 	.proc_name			= MPT2SAS_DRIVER_NAME,
11932 	.queuecommand			= scsih_qcmd,
11933 	.target_alloc			= scsih_target_alloc,
11934 	.slave_alloc			= scsih_slave_alloc,
11935 	.slave_configure		= scsih_slave_configure,
11936 	.target_destroy			= scsih_target_destroy,
11937 	.slave_destroy			= scsih_slave_destroy,
11938 	.scan_finished			= scsih_scan_finished,
11939 	.scan_start			= scsih_scan_start,
11940 	.change_queue_depth		= scsih_change_queue_depth,
11941 	.eh_abort_handler		= scsih_abort,
11942 	.eh_device_reset_handler	= scsih_dev_reset,
11943 	.eh_target_reset_handler	= scsih_target_reset,
11944 	.eh_host_reset_handler		= scsih_host_reset,
11945 	.bios_param			= scsih_bios_param,
11946 	.can_queue			= 1,
11947 	.this_id			= -1,
11948 	.sg_tablesize			= MPT2SAS_SG_DEPTH,
11949 	.max_sectors			= 32767,
11950 	.cmd_per_lun			= 7,
11951 	.shost_groups			= mpt3sas_host_groups,
11952 	.sdev_groups			= mpt3sas_dev_groups,
11953 	.track_queue_depth		= 1,
11954 	.cmd_size			= sizeof(struct scsiio_tracker),
11955 };
11956 
11957 /* raid transport support for SAS 2.0 HBA devices */
11958 static struct raid_function_template mpt2sas_raid_functions = {
11959 	.cookie		= &mpt2sas_driver_template,
11960 	.is_raid	= scsih_is_raid,
11961 	.get_resync	= scsih_get_resync,
11962 	.get_state	= scsih_get_state,
11963 };
11964 
11965 /* shost template for SAS 3.0 HBA devices */
11966 static const struct scsi_host_template mpt3sas_driver_template = {
11967 	.module				= THIS_MODULE,
11968 	.name				= "Fusion MPT SAS Host",
11969 	.proc_name			= MPT3SAS_DRIVER_NAME,
11970 	.queuecommand			= scsih_qcmd,
11971 	.target_alloc			= scsih_target_alloc,
11972 	.slave_alloc			= scsih_slave_alloc,
11973 	.slave_configure		= scsih_slave_configure,
11974 	.target_destroy			= scsih_target_destroy,
11975 	.slave_destroy			= scsih_slave_destroy,
11976 	.scan_finished			= scsih_scan_finished,
11977 	.scan_start			= scsih_scan_start,
11978 	.change_queue_depth		= scsih_change_queue_depth,
11979 	.eh_abort_handler		= scsih_abort,
11980 	.eh_device_reset_handler	= scsih_dev_reset,
11981 	.eh_target_reset_handler	= scsih_target_reset,
11982 	.eh_host_reset_handler		= scsih_host_reset,
11983 	.bios_param			= scsih_bios_param,
11984 	.can_queue			= 1,
11985 	.this_id			= -1,
11986 	.sg_tablesize			= MPT3SAS_SG_DEPTH,
11987 	.max_sectors			= 32767,
11988 	.max_segment_size		= 0xffffffff,
11989 	.cmd_per_lun			= 128,
11990 	.shost_groups			= mpt3sas_host_groups,
11991 	.sdev_groups			= mpt3sas_dev_groups,
11992 	.track_queue_depth		= 1,
11993 	.cmd_size			= sizeof(struct scsiio_tracker),
11994 	.map_queues			= scsih_map_queues,
11995 	.mq_poll			= mpt3sas_blk_mq_poll,
11996 };
11997 
11998 /* raid transport support for SAS 3.0 HBA devices */
11999 static struct raid_function_template mpt3sas_raid_functions = {
12000 	.cookie		= &mpt3sas_driver_template,
12001 	.is_raid	= scsih_is_raid,
12002 	.get_resync	= scsih_get_resync,
12003 	.get_state	= scsih_get_state,
12004 };
12005 
12006 /**
12007  * _scsih_determine_hba_mpi_version - determine in which MPI version class
12008  *					this device belongs to.
12009  * @pdev: PCI device struct
12010  *
12011  * return MPI2_VERSION for SAS 2.0 HBA devices,
12012  *	MPI25_VERSION for SAS 3.0 HBA devices, and
12013  *	MPI26 VERSION for Cutlass & Invader SAS 3.0 HBA devices
12014  */
12015 static u16
12016 _scsih_determine_hba_mpi_version(struct pci_dev *pdev)
12017 {
12018 
12019 	switch (pdev->device) {
12020 	case MPI2_MFGPAGE_DEVID_SSS6200:
12021 	case MPI2_MFGPAGE_DEVID_SAS2004:
12022 	case MPI2_MFGPAGE_DEVID_SAS2008:
12023 	case MPI2_MFGPAGE_DEVID_SAS2108_1:
12024 	case MPI2_MFGPAGE_DEVID_SAS2108_2:
12025 	case MPI2_MFGPAGE_DEVID_SAS2108_3:
12026 	case MPI2_MFGPAGE_DEVID_SAS2116_1:
12027 	case MPI2_MFGPAGE_DEVID_SAS2116_2:
12028 	case MPI2_MFGPAGE_DEVID_SAS2208_1:
12029 	case MPI2_MFGPAGE_DEVID_SAS2208_2:
12030 	case MPI2_MFGPAGE_DEVID_SAS2208_3:
12031 	case MPI2_MFGPAGE_DEVID_SAS2208_4:
12032 	case MPI2_MFGPAGE_DEVID_SAS2208_5:
12033 	case MPI2_MFGPAGE_DEVID_SAS2208_6:
12034 	case MPI2_MFGPAGE_DEVID_SAS2308_1:
12035 	case MPI2_MFGPAGE_DEVID_SAS2308_2:
12036 	case MPI2_MFGPAGE_DEVID_SAS2308_3:
12037 	case MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP:
12038 	case MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP_1:
12039 		return MPI2_VERSION;
12040 	case MPI25_MFGPAGE_DEVID_SAS3004:
12041 	case MPI25_MFGPAGE_DEVID_SAS3008:
12042 	case MPI25_MFGPAGE_DEVID_SAS3108_1:
12043 	case MPI25_MFGPAGE_DEVID_SAS3108_2:
12044 	case MPI25_MFGPAGE_DEVID_SAS3108_5:
12045 	case MPI25_MFGPAGE_DEVID_SAS3108_6:
12046 		return MPI25_VERSION;
12047 	case MPI26_MFGPAGE_DEVID_SAS3216:
12048 	case MPI26_MFGPAGE_DEVID_SAS3224:
12049 	case MPI26_MFGPAGE_DEVID_SAS3316_1:
12050 	case MPI26_MFGPAGE_DEVID_SAS3316_2:
12051 	case MPI26_MFGPAGE_DEVID_SAS3316_3:
12052 	case MPI26_MFGPAGE_DEVID_SAS3316_4:
12053 	case MPI26_MFGPAGE_DEVID_SAS3324_1:
12054 	case MPI26_MFGPAGE_DEVID_SAS3324_2:
12055 	case MPI26_MFGPAGE_DEVID_SAS3324_3:
12056 	case MPI26_MFGPAGE_DEVID_SAS3324_4:
12057 	case MPI26_MFGPAGE_DEVID_SAS3508:
12058 	case MPI26_MFGPAGE_DEVID_SAS3508_1:
12059 	case MPI26_MFGPAGE_DEVID_SAS3408:
12060 	case MPI26_MFGPAGE_DEVID_SAS3516:
12061 	case MPI26_MFGPAGE_DEVID_SAS3516_1:
12062 	case MPI26_MFGPAGE_DEVID_SAS3416:
12063 	case MPI26_MFGPAGE_DEVID_SAS3616:
12064 	case MPI26_ATLAS_PCIe_SWITCH_DEVID:
12065 	case MPI26_MFGPAGE_DEVID_CFG_SEC_3916:
12066 	case MPI26_MFGPAGE_DEVID_HARD_SEC_3916:
12067 	case MPI26_MFGPAGE_DEVID_CFG_SEC_3816:
12068 	case MPI26_MFGPAGE_DEVID_HARD_SEC_3816:
12069 	case MPI26_MFGPAGE_DEVID_INVALID0_3916:
12070 	case MPI26_MFGPAGE_DEVID_INVALID1_3916:
12071 	case MPI26_MFGPAGE_DEVID_INVALID0_3816:
12072 	case MPI26_MFGPAGE_DEVID_INVALID1_3816:
12073 		return MPI26_VERSION;
12074 	}
12075 	return 0;
12076 }
12077 
12078 /**
12079  * _scsih_probe - attach and add scsi host
12080  * @pdev: PCI device struct
12081  * @id: pci device id
12082  *
12083  * Return: 0 success, anything else error.
12084  */
12085 static int
12086 _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
12087 {
12088 	struct MPT3SAS_ADAPTER *ioc;
12089 	struct Scsi_Host *shost = NULL;
12090 	int rv;
12091 	u16 hba_mpi_version;
12092 	int iopoll_q_count = 0;
12093 
12094 	/* Determine in which MPI version class this pci device belongs */
12095 	hba_mpi_version = _scsih_determine_hba_mpi_version(pdev);
12096 	if (hba_mpi_version == 0)
12097 		return -ENODEV;
12098 
12099 	/* Enumerate only SAS 2.0 HBA's if hbas_to_enumerate is one,
12100 	 * for other generation HBA's return with -ENODEV
12101 	 */
12102 	if ((hbas_to_enumerate == 1) && (hba_mpi_version !=  MPI2_VERSION))
12103 		return -ENODEV;
12104 
12105 	/* Enumerate only SAS 3.0 HBA's if hbas_to_enumerate is two,
12106 	 * for other generation HBA's return with -ENODEV
12107 	 */
12108 	if ((hbas_to_enumerate == 2) && (!(hba_mpi_version ==  MPI25_VERSION
12109 		|| hba_mpi_version ==  MPI26_VERSION)))
12110 		return -ENODEV;
12111 
12112 	switch (hba_mpi_version) {
12113 	case MPI2_VERSION:
12114 		pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
12115 			PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
12116 		/* Use mpt2sas driver host template for SAS 2.0 HBA's */
12117 		shost = scsi_host_alloc(&mpt2sas_driver_template,
12118 		  sizeof(struct MPT3SAS_ADAPTER));
12119 		if (!shost)
12120 			return -ENODEV;
12121 		ioc = shost_priv(shost);
12122 		memset(ioc, 0, sizeof(struct MPT3SAS_ADAPTER));
12123 		ioc->hba_mpi_version_belonged = hba_mpi_version;
12124 		ioc->id = mpt2_ids++;
12125 		sprintf(ioc->driver_name, "%s", MPT2SAS_DRIVER_NAME);
12126 		switch (pdev->device) {
12127 		case MPI2_MFGPAGE_DEVID_SSS6200:
12128 			ioc->is_warpdrive = 1;
12129 			ioc->hide_ir_msg = 1;
12130 			break;
12131 		case MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP:
12132 		case MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP_1:
12133 			ioc->is_mcpu_endpoint = 1;
12134 			break;
12135 		default:
12136 			ioc->mfg_pg10_hide_flag = MFG_PAGE10_EXPOSE_ALL_DISKS;
12137 			break;
12138 		}
12139 
12140 		if (multipath_on_hba == -1 || multipath_on_hba == 0)
12141 			ioc->multipath_on_hba = 0;
12142 		else
12143 			ioc->multipath_on_hba = 1;
12144 
12145 		break;
12146 	case MPI25_VERSION:
12147 	case MPI26_VERSION:
12148 		/* Use mpt3sas driver host template for SAS 3.0 HBA's */
12149 		shost = scsi_host_alloc(&mpt3sas_driver_template,
12150 		  sizeof(struct MPT3SAS_ADAPTER));
12151 		if (!shost)
12152 			return -ENODEV;
12153 		ioc = shost_priv(shost);
12154 		memset(ioc, 0, sizeof(struct MPT3SAS_ADAPTER));
12155 		ioc->hba_mpi_version_belonged = hba_mpi_version;
12156 		ioc->id = mpt3_ids++;
12157 		sprintf(ioc->driver_name, "%s", MPT3SAS_DRIVER_NAME);
12158 		switch (pdev->device) {
12159 		case MPI26_MFGPAGE_DEVID_SAS3508:
12160 		case MPI26_MFGPAGE_DEVID_SAS3508_1:
12161 		case MPI26_MFGPAGE_DEVID_SAS3408:
12162 		case MPI26_MFGPAGE_DEVID_SAS3516:
12163 		case MPI26_MFGPAGE_DEVID_SAS3516_1:
12164 		case MPI26_MFGPAGE_DEVID_SAS3416:
12165 		case MPI26_MFGPAGE_DEVID_SAS3616:
12166 		case MPI26_ATLAS_PCIe_SWITCH_DEVID:
12167 			ioc->is_gen35_ioc = 1;
12168 			break;
12169 		case MPI26_MFGPAGE_DEVID_INVALID0_3816:
12170 		case MPI26_MFGPAGE_DEVID_INVALID0_3916:
12171 			dev_err(&pdev->dev,
12172 			    "HBA with DeviceId 0x%04x, sub VendorId 0x%04x, sub DeviceId 0x%04x is Invalid",
12173 			    pdev->device, pdev->subsystem_vendor,
12174 			    pdev->subsystem_device);
12175 			return 1;
12176 		case MPI26_MFGPAGE_DEVID_INVALID1_3816:
12177 		case MPI26_MFGPAGE_DEVID_INVALID1_3916:
12178 			dev_err(&pdev->dev,
12179 			    "HBA with DeviceId 0x%04x, sub VendorId 0x%04x, sub DeviceId 0x%04x is Tampered",
12180 			    pdev->device, pdev->subsystem_vendor,
12181 			    pdev->subsystem_device);
12182 			return 1;
12183 		case MPI26_MFGPAGE_DEVID_CFG_SEC_3816:
12184 		case MPI26_MFGPAGE_DEVID_CFG_SEC_3916:
12185 			dev_info(&pdev->dev,
12186 			    "HBA is in Configurable Secure mode\n");
12187 			fallthrough;
12188 		case MPI26_MFGPAGE_DEVID_HARD_SEC_3816:
12189 		case MPI26_MFGPAGE_DEVID_HARD_SEC_3916:
12190 			ioc->is_aero_ioc = ioc->is_gen35_ioc = 1;
12191 			break;
12192 		default:
12193 			ioc->is_gen35_ioc = ioc->is_aero_ioc = 0;
12194 		}
12195 		if ((ioc->hba_mpi_version_belonged == MPI25_VERSION &&
12196 			pdev->revision >= SAS3_PCI_DEVICE_C0_REVISION) ||
12197 			(ioc->hba_mpi_version_belonged == MPI26_VERSION)) {
12198 			ioc->combined_reply_queue = 1;
12199 			if (ioc->is_gen35_ioc)
12200 				ioc->combined_reply_index_count =
12201 				 MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G35;
12202 			else
12203 				ioc->combined_reply_index_count =
12204 				 MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G3;
12205 		}
12206 
12207 		switch (ioc->is_gen35_ioc) {
12208 		case 0:
12209 			if (multipath_on_hba == -1 || multipath_on_hba == 0)
12210 				ioc->multipath_on_hba = 0;
12211 			else
12212 				ioc->multipath_on_hba = 1;
12213 			break;
12214 		case 1:
12215 			if (multipath_on_hba == -1 || multipath_on_hba > 0)
12216 				ioc->multipath_on_hba = 1;
12217 			else
12218 				ioc->multipath_on_hba = 0;
12219 			break;
12220 		default:
12221 			break;
12222 		}
12223 
12224 		break;
12225 	default:
12226 		return -ENODEV;
12227 	}
12228 
12229 	INIT_LIST_HEAD(&ioc->list);
12230 	spin_lock(&gioc_lock);
12231 	list_add_tail(&ioc->list, &mpt3sas_ioc_list);
12232 	spin_unlock(&gioc_lock);
12233 	ioc->shost = shost;
12234 	ioc->pdev = pdev;
12235 	ioc->scsi_io_cb_idx = scsi_io_cb_idx;
12236 	ioc->tm_cb_idx = tm_cb_idx;
12237 	ioc->ctl_cb_idx = ctl_cb_idx;
12238 	ioc->base_cb_idx = base_cb_idx;
12239 	ioc->port_enable_cb_idx = port_enable_cb_idx;
12240 	ioc->transport_cb_idx = transport_cb_idx;
12241 	ioc->scsih_cb_idx = scsih_cb_idx;
12242 	ioc->config_cb_idx = config_cb_idx;
12243 	ioc->tm_tr_cb_idx = tm_tr_cb_idx;
12244 	ioc->tm_tr_volume_cb_idx = tm_tr_volume_cb_idx;
12245 	ioc->tm_sas_control_cb_idx = tm_sas_control_cb_idx;
12246 	ioc->logging_level = logging_level;
12247 	ioc->schedule_dead_ioc_flush_running_cmds = &_scsih_flush_running_cmds;
12248 	/* Host waits for minimum of six seconds */
12249 	ioc->max_shutdown_latency = IO_UNIT_CONTROL_SHUTDOWN_TIMEOUT;
12250 	/*
12251 	 * Enable MEMORY MOVE support flag.
12252 	 */
12253 	ioc->drv_support_bitmap |= MPT_DRV_SUPPORT_BITMAP_MEMMOVE;
12254 	/* Enable ADDITIONAL QUERY support flag. */
12255 	ioc->drv_support_bitmap |= MPT_DRV_SUPPORT_BITMAP_ADDNLQUERY;
12256 
12257 	ioc->enable_sdev_max_qd = enable_sdev_max_qd;
12258 
12259 	/* misc semaphores and spin locks */
12260 	mutex_init(&ioc->reset_in_progress_mutex);
12261 	/* initializing pci_access_mutex lock */
12262 	mutex_init(&ioc->pci_access_mutex);
12263 	spin_lock_init(&ioc->ioc_reset_in_progress_lock);
12264 	spin_lock_init(&ioc->scsi_lookup_lock);
12265 	spin_lock_init(&ioc->sas_device_lock);
12266 	spin_lock_init(&ioc->sas_node_lock);
12267 	spin_lock_init(&ioc->fw_event_lock);
12268 	spin_lock_init(&ioc->raid_device_lock);
12269 	spin_lock_init(&ioc->pcie_device_lock);
12270 	spin_lock_init(&ioc->diag_trigger_lock);
12271 
12272 	INIT_LIST_HEAD(&ioc->sas_device_list);
12273 	INIT_LIST_HEAD(&ioc->sas_device_init_list);
12274 	INIT_LIST_HEAD(&ioc->sas_expander_list);
12275 	INIT_LIST_HEAD(&ioc->enclosure_list);
12276 	INIT_LIST_HEAD(&ioc->pcie_device_list);
12277 	INIT_LIST_HEAD(&ioc->pcie_device_init_list);
12278 	INIT_LIST_HEAD(&ioc->fw_event_list);
12279 	INIT_LIST_HEAD(&ioc->raid_device_list);
12280 	INIT_LIST_HEAD(&ioc->sas_hba.sas_port_list);
12281 	INIT_LIST_HEAD(&ioc->delayed_tr_list);
12282 	INIT_LIST_HEAD(&ioc->delayed_sc_list);
12283 	INIT_LIST_HEAD(&ioc->delayed_event_ack_list);
12284 	INIT_LIST_HEAD(&ioc->delayed_tr_volume_list);
12285 	INIT_LIST_HEAD(&ioc->reply_queue_list);
12286 	INIT_LIST_HEAD(&ioc->port_table_list);
12287 
12288 	sprintf(ioc->name, "%s_cm%d", ioc->driver_name, ioc->id);
12289 
12290 	/* init shost parameters */
12291 	shost->max_cmd_len = 32;
12292 	shost->max_lun = max_lun;
12293 	shost->transportt = mpt3sas_transport_template;
12294 	shost->unique_id = ioc->id;
12295 
12296 	if (ioc->is_mcpu_endpoint) {
12297 		/* mCPU MPI support 64K max IO */
12298 		shost->max_sectors = 128;
12299 		ioc_info(ioc, "The max_sectors value is set to %d\n",
12300 			 shost->max_sectors);
12301 	} else {
12302 		if (max_sectors != 0xFFFF) {
12303 			if (max_sectors < 64) {
12304 				shost->max_sectors = 64;
12305 				ioc_warn(ioc, "Invalid value %d passed for max_sectors, range is 64 to 32767. Assigning value of 64.\n",
12306 					 max_sectors);
12307 			} else if (max_sectors > 32767) {
12308 				shost->max_sectors = 32767;
12309 				ioc_warn(ioc, "Invalid value %d passed for max_sectors, range is 64 to 32767.Assigning default value of 32767.\n",
12310 					 max_sectors);
12311 			} else {
12312 				shost->max_sectors = max_sectors & 0xFFFE;
12313 				ioc_info(ioc, "The max_sectors value is set to %d\n",
12314 					 shost->max_sectors);
12315 			}
12316 		}
12317 	}
12318 	/* register EEDP capabilities with SCSI layer */
12319 	if (prot_mask >= 0)
12320 		scsi_host_set_prot(shost, (prot_mask & 0x07));
12321 	else
12322 		scsi_host_set_prot(shost, SHOST_DIF_TYPE1_PROTECTION
12323 				   | SHOST_DIF_TYPE2_PROTECTION
12324 				   | SHOST_DIF_TYPE3_PROTECTION);
12325 
12326 	scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC);
12327 
12328 	/* event thread */
12329 	snprintf(ioc->firmware_event_name, sizeof(ioc->firmware_event_name),
12330 	    "fw_event_%s%d", ioc->driver_name, ioc->id);
12331 	ioc->firmware_event_thread = alloc_ordered_workqueue(
12332 	    ioc->firmware_event_name, 0);
12333 	if (!ioc->firmware_event_thread) {
12334 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
12335 			__FILE__, __LINE__, __func__);
12336 		rv = -ENODEV;
12337 		goto out_thread_fail;
12338 	}
12339 
12340 	shost->host_tagset = 0;
12341 
12342 	if (ioc->is_gen35_ioc && host_tagset_enable)
12343 		shost->host_tagset = 1;
12344 
12345 	ioc->is_driver_loading = 1;
12346 	if ((mpt3sas_base_attach(ioc))) {
12347 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
12348 			__FILE__, __LINE__, __func__);
12349 		rv = -ENODEV;
12350 		goto out_attach_fail;
12351 	}
12352 
12353 	if (ioc->is_warpdrive) {
12354 		if (ioc->mfg_pg10_hide_flag ==  MFG_PAGE10_EXPOSE_ALL_DISKS)
12355 			ioc->hide_drives = 0;
12356 		else if (ioc->mfg_pg10_hide_flag ==  MFG_PAGE10_HIDE_ALL_DISKS)
12357 			ioc->hide_drives = 1;
12358 		else {
12359 			if (mpt3sas_get_num_volumes(ioc))
12360 				ioc->hide_drives = 1;
12361 			else
12362 				ioc->hide_drives = 0;
12363 		}
12364 	} else
12365 		ioc->hide_drives = 0;
12366 
12367 	shost->nr_hw_queues = 1;
12368 
12369 	if (shost->host_tagset) {
12370 		shost->nr_hw_queues =
12371 		    ioc->reply_queue_count - ioc->high_iops_queues;
12372 
12373 		iopoll_q_count =
12374 		    ioc->reply_queue_count - ioc->iopoll_q_start_index;
12375 
12376 		shost->nr_maps = iopoll_q_count ? 3 : 1;
12377 
12378 		dev_info(&ioc->pdev->dev,
12379 		    "Max SCSIIO MPT commands: %d shared with nr_hw_queues = %d\n",
12380 		    shost->can_queue, shost->nr_hw_queues);
12381 	}
12382 
12383 	rv = scsi_add_host(shost, &pdev->dev);
12384 	if (rv) {
12385 		ioc_err(ioc, "failure at %s:%d/%s()!\n",
12386 			__FILE__, __LINE__, __func__);
12387 		goto out_add_shost_fail;
12388 	}
12389 
12390 	scsi_scan_host(shost);
12391 	mpt3sas_setup_debugfs(ioc);
12392 	return 0;
12393 out_add_shost_fail:
12394 	mpt3sas_base_detach(ioc);
12395  out_attach_fail:
12396 	destroy_workqueue(ioc->firmware_event_thread);
12397  out_thread_fail:
12398 	spin_lock(&gioc_lock);
12399 	list_del(&ioc->list);
12400 	spin_unlock(&gioc_lock);
12401 	scsi_host_put(shost);
12402 	return rv;
12403 }
12404 
12405 /**
12406  * scsih_suspend - power management suspend main entry point
12407  * @dev: Device struct
12408  *
12409  * Return: 0 success, anything else error.
12410  */
12411 static int __maybe_unused
12412 scsih_suspend(struct device *dev)
12413 {
12414 	struct pci_dev *pdev = to_pci_dev(dev);
12415 	struct Scsi_Host *shost;
12416 	struct MPT3SAS_ADAPTER *ioc;
12417 	int rc;
12418 
12419 	rc = _scsih_get_shost_and_ioc(pdev, &shost, &ioc);
12420 	if (rc)
12421 		return rc;
12422 
12423 	mpt3sas_base_stop_watchdog(ioc);
12424 	scsi_block_requests(shost);
12425 	_scsih_nvme_shutdown(ioc);
12426 	ioc_info(ioc, "pdev=0x%p, slot=%s, entering operating state\n",
12427 		 pdev, pci_name(pdev));
12428 
12429 	mpt3sas_base_free_resources(ioc);
12430 	return 0;
12431 }
12432 
12433 /**
12434  * scsih_resume - power management resume main entry point
12435  * @dev: Device struct
12436  *
12437  * Return: 0 success, anything else error.
12438  */
12439 static int __maybe_unused
12440 scsih_resume(struct device *dev)
12441 {
12442 	struct pci_dev *pdev = to_pci_dev(dev);
12443 	struct Scsi_Host *shost;
12444 	struct MPT3SAS_ADAPTER *ioc;
12445 	pci_power_t device_state = pdev->current_state;
12446 	int r;
12447 
12448 	r = _scsih_get_shost_and_ioc(pdev, &shost, &ioc);
12449 	if (r)
12450 		return r;
12451 
12452 	ioc_info(ioc, "pdev=0x%p, slot=%s, previous operating state [D%d]\n",
12453 		 pdev, pci_name(pdev), device_state);
12454 
12455 	ioc->pdev = pdev;
12456 	r = mpt3sas_base_map_resources(ioc);
12457 	if (r)
12458 		return r;
12459 	ioc_info(ioc, "Issuing Hard Reset as part of OS Resume\n");
12460 	mpt3sas_base_hard_reset_handler(ioc, SOFT_RESET);
12461 	scsi_unblock_requests(shost);
12462 	mpt3sas_base_start_watchdog(ioc);
12463 	return 0;
12464 }
12465 
12466 /**
12467  * scsih_pci_error_detected - Called when a PCI error is detected.
12468  * @pdev: PCI device struct
12469  * @state: PCI channel state
12470  *
12471  * Description: Called when a PCI error is detected.
12472  *
12473  * Return: PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT.
12474  */
12475 static pci_ers_result_t
12476 scsih_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
12477 {
12478 	struct Scsi_Host *shost;
12479 	struct MPT3SAS_ADAPTER *ioc;
12480 
12481 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
12482 		return PCI_ERS_RESULT_DISCONNECT;
12483 
12484 	ioc_info(ioc, "PCI error: detected callback, state(%d)!!\n", state);
12485 
12486 	switch (state) {
12487 	case pci_channel_io_normal:
12488 		return PCI_ERS_RESULT_CAN_RECOVER;
12489 	case pci_channel_io_frozen:
12490 		/* Fatal error, prepare for slot reset */
12491 		ioc->pci_error_recovery = 1;
12492 		scsi_block_requests(ioc->shost);
12493 		mpt3sas_base_stop_watchdog(ioc);
12494 		mpt3sas_base_free_resources(ioc);
12495 		return PCI_ERS_RESULT_NEED_RESET;
12496 	case pci_channel_io_perm_failure:
12497 		/* Permanent error, prepare for device removal */
12498 		ioc->pci_error_recovery = 1;
12499 		mpt3sas_base_stop_watchdog(ioc);
12500 		mpt3sas_base_pause_mq_polling(ioc);
12501 		_scsih_flush_running_cmds(ioc);
12502 		return PCI_ERS_RESULT_DISCONNECT;
12503 	}
12504 	return PCI_ERS_RESULT_NEED_RESET;
12505 }
12506 
12507 /**
12508  * scsih_pci_slot_reset - Called when PCI slot has been reset.
12509  * @pdev: PCI device struct
12510  *
12511  * Description: This routine is called by the pci error recovery
12512  * code after the PCI slot has been reset, just before we
12513  * should resume normal operations.
12514  */
12515 static pci_ers_result_t
12516 scsih_pci_slot_reset(struct pci_dev *pdev)
12517 {
12518 	struct Scsi_Host *shost;
12519 	struct MPT3SAS_ADAPTER *ioc;
12520 	int rc;
12521 
12522 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
12523 		return PCI_ERS_RESULT_DISCONNECT;
12524 
12525 	ioc_info(ioc, "PCI error: slot reset callback!!\n");
12526 
12527 	ioc->pci_error_recovery = 0;
12528 	ioc->pdev = pdev;
12529 	pci_restore_state(pdev);
12530 	rc = mpt3sas_base_map_resources(ioc);
12531 	if (rc)
12532 		return PCI_ERS_RESULT_DISCONNECT;
12533 
12534 	ioc_info(ioc, "Issuing Hard Reset as part of PCI Slot Reset\n");
12535 	rc = mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
12536 
12537 	ioc_warn(ioc, "hard reset: %s\n",
12538 		 (rc == 0) ? "success" : "failed");
12539 
12540 	if (!rc)
12541 		return PCI_ERS_RESULT_RECOVERED;
12542 	else
12543 		return PCI_ERS_RESULT_DISCONNECT;
12544 }
12545 
12546 /**
12547  * scsih_pci_resume() - resume normal ops after PCI reset
12548  * @pdev: pointer to PCI device
12549  *
12550  * Called when the error recovery driver tells us that its
12551  * OK to resume normal operation. Use completion to allow
12552  * halted scsi ops to resume.
12553  */
12554 static void
12555 scsih_pci_resume(struct pci_dev *pdev)
12556 {
12557 	struct Scsi_Host *shost;
12558 	struct MPT3SAS_ADAPTER *ioc;
12559 
12560 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
12561 		return;
12562 
12563 	ioc_info(ioc, "PCI error: resume callback!!\n");
12564 
12565 	mpt3sas_base_start_watchdog(ioc);
12566 	scsi_unblock_requests(ioc->shost);
12567 }
12568 
12569 /**
12570  * scsih_pci_mmio_enabled - Enable MMIO and dump debug registers
12571  * @pdev: pointer to PCI device
12572  */
12573 static pci_ers_result_t
12574 scsih_pci_mmio_enabled(struct pci_dev *pdev)
12575 {
12576 	struct Scsi_Host *shost;
12577 	struct MPT3SAS_ADAPTER *ioc;
12578 
12579 	if (_scsih_get_shost_and_ioc(pdev, &shost, &ioc))
12580 		return PCI_ERS_RESULT_DISCONNECT;
12581 
12582 	ioc_info(ioc, "PCI error: mmio enabled callback!!\n");
12583 
12584 	/* TODO - dump whatever for debugging purposes */
12585 
12586 	/* This called only if scsih_pci_error_detected returns
12587 	 * PCI_ERS_RESULT_CAN_RECOVER. Read/write to the device still
12588 	 * works, no need to reset slot.
12589 	 */
12590 	return PCI_ERS_RESULT_RECOVERED;
12591 }
12592 
12593 /*
12594  * The pci device ids are defined in mpi/mpi2_cnfg.h.
12595  */
12596 static const struct pci_device_id mpt3sas_pci_table[] = {
12597 	/* Spitfire ~ 2004 */
12598 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2004,
12599 		PCI_ANY_ID, PCI_ANY_ID },
12600 	/* Falcon ~ 2008 */
12601 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2008,
12602 		PCI_ANY_ID, PCI_ANY_ID },
12603 	/* Liberator ~ 2108 */
12604 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_1,
12605 		PCI_ANY_ID, PCI_ANY_ID },
12606 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_2,
12607 		PCI_ANY_ID, PCI_ANY_ID },
12608 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_3,
12609 		PCI_ANY_ID, PCI_ANY_ID },
12610 	/* Meteor ~ 2116 */
12611 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_1,
12612 		PCI_ANY_ID, PCI_ANY_ID },
12613 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_2,
12614 		PCI_ANY_ID, PCI_ANY_ID },
12615 	/* Thunderbolt ~ 2208 */
12616 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_1,
12617 		PCI_ANY_ID, PCI_ANY_ID },
12618 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_2,
12619 		PCI_ANY_ID, PCI_ANY_ID },
12620 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_3,
12621 		PCI_ANY_ID, PCI_ANY_ID },
12622 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_4,
12623 		PCI_ANY_ID, PCI_ANY_ID },
12624 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_5,
12625 		PCI_ANY_ID, PCI_ANY_ID },
12626 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_6,
12627 		PCI_ANY_ID, PCI_ANY_ID },
12628 	/* Mustang ~ 2308 */
12629 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_1,
12630 		PCI_ANY_ID, PCI_ANY_ID },
12631 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
12632 		PCI_ANY_ID, PCI_ANY_ID },
12633 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_3,
12634 		PCI_ANY_ID, PCI_ANY_ID },
12635 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP,
12636 		PCI_ANY_ID, PCI_ANY_ID },
12637 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SWITCH_MPI_EP_1,
12638 		PCI_ANY_ID, PCI_ANY_ID },
12639 	/* SSS6200 */
12640 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SSS6200,
12641 		PCI_ANY_ID, PCI_ANY_ID },
12642 	/* Fury ~ 3004 and 3008 */
12643 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3004,
12644 		PCI_ANY_ID, PCI_ANY_ID },
12645 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3008,
12646 		PCI_ANY_ID, PCI_ANY_ID },
12647 	/* Invader ~ 3108 */
12648 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_1,
12649 		PCI_ANY_ID, PCI_ANY_ID },
12650 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_2,
12651 		PCI_ANY_ID, PCI_ANY_ID },
12652 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_5,
12653 		PCI_ANY_ID, PCI_ANY_ID },
12654 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_6,
12655 		PCI_ANY_ID, PCI_ANY_ID },
12656 	/* Cutlass ~ 3216 and 3224 */
12657 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3216,
12658 		PCI_ANY_ID, PCI_ANY_ID },
12659 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3224,
12660 		PCI_ANY_ID, PCI_ANY_ID },
12661 	/* Intruder ~ 3316 and 3324 */
12662 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3316_1,
12663 		PCI_ANY_ID, PCI_ANY_ID },
12664 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3316_2,
12665 		PCI_ANY_ID, PCI_ANY_ID },
12666 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3316_3,
12667 		PCI_ANY_ID, PCI_ANY_ID },
12668 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3316_4,
12669 		PCI_ANY_ID, PCI_ANY_ID },
12670 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3324_1,
12671 		PCI_ANY_ID, PCI_ANY_ID },
12672 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3324_2,
12673 		PCI_ANY_ID, PCI_ANY_ID },
12674 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3324_3,
12675 		PCI_ANY_ID, PCI_ANY_ID },
12676 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3324_4,
12677 		PCI_ANY_ID, PCI_ANY_ID },
12678 	/* Ventura, Crusader, Harpoon & Tomcat ~ 3516, 3416, 3508 & 3408*/
12679 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3508,
12680 		PCI_ANY_ID, PCI_ANY_ID },
12681 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3508_1,
12682 		PCI_ANY_ID, PCI_ANY_ID },
12683 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3408,
12684 		PCI_ANY_ID, PCI_ANY_ID },
12685 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3516,
12686 		PCI_ANY_ID, PCI_ANY_ID },
12687 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3516_1,
12688 		PCI_ANY_ID, PCI_ANY_ID },
12689 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3416,
12690 		PCI_ANY_ID, PCI_ANY_ID },
12691 	/* Mercator ~ 3616*/
12692 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_SAS3616,
12693 		PCI_ANY_ID, PCI_ANY_ID },
12694 
12695 	/* Aero SI 0x00E1 Configurable Secure
12696 	 * 0x00E2 Hard Secure
12697 	 */
12698 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_CFG_SEC_3916,
12699 		PCI_ANY_ID, PCI_ANY_ID },
12700 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_HARD_SEC_3916,
12701 		PCI_ANY_ID, PCI_ANY_ID },
12702 
12703 	/*
12704 	 *  Aero SI –> 0x00E0 Invalid, 0x00E3 Tampered
12705 	 */
12706 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_INVALID0_3916,
12707 		PCI_ANY_ID, PCI_ANY_ID },
12708 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_INVALID1_3916,
12709 		PCI_ANY_ID, PCI_ANY_ID },
12710 
12711 	/* Atlas PCIe Switch Management Port */
12712 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_ATLAS_PCIe_SWITCH_DEVID,
12713 		PCI_ANY_ID, PCI_ANY_ID },
12714 
12715 	/* Sea SI 0x00E5 Configurable Secure
12716 	 * 0x00E6 Hard Secure
12717 	 */
12718 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_CFG_SEC_3816,
12719 		PCI_ANY_ID, PCI_ANY_ID },
12720 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_HARD_SEC_3816,
12721 		PCI_ANY_ID, PCI_ANY_ID },
12722 
12723 	/*
12724 	 * ATTO Branded ExpressSAS H12xx GT
12725 	 */
12726 	{ MPI2_MFGPAGE_VENDORID_ATTO, MPI26_MFGPAGE_DEVID_HARD_SEC_3816,
12727 		PCI_ANY_ID, PCI_ANY_ID },
12728 
12729 	/*
12730 	 *  Sea SI –> 0x00E4 Invalid, 0x00E7 Tampered
12731 	 */
12732 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_INVALID0_3816,
12733 		PCI_ANY_ID, PCI_ANY_ID },
12734 	{ MPI2_MFGPAGE_VENDORID_LSI, MPI26_MFGPAGE_DEVID_INVALID1_3816,
12735 		PCI_ANY_ID, PCI_ANY_ID },
12736 
12737 	{0}     /* Terminating entry */
12738 };
12739 MODULE_DEVICE_TABLE(pci, mpt3sas_pci_table);
12740 
12741 static struct pci_error_handlers _mpt3sas_err_handler = {
12742 	.error_detected	= scsih_pci_error_detected,
12743 	.mmio_enabled	= scsih_pci_mmio_enabled,
12744 	.slot_reset	= scsih_pci_slot_reset,
12745 	.resume		= scsih_pci_resume,
12746 };
12747 
12748 static SIMPLE_DEV_PM_OPS(scsih_pm_ops, scsih_suspend, scsih_resume);
12749 
12750 static struct pci_driver mpt3sas_driver = {
12751 	.name		= MPT3SAS_DRIVER_NAME,
12752 	.id_table	= mpt3sas_pci_table,
12753 	.probe		= _scsih_probe,
12754 	.remove		= scsih_remove,
12755 	.shutdown	= scsih_shutdown,
12756 	.err_handler	= &_mpt3sas_err_handler,
12757 	.driver.pm	= &scsih_pm_ops,
12758 };
12759 
12760 /**
12761  * scsih_init - main entry point for this driver.
12762  *
12763  * Return: 0 success, anything else error.
12764  */
12765 static int
12766 scsih_init(void)
12767 {
12768 	mpt2_ids = 0;
12769 	mpt3_ids = 0;
12770 
12771 	mpt3sas_base_initialize_callback_handler();
12772 
12773 	 /* queuecommand callback hander */
12774 	scsi_io_cb_idx = mpt3sas_base_register_callback_handler(_scsih_io_done);
12775 
12776 	/* task management callback handler */
12777 	tm_cb_idx = mpt3sas_base_register_callback_handler(_scsih_tm_done);
12778 
12779 	/* base internal commands callback handler */
12780 	base_cb_idx = mpt3sas_base_register_callback_handler(mpt3sas_base_done);
12781 	port_enable_cb_idx = mpt3sas_base_register_callback_handler(
12782 	    mpt3sas_port_enable_done);
12783 
12784 	/* transport internal commands callback handler */
12785 	transport_cb_idx = mpt3sas_base_register_callback_handler(
12786 	    mpt3sas_transport_done);
12787 
12788 	/* scsih internal commands callback handler */
12789 	scsih_cb_idx = mpt3sas_base_register_callback_handler(_scsih_done);
12790 
12791 	/* configuration page API internal commands callback handler */
12792 	config_cb_idx = mpt3sas_base_register_callback_handler(
12793 	    mpt3sas_config_done);
12794 
12795 	/* ctl module callback handler */
12796 	ctl_cb_idx = mpt3sas_base_register_callback_handler(mpt3sas_ctl_done);
12797 
12798 	tm_tr_cb_idx = mpt3sas_base_register_callback_handler(
12799 	    _scsih_tm_tr_complete);
12800 
12801 	tm_tr_volume_cb_idx = mpt3sas_base_register_callback_handler(
12802 	    _scsih_tm_volume_tr_complete);
12803 
12804 	tm_sas_control_cb_idx = mpt3sas_base_register_callback_handler(
12805 	    _scsih_sas_control_complete);
12806 
12807 	mpt3sas_init_debugfs();
12808 	return 0;
12809 }
12810 
12811 /**
12812  * scsih_exit - exit point for this driver (when it is a module).
12813  *
12814  * Return: 0 success, anything else error.
12815  */
12816 static void
12817 scsih_exit(void)
12818 {
12819 
12820 	mpt3sas_base_release_callback_handler(scsi_io_cb_idx);
12821 	mpt3sas_base_release_callback_handler(tm_cb_idx);
12822 	mpt3sas_base_release_callback_handler(base_cb_idx);
12823 	mpt3sas_base_release_callback_handler(port_enable_cb_idx);
12824 	mpt3sas_base_release_callback_handler(transport_cb_idx);
12825 	mpt3sas_base_release_callback_handler(scsih_cb_idx);
12826 	mpt3sas_base_release_callback_handler(config_cb_idx);
12827 	mpt3sas_base_release_callback_handler(ctl_cb_idx);
12828 
12829 	mpt3sas_base_release_callback_handler(tm_tr_cb_idx);
12830 	mpt3sas_base_release_callback_handler(tm_tr_volume_cb_idx);
12831 	mpt3sas_base_release_callback_handler(tm_sas_control_cb_idx);
12832 
12833 /* raid transport support */
12834 	if (hbas_to_enumerate != 1)
12835 		raid_class_release(mpt3sas_raid_template);
12836 	if (hbas_to_enumerate != 2)
12837 		raid_class_release(mpt2sas_raid_template);
12838 	sas_release_transport(mpt3sas_transport_template);
12839 	mpt3sas_exit_debugfs();
12840 }
12841 
12842 /**
12843  * _mpt3sas_init - main entry point for this driver.
12844  *
12845  * Return: 0 success, anything else error.
12846  */
12847 static int __init
12848 _mpt3sas_init(void)
12849 {
12850 	int error;
12851 
12852 	pr_info("%s version %s loaded\n", MPT3SAS_DRIVER_NAME,
12853 					MPT3SAS_DRIVER_VERSION);
12854 
12855 	mpt3sas_transport_template =
12856 	    sas_attach_transport(&mpt3sas_transport_functions);
12857 	if (!mpt3sas_transport_template)
12858 		return -ENODEV;
12859 
12860 	/* No need attach mpt3sas raid functions template
12861 	 * if hbas_to_enumarate value is one.
12862 	 */
12863 	if (hbas_to_enumerate != 1) {
12864 		mpt3sas_raid_template =
12865 				raid_class_attach(&mpt3sas_raid_functions);
12866 		if (!mpt3sas_raid_template) {
12867 			sas_release_transport(mpt3sas_transport_template);
12868 			return -ENODEV;
12869 		}
12870 	}
12871 
12872 	/* No need to attach mpt2sas raid functions template
12873 	 * if hbas_to_enumarate value is two
12874 	 */
12875 	if (hbas_to_enumerate != 2) {
12876 		mpt2sas_raid_template =
12877 				raid_class_attach(&mpt2sas_raid_functions);
12878 		if (!mpt2sas_raid_template) {
12879 			sas_release_transport(mpt3sas_transport_template);
12880 			return -ENODEV;
12881 		}
12882 	}
12883 
12884 	error = scsih_init();
12885 	if (error) {
12886 		scsih_exit();
12887 		return error;
12888 	}
12889 
12890 	mpt3sas_ctl_init(hbas_to_enumerate);
12891 
12892 	error = pci_register_driver(&mpt3sas_driver);
12893 	if (error) {
12894 		mpt3sas_ctl_exit(hbas_to_enumerate);
12895 		scsih_exit();
12896 	}
12897 
12898 	return error;
12899 }
12900 
12901 /**
12902  * _mpt3sas_exit - exit point for this driver (when it is a module).
12903  *
12904  */
12905 static void __exit
12906 _mpt3sas_exit(void)
12907 {
12908 	pr_info("mpt3sas version %s unloading\n",
12909 				MPT3SAS_DRIVER_VERSION);
12910 
12911 	pci_unregister_driver(&mpt3sas_driver);
12912 
12913 	mpt3sas_ctl_exit(hbas_to_enumerate);
12914 
12915 	scsih_exit();
12916 }
12917 
12918 module_init(_mpt3sas_init);
12919 module_exit(_mpt3sas_exit);
12920