]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/scsi/scsi_transport_iscsi.h
Merge branch 'master' of /home/src/linux-2.6/
[linux-2.6-omap-h63xx.git] / include / scsi / scsi_transport_iscsi.h
index f25041c386ec26481d9814821118446848d6e252..b41cf077e54b7c327e07d8675036ae707bb2314f 100644 (file)
 #ifndef SCSI_TRANSPORT_ISCSI_H
 #define SCSI_TRANSPORT_ISCSI_H
 
+#include <linux/device.h>
 #include <scsi/iscsi_if.h>
 
+struct scsi_transport_template;
+struct Scsi_Host;
+struct mempool_zone;
+struct iscsi_cls_conn;
+
 /**
  * struct iscsi_transport - iSCSI Transport template
  *
@@ -48,39 +54,94 @@ struct iscsi_transport {
        char *name;
        unsigned int caps;
        struct scsi_host_template *host_template;
+       /* LLD session/scsi_host data size */
        int hostdata_size;
+       /* LLD iscsi_host data size */
+       int ihostdata_size;
+       /* LLD connection data size */
+       int conndata_size;
        int max_lun;
        unsigned int max_conn;
        unsigned int max_cmd_len;
-       iscsi_sessionh_t (*create_session) (uint32_t initial_cmdsn,
-                                           struct Scsi_Host *shost);
-       void (*destroy_session) (iscsi_sessionh_t session);
-       iscsi_connh_t (*create_conn) (iscsi_sessionh_t session, uint32_t cid);
-       int (*bind_conn) (iscsi_sessionh_t session, iscsi_connh_t conn,
+       struct iscsi_cls_session *(*create_session)
+               (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid);
+       void (*destroy_session) (struct iscsi_cls_session *session);
+       struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
+                               uint32_t cid);
+       int (*bind_conn) (struct iscsi_cls_session *session,
+                         struct iscsi_cls_conn *cls_conn,
                          uint32_t transport_fd, int is_leading);
-       int (*start_conn) (iscsi_connh_t conn);
-       void (*stop_conn) (iscsi_connh_t conn, int flag);
-       void (*destroy_conn) (iscsi_connh_t conn);
-       int (*set_param) (iscsi_connh_t conn, enum iscsi_param param,
+       int (*start_conn) (struct iscsi_cls_conn *conn);
+       void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
+       void (*destroy_conn) (struct iscsi_cls_conn *conn);
+       int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
                          uint32_t value);
-       int (*get_param) (iscsi_connh_t conn, enum iscsi_param param,
-                         uint32_t *value);
-       int (*send_pdu) (iscsi_connh_t conn, struct iscsi_hdr *hdr,
+       int (*get_conn_param) (struct iscsi_cls_conn *conn,
+                              enum iscsi_param param,
+                              uint32_t *value);
+       int (*get_session_param) (struct iscsi_cls_session *session,
+                                 enum iscsi_param param, uint32_t *value);
+       int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
                         char *data, uint32_t data_size);
-       void (*get_stats) (iscsi_connh_t conn, struct iscsi_stats *stats);
+       void (*get_stats) (struct iscsi_cls_conn *conn,
+                          struct iscsi_stats *stats);
 };
 
 /*
  * transport registration upcalls
  */
-extern int iscsi_register_transport(struct iscsi_transport *tt);
+extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);
 extern int iscsi_unregister_transport(struct iscsi_transport *tt);
 
 /*
  * control plane upcalls
  */
-extern void iscsi_conn_error(iscsi_connh_t conn, enum iscsi_err error);
-extern int iscsi_recv_pdu(iscsi_connh_t conn, struct iscsi_hdr *hdr,
+extern void iscsi_conn_error(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);
 
+struct iscsi_cls_conn {
+       struct list_head conn_list;     /* item in connlist */
+       void *dd_data;                  /* LLD private data */
+       struct iscsi_transport *transport;
+       int active;                     /* must be accessed with the connlock */
+       struct device dev;              /* sysfs transport/container device */
+       struct mempool_zone *z_error;
+       struct mempool_zone *z_pdu;
+       struct list_head freequeue;
+};
+
+#define iscsi_dev_to_conn(_dev) \
+       container_of(_dev, struct iscsi_cls_conn, dev)
+
+struct iscsi_cls_session {
+       struct list_head sess_list;             /* item in session_list */
+       struct iscsi_transport *transport;
+       struct device dev;      /* sysfs transport/container device */
+};
+
+#define iscsi_dev_to_session(_dev) \
+       container_of(_dev, struct iscsi_cls_session, dev)
+
+#define iscsi_session_to_shost(_session) \
+       dev_to_shost(_session->dev.parent)
+
+/*
+ * session and connection functions that can be used by HW iSCSI LLDs
+ */
+extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
+                               struct iscsi_transport *t);
+extern int iscsi_destroy_session(struct iscsi_cls_session *session);
+extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
+                                           uint32_t cid);
+extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
+
+/*
+ * session functions used by software iscsi
+ */
+extern struct Scsi_Host *
+iscsi_transport_create_session(struct scsi_transport_template *scsit,
+                               struct iscsi_transport *transport);
+extern int iscsi_transport_destroy_session(struct Scsi_Host *shost);
+
 #endif