Commit 577577da authored by Mike Christie's avatar Mike Christie Committed by James Bottomley

[SCSI] libiscsi: prepare libiscsi for new offload engines by modifying unsol data code

cxgb3i offloads data transfers. It does not offload the entire scsi/iscsi
procssing like qla4xxx and it does not offload the iscsi sequence
processing like how bnx2i does. cxgb3i relies on iscsi_tcp for the
seqeunce handling so this changes how we transfer unsolicitied data by
adding a common r2t struct and helpers.
Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 63c62f1c
This diff is collapsed.
...@@ -93,24 +93,38 @@ enum { ...@@ -93,24 +93,38 @@ enum {
ISCSI_TASK_RUNNING, ISCSI_TASK_RUNNING,
}; };
struct iscsi_r2t_info {
__be32 ttt; /* copied from R2T */
__be32 exp_statsn; /* copied from R2T */
uint32_t data_length; /* copied from R2T */
uint32_t data_offset; /* copied from R2T */
int data_count; /* DATA-Out payload progress */
int datasn;
/* LLDs should set/update these values */
int sent; /* R2T sequence progress */
};
struct iscsi_task { struct iscsi_task {
/* /*
* Because LLDs allocate their hdr differently, this is a pointer * Because LLDs allocate their hdr differently, this is a pointer
* and length to that storage. It must be setup at session * and length to that storage. It must be setup at session
* creation time. * creation time.
*/ */
struct iscsi_cmd *hdr; struct iscsi_hdr *hdr;
unsigned short hdr_max; unsigned short hdr_max;
unsigned short hdr_len; /* accumulated size of hdr used */ unsigned short hdr_len; /* accumulated size of hdr used */
/* copied values in case we need to send tmfs */
itt_t hdr_itt;
__be32 cmdsn;
uint8_t lun[8];
int itt; /* this ITT */ int itt; /* this ITT */
uint32_t unsol_datasn;
unsigned imm_count; /* imm-data (bytes) */ unsigned imm_count; /* imm-data (bytes) */
unsigned unsol_count; /* unsolicited (bytes)*/
/* offset in unsolicited stream (bytes); */ /* offset in unsolicited stream (bytes); */
unsigned unsol_offset; struct iscsi_r2t_info unsol_r2t;
unsigned data_count; /* remaining Data-Out */
char *data; /* mgmt payload */ char *data; /* mgmt payload */
unsigned data_count;
struct scsi_cmnd *sc; /* associated SCSI cmd*/ struct scsi_cmnd *sc; /* associated SCSI cmd*/
struct iscsi_conn *conn; /* used connection */ struct iscsi_conn *conn; /* used connection */
...@@ -121,6 +135,11 @@ struct iscsi_task { ...@@ -121,6 +135,11 @@ struct iscsi_task {
void *dd_data; /* driver/transport data */ void *dd_data; /* driver/transport data */
}; };
static inline int iscsi_task_has_unsol_data(struct iscsi_task *task)
{
return task->unsol_r2t.data_length > task->unsol_r2t.sent;
}
static inline void* iscsi_next_hdr(struct iscsi_task *task) static inline void* iscsi_next_hdr(struct iscsi_task *task)
{ {
return (void*)task->hdr + task->hdr_len; return (void*)task->hdr + task->hdr_len;
...@@ -376,8 +395,9 @@ extern void iscsi_suspend_tx(struct iscsi_conn *conn); ...@@ -376,8 +395,9 @@ extern void iscsi_suspend_tx(struct iscsi_conn *conn);
* pdu and task processing * pdu and task processing
*/ */
extern void iscsi_update_cmdsn(struct iscsi_session *, struct iscsi_nopin *); extern void iscsi_update_cmdsn(struct iscsi_session *, struct iscsi_nopin *);
extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_task *, extern void iscsi_prep_data_out_pdu(struct iscsi_task *task,
struct iscsi_data *hdr); struct iscsi_r2t_info *r2t,
struct iscsi_data *hdr);
extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *, extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,
char *, uint32_t); char *, uint32_t);
extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *, extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
......
...@@ -113,10 +113,15 @@ struct iscsi_transport { ...@@ -113,10 +113,15 @@ struct iscsi_transport {
char *data, uint32_t data_size); char *data, uint32_t data_size);
void (*get_stats) (struct iscsi_cls_conn *conn, void (*get_stats) (struct iscsi_cls_conn *conn,
struct iscsi_stats *stats); struct iscsi_stats *stats);
int (*init_task) (struct iscsi_task *task); int (*init_task) (struct iscsi_task *task);
int (*xmit_task) (struct iscsi_task *task); int (*xmit_task) (struct iscsi_task *task);
void (*cleanup_task) (struct iscsi_conn *conn, void (*cleanup_task) (struct iscsi_task *task);
struct iscsi_task *task);
int (*alloc_pdu) (struct iscsi_task *task);
int (*xmit_pdu) (struct iscsi_task *task);
int (*init_pdu) (struct iscsi_task *task, unsigned int offset,
unsigned int count);
void (*session_recovery_timedout) (struct iscsi_cls_session *session); void (*session_recovery_timedout) (struct iscsi_cls_session *session);
struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr, struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr,
int non_blocking); int non_blocking);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment