vserver 1.9.3
[linux-2.6.git] / include / scsi / scsi_device.h
index 3272c6e..e76510c 100644 (file)
@@ -63,6 +63,7 @@ struct scsi_device {
        char devfs_name[256];   /* devfs junk */
        char type;
        char scsi_level;
+       char inq_periph_qual;   /* PQ from INQUIRY data */      
        unsigned char inquiry_len;      /* valid bytes in 'inquiry' */
        unsigned char * inquiry;        /* INQUIRY response data */
        char * vendor;          /* [back_compat] point into 'inquiry' ... */
@@ -111,6 +112,8 @@ struct scsi_device {
        unsigned int max_device_blocked; /* what device_blocked counts down from  */
 #define SCSI_DEFAULT_DEVICE_BLOCKED    3
 
+       int timeout;
+
        struct device           sdev_gendev;
        struct class_device     sdev_classdev;
 
@@ -126,8 +129,10 @@ struct scsi_device {
 #define transport_class_to_sdev(class_dev) \
        container_of(class_dev, struct scsi_device, transport_classdev)
 
-extern struct scsi_device *scsi_add_device(struct Scsi_Host *,
-               uint, uint, uint);
+extern struct scsi_device *__scsi_add_device(struct Scsi_Host *,
+               uint, uint, uint, void *hostdata);
+#define scsi_add_device(host, channel, target, lun) \
+       __scsi_add_device(host, channel, target, lun, NULL)
 extern void scsi_remove_device(struct scsi_device *);
 extern int scsi_device_cancel(struct scsi_device *, int);
 
@@ -180,13 +185,47 @@ 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);
+extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
+                               int retries);
 extern int scsi_device_set_state(struct scsi_device *sdev,
                                 enum scsi_device_state state);
 extern int scsi_device_quiesce(struct scsi_device *sdev);
 extern void scsi_device_resume(struct scsi_device *sdev);
 extern const char *scsi_device_state_name(enum scsi_device_state);
-static int inline scsi_device_online(struct scsi_device *sdev)
+static inline int scsi_device_online(struct scsi_device *sdev)
 {
        return sdev->sdev_state != SDEV_OFFLINE;
 }
+
+/* accessor functions for the SCSI parameters */
+static inline int scsi_device_sync(struct scsi_device *sdev)
+{
+       return sdev->sdtr;
+}
+static inline int scsi_device_wide(struct scsi_device *sdev)
+{
+       return sdev->wdtr;
+}
+static inline int scsi_device_dt(struct scsi_device *sdev)
+{
+       return sdev->ppr;
+}
+static inline int scsi_device_dt_only(struct scsi_device *sdev)
+{
+       if (sdev->inquiry_len < 57)
+               return 0;
+       return (sdev->inquiry[56] & 0x0c) == 0x04;
+}
+static inline int scsi_device_ius(struct scsi_device *sdev)
+{
+       if (sdev->inquiry_len < 57)
+               return 0;
+       return sdev->inquiry[56] & 0x01;
+}
+static inline int scsi_device_qas(struct scsi_device *sdev)
+{
+       if (sdev->inquiry_len < 57)
+               return 0;
+       return sdev->inquiry[56] & 0x02;
+}
 #endif /* _SCSI_SCSI_DEVICE_H */