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