mirror of
https://github.com/torvalds/linux.git
synced 2026-09-21 20:17:00 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (200 commits) [SCSI] usbstorage: use last_sector_bug flag universally [SCSI] libsas: abstract STP task status into a function [SCSI] ultrastor: clean up inline asm warnings [SCSI] aic7xxx: fix firmware build [SCSI] aacraid: fib context lock for management ioctls [SCSI] ch: remove forward declarations [SCSI] ch: fix device minor number management bug [SCSI] ch: handle class_device_create failure properly [SCSI] NCR5380: fix section mismatch [SCSI] sg: fix /proc/scsi/sg/devices when no SCSI devices [SCSI] IB/iSER: add logical unit reset support [SCSI] don't use __GFP_DMA for sense buffers if not required [SCSI] use dynamically allocated sense buffer [SCSI] scsi.h: add macro for enclosure bit of inquiry data [SCSI] sd: add fix for devices with last sector access problems [SCSI] fix pcmcia compile problem [SCSI] aacraid: add Voodoo Lite class of cards. [SCSI] aacraid: add new driver features flags [SCSI] qla2xxx: Update version number to 8.02.00-k7. [SCSI] qla2xxx: Issue correct MBC_INITIALIZE_FIRMWARE command. ...
This commit is contained in:
@@ -17,6 +17,7 @@ struct attribute_container {
|
||||
struct list_head node;
|
||||
struct klist containers;
|
||||
struct class *class;
|
||||
struct attribute_group *grp;
|
||||
struct class_device_attribute **attrs;
|
||||
int (*match)(struct attribute_container *, struct device *);
|
||||
#define ATTRIBUTE_CONTAINER_NO_CLASSDEVS 0x01
|
||||
|
||||
@@ -765,6 +765,7 @@ extern void blk_queue_segment_boundary(struct request_queue *, unsigned long);
|
||||
extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);
|
||||
extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *);
|
||||
extern void blk_queue_dma_alignment(struct request_queue *, int);
|
||||
extern void blk_queue_update_dma_alignment(struct request_queue *, int);
|
||||
extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *);
|
||||
extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
|
||||
extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *);
|
||||
|
||||
@@ -32,6 +32,8 @@ struct attribute {
|
||||
|
||||
struct attribute_group {
|
||||
const char *name;
|
||||
int (*is_visible)(struct kobject *,
|
||||
struct attribute *, int);
|
||||
struct attribute **attrs;
|
||||
};
|
||||
|
||||
|
||||
@@ -49,12 +49,15 @@ enum iscsi_uevent_e {
|
||||
|
||||
ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
|
||||
ISCSI_UEVENT_SET_HOST_PARAM = UEVENT_BASE + 16,
|
||||
ISCSI_UEVENT_UNBIND_SESSION = UEVENT_BASE + 17,
|
||||
|
||||
/* up events */
|
||||
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
||||
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
|
||||
ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3,
|
||||
ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4,
|
||||
ISCSI_KEVENT_UNBIND_SESSION = KEVENT_BASE + 5,
|
||||
ISCSI_KEVENT_CREATE_SESSION = KEVENT_BASE + 6,
|
||||
};
|
||||
|
||||
enum iscsi_tgt_dscvr {
|
||||
@@ -156,6 +159,10 @@ struct iscsi_uevent {
|
||||
uint32_t sid;
|
||||
uint32_t cid;
|
||||
} c_conn_ret;
|
||||
struct msg_unbind_session {
|
||||
uint32_t sid;
|
||||
uint32_t host_no;
|
||||
} unbind_session;
|
||||
struct msg_recv_req {
|
||||
uint32_t sid;
|
||||
uint32_t cid;
|
||||
@@ -236,6 +243,13 @@ enum iscsi_param {
|
||||
ISCSI_PARAM_PASSWORD,
|
||||
ISCSI_PARAM_PASSWORD_IN,
|
||||
|
||||
ISCSI_PARAM_FAST_ABORT,
|
||||
ISCSI_PARAM_ABORT_TMO,
|
||||
ISCSI_PARAM_LU_RESET_TMO,
|
||||
ISCSI_PARAM_HOST_RESET_TMO,
|
||||
|
||||
ISCSI_PARAM_PING_TMO,
|
||||
ISCSI_PARAM_RECV_TMO,
|
||||
/* must always be last */
|
||||
ISCSI_PARAM_MAX,
|
||||
};
|
||||
@@ -266,6 +280,12 @@ enum iscsi_param {
|
||||
#define ISCSI_USERNAME_IN (1 << ISCSI_PARAM_USERNAME_IN)
|
||||
#define ISCSI_PASSWORD (1 << ISCSI_PARAM_PASSWORD)
|
||||
#define ISCSI_PASSWORD_IN (1 << ISCSI_PARAM_PASSWORD_IN)
|
||||
#define ISCSI_FAST_ABORT (1 << ISCSI_PARAM_FAST_ABORT)
|
||||
#define ISCSI_ABORT_TMO (1 << ISCSI_PARAM_ABORT_TMO)
|
||||
#define ISCSI_LU_RESET_TMO (1 << ISCSI_PARAM_LU_RESET_TMO)
|
||||
#define ISCSI_HOST_RESET_TMO (1 << ISCSI_PARAM_HOST_RESET_TMO)
|
||||
#define ISCSI_PING_TMO (1 << ISCSI_PARAM_PING_TMO)
|
||||
#define ISCSI_RECV_TMO (1 << ISCSI_PARAM_RECV_TMO)
|
||||
|
||||
/* iSCSI HBA params */
|
||||
enum iscsi_host_param {
|
||||
|
||||
@@ -21,13 +21,15 @@
|
||||
#ifndef ISCSI_PROTO_H
|
||||
#define ISCSI_PROTO_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ISCSI_DRAFT20_VERSION 0x00
|
||||
|
||||
/* default iSCSI listen port for incoming connections */
|
||||
#define ISCSI_LISTEN_PORT 3260
|
||||
|
||||
/* Padding word length */
|
||||
#define PAD_WORD_LEN 4
|
||||
#define ISCSI_PAD_LEN 4
|
||||
|
||||
/*
|
||||
* useful common(control and data pathes) macro
|
||||
@@ -147,6 +149,14 @@ struct iscsi_rlength_ahdr {
|
||||
__be32 read_length;
|
||||
};
|
||||
|
||||
/* Extended CDB AHS */
|
||||
struct iscsi_ecdb_ahdr {
|
||||
__be16 ahslength; /* CDB length - 15, including reserved byte */
|
||||
uint8_t ahstype;
|
||||
uint8_t reserved;
|
||||
uint8_t ecdb[260 - 16]; /* 4-byte aligned extended CDB spillover */
|
||||
};
|
||||
|
||||
/* SCSI Response Header */
|
||||
struct iscsi_cmd_rsp {
|
||||
uint8_t opcode;
|
||||
@@ -600,6 +610,8 @@ struct iscsi_reject {
|
||||
#define ISCSI_MIN_MAX_BURST_LEN 512
|
||||
#define ISCSI_MAX_MAX_BURST_LEN 16777215
|
||||
|
||||
#define ISCSI_DEF_TIME2WAIT 2
|
||||
|
||||
/************************* RFC 3720 End *****************************/
|
||||
|
||||
#endif /* ISCSI_PROTO_H */
|
||||
|
||||
@@ -57,11 +57,14 @@ struct iscsi_nopin;
|
||||
#define ISCSI_MAX_CMD_PER_LUN 128
|
||||
|
||||
/* Task Mgmt states */
|
||||
#define TMABORT_INITIAL 0x0
|
||||
#define TMABORT_SUCCESS 0x1
|
||||
#define TMABORT_FAILED 0x2
|
||||
#define TMABORT_TIMEDOUT 0x3
|
||||
#define TMABORT_NOT_FOUND 0x4
|
||||
enum {
|
||||
TMF_INITIAL,
|
||||
TMF_QUEUED,
|
||||
TMF_SUCCESS,
|
||||
TMF_FAILED,
|
||||
TMF_TIMEDOUT,
|
||||
TMF_NOT_FOUND,
|
||||
};
|
||||
|
||||
/* Connection suspend "bit" */
|
||||
#define ISCSI_SUSPEND_BIT 1
|
||||
@@ -74,6 +77,13 @@ struct iscsi_nopin;
|
||||
|
||||
#define ISCSI_ADDRESS_BUF_LEN 64
|
||||
|
||||
enum {
|
||||
/* this is the maximum possible storage for AHSs */
|
||||
ISCSI_MAX_AHS_SIZE = sizeof(struct iscsi_ecdb_ahdr) +
|
||||
sizeof(struct iscsi_rlength_ahdr),
|
||||
ISCSI_DIGEST_SIZE = sizeof(__u32),
|
||||
};
|
||||
|
||||
struct iscsi_mgmt_task {
|
||||
/*
|
||||
* Becuae LLDs allocate their hdr differently, this is a pointer to
|
||||
@@ -91,15 +101,17 @@ enum {
|
||||
ISCSI_TASK_COMPLETED,
|
||||
ISCSI_TASK_PENDING,
|
||||
ISCSI_TASK_RUNNING,
|
||||
ISCSI_TASK_ABORTING,
|
||||
};
|
||||
|
||||
struct iscsi_cmd_task {
|
||||
/*
|
||||
* Becuae LLDs allocate their hdr differently, this is a pointer to
|
||||
* that storage. It must be setup at session creation time.
|
||||
* Because LLDs allocate their hdr differently, this is a pointer
|
||||
* and length to that storage. It must be setup at session
|
||||
* creation time.
|
||||
*/
|
||||
struct iscsi_cmd *hdr;
|
||||
unsigned short hdr_max;
|
||||
unsigned short hdr_len; /* accumulated size of hdr used */
|
||||
int itt; /* this ITT */
|
||||
|
||||
uint32_t unsol_datasn;
|
||||
@@ -110,7 +122,6 @@ struct iscsi_cmd_task {
|
||||
unsigned data_count; /* remaining Data-Out */
|
||||
struct scsi_cmnd *sc; /* associated SCSI cmd*/
|
||||
struct iscsi_conn *conn; /* used connection */
|
||||
struct iscsi_mgmt_task *mtask; /* tmf mtask in progr */
|
||||
|
||||
/* state set/tested under session->lock */
|
||||
int state;
|
||||
@@ -119,6 +130,11 @@ struct iscsi_cmd_task {
|
||||
void *dd_data; /* driver/transport data */
|
||||
};
|
||||
|
||||
static inline void* iscsi_next_hdr(struct iscsi_cmd_task *ctask)
|
||||
{
|
||||
return (void*)ctask->hdr + ctask->hdr_len;
|
||||
}
|
||||
|
||||
struct iscsi_conn {
|
||||
struct iscsi_cls_conn *cls_conn; /* ptr to class connection */
|
||||
void *dd_data; /* iscsi_transport data */
|
||||
@@ -132,6 +148,12 @@ struct iscsi_conn {
|
||||
* conn_stop() flag: stop to recover, stop to terminate
|
||||
*/
|
||||
int stop_stage;
|
||||
struct timer_list transport_timer;
|
||||
unsigned long last_recv;
|
||||
unsigned long last_ping;
|
||||
int ping_timeout;
|
||||
int recv_timeout;
|
||||
struct iscsi_mgmt_task *ping_mtask;
|
||||
|
||||
/* iSCSI connection-wide sequencing */
|
||||
uint32_t exp_statsn;
|
||||
@@ -152,10 +174,11 @@ struct iscsi_conn {
|
||||
struct iscsi_cmd_task *ctask; /* xmit ctask in progress */
|
||||
|
||||
/* xmit */
|
||||
struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */
|
||||
struct list_head mgmtqueue; /* mgmt (control) xmit queue */
|
||||
struct list_head mgmt_run_list; /* list of control tasks */
|
||||
struct list_head xmitqueue; /* data-path cmd queue */
|
||||
struct list_head run_list; /* list of cmds in progress */
|
||||
struct list_head requeue; /* tasks needing another run */
|
||||
struct work_struct xmitwork; /* per-conn. xmit workqueue */
|
||||
unsigned long suspend_tx; /* suspend Tx */
|
||||
unsigned long suspend_rx; /* suspend Rx */
|
||||
@@ -163,8 +186,8 @@ struct iscsi_conn {
|
||||
/* abort */
|
||||
wait_queue_head_t ehwait; /* used in eh_abort() */
|
||||
struct iscsi_tm tmhdr;
|
||||
struct timer_list tmabort_timer;
|
||||
int tmabort_state; /* see TMABORT_INITIAL, etc.*/
|
||||
struct timer_list tmf_timer;
|
||||
int tmf_state; /* see TMF_INITIAL, etc.*/
|
||||
|
||||
/* negotiated params */
|
||||
unsigned max_recv_dlength; /* initiator_max_recv_dsl*/
|
||||
@@ -198,7 +221,7 @@ struct iscsi_conn {
|
||||
uint32_t eh_abort_cnt;
|
||||
};
|
||||
|
||||
struct iscsi_queue {
|
||||
struct iscsi_pool {
|
||||
struct kfifo *queue; /* FIFO Queue */
|
||||
void **pool; /* Pool of elements */
|
||||
int max; /* Max number of elements */
|
||||
@@ -221,6 +244,8 @@ struct iscsi_session {
|
||||
uint32_t queued_cmdsn;
|
||||
|
||||
/* configuration */
|
||||
int abort_timeout;
|
||||
int lu_reset_timeout;
|
||||
int initial_r2t_en;
|
||||
unsigned max_r2t;
|
||||
int imm_data_en;
|
||||
@@ -231,6 +256,7 @@ struct iscsi_session {
|
||||
int pdu_inorder_en;
|
||||
int dataseq_inorder_en;
|
||||
int erl;
|
||||
int fast_abort;
|
||||
int tpgt;
|
||||
char *username;
|
||||
char *username_in;
|
||||
@@ -256,10 +282,10 @@ struct iscsi_session {
|
||||
|
||||
int cmds_max; /* size of cmds array */
|
||||
struct iscsi_cmd_task **cmds; /* Original Cmds arr */
|
||||
struct iscsi_queue cmdpool; /* PDU's pool */
|
||||
struct iscsi_pool cmdpool; /* PDU's pool */
|
||||
int mgmtpool_max; /* size of mgmt array */
|
||||
struct iscsi_mgmt_task **mgmt_cmds; /* Original mgmt arr */
|
||||
struct iscsi_queue mgmtpool; /* Mgmt PDU's pool */
|
||||
struct iscsi_pool mgmtpool; /* Mgmt PDU's pool */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -268,6 +294,7 @@ struct iscsi_session {
|
||||
extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth);
|
||||
extern int iscsi_eh_abort(struct scsi_cmnd *sc);
|
||||
extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);
|
||||
extern int iscsi_eh_device_reset(struct scsi_cmnd *sc);
|
||||
extern int iscsi_queuecommand(struct scsi_cmnd *sc,
|
||||
void (*done)(struct scsi_cmnd *));
|
||||
|
||||
@@ -326,11 +353,32 @@ extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
|
||||
char *, int);
|
||||
extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *,
|
||||
uint32_t *);
|
||||
extern void iscsi_requeue_ctask(struct iscsi_cmd_task *ctask);
|
||||
extern void iscsi_free_mgmt_task(struct iscsi_conn *conn,
|
||||
struct iscsi_mgmt_task *mtask);
|
||||
|
||||
/*
|
||||
* generic helpers
|
||||
*/
|
||||
extern void iscsi_pool_free(struct iscsi_queue *, void **);
|
||||
extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int);
|
||||
extern void iscsi_pool_free(struct iscsi_pool *);
|
||||
extern int iscsi_pool_init(struct iscsi_pool *, int, void ***, int);
|
||||
|
||||
/*
|
||||
* inline functions to deal with padding.
|
||||
*/
|
||||
static inline unsigned int
|
||||
iscsi_padded(unsigned int len)
|
||||
{
|
||||
return (len + ISCSI_PAD_LEN - 1) & ~(ISCSI_PAD_LEN - 1);
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
iscsi_padding(unsigned int len)
|
||||
{
|
||||
len &= (ISCSI_PAD_LEN - 1);
|
||||
if (len)
|
||||
len = ISCSI_PAD_LEN - len;
|
||||
return len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -91,8 +91,6 @@ enum discover_event {
|
||||
|
||||
/* ---------- Expander Devices ---------- */
|
||||
|
||||
#define ETASK 0xFA
|
||||
|
||||
#define to_dom_device(_obj) container_of(_obj, struct domain_device, dev_obj)
|
||||
#define to_dev_attr(_attr) container_of(_attr, struct domain_dev_attribute,\
|
||||
attr)
|
||||
@@ -122,8 +120,8 @@ struct ex_phy {
|
||||
u8 attached_sata_dev:1;
|
||||
u8 attached_sata_ps:1;
|
||||
|
||||
enum sas_proto attached_tproto;
|
||||
enum sas_proto attached_iproto;
|
||||
enum sas_protocol attached_tproto;
|
||||
enum sas_protocol attached_iproto;
|
||||
|
||||
u8 attached_sas_addr[SAS_ADDR_SIZE];
|
||||
u8 attached_phy_id;
|
||||
@@ -191,8 +189,8 @@ struct domain_device {
|
||||
|
||||
struct list_head dev_list_node;
|
||||
|
||||
enum sas_proto iproto;
|
||||
enum sas_proto tproto;
|
||||
enum sas_protocol iproto;
|
||||
enum sas_protocol tproto;
|
||||
|
||||
struct sas_rphy *rphy;
|
||||
|
||||
@@ -245,8 +243,8 @@ struct asd_sas_port {
|
||||
enum sas_class class;
|
||||
u8 sas_addr[SAS_ADDR_SIZE];
|
||||
u8 attached_sas_addr[SAS_ADDR_SIZE];
|
||||
enum sas_proto iproto;
|
||||
enum sas_proto tproto;
|
||||
enum sas_protocol iproto;
|
||||
enum sas_protocol tproto;
|
||||
|
||||
enum sas_oob_mode oob_mode;
|
||||
|
||||
@@ -289,8 +287,8 @@ struct asd_sas_phy {
|
||||
|
||||
int id; /* must be set */
|
||||
enum sas_class class;
|
||||
enum sas_proto iproto;
|
||||
enum sas_proto tproto;
|
||||
enum sas_protocol iproto;
|
||||
enum sas_protocol tproto;
|
||||
|
||||
enum sas_phy_type type;
|
||||
enum sas_phy_role role;
|
||||
@@ -537,7 +535,7 @@ struct sas_task {
|
||||
spinlock_t task_state_lock;
|
||||
unsigned task_state_flags;
|
||||
|
||||
enum sas_proto task_proto;
|
||||
enum sas_protocol task_proto;
|
||||
|
||||
/* Used by the discovery code. */
|
||||
struct timer_list timer;
|
||||
@@ -563,7 +561,7 @@ struct sas_task {
|
||||
struct work_struct abort_work;
|
||||
};
|
||||
|
||||
|
||||
extern struct kmem_cache *sas_task_cache;
|
||||
|
||||
#define SAS_TASK_STATE_PENDING 1
|
||||
#define SAS_TASK_STATE_DONE 2
|
||||
@@ -573,7 +571,6 @@ struct sas_task {
|
||||
|
||||
static inline struct sas_task *sas_alloc_task(gfp_t flags)
|
||||
{
|
||||
extern struct kmem_cache *sas_task_cache;
|
||||
struct sas_task *task = kmem_cache_zalloc(sas_task_cache, flags);
|
||||
|
||||
if (task) {
|
||||
@@ -590,7 +587,6 @@ static inline struct sas_task *sas_alloc_task(gfp_t flags)
|
||||
static inline void sas_free_task(struct sas_task *task)
|
||||
{
|
||||
if (task) {
|
||||
extern struct kmem_cache *sas_task_cache;
|
||||
BUG_ON(!list_empty(&task->list));
|
||||
kmem_cache_free(sas_task_cache, task);
|
||||
}
|
||||
@@ -676,4 +672,8 @@ extern int sas_ioctl(struct scsi_device *sdev, int cmd, void __user *arg);
|
||||
|
||||
extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
struct request *req);
|
||||
|
||||
extern void sas_ssp_task_response(struct device *dev, struct sas_task *task,
|
||||
struct ssp_response_iu *iu);
|
||||
|
||||
#endif /* _SASLIB_H_ */
|
||||
|
||||
@@ -102,13 +102,12 @@ enum sas_dev_type {
|
||||
SATA_PM_PORT= 8,
|
||||
};
|
||||
|
||||
/* Partly from IDENTIFY address frame. */
|
||||
enum sas_proto {
|
||||
SATA_PROTO = 1,
|
||||
SAS_PROTO_SMP = 2, /* protocol */
|
||||
SAS_PROTO_STP = 4, /* protocol */
|
||||
SAS_PROTO_SSP = 8, /* protocol */
|
||||
SAS_PROTO_ALL = 0xE,
|
||||
enum sas_protocol {
|
||||
SAS_PROTOCOL_SATA = 0x01,
|
||||
SAS_PROTOCOL_SMP = 0x02,
|
||||
SAS_PROTOCOL_STP = 0x04,
|
||||
SAS_PROTOCOL_SSP = 0x08,
|
||||
SAS_PROTOCOL_ALL = 0x0E,
|
||||
};
|
||||
|
||||
/* From the spec; local phys only */
|
||||
|
||||
@@ -88,7 +88,7 @@ struct scsi_cmnd {
|
||||
working on */
|
||||
|
||||
#define SCSI_SENSE_BUFFERSIZE 96
|
||||
unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];
|
||||
unsigned char *sense_buffer;
|
||||
/* obtained by REQUEST SENSE when
|
||||
* CHECK CONDITION is received on original
|
||||
* command (auto-sense) */
|
||||
|
||||
@@ -122,9 +122,6 @@ struct scsi_device {
|
||||
unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */
|
||||
unsigned simple_tags:1; /* simple queue tag messages are enabled */
|
||||
unsigned ordered_tags:1;/* ordered queue tag messages are enabled */
|
||||
unsigned single_lun:1; /* Indicates we should only allow I/O to
|
||||
* one of the luns for the device at a
|
||||
* time. */
|
||||
unsigned was_reset:1; /* There was a bus reset on the bus for
|
||||
* this device */
|
||||
unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN
|
||||
@@ -142,6 +139,7 @@ struct scsi_device {
|
||||
unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */
|
||||
unsigned guess_capacity:1; /* READ_CAPACITY might be too high by 1 */
|
||||
unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */
|
||||
unsigned last_sector_bug:1; /* Always read last sector in a 1 sector read */
|
||||
|
||||
DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */
|
||||
struct list_head event_list; /* asserted events */
|
||||
@@ -202,6 +200,9 @@ struct scsi_target {
|
||||
unsigned int id; /* target id ... replace
|
||||
* scsi_device.id eventually */
|
||||
unsigned int create:1; /* signal that it needs to be added */
|
||||
unsigned int single_lun:1; /* Indicates we should only
|
||||
* allow I/O to one of the luns
|
||||
* for the device at a time. */
|
||||
unsigned int pdt_1f_for_no_lun; /* PDT = 0x1f */
|
||||
/* means no lun present */
|
||||
|
||||
@@ -295,7 +296,7 @@ extern int scsi_mode_select(struct scsi_device *sdev, int pf, int sp,
|
||||
struct scsi_mode_data *data,
|
||||
struct scsi_sense_hdr *);
|
||||
extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
|
||||
int retries);
|
||||
int retries, struct scsi_sense_hdr *sshdr);
|
||||
extern int scsi_device_set_state(struct scsi_device *sdev,
|
||||
enum scsi_device_state state);
|
||||
extern struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type,
|
||||
@@ -386,6 +387,10 @@ static inline int scsi_device_qas(struct scsi_device *sdev)
|
||||
return 0;
|
||||
return sdev->inquiry[56] & 0x02;
|
||||
}
|
||||
static inline int scsi_device_enclosure(struct scsi_device *sdev)
|
||||
{
|
||||
return sdev->inquiry[6] & (1<<6);
|
||||
}
|
||||
|
||||
#define MODULE_ALIAS_SCSI_DEVICE(type) \
|
||||
MODULE_ALIAS("scsi:t-" __stringify(type) "*")
|
||||
|
||||
@@ -118,7 +118,7 @@ struct iscsi_transport {
|
||||
char *data, uint32_t data_size);
|
||||
void (*get_stats) (struct iscsi_cls_conn *conn,
|
||||
struct iscsi_stats *stats);
|
||||
void (*init_cmd_task) (struct iscsi_cmd_task *ctask);
|
||||
int (*init_cmd_task) (struct iscsi_cmd_task *ctask);
|
||||
void (*init_mgmt_task) (struct iscsi_conn *conn,
|
||||
struct iscsi_mgmt_task *mtask);
|
||||
int (*xmit_cmd_task) (struct iscsi_conn *conn,
|
||||
@@ -176,6 +176,7 @@ struct iscsi_cls_conn {
|
||||
#define ISCSI_STATE_TERMINATE 4
|
||||
#define ISCSI_STATE_IN_RECOVERY 5
|
||||
#define ISCSI_STATE_RECOVERY_FAILED 6
|
||||
#define ISCSI_STATE_LOGGING_OUT 7
|
||||
|
||||
struct iscsi_cls_session {
|
||||
struct list_head sess_list; /* item in session_list */
|
||||
@@ -185,6 +186,7 @@ struct iscsi_cls_session {
|
||||
/* recovery fields */
|
||||
int recovery_tmo;
|
||||
struct delayed_work recovery_work;
|
||||
struct work_struct unbind_work;
|
||||
|
||||
int target_id;
|
||||
|
||||
@@ -205,6 +207,8 @@ struct iscsi_cls_session {
|
||||
struct iscsi_host {
|
||||
struct list_head sessions;
|
||||
struct mutex mutex;
|
||||
struct workqueue_struct *unbind_workq;
|
||||
char unbind_workq_name[KOBJ_NAME_LEN];
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -214,8 +218,8 @@ extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *transport);
|
||||
extern int iscsi_add_session(struct iscsi_cls_session *session,
|
||||
unsigned int target_id);
|
||||
extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn);
|
||||
extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn);
|
||||
extern int iscsi_session_event(struct iscsi_cls_session *session,
|
||||
enum iscsi_uevent_e event);
|
||||
extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *t,
|
||||
unsigned int target_id);
|
||||
|
||||
@@ -4,23 +4,17 @@
|
||||
#include <linux/transport_class.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <scsi/sas.h>
|
||||
|
||||
struct scsi_transport_template;
|
||||
struct sas_rphy;
|
||||
struct request;
|
||||
|
||||
enum sas_device_type {
|
||||
SAS_PHY_UNUSED,
|
||||
SAS_END_DEVICE,
|
||||
SAS_EDGE_EXPANDER_DEVICE,
|
||||
SAS_FANOUT_EXPANDER_DEVICE,
|
||||
};
|
||||
|
||||
enum sas_protocol {
|
||||
SAS_PROTOCOL_SATA = 0x01,
|
||||
SAS_PROTOCOL_SMP = 0x02,
|
||||
SAS_PROTOCOL_STP = 0x04,
|
||||
SAS_PROTOCOL_SSP = 0x08,
|
||||
SAS_PHY_UNUSED = 0,
|
||||
SAS_END_DEVICE = 1,
|
||||
SAS_EDGE_EXPANDER_DEVICE = 2,
|
||||
SAS_FANOUT_EXPANDER_DEVICE = 3,
|
||||
};
|
||||
|
||||
static inline int sas_protocol_ata(enum sas_protocol proto)
|
||||
|
||||
@@ -41,6 +41,7 @@ struct scsi_disk {
|
||||
u32 index;
|
||||
u8 media_present;
|
||||
u8 write_prot;
|
||||
unsigned previous_state : 1;
|
||||
unsigned WCE : 1; /* state of disk WCE bit */
|
||||
unsigned RCD : 1; /* state of disk RCD bit, unused */
|
||||
unsigned DPOFUA : 1; /* state of disk DPOFUA bit */
|
||||
|
||||
Reference in New Issue
Block a user