]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/53c700.h
ieee1394: merge from Linus
[linux-2.6-omap-h63xx.git] / drivers / scsi / 53c700.h
index 362d78483d091b47ccfbc925ca3d8f8dd7eef90c..97ebe71b701ba367427a60dc67ccdc993a8cbfd1 100644 (file)
@@ -12,7 +12,7 @@
 #include <asm/io.h>
 
 #include <scsi/scsi_device.h>
-
+#include <scsi/scsi_cmnd.h>
 
 /* Turn on for general debugging---too verbose for normal use */
 #undef NCR_700_DEBUG
@@ -76,11 +76,16 @@ struct NCR_700_SG_List {
        #define SCRIPT_RETURN                   0x90080000
 };
 
-/* We use device->hostdata to store negotiated parameters.  This is
- * supposed to be a pointer to a device private area, but we cannot
- * really use it as such since it will never be freed, so just use the
- * 32 bits to cram the information.  The SYNC negotiation sequence looks
- * like:
+struct NCR_700_Device_Parameters {
+       /* space for creating a request sense command. Really, except
+        * for the annoying SCSI-2 requirement for LUN information in
+        * cmnd[1], this could be in static storage */
+       unsigned char cmnd[MAX_COMMAND_SIZE];
+       __u8    depth;
+};
+
+
+/* The SYNC negotiation sequence looks like:
  * 
  * If DEV_NEGOTIATED_SYNC not set, tack and SDTR message on to the
  * initial identify for the device and set DEV_BEGIN_SYNC_NEGOTATION
@@ -98,19 +103,26 @@ struct NCR_700_SG_List {
 #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION     (1<<17)
 #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19)
 
+static inline char *NCR_700_get_sense_cmnd(struct scsi_device *SDp)
+{
+       struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
+
+       return hostdata->cmnd;
+}
+
 static inline void
 NCR_700_set_depth(struct scsi_device *SDp, __u8 depth)
 {
-       long l = (long)SDp->hostdata;
+       struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
 
-       l &= 0xffff00ff;
-       l |= 0xff00 & (depth << 8);
-       SDp->hostdata = (void *)l;
+       hostdata->depth = depth;
 }
 static inline __u8
 NCR_700_get_depth(struct scsi_device *SDp)
 {
-       return ((((unsigned long)SDp->hostdata) & 0xff00)>>8);
+       struct NCR_700_Device_Parameters *hostdata = SDp->hostdata;
+
+       return hostdata->depth;
 }
 static inline int
 NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag)
@@ -163,6 +175,8 @@ struct NCR_700_command_slot {
        #define NCR_700_SLOT_BUSY (1|NCR_700_SLOT_MAGIC) /* slot has command active on HA */
        #define NCR_700_SLOT_QUEUED (2|NCR_700_SLOT_MAGIC) /* slot has command to be made active on HA */
        __u8    state;
+       #define NCR_700_FLAG_AUTOSENSE  0x01
+       __u8    flags;
        int     tag;
        __u32   resume_offset;
        struct scsi_cmnd *cmnd;
@@ -238,21 +252,23 @@ struct NCR_700_Host_Parameters {
 #ifdef CONFIG_53C700_LE_ON_BE
 #define bE     (hostdata->force_le_on_be ? 0 : 3)
 #define        bSWAP   (hostdata->force_le_on_be)
-/* This is terrible, but there's no raw version of ioread32.  That means
- * that on a be board we swap twice (once in ioread32 and once again to 
- * get the value correct) */
-#define bS_to_io(x)    ((hostdata->force_le_on_be) ? (x) : cpu_to_le32(x))
+#define bEBus  (!hostdata->force_le_on_be)
 #elif defined(__BIG_ENDIAN)
 #define bE     3
 #define bSWAP  0
-#define bS_to_io(x)    (x)
 #elif defined(__LITTLE_ENDIAN)
 #define bE     0
 #define bSWAP  0
-#define bS_to_io(x)    (x)
 #else
 #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?"
 #endif
+#ifndef bEBus
+#ifdef CONFIG_53C700_BE_BUS
+#define bEBus  1
+#else
+#define bEBus  0
+#endif
+#endif
 #define bS_to_cpu(x)   (bSWAP ? le32_to_cpu(x) : (x))
 #define bS_to_host(x)  (bSWAP ? cpu_to_le32(x) : (x))
 
@@ -466,14 +482,14 @@ NCR_700_readl(struct Scsi_Host *host, __u32 reg)
 {
        const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-       __u32 value = ioread32(hostdata->base + reg);
+       __u32 value = bEBus ? ioread32be(hostdata->base + reg) :
+               ioread32(hostdata->base + reg);
 #if 1
        /* sanity check the register */
-       if((reg & 0x3) != 0)
-               BUG();
+       BUG_ON((reg & 0x3) != 0);
 #endif
 
-       return bS_to_io(value);
+       return value;
 }
 
 static inline void
@@ -493,11 +509,11 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
 
 #if 1
        /* sanity check the register */
-       if((reg & 0x3) != 0)
-               BUG();
+       BUG_ON((reg & 0x3) != 0);
 #endif
 
-       iowrite32(bS_to_io(value), hostdata->base + reg);
+       bEBus ? iowrite32be(value, hostdata->base + reg): 
+               iowrite32(value, hostdata->base + reg);
 }
 
 #endif