percpu, module: implement and use is_kernel/module_percpu_address()
[safe/jmp/linux-2.6] / include / scsi / scsi_transport_iscsi.h
index 3f24503..349c7f3 100644 (file)
 
 struct scsi_transport_template;
 struct iscsi_transport;
+struct iscsi_endpoint;
 struct Scsi_Host;
 struct iscsi_cls_conn;
 struct iscsi_conn;
-struct iscsi_cmd_task;
+struct iscsi_task;
 struct sockaddr;
 
 /**
@@ -85,9 +86,9 @@ struct iscsi_transport {
        /* LLD sets this to indicate what values it can export to sysfs */
        uint64_t param_mask;
        uint64_t host_param_mask;
-       struct iscsi_cls_session *(*create_session) (struct Scsi_Host *shost,
+       struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
                                        uint16_t cmds_max, uint16_t qdepth,
-                                       uint32_t sn, uint32_t *hn);
+                                       uint32_t sn);
        void (*destroy_session) (struct iscsi_cls_session *session);
        struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
                                uint32_t cid);
@@ -112,17 +113,27 @@ struct iscsi_transport {
                         char *data, uint32_t data_size);
        void (*get_stats) (struct iscsi_cls_conn *conn,
                           struct iscsi_stats *stats);
-       int (*init_task) (struct iscsi_cmd_task *task);
-       int (*xmit_task) (struct iscsi_cmd_task *task);
-       void (*cleanup_task) (struct iscsi_conn *conn,
-                                 struct iscsi_cmd_task *task);
+
+       int (*init_task) (struct iscsi_task *task);
+       int (*xmit_task) (struct iscsi_task *task);
+       void (*cleanup_task) (struct iscsi_task *task);
+
+       int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode);
+       int (*xmit_pdu) (struct iscsi_task *task);
+       int (*init_pdu) (struct iscsi_task *task, unsigned int offset,
+                        unsigned int count);
+       void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt,
+                              int *index, int *age);
+
        void (*session_recovery_timedout) (struct iscsi_cls_session *session);
-       int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking,
-                          uint64_t *ep_handle);
-       int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
-       void (*ep_disconnect) (uint64_t ep_handle);
+       struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost,
+                                             struct sockaddr *dst_addr,
+                                             int non_blocking);
+       int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);
+       void (*ep_disconnect) (struct iscsi_endpoint *ep);
        int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
                          uint32_t enable, struct sockaddr *dst_addr);
+       int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);
 };
 
 /*
@@ -134,10 +145,15 @@ extern int iscsi_unregister_transport(struct iscsi_transport *tt);
 /*
  * control plane upcalls
  */
-extern void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error);
+extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
+                                  enum iscsi_err error);
 extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
                          char *data, uint32_t data_size);
 
+extern int iscsi_offload_mesg(struct Scsi_Host *shost,
+                             struct iscsi_transport *transport, uint32_t type,
+                             char *data, uint16_t data_size);
+
 struct iscsi_cls_conn {
        struct list_head conn_list;     /* item in connlist */
        void *dd_data;                  /* LLD private data */
@@ -161,9 +177,10 @@ enum {
        ISCSI_SESSION_FREE,
 };
 
+#define ISCSI_MAX_TARGET -1
+
 struct iscsi_cls_session {
        struct list_head sess_list;             /* item in session_list */
-       struct list_head host_list;
        struct iscsi_transport *transport;
        spinlock_t lock;
        struct work_struct block_work;
@@ -175,7 +192,7 @@ struct iscsi_cls_session {
        int recovery_tmo;
        struct delayed_work recovery_work;
 
-       int target_id;
+       unsigned int target_id;
 
        int state;
        int sid;                                /* session id */
@@ -193,16 +210,18 @@ struct iscsi_cls_session {
        iscsi_dev_to_session(_stgt->dev.parent)
 
 struct iscsi_cls_host {
-       struct list_head sessions;
        atomic_t nr_scans;
        struct mutex mutex;
-       struct workqueue_struct *scan_workq;
-       char scan_workq_name[KOBJ_NAME_LEN];
 };
 
 extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
                                void (*fn)(struct iscsi_cls_session *));
 
+struct iscsi_endpoint {
+       void *dd_data;                  /* LLD private data */
+       struct device dev;
+       uint64_t id;
+};
 
 /*
  * session and connection functions that can be used by HW iSCSI LLDs
@@ -233,5 +252,8 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
 extern void iscsi_unblock_session(struct iscsi_cls_session *session);
 extern void iscsi_block_session(struct iscsi_cls_session *session);
 extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);
+extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
+extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
+extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
 
 #endif