mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (166 commits)
[SCSI] ibmvscsi: convert to use the data buffer accessors
[SCSI] dc395x: convert to use the data buffer accessors
[SCSI] ncr53c8xx: convert to use the data buffer accessors
[SCSI] sym53c8xx: convert to use the data buffer accessors
[SCSI] ppa: coding police and printk levels
[SCSI] aic7xxx_old: remove redundant GFP_ATOMIC from kmalloc
[SCSI] i2o: remove redundant GFP_ATOMIC from kmalloc from device.c
[SCSI] remove the dead CYBERSTORMIII_SCSI option
[SCSI] don't build scsi_dma_{map,unmap} for !HAS_DMA
[SCSI] Clean up scsi_add_lun a bit
[SCSI] 53c700: Remove printk, which triggers because of low scsi clock on SNI RMs
[SCSI] sni_53c710: Cleanup
[SCSI] qla4xxx: Fix underrun/overrun conditions
[SCSI] megaraid_mbox: use mutex instead of semaphore
[SCSI] aacraid: add 51245, 51645 and 52245 adapters to documentation.
[SCSI] qla2xxx: update version to 8.02.00-k1.
[SCSI] qla2xxx: add support for NPIV
[SCSI] stex: use resid for xfer len information
[SCSI] Add Brownie 1200U3P to blacklist
[SCSI] scsi.c: convert to use the data buffer accessors
...
This commit is contained in:
@@ -48,6 +48,7 @@ enum iscsi_uevent_e {
|
||||
ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
|
||||
|
||||
ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
|
||||
ISCSI_UEVENT_SET_HOST_PARAM = UEVENT_BASE + 16,
|
||||
|
||||
/* up events */
|
||||
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
||||
@@ -71,6 +72,8 @@ struct iscsi_uevent {
|
||||
/* messages u -> k */
|
||||
struct msg_create_session {
|
||||
uint32_t initial_cmdsn;
|
||||
uint16_t cmds_max;
|
||||
uint16_t queue_depth;
|
||||
} c_session;
|
||||
struct msg_destroy_session {
|
||||
uint32_t sid;
|
||||
@@ -136,6 +139,11 @@ struct iscsi_uevent {
|
||||
*/
|
||||
uint32_t enable;
|
||||
} tgt_dscvr;
|
||||
struct msg_set_host_param {
|
||||
uint32_t host_no;
|
||||
uint32_t param; /* enum iscsi_host_param */
|
||||
uint32_t len;
|
||||
} set_host_param;
|
||||
} u;
|
||||
union {
|
||||
/* messages k -> u */
|
||||
@@ -223,6 +231,11 @@ enum iscsi_param {
|
||||
ISCSI_PARAM_CONN_PORT,
|
||||
ISCSI_PARAM_CONN_ADDRESS,
|
||||
|
||||
ISCSI_PARAM_USERNAME,
|
||||
ISCSI_PARAM_USERNAME_IN,
|
||||
ISCSI_PARAM_PASSWORD,
|
||||
ISCSI_PARAM_PASSWORD_IN,
|
||||
|
||||
/* must always be last */
|
||||
ISCSI_PARAM_MAX,
|
||||
};
|
||||
@@ -249,6 +262,24 @@ enum iscsi_param {
|
||||
#define ISCSI_SESS_RECOVERY_TMO (1 << ISCSI_PARAM_SESS_RECOVERY_TMO)
|
||||
#define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT)
|
||||
#define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS)
|
||||
#define ISCSI_USERNAME (1 << ISCSI_PARAM_USERNAME)
|
||||
#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)
|
||||
|
||||
/* iSCSI HBA params */
|
||||
enum iscsi_host_param {
|
||||
ISCSI_HOST_PARAM_HWADDRESS,
|
||||
ISCSI_HOST_PARAM_INITIATOR_NAME,
|
||||
ISCSI_HOST_PARAM_NETDEV_NAME,
|
||||
ISCSI_HOST_PARAM_IPADDRESS,
|
||||
ISCSI_HOST_PARAM_MAX,
|
||||
};
|
||||
|
||||
#define ISCSI_HOST_HWADDRESS (1 << ISCSI_HOST_PARAM_HWADDRESS)
|
||||
#define ISCSI_HOST_INITIATOR_NAME (1 << ISCSI_HOST_PARAM_INITIATOR_NAME)
|
||||
#define ISCSI_HOST_NETDEV_NAME (1 << ISCSI_HOST_PARAM_NETDEV_NAME)
|
||||
#define ISCSI_HOST_IPADDRESS (1 << ISCSI_HOST_PARAM_IPADDRESS)
|
||||
|
||||
#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
|
||||
#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
|
||||
@@ -272,6 +303,9 @@ enum iscsi_param {
|
||||
#define CAP_MULTI_CONN 0x40
|
||||
#define CAP_TEXT_NEGO 0x80
|
||||
#define CAP_MARKERS 0x100
|
||||
#define CAP_FW_DB 0x200
|
||||
#define CAP_SENDTARGETS_OFFLOAD 0x400
|
||||
#define CAP_DATA_PATH_OFFLOAD 0x800
|
||||
|
||||
/*
|
||||
* These flags describes reason of stop_conn() call
|
||||
|
||||
@@ -48,9 +48,8 @@ struct iscsi_nopin;
|
||||
#define debug_scsi(fmt...)
|
||||
#endif
|
||||
|
||||
#define ISCSI_XMIT_CMDS_MAX 128 /* must be power of 2 */
|
||||
#define ISCSI_MGMT_CMDS_MAX 32 /* must be power of 2 */
|
||||
#define ISCSI_CONN_MAX 1
|
||||
#define ISCSI_DEF_XMIT_CMDS_MAX 128 /* must be power of 2 */
|
||||
#define ISCSI_MGMT_CMDS_MAX 16 /* must be power of 2 */
|
||||
|
||||
#define ISCSI_MGMT_ITT_OFFSET 0xa00
|
||||
|
||||
@@ -73,6 +72,8 @@ struct iscsi_nopin;
|
||||
#define ISCSI_AGE_SHIFT 28
|
||||
#define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT)
|
||||
|
||||
#define ISCSI_ADDRESS_BUF_LEN 64
|
||||
|
||||
struct iscsi_mgmt_task {
|
||||
/*
|
||||
* Becuae LLDs allocate their hdr differently, this is a pointer to
|
||||
@@ -80,7 +81,7 @@ struct iscsi_mgmt_task {
|
||||
*/
|
||||
struct iscsi_hdr *hdr;
|
||||
char *data; /* mgmt payload */
|
||||
int data_count; /* counts data to be sent */
|
||||
unsigned data_count; /* counts data to be sent */
|
||||
uint32_t itt; /* this ITT */
|
||||
void *dd_data; /* driver/transport data */
|
||||
struct list_head running;
|
||||
@@ -90,6 +91,7 @@ enum {
|
||||
ISCSI_TASK_COMPLETED,
|
||||
ISCSI_TASK_PENDING,
|
||||
ISCSI_TASK_RUNNING,
|
||||
ISCSI_TASK_ABORTING,
|
||||
};
|
||||
|
||||
struct iscsi_cmd_task {
|
||||
@@ -99,16 +101,14 @@ struct iscsi_cmd_task {
|
||||
*/
|
||||
struct iscsi_cmd *hdr;
|
||||
int itt; /* this ITT */
|
||||
int datasn; /* DataSN */
|
||||
|
||||
uint32_t unsol_datasn;
|
||||
int imm_count; /* imm-data (bytes) */
|
||||
int unsol_count; /* unsolicited (bytes)*/
|
||||
unsigned imm_count; /* imm-data (bytes) */
|
||||
unsigned unsol_count; /* unsolicited (bytes)*/
|
||||
/* offset in unsolicited stream (bytes); */
|
||||
int unsol_offset;
|
||||
int data_count; /* remaining Data-Out */
|
||||
unsigned unsol_offset;
|
||||
unsigned data_count; /* remaining Data-Out */
|
||||
struct scsi_cmnd *sc; /* associated SCSI cmd*/
|
||||
int total_length;
|
||||
struct iscsi_conn *conn; /* used connection */
|
||||
struct iscsi_mgmt_task *mtask; /* tmf mtask in progr */
|
||||
|
||||
@@ -152,18 +152,11 @@ struct iscsi_conn {
|
||||
struct iscsi_cmd_task *ctask; /* xmit ctask in progress */
|
||||
|
||||
/* xmit */
|
||||
struct kfifo *immqueue; /* immediate xmit queue */
|
||||
struct kfifo *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 work_struct xmitwork; /* per-conn. xmit workqueue */
|
||||
/*
|
||||
* serializes connection xmit, access to kfifos:
|
||||
* xmitqueue, immqueue, mgmtqueue
|
||||
*/
|
||||
struct mutex xmitmutex;
|
||||
|
||||
unsigned long suspend_tx; /* suspend Tx */
|
||||
unsigned long suspend_rx; /* suspend Rx */
|
||||
|
||||
@@ -174,8 +167,8 @@ struct iscsi_conn {
|
||||
int tmabort_state; /* see TMABORT_INITIAL, etc.*/
|
||||
|
||||
/* negotiated params */
|
||||
int max_recv_dlength; /* initiator_max_recv_dsl*/
|
||||
int max_xmit_dlength; /* target_max_recv_dsl */
|
||||
unsigned max_recv_dlength; /* initiator_max_recv_dsl*/
|
||||
unsigned max_xmit_dlength; /* target_max_recv_dsl */
|
||||
int hdrdgst_en;
|
||||
int datadgst_en;
|
||||
int ifmarker_en;
|
||||
@@ -183,6 +176,12 @@ struct iscsi_conn {
|
||||
/* values userspace uses to id a conn */
|
||||
int persistent_port;
|
||||
char *persistent_address;
|
||||
/* remote portal currently connected to */
|
||||
int portal_port;
|
||||
char portal_address[ISCSI_ADDRESS_BUF_LEN];
|
||||
/* local address */
|
||||
int local_port;
|
||||
char local_address[ISCSI_ADDRESS_BUF_LEN];
|
||||
|
||||
/* MIB-statistics */
|
||||
uint64_t txdata_octets;
|
||||
@@ -213,18 +212,25 @@ struct iscsi_session {
|
||||
|
||||
/* configuration */
|
||||
int initial_r2t_en;
|
||||
int max_r2t;
|
||||
unsigned max_r2t;
|
||||
int imm_data_en;
|
||||
int first_burst;
|
||||
int max_burst;
|
||||
unsigned first_burst;
|
||||
unsigned max_burst;
|
||||
int time2wait;
|
||||
int time2retain;
|
||||
int pdu_inorder_en;
|
||||
int dataseq_inorder_en;
|
||||
int erl;
|
||||
int tpgt;
|
||||
char *username;
|
||||
char *username_in;
|
||||
char *password;
|
||||
char *password_in;
|
||||
char *targetname;
|
||||
|
||||
char *initiatorname;
|
||||
/* hw address or netdev iscsi connection is bound to */
|
||||
char *hwaddress;
|
||||
char *netdev;
|
||||
/* control data */
|
||||
struct iscsi_transport *tt;
|
||||
struct Scsi_Host *host;
|
||||
@@ -255,12 +261,22 @@ extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);
|
||||
extern int iscsi_queuecommand(struct scsi_cmnd *sc,
|
||||
void (*done)(struct scsi_cmnd *));
|
||||
|
||||
|
||||
/*
|
||||
* iSCSI host helpers.
|
||||
*/
|
||||
extern int iscsi_host_set_param(struct Scsi_Host *shost,
|
||||
enum iscsi_host_param param, char *buf,
|
||||
int buflen);
|
||||
extern int iscsi_host_get_param(struct Scsi_Host *shost,
|
||||
enum iscsi_host_param param, char *buf);
|
||||
|
||||
/*
|
||||
* session management
|
||||
*/
|
||||
extern struct iscsi_cls_session *
|
||||
iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
|
||||
int, int, uint32_t, uint32_t *);
|
||||
uint16_t, uint16_t, int, int, uint32_t, uint32_t *);
|
||||
extern void iscsi_session_teardown(struct iscsi_cls_session *);
|
||||
extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
|
||||
extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
|
||||
@@ -289,8 +305,7 @@ extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
||||
/*
|
||||
* pdu and task processing
|
||||
*/
|
||||
extern int iscsi_check_assign_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_cmd_task *,
|
||||
struct iscsi_data *hdr);
|
||||
extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,
|
||||
|
||||
@@ -135,4 +135,24 @@ extern void scsi_kunmap_atomic_sg(void *virt);
|
||||
extern struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *, gfp_t);
|
||||
extern void scsi_free_sgtable(struct scatterlist *, int);
|
||||
|
||||
extern int scsi_dma_map(struct scsi_cmnd *cmd);
|
||||
extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
|
||||
|
||||
#define scsi_sg_count(cmd) ((cmd)->use_sg)
|
||||
#define scsi_sglist(cmd) ((struct scatterlist *)(cmd)->request_buffer)
|
||||
#define scsi_bufflen(cmd) ((cmd)->request_bufflen)
|
||||
|
||||
static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid)
|
||||
{
|
||||
cmd->resid = resid;
|
||||
}
|
||||
|
||||
static inline int scsi_get_resid(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return cmd->resid;
|
||||
}
|
||||
|
||||
#define scsi_for_each_sg(cmd, sg, nseg, __i) \
|
||||
for (__i = 0, sg = scsi_sglist(cmd); __i < (nseg); __i++, (sg)++)
|
||||
|
||||
#endif /* _SCSI_SCSI_CMND_H */
|
||||
|
||||
@@ -209,7 +209,6 @@ extern struct scsi_device *__scsi_add_device(struct Scsi_Host *,
|
||||
extern int scsi_add_device(struct Scsi_Host *host, uint channel,
|
||||
uint target, uint lun);
|
||||
extern void scsi_remove_device(struct scsi_device *);
|
||||
extern int scsi_device_cancel(struct scsi_device *, int);
|
||||
|
||||
extern int scsi_device_get(struct scsi_device *);
|
||||
extern void scsi_device_put(struct scsi_device *);
|
||||
@@ -287,6 +286,7 @@ extern void scsi_target_block(struct device *);
|
||||
extern void scsi_target_unblock(struct device *);
|
||||
extern void scsi_remove_target(struct device *);
|
||||
extern void int_to_scsilun(unsigned int, struct scsi_lun *);
|
||||
extern int scsilun_to_int(struct scsi_lun *);
|
||||
extern const char *scsi_device_state_name(enum scsi_device_state);
|
||||
extern int scsi_is_sdev_device(const struct device *);
|
||||
extern int scsi_is_target_device(const struct device *);
|
||||
|
||||
@@ -338,12 +338,6 @@ struct scsi_host_template {
|
||||
*/
|
||||
enum scsi_eh_timer_return (* eh_timed_out)(struct scsi_cmnd *);
|
||||
|
||||
/*
|
||||
* suspend support
|
||||
*/
|
||||
int (*resume)(struct scsi_device *);
|
||||
int (*suspend)(struct scsi_device *, pm_message_t state);
|
||||
|
||||
/*
|
||||
* Name of proc directory
|
||||
*/
|
||||
@@ -677,6 +671,10 @@ struct Scsi_Host {
|
||||
#define shost_printk(prefix, shost, fmt, a...) \
|
||||
dev_printk(prefix, &(shost)->shost_gendev, fmt, ##a)
|
||||
|
||||
static inline void *shost_priv(struct Scsi_Host *shost)
|
||||
{
|
||||
return (void *)shost->hostdata;
|
||||
}
|
||||
|
||||
int scsi_is_host_device(const struct device *);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* FiberChannel transport specific attributes exported to sysfs.
|
||||
*
|
||||
* Copyright (c) 2003 Silicon Graphics, Inc. All rights reserved.
|
||||
@@ -19,7 +19,7 @@
|
||||
*
|
||||
* ========
|
||||
*
|
||||
* Copyright (C) 2004-2005 James Smart, Emulex Corporation
|
||||
* Copyright (C) 2004-2007 James Smart, Emulex Corporation
|
||||
* Rewrite for host, target, device, and remote port attributes,
|
||||
* statistics, and service functions...
|
||||
*
|
||||
@@ -62,8 +62,10 @@ enum fc_port_type {
|
||||
FC_PORTTYPE_NLPORT, /* (Public) Loop w/ FLPort */
|
||||
FC_PORTTYPE_LPORT, /* (Private) Loop w/o FLPort */
|
||||
FC_PORTTYPE_PTP, /* Point to Point w/ another NPort */
|
||||
FC_PORTTYPE_NPIV, /* VPORT based on NPIV */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* fc_port_state: If you alter this, you also need to alter scsi_transport_fc.c
|
||||
* (for the ascii descriptions).
|
||||
@@ -83,7 +85,26 @@ enum fc_port_state {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
/*
|
||||
* fc_vport_state: If you alter this, you also need to alter
|
||||
* scsi_transport_fc.c (for the ascii descriptions).
|
||||
*/
|
||||
enum fc_vport_state {
|
||||
FC_VPORT_UNKNOWN,
|
||||
FC_VPORT_ACTIVE,
|
||||
FC_VPORT_DISABLED,
|
||||
FC_VPORT_LINKDOWN,
|
||||
FC_VPORT_INITIALIZING,
|
||||
FC_VPORT_NO_FABRIC_SUPP,
|
||||
FC_VPORT_NO_FABRIC_RSCS,
|
||||
FC_VPORT_FABRIC_LOGOUT,
|
||||
FC_VPORT_FABRIC_REJ_WWN,
|
||||
FC_VPORT_FAILED,
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* FC Classes of Service
|
||||
* Note: values are not enumerated, as they can be "or'd" together
|
||||
* for reporting (e.g. report supported_classes). If you alter this list,
|
||||
@@ -96,7 +117,7 @@ enum fc_port_state {
|
||||
#define FC_COS_CLASS4 0x10
|
||||
#define FC_COS_CLASS6 0x40
|
||||
|
||||
/*
|
||||
/*
|
||||
* FC Port Speeds
|
||||
* Note: values are not enumerated, as they can be "or'd" together
|
||||
* for reporting (e.g. report supported_speeds). If you alter this list,
|
||||
@@ -124,16 +145,114 @@ enum fc_tgtid_binding_type {
|
||||
};
|
||||
|
||||
/*
|
||||
* FC Remote Port Roles
|
||||
* FC Port Roles
|
||||
* Note: values are not enumerated, as they can be "or'd" together
|
||||
* for reporting (e.g. report roles). If you alter this list,
|
||||
* you also need to alter scsi_transport_fc.c (for the ascii descriptions).
|
||||
*/
|
||||
#define FC_RPORT_ROLE_UNKNOWN 0x00
|
||||
#define FC_RPORT_ROLE_FCP_TARGET 0x01
|
||||
#define FC_RPORT_ROLE_FCP_INITIATOR 0x02
|
||||
#define FC_RPORT_ROLE_IP_PORT 0x04
|
||||
#define FC_PORT_ROLE_UNKNOWN 0x00
|
||||
#define FC_PORT_ROLE_FCP_TARGET 0x01
|
||||
#define FC_PORT_ROLE_FCP_INITIATOR 0x02
|
||||
#define FC_PORT_ROLE_IP_PORT 0x04
|
||||
|
||||
/* The following are for compatibility */
|
||||
#define FC_RPORT_ROLE_UNKNOWN FC_PORT_ROLE_UNKNOWN
|
||||
#define FC_RPORT_ROLE_FCP_TARGET FC_PORT_ROLE_FCP_TARGET
|
||||
#define FC_RPORT_ROLE_FCP_INITIATOR FC_PORT_ROLE_FCP_INITIATOR
|
||||
#define FC_RPORT_ROLE_IP_PORT FC_PORT_ROLE_IP_PORT
|
||||
|
||||
|
||||
/* Macro for use in defining Virtual Port attributes */
|
||||
#define FC_VPORT_ATTR(_name,_mode,_show,_store) \
|
||||
struct class_device_attribute class_device_attr_vport_##_name = \
|
||||
__ATTR(_name,_mode,_show,_store)
|
||||
|
||||
|
||||
/*
|
||||
* FC Virtual Port Attributes
|
||||
*
|
||||
* This structure exists for each FC port is a virtual FC port. Virtual
|
||||
* ports share the physical link with the Physical port. Each virtual
|
||||
* ports has a unique presense on the SAN, and may be instantiated via
|
||||
* NPIV, Virtual Fabrics, or via additional ALPAs. As the vport is a
|
||||
* unique presense, each vport has it's own view of the fabric,
|
||||
* authentication priviledge, and priorities.
|
||||
*
|
||||
* A virtual port may support 1 or more FC4 roles. Typically it is a
|
||||
* FCP Initiator. It could be a FCP Target, or exist sole for an IP over FC
|
||||
* roles. FC port attributes for the vport will be reported on any
|
||||
* fc_host class object allocated for an FCP Initiator.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* Fixed attributes are not expected to change. The driver is
|
||||
* expected to set these values after receiving the fc_vport structure
|
||||
* via the vport_create() call from the transport.
|
||||
* The transport fully manages all get functions w/o driver interaction.
|
||||
*
|
||||
* Dynamic attributes are expected to change. The driver participates
|
||||
* in all get/set operations via functions provided by the driver.
|
||||
*
|
||||
* Private attributes are transport-managed values. They are fully
|
||||
* managed by the transport w/o driver interaction.
|
||||
*/
|
||||
|
||||
#define FC_VPORT_SYMBOLIC_NAMELEN 64
|
||||
struct fc_vport {
|
||||
/* Fixed Attributes */
|
||||
|
||||
/* Dynamic Attributes */
|
||||
|
||||
/* Private (Transport-managed) Attributes */
|
||||
enum fc_vport_state vport_state;
|
||||
enum fc_vport_state vport_last_state;
|
||||
u64 node_name;
|
||||
u64 port_name;
|
||||
u32 roles;
|
||||
u32 vport_id; /* Admin Identifier for the vport */
|
||||
enum fc_port_type vport_type;
|
||||
char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
|
||||
|
||||
/* exported data */
|
||||
void *dd_data; /* Used for driver-specific storage */
|
||||
|
||||
/* internal data */
|
||||
struct Scsi_Host *shost; /* Physical Port Parent */
|
||||
unsigned int channel;
|
||||
u32 number;
|
||||
u8 flags;
|
||||
struct list_head peers;
|
||||
struct device dev;
|
||||
struct work_struct vport_delete_work;
|
||||
} __attribute__((aligned(sizeof(unsigned long))));
|
||||
|
||||
/* bit field values for struct fc_vport "flags" field: */
|
||||
#define FC_VPORT_CREATING 0x01
|
||||
#define FC_VPORT_DELETING 0x02
|
||||
#define FC_VPORT_DELETED 0x04
|
||||
#define FC_VPORT_DEL 0x06 /* Any DELETE state */
|
||||
|
||||
#define dev_to_vport(d) \
|
||||
container_of(d, struct fc_vport, dev)
|
||||
#define transport_class_to_vport(classdev) \
|
||||
dev_to_vport(classdev->dev)
|
||||
#define vport_to_shost(v) \
|
||||
(v->shost)
|
||||
#define vport_to_shost_channel(v) \
|
||||
(v->channel)
|
||||
#define vport_to_parent(v) \
|
||||
(v->dev.parent)
|
||||
|
||||
|
||||
/* Error return codes for vport_create() callback */
|
||||
#define VPCERR_UNSUPPORTED -ENOSYS /* no driver/adapter
|
||||
support */
|
||||
#define VPCERR_BAD_WWN -ENOTUNIQ /* driver validation
|
||||
of WWNs failed */
|
||||
#define VPCERR_NO_FABRIC_SUPP -EOPNOTSUPP /* Fabric connection
|
||||
is loop or the
|
||||
Fabric Port does
|
||||
not support NPIV */
|
||||
|
||||
/*
|
||||
* fc_rport_identifiers: This set of data contains all elements
|
||||
@@ -149,6 +268,7 @@ struct fc_rport_identifiers {
|
||||
u32 roles;
|
||||
};
|
||||
|
||||
|
||||
/* Macro for use in defining Remote Port attributes */
|
||||
#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
|
||||
struct class_device_attribute class_device_attr_rport_##_name = \
|
||||
@@ -278,7 +398,7 @@ struct fc_host_statistics {
|
||||
u64 prim_seq_protocol_err_count;
|
||||
u64 invalid_tx_word_count;
|
||||
u64 invalid_crc_count;
|
||||
|
||||
|
||||
/* fc4 statistics (only FCP supported currently) */
|
||||
u64 fcp_input_requests;
|
||||
u64 fcp_output_requests;
|
||||
@@ -343,6 +463,7 @@ struct fc_host_attrs {
|
||||
u8 supported_fc4s[FC_FC4_LIST_SIZE];
|
||||
u32 supported_speeds;
|
||||
u32 maxframe_size;
|
||||
u16 max_npiv_vports;
|
||||
char serial_number[FC_SERIAL_NUMBER_SIZE];
|
||||
|
||||
/* Dynamic Attributes */
|
||||
@@ -361,8 +482,11 @@ struct fc_host_attrs {
|
||||
/* internal data */
|
||||
struct list_head rports;
|
||||
struct list_head rport_bindings;
|
||||
struct list_head vports;
|
||||
u32 next_rport_number;
|
||||
u32 next_target_id;
|
||||
u32 next_vport_number;
|
||||
u16 npiv_vports_inuse;
|
||||
|
||||
/* work queues for rport state manipulation */
|
||||
char work_q_name[KOBJ_NAME_LEN];
|
||||
@@ -388,6 +512,8 @@ struct fc_host_attrs {
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
|
||||
#define fc_host_maxframe_size(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
|
||||
#define fc_host_max_npiv_vports(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
|
||||
#define fc_host_serial_number(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->serial_number)
|
||||
#define fc_host_port_id(x) \
|
||||
@@ -412,10 +538,16 @@ struct fc_host_attrs {
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->rports)
|
||||
#define fc_host_rport_bindings(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
|
||||
#define fc_host_vports(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->vports)
|
||||
#define fc_host_next_rport_number(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
|
||||
#define fc_host_next_target_id(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
|
||||
#define fc_host_next_vport_number(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
|
||||
#define fc_host_npiv_vports_inuse(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
|
||||
#define fc_host_work_q_name(x) \
|
||||
(((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
|
||||
#define fc_host_work_q(x) \
|
||||
@@ -452,14 +584,20 @@ struct fc_function_template {
|
||||
void (*dev_loss_tmo_callbk)(struct fc_rport *);
|
||||
void (*terminate_rport_io)(struct fc_rport *);
|
||||
|
||||
void (*set_vport_symbolic_name)(struct fc_vport *);
|
||||
int (*vport_create)(struct fc_vport *, bool);
|
||||
int (*vport_disable)(struct fc_vport *, bool);
|
||||
int (*vport_delete)(struct fc_vport *);
|
||||
|
||||
/* allocation lengths for host-specific data */
|
||||
u32 dd_fcrport_size;
|
||||
u32 dd_fcvport_size;
|
||||
|
||||
/*
|
||||
/*
|
||||
* The driver sets these to tell the transport class it
|
||||
* wants the attributes displayed in sysfs. If the show_ flag
|
||||
* is not set, the attribute will be private to the transport
|
||||
* class
|
||||
* class
|
||||
*/
|
||||
|
||||
/* remote port fixed attributes */
|
||||
@@ -512,7 +650,7 @@ fc_remote_port_chkready(struct fc_rport *rport)
|
||||
|
||||
switch (rport->port_state) {
|
||||
case FC_PORTSTATE_ONLINE:
|
||||
if (rport->roles & FC_RPORT_ROLE_FCP_TARGET)
|
||||
if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
|
||||
result = 0;
|
||||
else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
|
||||
result = DID_IMM_RETRY << 16;
|
||||
@@ -549,6 +687,27 @@ static inline void u64_to_wwn(u64 inm, u8 *wwn)
|
||||
wwn[7] = inm & 0xff;
|
||||
}
|
||||
|
||||
/**
|
||||
* fc_vport_set_state() - called to set a vport's state. Saves the old state,
|
||||
* excepting the transitory states of initializing and sending the ELS
|
||||
* traffic to instantiate the vport on the link.
|
||||
*
|
||||
* Assumes the driver has surrounded this with the proper locking to ensure
|
||||
* a coherent state change.
|
||||
*
|
||||
* @vport: virtual port whose state is changing
|
||||
* @new_state: new state
|
||||
**/
|
||||
static inline void
|
||||
fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
|
||||
{
|
||||
if ((new_state != FC_VPORT_UNKNOWN) &&
|
||||
(new_state != FC_VPORT_INITIALIZING))
|
||||
vport->vport_last_state = vport->vport_state;
|
||||
vport->vport_state = new_state;
|
||||
}
|
||||
|
||||
|
||||
struct scsi_transport_template *fc_attach_transport(
|
||||
struct fc_function_template *);
|
||||
void fc_release_transport(struct scsi_transport_template *);
|
||||
@@ -567,5 +726,6 @@ void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
|
||||
* be sure to read the Vendor Type and ID formatting requirements
|
||||
* specified in scsi_netlink.h
|
||||
*/
|
||||
int fc_vport_terminate(struct fc_vport *vport);
|
||||
|
||||
#endif /* SCSI_TRANSPORT_FC_H */
|
||||
|
||||
@@ -79,7 +79,8 @@ struct iscsi_transport {
|
||||
char *name;
|
||||
unsigned int caps;
|
||||
/* LLD sets this to indicate what values it can export to sysfs */
|
||||
unsigned int param_mask;
|
||||
uint64_t param_mask;
|
||||
uint64_t host_param_mask;
|
||||
struct scsi_host_template *host_template;
|
||||
/* LLD connection data size */
|
||||
int conndata_size;
|
||||
@@ -89,7 +90,8 @@ struct iscsi_transport {
|
||||
unsigned int max_conn;
|
||||
unsigned int max_cmd_len;
|
||||
struct iscsi_cls_session *(*create_session) (struct iscsi_transport *it,
|
||||
struct scsi_transport_template *t, uint32_t sn, uint32_t *hn);
|
||||
struct scsi_transport_template *t, uint16_t, uint16_t,
|
||||
uint32_t sn, uint32_t *hn);
|
||||
void (*destroy_session) (struct iscsi_cls_session *session);
|
||||
struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
|
||||
uint32_t cid);
|
||||
@@ -105,14 +107,18 @@ struct iscsi_transport {
|
||||
enum iscsi_param param, char *buf);
|
||||
int (*get_session_param) (struct iscsi_cls_session *session,
|
||||
enum iscsi_param param, char *buf);
|
||||
int (*get_host_param) (struct Scsi_Host *shost,
|
||||
enum iscsi_host_param param, char *buf);
|
||||
int (*set_host_param) (struct Scsi_Host *shost,
|
||||
enum iscsi_host_param param, char *buf,
|
||||
int buflen);
|
||||
int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
|
||||
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);
|
||||
void (*init_mgmt_task) (struct iscsi_conn *conn,
|
||||
struct iscsi_mgmt_task *mtask,
|
||||
char *data, uint32_t data_size);
|
||||
struct iscsi_mgmt_task *mtask);
|
||||
int (*xmit_cmd_task) (struct iscsi_conn *conn,
|
||||
struct iscsi_cmd_task *ctask);
|
||||
void (*cleanup_cmd_task) (struct iscsi_conn *conn,
|
||||
@@ -124,7 +130,7 @@ struct iscsi_transport {
|
||||
uint64_t *ep_handle);
|
||||
int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
|
||||
void (*ep_disconnect) (uint64_t ep_handle);
|
||||
int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no,
|
||||
int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
|
||||
uint32_t enable, struct sockaddr *dst_addr);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user