IB/srp: Implement SRP_CRED_REQ and SRP_AER_REQ

This patch adds support for SRP_CRED_REQ to avoid a lockup by targets
that use that mechanism to return credits to the initiator. This
prevents a lockup observed in the field where we would never add the
credits from the SRP_CRED_REQ to our current count, and would therefore
never send another command to the target.

Minimal support for SRP_AER_REQ is also added, as these messages can
also be used to convey additional credits to the initiator.

Based upon extensive debugging and code by Bart Van Assche and a bug
report by Chris Worley.

Signed-off-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
David Dillow
2010-10-08 14:40:47 -04:00
committed by Roland Dreier
parent dd5e6e38b2
commit bb12588a38
3 changed files with 141 additions and 10 deletions

View File

@@ -239,4 +239,42 @@ struct srp_rsp {
u8 data[0];
} __attribute__((packed));
struct srp_cred_req {
u8 opcode;
u8 sol_not;
u8 reserved[2];
__be32 req_lim_delta;
u64 tag;
};
struct srp_cred_rsp {
u8 opcode;
u8 reserved[7];
u64 tag;
};
/*
* The SRP spec defines the fixed portion of the AER_REQ structure to be
* 36 bytes, so it needs to be packed to avoid having it padded to 40 bytes
* on 64-bit architectures.
*/
struct srp_aer_req {
u8 opcode;
u8 sol_not;
u8 reserved[2];
__be32 req_lim_delta;
u64 tag;
u32 reserved2;
__be64 lun;
__be32 sense_data_len;
u32 reserved3;
u8 sense_data[0];
} __attribute__((packed));
struct srp_aer_rsp {
u8 opcode;
u8 reserved[7];
u64 tag;
};
#endif /* SCSI_SRP_H */