1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Driver for Broadcom MPI3 Storage Controllers 4 * 5 * Copyright (C) 2017-2022 Broadcom Inc. 6 * (mailto: mpi3mr-linuxdrv.pdl@broadcom.com) 7 * 8 */ 9 10 #include "mpi3mr.h" 11 12 /* global driver scop variables */ 13 LIST_HEAD(mrioc_list); 14 DEFINE_SPINLOCK(mrioc_list_lock); 15 static int mrioc_ids; 16 static int warn_non_secure_ctlr; 17 atomic64_t event_counter; 18 19 MODULE_AUTHOR(MPI3MR_DRIVER_AUTHOR); 20 MODULE_DESCRIPTION(MPI3MR_DRIVER_DESC); 21 MODULE_LICENSE(MPI3MR_DRIVER_LICENSE); 22 MODULE_VERSION(MPI3MR_DRIVER_VERSION); 23 24 /* Module parameters*/ 25 int prot_mask = -1; 26 module_param(prot_mask, int, 0); 27 MODULE_PARM_DESC(prot_mask, "Host protection capabilities mask, def=0x07"); 28 29 static int prot_guard_mask = 3; 30 module_param(prot_guard_mask, int, 0); 31 MODULE_PARM_DESC(prot_guard_mask, " Host protection guard mask, def=3"); 32 static int logging_level; 33 module_param(logging_level, int, 0); 34 MODULE_PARM_DESC(logging_level, 35 " bits for enabling additional logging info (default=0)"); 36 37 /* Forward declarations*/ 38 static void mpi3mr_send_event_ack(struct mpi3mr_ioc *mrioc, u8 event, 39 struct mpi3mr_drv_cmd *cmdparam, u32 event_ctx); 40 41 #define MPI3MR_DRIVER_EVENT_TG_QD_REDUCTION (0xFFFF) 42 43 /** 44 * mpi3mr_host_tag_for_scmd - Get host tag for a scmd 45 * @mrioc: Adapter instance reference 46 * @scmd: SCSI command reference 47 * 48 * Calculate the host tag based on block tag for a given scmd. 49 * 50 * Return: Valid host tag or MPI3MR_HOSTTAG_INVALID. 51 */ 52 static u16 mpi3mr_host_tag_for_scmd(struct mpi3mr_ioc *mrioc, 53 struct scsi_cmnd *scmd) 54 { 55 struct scmd_priv *priv = NULL; 56 u32 unique_tag; 57 u16 host_tag, hw_queue; 58 59 unique_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd)); 60 61 hw_queue = blk_mq_unique_tag_to_hwq(unique_tag); 62 if (hw_queue >= mrioc->num_op_reply_q) 63 return MPI3MR_HOSTTAG_INVALID; 64 host_tag = blk_mq_unique_tag_to_tag(unique_tag); 65 66 if (WARN_ON(host_tag >= mrioc->max_host_ios)) 67 return MPI3MR_HOSTTAG_INVALID; 68 69 priv = scsi_cmd_priv(scmd); 70 /*host_tag 0 is invalid hence incrementing by 1*/ 71 priv->host_tag = host_tag + 1; 72 priv->scmd = scmd; 73 priv->in_lld_scope = 1; 74 priv->req_q_idx = hw_queue; 75 priv->meta_chain_idx = -1; 76 priv->chain_idx = -1; 77 priv->meta_sg_valid = 0; 78 return priv->host_tag; 79 } 80 81 /** 82 * mpi3mr_scmd_from_host_tag - Get SCSI command from host tag 83 * @mrioc: Adapter instance reference 84 * @host_tag: Host tag 85 * @qidx: Operational queue index 86 * 87 * Identify the block tag from the host tag and queue index and 88 * retrieve associated scsi command using scsi_host_find_tag(). 89 * 90 * Return: SCSI command reference or NULL. 91 */ 92 static struct scsi_cmnd *mpi3mr_scmd_from_host_tag( 93 struct mpi3mr_ioc *mrioc, u16 host_tag, u16 qidx) 94 { 95 struct scsi_cmnd *scmd = NULL; 96 struct scmd_priv *priv = NULL; 97 u32 unique_tag = host_tag - 1; 98 99 if (WARN_ON(host_tag > mrioc->max_host_ios)) 100 goto out; 101 102 unique_tag |= (qidx << BLK_MQ_UNIQUE_TAG_BITS); 103 104 scmd = scsi_host_find_tag(mrioc->shost, unique_tag); 105 if (scmd) { 106 priv = scsi_cmd_priv(scmd); 107 if (!priv->in_lld_scope) 108 scmd = NULL; 109 } 110 out: 111 return scmd; 112 } 113 114 /** 115 * mpi3mr_clear_scmd_priv - Cleanup SCSI command private date 116 * @mrioc: Adapter instance reference 117 * @scmd: SCSI command reference 118 * 119 * Invalidate the SCSI command private data to mark the command 120 * is not in LLD scope anymore. 121 * 122 * Return: Nothing. 123 */ 124 static void mpi3mr_clear_scmd_priv(struct mpi3mr_ioc *mrioc, 125 struct scsi_cmnd *scmd) 126 { 127 struct scmd_priv *priv = NULL; 128 129 priv = scsi_cmd_priv(scmd); 130 131 if (WARN_ON(priv->in_lld_scope == 0)) 132 return; 133 priv->host_tag = MPI3MR_HOSTTAG_INVALID; 134 priv->req_q_idx = 0xFFFF; 135 priv->scmd = NULL; 136 priv->in_lld_scope = 0; 137 priv->meta_sg_valid = 0; 138 if (priv->chain_idx >= 0) { 139 clear_bit(priv->chain_idx, mrioc->chain_bitmap); 140 priv->chain_idx = -1; 141 } 142 if (priv->meta_chain_idx >= 0) { 143 clear_bit(priv->meta_chain_idx, mrioc->chain_bitmap); 144 priv->meta_chain_idx = -1; 145 } 146 } 147 148 static void mpi3mr_dev_rmhs_send_tm(struct mpi3mr_ioc *mrioc, u16 handle, 149 struct mpi3mr_drv_cmd *cmdparam, u8 iou_rc); 150 static void mpi3mr_fwevt_worker(struct work_struct *work); 151 152 /** 153 * mpi3mr_fwevt_free - firmware event memory dealloctor 154 * @r: k reference pointer of the firmware event 155 * 156 * Free firmware event memory when no reference. 157 */ 158 static void mpi3mr_fwevt_free(struct kref *r) 159 { 160 kfree(container_of(r, struct mpi3mr_fwevt, ref_count)); 161 } 162 163 /** 164 * mpi3mr_fwevt_get - k reference incrementor 165 * @fwevt: Firmware event reference 166 * 167 * Increment firmware event reference count. 168 */ 169 static void mpi3mr_fwevt_get(struct mpi3mr_fwevt *fwevt) 170 { 171 kref_get(&fwevt->ref_count); 172 } 173 174 /** 175 * mpi3mr_fwevt_put - k reference decrementor 176 * @fwevt: Firmware event reference 177 * 178 * decrement firmware event reference count. 179 */ 180 static void mpi3mr_fwevt_put(struct mpi3mr_fwevt *fwevt) 181 { 182 kref_put(&fwevt->ref_count, mpi3mr_fwevt_free); 183 } 184 185 /** 186 * mpi3mr_alloc_fwevt - Allocate firmware event 187 * @len: length of firmware event data to allocate 188 * 189 * Allocate firmware event with required length and initialize 190 * the reference counter. 191 * 192 * Return: firmware event reference. 193 */ 194 static struct mpi3mr_fwevt *mpi3mr_alloc_fwevt(int len) 195 { 196 struct mpi3mr_fwevt *fwevt; 197 198 fwevt = kzalloc(sizeof(*fwevt) + len, GFP_ATOMIC); 199 if (!fwevt) 200 return NULL; 201 202 kref_init(&fwevt->ref_count); 203 return fwevt; 204 } 205 206 /** 207 * mpi3mr_fwevt_add_to_list - Add firmware event to the list 208 * @mrioc: Adapter instance reference 209 * @fwevt: Firmware event reference 210 * 211 * Add the given firmware event to the firmware event list. 212 * 213 * Return: Nothing. 214 */ 215 static void mpi3mr_fwevt_add_to_list(struct mpi3mr_ioc *mrioc, 216 struct mpi3mr_fwevt *fwevt) 217 { 218 unsigned long flags; 219 220 if (!mrioc->fwevt_worker_thread) 221 return; 222 223 spin_lock_irqsave(&mrioc->fwevt_lock, flags); 224 /* get fwevt reference count while adding it to fwevt_list */ 225 mpi3mr_fwevt_get(fwevt); 226 INIT_LIST_HEAD(&fwevt->list); 227 list_add_tail(&fwevt->list, &mrioc->fwevt_list); 228 INIT_WORK(&fwevt->work, mpi3mr_fwevt_worker); 229 /* get fwevt reference count while enqueueing it to worker queue */ 230 mpi3mr_fwevt_get(fwevt); 231 queue_work(mrioc->fwevt_worker_thread, &fwevt->work); 232 spin_unlock_irqrestore(&mrioc->fwevt_lock, flags); 233 } 234 235 /** 236 * mpi3mr_fwevt_del_from_list - Delete firmware event from list 237 * @mrioc: Adapter instance reference 238 * @fwevt: Firmware event reference 239 * 240 * Delete the given firmware event from the firmware event list. 241 * 242 * Return: Nothing. 243 */ 244 static void mpi3mr_fwevt_del_from_list(struct mpi3mr_ioc *mrioc, 245 struct mpi3mr_fwevt *fwevt) 246 { 247 unsigned long flags; 248 249 spin_lock_irqsave(&mrioc->fwevt_lock, flags); 250 if (!list_empty(&fwevt->list)) { 251 list_del_init(&fwevt->list); 252 /* 253 * Put fwevt reference count after 254 * removing it from fwevt_list 255 */ 256 mpi3mr_fwevt_put(fwevt); 257 } 258 spin_unlock_irqrestore(&mrioc->fwevt_lock, flags); 259 } 260 261 /** 262 * mpi3mr_dequeue_fwevt - Dequeue firmware event from the list 263 * @mrioc: Adapter instance reference 264 * 265 * Dequeue a firmware event from the firmware event list. 266 * 267 * Return: firmware event. 268 */ 269 static struct mpi3mr_fwevt *mpi3mr_dequeue_fwevt( 270 struct mpi3mr_ioc *mrioc) 271 { 272 unsigned long flags; 273 struct mpi3mr_fwevt *fwevt = NULL; 274 275 spin_lock_irqsave(&mrioc->fwevt_lock, flags); 276 if (!list_empty(&mrioc->fwevt_list)) { 277 fwevt = list_first_entry(&mrioc->fwevt_list, 278 struct mpi3mr_fwevt, list); 279 list_del_init(&fwevt->list); 280 /* 281 * Put fwevt reference count after 282 * removing it from fwevt_list 283 */ 284 mpi3mr_fwevt_put(fwevt); 285 } 286 spin_unlock_irqrestore(&mrioc->fwevt_lock, flags); 287 288 return fwevt; 289 } 290 291 /** 292 * mpi3mr_cancel_work - cancel firmware event 293 * @fwevt: fwevt object which needs to be canceled 294 * 295 * Return: Nothing. 296 */ 297 static void mpi3mr_cancel_work(struct mpi3mr_fwevt *fwevt) 298 { 299 /* 300 * Wait on the fwevt to complete. If this returns 1, then 301 * the event was never executed. 302 * 303 * If it did execute, we wait for it to finish, and the put will 304 * happen from mpi3mr_process_fwevt() 305 */ 306 if (cancel_work_sync(&fwevt->work)) { 307 /* 308 * Put fwevt reference count after 309 * dequeuing it from worker queue 310 */ 311 mpi3mr_fwevt_put(fwevt); 312 /* 313 * Put fwevt reference count to neutralize 314 * kref_init increment 315 */ 316 mpi3mr_fwevt_put(fwevt); 317 } 318 } 319 320 /** 321 * mpi3mr_cleanup_fwevt_list - Cleanup firmware event list 322 * @mrioc: Adapter instance reference 323 * 324 * Flush all pending firmware events from the firmware event 325 * list. 326 * 327 * Return: Nothing. 328 */ 329 void mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc) 330 { 331 struct mpi3mr_fwevt *fwevt = NULL; 332 333 if ((list_empty(&mrioc->fwevt_list) && !mrioc->current_event) || 334 !mrioc->fwevt_worker_thread) 335 return; 336 337 while ((fwevt = mpi3mr_dequeue_fwevt(mrioc))) 338 mpi3mr_cancel_work(fwevt); 339 340 if (mrioc->current_event) { 341 fwevt = mrioc->current_event; 342 /* 343 * Don't call cancel_work_sync() API for the 344 * fwevt work if the controller reset is 345 * get called as part of processing the 346 * same fwevt work (or) when worker thread is 347 * waiting for device add/remove APIs to complete. 348 * Otherwise we will see deadlock. 349 */ 350 if (current_work() == &fwevt->work || fwevt->pending_at_sml) { 351 fwevt->discard = 1; 352 return; 353 } 354 355 mpi3mr_cancel_work(fwevt); 356 } 357 } 358 359 /** 360 * mpi3mr_queue_qd_reduction_event - Queue TG QD reduction event 361 * @mrioc: Adapter instance reference 362 * @tg: Throttle group information pointer 363 * 364 * Accessor to queue on synthetically generated driver event to 365 * the event worker thread, the driver event will be used to 366 * reduce the QD of all VDs in the TG from the worker thread. 367 * 368 * Return: None. 369 */ 370 static void mpi3mr_queue_qd_reduction_event(struct mpi3mr_ioc *mrioc, 371 struct mpi3mr_throttle_group_info *tg) 372 { 373 struct mpi3mr_fwevt *fwevt; 374 u16 sz = sizeof(struct mpi3mr_throttle_group_info *); 375 376 /* 377 * If the QD reduction event is already queued due to throttle and if 378 * the QD is not restored through device info change event 379 * then dont queue further reduction events 380 */ 381 if (tg->fw_qd != tg->modified_qd) 382 return; 383 384 fwevt = mpi3mr_alloc_fwevt(sz); 385 if (!fwevt) { 386 ioc_warn(mrioc, "failed to queue TG QD reduction event\n"); 387 return; 388 } 389 *(struct mpi3mr_throttle_group_info **)fwevt->event_data = tg; 390 fwevt->mrioc = mrioc; 391 fwevt->event_id = MPI3MR_DRIVER_EVENT_TG_QD_REDUCTION; 392 fwevt->send_ack = 0; 393 fwevt->process_evt = 1; 394 fwevt->evt_ctx = 0; 395 fwevt->event_data_size = sz; 396 tg->modified_qd = max_t(u16, (tg->fw_qd * tg->qd_reduction) / 10, 8); 397 398 dprint_event_bh(mrioc, "qd reduction event queued for tg_id(%d)\n", 399 tg->id); 400 mpi3mr_fwevt_add_to_list(mrioc, fwevt); 401 } 402 403 /** 404 * mpi3mr_invalidate_devhandles -Invalidate device handles 405 * @mrioc: Adapter instance reference 406 * 407 * Invalidate the device handles in the target device structures 408 * . Called post reset prior to reinitializing the controller. 409 * 410 * Return: Nothing. 411 */ 412 void mpi3mr_invalidate_devhandles(struct mpi3mr_ioc *mrioc) 413 { 414 struct mpi3mr_tgt_dev *tgtdev; 415 struct mpi3mr_stgt_priv_data *tgt_priv; 416 417 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { 418 tgtdev->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 419 if (tgtdev->starget && tgtdev->starget->hostdata) { 420 tgt_priv = tgtdev->starget->hostdata; 421 tgt_priv->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 422 tgt_priv->io_throttle_enabled = 0; 423 tgt_priv->io_divert = 0; 424 tgt_priv->throttle_group = NULL; 425 } 426 } 427 } 428 429 /** 430 * mpi3mr_print_scmd - print individual SCSI command 431 * @rq: Block request 432 * @data: Adapter instance reference 433 * 434 * Print the SCSI command details if it is in LLD scope. 435 * 436 * Return: true always. 437 */ 438 static bool mpi3mr_print_scmd(struct request *rq, void *data) 439 { 440 struct mpi3mr_ioc *mrioc = (struct mpi3mr_ioc *)data; 441 struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq); 442 struct scmd_priv *priv = NULL; 443 444 if (scmd) { 445 priv = scsi_cmd_priv(scmd); 446 if (!priv->in_lld_scope) 447 goto out; 448 449 ioc_info(mrioc, "%s :Host Tag = %d, qid = %d\n", 450 __func__, priv->host_tag, priv->req_q_idx + 1); 451 scsi_print_command(scmd); 452 } 453 454 out: 455 return(true); 456 } 457 458 /** 459 * mpi3mr_flush_scmd - Flush individual SCSI command 460 * @rq: Block request 461 * @data: Adapter instance reference 462 * 463 * Return the SCSI command to the upper layers if it is in LLD 464 * scope. 465 * 466 * Return: true always. 467 */ 468 469 static bool mpi3mr_flush_scmd(struct request *rq, void *data) 470 { 471 struct mpi3mr_ioc *mrioc = (struct mpi3mr_ioc *)data; 472 struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq); 473 struct scmd_priv *priv = NULL; 474 475 if (scmd) { 476 priv = scsi_cmd_priv(scmd); 477 if (!priv->in_lld_scope) 478 goto out; 479 480 if (priv->meta_sg_valid) 481 dma_unmap_sg(&mrioc->pdev->dev, scsi_prot_sglist(scmd), 482 scsi_prot_sg_count(scmd), scmd->sc_data_direction); 483 mpi3mr_clear_scmd_priv(mrioc, scmd); 484 scsi_dma_unmap(scmd); 485 scmd->result = DID_RESET << 16; 486 scsi_print_command(scmd); 487 scsi_done(scmd); 488 mrioc->flush_io_count++; 489 } 490 491 out: 492 return(true); 493 } 494 495 /** 496 * mpi3mr_count_dev_pending - Count commands pending for a lun 497 * @rq: Block request 498 * @data: SCSI device reference 499 * 500 * This is an iterator function called for each SCSI command in 501 * a host and if the command is pending in the LLD for the 502 * specific device(lun) then device specific pending I/O counter 503 * is updated in the device structure. 504 * 505 * Return: true always. 506 */ 507 508 static bool mpi3mr_count_dev_pending(struct request *rq, void *data) 509 { 510 struct scsi_device *sdev = (struct scsi_device *)data; 511 struct mpi3mr_sdev_priv_data *sdev_priv_data = sdev->hostdata; 512 struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq); 513 struct scmd_priv *priv; 514 515 if (scmd) { 516 priv = scsi_cmd_priv(scmd); 517 if (!priv->in_lld_scope) 518 goto out; 519 if (scmd->device == sdev) 520 sdev_priv_data->pend_count++; 521 } 522 523 out: 524 return true; 525 } 526 527 /** 528 * mpi3mr_count_tgt_pending - Count commands pending for target 529 * @rq: Block request 530 * @data: SCSI target reference 531 * 532 * This is an iterator function called for each SCSI command in 533 * a host and if the command is pending in the LLD for the 534 * specific target then target specific pending I/O counter is 535 * updated in the target structure. 536 * 537 * Return: true always. 538 */ 539 540 static bool mpi3mr_count_tgt_pending(struct request *rq, void *data) 541 { 542 struct scsi_target *starget = (struct scsi_target *)data; 543 struct mpi3mr_stgt_priv_data *stgt_priv_data = starget->hostdata; 544 struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq); 545 struct scmd_priv *priv; 546 547 if (scmd) { 548 priv = scsi_cmd_priv(scmd); 549 if (!priv->in_lld_scope) 550 goto out; 551 if (scmd->device && (scsi_target(scmd->device) == starget)) 552 stgt_priv_data->pend_count++; 553 } 554 555 out: 556 return true; 557 } 558 559 /** 560 * mpi3mr_flush_host_io - Flush host I/Os 561 * @mrioc: Adapter instance reference 562 * 563 * Flush all of the pending I/Os by calling 564 * blk_mq_tagset_busy_iter() for each possible tag. This is 565 * executed post controller reset 566 * 567 * Return: Nothing. 568 */ 569 void mpi3mr_flush_host_io(struct mpi3mr_ioc *mrioc) 570 { 571 struct Scsi_Host *shost = mrioc->shost; 572 573 mrioc->flush_io_count = 0; 574 ioc_info(mrioc, "%s :Flushing Host I/O cmds post reset\n", __func__); 575 blk_mq_tagset_busy_iter(&shost->tag_set, 576 mpi3mr_flush_scmd, (void *)mrioc); 577 ioc_info(mrioc, "%s :Flushed %d Host I/O cmds\n", __func__, 578 mrioc->flush_io_count); 579 } 580 581 /** 582 * mpi3mr_alloc_tgtdev - target device allocator 583 * 584 * Allocate target device instance and initialize the reference 585 * count 586 * 587 * Return: target device instance. 588 */ 589 static struct mpi3mr_tgt_dev *mpi3mr_alloc_tgtdev(void) 590 { 591 struct mpi3mr_tgt_dev *tgtdev; 592 593 tgtdev = kzalloc(sizeof(*tgtdev), GFP_ATOMIC); 594 if (!tgtdev) 595 return NULL; 596 kref_init(&tgtdev->ref_count); 597 return tgtdev; 598 } 599 600 /** 601 * mpi3mr_tgtdev_add_to_list -Add tgtdevice to the list 602 * @mrioc: Adapter instance reference 603 * @tgtdev: Target device 604 * 605 * Add the target device to the target device list 606 * 607 * Return: Nothing. 608 */ 609 static void mpi3mr_tgtdev_add_to_list(struct mpi3mr_ioc *mrioc, 610 struct mpi3mr_tgt_dev *tgtdev) 611 { 612 unsigned long flags; 613 614 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 615 mpi3mr_tgtdev_get(tgtdev); 616 INIT_LIST_HEAD(&tgtdev->list); 617 list_add_tail(&tgtdev->list, &mrioc->tgtdev_list); 618 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 619 } 620 621 /** 622 * mpi3mr_tgtdev_del_from_list -Delete tgtdevice from the list 623 * @mrioc: Adapter instance reference 624 * @tgtdev: Target device 625 * 626 * Remove the target device from the target device list 627 * 628 * Return: Nothing. 629 */ 630 static void mpi3mr_tgtdev_del_from_list(struct mpi3mr_ioc *mrioc, 631 struct mpi3mr_tgt_dev *tgtdev) 632 { 633 unsigned long flags; 634 635 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 636 if (!list_empty(&tgtdev->list)) { 637 list_del_init(&tgtdev->list); 638 mpi3mr_tgtdev_put(tgtdev); 639 } 640 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 641 } 642 643 /** 644 * __mpi3mr_get_tgtdev_by_handle -Get tgtdev from device handle 645 * @mrioc: Adapter instance reference 646 * @handle: Device handle 647 * 648 * Accessor to retrieve target device from the device handle. 649 * Non Lock version 650 * 651 * Return: Target device reference. 652 */ 653 static struct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_by_handle( 654 struct mpi3mr_ioc *mrioc, u16 handle) 655 { 656 struct mpi3mr_tgt_dev *tgtdev; 657 658 assert_spin_locked(&mrioc->tgtdev_lock); 659 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) 660 if (tgtdev->dev_handle == handle) 661 goto found_tgtdev; 662 return NULL; 663 664 found_tgtdev: 665 mpi3mr_tgtdev_get(tgtdev); 666 return tgtdev; 667 } 668 669 /** 670 * mpi3mr_get_tgtdev_by_handle -Get tgtdev from device handle 671 * @mrioc: Adapter instance reference 672 * @handle: Device handle 673 * 674 * Accessor to retrieve target device from the device handle. 675 * Lock version 676 * 677 * Return: Target device reference. 678 */ 679 struct mpi3mr_tgt_dev *mpi3mr_get_tgtdev_by_handle( 680 struct mpi3mr_ioc *mrioc, u16 handle) 681 { 682 struct mpi3mr_tgt_dev *tgtdev; 683 unsigned long flags; 684 685 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 686 tgtdev = __mpi3mr_get_tgtdev_by_handle(mrioc, handle); 687 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 688 return tgtdev; 689 } 690 691 /** 692 * __mpi3mr_get_tgtdev_by_perst_id -Get tgtdev from persist ID 693 * @mrioc: Adapter instance reference 694 * @persist_id: Persistent ID 695 * 696 * Accessor to retrieve target device from the Persistent ID. 697 * Non Lock version 698 * 699 * Return: Target device reference. 700 */ 701 static struct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_by_perst_id( 702 struct mpi3mr_ioc *mrioc, u16 persist_id) 703 { 704 struct mpi3mr_tgt_dev *tgtdev; 705 706 assert_spin_locked(&mrioc->tgtdev_lock); 707 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) 708 if (tgtdev->perst_id == persist_id) 709 goto found_tgtdev; 710 return NULL; 711 712 found_tgtdev: 713 mpi3mr_tgtdev_get(tgtdev); 714 return tgtdev; 715 } 716 717 /** 718 * mpi3mr_get_tgtdev_by_perst_id -Get tgtdev from persistent ID 719 * @mrioc: Adapter instance reference 720 * @persist_id: Persistent ID 721 * 722 * Accessor to retrieve target device from the Persistent ID. 723 * Lock version 724 * 725 * Return: Target device reference. 726 */ 727 static struct mpi3mr_tgt_dev *mpi3mr_get_tgtdev_by_perst_id( 728 struct mpi3mr_ioc *mrioc, u16 persist_id) 729 { 730 struct mpi3mr_tgt_dev *tgtdev; 731 unsigned long flags; 732 733 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 734 tgtdev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, persist_id); 735 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 736 return tgtdev; 737 } 738 739 /** 740 * __mpi3mr_get_tgtdev_from_tgtpriv -Get tgtdev from tgt private 741 * @mrioc: Adapter instance reference 742 * @tgt_priv: Target private data 743 * 744 * Accessor to return target device from the target private 745 * data. Non Lock version 746 * 747 * Return: Target device reference. 748 */ 749 static struct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_from_tgtpriv( 750 struct mpi3mr_ioc *mrioc, struct mpi3mr_stgt_priv_data *tgt_priv) 751 { 752 struct mpi3mr_tgt_dev *tgtdev; 753 754 assert_spin_locked(&mrioc->tgtdev_lock); 755 tgtdev = tgt_priv->tgt_dev; 756 if (tgtdev) 757 mpi3mr_tgtdev_get(tgtdev); 758 return tgtdev; 759 } 760 761 /** 762 * mpi3mr_set_io_divert_for_all_vd_in_tg -set divert for TG VDs 763 * @mrioc: Adapter instance reference 764 * @tg: Throttle group information pointer 765 * @divert_value: 1 or 0 766 * 767 * Accessor to set io_divert flag for each device associated 768 * with the given throttle group with the given value. 769 * 770 * Return: None. 771 */ 772 static void mpi3mr_set_io_divert_for_all_vd_in_tg(struct mpi3mr_ioc *mrioc, 773 struct mpi3mr_throttle_group_info *tg, u8 divert_value) 774 { 775 unsigned long flags; 776 struct mpi3mr_tgt_dev *tgtdev; 777 struct mpi3mr_stgt_priv_data *tgt_priv; 778 779 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 780 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { 781 if (tgtdev->starget && tgtdev->starget->hostdata) { 782 tgt_priv = tgtdev->starget->hostdata; 783 if (tgt_priv->throttle_group == tg) 784 tgt_priv->io_divert = divert_value; 785 } 786 } 787 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 788 } 789 790 /** 791 * mpi3mr_print_device_event_notice - print notice related to post processing of 792 * device event after controller reset. 793 * 794 * @mrioc: Adapter instance reference 795 * @device_add: true for device add event and false for device removal event 796 * 797 * Return: None. 798 */ 799 static void mpi3mr_print_device_event_notice(struct mpi3mr_ioc *mrioc, 800 bool device_add) 801 { 802 ioc_notice(mrioc, "Device %s was in progress before the reset and\n", 803 (device_add ? "addition" : "removal")); 804 ioc_notice(mrioc, "completed after reset, verify whether the exposed devices\n"); 805 ioc_notice(mrioc, "are matched with attached devices for correctness\n"); 806 } 807 808 /** 809 * mpi3mr_remove_tgtdev_from_host - Remove dev from upper layers 810 * @mrioc: Adapter instance reference 811 * @tgtdev: Target device structure 812 * 813 * Checks whether the device is exposed to upper layers and if it 814 * is then remove the device from upper layers by calling 815 * scsi_remove_target(). 816 * 817 * Return: 0 on success, non zero on failure. 818 */ 819 static void mpi3mr_remove_tgtdev_from_host(struct mpi3mr_ioc *mrioc, 820 struct mpi3mr_tgt_dev *tgtdev) 821 { 822 struct mpi3mr_stgt_priv_data *tgt_priv; 823 824 ioc_info(mrioc, "%s :Removing handle(0x%04x), wwid(0x%016llx)\n", 825 __func__, tgtdev->dev_handle, (unsigned long long)tgtdev->wwid); 826 if (tgtdev->starget && tgtdev->starget->hostdata) { 827 tgt_priv = tgtdev->starget->hostdata; 828 tgt_priv->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 829 } 830 831 if (tgtdev->starget) { 832 if (mrioc->current_event) 833 mrioc->current_event->pending_at_sml = 1; 834 scsi_remove_target(&tgtdev->starget->dev); 835 tgtdev->host_exposed = 0; 836 if (mrioc->current_event) { 837 mrioc->current_event->pending_at_sml = 0; 838 if (mrioc->current_event->discard) { 839 mpi3mr_print_device_event_notice(mrioc, false); 840 return; 841 } 842 } 843 } 844 ioc_info(mrioc, "%s :Removed handle(0x%04x), wwid(0x%016llx)\n", 845 __func__, tgtdev->dev_handle, (unsigned long long)tgtdev->wwid); 846 } 847 848 /** 849 * mpi3mr_report_tgtdev_to_host - Expose device to upper layers 850 * @mrioc: Adapter instance reference 851 * @perst_id: Persistent ID of the device 852 * 853 * Checks whether the device can be exposed to upper layers and 854 * if it is not then expose the device to upper layers by 855 * calling scsi_scan_target(). 856 * 857 * Return: 0 on success, non zero on failure. 858 */ 859 static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc, 860 u16 perst_id) 861 { 862 int retval = 0; 863 struct mpi3mr_tgt_dev *tgtdev; 864 865 tgtdev = mpi3mr_get_tgtdev_by_perst_id(mrioc, perst_id); 866 if (!tgtdev) { 867 retval = -1; 868 goto out; 869 } 870 if (tgtdev->is_hidden) { 871 retval = -1; 872 goto out; 873 } 874 if (!tgtdev->host_exposed && !mrioc->reset_in_progress) { 875 tgtdev->host_exposed = 1; 876 if (mrioc->current_event) 877 mrioc->current_event->pending_at_sml = 1; 878 scsi_scan_target(&mrioc->shost->shost_gendev, 0, 879 tgtdev->perst_id, 880 SCAN_WILD_CARD, SCSI_SCAN_INITIAL); 881 if (!tgtdev->starget) 882 tgtdev->host_exposed = 0; 883 if (mrioc->current_event) { 884 mrioc->current_event->pending_at_sml = 0; 885 if (mrioc->current_event->discard) { 886 mpi3mr_print_device_event_notice(mrioc, true); 887 goto out; 888 } 889 } 890 } 891 out: 892 if (tgtdev) 893 mpi3mr_tgtdev_put(tgtdev); 894 895 return retval; 896 } 897 898 /** 899 * mpi3mr_change_queue_depth- Change QD callback handler 900 * @sdev: SCSI device reference 901 * @q_depth: Queue depth 902 * 903 * Validate and limit QD and call scsi_change_queue_depth. 904 * 905 * Return: return value of scsi_change_queue_depth 906 */ 907 static int mpi3mr_change_queue_depth(struct scsi_device *sdev, 908 int q_depth) 909 { 910 struct scsi_target *starget = scsi_target(sdev); 911 struct Scsi_Host *shost = dev_to_shost(&starget->dev); 912 int retval = 0; 913 914 if (!sdev->tagged_supported) 915 q_depth = 1; 916 if (q_depth > shost->can_queue) 917 q_depth = shost->can_queue; 918 else if (!q_depth) 919 q_depth = MPI3MR_DEFAULT_SDEV_QD; 920 retval = scsi_change_queue_depth(sdev, q_depth); 921 sdev->max_queue_depth = sdev->queue_depth; 922 923 return retval; 924 } 925 926 /** 927 * mpi3mr_update_sdev - Update SCSI device information 928 * @sdev: SCSI device reference 929 * @data: target device reference 930 * 931 * This is an iterator function called for each SCSI device in a 932 * target to update the target specific information into each 933 * SCSI device. 934 * 935 * Return: Nothing. 936 */ 937 static void 938 mpi3mr_update_sdev(struct scsi_device *sdev, void *data) 939 { 940 struct mpi3mr_tgt_dev *tgtdev; 941 942 tgtdev = (struct mpi3mr_tgt_dev *)data; 943 if (!tgtdev) 944 return; 945 946 mpi3mr_change_queue_depth(sdev, tgtdev->q_depth); 947 switch (tgtdev->dev_type) { 948 case MPI3_DEVICE_DEVFORM_PCIE: 949 /*The block layer hw sector size = 512*/ 950 if ((tgtdev->dev_spec.pcie_inf.dev_info & 951 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) == 952 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE) { 953 blk_queue_max_hw_sectors(sdev->request_queue, 954 tgtdev->dev_spec.pcie_inf.mdts / 512); 955 if (tgtdev->dev_spec.pcie_inf.pgsz == 0) 956 blk_queue_virt_boundary(sdev->request_queue, 957 ((1 << MPI3MR_DEFAULT_PGSZEXP) - 1)); 958 else 959 blk_queue_virt_boundary(sdev->request_queue, 960 ((1 << tgtdev->dev_spec.pcie_inf.pgsz) - 1)); 961 } 962 break; 963 default: 964 break; 965 } 966 } 967 968 /** 969 * mpi3mr_rfresh_tgtdevs - Refresh target device exposure 970 * @mrioc: Adapter instance reference 971 * 972 * This is executed post controller reset to identify any 973 * missing devices during reset and remove from the upper layers 974 * or expose any newly detected device to the upper layers. 975 * 976 * Return: Nothing. 977 */ 978 979 void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc) 980 { 981 struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next; 982 983 list_for_each_entry_safe(tgtdev, tgtdev_next, &mrioc->tgtdev_list, 984 list) { 985 if (tgtdev->dev_handle == MPI3MR_INVALID_DEV_HANDLE) { 986 dprint_reset(mrioc, "removing target device with perst_id(%d)\n", 987 tgtdev->perst_id); 988 if (tgtdev->host_exposed) 989 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 990 mpi3mr_tgtdev_del_from_list(mrioc, tgtdev); 991 mpi3mr_tgtdev_put(tgtdev); 992 } 993 } 994 995 tgtdev = NULL; 996 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { 997 if ((tgtdev->dev_handle != MPI3MR_INVALID_DEV_HANDLE) && 998 !tgtdev->is_hidden && !tgtdev->host_exposed) 999 mpi3mr_report_tgtdev_to_host(mrioc, tgtdev->perst_id); 1000 } 1001 } 1002 1003 /** 1004 * mpi3mr_update_tgtdev - DevStatusChange evt bottomhalf 1005 * @mrioc: Adapter instance reference 1006 * @tgtdev: Target device internal structure 1007 * @dev_pg0: New device page0 1008 * @is_added: Flag to indicate the device is just added 1009 * 1010 * Update the information from the device page0 into the driver 1011 * cached target device structure. 1012 * 1013 * Return: Nothing. 1014 */ 1015 static void mpi3mr_update_tgtdev(struct mpi3mr_ioc *mrioc, 1016 struct mpi3mr_tgt_dev *tgtdev, struct mpi3_device_page0 *dev_pg0, 1017 bool is_added) 1018 { 1019 u16 flags = 0; 1020 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL; 1021 struct mpi3mr_enclosure_node *enclosure_dev = NULL; 1022 u8 prot_mask = 0; 1023 1024 tgtdev->perst_id = le16_to_cpu(dev_pg0->persistent_id); 1025 tgtdev->dev_handle = le16_to_cpu(dev_pg0->dev_handle); 1026 tgtdev->dev_type = dev_pg0->device_form; 1027 tgtdev->encl_handle = le16_to_cpu(dev_pg0->enclosure_handle); 1028 tgtdev->parent_handle = le16_to_cpu(dev_pg0->parent_dev_handle); 1029 tgtdev->slot = le16_to_cpu(dev_pg0->slot); 1030 tgtdev->q_depth = le16_to_cpu(dev_pg0->queue_depth); 1031 tgtdev->wwid = le64_to_cpu(dev_pg0->wwid); 1032 tgtdev->devpg0_flag = le16_to_cpu(dev_pg0->flags); 1033 1034 if (tgtdev->encl_handle) 1035 enclosure_dev = mpi3mr_enclosure_find_by_handle(mrioc, 1036 tgtdev->encl_handle); 1037 if (enclosure_dev) 1038 tgtdev->enclosure_logical_id = le64_to_cpu( 1039 enclosure_dev->pg0.enclosure_logical_id); 1040 1041 flags = tgtdev->devpg0_flag; 1042 1043 tgtdev->is_hidden = (flags & MPI3_DEVICE0_FLAGS_HIDDEN); 1044 1045 if (is_added == true) 1046 tgtdev->io_throttle_enabled = 1047 (flags & MPI3_DEVICE0_FLAGS_IO_THROTTLING_REQUIRED) ? 1 : 0; 1048 1049 1050 if (tgtdev->starget && tgtdev->starget->hostdata) { 1051 scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *) 1052 tgtdev->starget->hostdata; 1053 scsi_tgt_priv_data->perst_id = tgtdev->perst_id; 1054 scsi_tgt_priv_data->dev_handle = tgtdev->dev_handle; 1055 scsi_tgt_priv_data->dev_type = tgtdev->dev_type; 1056 scsi_tgt_priv_data->io_throttle_enabled = 1057 tgtdev->io_throttle_enabled; 1058 } 1059 1060 switch (dev_pg0->access_status) { 1061 case MPI3_DEVICE0_ASTATUS_NO_ERRORS: 1062 case MPI3_DEVICE0_ASTATUS_PREPARE: 1063 case MPI3_DEVICE0_ASTATUS_NEEDS_INITIALIZATION: 1064 case MPI3_DEVICE0_ASTATUS_DEVICE_MISSING_DELAY: 1065 break; 1066 default: 1067 tgtdev->is_hidden = 1; 1068 break; 1069 } 1070 1071 switch (tgtdev->dev_type) { 1072 case MPI3_DEVICE_DEVFORM_SAS_SATA: 1073 { 1074 struct mpi3_device0_sas_sata_format *sasinf = 1075 &dev_pg0->device_specific.sas_sata_format; 1076 u16 dev_info = le16_to_cpu(sasinf->device_info); 1077 1078 tgtdev->dev_spec.sas_sata_inf.dev_info = dev_info; 1079 tgtdev->dev_spec.sas_sata_inf.sas_address = 1080 le64_to_cpu(sasinf->sas_address); 1081 if ((dev_info & MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_MASK) != 1082 MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_END_DEVICE) 1083 tgtdev->is_hidden = 1; 1084 else if (!(dev_info & (MPI3_SAS_DEVICE_INFO_STP_SATA_TARGET | 1085 MPI3_SAS_DEVICE_INFO_SSP_TARGET))) 1086 tgtdev->is_hidden = 1; 1087 break; 1088 } 1089 case MPI3_DEVICE_DEVFORM_PCIE: 1090 { 1091 struct mpi3_device0_pcie_format *pcieinf = 1092 &dev_pg0->device_specific.pcie_format; 1093 u16 dev_info = le16_to_cpu(pcieinf->device_info); 1094 1095 tgtdev->dev_spec.pcie_inf.dev_info = dev_info; 1096 tgtdev->dev_spec.pcie_inf.capb = 1097 le32_to_cpu(pcieinf->capabilities); 1098 tgtdev->dev_spec.pcie_inf.mdts = MPI3MR_DEFAULT_MDTS; 1099 /* 2^12 = 4096 */ 1100 tgtdev->dev_spec.pcie_inf.pgsz = 12; 1101 if (dev_pg0->access_status == MPI3_DEVICE0_ASTATUS_NO_ERRORS) { 1102 tgtdev->dev_spec.pcie_inf.mdts = 1103 le32_to_cpu(pcieinf->maximum_data_transfer_size); 1104 tgtdev->dev_spec.pcie_inf.pgsz = pcieinf->page_size; 1105 tgtdev->dev_spec.pcie_inf.reset_to = 1106 max_t(u8, pcieinf->controller_reset_to, 1107 MPI3MR_INTADMCMD_TIMEOUT); 1108 tgtdev->dev_spec.pcie_inf.abort_to = 1109 max_t(u8, pcieinf->nvme_abort_to, 1110 MPI3MR_INTADMCMD_TIMEOUT); 1111 } 1112 if (tgtdev->dev_spec.pcie_inf.mdts > (1024 * 1024)) 1113 tgtdev->dev_spec.pcie_inf.mdts = (1024 * 1024); 1114 if (((dev_info & MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) != 1115 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE) && 1116 ((dev_info & MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) != 1117 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_SCSI_DEVICE)) 1118 tgtdev->is_hidden = 1; 1119 if (!mrioc->shost) 1120 break; 1121 prot_mask = scsi_host_get_prot(mrioc->shost); 1122 if (prot_mask & SHOST_DIX_TYPE0_PROTECTION) { 1123 scsi_host_set_prot(mrioc->shost, prot_mask & 0x77); 1124 ioc_info(mrioc, 1125 "%s : Disabling DIX0 prot capability\n", __func__); 1126 ioc_info(mrioc, 1127 "because HBA does not support DIX0 operation on NVME drives\n"); 1128 } 1129 break; 1130 } 1131 case MPI3_DEVICE_DEVFORM_VD: 1132 { 1133 struct mpi3_device0_vd_format *vdinf = 1134 &dev_pg0->device_specific.vd_format; 1135 struct mpi3mr_throttle_group_info *tg = NULL; 1136 u16 vdinf_io_throttle_group = 1137 le16_to_cpu(vdinf->io_throttle_group); 1138 1139 tgtdev->dev_spec.vd_inf.state = vdinf->vd_state; 1140 if (vdinf->vd_state == MPI3_DEVICE0_VD_STATE_OFFLINE) 1141 tgtdev->is_hidden = 1; 1142 tgtdev->dev_spec.vd_inf.tg_id = vdinf_io_throttle_group; 1143 tgtdev->dev_spec.vd_inf.tg_high = 1144 le16_to_cpu(vdinf->io_throttle_group_high) * 2048; 1145 tgtdev->dev_spec.vd_inf.tg_low = 1146 le16_to_cpu(vdinf->io_throttle_group_low) * 2048; 1147 if (vdinf_io_throttle_group < mrioc->num_io_throttle_group) { 1148 tg = mrioc->throttle_groups + vdinf_io_throttle_group; 1149 tg->id = vdinf_io_throttle_group; 1150 tg->high = tgtdev->dev_spec.vd_inf.tg_high; 1151 tg->low = tgtdev->dev_spec.vd_inf.tg_low; 1152 tg->qd_reduction = 1153 tgtdev->dev_spec.vd_inf.tg_qd_reduction; 1154 if (is_added == true) 1155 tg->fw_qd = tgtdev->q_depth; 1156 tg->modified_qd = tgtdev->q_depth; 1157 } 1158 tgtdev->dev_spec.vd_inf.tg = tg; 1159 if (scsi_tgt_priv_data) 1160 scsi_tgt_priv_data->throttle_group = tg; 1161 break; 1162 } 1163 default: 1164 break; 1165 } 1166 } 1167 1168 /** 1169 * mpi3mr_devstatuschg_evt_bh - DevStatusChange evt bottomhalf 1170 * @mrioc: Adapter instance reference 1171 * @fwevt: Firmware event information. 1172 * 1173 * Process Device status Change event and based on device's new 1174 * information, either expose the device to the upper layers, or 1175 * remove the device from upper layers. 1176 * 1177 * Return: Nothing. 1178 */ 1179 static void mpi3mr_devstatuschg_evt_bh(struct mpi3mr_ioc *mrioc, 1180 struct mpi3mr_fwevt *fwevt) 1181 { 1182 u16 dev_handle = 0; 1183 u8 uhide = 0, delete = 0, cleanup = 0; 1184 struct mpi3mr_tgt_dev *tgtdev = NULL; 1185 struct mpi3_event_data_device_status_change *evtdata = 1186 (struct mpi3_event_data_device_status_change *)fwevt->event_data; 1187 1188 dev_handle = le16_to_cpu(evtdata->dev_handle); 1189 ioc_info(mrioc, 1190 "%s :device status change: handle(0x%04x): reason code(0x%x)\n", 1191 __func__, dev_handle, evtdata->reason_code); 1192 switch (evtdata->reason_code) { 1193 case MPI3_EVENT_DEV_STAT_RC_HIDDEN: 1194 delete = 1; 1195 break; 1196 case MPI3_EVENT_DEV_STAT_RC_NOT_HIDDEN: 1197 uhide = 1; 1198 break; 1199 case MPI3_EVENT_DEV_STAT_RC_VD_NOT_RESPONDING: 1200 delete = 1; 1201 cleanup = 1; 1202 break; 1203 default: 1204 ioc_info(mrioc, "%s :Unhandled reason code(0x%x)\n", __func__, 1205 evtdata->reason_code); 1206 break; 1207 } 1208 1209 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle); 1210 if (!tgtdev) 1211 goto out; 1212 if (uhide) { 1213 tgtdev->is_hidden = 0; 1214 if (!tgtdev->host_exposed) 1215 mpi3mr_report_tgtdev_to_host(mrioc, tgtdev->perst_id); 1216 } 1217 if (tgtdev->starget && tgtdev->starget->hostdata) { 1218 if (delete) 1219 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 1220 } 1221 if (cleanup) { 1222 mpi3mr_tgtdev_del_from_list(mrioc, tgtdev); 1223 mpi3mr_tgtdev_put(tgtdev); 1224 } 1225 1226 out: 1227 if (tgtdev) 1228 mpi3mr_tgtdev_put(tgtdev); 1229 } 1230 1231 /** 1232 * mpi3mr_devinfochg_evt_bh - DeviceInfoChange evt bottomhalf 1233 * @mrioc: Adapter instance reference 1234 * @dev_pg0: New device page0 1235 * 1236 * Process Device Info Change event and based on device's new 1237 * information, either expose the device to the upper layers, or 1238 * remove the device from upper layers or update the details of 1239 * the device. 1240 * 1241 * Return: Nothing. 1242 */ 1243 static void mpi3mr_devinfochg_evt_bh(struct mpi3mr_ioc *mrioc, 1244 struct mpi3_device_page0 *dev_pg0) 1245 { 1246 struct mpi3mr_tgt_dev *tgtdev = NULL; 1247 u16 dev_handle = 0, perst_id = 0; 1248 1249 perst_id = le16_to_cpu(dev_pg0->persistent_id); 1250 dev_handle = le16_to_cpu(dev_pg0->dev_handle); 1251 ioc_info(mrioc, 1252 "%s :Device info change: handle(0x%04x): persist_id(0x%x)\n", 1253 __func__, dev_handle, perst_id); 1254 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle); 1255 if (!tgtdev) 1256 goto out; 1257 mpi3mr_update_tgtdev(mrioc, tgtdev, dev_pg0, false); 1258 if (!tgtdev->is_hidden && !tgtdev->host_exposed) 1259 mpi3mr_report_tgtdev_to_host(mrioc, perst_id); 1260 if (tgtdev->is_hidden && tgtdev->host_exposed) 1261 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 1262 if (!tgtdev->is_hidden && tgtdev->host_exposed && tgtdev->starget) 1263 starget_for_each_device(tgtdev->starget, (void *)tgtdev, 1264 mpi3mr_update_sdev); 1265 out: 1266 if (tgtdev) 1267 mpi3mr_tgtdev_put(tgtdev); 1268 } 1269 1270 /** 1271 * mpi3mr_enclosure_find_by_handle - enclosure search by handle 1272 * @mrioc: Adapter instance reference 1273 * @handle: Firmware device handle of the enclosure 1274 * 1275 * This searches for enclosure device based on handle, then returns the 1276 * enclosure object. 1277 * 1278 * Return: Enclosure object reference or NULL 1279 */ 1280 struct mpi3mr_enclosure_node *mpi3mr_enclosure_find_by_handle( 1281 struct mpi3mr_ioc *mrioc, u16 handle) 1282 { 1283 struct mpi3mr_enclosure_node *enclosure_dev, *r = NULL; 1284 1285 list_for_each_entry(enclosure_dev, &mrioc->enclosure_list, list) { 1286 if (le16_to_cpu(enclosure_dev->pg0.enclosure_handle) != handle) 1287 continue; 1288 r = enclosure_dev; 1289 goto out; 1290 } 1291 out: 1292 return r; 1293 } 1294 1295 /** 1296 * mpi3mr_encldev_add_chg_evt_debug - debug for enclosure event 1297 * @mrioc: Adapter instance reference 1298 * @encl_pg0: Enclosure page 0. 1299 * @is_added: Added event or not 1300 * 1301 * Return nothing. 1302 */ 1303 static void mpi3mr_encldev_add_chg_evt_debug(struct mpi3mr_ioc *mrioc, 1304 struct mpi3_enclosure_page0 *encl_pg0, u8 is_added) 1305 { 1306 char *reason_str = NULL; 1307 1308 if (!(mrioc->logging_level & MPI3_DEBUG_EVENT_WORK_TASK)) 1309 return; 1310 1311 if (is_added) 1312 reason_str = "enclosure added"; 1313 else 1314 reason_str = "enclosure dev status changed"; 1315 1316 ioc_info(mrioc, 1317 "%s: handle(0x%04x), enclosure logical id(0x%016llx)\n", 1318 reason_str, le16_to_cpu(encl_pg0->enclosure_handle), 1319 (unsigned long long)le64_to_cpu(encl_pg0->enclosure_logical_id)); 1320 ioc_info(mrioc, 1321 "number of slots(%d), port(%d), flags(0x%04x), present(%d)\n", 1322 le16_to_cpu(encl_pg0->num_slots), encl_pg0->io_unit_port, 1323 le16_to_cpu(encl_pg0->flags), 1324 ((le16_to_cpu(encl_pg0->flags) & 1325 MPI3_ENCLS0_FLAGS_ENCL_DEV_PRESENT_MASK) >> 4)); 1326 } 1327 1328 /** 1329 * mpi3mr_encldev_add_chg_evt_bh - Enclosure evt bottomhalf 1330 * @mrioc: Adapter instance reference 1331 * @fwevt: Firmware event reference 1332 * 1333 * Prints information about the Enclosure device status or 1334 * Enclosure add events if logging is enabled and add or remove 1335 * the enclosure from the controller's internal list of 1336 * enclosures. 1337 * 1338 * Return: Nothing. 1339 */ 1340 static void mpi3mr_encldev_add_chg_evt_bh(struct mpi3mr_ioc *mrioc, 1341 struct mpi3mr_fwevt *fwevt) 1342 { 1343 struct mpi3mr_enclosure_node *enclosure_dev = NULL; 1344 struct mpi3_enclosure_page0 *encl_pg0; 1345 u16 encl_handle; 1346 u8 added, present; 1347 1348 encl_pg0 = (struct mpi3_enclosure_page0 *) fwevt->event_data; 1349 added = (fwevt->event_id == MPI3_EVENT_ENCL_DEVICE_ADDED) ? 1 : 0; 1350 mpi3mr_encldev_add_chg_evt_debug(mrioc, encl_pg0, added); 1351 1352 1353 encl_handle = le16_to_cpu(encl_pg0->enclosure_handle); 1354 present = ((le16_to_cpu(encl_pg0->flags) & 1355 MPI3_ENCLS0_FLAGS_ENCL_DEV_PRESENT_MASK) >> 4); 1356 1357 if (encl_handle) 1358 enclosure_dev = mpi3mr_enclosure_find_by_handle(mrioc, 1359 encl_handle); 1360 if (!enclosure_dev && present) { 1361 enclosure_dev = 1362 kzalloc(sizeof(struct mpi3mr_enclosure_node), 1363 GFP_KERNEL); 1364 if (!enclosure_dev) 1365 return; 1366 list_add_tail(&enclosure_dev->list, 1367 &mrioc->enclosure_list); 1368 } 1369 if (enclosure_dev) { 1370 if (!present) { 1371 list_del(&enclosure_dev->list); 1372 kfree(enclosure_dev); 1373 } else 1374 memcpy(&enclosure_dev->pg0, encl_pg0, 1375 sizeof(enclosure_dev->pg0)); 1376 1377 } 1378 } 1379 1380 /** 1381 * mpi3mr_sastopochg_evt_debug - SASTopoChange details 1382 * @mrioc: Adapter instance reference 1383 * @event_data: SAS topology change list event data 1384 * 1385 * Prints information about the SAS topology change event. 1386 * 1387 * Return: Nothing. 1388 */ 1389 static void 1390 mpi3mr_sastopochg_evt_debug(struct mpi3mr_ioc *mrioc, 1391 struct mpi3_event_data_sas_topology_change_list *event_data) 1392 { 1393 int i; 1394 u16 handle; 1395 u8 reason_code, phy_number; 1396 char *status_str = NULL; 1397 u8 link_rate, prev_link_rate; 1398 1399 switch (event_data->exp_status) { 1400 case MPI3_EVENT_SAS_TOPO_ES_NOT_RESPONDING: 1401 status_str = "remove"; 1402 break; 1403 case MPI3_EVENT_SAS_TOPO_ES_RESPONDING: 1404 status_str = "responding"; 1405 break; 1406 case MPI3_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING: 1407 status_str = "remove delay"; 1408 break; 1409 case MPI3_EVENT_SAS_TOPO_ES_NO_EXPANDER: 1410 status_str = "direct attached"; 1411 break; 1412 default: 1413 status_str = "unknown status"; 1414 break; 1415 } 1416 ioc_info(mrioc, "%s :sas topology change: (%s)\n", 1417 __func__, status_str); 1418 ioc_info(mrioc, 1419 "%s :\texpander_handle(0x%04x), enclosure_handle(0x%04x) start_phy(%02d), num_entries(%d)\n", 1420 __func__, le16_to_cpu(event_data->expander_dev_handle), 1421 le16_to_cpu(event_data->enclosure_handle), 1422 event_data->start_phy_num, event_data->num_entries); 1423 for (i = 0; i < event_data->num_entries; i++) { 1424 handle = le16_to_cpu(event_data->phy_entry[i].attached_dev_handle); 1425 if (!handle) 1426 continue; 1427 phy_number = event_data->start_phy_num + i; 1428 reason_code = event_data->phy_entry[i].status & 1429 MPI3_EVENT_SAS_TOPO_PHY_RC_MASK; 1430 switch (reason_code) { 1431 case MPI3_EVENT_SAS_TOPO_PHY_RC_TARG_NOT_RESPONDING: 1432 status_str = "target remove"; 1433 break; 1434 case MPI3_EVENT_SAS_TOPO_PHY_RC_DELAY_NOT_RESPONDING: 1435 status_str = "delay target remove"; 1436 break; 1437 case MPI3_EVENT_SAS_TOPO_PHY_RC_PHY_CHANGED: 1438 status_str = "link status change"; 1439 break; 1440 case MPI3_EVENT_SAS_TOPO_PHY_RC_NO_CHANGE: 1441 status_str = "link status no change"; 1442 break; 1443 case MPI3_EVENT_SAS_TOPO_PHY_RC_RESPONDING: 1444 status_str = "target responding"; 1445 break; 1446 default: 1447 status_str = "unknown"; 1448 break; 1449 } 1450 link_rate = event_data->phy_entry[i].link_rate >> 4; 1451 prev_link_rate = event_data->phy_entry[i].link_rate & 0xF; 1452 ioc_info(mrioc, 1453 "%s :\tphy(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n", 1454 __func__, phy_number, handle, status_str, link_rate, 1455 prev_link_rate); 1456 } 1457 } 1458 1459 /** 1460 * mpi3mr_sastopochg_evt_bh - SASTopologyChange evt bottomhalf 1461 * @mrioc: Adapter instance reference 1462 * @fwevt: Firmware event reference 1463 * 1464 * Prints information about the SAS topology change event and 1465 * for "not responding" event code, removes the device from the 1466 * upper layers. 1467 * 1468 * Return: Nothing. 1469 */ 1470 static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc, 1471 struct mpi3mr_fwevt *fwevt) 1472 { 1473 struct mpi3_event_data_sas_topology_change_list *event_data = 1474 (struct mpi3_event_data_sas_topology_change_list *)fwevt->event_data; 1475 int i; 1476 u16 handle; 1477 u8 reason_code; 1478 struct mpi3mr_tgt_dev *tgtdev = NULL; 1479 1480 mpi3mr_sastopochg_evt_debug(mrioc, event_data); 1481 1482 for (i = 0; i < event_data->num_entries; i++) { 1483 if (fwevt->discard) 1484 return; 1485 handle = le16_to_cpu(event_data->phy_entry[i].attached_dev_handle); 1486 if (!handle) 1487 continue; 1488 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle); 1489 if (!tgtdev) 1490 continue; 1491 1492 reason_code = event_data->phy_entry[i].status & 1493 MPI3_EVENT_SAS_TOPO_PHY_RC_MASK; 1494 1495 switch (reason_code) { 1496 case MPI3_EVENT_SAS_TOPO_PHY_RC_TARG_NOT_RESPONDING: 1497 if (tgtdev->host_exposed) 1498 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 1499 mpi3mr_tgtdev_del_from_list(mrioc, tgtdev); 1500 mpi3mr_tgtdev_put(tgtdev); 1501 break; 1502 default: 1503 break; 1504 } 1505 if (tgtdev) 1506 mpi3mr_tgtdev_put(tgtdev); 1507 } 1508 } 1509 1510 /** 1511 * mpi3mr_pcietopochg_evt_debug - PCIeTopoChange details 1512 * @mrioc: Adapter instance reference 1513 * @event_data: PCIe topology change list event data 1514 * 1515 * Prints information about the PCIe topology change event. 1516 * 1517 * Return: Nothing. 1518 */ 1519 static void 1520 mpi3mr_pcietopochg_evt_debug(struct mpi3mr_ioc *mrioc, 1521 struct mpi3_event_data_pcie_topology_change_list *event_data) 1522 { 1523 int i; 1524 u16 handle; 1525 u16 reason_code; 1526 u8 port_number; 1527 char *status_str = NULL; 1528 u8 link_rate, prev_link_rate; 1529 1530 switch (event_data->switch_status) { 1531 case MPI3_EVENT_PCIE_TOPO_SS_NOT_RESPONDING: 1532 status_str = "remove"; 1533 break; 1534 case MPI3_EVENT_PCIE_TOPO_SS_RESPONDING: 1535 status_str = "responding"; 1536 break; 1537 case MPI3_EVENT_PCIE_TOPO_SS_DELAY_NOT_RESPONDING: 1538 status_str = "remove delay"; 1539 break; 1540 case MPI3_EVENT_PCIE_TOPO_SS_NO_PCIE_SWITCH: 1541 status_str = "direct attached"; 1542 break; 1543 default: 1544 status_str = "unknown status"; 1545 break; 1546 } 1547 ioc_info(mrioc, "%s :pcie topology change: (%s)\n", 1548 __func__, status_str); 1549 ioc_info(mrioc, 1550 "%s :\tswitch_handle(0x%04x), enclosure_handle(0x%04x) start_port(%02d), num_entries(%d)\n", 1551 __func__, le16_to_cpu(event_data->switch_dev_handle), 1552 le16_to_cpu(event_data->enclosure_handle), 1553 event_data->start_port_num, event_data->num_entries); 1554 for (i = 0; i < event_data->num_entries; i++) { 1555 handle = 1556 le16_to_cpu(event_data->port_entry[i].attached_dev_handle); 1557 if (!handle) 1558 continue; 1559 port_number = event_data->start_port_num + i; 1560 reason_code = event_data->port_entry[i].port_status; 1561 switch (reason_code) { 1562 case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING: 1563 status_str = "target remove"; 1564 break; 1565 case MPI3_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING: 1566 status_str = "delay target remove"; 1567 break; 1568 case MPI3_EVENT_PCIE_TOPO_PS_PORT_CHANGED: 1569 status_str = "link status change"; 1570 break; 1571 case MPI3_EVENT_PCIE_TOPO_PS_NO_CHANGE: 1572 status_str = "link status no change"; 1573 break; 1574 case MPI3_EVENT_PCIE_TOPO_PS_RESPONDING: 1575 status_str = "target responding"; 1576 break; 1577 default: 1578 status_str = "unknown"; 1579 break; 1580 } 1581 link_rate = event_data->port_entry[i].current_port_info & 1582 MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK; 1583 prev_link_rate = event_data->port_entry[i].previous_port_info & 1584 MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK; 1585 ioc_info(mrioc, 1586 "%s :\tport(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n", 1587 __func__, port_number, handle, status_str, link_rate, 1588 prev_link_rate); 1589 } 1590 } 1591 1592 /** 1593 * mpi3mr_pcietopochg_evt_bh - PCIeTopologyChange evt bottomhalf 1594 * @mrioc: Adapter instance reference 1595 * @fwevt: Firmware event reference 1596 * 1597 * Prints information about the PCIe topology change event and 1598 * for "not responding" event code, removes the device from the 1599 * upper layers. 1600 * 1601 * Return: Nothing. 1602 */ 1603 static void mpi3mr_pcietopochg_evt_bh(struct mpi3mr_ioc *mrioc, 1604 struct mpi3mr_fwevt *fwevt) 1605 { 1606 struct mpi3_event_data_pcie_topology_change_list *event_data = 1607 (struct mpi3_event_data_pcie_topology_change_list *)fwevt->event_data; 1608 int i; 1609 u16 handle; 1610 u8 reason_code; 1611 struct mpi3mr_tgt_dev *tgtdev = NULL; 1612 1613 mpi3mr_pcietopochg_evt_debug(mrioc, event_data); 1614 1615 for (i = 0; i < event_data->num_entries; i++) { 1616 if (fwevt->discard) 1617 return; 1618 handle = 1619 le16_to_cpu(event_data->port_entry[i].attached_dev_handle); 1620 if (!handle) 1621 continue; 1622 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle); 1623 if (!tgtdev) 1624 continue; 1625 1626 reason_code = event_data->port_entry[i].port_status; 1627 1628 switch (reason_code) { 1629 case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING: 1630 if (tgtdev->host_exposed) 1631 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 1632 mpi3mr_tgtdev_del_from_list(mrioc, tgtdev); 1633 mpi3mr_tgtdev_put(tgtdev); 1634 break; 1635 default: 1636 break; 1637 } 1638 if (tgtdev) 1639 mpi3mr_tgtdev_put(tgtdev); 1640 } 1641 } 1642 1643 /** 1644 * mpi3mr_logdata_evt_bh - Log data event bottomhalf 1645 * @mrioc: Adapter instance reference 1646 * @fwevt: Firmware event reference 1647 * 1648 * Extracts the event data and calls application interfacing 1649 * function to process the event further. 1650 * 1651 * Return: Nothing. 1652 */ 1653 static void mpi3mr_logdata_evt_bh(struct mpi3mr_ioc *mrioc, 1654 struct mpi3mr_fwevt *fwevt) 1655 { 1656 mpi3mr_app_save_logdata(mrioc, fwevt->event_data, 1657 fwevt->event_data_size); 1658 } 1659 1660 /** 1661 * mpi3mr_update_sdev_qd - Update SCSI device queue depath 1662 * @sdev: SCSI device reference 1663 * @data: Queue depth reference 1664 * 1665 * This is an iterator function called for each SCSI device in a 1666 * target to update the QD of each SCSI device. 1667 * 1668 * Return: Nothing. 1669 */ 1670 static void mpi3mr_update_sdev_qd(struct scsi_device *sdev, void *data) 1671 { 1672 u16 *q_depth = (u16 *)data; 1673 1674 scsi_change_queue_depth(sdev, (int)*q_depth); 1675 sdev->max_queue_depth = sdev->queue_depth; 1676 } 1677 1678 /** 1679 * mpi3mr_set_qd_for_all_vd_in_tg -set QD for TG VDs 1680 * @mrioc: Adapter instance reference 1681 * @tg: Throttle group information pointer 1682 * 1683 * Accessor to reduce QD for each device associated with the 1684 * given throttle group. 1685 * 1686 * Return: None. 1687 */ 1688 static void mpi3mr_set_qd_for_all_vd_in_tg(struct mpi3mr_ioc *mrioc, 1689 struct mpi3mr_throttle_group_info *tg) 1690 { 1691 unsigned long flags; 1692 struct mpi3mr_tgt_dev *tgtdev; 1693 struct mpi3mr_stgt_priv_data *tgt_priv; 1694 1695 1696 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 1697 list_for_each_entry(tgtdev, &mrioc->tgtdev_list, list) { 1698 if (tgtdev->starget && tgtdev->starget->hostdata) { 1699 tgt_priv = tgtdev->starget->hostdata; 1700 if (tgt_priv->throttle_group == tg) { 1701 dprint_event_bh(mrioc, 1702 "updating qd due to throttling for persist_id(%d) original_qd(%d), reduced_qd (%d)\n", 1703 tgt_priv->perst_id, tgtdev->q_depth, 1704 tg->modified_qd); 1705 starget_for_each_device(tgtdev->starget, 1706 (void *)&tg->modified_qd, 1707 mpi3mr_update_sdev_qd); 1708 } 1709 } 1710 } 1711 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 1712 } 1713 1714 /** 1715 * mpi3mr_fwevt_bh - Firmware event bottomhalf handler 1716 * @mrioc: Adapter instance reference 1717 * @fwevt: Firmware event reference 1718 * 1719 * Identifies the firmware event and calls corresponding bottomg 1720 * half handler and sends event acknowledgment if required. 1721 * 1722 * Return: Nothing. 1723 */ 1724 static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc, 1725 struct mpi3mr_fwevt *fwevt) 1726 { 1727 mpi3mr_fwevt_del_from_list(mrioc, fwevt); 1728 mrioc->current_event = fwevt; 1729 1730 if (mrioc->stop_drv_processing) 1731 goto out; 1732 1733 if (!fwevt->process_evt) 1734 goto evt_ack; 1735 1736 switch (fwevt->event_id) { 1737 case MPI3_EVENT_DEVICE_ADDED: 1738 { 1739 struct mpi3_device_page0 *dev_pg0 = 1740 (struct mpi3_device_page0 *)fwevt->event_data; 1741 mpi3mr_report_tgtdev_to_host(mrioc, 1742 le16_to_cpu(dev_pg0->persistent_id)); 1743 break; 1744 } 1745 case MPI3_EVENT_DEVICE_INFO_CHANGED: 1746 { 1747 mpi3mr_devinfochg_evt_bh(mrioc, 1748 (struct mpi3_device_page0 *)fwevt->event_data); 1749 break; 1750 } 1751 case MPI3_EVENT_DEVICE_STATUS_CHANGE: 1752 { 1753 mpi3mr_devstatuschg_evt_bh(mrioc, fwevt); 1754 break; 1755 } 1756 case MPI3_EVENT_ENCL_DEVICE_ADDED: 1757 case MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE: 1758 { 1759 mpi3mr_encldev_add_chg_evt_bh(mrioc, fwevt); 1760 break; 1761 } 1762 1763 case MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST: 1764 { 1765 mpi3mr_sastopochg_evt_bh(mrioc, fwevt); 1766 break; 1767 } 1768 case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST: 1769 { 1770 mpi3mr_pcietopochg_evt_bh(mrioc, fwevt); 1771 break; 1772 } 1773 case MPI3_EVENT_LOG_DATA: 1774 { 1775 mpi3mr_logdata_evt_bh(mrioc, fwevt); 1776 break; 1777 } 1778 case MPI3MR_DRIVER_EVENT_TG_QD_REDUCTION: 1779 { 1780 struct mpi3mr_throttle_group_info *tg; 1781 1782 tg = *(struct mpi3mr_throttle_group_info **)fwevt->event_data; 1783 dprint_event_bh(mrioc, 1784 "qd reduction event processed for tg_id(%d) reduction_needed(%d)\n", 1785 tg->id, tg->need_qd_reduction); 1786 if (tg->need_qd_reduction) { 1787 mpi3mr_set_qd_for_all_vd_in_tg(mrioc, tg); 1788 tg->need_qd_reduction = 0; 1789 } 1790 break; 1791 } 1792 default: 1793 break; 1794 } 1795 1796 evt_ack: 1797 if (fwevt->send_ack) 1798 mpi3mr_process_event_ack(mrioc, fwevt->event_id, 1799 fwevt->evt_ctx); 1800 out: 1801 /* Put fwevt reference count to neutralize kref_init increment */ 1802 mpi3mr_fwevt_put(fwevt); 1803 mrioc->current_event = NULL; 1804 } 1805 1806 /** 1807 * mpi3mr_fwevt_worker - Firmware event worker 1808 * @work: Work struct containing firmware event 1809 * 1810 * Extracts the firmware event and calls mpi3mr_fwevt_bh. 1811 * 1812 * Return: Nothing. 1813 */ 1814 static void mpi3mr_fwevt_worker(struct work_struct *work) 1815 { 1816 struct mpi3mr_fwevt *fwevt = container_of(work, struct mpi3mr_fwevt, 1817 work); 1818 mpi3mr_fwevt_bh(fwevt->mrioc, fwevt); 1819 /* 1820 * Put fwevt reference count after 1821 * dequeuing it from worker queue 1822 */ 1823 mpi3mr_fwevt_put(fwevt); 1824 } 1825 1826 /** 1827 * mpi3mr_create_tgtdev - Create and add a target device 1828 * @mrioc: Adapter instance reference 1829 * @dev_pg0: Device Page 0 data 1830 * 1831 * If the device specified by the device page 0 data is not 1832 * present in the driver's internal list, allocate the memory 1833 * for the device, populate the data and add to the list, else 1834 * update the device data. The key is persistent ID. 1835 * 1836 * Return: 0 on success, -ENOMEM on memory allocation failure 1837 */ 1838 static int mpi3mr_create_tgtdev(struct mpi3mr_ioc *mrioc, 1839 struct mpi3_device_page0 *dev_pg0) 1840 { 1841 int retval = 0; 1842 struct mpi3mr_tgt_dev *tgtdev = NULL; 1843 u16 perst_id = 0; 1844 1845 perst_id = le16_to_cpu(dev_pg0->persistent_id); 1846 tgtdev = mpi3mr_get_tgtdev_by_perst_id(mrioc, perst_id); 1847 if (tgtdev) { 1848 mpi3mr_update_tgtdev(mrioc, tgtdev, dev_pg0, true); 1849 mpi3mr_tgtdev_put(tgtdev); 1850 } else { 1851 tgtdev = mpi3mr_alloc_tgtdev(); 1852 if (!tgtdev) 1853 return -ENOMEM; 1854 mpi3mr_update_tgtdev(mrioc, tgtdev, dev_pg0, true); 1855 mpi3mr_tgtdev_add_to_list(mrioc, tgtdev); 1856 } 1857 1858 return retval; 1859 } 1860 1861 /** 1862 * mpi3mr_flush_delayed_cmd_lists - Flush pending commands 1863 * @mrioc: Adapter instance reference 1864 * 1865 * Flush pending commands in the delayed lists due to a 1866 * controller reset or driver removal as a cleanup. 1867 * 1868 * Return: Nothing 1869 */ 1870 void mpi3mr_flush_delayed_cmd_lists(struct mpi3mr_ioc *mrioc) 1871 { 1872 struct delayed_dev_rmhs_node *_rmhs_node; 1873 struct delayed_evt_ack_node *_evtack_node; 1874 1875 dprint_reset(mrioc, "flushing delayed dev_remove_hs commands\n"); 1876 while (!list_empty(&mrioc->delayed_rmhs_list)) { 1877 _rmhs_node = list_entry(mrioc->delayed_rmhs_list.next, 1878 struct delayed_dev_rmhs_node, list); 1879 list_del(&_rmhs_node->list); 1880 kfree(_rmhs_node); 1881 } 1882 dprint_reset(mrioc, "flushing delayed event ack commands\n"); 1883 while (!list_empty(&mrioc->delayed_evtack_cmds_list)) { 1884 _evtack_node = list_entry(mrioc->delayed_evtack_cmds_list.next, 1885 struct delayed_evt_ack_node, list); 1886 list_del(&_evtack_node->list); 1887 kfree(_evtack_node); 1888 } 1889 } 1890 1891 /** 1892 * mpi3mr_dev_rmhs_complete_iou - Device removal IOUC completion 1893 * @mrioc: Adapter instance reference 1894 * @drv_cmd: Internal command tracker 1895 * 1896 * Issues a target reset TM to the firmware from the device 1897 * removal TM pend list or retry the removal handshake sequence 1898 * based on the IOU control request IOC status. 1899 * 1900 * Return: Nothing 1901 */ 1902 static void mpi3mr_dev_rmhs_complete_iou(struct mpi3mr_ioc *mrioc, 1903 struct mpi3mr_drv_cmd *drv_cmd) 1904 { 1905 u16 cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_DEVRMCMD_MIN; 1906 struct delayed_dev_rmhs_node *delayed_dev_rmhs = NULL; 1907 1908 if (drv_cmd->state & MPI3MR_CMD_RESET) 1909 goto clear_drv_cmd; 1910 1911 ioc_info(mrioc, 1912 "%s :dev_rmhs_iouctrl_complete:handle(0x%04x), ioc_status(0x%04x), loginfo(0x%08x)\n", 1913 __func__, drv_cmd->dev_handle, drv_cmd->ioc_status, 1914 drv_cmd->ioc_loginfo); 1915 if (drv_cmd->ioc_status != MPI3_IOCSTATUS_SUCCESS) { 1916 if (drv_cmd->retry_count < MPI3MR_DEV_RMHS_RETRY_COUNT) { 1917 drv_cmd->retry_count++; 1918 ioc_info(mrioc, 1919 "%s :dev_rmhs_iouctrl_complete: handle(0x%04x)retrying handshake retry=%d\n", 1920 __func__, drv_cmd->dev_handle, 1921 drv_cmd->retry_count); 1922 mpi3mr_dev_rmhs_send_tm(mrioc, drv_cmd->dev_handle, 1923 drv_cmd, drv_cmd->iou_rc); 1924 return; 1925 } 1926 ioc_err(mrioc, 1927 "%s :dev removal handshake failed after all retries: handle(0x%04x)\n", 1928 __func__, drv_cmd->dev_handle); 1929 } else { 1930 ioc_info(mrioc, 1931 "%s :dev removal handshake completed successfully: handle(0x%04x)\n", 1932 __func__, drv_cmd->dev_handle); 1933 clear_bit(drv_cmd->dev_handle, mrioc->removepend_bitmap); 1934 } 1935 1936 if (!list_empty(&mrioc->delayed_rmhs_list)) { 1937 delayed_dev_rmhs = list_entry(mrioc->delayed_rmhs_list.next, 1938 struct delayed_dev_rmhs_node, list); 1939 drv_cmd->dev_handle = delayed_dev_rmhs->handle; 1940 drv_cmd->retry_count = 0; 1941 drv_cmd->iou_rc = delayed_dev_rmhs->iou_rc; 1942 ioc_info(mrioc, 1943 "%s :dev_rmhs_iouctrl_complete: processing delayed TM: handle(0x%04x)\n", 1944 __func__, drv_cmd->dev_handle); 1945 mpi3mr_dev_rmhs_send_tm(mrioc, drv_cmd->dev_handle, drv_cmd, 1946 drv_cmd->iou_rc); 1947 list_del(&delayed_dev_rmhs->list); 1948 kfree(delayed_dev_rmhs); 1949 return; 1950 } 1951 1952 clear_drv_cmd: 1953 drv_cmd->state = MPI3MR_CMD_NOTUSED; 1954 drv_cmd->callback = NULL; 1955 drv_cmd->retry_count = 0; 1956 drv_cmd->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 1957 clear_bit(cmd_idx, mrioc->devrem_bitmap); 1958 } 1959 1960 /** 1961 * mpi3mr_dev_rmhs_complete_tm - Device removal TM completion 1962 * @mrioc: Adapter instance reference 1963 * @drv_cmd: Internal command tracker 1964 * 1965 * Issues a target reset TM to the firmware from the device 1966 * removal TM pend list or issue IO unit control request as 1967 * part of device removal or hidden acknowledgment handshake. 1968 * 1969 * Return: Nothing 1970 */ 1971 static void mpi3mr_dev_rmhs_complete_tm(struct mpi3mr_ioc *mrioc, 1972 struct mpi3mr_drv_cmd *drv_cmd) 1973 { 1974 struct mpi3_iounit_control_request iou_ctrl; 1975 u16 cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_DEVRMCMD_MIN; 1976 struct mpi3_scsi_task_mgmt_reply *tm_reply = NULL; 1977 int retval; 1978 1979 if (drv_cmd->state & MPI3MR_CMD_RESET) 1980 goto clear_drv_cmd; 1981 1982 if (drv_cmd->state & MPI3MR_CMD_REPLY_VALID) 1983 tm_reply = (struct mpi3_scsi_task_mgmt_reply *)drv_cmd->reply; 1984 1985 if (tm_reply) 1986 pr_info(IOCNAME 1987 "dev_rmhs_tr_complete:handle(0x%04x), ioc_status(0x%04x), loginfo(0x%08x), term_count(%d)\n", 1988 mrioc->name, drv_cmd->dev_handle, drv_cmd->ioc_status, 1989 drv_cmd->ioc_loginfo, 1990 le32_to_cpu(tm_reply->termination_count)); 1991 1992 pr_info(IOCNAME "Issuing IOU CTL: handle(0x%04x) dev_rmhs idx(%d)\n", 1993 mrioc->name, drv_cmd->dev_handle, cmd_idx); 1994 1995 memset(&iou_ctrl, 0, sizeof(iou_ctrl)); 1996 1997 drv_cmd->state = MPI3MR_CMD_PENDING; 1998 drv_cmd->is_waiting = 0; 1999 drv_cmd->callback = mpi3mr_dev_rmhs_complete_iou; 2000 iou_ctrl.operation = drv_cmd->iou_rc; 2001 iou_ctrl.param16[0] = cpu_to_le16(drv_cmd->dev_handle); 2002 iou_ctrl.host_tag = cpu_to_le16(drv_cmd->host_tag); 2003 iou_ctrl.function = MPI3_FUNCTION_IO_UNIT_CONTROL; 2004 2005 retval = mpi3mr_admin_request_post(mrioc, &iou_ctrl, sizeof(iou_ctrl), 2006 1); 2007 if (retval) { 2008 pr_err(IOCNAME "Issue DevRmHsTMIOUCTL: Admin post failed\n", 2009 mrioc->name); 2010 goto clear_drv_cmd; 2011 } 2012 2013 return; 2014 clear_drv_cmd: 2015 drv_cmd->state = MPI3MR_CMD_NOTUSED; 2016 drv_cmd->callback = NULL; 2017 drv_cmd->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 2018 drv_cmd->retry_count = 0; 2019 clear_bit(cmd_idx, mrioc->devrem_bitmap); 2020 } 2021 2022 /** 2023 * mpi3mr_dev_rmhs_send_tm - Issue TM for device removal 2024 * @mrioc: Adapter instance reference 2025 * @handle: Device handle 2026 * @cmdparam: Internal command tracker 2027 * @iou_rc: IO unit reason code 2028 * 2029 * Issues a target reset TM to the firmware or add it to a pend 2030 * list as part of device removal or hidden acknowledgment 2031 * handshake. 2032 * 2033 * Return: Nothing 2034 */ 2035 static void mpi3mr_dev_rmhs_send_tm(struct mpi3mr_ioc *mrioc, u16 handle, 2036 struct mpi3mr_drv_cmd *cmdparam, u8 iou_rc) 2037 { 2038 struct mpi3_scsi_task_mgmt_request tm_req; 2039 int retval = 0; 2040 u16 cmd_idx = MPI3MR_NUM_DEVRMCMD; 2041 u8 retrycount = 5; 2042 struct mpi3mr_drv_cmd *drv_cmd = cmdparam; 2043 struct delayed_dev_rmhs_node *delayed_dev_rmhs = NULL; 2044 2045 if (drv_cmd) 2046 goto issue_cmd; 2047 do { 2048 cmd_idx = find_first_zero_bit(mrioc->devrem_bitmap, 2049 MPI3MR_NUM_DEVRMCMD); 2050 if (cmd_idx < MPI3MR_NUM_DEVRMCMD) { 2051 if (!test_and_set_bit(cmd_idx, mrioc->devrem_bitmap)) 2052 break; 2053 cmd_idx = MPI3MR_NUM_DEVRMCMD; 2054 } 2055 } while (retrycount--); 2056 2057 if (cmd_idx >= MPI3MR_NUM_DEVRMCMD) { 2058 delayed_dev_rmhs = kzalloc(sizeof(*delayed_dev_rmhs), 2059 GFP_ATOMIC); 2060 if (!delayed_dev_rmhs) 2061 return; 2062 INIT_LIST_HEAD(&delayed_dev_rmhs->list); 2063 delayed_dev_rmhs->handle = handle; 2064 delayed_dev_rmhs->iou_rc = iou_rc; 2065 list_add_tail(&delayed_dev_rmhs->list, 2066 &mrioc->delayed_rmhs_list); 2067 ioc_info(mrioc, "%s :DevRmHs: tr:handle(0x%04x) is postponed\n", 2068 __func__, handle); 2069 return; 2070 } 2071 drv_cmd = &mrioc->dev_rmhs_cmds[cmd_idx]; 2072 2073 issue_cmd: 2074 cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_DEVRMCMD_MIN; 2075 ioc_info(mrioc, 2076 "%s :Issuing TR TM: for devhandle 0x%04x with dev_rmhs %d\n", 2077 __func__, handle, cmd_idx); 2078 2079 memset(&tm_req, 0, sizeof(tm_req)); 2080 if (drv_cmd->state & MPI3MR_CMD_PENDING) { 2081 ioc_err(mrioc, "%s :Issue TM: Command is in use\n", __func__); 2082 goto out; 2083 } 2084 drv_cmd->state = MPI3MR_CMD_PENDING; 2085 drv_cmd->is_waiting = 0; 2086 drv_cmd->callback = mpi3mr_dev_rmhs_complete_tm; 2087 drv_cmd->dev_handle = handle; 2088 drv_cmd->iou_rc = iou_rc; 2089 tm_req.dev_handle = cpu_to_le16(handle); 2090 tm_req.task_type = MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET; 2091 tm_req.host_tag = cpu_to_le16(drv_cmd->host_tag); 2092 tm_req.task_host_tag = cpu_to_le16(MPI3MR_HOSTTAG_INVALID); 2093 tm_req.function = MPI3_FUNCTION_SCSI_TASK_MGMT; 2094 2095 set_bit(handle, mrioc->removepend_bitmap); 2096 retval = mpi3mr_admin_request_post(mrioc, &tm_req, sizeof(tm_req), 1); 2097 if (retval) { 2098 ioc_err(mrioc, "%s :Issue DevRmHsTM: Admin Post failed\n", 2099 __func__); 2100 goto out_failed; 2101 } 2102 out: 2103 return; 2104 out_failed: 2105 drv_cmd->state = MPI3MR_CMD_NOTUSED; 2106 drv_cmd->callback = NULL; 2107 drv_cmd->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 2108 drv_cmd->retry_count = 0; 2109 clear_bit(cmd_idx, mrioc->devrem_bitmap); 2110 } 2111 2112 /** 2113 * mpi3mr_complete_evt_ack - event ack request completion 2114 * @mrioc: Adapter instance reference 2115 * @drv_cmd: Internal command tracker 2116 * 2117 * This is the completion handler for non blocking event 2118 * acknowledgment sent to the firmware and this will issue any 2119 * pending event acknowledgment request. 2120 * 2121 * Return: Nothing 2122 */ 2123 static void mpi3mr_complete_evt_ack(struct mpi3mr_ioc *mrioc, 2124 struct mpi3mr_drv_cmd *drv_cmd) 2125 { 2126 u16 cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_EVTACKCMD_MIN; 2127 struct delayed_evt_ack_node *delayed_evtack = NULL; 2128 2129 if (drv_cmd->state & MPI3MR_CMD_RESET) 2130 goto clear_drv_cmd; 2131 2132 if (drv_cmd->ioc_status != MPI3_IOCSTATUS_SUCCESS) { 2133 dprint_event_th(mrioc, 2134 "immediate event ack failed with ioc_status(0x%04x) log_info(0x%08x)\n", 2135 (drv_cmd->ioc_status & MPI3_IOCSTATUS_STATUS_MASK), 2136 drv_cmd->ioc_loginfo); 2137 } 2138 2139 if (!list_empty(&mrioc->delayed_evtack_cmds_list)) { 2140 delayed_evtack = 2141 list_entry(mrioc->delayed_evtack_cmds_list.next, 2142 struct delayed_evt_ack_node, list); 2143 mpi3mr_send_event_ack(mrioc, delayed_evtack->event, drv_cmd, 2144 delayed_evtack->event_ctx); 2145 list_del(&delayed_evtack->list); 2146 kfree(delayed_evtack); 2147 return; 2148 } 2149 clear_drv_cmd: 2150 drv_cmd->state = MPI3MR_CMD_NOTUSED; 2151 drv_cmd->callback = NULL; 2152 clear_bit(cmd_idx, mrioc->evtack_cmds_bitmap); 2153 } 2154 2155 /** 2156 * mpi3mr_send_event_ack - Issue event acknwoledgment request 2157 * @mrioc: Adapter instance reference 2158 * @event: MPI3 event id 2159 * @cmdparam: Internal command tracker 2160 * @event_ctx: event context 2161 * 2162 * Issues event acknowledgment request to the firmware if there 2163 * is a free command to send the event ack else it to a pend 2164 * list so that it will be processed on a completion of a prior 2165 * event acknowledgment . 2166 * 2167 * Return: Nothing 2168 */ 2169 static void mpi3mr_send_event_ack(struct mpi3mr_ioc *mrioc, u8 event, 2170 struct mpi3mr_drv_cmd *cmdparam, u32 event_ctx) 2171 { 2172 struct mpi3_event_ack_request evtack_req; 2173 int retval = 0; 2174 u8 retrycount = 5; 2175 u16 cmd_idx = MPI3MR_NUM_EVTACKCMD; 2176 struct mpi3mr_drv_cmd *drv_cmd = cmdparam; 2177 struct delayed_evt_ack_node *delayed_evtack = NULL; 2178 2179 if (drv_cmd) { 2180 dprint_event_th(mrioc, 2181 "sending delayed event ack in the top half for event(0x%02x), event_ctx(0x%08x)\n", 2182 event, event_ctx); 2183 goto issue_cmd; 2184 } 2185 dprint_event_th(mrioc, 2186 "sending event ack in the top half for event(0x%02x), event_ctx(0x%08x)\n", 2187 event, event_ctx); 2188 do { 2189 cmd_idx = find_first_zero_bit(mrioc->evtack_cmds_bitmap, 2190 MPI3MR_NUM_EVTACKCMD); 2191 if (cmd_idx < MPI3MR_NUM_EVTACKCMD) { 2192 if (!test_and_set_bit(cmd_idx, 2193 mrioc->evtack_cmds_bitmap)) 2194 break; 2195 cmd_idx = MPI3MR_NUM_EVTACKCMD; 2196 } 2197 } while (retrycount--); 2198 2199 if (cmd_idx >= MPI3MR_NUM_EVTACKCMD) { 2200 delayed_evtack = kzalloc(sizeof(*delayed_evtack), 2201 GFP_ATOMIC); 2202 if (!delayed_evtack) 2203 return; 2204 INIT_LIST_HEAD(&delayed_evtack->list); 2205 delayed_evtack->event = event; 2206 delayed_evtack->event_ctx = event_ctx; 2207 list_add_tail(&delayed_evtack->list, 2208 &mrioc->delayed_evtack_cmds_list); 2209 dprint_event_th(mrioc, 2210 "event ack in the top half for event(0x%02x), event_ctx(0x%08x) is postponed\n", 2211 event, event_ctx); 2212 return; 2213 } 2214 drv_cmd = &mrioc->evtack_cmds[cmd_idx]; 2215 2216 issue_cmd: 2217 cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_EVTACKCMD_MIN; 2218 2219 memset(&evtack_req, 0, sizeof(evtack_req)); 2220 if (drv_cmd->state & MPI3MR_CMD_PENDING) { 2221 dprint_event_th(mrioc, 2222 "sending event ack failed due to command in use\n"); 2223 goto out; 2224 } 2225 drv_cmd->state = MPI3MR_CMD_PENDING; 2226 drv_cmd->is_waiting = 0; 2227 drv_cmd->callback = mpi3mr_complete_evt_ack; 2228 evtack_req.host_tag = cpu_to_le16(drv_cmd->host_tag); 2229 evtack_req.function = MPI3_FUNCTION_EVENT_ACK; 2230 evtack_req.event = event; 2231 evtack_req.event_context = cpu_to_le32(event_ctx); 2232 retval = mpi3mr_admin_request_post(mrioc, &evtack_req, 2233 sizeof(evtack_req), 1); 2234 if (retval) { 2235 dprint_event_th(mrioc, 2236 "posting event ack request is failed\n"); 2237 goto out_failed; 2238 } 2239 2240 dprint_event_th(mrioc, 2241 "event ack in the top half for event(0x%02x), event_ctx(0x%08x) is posted\n", 2242 event, event_ctx); 2243 out: 2244 return; 2245 out_failed: 2246 drv_cmd->state = MPI3MR_CMD_NOTUSED; 2247 drv_cmd->callback = NULL; 2248 clear_bit(cmd_idx, mrioc->evtack_cmds_bitmap); 2249 } 2250 2251 /** 2252 * mpi3mr_pcietopochg_evt_th - PCIETopologyChange evt tophalf 2253 * @mrioc: Adapter instance reference 2254 * @event_reply: event data 2255 * 2256 * Checks for the reason code and based on that either block I/O 2257 * to device, or unblock I/O to the device, or start the device 2258 * removal handshake with reason as remove with the firmware for 2259 * PCIe devices. 2260 * 2261 * Return: Nothing 2262 */ 2263 static void mpi3mr_pcietopochg_evt_th(struct mpi3mr_ioc *mrioc, 2264 struct mpi3_event_notification_reply *event_reply) 2265 { 2266 struct mpi3_event_data_pcie_topology_change_list *topo_evt = 2267 (struct mpi3_event_data_pcie_topology_change_list *)event_reply->event_data; 2268 int i; 2269 u16 handle; 2270 u8 reason_code; 2271 struct mpi3mr_tgt_dev *tgtdev = NULL; 2272 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL; 2273 2274 for (i = 0; i < topo_evt->num_entries; i++) { 2275 handle = le16_to_cpu(topo_evt->port_entry[i].attached_dev_handle); 2276 if (!handle) 2277 continue; 2278 reason_code = topo_evt->port_entry[i].port_status; 2279 scsi_tgt_priv_data = NULL; 2280 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle); 2281 if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata) 2282 scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *) 2283 tgtdev->starget->hostdata; 2284 switch (reason_code) { 2285 case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING: 2286 if (scsi_tgt_priv_data) { 2287 scsi_tgt_priv_data->dev_removed = 1; 2288 scsi_tgt_priv_data->dev_removedelay = 0; 2289 atomic_set(&scsi_tgt_priv_data->block_io, 0); 2290 } 2291 mpi3mr_dev_rmhs_send_tm(mrioc, handle, NULL, 2292 MPI3_CTRL_OP_REMOVE_DEVICE); 2293 break; 2294 case MPI3_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING: 2295 if (scsi_tgt_priv_data) { 2296 scsi_tgt_priv_data->dev_removedelay = 1; 2297 atomic_inc(&scsi_tgt_priv_data->block_io); 2298 } 2299 break; 2300 case MPI3_EVENT_PCIE_TOPO_PS_RESPONDING: 2301 if (scsi_tgt_priv_data && 2302 scsi_tgt_priv_data->dev_removedelay) { 2303 scsi_tgt_priv_data->dev_removedelay = 0; 2304 atomic_dec_if_positive 2305 (&scsi_tgt_priv_data->block_io); 2306 } 2307 break; 2308 case MPI3_EVENT_PCIE_TOPO_PS_PORT_CHANGED: 2309 default: 2310 break; 2311 } 2312 if (tgtdev) 2313 mpi3mr_tgtdev_put(tgtdev); 2314 } 2315 } 2316 2317 /** 2318 * mpi3mr_sastopochg_evt_th - SASTopologyChange evt tophalf 2319 * @mrioc: Adapter instance reference 2320 * @event_reply: event data 2321 * 2322 * Checks for the reason code and based on that either block I/O 2323 * to device, or unblock I/O to the device, or start the device 2324 * removal handshake with reason as remove with the firmware for 2325 * SAS/SATA devices. 2326 * 2327 * Return: Nothing 2328 */ 2329 static void mpi3mr_sastopochg_evt_th(struct mpi3mr_ioc *mrioc, 2330 struct mpi3_event_notification_reply *event_reply) 2331 { 2332 struct mpi3_event_data_sas_topology_change_list *topo_evt = 2333 (struct mpi3_event_data_sas_topology_change_list *)event_reply->event_data; 2334 int i; 2335 u16 handle; 2336 u8 reason_code; 2337 struct mpi3mr_tgt_dev *tgtdev = NULL; 2338 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL; 2339 2340 for (i = 0; i < topo_evt->num_entries; i++) { 2341 handle = le16_to_cpu(topo_evt->phy_entry[i].attached_dev_handle); 2342 if (!handle) 2343 continue; 2344 reason_code = topo_evt->phy_entry[i].status & 2345 MPI3_EVENT_SAS_TOPO_PHY_RC_MASK; 2346 scsi_tgt_priv_data = NULL; 2347 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle); 2348 if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata) 2349 scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *) 2350 tgtdev->starget->hostdata; 2351 switch (reason_code) { 2352 case MPI3_EVENT_SAS_TOPO_PHY_RC_TARG_NOT_RESPONDING: 2353 if (scsi_tgt_priv_data) { 2354 scsi_tgt_priv_data->dev_removed = 1; 2355 scsi_tgt_priv_data->dev_removedelay = 0; 2356 atomic_set(&scsi_tgt_priv_data->block_io, 0); 2357 } 2358 mpi3mr_dev_rmhs_send_tm(mrioc, handle, NULL, 2359 MPI3_CTRL_OP_REMOVE_DEVICE); 2360 break; 2361 case MPI3_EVENT_SAS_TOPO_PHY_RC_DELAY_NOT_RESPONDING: 2362 if (scsi_tgt_priv_data) { 2363 scsi_tgt_priv_data->dev_removedelay = 1; 2364 atomic_inc(&scsi_tgt_priv_data->block_io); 2365 } 2366 break; 2367 case MPI3_EVENT_SAS_TOPO_PHY_RC_RESPONDING: 2368 if (scsi_tgt_priv_data && 2369 scsi_tgt_priv_data->dev_removedelay) { 2370 scsi_tgt_priv_data->dev_removedelay = 0; 2371 atomic_dec_if_positive 2372 (&scsi_tgt_priv_data->block_io); 2373 } 2374 break; 2375 case MPI3_EVENT_SAS_TOPO_PHY_RC_PHY_CHANGED: 2376 default: 2377 break; 2378 } 2379 if (tgtdev) 2380 mpi3mr_tgtdev_put(tgtdev); 2381 } 2382 } 2383 2384 /** 2385 * mpi3mr_devstatuschg_evt_th - DeviceStatusChange evt tophalf 2386 * @mrioc: Adapter instance reference 2387 * @event_reply: event data 2388 * 2389 * Checks for the reason code and based on that either block I/O 2390 * to device, or unblock I/O to the device, or start the device 2391 * removal handshake with reason as remove/hide acknowledgment 2392 * with the firmware. 2393 * 2394 * Return: Nothing 2395 */ 2396 static void mpi3mr_devstatuschg_evt_th(struct mpi3mr_ioc *mrioc, 2397 struct mpi3_event_notification_reply *event_reply) 2398 { 2399 u16 dev_handle = 0; 2400 u8 ublock = 0, block = 0, hide = 0, delete = 0, remove = 0; 2401 struct mpi3mr_tgt_dev *tgtdev = NULL; 2402 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL; 2403 struct mpi3_event_data_device_status_change *evtdata = 2404 (struct mpi3_event_data_device_status_change *)event_reply->event_data; 2405 2406 if (mrioc->stop_drv_processing) 2407 goto out; 2408 2409 dev_handle = le16_to_cpu(evtdata->dev_handle); 2410 2411 switch (evtdata->reason_code) { 2412 case MPI3_EVENT_DEV_STAT_RC_INT_DEVICE_RESET_STRT: 2413 case MPI3_EVENT_DEV_STAT_RC_INT_IT_NEXUS_RESET_STRT: 2414 block = 1; 2415 break; 2416 case MPI3_EVENT_DEV_STAT_RC_HIDDEN: 2417 delete = 1; 2418 hide = 1; 2419 break; 2420 case MPI3_EVENT_DEV_STAT_RC_VD_NOT_RESPONDING: 2421 delete = 1; 2422 remove = 1; 2423 break; 2424 case MPI3_EVENT_DEV_STAT_RC_INT_DEVICE_RESET_CMP: 2425 case MPI3_EVENT_DEV_STAT_RC_INT_IT_NEXUS_RESET_CMP: 2426 ublock = 1; 2427 break; 2428 default: 2429 break; 2430 } 2431 2432 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle); 2433 if (!tgtdev) 2434 goto out; 2435 if (hide) 2436 tgtdev->is_hidden = hide; 2437 if (tgtdev->starget && tgtdev->starget->hostdata) { 2438 scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *) 2439 tgtdev->starget->hostdata; 2440 if (block) 2441 atomic_inc(&scsi_tgt_priv_data->block_io); 2442 if (delete) 2443 scsi_tgt_priv_data->dev_removed = 1; 2444 if (ublock) 2445 atomic_dec_if_positive(&scsi_tgt_priv_data->block_io); 2446 } 2447 if (remove) 2448 mpi3mr_dev_rmhs_send_tm(mrioc, dev_handle, NULL, 2449 MPI3_CTRL_OP_REMOVE_DEVICE); 2450 if (hide) 2451 mpi3mr_dev_rmhs_send_tm(mrioc, dev_handle, NULL, 2452 MPI3_CTRL_OP_HIDDEN_ACK); 2453 2454 out: 2455 if (tgtdev) 2456 mpi3mr_tgtdev_put(tgtdev); 2457 } 2458 2459 /** 2460 * mpi3mr_preparereset_evt_th - Prepare for reset event tophalf 2461 * @mrioc: Adapter instance reference 2462 * @event_reply: event data 2463 * 2464 * Blocks and unblocks host level I/O based on the reason code 2465 * 2466 * Return: Nothing 2467 */ 2468 static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc, 2469 struct mpi3_event_notification_reply *event_reply) 2470 { 2471 struct mpi3_event_data_prepare_for_reset *evtdata = 2472 (struct mpi3_event_data_prepare_for_reset *)event_reply->event_data; 2473 2474 if (evtdata->reason_code == MPI3_EVENT_PREPARE_RESET_RC_START) { 2475 dprint_event_th(mrioc, 2476 "prepare for reset event top half with rc=start\n"); 2477 if (mrioc->prepare_for_reset) 2478 return; 2479 mrioc->prepare_for_reset = 1; 2480 mrioc->prepare_for_reset_timeout_counter = 0; 2481 } else if (evtdata->reason_code == MPI3_EVENT_PREPARE_RESET_RC_ABORT) { 2482 dprint_event_th(mrioc, 2483 "prepare for reset top half with rc=abort\n"); 2484 mrioc->prepare_for_reset = 0; 2485 mrioc->prepare_for_reset_timeout_counter = 0; 2486 } 2487 if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK) 2488 == MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_REQUIRED) 2489 mpi3mr_send_event_ack(mrioc, event_reply->event, NULL, 2490 le32_to_cpu(event_reply->event_context)); 2491 } 2492 2493 /** 2494 * mpi3mr_energypackchg_evt_th - Energy pack change evt tophalf 2495 * @mrioc: Adapter instance reference 2496 * @event_reply: event data 2497 * 2498 * Identifies the new shutdown timeout value and update. 2499 * 2500 * Return: Nothing 2501 */ 2502 static void mpi3mr_energypackchg_evt_th(struct mpi3mr_ioc *mrioc, 2503 struct mpi3_event_notification_reply *event_reply) 2504 { 2505 struct mpi3_event_data_energy_pack_change *evtdata = 2506 (struct mpi3_event_data_energy_pack_change *)event_reply->event_data; 2507 u16 shutdown_timeout = le16_to_cpu(evtdata->shutdown_timeout); 2508 2509 if (shutdown_timeout <= 0) { 2510 ioc_warn(mrioc, 2511 "%s :Invalid Shutdown Timeout received = %d\n", 2512 __func__, shutdown_timeout); 2513 return; 2514 } 2515 2516 ioc_info(mrioc, 2517 "%s :Previous Shutdown Timeout Value = %d New Shutdown Timeout Value = %d\n", 2518 __func__, mrioc->facts.shutdown_timeout, shutdown_timeout); 2519 mrioc->facts.shutdown_timeout = shutdown_timeout; 2520 } 2521 2522 /** 2523 * mpi3mr_cablemgmt_evt_th - Cable management event tophalf 2524 * @mrioc: Adapter instance reference 2525 * @event_reply: event data 2526 * 2527 * Displays Cable manegemt event details. 2528 * 2529 * Return: Nothing 2530 */ 2531 static void mpi3mr_cablemgmt_evt_th(struct mpi3mr_ioc *mrioc, 2532 struct mpi3_event_notification_reply *event_reply) 2533 { 2534 struct mpi3_event_data_cable_management *evtdata = 2535 (struct mpi3_event_data_cable_management *)event_reply->event_data; 2536 2537 switch (evtdata->status) { 2538 case MPI3_EVENT_CABLE_MGMT_STATUS_INSUFFICIENT_POWER: 2539 { 2540 ioc_info(mrioc, "An active cable with receptacle_id %d cannot be powered.\n" 2541 "Devices connected to this cable are not detected.\n" 2542 "This cable requires %d mW of power.\n", 2543 evtdata->receptacle_id, 2544 le32_to_cpu(evtdata->active_cable_power_requirement)); 2545 break; 2546 } 2547 case MPI3_EVENT_CABLE_MGMT_STATUS_DEGRADED: 2548 { 2549 ioc_info(mrioc, "A cable with receptacle_id %d is not running at optimal speed\n", 2550 evtdata->receptacle_id); 2551 break; 2552 } 2553 default: 2554 break; 2555 } 2556 } 2557 2558 /** 2559 * mpi3mr_os_handle_events - Firmware event handler 2560 * @mrioc: Adapter instance reference 2561 * @event_reply: event data 2562 * 2563 * Identify whteher the event has to handled and acknowledged 2564 * and either process the event in the tophalf and/or schedule a 2565 * bottom half through mpi3mr_fwevt_worker. 2566 * 2567 * Return: Nothing 2568 */ 2569 void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc, 2570 struct mpi3_event_notification_reply *event_reply) 2571 { 2572 u16 evt_type, sz; 2573 struct mpi3mr_fwevt *fwevt = NULL; 2574 bool ack_req = 0, process_evt_bh = 0; 2575 2576 if (mrioc->stop_drv_processing) 2577 return; 2578 2579 if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK) 2580 == MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_REQUIRED) 2581 ack_req = 1; 2582 2583 evt_type = event_reply->event; 2584 2585 switch (evt_type) { 2586 case MPI3_EVENT_DEVICE_ADDED: 2587 { 2588 struct mpi3_device_page0 *dev_pg0 = 2589 (struct mpi3_device_page0 *)event_reply->event_data; 2590 if (mpi3mr_create_tgtdev(mrioc, dev_pg0)) 2591 ioc_err(mrioc, 2592 "%s :Failed to add device in the device add event\n", 2593 __func__); 2594 else 2595 process_evt_bh = 1; 2596 break; 2597 } 2598 case MPI3_EVENT_DEVICE_STATUS_CHANGE: 2599 { 2600 process_evt_bh = 1; 2601 mpi3mr_devstatuschg_evt_th(mrioc, event_reply); 2602 break; 2603 } 2604 case MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST: 2605 { 2606 process_evt_bh = 1; 2607 mpi3mr_sastopochg_evt_th(mrioc, event_reply); 2608 break; 2609 } 2610 case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST: 2611 { 2612 process_evt_bh = 1; 2613 mpi3mr_pcietopochg_evt_th(mrioc, event_reply); 2614 break; 2615 } 2616 case MPI3_EVENT_PREPARE_FOR_RESET: 2617 { 2618 mpi3mr_preparereset_evt_th(mrioc, event_reply); 2619 ack_req = 0; 2620 break; 2621 } 2622 case MPI3_EVENT_DEVICE_INFO_CHANGED: 2623 case MPI3_EVENT_LOG_DATA: 2624 case MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE: 2625 case MPI3_EVENT_ENCL_DEVICE_ADDED: 2626 { 2627 process_evt_bh = 1; 2628 break; 2629 } 2630 case MPI3_EVENT_ENERGY_PACK_CHANGE: 2631 { 2632 mpi3mr_energypackchg_evt_th(mrioc, event_reply); 2633 break; 2634 } 2635 case MPI3_EVENT_CABLE_MGMT: 2636 { 2637 mpi3mr_cablemgmt_evt_th(mrioc, event_reply); 2638 break; 2639 } 2640 case MPI3_EVENT_SAS_DISCOVERY: 2641 case MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR: 2642 case MPI3_EVENT_SAS_BROADCAST_PRIMITIVE: 2643 case MPI3_EVENT_PCIE_ENUMERATION: 2644 break; 2645 default: 2646 ioc_info(mrioc, "%s :event 0x%02x is not handled\n", 2647 __func__, evt_type); 2648 break; 2649 } 2650 if (process_evt_bh || ack_req) { 2651 sz = event_reply->event_data_length * 4; 2652 fwevt = mpi3mr_alloc_fwevt(sz); 2653 if (!fwevt) { 2654 ioc_info(mrioc, "%s :failure at %s:%d/%s()!\n", 2655 __func__, __FILE__, __LINE__, __func__); 2656 return; 2657 } 2658 2659 memcpy(fwevt->event_data, event_reply->event_data, sz); 2660 fwevt->mrioc = mrioc; 2661 fwevt->event_id = evt_type; 2662 fwevt->send_ack = ack_req; 2663 fwevt->process_evt = process_evt_bh; 2664 fwevt->evt_ctx = le32_to_cpu(event_reply->event_context); 2665 mpi3mr_fwevt_add_to_list(mrioc, fwevt); 2666 } 2667 } 2668 2669 /** 2670 * mpi3mr_setup_eedp - Setup EEDP information in MPI3 SCSI IO 2671 * @mrioc: Adapter instance reference 2672 * @scmd: SCSI command reference 2673 * @scsiio_req: MPI3 SCSI IO request 2674 * 2675 * Identifies the protection information flags from the SCSI 2676 * command and set appropriate flags in the MPI3 SCSI IO 2677 * request. 2678 * 2679 * Return: Nothing 2680 */ 2681 static void mpi3mr_setup_eedp(struct mpi3mr_ioc *mrioc, 2682 struct scsi_cmnd *scmd, struct mpi3_scsi_io_request *scsiio_req) 2683 { 2684 u16 eedp_flags = 0; 2685 unsigned char prot_op = scsi_get_prot_op(scmd); 2686 2687 switch (prot_op) { 2688 case SCSI_PROT_NORMAL: 2689 return; 2690 case SCSI_PROT_READ_STRIP: 2691 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_CHECK_REMOVE; 2692 break; 2693 case SCSI_PROT_WRITE_INSERT: 2694 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_INSERT; 2695 break; 2696 case SCSI_PROT_READ_INSERT: 2697 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_INSERT; 2698 scsiio_req->msg_flags |= MPI3_SCSIIO_MSGFLAGS_METASGL_VALID; 2699 break; 2700 case SCSI_PROT_WRITE_STRIP: 2701 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_CHECK_REMOVE; 2702 scsiio_req->msg_flags |= MPI3_SCSIIO_MSGFLAGS_METASGL_VALID; 2703 break; 2704 case SCSI_PROT_READ_PASS: 2705 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_CHECK; 2706 scsiio_req->msg_flags |= MPI3_SCSIIO_MSGFLAGS_METASGL_VALID; 2707 break; 2708 case SCSI_PROT_WRITE_PASS: 2709 if (scmd->prot_flags & SCSI_PROT_IP_CHECKSUM) { 2710 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_CHECK_REGEN; 2711 scsiio_req->sgl[0].eedp.application_tag_translation_mask = 2712 0xffff; 2713 } else 2714 eedp_flags = MPI3_EEDPFLAGS_EEDP_OP_CHECK; 2715 2716 scsiio_req->msg_flags |= MPI3_SCSIIO_MSGFLAGS_METASGL_VALID; 2717 break; 2718 default: 2719 return; 2720 } 2721 2722 if (scmd->prot_flags & SCSI_PROT_GUARD_CHECK) 2723 eedp_flags |= MPI3_EEDPFLAGS_CHK_GUARD; 2724 2725 if (scmd->prot_flags & SCSI_PROT_IP_CHECKSUM) 2726 eedp_flags |= MPI3_EEDPFLAGS_HOST_GUARD_IP_CHKSUM; 2727 2728 if (scmd->prot_flags & SCSI_PROT_REF_CHECK) { 2729 eedp_flags |= MPI3_EEDPFLAGS_CHK_REF_TAG | 2730 MPI3_EEDPFLAGS_INCR_PRI_REF_TAG; 2731 scsiio_req->cdb.eedp32.primary_reference_tag = 2732 cpu_to_be32(scsi_prot_ref_tag(scmd)); 2733 } 2734 2735 if (scmd->prot_flags & SCSI_PROT_REF_INCREMENT) 2736 eedp_flags |= MPI3_EEDPFLAGS_INCR_PRI_REF_TAG; 2737 2738 eedp_flags |= MPI3_EEDPFLAGS_ESC_MODE_APPTAG_DISABLE; 2739 2740 switch (scsi_prot_interval(scmd)) { 2741 case 512: 2742 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_512; 2743 break; 2744 case 520: 2745 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_520; 2746 break; 2747 case 4080: 2748 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_4080; 2749 break; 2750 case 4088: 2751 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_4088; 2752 break; 2753 case 4096: 2754 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_4096; 2755 break; 2756 case 4104: 2757 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_4104; 2758 break; 2759 case 4160: 2760 scsiio_req->sgl[0].eedp.user_data_size = MPI3_EEDP_UDS_4160; 2761 break; 2762 default: 2763 break; 2764 } 2765 2766 scsiio_req->sgl[0].eedp.eedp_flags = cpu_to_le16(eedp_flags); 2767 scsiio_req->sgl[0].eedp.flags = MPI3_SGE_FLAGS_ELEMENT_TYPE_EXTENDED; 2768 } 2769 2770 /** 2771 * mpi3mr_build_sense_buffer - Map sense information 2772 * @desc: Sense type 2773 * @buf: Sense buffer to populate 2774 * @key: Sense key 2775 * @asc: Additional sense code 2776 * @ascq: Additional sense code qualifier 2777 * 2778 * Maps the given sense information into either descriptor or 2779 * fixed format sense data. 2780 * 2781 * Return: Nothing 2782 */ 2783 static inline void mpi3mr_build_sense_buffer(int desc, u8 *buf, u8 key, 2784 u8 asc, u8 ascq) 2785 { 2786 if (desc) { 2787 buf[0] = 0x72; /* descriptor, current */ 2788 buf[1] = key; 2789 buf[2] = asc; 2790 buf[3] = ascq; 2791 buf[7] = 0; 2792 } else { 2793 buf[0] = 0x70; /* fixed, current */ 2794 buf[2] = key; 2795 buf[7] = 0xa; 2796 buf[12] = asc; 2797 buf[13] = ascq; 2798 } 2799 } 2800 2801 /** 2802 * mpi3mr_map_eedp_error - Map EEDP errors from IOC status 2803 * @scmd: SCSI command reference 2804 * @ioc_status: status of MPI3 request 2805 * 2806 * Maps the EEDP error status of the SCSI IO request to sense 2807 * data. 2808 * 2809 * Return: Nothing 2810 */ 2811 static void mpi3mr_map_eedp_error(struct scsi_cmnd *scmd, 2812 u16 ioc_status) 2813 { 2814 u8 ascq = 0; 2815 2816 switch (ioc_status) { 2817 case MPI3_IOCSTATUS_EEDP_GUARD_ERROR: 2818 ascq = 0x01; 2819 break; 2820 case MPI3_IOCSTATUS_EEDP_APP_TAG_ERROR: 2821 ascq = 0x02; 2822 break; 2823 case MPI3_IOCSTATUS_EEDP_REF_TAG_ERROR: 2824 ascq = 0x03; 2825 break; 2826 default: 2827 ascq = 0x00; 2828 break; 2829 } 2830 2831 mpi3mr_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 2832 0x10, ascq); 2833 scmd->result = (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION; 2834 } 2835 2836 /** 2837 * mpi3mr_process_op_reply_desc - reply descriptor handler 2838 * @mrioc: Adapter instance reference 2839 * @reply_desc: Operational reply descriptor 2840 * @reply_dma: place holder for reply DMA address 2841 * @qidx: Operational queue index 2842 * 2843 * Process the operational reply descriptor and identifies the 2844 * descriptor type. Based on the descriptor map the MPI3 request 2845 * status to a SCSI command status and calls scsi_done call 2846 * back. 2847 * 2848 * Return: Nothing 2849 */ 2850 void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc, 2851 struct mpi3_default_reply_descriptor *reply_desc, u64 *reply_dma, u16 qidx) 2852 { 2853 u16 reply_desc_type, host_tag = 0; 2854 u16 ioc_status = MPI3_IOCSTATUS_SUCCESS; 2855 u32 ioc_loginfo = 0; 2856 struct mpi3_status_reply_descriptor *status_desc = NULL; 2857 struct mpi3_address_reply_descriptor *addr_desc = NULL; 2858 struct mpi3_success_reply_descriptor *success_desc = NULL; 2859 struct mpi3_scsi_io_reply *scsi_reply = NULL; 2860 struct scsi_cmnd *scmd = NULL; 2861 struct scmd_priv *priv = NULL; 2862 u8 *sense_buf = NULL; 2863 u8 scsi_state = 0, scsi_status = 0, sense_state = 0; 2864 u32 xfer_count = 0, sense_count = 0, resp_data = 0; 2865 u16 dev_handle = 0xFFFF; 2866 struct scsi_sense_hdr sshdr; 2867 struct mpi3mr_stgt_priv_data *stgt_priv_data = NULL; 2868 struct mpi3mr_sdev_priv_data *sdev_priv_data = NULL; 2869 u32 ioc_pend_data_len = 0, tg_pend_data_len = 0, data_len_blks = 0; 2870 struct mpi3mr_throttle_group_info *tg = NULL; 2871 u8 throttle_enabled_dev = 0; 2872 2873 *reply_dma = 0; 2874 reply_desc_type = le16_to_cpu(reply_desc->reply_flags) & 2875 MPI3_REPLY_DESCRIPT_FLAGS_TYPE_MASK; 2876 switch (reply_desc_type) { 2877 case MPI3_REPLY_DESCRIPT_FLAGS_TYPE_STATUS: 2878 status_desc = (struct mpi3_status_reply_descriptor *)reply_desc; 2879 host_tag = le16_to_cpu(status_desc->host_tag); 2880 ioc_status = le16_to_cpu(status_desc->ioc_status); 2881 if (ioc_status & 2882 MPI3_REPLY_DESCRIPT_STATUS_IOCSTATUS_LOGINFOAVAIL) 2883 ioc_loginfo = le32_to_cpu(status_desc->ioc_log_info); 2884 ioc_status &= MPI3_REPLY_DESCRIPT_STATUS_IOCSTATUS_STATUS_MASK; 2885 break; 2886 case MPI3_REPLY_DESCRIPT_FLAGS_TYPE_ADDRESS_REPLY: 2887 addr_desc = (struct mpi3_address_reply_descriptor *)reply_desc; 2888 *reply_dma = le64_to_cpu(addr_desc->reply_frame_address); 2889 scsi_reply = mpi3mr_get_reply_virt_addr(mrioc, 2890 *reply_dma); 2891 if (!scsi_reply) { 2892 panic("%s: scsi_reply is NULL, this shouldn't happen\n", 2893 mrioc->name); 2894 goto out; 2895 } 2896 host_tag = le16_to_cpu(scsi_reply->host_tag); 2897 ioc_status = le16_to_cpu(scsi_reply->ioc_status); 2898 scsi_status = scsi_reply->scsi_status; 2899 scsi_state = scsi_reply->scsi_state; 2900 dev_handle = le16_to_cpu(scsi_reply->dev_handle); 2901 sense_state = (scsi_state & MPI3_SCSI_STATE_SENSE_MASK); 2902 xfer_count = le32_to_cpu(scsi_reply->transfer_count); 2903 sense_count = le32_to_cpu(scsi_reply->sense_count); 2904 resp_data = le32_to_cpu(scsi_reply->response_data); 2905 sense_buf = mpi3mr_get_sensebuf_virt_addr(mrioc, 2906 le64_to_cpu(scsi_reply->sense_data_buffer_address)); 2907 if (ioc_status & 2908 MPI3_REPLY_DESCRIPT_STATUS_IOCSTATUS_LOGINFOAVAIL) 2909 ioc_loginfo = le32_to_cpu(scsi_reply->ioc_log_info); 2910 ioc_status &= MPI3_REPLY_DESCRIPT_STATUS_IOCSTATUS_STATUS_MASK; 2911 if (sense_state == MPI3_SCSI_STATE_SENSE_BUFF_Q_EMPTY) 2912 panic("%s: Ran out of sense buffers\n", mrioc->name); 2913 break; 2914 case MPI3_REPLY_DESCRIPT_FLAGS_TYPE_SUCCESS: 2915 success_desc = (struct mpi3_success_reply_descriptor *)reply_desc; 2916 host_tag = le16_to_cpu(success_desc->host_tag); 2917 break; 2918 default: 2919 break; 2920 } 2921 scmd = mpi3mr_scmd_from_host_tag(mrioc, host_tag, qidx); 2922 if (!scmd) { 2923 panic("%s: Cannot Identify scmd for host_tag 0x%x\n", 2924 mrioc->name, host_tag); 2925 goto out; 2926 } 2927 priv = scsi_cmd_priv(scmd); 2928 2929 data_len_blks = scsi_bufflen(scmd) >> 9; 2930 sdev_priv_data = scmd->device->hostdata; 2931 if (sdev_priv_data) { 2932 stgt_priv_data = sdev_priv_data->tgt_priv_data; 2933 if (stgt_priv_data) { 2934 tg = stgt_priv_data->throttle_group; 2935 throttle_enabled_dev = 2936 stgt_priv_data->io_throttle_enabled; 2937 } 2938 } 2939 if (unlikely((data_len_blks >= mrioc->io_throttle_data_length) && 2940 throttle_enabled_dev)) { 2941 ioc_pend_data_len = atomic_sub_return(data_len_blks, 2942 &mrioc->pend_large_data_sz); 2943 if (tg) { 2944 tg_pend_data_len = atomic_sub_return(data_len_blks, 2945 &tg->pend_large_data_sz); 2946 if (tg->io_divert && ((ioc_pend_data_len <= 2947 mrioc->io_throttle_low) && 2948 (tg_pend_data_len <= tg->low))) { 2949 tg->io_divert = 0; 2950 mpi3mr_set_io_divert_for_all_vd_in_tg( 2951 mrioc, tg, 0); 2952 } 2953 } else { 2954 if (ioc_pend_data_len <= mrioc->io_throttle_low) 2955 stgt_priv_data->io_divert = 0; 2956 } 2957 } else if (unlikely((stgt_priv_data && stgt_priv_data->io_divert))) { 2958 ioc_pend_data_len = atomic_read(&mrioc->pend_large_data_sz); 2959 if (!tg) { 2960 if (ioc_pend_data_len <= mrioc->io_throttle_low) 2961 stgt_priv_data->io_divert = 0; 2962 2963 } else if (ioc_pend_data_len <= mrioc->io_throttle_low) { 2964 tg_pend_data_len = atomic_read(&tg->pend_large_data_sz); 2965 if (tg->io_divert && (tg_pend_data_len <= tg->low)) { 2966 tg->io_divert = 0; 2967 mpi3mr_set_io_divert_for_all_vd_in_tg( 2968 mrioc, tg, 0); 2969 } 2970 } 2971 } 2972 2973 if (success_desc) { 2974 scmd->result = DID_OK << 16; 2975 goto out_success; 2976 } 2977 2978 scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_count); 2979 if (ioc_status == MPI3_IOCSTATUS_SCSI_DATA_UNDERRUN && 2980 xfer_count == 0 && (scsi_status == MPI3_SCSI_STATUS_BUSY || 2981 scsi_status == MPI3_SCSI_STATUS_RESERVATION_CONFLICT || 2982 scsi_status == MPI3_SCSI_STATUS_TASK_SET_FULL)) 2983 ioc_status = MPI3_IOCSTATUS_SUCCESS; 2984 2985 if ((sense_state == MPI3_SCSI_STATE_SENSE_VALID) && sense_count && 2986 sense_buf) { 2987 u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE, sense_count); 2988 2989 memcpy(scmd->sense_buffer, sense_buf, sz); 2990 } 2991 2992 switch (ioc_status) { 2993 case MPI3_IOCSTATUS_BUSY: 2994 case MPI3_IOCSTATUS_INSUFFICIENT_RESOURCES: 2995 scmd->result = SAM_STAT_BUSY; 2996 break; 2997 case MPI3_IOCSTATUS_SCSI_DEVICE_NOT_THERE: 2998 scmd->result = DID_NO_CONNECT << 16; 2999 break; 3000 case MPI3_IOCSTATUS_SCSI_IOC_TERMINATED: 3001 scmd->result = DID_SOFT_ERROR << 16; 3002 break; 3003 case MPI3_IOCSTATUS_SCSI_TASK_TERMINATED: 3004 case MPI3_IOCSTATUS_SCSI_EXT_TERMINATED: 3005 scmd->result = DID_RESET << 16; 3006 break; 3007 case MPI3_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: 3008 if ((xfer_count == 0) || (scmd->underflow > xfer_count)) 3009 scmd->result = DID_SOFT_ERROR << 16; 3010 else 3011 scmd->result = (DID_OK << 16) | scsi_status; 3012 break; 3013 case MPI3_IOCSTATUS_SCSI_DATA_UNDERRUN: 3014 scmd->result = (DID_OK << 16) | scsi_status; 3015 if (sense_state == MPI3_SCSI_STATE_SENSE_VALID) 3016 break; 3017 if (xfer_count < scmd->underflow) { 3018 if (scsi_status == SAM_STAT_BUSY) 3019 scmd->result = SAM_STAT_BUSY; 3020 else 3021 scmd->result = DID_SOFT_ERROR << 16; 3022 } else if ((scsi_state & (MPI3_SCSI_STATE_NO_SCSI_STATUS)) || 3023 (sense_state != MPI3_SCSI_STATE_SENSE_NOT_AVAILABLE)) 3024 scmd->result = DID_SOFT_ERROR << 16; 3025 else if (scsi_state & MPI3_SCSI_STATE_TERMINATED) 3026 scmd->result = DID_RESET << 16; 3027 break; 3028 case MPI3_IOCSTATUS_SCSI_DATA_OVERRUN: 3029 scsi_set_resid(scmd, 0); 3030 fallthrough; 3031 case MPI3_IOCSTATUS_SCSI_RECOVERED_ERROR: 3032 case MPI3_IOCSTATUS_SUCCESS: 3033 scmd->result = (DID_OK << 16) | scsi_status; 3034 if ((scsi_state & (MPI3_SCSI_STATE_NO_SCSI_STATUS)) || 3035 (sense_state == MPI3_SCSI_STATE_SENSE_FAILED) || 3036 (sense_state == MPI3_SCSI_STATE_SENSE_BUFF_Q_EMPTY)) 3037 scmd->result = DID_SOFT_ERROR << 16; 3038 else if (scsi_state & MPI3_SCSI_STATE_TERMINATED) 3039 scmd->result = DID_RESET << 16; 3040 break; 3041 case MPI3_IOCSTATUS_EEDP_GUARD_ERROR: 3042 case MPI3_IOCSTATUS_EEDP_REF_TAG_ERROR: 3043 case MPI3_IOCSTATUS_EEDP_APP_TAG_ERROR: 3044 mpi3mr_map_eedp_error(scmd, ioc_status); 3045 break; 3046 case MPI3_IOCSTATUS_SCSI_PROTOCOL_ERROR: 3047 case MPI3_IOCSTATUS_INVALID_FUNCTION: 3048 case MPI3_IOCSTATUS_INVALID_SGL: 3049 case MPI3_IOCSTATUS_INTERNAL_ERROR: 3050 case MPI3_IOCSTATUS_INVALID_FIELD: 3051 case MPI3_IOCSTATUS_INVALID_STATE: 3052 case MPI3_IOCSTATUS_SCSI_IO_DATA_ERROR: 3053 case MPI3_IOCSTATUS_SCSI_TASK_MGMT_FAILED: 3054 case MPI3_IOCSTATUS_INSUFFICIENT_POWER: 3055 default: 3056 scmd->result = DID_SOFT_ERROR << 16; 3057 break; 3058 } 3059 3060 if (scmd->result != (DID_OK << 16) && (scmd->cmnd[0] != ATA_12) && 3061 (scmd->cmnd[0] != ATA_16)) { 3062 ioc_info(mrioc, "%s :scmd->result 0x%x\n", __func__, 3063 scmd->result); 3064 scsi_print_command(scmd); 3065 ioc_info(mrioc, 3066 "%s :Command issued to handle 0x%02x returned with error 0x%04x loginfo 0x%08x, qid %d\n", 3067 __func__, dev_handle, ioc_status, ioc_loginfo, 3068 priv->req_q_idx + 1); 3069 ioc_info(mrioc, 3070 " host_tag %d scsi_state 0x%02x scsi_status 0x%02x, xfer_cnt %d resp_data 0x%x\n", 3071 host_tag, scsi_state, scsi_status, xfer_count, resp_data); 3072 if (sense_buf) { 3073 scsi_normalize_sense(sense_buf, sense_count, &sshdr); 3074 ioc_info(mrioc, 3075 "%s :sense_count 0x%x, sense_key 0x%x ASC 0x%x, ASCQ 0x%x\n", 3076 __func__, sense_count, sshdr.sense_key, 3077 sshdr.asc, sshdr.ascq); 3078 } 3079 } 3080 out_success: 3081 if (priv->meta_sg_valid) { 3082 dma_unmap_sg(&mrioc->pdev->dev, scsi_prot_sglist(scmd), 3083 scsi_prot_sg_count(scmd), scmd->sc_data_direction); 3084 } 3085 mpi3mr_clear_scmd_priv(mrioc, scmd); 3086 scsi_dma_unmap(scmd); 3087 scsi_done(scmd); 3088 out: 3089 if (sense_buf) 3090 mpi3mr_repost_sense_buf(mrioc, 3091 le64_to_cpu(scsi_reply->sense_data_buffer_address)); 3092 } 3093 3094 /** 3095 * mpi3mr_get_chain_idx - get free chain buffer index 3096 * @mrioc: Adapter instance reference 3097 * 3098 * Try to get a free chain buffer index from the free pool. 3099 * 3100 * Return: -1 on failure or the free chain buffer index 3101 */ 3102 static int mpi3mr_get_chain_idx(struct mpi3mr_ioc *mrioc) 3103 { 3104 u8 retry_count = 5; 3105 int cmd_idx = -1; 3106 3107 do { 3108 spin_lock(&mrioc->chain_buf_lock); 3109 cmd_idx = find_first_zero_bit(mrioc->chain_bitmap, 3110 mrioc->chain_buf_count); 3111 if (cmd_idx < mrioc->chain_buf_count) { 3112 set_bit(cmd_idx, mrioc->chain_bitmap); 3113 spin_unlock(&mrioc->chain_buf_lock); 3114 break; 3115 } 3116 spin_unlock(&mrioc->chain_buf_lock); 3117 cmd_idx = -1; 3118 } while (retry_count--); 3119 return cmd_idx; 3120 } 3121 3122 /** 3123 * mpi3mr_prepare_sg_scmd - build scatter gather list 3124 * @mrioc: Adapter instance reference 3125 * @scmd: SCSI command reference 3126 * @scsiio_req: MPI3 SCSI IO request 3127 * 3128 * This function maps SCSI command's data and protection SGEs to 3129 * MPI request SGEs. If required additional 4K chain buffer is 3130 * used to send the SGEs. 3131 * 3132 * Return: 0 on success, -ENOMEM on dma_map_sg failure 3133 */ 3134 static int mpi3mr_prepare_sg_scmd(struct mpi3mr_ioc *mrioc, 3135 struct scsi_cmnd *scmd, struct mpi3_scsi_io_request *scsiio_req) 3136 { 3137 dma_addr_t chain_dma; 3138 struct scatterlist *sg_scmd; 3139 void *sg_local, *chain; 3140 u32 chain_length; 3141 int sges_left, chain_idx; 3142 u32 sges_in_segment; 3143 u8 simple_sgl_flags; 3144 u8 simple_sgl_flags_last; 3145 u8 last_chain_sgl_flags; 3146 struct chain_element *chain_req; 3147 struct scmd_priv *priv = NULL; 3148 u32 meta_sg = le32_to_cpu(scsiio_req->flags) & 3149 MPI3_SCSIIO_FLAGS_DMAOPERATION_HOST_PI; 3150 3151 priv = scsi_cmd_priv(scmd); 3152 3153 simple_sgl_flags = MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | 3154 MPI3_SGE_FLAGS_DLAS_SYSTEM; 3155 simple_sgl_flags_last = simple_sgl_flags | 3156 MPI3_SGE_FLAGS_END_OF_LIST; 3157 last_chain_sgl_flags = MPI3_SGE_FLAGS_ELEMENT_TYPE_LAST_CHAIN | 3158 MPI3_SGE_FLAGS_DLAS_SYSTEM; 3159 3160 if (meta_sg) 3161 sg_local = &scsiio_req->sgl[MPI3_SCSIIO_METASGL_INDEX]; 3162 else 3163 sg_local = &scsiio_req->sgl; 3164 3165 if (!scsiio_req->data_length && !meta_sg) { 3166 mpi3mr_build_zero_len_sge(sg_local); 3167 return 0; 3168 } 3169 3170 if (meta_sg) { 3171 sg_scmd = scsi_prot_sglist(scmd); 3172 sges_left = dma_map_sg(&mrioc->pdev->dev, 3173 scsi_prot_sglist(scmd), 3174 scsi_prot_sg_count(scmd), 3175 scmd->sc_data_direction); 3176 priv->meta_sg_valid = 1; /* To unmap meta sg DMA */ 3177 } else { 3178 sg_scmd = scsi_sglist(scmd); 3179 sges_left = scsi_dma_map(scmd); 3180 } 3181 3182 if (sges_left < 0) { 3183 sdev_printk(KERN_ERR, scmd->device, 3184 "scsi_dma_map failed: request for %d bytes!\n", 3185 scsi_bufflen(scmd)); 3186 return -ENOMEM; 3187 } 3188 if (sges_left > MPI3MR_SG_DEPTH) { 3189 sdev_printk(KERN_ERR, scmd->device, 3190 "scsi_dma_map returned unsupported sge count %d!\n", 3191 sges_left); 3192 return -ENOMEM; 3193 } 3194 3195 sges_in_segment = (mrioc->facts.op_req_sz - 3196 offsetof(struct mpi3_scsi_io_request, sgl)) / sizeof(struct mpi3_sge_common); 3197 3198 if (scsiio_req->sgl[0].eedp.flags == 3199 MPI3_SGE_FLAGS_ELEMENT_TYPE_EXTENDED && !meta_sg) { 3200 sg_local += sizeof(struct mpi3_sge_common); 3201 sges_in_segment--; 3202 /* Reserve 1st segment (scsiio_req->sgl[0]) for eedp */ 3203 } 3204 3205 if (scsiio_req->msg_flags == 3206 MPI3_SCSIIO_MSGFLAGS_METASGL_VALID && !meta_sg) { 3207 sges_in_segment--; 3208 /* Reserve last segment (scsiio_req->sgl[3]) for meta sg */ 3209 } 3210 3211 if (meta_sg) 3212 sges_in_segment = 1; 3213 3214 if (sges_left <= sges_in_segment) 3215 goto fill_in_last_segment; 3216 3217 /* fill in main message segment when there is a chain following */ 3218 while (sges_in_segment > 1) { 3219 mpi3mr_add_sg_single(sg_local, simple_sgl_flags, 3220 sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); 3221 sg_scmd = sg_next(sg_scmd); 3222 sg_local += sizeof(struct mpi3_sge_common); 3223 sges_left--; 3224 sges_in_segment--; 3225 } 3226 3227 chain_idx = mpi3mr_get_chain_idx(mrioc); 3228 if (chain_idx < 0) 3229 return -1; 3230 chain_req = &mrioc->chain_sgl_list[chain_idx]; 3231 if (meta_sg) 3232 priv->meta_chain_idx = chain_idx; 3233 else 3234 priv->chain_idx = chain_idx; 3235 3236 chain = chain_req->addr; 3237 chain_dma = chain_req->dma_addr; 3238 sges_in_segment = sges_left; 3239 chain_length = sges_in_segment * sizeof(struct mpi3_sge_common); 3240 3241 mpi3mr_add_sg_single(sg_local, last_chain_sgl_flags, 3242 chain_length, chain_dma); 3243 3244 sg_local = chain; 3245 3246 fill_in_last_segment: 3247 while (sges_left > 0) { 3248 if (sges_left == 1) 3249 mpi3mr_add_sg_single(sg_local, 3250 simple_sgl_flags_last, sg_dma_len(sg_scmd), 3251 sg_dma_address(sg_scmd)); 3252 else 3253 mpi3mr_add_sg_single(sg_local, simple_sgl_flags, 3254 sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); 3255 sg_scmd = sg_next(sg_scmd); 3256 sg_local += sizeof(struct mpi3_sge_common); 3257 sges_left--; 3258 } 3259 3260 return 0; 3261 } 3262 3263 /** 3264 * mpi3mr_build_sg_scmd - build scatter gather list for SCSI IO 3265 * @mrioc: Adapter instance reference 3266 * @scmd: SCSI command reference 3267 * @scsiio_req: MPI3 SCSI IO request 3268 * 3269 * This function calls mpi3mr_prepare_sg_scmd for constructing 3270 * both data SGEs and protection information SGEs in the MPI 3271 * format from the SCSI Command as appropriate . 3272 * 3273 * Return: return value of mpi3mr_prepare_sg_scmd. 3274 */ 3275 static int mpi3mr_build_sg_scmd(struct mpi3mr_ioc *mrioc, 3276 struct scsi_cmnd *scmd, struct mpi3_scsi_io_request *scsiio_req) 3277 { 3278 int ret; 3279 3280 ret = mpi3mr_prepare_sg_scmd(mrioc, scmd, scsiio_req); 3281 if (ret) 3282 return ret; 3283 3284 if (scsiio_req->msg_flags == MPI3_SCSIIO_MSGFLAGS_METASGL_VALID) { 3285 /* There is a valid meta sg */ 3286 scsiio_req->flags |= 3287 cpu_to_le32(MPI3_SCSIIO_FLAGS_DMAOPERATION_HOST_PI); 3288 ret = mpi3mr_prepare_sg_scmd(mrioc, scmd, scsiio_req); 3289 } 3290 3291 return ret; 3292 } 3293 3294 /** 3295 * mpi3mr_tm_response_name - get TM response as a string 3296 * @resp_code: TM response code 3297 * 3298 * Convert known task management response code as a readable 3299 * string. 3300 * 3301 * Return: response code string. 3302 */ 3303 static const char *mpi3mr_tm_response_name(u8 resp_code) 3304 { 3305 char *desc; 3306 3307 switch (resp_code) { 3308 case MPI3_SCSITASKMGMT_RSPCODE_TM_COMPLETE: 3309 desc = "task management request completed"; 3310 break; 3311 case MPI3_SCSITASKMGMT_RSPCODE_INVALID_FRAME: 3312 desc = "invalid frame"; 3313 break; 3314 case MPI3_SCSITASKMGMT_RSPCODE_TM_FUNCTION_NOT_SUPPORTED: 3315 desc = "task management request not supported"; 3316 break; 3317 case MPI3_SCSITASKMGMT_RSPCODE_TM_FAILED: 3318 desc = "task management request failed"; 3319 break; 3320 case MPI3_SCSITASKMGMT_RSPCODE_TM_SUCCEEDED: 3321 desc = "task management request succeeded"; 3322 break; 3323 case MPI3_SCSITASKMGMT_RSPCODE_TM_INVALID_LUN: 3324 desc = "invalid LUN"; 3325 break; 3326 case MPI3_SCSITASKMGMT_RSPCODE_TM_OVERLAPPED_TAG: 3327 desc = "overlapped tag attempted"; 3328 break; 3329 case MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC: 3330 desc = "task queued, however not sent to target"; 3331 break; 3332 case MPI3_SCSITASKMGMT_RSPCODE_TM_NVME_DENIED: 3333 desc = "task management request denied by NVMe device"; 3334 break; 3335 default: 3336 desc = "unknown"; 3337 break; 3338 } 3339 3340 return desc; 3341 } 3342 3343 inline void mpi3mr_poll_pend_io_completions(struct mpi3mr_ioc *mrioc) 3344 { 3345 int i; 3346 int num_of_reply_queues = 3347 mrioc->num_op_reply_q + mrioc->op_reply_q_offset; 3348 3349 for (i = mrioc->op_reply_q_offset; i < num_of_reply_queues; i++) 3350 mpi3mr_process_op_reply_q(mrioc, 3351 mrioc->intr_info[i].op_reply_q); 3352 } 3353 3354 /** 3355 * mpi3mr_issue_tm - Issue Task Management request 3356 * @mrioc: Adapter instance reference 3357 * @tm_type: Task Management type 3358 * @handle: Device handle 3359 * @lun: lun ID 3360 * @htag: Host tag of the TM request 3361 * @timeout: TM timeout value 3362 * @drv_cmd: Internal command tracker 3363 * @resp_code: Response code place holder 3364 * @scmd: SCSI command 3365 * 3366 * Issues a Task Management Request to the controller for a 3367 * specified target, lun and command and wait for its completion 3368 * and check TM response. Recover the TM if it timed out by 3369 * issuing controller reset. 3370 * 3371 * Return: 0 on success, non-zero on errors 3372 */ 3373 int mpi3mr_issue_tm(struct mpi3mr_ioc *mrioc, u8 tm_type, 3374 u16 handle, uint lun, u16 htag, ulong timeout, 3375 struct mpi3mr_drv_cmd *drv_cmd, 3376 u8 *resp_code, struct scsi_cmnd *scmd) 3377 { 3378 struct mpi3_scsi_task_mgmt_request tm_req; 3379 struct mpi3_scsi_task_mgmt_reply *tm_reply = NULL; 3380 int retval = 0; 3381 struct mpi3mr_tgt_dev *tgtdev = NULL; 3382 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL; 3383 struct scmd_priv *cmd_priv = NULL; 3384 struct scsi_device *sdev = NULL; 3385 struct mpi3mr_sdev_priv_data *sdev_priv_data = NULL; 3386 3387 ioc_info(mrioc, "%s :Issue TM: TM type (0x%x) for devhandle 0x%04x\n", 3388 __func__, tm_type, handle); 3389 if (mrioc->unrecoverable) { 3390 retval = -1; 3391 ioc_err(mrioc, "%s :Issue TM: Unrecoverable controller\n", 3392 __func__); 3393 goto out; 3394 } 3395 3396 memset(&tm_req, 0, sizeof(tm_req)); 3397 mutex_lock(&drv_cmd->mutex); 3398 if (drv_cmd->state & MPI3MR_CMD_PENDING) { 3399 retval = -1; 3400 ioc_err(mrioc, "%s :Issue TM: Command is in use\n", __func__); 3401 mutex_unlock(&drv_cmd->mutex); 3402 goto out; 3403 } 3404 if (mrioc->reset_in_progress) { 3405 retval = -1; 3406 ioc_err(mrioc, "%s :Issue TM: Reset in progress\n", __func__); 3407 mutex_unlock(&drv_cmd->mutex); 3408 goto out; 3409 } 3410 3411 drv_cmd->state = MPI3MR_CMD_PENDING; 3412 drv_cmd->is_waiting = 1; 3413 drv_cmd->callback = NULL; 3414 tm_req.dev_handle = cpu_to_le16(handle); 3415 tm_req.task_type = tm_type; 3416 tm_req.host_tag = cpu_to_le16(htag); 3417 3418 int_to_scsilun(lun, (struct scsi_lun *)tm_req.lun); 3419 tm_req.function = MPI3_FUNCTION_SCSI_TASK_MGMT; 3420 3421 tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, handle); 3422 3423 if (scmd) { 3424 sdev = scmd->device; 3425 sdev_priv_data = sdev->hostdata; 3426 scsi_tgt_priv_data = ((sdev_priv_data) ? 3427 sdev_priv_data->tgt_priv_data : NULL); 3428 } else { 3429 if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata) 3430 scsi_tgt_priv_data = (struct mpi3mr_stgt_priv_data *) 3431 tgtdev->starget->hostdata; 3432 } 3433 3434 if (scsi_tgt_priv_data) 3435 atomic_inc(&scsi_tgt_priv_data->block_io); 3436 3437 if (tgtdev && (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_PCIE)) { 3438 if (cmd_priv && tgtdev->dev_spec.pcie_inf.abort_to) 3439 timeout = tgtdev->dev_spec.pcie_inf.abort_to; 3440 else if (!cmd_priv && tgtdev->dev_spec.pcie_inf.reset_to) 3441 timeout = tgtdev->dev_spec.pcie_inf.reset_to; 3442 } 3443 3444 init_completion(&drv_cmd->done); 3445 retval = mpi3mr_admin_request_post(mrioc, &tm_req, sizeof(tm_req), 1); 3446 if (retval) { 3447 ioc_err(mrioc, "%s :Issue TM: Admin Post failed\n", __func__); 3448 goto out_unlock; 3449 } 3450 wait_for_completion_timeout(&drv_cmd->done, (timeout * HZ)); 3451 3452 if (!(drv_cmd->state & MPI3MR_CMD_COMPLETE)) { 3453 drv_cmd->is_waiting = 0; 3454 retval = -1; 3455 if (!(drv_cmd->state & MPI3MR_CMD_RESET)) { 3456 dprint_tm(mrioc, 3457 "task management request timed out after %ld seconds\n", 3458 timeout); 3459 if (mrioc->logging_level & MPI3_DEBUG_TM) 3460 dprint_dump_req(&tm_req, sizeof(tm_req)/4); 3461 mpi3mr_soft_reset_handler(mrioc, 3462 MPI3MR_RESET_FROM_TM_TIMEOUT, 1); 3463 } 3464 goto out_unlock; 3465 } 3466 3467 if (!(drv_cmd->state & MPI3MR_CMD_REPLY_VALID)) { 3468 dprint_tm(mrioc, "invalid task management reply message\n"); 3469 retval = -1; 3470 goto out_unlock; 3471 } 3472 3473 tm_reply = (struct mpi3_scsi_task_mgmt_reply *)drv_cmd->reply; 3474 3475 switch (drv_cmd->ioc_status) { 3476 case MPI3_IOCSTATUS_SUCCESS: 3477 *resp_code = le32_to_cpu(tm_reply->response_data) & 3478 MPI3MR_RI_MASK_RESPCODE; 3479 break; 3480 case MPI3_IOCSTATUS_SCSI_IOC_TERMINATED: 3481 *resp_code = MPI3_SCSITASKMGMT_RSPCODE_TM_COMPLETE; 3482 break; 3483 default: 3484 dprint_tm(mrioc, 3485 "task management request to handle(0x%04x) is failed with ioc_status(0x%04x) log_info(0x%08x)\n", 3486 handle, drv_cmd->ioc_status, drv_cmd->ioc_loginfo); 3487 retval = -1; 3488 goto out_unlock; 3489 } 3490 3491 switch (*resp_code) { 3492 case MPI3_SCSITASKMGMT_RSPCODE_TM_SUCCEEDED: 3493 case MPI3_SCSITASKMGMT_RSPCODE_TM_COMPLETE: 3494 break; 3495 case MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC: 3496 if (tm_type != MPI3_SCSITASKMGMT_TASKTYPE_QUERY_TASK) 3497 retval = -1; 3498 break; 3499 default: 3500 retval = -1; 3501 break; 3502 } 3503 3504 dprint_tm(mrioc, 3505 "task management request type(%d) completed for handle(0x%04x) with ioc_status(0x%04x), log_info(0x%08x), termination_count(%d), response:%s(0x%x)\n", 3506 tm_type, handle, drv_cmd->ioc_status, drv_cmd->ioc_loginfo, 3507 le32_to_cpu(tm_reply->termination_count), 3508 mpi3mr_tm_response_name(*resp_code), *resp_code); 3509 3510 if (!retval) { 3511 mpi3mr_ioc_disable_intr(mrioc); 3512 mpi3mr_poll_pend_io_completions(mrioc); 3513 mpi3mr_ioc_enable_intr(mrioc); 3514 mpi3mr_poll_pend_io_completions(mrioc); 3515 } 3516 switch (tm_type) { 3517 case MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET: 3518 if (!scsi_tgt_priv_data) 3519 break; 3520 scsi_tgt_priv_data->pend_count = 0; 3521 blk_mq_tagset_busy_iter(&mrioc->shost->tag_set, 3522 mpi3mr_count_tgt_pending, 3523 (void *)scsi_tgt_priv_data->starget); 3524 break; 3525 case MPI3_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET: 3526 if (!sdev_priv_data) 3527 break; 3528 sdev_priv_data->pend_count = 0; 3529 blk_mq_tagset_busy_iter(&mrioc->shost->tag_set, 3530 mpi3mr_count_dev_pending, (void *)sdev); 3531 break; 3532 default: 3533 break; 3534 } 3535 3536 out_unlock: 3537 drv_cmd->state = MPI3MR_CMD_NOTUSED; 3538 mutex_unlock(&drv_cmd->mutex); 3539 if (scsi_tgt_priv_data) 3540 atomic_dec_if_positive(&scsi_tgt_priv_data->block_io); 3541 if (tgtdev) 3542 mpi3mr_tgtdev_put(tgtdev); 3543 out: 3544 return retval; 3545 } 3546 3547 /** 3548 * mpi3mr_bios_param - BIOS param callback 3549 * @sdev: SCSI device reference 3550 * @bdev: Block device reference 3551 * @capacity: Capacity in logical sectors 3552 * @params: Parameter array 3553 * 3554 * Just the parameters with heads/secots/cylinders. 3555 * 3556 * Return: 0 always 3557 */ 3558 static int mpi3mr_bios_param(struct scsi_device *sdev, 3559 struct block_device *bdev, sector_t capacity, int params[]) 3560 { 3561 int heads; 3562 int sectors; 3563 sector_t cylinders; 3564 ulong dummy; 3565 3566 heads = 64; 3567 sectors = 32; 3568 3569 dummy = heads * sectors; 3570 cylinders = capacity; 3571 sector_div(cylinders, dummy); 3572 3573 if ((ulong)capacity >= 0x200000) { 3574 heads = 255; 3575 sectors = 63; 3576 dummy = heads * sectors; 3577 cylinders = capacity; 3578 sector_div(cylinders, dummy); 3579 } 3580 3581 params[0] = heads; 3582 params[1] = sectors; 3583 params[2] = cylinders; 3584 return 0; 3585 } 3586 3587 /** 3588 * mpi3mr_map_queues - Map queues callback handler 3589 * @shost: SCSI host reference 3590 * 3591 * Maps default and poll queues. 3592 * 3593 * Return: return zero. 3594 */ 3595 static int mpi3mr_map_queues(struct Scsi_Host *shost) 3596 { 3597 struct mpi3mr_ioc *mrioc = shost_priv(shost); 3598 int i, qoff, offset; 3599 struct blk_mq_queue_map *map = NULL; 3600 3601 offset = mrioc->op_reply_q_offset; 3602 3603 for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) { 3604 map = &shost->tag_set.map[i]; 3605 3606 map->nr_queues = 0; 3607 3608 if (i == HCTX_TYPE_DEFAULT) 3609 map->nr_queues = mrioc->default_qcount; 3610 else if (i == HCTX_TYPE_POLL) 3611 map->nr_queues = mrioc->active_poll_qcount; 3612 3613 if (!map->nr_queues) { 3614 BUG_ON(i == HCTX_TYPE_DEFAULT); 3615 continue; 3616 } 3617 3618 /* 3619 * The poll queue(s) doesn't have an IRQ (and hence IRQ 3620 * affinity), so use the regular blk-mq cpu mapping 3621 */ 3622 map->queue_offset = qoff; 3623 if (i != HCTX_TYPE_POLL) 3624 blk_mq_pci_map_queues(map, mrioc->pdev, offset); 3625 else 3626 blk_mq_map_queues(map); 3627 3628 qoff += map->nr_queues; 3629 offset += map->nr_queues; 3630 } 3631 3632 return 0; 3633 3634 } 3635 3636 /** 3637 * mpi3mr_get_fw_pending_ios - Calculate pending I/O count 3638 * @mrioc: Adapter instance reference 3639 * 3640 * Calculate the pending I/Os for the controller and return. 3641 * 3642 * Return: Number of pending I/Os 3643 */ 3644 static inline int mpi3mr_get_fw_pending_ios(struct mpi3mr_ioc *mrioc) 3645 { 3646 u16 i; 3647 uint pend_ios = 0; 3648 3649 for (i = 0; i < mrioc->num_op_reply_q; i++) 3650 pend_ios += atomic_read(&mrioc->op_reply_qinfo[i].pend_ios); 3651 return pend_ios; 3652 } 3653 3654 /** 3655 * mpi3mr_print_pending_host_io - print pending I/Os 3656 * @mrioc: Adapter instance reference 3657 * 3658 * Print number of pending I/Os and each I/O details prior to 3659 * reset for debug purpose. 3660 * 3661 * Return: Nothing 3662 */ 3663 static void mpi3mr_print_pending_host_io(struct mpi3mr_ioc *mrioc) 3664 { 3665 struct Scsi_Host *shost = mrioc->shost; 3666 3667 ioc_info(mrioc, "%s :Pending commands prior to reset: %d\n", 3668 __func__, mpi3mr_get_fw_pending_ios(mrioc)); 3669 blk_mq_tagset_busy_iter(&shost->tag_set, 3670 mpi3mr_print_scmd, (void *)mrioc); 3671 } 3672 3673 /** 3674 * mpi3mr_wait_for_host_io - block for I/Os to complete 3675 * @mrioc: Adapter instance reference 3676 * @timeout: time out in seconds 3677 * Waits for pending I/Os for the given adapter to complete or 3678 * to hit the timeout. 3679 * 3680 * Return: Nothing 3681 */ 3682 void mpi3mr_wait_for_host_io(struct mpi3mr_ioc *mrioc, u32 timeout) 3683 { 3684 enum mpi3mr_iocstate iocstate; 3685 int i = 0; 3686 3687 iocstate = mpi3mr_get_iocstate(mrioc); 3688 if (iocstate != MRIOC_STATE_READY) 3689 return; 3690 3691 if (!mpi3mr_get_fw_pending_ios(mrioc)) 3692 return; 3693 ioc_info(mrioc, 3694 "%s :Waiting for %d seconds prior to reset for %d I/O\n", 3695 __func__, timeout, mpi3mr_get_fw_pending_ios(mrioc)); 3696 3697 for (i = 0; i < timeout; i++) { 3698 if (!mpi3mr_get_fw_pending_ios(mrioc)) 3699 break; 3700 iocstate = mpi3mr_get_iocstate(mrioc); 3701 if (iocstate != MRIOC_STATE_READY) 3702 break; 3703 msleep(1000); 3704 } 3705 3706 ioc_info(mrioc, "%s :Pending I/Os after wait is: %d\n", __func__, 3707 mpi3mr_get_fw_pending_ios(mrioc)); 3708 } 3709 3710 /** 3711 * mpi3mr_eh_host_reset - Host reset error handling callback 3712 * @scmd: SCSI command reference 3713 * 3714 * Issue controller reset if the scmd is for a Physical Device, 3715 * if the scmd is for RAID volume, then wait for 3716 * MPI3MR_RAID_ERRREC_RESET_TIMEOUT and checke whether any 3717 * pending I/Os prior to issuing reset to the controller. 3718 * 3719 * Return: SUCCESS of successful reset else FAILED 3720 */ 3721 static int mpi3mr_eh_host_reset(struct scsi_cmnd *scmd) 3722 { 3723 struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); 3724 struct mpi3mr_stgt_priv_data *stgt_priv_data; 3725 struct mpi3mr_sdev_priv_data *sdev_priv_data; 3726 u8 dev_type = MPI3_DEVICE_DEVFORM_VD; 3727 int retval = FAILED, ret; 3728 3729 sdev_priv_data = scmd->device->hostdata; 3730 if (sdev_priv_data && sdev_priv_data->tgt_priv_data) { 3731 stgt_priv_data = sdev_priv_data->tgt_priv_data; 3732 dev_type = stgt_priv_data->dev_type; 3733 } 3734 3735 if (dev_type == MPI3_DEVICE_DEVFORM_VD) { 3736 mpi3mr_wait_for_host_io(mrioc, 3737 MPI3MR_RAID_ERRREC_RESET_TIMEOUT); 3738 if (!mpi3mr_get_fw_pending_ios(mrioc)) { 3739 retval = SUCCESS; 3740 goto out; 3741 } 3742 } 3743 3744 mpi3mr_print_pending_host_io(mrioc); 3745 ret = mpi3mr_soft_reset_handler(mrioc, 3746 MPI3MR_RESET_FROM_EH_HOS, 1); 3747 if (ret) 3748 goto out; 3749 3750 retval = SUCCESS; 3751 out: 3752 sdev_printk(KERN_INFO, scmd->device, 3753 "Host reset is %s for scmd(%p)\n", 3754 ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); 3755 3756 return retval; 3757 } 3758 3759 /** 3760 * mpi3mr_eh_target_reset - Target reset error handling callback 3761 * @scmd: SCSI command reference 3762 * 3763 * Issue Target reset Task Management and verify the scmd is 3764 * terminated successfully and return status accordingly. 3765 * 3766 * Return: SUCCESS of successful termination of the scmd else 3767 * FAILED 3768 */ 3769 static int mpi3mr_eh_target_reset(struct scsi_cmnd *scmd) 3770 { 3771 struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); 3772 struct mpi3mr_stgt_priv_data *stgt_priv_data; 3773 struct mpi3mr_sdev_priv_data *sdev_priv_data; 3774 u16 dev_handle; 3775 u8 resp_code = 0; 3776 int retval = FAILED, ret = 0; 3777 3778 sdev_printk(KERN_INFO, scmd->device, 3779 "Attempting Target Reset! scmd(%p)\n", scmd); 3780 scsi_print_command(scmd); 3781 3782 sdev_priv_data = scmd->device->hostdata; 3783 if (!sdev_priv_data || !sdev_priv_data->tgt_priv_data) { 3784 sdev_printk(KERN_INFO, scmd->device, 3785 "SCSI device is not available\n"); 3786 retval = SUCCESS; 3787 goto out; 3788 } 3789 3790 stgt_priv_data = sdev_priv_data->tgt_priv_data; 3791 dev_handle = stgt_priv_data->dev_handle; 3792 if (stgt_priv_data->dev_removed) { 3793 sdev_printk(KERN_INFO, scmd->device, 3794 "%s:target(handle = 0x%04x) is removed, target reset is not issued\n", 3795 mrioc->name, dev_handle); 3796 retval = FAILED; 3797 goto out; 3798 } 3799 sdev_printk(KERN_INFO, scmd->device, 3800 "Target Reset is issued to handle(0x%04x)\n", 3801 dev_handle); 3802 3803 ret = mpi3mr_issue_tm(mrioc, 3804 MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET, dev_handle, 3805 sdev_priv_data->lun_id, MPI3MR_HOSTTAG_BLK_TMS, 3806 MPI3MR_RESETTM_TIMEOUT, &mrioc->host_tm_cmds, &resp_code, scmd); 3807 3808 if (ret) 3809 goto out; 3810 3811 if (stgt_priv_data->pend_count) { 3812 sdev_printk(KERN_INFO, scmd->device, 3813 "%s: target has %d pending commands, target reset is failed\n", 3814 mrioc->name, stgt_priv_data->pend_count); 3815 goto out; 3816 } 3817 3818 retval = SUCCESS; 3819 out: 3820 sdev_printk(KERN_INFO, scmd->device, 3821 "%s: target reset is %s for scmd(%p)\n", mrioc->name, 3822 ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); 3823 3824 return retval; 3825 } 3826 3827 /** 3828 * mpi3mr_eh_dev_reset- Device reset error handling callback 3829 * @scmd: SCSI command reference 3830 * 3831 * Issue lun reset Task Management and verify the scmd is 3832 * terminated successfully and return status accordingly. 3833 * 3834 * Return: SUCCESS of successful termination of the scmd else 3835 * FAILED 3836 */ 3837 static int mpi3mr_eh_dev_reset(struct scsi_cmnd *scmd) 3838 { 3839 struct mpi3mr_ioc *mrioc = shost_priv(scmd->device->host); 3840 struct mpi3mr_stgt_priv_data *stgt_priv_data; 3841 struct mpi3mr_sdev_priv_data *sdev_priv_data; 3842 u16 dev_handle; 3843 u8 resp_code = 0; 3844 int retval = FAILED, ret = 0; 3845 3846 sdev_printk(KERN_INFO, scmd->device, 3847 "Attempting Device(lun) Reset! scmd(%p)\n", scmd); 3848 scsi_print_command(scmd); 3849 3850 sdev_priv_data = scmd->device->hostdata; 3851 if (!sdev_priv_data || !sdev_priv_data->tgt_priv_data) { 3852 sdev_printk(KERN_INFO, scmd->device, 3853 "SCSI device is not available\n"); 3854 retval = SUCCESS; 3855 goto out; 3856 } 3857 3858 stgt_priv_data = sdev_priv_data->tgt_priv_data; 3859 dev_handle = stgt_priv_data->dev_handle; 3860 if (stgt_priv_data->dev_removed) { 3861 sdev_printk(KERN_INFO, scmd->device, 3862 "%s: device(handle = 0x%04x) is removed, device(LUN) reset is not issued\n", 3863 mrioc->name, dev_handle); 3864 retval = FAILED; 3865 goto out; 3866 } 3867 sdev_printk(KERN_INFO, scmd->device, 3868 "Device(lun) Reset is issued to handle(0x%04x)\n", dev_handle); 3869 3870 ret = mpi3mr_issue_tm(mrioc, 3871 MPI3_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, dev_handle, 3872 sdev_priv_data->lun_id, MPI3MR_HOSTTAG_BLK_TMS, 3873 MPI3MR_RESETTM_TIMEOUT, &mrioc->host_tm_cmds, &resp_code, scmd); 3874 3875 if (ret) 3876 goto out; 3877 3878 if (sdev_priv_data->pend_count) { 3879 sdev_printk(KERN_INFO, scmd->device, 3880 "%s: device has %d pending commands, device(LUN) reset is failed\n", 3881 mrioc->name, sdev_priv_data->pend_count); 3882 goto out; 3883 } 3884 retval = SUCCESS; 3885 out: 3886 sdev_printk(KERN_INFO, scmd->device, 3887 "%s: device(LUN) reset is %s for scmd(%p)\n", mrioc->name, 3888 ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); 3889 3890 return retval; 3891 } 3892 3893 /** 3894 * mpi3mr_scan_start - Scan start callback handler 3895 * @shost: SCSI host reference 3896 * 3897 * Issue port enable request asynchronously. 3898 * 3899 * Return: Nothing 3900 */ 3901 static void mpi3mr_scan_start(struct Scsi_Host *shost) 3902 { 3903 struct mpi3mr_ioc *mrioc = shost_priv(shost); 3904 3905 mrioc->scan_started = 1; 3906 ioc_info(mrioc, "%s :Issuing Port Enable\n", __func__); 3907 if (mpi3mr_issue_port_enable(mrioc, 1)) { 3908 ioc_err(mrioc, "%s :Issuing port enable failed\n", __func__); 3909 mrioc->scan_started = 0; 3910 mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR; 3911 } 3912 } 3913 3914 /** 3915 * mpi3mr_scan_finished - Scan finished callback handler 3916 * @shost: SCSI host reference 3917 * @time: Jiffies from the scan start 3918 * 3919 * Checks whether the port enable is completed or timedout or 3920 * failed and set the scan status accordingly after taking any 3921 * recovery if required. 3922 * 3923 * Return: 1 on scan finished or timed out, 0 for in progress 3924 */ 3925 static int mpi3mr_scan_finished(struct Scsi_Host *shost, 3926 unsigned long time) 3927 { 3928 struct mpi3mr_ioc *mrioc = shost_priv(shost); 3929 u32 pe_timeout = MPI3MR_PORTENABLE_TIMEOUT; 3930 u32 ioc_status = readl(&mrioc->sysif_regs->ioc_status); 3931 3932 if ((ioc_status & MPI3_SYSIF_IOC_STATUS_RESET_HISTORY) || 3933 (ioc_status & MPI3_SYSIF_IOC_STATUS_FAULT)) { 3934 ioc_err(mrioc, "port enable failed due to fault or reset\n"); 3935 mpi3mr_print_fault_info(mrioc); 3936 mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR; 3937 mrioc->scan_started = 0; 3938 mrioc->init_cmds.is_waiting = 0; 3939 mrioc->init_cmds.callback = NULL; 3940 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; 3941 } 3942 3943 if (time >= (pe_timeout * HZ)) { 3944 ioc_err(mrioc, "port enable failed due to time out\n"); 3945 mpi3mr_check_rh_fault_ioc(mrioc, 3946 MPI3MR_RESET_FROM_PE_TIMEOUT); 3947 mrioc->scan_failed = MPI3_IOCSTATUS_INTERNAL_ERROR; 3948 mrioc->scan_started = 0; 3949 mrioc->init_cmds.is_waiting = 0; 3950 mrioc->init_cmds.callback = NULL; 3951 mrioc->init_cmds.state = MPI3MR_CMD_NOTUSED; 3952 } 3953 3954 if (mrioc->scan_started) 3955 return 0; 3956 3957 if (mrioc->scan_failed) { 3958 ioc_err(mrioc, 3959 "port enable failed with status=0x%04x\n", 3960 mrioc->scan_failed); 3961 } else 3962 ioc_info(mrioc, "port enable is successfully completed\n"); 3963 3964 mpi3mr_start_watchdog(mrioc); 3965 mrioc->is_driver_loading = 0; 3966 mrioc->stop_bsgs = 0; 3967 return 1; 3968 } 3969 3970 /** 3971 * mpi3mr_slave_destroy - Slave destroy callback handler 3972 * @sdev: SCSI device reference 3973 * 3974 * Cleanup and free per device(lun) private data. 3975 * 3976 * Return: Nothing. 3977 */ 3978 static void mpi3mr_slave_destroy(struct scsi_device *sdev) 3979 { 3980 struct Scsi_Host *shost; 3981 struct mpi3mr_ioc *mrioc; 3982 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data; 3983 struct mpi3mr_tgt_dev *tgt_dev; 3984 unsigned long flags; 3985 struct scsi_target *starget; 3986 3987 if (!sdev->hostdata) 3988 return; 3989 3990 starget = scsi_target(sdev); 3991 shost = dev_to_shost(&starget->dev); 3992 mrioc = shost_priv(shost); 3993 scsi_tgt_priv_data = starget->hostdata; 3994 3995 scsi_tgt_priv_data->num_luns--; 3996 3997 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 3998 tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); 3999 if (tgt_dev && (!scsi_tgt_priv_data->num_luns)) 4000 tgt_dev->starget = NULL; 4001 if (tgt_dev) 4002 mpi3mr_tgtdev_put(tgt_dev); 4003 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4004 4005 kfree(sdev->hostdata); 4006 sdev->hostdata = NULL; 4007 } 4008 4009 /** 4010 * mpi3mr_target_destroy - Target destroy callback handler 4011 * @starget: SCSI target reference 4012 * 4013 * Cleanup and free per target private data. 4014 * 4015 * Return: Nothing. 4016 */ 4017 static void mpi3mr_target_destroy(struct scsi_target *starget) 4018 { 4019 struct Scsi_Host *shost; 4020 struct mpi3mr_ioc *mrioc; 4021 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data; 4022 struct mpi3mr_tgt_dev *tgt_dev; 4023 unsigned long flags; 4024 4025 if (!starget->hostdata) 4026 return; 4027 4028 shost = dev_to_shost(&starget->dev); 4029 mrioc = shost_priv(shost); 4030 scsi_tgt_priv_data = starget->hostdata; 4031 4032 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 4033 tgt_dev = __mpi3mr_get_tgtdev_from_tgtpriv(mrioc, scsi_tgt_priv_data); 4034 if (tgt_dev && (tgt_dev->starget == starget) && 4035 (tgt_dev->perst_id == starget->id)) 4036 tgt_dev->starget = NULL; 4037 if (tgt_dev) { 4038 scsi_tgt_priv_data->tgt_dev = NULL; 4039 scsi_tgt_priv_data->perst_id = 0; 4040 mpi3mr_tgtdev_put(tgt_dev); 4041 mpi3mr_tgtdev_put(tgt_dev); 4042 } 4043 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4044 4045 kfree(starget->hostdata); 4046 starget->hostdata = NULL; 4047 } 4048 4049 /** 4050 * mpi3mr_slave_configure - Slave configure callback handler 4051 * @sdev: SCSI device reference 4052 * 4053 * Configure queue depth, max hardware sectors and virt boundary 4054 * as required 4055 * 4056 * Return: 0 always. 4057 */ 4058 static int mpi3mr_slave_configure(struct scsi_device *sdev) 4059 { 4060 struct scsi_target *starget; 4061 struct Scsi_Host *shost; 4062 struct mpi3mr_ioc *mrioc; 4063 struct mpi3mr_tgt_dev *tgt_dev; 4064 unsigned long flags; 4065 int retval = 0; 4066 4067 starget = scsi_target(sdev); 4068 shost = dev_to_shost(&starget->dev); 4069 mrioc = shost_priv(shost); 4070 4071 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 4072 tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); 4073 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4074 if (!tgt_dev) 4075 return -ENXIO; 4076 4077 mpi3mr_change_queue_depth(sdev, tgt_dev->q_depth); 4078 4079 sdev->eh_timeout = MPI3MR_EH_SCMD_TIMEOUT; 4080 blk_queue_rq_timeout(sdev->request_queue, MPI3MR_SCMD_TIMEOUT); 4081 4082 switch (tgt_dev->dev_type) { 4083 case MPI3_DEVICE_DEVFORM_PCIE: 4084 /*The block layer hw sector size = 512*/ 4085 if ((tgt_dev->dev_spec.pcie_inf.dev_info & 4086 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) == 4087 MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_NVME_DEVICE) { 4088 blk_queue_max_hw_sectors(sdev->request_queue, 4089 tgt_dev->dev_spec.pcie_inf.mdts / 512); 4090 if (tgt_dev->dev_spec.pcie_inf.pgsz == 0) 4091 blk_queue_virt_boundary(sdev->request_queue, 4092 ((1 << MPI3MR_DEFAULT_PGSZEXP) - 1)); 4093 else 4094 blk_queue_virt_boundary(sdev->request_queue, 4095 ((1 << tgt_dev->dev_spec.pcie_inf.pgsz) - 1)); 4096 } 4097 break; 4098 default: 4099 break; 4100 } 4101 4102 mpi3mr_tgtdev_put(tgt_dev); 4103 4104 return retval; 4105 } 4106 4107 /** 4108 * mpi3mr_slave_alloc -Slave alloc callback handler 4109 * @sdev: SCSI device reference 4110 * 4111 * Allocate per device(lun) private data and initialize it. 4112 * 4113 * Return: 0 on success -ENOMEM on memory allocation failure. 4114 */ 4115 static int mpi3mr_slave_alloc(struct scsi_device *sdev) 4116 { 4117 struct Scsi_Host *shost; 4118 struct mpi3mr_ioc *mrioc; 4119 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data; 4120 struct mpi3mr_tgt_dev *tgt_dev; 4121 struct mpi3mr_sdev_priv_data *scsi_dev_priv_data; 4122 unsigned long flags; 4123 struct scsi_target *starget; 4124 int retval = 0; 4125 4126 starget = scsi_target(sdev); 4127 shost = dev_to_shost(&starget->dev); 4128 mrioc = shost_priv(shost); 4129 scsi_tgt_priv_data = starget->hostdata; 4130 4131 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 4132 tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); 4133 4134 if (tgt_dev) { 4135 if (tgt_dev->starget == NULL) 4136 tgt_dev->starget = starget; 4137 mpi3mr_tgtdev_put(tgt_dev); 4138 retval = 0; 4139 } else { 4140 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4141 return -ENXIO; 4142 } 4143 4144 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4145 4146 scsi_dev_priv_data = kzalloc(sizeof(*scsi_dev_priv_data), GFP_KERNEL); 4147 if (!scsi_dev_priv_data) 4148 return -ENOMEM; 4149 4150 scsi_dev_priv_data->lun_id = sdev->lun; 4151 scsi_dev_priv_data->tgt_priv_data = scsi_tgt_priv_data; 4152 sdev->hostdata = scsi_dev_priv_data; 4153 4154 scsi_tgt_priv_data->num_luns++; 4155 4156 return retval; 4157 } 4158 4159 /** 4160 * mpi3mr_target_alloc - Target alloc callback handler 4161 * @starget: SCSI target reference 4162 * 4163 * Allocate per target private data and initialize it. 4164 * 4165 * Return: 0 on success -ENOMEM on memory allocation failure. 4166 */ 4167 static int mpi3mr_target_alloc(struct scsi_target *starget) 4168 { 4169 struct Scsi_Host *shost = dev_to_shost(&starget->dev); 4170 struct mpi3mr_ioc *mrioc = shost_priv(shost); 4171 struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data; 4172 struct mpi3mr_tgt_dev *tgt_dev; 4173 unsigned long flags; 4174 int retval = 0; 4175 4176 scsi_tgt_priv_data = kzalloc(sizeof(*scsi_tgt_priv_data), GFP_KERNEL); 4177 if (!scsi_tgt_priv_data) 4178 return -ENOMEM; 4179 4180 starget->hostdata = scsi_tgt_priv_data; 4181 4182 spin_lock_irqsave(&mrioc->tgtdev_lock, flags); 4183 tgt_dev = __mpi3mr_get_tgtdev_by_perst_id(mrioc, starget->id); 4184 if (tgt_dev && !tgt_dev->is_hidden) { 4185 scsi_tgt_priv_data->starget = starget; 4186 scsi_tgt_priv_data->dev_handle = tgt_dev->dev_handle; 4187 scsi_tgt_priv_data->perst_id = tgt_dev->perst_id; 4188 scsi_tgt_priv_data->dev_type = tgt_dev->dev_type; 4189 scsi_tgt_priv_data->tgt_dev = tgt_dev; 4190 tgt_dev->starget = starget; 4191 atomic_set(&scsi_tgt_priv_data->block_io, 0); 4192 retval = 0; 4193 scsi_tgt_priv_data->io_throttle_enabled = 4194 tgt_dev->io_throttle_enabled; 4195 if (tgt_dev->dev_type == MPI3_DEVICE_DEVFORM_VD) 4196 scsi_tgt_priv_data->throttle_group = 4197 tgt_dev->dev_spec.vd_inf.tg; 4198 } else 4199 retval = -ENXIO; 4200 spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags); 4201 4202 return retval; 4203 } 4204 4205 /** 4206 * mpi3mr_check_return_unmap - Whether an unmap is allowed 4207 * @mrioc: Adapter instance reference 4208 * @scmd: SCSI Command reference 4209 * 4210 * The controller hardware cannot handle certain unmap commands 4211 * for NVMe drives, this routine checks those and return true 4212 * and completes the SCSI command with proper status and sense 4213 * data. 4214 * 4215 * Return: TRUE for not allowed unmap, FALSE otherwise. 4216 */ 4217 static bool mpi3mr_check_return_unmap(struct mpi3mr_ioc *mrioc, 4218 struct scsi_cmnd *scmd) 4219 { 4220 unsigned char *buf; 4221 u16 param_len, desc_len, trunc_param_len; 4222 4223 trunc_param_len = param_len = get_unaligned_be16(scmd->cmnd + 7); 4224 4225 if (mrioc->pdev->revision) { 4226 if ((param_len > 24) && ((param_len - 8) & 0xF)) { 4227 trunc_param_len -= (param_len - 8) & 0xF; 4228 dprint_scsi_command(mrioc, scmd, MPI3_DEBUG_SCSI_ERROR); 4229 dprint_scsi_err(mrioc, 4230 "truncating param_len from (%d) to (%d)\n", 4231 param_len, trunc_param_len); 4232 put_unaligned_be16(trunc_param_len, scmd->cmnd + 7); 4233 dprint_scsi_command(mrioc, scmd, MPI3_DEBUG_SCSI_ERROR); 4234 } 4235 return false; 4236 } 4237 4238 if (!param_len) { 4239 ioc_warn(mrioc, 4240 "%s: cdb received with zero parameter length\n", 4241 __func__); 4242 scsi_print_command(scmd); 4243 scmd->result = DID_OK << 16; 4244 scsi_done(scmd); 4245 return true; 4246 } 4247 4248 if (param_len < 24) { 4249 ioc_warn(mrioc, 4250 "%s: cdb received with invalid param_len: %d\n", 4251 __func__, param_len); 4252 scsi_print_command(scmd); 4253 scmd->result = SAM_STAT_CHECK_CONDITION; 4254 scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 4255 0x1A, 0); 4256 scsi_done(scmd); 4257 return true; 4258 } 4259 if (param_len != scsi_bufflen(scmd)) { 4260 ioc_warn(mrioc, 4261 "%s: cdb received with param_len: %d bufflen: %d\n", 4262 __func__, param_len, scsi_bufflen(scmd)); 4263 scsi_print_command(scmd); 4264 scmd->result = SAM_STAT_CHECK_CONDITION; 4265 scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 4266 0x1A, 0); 4267 scsi_done(scmd); 4268 return true; 4269 } 4270 buf = kzalloc(scsi_bufflen(scmd), GFP_ATOMIC); 4271 if (!buf) { 4272 scsi_print_command(scmd); 4273 scmd->result = SAM_STAT_CHECK_CONDITION; 4274 scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 4275 0x55, 0x03); 4276 scsi_done(scmd); 4277 return true; 4278 } 4279 scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd)); 4280 desc_len = get_unaligned_be16(&buf[2]); 4281 4282 if (desc_len < 16) { 4283 ioc_warn(mrioc, 4284 "%s: Invalid descriptor length in param list: %d\n", 4285 __func__, desc_len); 4286 scsi_print_command(scmd); 4287 scmd->result = SAM_STAT_CHECK_CONDITION; 4288 scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 4289 0x26, 0); 4290 scsi_done(scmd); 4291 kfree(buf); 4292 return true; 4293 } 4294 4295 if (param_len > (desc_len + 8)) { 4296 trunc_param_len = desc_len + 8; 4297 scsi_print_command(scmd); 4298 dprint_scsi_err(mrioc, 4299 "truncating param_len(%d) to desc_len+8(%d)\n", 4300 param_len, trunc_param_len); 4301 put_unaligned_be16(trunc_param_len, scmd->cmnd + 7); 4302 scsi_print_command(scmd); 4303 } 4304 4305 kfree(buf); 4306 return false; 4307 } 4308 4309 /** 4310 * mpi3mr_allow_scmd_to_fw - Command is allowed during shutdown 4311 * @scmd: SCSI Command reference 4312 * 4313 * Checks whether a cdb is allowed during shutdown or not. 4314 * 4315 * Return: TRUE for allowed commands, FALSE otherwise. 4316 */ 4317 4318 inline bool mpi3mr_allow_scmd_to_fw(struct scsi_cmnd *scmd) 4319 { 4320 switch (scmd->cmnd[0]) { 4321 case SYNCHRONIZE_CACHE: 4322 case START_STOP: 4323 return true; 4324 default: 4325 return false; 4326 } 4327 } 4328 4329 /** 4330 * mpi3mr_qcmd - I/O request despatcher 4331 * @shost: SCSI Host reference 4332 * @scmd: SCSI Command reference 4333 * 4334 * Issues the SCSI Command as an MPI3 request. 4335 * 4336 * Return: 0 on successful queueing of the request or if the 4337 * request is completed with failure. 4338 * SCSI_MLQUEUE_DEVICE_BUSY when the device is busy. 4339 * SCSI_MLQUEUE_HOST_BUSY when the host queue is full. 4340 */ 4341 static int mpi3mr_qcmd(struct Scsi_Host *shost, 4342 struct scsi_cmnd *scmd) 4343 { 4344 struct mpi3mr_ioc *mrioc = shost_priv(shost); 4345 struct mpi3mr_stgt_priv_data *stgt_priv_data; 4346 struct mpi3mr_sdev_priv_data *sdev_priv_data; 4347 struct scmd_priv *scmd_priv_data = NULL; 4348 struct mpi3_scsi_io_request *scsiio_req = NULL; 4349 struct op_req_qinfo *op_req_q = NULL; 4350 int retval = 0; 4351 u16 dev_handle; 4352 u16 host_tag; 4353 u32 scsiio_flags = 0, data_len_blks = 0; 4354 struct request *rq = scsi_cmd_to_rq(scmd); 4355 int iprio_class; 4356 u8 is_pcie_dev = 0; 4357 u32 tracked_io_sz = 0; 4358 u32 ioc_pend_data_len = 0, tg_pend_data_len = 0; 4359 struct mpi3mr_throttle_group_info *tg = NULL; 4360 4361 if (mrioc->unrecoverable) { 4362 scmd->result = DID_ERROR << 16; 4363 scsi_done(scmd); 4364 goto out; 4365 } 4366 4367 sdev_priv_data = scmd->device->hostdata; 4368 if (!sdev_priv_data || !sdev_priv_data->tgt_priv_data) { 4369 scmd->result = DID_NO_CONNECT << 16; 4370 scsi_done(scmd); 4371 goto out; 4372 } 4373 4374 if (mrioc->stop_drv_processing && 4375 !(mpi3mr_allow_scmd_to_fw(scmd))) { 4376 scmd->result = DID_NO_CONNECT << 16; 4377 scsi_done(scmd); 4378 goto out; 4379 } 4380 4381 if (mrioc->reset_in_progress) { 4382 retval = SCSI_MLQUEUE_HOST_BUSY; 4383 goto out; 4384 } 4385 4386 stgt_priv_data = sdev_priv_data->tgt_priv_data; 4387 4388 dev_handle = stgt_priv_data->dev_handle; 4389 if (dev_handle == MPI3MR_INVALID_DEV_HANDLE) { 4390 scmd->result = DID_NO_CONNECT << 16; 4391 scsi_done(scmd); 4392 goto out; 4393 } 4394 if (stgt_priv_data->dev_removed) { 4395 scmd->result = DID_NO_CONNECT << 16; 4396 scsi_done(scmd); 4397 goto out; 4398 } 4399 4400 if (atomic_read(&stgt_priv_data->block_io)) { 4401 if (mrioc->stop_drv_processing) { 4402 scmd->result = DID_NO_CONNECT << 16; 4403 scsi_done(scmd); 4404 goto out; 4405 } 4406 retval = SCSI_MLQUEUE_DEVICE_BUSY; 4407 goto out; 4408 } 4409 4410 if (stgt_priv_data->dev_type == MPI3_DEVICE_DEVFORM_PCIE) 4411 is_pcie_dev = 1; 4412 if ((scmd->cmnd[0] == UNMAP) && is_pcie_dev && 4413 (mrioc->pdev->device == MPI3_MFGPAGE_DEVID_SAS4116) && 4414 mpi3mr_check_return_unmap(mrioc, scmd)) 4415 goto out; 4416 4417 host_tag = mpi3mr_host_tag_for_scmd(mrioc, scmd); 4418 if (host_tag == MPI3MR_HOSTTAG_INVALID) { 4419 scmd->result = DID_ERROR << 16; 4420 scsi_done(scmd); 4421 goto out; 4422 } 4423 4424 if (scmd->sc_data_direction == DMA_FROM_DEVICE) 4425 scsiio_flags = MPI3_SCSIIO_FLAGS_DATADIRECTION_READ; 4426 else if (scmd->sc_data_direction == DMA_TO_DEVICE) 4427 scsiio_flags = MPI3_SCSIIO_FLAGS_DATADIRECTION_WRITE; 4428 else 4429 scsiio_flags = MPI3_SCSIIO_FLAGS_DATADIRECTION_NO_DATA_TRANSFER; 4430 4431 scsiio_flags |= MPI3_SCSIIO_FLAGS_TASKATTRIBUTE_SIMPLEQ; 4432 4433 if (sdev_priv_data->ncq_prio_enable) { 4434 iprio_class = IOPRIO_PRIO_CLASS(req_get_ioprio(rq)); 4435 if (iprio_class == IOPRIO_CLASS_RT) 4436 scsiio_flags |= 1 << MPI3_SCSIIO_FLAGS_CMDPRI_SHIFT; 4437 } 4438 4439 if (scmd->cmd_len > 16) 4440 scsiio_flags |= MPI3_SCSIIO_FLAGS_CDB_GREATER_THAN_16; 4441 4442 scmd_priv_data = scsi_cmd_priv(scmd); 4443 memset(scmd_priv_data->mpi3mr_scsiio_req, 0, MPI3MR_ADMIN_REQ_FRAME_SZ); 4444 scsiio_req = (struct mpi3_scsi_io_request *)scmd_priv_data->mpi3mr_scsiio_req; 4445 scsiio_req->function = MPI3_FUNCTION_SCSI_IO; 4446 scsiio_req->host_tag = cpu_to_le16(host_tag); 4447 4448 mpi3mr_setup_eedp(mrioc, scmd, scsiio_req); 4449 4450 memcpy(scsiio_req->cdb.cdb32, scmd->cmnd, scmd->cmd_len); 4451 scsiio_req->data_length = cpu_to_le32(scsi_bufflen(scmd)); 4452 scsiio_req->dev_handle = cpu_to_le16(dev_handle); 4453 scsiio_req->flags = cpu_to_le32(scsiio_flags); 4454 int_to_scsilun(sdev_priv_data->lun_id, 4455 (struct scsi_lun *)scsiio_req->lun); 4456 4457 if (mpi3mr_build_sg_scmd(mrioc, scmd, scsiio_req)) { 4458 mpi3mr_clear_scmd_priv(mrioc, scmd); 4459 retval = SCSI_MLQUEUE_HOST_BUSY; 4460 goto out; 4461 } 4462 op_req_q = &mrioc->req_qinfo[scmd_priv_data->req_q_idx]; 4463 data_len_blks = scsi_bufflen(scmd) >> 9; 4464 if ((data_len_blks >= mrioc->io_throttle_data_length) && 4465 stgt_priv_data->io_throttle_enabled) { 4466 tracked_io_sz = data_len_blks; 4467 tg = stgt_priv_data->throttle_group; 4468 if (tg) { 4469 ioc_pend_data_len = atomic_add_return(data_len_blks, 4470 &mrioc->pend_large_data_sz); 4471 tg_pend_data_len = atomic_add_return(data_len_blks, 4472 &tg->pend_large_data_sz); 4473 if (!tg->io_divert && ((ioc_pend_data_len >= 4474 mrioc->io_throttle_high) || 4475 (tg_pend_data_len >= tg->high))) { 4476 tg->io_divert = 1; 4477 tg->need_qd_reduction = 1; 4478 mpi3mr_set_io_divert_for_all_vd_in_tg(mrioc, 4479 tg, 1); 4480 mpi3mr_queue_qd_reduction_event(mrioc, tg); 4481 } 4482 } else { 4483 ioc_pend_data_len = atomic_add_return(data_len_blks, 4484 &mrioc->pend_large_data_sz); 4485 if (ioc_pend_data_len >= mrioc->io_throttle_high) 4486 stgt_priv_data->io_divert = 1; 4487 } 4488 } 4489 4490 if (stgt_priv_data->io_divert) { 4491 scsiio_req->msg_flags |= 4492 MPI3_SCSIIO_MSGFLAGS_DIVERT_TO_FIRMWARE; 4493 scsiio_flags |= MPI3_SCSIIO_FLAGS_DIVERT_REASON_IO_THROTTLING; 4494 } 4495 scsiio_req->flags = cpu_to_le32(scsiio_flags); 4496 4497 if (mpi3mr_op_request_post(mrioc, op_req_q, 4498 scmd_priv_data->mpi3mr_scsiio_req)) { 4499 mpi3mr_clear_scmd_priv(mrioc, scmd); 4500 retval = SCSI_MLQUEUE_HOST_BUSY; 4501 if (tracked_io_sz) { 4502 atomic_sub(tracked_io_sz, &mrioc->pend_large_data_sz); 4503 if (tg) 4504 atomic_sub(tracked_io_sz, 4505 &tg->pend_large_data_sz); 4506 } 4507 goto out; 4508 } 4509 4510 out: 4511 return retval; 4512 } 4513 4514 static struct scsi_host_template mpi3mr_driver_template = { 4515 .module = THIS_MODULE, 4516 .name = "MPI3 Storage Controller", 4517 .proc_name = MPI3MR_DRIVER_NAME, 4518 .queuecommand = mpi3mr_qcmd, 4519 .target_alloc = mpi3mr_target_alloc, 4520 .slave_alloc = mpi3mr_slave_alloc, 4521 .slave_configure = mpi3mr_slave_configure, 4522 .target_destroy = mpi3mr_target_destroy, 4523 .slave_destroy = mpi3mr_slave_destroy, 4524 .scan_finished = mpi3mr_scan_finished, 4525 .scan_start = mpi3mr_scan_start, 4526 .change_queue_depth = mpi3mr_change_queue_depth, 4527 .eh_device_reset_handler = mpi3mr_eh_dev_reset, 4528 .eh_target_reset_handler = mpi3mr_eh_target_reset, 4529 .eh_host_reset_handler = mpi3mr_eh_host_reset, 4530 .bios_param = mpi3mr_bios_param, 4531 .map_queues = mpi3mr_map_queues, 4532 .mq_poll = mpi3mr_blk_mq_poll, 4533 .no_write_same = 1, 4534 .can_queue = 1, 4535 .this_id = -1, 4536 .sg_tablesize = MPI3MR_SG_DEPTH, 4537 /* max xfer supported is 1M (2K in 512 byte sized sectors) 4538 */ 4539 .max_sectors = 2048, 4540 .cmd_per_lun = MPI3MR_MAX_CMDS_LUN, 4541 .max_segment_size = 0xffffffff, 4542 .track_queue_depth = 1, 4543 .cmd_size = sizeof(struct scmd_priv), 4544 .shost_groups = mpi3mr_host_groups, 4545 .sdev_groups = mpi3mr_dev_groups, 4546 }; 4547 4548 /** 4549 * mpi3mr_init_drv_cmd - Initialize internal command tracker 4550 * @cmdptr: Internal command tracker 4551 * @host_tag: Host tag used for the specific command 4552 * 4553 * Initialize the internal command tracker structure with 4554 * specified host tag. 4555 * 4556 * Return: Nothing. 4557 */ 4558 static inline void mpi3mr_init_drv_cmd(struct mpi3mr_drv_cmd *cmdptr, 4559 u16 host_tag) 4560 { 4561 mutex_init(&cmdptr->mutex); 4562 cmdptr->reply = NULL; 4563 cmdptr->state = MPI3MR_CMD_NOTUSED; 4564 cmdptr->dev_handle = MPI3MR_INVALID_DEV_HANDLE; 4565 cmdptr->host_tag = host_tag; 4566 } 4567 4568 /** 4569 * osintfc_mrioc_security_status -Check controller secure status 4570 * @pdev: PCI device instance 4571 * 4572 * Read the Device Serial Number capability from PCI config 4573 * space and decide whether the controller is secure or not. 4574 * 4575 * Return: 0 on success, non-zero on failure. 4576 */ 4577 static int 4578 osintfc_mrioc_security_status(struct pci_dev *pdev) 4579 { 4580 u32 cap_data; 4581 int base; 4582 u32 ctlr_status; 4583 u32 debug_status; 4584 int retval = 0; 4585 4586 base = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN); 4587 if (!base) { 4588 dev_err(&pdev->dev, 4589 "%s: PCI_EXT_CAP_ID_DSN is not supported\n", __func__); 4590 return -1; 4591 } 4592 4593 pci_read_config_dword(pdev, base + 4, &cap_data); 4594 4595 debug_status = cap_data & MPI3MR_CTLR_SECURE_DBG_STATUS_MASK; 4596 ctlr_status = cap_data & MPI3MR_CTLR_SECURITY_STATUS_MASK; 4597 4598 switch (ctlr_status) { 4599 case MPI3MR_INVALID_DEVICE: 4600 dev_err(&pdev->dev, 4601 "%s: Non secure ctlr (Invalid) is detected: DID: 0x%x: SVID: 0x%x: SDID: 0x%x\n", 4602 __func__, pdev->device, pdev->subsystem_vendor, 4603 pdev->subsystem_device); 4604 retval = -1; 4605 break; 4606 case MPI3MR_CONFIG_SECURE_DEVICE: 4607 if (!debug_status) 4608 dev_info(&pdev->dev, 4609 "%s: Config secure ctlr is detected\n", 4610 __func__); 4611 break; 4612 case MPI3MR_HARD_SECURE_DEVICE: 4613 break; 4614 case MPI3MR_TAMPERED_DEVICE: 4615 dev_err(&pdev->dev, 4616 "%s: Non secure ctlr (Tampered) is detected: DID: 0x%x: SVID: 0x%x: SDID: 0x%x\n", 4617 __func__, pdev->device, pdev->subsystem_vendor, 4618 pdev->subsystem_device); 4619 retval = -1; 4620 break; 4621 default: 4622 retval = -1; 4623 break; 4624 } 4625 4626 if (!retval && debug_status) { 4627 dev_err(&pdev->dev, 4628 "%s: Non secure ctlr (Secure Dbg) is detected: DID: 0x%x: SVID: 0x%x: SDID: 0x%x\n", 4629 __func__, pdev->device, pdev->subsystem_vendor, 4630 pdev->subsystem_device); 4631 retval = -1; 4632 } 4633 4634 return retval; 4635 } 4636 4637 /** 4638 * mpi3mr_probe - PCI probe callback 4639 * @pdev: PCI device instance 4640 * @id: PCI device ID details 4641 * 4642 * controller initialization routine. Checks the security status 4643 * of the controller and if it is invalid or tampered return the 4644 * probe without initializing the controller. Otherwise, 4645 * allocate per adapter instance through shost_priv and 4646 * initialize controller specific data structures, initializae 4647 * the controller hardware, add shost to the SCSI subsystem. 4648 * 4649 * Return: 0 on success, non-zero on failure. 4650 */ 4651 4652 static int 4653 mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) 4654 { 4655 struct mpi3mr_ioc *mrioc = NULL; 4656 struct Scsi_Host *shost = NULL; 4657 int retval = 0, i; 4658 4659 if (osintfc_mrioc_security_status(pdev)) { 4660 warn_non_secure_ctlr = 1; 4661 return 1; /* For Invalid and Tampered device */ 4662 } 4663 4664 shost = scsi_host_alloc(&mpi3mr_driver_template, 4665 sizeof(struct mpi3mr_ioc)); 4666 if (!shost) { 4667 retval = -ENODEV; 4668 goto shost_failed; 4669 } 4670 4671 mrioc = shost_priv(shost); 4672 mrioc->id = mrioc_ids++; 4673 sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); 4674 sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); 4675 INIT_LIST_HEAD(&mrioc->list); 4676 spin_lock(&mrioc_list_lock); 4677 list_add_tail(&mrioc->list, &mrioc_list); 4678 spin_unlock(&mrioc_list_lock); 4679 4680 spin_lock_init(&mrioc->admin_req_lock); 4681 spin_lock_init(&mrioc->reply_free_queue_lock); 4682 spin_lock_init(&mrioc->sbq_lock); 4683 spin_lock_init(&mrioc->fwevt_lock); 4684 spin_lock_init(&mrioc->tgtdev_lock); 4685 spin_lock_init(&mrioc->watchdog_lock); 4686 spin_lock_init(&mrioc->chain_buf_lock); 4687 4688 INIT_LIST_HEAD(&mrioc->fwevt_list); 4689 INIT_LIST_HEAD(&mrioc->tgtdev_list); 4690 INIT_LIST_HEAD(&mrioc->delayed_rmhs_list); 4691 INIT_LIST_HEAD(&mrioc->delayed_evtack_cmds_list); 4692 INIT_LIST_HEAD(&mrioc->enclosure_list); 4693 4694 mutex_init(&mrioc->reset_mutex); 4695 mpi3mr_init_drv_cmd(&mrioc->init_cmds, MPI3MR_HOSTTAG_INITCMDS); 4696 mpi3mr_init_drv_cmd(&mrioc->host_tm_cmds, MPI3MR_HOSTTAG_BLK_TMS); 4697 mpi3mr_init_drv_cmd(&mrioc->bsg_cmds, MPI3MR_HOSTTAG_BSG_CMDS); 4698 mpi3mr_init_drv_cmd(&mrioc->cfg_cmds, MPI3MR_HOSTTAG_CFG_CMDS); 4699 4700 for (i = 0; i < MPI3MR_NUM_DEVRMCMD; i++) 4701 mpi3mr_init_drv_cmd(&mrioc->dev_rmhs_cmds[i], 4702 MPI3MR_HOSTTAG_DEVRMCMD_MIN + i); 4703 4704 if (pdev->revision) 4705 mrioc->enable_segqueue = true; 4706 4707 init_waitqueue_head(&mrioc->reset_waitq); 4708 mrioc->logging_level = logging_level; 4709 mrioc->shost = shost; 4710 mrioc->pdev = pdev; 4711 mrioc->stop_bsgs = 1; 4712 4713 /* init shost parameters */ 4714 shost->max_cmd_len = MPI3MR_MAX_CDB_LENGTH; 4715 shost->max_lun = -1; 4716 shost->unique_id = mrioc->id; 4717 4718 shost->max_channel = 0; 4719 shost->max_id = 0xFFFFFFFF; 4720 4721 shost->host_tagset = 1; 4722 4723 if (prot_mask >= 0) 4724 scsi_host_set_prot(shost, prot_mask); 4725 else { 4726 prot_mask = SHOST_DIF_TYPE1_PROTECTION 4727 | SHOST_DIF_TYPE2_PROTECTION 4728 | SHOST_DIF_TYPE3_PROTECTION; 4729 scsi_host_set_prot(shost, prot_mask); 4730 } 4731 4732 ioc_info(mrioc, 4733 "%s :host protection capabilities enabled %s%s%s%s%s%s%s\n", 4734 __func__, 4735 (prot_mask & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "", 4736 (prot_mask & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "", 4737 (prot_mask & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "", 4738 (prot_mask & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "", 4739 (prot_mask & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "", 4740 (prot_mask & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "", 4741 (prot_mask & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : ""); 4742 4743 if (prot_guard_mask) 4744 scsi_host_set_guard(shost, (prot_guard_mask & 3)); 4745 else 4746 scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC); 4747 4748 snprintf(mrioc->fwevt_worker_name, sizeof(mrioc->fwevt_worker_name), 4749 "%s%d_fwevt_wrkr", mrioc->driver_name, mrioc->id); 4750 mrioc->fwevt_worker_thread = alloc_ordered_workqueue( 4751 mrioc->fwevt_worker_name, 0); 4752 if (!mrioc->fwevt_worker_thread) { 4753 ioc_err(mrioc, "failure at %s:%d/%s()!\n", 4754 __FILE__, __LINE__, __func__); 4755 retval = -ENODEV; 4756 goto fwevtthread_failed; 4757 } 4758 4759 mrioc->is_driver_loading = 1; 4760 mrioc->cpu_count = num_online_cpus(); 4761 if (mpi3mr_setup_resources(mrioc)) { 4762 ioc_err(mrioc, "setup resources failed\n"); 4763 retval = -ENODEV; 4764 goto resource_alloc_failed; 4765 } 4766 if (mpi3mr_init_ioc(mrioc)) { 4767 ioc_err(mrioc, "initializing IOC failed\n"); 4768 retval = -ENODEV; 4769 goto init_ioc_failed; 4770 } 4771 4772 shost->nr_hw_queues = mrioc->num_op_reply_q; 4773 if (mrioc->active_poll_qcount) 4774 shost->nr_maps = 3; 4775 4776 shost->can_queue = mrioc->max_host_ios; 4777 shost->sg_tablesize = MPI3MR_SG_DEPTH; 4778 shost->max_id = mrioc->facts.max_perids + 1; 4779 4780 retval = scsi_add_host(shost, &pdev->dev); 4781 if (retval) { 4782 ioc_err(mrioc, "failure at %s:%d/%s()!\n", 4783 __FILE__, __LINE__, __func__); 4784 goto addhost_failed; 4785 } 4786 4787 scsi_scan_host(shost); 4788 mpi3mr_bsg_init(mrioc); 4789 return retval; 4790 4791 addhost_failed: 4792 mpi3mr_stop_watchdog(mrioc); 4793 mpi3mr_cleanup_ioc(mrioc); 4794 init_ioc_failed: 4795 mpi3mr_free_mem(mrioc); 4796 mpi3mr_cleanup_resources(mrioc); 4797 resource_alloc_failed: 4798 destroy_workqueue(mrioc->fwevt_worker_thread); 4799 fwevtthread_failed: 4800 spin_lock(&mrioc_list_lock); 4801 list_del(&mrioc->list); 4802 spin_unlock(&mrioc_list_lock); 4803 scsi_host_put(shost); 4804 shost_failed: 4805 return retval; 4806 } 4807 4808 /** 4809 * mpi3mr_remove - PCI remove callback 4810 * @pdev: PCI device instance 4811 * 4812 * Cleanup the IOC by issuing MUR and shutdown notification. 4813 * Free up all memory and resources associated with the 4814 * controllerand target devices, unregister the shost. 4815 * 4816 * Return: Nothing. 4817 */ 4818 static void mpi3mr_remove(struct pci_dev *pdev) 4819 { 4820 struct Scsi_Host *shost = pci_get_drvdata(pdev); 4821 struct mpi3mr_ioc *mrioc; 4822 struct workqueue_struct *wq; 4823 unsigned long flags; 4824 struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next; 4825 4826 if (!shost) 4827 return; 4828 4829 mrioc = shost_priv(shost); 4830 while (mrioc->reset_in_progress || mrioc->is_driver_loading) 4831 ssleep(1); 4832 4833 mpi3mr_bsg_exit(mrioc); 4834 mrioc->stop_drv_processing = 1; 4835 mpi3mr_cleanup_fwevt_list(mrioc); 4836 spin_lock_irqsave(&mrioc->fwevt_lock, flags); 4837 wq = mrioc->fwevt_worker_thread; 4838 mrioc->fwevt_worker_thread = NULL; 4839 spin_unlock_irqrestore(&mrioc->fwevt_lock, flags); 4840 if (wq) 4841 destroy_workqueue(wq); 4842 scsi_remove_host(shost); 4843 4844 list_for_each_entry_safe(tgtdev, tgtdev_next, &mrioc->tgtdev_list, 4845 list) { 4846 mpi3mr_remove_tgtdev_from_host(mrioc, tgtdev); 4847 mpi3mr_tgtdev_del_from_list(mrioc, tgtdev); 4848 mpi3mr_tgtdev_put(tgtdev); 4849 } 4850 mpi3mr_stop_watchdog(mrioc); 4851 mpi3mr_cleanup_ioc(mrioc); 4852 mpi3mr_free_mem(mrioc); 4853 mpi3mr_cleanup_resources(mrioc); 4854 4855 spin_lock(&mrioc_list_lock); 4856 list_del(&mrioc->list); 4857 spin_unlock(&mrioc_list_lock); 4858 4859 scsi_host_put(shost); 4860 } 4861 4862 /** 4863 * mpi3mr_shutdown - PCI shutdown callback 4864 * @pdev: PCI device instance 4865 * 4866 * Free up all memory and resources associated with the 4867 * controller 4868 * 4869 * Return: Nothing. 4870 */ 4871 static void mpi3mr_shutdown(struct pci_dev *pdev) 4872 { 4873 struct Scsi_Host *shost = pci_get_drvdata(pdev); 4874 struct mpi3mr_ioc *mrioc; 4875 struct workqueue_struct *wq; 4876 unsigned long flags; 4877 4878 if (!shost) 4879 return; 4880 4881 mrioc = shost_priv(shost); 4882 while (mrioc->reset_in_progress || mrioc->is_driver_loading) 4883 ssleep(1); 4884 4885 mrioc->stop_drv_processing = 1; 4886 mpi3mr_cleanup_fwevt_list(mrioc); 4887 spin_lock_irqsave(&mrioc->fwevt_lock, flags); 4888 wq = mrioc->fwevt_worker_thread; 4889 mrioc->fwevt_worker_thread = NULL; 4890 spin_unlock_irqrestore(&mrioc->fwevt_lock, flags); 4891 if (wq) 4892 destroy_workqueue(wq); 4893 4894 mpi3mr_stop_watchdog(mrioc); 4895 mpi3mr_cleanup_ioc(mrioc); 4896 mpi3mr_cleanup_resources(mrioc); 4897 } 4898 4899 #ifdef CONFIG_PM 4900 /** 4901 * mpi3mr_suspend - PCI power management suspend callback 4902 * @pdev: PCI device instance 4903 * @state: New power state 4904 * 4905 * Change the power state to the given value and cleanup the IOC 4906 * by issuing MUR and shutdown notification 4907 * 4908 * Return: 0 always. 4909 */ 4910 static int mpi3mr_suspend(struct pci_dev *pdev, pm_message_t state) 4911 { 4912 struct Scsi_Host *shost = pci_get_drvdata(pdev); 4913 struct mpi3mr_ioc *mrioc; 4914 pci_power_t device_state; 4915 4916 if (!shost) 4917 return 0; 4918 4919 mrioc = shost_priv(shost); 4920 while (mrioc->reset_in_progress || mrioc->is_driver_loading) 4921 ssleep(1); 4922 mrioc->stop_drv_processing = 1; 4923 mpi3mr_cleanup_fwevt_list(mrioc); 4924 scsi_block_requests(shost); 4925 mpi3mr_stop_watchdog(mrioc); 4926 mpi3mr_cleanup_ioc(mrioc); 4927 4928 device_state = pci_choose_state(pdev, state); 4929 ioc_info(mrioc, "pdev=0x%p, slot=%s, entering operating state [D%d]\n", 4930 pdev, pci_name(pdev), device_state); 4931 pci_save_state(pdev); 4932 mpi3mr_cleanup_resources(mrioc); 4933 pci_set_power_state(pdev, device_state); 4934 4935 return 0; 4936 } 4937 4938 /** 4939 * mpi3mr_resume - PCI power management resume callback 4940 * @pdev: PCI device instance 4941 * 4942 * Restore the power state to D0 and reinitialize the controller 4943 * and resume I/O operations to the target devices 4944 * 4945 * Return: 0 on success, non-zero on failure 4946 */ 4947 static int mpi3mr_resume(struct pci_dev *pdev) 4948 { 4949 struct Scsi_Host *shost = pci_get_drvdata(pdev); 4950 struct mpi3mr_ioc *mrioc; 4951 pci_power_t device_state = pdev->current_state; 4952 int r; 4953 4954 if (!shost) 4955 return 0; 4956 4957 mrioc = shost_priv(shost); 4958 4959 ioc_info(mrioc, "pdev=0x%p, slot=%s, previous operating state [D%d]\n", 4960 pdev, pci_name(pdev), device_state); 4961 pci_set_power_state(pdev, PCI_D0); 4962 pci_enable_wake(pdev, PCI_D0, 0); 4963 pci_restore_state(pdev); 4964 mrioc->pdev = pdev; 4965 mrioc->cpu_count = num_online_cpus(); 4966 r = mpi3mr_setup_resources(mrioc); 4967 if (r) { 4968 ioc_info(mrioc, "%s: Setup resources failed[%d]\n", 4969 __func__, r); 4970 return r; 4971 } 4972 4973 mrioc->stop_drv_processing = 0; 4974 mpi3mr_memset_buffers(mrioc); 4975 r = mpi3mr_reinit_ioc(mrioc, 1); 4976 if (r) { 4977 ioc_err(mrioc, "resuming controller failed[%d]\n", r); 4978 return r; 4979 } 4980 scsi_unblock_requests(shost); 4981 mpi3mr_start_watchdog(mrioc); 4982 4983 return 0; 4984 } 4985 #endif 4986 4987 static const struct pci_device_id mpi3mr_pci_id_table[] = { 4988 { 4989 PCI_DEVICE_SUB(MPI3_MFGPAGE_VENDORID_BROADCOM, 4990 MPI3_MFGPAGE_DEVID_SAS4116, PCI_ANY_ID, PCI_ANY_ID) 4991 }, 4992 { 0 } 4993 }; 4994 MODULE_DEVICE_TABLE(pci, mpi3mr_pci_id_table); 4995 4996 static struct pci_driver mpi3mr_pci_driver = { 4997 .name = MPI3MR_DRIVER_NAME, 4998 .id_table = mpi3mr_pci_id_table, 4999 .probe = mpi3mr_probe, 5000 .remove = mpi3mr_remove, 5001 .shutdown = mpi3mr_shutdown, 5002 #ifdef CONFIG_PM 5003 .suspend = mpi3mr_suspend, 5004 .resume = mpi3mr_resume, 5005 #endif 5006 }; 5007 5008 static ssize_t event_counter_show(struct device_driver *dd, char *buf) 5009 { 5010 return sprintf(buf, "%llu\n", atomic64_read(&event_counter)); 5011 } 5012 static DRIVER_ATTR_RO(event_counter); 5013 5014 static int __init mpi3mr_init(void) 5015 { 5016 int ret_val; 5017 5018 pr_info("Loading %s version %s\n", MPI3MR_DRIVER_NAME, 5019 MPI3MR_DRIVER_VERSION); 5020 5021 ret_val = pci_register_driver(&mpi3mr_pci_driver); 5022 if (ret_val) { 5023 pr_err("%s failed to load due to pci register driver failure\n", 5024 MPI3MR_DRIVER_NAME); 5025 return ret_val; 5026 } 5027 5028 ret_val = driver_create_file(&mpi3mr_pci_driver.driver, 5029 &driver_attr_event_counter); 5030 if (ret_val) 5031 pci_unregister_driver(&mpi3mr_pci_driver); 5032 5033 return ret_val; 5034 } 5035 5036 static void __exit mpi3mr_exit(void) 5037 { 5038 if (warn_non_secure_ctlr) 5039 pr_warn( 5040 "Unloading %s version %s while managing a non secure controller\n", 5041 MPI3MR_DRIVER_NAME, MPI3MR_DRIVER_VERSION); 5042 else 5043 pr_info("Unloading %s version %s\n", MPI3MR_DRIVER_NAME, 5044 MPI3MR_DRIVER_VERSION); 5045 5046 driver_remove_file(&mpi3mr_pci_driver.driver, 5047 &driver_attr_event_counter); 5048 pci_unregister_driver(&mpi3mr_pci_driver); 5049 } 5050 5051 module_init(mpi3mr_init); 5052 module_exit(mpi3mr_exit); 5053