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