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:

committed by
Roland Dreier

parent
dd5e6e38b2
commit
bb12588a38
@@ -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 */
|
||||
|
Reference in New Issue
Block a user