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