Merge ../linux-2.6-watchdog-mm
[linux-drm-fsl-dcu.git] / drivers / infiniband / ulp / srp / ib_srp.h
index c5cd43aae8604af42fb349b160e608a10a84c16d..d4e35ef51374db17ece91fa2b13a4d1556002ca8 100644 (file)
@@ -46,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,
@@ -55,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,
@@ -77,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;
+       unsigned long           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;
 };
@@ -95,6 +105,7 @@ struct srp_request {
        struct scsi_cmnd       *scmnd;
        struct srp_iu          *cmd;
        struct srp_iu          *tsk_mgmt;
+       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.
@@ -110,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];
@@ -126,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];