Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / scsi / 53c700.h
index c1f0aa3..a8c83bb 100644 (file)
@@ -9,12 +9,10 @@
 #define _53C700_H
 
 #include <linux/interrupt.h>
-
 #include <asm/io.h>
 
-#if defined(CONFIG_53C700_MEM_MAPPED) && defined(CONFIG_53C700_IO_MAPPED)
-#define CONFIG_53C700_BOTH_MAPPED
-#endif
+#include <scsi/scsi_device.h>
+
 
 /* Turn on for general debugging---too verbose for normal use */
 #undef NCR_700_DEBUG
 
 #ifdef NCR_700_DEBUG
 #define DEBUG(x)       printk x
+#define DDEBUG(prefix, sdev, fmt, a...) \
+       sdev_printk(prefix, sdev, fmt, ##a)
+#define CDEBUG(prefix, scmd, fmt, a...) \
+       scmd_printk(prefix, scmd, fmt, ##a)
 #else
-#define DEBUG(x)
+#define DEBUG(x)       do {} while (0)
+#define DDEBUG(prefix, scmd, fmt, a...) do {} while (0)
+#define CDEBUG(prefix, scmd, fmt, a...) do {} while (0)
 #endif
 
 /* The number of available command slots */
 /* magic byte identifying an internally generated REQUEST_SENSE command */
 #define NCR_700_INTERNAL_SENSE_MAGIC   0x42
 
-/* WARNING: Leave this in for now: the dependency preprocessor doesn't
- * pick up file specific flags, so must define here if they are not
- * set */
-#if !defined(CONFIG_53C700_IO_MAPPED) && !defined(CONFIG_53C700_MEM_MAPPED)
-#error "Config.in must define either CONFIG_53C700_IO_MAPPED or CONFIG_53C700_MEM_MAPPED to use this scsi core."
-#endif
-
 struct NCR_700_Host_Parameters;
 
 /* These are the externally used routines */
-struct Scsi_Host *NCR_700_detect(Scsi_Host_Template *, struct NCR_700_Host_Parameters *);
+struct Scsi_Host *NCR_700_detect(struct scsi_host_template *,
+               struct NCR_700_Host_Parameters *, struct device *);
 int NCR_700_release(struct Scsi_Host *host);
 irqreturn_t NCR_700_intr(int, void *, struct pt_regs *);
 
@@ -98,11 +96,10 @@ struct NCR_700_SG_List {
  * 18 device supports tag queueing */
 #define NCR_700_DEV_NEGOTIATED_SYNC    (1<<16)
 #define NCR_700_DEV_BEGIN_SYNC_NEGOTIATION     (1<<17)
-#define NCR_700_DEV_BEGIN_TAG_QUEUEING (1<<18)
 #define NCR_700_DEV_PRINT_SYNC_NEGOTIATION (1<<19)
 
 static inline void
-NCR_700_set_depth(Scsi_Device *SDp, __u8 depth)
+NCR_700_set_depth(struct scsi_device *SDp, __u8 depth)
 {
        long l = (long)SDp->hostdata;
 
@@ -111,29 +108,50 @@ NCR_700_set_depth(Scsi_Device *SDp, __u8 depth)
        SDp->hostdata = (void *)l;
 }
 static inline __u8
-NCR_700_get_depth(Scsi_Device *SDp)
+NCR_700_get_depth(struct scsi_device *SDp)
 {
        return ((((unsigned long)SDp->hostdata) & 0xff00)>>8);
 }
 static inline int
-NCR_700_is_flag_set(Scsi_Device *SDp, __u32 flag)
+NCR_700_is_flag_set(struct scsi_device *SDp, __u32 flag)
 {
-       return (((unsigned long)SDp->hostdata) & flag) == flag;
+       return (spi_flags(SDp->sdev_target) & flag) == flag;
 }
 static inline int
-NCR_700_is_flag_clear(Scsi_Device *SDp, __u32 flag)
+NCR_700_is_flag_clear(struct scsi_device *SDp, __u32 flag)
+{
+       return (spi_flags(SDp->sdev_target) & flag) == 0;
+}
+static inline void
+NCR_700_set_flag(struct scsi_device *SDp, __u32 flag)
 {
-       return (((unsigned long)SDp->hostdata) & flag) == 0;
+       spi_flags(SDp->sdev_target) |= flag;
 }
 static inline void
-NCR_700_set_flag(Scsi_Device *SDp, __u32 flag)
+NCR_700_clear_flag(struct scsi_device *SDp, __u32 flag)
 {
-       SDp->hostdata = (void *)((long)SDp->hostdata | (flag & 0xffff0000));
+       spi_flags(SDp->sdev_target) &= ~flag;
 }
+
+enum NCR_700_tag_neg_state {
+       NCR_700_START_TAG_NEGOTIATION = 0,
+       NCR_700_DURING_TAG_NEGOTIATION = 1,
+       NCR_700_FINISHED_TAG_NEGOTIATION = 2,
+};
+
+static inline enum NCR_700_tag_neg_state
+NCR_700_get_tag_neg_state(struct scsi_device *SDp)
+{
+       return (enum NCR_700_tag_neg_state)((spi_flags(SDp->sdev_target)>>20) & 0x3);
+}
+
 static inline void
-NCR_700_clear_flag(Scsi_Device *SDp, __u32 flag)
+NCR_700_set_tag_neg_state(struct scsi_device *SDp,
+                         enum NCR_700_tag_neg_state state)
 {
-       SDp->hostdata = (void *)((long)SDp->hostdata & ~(flag & 0xffff0000));
+       /* clear the slot */
+       spi_flags(SDp->sdev_target) &= ~(0x3 << 20);
+       spi_flags(SDp->sdev_target) |= ((__u32)state) << 20;
 }
 
 struct NCR_700_command_slot {
@@ -147,7 +165,7 @@ struct NCR_700_command_slot {
        __u8    state;
        int     tag;
        __u32   resume_offset;
-       Scsi_Cmnd       *cmnd;
+       struct scsi_cmnd *cmnd;
        /* The pci_mapped address of the actual command in cmnd */
        dma_addr_t      pCmd;
        __u32           temp;
@@ -161,7 +179,7 @@ struct NCR_700_command_slot {
 struct NCR_700_Host_Parameters {
        /* These must be filled in by the calling driver */
        int     clock;                  /* board clock speed in MHz */
-       unsigned long   base;           /* the base for the port (copied to host) */
+       void __iomem    *base;          /* the base for the port (copied to host) */
        struct device   *dev;
        __u32   dmode_extra;    /* adjustable bus settings */
        __u32   differential:1; /* if we are differential */
@@ -176,16 +194,13 @@ struct NCR_700_Host_Parameters {
        /* NOTHING BELOW HERE NEEDS ALTERING */
        __u32   fast:1;         /* if we can alter the SCSI bus clock
                                    speed (so can negiotiate sync) */
-#ifdef CONFIG_53C700_BOTH_MAPPED
-       __u32   mem_mapped;     /* set if memory mapped */
-#endif
        int     sync_clock;     /* The speed of the SYNC core */
 
        __u32   *script;                /* pointer to script location */
        __u32   pScript;                /* physical mem addr of script */
 
        enum NCR_700_Host_State state; /* protected by state lock */
-       Scsi_Cmnd *cmd;
+       struct scsi_cmnd *cmd;
        /* Note: pScript contains the single consistent block of
         * memory.  All the msgin, msgout and status are allocated in
         * this memory too (at separate cache lines).  TOTAL_MEM_SIZE
@@ -223,6 +238,7 @@ 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)
+#define bEBus  (!hostdata->force_le_on_be)
 #elif defined(__BIG_ENDIAN)
 #define bE     3
 #define bSWAP  0
@@ -232,6 +248,13 @@ struct NCR_700_Host_Parameters {
 #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))
 
@@ -432,91 +455,43 @@ struct NCR_700_Host_Parameters {
 
 
 static inline __u8
-NCR_700_mem_readb(struct Scsi_Host *host, __u32 reg)
+NCR_700_readb(struct Scsi_Host *host, __u32 reg)
 {
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+       const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
 
-       return readb(host->base + (reg^bE));
+       return ioread8(hostdata->base + (reg^bE));
 }
 
 static inline __u32
-NCR_700_mem_readl(struct Scsi_Host *host, __u32 reg)
+NCR_700_readl(struct Scsi_Host *host, __u32 reg)
 {
-       __u32 value = __raw_readl(host->base + reg);
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+       const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       __u32 value = bEBus ? ioread32be(hostdata->base + reg) :
+               ioread32(hostdata->base + reg);
 #if 1
        /* sanity check the register */
        if((reg & 0x3) != 0)
                BUG();
 #endif
 
-       return bS_to_cpu(value);
-}
-
-static inline void
-NCR_700_mem_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
-{
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       writeb(value, host->base + (reg^bE));
+       return value;
 }
 
 static inline void
-NCR_700_mem_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
-{
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-#if 1
-       /* sanity check the register */
-       if((reg & 0x3) != 0)
-               BUG();
-#endif
-
-       __raw_writel(bS_to_host(value), host->base + reg);
-}
-
-static inline __u8
-NCR_700_io_readb(struct Scsi_Host *host, __u32 reg)
-{
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       return inb(host->base + (reg^bE));
-}
-
-static inline __u32
-NCR_700_io_readl(struct Scsi_Host *host, __u32 reg)
-{
-       __u32 value = inl(host->base + reg);
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-#if 1
-       /* sanity check the register */
-       if((reg & 0x3) != 0)
-               BUG();
-#endif
-
-       return bS_to_cpu(value);
-}
-
-static inline void
-NCR_700_io_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
+NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
 {
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+       const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
 
-       outb(value, host->base + (reg^bE));
+       iowrite8(value, hostdata->base + (reg^bE));
 }
 
 static inline void
-NCR_700_io_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
+NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
 {
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+       const struct NCR_700_Host_Parameters *hostdata
                = (struct NCR_700_Host_Parameters *)host->hostdata[0];
 
 #if 1
@@ -525,102 +500,8 @@ NCR_700_io_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
                BUG();
 #endif
 
-       outl(bS_to_host(value), host->base + reg);
-}
-
-#ifdef CONFIG_53C700_BOTH_MAPPED
-
-static inline __u8
-NCR_700_readb(struct Scsi_Host *host, __u32 reg)
-{
-       __u8 val;
-
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       if(hostdata->mem_mapped)
-               val = NCR_700_mem_readb(host, reg);
-       else
-               val = NCR_700_io_readb(host, reg);
-
-       return val;
-}
-
-static inline __u32
-NCR_700_readl(struct Scsi_Host *host, __u32 reg)
-{
-       __u32 val;
-
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       if(hostdata->mem_mapped)
-               val = NCR_700_mem_readl(host, reg);
-       else
-               val = NCR_700_io_readl(host, reg);
-
-       return val;
-}
-
-static inline void
-NCR_700_writeb(__u8 value, struct Scsi_Host *host, __u32 reg)
-{
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       if(hostdata->mem_mapped)
-               NCR_700_mem_writeb(value, host, reg);
-       else
-               NCR_700_io_writeb(value, host, reg);
-}
-
-static inline void
-NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg)
-{
-       const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
-
-       if(hostdata->mem_mapped)
-               NCR_700_mem_writel(value, host, reg);
-       else
-               NCR_700_io_writel(value, host, reg);
+       bEBus ? iowrite32be(value, hostdata->base + reg): 
+               iowrite32(value, hostdata->base + reg);
 }
 
-static inline void
-NCR_700_set_mem_mapped(struct NCR_700_Host_Parameters *hostdata)
-{
-       hostdata->mem_mapped = 1;
-}
-
-static inline void
-NCR_700_set_io_mapped(struct NCR_700_Host_Parameters *hostdata)
-{
-       hostdata->mem_mapped = 0;
-}
-
-
-#elif defined(CONFIG_53C700_IO_MAPPED)
-
-#define NCR_700_readb NCR_700_io_readb
-#define NCR_700_readl NCR_700_io_readl
-#define NCR_700_writeb NCR_700_io_writeb
-#define NCR_700_writel NCR_700_io_writel
-
-#define NCR_700_set_io_mapped(x)
-#define NCR_700_set_mem_mapped(x)      error I/O mapped only
-
-#elif defined(CONFIG_53C700_MEM_MAPPED)
-
-#define NCR_700_readb NCR_700_mem_readb
-#define NCR_700_readl NCR_700_mem_readl
-#define NCR_700_writeb NCR_700_mem_writeb
-#define NCR_700_writel NCR_700_mem_writel
-
-#define NCR_700_set_io_mapped(x)       error MEM mapped only
-#define NCR_700_set_mem_mapped(x)
-
-#else
-#error neither CONFIG_53C700_MEM_MAPPED nor CONFIG_53C700_IO_MAPPED is set
-#endif
-
 #endif