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:
Linus Torvalds 2011-10-28 16:44:18 -07:00
commit ec7ae51753
162 changed files with 14203 additions and 3413 deletions

View file

@ -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 */

View file

@ -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);

View file

@ -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

View file

@ -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)

View file

@ -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.

View file

@ -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 *);

View file

@ -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;

View 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 */

View file

@ -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"

View file

@ -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 *);

View file

@ -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