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