Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
[sfrench/cifs-2.6.git] / drivers / infiniband / ulp / srp / ib_srp.h
index 9dc6fc3fd894f1fce02d60daf4a598193277dfa2..020caf0c3789ed0d6bd14fa95708132a3bdb8c94 100644 (file)
@@ -69,9 +69,13 @@ enum {
        SRP_TAG_NO_REQ          = ~0U,
        SRP_TAG_TSK_MGMT        = 1U << 31,
 
-       SRP_FMR_SIZE            = 256,
+       SRP_FMR_SIZE            = 512,
+       SRP_FMR_MIN_SIZE        = 128,
        SRP_FMR_POOL_SIZE       = 1024,
-       SRP_FMR_DIRTY_SIZE      = SRP_FMR_POOL_SIZE / 4
+       SRP_FMR_DIRTY_SIZE      = SRP_FMR_POOL_SIZE / 4,
+
+       SRP_MAP_ALLOW_FMR       = 0,
+       SRP_MAP_NO_FMR          = 1,
 };
 
 enum srp_target_state {
@@ -93,9 +97,9 @@ struct srp_device {
        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;
+       int                     fmr_page_size;
+       int                     fmr_max_size;
 };
 
 struct srp_host {
@@ -112,7 +116,11 @@ struct srp_request {
        struct list_head        list;
        struct scsi_cmnd       *scmnd;
        struct srp_iu          *cmd;
-       struct ib_pool_fmr     *fmr;
+       struct ib_pool_fmr    **fmr_list;
+       u64                    *map_page;
+       struct srp_direct_buf  *indirect_desc;
+       dma_addr_t              indirect_dma_addr;
+       short                   nfmr;
        short                   index;
 };
 
@@ -130,6 +138,10 @@ struct srp_target_port {
        u32                     lkey;
        u32                     rkey;
        enum srp_target_state   state;
+       unsigned int            max_iu_len;
+       unsigned int            cmd_sg_cnt;
+       unsigned int            indirect_size;
+       bool                    allow_ext_sg;
 
        /* Everything above this point is used in the hot path of
         * command processing. Try to keep them packed into cachelines.
@@ -144,6 +156,7 @@ struct srp_target_port {
        struct Scsi_Host       *scsi_host;
        char                    target_name[32];
        unsigned int            scsi_id;
+       unsigned int            sg_tablesize;
 
        struct ib_sa_path_rec   path;
        __be16                  orig_dgid[8];
@@ -179,4 +192,19 @@ struct srp_iu {
        enum dma_data_direction direction;
 };
 
+struct srp_map_state {
+       struct ib_pool_fmr    **next_fmr;
+       struct srp_direct_buf  *desc;
+       u64                    *pages;
+       dma_addr_t              base_dma_addr;
+       u32                     fmr_len;
+       u32                     total_len;
+       unsigned int            npages;
+       unsigned int            nfmr;
+       unsigned int            ndesc;
+       struct scatterlist     *unmapped_sg;
+       int                     unmapped_index;
+       dma_addr_t              unmapped_addr;
+};
+
 #endif /* IB_SRP_H */