fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / infiniband / ulp / srp / ib_srp.h
index 4e7727d..c217723 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/types.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
+#include <linux/scatterlist.h>
 
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
@@ -45,6 +46,7 @@
 #include <rdma/ib_verbs.h>
 #include <rdma/ib_sa.h>
 #include <rdma/ib_cm.h>
+#include <rdma/ib_fmr_pool.h>
 
 enum {
        SRP_PATH_REC_TIMEOUT_MS = 1000,
@@ -54,20 +56,21 @@ enum {
        SRP_DLID_REDIRECT       = 2,
 
        SRP_MAX_LUN             = 512,
-       SRP_MAX_IU_LEN          = 256,
+       SRP_DEF_SG_TABLESIZE    = 12,
 
        SRP_RQ_SHIFT            = 6,
        SRP_RQ_SIZE             = 1 << SRP_RQ_SHIFT,
        SRP_SQ_SIZE             = SRP_RQ_SIZE - 1,
        SRP_CQ_SIZE             = SRP_SQ_SIZE + SRP_RQ_SIZE,
 
-       SRP_TAG_TSK_MGMT        = 1 << (SRP_RQ_SHIFT + 1)
+       SRP_TAG_TSK_MGMT        = 1 << (SRP_RQ_SHIFT + 1),
+
+       SRP_FMR_SIZE            = 256,
+       SRP_FMR_POOL_SIZE       = 1024,
+       SRP_FMR_DIRTY_SIZE      = SRP_FMR_POOL_SIZE / 4
 };
 
 #define SRP_OP_RECV            (1 << 31)
-#define SRP_MAX_INDIRECT       ((SRP_MAX_IU_LEN -                      \
-                                 sizeof (struct srp_cmd) -             \
-                                 sizeof (struct srp_indirect_buf)) / 16)
 
 enum srp_target_state {
        SRP_TARGET_LIVE,
@@ -76,15 +79,23 @@ enum srp_target_state {
        SRP_TARGET_REMOVED
 };
 
-struct srp_host {
-       u8                      initiator_port_id[16];
+struct srp_device {
+       struct list_head        dev_list;
        struct ib_device       *dev;
-       u8                      port;
        struct ib_pd           *pd;
        struct ib_mr           *mr;
+       struct ib_fmr_pool     *fmr_pool;
+       int                     fmr_page_shift;
+       int                     fmr_page_size;
+       u64                     fmr_page_mask;
+};
+
+struct srp_host {
+       struct srp_device      *dev;
+       u8                      port;
        struct class_device     class_dev;
        struct list_head        target_list;
-       struct mutex            target_mutex;
+       spinlock_t              target_lock;
        struct completion       released;
        struct list_head        list;
 };
@@ -94,9 +105,14 @@ struct srp_request {
        struct scsi_cmnd       *scmnd;
        struct srp_iu          *cmd;
        struct srp_iu          *tsk_mgmt;
-       DECLARE_PCI_UNMAP_ADDR(direct_mapping)
+       struct ib_pool_fmr     *fmr;
+       /*
+        * Fake scatterlist used when scmnd->use_sg==0.  Can be killed
+        * when the SCSI midlayer no longer generates non-SG commands.
+        */
+       struct scatterlist      fake_sg;
        struct completion       done;
-       short                   next;
+       short                   index;
        u8                      cmd_done;
        u8                      tsk_status;
 };
@@ -105,6 +121,8 @@ struct srp_target_port {
        __be64                  id_ext;
        __be64                  ioc_guid;
        __be64                  service_id;
+       __be64                  initiator_ext;
+       u16                     io_class;
        struct srp_host        *srp_host;
        struct Scsi_Host       *scsi_host;
        char                    target_name[32];
@@ -121,6 +139,8 @@ struct srp_target_port {
        int                     max_ti_iu_len;
        s32                     req_lim;
 
+       int                     zero_req_lim;
+
        unsigned                rx_head;
        struct srp_iu          *rx_ring[SRP_RQ_SIZE];
 
@@ -128,7 +148,7 @@ struct srp_target_port {
        unsigned                tx_tail;
        struct srp_iu          *tx_ring[SRP_SQ_SIZE + 1];
 
-       int                     req_head;
+       struct list_head        free_reqs;
        struct list_head        req_queue;
        struct srp_request      req_ring[SRP_SQ_SIZE];
 
@@ -141,7 +161,7 @@ struct srp_target_port {
 };
 
 struct srp_iu {
-       dma_addr_t              dma;
+       u64                     dma;
        void                   *buf;
        size_t                  size;
        enum dma_data_direction direction;