OSDN Git Service

scsi: fnic: Add devcmd2 initialization helpers
authorSatish Kharat <satishkh@cisco.com>
Fri, 18 Jan 2019 22:51:42 +0000 (14:51 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 23 Jan 2019 02:18:34 +0000 (21:18 -0500)
This patch adds the devcmd2 wq initalization and devcmd2 ring allocation
helper interfaces used by devcmd2 init.

[mkp: typos]
Signed-off-by: Satish Kharat <satishkh@cisco.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/fnic/vnic_wq.c
drivers/scsi/fnic/vnic_wq.h

index a414135..74cfc56 100644 (file)
 #include "vnic_dev.h"
 #include "vnic_wq.h"
 
+
+int vnic_wq_get_ctrl(struct vnic_dev *vdev, struct vnic_wq *wq,
+               unsigned int index, enum vnic_res_type res_type)
+{
+       wq->ctrl = vnic_dev_get_res(vdev, res_type, index);
+
+       if (!wq->ctrl)
+               return -EINVAL;
+
+       return 0;
+}
+
+
+int vnic_wq_alloc_ring(struct vnic_dev *vdev, struct vnic_wq *wq,
+               unsigned int desc_count, unsigned int desc_size)
+{
+       return vnic_dev_alloc_desc_ring(vdev, &wq->ring, desc_count, desc_size);
+}
+
+
 static int vnic_wq_alloc_bufs(struct vnic_wq *wq)
 {
        struct vnic_wq_buf *buf;
@@ -111,6 +131,52 @@ int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
        return 0;
 }
 
+
+int vnic_wq_devcmd2_alloc(struct vnic_dev *vdev, struct vnic_wq *wq,
+               unsigned int desc_count, unsigned int desc_size)
+{
+       int err;
+
+       wq->index = 0;
+       wq->vdev = vdev;
+
+       err = vnic_wq_get_ctrl(vdev, wq, 0, RES_TYPE_DEVCMD2);
+       if (err) {
+               pr_err("Failed to get devcmd2 resource\n");
+               return err;
+       }
+       vnic_wq_disable(wq);
+
+       err = vnic_wq_alloc_ring(vdev, wq, desc_count, desc_size);
+       if (err)
+               return err;
+       return 0;
+}
+
+void vnic_wq_init_start(struct vnic_wq *wq, unsigned int cq_index,
+               unsigned int fetch_index, unsigned int posted_index,
+               unsigned int error_interrupt_enable,
+               unsigned int error_interrupt_offset)
+{
+       u64 paddr;
+       unsigned int count = wq->ring.desc_count;
+
+       paddr = (u64)wq->ring.base_addr | VNIC_PADDR_TARGET;
+       writeq(paddr, &wq->ctrl->ring_base);
+       iowrite32(count, &wq->ctrl->ring_size);
+       iowrite32(fetch_index, &wq->ctrl->fetch_index);
+       iowrite32(posted_index, &wq->ctrl->posted_index);
+       iowrite32(cq_index, &wq->ctrl->cq_index);
+       iowrite32(error_interrupt_enable, &wq->ctrl->error_interrupt_enable);
+       iowrite32(error_interrupt_offset, &wq->ctrl->error_interrupt_offset);
+       iowrite32(0, &wq->ctrl->error_status);
+
+       wq->to_use = wq->to_clean =
+               &wq->bufs[fetch_index / VNIC_WQ_BUF_BLK_ENTRIES]
+               [fetch_index % VNIC_WQ_BUF_BLK_ENTRIES];
+}
+
+
 void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
        unsigned int error_interrupt_enable,
        unsigned int error_interrupt_offset)
index 5cd094f..5d1e0a4 100644 (file)
@@ -33,6 +33,8 @@
 #define vnic_wq_service fnic_wq_service
 #define vnic_wq_free fnic_wq_free
 #define vnic_wq_alloc fnic_wq_alloc
+#define vnic_wq_devcmd2_alloc fnic_wq_devcmd2_alloc
+#define vnic_wq_init_start fnic_wq_init_start
 #define vnic_wq_init fnic_wq_init
 #define vnic_wq_error_status fnic_wq_error_status
 #define vnic_wq_enable fnic_wq_enable
@@ -163,6 +165,12 @@ static inline void vnic_wq_service(struct vnic_wq *wq,
 void vnic_wq_free(struct vnic_wq *wq);
 int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
        unsigned int desc_count, unsigned int desc_size);
+int vnic_wq_devcmd2_alloc(struct vnic_dev *vdev, struct vnic_wq *wq,
+               unsigned int desc_count, unsigned int desc_size);
+void vnic_wq_init_start(struct vnic_wq *wq, unsigned int cq_index,
+               unsigned int fetch_index, unsigned int posted_index,
+               unsigned int error_interrupt_enable,
+               unsigned int error_interrupt_offset);
 void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
        unsigned int error_interrupt_enable,
        unsigned int error_interrupt_offset);