LCOV - code coverage report
Current view: top level - drivers/scsi - virtio_scsi.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 8 448 1.8 %
Date: 2022-04-01 14:17:54 Functions: 1 33 3.0 %
Branches: 3 154 1.9 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-or-later
       2                 :            : /*
       3                 :            :  * Virtio SCSI HBA driver
       4                 :            :  *
       5                 :            :  * Copyright IBM Corp. 2010
       6                 :            :  * Copyright Red Hat, Inc. 2011
       7                 :            :  *
       8                 :            :  * Authors:
       9                 :            :  *  Stefan Hajnoczi   <stefanha@linux.vnet.ibm.com>
      10                 :            :  *  Paolo Bonzini   <pbonzini@redhat.com>
      11                 :            :  */
      12                 :            : 
      13                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      14                 :            : 
      15                 :            : #include <linux/module.h>
      16                 :            : #include <linux/slab.h>
      17                 :            : #include <linux/mempool.h>
      18                 :            : #include <linux/interrupt.h>
      19                 :            : #include <linux/virtio.h>
      20                 :            : #include <linux/virtio_ids.h>
      21                 :            : #include <linux/virtio_config.h>
      22                 :            : #include <linux/virtio_scsi.h>
      23                 :            : #include <linux/cpu.h>
      24                 :            : #include <linux/blkdev.h>
      25                 :            : #include <scsi/scsi_host.h>
      26                 :            : #include <scsi/scsi_device.h>
      27                 :            : #include <scsi/scsi_cmnd.h>
      28                 :            : #include <scsi/scsi_tcq.h>
      29                 :            : #include <scsi/scsi_devinfo.h>
      30                 :            : #include <linux/seqlock.h>
      31                 :            : #include <linux/blk-mq-virtio.h>
      32                 :            : 
      33                 :            : #include "sd.h"
      34                 :            : 
      35                 :            : #define VIRTIO_SCSI_MEMPOOL_SZ 64
      36                 :            : #define VIRTIO_SCSI_EVENT_LEN 8
      37                 :            : #define VIRTIO_SCSI_VQ_BASE 2
      38                 :            : 
      39                 :            : /* Command queue element */
      40                 :            : struct virtio_scsi_cmd {
      41                 :            :         struct scsi_cmnd *sc;
      42                 :            :         struct completion *comp;
      43                 :            :         union {
      44                 :            :                 struct virtio_scsi_cmd_req       cmd;
      45                 :            :                 struct virtio_scsi_cmd_req_pi    cmd_pi;
      46                 :            :                 struct virtio_scsi_ctrl_tmf_req  tmf;
      47                 :            :                 struct virtio_scsi_ctrl_an_req   an;
      48                 :            :         } req;
      49                 :            :         union {
      50                 :            :                 struct virtio_scsi_cmd_resp      cmd;
      51                 :            :                 struct virtio_scsi_ctrl_tmf_resp tmf;
      52                 :            :                 struct virtio_scsi_ctrl_an_resp  an;
      53                 :            :                 struct virtio_scsi_event         evt;
      54                 :            :         } resp;
      55                 :            : } ____cacheline_aligned_in_smp;
      56                 :            : 
      57                 :            : struct virtio_scsi_event_node {
      58                 :            :         struct virtio_scsi *vscsi;
      59                 :            :         struct virtio_scsi_event event;
      60                 :            :         struct work_struct work;
      61                 :            : };
      62                 :            : 
      63                 :            : struct virtio_scsi_vq {
      64                 :            :         /* Protects vq */
      65                 :            :         spinlock_t vq_lock;
      66                 :            : 
      67                 :            :         struct virtqueue *vq;
      68                 :            : };
      69                 :            : 
      70                 :            : /* Driver instance state */
      71                 :            : struct virtio_scsi {
      72                 :            :         struct virtio_device *vdev;
      73                 :            : 
      74                 :            :         /* Get some buffers ready for event vq */
      75                 :            :         struct virtio_scsi_event_node event_list[VIRTIO_SCSI_EVENT_LEN];
      76                 :            : 
      77                 :            :         u32 num_queues;
      78                 :            : 
      79                 :            :         struct hlist_node node;
      80                 :            : 
      81                 :            :         /* Protected by event_vq lock */
      82                 :            :         bool stop_events;
      83                 :            : 
      84                 :            :         struct virtio_scsi_vq ctrl_vq;
      85                 :            :         struct virtio_scsi_vq event_vq;
      86                 :            :         struct virtio_scsi_vq req_vqs[];
      87                 :            : };
      88                 :            : 
      89                 :            : static struct kmem_cache *virtscsi_cmd_cache;
      90                 :            : static mempool_t *virtscsi_cmd_pool;
      91                 :            : 
      92                 :          0 : static inline struct Scsi_Host *virtio_scsi_host(struct virtio_device *vdev)
      93                 :            : {
      94                 :          0 :         return vdev->priv;
      95                 :            : }
      96                 :            : 
      97                 :          0 : static void virtscsi_compute_resid(struct scsi_cmnd *sc, u32 resid)
      98                 :            : {
      99         [ #  # ]:          0 :         if (resid)
     100                 :          0 :                 scsi_set_resid(sc, resid);
     101                 :            : }
     102                 :            : 
     103                 :            : /**
     104                 :            :  * virtscsi_complete_cmd - finish a scsi_cmd and invoke scsi_done
     105                 :            :  *
     106                 :            :  * Called with vq_lock held.
     107                 :            :  */
     108                 :          0 : static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf)
     109                 :            : {
     110                 :          0 :         struct virtio_scsi_cmd *cmd = buf;
     111                 :          0 :         struct scsi_cmnd *sc = cmd->sc;
     112                 :          0 :         struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd;
     113                 :            : 
     114                 :          0 :         dev_dbg(&sc->device->sdev_gendev,
     115                 :            :                 "cmd %p response %u status %#02x sense_len %u\n",
     116                 :            :                 sc, resp->response, resp->status, resp->sense_len);
     117                 :            : 
     118                 :          0 :         sc->result = resp->status;
     119                 :          0 :         virtscsi_compute_resid(sc, virtio32_to_cpu(vscsi->vdev, resp->resid));
     120   [ #  #  #  #  :          0 :         switch (resp->response) {
          #  #  #  #  #  
                   #  # ]
     121                 :            :         case VIRTIO_SCSI_S_OK:
     122                 :          0 :                 set_host_byte(sc, DID_OK);
     123                 :            :                 break;
     124                 :            :         case VIRTIO_SCSI_S_OVERRUN:
     125                 :          0 :                 set_host_byte(sc, DID_ERROR);
     126                 :            :                 break;
     127                 :            :         case VIRTIO_SCSI_S_ABORTED:
     128                 :          0 :                 set_host_byte(sc, DID_ABORT);
     129                 :            :                 break;
     130                 :            :         case VIRTIO_SCSI_S_BAD_TARGET:
     131                 :          0 :                 set_host_byte(sc, DID_BAD_TARGET);
     132                 :            :                 break;
     133                 :            :         case VIRTIO_SCSI_S_RESET:
     134                 :          0 :                 set_host_byte(sc, DID_RESET);
     135                 :            :                 break;
     136                 :            :         case VIRTIO_SCSI_S_BUSY:
     137                 :          0 :                 set_host_byte(sc, DID_BUS_BUSY);
     138                 :            :                 break;
     139                 :            :         case VIRTIO_SCSI_S_TRANSPORT_FAILURE:
     140                 :          0 :                 set_host_byte(sc, DID_TRANSPORT_DISRUPTED);
     141                 :            :                 break;
     142                 :            :         case VIRTIO_SCSI_S_TARGET_FAILURE:
     143                 :          0 :                 set_host_byte(sc, DID_TARGET_FAILURE);
     144                 :            :                 break;
     145                 :            :         case VIRTIO_SCSI_S_NEXUS_FAILURE:
     146                 :          0 :                 set_host_byte(sc, DID_NEXUS_FAILURE);
     147                 :            :                 break;
     148                 :          0 :         default:
     149                 :          0 :                 scmd_printk(KERN_WARNING, sc, "Unknown response %d",
     150                 :            :                             resp->response);
     151                 :            :                 /* fall through */
     152                 :          0 :         case VIRTIO_SCSI_S_FAILURE:
     153                 :          0 :                 set_host_byte(sc, DID_ERROR);
     154                 :            :                 break;
     155                 :            :         }
     156                 :            : 
     157         [ #  # ]:          0 :         WARN_ON(virtio32_to_cpu(vscsi->vdev, resp->sense_len) >
     158                 :            :                 VIRTIO_SCSI_SENSE_SIZE);
     159         [ #  # ]:          0 :         if (sc->sense_buffer) {
     160                 :          0 :                 memcpy(sc->sense_buffer, resp->sense,
     161                 :          0 :                        min_t(u32,
     162                 :            :                              virtio32_to_cpu(vscsi->vdev, resp->sense_len),
     163                 :            :                              VIRTIO_SCSI_SENSE_SIZE));
     164         [ #  # ]:          0 :                 if (resp->sense_len)
     165                 :          0 :                         set_driver_byte(sc, DRIVER_SENSE);
     166                 :            :         }
     167                 :            : 
     168                 :          0 :         sc->scsi_done(sc);
     169                 :          0 : }
     170                 :            : 
     171                 :          0 : static void virtscsi_vq_done(struct virtio_scsi *vscsi,
     172                 :            :                              struct virtio_scsi_vq *virtscsi_vq,
     173                 :            :                              void (*fn)(struct virtio_scsi *vscsi, void *buf))
     174                 :            : {
     175                 :          0 :         void *buf;
     176                 :          0 :         unsigned int len;
     177                 :          0 :         unsigned long flags;
     178                 :          0 :         struct virtqueue *vq = virtscsi_vq->vq;
     179                 :            : 
     180                 :          0 :         spin_lock_irqsave(&virtscsi_vq->vq_lock, flags);
     181                 :          0 :         do {
     182                 :          0 :                 virtqueue_disable_cb(vq);
     183         [ #  # ]:          0 :                 while ((buf = virtqueue_get_buf(vq, &len)) != NULL)
     184                 :          0 :                         fn(vscsi, buf);
     185                 :            : 
     186         [ #  # ]:          0 :                 if (unlikely(virtqueue_is_broken(vq)))
     187                 :            :                         break;
     188         [ #  # ]:          0 :         } while (!virtqueue_enable_cb(vq));
     189                 :          0 :         spin_unlock_irqrestore(&virtscsi_vq->vq_lock, flags);
     190                 :          0 : }
     191                 :            : 
     192                 :          0 : static void virtscsi_req_done(struct virtqueue *vq)
     193                 :            : {
     194                 :          0 :         struct Scsi_Host *sh = virtio_scsi_host(vq->vdev);
     195                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sh);
     196                 :          0 :         int index = vq->index - VIRTIO_SCSI_VQ_BASE;
     197                 :          0 :         struct virtio_scsi_vq *req_vq = &vscsi->req_vqs[index];
     198                 :            : 
     199                 :          0 :         virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd);
     200                 :          0 : };
     201                 :            : 
     202                 :          0 : static void virtscsi_poll_requests(struct virtio_scsi *vscsi)
     203                 :            : {
     204                 :          0 :         int i, num_vqs;
     205                 :            : 
     206                 :          0 :         num_vqs = vscsi->num_queues;
     207         [ #  # ]:          0 :         for (i = 0; i < num_vqs; i++)
     208                 :          0 :                 virtscsi_vq_done(vscsi, &vscsi->req_vqs[i],
     209                 :            :                                  virtscsi_complete_cmd);
     210                 :            : }
     211                 :            : 
     212                 :          0 : static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf)
     213                 :            : {
     214                 :          0 :         struct virtio_scsi_cmd *cmd = buf;
     215                 :            : 
     216         [ #  # ]:          0 :         if (cmd->comp)
     217                 :          0 :                 complete(cmd->comp);
     218                 :          0 : }
     219                 :            : 
     220                 :          0 : static void virtscsi_ctrl_done(struct virtqueue *vq)
     221                 :            : {
     222                 :          0 :         struct Scsi_Host *sh = virtio_scsi_host(vq->vdev);
     223                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sh);
     224                 :            : 
     225                 :          0 :         virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free);
     226                 :          0 : };
     227                 :            : 
     228                 :            : static void virtscsi_handle_event(struct work_struct *work);
     229                 :            : 
     230                 :          0 : static int virtscsi_kick_event(struct virtio_scsi *vscsi,
     231                 :            :                                struct virtio_scsi_event_node *event_node)
     232                 :            : {
     233                 :          0 :         int err;
     234                 :          0 :         struct scatterlist sg;
     235                 :          0 :         unsigned long flags;
     236                 :            : 
     237                 :          0 :         INIT_WORK(&event_node->work, virtscsi_handle_event);
     238                 :          0 :         sg_init_one(&sg, &event_node->event, sizeof(struct virtio_scsi_event));
     239                 :            : 
     240                 :          0 :         spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags);
     241                 :            : 
     242                 :          0 :         err = virtqueue_add_inbuf(vscsi->event_vq.vq, &sg, 1, event_node,
     243                 :            :                                   GFP_ATOMIC);
     244         [ #  # ]:          0 :         if (!err)
     245                 :          0 :                 virtqueue_kick(vscsi->event_vq.vq);
     246                 :            : 
     247                 :          0 :         spin_unlock_irqrestore(&vscsi->event_vq.vq_lock, flags);
     248                 :            : 
     249                 :          0 :         return err;
     250                 :            : }
     251                 :            : 
     252                 :            : static int virtscsi_kick_event_all(struct virtio_scsi *vscsi)
     253                 :            : {
     254                 :            :         int i;
     255                 :            : 
     256   [ #  #  #  # ]:          0 :         for (i = 0; i < VIRTIO_SCSI_EVENT_LEN; i++) {
     257                 :          0 :                 vscsi->event_list[i].vscsi = vscsi;
     258                 :          0 :                 virtscsi_kick_event(vscsi, &vscsi->event_list[i]);
     259                 :            :         }
     260                 :            : 
     261                 :            :         return 0;
     262                 :            : }
     263                 :            : 
     264                 :          0 : static void virtscsi_cancel_event_work(struct virtio_scsi *vscsi)
     265                 :            : {
     266                 :          0 :         int i;
     267                 :            : 
     268                 :            :         /* Stop scheduling work before calling cancel_work_sync.  */
     269                 :          0 :         spin_lock_irq(&vscsi->event_vq.vq_lock);
     270                 :          0 :         vscsi->stop_events = true;
     271                 :          0 :         spin_unlock_irq(&vscsi->event_vq.vq_lock);
     272                 :            : 
     273         [ #  # ]:          0 :         for (i = 0; i < VIRTIO_SCSI_EVENT_LEN; i++)
     274                 :          0 :                 cancel_work_sync(&vscsi->event_list[i].work);
     275                 :          0 : }
     276                 :            : 
     277                 :          0 : static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi,
     278                 :            :                                             struct virtio_scsi_event *event)
     279                 :            : {
     280                 :          0 :         struct scsi_device *sdev;
     281                 :          0 :         struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
     282                 :          0 :         unsigned int target = event->lun[1];
     283                 :          0 :         unsigned int lun = (event->lun[2] << 8) | event->lun[3];
     284                 :            : 
     285      [ #  #  # ]:          0 :         switch (virtio32_to_cpu(vscsi->vdev, event->reason)) {
     286                 :          0 :         case VIRTIO_SCSI_EVT_RESET_RESCAN:
     287                 :          0 :                 scsi_add_device(shost, 0, target, lun);
     288                 :          0 :                 break;
     289                 :          0 :         case VIRTIO_SCSI_EVT_RESET_REMOVED:
     290                 :          0 :                 sdev = scsi_device_lookup(shost, 0, target, lun);
     291         [ #  # ]:          0 :                 if (sdev) {
     292                 :          0 :                         scsi_remove_device(sdev);
     293                 :          0 :                         scsi_device_put(sdev);
     294                 :            :                 } else {
     295                 :          0 :                         pr_err("SCSI device %d 0 %d %d not found\n",
     296                 :            :                                 shost->host_no, target, lun);
     297                 :            :                 }
     298                 :            :                 break;
     299                 :          0 :         default:
     300                 :          0 :                 pr_info("Unsupport virtio scsi event reason %x\n", event->reason);
     301                 :            :         }
     302                 :          0 : }
     303                 :            : 
     304                 :          0 : static void virtscsi_handle_param_change(struct virtio_scsi *vscsi,
     305                 :            :                                          struct virtio_scsi_event *event)
     306                 :            : {
     307                 :          0 :         struct scsi_device *sdev;
     308                 :          0 :         struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
     309                 :          0 :         unsigned int target = event->lun[1];
     310                 :          0 :         unsigned int lun = (event->lun[2] << 8) | event->lun[3];
     311                 :          0 :         u8 asc = virtio32_to_cpu(vscsi->vdev, event->reason) & 255;
     312                 :          0 :         u8 ascq = virtio32_to_cpu(vscsi->vdev, event->reason) >> 8;
     313                 :            : 
     314                 :          0 :         sdev = scsi_device_lookup(shost, 0, target, lun);
     315         [ #  # ]:          0 :         if (!sdev) {
     316                 :          0 :                 pr_err("SCSI device %d 0 %d %d not found\n",
     317                 :            :                         shost->host_no, target, lun);
     318                 :          0 :                 return;
     319                 :            :         }
     320                 :            : 
     321                 :            :         /* Handle "Parameters changed", "Mode parameters changed", and
     322                 :            :            "Capacity data has changed".  */
     323   [ #  #  #  # ]:          0 :         if (asc == 0x2a && (ascq == 0x00 || ascq == 0x01 || ascq == 0x09))
     324                 :          0 :                 scsi_rescan_device(&sdev->sdev_gendev);
     325                 :            : 
     326                 :          0 :         scsi_device_put(sdev);
     327                 :            : }
     328                 :            : 
     329                 :          0 : static void virtscsi_rescan_hotunplug(struct virtio_scsi *vscsi)
     330                 :            : {
     331                 :          0 :         struct scsi_device *sdev;
     332                 :          0 :         struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
     333                 :          0 :         unsigned char scsi_cmd[MAX_COMMAND_SIZE];
     334                 :          0 :         int result, inquiry_len, inq_result_len = 256;
     335                 :          0 :         char *inq_result = kmalloc(inq_result_len, GFP_KERNEL);
     336                 :            : 
     337         [ #  # ]:          0 :         shost_for_each_device(sdev, shost) {
     338         [ #  # ]:          0 :                 inquiry_len = sdev->inquiry_len ? sdev->inquiry_len : 36;
     339                 :            : 
     340                 :          0 :                 memset(scsi_cmd, 0, sizeof(scsi_cmd));
     341                 :          0 :                 scsi_cmd[0] = INQUIRY;
     342                 :          0 :                 scsi_cmd[4] = (unsigned char) inquiry_len;
     343                 :            : 
     344                 :          0 :                 memset(inq_result, 0, inq_result_len);
     345                 :            : 
     346                 :          0 :                 result = scsi_execute_req(sdev, scsi_cmd, DMA_FROM_DEVICE,
     347                 :            :                                           inq_result, inquiry_len, NULL,
     348                 :            :                                           SD_TIMEOUT, SD_MAX_RETRIES, NULL);
     349                 :            : 
     350   [ #  #  #  # ]:          0 :                 if (result == 0 && inq_result[0] >> 5) {
     351                 :            :                         /* PQ indicates the LUN is not attached */
     352                 :          0 :                         scsi_remove_device(sdev);
     353                 :            :                 }
     354                 :            :         }
     355                 :            : 
     356                 :          0 :         kfree(inq_result);
     357                 :          0 : }
     358                 :            : 
     359                 :          0 : static void virtscsi_handle_event(struct work_struct *work)
     360                 :            : {
     361                 :          0 :         struct virtio_scsi_event_node *event_node =
     362                 :          0 :                 container_of(work, struct virtio_scsi_event_node, work);
     363                 :          0 :         struct virtio_scsi *vscsi = event_node->vscsi;
     364                 :          0 :         struct virtio_scsi_event *event = &event_node->event;
     365                 :            : 
     366         [ #  # ]:          0 :         if (event->event &
     367                 :          0 :             cpu_to_virtio32(vscsi->vdev, VIRTIO_SCSI_T_EVENTS_MISSED)) {
     368                 :          0 :                 event->event &= ~cpu_to_virtio32(vscsi->vdev,
     369                 :            :                                                    VIRTIO_SCSI_T_EVENTS_MISSED);
     370                 :          0 :                 virtscsi_rescan_hotunplug(vscsi);
     371                 :          0 :                 scsi_scan_host(virtio_scsi_host(vscsi->vdev));
     372                 :            :         }
     373                 :            : 
     374   [ #  #  #  # ]:          0 :         switch (virtio32_to_cpu(vscsi->vdev, event->event)) {
     375                 :            :         case VIRTIO_SCSI_T_NO_EVENT:
     376                 :            :                 break;
     377                 :          0 :         case VIRTIO_SCSI_T_TRANSPORT_RESET:
     378                 :          0 :                 virtscsi_handle_transport_reset(vscsi, event);
     379                 :          0 :                 break;
     380                 :          0 :         case VIRTIO_SCSI_T_PARAM_CHANGE:
     381                 :          0 :                 virtscsi_handle_param_change(vscsi, event);
     382                 :          0 :                 break;
     383                 :          0 :         default:
     384                 :          0 :                 pr_err("Unsupport virtio scsi event %x\n", event->event);
     385                 :            :         }
     386                 :          0 :         virtscsi_kick_event(vscsi, event_node);
     387                 :          0 : }
     388                 :            : 
     389                 :          0 : static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf)
     390                 :            : {
     391                 :          0 :         struct virtio_scsi_event_node *event_node = buf;
     392                 :            : 
     393         [ #  # ]:          0 :         if (!vscsi->stop_events)
     394                 :          0 :                 queue_work(system_freezable_wq, &event_node->work);
     395                 :          0 : }
     396                 :            : 
     397                 :          0 : static void virtscsi_event_done(struct virtqueue *vq)
     398                 :            : {
     399                 :          0 :         struct Scsi_Host *sh = virtio_scsi_host(vq->vdev);
     400                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sh);
     401                 :            : 
     402                 :          0 :         virtscsi_vq_done(vscsi, &vscsi->event_vq, virtscsi_complete_event);
     403                 :          0 : };
     404                 :            : 
     405                 :          0 : static int __virtscsi_add_cmd(struct virtqueue *vq,
     406                 :            :                             struct virtio_scsi_cmd *cmd,
     407                 :            :                             size_t req_size, size_t resp_size)
     408                 :            : {
     409                 :          0 :         struct scsi_cmnd *sc = cmd->sc;
     410                 :          0 :         struct scatterlist *sgs[6], req, resp;
     411                 :          0 :         struct sg_table *out, *in;
     412                 :          0 :         unsigned out_num = 0, in_num = 0;
     413                 :            : 
     414                 :          0 :         out = in = NULL;
     415                 :            : 
     416   [ #  #  #  # ]:          0 :         if (sc && sc->sc_data_direction != DMA_NONE) {
     417         [ #  # ]:          0 :                 if (sc->sc_data_direction != DMA_FROM_DEVICE)
     418                 :          0 :                         out = &sc->sdb.table;
     419         [ #  # ]:          0 :                 if (sc->sc_data_direction != DMA_TO_DEVICE)
     420                 :          0 :                         in = &sc->sdb.table;
     421                 :            :         }
     422                 :            : 
     423                 :            :         /* Request header.  */
     424                 :          0 :         sg_init_one(&req, &cmd->req, req_size);
     425                 :          0 :         sgs[out_num++] = &req;
     426                 :            : 
     427                 :            :         /* Data-out buffer.  */
     428         [ #  # ]:          0 :         if (out) {
     429                 :            :                 /* Place WRITE protection SGLs before Data OUT payload */
     430   [ #  #  #  # ]:          0 :                 if (scsi_prot_sg_count(sc))
     431                 :          0 :                         sgs[out_num++] = scsi_prot_sglist(sc);
     432                 :          0 :                 sgs[out_num++] = out->sgl;
     433                 :            :         }
     434                 :            : 
     435                 :            :         /* Response header.  */
     436                 :          0 :         sg_init_one(&resp, &cmd->resp, resp_size);
     437                 :          0 :         sgs[out_num + in_num++] = &resp;
     438                 :            : 
     439                 :            :         /* Data-in buffer */
     440         [ #  # ]:          0 :         if (in) {
     441                 :            :                 /* Place READ protection SGLs before Data IN payload */
     442   [ #  #  #  # ]:          0 :                 if (scsi_prot_sg_count(sc))
     443                 :          0 :                         sgs[out_num + in_num++] = scsi_prot_sglist(sc);
     444                 :          0 :                 sgs[out_num + in_num++] = in->sgl;
     445                 :            :         }
     446                 :            : 
     447                 :          0 :         return virtqueue_add_sgs(vq, sgs, out_num, in_num, cmd, GFP_ATOMIC);
     448                 :            : }
     449                 :            : 
     450                 :          0 : static void virtscsi_kick_vq(struct virtio_scsi_vq *vq)
     451                 :            : {
     452                 :          0 :         bool needs_kick;
     453                 :          0 :         unsigned long flags;
     454                 :            : 
     455                 :          0 :         spin_lock_irqsave(&vq->vq_lock, flags);
     456                 :          0 :         needs_kick = virtqueue_kick_prepare(vq->vq);
     457                 :          0 :         spin_unlock_irqrestore(&vq->vq_lock, flags);
     458                 :            : 
     459         [ #  # ]:          0 :         if (needs_kick)
     460                 :          0 :                 virtqueue_notify(vq->vq);
     461                 :          0 : }
     462                 :            : 
     463                 :            : /**
     464                 :            :  * virtscsi_add_cmd - add a virtio_scsi_cmd to a virtqueue, optionally kick it
     465                 :            :  * @vq          : the struct virtqueue we're talking about
     466                 :            :  * @cmd         : command structure
     467                 :            :  * @req_size    : size of the request buffer
     468                 :            :  * @resp_size   : size of the response buffer
     469                 :            :  * @kick        : whether to kick the virtqueue immediately
     470                 :            :  */
     471                 :          0 : static int virtscsi_add_cmd(struct virtio_scsi_vq *vq,
     472                 :            :                              struct virtio_scsi_cmd *cmd,
     473                 :            :                              size_t req_size, size_t resp_size,
     474                 :            :                              bool kick)
     475                 :            : {
     476                 :          0 :         unsigned long flags;
     477                 :          0 :         int err;
     478                 :          0 :         bool needs_kick = false;
     479                 :            : 
     480                 :          0 :         spin_lock_irqsave(&vq->vq_lock, flags);
     481                 :          0 :         err = __virtscsi_add_cmd(vq->vq, cmd, req_size, resp_size);
     482         [ #  # ]:          0 :         if (!err && kick)
     483                 :          0 :                 needs_kick = virtqueue_kick_prepare(vq->vq);
     484                 :            : 
     485                 :          0 :         spin_unlock_irqrestore(&vq->vq_lock, flags);
     486                 :            : 
     487         [ #  # ]:          0 :         if (needs_kick)
     488                 :          0 :                 virtqueue_notify(vq->vq);
     489                 :          0 :         return err;
     490                 :            : }
     491                 :            : 
     492                 :          0 : static void virtio_scsi_init_hdr(struct virtio_device *vdev,
     493                 :            :                                  struct virtio_scsi_cmd_req *cmd,
     494                 :            :                                  struct scsi_cmnd *sc)
     495                 :            : {
     496                 :          0 :         cmd->lun[0] = 1;
     497                 :          0 :         cmd->lun[1] = sc->device->id;
     498                 :          0 :         cmd->lun[2] = (sc->device->lun >> 8) | 0x40;
     499                 :          0 :         cmd->lun[3] = sc->device->lun & 0xff;
     500                 :          0 :         cmd->tag = cpu_to_virtio64(vdev, (unsigned long)sc);
     501                 :          0 :         cmd->task_attr = VIRTIO_SCSI_S_SIMPLE;
     502                 :          0 :         cmd->prio = 0;
     503                 :          0 :         cmd->crn = 0;
     504                 :          0 : }
     505                 :            : 
     506                 :            : #ifdef CONFIG_BLK_DEV_INTEGRITY
     507                 :            : static void virtio_scsi_init_hdr_pi(struct virtio_device *vdev,
     508                 :            :                                     struct virtio_scsi_cmd_req_pi *cmd_pi,
     509                 :            :                                     struct scsi_cmnd *sc)
     510                 :            : {
     511                 :            :         struct request *rq = sc->request;
     512                 :            :         struct blk_integrity *bi;
     513                 :            : 
     514                 :            :         virtio_scsi_init_hdr(vdev, (struct virtio_scsi_cmd_req *)cmd_pi, sc);
     515                 :            : 
     516                 :            :         if (!rq || !scsi_prot_sg_count(sc))
     517                 :            :                 return;
     518                 :            : 
     519                 :            :         bi = blk_get_integrity(rq->rq_disk);
     520                 :            : 
     521                 :            :         if (sc->sc_data_direction == DMA_TO_DEVICE)
     522                 :            :                 cmd_pi->pi_bytesout = cpu_to_virtio32(vdev,
     523                 :            :                                                       bio_integrity_bytes(bi,
     524                 :            :                                                         blk_rq_sectors(rq)));
     525                 :            :         else if (sc->sc_data_direction == DMA_FROM_DEVICE)
     526                 :            :                 cmd_pi->pi_bytesin = cpu_to_virtio32(vdev,
     527                 :            :                                                      bio_integrity_bytes(bi,
     528                 :            :                                                         blk_rq_sectors(rq)));
     529                 :            : }
     530                 :            : #endif
     531                 :            : 
     532                 :          0 : static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi,
     533                 :            :                                                   struct scsi_cmnd *sc)
     534                 :            : {
     535                 :          0 :         u32 tag = blk_mq_unique_tag(sc->request);
     536         [ #  # ]:          0 :         u16 hwq = blk_mq_unique_tag_to_hwq(tag);
     537                 :            : 
     538                 :          0 :         return &vscsi->req_vqs[hwq];
     539                 :            : }
     540                 :            : 
     541                 :          0 : static int virtscsi_queuecommand(struct Scsi_Host *shost,
     542                 :            :                                  struct scsi_cmnd *sc)
     543                 :            : {
     544                 :          0 :         struct virtio_scsi *vscsi = shost_priv(shost);
     545                 :          0 :         struct virtio_scsi_vq *req_vq = virtscsi_pick_vq_mq(vscsi, sc);
     546         [ #  # ]:          0 :         struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc);
     547                 :          0 :         bool kick;
     548                 :          0 :         unsigned long flags;
     549                 :          0 :         int req_size;
     550                 :          0 :         int ret;
     551                 :            : 
     552         [ #  # ]:          0 :         BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize);
     553                 :            : 
     554                 :            :         /* TODO: check feature bit and fail if unsupported?  */
     555         [ #  # ]:          0 :         BUG_ON(sc->sc_data_direction == DMA_BIDIRECTIONAL);
     556                 :            : 
     557                 :          0 :         dev_dbg(&sc->device->sdev_gendev,
     558                 :            :                 "cmd %p CDB: %#02x\n", sc, sc->cmnd[0]);
     559                 :            : 
     560                 :          0 :         cmd->sc = sc;
     561                 :            : 
     562         [ #  # ]:          0 :         BUG_ON(sc->cmd_len > VIRTIO_SCSI_CDB_SIZE);
     563                 :            : 
     564                 :            : #ifdef CONFIG_BLK_DEV_INTEGRITY
     565                 :            :         if (virtio_has_feature(vscsi->vdev, VIRTIO_SCSI_F_T10_PI)) {
     566                 :            :                 virtio_scsi_init_hdr_pi(vscsi->vdev, &cmd->req.cmd_pi, sc);
     567                 :            :                 memcpy(cmd->req.cmd_pi.cdb, sc->cmnd, sc->cmd_len);
     568                 :            :                 req_size = sizeof(cmd->req.cmd_pi);
     569                 :            :         } else
     570                 :            : #endif
     571                 :            :         {
     572                 :          0 :                 virtio_scsi_init_hdr(vscsi->vdev, &cmd->req.cmd, sc);
     573                 :          0 :                 memcpy(cmd->req.cmd.cdb, sc->cmnd, sc->cmd_len);
     574                 :          0 :                 req_size = sizeof(cmd->req.cmd);
     575                 :            :         }
     576                 :            : 
     577                 :          0 :         kick = (sc->flags & SCMD_LAST) != 0;
     578                 :          0 :         ret = virtscsi_add_cmd(req_vq, cmd, req_size, sizeof(cmd->resp.cmd), kick);
     579         [ #  # ]:          0 :         if (ret == -EIO) {
     580                 :          0 :                 cmd->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET;
     581                 :          0 :                 spin_lock_irqsave(&req_vq->vq_lock, flags);
     582                 :          0 :                 virtscsi_complete_cmd(vscsi, cmd);
     583                 :          0 :                 spin_unlock_irqrestore(&req_vq->vq_lock, flags);
     584         [ #  # ]:          0 :         } else if (ret != 0) {
     585                 :          0 :                 return SCSI_MLQUEUE_HOST_BUSY;
     586                 :            :         }
     587                 :            :         return 0;
     588                 :            : }
     589                 :            : 
     590                 :          0 : static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)
     591                 :            : {
     592                 :          0 :         DECLARE_COMPLETION_ONSTACK(comp);
     593                 :          0 :         int ret = FAILED;
     594                 :            : 
     595                 :          0 :         cmd->comp = &comp;
     596         [ #  # ]:          0 :         if (virtscsi_add_cmd(&vscsi->ctrl_vq, cmd,
     597                 :            :                               sizeof cmd->req.tmf, sizeof cmd->resp.tmf, true) < 0)
     598                 :          0 :                 goto out;
     599                 :            : 
     600                 :          0 :         wait_for_completion(&comp);
     601         [ #  # ]:          0 :         if (cmd->resp.tmf.response == VIRTIO_SCSI_S_OK ||
     602                 :            :             cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED)
     603                 :          0 :                 ret = SUCCESS;
     604                 :            : 
     605                 :            :         /*
     606                 :            :          * The spec guarantees that all requests related to the TMF have
     607                 :            :          * been completed, but the callback might not have run yet if
     608                 :            :          * we're using independent interrupts (e.g. MSI).  Poll the
     609                 :            :          * virtqueues once.
     610                 :            :          *
     611                 :            :          * In the abort case, sc->scsi_done will do nothing, because
     612                 :            :          * the block layer must have detected a timeout and as a result
     613                 :            :          * REQ_ATOM_COMPLETE has been set.
     614                 :            :          */
     615                 :          0 :         virtscsi_poll_requests(vscsi);
     616                 :            : 
     617                 :          0 : out:
     618                 :          0 :         mempool_free(cmd, virtscsi_cmd_pool);
     619                 :          0 :         return ret;
     620                 :            : }
     621                 :            : 
     622                 :          0 : static int virtscsi_device_reset(struct scsi_cmnd *sc)
     623                 :            : {
     624                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sc->device->host);
     625                 :          0 :         struct virtio_scsi_cmd *cmd;
     626                 :            : 
     627                 :          0 :         sdev_printk(KERN_INFO, sc->device, "device reset\n");
     628                 :          0 :         cmd = mempool_alloc(virtscsi_cmd_pool, GFP_NOIO);
     629         [ #  # ]:          0 :         if (!cmd)
     630                 :            :                 return FAILED;
     631                 :            : 
     632                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     633                 :          0 :         cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
     634                 :            :                 .type = VIRTIO_SCSI_T_TMF,
     635                 :          0 :                 .subtype = cpu_to_virtio32(vscsi->vdev,
     636                 :            :                                              VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET),
     637                 :            :                 .lun[0] = 1,
     638                 :          0 :                 .lun[1] = sc->device->id,
     639                 :          0 :                 .lun[2] = (sc->device->lun >> 8) | 0x40,
     640                 :            :                 .lun[3] = sc->device->lun & 0xff,
     641                 :            :         };
     642                 :          0 :         return virtscsi_tmf(vscsi, cmd);
     643                 :            : }
     644                 :            : 
     645                 :          0 : static int virtscsi_device_alloc(struct scsi_device *sdevice)
     646                 :            : {
     647                 :            :         /*
     648                 :            :          * Passed through SCSI targets (e.g. with qemu's 'scsi-block')
     649                 :            :          * may have transfer limits which come from the host SCSI
     650                 :            :          * controller or something on the host side other than the
     651                 :            :          * target itself.
     652                 :            :          *
     653                 :            :          * To make this work properly, the hypervisor can adjust the
     654                 :            :          * target's VPD information to advertise these limits.  But
     655                 :            :          * for that to work, the guest has to look at the VPD pages,
     656                 :            :          * which we won't do by default if it is an SPC-2 device, even
     657                 :            :          * if it does actually support it.
     658                 :            :          *
     659                 :            :          * So, set the blist to always try to read the VPD pages.
     660                 :            :          */
     661                 :          0 :         sdevice->sdev_bflags = BLIST_TRY_VPD_PAGES;
     662                 :            : 
     663                 :          0 :         return 0;
     664                 :            : }
     665                 :            : 
     666                 :            : 
     667                 :            : /**
     668                 :            :  * virtscsi_change_queue_depth() - Change a virtscsi target's queue depth
     669                 :            :  * @sdev:       Virtscsi target whose queue depth to change
     670                 :            :  * @qdepth:     New queue depth
     671                 :            :  */
     672                 :          0 : static int virtscsi_change_queue_depth(struct scsi_device *sdev, int qdepth)
     673                 :            : {
     674                 :          0 :         struct Scsi_Host *shost = sdev->host;
     675                 :          0 :         int max_depth = shost->cmd_per_lun;
     676                 :            : 
     677                 :          0 :         return scsi_change_queue_depth(sdev, min(max_depth, qdepth));
     678                 :            : }
     679                 :            : 
     680                 :          0 : static int virtscsi_abort(struct scsi_cmnd *sc)
     681                 :            : {
     682                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sc->device->host);
     683                 :          0 :         struct virtio_scsi_cmd *cmd;
     684                 :            : 
     685                 :          0 :         scmd_printk(KERN_INFO, sc, "abort\n");
     686                 :          0 :         cmd = mempool_alloc(virtscsi_cmd_pool, GFP_NOIO);
     687         [ #  # ]:          0 :         if (!cmd)
     688                 :            :                 return FAILED;
     689                 :            : 
     690                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     691                 :          0 :         cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
     692                 :            :                 .type = VIRTIO_SCSI_T_TMF,
     693                 :            :                 .subtype = VIRTIO_SCSI_T_TMF_ABORT_TASK,
     694                 :            :                 .lun[0] = 1,
     695                 :          0 :                 .lun[1] = sc->device->id,
     696                 :          0 :                 .lun[2] = (sc->device->lun >> 8) | 0x40,
     697                 :            :                 .lun[3] = sc->device->lun & 0xff,
     698                 :          0 :                 .tag = cpu_to_virtio64(vscsi->vdev, (unsigned long)sc),
     699                 :            :         };
     700                 :          0 :         return virtscsi_tmf(vscsi, cmd);
     701                 :            : }
     702                 :            : 
     703                 :          0 : static int virtscsi_map_queues(struct Scsi_Host *shost)
     704                 :            : {
     705                 :          0 :         struct virtio_scsi *vscsi = shost_priv(shost);
     706                 :          0 :         struct blk_mq_queue_map *qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT];
     707                 :            : 
     708                 :          0 :         return blk_mq_virtio_map_queues(qmap, vscsi->vdev, 2);
     709                 :            : }
     710                 :            : 
     711                 :          0 : static void virtscsi_commit_rqs(struct Scsi_Host *shost, u16 hwq)
     712                 :            : {
     713                 :          0 :         struct virtio_scsi *vscsi = shost_priv(shost);
     714                 :            : 
     715                 :          0 :         virtscsi_kick_vq(&vscsi->req_vqs[hwq]);
     716                 :          0 : }
     717                 :            : 
     718                 :            : /*
     719                 :            :  * The host guarantees to respond to each command, although I/O
     720                 :            :  * latencies might be higher than on bare metal.  Reset the timer
     721                 :            :  * unconditionally to give the host a chance to perform EH.
     722                 :            :  */
     723                 :          0 : static enum blk_eh_timer_return virtscsi_eh_timed_out(struct scsi_cmnd *scmnd)
     724                 :            : {
     725                 :          0 :         return BLK_EH_RESET_TIMER;
     726                 :            : }
     727                 :            : 
     728                 :            : static struct scsi_host_template virtscsi_host_template = {
     729                 :            :         .module = THIS_MODULE,
     730                 :            :         .name = "Virtio SCSI HBA",
     731                 :            :         .proc_name = "virtio_scsi",
     732                 :            :         .this_id = -1,
     733                 :            :         .cmd_size = sizeof(struct virtio_scsi_cmd),
     734                 :            :         .queuecommand = virtscsi_queuecommand,
     735                 :            :         .commit_rqs = virtscsi_commit_rqs,
     736                 :            :         .change_queue_depth = virtscsi_change_queue_depth,
     737                 :            :         .eh_abort_handler = virtscsi_abort,
     738                 :            :         .eh_device_reset_handler = virtscsi_device_reset,
     739                 :            :         .eh_timed_out = virtscsi_eh_timed_out,
     740                 :            :         .slave_alloc = virtscsi_device_alloc,
     741                 :            : 
     742                 :            :         .dma_boundary = UINT_MAX,
     743                 :            :         .map_queues = virtscsi_map_queues,
     744                 :            :         .track_queue_depth = 1,
     745                 :            :         .force_blk_mq = 1,
     746                 :            : };
     747                 :            : 
     748                 :            : #define virtscsi_config_get(vdev, fld) \
     749                 :            :         ({ \
     750                 :            :                 typeof(((struct virtio_scsi_config *)0)->fld) __val; \
     751                 :            :                 virtio_cread(vdev, struct virtio_scsi_config, fld, &__val); \
     752                 :            :                 __val; \
     753                 :            :         })
     754                 :            : 
     755                 :            : #define virtscsi_config_set(vdev, fld, val) \
     756                 :            :         do { \
     757                 :            :                 typeof(((struct virtio_scsi_config *)0)->fld) __val = (val); \
     758                 :            :                 virtio_cwrite(vdev, struct virtio_scsi_config, fld, &__val); \
     759                 :            :         } while(0)
     760                 :            : 
     761                 :          0 : static void virtscsi_init_vq(struct virtio_scsi_vq *virtscsi_vq,
     762                 :            :                              struct virtqueue *vq)
     763                 :            : {
     764                 :          0 :         spin_lock_init(&virtscsi_vq->vq_lock);
     765                 :          0 :         virtscsi_vq->vq = vq;
     766                 :            : }
     767                 :            : 
     768                 :          0 : static void virtscsi_remove_vqs(struct virtio_device *vdev)
     769                 :            : {
     770                 :            :         /* Stop all the virtqueues. */
     771                 :          0 :         vdev->config->reset(vdev);
     772                 :          0 :         vdev->config->del_vqs(vdev);
     773                 :          0 : }
     774                 :            : 
     775                 :          0 : static int virtscsi_init(struct virtio_device *vdev,
     776                 :            :                          struct virtio_scsi *vscsi)
     777                 :            : {
     778                 :          0 :         int err;
     779                 :          0 :         u32 i;
     780                 :          0 :         u32 num_vqs;
     781                 :          0 :         vq_callback_t **callbacks;
     782                 :          0 :         const char **names;
     783                 :          0 :         struct virtqueue **vqs;
     784                 :          0 :         struct irq_affinity desc = { .pre_vectors = 2 };
     785                 :            : 
     786                 :          0 :         num_vqs = vscsi->num_queues + VIRTIO_SCSI_VQ_BASE;
     787                 :          0 :         vqs = kmalloc_array(num_vqs, sizeof(struct virtqueue *), GFP_KERNEL);
     788                 :          0 :         callbacks = kmalloc_array(num_vqs, sizeof(vq_callback_t *),
     789                 :            :                                   GFP_KERNEL);
     790                 :          0 :         names = kmalloc_array(num_vqs, sizeof(char *), GFP_KERNEL);
     791                 :            : 
     792   [ #  #  #  # ]:          0 :         if (!callbacks || !vqs || !names) {
     793                 :          0 :                 err = -ENOMEM;
     794                 :          0 :                 goto out;
     795                 :            :         }
     796                 :            : 
     797                 :          0 :         callbacks[0] = virtscsi_ctrl_done;
     798                 :          0 :         callbacks[1] = virtscsi_event_done;
     799                 :          0 :         names[0] = "control";
     800                 :          0 :         names[1] = "event";
     801         [ #  # ]:          0 :         for (i = VIRTIO_SCSI_VQ_BASE; i < num_vqs; i++) {
     802                 :          0 :                 callbacks[i] = virtscsi_req_done;
     803                 :          0 :                 names[i] = "request";
     804                 :            :         }
     805                 :            : 
     806                 :            :         /* Discover virtqueues and write information to configuration.  */
     807                 :          0 :         err = virtio_find_vqs(vdev, num_vqs, vqs, callbacks, names, &desc);
     808         [ #  # ]:          0 :         if (err)
     809                 :          0 :                 goto out;
     810                 :            : 
     811                 :          0 :         virtscsi_init_vq(&vscsi->ctrl_vq, vqs[0]);
     812                 :          0 :         virtscsi_init_vq(&vscsi->event_vq, vqs[1]);
     813         [ #  # ]:          0 :         for (i = VIRTIO_SCSI_VQ_BASE; i < num_vqs; i++)
     814                 :          0 :                 virtscsi_init_vq(&vscsi->req_vqs[i - VIRTIO_SCSI_VQ_BASE],
     815                 :          0 :                                  vqs[i]);
     816                 :            : 
     817                 :          0 :         virtscsi_config_set(vdev, cdb_size, VIRTIO_SCSI_CDB_SIZE);
     818                 :          0 :         virtscsi_config_set(vdev, sense_size, VIRTIO_SCSI_SENSE_SIZE);
     819                 :            : 
     820                 :          0 :         err = 0;
     821                 :            : 
     822                 :          0 : out:
     823                 :          0 :         kfree(names);
     824                 :          0 :         kfree(callbacks);
     825                 :          0 :         kfree(vqs);
     826         [ #  # ]:          0 :         if (err)
     827                 :          0 :                 virtscsi_remove_vqs(vdev);
     828                 :          0 :         return err;
     829                 :            : }
     830                 :            : 
     831                 :          0 : static int virtscsi_probe(struct virtio_device *vdev)
     832                 :            : {
     833                 :          0 :         struct Scsi_Host *shost;
     834                 :          0 :         struct virtio_scsi *vscsi;
     835                 :          0 :         int err;
     836                 :          0 :         u32 sg_elems, num_targets;
     837                 :          0 :         u32 cmd_per_lun;
     838                 :          0 :         u32 num_queues;
     839                 :            : 
     840         [ #  # ]:          0 :         if (!vdev->config->get) {
     841                 :          0 :                 dev_err(&vdev->dev, "%s failure: config access disabled\n",
     842                 :            :                         __func__);
     843                 :          0 :                 return -EINVAL;
     844                 :            :         }
     845                 :            : 
     846                 :            :         /* We need to know how many queues before we allocate. */
     847                 :          0 :         num_queues = virtscsi_config_get(vdev, num_queues) ? : 1;
     848                 :          0 :         num_queues = min_t(unsigned int, nr_cpu_ids, num_queues);
     849                 :            : 
     850                 :          0 :         num_targets = virtscsi_config_get(vdev, max_target) + 1;
     851                 :            : 
     852                 :          0 :         shost = scsi_host_alloc(&virtscsi_host_template,
     853         [ #  # ]:          0 :                                 struct_size(vscsi, req_vqs, num_queues));
     854         [ #  # ]:          0 :         if (!shost)
     855                 :            :                 return -ENOMEM;
     856                 :            : 
     857                 :          0 :         sg_elems = virtscsi_config_get(vdev, seg_max) ?: 1;
     858                 :          0 :         shost->sg_tablesize = sg_elems;
     859                 :          0 :         vscsi = shost_priv(shost);
     860                 :          0 :         vscsi->vdev = vdev;
     861                 :          0 :         vscsi->num_queues = num_queues;
     862                 :          0 :         vdev->priv = shost;
     863                 :            : 
     864                 :          0 :         err = virtscsi_init(vdev, vscsi);
     865         [ #  # ]:          0 :         if (err)
     866                 :          0 :                 goto virtscsi_init_failed;
     867                 :            : 
     868                 :          0 :         shost->can_queue = virtqueue_get_vring_size(vscsi->req_vqs[0].vq);
     869                 :            : 
     870                 :          0 :         cmd_per_lun = virtscsi_config_get(vdev, cmd_per_lun) ?: 1;
     871                 :          0 :         shost->cmd_per_lun = min_t(u32, cmd_per_lun, shost->can_queue);
     872         [ #  # ]:          0 :         shost->max_sectors = virtscsi_config_get(vdev, max_sectors) ?: 0xFFFF;
     873                 :            : 
     874                 :            :         /* LUNs > 256 are reported with format 1, so they go in the range
     875                 :            :          * 16640-32767.
     876                 :            :          */
     877                 :          0 :         shost->max_lun = virtscsi_config_get(vdev, max_lun) + 1 + 0x4000;
     878                 :          0 :         shost->max_id = num_targets;
     879                 :          0 :         shost->max_channel = 0;
     880                 :          0 :         shost->max_cmd_len = VIRTIO_SCSI_CDB_SIZE;
     881                 :          0 :         shost->nr_hw_queues = num_queues;
     882                 :            : 
     883                 :            : #ifdef CONFIG_BLK_DEV_INTEGRITY
     884                 :            :         if (virtio_has_feature(vdev, VIRTIO_SCSI_F_T10_PI)) {
     885                 :            :                 int host_prot;
     886                 :            : 
     887                 :            :                 host_prot = SHOST_DIF_TYPE1_PROTECTION | SHOST_DIF_TYPE2_PROTECTION |
     888                 :            :                             SHOST_DIF_TYPE3_PROTECTION | SHOST_DIX_TYPE1_PROTECTION |
     889                 :            :                             SHOST_DIX_TYPE2_PROTECTION | SHOST_DIX_TYPE3_PROTECTION;
     890                 :            : 
     891                 :            :                 scsi_host_set_prot(shost, host_prot);
     892                 :            :                 scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC);
     893                 :            :         }
     894                 :            : #endif
     895                 :            : 
     896                 :          0 :         err = scsi_add_host(shost, &vdev->dev);
     897         [ #  # ]:          0 :         if (err)
     898                 :          0 :                 goto scsi_add_host_failed;
     899                 :            : 
     900                 :          0 :         virtio_device_ready(vdev);
     901                 :            : 
     902         [ #  # ]:          0 :         if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
     903                 :            :                 virtscsi_kick_event_all(vscsi);
     904                 :            : 
     905                 :          0 :         scsi_scan_host(shost);
     906                 :          0 :         return 0;
     907                 :            : 
     908                 :            : scsi_add_host_failed:
     909                 :          0 :         vdev->config->del_vqs(vdev);
     910                 :          0 : virtscsi_init_failed:
     911                 :          0 :         scsi_host_put(shost);
     912                 :          0 :         return err;
     913                 :            : }
     914                 :            : 
     915                 :          0 : static void virtscsi_remove(struct virtio_device *vdev)
     916                 :            : {
     917                 :          0 :         struct Scsi_Host *shost = virtio_scsi_host(vdev);
     918                 :          0 :         struct virtio_scsi *vscsi = shost_priv(shost);
     919                 :            : 
     920         [ #  # ]:          0 :         if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
     921                 :          0 :                 virtscsi_cancel_event_work(vscsi);
     922                 :            : 
     923                 :          0 :         scsi_remove_host(shost);
     924                 :          0 :         virtscsi_remove_vqs(vdev);
     925                 :          0 :         scsi_host_put(shost);
     926                 :          0 : }
     927                 :            : 
     928                 :            : #ifdef CONFIG_PM_SLEEP
     929                 :          0 : static int virtscsi_freeze(struct virtio_device *vdev)
     930                 :            : {
     931                 :          0 :         virtscsi_remove_vqs(vdev);
     932                 :          0 :         return 0;
     933                 :            : }
     934                 :            : 
     935                 :          0 : static int virtscsi_restore(struct virtio_device *vdev)
     936                 :            : {
     937                 :          0 :         struct Scsi_Host *sh = virtio_scsi_host(vdev);
     938                 :          0 :         struct virtio_scsi *vscsi = shost_priv(sh);
     939                 :          0 :         int err;
     940                 :            : 
     941                 :          0 :         err = virtscsi_init(vdev, vscsi);
     942         [ #  # ]:          0 :         if (err)
     943                 :            :                 return err;
     944                 :            : 
     945                 :          0 :         virtio_device_ready(vdev);
     946                 :            : 
     947         [ #  # ]:          0 :         if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
     948                 :            :                 virtscsi_kick_event_all(vscsi);
     949                 :            : 
     950                 :            :         return err;
     951                 :            : }
     952                 :            : #endif
     953                 :            : 
     954                 :            : static struct virtio_device_id id_table[] = {
     955                 :            :         { VIRTIO_ID_SCSI, VIRTIO_DEV_ANY_ID },
     956                 :            :         { 0 },
     957                 :            : };
     958                 :            : 
     959                 :            : static unsigned int features[] = {
     960                 :            :         VIRTIO_SCSI_F_HOTPLUG,
     961                 :            :         VIRTIO_SCSI_F_CHANGE,
     962                 :            : #ifdef CONFIG_BLK_DEV_INTEGRITY
     963                 :            :         VIRTIO_SCSI_F_T10_PI,
     964                 :            : #endif
     965                 :            : };
     966                 :            : 
     967                 :            : static struct virtio_driver virtio_scsi_driver = {
     968                 :            :         .feature_table = features,
     969                 :            :         .feature_table_size = ARRAY_SIZE(features),
     970                 :            :         .driver.name = KBUILD_MODNAME,
     971                 :            :         .driver.owner = THIS_MODULE,
     972                 :            :         .id_table = id_table,
     973                 :            :         .probe = virtscsi_probe,
     974                 :            : #ifdef CONFIG_PM_SLEEP
     975                 :            :         .freeze = virtscsi_freeze,
     976                 :            :         .restore = virtscsi_restore,
     977                 :            : #endif
     978                 :            :         .remove = virtscsi_remove,
     979                 :            : };
     980                 :            : 
     981                 :         11 : static int __init init(void)
     982                 :            : {
     983                 :         11 :         int ret = -ENOMEM;
     984                 :            : 
     985                 :         11 :         virtscsi_cmd_cache = KMEM_CACHE(virtio_scsi_cmd, 0);
     986         [ -  + ]:         11 :         if (!virtscsi_cmd_cache) {
     987                 :          0 :                 pr_err("kmem_cache_create() for virtscsi_cmd_cache failed\n");
     988                 :          0 :                 goto error;
     989                 :            :         }
     990                 :            : 
     991                 :            : 
     992                 :         11 :         virtscsi_cmd_pool =
     993                 :            :                 mempool_create_slab_pool(VIRTIO_SCSI_MEMPOOL_SZ,
     994                 :            :                                          virtscsi_cmd_cache);
     995         [ -  + ]:         11 :         if (!virtscsi_cmd_pool) {
     996                 :          0 :                 pr_err("mempool_create() for virtscsi_cmd_pool failed\n");
     997                 :          0 :                 goto error;
     998                 :            :         }
     999                 :         11 :         ret = register_virtio_driver(&virtio_scsi_driver);
    1000         [ -  + ]:         11 :         if (ret < 0)
    1001                 :          0 :                 goto error;
    1002                 :            : 
    1003                 :            :         return 0;
    1004                 :            : 
    1005                 :          0 : error:
    1006         [ #  # ]:          0 :         if (virtscsi_cmd_pool) {
    1007                 :          0 :                 mempool_destroy(virtscsi_cmd_pool);
    1008                 :          0 :                 virtscsi_cmd_pool = NULL;
    1009                 :            :         }
    1010         [ #  # ]:          0 :         if (virtscsi_cmd_cache) {
    1011                 :          0 :                 kmem_cache_destroy(virtscsi_cmd_cache);
    1012                 :          0 :                 virtscsi_cmd_cache = NULL;
    1013                 :            :         }
    1014                 :            :         return ret;
    1015                 :            : }
    1016                 :            : 
    1017                 :          0 : static void __exit fini(void)
    1018                 :            : {
    1019                 :          0 :         unregister_virtio_driver(&virtio_scsi_driver);
    1020                 :          0 :         mempool_destroy(virtscsi_cmd_pool);
    1021                 :          0 :         kmem_cache_destroy(virtscsi_cmd_cache);
    1022                 :          0 : }
    1023                 :            : module_init(init);
    1024                 :            : module_exit(fini);
    1025                 :            : 
    1026                 :            : MODULE_DEVICE_TABLE(virtio, id_table);
    1027                 :            : MODULE_DESCRIPTION("Virtio SCSI HBA driver");
    1028                 :            : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14