38 #if !defined(__OCS_RAMD_H__)
39 #define __OCS_RAMD_H__
49 #define SNS_ILLEGAL_REQ 0x05
50 #define SNS_UNIT_ATTENTION 0x06
51 #define SNS_ABORTED_CMD 0x0B
54 #define SNSCODE_INV_CMDIU 0x0E
55 #define SNSCODE_DIF_ERR 0x10
56 #define SNSCODE_BAD_CMD 0x20
57 #define SNSCODE_LBA_OOR 0x21
58 #define SNSCODE_INV_CDB 0x24
59 #define SNSCODE_INV_PRM 0x26
60 #define SNSCODE_ABORTED_CMD 0x47
61 #define SNSCODE_OFF_ERR 0x4B
62 #define SNSCODE_SAVE_NOT_SUPPORTED 0x39
65 #define SNSCODEQUAL_INV_CMDIU 0x03
68 #define scsi_pack_result(key, code, qualifier) (((key & 0xff) << 16) | ((code && 0xff) << 8) | (qualifier & 0xff))
80 extern int32_t
_ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags);
82 uint8_t has_first_burst,
83 ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes);
94 extern int32_t
ocs_ramd_get_ua(ocs_t *ocs, ocs_node_t *node, uint32_t lun, uint8_t *asc, uint8_t *ascq);
95 extern void ocs_ramd_clear_ua(ocs_t *ocs, ocs_node_t *node, uint32_t lun, uint8_t asc, uint8_t ascq);
106 #endif // __OCS_RAMD_H__
int32_t ocs_port_rdisc_init(ocs_t *ocs)
Initialize per port ramdisc structure.
int32_t _scsi_io_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
Response phase callback.
void ocs_ramd_clear_ua(ocs_t *ocs, ocs_node_t *node, uint32_t lun, uint8_t asc, uint8_t ascq)
Clear a Unit Attention condition.
int32_t _ocs_scsi_recv_cmd(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags)
Receive an FCP SCSI command.
int32_t _scsi_dataphase_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
Command data phase callback.
ramdisc instance structure
int32_t ocs_ramd_get_ua(ocs_t *ocs, ocs_node_t *node, uint32_t lun, uint8_t *asc, uint8_t *ascq)
Get a pending Unit Attention, if any.
int32_t ocs_scsi_recv_cmd_common(ocs_io_t *io, uint32_t lun, uint8_t *cdb, uint32_t cdb_len, uint32_t flags, uint8_t has_first_burst, ocs_dma_t first_burst_buffers[], uint32_t first_burst_bytes)
Common code used by ocs_scsi_recv_cmd() and ocs_scsi_recv_cmd_first_burst().
ocs_ramd_hndlr_rtn_e ocs_ramd_mode_sense10(ocs_io_t *io, uint8_t cdb[])
Process SCSI Mode Sense 10 command.
int32_t ocs_port_rdisc_save(ocs_t *ocs, uint32_t tgt_id, ocs_ramdisc_t **rdisc, uint32_t rdisc_count)
Save a per port ramdisc.
void ocs_ramd_post_ua(ocs_t *ocs, ocs_ramdisc_t *ramdisc, uint8_t asc, uint8_t ascq, ocs_node_t *except_node)
Post a Unit Attention condition to a ramdisc.
ocs_ramd_hndlr_rtn_e ocs_ramd_mode_sense6(ocs_io_t *io, uint8_t cdb[])
Process SCSI Mode Sense 6 command.
ocs_ramdisc_t * ocs_ramd_lookup_by_tgt(ocs_t *ocs, uint32_t tgt, uint32_t lun)
Given an TGT number and a LUN number, return the corresponding ramdisc.
ocs_ramdisc_t * ocs_ramd_lookup(ocs_io_t *io, uint32_t lun)
Given an IO and a LUN number, return the ramdisc to which the IO is directed.
int32_t scsi_io_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
ocs_ramd_hndlr_rtn_e ocs_ramd_check_cond(ocs_io_t *io, uint8_t sense_key, uint8_t asc, uint8_t ascq)
Send a SCSI check condition.
void ocs_port_rdisc_free(ocs_t *ocs)
Free per port ramdisc structure.
int32_t ocs_port_rdisc_find(ocs_t *ocs, uint32_t tgt_id, ocs_ramdisc_t ***rdisc, uint32_t *rdisc_count)
Find a per port ramdisc instance.
ocs_ramd_hndlr_rtn_e ocs_ramd_task_set_full_or_busy(ocs_io_t *io)
Send a SCSI task set full or busy status.
int32_t scsi_dataphase_cb(ocs_io_t *io, ocs_scsi_io_status_e scsi_status, uint32_t flags, void *arg)
ocs_ramd_hndlr_rtn_e ocs_ramd_good_status(ocs_io_t *io)
Send a good SCSI status.