scsi: ibmvfc: Add protocol field to ibmvfc_channels
authorTyrel Datwyler <tyreld@linux.ibm.com>
Thu, 21 Sep 2023 22:54:33 +0000 (17:54 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 22 Sep 2023 02:14:20 +0000 (22:14 -0400)
There are cases in the generic code where protocol specific configuration
or actions may need to be taken. Add a protocol field to struct
ibmvfc_channels and initial IBMVFC_PROTO_[SCSI/NVME] definitions.

Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
Link: https://lore.kernel.org/r/20230921225435.3537728-10-tyreld@linux.ibm.com
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvfc.h

index f6646d71633dcb8cd5838e42637d965a4f23d8cf..a1d547db7eef8881c6f2f714715bedc5d817c151 100644 (file)
@@ -3935,7 +3935,7 @@ static void ibmvfc_drain_sub_crq(struct ibmvfc_queue *scrq)
        }
 }
 
-static irqreturn_t ibmvfc_interrupt_scsi(int irq, void *scrq_instance)
+static irqreturn_t ibmvfc_interrupt_mq(int irq, void *scrq_instance)
 {
        struct ibmvfc_queue *scrq = (struct ibmvfc_queue *)scrq_instance;
 
@@ -5936,9 +5936,24 @@ static int ibmvfc_register_channel(struct ibmvfc_host *vhost,
                goto irq_failed;
        }
 
-       snprintf(scrq->name, sizeof(scrq->name), "ibmvfc-%x-scsi%d",
-                vdev->unit_address, index);
-       rc = request_irq(scrq->irq, ibmvfc_interrupt_scsi, 0, scrq->name, scrq);
+       switch (channels->protocol) {
+       case IBMVFC_PROTO_SCSI:
+               snprintf(scrq->name, sizeof(scrq->name), "ibmvfc-%x-scsi%d",
+                        vdev->unit_address, index);
+               scrq->handler = ibmvfc_interrupt_mq;
+               break;
+       case IBMVFC_PROTO_NVME:
+               snprintf(scrq->name, sizeof(scrq->name), "ibmvfc-%x-nvmf%d",
+                        vdev->unit_address, index);
+               scrq->handler = ibmvfc_interrupt_mq;
+               break;
+       default:
+               dev_err(dev, "Unknown channel protocol (%d)\n",
+                       channels->protocol);
+               goto irq_failed;
+       }
+
+       rc = request_irq(scrq->irq, scrq->handler, 0, scrq->name, scrq);
 
        if (rc) {
                dev_err(dev, "Couldn't register sub-crq[%d] irq\n", index);
@@ -6317,6 +6332,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        vhost->mq_enabled = mq_enabled;
        vhost->scsi_scrqs.desired_queues = min(shost->nr_hw_queues, nr_scsi_channels);
        vhost->scsi_scrqs.max_queues = shost->nr_hw_queues;
+       vhost->scsi_scrqs.protocol = IBMVFC_PROTO_SCSI;
        vhost->using_channels = 0;
        vhost->do_enquiry = 1;
        vhost->scan_timeout = 0;
index 79e1a3bbb2f7730fb2fcbb3c9813aa14bcec4c47..085dfc38446aa79ad11749d974f5b95674ff0829 100644 (file)
@@ -813,10 +813,17 @@ struct ibmvfc_queue {
        unsigned long irq;
        unsigned long hwq_id;
        char name[32];
+       irq_handler_t handler;
+};
+
+enum ibmvfc_protocol {
+       IBMVFC_PROTO_SCSI = 0,
+       IBMVFC_PROTO_NVME = 1,
 };
 
 struct ibmvfc_channels {
        struct ibmvfc_queue *scrqs;
+       enum ibmvfc_protocol protocol;
        unsigned int active_queues;
        unsigned int desired_queues;
        unsigned int max_queues;