X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fscsi%2F53c700.h;h=e86012cf6ab763505a56a86fcae2a3db46539c8f;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=b357a4aeb11d057eb68f3856c458066a79f6c259;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index b357a4aeb..e86012cf6 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h @@ -14,10 +14,6 @@ #include -#if defined(CONFIG_53C700_MEM_MAPPED) && defined(CONFIG_53C700_IO_MAPPED) -#define CONFIG_53C700_BOTH_MAPPED -#endif - /* Turn on for general debugging---too verbose for normal use */ #undef NCR_700_DEBUG /* Debug the tag queues, checking hash queue allocation and deallocation @@ -49,18 +45,11 @@ /* 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(struct scsi_host_template *, - struct NCR_700_Host_Parameters *); + 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 *); @@ -101,7 +90,6 @@ 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 @@ -121,22 +109,43 @@ NCR_700_get_depth(struct scsi_device *SDp) static inline int 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(struct scsi_device *SDp, __u32 flag) { - return (((unsigned long)SDp->hostdata) & flag) == 0; + return (spi_flags(SDp->sdev_target) & flag) == 0; } static inline void NCR_700_set_flag(struct scsi_device *SDp, __u32 flag) { - SDp->hostdata = (void *)((long)SDp->hostdata | (flag & 0xffff0000)); + spi_flags(SDp->sdev_target) |= flag; } static inline void 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_set_tag_neg_state(struct scsi_device *SDp, + enum NCR_700_tag_neg_state state) +{ + /* clear the slot */ + spi_flags(SDp->sdev_target) &= ~(0x3 << 20); + spi_flags(SDp->sdev_target) |= ((__u32)state) << 20; } struct NCR_700_command_slot { @@ -164,7 +173,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 */ @@ -179,9 +188,6 @@ 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 */ @@ -226,12 +232,18 @@ 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)) #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 @@ -435,91 +447,42 @@ struct NCR_700_Host_Parameters { static inline __u8 -NCR_700_mem_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 readb(host->base + (reg^bE)); -} - -static inline __u32 -NCR_700_mem_readl(struct Scsi_Host *host, __u32 reg) -{ - __u32 value = __raw_readl(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_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)); -} - -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) +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 inb(host->base + (reg^bE)); + return ioread8(hostdata->base + (reg^bE)); } static inline __u32 -NCR_700_io_readl(struct Scsi_Host *host, __u32 reg) +NCR_700_readl(struct Scsi_Host *host, __u32 reg) { - __u32 value = inl(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 = ioread32(hostdata->base + reg); #if 1 /* sanity check the register */ if((reg & 0x3) != 0) BUG(); #endif - return bS_to_cpu(value); + return bS_to_io(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 @@ -528,102 +491,7 @@ 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); -} - -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; + iowrite32(bS_to_io(value), hostdata->base + reg); } - -#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