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