mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -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: (204 commits) [SCSI] qla4xxx: export address/port of connection (fix udev disk names) [SCSI] ipr: Fix BUG on adapter dump timeout [SCSI] megaraid_sas: Fix instance access in megasas_reset_timer [SCSI] hpsa: change confusing message to be more clear [SCSI] iscsi class: fix vlan configuration [SCSI] qla4xxx: fix data alignment and use nl helpers [SCSI] iscsi class: fix link local mispelling [SCSI] iscsi class: Replace iscsi_get_next_target_id with IDA [SCSI] aacraid: use lower snprintf() limit [SCSI] lpfc 8.3.27: Change driver version to 8.3.27 [SCSI] lpfc 8.3.27: T10 additions for SLI4 [SCSI] lpfc 8.3.27: Fix queue allocation failure recovery [SCSI] lpfc 8.3.27: Change algorithm for getting physical port name [SCSI] lpfc 8.3.27: Changed worst case mailbox timeout [SCSI] lpfc 8.3.27: Miscellanous logic and interface fixes [SCSI] megaraid_sas: Changelog and version update [SCSI] megaraid_sas: Add driver workaround for PERC5/1068 kdump kernel panic [SCSI] megaraid_sas: Add multiple MSI-X vector/multiple reply queue support [SCSI] megaraid_sas: Add support for MegaRAID 9360/9380 12GB/s controllers [SCSI] megaraid_sas: Clear FUSION_IN_RESET before enabling interrupts ...
This commit is contained in:
commit
ec7ae51753
162 changed files with 14203 additions and 3413 deletions
|
|
@ -21,6 +21,8 @@
|
|||
#define dev_to_part(device) container_of((device), struct hd_struct, __dev)
|
||||
#define disk_to_dev(disk) (&(disk)->part0.__dev)
|
||||
#define part_to_dev(part) (&((part)->__dev))
|
||||
#define alias_name(disk) ((disk)->alias ? (disk)->alias : \
|
||||
(disk)->disk_name)
|
||||
|
||||
extern struct device_type part_type;
|
||||
extern struct kobject *block_depr;
|
||||
|
|
@ -58,6 +60,7 @@ enum {
|
|||
|
||||
#define DISK_MAX_PARTS 256
|
||||
#define DISK_NAME_LEN 32
|
||||
#define ALIAS_LEN 256
|
||||
|
||||
#include <linux/major.h>
|
||||
#include <linux/device.h>
|
||||
|
|
@ -162,6 +165,7 @@ struct gendisk {
|
|||
* disks that can't be partitioned. */
|
||||
|
||||
char disk_name[DISK_NAME_LEN]; /* name of major driver */
|
||||
char *alias; /* alias name of disk */
|
||||
char *(*devnode)(struct gendisk *gd, mode_t *mode);
|
||||
|
||||
unsigned int events; /* supported events */
|
||||
|
|
|
|||
|
|
@ -1052,6 +1052,8 @@ extern int ata_scsi_slave_config(struct scsi_device *sdev);
|
|||
extern void ata_scsi_slave_destroy(struct scsi_device *sdev);
|
||||
extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
|
||||
int queue_depth, int reason);
|
||||
extern int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,
|
||||
int queue_depth, int reason);
|
||||
extern struct ata_device *ata_dev_pair(struct ata_device *adev);
|
||||
extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
|
||||
extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ enum iscsi_uevent_e {
|
|||
ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST = UEVENT_BASE + 19,
|
||||
|
||||
ISCSI_UEVENT_PATH_UPDATE = UEVENT_BASE + 20,
|
||||
ISCSI_UEVENT_SET_IFACE_PARAMS = UEVENT_BASE + 21,
|
||||
|
||||
/* up events */
|
||||
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
|
||||
|
|
@ -70,6 +71,7 @@ enum iscsi_uevent_e {
|
|||
|
||||
ISCSI_KEVENT_PATH_REQ = KEVENT_BASE + 7,
|
||||
ISCSI_KEVENT_IF_DOWN = KEVENT_BASE + 8,
|
||||
ISCSI_KEVENT_CONN_LOGIN_STATE = KEVENT_BASE + 9,
|
||||
};
|
||||
|
||||
enum iscsi_tgt_dscvr {
|
||||
|
|
@ -172,6 +174,10 @@ struct iscsi_uevent {
|
|||
struct msg_set_path {
|
||||
uint32_t host_no;
|
||||
} set_path;
|
||||
struct msg_set_iface_params {
|
||||
uint32_t host_no;
|
||||
uint32_t count;
|
||||
} set_iface_params;
|
||||
} u;
|
||||
union {
|
||||
/* messages k -> u */
|
||||
|
|
@ -193,6 +199,11 @@ struct iscsi_uevent {
|
|||
uint32_t cid;
|
||||
uint64_t recv_handle;
|
||||
} recv_req;
|
||||
struct msg_conn_login {
|
||||
uint32_t sid;
|
||||
uint32_t cid;
|
||||
uint32_t state; /* enum iscsi_conn_state */
|
||||
} conn_login;
|
||||
struct msg_conn_error {
|
||||
uint32_t sid;
|
||||
uint32_t cid;
|
||||
|
|
@ -214,6 +225,21 @@ struct iscsi_uevent {
|
|||
} r;
|
||||
} __attribute__ ((aligned (sizeof(uint64_t))));
|
||||
|
||||
enum iscsi_param_type {
|
||||
ISCSI_PARAM, /* iscsi_param (session, conn, target, LU) */
|
||||
ISCSI_HOST_PARAM, /* iscsi_host_param */
|
||||
ISCSI_NET_PARAM, /* iscsi_net_param */
|
||||
};
|
||||
|
||||
struct iscsi_iface_param_info {
|
||||
uint32_t iface_num; /* iface number, 0 - n */
|
||||
uint32_t len; /* Actual length of the param */
|
||||
uint16_t param; /* iscsi param value */
|
||||
uint8_t iface_type; /* IPv4 or IPv6 */
|
||||
uint8_t param_type; /* iscsi_param_type */
|
||||
uint8_t value[0]; /* length sized value follows */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* To keep the struct iscsi_uevent size the same for userspace code
|
||||
* compatibility, the main structure for ISCSI_UEVENT_PATH_UPDATE and
|
||||
|
|
@ -237,6 +263,71 @@ struct iscsi_path {
|
|||
uint16_t pmtu;
|
||||
} __attribute__ ((aligned (sizeof(uint64_t))));
|
||||
|
||||
/* iscsi iface enabled/disabled setting */
|
||||
#define ISCSI_IFACE_DISABLE 0x01
|
||||
#define ISCSI_IFACE_ENABLE 0x02
|
||||
|
||||
/* ipv4 bootproto */
|
||||
#define ISCSI_BOOTPROTO_STATIC 0x01
|
||||
#define ISCSI_BOOTPROTO_DHCP 0x02
|
||||
|
||||
/* ipv6 addr autoconfig type */
|
||||
#define ISCSI_IPV6_AUTOCFG_DISABLE 0x01
|
||||
#define ISCSI_IPV6_AUTOCFG_ND_ENABLE 0x02
|
||||
#define ISCSI_IPV6_AUTOCFG_DHCPV6_ENABLE 0x03
|
||||
|
||||
/* ipv6 link local addr type */
|
||||
#define ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE 0x01
|
||||
#define ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE 0x02
|
||||
|
||||
/* ipv6 router addr type */
|
||||
#define ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE 0x01
|
||||
#define ISCSI_IPV6_ROUTER_AUTOCFG_DISABLE 0x02
|
||||
|
||||
#define ISCSI_IFACE_TYPE_IPV4 0x01
|
||||
#define ISCSI_IFACE_TYPE_IPV6 0x02
|
||||
|
||||
#define ISCSI_MAX_VLAN_ID 4095
|
||||
#define ISCSI_MAX_VLAN_PRIORITY 7
|
||||
|
||||
/* iscsi vlan enable/disabled setting */
|
||||
#define ISCSI_VLAN_DISABLE 0x01
|
||||
#define ISCSI_VLAN_ENABLE 0x02
|
||||
|
||||
/* iSCSI network params */
|
||||
enum iscsi_net_param {
|
||||
ISCSI_NET_PARAM_IPV4_ADDR = 1,
|
||||
ISCSI_NET_PARAM_IPV4_SUBNET = 2,
|
||||
ISCSI_NET_PARAM_IPV4_GW = 3,
|
||||
ISCSI_NET_PARAM_IPV4_BOOTPROTO = 4,
|
||||
ISCSI_NET_PARAM_MAC = 5,
|
||||
ISCSI_NET_PARAM_IPV6_LINKLOCAL = 6,
|
||||
ISCSI_NET_PARAM_IPV6_ADDR = 7,
|
||||
ISCSI_NET_PARAM_IPV6_ROUTER = 8,
|
||||
ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG = 9,
|
||||
ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG = 10,
|
||||
ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG = 11,
|
||||
ISCSI_NET_PARAM_IFACE_ENABLE = 12,
|
||||
ISCSI_NET_PARAM_VLAN_ID = 13,
|
||||
ISCSI_NET_PARAM_VLAN_PRIORITY = 14,
|
||||
ISCSI_NET_PARAM_VLAN_ENABLED = 15,
|
||||
ISCSI_NET_PARAM_VLAN_TAG = 16,
|
||||
ISCSI_NET_PARAM_IFACE_TYPE = 17,
|
||||
ISCSI_NET_PARAM_IFACE_NAME = 18,
|
||||
ISCSI_NET_PARAM_MTU = 19,
|
||||
ISCSI_NET_PARAM_PORT = 20,
|
||||
};
|
||||
|
||||
enum iscsi_conn_state {
|
||||
ISCSI_CONN_STATE_FREE,
|
||||
ISCSI_CONN_STATE_XPT_WAIT,
|
||||
ISCSI_CONN_STATE_IN_LOGIN,
|
||||
ISCSI_CONN_STATE_LOGGED_IN,
|
||||
ISCSI_CONN_STATE_IN_LOGOUT,
|
||||
ISCSI_CONN_STATE_LOGOUT_REQUESTED,
|
||||
ISCSI_CONN_STATE_CLEANUP_WAIT,
|
||||
};
|
||||
|
||||
/*
|
||||
* Common error codes
|
||||
*/
|
||||
|
|
@ -319,44 +410,6 @@ enum iscsi_param {
|
|||
ISCSI_PARAM_MAX,
|
||||
};
|
||||
|
||||
#define ISCSI_MAX_RECV_DLENGTH (1ULL << ISCSI_PARAM_MAX_RECV_DLENGTH)
|
||||
#define ISCSI_MAX_XMIT_DLENGTH (1ULL << ISCSI_PARAM_MAX_XMIT_DLENGTH)
|
||||
#define ISCSI_HDRDGST_EN (1ULL << ISCSI_PARAM_HDRDGST_EN)
|
||||
#define ISCSI_DATADGST_EN (1ULL << ISCSI_PARAM_DATADGST_EN)
|
||||
#define ISCSI_INITIAL_R2T_EN (1ULL << ISCSI_PARAM_INITIAL_R2T_EN)
|
||||
#define ISCSI_MAX_R2T (1ULL << ISCSI_PARAM_MAX_R2T)
|
||||
#define ISCSI_IMM_DATA_EN (1ULL << ISCSI_PARAM_IMM_DATA_EN)
|
||||
#define ISCSI_FIRST_BURST (1ULL << ISCSI_PARAM_FIRST_BURST)
|
||||
#define ISCSI_MAX_BURST (1ULL << ISCSI_PARAM_MAX_BURST)
|
||||
#define ISCSI_PDU_INORDER_EN (1ULL << ISCSI_PARAM_PDU_INORDER_EN)
|
||||
#define ISCSI_DATASEQ_INORDER_EN (1ULL << ISCSI_PARAM_DATASEQ_INORDER_EN)
|
||||
#define ISCSI_ERL (1ULL << ISCSI_PARAM_ERL)
|
||||
#define ISCSI_IFMARKER_EN (1ULL << ISCSI_PARAM_IFMARKER_EN)
|
||||
#define ISCSI_OFMARKER_EN (1ULL << ISCSI_PARAM_OFMARKER_EN)
|
||||
#define ISCSI_EXP_STATSN (1ULL << ISCSI_PARAM_EXP_STATSN)
|
||||
#define ISCSI_TARGET_NAME (1ULL << ISCSI_PARAM_TARGET_NAME)
|
||||
#define ISCSI_TPGT (1ULL << ISCSI_PARAM_TPGT)
|
||||
#define ISCSI_PERSISTENT_ADDRESS (1ULL << ISCSI_PARAM_PERSISTENT_ADDRESS)
|
||||
#define ISCSI_PERSISTENT_PORT (1ULL << ISCSI_PARAM_PERSISTENT_PORT)
|
||||
#define ISCSI_SESS_RECOVERY_TMO (1ULL << ISCSI_PARAM_SESS_RECOVERY_TMO)
|
||||
#define ISCSI_CONN_PORT (1ULL << ISCSI_PARAM_CONN_PORT)
|
||||
#define ISCSI_CONN_ADDRESS (1ULL << ISCSI_PARAM_CONN_ADDRESS)
|
||||
#define ISCSI_USERNAME (1ULL << ISCSI_PARAM_USERNAME)
|
||||
#define ISCSI_USERNAME_IN (1ULL << ISCSI_PARAM_USERNAME_IN)
|
||||
#define ISCSI_PASSWORD (1ULL << ISCSI_PARAM_PASSWORD)
|
||||
#define ISCSI_PASSWORD_IN (1ULL << ISCSI_PARAM_PASSWORD_IN)
|
||||
#define ISCSI_FAST_ABORT (1ULL << ISCSI_PARAM_FAST_ABORT)
|
||||
#define ISCSI_ABORT_TMO (1ULL << ISCSI_PARAM_ABORT_TMO)
|
||||
#define ISCSI_LU_RESET_TMO (1ULL << ISCSI_PARAM_LU_RESET_TMO)
|
||||
#define ISCSI_HOST_RESET_TMO (1ULL << ISCSI_PARAM_HOST_RESET_TMO)
|
||||
#define ISCSI_PING_TMO (1ULL << ISCSI_PARAM_PING_TMO)
|
||||
#define ISCSI_RECV_TMO (1ULL << ISCSI_PARAM_RECV_TMO)
|
||||
#define ISCSI_IFACE_NAME (1ULL << ISCSI_PARAM_IFACE_NAME)
|
||||
#define ISCSI_ISID (1ULL << ISCSI_PARAM_ISID)
|
||||
#define ISCSI_INITIATOR_NAME (1ULL << ISCSI_PARAM_INITIATOR_NAME)
|
||||
#define ISCSI_TGT_RESET_TMO (1ULL << ISCSI_PARAM_TGT_RESET_TMO)
|
||||
#define ISCSI_TARGET_ALIAS (1ULL << ISCSI_PARAM_TARGET_ALIAS)
|
||||
|
||||
/* iSCSI HBA params */
|
||||
enum iscsi_host_param {
|
||||
ISCSI_HOST_PARAM_HWADDRESS,
|
||||
|
|
@ -366,11 +419,6 @@ enum iscsi_host_param {
|
|||
ISCSI_HOST_PARAM_MAX,
|
||||
};
|
||||
|
||||
#define ISCSI_HOST_HWADDRESS (1ULL << ISCSI_HOST_PARAM_HWADDRESS)
|
||||
#define ISCSI_HOST_INITIATOR_NAME (1ULL << ISCSI_HOST_PARAM_INITIATOR_NAME)
|
||||
#define ISCSI_HOST_NETDEV_NAME (1ULL << ISCSI_HOST_PARAM_NETDEV_NAME)
|
||||
#define ISCSI_HOST_IPADDRESS (1ULL << ISCSI_HOST_PARAM_IPADDRESS)
|
||||
|
||||
#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
|
||||
#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
|
||||
|
||||
|
|
@ -392,6 +440,7 @@ enum iscsi_host_param {
|
|||
#define CAP_DIGEST_OFFLOAD 0x1000 /* offload hdr and data digests */
|
||||
#define CAP_PADDING_OFFLOAD 0x2000 /* offload padding insertion, removal,
|
||||
and verification */
|
||||
#define CAP_LOGIN_OFFLOAD 0x4000 /* offload session login */
|
||||
|
||||
/*
|
||||
* These flags describes reason of stop_conn() call
|
||||
|
|
|
|||
|
|
@ -281,9 +281,6 @@ struct fc_seq_els_data {
|
|||
* @timer: The command timer
|
||||
* @tm_done: Completion indicator
|
||||
* @wait_for_comp: Indicator to wait for completion of the I/O (in jiffies)
|
||||
* @start_time: Timestamp indicating the start of the I/O (in jiffies)
|
||||
* @end_time: Timestamp indicating the end of the I/O (in jiffies)
|
||||
* @last_pkt_time: Timestamp of the last frame received (in jiffies)
|
||||
* @data_len: The length of the data
|
||||
* @cdb_cmd: The CDB command
|
||||
* @xfer_len: The transfer length
|
||||
|
|
@ -304,50 +301,46 @@ struct fc_seq_els_data {
|
|||
* @recov_seq: The sequence for REC or SRR
|
||||
*/
|
||||
struct fc_fcp_pkt {
|
||||
/* Housekeeping information */
|
||||
struct fc_lport *lp;
|
||||
u16 state;
|
||||
atomic_t ref_cnt;
|
||||
spinlock_t scsi_pkt_lock;
|
||||
atomic_t ref_cnt;
|
||||
|
||||
/* SCSI command and data transfer information */
|
||||
u32 data_len;
|
||||
|
||||
/* SCSI I/O related information */
|
||||
struct scsi_cmnd *cmd;
|
||||
struct list_head list;
|
||||
|
||||
/* Timeout related information */
|
||||
struct timer_list timer;
|
||||
struct completion tm_done;
|
||||
int wait_for_comp;
|
||||
unsigned long start_time;
|
||||
unsigned long end_time;
|
||||
unsigned long last_pkt_time;
|
||||
|
||||
/* SCSI command and data transfer information */
|
||||
u32 data_len;
|
||||
|
||||
/* Transport related veriables */
|
||||
struct fcp_cmnd cdb_cmd;
|
||||
size_t xfer_len;
|
||||
u16 xfer_ddp;
|
||||
u32 xfer_contig_end;
|
||||
u16 max_payload;
|
||||
/* Housekeeping information */
|
||||
struct fc_lport *lp;
|
||||
u8 state;
|
||||
|
||||
/* SCSI/FCP return status */
|
||||
u32 io_status;
|
||||
u8 cdb_status;
|
||||
u8 status_code;
|
||||
u8 scsi_comp_flags;
|
||||
u32 io_status;
|
||||
u32 req_flags;
|
||||
u32 scsi_resid;
|
||||
|
||||
/* Transport related veriables */
|
||||
size_t xfer_len;
|
||||
struct fcp_cmnd cdb_cmd;
|
||||
u32 xfer_contig_end;
|
||||
u16 max_payload;
|
||||
u16 xfer_ddp;
|
||||
|
||||
/* Associated structures */
|
||||
struct fc_rport *rport;
|
||||
struct fc_seq *seq_ptr;
|
||||
|
||||
/* Error Processing information */
|
||||
u8 recov_retry;
|
||||
/* Timeout/error related information */
|
||||
struct timer_list timer;
|
||||
int wait_for_comp;
|
||||
u32 recov_retry;
|
||||
struct fc_seq *recov_seq;
|
||||
};
|
||||
struct completion tm_done;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/*
|
||||
* Structure and function definitions for managing Fibre Channel Exchanges
|
||||
|
|
@ -413,35 +406,32 @@ struct fc_seq {
|
|||
* sequence allocation
|
||||
*/
|
||||
struct fc_exch {
|
||||
struct fc_exch_mgr *em;
|
||||
struct fc_exch_pool *pool;
|
||||
u32 state;
|
||||
u16 xid;
|
||||
struct list_head ex_list;
|
||||
spinlock_t ex_lock;
|
||||
atomic_t ex_refcnt;
|
||||
struct delayed_work timeout_work;
|
||||
enum fc_class class;
|
||||
struct fc_exch_mgr *em;
|
||||
struct fc_exch_pool *pool;
|
||||
struct list_head ex_list;
|
||||
struct fc_lport *lp;
|
||||
u32 esb_stat;
|
||||
u8 state;
|
||||
u8 fh_type;
|
||||
u8 seq_id;
|
||||
u8 encaps;
|
||||
u16 xid;
|
||||
u16 oxid;
|
||||
u16 rxid;
|
||||
u32 oid;
|
||||
u32 sid;
|
||||
u32 did;
|
||||
u32 esb_stat;
|
||||
u32 r_a_tov;
|
||||
u8 seq_id;
|
||||
u8 encaps;
|
||||
u32 f_ctl;
|
||||
u8 fh_type;
|
||||
enum fc_class class;
|
||||
struct fc_seq seq;
|
||||
|
||||
struct fc_seq seq;
|
||||
void (*resp)(struct fc_seq *, struct fc_frame *, void *);
|
||||
void *arg;
|
||||
|
||||
void (*destructor)(struct fc_seq *, void *);
|
||||
|
||||
};
|
||||
struct delayed_work timeout_work;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
#define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -229,6 +229,11 @@ int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *,
|
|||
const struct libfc_function_template *, int init_fcp);
|
||||
u32 fcoe_fc_crc(struct fc_frame *fp);
|
||||
int fcoe_start_io(struct sk_buff *skb);
|
||||
int fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type);
|
||||
void __fcoe_get_lesb(struct fc_lport *lport, struct fc_els_lesb *fc_lesb,
|
||||
struct net_device *netdev);
|
||||
void fcoe_wwn_to_str(u64 wwn, char *buf, int len);
|
||||
int fcoe_validate_vport_create(struct fc_vport *vport);
|
||||
|
||||
/**
|
||||
* is_fip_mode() - returns true if FIP mode selected.
|
||||
|
|
|
|||
|
|
@ -142,8 +142,11 @@ struct expander_device {
|
|||
u16 ex_change_count;
|
||||
u16 max_route_indexes;
|
||||
u8 num_phys;
|
||||
|
||||
u8 t2t_supp:1;
|
||||
u8 configuring:1;
|
||||
u8 conf_route_table:1;
|
||||
|
||||
u8 enclosure_logical_id[8];
|
||||
|
||||
struct ex_phy *ex_phy;
|
||||
|
|
@ -386,6 +389,11 @@ sdev_to_domain_dev(struct scsi_device *sdev) {
|
|||
return starget_to_domain_dev(sdev->sdev_target);
|
||||
}
|
||||
|
||||
static inline struct ata_device *sas_to_ata_dev(struct domain_device *dev)
|
||||
{
|
||||
return &dev->sata_dev.ap->link.device[0];
|
||||
}
|
||||
|
||||
static inline struct domain_device *
|
||||
cmd_to_domain_dev(struct scsi_cmnd *cmd)
|
||||
{
|
||||
|
|
@ -405,6 +413,20 @@ static inline void sas_phy_disconnected(struct asd_sas_phy *phy)
|
|||
phy->linkrate = SAS_LINK_RATE_UNKNOWN;
|
||||
}
|
||||
|
||||
static inline unsigned int to_sas_gpio_od(int device, int bit)
|
||||
{
|
||||
return 3 * device + bit;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SCSI_SAS_HOST_SMP
|
||||
int try_test_sas_gpio_gp_bit(unsigned int od, u8 *data, u8 index, u8 count);
|
||||
#else
|
||||
static inline int try_test_sas_gpio_gp_bit(unsigned int od, u8 *data, u8 index, u8 count)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------- Tasks ---------- */
|
||||
/*
|
||||
service_response | SAS_TASK_COMPLETE | SAS_TASK_UNDELIVERED |
|
||||
|
|
@ -555,36 +577,14 @@ 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
|
||||
#define SAS_TASK_STATE_ABORTED 4
|
||||
#define SAS_TASK_NEED_DEV_RESET 8
|
||||
#define SAS_TASK_AT_INITIATOR 16
|
||||
|
||||
static inline struct sas_task *sas_alloc_task(gfp_t flags)
|
||||
{
|
||||
struct sas_task *task = kmem_cache_zalloc(sas_task_cache, flags);
|
||||
|
||||
if (task) {
|
||||
INIT_LIST_HEAD(&task->list);
|
||||
spin_lock_init(&task->task_state_lock);
|
||||
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
||||
init_timer(&task->timer);
|
||||
init_completion(&task->completion);
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
static inline void sas_free_task(struct sas_task *task)
|
||||
{
|
||||
if (task) {
|
||||
BUG_ON(!list_empty(&task->list));
|
||||
kmem_cache_free(sas_task_cache, task);
|
||||
}
|
||||
}
|
||||
extern struct sas_task *sas_alloc_task(gfp_t flags);
|
||||
extern void sas_free_task(struct sas_task *task);
|
||||
|
||||
struct sas_domain_function_template {
|
||||
/* The class calls these to notify the LLDD of an event. */
|
||||
|
|
@ -614,6 +614,10 @@ struct sas_domain_function_template {
|
|||
|
||||
/* Phy management */
|
||||
int (*lldd_control_phy)(struct asd_sas_phy *, enum phy_func, void *);
|
||||
|
||||
/* GPIO support */
|
||||
int (*lldd_write_gpio)(struct sas_ha_struct *, u8 reg_type,
|
||||
u8 reg_index, u8 reg_count, u8 *write_data);
|
||||
};
|
||||
|
||||
extern int sas_register_ha(struct sas_ha_struct *);
|
||||
|
|
@ -652,7 +656,7 @@ int sas_discover_event(struct asd_sas_port *, enum discover_event ev);
|
|||
int sas_discover_sata(struct domain_device *);
|
||||
int sas_discover_end_dev(struct domain_device *);
|
||||
|
||||
void sas_unregister_dev(struct domain_device *);
|
||||
void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *);
|
||||
|
||||
void sas_init_dev(struct domain_device *);
|
||||
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ enum sas_protocol {
|
|||
SAS_PROTOCOL_STP = 0x04,
|
||||
SAS_PROTOCOL_SSP = 0x08,
|
||||
SAS_PROTOCOL_ALL = 0x0E,
|
||||
SAS_PROTOCOL_STP_ALL = SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA,
|
||||
};
|
||||
|
||||
/* From the spec; local phys only */
|
||||
|
|
@ -121,6 +122,7 @@ enum phy_func {
|
|||
PHY_FUNC_TX_SATA_PS_SIGNAL,
|
||||
PHY_FUNC_RELEASE_SPINUP_HOLD = 0x10, /* LOCAL PORT ONLY! */
|
||||
PHY_FUNC_SET_LINK_RATE,
|
||||
PHY_FUNC_GET_EVENTS,
|
||||
};
|
||||
|
||||
/* SAS LLDD would need to report only _very_few_ of those, like BROADCAST.
|
||||
|
|
@ -195,6 +197,14 @@ enum sas_open_rej_reason {
|
|||
SAS_OREJ_RSVD_RETRY = 18,
|
||||
};
|
||||
|
||||
enum sas_gpio_reg_type {
|
||||
SAS_GPIO_REG_CFG = 0,
|
||||
SAS_GPIO_REG_RX = 1,
|
||||
SAS_GPIO_REG_RX_GP = 2,
|
||||
SAS_GPIO_REG_TX = 3,
|
||||
SAS_GPIO_REG_TX_GP = 4,
|
||||
};
|
||||
|
||||
struct dev_to_host_fis {
|
||||
u8 fis_type; /* 0x34 */
|
||||
u8 flags;
|
||||
|
|
@ -341,7 +351,12 @@ struct report_general_resp {
|
|||
|
||||
u8 conf_route_table:1;
|
||||
u8 configuring:1;
|
||||
u8 _r_b:6;
|
||||
u8 config_others:1;
|
||||
u8 orej_retry_supp:1;
|
||||
u8 stp_cont_awt:1;
|
||||
u8 self_config:1;
|
||||
u8 zone_config:1;
|
||||
u8 t2t_supp:1;
|
||||
|
||||
u8 _r_c;
|
||||
|
||||
|
|
@ -528,7 +543,12 @@ struct report_general_resp {
|
|||
u8 _r_a;
|
||||
u8 num_phys;
|
||||
|
||||
u8 _r_b:6;
|
||||
u8 t2t_supp:1;
|
||||
u8 zone_config:1;
|
||||
u8 self_config:1;
|
||||
u8 stp_cont_awt:1;
|
||||
u8 orej_retry_supp:1;
|
||||
u8 config_others:1;
|
||||
u8 configuring:1;
|
||||
u8 conf_route_table:1;
|
||||
|
||||
|
|
|
|||
110
include/scsi/scsi_bsg_iscsi.h
Normal file
110
include/scsi/scsi_bsg_iscsi.h
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* iSCSI Transport BSG Interface
|
||||
*
|
||||
* Copyright (C) 2009 James Smart, Emulex Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SCSI_BSG_ISCSI_H
|
||||
#define SCSI_BSG_ISCSI_H
|
||||
|
||||
/*
|
||||
* This file intended to be included by both kernel and user space
|
||||
*/
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
|
||||
/*
|
||||
* iSCSI Transport SGIO v4 BSG Message Support
|
||||
*/
|
||||
|
||||
/* Default BSG request timeout (in seconds) */
|
||||
#define ISCSI_DEFAULT_BSG_TIMEOUT (10 * HZ)
|
||||
|
||||
|
||||
/*
|
||||
* Request Message Codes supported by the iSCSI Transport
|
||||
*/
|
||||
|
||||
/* define the class masks for the message codes */
|
||||
#define ISCSI_BSG_CLS_MASK 0xF0000000 /* find object class */
|
||||
#define ISCSI_BSG_HST_MASK 0x80000000 /* iscsi host class */
|
||||
|
||||
/* iscsi host Message Codes */
|
||||
#define ISCSI_BSG_HST_VENDOR (ISCSI_BSG_HST_MASK | 0x000000FF)
|
||||
|
||||
|
||||
/*
|
||||
* iSCSI Host Messages
|
||||
*/
|
||||
|
||||
/* ISCSI_BSG_HST_VENDOR : */
|
||||
|
||||
/* Request:
|
||||
* Note: When specifying vendor_id, be sure to read the Vendor Type and ID
|
||||
* formatting requirements specified in scsi_netlink.h
|
||||
*/
|
||||
struct iscsi_bsg_host_vendor {
|
||||
/*
|
||||
* Identifies the vendor that the message is formatted for. This
|
||||
* should be the recipient of the message.
|
||||
*/
|
||||
uint64_t vendor_id;
|
||||
|
||||
/* start of vendor command area */
|
||||
uint32_t vendor_cmd[0];
|
||||
};
|
||||
|
||||
/* Response:
|
||||
*/
|
||||
struct iscsi_bsg_host_vendor_reply {
|
||||
/* start of vendor response area */
|
||||
uint32_t vendor_rsp[0];
|
||||
};
|
||||
|
||||
|
||||
/* request (CDB) structure of the sg_io_v4 */
|
||||
struct iscsi_bsg_request {
|
||||
uint32_t msgcode;
|
||||
union {
|
||||
struct iscsi_bsg_host_vendor h_vendor;
|
||||
} rqst_data;
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
/* response (request sense data) structure of the sg_io_v4 */
|
||||
struct iscsi_bsg_reply {
|
||||
/*
|
||||
* The completion result. Result exists in two forms:
|
||||
* if negative, it is an -Exxx system errno value. There will
|
||||
* be no further reply information supplied.
|
||||
* else, it's the 4-byte scsi error result, with driver, host,
|
||||
* msg and status fields. The per-msgcode reply structure
|
||||
* will contain valid data.
|
||||
*/
|
||||
uint32_t result;
|
||||
|
||||
/* If there was reply_payload, how much was recevied ? */
|
||||
uint32_t reply_payload_rcv_len;
|
||||
|
||||
union {
|
||||
struct iscsi_bsg_host_vendor_reply vendor_reply;
|
||||
} reply_data;
|
||||
};
|
||||
|
||||
|
||||
#endif /* SCSI_BSG_ISCSI_H */
|
||||
|
|
@ -197,6 +197,7 @@ struct scsi_device_handler {
|
|||
int (*activate)(struct scsi_device *, activate_complete, void *);
|
||||
int (*prep_fn)(struct scsi_device *, struct request *);
|
||||
int (*set_params)(struct scsi_device *, const char *);
|
||||
bool (*match)(struct scsi_device *);
|
||||
};
|
||||
|
||||
struct scsi_dh_data {
|
||||
|
|
@ -471,6 +472,11 @@ static inline int scsi_device_protection(struct scsi_device *sdev)
|
|||
return sdev->scsi_level > SCSI_2 && sdev->inquiry[5] & (1<<0);
|
||||
}
|
||||
|
||||
static inline int scsi_device_tpgs(struct scsi_device *sdev)
|
||||
{
|
||||
return sdev->inquiry ? (sdev->inquiry[5] >> 4) & 0x3 : 0;
|
||||
}
|
||||
|
||||
#define MODULE_ALIAS_SCSI_DEVICE(type) \
|
||||
MODULE_ALIAS("scsi:t-" __stringify(type) "*")
|
||||
#define SCSI_DEVICE_MODALIAS_FMT "scsi:t-0x%02x"
|
||||
|
|
|
|||
|
|
@ -355,6 +355,19 @@ struct scsi_host_template {
|
|||
*/
|
||||
enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *);
|
||||
|
||||
/* This is an optional routine that allows transport to initiate
|
||||
* LLD adapter or firmware reset using sysfs attribute.
|
||||
*
|
||||
* Return values: 0 on success, -ve value on failure.
|
||||
*
|
||||
* Status: OPTIONAL
|
||||
*/
|
||||
|
||||
int (*host_reset)(struct Scsi_Host *shost, int reset_type);
|
||||
#define SCSI_ADAPTER_RESET 1
|
||||
#define SCSI_FIRMWARE_RESET 2
|
||||
|
||||
|
||||
/*
|
||||
* Name of proc directory
|
||||
*/
|
||||
|
|
@ -791,7 +804,8 @@ static inline struct device *scsi_get_device(struct Scsi_Host *shost)
|
|||
**/
|
||||
static inline int scsi_host_scan_allowed(struct Scsi_Host *shost)
|
||||
{
|
||||
return shost->shost_state == SHOST_RUNNING;
|
||||
return shost->shost_state == SHOST_RUNNING ||
|
||||
shost->shost_state == SHOST_RECOVERY;
|
||||
}
|
||||
|
||||
extern void scsi_unblock_requests(struct Scsi_Host *);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ struct iscsi_cls_conn;
|
|||
struct iscsi_conn;
|
||||
struct iscsi_task;
|
||||
struct sockaddr;
|
||||
struct iscsi_iface;
|
||||
struct bsg_job;
|
||||
|
||||
/**
|
||||
* struct iscsi_transport - iSCSI Transport template
|
||||
|
|
@ -84,9 +86,7 @@ struct iscsi_transport {
|
|||
struct module *owner;
|
||||
char *name;
|
||||
unsigned int caps;
|
||||
/* LLD sets this to indicate what values it can export to sysfs */
|
||||
uint64_t param_mask;
|
||||
uint64_t host_param_mask;
|
||||
|
||||
struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
|
||||
uint16_t cmds_max, uint16_t qdepth,
|
||||
uint32_t sn);
|
||||
|
|
@ -137,6 +137,13 @@ struct iscsi_transport {
|
|||
int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
|
||||
uint32_t enable, struct sockaddr *dst_addr);
|
||||
int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);
|
||||
int (*set_iface_param) (struct Scsi_Host *shost, void *data,
|
||||
uint32_t len);
|
||||
int (*get_iface_param) (struct iscsi_iface *iface,
|
||||
enum iscsi_param_type param_type,
|
||||
int param, char *buf);
|
||||
mode_t (*attr_is_visible)(int param_type, int param);
|
||||
int (*bsg_request)(struct bsg_job *job);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -150,6 +157,8 @@ extern int iscsi_unregister_transport(struct iscsi_transport *tt);
|
|||
*/
|
||||
extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
|
||||
enum iscsi_err error);
|
||||
extern void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
|
||||
enum iscsi_conn_state state);
|
||||
extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
|
||||
char *data, uint32_t data_size);
|
||||
|
||||
|
|
@ -171,6 +180,9 @@ struct iscsi_cls_conn {
|
|||
#define iscsi_dev_to_conn(_dev) \
|
||||
container_of(_dev, struct iscsi_cls_conn, dev)
|
||||
|
||||
#define transport_class_to_conn(_cdev) \
|
||||
iscsi_dev_to_conn(_cdev->parent)
|
||||
|
||||
#define iscsi_conn_to_session(_conn) \
|
||||
iscsi_dev_to_session(_conn->dev.parent)
|
||||
|
||||
|
|
@ -197,6 +209,7 @@ struct iscsi_cls_session {
|
|||
struct delayed_work recovery_work;
|
||||
|
||||
unsigned int target_id;
|
||||
bool ida_used;
|
||||
|
||||
int state;
|
||||
int sid; /* session id */
|
||||
|
|
@ -207,6 +220,9 @@ struct iscsi_cls_session {
|
|||
#define iscsi_dev_to_session(_dev) \
|
||||
container_of(_dev, struct iscsi_cls_session, dev)
|
||||
|
||||
#define transport_class_to_session(_cdev) \
|
||||
iscsi_dev_to_session(_cdev->parent)
|
||||
|
||||
#define iscsi_session_to_shost(_session) \
|
||||
dev_to_shost(_session->dev.parent)
|
||||
|
||||
|
|
@ -216,8 +232,12 @@ struct iscsi_cls_session {
|
|||
struct iscsi_cls_host {
|
||||
atomic_t nr_scans;
|
||||
struct mutex mutex;
|
||||
struct request_queue *bsg_q;
|
||||
};
|
||||
|
||||
#define iscsi_job_to_shost(_job) \
|
||||
dev_to_shost(_job->dev)
|
||||
|
||||
extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
|
||||
void (*fn)(struct iscsi_cls_session *));
|
||||
|
||||
|
|
@ -228,6 +248,20 @@ struct iscsi_endpoint {
|
|||
struct iscsi_cls_conn *conn;
|
||||
};
|
||||
|
||||
struct iscsi_iface {
|
||||
struct device dev;
|
||||
struct iscsi_transport *transport;
|
||||
uint32_t iface_type; /* IPv4 or IPv6 */
|
||||
uint32_t iface_num; /* iface number, 0 - n */
|
||||
void *dd_data; /* LLD private data */
|
||||
};
|
||||
|
||||
#define iscsi_dev_to_iface(_dev) \
|
||||
container_of(_dev, struct iscsi_iface, dev)
|
||||
|
||||
#define iscsi_iface_to_shost(_iface) \
|
||||
dev_to_shost(_iface->dev.parent)
|
||||
|
||||
/*
|
||||
* session and connection functions that can be used by HW iSCSI LLDs
|
||||
*/
|
||||
|
|
@ -238,6 +272,7 @@ struct iscsi_endpoint {
|
|||
dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)
|
||||
|
||||
extern int iscsi_session_chkready(struct iscsi_cls_session *session);
|
||||
extern int iscsi_is_session_online(struct iscsi_cls_session *session);
|
||||
extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *transport, int dd_size);
|
||||
extern int iscsi_add_session(struct iscsi_cls_session *session,
|
||||
|
|
@ -261,5 +296,11 @@ extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
|
|||
extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
|
||||
extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
|
||||
extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd);
|
||||
extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost,
|
||||
struct iscsi_transport *t,
|
||||
uint32_t iface_type,
|
||||
uint32_t iface_num, int dd_size);
|
||||
extern void iscsi_destroy_iface(struct iscsi_iface *iface);
|
||||
extern struct iscsi_iface *iscsi_lookup_iface(int handle);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue