diff options
Diffstat (limited to 'drivers/scsi/53c700.h')
| -rw-r--r-- | drivers/scsi/53c700.h | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index 7f22a06fe5ec..97ebe71b701b 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <asm/io.h> | 12 | #include <asm/io.h> |
| 13 | 13 | ||
| 14 | #include <scsi/scsi_device.h> | 14 | #include <scsi/scsi_device.h> |
| 15 | 15 | #include <scsi/scsi_cmnd.h> | |
| 16 | 16 | ||
| 17 | /* Turn on for general debugging---too verbose for normal use */ | 17 | /* Turn on for general debugging---too verbose for normal use */ |
| 18 | #undef NCR_700_DEBUG | 18 | #undef NCR_700_DEBUG |
| @@ -76,11 +76,16 @@ struct NCR_700_SG_List { | |||
| 76 | #define SCRIPT_RETURN 0x90080000 | 76 | #define SCRIPT_RETURN 0x90080000 |
| 77 | }; | 77 | }; |
| 78 | 78 | ||
| 79 | /* We use device->hostdata to store negotiated parameters. This is | 79 | struct NCR_700_Device_Parameters { |
| 80 | * supposed to be a pointer to a device private area, but we cannot | 80 | /* space for creating a request sense command. Really, except |
| 81 | * really use it as such since it will never be freed, so just use the | 81 | * for the annoying SCSI-2 requirement for LUN information in |
| 82 | * 32 bits to cram the information. The SYNC negotiation sequence looks | 82 | * cmnd[1], this could be in static storage */ |
| 83 | * like: | 83 | unsigned char cmnd[MAX_COMMAND_SIZE]; |
| 84 | __u8 depth; | ||
| 85 | }; | ||
| 86 | |||
| 87 | |||
| 88 | /* The SYNC negotiation sequence looks like: | ||
| 84 | * | 89 | * |
| 85 | * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the | 90 | * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the |
| 86 | * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION | 91 | * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION |
| @@ -98,19 +103,26 @@ struct NCR_700_SG_List { | |||
| 98 | #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION (1<<17) | 103 | #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION (1<<17) |
| 99 | #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19) | 104 | #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19) |
| 100 | 105 | ||
| 106 | static inline char *NCR_700_get_sense_cmnd(struct scsi_device *SDp) | ||
| 107 | { | ||
| 108 | struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; | ||
| 109 | |||
| 110 | return hostdata->cmnd; | ||
| 111 | } | ||
| 112 | |||
| 101 | static inline void | 113 | static inline void |
| 102 | NCR_700_set_depth(struct scsi_device *SDp, __u8 depth) | 114 | NCR_700_set_depth(struct scsi_device *SDp, __u8 depth) |
| 103 | { | 115 | { |
| 104 | long l = (long)SDp->hostdata; | 116 | struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; |
| 105 | 117 | ||
| 106 | l &= 0xffff00ff; | 118 | hostdata->depth = depth; |
| 107 | l |= 0xff00 & (depth << 8); | ||
| 108 | SDp->hostdata = (void *)l; | ||
| 109 | } | 119 | } |
| 110 | static inline __u8 | 120 | static inline __u8 |
| 111 | NCR_700_get_depth(struct scsi_device *SDp) | 121 | NCR_700_get_depth(struct scsi_device *SDp) |
| 112 | { | 122 | { |
| 113 | return ((((unsigned long)SDp->hostdata) & 0xff00)>>8); | 123 | struct NCR_700_Device_Parameters *hostdata = SDp->hostdata; |
| 124 | |||
| 125 | return hostdata->depth; | ||
| 114 | } | 126 | } |
| 115 | static inline int | 127 | static inline int |
| 116 | NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag) | 128 | NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag) |
