]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/infiniband/ulp/iser/iscsi_iser.c
IB/iser: Simplify send flow/descriptors
[net-next-2.6.git] / drivers / infiniband / ulp / iser / iscsi_iser.c
index 355470e7e9044a7547f09e66211ca1510d6455fc..331147b71a916a8b6c3b532032f68bee0135bdff 100644 (file)
@@ -128,6 +128,28 @@ static int iscsi_iser_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
        return 0;
 }
 
+int iser_initialize_task_headers(struct iscsi_task *task,
+                                               struct iser_tx_desc *tx_desc)
+{
+       struct iscsi_iser_conn *iser_conn = task->conn->dd_data;
+       struct iser_device     *device    = iser_conn->ib_conn->device;
+       struct iscsi_iser_task *iser_task = task->dd_data;
+       u64 dma_addr;
+
+       dma_addr = ib_dma_map_single(device->ib_device, (void *)tx_desc,
+                               ISER_HEADERS_LEN, DMA_TO_DEVICE);
+       if (ib_dma_mapping_error(device->ib_device, dma_addr))
+               return -ENOMEM;
+
+       tx_desc->dma_addr = dma_addr;
+       tx_desc->tx_sg[0].addr   = tx_desc->dma_addr;
+       tx_desc->tx_sg[0].length = ISER_HEADERS_LEN;
+       tx_desc->tx_sg[0].lkey   = device->mr->lkey;
+
+       iser_task->headers_initialized  = 1;
+       iser_task->iser_conn            = iser_conn;
+       return 0;
+}
 /**
  * iscsi_iser_task_init - Initialize task
  * @task: iscsi task
@@ -137,17 +159,17 @@ static int iscsi_iser_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
 static int
 iscsi_iser_task_init(struct iscsi_task *task)
 {
-       struct iscsi_iser_conn *iser_conn  = task->conn->dd_data;
        struct iscsi_iser_task *iser_task = task->dd_data;
 
+       if (!iser_task->headers_initialized)
+               if (iser_initialize_task_headers(task, &iser_task->desc))
+                       return -ENOMEM;
+
        /* mgmt task */
-       if (!task->sc) {
-               iser_task->desc.data = task->data;
+       if (!task->sc)
                return 0;
-       }
 
        iser_task->command_sent = 0;
-       iser_task->iser_conn    = iser_conn;
        iser_task_rdma_init(iser_task);
        return 0;
 }
@@ -675,7 +697,7 @@ static int __init iser_init(void)
        memset(&ig, 0, sizeof(struct iser_global));
 
        ig.desc_cache = kmem_cache_create("iser_descriptors",
-                                         sizeof (struct iser_desc),
+                                         sizeof(struct iser_tx_desc),
                                          0, SLAB_HWCACHE_ALIGN,
                                          NULL);
        if (ig.desc_cache == NULL)