summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/wd33c93.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/wd33c93.c')
-rw-r--r--drivers/scsi/wd33c93.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c
index 3cb968060..7e9625108 100644
--- a/drivers/scsi/wd33c93.c
+++ b/drivers/scsi/wd33c93.c
@@ -75,6 +75,7 @@
#include <linux/string.h>
#include <linux/delay.h>
#include <linux/version.h>
+#include <linux/init.h>
#include <asm/irq.h>
#if LINUX_VERSION_CODE >= 0x010300
@@ -176,6 +177,7 @@ MODULE_PARM(setup_strings, "s");
static inline uchar read_wd33c93(wd33c93_regs *regp,uchar reg_num)
{
regp->SASR = reg_num;
+ mb();
return(regp->SCMD);
}
@@ -186,14 +188,18 @@ static inline uchar read_wd33c93(wd33c93_regs *regp,uchar reg_num)
static inline void write_wd33c93(wd33c93_regs *regp,uchar reg_num, uchar value)
{
regp->SASR = reg_num;
+ mb();
regp->SCMD = value;
+ mb();
}
static inline void write_wd33c93_cmd(wd33c93_regs *regp, uchar cmd)
{
regp->SASR = WD_COMMAND;
+ mb();
regp->SCMD = cmd;
+ mb();
}
@@ -216,9 +222,11 @@ uchar x = 0;
static void write_wd33c93_count(wd33c93_regs *regp,unsigned long value)
{
regp->SASR = WD_TRANSFER_COUNT_MSB;
+ mb();
regp->SCMD = value >> 16;
regp->SCMD = value >> 8;
regp->SCMD = value;
+ mb();
}
@@ -227,9 +235,11 @@ static unsigned long read_wd33c93_count(wd33c93_regs *regp)
unsigned long value;
regp->SASR = WD_TRANSFER_COUNT_MSB;
+ mb();
value = regp->SCMD << 16;
value |= regp->SCMD << 8;
value |= regp->SCMD;
+ mb();
return value;
}
@@ -1606,10 +1616,10 @@ static char setup_buffer[SETUP_BUFFER_SIZE];
static char setup_used[MAX_SETUP_ARGS];
static int done_setup = 0;
-void wd33c93_setup (char *str, int *ints)
+int wd33c93_setup (char *str)
{
-int i,x;
-char *p1,*p2;
+ int i;
+ char *p1,*p2;
/* The kernel does some processing of the command-line before calling
* this function: If it begins with any decimal or hex number arguments,
@@ -1622,12 +1632,17 @@ char *p1,*p2;
p1 = setup_buffer;
*p1 = '\0';
+#if 0
+/*
+ * Old style command line arguments are now dead
+ */
if (ints[0]) {
for (i=0; i<ints[0]; i++) {
x = sprintf(p1,"nosync:0x%02x,", ints[i+1]);
p1 += x;
}
}
+#endif
if (str)
strncpy(p1, str, SETUP_BUFFER_SIZE - strlen(setup_buffer));
setup_buffer[SETUP_BUFFER_SIZE - 1] = '\0';
@@ -1650,8 +1665,12 @@ char *p1,*p2;
for (i=0; i<MAX_SETUP_ARGS; i++)
setup_used[i] = 0;
done_setup = 1;
+
+ return 0;
}
+__setup("wd33c93", wd33c93_setup);
+
/* check_setup_args() returns index if key found, 0 if not
*/
@@ -1695,7 +1714,7 @@ int val;
char buf[32];
if (!done_setup && setup_strings)
- wd33c93_setup(setup_strings,0);
+ wd33c93_setup(setup_strings);
hostdata = (struct WD33C93_hostdata *)instance->hostdata;