diff options
Diffstat (limited to 'include/scsi')
| -rw-r--r-- | include/scsi/scsi_cmnd.h | 5 | ||||
| -rw-r--r-- | include/scsi/scsi_common.h | 13 | ||||
| -rw-r--r-- | include/scsi/scsi_device.h | 20 | ||||
| -rw-r--r-- | include/scsi/scsi_host.h | 6 | ||||
| -rw-r--r-- | include/scsi/scsi_proto.h | 5 | 
5 files changed, 42 insertions, 7 deletions
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index c2cb5f69635c..526def14e7fb 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -52,6 +52,11 @@ struct scsi_pointer {  #define SCMD_TAGGED		(1 << 0)  #define SCMD_INITIALIZED	(1 << 1)  #define SCMD_LAST		(1 << 2) +/* + * libata uses SCSI EH to fetch sense data for successful commands. + * SCSI EH should not overwrite scmd->result when SCMD_FORCE_EH_SUCCESS is set. + */ +#define SCMD_FORCE_EH_SUCCESS	(1 << 3)  #define SCMD_FAIL_IF_RECOVERING	(1 << 4)  /* flags preserved across unprep / reprep */  #define SCMD_PRESERVED_FLAGS	(SCMD_INITIALIZED | SCMD_FAIL_IF_RECOVERING) diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h index 5b567b43e1b1..fb58715fac86 100644 --- a/include/scsi/scsi_common.h +++ b/include/scsi/scsi_common.h @@ -7,8 +7,21 @@  #define _SCSI_COMMON_H_  #include <linux/types.h> +#include <uapi/linux/pr.h>  #include <scsi/scsi_proto.h> +enum scsi_pr_type { +	SCSI_PR_WRITE_EXCLUSIVE			= 0x01, +	SCSI_PR_EXCLUSIVE_ACCESS		= 0x03, +	SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY	= 0x05, +	SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY	= 0x06, +	SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS	= 0x07, +	SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS	= 0x08, +}; + +enum scsi_pr_type block_pr_type_to_scsi(enum pr_type type); +enum pr_type scsi_pr_type_to_block(enum scsi_pr_type type); +  static inline unsigned  scsi_varlen_cdb_length(const void *hdr)  { diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index f10a008e5bfa..75b2235b99e2 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -218,6 +218,9 @@ struct scsi_device {  	unsigned silence_suspend:1;	/* Do not print runtime PM related messages */  	unsigned no_vpd_size:1;		/* No VPD size reported in header */ +	unsigned cdl_supported:1;	/* Command duration limits supported */ +	unsigned cdl_enable:1;		/* Enable/disable Command duration limits */ +  	unsigned int queue_stopped;	/* request queue is quiesced */  	bool offline_already;		/* Device offline message logged */ @@ -364,6 +367,8 @@ extern int scsi_register_device_handler(struct scsi_device_handler *scsi_dh);  extern void scsi_remove_device(struct scsi_device *);  extern int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh);  void scsi_attach_vpd(struct scsi_device *sdev); +void scsi_cdl_check(struct scsi_device *sdev); +int scsi_cdl_enable(struct scsi_device *sdev, bool enable);  extern struct scsi_device *scsi_device_from_queue(struct request_queue *q);  extern int __must_check scsi_device_get(struct scsi_device *); @@ -421,10 +426,10 @@ extern int scsi_track_queue_full(struct scsi_device *, int);  extern int scsi_set_medium_removal(struct scsi_device *, char); -extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, -			   unsigned char *buffer, int len, int timeout, -			   int retries, struct scsi_mode_data *data, -			   struct scsi_sense_hdr *); +int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, +		    int subpage, unsigned char *buffer, int len, int timeout, +		    int retries, struct scsi_mode_data *data, +		    struct scsi_sense_hdr *);  extern int scsi_mode_select(struct scsi_device *sdev, int pf, int sp,  			    unsigned char *buffer, int len, int timeout,  			    int retries, struct scsi_mode_data *data, @@ -433,8 +438,9 @@ extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,  				int retries, struct scsi_sense_hdr *sshdr);  extern int scsi_get_vpd_page(struct scsi_device *, u8 page, unsigned char *buf,  			     int buf_len); -extern int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer, -			      unsigned int len, unsigned char opcode); +int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer, +		       unsigned int len, unsigned char opcode, +		       unsigned short sa);  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, @@ -450,7 +456,7 @@ extern void scsi_scan_target(struct device *parent, unsigned int channel,  			     unsigned int id, u64 lun,  			     enum scsi_scan_mode rescan);  extern void scsi_target_reap(struct scsi_target *); -extern void scsi_target_block(struct device *); +void scsi_block_targets(struct Scsi_Host *shost, struct device *dev);  extern void scsi_target_unblock(struct device *, enum scsi_device_state);  extern void scsi_remove_target(struct device *);  extern const char *scsi_device_state_name(enum scsi_device_state); diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 0f29799efa02..70b7475dcf56 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -458,6 +458,9 @@ struct scsi_host_template {  	/* True if the host uses host-wide tagspace */  	unsigned host_tagset:1; +	/* The queuecommand callback may block. See also BLK_MQ_F_BLOCKING. */ +	unsigned queuecommand_may_block:1; +  	/*  	 * Countdown for host blocking with no commands outstanding.  	 */ @@ -653,6 +656,9 @@ struct Scsi_Host {  	/* True if the host uses host-wide tagspace */  	unsigned host_tagset:1; +	/* The queuecommand callback may block. See also BLK_MQ_F_BLOCKING. */ +	unsigned queuecommand_may_block:1; +  	/* Host responded with short (<36 bytes) INQUIRY result */  	unsigned short_inquiry:1; diff --git a/include/scsi/scsi_proto.h b/include/scsi/scsi_proto.h index fbe5bdfe4d6e..07d65c1f59db 100644 --- a/include/scsi/scsi_proto.h +++ b/include/scsi/scsi_proto.h @@ -151,6 +151,11 @@  #define ZO_FINISH_ZONE	      0x02  #define ZO_OPEN_ZONE	      0x03  #define ZO_RESET_WRITE_POINTER 0x04 +/* values for PR in service action */ +#define READ_KEYS             0x00 +#define READ_RESERVATION      0x01 +#define REPORT_CAPABILITES    0x02 +#define READ_FULL_STATUS      0x03  /* values for variable length command */  #define XDREAD_32	      0x03  #define XDWRITE_32	      0x04  | 
