08a95b2a2f2ed630aeac9a9318e43b5108adb01c
[pandora-kernel.git] / drivers / scsi / mpt3sas / mpt3sas_scsih.c
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-2013  LSI Corporation
6  *  (mailto:DL-MPTFusionLinux@lsi.com)
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * NO WARRANTY
19  * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20  * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21  * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23  * solely responsible for determining the appropriateness of using and
24  * distributing the Program and assumes all risks associated with its
25  * exercise of rights under this Agreement, including but not limited to
26  * the risks and costs of program errors, damage to or loss of data,
27  * programs or equipment, and unavailability or interruption of operations.
28
29  * DISCLAIMER OF LIABILITY
30  * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35  * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36  * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
37
38  * You should have received a copy of the GNU General Public License
39  * along with this program; if not, write to the Free Software
40  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
41  * USA.
42  */
43
44 #include <linux/module.h>
45 #include <linux/kernel.h>
46 #include <linux/init.h>
47 #include <linux/errno.h>
48 #include <linux/blkdev.h>
49 #include <linux/sched.h>
50 #include <linux/workqueue.h>
51 #include <linux/delay.h>
52 #include <linux/pci.h>
53 #include <linux/interrupt.h>
54 #include <linux/aer.h>
55 #include <linux/raid_class.h>
56
57 #include "mpt3sas_base.h"
58
59 MODULE_AUTHOR(MPT3SAS_AUTHOR);
60 MODULE_DESCRIPTION(MPT3SAS_DESCRIPTION);
61 MODULE_LICENSE("GPL");
62 MODULE_VERSION(MPT3SAS_DRIVER_VERSION);
63
64 #define RAID_CHANNEL 1
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
75 static u8 _scsih_check_for_pending_tm(struct MPT3SAS_ADAPTER *ioc, u16 smid);
76
77 static void _scsih_scan_start(struct Scsi_Host *shost);
78 static int _scsih_scan_finished(struct Scsi_Host *shost, unsigned long time);
79
80 /* global parameters */
81 LIST_HEAD(mpt3sas_ioc_list);
82
83 /* local parameters */
84 static u8 scsi_io_cb_idx = -1;
85 static u8 tm_cb_idx = -1;
86 static u8 ctl_cb_idx = -1;
87 static u8 base_cb_idx = -1;
88 static u8 port_enable_cb_idx = -1;
89 static u8 transport_cb_idx = -1;
90 static u8 scsih_cb_idx = -1;
91 static u8 config_cb_idx = -1;
92 static int mpt_ids;
93
94 static u8 tm_tr_cb_idx = -1 ;
95 static u8 tm_tr_volume_cb_idx = -1 ;
96 static u8 tm_sas_control_cb_idx = -1;
97
98 /* command line options */
99 static u32 logging_level;
100 MODULE_PARM_DESC(logging_level,
101         " bits for enabling additional logging info (default=0)");
102
103
104 static ushort max_sectors = 0xFFFF;
105 module_param(max_sectors, ushort, 0);
106 MODULE_PARM_DESC(max_sectors, "max sectors, range 64 to 32767  default=32767");
107
108
109 static int missing_delay[2] = {-1, -1};
110 module_param_array(missing_delay, int, NULL, 0);
111 MODULE_PARM_DESC(missing_delay, " device missing delay , io missing delay");
112
113 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
114 #define MPT3SAS_MAX_LUN (16895)
115 static u64 max_lun = MPT3SAS_MAX_LUN;
116 module_param(max_lun, ullong, 0);
117 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
118
119
120
121
122 /* diag_buffer_enable is bitwise
123  * bit 0 set = TRACE
124  * bit 1 set = SNAPSHOT
125  * bit 2 set = EXTENDED
126  *
127  * Either bit can be set, or both
128  */
129 static int diag_buffer_enable = -1;
130 module_param(diag_buffer_enable, int, 0);
131 MODULE_PARM_DESC(diag_buffer_enable,
132         " post diag buffers (TRACE=1/SNAPSHOT=2/EXTENDED=4/default=0)");
133 static int disable_discovery = -1;
134 module_param(disable_discovery, int, 0);
135 MODULE_PARM_DESC(disable_discovery, " disable discovery ");
136
137
138 /* permit overriding the host protection capabilities mask (EEDP/T10 PI) */
139 static int prot_mask = -1;
140 module_param(prot_mask, int, 0);
141 MODULE_PARM_DESC(prot_mask, " host protection capabilities mask, def=7 ");
142
143
144 /* raid transport support */
145
146 static struct raid_template *mpt3sas_raid_template;
147
148
149 /**
150  * struct sense_info - common structure for obtaining sense keys
151  * @skey: sense key
152  * @asc: additional sense code
153  * @ascq: additional sense code qualifier
154  */
155 struct sense_info {
156         u8 skey;
157         u8 asc;
158         u8 ascq;
159 };
160
161 #define MPT3SAS_PROCESS_TRIGGER_DIAG (0xFFFB)
162 #define MPT3SAS_TURN_ON_FAULT_LED (0xFFFC)
163 #define MPT3SAS_PORT_ENABLE_COMPLETE (0xFFFD)
164 #define MPT3SAS_ABRT_TASK_SET (0xFFFE)
165 #define MPT3SAS_REMOVE_UNRESPONDING_DEVICES (0xFFFF)
166 /**
167  * struct fw_event_work - firmware event struct
168  * @list: link list framework
169  * @work: work object (ioc->fault_reset_work_q)
170  * @cancel_pending_work: flag set during reset handling
171  * @ioc: per adapter object
172  * @device_handle: device handle
173  * @VF_ID: virtual function id
174  * @VP_ID: virtual port id
175  * @ignore: flag meaning this event has been marked to ignore
176  * @event: firmware event MPI2_EVENT_XXX defined in mpt2_ioc.h
177  * @event_data: reply event data payload follows
178  *
179  * This object stored on ioc->fw_event_list.
180  */
181 struct fw_event_work {
182         struct list_head        list;
183         struct work_struct      work;
184         u8                      cancel_pending_work;
185         struct delayed_work     delayed_work;
186
187         struct MPT3SAS_ADAPTER *ioc;
188         u16                     device_handle;
189         u8                      VF_ID;
190         u8                      VP_ID;
191         u8                      ignore;
192         u16                     event;
193         void                    *event_data;
194 };
195
196 /* raid transport support */
197 static struct raid_template *mpt3sas_raid_template;
198
199 /**
200  * struct _scsi_io_transfer - scsi io transfer
201  * @handle: sas device handle (assigned by firmware)
202  * @is_raid: flag set for hidden raid components
203  * @dir: DMA_TO_DEVICE, DMA_FROM_DEVICE,
204  * @data_length: data transfer length
205  * @data_dma: dma pointer to data
206  * @sense: sense data
207  * @lun: lun number
208  * @cdb_length: cdb length
209  * @cdb: cdb contents
210  * @timeout: timeout for this command
211  * @VF_ID: virtual function id
212  * @VP_ID: virtual port id
213  * @valid_reply: flag set for reply message
214  * @sense_length: sense length
215  * @ioc_status: ioc status
216  * @scsi_state: scsi state
217  * @scsi_status: scsi staus
218  * @log_info: log information
219  * @transfer_length: data length transfer when there is a reply message
220  *
221  * Used for sending internal scsi commands to devices within this module.
222  * Refer to _scsi_send_scsi_io().
223  */
224 struct _scsi_io_transfer {
225         u16     handle;
226         u8      is_raid;
227         enum dma_data_direction dir;
228         u32     data_length;
229         dma_addr_t data_dma;
230         u8      sense[SCSI_SENSE_BUFFERSIZE];
231         u32     lun;
232         u8      cdb_length;
233         u8      cdb[32];
234         u8      timeout;
235         u8      VF_ID;
236         u8      VP_ID;
237         u8      valid_reply;
238   /* the following bits are only valid when 'valid_reply = 1' */
239         u32     sense_length;
240         u16     ioc_status;
241         u8      scsi_state;
242         u8      scsi_status;
243         u32     log_info;
244         u32     transfer_length;
245 };
246
247 /*
248  * The pci device ids are defined in mpi/mpi2_cnfg.h.
249  */
250 static DEFINE_PCI_DEVICE_TABLE(scsih_pci_table) = {
251         /* Fury ~ 3004 and 3008 */
252         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3004,
253                 PCI_ANY_ID, PCI_ANY_ID },
254         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3008,
255                 PCI_ANY_ID, PCI_ANY_ID },
256         /* Invader ~ 3108 */
257         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_1,
258                 PCI_ANY_ID, PCI_ANY_ID },
259         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_2,
260                 PCI_ANY_ID, PCI_ANY_ID },
261         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_5,
262                 PCI_ANY_ID, PCI_ANY_ID },
263         { MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_6,
264                 PCI_ANY_ID, PCI_ANY_ID },
265         {0}     /* Terminating entry */
266 };
267 MODULE_DEVICE_TABLE(pci, scsih_pci_table);
268
269 /**
270  * _scsih_set_debug_level - global setting of ioc->logging_level.
271  *
272  * Note: The logging levels are defined in mpt3sas_debug.h.
273  */
274 static int
275 _scsih_set_debug_level(const char *val, struct kernel_param *kp)
276 {
277         int ret = param_set_int(val, kp);
278         struct MPT3SAS_ADAPTER *ioc;
279
280         if (ret)
281                 return ret;
282
283         pr_info("setting logging_level(0x%08x)\n", logging_level);
284         list_for_each_entry(ioc, &mpt3sas_ioc_list, list)
285                 ioc->logging_level = logging_level;
286         return 0;
287 }
288 module_param_call(logging_level, _scsih_set_debug_level, param_get_int,
289         &logging_level, 0644);
290
291 /**
292  * _scsih_srch_boot_sas_address - search based on sas_address
293  * @sas_address: sas address
294  * @boot_device: boot device object from bios page 2
295  *
296  * Returns 1 when there's a match, 0 means no match.
297  */
298 static inline int
299 _scsih_srch_boot_sas_address(u64 sas_address,
300         Mpi2BootDeviceSasWwid_t *boot_device)
301 {
302         return (sas_address == le64_to_cpu(boot_device->SASAddress)) ?  1 : 0;
303 }
304
305 /**
306  * _scsih_srch_boot_device_name - search based on device name
307  * @device_name: device name specified in INDENTIFY fram
308  * @boot_device: boot device object from bios page 2
309  *
310  * Returns 1 when there's a match, 0 means no match.
311  */
312 static inline int
313 _scsih_srch_boot_device_name(u64 device_name,
314         Mpi2BootDeviceDeviceName_t *boot_device)
315 {
316         return (device_name == le64_to_cpu(boot_device->DeviceName)) ? 1 : 0;
317 }
318
319 /**
320  * _scsih_srch_boot_encl_slot - search based on enclosure_logical_id/slot
321  * @enclosure_logical_id: enclosure logical id
322  * @slot_number: slot number
323  * @boot_device: boot device object from bios page 2
324  *
325  * Returns 1 when there's a match, 0 means no match.
326  */
327 static inline int
328 _scsih_srch_boot_encl_slot(u64 enclosure_logical_id, u16 slot_number,
329         Mpi2BootDeviceEnclosureSlot_t *boot_device)
330 {
331         return (enclosure_logical_id == le64_to_cpu(boot_device->
332             EnclosureLogicalID) && slot_number == le16_to_cpu(boot_device->
333             SlotNumber)) ? 1 : 0;
334 }
335
336 /**
337  * _scsih_is_boot_device - search for matching boot device.
338  * @sas_address: sas address
339  * @device_name: device name specified in INDENTIFY fram
340  * @enclosure_logical_id: enclosure logical id
341  * @slot_number: slot number
342  * @form: specifies boot device form
343  * @boot_device: boot device object from bios page 2
344  *
345  * Returns 1 when there's a match, 0 means no match.
346  */
347 static int
348 _scsih_is_boot_device(u64 sas_address, u64 device_name,
349         u64 enclosure_logical_id, u16 slot, u8 form,
350         Mpi2BiosPage2BootDevice_t *boot_device)
351 {
352         int rc = 0;
353
354         switch (form) {
355         case MPI2_BIOSPAGE2_FORM_SAS_WWID:
356                 if (!sas_address)
357                         break;
358                 rc = _scsih_srch_boot_sas_address(
359                     sas_address, &boot_device->SasWwid);
360                 break;
361         case MPI2_BIOSPAGE2_FORM_ENCLOSURE_SLOT:
362                 if (!enclosure_logical_id)
363                         break;
364                 rc = _scsih_srch_boot_encl_slot(
365                     enclosure_logical_id,
366                     slot, &boot_device->EnclosureSlot);
367                 break;
368         case MPI2_BIOSPAGE2_FORM_DEVICE_NAME:
369                 if (!device_name)
370                         break;
371                 rc = _scsih_srch_boot_device_name(
372                     device_name, &boot_device->DeviceName);
373                 break;
374         case MPI2_BIOSPAGE2_FORM_NO_DEVICE_SPECIFIED:
375                 break;
376         }
377
378         return rc;
379 }
380
381 /**
382  * _scsih_get_sas_address - set the sas_address for given device handle
383  * @handle: device handle
384  * @sas_address: sas address
385  *
386  * Returns 0 success, non-zero when failure
387  */
388 static int
389 _scsih_get_sas_address(struct MPT3SAS_ADAPTER *ioc, u16 handle,
390         u64 *sas_address)
391 {
392         Mpi2SasDevicePage0_t sas_device_pg0;
393         Mpi2ConfigReply_t mpi_reply;
394         u32 ioc_status;
395
396         *sas_address = 0;
397
398         if (handle <= ioc->sas_hba.num_phys) {
399                 *sas_address = ioc->sas_hba.sas_address;
400                 return 0;
401         }
402
403         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
404             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
405                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n", ioc->name,
406                 __FILE__, __LINE__, __func__);
407                 return -ENXIO;
408         }
409
410         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
411         if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
412                 *sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
413                 return 0;
414         }
415
416         /* we hit this becuase the given parent handle doesn't exist */
417         if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)
418                 return -ENXIO;
419
420         /* else error case */
421         pr_err(MPT3SAS_FMT
422                 "handle(0x%04x), ioc_status(0x%04x), failure at %s:%d/%s()!\n",
423                 ioc->name, handle, ioc_status,
424              __FILE__, __LINE__, __func__);
425         return -EIO;
426 }
427
428 /**
429  * _scsih_determine_boot_device - determine boot device.
430  * @ioc: per adapter object
431  * @device: either sas_device or raid_device object
432  * @is_raid: [flag] 1 = raid object, 0 = sas object
433  *
434  * Determines whether this device should be first reported device to
435  * to scsi-ml or sas transport, this purpose is for persistent boot device.
436  * There are primary, alternate, and current entries in bios page 2. The order
437  * priority is primary, alternate, then current.  This routine saves
438  * the corresponding device object and is_raid flag in the ioc object.
439  * The saved data to be used later in _scsih_probe_boot_devices().
440  */
441 static void
442 _scsih_determine_boot_device(struct MPT3SAS_ADAPTER *ioc,
443         void *device, u8 is_raid)
444 {
445         struct _sas_device *sas_device;
446         struct _raid_device *raid_device;
447         u64 sas_address;
448         u64 device_name;
449         u64 enclosure_logical_id;
450         u16 slot;
451
452          /* only process this function when driver loads */
453         if (!ioc->is_driver_loading)
454                 return;
455
456          /* no Bios, return immediately */
457         if (!ioc->bios_pg3.BiosVersion)
458                 return;
459
460         if (!is_raid) {
461                 sas_device = device;
462                 sas_address = sas_device->sas_address;
463                 device_name = sas_device->device_name;
464                 enclosure_logical_id = sas_device->enclosure_logical_id;
465                 slot = sas_device->slot;
466         } else {
467                 raid_device = device;
468                 sas_address = raid_device->wwid;
469                 device_name = 0;
470                 enclosure_logical_id = 0;
471                 slot = 0;
472         }
473
474         if (!ioc->req_boot_device.device) {
475                 if (_scsih_is_boot_device(sas_address, device_name,
476                     enclosure_logical_id, slot,
477                     (ioc->bios_pg2.ReqBootDeviceForm &
478                     MPI2_BIOSPAGE2_FORM_MASK),
479                     &ioc->bios_pg2.RequestedBootDevice)) {
480                         dinitprintk(ioc, pr_info(MPT3SAS_FMT
481                            "%s: req_boot_device(0x%016llx)\n",
482                             ioc->name, __func__,
483                             (unsigned long long)sas_address));
484                         ioc->req_boot_device.device = device;
485                         ioc->req_boot_device.is_raid = is_raid;
486                 }
487         }
488
489         if (!ioc->req_alt_boot_device.device) {
490                 if (_scsih_is_boot_device(sas_address, device_name,
491                     enclosure_logical_id, slot,
492                     (ioc->bios_pg2.ReqAltBootDeviceForm &
493                     MPI2_BIOSPAGE2_FORM_MASK),
494                     &ioc->bios_pg2.RequestedAltBootDevice)) {
495                         dinitprintk(ioc, pr_info(MPT3SAS_FMT
496                            "%s: req_alt_boot_device(0x%016llx)\n",
497                             ioc->name, __func__,
498                             (unsigned long long)sas_address));
499                         ioc->req_alt_boot_device.device = device;
500                         ioc->req_alt_boot_device.is_raid = is_raid;
501                 }
502         }
503
504         if (!ioc->current_boot_device.device) {
505                 if (_scsih_is_boot_device(sas_address, device_name,
506                     enclosure_logical_id, slot,
507                     (ioc->bios_pg2.CurrentBootDeviceForm &
508                     MPI2_BIOSPAGE2_FORM_MASK),
509                     &ioc->bios_pg2.CurrentBootDevice)) {
510                         dinitprintk(ioc, pr_info(MPT3SAS_FMT
511                            "%s: current_boot_device(0x%016llx)\n",
512                             ioc->name, __func__,
513                             (unsigned long long)sas_address));
514                         ioc->current_boot_device.device = device;
515                         ioc->current_boot_device.is_raid = is_raid;
516                 }
517         }
518 }
519
520 /**
521  * mpt3sas_scsih_sas_device_find_by_sas_address - sas device search
522  * @ioc: per adapter object
523  * @sas_address: sas address
524  * Context: Calling function should acquire ioc->sas_device_lock
525  *
526  * This searches for sas_device based on sas_address, then return sas_device
527  * object.
528  */
529 struct _sas_device *
530 mpt3sas_scsih_sas_device_find_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
531         u64 sas_address)
532 {
533         struct _sas_device *sas_device;
534
535         list_for_each_entry(sas_device, &ioc->sas_device_list, list)
536                 if (sas_device->sas_address == sas_address)
537                         return sas_device;
538
539         list_for_each_entry(sas_device, &ioc->sas_device_init_list, list)
540                 if (sas_device->sas_address == sas_address)
541                         return sas_device;
542
543         return NULL;
544 }
545
546 /**
547  * _scsih_sas_device_find_by_handle - sas device search
548  * @ioc: per adapter object
549  * @handle: sas device handle (assigned by firmware)
550  * Context: Calling function should acquire ioc->sas_device_lock
551  *
552  * This searches for sas_device based on sas_address, then return sas_device
553  * object.
554  */
555 static struct _sas_device *
556 _scsih_sas_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
557 {
558         struct _sas_device *sas_device;
559
560         list_for_each_entry(sas_device, &ioc->sas_device_list, list)
561                 if (sas_device->handle == handle)
562                         return sas_device;
563
564         list_for_each_entry(sas_device, &ioc->sas_device_init_list, list)
565                 if (sas_device->handle == handle)
566                         return sas_device;
567
568         return NULL;
569 }
570
571 /**
572  * _scsih_sas_device_remove - remove sas_device from list.
573  * @ioc: per adapter object
574  * @sas_device: the sas_device object
575  * Context: This function will acquire ioc->sas_device_lock.
576  *
577  * Removing object and freeing associated memory from the ioc->sas_device_list.
578  */
579 static void
580 _scsih_sas_device_remove(struct MPT3SAS_ADAPTER *ioc,
581         struct _sas_device *sas_device)
582 {
583         unsigned long flags;
584
585         if (!sas_device)
586                 return;
587
588         spin_lock_irqsave(&ioc->sas_device_lock, flags);
589         list_del(&sas_device->list);
590         kfree(sas_device);
591         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
592 }
593
594 /**
595  * _scsih_device_remove_by_handle - removing device object by handle
596  * @ioc: per adapter object
597  * @handle: device handle
598  *
599  * Return nothing.
600  */
601 static void
602 _scsih_device_remove_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
603 {
604         struct _sas_device *sas_device;
605         unsigned long flags;
606
607         if (ioc->shost_recovery)
608                 return;
609
610         spin_lock_irqsave(&ioc->sas_device_lock, flags);
611         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
612         if (sas_device)
613                 list_del(&sas_device->list);
614         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
615         if (sas_device)
616                 _scsih_remove_device(ioc, sas_device);
617 }
618
619 /**
620  * mpt3sas_device_remove_by_sas_address - removing device object by sas address
621  * @ioc: per adapter object
622  * @sas_address: device sas_address
623  *
624  * Return nothing.
625  */
626 void
627 mpt3sas_device_remove_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
628         u64 sas_address)
629 {
630         struct _sas_device *sas_device;
631         unsigned long flags;
632
633         if (ioc->shost_recovery)
634                 return;
635
636         spin_lock_irqsave(&ioc->sas_device_lock, flags);
637         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
638             sas_address);
639         if (sas_device)
640                 list_del(&sas_device->list);
641         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
642         if (sas_device)
643                 _scsih_remove_device(ioc, sas_device);
644 }
645
646 /**
647  * _scsih_sas_device_add - insert sas_device to the list.
648  * @ioc: per adapter object
649  * @sas_device: the sas_device object
650  * Context: This function will acquire ioc->sas_device_lock.
651  *
652  * Adding new object to the ioc->sas_device_list.
653  */
654 static void
655 _scsih_sas_device_add(struct MPT3SAS_ADAPTER *ioc,
656         struct _sas_device *sas_device)
657 {
658         unsigned long flags;
659
660         dewtprintk(ioc, pr_info(MPT3SAS_FMT
661                 "%s: handle(0x%04x), sas_addr(0x%016llx)\n",
662                 ioc->name, __func__, sas_device->handle,
663                 (unsigned long long)sas_device->sas_address));
664
665         spin_lock_irqsave(&ioc->sas_device_lock, flags);
666         list_add_tail(&sas_device->list, &ioc->sas_device_list);
667         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
668
669         if (!mpt3sas_transport_port_add(ioc, sas_device->handle,
670              sas_device->sas_address_parent)) {
671                 _scsih_sas_device_remove(ioc, sas_device);
672         } else if (!sas_device->starget) {
673                 /*
674                  * When asyn scanning is enabled, its not possible to remove
675                  * devices while scanning is turned on due to an oops in
676                  * scsi_sysfs_add_sdev()->add_device()->sysfs_addrm_start()
677                  */
678                 if (!ioc->is_driver_loading) {
679                         mpt3sas_transport_port_remove(ioc,
680                             sas_device->sas_address,
681                             sas_device->sas_address_parent);
682                         _scsih_sas_device_remove(ioc, sas_device);
683                 }
684         }
685 }
686
687 /**
688  * _scsih_sas_device_init_add - insert sas_device to the list.
689  * @ioc: per adapter object
690  * @sas_device: the sas_device object
691  * Context: This function will acquire ioc->sas_device_lock.
692  *
693  * Adding new object at driver load time to the ioc->sas_device_init_list.
694  */
695 static void
696 _scsih_sas_device_init_add(struct MPT3SAS_ADAPTER *ioc,
697         struct _sas_device *sas_device)
698 {
699         unsigned long flags;
700
701         dewtprintk(ioc, pr_info(MPT3SAS_FMT
702                 "%s: handle(0x%04x), sas_addr(0x%016llx)\n", ioc->name,
703                 __func__, sas_device->handle,
704                 (unsigned long long)sas_device->sas_address));
705
706         spin_lock_irqsave(&ioc->sas_device_lock, flags);
707         list_add_tail(&sas_device->list, &ioc->sas_device_init_list);
708         _scsih_determine_boot_device(ioc, sas_device, 0);
709         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
710 }
711
712 /**
713  * _scsih_raid_device_find_by_id - raid device search
714  * @ioc: per adapter object
715  * @id: sas device target id
716  * @channel: sas device channel
717  * Context: Calling function should acquire ioc->raid_device_lock
718  *
719  * This searches for raid_device based on target id, then return raid_device
720  * object.
721  */
722 static struct _raid_device *
723 _scsih_raid_device_find_by_id(struct MPT3SAS_ADAPTER *ioc, int id, int channel)
724 {
725         struct _raid_device *raid_device, *r;
726
727         r = NULL;
728         list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
729                 if (raid_device->id == id && raid_device->channel == channel) {
730                         r = raid_device;
731                         goto out;
732                 }
733         }
734
735  out:
736         return r;
737 }
738
739 /**
740  * _scsih_raid_device_find_by_handle - raid device search
741  * @ioc: per adapter object
742  * @handle: sas device handle (assigned by firmware)
743  * Context: Calling function should acquire ioc->raid_device_lock
744  *
745  * This searches for raid_device based on handle, then return raid_device
746  * object.
747  */
748 static struct _raid_device *
749 _scsih_raid_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
750 {
751         struct _raid_device *raid_device, *r;
752
753         r = NULL;
754         list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
755                 if (raid_device->handle != handle)
756                         continue;
757                 r = raid_device;
758                 goto out;
759         }
760
761  out:
762         return r;
763 }
764
765 /**
766  * _scsih_raid_device_find_by_wwid - raid device search
767  * @ioc: per adapter object
768  * @handle: sas device handle (assigned by firmware)
769  * Context: Calling function should acquire ioc->raid_device_lock
770  *
771  * This searches for raid_device based on wwid, then return raid_device
772  * object.
773  */
774 static struct _raid_device *
775 _scsih_raid_device_find_by_wwid(struct MPT3SAS_ADAPTER *ioc, u64 wwid)
776 {
777         struct _raid_device *raid_device, *r;
778
779         r = NULL;
780         list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
781                 if (raid_device->wwid != wwid)
782                         continue;
783                 r = raid_device;
784                 goto out;
785         }
786
787  out:
788         return r;
789 }
790
791 /**
792  * _scsih_raid_device_add - add raid_device object
793  * @ioc: per adapter object
794  * @raid_device: raid_device object
795  *
796  * This is added to the raid_device_list link list.
797  */
798 static void
799 _scsih_raid_device_add(struct MPT3SAS_ADAPTER *ioc,
800         struct _raid_device *raid_device)
801 {
802         unsigned long flags;
803
804         dewtprintk(ioc, pr_info(MPT3SAS_FMT
805                 "%s: handle(0x%04x), wwid(0x%016llx)\n", ioc->name, __func__,
806             raid_device->handle, (unsigned long long)raid_device->wwid));
807
808         spin_lock_irqsave(&ioc->raid_device_lock, flags);
809         list_add_tail(&raid_device->list, &ioc->raid_device_list);
810         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
811 }
812
813 /**
814  * _scsih_raid_device_remove - delete raid_device object
815  * @ioc: per adapter object
816  * @raid_device: raid_device object
817  *
818  */
819 static void
820 _scsih_raid_device_remove(struct MPT3SAS_ADAPTER *ioc,
821         struct _raid_device *raid_device)
822 {
823         unsigned long flags;
824
825         spin_lock_irqsave(&ioc->raid_device_lock, flags);
826         list_del(&raid_device->list);
827         kfree(raid_device);
828         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
829 }
830
831 /**
832  * mpt3sas_scsih_expander_find_by_handle - expander device search
833  * @ioc: per adapter object
834  * @handle: expander handle (assigned by firmware)
835  * Context: Calling function should acquire ioc->sas_device_lock
836  *
837  * This searches for expander device based on handle, then returns the
838  * sas_node object.
839  */
840 struct _sas_node *
841 mpt3sas_scsih_expander_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle)
842 {
843         struct _sas_node *sas_expander, *r;
844
845         r = NULL;
846         list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
847                 if (sas_expander->handle != handle)
848                         continue;
849                 r = sas_expander;
850                 goto out;
851         }
852  out:
853         return r;
854 }
855
856 /**
857  * mpt3sas_scsih_expander_find_by_sas_address - expander device search
858  * @ioc: per adapter object
859  * @sas_address: sas address
860  * Context: Calling function should acquire ioc->sas_node_lock.
861  *
862  * This searches for expander device based on sas_address, then returns the
863  * sas_node object.
864  */
865 struct _sas_node *
866 mpt3sas_scsih_expander_find_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
867         u64 sas_address)
868 {
869         struct _sas_node *sas_expander, *r;
870
871         r = NULL;
872         list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
873                 if (sas_expander->sas_address != sas_address)
874                         continue;
875                 r = sas_expander;
876                 goto out;
877         }
878  out:
879         return r;
880 }
881
882 /**
883  * _scsih_expander_node_add - insert expander device to the list.
884  * @ioc: per adapter object
885  * @sas_expander: the sas_device object
886  * Context: This function will acquire ioc->sas_node_lock.
887  *
888  * Adding new object to the ioc->sas_expander_list.
889  *
890  * Return nothing.
891  */
892 static void
893 _scsih_expander_node_add(struct MPT3SAS_ADAPTER *ioc,
894         struct _sas_node *sas_expander)
895 {
896         unsigned long flags;
897
898         spin_lock_irqsave(&ioc->sas_node_lock, flags);
899         list_add_tail(&sas_expander->list, &ioc->sas_expander_list);
900         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
901 }
902
903 /**
904  * _scsih_is_end_device - determines if device is an end device
905  * @device_info: bitfield providing information about the device.
906  * Context: none
907  *
908  * Returns 1 if end device.
909  */
910 static int
911 _scsih_is_end_device(u32 device_info)
912 {
913         if (device_info & MPI2_SAS_DEVICE_INFO_END_DEVICE &&
914                 ((device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) |
915                 (device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET) |
916                 (device_info & MPI2_SAS_DEVICE_INFO_SATA_DEVICE)))
917                 return 1;
918         else
919                 return 0;
920 }
921
922 /**
923  * _scsih_scsi_lookup_get - returns scmd entry
924  * @ioc: per adapter object
925  * @smid: system request message index
926  *
927  * Returns the smid stored scmd pointer.
928  */
929 static struct scsi_cmnd *
930 _scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, u16 smid)
931 {
932         return ioc->scsi_lookup[smid - 1].scmd;
933 }
934
935 /**
936  * _scsih_scsi_lookup_get_clear - returns scmd entry
937  * @ioc: per adapter object
938  * @smid: system request message index
939  *
940  * Returns the smid stored scmd pointer.
941  * Then will derefrence the stored scmd pointer.
942  */
943 static inline struct scsi_cmnd *
944 _scsih_scsi_lookup_get_clear(struct MPT3SAS_ADAPTER *ioc, u16 smid)
945 {
946         unsigned long flags;
947         struct scsi_cmnd *scmd;
948
949         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
950         scmd = ioc->scsi_lookup[smid - 1].scmd;
951         ioc->scsi_lookup[smid - 1].scmd = NULL;
952         spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
953
954         return scmd;
955 }
956
957 /**
958  * _scsih_scsi_lookup_find_by_scmd - scmd lookup
959  * @ioc: per adapter object
960  * @smid: system request message index
961  * @scmd: pointer to scsi command object
962  * Context: This function will acquire ioc->scsi_lookup_lock.
963  *
964  * This will search for a scmd pointer in the scsi_lookup array,
965  * returning the revelent smid.  A returned value of zero means invalid.
966  */
967 static u16
968 _scsih_scsi_lookup_find_by_scmd(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd
969         *scmd)
970 {
971         u16 smid;
972         unsigned long   flags;
973         int i;
974
975         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
976         smid = 0;
977         for (i = 0; i < ioc->scsiio_depth; i++) {
978                 if (ioc->scsi_lookup[i].scmd == scmd) {
979                         smid = ioc->scsi_lookup[i].smid;
980                         goto out;
981                 }
982         }
983  out:
984         spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
985         return smid;
986 }
987
988 /**
989  * _scsih_scsi_lookup_find_by_target - search for matching channel:id
990  * @ioc: per adapter object
991  * @id: target id
992  * @channel: channel
993  * Context: This function will acquire ioc->scsi_lookup_lock.
994  *
995  * This will search for a matching channel:id in the scsi_lookup array,
996  * returning 1 if found.
997  */
998 static u8
999 _scsih_scsi_lookup_find_by_target(struct MPT3SAS_ADAPTER *ioc, int id,
1000         int channel)
1001 {
1002         u8 found;
1003         unsigned long   flags;
1004         int i;
1005
1006         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
1007         found = 0;
1008         for (i = 0 ; i < ioc->scsiio_depth; i++) {
1009                 if (ioc->scsi_lookup[i].scmd &&
1010                     (ioc->scsi_lookup[i].scmd->device->id == id &&
1011                     ioc->scsi_lookup[i].scmd->device->channel == channel)) {
1012                         found = 1;
1013                         goto out;
1014                 }
1015         }
1016  out:
1017         spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
1018         return found;
1019 }
1020
1021 /**
1022  * _scsih_scsi_lookup_find_by_lun - search for matching channel:id:lun
1023  * @ioc: per adapter object
1024  * @id: target id
1025  * @lun: lun number
1026  * @channel: channel
1027  * Context: This function will acquire ioc->scsi_lookup_lock.
1028  *
1029  * This will search for a matching channel:id:lun in the scsi_lookup array,
1030  * returning 1 if found.
1031  */
1032 static u8
1033 _scsih_scsi_lookup_find_by_lun(struct MPT3SAS_ADAPTER *ioc, int id,
1034         unsigned int lun, int channel)
1035 {
1036         u8 found;
1037         unsigned long   flags;
1038         int i;
1039
1040         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
1041         found = 0;
1042         for (i = 0 ; i < ioc->scsiio_depth; i++) {
1043                 if (ioc->scsi_lookup[i].scmd &&
1044                     (ioc->scsi_lookup[i].scmd->device->id == id &&
1045                     ioc->scsi_lookup[i].scmd->device->channel == channel &&
1046                     ioc->scsi_lookup[i].scmd->device->lun == lun)) {
1047                         found = 1;
1048                         goto out;
1049                 }
1050         }
1051  out:
1052         spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
1053         return found;
1054 }
1055
1056
1057 static void
1058 _scsih_adjust_queue_depth(struct scsi_device *sdev, int qdepth)
1059 {
1060         struct Scsi_Host *shost = sdev->host;
1061         int max_depth;
1062         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1063         struct MPT3SAS_DEVICE *sas_device_priv_data;
1064         struct MPT3SAS_TARGET *sas_target_priv_data;
1065         struct _sas_device *sas_device;
1066         unsigned long flags;
1067
1068         max_depth = shost->can_queue;
1069
1070         /* limit max device queue for SATA to 32 */
1071         sas_device_priv_data = sdev->hostdata;
1072         if (!sas_device_priv_data)
1073                 goto not_sata;
1074         sas_target_priv_data = sas_device_priv_data->sas_target;
1075         if (!sas_target_priv_data)
1076                 goto not_sata;
1077         if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME))
1078                 goto not_sata;
1079         spin_lock_irqsave(&ioc->sas_device_lock, flags);
1080         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1081            sas_device_priv_data->sas_target->sas_address);
1082         if (sas_device && sas_device->device_info &
1083             MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
1084                 max_depth = MPT3SAS_SATA_QUEUE_DEPTH;
1085         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1086
1087  not_sata:
1088
1089         if (!sdev->tagged_supported)
1090                 max_depth = 1;
1091         if (qdepth > max_depth)
1092                 qdepth = max_depth;
1093         scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
1094 }
1095
1096 /**
1097  * _scsih_change_queue_depth - setting device queue depth
1098  * @sdev: scsi device struct
1099  * @qdepth: requested queue depth
1100  * @reason: SCSI_QDEPTH_DEFAULT/SCSI_QDEPTH_QFULL/SCSI_QDEPTH_RAMP_UP
1101  * (see include/scsi/scsi_host.h for definition)
1102  *
1103  * Returns queue depth.
1104  */
1105 static int
1106 _scsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)
1107 {
1108         if (reason == SCSI_QDEPTH_DEFAULT || reason == SCSI_QDEPTH_RAMP_UP)
1109                 _scsih_adjust_queue_depth(sdev, qdepth);
1110         else if (reason == SCSI_QDEPTH_QFULL)
1111                 scsi_track_queue_full(sdev, qdepth);
1112         else
1113                 return -EOPNOTSUPP;
1114
1115         if (sdev->inquiry_len > 7)
1116                 sdev_printk(KERN_INFO, sdev, "qdepth(%d), tagged(%d), " \
1117                 "simple(%d), ordered(%d), scsi_level(%d), cmd_que(%d)\n",
1118                 sdev->queue_depth, sdev->tagged_supported, sdev->simple_tags,
1119                 sdev->ordered_tags, sdev->scsi_level,
1120                 (sdev->inquiry[7] & 2) >> 1);
1121
1122         return sdev->queue_depth;
1123 }
1124
1125 /**
1126  * _scsih_change_queue_type - changing device queue tag type
1127  * @sdev: scsi device struct
1128  * @tag_type: requested tag type
1129  *
1130  * Returns queue tag type.
1131  */
1132 static int
1133 _scsih_change_queue_type(struct scsi_device *sdev, int tag_type)
1134 {
1135         if (sdev->tagged_supported) {
1136                 scsi_set_tag_type(sdev, tag_type);
1137                 if (tag_type)
1138                         scsi_activate_tcq(sdev, sdev->queue_depth);
1139                 else
1140                         scsi_deactivate_tcq(sdev, sdev->queue_depth);
1141         } else
1142                 tag_type = 0;
1143
1144         return tag_type;
1145 }
1146
1147
1148 /**
1149  * _scsih_target_alloc - target add routine
1150  * @starget: scsi target struct
1151  *
1152  * Returns 0 if ok. Any other return is assumed to be an error and
1153  * the device is ignored.
1154  */
1155 static int
1156 _scsih_target_alloc(struct scsi_target *starget)
1157 {
1158         struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1159         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1160         struct MPT3SAS_TARGET *sas_target_priv_data;
1161         struct _sas_device *sas_device;
1162         struct _raid_device *raid_device;
1163         unsigned long flags;
1164         struct sas_rphy *rphy;
1165
1166         sas_target_priv_data = kzalloc(sizeof(*sas_target_priv_data),
1167                                        GFP_KERNEL);
1168         if (!sas_target_priv_data)
1169                 return -ENOMEM;
1170
1171         starget->hostdata = sas_target_priv_data;
1172         sas_target_priv_data->starget = starget;
1173         sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
1174
1175         /* RAID volumes */
1176         if (starget->channel == RAID_CHANNEL) {
1177                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
1178                 raid_device = _scsih_raid_device_find_by_id(ioc, starget->id,
1179                     starget->channel);
1180                 if (raid_device) {
1181                         sas_target_priv_data->handle = raid_device->handle;
1182                         sas_target_priv_data->sas_address = raid_device->wwid;
1183                         sas_target_priv_data->flags |= MPT_TARGET_FLAGS_VOLUME;
1184                         raid_device->starget = starget;
1185                 }
1186                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1187                 return 0;
1188         }
1189
1190         /* sas/sata devices */
1191         spin_lock_irqsave(&ioc->sas_device_lock, flags);
1192         rphy = dev_to_rphy(starget->dev.parent);
1193         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1194            rphy->identify.sas_address);
1195
1196         if (sas_device) {
1197                 sas_target_priv_data->handle = sas_device->handle;
1198                 sas_target_priv_data->sas_address = sas_device->sas_address;
1199                 sas_device->starget = starget;
1200                 sas_device->id = starget->id;
1201                 sas_device->channel = starget->channel;
1202                 if (test_bit(sas_device->handle, ioc->pd_handles))
1203                         sas_target_priv_data->flags |=
1204                             MPT_TARGET_FLAGS_RAID_COMPONENT;
1205                 if (sas_device->fast_path)
1206                         sas_target_priv_data->flags |= MPT_TARGET_FASTPATH_IO;
1207         }
1208         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1209
1210         return 0;
1211 }
1212
1213 /**
1214  * _scsih_target_destroy - target destroy routine
1215  * @starget: scsi target struct
1216  *
1217  * Returns nothing.
1218  */
1219 static void
1220 _scsih_target_destroy(struct scsi_target *starget)
1221 {
1222         struct Scsi_Host *shost = dev_to_shost(&starget->dev);
1223         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1224         struct MPT3SAS_TARGET *sas_target_priv_data;
1225         struct _sas_device *sas_device;
1226         struct _raid_device *raid_device;
1227         unsigned long flags;
1228         struct sas_rphy *rphy;
1229
1230         sas_target_priv_data = starget->hostdata;
1231         if (!sas_target_priv_data)
1232                 return;
1233
1234         if (starget->channel == RAID_CHANNEL) {
1235                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
1236                 raid_device = _scsih_raid_device_find_by_id(ioc, starget->id,
1237                     starget->channel);
1238                 if (raid_device) {
1239                         raid_device->starget = NULL;
1240                         raid_device->sdev = NULL;
1241                 }
1242                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1243                 goto out;
1244         }
1245
1246         spin_lock_irqsave(&ioc->sas_device_lock, flags);
1247         rphy = dev_to_rphy(starget->dev.parent);
1248         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1249            rphy->identify.sas_address);
1250         if (sas_device && (sas_device->starget == starget) &&
1251             (sas_device->id == starget->id) &&
1252             (sas_device->channel == starget->channel))
1253                 sas_device->starget = NULL;
1254
1255         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1256
1257  out:
1258         kfree(sas_target_priv_data);
1259         starget->hostdata = NULL;
1260 }
1261
1262 /**
1263  * _scsih_slave_alloc - device add routine
1264  * @sdev: scsi device struct
1265  *
1266  * Returns 0 if ok. Any other return is assumed to be an error and
1267  * the device is ignored.
1268  */
1269 static int
1270 _scsih_slave_alloc(struct scsi_device *sdev)
1271 {
1272         struct Scsi_Host *shost;
1273         struct MPT3SAS_ADAPTER *ioc;
1274         struct MPT3SAS_TARGET *sas_target_priv_data;
1275         struct MPT3SAS_DEVICE *sas_device_priv_data;
1276         struct scsi_target *starget;
1277         struct _raid_device *raid_device;
1278         struct _sas_device *sas_device;
1279         unsigned long flags;
1280
1281         sas_device_priv_data = kzalloc(sizeof(*sas_device_priv_data),
1282                                        GFP_KERNEL);
1283         if (!sas_device_priv_data)
1284                 return -ENOMEM;
1285
1286         sas_device_priv_data->lun = sdev->lun;
1287         sas_device_priv_data->flags = MPT_DEVICE_FLAGS_INIT;
1288
1289         starget = scsi_target(sdev);
1290         sas_target_priv_data = starget->hostdata;
1291         sas_target_priv_data->num_luns++;
1292         sas_device_priv_data->sas_target = sas_target_priv_data;
1293         sdev->hostdata = sas_device_priv_data;
1294         if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT))
1295                 sdev->no_uld_attach = 1;
1296
1297         shost = dev_to_shost(&starget->dev);
1298         ioc = shost_priv(shost);
1299         if (starget->channel == RAID_CHANNEL) {
1300                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
1301                 raid_device = _scsih_raid_device_find_by_id(ioc,
1302                     starget->id, starget->channel);
1303                 if (raid_device)
1304                         raid_device->sdev = sdev; /* raid is single lun */
1305                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1306         }
1307
1308         if (!(sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)) {
1309                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
1310                 sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1311                                         sas_target_priv_data->sas_address);
1312                 if (sas_device && (sas_device->starget == NULL)) {
1313                         sdev_printk(KERN_INFO, sdev,
1314                         "%s : sas_device->starget set to starget @ %d\n",
1315                                 __func__, __LINE__);
1316                         sas_device->starget = starget;
1317                 }
1318                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1319         }
1320
1321         return 0;
1322 }
1323
1324 /**
1325  * _scsih_slave_destroy - device destroy routine
1326  * @sdev: scsi device struct
1327  *
1328  * Returns nothing.
1329  */
1330 static void
1331 _scsih_slave_destroy(struct scsi_device *sdev)
1332 {
1333         struct MPT3SAS_TARGET *sas_target_priv_data;
1334         struct scsi_target *starget;
1335         struct Scsi_Host *shost;
1336         struct MPT3SAS_ADAPTER *ioc;
1337         struct _sas_device *sas_device;
1338         unsigned long flags;
1339
1340         if (!sdev->hostdata)
1341                 return;
1342
1343         starget = scsi_target(sdev);
1344         sas_target_priv_data = starget->hostdata;
1345         sas_target_priv_data->num_luns--;
1346
1347         shost = dev_to_shost(&starget->dev);
1348         ioc = shost_priv(shost);
1349
1350         if (!(sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)) {
1351                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
1352                 sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1353                    sas_target_priv_data->sas_address);
1354                 if (sas_device && !sas_target_priv_data->num_luns)
1355                         sas_device->starget = NULL;
1356                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1357         }
1358
1359         kfree(sdev->hostdata);
1360         sdev->hostdata = NULL;
1361 }
1362
1363 /**
1364  * _scsih_display_sata_capabilities - sata capabilities
1365  * @ioc: per adapter object
1366  * @handle: device handle
1367  * @sdev: scsi device struct
1368  */
1369 static void
1370 _scsih_display_sata_capabilities(struct MPT3SAS_ADAPTER *ioc,
1371         u16 handle, struct scsi_device *sdev)
1372 {
1373         Mpi2ConfigReply_t mpi_reply;
1374         Mpi2SasDevicePage0_t sas_device_pg0;
1375         u32 ioc_status;
1376         u16 flags;
1377         u32 device_info;
1378
1379         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
1380             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
1381                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
1382                     ioc->name, __FILE__, __LINE__, __func__);
1383                 return;
1384         }
1385
1386         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
1387             MPI2_IOCSTATUS_MASK;
1388         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
1389                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
1390                     ioc->name, __FILE__, __LINE__, __func__);
1391                 return;
1392         }
1393
1394         flags = le16_to_cpu(sas_device_pg0.Flags);
1395         device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
1396
1397         sdev_printk(KERN_INFO, sdev,
1398             "atapi(%s), ncq(%s), asyn_notify(%s), smart(%s), fua(%s), "
1399             "sw_preserve(%s)\n",
1400             (device_info & MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE) ? "y" : "n",
1401             (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED) ? "y" : "n",
1402             (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY) ? "y" :
1403             "n",
1404             (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED) ? "y" : "n",
1405             (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED) ? "y" : "n",
1406             (flags & MPI2_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE) ? "y" : "n");
1407 }
1408
1409 /*
1410  * raid transport support -
1411  * Enabled for SLES11 and newer, in older kernels the driver will panic when
1412  * unloading the driver followed by a load - I beleive that the subroutine
1413  * raid_class_release() is not cleaning up properly.
1414  */
1415
1416 /**
1417  * _scsih_is_raid - return boolean indicating device is raid volume
1418  * @dev the device struct object
1419  */
1420 static int
1421 _scsih_is_raid(struct device *dev)
1422 {
1423         struct scsi_device *sdev = to_scsi_device(dev);
1424
1425         return (sdev->channel == RAID_CHANNEL) ? 1 : 0;
1426 }
1427
1428 /**
1429  * _scsih_get_resync - get raid volume resync percent complete
1430  * @dev the device struct object
1431  */
1432 static void
1433 _scsih_get_resync(struct device *dev)
1434 {
1435         struct scsi_device *sdev = to_scsi_device(dev);
1436         struct MPT3SAS_ADAPTER *ioc = shost_priv(sdev->host);
1437         static struct _raid_device *raid_device;
1438         unsigned long flags;
1439         Mpi2RaidVolPage0_t vol_pg0;
1440         Mpi2ConfigReply_t mpi_reply;
1441         u32 volume_status_flags;
1442         u8 percent_complete;
1443         u16 handle;
1444
1445         percent_complete = 0;
1446         handle = 0;
1447         spin_lock_irqsave(&ioc->raid_device_lock, flags);
1448         raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id,
1449             sdev->channel);
1450         if (raid_device) {
1451                 handle = raid_device->handle;
1452                 percent_complete = raid_device->percent_complete;
1453         }
1454         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1455
1456         if (!handle)
1457                 goto out;
1458
1459         if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0,
1460              MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
1461              sizeof(Mpi2RaidVolPage0_t))) {
1462                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
1463                     ioc->name, __FILE__, __LINE__, __func__);
1464                 percent_complete = 0;
1465                 goto out;
1466         }
1467
1468         volume_status_flags = le32_to_cpu(vol_pg0.VolumeStatusFlags);
1469         if (!(volume_status_flags &
1470             MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS))
1471                 percent_complete = 0;
1472
1473  out:
1474         raid_set_resync(mpt3sas_raid_template, dev, percent_complete);
1475 }
1476
1477 /**
1478  * _scsih_get_state - get raid volume level
1479  * @dev the device struct object
1480  */
1481 static void
1482 _scsih_get_state(struct device *dev)
1483 {
1484         struct scsi_device *sdev = to_scsi_device(dev);
1485         struct MPT3SAS_ADAPTER *ioc = shost_priv(sdev->host);
1486         static struct _raid_device *raid_device;
1487         unsigned long flags;
1488         Mpi2RaidVolPage0_t vol_pg0;
1489         Mpi2ConfigReply_t mpi_reply;
1490         u32 volstate;
1491         enum raid_state state = RAID_STATE_UNKNOWN;
1492         u16 handle = 0;
1493
1494         spin_lock_irqsave(&ioc->raid_device_lock, flags);
1495         raid_device = _scsih_raid_device_find_by_id(ioc, sdev->id,
1496             sdev->channel);
1497         if (raid_device)
1498                 handle = raid_device->handle;
1499         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1500
1501         if (!raid_device)
1502                 goto out;
1503
1504         if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, &vol_pg0,
1505              MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
1506              sizeof(Mpi2RaidVolPage0_t))) {
1507                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
1508                     ioc->name, __FILE__, __LINE__, __func__);
1509                 goto out;
1510         }
1511
1512         volstate = le32_to_cpu(vol_pg0.VolumeStatusFlags);
1513         if (volstate & MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) {
1514                 state = RAID_STATE_RESYNCING;
1515                 goto out;
1516         }
1517
1518         switch (vol_pg0.VolumeState) {
1519         case MPI2_RAID_VOL_STATE_OPTIMAL:
1520         case MPI2_RAID_VOL_STATE_ONLINE:
1521                 state = RAID_STATE_ACTIVE;
1522                 break;
1523         case  MPI2_RAID_VOL_STATE_DEGRADED:
1524                 state = RAID_STATE_DEGRADED;
1525                 break;
1526         case MPI2_RAID_VOL_STATE_FAILED:
1527         case MPI2_RAID_VOL_STATE_MISSING:
1528                 state = RAID_STATE_OFFLINE;
1529                 break;
1530         }
1531  out:
1532         raid_set_state(mpt3sas_raid_template, dev, state);
1533 }
1534
1535 /**
1536  * _scsih_set_level - set raid level
1537  * @sdev: scsi device struct
1538  * @volume_type: volume type
1539  */
1540 static void
1541 _scsih_set_level(struct scsi_device *sdev, u8 volume_type)
1542 {
1543         enum raid_level level = RAID_LEVEL_UNKNOWN;
1544
1545         switch (volume_type) {
1546         case MPI2_RAID_VOL_TYPE_RAID0:
1547                 level = RAID_LEVEL_0;
1548                 break;
1549         case MPI2_RAID_VOL_TYPE_RAID10:
1550                 level = RAID_LEVEL_10;
1551                 break;
1552         case MPI2_RAID_VOL_TYPE_RAID1E:
1553                 level = RAID_LEVEL_1E;
1554                 break;
1555         case MPI2_RAID_VOL_TYPE_RAID1:
1556                 level = RAID_LEVEL_1;
1557                 break;
1558         }
1559
1560         raid_set_level(mpt3sas_raid_template, &sdev->sdev_gendev, level);
1561 }
1562
1563
1564 /**
1565  * _scsih_get_volume_capabilities - volume capabilities
1566  * @ioc: per adapter object
1567  * @sas_device: the raid_device object
1568  *
1569  * Returns 0 for success, else 1
1570  */
1571 static int
1572 _scsih_get_volume_capabilities(struct MPT3SAS_ADAPTER *ioc,
1573         struct _raid_device *raid_device)
1574 {
1575         Mpi2RaidVolPage0_t *vol_pg0;
1576         Mpi2RaidPhysDiskPage0_t pd_pg0;
1577         Mpi2SasDevicePage0_t sas_device_pg0;
1578         Mpi2ConfigReply_t mpi_reply;
1579         u16 sz;
1580         u8 num_pds;
1581
1582         if ((mpt3sas_config_get_number_pds(ioc, raid_device->handle,
1583             &num_pds)) || !num_pds) {
1584                 dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1585                     "failure at %s:%d/%s()!\n", ioc->name, __FILE__, __LINE__,
1586                     __func__));
1587                 return 1;
1588         }
1589
1590         raid_device->num_pds = num_pds;
1591         sz = offsetof(Mpi2RaidVolPage0_t, PhysDisk) + (num_pds *
1592             sizeof(Mpi2RaidVol0PhysDisk_t));
1593         vol_pg0 = kzalloc(sz, GFP_KERNEL);
1594         if (!vol_pg0) {
1595                 dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1596                     "failure at %s:%d/%s()!\n", ioc->name, __FILE__, __LINE__,
1597                     __func__));
1598                 return 1;
1599         }
1600
1601         if ((mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply, vol_pg0,
1602              MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, raid_device->handle, sz))) {
1603                 dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1604                     "failure at %s:%d/%s()!\n", ioc->name, __FILE__, __LINE__,
1605                     __func__));
1606                 kfree(vol_pg0);
1607                 return 1;
1608         }
1609
1610         raid_device->volume_type = vol_pg0->VolumeType;
1611
1612         /* figure out what the underlying devices are by
1613          * obtaining the device_info bits for the 1st device
1614          */
1615         if (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
1616             &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM,
1617             vol_pg0->PhysDisk[0].PhysDiskNum))) {
1618                 if (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
1619                     &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
1620                     le16_to_cpu(pd_pg0.DevHandle)))) {
1621                         raid_device->device_info =
1622                             le32_to_cpu(sas_device_pg0.DeviceInfo);
1623                 }
1624         }
1625
1626         kfree(vol_pg0);
1627         return 0;
1628 }
1629
1630
1631
1632 /**
1633  * _scsih_enable_tlr - setting TLR flags
1634  * @ioc: per adapter object
1635  * @sdev: scsi device struct
1636  *
1637  * Enabling Transaction Layer Retries for tape devices when
1638  * vpd page 0x90 is present
1639  *
1640  */
1641 static void
1642 _scsih_enable_tlr(struct MPT3SAS_ADAPTER *ioc, struct scsi_device *sdev)
1643 {
1644
1645         /* only for TAPE */
1646         if (sdev->type != TYPE_TAPE)
1647                 return;
1648
1649         if (!(ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR))
1650                 return;
1651
1652         sas_enable_tlr(sdev);
1653         sdev_printk(KERN_INFO, sdev, "TLR %s\n",
1654             sas_is_tlr_enabled(sdev) ? "Enabled" : "Disabled");
1655         return;
1656
1657 }
1658
1659 /**
1660  * _scsih_slave_configure - device configure routine.
1661  * @sdev: scsi device struct
1662  *
1663  * Returns 0 if ok. Any other return is assumed to be an error and
1664  * the device is ignored.
1665  */
1666 static int
1667 _scsih_slave_configure(struct scsi_device *sdev)
1668 {
1669         struct Scsi_Host *shost = sdev->host;
1670         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
1671         struct MPT3SAS_DEVICE *sas_device_priv_data;
1672         struct MPT3SAS_TARGET *sas_target_priv_data;
1673         struct _sas_device *sas_device;
1674         struct _raid_device *raid_device;
1675         unsigned long flags;
1676         int qdepth;
1677         u8 ssp_target = 0;
1678         char *ds = "";
1679         char *r_level = "";
1680         u16 handle, volume_handle = 0;
1681         u64 volume_wwid = 0;
1682
1683         qdepth = 1;
1684         sas_device_priv_data = sdev->hostdata;
1685         sas_device_priv_data->configured_lun = 1;
1686         sas_device_priv_data->flags &= ~MPT_DEVICE_FLAGS_INIT;
1687         sas_target_priv_data = sas_device_priv_data->sas_target;
1688         handle = sas_target_priv_data->handle;
1689
1690         /* raid volume handling */
1691         if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME) {
1692
1693                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
1694                 raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
1695                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1696                 if (!raid_device) {
1697                         dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1698                             "failure at %s:%d/%s()!\n", ioc->name, __FILE__,
1699                             __LINE__, __func__));
1700                         return 1;
1701                 }
1702
1703                 if (_scsih_get_volume_capabilities(ioc, raid_device)) {
1704                         dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1705                             "failure at %s:%d/%s()!\n", ioc->name, __FILE__,
1706                             __LINE__, __func__));
1707                         return 1;
1708                 }
1709
1710
1711                 /* RAID Queue Depth Support
1712                  * IS volume = underlying qdepth of drive type, either
1713                  *    MPT3SAS_SAS_QUEUE_DEPTH or MPT3SAS_SATA_QUEUE_DEPTH
1714                  * IM/IME/R10 = 128 (MPT3SAS_RAID_QUEUE_DEPTH)
1715                  */
1716                 if (raid_device->device_info &
1717                     MPI2_SAS_DEVICE_INFO_SSP_TARGET) {
1718                         qdepth = MPT3SAS_SAS_QUEUE_DEPTH;
1719                         ds = "SSP";
1720                 } else {
1721                         qdepth = MPT3SAS_SATA_QUEUE_DEPTH;
1722                          if (raid_device->device_info &
1723                             MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
1724                                 ds = "SATA";
1725                         else
1726                                 ds = "STP";
1727                 }
1728
1729                 switch (raid_device->volume_type) {
1730                 case MPI2_RAID_VOL_TYPE_RAID0:
1731                         r_level = "RAID0";
1732                         break;
1733                 case MPI2_RAID_VOL_TYPE_RAID1E:
1734                         qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
1735                         if (ioc->manu_pg10.OEMIdentifier &&
1736                             (le32_to_cpu(ioc->manu_pg10.GenericFlags0) &
1737                             MFG10_GF0_R10_DISPLAY) &&
1738                             !(raid_device->num_pds % 2))
1739                                 r_level = "RAID10";
1740                         else
1741                                 r_level = "RAID1E";
1742                         break;
1743                 case MPI2_RAID_VOL_TYPE_RAID1:
1744                         qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
1745                         r_level = "RAID1";
1746                         break;
1747                 case MPI2_RAID_VOL_TYPE_RAID10:
1748                         qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
1749                         r_level = "RAID10";
1750                         break;
1751                 case MPI2_RAID_VOL_TYPE_UNKNOWN:
1752                 default:
1753                         qdepth = MPT3SAS_RAID_QUEUE_DEPTH;
1754                         r_level = "RAIDX";
1755                         break;
1756                 }
1757
1758                 sdev_printk(KERN_INFO, sdev,
1759                         "%s: handle(0x%04x), wwid(0x%016llx), pd_count(%d), type(%s)\n",
1760                          r_level, raid_device->handle,
1761                          (unsigned long long)raid_device->wwid,
1762                          raid_device->num_pds, ds);
1763
1764
1765                 _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT);
1766
1767 /* raid transport support */
1768                 _scsih_set_level(sdev, raid_device->volume_type);
1769                 return 0;
1770         }
1771
1772         /* non-raid handling */
1773         if (sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
1774                 if (mpt3sas_config_get_volume_handle(ioc, handle,
1775                     &volume_handle)) {
1776                         dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1777                             "failure at %s:%d/%s()!\n", ioc->name,
1778                             __FILE__, __LINE__, __func__));
1779                         return 1;
1780                 }
1781                 if (volume_handle && mpt3sas_config_get_volume_wwid(ioc,
1782                     volume_handle, &volume_wwid)) {
1783                         dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1784                             "failure at %s:%d/%s()!\n", ioc->name,
1785                             __FILE__, __LINE__, __func__));
1786                         return 1;
1787                 }
1788         }
1789
1790         spin_lock_irqsave(&ioc->sas_device_lock, flags);
1791         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
1792            sas_device_priv_data->sas_target->sas_address);
1793         if (!sas_device) {
1794                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1795                 dfailprintk(ioc, pr_warn(MPT3SAS_FMT
1796                     "failure at %s:%d/%s()!\n", ioc->name, __FILE__, __LINE__,
1797                     __func__));
1798                 return 1;
1799         }
1800
1801         sas_device->volume_handle = volume_handle;
1802         sas_device->volume_wwid = volume_wwid;
1803         if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_SSP_TARGET) {
1804                 qdepth = MPT3SAS_SAS_QUEUE_DEPTH;
1805                 ssp_target = 1;
1806                 ds = "SSP";
1807         } else {
1808                 qdepth = MPT3SAS_SATA_QUEUE_DEPTH;
1809                 if (sas_device->device_info & MPI2_SAS_DEVICE_INFO_STP_TARGET)
1810                         ds = "STP";
1811                 else if (sas_device->device_info &
1812                     MPI2_SAS_DEVICE_INFO_SATA_DEVICE)
1813                         ds = "SATA";
1814         }
1815
1816         sdev_printk(KERN_INFO, sdev, "%s: handle(0x%04x), " \
1817             "sas_addr(0x%016llx), phy(%d), device_name(0x%016llx)\n",
1818             ds, handle, (unsigned long long)sas_device->sas_address,
1819             sas_device->phy, (unsigned long long)sas_device->device_name);
1820         sdev_printk(KERN_INFO, sdev,
1821                 "%s: enclosure_logical_id(0x%016llx), slot(%d)\n",
1822                 ds, (unsigned long long)
1823             sas_device->enclosure_logical_id, sas_device->slot);
1824
1825         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
1826
1827         if (!ssp_target)
1828                 _scsih_display_sata_capabilities(ioc, handle, sdev);
1829
1830
1831         _scsih_change_queue_depth(sdev, qdepth, SCSI_QDEPTH_DEFAULT);
1832
1833         if (ssp_target) {
1834                 sas_read_port_mode_page(sdev);
1835                 _scsih_enable_tlr(ioc, sdev);
1836         }
1837
1838         return 0;
1839 }
1840
1841 /**
1842  * _scsih_bios_param - fetch head, sector, cylinder info for a disk
1843  * @sdev: scsi device struct
1844  * @bdev: pointer to block device context
1845  * @capacity: device size (in 512 byte sectors)
1846  * @params: three element array to place output:
1847  *              params[0] number of heads (max 255)
1848  *              params[1] number of sectors (max 63)
1849  *              params[2] number of cylinders
1850  *
1851  * Return nothing.
1852  */
1853 static int
1854 _scsih_bios_param(struct scsi_device *sdev, struct block_device *bdev,
1855         sector_t capacity, int params[])
1856 {
1857         int             heads;
1858         int             sectors;
1859         sector_t        cylinders;
1860         ulong           dummy;
1861
1862         heads = 64;
1863         sectors = 32;
1864
1865         dummy = heads * sectors;
1866         cylinders = capacity;
1867         sector_div(cylinders, dummy);
1868
1869         /*
1870          * Handle extended translation size for logical drives
1871          * > 1Gb
1872          */
1873         if ((ulong)capacity >= 0x200000) {
1874                 heads = 255;
1875                 sectors = 63;
1876                 dummy = heads * sectors;
1877                 cylinders = capacity;
1878                 sector_div(cylinders, dummy);
1879         }
1880
1881         /* return result */
1882         params[0] = heads;
1883         params[1] = sectors;
1884         params[2] = cylinders;
1885
1886         return 0;
1887 }
1888
1889 /**
1890  * _scsih_response_code - translation of device response code
1891  * @ioc: per adapter object
1892  * @response_code: response code returned by the device
1893  *
1894  * Return nothing.
1895  */
1896 static void
1897 _scsih_response_code(struct MPT3SAS_ADAPTER *ioc, u8 response_code)
1898 {
1899         char *desc;
1900
1901         switch (response_code) {
1902         case MPI2_SCSITASKMGMT_RSP_TM_COMPLETE:
1903                 desc = "task management request completed";
1904                 break;
1905         case MPI2_SCSITASKMGMT_RSP_INVALID_FRAME:
1906                 desc = "invalid frame";
1907                 break;
1908         case MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED:
1909                 desc = "task management request not supported";
1910                 break;
1911         case MPI2_SCSITASKMGMT_RSP_TM_FAILED:
1912                 desc = "task management request failed";
1913                 break;
1914         case MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED:
1915                 desc = "task management request succeeded";
1916                 break;
1917         case MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN:
1918                 desc = "invalid lun";
1919                 break;
1920         case 0xA:
1921                 desc = "overlapped tag attempted";
1922                 break;
1923         case MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC:
1924                 desc = "task queued, however not sent to target";
1925                 break;
1926         default:
1927                 desc = "unknown";
1928                 break;
1929         }
1930         pr_warn(MPT3SAS_FMT "response_code(0x%01x): %s\n",
1931                 ioc->name, response_code, desc);
1932 }
1933
1934 /**
1935  * _scsih_tm_done - tm completion routine
1936  * @ioc: per adapter object
1937  * @smid: system request message index
1938  * @msix_index: MSIX table index supplied by the OS
1939  * @reply: reply message frame(lower 32bit addr)
1940  * Context: none.
1941  *
1942  * The callback handler when using scsih_issue_tm.
1943  *
1944  * Return 1 meaning mf should be freed from _base_interrupt
1945  *        0 means the mf is freed from this function.
1946  */
1947 static u8
1948 _scsih_tm_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
1949 {
1950         MPI2DefaultReply_t *mpi_reply;
1951
1952         if (ioc->tm_cmds.status == MPT3_CMD_NOT_USED)
1953                 return 1;
1954         if (ioc->tm_cmds.smid != smid)
1955                 return 1;
1956         mpt3sas_base_flush_reply_queues(ioc);
1957         ioc->tm_cmds.status |= MPT3_CMD_COMPLETE;
1958         mpi_reply =  mpt3sas_base_get_reply_virt_addr(ioc, reply);
1959         if (mpi_reply) {
1960                 memcpy(ioc->tm_cmds.reply, mpi_reply, mpi_reply->MsgLength*4);
1961                 ioc->tm_cmds.status |= MPT3_CMD_REPLY_VALID;
1962         }
1963         ioc->tm_cmds.status &= ~MPT3_CMD_PENDING;
1964         complete(&ioc->tm_cmds.done);
1965         return 1;
1966 }
1967
1968 /**
1969  * mpt3sas_scsih_set_tm_flag - set per target tm_busy
1970  * @ioc: per adapter object
1971  * @handle: device handle
1972  *
1973  * During taskmangement request, we need to freeze the device queue.
1974  */
1975 void
1976 mpt3sas_scsih_set_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
1977 {
1978         struct MPT3SAS_DEVICE *sas_device_priv_data;
1979         struct scsi_device *sdev;
1980         u8 skip = 0;
1981
1982         shost_for_each_device(sdev, ioc->shost) {
1983                 if (skip)
1984                         continue;
1985                 sas_device_priv_data = sdev->hostdata;
1986                 if (!sas_device_priv_data)
1987                         continue;
1988                 if (sas_device_priv_data->sas_target->handle == handle) {
1989                         sas_device_priv_data->sas_target->tm_busy = 1;
1990                         skip = 1;
1991                         ioc->ignore_loginfos = 1;
1992                 }
1993         }
1994 }
1995
1996 /**
1997  * mpt3sas_scsih_clear_tm_flag - clear per target tm_busy
1998  * @ioc: per adapter object
1999  * @handle: device handle
2000  *
2001  * During taskmangement request, we need to freeze the device queue.
2002  */
2003 void
2004 mpt3sas_scsih_clear_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
2005 {
2006         struct MPT3SAS_DEVICE *sas_device_priv_data;
2007         struct scsi_device *sdev;
2008         u8 skip = 0;
2009
2010         shost_for_each_device(sdev, ioc->shost) {
2011                 if (skip)
2012                         continue;
2013                 sas_device_priv_data = sdev->hostdata;
2014                 if (!sas_device_priv_data)
2015                         continue;
2016                 if (sas_device_priv_data->sas_target->handle == handle) {
2017                         sas_device_priv_data->sas_target->tm_busy = 0;
2018                         skip = 1;
2019                         ioc->ignore_loginfos = 0;
2020                 }
2021         }
2022 }
2023
2024 /**
2025  * mpt3sas_scsih_issue_tm - main routine for sending tm requests
2026  * @ioc: per adapter struct
2027  * @device_handle: device handle
2028  * @channel: the channel assigned by the OS
2029  * @id: the id assigned by the OS
2030  * @lun: lun number
2031  * @type: MPI2_SCSITASKMGMT_TASKTYPE__XXX (defined in mpi2_init.h)
2032  * @smid_task: smid assigned to the task
2033  * @timeout: timeout in seconds
2034  * @m_type: TM_MUTEX_ON or TM_MUTEX_OFF
2035  * Context: user
2036  *
2037  * A generic API for sending task management requests to firmware.
2038  *
2039  * The callback index is set inside `ioc->tm_cb_idx`.
2040  *
2041  * Return SUCCESS or FAILED.
2042  */
2043 int
2044 mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
2045         uint id, uint lun, u8 type, u16 smid_task, ulong timeout,
2046         enum mutex_type m_type)
2047 {
2048         Mpi2SCSITaskManagementRequest_t *mpi_request;
2049         Mpi2SCSITaskManagementReply_t *mpi_reply;
2050         u16 smid = 0;
2051         u32 ioc_state;
2052         unsigned long timeleft;
2053         struct scsiio_tracker *scsi_lookup = NULL;
2054         int rc;
2055
2056         if (m_type == TM_MUTEX_ON)
2057                 mutex_lock(&ioc->tm_cmds.mutex);
2058         if (ioc->tm_cmds.status != MPT3_CMD_NOT_USED) {
2059                 pr_info(MPT3SAS_FMT "%s: tm_cmd busy!!!\n",
2060                     __func__, ioc->name);
2061                 rc = FAILED;
2062                 goto err_out;
2063         }
2064
2065         if (ioc->shost_recovery || ioc->remove_host ||
2066             ioc->pci_error_recovery) {
2067                 pr_info(MPT3SAS_FMT "%s: host reset in progress!\n",
2068                     __func__, ioc->name);
2069                 rc = FAILED;
2070                 goto err_out;
2071         }
2072
2073         ioc_state = mpt3sas_base_get_iocstate(ioc, 0);
2074         if (ioc_state & MPI2_DOORBELL_USED) {
2075                 dhsprintk(ioc, pr_info(MPT3SAS_FMT
2076                         "unexpected doorbell active!\n", ioc->name));
2077                 rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
2078                     FORCE_BIG_HAMMER);
2079                 rc = (!rc) ? SUCCESS : FAILED;
2080                 goto err_out;
2081         }
2082
2083         if ((ioc_state & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
2084                 mpt3sas_base_fault_info(ioc, ioc_state &
2085                     MPI2_DOORBELL_DATA_MASK);
2086                 rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
2087                     FORCE_BIG_HAMMER);
2088                 rc = (!rc) ? SUCCESS : FAILED;
2089                 goto err_out;
2090         }
2091
2092         smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_cb_idx);
2093         if (!smid) {
2094                 pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
2095                     ioc->name, __func__);
2096                 rc = FAILED;
2097                 goto err_out;
2098         }
2099
2100         if (type == MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK)
2101                 scsi_lookup = &ioc->scsi_lookup[smid_task - 1];
2102
2103         dtmprintk(ioc, pr_info(MPT3SAS_FMT
2104                 "sending tm: handle(0x%04x), task_type(0x%02x), smid(%d)\n",
2105                 ioc->name, handle, type, smid_task));
2106         ioc->tm_cmds.status = MPT3_CMD_PENDING;
2107         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
2108         ioc->tm_cmds.smid = smid;
2109         memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
2110         memset(ioc->tm_cmds.reply, 0, sizeof(Mpi2SCSITaskManagementReply_t));
2111         mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
2112         mpi_request->DevHandle = cpu_to_le16(handle);
2113         mpi_request->TaskType = type;
2114         mpi_request->TaskMID = cpu_to_le16(smid_task);
2115         int_to_scsilun(lun, (struct scsi_lun *)mpi_request->LUN);
2116         mpt3sas_scsih_set_tm_flag(ioc, handle);
2117         init_completion(&ioc->tm_cmds.done);
2118         mpt3sas_base_put_smid_hi_priority(ioc, smid);
2119         timeleft = wait_for_completion_timeout(&ioc->tm_cmds.done, timeout*HZ);
2120         if (!(ioc->tm_cmds.status & MPT3_CMD_COMPLETE)) {
2121                 pr_err(MPT3SAS_FMT "%s: timeout\n",
2122                     ioc->name, __func__);
2123                 _debug_dump_mf(mpi_request,
2124                     sizeof(Mpi2SCSITaskManagementRequest_t)/4);
2125                 if (!(ioc->tm_cmds.status & MPT3_CMD_RESET)) {
2126                         rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
2127                             FORCE_BIG_HAMMER);
2128                         rc = (!rc) ? SUCCESS : FAILED;
2129                         ioc->tm_cmds.status = MPT3_CMD_NOT_USED;
2130                         mpt3sas_scsih_clear_tm_flag(ioc, handle);
2131                         goto err_out;
2132                 }
2133         }
2134
2135         if (ioc->tm_cmds.status & MPT3_CMD_REPLY_VALID) {
2136                 mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
2137                 mpi_reply = ioc->tm_cmds.reply;
2138                 dtmprintk(ioc, pr_info(MPT3SAS_FMT "complete tm: " \
2139                     "ioc_status(0x%04x), loginfo(0x%08x), term_count(0x%08x)\n",
2140                     ioc->name, le16_to_cpu(mpi_reply->IOCStatus),
2141                     le32_to_cpu(mpi_reply->IOCLogInfo),
2142                     le32_to_cpu(mpi_reply->TerminationCount)));
2143                 if (ioc->logging_level & MPT_DEBUG_TM) {
2144                         _scsih_response_code(ioc, mpi_reply->ResponseCode);
2145                         if (mpi_reply->IOCStatus)
2146                                 _debug_dump_mf(mpi_request,
2147                                     sizeof(Mpi2SCSITaskManagementRequest_t)/4);
2148                 }
2149         }
2150
2151         switch (type) {
2152         case MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK:
2153                 rc = SUCCESS;
2154                 if (scsi_lookup->scmd == NULL)
2155                         break;
2156                 rc = FAILED;
2157                 break;
2158
2159         case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
2160                 if (_scsih_scsi_lookup_find_by_target(ioc, id, channel))
2161                         rc = FAILED;
2162                 else
2163                         rc = SUCCESS;
2164                 break;
2165         case MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET:
2166         case MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET:
2167                 if (_scsih_scsi_lookup_find_by_lun(ioc, id, lun, channel))
2168                         rc = FAILED;
2169                 else
2170                         rc = SUCCESS;
2171                 break;
2172         case MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK:
2173                 rc = SUCCESS;
2174                 break;
2175         default:
2176                 rc = FAILED;
2177                 break;
2178         }
2179
2180         mpt3sas_scsih_clear_tm_flag(ioc, handle);
2181         ioc->tm_cmds.status = MPT3_CMD_NOT_USED;
2182         if (m_type == TM_MUTEX_ON)
2183                 mutex_unlock(&ioc->tm_cmds.mutex);
2184
2185         return rc;
2186
2187  err_out:
2188         if (m_type == TM_MUTEX_ON)
2189                 mutex_unlock(&ioc->tm_cmds.mutex);
2190         return rc;
2191 }
2192
2193 /**
2194  * _scsih_tm_display_info - displays info about the device
2195  * @ioc: per adapter struct
2196  * @scmd: pointer to scsi command object
2197  *
2198  * Called by task management callback handlers.
2199  */
2200 static void
2201 _scsih_tm_display_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd)
2202 {
2203         struct scsi_target *starget = scmd->device->sdev_target;
2204         struct MPT3SAS_TARGET *priv_target = starget->hostdata;
2205         struct _sas_device *sas_device = NULL;
2206         unsigned long flags;
2207         char *device_str = NULL;
2208
2209         if (!priv_target)
2210                 return;
2211         device_str = "volume";
2212
2213         scsi_print_command(scmd);
2214         if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
2215                 starget_printk(KERN_INFO, starget,
2216                         "%s handle(0x%04x), %s wwid(0x%016llx)\n",
2217                         device_str, priv_target->handle,
2218                     device_str, (unsigned long long)priv_target->sas_address);
2219         } else {
2220                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
2221                 sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
2222                     priv_target->sas_address);
2223                 if (sas_device) {
2224                         if (priv_target->flags &
2225                             MPT_TARGET_FLAGS_RAID_COMPONENT) {
2226                                 starget_printk(KERN_INFO, starget,
2227                                     "volume handle(0x%04x), "
2228                                     "volume wwid(0x%016llx)\n",
2229                                     sas_device->volume_handle,
2230                                    (unsigned long long)sas_device->volume_wwid);
2231                         }
2232                         starget_printk(KERN_INFO, starget,
2233                             "handle(0x%04x), sas_address(0x%016llx), phy(%d)\n",
2234                             sas_device->handle,
2235                             (unsigned long long)sas_device->sas_address,
2236                             sas_device->phy);
2237                         starget_printk(KERN_INFO, starget,
2238                             "enclosure_logical_id(0x%016llx), slot(%d)\n",
2239                            (unsigned long long)sas_device->enclosure_logical_id,
2240                             sas_device->slot);
2241                 }
2242                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2243         }
2244 }
2245
2246 /**
2247  * _scsih_abort - eh threads main abort routine
2248  * @scmd: pointer to scsi command object
2249  *
2250  * Returns SUCCESS if command aborted else FAILED
2251  */
2252 static int
2253 _scsih_abort(struct scsi_cmnd *scmd)
2254 {
2255         struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
2256         struct MPT3SAS_DEVICE *sas_device_priv_data;
2257         u16 smid;
2258         u16 handle;
2259         int r;
2260
2261         sdev_printk(KERN_INFO, scmd->device,
2262                 "attempting task abort! scmd(%p)\n", scmd);
2263         _scsih_tm_display_info(ioc, scmd);
2264
2265         sas_device_priv_data = scmd->device->hostdata;
2266         if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
2267                 sdev_printk(KERN_INFO, scmd->device,
2268                         "device been deleted! scmd(%p)\n", scmd);
2269                 scmd->result = DID_NO_CONNECT << 16;
2270                 scmd->scsi_done(scmd);
2271                 r = SUCCESS;
2272                 goto out;
2273         }
2274
2275         /* search for the command */
2276         smid = _scsih_scsi_lookup_find_by_scmd(ioc, scmd);
2277         if (!smid) {
2278                 scmd->result = DID_RESET << 16;
2279                 r = SUCCESS;
2280                 goto out;
2281         }
2282
2283         /* for hidden raid components and volumes this is not supported */
2284         if (sas_device_priv_data->sas_target->flags &
2285             MPT_TARGET_FLAGS_RAID_COMPONENT ||
2286             sas_device_priv_data->sas_target->flags & MPT_TARGET_FLAGS_VOLUME) {
2287                 scmd->result = DID_RESET << 16;
2288                 r = FAILED;
2289                 goto out;
2290         }
2291
2292         mpt3sas_halt_firmware(ioc);
2293
2294         handle = sas_device_priv_data->sas_target->handle;
2295         r = mpt3sas_scsih_issue_tm(ioc, handle, scmd->device->channel,
2296             scmd->device->id, scmd->device->lun,
2297             MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK, smid, 30, TM_MUTEX_ON);
2298
2299  out:
2300         sdev_printk(KERN_INFO, scmd->device, "task abort: %s scmd(%p)\n",
2301             ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
2302         return r;
2303 }
2304
2305 /**
2306  * _scsih_dev_reset - eh threads main device reset routine
2307  * @scmd: pointer to scsi command object
2308  *
2309  * Returns SUCCESS if command aborted else FAILED
2310  */
2311 static int
2312 _scsih_dev_reset(struct scsi_cmnd *scmd)
2313 {
2314         struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
2315         struct MPT3SAS_DEVICE *sas_device_priv_data;
2316         struct _sas_device *sas_device;
2317         unsigned long flags;
2318         u16     handle;
2319         int r;
2320
2321         sdev_printk(KERN_INFO, scmd->device,
2322                 "attempting device reset! scmd(%p)\n", scmd);
2323         _scsih_tm_display_info(ioc, scmd);
2324
2325         sas_device_priv_data = scmd->device->hostdata;
2326         if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
2327                 sdev_printk(KERN_INFO, scmd->device,
2328                         "device been deleted! scmd(%p)\n", scmd);
2329                 scmd->result = DID_NO_CONNECT << 16;
2330                 scmd->scsi_done(scmd);
2331                 r = SUCCESS;
2332                 goto out;
2333         }
2334
2335         /* for hidden raid components obtain the volume_handle */
2336         handle = 0;
2337         if (sas_device_priv_data->sas_target->flags &
2338             MPT_TARGET_FLAGS_RAID_COMPONENT) {
2339                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
2340                 sas_device = _scsih_sas_device_find_by_handle(ioc,
2341                    sas_device_priv_data->sas_target->handle);
2342                 if (sas_device)
2343                         handle = sas_device->volume_handle;
2344                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2345         } else
2346                 handle = sas_device_priv_data->sas_target->handle;
2347
2348         if (!handle) {
2349                 scmd->result = DID_RESET << 16;
2350                 r = FAILED;
2351                 goto out;
2352         }
2353
2354         r = mpt3sas_scsih_issue_tm(ioc, handle, scmd->device->channel,
2355             scmd->device->id, scmd->device->lun,
2356             MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, 0, 30, TM_MUTEX_ON);
2357
2358  out:
2359         sdev_printk(KERN_INFO, scmd->device, "device reset: %s scmd(%p)\n",
2360             ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
2361         return r;
2362 }
2363
2364 /**
2365  * _scsih_target_reset - eh threads main target reset routine
2366  * @scmd: pointer to scsi command object
2367  *
2368  * Returns SUCCESS if command aborted else FAILED
2369  */
2370 static int
2371 _scsih_target_reset(struct scsi_cmnd *scmd)
2372 {
2373         struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
2374         struct MPT3SAS_DEVICE *sas_device_priv_data;
2375         struct _sas_device *sas_device;
2376         unsigned long flags;
2377         u16     handle;
2378         int r;
2379         struct scsi_target *starget = scmd->device->sdev_target;
2380
2381         starget_printk(KERN_INFO, starget, "attempting target reset! scmd(%p)\n",
2382                 scmd);
2383         _scsih_tm_display_info(ioc, scmd);
2384
2385         sas_device_priv_data = scmd->device->hostdata;
2386         if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
2387                 starget_printk(KERN_INFO, starget, "target been deleted! scmd(%p)\n",
2388                         scmd);
2389                 scmd->result = DID_NO_CONNECT << 16;
2390                 scmd->scsi_done(scmd);
2391                 r = SUCCESS;
2392                 goto out;
2393         }
2394
2395         /* for hidden raid components obtain the volume_handle */
2396         handle = 0;
2397         if (sas_device_priv_data->sas_target->flags &
2398             MPT_TARGET_FLAGS_RAID_COMPONENT) {
2399                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
2400                 sas_device = _scsih_sas_device_find_by_handle(ioc,
2401                    sas_device_priv_data->sas_target->handle);
2402                 if (sas_device)
2403                         handle = sas_device->volume_handle;
2404                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2405         } else
2406                 handle = sas_device_priv_data->sas_target->handle;
2407
2408         if (!handle) {
2409                 scmd->result = DID_RESET << 16;
2410                 r = FAILED;
2411                 goto out;
2412         }
2413
2414         r = mpt3sas_scsih_issue_tm(ioc, handle, scmd->device->channel,
2415             scmd->device->id, 0, MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0,
2416             30, TM_MUTEX_ON);
2417
2418  out:
2419         starget_printk(KERN_INFO, starget, "target reset: %s scmd(%p)\n",
2420             ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
2421         return r;
2422 }
2423
2424
2425 /**
2426  * _scsih_host_reset - eh threads main host reset routine
2427  * @scmd: pointer to scsi command object
2428  *
2429  * Returns SUCCESS if command aborted else FAILED
2430  */
2431 static int
2432 _scsih_host_reset(struct scsi_cmnd *scmd)
2433 {
2434         struct MPT3SAS_ADAPTER *ioc = shost_priv(scmd->device->host);
2435         int r, retval;
2436
2437         pr_info(MPT3SAS_FMT "attempting host reset! scmd(%p)\n",
2438             ioc->name, scmd);
2439         scsi_print_command(scmd);
2440
2441         retval = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
2442             FORCE_BIG_HAMMER);
2443         r = (retval < 0) ? FAILED : SUCCESS;
2444         pr_info(MPT3SAS_FMT "host reset: %s scmd(%p)\n",
2445             ioc->name, ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
2446
2447         return r;
2448 }
2449
2450 /**
2451  * _scsih_fw_event_add - insert and queue up fw_event
2452  * @ioc: per adapter object
2453  * @fw_event: object describing the event
2454  * Context: This function will acquire ioc->fw_event_lock.
2455  *
2456  * This adds the firmware event object into link list, then queues it up to
2457  * be processed from user context.
2458  *
2459  * Return nothing.
2460  */
2461 static void
2462 _scsih_fw_event_add(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
2463 {
2464         unsigned long flags;
2465
2466         if (ioc->firmware_event_thread == NULL)
2467                 return;
2468
2469         spin_lock_irqsave(&ioc->fw_event_lock, flags);
2470         INIT_LIST_HEAD(&fw_event->list);
2471         list_add_tail(&fw_event->list, &ioc->fw_event_list);
2472         INIT_WORK(&fw_event->work, _firmware_event_work);
2473         queue_work(ioc->firmware_event_thread, &fw_event->work);
2474         spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
2475 }
2476
2477 /**
2478  * _scsih_fw_event_free - delete fw_event
2479  * @ioc: per adapter object
2480  * @fw_event: object describing the event
2481  * Context: This function will acquire ioc->fw_event_lock.
2482  *
2483  * This removes firmware event object from link list, frees associated memory.
2484  *
2485  * Return nothing.
2486  */
2487 static void
2488 _scsih_fw_event_free(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work
2489         *fw_event)
2490 {
2491         unsigned long flags;
2492
2493         spin_lock_irqsave(&ioc->fw_event_lock, flags);
2494         list_del(&fw_event->list);
2495         kfree(fw_event->event_data);
2496         kfree(fw_event);
2497         spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
2498 }
2499
2500
2501  /**
2502  * mpt3sas_send_trigger_data_event - send event for processing trigger data
2503  * @ioc: per adapter object
2504  * @event_data: trigger event data
2505  *
2506  * Return nothing.
2507  */
2508 void
2509 mpt3sas_send_trigger_data_event(struct MPT3SAS_ADAPTER *ioc,
2510         struct SL_WH_TRIGGERS_EVENT_DATA_T *event_data)
2511 {
2512         struct fw_event_work *fw_event;
2513
2514         if (ioc->is_driver_loading)
2515                 return;
2516         fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
2517         if (!fw_event)
2518                 return;
2519         fw_event->event_data = kzalloc(sizeof(*event_data), GFP_ATOMIC);
2520         if (!fw_event->event_data)
2521                 return;
2522         fw_event->event = MPT3SAS_PROCESS_TRIGGER_DIAG;
2523         fw_event->ioc = ioc;
2524         memcpy(fw_event->event_data, event_data, sizeof(*event_data));
2525         _scsih_fw_event_add(ioc, fw_event);
2526 }
2527
2528 /**
2529  * _scsih_error_recovery_delete_devices - remove devices not responding
2530  * @ioc: per adapter object
2531  *
2532  * Return nothing.
2533  */
2534 static void
2535 _scsih_error_recovery_delete_devices(struct MPT3SAS_ADAPTER *ioc)
2536 {
2537         struct fw_event_work *fw_event;
2538
2539         if (ioc->is_driver_loading)
2540                 return;
2541         fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
2542         if (!fw_event)
2543                 return;
2544         fw_event->event = MPT3SAS_REMOVE_UNRESPONDING_DEVICES;
2545         fw_event->ioc = ioc;
2546         _scsih_fw_event_add(ioc, fw_event);
2547 }
2548
2549 /**
2550  * mpt3sas_port_enable_complete - port enable completed (fake event)
2551  * @ioc: per adapter object
2552  *
2553  * Return nothing.
2554  */
2555 void
2556 mpt3sas_port_enable_complete(struct MPT3SAS_ADAPTER *ioc)
2557 {
2558         struct fw_event_work *fw_event;
2559
2560         fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
2561         if (!fw_event)
2562                 return;
2563         fw_event->event = MPT3SAS_PORT_ENABLE_COMPLETE;
2564         fw_event->ioc = ioc;
2565         _scsih_fw_event_add(ioc, fw_event);
2566 }
2567
2568 /**
2569  * _scsih_fw_event_cleanup_queue - cleanup event queue
2570  * @ioc: per adapter object
2571  *
2572  * Walk the firmware event queue, either killing timers, or waiting
2573  * for outstanding events to complete
2574  *
2575  * Return nothing.
2576  */
2577 static void
2578 _scsih_fw_event_cleanup_queue(struct MPT3SAS_ADAPTER *ioc)
2579 {
2580         struct fw_event_work *fw_event, *next;
2581
2582         if (list_empty(&ioc->fw_event_list) ||
2583              !ioc->firmware_event_thread || in_interrupt())
2584                 return;
2585
2586         list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) {
2587                 if (cancel_delayed_work(&fw_event->delayed_work)) {
2588                         _scsih_fw_event_free(ioc, fw_event);
2589                         continue;
2590                 }
2591                 fw_event->cancel_pending_work = 1;
2592         }
2593 }
2594
2595 /**
2596  * _scsih_ublock_io_all_device - unblock every device
2597  * @ioc: per adapter object
2598  *
2599  * change the device state from block to running
2600  */
2601 static void
2602 _scsih_ublock_io_all_device(struct MPT3SAS_ADAPTER *ioc)
2603 {
2604         struct MPT3SAS_DEVICE *sas_device_priv_data;
2605         struct scsi_device *sdev;
2606
2607         shost_for_each_device(sdev, ioc->shost) {
2608                 sas_device_priv_data = sdev->hostdata;
2609                 if (!sas_device_priv_data)
2610                         continue;
2611                 if (!sas_device_priv_data->block)
2612                         continue;
2613
2614                 sas_device_priv_data->block = 0;
2615                 dewtprintk(ioc, sdev_printk(KERN_INFO, sdev,
2616                         "device_running, handle(0x%04x)\n",
2617                     sas_device_priv_data->sas_target->handle));
2618                 scsi_internal_device_unblock(sdev, SDEV_RUNNING);
2619         }
2620 }
2621
2622
2623 /**
2624  * _scsih_ublock_io_device - prepare device to be deleted
2625  * @ioc: per adapter object
2626  * @sas_addr: sas address
2627  *
2628  * unblock then put device in offline state
2629  */
2630 static void
2631 _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address)
2632 {
2633         struct MPT3SAS_DEVICE *sas_device_priv_data;
2634         struct scsi_device *sdev;
2635
2636         shost_for_each_device(sdev, ioc->shost) {
2637                 sas_device_priv_data = sdev->hostdata;
2638                 if (!sas_device_priv_data)
2639                         continue;
2640                 if (sas_device_priv_data->sas_target->sas_address
2641                     != sas_address)
2642                         continue;
2643                 if (sas_device_priv_data->block) {
2644                         sas_device_priv_data->block = 0;
2645                         scsi_internal_device_unblock(sdev, SDEV_RUNNING);
2646                 }
2647         }
2648 }
2649
2650 /**
2651  * _scsih_block_io_all_device - set the device state to SDEV_BLOCK
2652  * @ioc: per adapter object
2653  * @handle: device handle
2654  *
2655  * During device pull we need to appropiately set the sdev state.
2656  */
2657 static void
2658 _scsih_block_io_all_device(struct MPT3SAS_ADAPTER *ioc)
2659 {
2660         struct MPT3SAS_DEVICE *sas_device_priv_data;
2661         struct scsi_device *sdev;
2662
2663         shost_for_each_device(sdev, ioc->shost) {
2664                 sas_device_priv_data = sdev->hostdata;
2665                 if (!sas_device_priv_data)
2666                         continue;
2667                 if (sas_device_priv_data->block)
2668                         continue;
2669                 sas_device_priv_data->block = 1;
2670                 scsi_internal_device_block(sdev);
2671                 sdev_printk(KERN_INFO, sdev, "device_blocked, handle(0x%04x)\n",
2672                     sas_device_priv_data->sas_target->handle);
2673         }
2674 }
2675
2676 /**
2677  * _scsih_block_io_device - set the device state to SDEV_BLOCK
2678  * @ioc: per adapter object
2679  * @handle: device handle
2680  *
2681  * During device pull we need to appropiately set the sdev state.
2682  */
2683 static void
2684 _scsih_block_io_device(struct MPT3SAS_ADAPTER *ioc, u16 handle)
2685 {
2686         struct MPT3SAS_DEVICE *sas_device_priv_data;
2687         struct scsi_device *sdev;
2688
2689         shost_for_each_device(sdev, ioc->shost) {
2690                 sas_device_priv_data = sdev->hostdata;
2691                 if (!sas_device_priv_data)
2692                         continue;
2693                 if (sas_device_priv_data->sas_target->handle != handle)
2694                         continue;
2695                 if (sas_device_priv_data->block)
2696                         continue;
2697                 sas_device_priv_data->block = 1;
2698                 scsi_internal_device_block(sdev);
2699                 sdev_printk(KERN_INFO, sdev,
2700                         "device_blocked, handle(0x%04x)\n", handle);
2701         }
2702 }
2703
2704 /**
2705  * _scsih_block_io_to_children_attached_to_ex
2706  * @ioc: per adapter object
2707  * @sas_expander: the sas_device object
2708  *
2709  * This routine set sdev state to SDEV_BLOCK for all devices
2710  * attached to this expander. This function called when expander is
2711  * pulled.
2712  */
2713 static void
2714 _scsih_block_io_to_children_attached_to_ex(struct MPT3SAS_ADAPTER *ioc,
2715         struct _sas_node *sas_expander)
2716 {
2717         struct _sas_port *mpt3sas_port;
2718         struct _sas_device *sas_device;
2719         struct _sas_node *expander_sibling;
2720         unsigned long flags;
2721
2722         if (!sas_expander)
2723                 return;
2724
2725         list_for_each_entry(mpt3sas_port,
2726            &sas_expander->sas_port_list, port_list) {
2727                 if (mpt3sas_port->remote_identify.device_type ==
2728                     SAS_END_DEVICE) {
2729                         spin_lock_irqsave(&ioc->sas_device_lock, flags);
2730                         sas_device =
2731                             mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
2732                            mpt3sas_port->remote_identify.sas_address);
2733                         if (sas_device)
2734                                 set_bit(sas_device->handle,
2735                                     ioc->blocking_handles);
2736                         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2737                 }
2738         }
2739
2740         list_for_each_entry(mpt3sas_port,
2741            &sas_expander->sas_port_list, port_list) {
2742
2743                 if (mpt3sas_port->remote_identify.device_type ==
2744                     SAS_EDGE_EXPANDER_DEVICE ||
2745                     mpt3sas_port->remote_identify.device_type ==
2746                     SAS_FANOUT_EXPANDER_DEVICE) {
2747                         expander_sibling =
2748                             mpt3sas_scsih_expander_find_by_sas_address(
2749                             ioc, mpt3sas_port->remote_identify.sas_address);
2750                         _scsih_block_io_to_children_attached_to_ex(ioc,
2751                             expander_sibling);
2752                 }
2753         }
2754 }
2755
2756 /**
2757  * _scsih_block_io_to_children_attached_directly
2758  * @ioc: per adapter object
2759  * @event_data: topology change event data
2760  *
2761  * This routine set sdev state to SDEV_BLOCK for all devices
2762  * direct attached during device pull.
2763  */
2764 static void
2765 _scsih_block_io_to_children_attached_directly(struct MPT3SAS_ADAPTER *ioc,
2766         Mpi2EventDataSasTopologyChangeList_t *event_data)
2767 {
2768         int i;
2769         u16 handle;
2770         u16 reason_code;
2771
2772         for (i = 0; i < event_data->NumEntries; i++) {
2773                 handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
2774                 if (!handle)
2775                         continue;
2776                 reason_code = event_data->PHY[i].PhyStatus &
2777                     MPI2_EVENT_SAS_TOPO_RC_MASK;
2778                 if (reason_code == MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING)
2779                         _scsih_block_io_device(ioc, handle);
2780         }
2781 }
2782
2783 /**
2784  * _scsih_tm_tr_send - send task management request
2785  * @ioc: per adapter object
2786  * @handle: device handle
2787  * Context: interrupt time.
2788  *
2789  * This code is to initiate the device removal handshake protocol
2790  * with controller firmware.  This function will issue target reset
2791  * using high priority request queue.  It will send a sas iounit
2792  * control request (MPI2_SAS_OP_REMOVE_DEVICE) from this completion.
2793  *
2794  * This is designed to send muliple task management request at the same
2795  * time to the fifo. If the fifo is full, we will append the request,
2796  * and process it in a future completion.
2797  */
2798 static void
2799 _scsih_tm_tr_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
2800 {
2801         Mpi2SCSITaskManagementRequest_t *mpi_request;
2802         u16 smid;
2803         struct _sas_device *sas_device;
2804         struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
2805         u64 sas_address = 0;
2806         unsigned long flags;
2807         struct _tr_list *delayed_tr;
2808         u32 ioc_state;
2809
2810         if (ioc->remove_host) {
2811                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2812                         "%s: host has been removed: handle(0x%04x)\n",
2813                         __func__, ioc->name, handle));
2814                 return;
2815         } else if (ioc->pci_error_recovery) {
2816                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2817                         "%s: host in pci error recovery: handle(0x%04x)\n",
2818                         __func__, ioc->name,
2819                     handle));
2820                 return;
2821         }
2822         ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
2823         if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
2824                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2825                         "%s: host is not operational: handle(0x%04x)\n",
2826                         __func__, ioc->name,
2827                    handle));
2828                 return;
2829         }
2830
2831         /* if PD, then return */
2832         if (test_bit(handle, ioc->pd_handles))
2833                 return;
2834
2835         spin_lock_irqsave(&ioc->sas_device_lock, flags);
2836         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
2837         if (sas_device && sas_device->starget &&
2838             sas_device->starget->hostdata) {
2839                 sas_target_priv_data = sas_device->starget->hostdata;
2840                 sas_target_priv_data->deleted = 1;
2841                 sas_address = sas_device->sas_address;
2842         }
2843         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
2844
2845         if (sas_target_priv_data) {
2846                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2847                         "setting delete flag: handle(0x%04x), sas_addr(0x%016llx)\n",
2848                         ioc->name, handle,
2849                     (unsigned long long)sas_address));
2850                 _scsih_ublock_io_device(ioc, sas_address);
2851                 sas_target_priv_data->handle = MPT3SAS_INVALID_DEVICE_HANDLE;
2852         }
2853
2854         smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx);
2855         if (!smid) {
2856                 delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
2857                 if (!delayed_tr)
2858                         return;
2859                 INIT_LIST_HEAD(&delayed_tr->list);
2860                 delayed_tr->handle = handle;
2861                 list_add_tail(&delayed_tr->list, &ioc->delayed_tr_list);
2862                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2863                     "DELAYED:tr:handle(0x%04x), (open)\n",
2864                     ioc->name, handle));
2865                 return;
2866         }
2867
2868         dewtprintk(ioc, pr_info(MPT3SAS_FMT
2869                 "tr_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
2870                 ioc->name, handle, smid,
2871             ioc->tm_tr_cb_idx));
2872         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
2873         memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
2874         mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
2875         mpi_request->DevHandle = cpu_to_le16(handle);
2876         mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
2877         mpt3sas_base_put_smid_hi_priority(ioc, smid);
2878         mpt3sas_trigger_master(ioc, MASTER_TRIGGER_DEVICE_REMOVAL);
2879 }
2880
2881 /**
2882  * _scsih_tm_tr_complete -
2883  * @ioc: per adapter object
2884  * @smid: system request message index
2885  * @msix_index: MSIX table index supplied by the OS
2886  * @reply: reply message frame(lower 32bit addr)
2887  * Context: interrupt time.
2888  *
2889  * This is the target reset completion routine.
2890  * This code is part of the code to initiate the device removal
2891  * handshake protocol with controller firmware.
2892  * It will send a sas iounit control request (MPI2_SAS_OP_REMOVE_DEVICE)
2893  *
2894  * Return 1 meaning mf should be freed from _base_interrupt
2895  *        0 means the mf is freed from this function.
2896  */
2897 static u8
2898 _scsih_tm_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
2899         u32 reply)
2900 {
2901         u16 handle;
2902         Mpi2SCSITaskManagementRequest_t *mpi_request_tm;
2903         Mpi2SCSITaskManagementReply_t *mpi_reply =
2904             mpt3sas_base_get_reply_virt_addr(ioc, reply);
2905         Mpi2SasIoUnitControlRequest_t *mpi_request;
2906         u16 smid_sas_ctrl;
2907         u32 ioc_state;
2908
2909         if (ioc->remove_host) {
2910                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2911                         "%s: host has been removed\n", __func__, ioc->name));
2912                 return 1;
2913         } else if (ioc->pci_error_recovery) {
2914                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2915                         "%s: host in pci error recovery\n", __func__,
2916                         ioc->name));
2917                 return 1;
2918         }
2919         ioc_state = mpt3sas_base_get_iocstate(ioc, 1);
2920         if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
2921                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2922                         "%s: host is not operational\n", __func__, ioc->name));
2923                 return 1;
2924         }
2925         if (unlikely(!mpi_reply)) {
2926                 pr_err(MPT3SAS_FMT "mpi_reply not valid at %s:%d/%s()!\n",
2927                     ioc->name, __FILE__, __LINE__, __func__);
2928                 return 1;
2929         }
2930         mpi_request_tm = mpt3sas_base_get_msg_frame(ioc, smid);
2931         handle = le16_to_cpu(mpi_request_tm->DevHandle);
2932         if (handle != le16_to_cpu(mpi_reply->DevHandle)) {
2933                 dewtprintk(ioc, pr_err(MPT3SAS_FMT
2934                         "spurious interrupt: handle(0x%04x:0x%04x), smid(%d)!!!\n",
2935                         ioc->name, handle,
2936                     le16_to_cpu(mpi_reply->DevHandle), smid));
2937                 return 0;
2938         }
2939
2940         mpt3sas_trigger_master(ioc, MASTER_TRIGGER_TASK_MANAGMENT);
2941         dewtprintk(ioc, pr_info(MPT3SAS_FMT
2942             "tr_complete:handle(0x%04x), (open) smid(%d), ioc_status(0x%04x), "
2943             "loginfo(0x%08x), completed(%d)\n", ioc->name,
2944             handle, smid, le16_to_cpu(mpi_reply->IOCStatus),
2945             le32_to_cpu(mpi_reply->IOCLogInfo),
2946             le32_to_cpu(mpi_reply->TerminationCount)));
2947
2948         smid_sas_ctrl = mpt3sas_base_get_smid(ioc, ioc->tm_sas_control_cb_idx);
2949         if (!smid_sas_ctrl) {
2950                 pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
2951                     ioc->name, __func__);
2952                 return 1;
2953         }
2954
2955         dewtprintk(ioc, pr_info(MPT3SAS_FMT
2956                 "sc_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
2957                 ioc->name, handle, smid_sas_ctrl,
2958             ioc->tm_sas_control_cb_idx));
2959         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid_sas_ctrl);
2960         memset(mpi_request, 0, sizeof(Mpi2SasIoUnitControlRequest_t));
2961         mpi_request->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
2962         mpi_request->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
2963         mpi_request->DevHandle = mpi_request_tm->DevHandle;
2964         mpt3sas_base_put_smid_default(ioc, smid_sas_ctrl);
2965
2966         return _scsih_check_for_pending_tm(ioc, smid);
2967 }
2968
2969
2970 /**
2971  * _scsih_sas_control_complete - completion routine
2972  * @ioc: per adapter object
2973  * @smid: system request message index
2974  * @msix_index: MSIX table index supplied by the OS
2975  * @reply: reply message frame(lower 32bit addr)
2976  * Context: interrupt time.
2977  *
2978  * This is the sas iounit control completion routine.
2979  * This code is part of the code to initiate the device removal
2980  * handshake protocol with controller firmware.
2981  *
2982  * Return 1 meaning mf should be freed from _base_interrupt
2983  *        0 means the mf is freed from this function.
2984  */
2985 static u8
2986 _scsih_sas_control_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid,
2987         u8 msix_index, u32 reply)
2988 {
2989         Mpi2SasIoUnitControlReply_t *mpi_reply =
2990             mpt3sas_base_get_reply_virt_addr(ioc, reply);
2991
2992         if (likely(mpi_reply)) {
2993                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
2994                 "sc_complete:handle(0x%04x), (open) "
2995                 "smid(%d), ioc_status(0x%04x), loginfo(0x%08x)\n",
2996                 ioc->name, le16_to_cpu(mpi_reply->DevHandle), smid,
2997                 le16_to_cpu(mpi_reply->IOCStatus),
2998                 le32_to_cpu(mpi_reply->IOCLogInfo)));
2999         } else {
3000                 pr_err(MPT3SAS_FMT "mpi_reply not valid at %s:%d/%s()!\n",
3001                     ioc->name, __FILE__, __LINE__, __func__);
3002         }
3003         return 1;
3004 }
3005
3006 /**
3007  * _scsih_tm_tr_volume_send - send target reset request for volumes
3008  * @ioc: per adapter object
3009  * @handle: device handle
3010  * Context: interrupt time.
3011  *
3012  * This is designed to send muliple task management request at the same
3013  * time to the fifo. If the fifo is full, we will append the request,
3014  * and process it in a future completion.
3015  */
3016 static void
3017 _scsih_tm_tr_volume_send(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3018 {
3019         Mpi2SCSITaskManagementRequest_t *mpi_request;
3020         u16 smid;
3021         struct _tr_list *delayed_tr;
3022
3023         if (ioc->shost_recovery || ioc->remove_host ||
3024             ioc->pci_error_recovery) {
3025                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3026                         "%s: host reset in progress!\n",
3027                         __func__, ioc->name));
3028                 return;
3029         }
3030
3031         smid = mpt3sas_base_get_smid_hpr(ioc, ioc->tm_tr_volume_cb_idx);
3032         if (!smid) {
3033                 delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
3034                 if (!delayed_tr)
3035                         return;
3036                 INIT_LIST_HEAD(&delayed_tr->list);
3037                 delayed_tr->handle = handle;
3038                 list_add_tail(&delayed_tr->list, &ioc->delayed_tr_volume_list);
3039                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3040                     "DELAYED:tr:handle(0x%04x), (open)\n",
3041                     ioc->name, handle));
3042                 return;
3043         }
3044
3045         dewtprintk(ioc, pr_info(MPT3SAS_FMT
3046                 "tr_send:handle(0x%04x), (open), smid(%d), cb(%d)\n",
3047                 ioc->name, handle, smid,
3048             ioc->tm_tr_volume_cb_idx));
3049         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
3050         memset(mpi_request, 0, sizeof(Mpi2SCSITaskManagementRequest_t));
3051         mpi_request->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
3052         mpi_request->DevHandle = cpu_to_le16(handle);
3053         mpi_request->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
3054         mpt3sas_base_put_smid_hi_priority(ioc, smid);
3055 }
3056
3057 /**
3058  * _scsih_tm_volume_tr_complete - target reset completion
3059  * @ioc: per adapter object
3060  * @smid: system request message index
3061  * @msix_index: MSIX table index supplied by the OS
3062  * @reply: reply message frame(lower 32bit addr)
3063  * Context: interrupt time.
3064  *
3065  * Return 1 meaning mf should be freed from _base_interrupt
3066  *        0 means the mf is freed from this function.
3067  */
3068 static u8
3069 _scsih_tm_volume_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid,
3070         u8 msix_index, u32 reply)
3071 {
3072         u16 handle;
3073         Mpi2SCSITaskManagementRequest_t *mpi_request_tm;
3074         Mpi2SCSITaskManagementReply_t *mpi_reply =
3075             mpt3sas_base_get_reply_virt_addr(ioc, reply);
3076
3077         if (ioc->shost_recovery || ioc->remove_host ||
3078             ioc->pci_error_recovery) {
3079                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3080                         "%s: host reset in progress!\n",
3081                         __func__, ioc->name));
3082                 return 1;
3083         }
3084         if (unlikely(!mpi_reply)) {
3085                 pr_err(MPT3SAS_FMT "mpi_reply not valid at %s:%d/%s()!\n",
3086                     ioc->name, __FILE__, __LINE__, __func__);
3087                 return 1;
3088         }
3089
3090         mpi_request_tm = mpt3sas_base_get_msg_frame(ioc, smid);
3091         handle = le16_to_cpu(mpi_request_tm->DevHandle);
3092         if (handle != le16_to_cpu(mpi_reply->DevHandle)) {
3093                 dewtprintk(ioc, pr_err(MPT3SAS_FMT
3094                         "spurious interrupt: handle(0x%04x:0x%04x), smid(%d)!!!\n",
3095                         ioc->name, handle,
3096                     le16_to_cpu(mpi_reply->DevHandle), smid));
3097                 return 0;
3098         }
3099
3100         dewtprintk(ioc, pr_info(MPT3SAS_FMT
3101             "tr_complete:handle(0x%04x), (open) smid(%d), ioc_status(0x%04x), "
3102             "loginfo(0x%08x), completed(%d)\n", ioc->name,
3103             handle, smid, le16_to_cpu(mpi_reply->IOCStatus),
3104             le32_to_cpu(mpi_reply->IOCLogInfo),
3105             le32_to_cpu(mpi_reply->TerminationCount)));
3106
3107         return _scsih_check_for_pending_tm(ioc, smid);
3108 }
3109
3110
3111 /**
3112  * _scsih_check_for_pending_tm - check for pending task management
3113  * @ioc: per adapter object
3114  * @smid: system request message index
3115  *
3116  * This will check delayed target reset list, and feed the
3117  * next reqeust.
3118  *
3119  * Return 1 meaning mf should be freed from _base_interrupt
3120  *        0 means the mf is freed from this function.
3121  */
3122 static u8
3123 _scsih_check_for_pending_tm(struct MPT3SAS_ADAPTER *ioc, u16 smid)
3124 {
3125         struct _tr_list *delayed_tr;
3126
3127         if (!list_empty(&ioc->delayed_tr_volume_list)) {
3128                 delayed_tr = list_entry(ioc->delayed_tr_volume_list.next,
3129                     struct _tr_list, list);
3130                 mpt3sas_base_free_smid(ioc, smid);
3131                 _scsih_tm_tr_volume_send(ioc, delayed_tr->handle);
3132                 list_del(&delayed_tr->list);
3133                 kfree(delayed_tr);
3134                 return 0;
3135         }
3136
3137         if (!list_empty(&ioc->delayed_tr_list)) {
3138                 delayed_tr = list_entry(ioc->delayed_tr_list.next,
3139                     struct _tr_list, list);
3140                 mpt3sas_base_free_smid(ioc, smid);
3141                 _scsih_tm_tr_send(ioc, delayed_tr->handle);
3142                 list_del(&delayed_tr->list);
3143                 kfree(delayed_tr);
3144                 return 0;
3145         }
3146
3147         return 1;
3148 }
3149
3150 /**
3151  * _scsih_check_topo_delete_events - sanity check on topo events
3152  * @ioc: per adapter object
3153  * @event_data: the event data payload
3154  *
3155  * This routine added to better handle cable breaker.
3156  *
3157  * This handles the case where driver receives multiple expander
3158  * add and delete events in a single shot.  When there is a delete event
3159  * the routine will void any pending add events waiting in the event queue.
3160  *
3161  * Return nothing.
3162  */
3163 static void
3164 _scsih_check_topo_delete_events(struct MPT3SAS_ADAPTER *ioc,
3165         Mpi2EventDataSasTopologyChangeList_t *event_data)
3166 {
3167         struct fw_event_work *fw_event;
3168         Mpi2EventDataSasTopologyChangeList_t *local_event_data;
3169         u16 expander_handle;
3170         struct _sas_node *sas_expander;
3171         unsigned long flags;
3172         int i, reason_code;
3173         u16 handle;
3174
3175         for (i = 0 ; i < event_data->NumEntries; i++) {
3176                 handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
3177                 if (!handle)
3178                         continue;
3179                 reason_code = event_data->PHY[i].PhyStatus &
3180                     MPI2_EVENT_SAS_TOPO_RC_MASK;
3181                 if (reason_code == MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING)
3182                         _scsih_tm_tr_send(ioc, handle);
3183         }
3184
3185         expander_handle = le16_to_cpu(event_data->ExpanderDevHandle);
3186         if (expander_handle < ioc->sas_hba.num_phys) {
3187                 _scsih_block_io_to_children_attached_directly(ioc, event_data);
3188                 return;
3189         }
3190         if (event_data->ExpStatus ==
3191             MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING) {
3192                 /* put expander attached devices into blocking state */
3193                 spin_lock_irqsave(&ioc->sas_node_lock, flags);
3194                 sas_expander = mpt3sas_scsih_expander_find_by_handle(ioc,
3195                     expander_handle);
3196                 _scsih_block_io_to_children_attached_to_ex(ioc, sas_expander);
3197                 spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
3198                 do {
3199                         handle = find_first_bit(ioc->blocking_handles,
3200                             ioc->facts.MaxDevHandle);
3201                         if (handle < ioc->facts.MaxDevHandle)
3202                                 _scsih_block_io_device(ioc, handle);
3203                 } while (test_and_clear_bit(handle, ioc->blocking_handles));
3204         } else if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_RESPONDING)
3205                 _scsih_block_io_to_children_attached_directly(ioc, event_data);
3206
3207         if (event_data->ExpStatus != MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING)
3208                 return;
3209
3210         /* mark ignore flag for pending events */
3211         spin_lock_irqsave(&ioc->fw_event_lock, flags);
3212         list_for_each_entry(fw_event, &ioc->fw_event_list, list) {
3213                 if (fw_event->event != MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST ||
3214                     fw_event->ignore)
3215                         continue;
3216                 local_event_data = fw_event->event_data;
3217                 if (local_event_data->ExpStatus ==
3218                     MPI2_EVENT_SAS_TOPO_ES_ADDED ||
3219                     local_event_data->ExpStatus ==
3220                     MPI2_EVENT_SAS_TOPO_ES_RESPONDING) {
3221                         if (le16_to_cpu(local_event_data->ExpanderDevHandle) ==
3222                             expander_handle) {
3223                                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3224                                     "setting ignoring flag\n", ioc->name));
3225                                 fw_event->ignore = 1;
3226                         }
3227                 }
3228         }
3229         spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
3230 }
3231
3232 /**
3233  * _scsih_set_volume_delete_flag - setting volume delete flag
3234  * @ioc: per adapter object
3235  * @handle: device handle
3236  *
3237  * This returns nothing.
3238  */
3239 static void
3240 _scsih_set_volume_delete_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3241 {
3242         struct _raid_device *raid_device;
3243         struct MPT3SAS_TARGET *sas_target_priv_data;
3244         unsigned long flags;
3245
3246         spin_lock_irqsave(&ioc->raid_device_lock, flags);
3247         raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
3248         if (raid_device && raid_device->starget &&
3249             raid_device->starget->hostdata) {
3250                 sas_target_priv_data =
3251                     raid_device->starget->hostdata;
3252                 sas_target_priv_data->deleted = 1;
3253                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3254                     "setting delete flag: handle(0x%04x), "
3255                     "wwid(0x%016llx)\n", ioc->name, handle,
3256                     (unsigned long long) raid_device->wwid));
3257         }
3258         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
3259 }
3260
3261 /**
3262  * _scsih_set_volume_handle_for_tr - set handle for target reset to volume
3263  * @handle: input handle
3264  * @a: handle for volume a
3265  * @b: handle for volume b
3266  *
3267  * IR firmware only supports two raid volumes.  The purpose of this
3268  * routine is to set the volume handle in either a or b. When the given
3269  * input handle is non-zero, or when a and b have not been set before.
3270  */
3271 static void
3272 _scsih_set_volume_handle_for_tr(u16 handle, u16 *a, u16 *b)
3273 {
3274         if (!handle || handle == *a || handle == *b)
3275                 return;
3276         if (!*a)
3277                 *a = handle;
3278         else if (!*b)
3279                 *b = handle;
3280 }
3281
3282 /**
3283  * _scsih_check_ir_config_unhide_events - check for UNHIDE events
3284  * @ioc: per adapter object
3285  * @event_data: the event data payload
3286  * Context: interrupt time.
3287  *
3288  * This routine will send target reset to volume, followed by target
3289  * resets to the PDs. This is called when a PD has been removed, or
3290  * volume has been deleted or removed. When the target reset is sent
3291  * to volume, the PD target resets need to be queued to start upon
3292  * completion of the volume target reset.
3293  *
3294  * Return nothing.
3295  */
3296 static void
3297 _scsih_check_ir_config_unhide_events(struct MPT3SAS_ADAPTER *ioc,
3298         Mpi2EventDataIrConfigChangeList_t *event_data)
3299 {
3300         Mpi2EventIrConfigElement_t *element;
3301         int i;
3302         u16 handle, volume_handle, a, b;
3303         struct _tr_list *delayed_tr;
3304
3305         a = 0;
3306         b = 0;
3307
3308         /* Volume Resets for Deleted or Removed */
3309         element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
3310         for (i = 0; i < event_data->NumElements; i++, element++) {
3311                 if (le32_to_cpu(event_data->Flags) &
3312                     MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
3313                         continue;
3314                 if (element->ReasonCode ==
3315                     MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED ||
3316                     element->ReasonCode ==
3317                     MPI2_EVENT_IR_CHANGE_RC_REMOVED) {
3318                         volume_handle = le16_to_cpu(element->VolDevHandle);
3319                         _scsih_set_volume_delete_flag(ioc, volume_handle);
3320                         _scsih_set_volume_handle_for_tr(volume_handle, &a, &b);
3321                 }
3322         }
3323
3324         /* Volume Resets for UNHIDE events */
3325         element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
3326         for (i = 0; i < event_data->NumElements; i++, element++) {
3327                 if (le32_to_cpu(event_data->Flags) &
3328                     MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
3329                         continue;
3330                 if (element->ReasonCode == MPI2_EVENT_IR_CHANGE_RC_UNHIDE) {
3331                         volume_handle = le16_to_cpu(element->VolDevHandle);
3332                         _scsih_set_volume_handle_for_tr(volume_handle, &a, &b);
3333                 }
3334         }
3335
3336         if (a)
3337                 _scsih_tm_tr_volume_send(ioc, a);
3338         if (b)
3339                 _scsih_tm_tr_volume_send(ioc, b);
3340
3341         /* PD target resets */
3342         element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
3343         for (i = 0; i < event_data->NumElements; i++, element++) {
3344                 if (element->ReasonCode != MPI2_EVENT_IR_CHANGE_RC_UNHIDE)
3345                         continue;
3346                 handle = le16_to_cpu(element->PhysDiskDevHandle);
3347                 volume_handle = le16_to_cpu(element->VolDevHandle);
3348                 clear_bit(handle, ioc->pd_handles);
3349                 if (!volume_handle)
3350                         _scsih_tm_tr_send(ioc, handle);
3351                 else if (volume_handle == a || volume_handle == b) {
3352                         delayed_tr = kzalloc(sizeof(*delayed_tr), GFP_ATOMIC);
3353                         BUG_ON(!delayed_tr);
3354                         INIT_LIST_HEAD(&delayed_tr->list);
3355                         delayed_tr->handle = handle;
3356                         list_add_tail(&delayed_tr->list, &ioc->delayed_tr_list);
3357                         dewtprintk(ioc, pr_info(MPT3SAS_FMT
3358                             "DELAYED:tr:handle(0x%04x), (open)\n", ioc->name,
3359                             handle));
3360                 } else
3361                         _scsih_tm_tr_send(ioc, handle);
3362         }
3363 }
3364
3365
3366 /**
3367  * _scsih_check_volume_delete_events - set delete flag for volumes
3368  * @ioc: per adapter object
3369  * @event_data: the event data payload
3370  * Context: interrupt time.
3371  *
3372  * This will handle the case when the cable connected to entire volume is
3373  * pulled. We will take care of setting the deleted flag so normal IO will
3374  * not be sent.
3375  *
3376  * Return nothing.
3377  */
3378 static void
3379 _scsih_check_volume_delete_events(struct MPT3SAS_ADAPTER *ioc,
3380         Mpi2EventDataIrVolume_t *event_data)
3381 {
3382         u32 state;
3383
3384         if (event_data->ReasonCode != MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED)
3385                 return;
3386         state = le32_to_cpu(event_data->NewValue);
3387         if (state == MPI2_RAID_VOL_STATE_MISSING || state ==
3388             MPI2_RAID_VOL_STATE_FAILED)
3389                 _scsih_set_volume_delete_flag(ioc,
3390                     le16_to_cpu(event_data->VolDevHandle));
3391 }
3392
3393 /**
3394  * _scsih_flush_running_cmds - completing outstanding commands.
3395  * @ioc: per adapter object
3396  *
3397  * The flushing out of all pending scmd commands following host reset,
3398  * where all IO is dropped to the floor.
3399  *
3400  * Return nothing.
3401  */
3402 static void
3403 _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
3404 {
3405         struct scsi_cmnd *scmd;
3406         u16 smid;
3407         u16 count = 0;
3408
3409         for (smid = 1; smid <= ioc->scsiio_depth; smid++) {
3410                 scmd = _scsih_scsi_lookup_get_clear(ioc, smid);
3411                 if (!scmd)
3412                         continue;
3413                 count++;
3414                 mpt3sas_base_free_smid(ioc, smid);
3415                 scsi_dma_unmap(scmd);
3416                 if (ioc->pci_error_recovery)
3417                         scmd->result = DID_NO_CONNECT << 16;
3418                 else
3419                         scmd->result = DID_RESET << 16;
3420                 scmd->scsi_done(scmd);
3421         }
3422         dtmprintk(ioc, pr_info(MPT3SAS_FMT "completing %d cmds\n",
3423             ioc->name, count));
3424 }
3425
3426 /**
3427  * _scsih_setup_eedp - setup MPI request for EEDP transfer
3428  * @ioc: per adapter object
3429  * @scmd: pointer to scsi command object
3430  * @mpi_request: pointer to the SCSI_IO reqest message frame
3431  *
3432  * Supporting protection 1 and 3.
3433  *
3434  * Returns nothing
3435  */
3436 static void
3437 _scsih_setup_eedp(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
3438         Mpi2SCSIIORequest_t *mpi_request)
3439 {
3440         u16 eedp_flags;
3441         unsigned char prot_op = scsi_get_prot_op(scmd);
3442         unsigned char prot_type = scsi_get_prot_type(scmd);
3443         Mpi25SCSIIORequest_t *mpi_request_3v =
3444            (Mpi25SCSIIORequest_t *)mpi_request;
3445
3446         if (prot_type == SCSI_PROT_DIF_TYPE0 || prot_op == SCSI_PROT_NORMAL)
3447                 return;
3448
3449         if (prot_op ==  SCSI_PROT_READ_STRIP)
3450                 eedp_flags = MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP;
3451         else if (prot_op ==  SCSI_PROT_WRITE_INSERT)
3452                 eedp_flags = MPI2_SCSIIO_EEDPFLAGS_INSERT_OP;
3453         else
3454                 return;
3455
3456         switch (prot_type) {
3457         case SCSI_PROT_DIF_TYPE1:
3458         case SCSI_PROT_DIF_TYPE2:
3459
3460                 /*
3461                 * enable ref/guard checking
3462                 * auto increment ref tag
3463                 */
3464                 eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG |
3465                     MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG |
3466                     MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD;
3467                 mpi_request->CDB.EEDP32.PrimaryReferenceTag =
3468                     cpu_to_be32(scsi_get_lba(scmd));
3469                 break;
3470
3471         case SCSI_PROT_DIF_TYPE3:
3472
3473                 /*
3474                 * enable guard checking
3475                 */
3476                 eedp_flags |= MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD;
3477
3478                 break;
3479         }
3480
3481         mpi_request_3v->EEDPBlockSize =
3482             cpu_to_le16(scmd->device->sector_size);
3483         mpi_request->EEDPFlags = cpu_to_le16(eedp_flags);
3484 }
3485
3486 /**
3487  * _scsih_eedp_error_handling - return sense code for EEDP errors
3488  * @scmd: pointer to scsi command object
3489  * @ioc_status: ioc status
3490  *
3491  * Returns nothing
3492  */
3493 static void
3494 _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
3495 {
3496         u8 ascq;
3497
3498         switch (ioc_status) {
3499         case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
3500                 ascq = 0x01;
3501                 break;
3502         case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
3503                 ascq = 0x02;
3504                 break;
3505         case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
3506                 ascq = 0x03;
3507                 break;
3508         default:
3509                 ascq = 0x00;
3510                 break;
3511         }
3512         scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 0x10,
3513             ascq);
3514         scmd->result = DRIVER_SENSE << 24 | (DID_ABORT << 16) |
3515             SAM_STAT_CHECK_CONDITION;
3516 }
3517
3518
3519 /**
3520  * _scsih_qcmd - main scsi request entry point
3521  * @scmd: pointer to scsi command object
3522  * @done: function pointer to be invoked on completion
3523  *
3524  * The callback index is set inside `ioc->scsi_io_cb_idx`.
3525  *
3526  * Returns 0 on success.  If there's a failure, return either:
3527  * SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or
3528  * SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full
3529  */
3530 static int
3531 _scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
3532 {
3533         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
3534         struct MPT3SAS_DEVICE *sas_device_priv_data;
3535         struct MPT3SAS_TARGET *sas_target_priv_data;
3536         Mpi2SCSIIORequest_t *mpi_request;
3537         u32 mpi_control;
3538         u16 smid;
3539         u16 handle;
3540
3541 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
3542         if (ioc->logging_level & MPT_DEBUG_SCSI)
3543                 scsi_print_command(scmd);
3544 #endif
3545
3546         sas_device_priv_data = scmd->device->hostdata;
3547         if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
3548                 scmd->result = DID_NO_CONNECT << 16;
3549                 scmd->scsi_done(scmd);
3550                 return 0;
3551         }
3552
3553         if (ioc->pci_error_recovery || ioc->remove_host) {
3554                 scmd->result = DID_NO_CONNECT << 16;
3555                 scmd->scsi_done(scmd);
3556                 return 0;
3557         }
3558
3559         sas_target_priv_data = sas_device_priv_data->sas_target;
3560
3561         /* invalid device handle */
3562         handle = sas_target_priv_data->handle;
3563         if (handle == MPT3SAS_INVALID_DEVICE_HANDLE) {
3564                 scmd->result = DID_NO_CONNECT << 16;
3565                 scmd->scsi_done(scmd);
3566                 return 0;
3567         }
3568
3569
3570         /* host recovery or link resets sent via IOCTLs */
3571         if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress)
3572                 return SCSI_MLQUEUE_HOST_BUSY;
3573
3574         /* device has been deleted */
3575         else if (sas_target_priv_data->deleted) {
3576                 scmd->result = DID_NO_CONNECT << 16;
3577                 scmd->scsi_done(scmd);
3578                 return 0;
3579         /* device busy with task managment */
3580         } else if (sas_target_priv_data->tm_busy ||
3581             sas_device_priv_data->block)
3582                 return SCSI_MLQUEUE_DEVICE_BUSY;
3583
3584         if (scmd->sc_data_direction == DMA_FROM_DEVICE)
3585                 mpi_control = MPI2_SCSIIO_CONTROL_READ;
3586         else if (scmd->sc_data_direction == DMA_TO_DEVICE)
3587                 mpi_control = MPI2_SCSIIO_CONTROL_WRITE;
3588         else
3589                 mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER;
3590
3591         /* set tags */
3592         if (!(sas_device_priv_data->flags & MPT_DEVICE_FLAGS_INIT)) {
3593                 if (scmd->device->tagged_supported) {
3594                         if (scmd->device->ordered_tags)
3595                                 mpi_control |= MPI2_SCSIIO_CONTROL_ORDEREDQ;
3596                         else
3597                                 mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
3598                 } else
3599                         mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
3600         } else
3601                 mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
3602
3603         if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) &&
3604             scmd->cmd_len != 32)
3605                 mpi_control |= MPI2_SCSIIO_CONTROL_TLR_ON;
3606
3607         smid = mpt3sas_base_get_smid_scsiio(ioc, ioc->scsi_io_cb_idx, scmd);
3608         if (!smid) {
3609                 pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
3610                     ioc->name, __func__);
3611                 goto out;
3612         }
3613         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
3614         memset(mpi_request, 0, sizeof(Mpi2SCSIIORequest_t));
3615         _scsih_setup_eedp(ioc, scmd, mpi_request);
3616
3617         if (scmd->cmd_len == 32)
3618                 mpi_control |= 4 << MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT;
3619         mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
3620         if (sas_device_priv_data->sas_target->flags &
3621             MPT_TARGET_FLAGS_RAID_COMPONENT)
3622                 mpi_request->Function = MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
3623         else
3624                 mpi_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
3625         mpi_request->DevHandle = cpu_to_le16(handle);
3626         mpi_request->DataLength = cpu_to_le32(scsi_bufflen(scmd));
3627         mpi_request->Control = cpu_to_le32(mpi_control);
3628         mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len);
3629         mpi_request->MsgFlags = MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR;
3630         mpi_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE;
3631         mpi_request->SenseBufferLowAddress =
3632             mpt3sas_base_get_sense_buffer_dma(ioc, smid);
3633         mpi_request->SGLOffset0 = offsetof(Mpi2SCSIIORequest_t, SGL) / 4;
3634         int_to_scsilun(sas_device_priv_data->lun, (struct scsi_lun *)
3635             mpi_request->LUN);
3636         memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
3637
3638         if (mpi_request->DataLength) {
3639                 if (ioc->build_sg_scmd(ioc, scmd, smid)) {
3640                         mpt3sas_base_free_smid(ioc, smid);
3641                         goto out;
3642                 }
3643         } else
3644                 ioc->build_zero_len_sge(ioc, &mpi_request->SGL);
3645
3646         if (likely(mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST)) {
3647                 if (sas_target_priv_data->flags & MPT_TARGET_FASTPATH_IO) {
3648                         mpi_request->IoFlags = cpu_to_le16(scmd->cmd_len |
3649                             MPI25_SCSIIO_IOFLAGS_FAST_PATH);
3650                         mpt3sas_base_put_smid_fast_path(ioc, smid, handle);
3651                 } else
3652                         mpt3sas_base_put_smid_scsi_io(ioc, smid, handle);
3653         } else
3654                 mpt3sas_base_put_smid_default(ioc, smid);
3655         return 0;
3656
3657  out:
3658         return SCSI_MLQUEUE_HOST_BUSY;
3659 }
3660
3661 /**
3662  * _scsih_normalize_sense - normalize descriptor and fixed format sense data
3663  * @sense_buffer: sense data returned by target
3664  * @data: normalized skey/asc/ascq
3665  *
3666  * Return nothing.
3667  */
3668 static void
3669 _scsih_normalize_sense(char *sense_buffer, struct sense_info *data)
3670 {
3671         if ((sense_buffer[0] & 0x7F) >= 0x72) {
3672                 /* descriptor format */
3673                 data->skey = sense_buffer[1] & 0x0F;
3674                 data->asc = sense_buffer[2];
3675                 data->ascq = sense_buffer[3];
3676         } else {
3677                 /* fixed format */
3678                 data->skey = sense_buffer[2] & 0x0F;
3679                 data->asc = sense_buffer[12];
3680                 data->ascq = sense_buffer[13];
3681         }
3682 }
3683
3684 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
3685 /**
3686  * _scsih_scsi_ioc_info - translated non-succesfull SCSI_IO request
3687  * @ioc: per adapter object
3688  * @scmd: pointer to scsi command object
3689  * @mpi_reply: reply mf payload returned from firmware
3690  *
3691  * scsi_status - SCSI Status code returned from target device
3692  * scsi_state - state info associated with SCSI_IO determined by ioc
3693  * ioc_status - ioc supplied status info
3694  *
3695  * Return nothing.
3696  */
3697 static void
3698 _scsih_scsi_ioc_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
3699         Mpi2SCSIIOReply_t *mpi_reply, u16 smid)
3700 {
3701         u32 response_info;
3702         u8 *response_bytes;
3703         u16 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) &
3704             MPI2_IOCSTATUS_MASK;
3705         u8 scsi_state = mpi_reply->SCSIState;
3706         u8 scsi_status = mpi_reply->SCSIStatus;
3707         char *desc_ioc_state = NULL;
3708         char *desc_scsi_status = NULL;
3709         char *desc_scsi_state = ioc->tmp_string;
3710         u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo);
3711         struct _sas_device *sas_device = NULL;
3712         unsigned long flags;
3713         struct scsi_target *starget = scmd->device->sdev_target;
3714         struct MPT3SAS_TARGET *priv_target = starget->hostdata;
3715         char *device_str = NULL;
3716
3717         if (!priv_target)
3718                 return;
3719         device_str = "volume";
3720
3721         if (log_info == 0x31170000)
3722                 return;
3723
3724         switch (ioc_status) {
3725         case MPI2_IOCSTATUS_SUCCESS:
3726                 desc_ioc_state = "success";
3727                 break;
3728         case MPI2_IOCSTATUS_INVALID_FUNCTION:
3729                 desc_ioc_state = "invalid function";
3730                 break;
3731         case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
3732                 desc_ioc_state = "scsi recovered error";
3733                 break;
3734         case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE:
3735                 desc_ioc_state = "scsi invalid dev handle";
3736                 break;
3737         case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
3738                 desc_ioc_state = "scsi device not there";
3739                 break;
3740         case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
3741                 desc_ioc_state = "scsi data overrun";
3742                 break;
3743         case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN:
3744                 desc_ioc_state = "scsi data underrun";
3745                 break;
3746         case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR:
3747                 desc_ioc_state = "scsi io data error";
3748                 break;
3749         case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
3750                 desc_ioc_state = "scsi protocol error";
3751                 break;
3752         case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
3753                 desc_ioc_state = "scsi task terminated";
3754                 break;
3755         case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
3756                 desc_ioc_state = "scsi residual mismatch";
3757                 break;
3758         case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
3759                 desc_ioc_state = "scsi task mgmt failed";
3760                 break;
3761         case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
3762                 desc_ioc_state = "scsi ioc terminated";
3763                 break;
3764         case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
3765                 desc_ioc_state = "scsi ext terminated";
3766                 break;
3767         case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
3768                 desc_ioc_state = "eedp guard error";
3769                 break;
3770         case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
3771                 desc_ioc_state = "eedp ref tag error";
3772                 break;
3773         case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
3774                 desc_ioc_state = "eedp app tag error";
3775                 break;
3776         default:
3777                 desc_ioc_state = "unknown";
3778                 break;
3779         }
3780
3781         switch (scsi_status) {
3782         case MPI2_SCSI_STATUS_GOOD:
3783                 desc_scsi_status = "good";
3784                 break;
3785         case MPI2_SCSI_STATUS_CHECK_CONDITION:
3786                 desc_scsi_status = "check condition";
3787                 break;
3788         case MPI2_SCSI_STATUS_CONDITION_MET:
3789                 desc_scsi_status = "condition met";
3790                 break;
3791         case MPI2_SCSI_STATUS_BUSY:
3792                 desc_scsi_status = "busy";
3793                 break;
3794         case MPI2_SCSI_STATUS_INTERMEDIATE:
3795                 desc_scsi_status = "intermediate";
3796                 break;
3797         case MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET:
3798                 desc_scsi_status = "intermediate condmet";
3799                 break;
3800         case MPI2_SCSI_STATUS_RESERVATION_CONFLICT:
3801                 desc_scsi_status = "reservation conflict";
3802                 break;
3803         case MPI2_SCSI_STATUS_COMMAND_TERMINATED:
3804                 desc_scsi_status = "command terminated";
3805                 break;
3806         case MPI2_SCSI_STATUS_TASK_SET_FULL:
3807                 desc_scsi_status = "task set full";
3808                 break;
3809         case MPI2_SCSI_STATUS_ACA_ACTIVE:
3810                 desc_scsi_status = "aca active";
3811                 break;
3812         case MPI2_SCSI_STATUS_TASK_ABORTED:
3813                 desc_scsi_status = "task aborted";
3814                 break;
3815         default:
3816                 desc_scsi_status = "unknown";
3817                 break;
3818         }
3819
3820         desc_scsi_state[0] = '\0';
3821         if (!scsi_state)
3822                 desc_scsi_state = " ";
3823         if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID)
3824                 strcat(desc_scsi_state, "response info ");
3825         if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
3826                 strcat(desc_scsi_state, "state terminated ");
3827         if (scsi_state & MPI2_SCSI_STATE_NO_SCSI_STATUS)
3828                 strcat(desc_scsi_state, "no status ");
3829         if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_FAILED)
3830                 strcat(desc_scsi_state, "autosense failed ");
3831         if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID)
3832                 strcat(desc_scsi_state, "autosense valid ");
3833
3834         scsi_print_command(scmd);
3835
3836         if (priv_target->flags & MPT_TARGET_FLAGS_VOLUME) {
3837                 pr_warn(MPT3SAS_FMT "\t%s wwid(0x%016llx)\n", ioc->name,
3838                     device_str, (unsigned long long)priv_target->sas_address);
3839         } else {
3840                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
3841                 sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
3842                     priv_target->sas_address);
3843                 if (sas_device) {
3844                         pr_warn(MPT3SAS_FMT
3845                                 "\tsas_address(0x%016llx), phy(%d)\n",
3846                                 ioc->name, (unsigned long long)
3847                             sas_device->sas_address, sas_device->phy);
3848                         pr_warn(MPT3SAS_FMT
3849                             "\tenclosure_logical_id(0x%016llx), slot(%d)\n",
3850                             ioc->name, (unsigned long long)
3851                             sas_device->enclosure_logical_id, sas_device->slot);
3852                 }
3853                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3854         }
3855
3856         pr_warn(MPT3SAS_FMT
3857                 "\thandle(0x%04x), ioc_status(%s)(0x%04x), smid(%d)\n",
3858                 ioc->name, le16_to_cpu(mpi_reply->DevHandle),
3859             desc_ioc_state, ioc_status, smid);
3860         pr_warn(MPT3SAS_FMT
3861                 "\trequest_len(%d), underflow(%d), resid(%d)\n",
3862                 ioc->name, scsi_bufflen(scmd), scmd->underflow,
3863             scsi_get_resid(scmd));
3864         pr_warn(MPT3SAS_FMT
3865                 "\ttag(%d), transfer_count(%d), sc->result(0x%08x)\n",
3866                 ioc->name, le16_to_cpu(mpi_reply->TaskTag),
3867             le32_to_cpu(mpi_reply->TransferCount), scmd->result);
3868         pr_warn(MPT3SAS_FMT
3869                 "\tscsi_status(%s)(0x%02x), scsi_state(%s)(0x%02x)\n",
3870                 ioc->name, desc_scsi_status,
3871             scsi_status, desc_scsi_state, scsi_state);
3872
3873         if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
3874                 struct sense_info data;
3875                 _scsih_normalize_sense(scmd->sense_buffer, &data);
3876                 pr_warn(MPT3SAS_FMT
3877                         "\t[sense_key,asc,ascq]: [0x%02x,0x%02x,0x%02x], count(%d)\n",
3878                         ioc->name, data.skey,
3879                     data.asc, data.ascq, le32_to_cpu(mpi_reply->SenseCount));
3880         }
3881
3882         if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
3883                 response_info = le32_to_cpu(mpi_reply->ResponseInfo);
3884                 response_bytes = (u8 *)&response_info;
3885                 _scsih_response_code(ioc, response_bytes[0]);
3886         }
3887 }
3888 #endif
3889
3890 /**
3891  * _scsih_turn_on_fault_led - illuminate Fault LED
3892  * @ioc: per adapter object
3893  * @handle: device handle
3894  * Context: process
3895  *
3896  * Return nothing.
3897  */
3898 static void
3899 _scsih_turn_on_fault_led(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3900 {
3901         Mpi2SepReply_t mpi_reply;
3902         Mpi2SepRequest_t mpi_request;
3903
3904         memset(&mpi_request, 0, sizeof(Mpi2SepRequest_t));
3905         mpi_request.Function = MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR;
3906         mpi_request.Action = MPI2_SEP_REQ_ACTION_WRITE_STATUS;
3907         mpi_request.SlotStatus =
3908             cpu_to_le32(MPI2_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT);
3909         mpi_request.DevHandle = cpu_to_le16(handle);
3910         mpi_request.Flags = MPI2_SEP_REQ_FLAGS_DEVHANDLE_ADDRESS;
3911         if ((mpt3sas_base_scsi_enclosure_processor(ioc, &mpi_reply,
3912             &mpi_request)) != 0) {
3913                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n", ioc->name,
3914                 __FILE__, __LINE__, __func__);
3915                 return;
3916         }
3917
3918         if (mpi_reply.IOCStatus || mpi_reply.IOCLogInfo) {
3919                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
3920                         "enclosure_processor: ioc_status (0x%04x), loginfo(0x%08x)\n",
3921                         ioc->name, le16_to_cpu(mpi_reply.IOCStatus),
3922                     le32_to_cpu(mpi_reply.IOCLogInfo)));
3923                 return;
3924         }
3925 }
3926
3927 /**
3928  * _scsih_send_event_to_turn_on_fault_led - fire delayed event
3929  * @ioc: per adapter object
3930  * @handle: device handle
3931  * Context: interrupt.
3932  *
3933  * Return nothing.
3934  */
3935 static void
3936 _scsih_send_event_to_turn_on_fault_led(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3937 {
3938         struct fw_event_work *fw_event;
3939
3940         fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
3941         if (!fw_event)
3942                 return;
3943         fw_event->event = MPT3SAS_TURN_ON_FAULT_LED;
3944         fw_event->device_handle = handle;
3945         fw_event->ioc = ioc;
3946         _scsih_fw_event_add(ioc, fw_event);
3947 }
3948
3949 /**
3950  * _scsih_smart_predicted_fault - process smart errors
3951  * @ioc: per adapter object
3952  * @handle: device handle
3953  * Context: interrupt.
3954  *
3955  * Return nothing.
3956  */
3957 static void
3958 _scsih_smart_predicted_fault(struct MPT3SAS_ADAPTER *ioc, u16 handle)
3959 {
3960         struct scsi_target *starget;
3961         struct MPT3SAS_TARGET *sas_target_priv_data;
3962         Mpi2EventNotificationReply_t *event_reply;
3963         Mpi2EventDataSasDeviceStatusChange_t *event_data;
3964         struct _sas_device *sas_device;
3965         ssize_t sz;
3966         unsigned long flags;
3967
3968         /* only handle non-raid devices */
3969         spin_lock_irqsave(&ioc->sas_device_lock, flags);
3970         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
3971         if (!sas_device) {
3972                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3973                 return;
3974         }
3975         starget = sas_device->starget;
3976         sas_target_priv_data = starget->hostdata;
3977
3978         if ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_RAID_COMPONENT) ||
3979            ((sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME))) {
3980                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3981                 return;
3982         }
3983         starget_printk(KERN_WARNING, starget, "predicted fault\n");
3984         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
3985
3986         if (ioc->pdev->subsystem_vendor == PCI_VENDOR_ID_IBM)
3987                 _scsih_send_event_to_turn_on_fault_led(ioc, handle);
3988
3989         /* insert into event log */
3990         sz = offsetof(Mpi2EventNotificationReply_t, EventData) +
3991              sizeof(Mpi2EventDataSasDeviceStatusChange_t);
3992         event_reply = kzalloc(sz, GFP_KERNEL);
3993         if (!event_reply) {
3994                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
3995                     ioc->name, __FILE__, __LINE__, __func__);
3996                 return;
3997         }
3998
3999         event_reply->Function = MPI2_FUNCTION_EVENT_NOTIFICATION;
4000         event_reply->Event =
4001             cpu_to_le16(MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE);
4002         event_reply->MsgLength = sz/4;
4003         event_reply->EventDataLength =
4004             cpu_to_le16(sizeof(Mpi2EventDataSasDeviceStatusChange_t)/4);
4005         event_data = (Mpi2EventDataSasDeviceStatusChange_t *)
4006             event_reply->EventData;
4007         event_data->ReasonCode = MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA;
4008         event_data->ASC = 0x5D;
4009         event_data->DevHandle = cpu_to_le16(handle);
4010         event_data->SASAddress = cpu_to_le64(sas_target_priv_data->sas_address);
4011         mpt3sas_ctl_add_to_event_log(ioc, event_reply);
4012         kfree(event_reply);
4013 }
4014
4015 /**
4016  * _scsih_io_done - scsi request callback
4017  * @ioc: per adapter object
4018  * @smid: system request message index
4019  * @msix_index: MSIX table index supplied by the OS
4020  * @reply: reply message frame(lower 32bit addr)
4021  *
4022  * Callback handler when using _scsih_qcmd.
4023  *
4024  * Return 1 meaning mf should be freed from _base_interrupt
4025  *        0 means the mf is freed from this function.
4026  */
4027 static u8
4028 _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
4029 {
4030         Mpi2SCSIIORequest_t *mpi_request;
4031         Mpi2SCSIIOReply_t *mpi_reply;
4032         struct scsi_cmnd *scmd;
4033         u16 ioc_status;
4034         u32 xfer_cnt;
4035         u8 scsi_state;
4036         u8 scsi_status;
4037         u32 log_info;
4038         struct MPT3SAS_DEVICE *sas_device_priv_data;
4039         u32 response_code = 0;
4040
4041         mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
4042         scmd = _scsih_scsi_lookup_get_clear(ioc, smid);
4043         if (scmd == NULL)
4044                 return 1;
4045
4046         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4047
4048         if (mpi_reply == NULL) {
4049                 scmd->result = DID_OK << 16;
4050                 goto out;
4051         }
4052
4053         sas_device_priv_data = scmd->device->hostdata;
4054         if (!sas_device_priv_data || !sas_device_priv_data->sas_target ||
4055              sas_device_priv_data->sas_target->deleted) {
4056                 scmd->result = DID_NO_CONNECT << 16;
4057                 goto out;
4058         }
4059         ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
4060
4061         /* turning off TLR */
4062         scsi_state = mpi_reply->SCSIState;
4063         if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID)
4064                 response_code =
4065                     le32_to_cpu(mpi_reply->ResponseInfo) & 0xFF;
4066         if (!sas_device_priv_data->tlr_snoop_check) {
4067                 sas_device_priv_data->tlr_snoop_check++;
4068                 if ((sas_device_priv_data->flags & MPT_DEVICE_TLR_ON) &&
4069                     response_code == MPI2_SCSITASKMGMT_RSP_INVALID_FRAME)
4070                         sas_device_priv_data->flags &=
4071                             ~MPT_DEVICE_TLR_ON;
4072         }
4073
4074         xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);
4075         scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt);
4076         if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
4077                 log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
4078         else
4079                 log_info = 0;
4080         ioc_status &= MPI2_IOCSTATUS_MASK;
4081         scsi_status = mpi_reply->SCSIStatus;
4082
4083         if (ioc_status == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN && xfer_cnt == 0 &&
4084             (scsi_status == MPI2_SCSI_STATUS_BUSY ||
4085              scsi_status == MPI2_SCSI_STATUS_RESERVATION_CONFLICT ||
4086              scsi_status == MPI2_SCSI_STATUS_TASK_SET_FULL)) {
4087                 ioc_status = MPI2_IOCSTATUS_SUCCESS;
4088         }
4089
4090         if (scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
4091                 struct sense_info data;
4092                 const void *sense_data = mpt3sas_base_get_sense_buffer(ioc,
4093                     smid);
4094                 u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE,
4095                     le32_to_cpu(mpi_reply->SenseCount));
4096                 memcpy(scmd->sense_buffer, sense_data, sz);
4097                 _scsih_normalize_sense(scmd->sense_buffer, &data);
4098                 /* failure prediction threshold exceeded */
4099                 if (data.asc == 0x5D)
4100                         _scsih_smart_predicted_fault(ioc,
4101                             le16_to_cpu(mpi_reply->DevHandle));
4102                 mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
4103         }
4104
4105         switch (ioc_status) {
4106         case MPI2_IOCSTATUS_BUSY:
4107         case MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES:
4108                 scmd->result = SAM_STAT_BUSY;
4109                 break;
4110
4111         case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
4112                 scmd->result = DID_NO_CONNECT << 16;
4113                 break;
4114
4115         case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
4116                 if (sas_device_priv_data->block) {
4117                         scmd->result = DID_TRANSPORT_DISRUPTED << 16;
4118                         goto out;
4119                 }
4120                 if (log_info == 0x31110630) {
4121                         if (scmd->retries > 2) {
4122                                 scmd->result = DID_NO_CONNECT << 16;
4123                                 scsi_device_set_state(scmd->device,
4124                                     SDEV_OFFLINE);
4125                         } else {
4126                                 scmd->result = DID_SOFT_ERROR << 16;
4127                                 scmd->device->expecting_cc_ua = 1;
4128                         }
4129                         break;
4130                 }
4131                 scmd->result = DID_SOFT_ERROR << 16;
4132                 break;
4133         case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
4134         case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
4135                 scmd->result = DID_RESET << 16;
4136                 break;
4137
4138         case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
4139                 if ((xfer_cnt == 0) || (scmd->underflow > xfer_cnt))
4140                         scmd->result = DID_SOFT_ERROR << 16;
4141                 else
4142                         scmd->result = (DID_OK << 16) | scsi_status;
4143                 break;
4144
4145         case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN:
4146                 scmd->result = (DID_OK << 16) | scsi_status;
4147
4148                 if ((scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID))
4149                         break;
4150
4151                 if (xfer_cnt < scmd->underflow) {
4152                         if (scsi_status == SAM_STAT_BUSY)
4153                                 scmd->result = SAM_STAT_BUSY;
4154                         else
4155                                 scmd->result = DID_SOFT_ERROR << 16;
4156                 } else if (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED |
4157                      MPI2_SCSI_STATE_NO_SCSI_STATUS))
4158                         scmd->result = DID_SOFT_ERROR << 16;
4159                 else if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
4160                         scmd->result = DID_RESET << 16;
4161                 else if (!xfer_cnt && scmd->cmnd[0] == REPORT_LUNS) {
4162                         mpi_reply->SCSIState = MPI2_SCSI_STATE_AUTOSENSE_VALID;
4163                         mpi_reply->SCSIStatus = SAM_STAT_CHECK_CONDITION;
4164                         scmd->result = (DRIVER_SENSE << 24) |
4165                             SAM_STAT_CHECK_CONDITION;
4166                         scmd->sense_buffer[0] = 0x70;
4167                         scmd->sense_buffer[2] = ILLEGAL_REQUEST;
4168                         scmd->sense_buffer[12] = 0x20;
4169                         scmd->sense_buffer[13] = 0;
4170                 }
4171                 break;
4172
4173         case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
4174                 scsi_set_resid(scmd, 0);
4175         case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
4176         case MPI2_IOCSTATUS_SUCCESS:
4177                 scmd->result = (DID_OK << 16) | scsi_status;
4178                 if (response_code ==
4179                     MPI2_SCSITASKMGMT_RSP_INVALID_FRAME ||
4180                     (scsi_state & (MPI2_SCSI_STATE_AUTOSENSE_FAILED |
4181                      MPI2_SCSI_STATE_NO_SCSI_STATUS)))
4182                         scmd->result = DID_SOFT_ERROR << 16;
4183                 else if (scsi_state & MPI2_SCSI_STATE_TERMINATED)
4184                         scmd->result = DID_RESET << 16;
4185                 break;
4186
4187         case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
4188         case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
4189         case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
4190                 _scsih_eedp_error_handling(scmd, ioc_status);
4191                 break;
4192
4193         case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
4194         case MPI2_IOCSTATUS_INVALID_FUNCTION:
4195         case MPI2_IOCSTATUS_INVALID_SGL:
4196         case MPI2_IOCSTATUS_INTERNAL_ERROR:
4197         case MPI2_IOCSTATUS_INVALID_FIELD:
4198         case MPI2_IOCSTATUS_INVALID_STATE:
4199         case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR:
4200         case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
4201         default:
4202                 scmd->result = DID_SOFT_ERROR << 16;
4203                 break;
4204
4205         }
4206
4207 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
4208         if (scmd->result && (ioc->logging_level & MPT_DEBUG_REPLY))
4209                 _scsih_scsi_ioc_info(ioc , scmd, mpi_reply, smid);
4210 #endif
4211
4212  out:
4213
4214         scsi_dma_unmap(scmd);
4215
4216         scmd->scsi_done(scmd);
4217         return 1;
4218 }
4219
4220 /**
4221  * _scsih_sas_host_refresh - refreshing sas host object contents
4222  * @ioc: per adapter object
4223  * Context: user
4224  *
4225  * During port enable, fw will send topology events for every device. Its
4226  * possible that the handles may change from the previous setting, so this
4227  * code keeping handles updating if changed.
4228  *
4229  * Return nothing.
4230  */
4231 static void
4232 _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
4233 {
4234         u16 sz;
4235         u16 ioc_status;
4236         int i;
4237         Mpi2ConfigReply_t mpi_reply;
4238         Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
4239         u16 attached_handle;
4240         u8 link_rate;
4241
4242         dtmprintk(ioc, pr_info(MPT3SAS_FMT
4243             "updating handles for sas_host(0x%016llx)\n",
4244             ioc->name, (unsigned long long)ioc->sas_hba.sas_address));
4245
4246         sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys
4247             * sizeof(Mpi2SasIOUnit0PhyData_t));
4248         sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
4249         if (!sas_iounit_pg0) {
4250                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4251                     ioc->name, __FILE__, __LINE__, __func__);
4252                 return;
4253         }
4254
4255         if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
4256             sas_iounit_pg0, sz)) != 0)
4257                 goto out;
4258         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
4259         if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
4260                 goto out;
4261         for (i = 0; i < ioc->sas_hba.num_phys ; i++) {
4262                 link_rate = sas_iounit_pg0->PhyData[i].NegotiatedLinkRate >> 4;
4263                 if (i == 0)
4264                         ioc->sas_hba.handle = le16_to_cpu(sas_iounit_pg0->
4265                             PhyData[0].ControllerDevHandle);
4266                 ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
4267                 attached_handle = le16_to_cpu(sas_iounit_pg0->PhyData[i].
4268                     AttachedDevHandle);
4269                 if (attached_handle && link_rate < MPI2_SAS_NEG_LINK_RATE_1_5)
4270                         link_rate = MPI2_SAS_NEG_LINK_RATE_1_5;
4271                 mpt3sas_transport_update_links(ioc, ioc->sas_hba.sas_address,
4272                     attached_handle, i, link_rate);
4273         }
4274  out:
4275         kfree(sas_iounit_pg0);
4276 }
4277
4278 /**
4279  * _scsih_sas_host_add - create sas host object
4280  * @ioc: per adapter object
4281  *
4282  * Creating host side data object, stored in ioc->sas_hba
4283  *
4284  * Return nothing.
4285  */
4286 static void
4287 _scsih_sas_host_add(struct MPT3SAS_ADAPTER *ioc)
4288 {
4289         int i;
4290         Mpi2ConfigReply_t mpi_reply;
4291         Mpi2SasIOUnitPage0_t *sas_iounit_pg0 = NULL;
4292         Mpi2SasIOUnitPage1_t *sas_iounit_pg1 = NULL;
4293         Mpi2SasPhyPage0_t phy_pg0;
4294         Mpi2SasDevicePage0_t sas_device_pg0;
4295         Mpi2SasEnclosurePage0_t enclosure_pg0;
4296         u16 ioc_status;
4297         u16 sz;
4298         u8 device_missing_delay;
4299
4300         mpt3sas_config_get_number_hba_phys(ioc, &ioc->sas_hba.num_phys);
4301         if (!ioc->sas_hba.num_phys) {
4302                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4303                     ioc->name, __FILE__, __LINE__, __func__);
4304                 return;
4305         }
4306
4307         /* sas_iounit page 0 */
4308         sz = offsetof(Mpi2SasIOUnitPage0_t, PhyData) + (ioc->sas_hba.num_phys *
4309             sizeof(Mpi2SasIOUnit0PhyData_t));
4310         sas_iounit_pg0 = kzalloc(sz, GFP_KERNEL);
4311         if (!sas_iounit_pg0) {
4312                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4313                     ioc->name, __FILE__, __LINE__, __func__);
4314                 return;
4315         }
4316         if ((mpt3sas_config_get_sas_iounit_pg0(ioc, &mpi_reply,
4317             sas_iounit_pg0, sz))) {
4318                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4319                     ioc->name, __FILE__, __LINE__, __func__);
4320                 goto out;
4321         }
4322         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4323             MPI2_IOCSTATUS_MASK;
4324         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4325                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4326                     ioc->name, __FILE__, __LINE__, __func__);
4327                 goto out;
4328         }
4329
4330         /* sas_iounit page 1 */
4331         sz = offsetof(Mpi2SasIOUnitPage1_t, PhyData) + (ioc->sas_hba.num_phys *
4332             sizeof(Mpi2SasIOUnit1PhyData_t));
4333         sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL);
4334         if (!sas_iounit_pg1) {
4335                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4336                     ioc->name, __FILE__, __LINE__, __func__);
4337                 goto out;
4338         }
4339         if ((mpt3sas_config_get_sas_iounit_pg1(ioc, &mpi_reply,
4340             sas_iounit_pg1, sz))) {
4341                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4342                     ioc->name, __FILE__, __LINE__, __func__);
4343                 goto out;
4344         }
4345         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4346             MPI2_IOCSTATUS_MASK;
4347         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4348                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4349                     ioc->name, __FILE__, __LINE__, __func__);
4350                 goto out;
4351         }
4352
4353         ioc->io_missing_delay =
4354             sas_iounit_pg1->IODeviceMissingDelay;
4355         device_missing_delay =
4356             sas_iounit_pg1->ReportDeviceMissingDelay;
4357         if (device_missing_delay & MPI2_SASIOUNIT1_REPORT_MISSING_UNIT_16)
4358                 ioc->device_missing_delay = (device_missing_delay &
4359                     MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK) * 16;
4360         else
4361                 ioc->device_missing_delay = device_missing_delay &
4362                     MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK;
4363
4364         ioc->sas_hba.parent_dev = &ioc->shost->shost_gendev;
4365         ioc->sas_hba.phy = kcalloc(ioc->sas_hba.num_phys,
4366             sizeof(struct _sas_phy), GFP_KERNEL);
4367         if (!ioc->sas_hba.phy) {
4368                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4369                     ioc->name, __FILE__, __LINE__, __func__);
4370                 goto out;
4371         }
4372         for (i = 0; i < ioc->sas_hba.num_phys ; i++) {
4373                 if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply, &phy_pg0,
4374                     i))) {
4375                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4376                             ioc->name, __FILE__, __LINE__, __func__);
4377                         goto out;
4378                 }
4379                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4380                     MPI2_IOCSTATUS_MASK;
4381                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4382                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4383                             ioc->name, __FILE__, __LINE__, __func__);
4384                         goto out;
4385                 }
4386
4387                 if (i == 0)
4388                         ioc->sas_hba.handle = le16_to_cpu(sas_iounit_pg0->
4389                             PhyData[0].ControllerDevHandle);
4390                 ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
4391                 ioc->sas_hba.phy[i].phy_id = i;
4392                 mpt3sas_transport_add_host_phy(ioc, &ioc->sas_hba.phy[i],
4393                     phy_pg0, ioc->sas_hba.parent_dev);
4394         }
4395         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
4396             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, ioc->sas_hba.handle))) {
4397                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4398                     ioc->name, __FILE__, __LINE__, __func__);
4399                 goto out;
4400         }
4401         ioc->sas_hba.enclosure_handle =
4402             le16_to_cpu(sas_device_pg0.EnclosureHandle);
4403         ioc->sas_hba.sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
4404         pr_info(MPT3SAS_FMT
4405                 "host_add: handle(0x%04x), sas_addr(0x%016llx), phys(%d)\n",
4406                 ioc->name, ioc->sas_hba.handle,
4407             (unsigned long long) ioc->sas_hba.sas_address,
4408             ioc->sas_hba.num_phys) ;
4409
4410         if (ioc->sas_hba.enclosure_handle) {
4411                 if (!(mpt3sas_config_get_enclosure_pg0(ioc, &mpi_reply,
4412                     &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
4413                    ioc->sas_hba.enclosure_handle)))
4414                         ioc->sas_hba.enclosure_logical_id =
4415                             le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
4416         }
4417
4418  out:
4419         kfree(sas_iounit_pg1);
4420         kfree(sas_iounit_pg0);
4421 }
4422
4423 /**
4424  * _scsih_expander_add -  creating expander object
4425  * @ioc: per adapter object
4426  * @handle: expander handle
4427  *
4428  * Creating expander object, stored in ioc->sas_expander_list.
4429  *
4430  * Return 0 for success, else error.
4431  */
4432 static int
4433 _scsih_expander_add(struct MPT3SAS_ADAPTER *ioc, u16 handle)
4434 {
4435         struct _sas_node *sas_expander;
4436         Mpi2ConfigReply_t mpi_reply;
4437         Mpi2ExpanderPage0_t expander_pg0;
4438         Mpi2ExpanderPage1_t expander_pg1;
4439         Mpi2SasEnclosurePage0_t enclosure_pg0;
4440         u32 ioc_status;
4441         u16 parent_handle;
4442         u64 sas_address, sas_address_parent = 0;
4443         int i;
4444         unsigned long flags;
4445         struct _sas_port *mpt3sas_port = NULL;
4446
4447         int rc = 0;
4448
4449         if (!handle)
4450                 return -1;
4451
4452         if (ioc->shost_recovery || ioc->pci_error_recovery)
4453                 return -1;
4454
4455         if ((mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
4456             MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) {
4457                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4458                     ioc->name, __FILE__, __LINE__, __func__);
4459                 return -1;
4460         }
4461
4462         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4463             MPI2_IOCSTATUS_MASK;
4464         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4465                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4466                     ioc->name, __FILE__, __LINE__, __func__);
4467                 return -1;
4468         }
4469
4470         /* handle out of order topology events */
4471         parent_handle = le16_to_cpu(expander_pg0.ParentDevHandle);
4472         if (_scsih_get_sas_address(ioc, parent_handle, &sas_address_parent)
4473             != 0) {
4474                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4475                     ioc->name, __FILE__, __LINE__, __func__);
4476                 return -1;
4477         }
4478         if (sas_address_parent != ioc->sas_hba.sas_address) {
4479                 spin_lock_irqsave(&ioc->sas_node_lock, flags);
4480                 sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
4481                     sas_address_parent);
4482                 spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
4483                 if (!sas_expander) {
4484                         rc = _scsih_expander_add(ioc, parent_handle);
4485                         if (rc != 0)
4486                                 return rc;
4487                 }
4488         }
4489
4490         spin_lock_irqsave(&ioc->sas_node_lock, flags);
4491         sas_address = le64_to_cpu(expander_pg0.SASAddress);
4492         sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
4493             sas_address);
4494         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
4495
4496         if (sas_expander)
4497                 return 0;
4498
4499         sas_expander = kzalloc(sizeof(struct _sas_node),
4500             GFP_KERNEL);
4501         if (!sas_expander) {
4502                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4503                     ioc->name, __FILE__, __LINE__, __func__);
4504                 return -1;
4505         }
4506
4507         sas_expander->handle = handle;
4508         sas_expander->num_phys = expander_pg0.NumPhys;
4509         sas_expander->sas_address_parent = sas_address_parent;
4510         sas_expander->sas_address = sas_address;
4511
4512         pr_info(MPT3SAS_FMT "expander_add: handle(0x%04x)," \
4513             " parent(0x%04x), sas_addr(0x%016llx), phys(%d)\n", ioc->name,
4514             handle, parent_handle, (unsigned long long)
4515             sas_expander->sas_address, sas_expander->num_phys);
4516
4517         if (!sas_expander->num_phys)
4518                 goto out_fail;
4519         sas_expander->phy = kcalloc(sas_expander->num_phys,
4520             sizeof(struct _sas_phy), GFP_KERNEL);
4521         if (!sas_expander->phy) {
4522                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4523                     ioc->name, __FILE__, __LINE__, __func__);
4524                 rc = -1;
4525                 goto out_fail;
4526         }
4527
4528         INIT_LIST_HEAD(&sas_expander->sas_port_list);
4529         mpt3sas_port = mpt3sas_transport_port_add(ioc, handle,
4530             sas_address_parent);
4531         if (!mpt3sas_port) {
4532                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4533                     ioc->name, __FILE__, __LINE__, __func__);
4534                 rc = -1;
4535                 goto out_fail;
4536         }
4537         sas_expander->parent_dev = &mpt3sas_port->rphy->dev;
4538
4539         for (i = 0 ; i < sas_expander->num_phys ; i++) {
4540                 if ((mpt3sas_config_get_expander_pg1(ioc, &mpi_reply,
4541                     &expander_pg1, i, handle))) {
4542                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4543                             ioc->name, __FILE__, __LINE__, __func__);
4544                         rc = -1;
4545                         goto out_fail;
4546                 }
4547                 sas_expander->phy[i].handle = handle;
4548                 sas_expander->phy[i].phy_id = i;
4549
4550                 if ((mpt3sas_transport_add_expander_phy(ioc,
4551                     &sas_expander->phy[i], expander_pg1,
4552                     sas_expander->parent_dev))) {
4553                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4554                             ioc->name, __FILE__, __LINE__, __func__);
4555                         rc = -1;
4556                         goto out_fail;
4557                 }
4558         }
4559
4560         if (sas_expander->enclosure_handle) {
4561                 if (!(mpt3sas_config_get_enclosure_pg0(ioc, &mpi_reply,
4562                     &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
4563                    sas_expander->enclosure_handle)))
4564                         sas_expander->enclosure_logical_id =
4565                             le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
4566         }
4567
4568         _scsih_expander_node_add(ioc, sas_expander);
4569          return 0;
4570
4571  out_fail:
4572
4573         if (mpt3sas_port)
4574                 mpt3sas_transport_port_remove(ioc, sas_expander->sas_address,
4575                     sas_address_parent);
4576         kfree(sas_expander);
4577         return rc;
4578 }
4579
4580 /**
4581  * mpt3sas_expander_remove - removing expander object
4582  * @ioc: per adapter object
4583  * @sas_address: expander sas_address
4584  *
4585  * Return nothing.
4586  */
4587 void
4588 mpt3sas_expander_remove(struct MPT3SAS_ADAPTER *ioc, u64 sas_address)
4589 {
4590         struct _sas_node *sas_expander;
4591         unsigned long flags;
4592
4593         if (ioc->shost_recovery)
4594                 return;
4595
4596         spin_lock_irqsave(&ioc->sas_node_lock, flags);
4597         sas_expander = mpt3sas_scsih_expander_find_by_sas_address(ioc,
4598             sas_address);
4599         if (sas_expander)
4600                 list_del(&sas_expander->list);
4601         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
4602         if (sas_expander)
4603                 _scsih_expander_node_remove(ioc, sas_expander);
4604 }
4605
4606 /**
4607  * _scsih_done -  internal SCSI_IO callback handler.
4608  * @ioc: per adapter object
4609  * @smid: system request message index
4610  * @msix_index: MSIX table index supplied by the OS
4611  * @reply: reply message frame(lower 32bit addr)
4612  *
4613  * Callback handler when sending internal generated SCSI_IO.
4614  * The callback index passed is `ioc->scsih_cb_idx`
4615  *
4616  * Return 1 meaning mf should be freed from _base_interrupt
4617  *        0 means the mf is freed from this function.
4618  */
4619 static u8
4620 _scsih_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
4621 {
4622         MPI2DefaultReply_t *mpi_reply;
4623
4624         mpi_reply =  mpt3sas_base_get_reply_virt_addr(ioc, reply);
4625         if (ioc->scsih_cmds.status == MPT3_CMD_NOT_USED)
4626                 return 1;
4627         if (ioc->scsih_cmds.smid != smid)
4628                 return 1;
4629         ioc->scsih_cmds.status |= MPT3_CMD_COMPLETE;
4630         if (mpi_reply) {
4631                 memcpy(ioc->scsih_cmds.reply, mpi_reply,
4632                     mpi_reply->MsgLength*4);
4633                 ioc->scsih_cmds.status |= MPT3_CMD_REPLY_VALID;
4634         }
4635         ioc->scsih_cmds.status &= ~MPT3_CMD_PENDING;
4636         complete(&ioc->scsih_cmds.done);
4637         return 1;
4638 }
4639
4640
4641
4642
4643 #define MPT3_MAX_LUNS (255)
4644
4645
4646 /**
4647  * _scsih_check_access_status - check access flags
4648  * @ioc: per adapter object
4649  * @sas_address: sas address
4650  * @handle: sas device handle
4651  * @access_flags: errors returned during discovery of the device
4652  *
4653  * Return 0 for success, else failure
4654  */
4655 static u8
4656 _scsih_check_access_status(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
4657         u16 handle, u8 access_status)
4658 {
4659         u8 rc = 1;
4660         char *desc = NULL;
4661
4662         switch (access_status) {
4663         case MPI2_SAS_DEVICE0_ASTATUS_NO_ERRORS:
4664         case MPI2_SAS_DEVICE0_ASTATUS_SATA_NEEDS_INITIALIZATION:
4665                 rc = 0;
4666                 break;
4667         case MPI2_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED:
4668                 desc = "sata capability failed";
4669                 break;
4670         case MPI2_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT:
4671                 desc = "sata affiliation conflict";
4672                 break;
4673         case MPI2_SAS_DEVICE0_ASTATUS_ROUTE_NOT_ADDRESSABLE:
4674                 desc = "route not addressable";
4675                 break;
4676         case MPI2_SAS_DEVICE0_ASTATUS_SMP_ERROR_NOT_ADDRESSABLE:
4677                 desc = "smp error not addressable";
4678                 break;
4679         case MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED:
4680                 desc = "device blocked";
4681                 break;
4682         case MPI2_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED:
4683         case MPI2_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN:
4684         case MPI2_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT:
4685         case MPI2_SAS_DEVICE0_ASTATUS_SIF_DIAG:
4686         case MPI2_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION:
4687         case MPI2_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER:
4688         case MPI2_SAS_DEVICE0_ASTATUS_SIF_PIO_SN:
4689         case MPI2_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN:
4690         case MPI2_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN:
4691         case MPI2_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION:
4692         case MPI2_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE:
4693         case MPI2_SAS_DEVICE0_ASTATUS_SIF_MAX:
4694                 desc = "sata initialization failed";
4695                 break;
4696         default:
4697                 desc = "unknown";
4698                 break;
4699         }
4700
4701         if (!rc)
4702                 return 0;
4703
4704         pr_err(MPT3SAS_FMT
4705                 "discovery errors(%s): sas_address(0x%016llx), handle(0x%04x)\n",
4706                 ioc->name, desc, (unsigned long long)sas_address, handle);
4707         return rc;
4708 }
4709
4710 /**
4711  * _scsih_check_device - checking device responsiveness
4712  * @ioc: per adapter object
4713  * @parent_sas_address: sas address of parent expander or sas host
4714  * @handle: attached device handle
4715  * @phy_numberv: phy number
4716  * @link_rate: new link rate
4717  *
4718  * Returns nothing.
4719  */
4720 static void
4721 _scsih_check_device(struct MPT3SAS_ADAPTER *ioc,
4722         u64 parent_sas_address, u16 handle, u8 phy_number, u8 link_rate)
4723 {
4724         Mpi2ConfigReply_t mpi_reply;
4725         Mpi2SasDevicePage0_t sas_device_pg0;
4726         struct _sas_device *sas_device;
4727         u32 ioc_status;
4728         unsigned long flags;
4729         u64 sas_address;
4730         struct scsi_target *starget;
4731         struct MPT3SAS_TARGET *sas_target_priv_data;
4732         u32 device_info;
4733
4734
4735         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
4736             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle)))
4737                 return;
4738
4739         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
4740         if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
4741                 return;
4742
4743         /* wide port handling ~ we need only handle device once for the phy that
4744          * is matched in sas device page zero
4745          */
4746         if (phy_number != sas_device_pg0.PhyNum)
4747                 return;
4748
4749         /* check if this is end device */
4750         device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
4751         if (!(_scsih_is_end_device(device_info)))
4752                 return;
4753
4754         spin_lock_irqsave(&ioc->sas_device_lock, flags);
4755         sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
4756         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
4757             sas_address);
4758
4759         if (!sas_device) {
4760                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4761                 return;
4762         }
4763
4764         if (unlikely(sas_device->handle != handle)) {
4765                 starget = sas_device->starget;
4766                 sas_target_priv_data = starget->hostdata;
4767                 starget_printk(KERN_INFO, starget,
4768                         "handle changed from(0x%04x) to (0x%04x)!!!\n",
4769                         sas_device->handle, handle);
4770                 sas_target_priv_data->handle = handle;
4771                 sas_device->handle = handle;
4772         }
4773
4774         /* check if device is present */
4775         if (!(le16_to_cpu(sas_device_pg0.Flags) &
4776             MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)) {
4777                 pr_err(MPT3SAS_FMT
4778                         "device is not present handle(0x%04x), flags!!!\n",
4779                         ioc->name, handle);
4780                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4781                 return;
4782         }
4783
4784         /* check if there were any issues with discovery */
4785         if (_scsih_check_access_status(ioc, sas_address, handle,
4786             sas_device_pg0.AccessStatus)) {
4787                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4788                 return;
4789         }
4790
4791         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4792         _scsih_ublock_io_device(ioc, sas_address);
4793
4794 }
4795
4796 /**
4797  * _scsih_add_device -  creating sas device object
4798  * @ioc: per adapter object
4799  * @handle: sas device handle
4800  * @phy_num: phy number end device attached to
4801  * @is_pd: is this hidden raid component
4802  *
4803  * Creating end device object, stored in ioc->sas_device_list.
4804  *
4805  * Returns 0 for success, non-zero for failure.
4806  */
4807 static int
4808 _scsih_add_device(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phy_num,
4809         u8 is_pd)
4810 {
4811         Mpi2ConfigReply_t mpi_reply;
4812         Mpi2SasDevicePage0_t sas_device_pg0;
4813         Mpi2SasEnclosurePage0_t enclosure_pg0;
4814         struct _sas_device *sas_device;
4815         u32 ioc_status;
4816         u64 sas_address;
4817         u32 device_info;
4818         unsigned long flags;
4819
4820         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
4821             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
4822                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4823                     ioc->name, __FILE__, __LINE__, __func__);
4824                 return -1;
4825         }
4826
4827         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4828             MPI2_IOCSTATUS_MASK;
4829         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4830                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4831                     ioc->name, __FILE__, __LINE__, __func__);
4832                 return -1;
4833         }
4834
4835         /* check if this is end device */
4836         device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
4837         if (!(_scsih_is_end_device(device_info)))
4838                 return -1;
4839         sas_address = le64_to_cpu(sas_device_pg0.SASAddress);
4840
4841         /* check if device is present */
4842         if (!(le16_to_cpu(sas_device_pg0.Flags) &
4843             MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT)) {
4844                 pr_err(MPT3SAS_FMT "device is not present handle(0x04%x)!!!\n",
4845                         ioc->name, handle);
4846                 return -1;
4847         }
4848
4849         /* check if there were any issues with discovery */
4850         if (_scsih_check_access_status(ioc, sas_address, handle,
4851             sas_device_pg0.AccessStatus))
4852                 return -1;
4853
4854         spin_lock_irqsave(&ioc->sas_device_lock, flags);
4855         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
4856             sas_address);
4857         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4858
4859         if (sas_device)
4860                 return -1;
4861
4862         sas_device = kzalloc(sizeof(struct _sas_device),
4863             GFP_KERNEL);
4864         if (!sas_device) {
4865                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4866                     ioc->name, __FILE__, __LINE__, __func__);
4867                 return 0;
4868         }
4869
4870         sas_device->handle = handle;
4871         if (_scsih_get_sas_address(ioc,
4872             le16_to_cpu(sas_device_pg0.ParentDevHandle),
4873             &sas_device->sas_address_parent) != 0)
4874                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
4875                     ioc->name, __FILE__, __LINE__, __func__);
4876         sas_device->enclosure_handle =
4877             le16_to_cpu(sas_device_pg0.EnclosureHandle);
4878         sas_device->slot =
4879             le16_to_cpu(sas_device_pg0.Slot);
4880         sas_device->device_info = device_info;
4881         sas_device->sas_address = sas_address;
4882         sas_device->phy = sas_device_pg0.PhyNum;
4883         sas_device->fast_path = (le16_to_cpu(sas_device_pg0.Flags) &
4884             MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) ? 1 : 0;
4885
4886         /* get enclosure_logical_id */
4887         if (sas_device->enclosure_handle && !(mpt3sas_config_get_enclosure_pg0(
4888            ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
4889            sas_device->enclosure_handle)))
4890                 sas_device->enclosure_logical_id =
4891                     le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
4892
4893         /* get device name */
4894         sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName);
4895
4896         if (ioc->wait_for_discovery_to_complete)
4897                 _scsih_sas_device_init_add(ioc, sas_device);
4898         else
4899                 _scsih_sas_device_add(ioc, sas_device);
4900
4901         return 0;
4902 }
4903
4904 /**
4905  * _scsih_remove_device -  removing sas device object
4906  * @ioc: per adapter object
4907  * @sas_device_delete: the sas_device object
4908  *
4909  * Return nothing.
4910  */
4911 static void
4912 _scsih_remove_device(struct MPT3SAS_ADAPTER *ioc,
4913         struct _sas_device *sas_device)
4914 {
4915         struct MPT3SAS_TARGET *sas_target_priv_data;
4916
4917
4918         dewtprintk(ioc, pr_info(MPT3SAS_FMT
4919                 "%s: enter: handle(0x%04x), sas_addr(0x%016llx)\n",
4920                 ioc->name, __func__,
4921             sas_device->handle, (unsigned long long)
4922             sas_device->sas_address));
4923
4924         if (sas_device->starget && sas_device->starget->hostdata) {
4925                 sas_target_priv_data = sas_device->starget->hostdata;
4926                 sas_target_priv_data->deleted = 1;
4927                 _scsih_ublock_io_device(ioc, sas_device->sas_address);
4928                 sas_target_priv_data->handle =
4929                      MPT3SAS_INVALID_DEVICE_HANDLE;
4930         }
4931         mpt3sas_transport_port_remove(ioc,
4932                     sas_device->sas_address,
4933                     sas_device->sas_address_parent);
4934
4935         pr_info(MPT3SAS_FMT
4936                 "removing handle(0x%04x), sas_addr(0x%016llx)\n",
4937                 ioc->name, sas_device->handle,
4938             (unsigned long long) sas_device->sas_address);
4939
4940         dewtprintk(ioc, pr_info(MPT3SAS_FMT
4941                 "%s: exit: handle(0x%04x), sas_addr(0x%016llx)\n",
4942                 ioc->name, __func__,
4943             sas_device->handle, (unsigned long long)
4944             sas_device->sas_address));
4945
4946         kfree(sas_device);
4947 }
4948
4949 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
4950 /**
4951  * _scsih_sas_topology_change_event_debug - debug for topology event
4952  * @ioc: per adapter object
4953  * @event_data: event data payload
4954  * Context: user.
4955  */
4956 static void
4957 _scsih_sas_topology_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
4958         Mpi2EventDataSasTopologyChangeList_t *event_data)
4959 {
4960         int i;
4961         u16 handle;
4962         u16 reason_code;
4963         u8 phy_number;
4964         char *status_str = NULL;
4965         u8 link_rate, prev_link_rate;
4966
4967         switch (event_data->ExpStatus) {
4968         case MPI2_EVENT_SAS_TOPO_ES_ADDED:
4969                 status_str = "add";
4970                 break;
4971         case MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING:
4972                 status_str = "remove";
4973                 break;
4974         case MPI2_EVENT_SAS_TOPO_ES_RESPONDING:
4975         case 0:
4976                 status_str =  "responding";
4977                 break;
4978         case MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING:
4979                 status_str = "remove delay";
4980                 break;
4981         default:
4982                 status_str = "unknown status";
4983                 break;
4984         }
4985         pr_info(MPT3SAS_FMT "sas topology change: (%s)\n",
4986             ioc->name, status_str);
4987         pr_info("\thandle(0x%04x), enclosure_handle(0x%04x) " \
4988             "start_phy(%02d), count(%d)\n",
4989             le16_to_cpu(event_data->ExpanderDevHandle),
4990             le16_to_cpu(event_data->EnclosureHandle),
4991             event_data->StartPhyNum, event_data->NumEntries);
4992         for (i = 0; i < event_data->NumEntries; i++) {
4993                 handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
4994                 if (!handle)
4995                         continue;
4996                 phy_number = event_data->StartPhyNum + i;
4997                 reason_code = event_data->PHY[i].PhyStatus &
4998                     MPI2_EVENT_SAS_TOPO_RC_MASK;
4999                 switch (reason_code) {
5000                 case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
5001                         status_str = "target add";
5002                         break;
5003                 case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING:
5004                         status_str = "target remove";
5005                         break;
5006                 case MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING:
5007                         status_str = "delay target remove";
5008                         break;
5009                 case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
5010                         status_str = "link rate change";
5011                         break;
5012                 case MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE:
5013                         status_str = "target responding";
5014                         break;
5015                 default:
5016                         status_str = "unknown";
5017                         break;
5018                 }
5019                 link_rate = event_data->PHY[i].LinkRate >> 4;
5020                 prev_link_rate = event_data->PHY[i].LinkRate & 0xF;
5021                 pr_info("\tphy(%02d), attached_handle(0x%04x): %s:" \
5022                     " link rate: new(0x%02x), old(0x%02x)\n", phy_number,
5023                     handle, status_str, link_rate, prev_link_rate);
5024
5025         }
5026 }
5027 #endif
5028
5029 /**
5030  * _scsih_sas_topology_change_event - handle topology changes
5031  * @ioc: per adapter object
5032  * @fw_event: The fw_event_work object
5033  * Context: user.
5034  *
5035  */
5036 static int
5037 _scsih_sas_topology_change_event(struct MPT3SAS_ADAPTER *ioc,
5038         struct fw_event_work *fw_event)
5039 {
5040         int i;
5041         u16 parent_handle, handle;
5042         u16 reason_code;
5043         u8 phy_number, max_phys;
5044         struct _sas_node *sas_expander;
5045         u64 sas_address;
5046         unsigned long flags;
5047         u8 link_rate, prev_link_rate;
5048         Mpi2EventDataSasTopologyChangeList_t *event_data = fw_event->event_data;
5049
5050 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5051         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
5052                 _scsih_sas_topology_change_event_debug(ioc, event_data);
5053 #endif
5054
5055         if (ioc->shost_recovery || ioc->remove_host || ioc->pci_error_recovery)
5056                 return 0;
5057
5058         if (!ioc->sas_hba.num_phys)
5059                 _scsih_sas_host_add(ioc);
5060         else
5061                 _scsih_sas_host_refresh(ioc);
5062
5063         if (fw_event->ignore) {
5064                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
5065                         "ignoring expander event\n", ioc->name));
5066                 return 0;
5067         }
5068
5069         parent_handle = le16_to_cpu(event_data->ExpanderDevHandle);
5070
5071         /* handle expander add */
5072         if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_ADDED)
5073                 if (_scsih_expander_add(ioc, parent_handle) != 0)
5074                         return 0;
5075
5076         spin_lock_irqsave(&ioc->sas_node_lock, flags);
5077         sas_expander = mpt3sas_scsih_expander_find_by_handle(ioc,
5078             parent_handle);
5079         if (sas_expander) {
5080                 sas_address = sas_expander->sas_address;
5081                 max_phys = sas_expander->num_phys;
5082         } else if (parent_handle < ioc->sas_hba.num_phys) {
5083                 sas_address = ioc->sas_hba.sas_address;
5084                 max_phys = ioc->sas_hba.num_phys;
5085         } else {
5086                 spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
5087                 return 0;
5088         }
5089         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
5090
5091         /* handle siblings events */
5092         for (i = 0; i < event_data->NumEntries; i++) {
5093                 if (fw_event->ignore) {
5094                         dewtprintk(ioc, pr_info(MPT3SAS_FMT
5095                                 "ignoring expander event\n", ioc->name));
5096                         return 0;
5097                 }
5098                 if (ioc->remove_host || ioc->pci_error_recovery)
5099                         return 0;
5100                 phy_number = event_data->StartPhyNum + i;
5101                 if (phy_number >= max_phys)
5102                         continue;
5103                 reason_code = event_data->PHY[i].PhyStatus &
5104                     MPI2_EVENT_SAS_TOPO_RC_MASK;
5105                 if ((event_data->PHY[i].PhyStatus &
5106                     MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) && (reason_code !=
5107                     MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING))
5108                                 continue;
5109                 handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle);
5110                 if (!handle)
5111                         continue;
5112                 link_rate = event_data->PHY[i].LinkRate >> 4;
5113                 prev_link_rate = event_data->PHY[i].LinkRate & 0xF;
5114                 switch (reason_code) {
5115                 case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:
5116
5117                         if (ioc->shost_recovery)
5118                                 break;
5119
5120                         if (link_rate == prev_link_rate)
5121                                 break;
5122
5123                         mpt3sas_transport_update_links(ioc, sas_address,
5124                             handle, phy_number, link_rate);
5125
5126                         if (link_rate < MPI2_SAS_NEG_LINK_RATE_1_5)
5127                                 break;
5128
5129                         _scsih_check_device(ioc, sas_address, handle,
5130                             phy_number, link_rate);
5131
5132
5133                 case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:
5134
5135                         if (ioc->shost_recovery)
5136                                 break;
5137
5138                         mpt3sas_transport_update_links(ioc, sas_address,
5139                             handle, phy_number, link_rate);
5140
5141                         _scsih_add_device(ioc, handle, phy_number, 0);
5142
5143                         break;
5144                 case MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING:
5145
5146                         _scsih_device_remove_by_handle(ioc, handle);
5147                         break;
5148                 }
5149         }
5150
5151         /* handle expander removal */
5152         if (event_data->ExpStatus == MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING &&
5153             sas_expander)
5154                 mpt3sas_expander_remove(ioc, sas_address);
5155
5156         return 0;
5157 }
5158
5159 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5160 /**
5161  * _scsih_sas_device_status_change_event_debug - debug for device event
5162  * @event_data: event data payload
5163  * Context: user.
5164  *
5165  * Return nothing.
5166  */
5167 static void
5168 _scsih_sas_device_status_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
5169         Mpi2EventDataSasDeviceStatusChange_t *event_data)
5170 {
5171         char *reason_str = NULL;
5172
5173         switch (event_data->ReasonCode) {
5174         case MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
5175                 reason_str = "smart data";
5176                 break;
5177         case MPI2_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
5178                 reason_str = "unsupported device discovered";
5179                 break;
5180         case MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
5181                 reason_str = "internal device reset";
5182                 break;
5183         case MPI2_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
5184                 reason_str = "internal task abort";
5185                 break;
5186         case MPI2_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
5187                 reason_str = "internal task abort set";
5188                 break;
5189         case MPI2_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
5190                 reason_str = "internal clear task set";
5191                 break;
5192         case MPI2_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
5193                 reason_str = "internal query task";
5194                 break;
5195         case MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE:
5196                 reason_str = "sata init failure";
5197                 break;
5198         case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET:
5199                 reason_str = "internal device reset complete";
5200                 break;
5201         case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_TASK_ABORT_INTERNAL:
5202                 reason_str = "internal task abort complete";
5203                 break;
5204         case MPI2_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION:
5205                 reason_str = "internal async notification";
5206                 break;
5207         case MPI2_EVENT_SAS_DEV_STAT_RC_EXPANDER_REDUCED_FUNCTIONALITY:
5208                 reason_str = "expander reduced functionality";
5209                 break;
5210         case MPI2_EVENT_SAS_DEV_STAT_RC_CMP_EXPANDER_REDUCED_FUNCTIONALITY:
5211                 reason_str = "expander reduced functionality complete";
5212                 break;
5213         default:
5214                 reason_str = "unknown reason";
5215                 break;
5216         }
5217         pr_info(MPT3SAS_FMT "device status change: (%s)\n"
5218             "\thandle(0x%04x), sas address(0x%016llx), tag(%d)",
5219             ioc->name, reason_str, le16_to_cpu(event_data->DevHandle),
5220             (unsigned long long)le64_to_cpu(event_data->SASAddress),
5221             le16_to_cpu(event_data->TaskTag));
5222         if (event_data->ReasonCode == MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA)
5223                 pr_info(MPT3SAS_FMT ", ASC(0x%x), ASCQ(0x%x)\n", ioc->name,
5224                     event_data->ASC, event_data->ASCQ);
5225         pr_info("\n");
5226 }
5227 #endif
5228
5229 /**
5230  * _scsih_sas_device_status_change_event - handle device status change
5231  * @ioc: per adapter object
5232  * @fw_event: The fw_event_work object
5233  * Context: user.
5234  *
5235  * Return nothing.
5236  */
5237 static void
5238 _scsih_sas_device_status_change_event(struct MPT3SAS_ADAPTER *ioc,
5239         struct fw_event_work *fw_event)
5240 {
5241         struct MPT3SAS_TARGET *target_priv_data;
5242         struct _sas_device *sas_device;
5243         u64 sas_address;
5244         unsigned long flags;
5245         Mpi2EventDataSasDeviceStatusChange_t *event_data =
5246             fw_event->event_data;
5247
5248 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5249         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
5250                 _scsih_sas_device_status_change_event_debug(ioc,
5251                      event_data);
5252 #endif
5253
5254         /* In MPI Revision K (0xC), the internal device reset complete was
5255          * implemented, so avoid setting tm_busy flag for older firmware.
5256          */
5257         if ((ioc->facts.HeaderVersion >> 8) < 0xC)
5258                 return;
5259
5260         if (event_data->ReasonCode !=
5261             MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET &&
5262            event_data->ReasonCode !=
5263             MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET)
5264                 return;
5265
5266         spin_lock_irqsave(&ioc->sas_device_lock, flags);
5267         sas_address = le64_to_cpu(event_data->SASAddress);
5268         sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
5269             sas_address);
5270
5271         if (!sas_device || !sas_device->starget) {
5272                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5273                 return;
5274         }
5275
5276         target_priv_data = sas_device->starget->hostdata;
5277         if (!target_priv_data) {
5278                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5279                 return;
5280         }
5281
5282         if (event_data->ReasonCode ==
5283             MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET)
5284                 target_priv_data->tm_busy = 1;
5285         else
5286                 target_priv_data->tm_busy = 0;
5287         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5288 }
5289
5290 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5291 /**
5292  * _scsih_sas_enclosure_dev_status_change_event_debug - debug for enclosure
5293  * event
5294  * @ioc: per adapter object
5295  * @event_data: event data payload
5296  * Context: user.
5297  *
5298  * Return nothing.
5299  */
5300 static void
5301 _scsih_sas_enclosure_dev_status_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
5302         Mpi2EventDataSasEnclDevStatusChange_t *event_data)
5303 {
5304         char *reason_str = NULL;
5305
5306         switch (event_data->ReasonCode) {
5307         case MPI2_EVENT_SAS_ENCL_RC_ADDED:
5308                 reason_str = "enclosure add";
5309                 break;
5310         case MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING:
5311                 reason_str = "enclosure remove";
5312                 break;
5313         default:
5314                 reason_str = "unknown reason";
5315                 break;
5316         }
5317
5318         pr_info(MPT3SAS_FMT "enclosure status change: (%s)\n"
5319             "\thandle(0x%04x), enclosure logical id(0x%016llx)"
5320             " number slots(%d)\n", ioc->name, reason_str,
5321             le16_to_cpu(event_data->EnclosureHandle),
5322             (unsigned long long)le64_to_cpu(event_data->EnclosureLogicalID),
5323             le16_to_cpu(event_data->StartSlot));
5324 }
5325 #endif
5326
5327 /**
5328  * _scsih_sas_enclosure_dev_status_change_event - handle enclosure events
5329  * @ioc: per adapter object
5330  * @fw_event: The fw_event_work object
5331  * Context: user.
5332  *
5333  * Return nothing.
5334  */
5335 static void
5336 _scsih_sas_enclosure_dev_status_change_event(struct MPT3SAS_ADAPTER *ioc,
5337         struct fw_event_work *fw_event)
5338 {
5339 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5340         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
5341                 _scsih_sas_enclosure_dev_status_change_event_debug(ioc,
5342                      fw_event->event_data);
5343 #endif
5344 }
5345
5346 /**
5347  * _scsih_sas_broadcast_primitive_event - handle broadcast events
5348  * @ioc: per adapter object
5349  * @fw_event: The fw_event_work object
5350  * Context: user.
5351  *
5352  * Return nothing.
5353  */
5354 static void
5355 _scsih_sas_broadcast_primitive_event(struct MPT3SAS_ADAPTER *ioc,
5356         struct fw_event_work *fw_event)
5357 {
5358         struct scsi_cmnd *scmd;
5359         struct scsi_device *sdev;
5360         u16 smid, handle;
5361         u32 lun;
5362         struct MPT3SAS_DEVICE *sas_device_priv_data;
5363         u32 termination_count;
5364         u32 query_count;
5365         Mpi2SCSITaskManagementReply_t *mpi_reply;
5366         Mpi2EventDataSasBroadcastPrimitive_t *event_data = fw_event->event_data;
5367         u16 ioc_status;
5368         unsigned long flags;
5369         int r;
5370         u8 max_retries = 0;
5371         u8 task_abort_retries;
5372
5373         mutex_lock(&ioc->tm_cmds.mutex);
5374         pr_info(MPT3SAS_FMT
5375                 "%s: enter: phy number(%d), width(%d)\n",
5376                 ioc->name, __func__, event_data->PhyNum,
5377              event_data->PortWidth);
5378
5379         _scsih_block_io_all_device(ioc);
5380
5381         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5382         mpi_reply = ioc->tm_cmds.reply;
5383  broadcast_aen_retry:
5384
5385         /* sanity checks for retrying this loop */
5386         if (max_retries++ == 5) {
5387                 dewtprintk(ioc, pr_info(MPT3SAS_FMT "%s: giving up\n",
5388                     ioc->name, __func__));
5389                 goto out;
5390         } else if (max_retries > 1)
5391                 dewtprintk(ioc, pr_info(MPT3SAS_FMT "%s: %d retry\n",
5392                     ioc->name, __func__, max_retries - 1));
5393
5394         termination_count = 0;
5395         query_count = 0;
5396         for (smid = 1; smid <= ioc->scsiio_depth; smid++) {
5397                 if (ioc->shost_recovery)
5398                         goto out;
5399                 scmd = _scsih_scsi_lookup_get(ioc, smid);
5400                 if (!scmd)
5401                         continue;
5402                 sdev = scmd->device;
5403                 sas_device_priv_data = sdev->hostdata;
5404                 if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
5405                         continue;
5406                  /* skip hidden raid components */
5407                 if (sas_device_priv_data->sas_target->flags &
5408                     MPT_TARGET_FLAGS_RAID_COMPONENT)
5409                         continue;
5410                  /* skip volumes */
5411                 if (sas_device_priv_data->sas_target->flags &
5412                     MPT_TARGET_FLAGS_VOLUME)
5413                         continue;
5414
5415                 handle = sas_device_priv_data->sas_target->handle;
5416                 lun = sas_device_priv_data->lun;
5417                 query_count++;
5418
5419                 if (ioc->shost_recovery)
5420                         goto out;
5421
5422                 spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
5423                 r = mpt3sas_scsih_issue_tm(ioc, handle, 0, 0, lun,
5424                     MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30,
5425                     TM_MUTEX_OFF);
5426                 if (r == FAILED) {
5427                         sdev_printk(KERN_WARNING, sdev,
5428                             "mpt3sas_scsih_issue_tm: FAILED when sending "
5429                             "QUERY_TASK: scmd(%p)\n", scmd);
5430                         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5431                         goto broadcast_aen_retry;
5432                 }
5433                 ioc_status = le16_to_cpu(mpi_reply->IOCStatus)
5434                     & MPI2_IOCSTATUS_MASK;
5435                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
5436                         sdev_printk(KERN_WARNING, sdev,
5437                                 "query task: FAILED with IOCSTATUS(0x%04x), scmd(%p)\n",
5438                                 ioc_status, scmd);
5439                         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5440                         goto broadcast_aen_retry;
5441                 }
5442
5443                 /* see if IO is still owned by IOC and target */
5444                 if (mpi_reply->ResponseCode ==
5445                      MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED ||
5446                      mpi_reply->ResponseCode ==
5447                      MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC) {
5448                         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5449                         continue;
5450                 }
5451                 task_abort_retries = 0;
5452  tm_retry:
5453                 if (task_abort_retries++ == 60) {
5454                         dewtprintk(ioc, pr_info(MPT3SAS_FMT
5455                             "%s: ABORT_TASK: giving up\n", ioc->name,
5456                             __func__));
5457                         spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5458                         goto broadcast_aen_retry;
5459                 }
5460
5461                 if (ioc->shost_recovery)
5462                         goto out_no_lock;
5463
5464                 r = mpt3sas_scsih_issue_tm(ioc, handle, sdev->channel, sdev->id,
5465                     sdev->lun, MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK, smid, 30,
5466                     TM_MUTEX_OFF);
5467                 if (r == FAILED) {
5468                         sdev_printk(KERN_WARNING, sdev,
5469                             "mpt3sas_scsih_issue_tm: ABORT_TASK: FAILED : "
5470                             "scmd(%p)\n", scmd);
5471                         goto tm_retry;
5472                 }
5473
5474                 if (task_abort_retries > 1)
5475                         sdev_printk(KERN_WARNING, sdev,
5476                             "mpt3sas_scsih_issue_tm: ABORT_TASK: RETRIES (%d):"
5477                             " scmd(%p)\n",
5478                             task_abort_retries - 1, scmd);
5479
5480                 termination_count += le32_to_cpu(mpi_reply->TerminationCount);
5481                 spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
5482         }
5483
5484         if (ioc->broadcast_aen_pending) {
5485                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
5486                         "%s: loop back due to pending AEN\n",
5487                         ioc->name, __func__));
5488                  ioc->broadcast_aen_pending = 0;
5489                  goto broadcast_aen_retry;
5490         }
5491
5492  out:
5493         spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
5494  out_no_lock:
5495
5496         dewtprintk(ioc, pr_info(MPT3SAS_FMT
5497             "%s - exit, query_count = %d termination_count = %d\n",
5498             ioc->name, __func__, query_count, termination_count));
5499
5500         ioc->broadcast_aen_busy = 0;
5501         if (!ioc->shost_recovery)
5502                 _scsih_ublock_io_all_device(ioc);
5503         mutex_unlock(&ioc->tm_cmds.mutex);
5504 }
5505
5506 /**
5507  * _scsih_sas_discovery_event - handle discovery events
5508  * @ioc: per adapter object
5509  * @fw_event: The fw_event_work object
5510  * Context: user.
5511  *
5512  * Return nothing.
5513  */
5514 static void
5515 _scsih_sas_discovery_event(struct MPT3SAS_ADAPTER *ioc,
5516         struct fw_event_work *fw_event)
5517 {
5518         Mpi2EventDataSasDiscovery_t *event_data = fw_event->event_data;
5519
5520 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5521         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) {
5522                 pr_info(MPT3SAS_FMT "discovery event: (%s)", ioc->name,
5523                     (event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED) ?
5524                     "start" : "stop");
5525         if (event_data->DiscoveryStatus)
5526                 pr_info("discovery_status(0x%08x)",
5527                     le32_to_cpu(event_data->DiscoveryStatus));
5528         pr_info("\n");
5529         }
5530 #endif
5531
5532         if (event_data->ReasonCode == MPI2_EVENT_SAS_DISC_RC_STARTED &&
5533             !ioc->sas_hba.num_phys) {
5534                 if (disable_discovery > 0 && ioc->shost_recovery) {
5535                         /* Wait for the reset to complete */
5536                         while (ioc->shost_recovery)
5537                                 ssleep(1);
5538                 }
5539                 _scsih_sas_host_add(ioc);
5540         }
5541 }
5542
5543 /**
5544  * _scsih_ir_fastpath - turn on fastpath for IR physdisk
5545  * @ioc: per adapter object
5546  * @handle: device handle for physical disk
5547  * @phys_disk_num: physical disk number
5548  *
5549  * Return 0 for success, else failure.
5550  */
5551 static int
5552 _scsih_ir_fastpath(struct MPT3SAS_ADAPTER *ioc, u16 handle, u8 phys_disk_num)
5553 {
5554         Mpi2RaidActionRequest_t *mpi_request;
5555         Mpi2RaidActionReply_t *mpi_reply;
5556         u16 smid;
5557         u8 issue_reset = 0;
5558         int rc = 0;
5559         u16 ioc_status;
5560         u32 log_info;
5561
5562
5563         mutex_lock(&ioc->scsih_cmds.mutex);
5564
5565         if (ioc->scsih_cmds.status != MPT3_CMD_NOT_USED) {
5566                 pr_err(MPT3SAS_FMT "%s: scsih_cmd in use\n",
5567                     ioc->name, __func__);
5568                 rc = -EAGAIN;
5569                 goto out;
5570         }
5571         ioc->scsih_cmds.status = MPT3_CMD_PENDING;
5572
5573         smid = mpt3sas_base_get_smid(ioc, ioc->scsih_cb_idx);
5574         if (!smid) {
5575                 pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
5576                     ioc->name, __func__);
5577                 ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
5578                 rc = -EAGAIN;
5579                 goto out;
5580         }
5581
5582         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
5583         ioc->scsih_cmds.smid = smid;
5584         memset(mpi_request, 0, sizeof(Mpi2RaidActionRequest_t));
5585
5586         mpi_request->Function = MPI2_FUNCTION_RAID_ACTION;
5587         mpi_request->Action = MPI2_RAID_ACTION_PHYSDISK_HIDDEN;
5588         mpi_request->PhysDiskNum = phys_disk_num;
5589
5590         dewtprintk(ioc, pr_info(MPT3SAS_FMT "IR RAID_ACTION: turning fast "\
5591             "path on for handle(0x%04x), phys_disk_num (0x%02x)\n", ioc->name,
5592             handle, phys_disk_num));
5593
5594         init_completion(&ioc->scsih_cmds.done);
5595         mpt3sas_base_put_smid_default(ioc, smid);
5596         wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
5597
5598         if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
5599                 pr_err(MPT3SAS_FMT "%s: timeout\n",
5600                     ioc->name, __func__);
5601                 if (!(ioc->scsih_cmds.status & MPT3_CMD_RESET))
5602                         issue_reset = 1;
5603                 rc = -EFAULT;
5604                 goto out;
5605         }
5606
5607         if (ioc->scsih_cmds.status & MPT3_CMD_REPLY_VALID) {
5608
5609                 mpi_reply = ioc->scsih_cmds.reply;
5610                 ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
5611                 if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
5612                         log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
5613                 else
5614                         log_info = 0;
5615                 ioc_status &= MPI2_IOCSTATUS_MASK;
5616                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
5617                         dewtprintk(ioc, pr_info(MPT3SAS_FMT
5618                             "IR RAID_ACTION: failed: ioc_status(0x%04x), "
5619                             "loginfo(0x%08x)!!!\n", ioc->name, ioc_status,
5620                             log_info));
5621                         rc = -EFAULT;
5622                 } else
5623                         dewtprintk(ioc, pr_info(MPT3SAS_FMT
5624                             "IR RAID_ACTION: completed successfully\n",
5625                             ioc->name));
5626         }
5627
5628  out:
5629         ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
5630         mutex_unlock(&ioc->scsih_cmds.mutex);
5631
5632         if (issue_reset)
5633                 mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
5634                     FORCE_BIG_HAMMER);
5635         return rc;
5636 }
5637
5638 /**
5639  * _scsih_reprobe_lun - reprobing lun
5640  * @sdev: scsi device struct
5641  * @no_uld_attach: sdev->no_uld_attach flag setting
5642  *
5643  **/
5644 static void
5645 _scsih_reprobe_lun(struct scsi_device *sdev, void *no_uld_attach)
5646 {
5647         int rc;
5648         sdev->no_uld_attach = no_uld_attach ? 1 : 0;
5649         sdev_printk(KERN_INFO, sdev, "%s raid component\n",
5650             sdev->no_uld_attach ? "hidding" : "exposing");
5651         rc = scsi_device_reprobe(sdev);
5652 }
5653
5654 /**
5655  * _scsih_sas_volume_add - add new volume
5656  * @ioc: per adapter object
5657  * @element: IR config element data
5658  * Context: user.
5659  *
5660  * Return nothing.
5661  */
5662 static void
5663 _scsih_sas_volume_add(struct MPT3SAS_ADAPTER *ioc,
5664         Mpi2EventIrConfigElement_t *element)
5665 {
5666         struct _raid_device *raid_device;
5667         unsigned long flags;
5668         u64 wwid;
5669         u16 handle = le16_to_cpu(element->VolDevHandle);
5670         int rc;
5671
5672         mpt3sas_config_get_volume_wwid(ioc, handle, &wwid);
5673         if (!wwid) {
5674                 pr_err(MPT3SAS_FMT
5675                     "failure at %s:%d/%s()!\n", ioc->name,
5676                     __FILE__, __LINE__, __func__);
5677                 return;
5678         }
5679
5680         spin_lock_irqsave(&ioc->raid_device_lock, flags);
5681         raid_device = _scsih_raid_device_find_by_wwid(ioc, wwid);
5682         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
5683
5684         if (raid_device)
5685                 return;
5686
5687         raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL);
5688         if (!raid_device) {
5689                 pr_err(MPT3SAS_FMT
5690                     "failure at %s:%d/%s()!\n", ioc->name,
5691                     __FILE__, __LINE__, __func__);
5692                 return;
5693         }
5694
5695         raid_device->id = ioc->sas_id++;
5696         raid_device->channel = RAID_CHANNEL;
5697         raid_device->handle = handle;
5698         raid_device->wwid = wwid;
5699         _scsih_raid_device_add(ioc, raid_device);
5700         if (!ioc->wait_for_discovery_to_complete) {
5701                 rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
5702                     raid_device->id, 0);
5703                 if (rc)
5704                         _scsih_raid_device_remove(ioc, raid_device);
5705         } else {
5706                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
5707                 _scsih_determine_boot_device(ioc, raid_device, 1);
5708                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
5709         }
5710 }
5711
5712 /**
5713  * _scsih_sas_volume_delete - delete volume
5714  * @ioc: per adapter object
5715  * @handle: volume device handle
5716  * Context: user.
5717  *
5718  * Return nothing.
5719  */
5720 static void
5721 _scsih_sas_volume_delete(struct MPT3SAS_ADAPTER *ioc, u16 handle)
5722 {
5723         struct _raid_device *raid_device;
5724         unsigned long flags;
5725         struct MPT3SAS_TARGET *sas_target_priv_data;
5726         struct scsi_target *starget = NULL;
5727
5728         spin_lock_irqsave(&ioc->raid_device_lock, flags);
5729         raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
5730         if (raid_device) {
5731                 if (raid_device->starget) {
5732                         starget = raid_device->starget;
5733                         sas_target_priv_data = starget->hostdata;
5734                         sas_target_priv_data->deleted = 1;
5735                 }
5736                 pr_info(MPT3SAS_FMT "removing handle(0x%04x), wwid(0x%016llx)\n",
5737                         ioc->name,  raid_device->handle,
5738                     (unsigned long long) raid_device->wwid);
5739                 list_del(&raid_device->list);
5740                 kfree(raid_device);
5741         }
5742         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
5743         if (starget)
5744                 scsi_remove_target(&starget->dev);
5745 }
5746
5747 /**
5748  * _scsih_sas_pd_expose - expose pd component to /dev/sdX
5749  * @ioc: per adapter object
5750  * @element: IR config element data
5751  * Context: user.
5752  *
5753  * Return nothing.
5754  */
5755 static void
5756 _scsih_sas_pd_expose(struct MPT3SAS_ADAPTER *ioc,
5757         Mpi2EventIrConfigElement_t *element)
5758 {
5759         struct _sas_device *sas_device;
5760         struct scsi_target *starget = NULL;
5761         struct MPT3SAS_TARGET *sas_target_priv_data;
5762         unsigned long flags;
5763         u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
5764
5765         spin_lock_irqsave(&ioc->sas_device_lock, flags);
5766         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
5767         if (sas_device) {
5768                 sas_device->volume_handle = 0;
5769                 sas_device->volume_wwid = 0;
5770                 clear_bit(handle, ioc->pd_handles);
5771                 if (sas_device->starget && sas_device->starget->hostdata) {
5772                         starget = sas_device->starget;
5773                         sas_target_priv_data = starget->hostdata;
5774                         sas_target_priv_data->flags &=
5775                             ~MPT_TARGET_FLAGS_RAID_COMPONENT;
5776                 }
5777         }
5778         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5779         if (!sas_device)
5780                 return;
5781
5782         /* exposing raid component */
5783         if (starget)
5784                 starget_for_each_device(starget, NULL, _scsih_reprobe_lun);
5785 }
5786
5787 /**
5788  * _scsih_sas_pd_hide - hide pd component from /dev/sdX
5789  * @ioc: per adapter object
5790  * @element: IR config element data
5791  * Context: user.
5792  *
5793  * Return nothing.
5794  */
5795 static void
5796 _scsih_sas_pd_hide(struct MPT3SAS_ADAPTER *ioc,
5797         Mpi2EventIrConfigElement_t *element)
5798 {
5799         struct _sas_device *sas_device;
5800         struct scsi_target *starget = NULL;
5801         struct MPT3SAS_TARGET *sas_target_priv_data;
5802         unsigned long flags;
5803         u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
5804         u16 volume_handle = 0;
5805         u64 volume_wwid = 0;
5806
5807         mpt3sas_config_get_volume_handle(ioc, handle, &volume_handle);
5808         if (volume_handle)
5809                 mpt3sas_config_get_volume_wwid(ioc, volume_handle,
5810                     &volume_wwid);
5811
5812         spin_lock_irqsave(&ioc->sas_device_lock, flags);
5813         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
5814         if (sas_device) {
5815                 set_bit(handle, ioc->pd_handles);
5816                 if (sas_device->starget && sas_device->starget->hostdata) {
5817                         starget = sas_device->starget;
5818                         sas_target_priv_data = starget->hostdata;
5819                         sas_target_priv_data->flags |=
5820                             MPT_TARGET_FLAGS_RAID_COMPONENT;
5821                         sas_device->volume_handle = volume_handle;
5822                         sas_device->volume_wwid = volume_wwid;
5823                 }
5824         }
5825         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5826         if (!sas_device)
5827                 return;
5828
5829         /* hiding raid component */
5830         _scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
5831         if (starget)
5832                 starget_for_each_device(starget, (void *)1, _scsih_reprobe_lun);
5833 }
5834
5835 /**
5836  * _scsih_sas_pd_delete - delete pd component
5837  * @ioc: per adapter object
5838  * @element: IR config element data
5839  * Context: user.
5840  *
5841  * Return nothing.
5842  */
5843 static void
5844 _scsih_sas_pd_delete(struct MPT3SAS_ADAPTER *ioc,
5845         Mpi2EventIrConfigElement_t *element)
5846 {
5847         u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
5848
5849         _scsih_device_remove_by_handle(ioc, handle);
5850 }
5851
5852 /**
5853  * _scsih_sas_pd_add - remove pd component
5854  * @ioc: per adapter object
5855  * @element: IR config element data
5856  * Context: user.
5857  *
5858  * Return nothing.
5859  */
5860 static void
5861 _scsih_sas_pd_add(struct MPT3SAS_ADAPTER *ioc,
5862         Mpi2EventIrConfigElement_t *element)
5863 {
5864         struct _sas_device *sas_device;
5865         unsigned long flags;
5866         u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
5867         Mpi2ConfigReply_t mpi_reply;
5868         Mpi2SasDevicePage0_t sas_device_pg0;
5869         u32 ioc_status;
5870         u64 sas_address;
5871         u16 parent_handle;
5872
5873         set_bit(handle, ioc->pd_handles);
5874
5875         spin_lock_irqsave(&ioc->sas_device_lock, flags);
5876         sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
5877         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
5878         if (sas_device) {
5879                 _scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
5880                 return;
5881         }
5882
5883         if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
5884             MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
5885                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
5886                     ioc->name, __FILE__, __LINE__, __func__);
5887                 return;
5888         }
5889
5890         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
5891             MPI2_IOCSTATUS_MASK;
5892         if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
5893                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
5894                     ioc->name, __FILE__, __LINE__, __func__);
5895                 return;
5896         }
5897
5898         parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
5899         if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address))
5900                 mpt3sas_transport_update_links(ioc, sas_address, handle,
5901                     sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
5902
5903         _scsih_ir_fastpath(ioc, handle, element->PhysDiskNum);
5904         _scsih_add_device(ioc, handle, 0, 1);
5905 }
5906
5907 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
5908 /**
5909  * _scsih_sas_ir_config_change_event_debug - debug for IR Config Change events
5910  * @ioc: per adapter object
5911  * @event_data: event data payload
5912  * Context: user.
5913  *
5914  * Return nothing.
5915  */
5916 static void
5917 _scsih_sas_ir_config_change_event_debug(struct MPT3SAS_ADAPTER *ioc,
5918         Mpi2EventDataIrConfigChangeList_t *event_data)
5919 {
5920         Mpi2EventIrConfigElement_t *element;
5921         u8 element_type;
5922         int i;
5923         char *reason_str = NULL, *element_str = NULL;
5924
5925         element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
5926
5927         pr_info(MPT3SAS_FMT "raid config change: (%s), elements(%d)\n",
5928             ioc->name, (le32_to_cpu(event_data->Flags) &
5929             MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ?
5930             "foreign" : "native", event_data->NumElements);
5931         for (i = 0; i < event_data->NumElements; i++, element++) {
5932                 switch (element->ReasonCode) {
5933                 case MPI2_EVENT_IR_CHANGE_RC_ADDED:
5934                         reason_str = "add";
5935                         break;
5936                 case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
5937                         reason_str = "remove";
5938                         break;
5939                 case MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE:
5940                         reason_str = "no change";
5941                         break;
5942                 case MPI2_EVENT_IR_CHANGE_RC_HIDE:
5943                         reason_str = "hide";
5944                         break;
5945                 case MPI2_EVENT_IR_CHANGE_RC_UNHIDE:
5946                         reason_str = "unhide";
5947                         break;
5948                 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
5949                         reason_str = "volume_created";
5950                         break;
5951                 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
5952                         reason_str = "volume_deleted";
5953                         break;
5954                 case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
5955                         reason_str = "pd_created";
5956                         break;
5957                 case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
5958                         reason_str = "pd_deleted";
5959                         break;
5960                 default:
5961                         reason_str = "unknown reason";
5962                         break;
5963                 }
5964                 element_type = le16_to_cpu(element->ElementFlags) &
5965                     MPI2_EVENT_IR_CHANGE_EFLAGS_ELEMENT_TYPE_MASK;
5966                 switch (element_type) {
5967                 case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLUME_ELEMENT:
5968                         element_str = "volume";
5969                         break;
5970                 case MPI2_EVENT_IR_CHANGE_EFLAGS_VOLPHYSDISK_ELEMENT:
5971                         element_str = "phys disk";
5972                         break;
5973                 case MPI2_EVENT_IR_CHANGE_EFLAGS_HOTSPARE_ELEMENT:
5974                         element_str = "hot spare";
5975                         break;
5976                 default:
5977                         element_str = "unknown element";
5978                         break;
5979                 }
5980                 pr_info("\t(%s:%s), vol handle(0x%04x), " \
5981                     "pd handle(0x%04x), pd num(0x%02x)\n", element_str,
5982                     reason_str, le16_to_cpu(element->VolDevHandle),
5983                     le16_to_cpu(element->PhysDiskDevHandle),
5984                     element->PhysDiskNum);
5985         }
5986 }
5987 #endif
5988
5989 /**
5990  * _scsih_sas_ir_config_change_event - handle ir configuration change events
5991  * @ioc: per adapter object
5992  * @fw_event: The fw_event_work object
5993  * Context: user.
5994  *
5995  * Return nothing.
5996  */
5997 static void
5998 _scsih_sas_ir_config_change_event(struct MPT3SAS_ADAPTER *ioc,
5999         struct fw_event_work *fw_event)
6000 {
6001         Mpi2EventIrConfigElement_t *element;
6002         int i;
6003         u8 foreign_config;
6004         Mpi2EventDataIrConfigChangeList_t *event_data = fw_event->event_data;
6005
6006 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
6007         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
6008                 _scsih_sas_ir_config_change_event_debug(ioc, event_data);
6009
6010 #endif
6011
6012         foreign_config = (le32_to_cpu(event_data->Flags) &
6013             MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
6014
6015         element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
6016         if (ioc->shost_recovery) {
6017
6018                 for (i = 0; i < event_data->NumElements; i++, element++) {
6019                         if (element->ReasonCode == MPI2_EVENT_IR_CHANGE_RC_HIDE)
6020                                 _scsih_ir_fastpath(ioc,
6021                                         le16_to_cpu(element->PhysDiskDevHandle),
6022                                         element->PhysDiskNum);
6023                 }
6024                 return;
6025         }
6026         for (i = 0; i < event_data->NumElements; i++, element++) {
6027
6028                 switch (element->ReasonCode) {
6029                 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
6030                 case MPI2_EVENT_IR_CHANGE_RC_ADDED:
6031                         if (!foreign_config)
6032                                 _scsih_sas_volume_add(ioc, element);
6033                         break;
6034                 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
6035                 case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
6036                         if (!foreign_config)
6037                                 _scsih_sas_volume_delete(ioc,
6038                                     le16_to_cpu(element->VolDevHandle));
6039                         break;
6040                 case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
6041                         _scsih_sas_pd_hide(ioc, element);
6042                         break;
6043                 case MPI2_EVENT_IR_CHANGE_RC_PD_DELETED:
6044                         _scsih_sas_pd_expose(ioc, element);
6045                         break;
6046                 case MPI2_EVENT_IR_CHANGE_RC_HIDE:
6047                         _scsih_sas_pd_add(ioc, element);
6048                         break;
6049                 case MPI2_EVENT_IR_CHANGE_RC_UNHIDE:
6050                         _scsih_sas_pd_delete(ioc, element);
6051                         break;
6052                 }
6053         }
6054 }
6055
6056 /**
6057  * _scsih_sas_ir_volume_event - IR volume event
6058  * @ioc: per adapter object
6059  * @fw_event: The fw_event_work object
6060  * Context: user.
6061  *
6062  * Return nothing.
6063  */
6064 static void
6065 _scsih_sas_ir_volume_event(struct MPT3SAS_ADAPTER *ioc,
6066         struct fw_event_work *fw_event)
6067 {
6068         u64 wwid;
6069         unsigned long flags;
6070         struct _raid_device *raid_device;
6071         u16 handle;
6072         u32 state;
6073         int rc;
6074         Mpi2EventDataIrVolume_t *event_data = fw_event->event_data;
6075
6076         if (ioc->shost_recovery)
6077                 return;
6078
6079         if (event_data->ReasonCode != MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED)
6080                 return;
6081
6082         handle = le16_to_cpu(event_data->VolDevHandle);
6083         state = le32_to_cpu(event_data->NewValue);
6084         dewtprintk(ioc, pr_info(MPT3SAS_FMT
6085                 "%s: handle(0x%04x), old(0x%08x), new(0x%08x)\n",
6086                 ioc->name, __func__,  handle,
6087             le32_to_cpu(event_data->PreviousValue), state));
6088         switch (state) {
6089         case MPI2_RAID_VOL_STATE_MISSING:
6090         case MPI2_RAID_VOL_STATE_FAILED:
6091                 _scsih_sas_volume_delete(ioc, handle);
6092                 break;
6093
6094         case MPI2_RAID_VOL_STATE_ONLINE:
6095         case MPI2_RAID_VOL_STATE_DEGRADED:
6096         case MPI2_RAID_VOL_STATE_OPTIMAL:
6097
6098                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
6099                 raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
6100                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6101
6102                 if (raid_device)
6103                         break;
6104
6105                 mpt3sas_config_get_volume_wwid(ioc, handle, &wwid);
6106                 if (!wwid) {
6107                         pr_err(MPT3SAS_FMT
6108                             "failure at %s:%d/%s()!\n", ioc->name,
6109                             __FILE__, __LINE__, __func__);
6110                         break;
6111                 }
6112
6113                 raid_device = kzalloc(sizeof(struct _raid_device), GFP_KERNEL);
6114                 if (!raid_device) {
6115                         pr_err(MPT3SAS_FMT
6116                             "failure at %s:%d/%s()!\n", ioc->name,
6117                             __FILE__, __LINE__, __func__);
6118                         break;
6119                 }
6120
6121                 raid_device->id = ioc->sas_id++;
6122                 raid_device->channel = RAID_CHANNEL;
6123                 raid_device->handle = handle;
6124                 raid_device->wwid = wwid;
6125                 _scsih_raid_device_add(ioc, raid_device);
6126                 rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
6127                     raid_device->id, 0);
6128                 if (rc)
6129                         _scsih_raid_device_remove(ioc, raid_device);
6130                 break;
6131
6132         case MPI2_RAID_VOL_STATE_INITIALIZING:
6133         default:
6134                 break;
6135         }
6136 }
6137
6138 /**
6139  * _scsih_sas_ir_physical_disk_event - PD event
6140  * @ioc: per adapter object
6141  * @fw_event: The fw_event_work object
6142  * Context: user.
6143  *
6144  * Return nothing.
6145  */
6146 static void
6147 _scsih_sas_ir_physical_disk_event(struct MPT3SAS_ADAPTER *ioc,
6148         struct fw_event_work *fw_event)
6149 {
6150         u16 handle, parent_handle;
6151         u32 state;
6152         struct _sas_device *sas_device;
6153         unsigned long flags;
6154         Mpi2ConfigReply_t mpi_reply;
6155         Mpi2SasDevicePage0_t sas_device_pg0;
6156         u32 ioc_status;
6157         Mpi2EventDataIrPhysicalDisk_t *event_data = fw_event->event_data;
6158         u64 sas_address;
6159
6160         if (ioc->shost_recovery)
6161                 return;
6162
6163         if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
6164                 return;
6165
6166         handle = le16_to_cpu(event_data->PhysDiskDevHandle);
6167         state = le32_to_cpu(event_data->NewValue);
6168
6169         dewtprintk(ioc, pr_info(MPT3SAS_FMT
6170                 "%s: handle(0x%04x), old(0x%08x), new(0x%08x)\n",
6171                 ioc->name, __func__,  handle,
6172                     le32_to_cpu(event_data->PreviousValue), state));
6173         switch (state) {
6174         case MPI2_RAID_PD_STATE_ONLINE:
6175         case MPI2_RAID_PD_STATE_DEGRADED:
6176         case MPI2_RAID_PD_STATE_REBUILDING:
6177         case MPI2_RAID_PD_STATE_OPTIMAL:
6178         case MPI2_RAID_PD_STATE_HOT_SPARE:
6179
6180                 set_bit(handle, ioc->pd_handles);
6181                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
6182                 sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
6183                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
6184
6185                 if (sas_device)
6186                         return;
6187
6188                 if ((mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
6189                     &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
6190                     handle))) {
6191                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
6192                             ioc->name, __FILE__, __LINE__, __func__);
6193                         return;
6194                 }
6195
6196                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6197                     MPI2_IOCSTATUS_MASK;
6198                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6199                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
6200                             ioc->name, __FILE__, __LINE__, __func__);
6201                         return;
6202                 }
6203
6204                 parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
6205                 if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address))
6206                         mpt3sas_transport_update_links(ioc, sas_address, handle,
6207                             sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
6208
6209                 _scsih_add_device(ioc, handle, 0, 1);
6210
6211                 break;
6212
6213         case MPI2_RAID_PD_STATE_OFFLINE:
6214         case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
6215         case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
6216         default:
6217                 break;
6218         }
6219 }
6220
6221 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
6222 /**
6223  * _scsih_sas_ir_operation_status_event_debug - debug for IR op event
6224  * @ioc: per adapter object
6225  * @event_data: event data payload
6226  * Context: user.
6227  *
6228  * Return nothing.
6229  */
6230 static void
6231 _scsih_sas_ir_operation_status_event_debug(struct MPT3SAS_ADAPTER *ioc,
6232         Mpi2EventDataIrOperationStatus_t *event_data)
6233 {
6234         char *reason_str = NULL;
6235
6236         switch (event_data->RAIDOperation) {
6237         case MPI2_EVENT_IR_RAIDOP_RESYNC:
6238                 reason_str = "resync";
6239                 break;
6240         case MPI2_EVENT_IR_RAIDOP_ONLINE_CAP_EXPANSION:
6241                 reason_str = "online capacity expansion";
6242                 break;
6243         case MPI2_EVENT_IR_RAIDOP_CONSISTENCY_CHECK:
6244                 reason_str = "consistency check";
6245                 break;
6246         case MPI2_EVENT_IR_RAIDOP_BACKGROUND_INIT:
6247                 reason_str = "background init";
6248                 break;
6249         case MPI2_EVENT_IR_RAIDOP_MAKE_DATA_CONSISTENT:
6250                 reason_str = "make data consistent";
6251                 break;
6252         }
6253
6254         if (!reason_str)
6255                 return;
6256
6257         pr_info(MPT3SAS_FMT "raid operational status: (%s)" \
6258             "\thandle(0x%04x), percent complete(%d)\n",
6259             ioc->name, reason_str,
6260             le16_to_cpu(event_data->VolDevHandle),
6261             event_data->PercentComplete);
6262 }
6263 #endif
6264
6265 /**
6266  * _scsih_sas_ir_operation_status_event - handle RAID operation events
6267  * @ioc: per adapter object
6268  * @fw_event: The fw_event_work object
6269  * Context: user.
6270  *
6271  * Return nothing.
6272  */
6273 static void
6274 _scsih_sas_ir_operation_status_event(struct MPT3SAS_ADAPTER *ioc,
6275         struct fw_event_work *fw_event)
6276 {
6277         Mpi2EventDataIrOperationStatus_t *event_data = fw_event->event_data;
6278         static struct _raid_device *raid_device;
6279         unsigned long flags;
6280         u16 handle;
6281
6282 #ifdef CONFIG_SCSI_MPT3SAS_LOGGING
6283         if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
6284                 _scsih_sas_ir_operation_status_event_debug(ioc,
6285                      event_data);
6286 #endif
6287
6288         /* code added for raid transport support */
6289         if (event_data->RAIDOperation == MPI2_EVENT_IR_RAIDOP_RESYNC) {
6290
6291                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
6292                 handle = le16_to_cpu(event_data->VolDevHandle);
6293                 raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
6294                 if (raid_device)
6295                         raid_device->percent_complete =
6296                             event_data->PercentComplete;
6297                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6298         }
6299 }
6300
6301 /**
6302  * _scsih_prep_device_scan - initialize parameters prior to device scan
6303  * @ioc: per adapter object
6304  *
6305  * Set the deleted flag prior to device scan.  If the device is found during
6306  * the scan, then we clear the deleted flag.
6307  */
6308 static void
6309 _scsih_prep_device_scan(struct MPT3SAS_ADAPTER *ioc)
6310 {
6311         struct MPT3SAS_DEVICE *sas_device_priv_data;
6312         struct scsi_device *sdev;
6313
6314         shost_for_each_device(sdev, ioc->shost) {
6315                 sas_device_priv_data = sdev->hostdata;
6316                 if (sas_device_priv_data && sas_device_priv_data->sas_target)
6317                         sas_device_priv_data->sas_target->deleted = 1;
6318         }
6319 }
6320
6321 /**
6322  * _scsih_mark_responding_sas_device - mark a sas_devices as responding
6323  * @ioc: per adapter object
6324  * @sas_address: sas address
6325  * @slot: enclosure slot id
6326  * @handle: device handle
6327  *
6328  * After host reset, find out whether devices are still responding.
6329  * Used in _scsih_remove_unresponsive_sas_devices.
6330  *
6331  * Return nothing.
6332  */
6333 static void
6334 _scsih_mark_responding_sas_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
6335         u16 slot, u16 handle)
6336 {
6337         struct MPT3SAS_TARGET *sas_target_priv_data = NULL;
6338         struct scsi_target *starget;
6339         struct _sas_device *sas_device;
6340         unsigned long flags;
6341
6342         spin_lock_irqsave(&ioc->sas_device_lock, flags);
6343         list_for_each_entry(sas_device, &ioc->sas_device_list, list) {
6344                 if (sas_device->sas_address == sas_address &&
6345                     sas_device->slot == slot) {
6346                         sas_device->responding = 1;
6347                         starget = sas_device->starget;
6348                         if (starget && starget->hostdata) {
6349                                 sas_target_priv_data = starget->hostdata;
6350                                 sas_target_priv_data->tm_busy = 0;
6351                                 sas_target_priv_data->deleted = 0;
6352                         } else
6353                                 sas_target_priv_data = NULL;
6354                         if (starget)
6355                                 starget_printk(KERN_INFO, starget,
6356                                     "handle(0x%04x), sas_addr(0x%016llx), "
6357                                     "enclosure logical id(0x%016llx), "
6358                                     "slot(%d)\n", handle,
6359                                     (unsigned long long)sas_device->sas_address,
6360                                     (unsigned long long)
6361                                     sas_device->enclosure_logical_id,
6362                                     sas_device->slot);
6363                         if (sas_device->handle == handle)
6364                                 goto out;
6365                         pr_info("\thandle changed from(0x%04x)!!!\n",
6366                             sas_device->handle);
6367                         sas_device->handle = handle;
6368                         if (sas_target_priv_data)
6369                                 sas_target_priv_data->handle = handle;
6370                         goto out;
6371                 }
6372         }
6373  out:
6374         spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
6375 }
6376
6377 /**
6378  * _scsih_search_responding_sas_devices -
6379  * @ioc: per adapter object
6380  *
6381  * After host reset, find out whether devices are still responding.
6382  * If not remove.
6383  *
6384  * Return nothing.
6385  */
6386 static void
6387 _scsih_search_responding_sas_devices(struct MPT3SAS_ADAPTER *ioc)
6388 {
6389         Mpi2SasDevicePage0_t sas_device_pg0;
6390         Mpi2ConfigReply_t mpi_reply;
6391         u16 ioc_status;
6392         u16 handle;
6393         u32 device_info;
6394
6395         pr_info(MPT3SAS_FMT "search for end-devices: start\n", ioc->name);
6396
6397         if (list_empty(&ioc->sas_device_list))
6398                 goto out;
6399
6400         handle = 0xFFFF;
6401         while (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
6402             &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
6403             handle))) {
6404                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6405                     MPI2_IOCSTATUS_MASK;
6406                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6407                         break;
6408                 handle = le16_to_cpu(sas_device_pg0.DevHandle);
6409                 device_info = le32_to_cpu(sas_device_pg0.DeviceInfo);
6410                 if (!(_scsih_is_end_device(device_info)))
6411                         continue;
6412                 _scsih_mark_responding_sas_device(ioc,
6413                     le64_to_cpu(sas_device_pg0.SASAddress),
6414                     le16_to_cpu(sas_device_pg0.Slot), handle);
6415         }
6416
6417  out:
6418         pr_info(MPT3SAS_FMT "search for end-devices: complete\n",
6419             ioc->name);
6420 }
6421
6422 /**
6423  * _scsih_mark_responding_raid_device - mark a raid_device as responding
6424  * @ioc: per adapter object
6425  * @wwid: world wide identifier for raid volume
6426  * @handle: device handle
6427  *
6428  * After host reset, find out whether devices are still responding.
6429  * Used in _scsih_remove_unresponsive_raid_devices.
6430  *
6431  * Return nothing.
6432  */
6433 static void
6434 _scsih_mark_responding_raid_device(struct MPT3SAS_ADAPTER *ioc, u64 wwid,
6435         u16 handle)
6436 {
6437         struct MPT3SAS_TARGET *sas_target_priv_data;
6438         struct scsi_target *starget;
6439         struct _raid_device *raid_device;
6440         unsigned long flags;
6441
6442         spin_lock_irqsave(&ioc->raid_device_lock, flags);
6443         list_for_each_entry(raid_device, &ioc->raid_device_list, list) {
6444                 if (raid_device->wwid == wwid && raid_device->starget) {
6445                         starget = raid_device->starget;
6446                         if (starget && starget->hostdata) {
6447                                 sas_target_priv_data = starget->hostdata;
6448                                 sas_target_priv_data->deleted = 0;
6449                         } else
6450                                 sas_target_priv_data = NULL;
6451                         raid_device->responding = 1;
6452                         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6453                         starget_printk(KERN_INFO, raid_device->starget,
6454                             "handle(0x%04x), wwid(0x%016llx)\n", handle,
6455                             (unsigned long long)raid_device->wwid);
6456                         spin_lock_irqsave(&ioc->raid_device_lock, flags);
6457                         if (raid_device->handle == handle) {
6458                                 spin_unlock_irqrestore(&ioc->raid_device_lock,
6459                                     flags);
6460                                 return;
6461                         }
6462                         pr_info("\thandle changed from(0x%04x)!!!\n",
6463                             raid_device->handle);
6464                         raid_device->handle = handle;
6465                         if (sas_target_priv_data)
6466                                 sas_target_priv_data->handle = handle;
6467                         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6468                         return;
6469                 }
6470         }
6471         spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6472 }
6473
6474 /**
6475  * _scsih_search_responding_raid_devices -
6476  * @ioc: per adapter object
6477  *
6478  * After host reset, find out whether devices are still responding.
6479  * If not remove.
6480  *
6481  * Return nothing.
6482  */
6483 static void
6484 _scsih_search_responding_raid_devices(struct MPT3SAS_ADAPTER *ioc)
6485 {
6486         Mpi2RaidVolPage1_t volume_pg1;
6487         Mpi2RaidVolPage0_t volume_pg0;
6488         Mpi2RaidPhysDiskPage0_t pd_pg0;
6489         Mpi2ConfigReply_t mpi_reply;
6490         u16 ioc_status;
6491         u16 handle;
6492         u8 phys_disk_num;
6493
6494         if (!ioc->ir_firmware)
6495                 return;
6496
6497         pr_info(MPT3SAS_FMT "search for raid volumes: start\n",
6498             ioc->name);
6499
6500         if (list_empty(&ioc->raid_device_list))
6501                 goto out;
6502
6503         handle = 0xFFFF;
6504         while (!(mpt3sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
6505             &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) {
6506                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6507                     MPI2_IOCSTATUS_MASK;
6508                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6509                         break;
6510                 handle = le16_to_cpu(volume_pg1.DevHandle);
6511
6512                 if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply,
6513                     &volume_pg0, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
6514                      sizeof(Mpi2RaidVolPage0_t)))
6515                         continue;
6516
6517                 if (volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_OPTIMAL ||
6518                     volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_ONLINE ||
6519                     volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_DEGRADED)
6520                         _scsih_mark_responding_raid_device(ioc,
6521                             le64_to_cpu(volume_pg1.WWID), handle);
6522         }
6523
6524         /* refresh the pd_handles */
6525                 phys_disk_num = 0xFF;
6526                 memset(ioc->pd_handles, 0, ioc->pd_handles_sz);
6527                 while (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
6528                     &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
6529                     phys_disk_num))) {
6530                         ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6531                             MPI2_IOCSTATUS_MASK;
6532                         if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6533                                 break;
6534                         phys_disk_num = pd_pg0.PhysDiskNum;
6535                         handle = le16_to_cpu(pd_pg0.DevHandle);
6536                         set_bit(handle, ioc->pd_handles);
6537                 }
6538  out:
6539         pr_info(MPT3SAS_FMT "search for responding raid volumes: complete\n",
6540                 ioc->name);
6541 }
6542
6543 /**
6544  * _scsih_mark_responding_expander - mark a expander as responding
6545  * @ioc: per adapter object
6546  * @sas_address: sas address
6547  * @handle:
6548  *
6549  * After host reset, find out whether devices are still responding.
6550  * Used in _scsih_remove_unresponsive_expanders.
6551  *
6552  * Return nothing.
6553  */
6554 static void
6555 _scsih_mark_responding_expander(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
6556         u16 handle)
6557 {
6558         struct _sas_node *sas_expander;
6559         unsigned long flags;
6560         int i;
6561
6562         spin_lock_irqsave(&ioc->sas_node_lock, flags);
6563         list_for_each_entry(sas_expander, &ioc->sas_expander_list, list) {
6564                 if (sas_expander->sas_address != sas_address)
6565                         continue;
6566                 sas_expander->responding = 1;
6567                 if (sas_expander->handle == handle)
6568                         goto out;
6569                 pr_info("\texpander(0x%016llx): handle changed" \
6570                     " from(0x%04x) to (0x%04x)!!!\n",
6571                     (unsigned long long)sas_expander->sas_address,
6572                     sas_expander->handle, handle);
6573                 sas_expander->handle = handle;
6574                 for (i = 0 ; i < sas_expander->num_phys ; i++)
6575                         sas_expander->phy[i].handle = handle;
6576                 goto out;
6577         }
6578  out:
6579         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
6580 }
6581
6582 /**
6583  * _scsih_search_responding_expanders -
6584  * @ioc: per adapter object
6585  *
6586  * After host reset, find out whether devices are still responding.
6587  * If not remove.
6588  *
6589  * Return nothing.
6590  */
6591 static void
6592 _scsih_search_responding_expanders(struct MPT3SAS_ADAPTER *ioc)
6593 {
6594         Mpi2ExpanderPage0_t expander_pg0;
6595         Mpi2ConfigReply_t mpi_reply;
6596         u16 ioc_status;
6597         u64 sas_address;
6598         u16 handle;
6599
6600         pr_info(MPT3SAS_FMT "search for expanders: start\n", ioc->name);
6601
6602         if (list_empty(&ioc->sas_expander_list))
6603                 goto out;
6604
6605         handle = 0xFFFF;
6606         while (!(mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
6607             MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) {
6608
6609                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6610                     MPI2_IOCSTATUS_MASK;
6611                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
6612                         break;
6613
6614                 handle = le16_to_cpu(expander_pg0.DevHandle);
6615                 sas_address = le64_to_cpu(expander_pg0.SASAddress);
6616                 pr_info("\texpander present: handle(0x%04x), sas_addr(0x%016llx)\n",
6617                         handle,
6618                     (unsigned long long)sas_address);
6619                 _scsih_mark_responding_expander(ioc, sas_address, handle);
6620         }
6621
6622  out:
6623         pr_info(MPT3SAS_FMT "search for expanders: complete\n", ioc->name);
6624 }
6625
6626 /**
6627  * _scsih_remove_unresponding_sas_devices - removing unresponding devices
6628  * @ioc: per adapter object
6629  *
6630  * Return nothing.
6631  */
6632 static void
6633 _scsih_remove_unresponding_sas_devices(struct MPT3SAS_ADAPTER *ioc)
6634 {
6635         struct _sas_device *sas_device, *sas_device_next;
6636         struct _sas_node *sas_expander, *sas_expander_next;
6637         struct _raid_device *raid_device, *raid_device_next;
6638         struct list_head tmp_list;
6639         unsigned long flags;
6640
6641         pr_info(MPT3SAS_FMT "removing unresponding devices: start\n",
6642             ioc->name);
6643
6644         /* removing unresponding end devices */
6645         pr_info(MPT3SAS_FMT "removing unresponding devices: end-devices\n",
6646             ioc->name);
6647         list_for_each_entry_safe(sas_device, sas_device_next,
6648             &ioc->sas_device_list, list) {
6649                 if (!sas_device->responding)
6650                         mpt3sas_device_remove_by_sas_address(ioc,
6651                             sas_device->sas_address);
6652                 else
6653                         sas_device->responding = 0;
6654         }
6655
6656         /* removing unresponding volumes */
6657         if (ioc->ir_firmware) {
6658                 pr_info(MPT3SAS_FMT "removing unresponding devices: volumes\n",
6659                         ioc->name);
6660                 list_for_each_entry_safe(raid_device, raid_device_next,
6661                     &ioc->raid_device_list, list) {
6662                         if (!raid_device->responding)
6663                                 _scsih_sas_volume_delete(ioc,
6664                                     raid_device->handle);
6665                         else
6666                                 raid_device->responding = 0;
6667                 }
6668         }
6669
6670         /* removing unresponding expanders */
6671         pr_info(MPT3SAS_FMT "removing unresponding devices: expanders\n",
6672             ioc->name);
6673         spin_lock_irqsave(&ioc->sas_node_lock, flags);
6674         INIT_LIST_HEAD(&tmp_list);
6675         list_for_each_entry_safe(sas_expander, sas_expander_next,
6676             &ioc->sas_expander_list, list) {
6677                 if (!sas_expander->responding)
6678                         list_move_tail(&sas_expander->list, &tmp_list);
6679                 else
6680                         sas_expander->responding = 0;
6681         }
6682         spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
6683         list_for_each_entry_safe(sas_expander, sas_expander_next, &tmp_list,
6684             list) {
6685                 list_del(&sas_expander->list);
6686                 _scsih_expander_node_remove(ioc, sas_expander);
6687         }
6688
6689         pr_info(MPT3SAS_FMT "removing unresponding devices: complete\n",
6690             ioc->name);
6691
6692         /* unblock devices */
6693         _scsih_ublock_io_all_device(ioc);
6694 }
6695
6696 static void
6697 _scsih_refresh_expander_links(struct MPT3SAS_ADAPTER *ioc,
6698         struct _sas_node *sas_expander, u16 handle)
6699 {
6700         Mpi2ExpanderPage1_t expander_pg1;
6701         Mpi2ConfigReply_t mpi_reply;
6702         int i;
6703
6704         for (i = 0 ; i < sas_expander->num_phys ; i++) {
6705                 if ((mpt3sas_config_get_expander_pg1(ioc, &mpi_reply,
6706                     &expander_pg1, i, handle))) {
6707                         pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
6708                             ioc->name, __FILE__, __LINE__, __func__);
6709                         return;
6710                 }
6711
6712                 mpt3sas_transport_update_links(ioc, sas_expander->sas_address,
6713                     le16_to_cpu(expander_pg1.AttachedDevHandle), i,
6714                     expander_pg1.NegotiatedLinkRate >> 4);
6715         }
6716 }
6717
6718 /**
6719  * _scsih_scan_for_devices_after_reset - scan for devices after host reset
6720  * @ioc: per adapter object
6721  *
6722  * Return nothing.
6723  */
6724 static void
6725 _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc)
6726 {
6727         Mpi2ExpanderPage0_t expander_pg0;
6728         Mpi2SasDevicePage0_t sas_device_pg0;
6729         Mpi2RaidVolPage1_t volume_pg1;
6730         Mpi2RaidVolPage0_t volume_pg0;
6731         Mpi2RaidPhysDiskPage0_t pd_pg0;
6732         Mpi2EventIrConfigElement_t element;
6733         Mpi2ConfigReply_t mpi_reply;
6734         u8 phys_disk_num;
6735         u16 ioc_status;
6736         u16 handle, parent_handle;
6737         u64 sas_address;
6738         struct _sas_device *sas_device;
6739         struct _sas_node *expander_device;
6740         static struct _raid_device *raid_device;
6741         u8 retry_count;
6742         unsigned long flags;
6743
6744         pr_info(MPT3SAS_FMT "scan devices: start\n", ioc->name);
6745
6746         _scsih_sas_host_refresh(ioc);
6747
6748         pr_info(MPT3SAS_FMT "\tscan devices: expanders start\n", ioc->name);
6749
6750         /* expanders */
6751         handle = 0xFFFF;
6752         while (!(mpt3sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
6753             MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) {
6754                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6755                     MPI2_IOCSTATUS_MASK;
6756                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6757                         pr_info(MPT3SAS_FMT "\tbreak from expander scan: " \
6758                             "ioc_status(0x%04x), loginfo(0x%08x)\n",
6759                             ioc->name, ioc_status,
6760                             le32_to_cpu(mpi_reply.IOCLogInfo));
6761                         break;
6762                 }
6763                 handle = le16_to_cpu(expander_pg0.DevHandle);
6764                 spin_lock_irqsave(&ioc->sas_node_lock, flags);
6765                 expander_device = mpt3sas_scsih_expander_find_by_sas_address(
6766                     ioc, le64_to_cpu(expander_pg0.SASAddress));
6767                 spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
6768                 if (expander_device)
6769                         _scsih_refresh_expander_links(ioc, expander_device,
6770                             handle);
6771                 else {
6772                         pr_info(MPT3SAS_FMT "\tBEFORE adding expander: " \
6773                             "handle (0x%04x), sas_addr(0x%016llx)\n", ioc->name,
6774                             handle, (unsigned long long)
6775                             le64_to_cpu(expander_pg0.SASAddress));
6776                         _scsih_expander_add(ioc, handle);
6777                         pr_info(MPT3SAS_FMT "\tAFTER adding expander: " \
6778                             "handle (0x%04x), sas_addr(0x%016llx)\n", ioc->name,
6779                             handle, (unsigned long long)
6780                             le64_to_cpu(expander_pg0.SASAddress));
6781                 }
6782         }
6783
6784         pr_info(MPT3SAS_FMT "\tscan devices: expanders complete\n",
6785             ioc->name);
6786
6787         if (!ioc->ir_firmware)
6788                 goto skip_to_sas;
6789
6790         pr_info(MPT3SAS_FMT "\tscan devices: phys disk start\n", ioc->name);
6791
6792         /* phys disk */
6793         phys_disk_num = 0xFF;
6794         while (!(mpt3sas_config_get_phys_disk_pg0(ioc, &mpi_reply,
6795             &pd_pg0, MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM,
6796             phys_disk_num))) {
6797                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6798                     MPI2_IOCSTATUS_MASK;
6799                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6800                         pr_info(MPT3SAS_FMT "\tbreak from phys disk scan: "\
6801                             "ioc_status(0x%04x), loginfo(0x%08x)\n",
6802                             ioc->name, ioc_status,
6803                             le32_to_cpu(mpi_reply.IOCLogInfo));
6804                         break;
6805                 }
6806                 phys_disk_num = pd_pg0.PhysDiskNum;
6807                 handle = le16_to_cpu(pd_pg0.DevHandle);
6808                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
6809                 sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
6810                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
6811                 if (sas_device)
6812                         continue;
6813                 if (mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
6814                     &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
6815                     handle) != 0)
6816                         continue;
6817                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6818                     MPI2_IOCSTATUS_MASK;
6819                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6820                         pr_info(MPT3SAS_FMT "\tbreak from phys disk scan " \
6821                             "ioc_status(0x%04x), loginfo(0x%08x)\n",
6822                             ioc->name, ioc_status,
6823                             le32_to_cpu(mpi_reply.IOCLogInfo));
6824                         break;
6825                 }
6826                 parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
6827                 if (!_scsih_get_sas_address(ioc, parent_handle,
6828                     &sas_address)) {
6829                         pr_info(MPT3SAS_FMT "\tBEFORE adding phys disk: " \
6830                             " handle (0x%04x), sas_addr(0x%016llx)\n",
6831                             ioc->name, handle, (unsigned long long)
6832                             le64_to_cpu(sas_device_pg0.SASAddress));
6833                         mpt3sas_transport_update_links(ioc, sas_address,
6834                             handle, sas_device_pg0.PhyNum,
6835                             MPI2_SAS_NEG_LINK_RATE_1_5);
6836                         set_bit(handle, ioc->pd_handles);
6837                         retry_count = 0;
6838                         /* This will retry adding the end device.
6839                          * _scsih_add_device() will decide on retries and
6840                          * return "1" when it should be retried
6841                          */
6842                         while (_scsih_add_device(ioc, handle, retry_count++,
6843                             1)) {
6844                                 ssleep(1);
6845                         }
6846                         pr_info(MPT3SAS_FMT "\tAFTER adding phys disk: " \
6847                             " handle (0x%04x), sas_addr(0x%016llx)\n",
6848                             ioc->name, handle, (unsigned long long)
6849                             le64_to_cpu(sas_device_pg0.SASAddress));
6850                 }
6851         }
6852
6853         pr_info(MPT3SAS_FMT "\tscan devices: phys disk complete\n",
6854             ioc->name);
6855
6856         pr_info(MPT3SAS_FMT "\tscan devices: volumes start\n", ioc->name);
6857
6858         /* volumes */
6859         handle = 0xFFFF;
6860         while (!(mpt3sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
6861             &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) {
6862                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6863                     MPI2_IOCSTATUS_MASK;
6864                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6865                         pr_info(MPT3SAS_FMT "\tbreak from volume scan: " \
6866                             "ioc_status(0x%04x), loginfo(0x%08x)\n",
6867                             ioc->name, ioc_status,
6868                             le32_to_cpu(mpi_reply.IOCLogInfo));
6869                         break;
6870                 }
6871                 handle = le16_to_cpu(volume_pg1.DevHandle);
6872                 spin_lock_irqsave(&ioc->raid_device_lock, flags);
6873                 raid_device = _scsih_raid_device_find_by_wwid(ioc,
6874                     le64_to_cpu(volume_pg1.WWID));
6875                 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
6876                 if (raid_device)
6877                         continue;
6878                 if (mpt3sas_config_get_raid_volume_pg0(ioc, &mpi_reply,
6879                     &volume_pg0, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE, handle,
6880                      sizeof(Mpi2RaidVolPage0_t)))
6881                         continue;
6882                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6883                     MPI2_IOCSTATUS_MASK;
6884                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6885                         pr_info(MPT3SAS_FMT "\tbreak from volume scan: " \
6886                             "ioc_status(0x%04x), loginfo(0x%08x)\n",
6887                             ioc->name, ioc_status,
6888                             le32_to_cpu(mpi_reply.IOCLogInfo));
6889                         break;
6890                 }
6891                 if (volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_OPTIMAL ||
6892                     volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_ONLINE ||
6893                     volume_pg0.VolumeState == MPI2_RAID_VOL_STATE_DEGRADED) {
6894                         memset(&element, 0, sizeof(Mpi2EventIrConfigElement_t));
6895                         element.ReasonCode = MPI2_EVENT_IR_CHANGE_RC_ADDED;
6896                         element.VolDevHandle = volume_pg1.DevHandle;
6897                         pr_info(MPT3SAS_FMT
6898                                 "\tBEFORE adding volume: handle (0x%04x)\n",
6899                                 ioc->name, volume_pg1.DevHandle);
6900                         _scsih_sas_volume_add(ioc, &element);
6901                         pr_info(MPT3SAS_FMT
6902                                 "\tAFTER adding volume: handle (0x%04x)\n",
6903                                 ioc->name, volume_pg1.DevHandle);
6904                 }
6905         }
6906
6907         pr_info(MPT3SAS_FMT "\tscan devices: volumes complete\n",
6908             ioc->name);
6909
6910  skip_to_sas:
6911
6912         pr_info(MPT3SAS_FMT "\tscan devices: end devices start\n",
6913             ioc->name);
6914
6915         /* sas devices */
6916         handle = 0xFFFF;
6917         while (!(mpt3sas_config_get_sas_device_pg0(ioc, &mpi_reply,
6918             &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE,
6919             handle))) {
6920                 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
6921                     MPI2_IOCSTATUS_MASK;
6922                 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
6923                         pr_info(MPT3SAS_FMT "\tbreak from end device scan:"\
6924                             " ioc_status(0x%04x), loginfo(0x%08x)\n",
6925                             ioc->name, ioc_status,
6926                             le32_to_cpu(mpi_reply.IOCLogInfo));
6927                         break;
6928                 }
6929                 handle = le16_to_cpu(sas_device_pg0.DevHandle);
6930                 if (!(_scsih_is_end_device(
6931                     le32_to_cpu(sas_device_pg0.DeviceInfo))))
6932                         continue;
6933                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
6934                 sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc,
6935                     le64_to_cpu(sas_device_pg0.SASAddress));
6936                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
6937                 if (sas_device)
6938                         continue;
6939                 parent_handle = le16_to_cpu(sas_device_pg0.ParentDevHandle);
6940                 if (!_scsih_get_sas_address(ioc, parent_handle, &sas_address)) {
6941                         pr_info(MPT3SAS_FMT "\tBEFORE adding end device: " \
6942                             "handle (0x%04x), sas_addr(0x%016llx)\n", ioc->name,
6943                             handle, (unsigned long long)
6944                             le64_to_cpu(sas_device_pg0.SASAddress));
6945                         mpt3sas_transport_update_links(ioc, sas_address, handle,
6946                             sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
6947                         retry_count = 0;
6948                         /* This will retry adding the end device.
6949                          * _scsih_add_device() will decide on retries and
6950                          * return "1" when it should be retried
6951                          */
6952                         while (_scsih_add_device(ioc, handle, retry_count++,
6953                             0)) {
6954                                 ssleep(1);
6955                         }
6956                         pr_info(MPT3SAS_FMT "\tAFTER adding end device: " \
6957                             "handle (0x%04x), sas_addr(0x%016llx)\n", ioc->name,
6958                             handle, (unsigned long long)
6959                             le64_to_cpu(sas_device_pg0.SASAddress));
6960                 }
6961         }
6962         pr_info(MPT3SAS_FMT "\tscan devices: end devices complete\n",
6963             ioc->name);
6964
6965         pr_info(MPT3SAS_FMT "scan devices: complete\n", ioc->name);
6966 }
6967 /**
6968  * mpt3sas_scsih_reset_handler - reset callback handler (for scsih)
6969  * @ioc: per adapter object
6970  * @reset_phase: phase
6971  *
6972  * The handler for doing any required cleanup or initialization.
6973  *
6974  * The reset phase can be MPT3_IOC_PRE_RESET, MPT3_IOC_AFTER_RESET,
6975  * MPT3_IOC_DONE_RESET
6976  *
6977  * Return nothing.
6978  */
6979 void
6980 mpt3sas_scsih_reset_handler(struct MPT3SAS_ADAPTER *ioc, int reset_phase)
6981 {
6982         switch (reset_phase) {
6983         case MPT3_IOC_PRE_RESET:
6984                 dtmprintk(ioc, pr_info(MPT3SAS_FMT
6985                         "%s: MPT3_IOC_PRE_RESET\n", ioc->name, __func__));
6986                 break;
6987         case MPT3_IOC_AFTER_RESET:
6988                 dtmprintk(ioc, pr_info(MPT3SAS_FMT
6989                         "%s: MPT3_IOC_AFTER_RESET\n", ioc->name, __func__));
6990                 if (ioc->scsih_cmds.status & MPT3_CMD_PENDING) {
6991                         ioc->scsih_cmds.status |= MPT3_CMD_RESET;
6992                         mpt3sas_base_free_smid(ioc, ioc->scsih_cmds.smid);
6993                         complete(&ioc->scsih_cmds.done);
6994                 }
6995                 if (ioc->tm_cmds.status & MPT3_CMD_PENDING) {
6996                         ioc->tm_cmds.status |= MPT3_CMD_RESET;
6997                         mpt3sas_base_free_smid(ioc, ioc->tm_cmds.smid);
6998                         complete(&ioc->tm_cmds.done);
6999                 }
7000
7001                 _scsih_fw_event_cleanup_queue(ioc);
7002                 _scsih_flush_running_cmds(ioc);
7003                 break;
7004         case MPT3_IOC_DONE_RESET:
7005                 dtmprintk(ioc, pr_info(MPT3SAS_FMT
7006                         "%s: MPT3_IOC_DONE_RESET\n", ioc->name, __func__));
7007                 if ((!ioc->is_driver_loading) && !(disable_discovery > 0 &&
7008                     !ioc->sas_hba.num_phys)) {
7009                         _scsih_prep_device_scan(ioc);
7010                         _scsih_search_responding_sas_devices(ioc);
7011                         _scsih_search_responding_raid_devices(ioc);
7012                         _scsih_search_responding_expanders(ioc);
7013                         _scsih_error_recovery_delete_devices(ioc);
7014                 }
7015                 break;
7016         }
7017 }
7018
7019 /**
7020  * _mpt3sas_fw_work - delayed task for processing firmware events
7021  * @ioc: per adapter object
7022  * @fw_event: The fw_event_work object
7023  * Context: user.
7024  *
7025  * Return nothing.
7026  */
7027 static void
7028 _mpt3sas_fw_work(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
7029 {
7030         /* the queue is being flushed so ignore this event */
7031         if (ioc->remove_host || fw_event->cancel_pending_work ||
7032             ioc->pci_error_recovery) {
7033                 _scsih_fw_event_free(ioc, fw_event);
7034                 return;
7035         }
7036
7037         switch (fw_event->event) {
7038         case MPT3SAS_PROCESS_TRIGGER_DIAG:
7039                 mpt3sas_process_trigger_data(ioc, fw_event->event_data);
7040                 break;
7041         case MPT3SAS_REMOVE_UNRESPONDING_DEVICES:
7042                 while (scsi_host_in_recovery(ioc->shost) || ioc->shost_recovery)
7043                         ssleep(1);
7044                 _scsih_remove_unresponding_sas_devices(ioc);
7045                 _scsih_scan_for_devices_after_reset(ioc);
7046                 break;
7047         case MPT3SAS_PORT_ENABLE_COMPLETE:
7048                 ioc->start_scan = 0;
7049         if (missing_delay[0] != -1 && missing_delay[1] != -1)
7050                         mpt3sas_base_update_missing_delay(ioc, missing_delay[0],
7051                             missing_delay[1]);
7052                 dewtprintk(ioc, pr_info(MPT3SAS_FMT
7053                         "port enable: complete from worker thread\n",
7054                         ioc->name));
7055                 break;
7056         case MPT3SAS_TURN_ON_FAULT_LED:
7057                 _scsih_turn_on_fault_led(ioc, fw_event->device_handle);
7058                 break;
7059         case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
7060                 _scsih_sas_topology_change_event(ioc, fw_event);
7061                 break;
7062         case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
7063                 _scsih_sas_device_status_change_event(ioc, fw_event);
7064                 break;
7065         case MPI2_EVENT_SAS_DISCOVERY:
7066                 _scsih_sas_discovery_event(ioc, fw_event);
7067                 break;
7068         case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
7069                 _scsih_sas_broadcast_primitive_event(ioc, fw_event);
7070                 break;
7071         case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
7072                 _scsih_sas_enclosure_dev_status_change_event(ioc,
7073                     fw_event);
7074                 break;
7075         case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
7076                 _scsih_sas_ir_config_change_event(ioc, fw_event);
7077                 break;
7078         case MPI2_EVENT_IR_VOLUME:
7079                 _scsih_sas_ir_volume_event(ioc, fw_event);
7080                 break;
7081         case MPI2_EVENT_IR_PHYSICAL_DISK:
7082                 _scsih_sas_ir_physical_disk_event(ioc, fw_event);
7083                 break;
7084         case MPI2_EVENT_IR_OPERATION_STATUS:
7085                 _scsih_sas_ir_operation_status_event(ioc, fw_event);
7086                 break;
7087         }
7088         _scsih_fw_event_free(ioc, fw_event);
7089 }
7090
7091 /**
7092  * _firmware_event_work
7093  * @ioc: per adapter object
7094  * @work: The fw_event_work object
7095  * Context: user.
7096  *
7097  * wrappers for the work thread handling firmware events
7098  *
7099  * Return nothing.
7100  */
7101
7102 static void
7103 _firmware_event_work(struct work_struct *work)
7104 {
7105         struct fw_event_work *fw_event = container_of(work,
7106             struct fw_event_work, work);
7107
7108         _mpt3sas_fw_work(fw_event->ioc, fw_event);
7109 }
7110
7111 /**
7112  * mpt3sas_scsih_event_callback - firmware event handler (called at ISR time)
7113  * @ioc: per adapter object
7114  * @msix_index: MSIX table index supplied by the OS
7115  * @reply: reply message frame(lower 32bit addr)
7116  * Context: interrupt.
7117  *
7118  * This function merely adds a new work task into ioc->firmware_event_thread.
7119  * The tasks are worked from _firmware_event_work in user context.
7120  *
7121  * Return 1 meaning mf should be freed from _base_interrupt
7122  *        0 means the mf is freed from this function.
7123  */
7124 u8
7125 mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
7126         u32 reply)
7127 {
7128         struct fw_event_work *fw_event;
7129         Mpi2EventNotificationReply_t *mpi_reply;
7130         u16 event;
7131         u16 sz;
7132
7133         /* events turned off due to host reset or driver unloading */
7134         if (ioc->remove_host || ioc->pci_error_recovery)
7135                 return 1;
7136
7137         mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
7138
7139         if (unlikely(!mpi_reply)) {
7140                 pr_err(MPT3SAS_FMT "mpi_reply not valid at %s:%d/%s()!\n",
7141                     ioc->name, __FILE__, __LINE__, __func__);
7142                 return 1;
7143         }
7144
7145         event = le16_to_cpu(mpi_reply->Event);
7146
7147         if (event != MPI2_EVENT_LOG_ENTRY_ADDED)
7148                 mpt3sas_trigger_event(ioc, event, 0);
7149
7150         switch (event) {
7151         /* handle these */
7152         case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
7153         {
7154                 Mpi2EventDataSasBroadcastPrimitive_t *baen_data =
7155                     (Mpi2EventDataSasBroadcastPrimitive_t *)
7156                     mpi_reply->EventData;
7157
7158                 if (baen_data->Primitive !=
7159                     MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT)
7160                         return 1;
7161
7162                 if (ioc->broadcast_aen_busy) {
7163                         ioc->broadcast_aen_pending++;
7164                         return 1;
7165                 } else
7166                         ioc->broadcast_aen_busy = 1;
7167                 break;
7168         }
7169
7170         case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
7171                 _scsih_check_topo_delete_events(ioc,
7172                     (Mpi2EventDataSasTopologyChangeList_t *)
7173                     mpi_reply->EventData);
7174                 break;
7175         case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST:
7176                 _scsih_check_ir_config_unhide_events(ioc,
7177                     (Mpi2EventDataIrConfigChangeList_t *)
7178                     mpi_reply->EventData);
7179                 break;
7180         case MPI2_EVENT_IR_VOLUME:
7181                 _scsih_check_volume_delete_events(ioc,
7182                     (Mpi2EventDataIrVolume_t *)
7183                     mpi_reply->EventData);
7184                 break;
7185
7186         case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
7187         case MPI2_EVENT_IR_OPERATION_STATUS:
7188         case MPI2_EVENT_SAS_DISCOVERY:
7189         case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
7190         case MPI2_EVENT_IR_PHYSICAL_DISK:
7191                 break;
7192
7193         default: /* ignore the rest */
7194                 return 1;
7195         }
7196
7197         fw_event = kzalloc(sizeof(struct fw_event_work), GFP_ATOMIC);
7198         if (!fw_event) {
7199                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
7200                     ioc->name, __FILE__, __LINE__, __func__);
7201                 return 1;
7202         }
7203         sz = le16_to_cpu(mpi_reply->EventDataLength) * 4;
7204         fw_event->event_data = kzalloc(sz, GFP_ATOMIC);
7205         if (!fw_event->event_data) {
7206                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
7207                     ioc->name, __FILE__, __LINE__, __func__);
7208                 kfree(fw_event);
7209                 return 1;
7210         }
7211
7212         memcpy(fw_event->event_data, mpi_reply->EventData, sz);
7213         fw_event->ioc = ioc;
7214         fw_event->VF_ID = mpi_reply->VF_ID;
7215         fw_event->VP_ID = mpi_reply->VP_ID;
7216         fw_event->event = event;
7217         _scsih_fw_event_add(ioc, fw_event);
7218         return 1;
7219 }
7220
7221 /* shost template */
7222 static struct scsi_host_template scsih_driver_template = {
7223         .module                         = THIS_MODULE,
7224         .name                           = "Fusion MPT SAS Host",
7225         .proc_name                      = MPT3SAS_DRIVER_NAME,
7226         .queuecommand                   = _scsih_qcmd,
7227         .target_alloc                   = _scsih_target_alloc,
7228         .slave_alloc                    = _scsih_slave_alloc,
7229         .slave_configure                = _scsih_slave_configure,
7230         .target_destroy                 = _scsih_target_destroy,
7231         .slave_destroy                  = _scsih_slave_destroy,
7232         .scan_finished                  = _scsih_scan_finished,
7233         .scan_start                     = _scsih_scan_start,
7234         .change_queue_depth             = _scsih_change_queue_depth,
7235         .change_queue_type              = _scsih_change_queue_type,
7236         .eh_abort_handler               = _scsih_abort,
7237         .eh_device_reset_handler        = _scsih_dev_reset,
7238         .eh_target_reset_handler        = _scsih_target_reset,
7239         .eh_host_reset_handler          = _scsih_host_reset,
7240         .bios_param                     = _scsih_bios_param,
7241         .can_queue                      = 1,
7242         .this_id                        = -1,
7243         .sg_tablesize                   = MPT3SAS_SG_DEPTH,
7244         .max_sectors                    = 32767,
7245         .cmd_per_lun                    = 7,
7246         .use_clustering                 = ENABLE_CLUSTERING,
7247         .shost_attrs                    = mpt3sas_host_attrs,
7248         .sdev_attrs                     = mpt3sas_dev_attrs,
7249 };
7250
7251 /**
7252  * _scsih_expander_node_remove - removing expander device from list.
7253  * @ioc: per adapter object
7254  * @sas_expander: the sas_device object
7255  * Context: Calling function should acquire ioc->sas_node_lock.
7256  *
7257  * Removing object and freeing associated memory from the
7258  * ioc->sas_expander_list.
7259  *
7260  * Return nothing.
7261  */
7262 static void
7263 _scsih_expander_node_remove(struct MPT3SAS_ADAPTER *ioc,
7264         struct _sas_node *sas_expander)
7265 {
7266         struct _sas_port *mpt3sas_port, *next;
7267
7268         /* remove sibling ports attached to this expander */
7269         list_for_each_entry_safe(mpt3sas_port, next,
7270            &sas_expander->sas_port_list, port_list) {
7271                 if (ioc->shost_recovery)
7272                         return;
7273                 if (mpt3sas_port->remote_identify.device_type ==
7274                     SAS_END_DEVICE)
7275                         mpt3sas_device_remove_by_sas_address(ioc,
7276                             mpt3sas_port->remote_identify.sas_address);
7277                 else if (mpt3sas_port->remote_identify.device_type ==
7278                     SAS_EDGE_EXPANDER_DEVICE ||
7279                     mpt3sas_port->remote_identify.device_type ==
7280                     SAS_FANOUT_EXPANDER_DEVICE)
7281                         mpt3sas_expander_remove(ioc,
7282                             mpt3sas_port->remote_identify.sas_address);
7283         }
7284
7285         mpt3sas_transport_port_remove(ioc, sas_expander->sas_address,
7286             sas_expander->sas_address_parent);
7287
7288         pr_info(MPT3SAS_FMT
7289                 "expander_remove: handle(0x%04x), sas_addr(0x%016llx)\n",
7290                 ioc->name,
7291             sas_expander->handle, (unsigned long long)
7292             sas_expander->sas_address);
7293
7294         kfree(sas_expander->phy);
7295         kfree(sas_expander);
7296 }
7297
7298 /**
7299  * _scsih_ir_shutdown - IR shutdown notification
7300  * @ioc: per adapter object
7301  *
7302  * Sending RAID Action to alert the Integrated RAID subsystem of the IOC that
7303  * the host system is shutting down.
7304  *
7305  * Return nothing.
7306  */
7307 static void
7308 _scsih_ir_shutdown(struct MPT3SAS_ADAPTER *ioc)
7309 {
7310         Mpi2RaidActionRequest_t *mpi_request;
7311         Mpi2RaidActionReply_t *mpi_reply;
7312         u16 smid;
7313
7314         /* is IR firmware build loaded ? */
7315         if (!ioc->ir_firmware)
7316                 return;
7317
7318         /* are there any volumes ? */
7319         if (list_empty(&ioc->raid_device_list))
7320                 return;
7321
7322         mutex_lock(&ioc->scsih_cmds.mutex);
7323
7324         if (ioc->scsih_cmds.status != MPT3_CMD_NOT_USED) {
7325                 pr_err(MPT3SAS_FMT "%s: scsih_cmd in use\n",
7326                     ioc->name, __func__);
7327                 goto out;
7328         }
7329         ioc->scsih_cmds.status = MPT3_CMD_PENDING;
7330
7331         smid = mpt3sas_base_get_smid(ioc, ioc->scsih_cb_idx);
7332         if (!smid) {
7333                 pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
7334                     ioc->name, __func__);
7335                 ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
7336                 goto out;
7337         }
7338
7339         mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
7340         ioc->scsih_cmds.smid = smid;
7341         memset(mpi_request, 0, sizeof(Mpi2RaidActionRequest_t));
7342
7343         mpi_request->Function = MPI2_FUNCTION_RAID_ACTION;
7344         mpi_request->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
7345
7346         pr_info(MPT3SAS_FMT "IR shutdown (sending)\n", ioc->name);
7347         init_completion(&ioc->scsih_cmds.done);
7348         mpt3sas_base_put_smid_default(ioc, smid);
7349         wait_for_completion_timeout(&ioc->scsih_cmds.done, 10*HZ);
7350
7351         if (!(ioc->scsih_cmds.status & MPT3_CMD_COMPLETE)) {
7352                 pr_err(MPT3SAS_FMT "%s: timeout\n",
7353                     ioc->name, __func__);
7354                 goto out;
7355         }
7356
7357         if (ioc->scsih_cmds.status & MPT3_CMD_REPLY_VALID) {
7358                 mpi_reply = ioc->scsih_cmds.reply;
7359                 pr_info(MPT3SAS_FMT
7360                         "IR shutdown (complete): ioc_status(0x%04x), loginfo(0x%08x)\n",
7361                     ioc->name, le16_to_cpu(mpi_reply->IOCStatus),
7362                     le32_to_cpu(mpi_reply->IOCLogInfo));
7363         }
7364
7365  out:
7366         ioc->scsih_cmds.status = MPT3_CMD_NOT_USED;
7367         mutex_unlock(&ioc->scsih_cmds.mutex);
7368 }
7369
7370 /**
7371  * _scsih_remove - detach and remove add host
7372  * @pdev: PCI device struct
7373  *
7374  * Routine called when unloading the driver.
7375  * Return nothing.
7376  */
7377 static void _scsih_remove(struct pci_dev *pdev)
7378 {
7379         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7380         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7381         struct _sas_port *mpt3sas_port, *next_port;
7382         struct _raid_device *raid_device, *next;
7383         struct MPT3SAS_TARGET *sas_target_priv_data;
7384         struct workqueue_struct *wq;
7385         unsigned long flags;
7386
7387         ioc->remove_host = 1;
7388         _scsih_fw_event_cleanup_queue(ioc);
7389
7390         spin_lock_irqsave(&ioc->fw_event_lock, flags);
7391         wq = ioc->firmware_event_thread;
7392         ioc->firmware_event_thread = NULL;
7393         spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
7394         if (wq)
7395                 destroy_workqueue(wq);
7396
7397         /* release all the volumes */
7398         _scsih_ir_shutdown(ioc);
7399         list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list,
7400             list) {
7401                 if (raid_device->starget) {
7402                         sas_target_priv_data =
7403                             raid_device->starget->hostdata;
7404                         sas_target_priv_data->deleted = 1;
7405                         scsi_remove_target(&raid_device->starget->dev);
7406                 }
7407                 pr_info(MPT3SAS_FMT "removing handle(0x%04x), wwid(0x%016llx)\n",
7408                         ioc->name,  raid_device->handle,
7409                     (unsigned long long) raid_device->wwid);
7410                 _scsih_raid_device_remove(ioc, raid_device);
7411         }
7412
7413         /* free ports attached to the sas_host */
7414         list_for_each_entry_safe(mpt3sas_port, next_port,
7415            &ioc->sas_hba.sas_port_list, port_list) {
7416                 if (mpt3sas_port->remote_identify.device_type ==
7417                     SAS_END_DEVICE)
7418                         mpt3sas_device_remove_by_sas_address(ioc,
7419                             mpt3sas_port->remote_identify.sas_address);
7420                 else if (mpt3sas_port->remote_identify.device_type ==
7421                     SAS_EDGE_EXPANDER_DEVICE ||
7422                     mpt3sas_port->remote_identify.device_type ==
7423                     SAS_FANOUT_EXPANDER_DEVICE)
7424                         mpt3sas_expander_remove(ioc,
7425                             mpt3sas_port->remote_identify.sas_address);
7426         }
7427
7428         /* free phys attached to the sas_host */
7429         if (ioc->sas_hba.num_phys) {
7430                 kfree(ioc->sas_hba.phy);
7431                 ioc->sas_hba.phy = NULL;
7432                 ioc->sas_hba.num_phys = 0;
7433         }
7434
7435         sas_remove_host(shost);
7436         mpt3sas_base_detach(ioc);
7437         list_del(&ioc->list);
7438         scsi_remove_host(shost);
7439         scsi_host_put(shost);
7440 }
7441
7442 /**
7443  * _scsih_shutdown - routine call during system shutdown
7444  * @pdev: PCI device struct
7445  *
7446  * Return nothing.
7447  */
7448 static void
7449 _scsih_shutdown(struct pci_dev *pdev)
7450 {
7451         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7452         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7453         struct workqueue_struct *wq;
7454         unsigned long flags;
7455
7456         ioc->remove_host = 1;
7457         _scsih_fw_event_cleanup_queue(ioc);
7458
7459         spin_lock_irqsave(&ioc->fw_event_lock, flags);
7460         wq = ioc->firmware_event_thread;
7461         ioc->firmware_event_thread = NULL;
7462         spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
7463         if (wq)
7464                 destroy_workqueue(wq);
7465
7466         _scsih_ir_shutdown(ioc);
7467         mpt3sas_base_detach(ioc);
7468 }
7469
7470
7471 /**
7472  * _scsih_probe_boot_devices - reports 1st device
7473  * @ioc: per adapter object
7474  *
7475  * If specified in bios page 2, this routine reports the 1st
7476  * device scsi-ml or sas transport for persistent boot device
7477  * purposes.  Please refer to function _scsih_determine_boot_device()
7478  */
7479 static void
7480 _scsih_probe_boot_devices(struct MPT3SAS_ADAPTER *ioc)
7481 {
7482         u8 is_raid;
7483         void *device;
7484         struct _sas_device *sas_device;
7485         struct _raid_device *raid_device;
7486         u16 handle;
7487         u64 sas_address_parent;
7488         u64 sas_address;
7489         unsigned long flags;
7490         int rc;
7491
7492          /* no Bios, return immediately */
7493         if (!ioc->bios_pg3.BiosVersion)
7494                 return;
7495
7496         device = NULL;
7497         is_raid = 0;
7498         if (ioc->req_boot_device.device) {
7499                 device =  ioc->req_boot_device.device;
7500                 is_raid = ioc->req_boot_device.is_raid;
7501         } else if (ioc->req_alt_boot_device.device) {
7502                 device =  ioc->req_alt_boot_device.device;
7503                 is_raid = ioc->req_alt_boot_device.is_raid;
7504         } else if (ioc->current_boot_device.device) {
7505                 device =  ioc->current_boot_device.device;
7506                 is_raid = ioc->current_boot_device.is_raid;
7507         }
7508
7509         if (!device)
7510                 return;
7511
7512         if (is_raid) {
7513                 raid_device = device;
7514                 rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
7515                     raid_device->id, 0);
7516                 if (rc)
7517                         _scsih_raid_device_remove(ioc, raid_device);
7518         } else {
7519                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
7520                 sas_device = device;
7521                 handle = sas_device->handle;
7522                 sas_address_parent = sas_device->sas_address_parent;
7523                 sas_address = sas_device->sas_address;
7524                 list_move_tail(&sas_device->list, &ioc->sas_device_list);
7525                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7526
7527                 if (!mpt3sas_transport_port_add(ioc, handle,
7528                     sas_address_parent)) {
7529                         _scsih_sas_device_remove(ioc, sas_device);
7530                 } else if (!sas_device->starget) {
7531                         if (!ioc->is_driver_loading) {
7532                                 mpt3sas_transport_port_remove(ioc,
7533                                     sas_address,
7534                                     sas_address_parent);
7535                                 _scsih_sas_device_remove(ioc, sas_device);
7536                         }
7537                 }
7538         }
7539 }
7540
7541 /**
7542  * _scsih_probe_raid - reporting raid volumes to scsi-ml
7543  * @ioc: per adapter object
7544  *
7545  * Called during initial loading of the driver.
7546  */
7547 static void
7548 _scsih_probe_raid(struct MPT3SAS_ADAPTER *ioc)
7549 {
7550         struct _raid_device *raid_device, *raid_next;
7551         int rc;
7552
7553         list_for_each_entry_safe(raid_device, raid_next,
7554             &ioc->raid_device_list, list) {
7555                 if (raid_device->starget)
7556                         continue;
7557                 rc = scsi_add_device(ioc->shost, RAID_CHANNEL,
7558                     raid_device->id, 0);
7559                 if (rc)
7560                         _scsih_raid_device_remove(ioc, raid_device);
7561         }
7562 }
7563
7564 /**
7565  * _scsih_probe_sas - reporting sas devices to sas transport
7566  * @ioc: per adapter object
7567  *
7568  * Called during initial loading of the driver.
7569  */
7570 static void
7571 _scsih_probe_sas(struct MPT3SAS_ADAPTER *ioc)
7572 {
7573         struct _sas_device *sas_device, *next;
7574         unsigned long flags;
7575
7576         /* SAS Device List */
7577         list_for_each_entry_safe(sas_device, next, &ioc->sas_device_init_list,
7578             list) {
7579
7580                 if (!mpt3sas_transport_port_add(ioc, sas_device->handle,
7581                     sas_device->sas_address_parent)) {
7582                         list_del(&sas_device->list);
7583                         kfree(sas_device);
7584                         continue;
7585                 } else if (!sas_device->starget) {
7586                         /*
7587                          * When asyn scanning is enabled, its not possible to
7588                          * remove devices while scanning is turned on due to an
7589                          * oops in scsi_sysfs_add_sdev()->add_device()->
7590                          * sysfs_addrm_start()
7591                          */
7592                         if (!ioc->is_driver_loading) {
7593                                 mpt3sas_transport_port_remove(ioc,
7594                                     sas_device->sas_address,
7595                                     sas_device->sas_address_parent);
7596                                 list_del(&sas_device->list);
7597                                 kfree(sas_device);
7598                                 continue;
7599                         }
7600                 }
7601
7602                 spin_lock_irqsave(&ioc->sas_device_lock, flags);
7603                 list_move_tail(&sas_device->list, &ioc->sas_device_list);
7604                 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
7605         }
7606 }
7607
7608 /**
7609  * _scsih_probe_devices - probing for devices
7610  * @ioc: per adapter object
7611  *
7612  * Called during initial loading of the driver.
7613  */
7614 static void
7615 _scsih_probe_devices(struct MPT3SAS_ADAPTER *ioc)
7616 {
7617         u16 volume_mapping_flags;
7618
7619         if (!(ioc->facts.ProtocolFlags & MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR))
7620                 return;  /* return when IOC doesn't support initiator mode */
7621
7622         _scsih_probe_boot_devices(ioc);
7623
7624         if (ioc->ir_firmware) {
7625                 volume_mapping_flags =
7626                     le16_to_cpu(ioc->ioc_pg8.IRVolumeMappingFlags) &
7627                     MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE;
7628                 if (volume_mapping_flags ==
7629                     MPI2_IOCPAGE8_IRFLAGS_LOW_VOLUME_MAPPING) {
7630                         _scsih_probe_raid(ioc);
7631                         _scsih_probe_sas(ioc);
7632                 } else {
7633                         _scsih_probe_sas(ioc);
7634                         _scsih_probe_raid(ioc);
7635                 }
7636         } else
7637                 _scsih_probe_sas(ioc);
7638 }
7639
7640 /**
7641  * _scsih_scan_start - scsi lld callback for .scan_start
7642  * @shost: SCSI host pointer
7643  *
7644  * The shost has the ability to discover targets on its own instead
7645  * of scanning the entire bus.  In our implemention, we will kick off
7646  * firmware discovery.
7647  */
7648 static void
7649 _scsih_scan_start(struct Scsi_Host *shost)
7650 {
7651         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7652         int rc;
7653         if (diag_buffer_enable != -1 && diag_buffer_enable != 0)
7654                 mpt3sas_enable_diag_buffer(ioc, diag_buffer_enable);
7655
7656         if (disable_discovery > 0)
7657                 return;
7658
7659         ioc->start_scan = 1;
7660         rc = mpt3sas_port_enable(ioc);
7661
7662         if (rc != 0)
7663                 pr_info(MPT3SAS_FMT "port enable: FAILED\n", ioc->name);
7664 }
7665
7666 /**
7667  * _scsih_scan_finished - scsi lld callback for .scan_finished
7668  * @shost: SCSI host pointer
7669  * @time: elapsed time of the scan in jiffies
7670  *
7671  * This function will be called periodicallyn until it returns 1 with the
7672  * scsi_host and the elapsed time of the scan in jiffies. In our implemention,
7673  * we wait for firmware discovery to complete, then return 1.
7674  */
7675 static int
7676 _scsih_scan_finished(struct Scsi_Host *shost, unsigned long time)
7677 {
7678         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7679
7680         if (disable_discovery > 0) {
7681                 ioc->is_driver_loading = 0;
7682                 ioc->wait_for_discovery_to_complete = 0;
7683                 return 1;
7684         }
7685
7686         if (time >= (300 * HZ)) {
7687                 ioc->base_cmds.status = MPT3_CMD_NOT_USED;
7688                 pr_info(MPT3SAS_FMT
7689                         "port enable: FAILED with timeout (timeout=300s)\n",
7690                         ioc->name);
7691                 ioc->is_driver_loading = 0;
7692                 return 1;
7693         }
7694
7695         if (ioc->start_scan)
7696                 return 0;
7697
7698         if (ioc->start_scan_failed) {
7699                 pr_info(MPT3SAS_FMT
7700                         "port enable: FAILED with (ioc_status=0x%08x)\n",
7701                         ioc->name, ioc->start_scan_failed);
7702                 ioc->is_driver_loading = 0;
7703                 ioc->wait_for_discovery_to_complete = 0;
7704                 ioc->remove_host = 1;
7705                 return 1;
7706         }
7707
7708         pr_info(MPT3SAS_FMT "port enable: SUCCESS\n", ioc->name);
7709         ioc->base_cmds.status = MPT3_CMD_NOT_USED;
7710
7711         if (ioc->wait_for_discovery_to_complete) {
7712                 ioc->wait_for_discovery_to_complete = 0;
7713                 _scsih_probe_devices(ioc);
7714         }
7715         mpt3sas_base_start_watchdog(ioc);
7716         ioc->is_driver_loading = 0;
7717         return 1;
7718 }
7719
7720 /**
7721  * _scsih_probe - attach and add scsi host
7722  * @pdev: PCI device struct
7723  * @id: pci device id
7724  *
7725  * Returns 0 success, anything else error.
7726  */
7727 static int
7728 _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
7729 {
7730         struct MPT3SAS_ADAPTER *ioc;
7731         struct Scsi_Host *shost;
7732
7733         shost = scsi_host_alloc(&scsih_driver_template,
7734             sizeof(struct MPT3SAS_ADAPTER));
7735         if (!shost)
7736                 return -ENODEV;
7737
7738         /* init local params */
7739         ioc = shost_priv(shost);
7740         memset(ioc, 0, sizeof(struct MPT3SAS_ADAPTER));
7741         INIT_LIST_HEAD(&ioc->list);
7742         list_add_tail(&ioc->list, &mpt3sas_ioc_list);
7743         ioc->shost = shost;
7744         ioc->id = mpt_ids++;
7745         sprintf(ioc->name, "%s%d", MPT3SAS_DRIVER_NAME, ioc->id);
7746         ioc->pdev = pdev;
7747         ioc->scsi_io_cb_idx = scsi_io_cb_idx;
7748         ioc->tm_cb_idx = tm_cb_idx;
7749         ioc->ctl_cb_idx = ctl_cb_idx;
7750         ioc->base_cb_idx = base_cb_idx;
7751         ioc->port_enable_cb_idx = port_enable_cb_idx;
7752         ioc->transport_cb_idx = transport_cb_idx;
7753         ioc->scsih_cb_idx = scsih_cb_idx;
7754         ioc->config_cb_idx = config_cb_idx;
7755         ioc->tm_tr_cb_idx = tm_tr_cb_idx;
7756         ioc->tm_tr_volume_cb_idx = tm_tr_volume_cb_idx;
7757         ioc->tm_sas_control_cb_idx = tm_sas_control_cb_idx;
7758         ioc->logging_level = logging_level;
7759         ioc->schedule_dead_ioc_flush_running_cmds = &_scsih_flush_running_cmds;
7760         /* misc semaphores and spin locks */
7761         mutex_init(&ioc->reset_in_progress_mutex);
7762         spin_lock_init(&ioc->ioc_reset_in_progress_lock);
7763         spin_lock_init(&ioc->scsi_lookup_lock);
7764         spin_lock_init(&ioc->sas_device_lock);
7765         spin_lock_init(&ioc->sas_node_lock);
7766         spin_lock_init(&ioc->fw_event_lock);
7767         spin_lock_init(&ioc->raid_device_lock);
7768         spin_lock_init(&ioc->diag_trigger_lock);
7769
7770         INIT_LIST_HEAD(&ioc->sas_device_list);
7771         INIT_LIST_HEAD(&ioc->sas_device_init_list);
7772         INIT_LIST_HEAD(&ioc->sas_expander_list);
7773         INIT_LIST_HEAD(&ioc->fw_event_list);
7774         INIT_LIST_HEAD(&ioc->raid_device_list);
7775         INIT_LIST_HEAD(&ioc->sas_hba.sas_port_list);
7776         INIT_LIST_HEAD(&ioc->delayed_tr_list);
7777         INIT_LIST_HEAD(&ioc->delayed_tr_volume_list);
7778         INIT_LIST_HEAD(&ioc->reply_queue_list);
7779
7780         /* init shost parameters */
7781         shost->max_cmd_len = 32;
7782         shost->max_lun = max_lun;
7783         shost->transportt = mpt3sas_transport_template;
7784         shost->unique_id = ioc->id;
7785
7786         if (max_sectors != 0xFFFF) {
7787                 if (max_sectors < 64) {
7788                         shost->max_sectors = 64;
7789                         pr_warn(MPT3SAS_FMT "Invalid value %d passed " \
7790                             "for max_sectors, range is 64 to 32767. Assigning "
7791                             "value of 64.\n", ioc->name, max_sectors);
7792                 } else if (max_sectors > 32767) {
7793                         shost->max_sectors = 32767;
7794                         pr_warn(MPT3SAS_FMT "Invalid value %d passed " \
7795                             "for max_sectors, range is 64 to 32767. Assigning "
7796                             "default value of 32767.\n", ioc->name,
7797                             max_sectors);
7798                 } else {
7799                         shost->max_sectors = max_sectors & 0xFFFE;
7800                         pr_info(MPT3SAS_FMT
7801                                 "The max_sectors value is set to %d\n",
7802                                 ioc->name, shost->max_sectors);
7803                 }
7804         }
7805
7806         if ((scsi_add_host(shost, &pdev->dev))) {
7807                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
7808                     ioc->name, __FILE__, __LINE__, __func__);
7809                 list_del(&ioc->list);
7810                 goto out_add_shost_fail;
7811         }
7812
7813         /* register EEDP capabilities with SCSI layer */
7814         if (prot_mask > 0)
7815                 scsi_host_set_prot(shost, prot_mask);
7816         else
7817                 scsi_host_set_prot(shost, SHOST_DIF_TYPE1_PROTECTION
7818                                    | SHOST_DIF_TYPE2_PROTECTION
7819                                    | SHOST_DIF_TYPE3_PROTECTION);
7820
7821         scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC);
7822
7823         /* event thread */
7824         snprintf(ioc->firmware_event_name, sizeof(ioc->firmware_event_name),
7825             "fw_event%d", ioc->id);
7826         ioc->firmware_event_thread = create_singlethread_workqueue(
7827             ioc->firmware_event_name);
7828         if (!ioc->firmware_event_thread) {
7829                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
7830                     ioc->name, __FILE__, __LINE__, __func__);
7831                 goto out_thread_fail;
7832         }
7833
7834         ioc->is_driver_loading = 1;
7835         if ((mpt3sas_base_attach(ioc))) {
7836                 pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
7837                     ioc->name, __FILE__, __LINE__, __func__);
7838                 goto out_attach_fail;
7839         }
7840         scsi_scan_host(shost);
7841         return 0;
7842
7843  out_attach_fail:
7844         destroy_workqueue(ioc->firmware_event_thread);
7845  out_thread_fail:
7846         list_del(&ioc->list);
7847         scsi_remove_host(shost);
7848  out_add_shost_fail:
7849         scsi_host_put(shost);
7850         return -ENODEV;
7851 }
7852
7853 #ifdef CONFIG_PM
7854 /**
7855  * _scsih_suspend - power management suspend main entry point
7856  * @pdev: PCI device struct
7857  * @state: PM state change to (usually PCI_D3)
7858  *
7859  * Returns 0 success, anything else error.
7860  */
7861 static int
7862 _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
7863 {
7864         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7865         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7866         pci_power_t device_state;
7867
7868         mpt3sas_base_stop_watchdog(ioc);
7869         flush_scheduled_work();
7870         scsi_block_requests(shost);
7871         device_state = pci_choose_state(pdev, state);
7872         pr_info(MPT3SAS_FMT
7873                 "pdev=0x%p, slot=%s, entering operating state [D%d]\n",
7874                 ioc->name, pdev, pci_name(pdev), device_state);
7875
7876         pci_save_state(pdev);
7877         mpt3sas_base_free_resources(ioc);
7878         pci_set_power_state(pdev, device_state);
7879         return 0;
7880 }
7881
7882 /**
7883  * _scsih_resume - power management resume main entry point
7884  * @pdev: PCI device struct
7885  *
7886  * Returns 0 success, anything else error.
7887  */
7888 static int
7889 _scsih_resume(struct pci_dev *pdev)
7890 {
7891         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7892         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7893         pci_power_t device_state = pdev->current_state;
7894         int r;
7895
7896         pr_info(MPT3SAS_FMT
7897                 "pdev=0x%p, slot=%s, previous operating state [D%d]\n",
7898                 ioc->name, pdev, pci_name(pdev), device_state);
7899
7900         pci_set_power_state(pdev, PCI_D0);
7901         pci_enable_wake(pdev, PCI_D0, 0);
7902         pci_restore_state(pdev);
7903         ioc->pdev = pdev;
7904         r = mpt3sas_base_map_resources(ioc);
7905         if (r)
7906                 return r;
7907
7908         mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET);
7909         scsi_unblock_requests(shost);
7910         mpt3sas_base_start_watchdog(ioc);
7911         return 0;
7912 }
7913 #endif /* CONFIG_PM */
7914
7915 /**
7916  * _scsih_pci_error_detected - Called when a PCI error is detected.
7917  * @pdev: PCI device struct
7918  * @state: PCI channel state
7919  *
7920  * Description: Called when a PCI error is detected.
7921  *
7922  * Return value:
7923  *      PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT
7924  */
7925 static pci_ers_result_t
7926 _scsih_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
7927 {
7928         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7929         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7930
7931         pr_info(MPT3SAS_FMT "PCI error: detected callback, state(%d)!!\n",
7932             ioc->name, state);
7933
7934         switch (state) {
7935         case pci_channel_io_normal:
7936                 return PCI_ERS_RESULT_CAN_RECOVER;
7937         case pci_channel_io_frozen:
7938                 /* Fatal error, prepare for slot reset */
7939                 ioc->pci_error_recovery = 1;
7940                 scsi_block_requests(ioc->shost);
7941                 mpt3sas_base_stop_watchdog(ioc);
7942                 mpt3sas_base_free_resources(ioc);
7943                 return PCI_ERS_RESULT_NEED_RESET;
7944         case pci_channel_io_perm_failure:
7945                 /* Permanent error, prepare for device removal */
7946                 ioc->pci_error_recovery = 1;
7947                 mpt3sas_base_stop_watchdog(ioc);
7948                 _scsih_flush_running_cmds(ioc);
7949                 return PCI_ERS_RESULT_DISCONNECT;
7950         }
7951         return PCI_ERS_RESULT_NEED_RESET;
7952 }
7953
7954 /**
7955  * _scsih_pci_slot_reset - Called when PCI slot has been reset.
7956  * @pdev: PCI device struct
7957  *
7958  * Description: This routine is called by the pci error recovery
7959  * code after the PCI slot has been reset, just before we
7960  * should resume normal operations.
7961  */
7962 static pci_ers_result_t
7963 _scsih_pci_slot_reset(struct pci_dev *pdev)
7964 {
7965         struct Scsi_Host *shost = pci_get_drvdata(pdev);
7966         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
7967         int rc;
7968
7969         pr_info(MPT3SAS_FMT "PCI error: slot reset callback!!\n",
7970              ioc->name);
7971
7972         ioc->pci_error_recovery = 0;
7973         ioc->pdev = pdev;
7974         pci_restore_state(pdev);
7975         rc = mpt3sas_base_map_resources(ioc);
7976         if (rc)
7977                 return PCI_ERS_RESULT_DISCONNECT;
7978
7979         rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP,
7980             FORCE_BIG_HAMMER);
7981
7982         pr_warn(MPT3SAS_FMT "hard reset: %s\n", ioc->name,
7983             (rc == 0) ? "success" : "failed");
7984
7985         if (!rc)
7986                 return PCI_ERS_RESULT_RECOVERED;
7987         else
7988                 return PCI_ERS_RESULT_DISCONNECT;
7989 }
7990
7991 /**
7992  * _scsih_pci_resume() - resume normal ops after PCI reset
7993  * @pdev: pointer to PCI device
7994  *
7995  * Called when the error recovery driver tells us that its
7996  * OK to resume normal operation. Use completion to allow
7997  * halted scsi ops to resume.
7998  */
7999 static void
8000 _scsih_pci_resume(struct pci_dev *pdev)
8001 {
8002         struct Scsi_Host *shost = pci_get_drvdata(pdev);
8003         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
8004
8005         pr_info(MPT3SAS_FMT "PCI error: resume callback!!\n", ioc->name);
8006
8007         pci_cleanup_aer_uncorrect_error_status(pdev);
8008         mpt3sas_base_start_watchdog(ioc);
8009         scsi_unblock_requests(ioc->shost);
8010 }
8011
8012 /**
8013  * _scsih_pci_mmio_enabled - Enable MMIO and dump debug registers
8014  * @pdev: pointer to PCI device
8015  */
8016 static pci_ers_result_t
8017 _scsih_pci_mmio_enabled(struct pci_dev *pdev)
8018 {
8019         struct Scsi_Host *shost = pci_get_drvdata(pdev);
8020         struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
8021
8022         pr_info(MPT3SAS_FMT "PCI error: mmio enabled callback!!\n",
8023             ioc->name);
8024
8025         /* TODO - dump whatever for debugging purposes */
8026
8027         /* Request a slot reset. */
8028         return PCI_ERS_RESULT_NEED_RESET;
8029 }
8030
8031 /* raid transport support */
8032 static struct raid_function_template mpt3sas_raid_functions = {
8033         .cookie         = &scsih_driver_template,
8034         .is_raid        = _scsih_is_raid,
8035         .get_resync     = _scsih_get_resync,
8036         .get_state      = _scsih_get_state,
8037 };
8038
8039 static struct pci_error_handlers _scsih_err_handler = {
8040         .error_detected = _scsih_pci_error_detected,
8041         .mmio_enabled = _scsih_pci_mmio_enabled,
8042         .slot_reset =   _scsih_pci_slot_reset,
8043         .resume =       _scsih_pci_resume,
8044 };
8045
8046 static struct pci_driver scsih_driver = {
8047         .name           = MPT3SAS_DRIVER_NAME,
8048         .id_table       = scsih_pci_table,
8049         .probe          = _scsih_probe,
8050         .remove         = _scsih_remove,
8051         .shutdown       = _scsih_shutdown,
8052         .err_handler    = &_scsih_err_handler,
8053 #ifdef CONFIG_PM
8054         .suspend        = _scsih_suspend,
8055         .resume         = _scsih_resume,
8056 #endif
8057 };
8058
8059
8060 /**
8061  * _scsih_init - main entry point for this driver.
8062  *
8063  * Returns 0 success, anything else error.
8064  */
8065 static int __init
8066 _scsih_init(void)
8067 {
8068         int error;
8069
8070         mpt_ids = 0;
8071
8072         pr_info("%s version %s loaded\n", MPT3SAS_DRIVER_NAME,
8073             MPT3SAS_DRIVER_VERSION);
8074
8075         mpt3sas_transport_template =
8076             sas_attach_transport(&mpt3sas_transport_functions);
8077         if (!mpt3sas_transport_template)
8078                 return -ENODEV;
8079
8080 /* raid transport support */
8081         mpt3sas_raid_template = raid_class_attach(&mpt3sas_raid_functions);
8082         if (!mpt3sas_raid_template) {
8083                 sas_release_transport(mpt3sas_transport_template);
8084                 return -ENODEV;
8085         }
8086
8087         mpt3sas_base_initialize_callback_handler();
8088
8089          /* queuecommand callback hander */
8090         scsi_io_cb_idx = mpt3sas_base_register_callback_handler(_scsih_io_done);
8091
8092         /* task managment callback handler */
8093         tm_cb_idx = mpt3sas_base_register_callback_handler(_scsih_tm_done);
8094
8095         /* base internal commands callback handler */
8096         base_cb_idx = mpt3sas_base_register_callback_handler(mpt3sas_base_done);
8097         port_enable_cb_idx = mpt3sas_base_register_callback_handler(
8098             mpt3sas_port_enable_done);
8099
8100         /* transport internal commands callback handler */
8101         transport_cb_idx = mpt3sas_base_register_callback_handler(
8102             mpt3sas_transport_done);
8103
8104         /* scsih internal commands callback handler */
8105         scsih_cb_idx = mpt3sas_base_register_callback_handler(_scsih_done);
8106
8107         /* configuration page API internal commands callback handler */
8108         config_cb_idx = mpt3sas_base_register_callback_handler(
8109             mpt3sas_config_done);
8110
8111         /* ctl module callback handler */
8112         ctl_cb_idx = mpt3sas_base_register_callback_handler(mpt3sas_ctl_done);
8113
8114         tm_tr_cb_idx = mpt3sas_base_register_callback_handler(
8115             _scsih_tm_tr_complete);
8116
8117         tm_tr_volume_cb_idx = mpt3sas_base_register_callback_handler(
8118             _scsih_tm_volume_tr_complete);
8119
8120         tm_sas_control_cb_idx = mpt3sas_base_register_callback_handler(
8121             _scsih_sas_control_complete);
8122
8123         mpt3sas_ctl_init();
8124
8125         error = pci_register_driver(&scsih_driver);
8126         if (error) {
8127                 /* raid transport support */
8128                 raid_class_release(mpt3sas_raid_template);
8129                 sas_release_transport(mpt3sas_transport_template);
8130         }
8131
8132         return error;
8133 }
8134
8135 /**
8136  * _scsih_exit - exit point for this driver (when it is a module).
8137  *
8138  * Returns 0 success, anything else error.
8139  */
8140 static void __exit
8141 _scsih_exit(void)
8142 {
8143         pr_info("mpt3sas version %s unloading\n",
8144             MPT3SAS_DRIVER_VERSION);
8145
8146         mpt3sas_ctl_exit();
8147
8148         pci_unregister_driver(&scsih_driver);
8149
8150
8151         mpt3sas_base_release_callback_handler(scsi_io_cb_idx);
8152         mpt3sas_base_release_callback_handler(tm_cb_idx);
8153         mpt3sas_base_release_callback_handler(base_cb_idx);
8154         mpt3sas_base_release_callback_handler(port_enable_cb_idx);
8155         mpt3sas_base_release_callback_handler(transport_cb_idx);
8156         mpt3sas_base_release_callback_handler(scsih_cb_idx);
8157         mpt3sas_base_release_callback_handler(config_cb_idx);
8158         mpt3sas_base_release_callback_handler(ctl_cb_idx);
8159
8160         mpt3sas_base_release_callback_handler(tm_tr_cb_idx);
8161         mpt3sas_base_release_callback_handler(tm_tr_volume_cb_idx);
8162         mpt3sas_base_release_callback_handler(tm_sas_control_cb_idx);
8163
8164 /* raid transport support */
8165         raid_class_release(mpt3sas_raid_template);
8166         sas_release_transport(mpt3sas_transport_template);
8167 }
8168
8169 module_init(_scsih_init);
8170 module_exit(_scsih_exit);