From: Ondrej Zary <linux@rainbow-software.org>
To: linux-scsi@vger.kernel.org
Subject: [PATCH 10/13] aha1542: Remove WAIT and WAITd macros
Date: Mon, 19 Jan 2015 23:37:54 +0100 [thread overview]
Message-ID: <1421707077-25291-11-git-send-email-linux@rainbow-software.org> (raw)
In-Reply-To: <1421707077-25291-1-git-send-email-linux@rainbow-software.org>
Convert the ugly WAIT and WAITd macros into wait_mask function.
Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
drivers/scsi/aha1542.c | 104 ++++++++++++++++++++++++++----------------------
1 file changed, 57 insertions(+), 47 deletions(-)
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index ebc5476..0e58cef 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -120,39 +120,32 @@ struct aha1542_hostdata {
static DEFINE_SPINLOCK(aha1542_lock);
-
-
-#define WAITnexttimeout 3000000
-
static inline void aha1542_intr_reset(u16 base)
{
outb(IRST, CONTROL(base));
}
-#define WAIT(port, mask, allof, noneof) \
- { register int WAITbits; \
- register int WAITtimeout = WAITnexttimeout; \
- while (1) { \
- WAITbits = inb(port) & (mask); \
- if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
- break; \
- if (--WAITtimeout == 0) goto fail; \
- } \
- }
-
-/* Similar to WAIT, except we use the udelay call to regulate the
- amount of time we wait. */
-#define WAITd(port, mask, allof, noneof, timeout) \
- { register int WAITbits; \
- register int WAITtimeout = timeout; \
- while (1) { \
- WAITbits = inb(port) & (mask); \
- if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
- break; \
- mdelay(1); \
- if (--WAITtimeout == 0) goto fail; \
- } \
- }
+static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
+{
+ bool delayed = true;
+
+ if (timeout == 0) {
+ timeout = 3000000;
+ delayed = false;
+ }
+
+ while (1) {
+ u8 bits = inb(port) & mask;
+ if ((bits & allof) == allof && ((bits & noneof) == 0))
+ break;
+ if (delayed)
+ mdelay(1);
+ if (--timeout == 0)
+ return false;
+ }
+
+ return true;
+}
/* This is a bit complicated, but we need to make sure that an interrupt
routine does not send something out while we are in the middle of this.
@@ -166,7 +159,8 @@ static int aha1542_out(unsigned int base, u8 *cmdp, int len)
if (len == 1) {
got_lock = 0;
while (1 == 1) {
- WAIT(STATUS(base), CDF, 0, CDF);
+ if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
+ goto fail;
spin_lock_irqsave(&aha1542_lock, flags);
if (inb(STATUS(base)) & CDF) {
spin_unlock_irqrestore(&aha1542_lock, flags);
@@ -180,7 +174,8 @@ static int aha1542_out(unsigned int base, u8 *cmdp, int len)
spin_lock_irqsave(&aha1542_lock, flags);
got_lock = 1;
while (len--) {
- WAIT(STATUS(base), CDF, 0, CDF);
+ if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
+ goto fail;
outb(*cmdp++, DATA(base));
}
spin_unlock_irqrestore(&aha1542_lock, flags);
@@ -202,7 +197,8 @@ static int aha1542_in(unsigned int base, u8 *cmdp, int len)
spin_lock_irqsave(&aha1542_lock, flags);
while (len--) {
- WAIT(STATUS(base), DF, DF, 0);
+ if (!wait_mask(STATUS(base), DF, DF, 0, 0))
+ goto fail;
*cmdp++ = inb(DATA(base));
}
spin_unlock_irqrestore(&aha1542_lock, flags);
@@ -222,7 +218,8 @@ static int aha1542_in1(unsigned int base, u8 *cmdp, int len)
spin_lock_irqsave(&aha1542_lock, flags);
while (len--) {
- WAITd(STATUS(base), DF, DF, 0, 100);
+ if (!wait_mask(STATUS(base), DF, DF, 0, 100))
+ goto fail;
*cmdp++ = inb(DATA(base));
}
spin_unlock_irqrestore(&aha1542_lock, flags);
@@ -313,7 +310,8 @@ static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
debug = 1;
/* Expect INIT and IDLE, any of the others are bad */
- WAIT(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
+ if (!wait_mask(STATUS(bse), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
+ goto fail;
debug = 2;
/* Shouldn't have generated any interrupts during reset */
@@ -331,7 +329,8 @@ static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
cmdp = &inquiry_result[0];
while (len--) {
- WAIT(STATUS(bse), DF, DF, 0);
+ if (!wait_mask(STATUS(bse), DF, DF, 0, 0))
+ goto fail;
*cmdp++ = inb(DATA(bse));
}
@@ -342,7 +341,8 @@ static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
debug = 9;
/* When HACC, command is completed, and we're though testing */
- WAIT(INTRFLAGS(bse), HACC, HACC, 0);
+ if (!wait_mask(INTRFLAGS(bse), HACC, HACC, 0, 0))
+ goto fail;
/* now initialize adapter */
debug = 10;
@@ -711,7 +711,8 @@ static void setup_mailboxes(int bse, struct Scsi_Host *shpnt)
aha1542_intr_reset(bse); /* reset interrupts, so they don't block */
any2scsi((cmd + 2), isa_virt_to_bus(mb));
aha1542_out(bse, cmd, 5);
- WAIT(INTRFLAGS(bse), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(bse), INTRMASK, HACC, 0, 0))
+ goto fail;
while (0) {
fail:
printk(KERN_ERR "aha1542_detect: failed setting up mailboxes\n");
@@ -730,7 +731,8 @@ static int aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned cha
};
aha1542_out(base_io, inquiry_cmd, 1);
aha1542_in(base_io, inquiry_result, 3);
- WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
+ goto fail;
while (0) {
fail:
printk(KERN_ERR "aha1542_detect: query board settings\n");
@@ -800,7 +802,8 @@ static int aha1542_mbenable(int base)
aha1542_out(base, mbenable_cmd, 1);
if (aha1542_in1(base, mbenable_result, 2))
return retval;
- WAITd(INTRFLAGS(base), INTRMASK, HACC, 0, 100);
+ if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 100))
+ goto fail;
aha1542_intr_reset(base);
if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
@@ -812,7 +815,8 @@ static int aha1542_mbenable(int base)
retval = BIOS_TRANSLATION_25563;
aha1542_out(base, mbenable_cmd, 3);
- WAIT(INTRFLAGS(base), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
+ goto fail;
};
while (0) {
fail:
@@ -834,7 +838,8 @@ static int aha1542_query(int base_io, int *transl)
};
aha1542_out(base_io, inquiry_cmd, 1);
aha1542_in(base_io, inquiry_result, 4);
- WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
+ goto fail;
while (0) {
fail:
printk(KERN_ERR "aha1542_detect: query card type\n");
@@ -978,16 +983,19 @@ static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct
}
aha1542_intr_reset(base_io);
aha1542_out(base_io, oncmd, 2);
- WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
+ goto fail;
aha1542_intr_reset(base_io);
aha1542_out(base_io, offcmd, 2);
- WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
+ goto fail;
if (setup_dmaspeed[indx] >= 0) {
u8 dmacmd[] = {CMD_DMASPEED, 0};
dmacmd[1] = setup_dmaspeed[indx];
aha1542_intr_reset(base_io);
aha1542_out(base_io, dmacmd, 2);
- WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
+ if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
+ goto fail;
}
while (0) {
fail:
@@ -1162,8 +1170,9 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
spin_lock_irq(SCpnt->device->host->host_lock);
- WAIT(STATUS(SCpnt->device->host->io_port),
- STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
+ if (!wait_mask(STATUS(SCpnt->device->host->io_port),
+ STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
+ goto fail;
/*
* Now try to pick up the pieces. For all pending commands,
@@ -1226,8 +1235,9 @@ static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
ssleep(4);
spin_lock_irq(SCpnt->device->host->host_lock);
- WAIT(STATUS(SCpnt->device->host->io_port),
- STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF);
+ if (!wait_mask(STATUS(SCpnt->device->host->io_port),
+ STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
+ goto fail;
/*
* We need to do this too before the 1542 can interact with
--
Ondrej Zary
next prev parent reply other threads:[~2015-01-19 22:43 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-19 22:37 [RFC PATCH 0/13] aha1542: Various improvements Ondrej Zary
2015-01-19 22:37 ` [PATCH 01/13] aha1542: Stop using scsi_module.c Ondrej Zary
2015-01-19 22:37 ` [PATCH 02/13] aha1542: remove dead code Ondrej Zary
2015-01-19 22:37 ` [PATCH 03/13] aha1542: Remove SCSI_BUF_PA, SCSI_SG_PA, AHA1542_SCATTER and AHA1542_CMDLUN Ondrej Zary
2015-01-19 22:37 ` [PATCH 04/13] aha1542: Remove HOSTDATA macro Ondrej Zary
2015-01-19 22:37 ` [PATCH 05/13] aha1542: Convert aha1542_intr_reset to function Ondrej Zary
2015-01-19 22:37 ` [PATCH 06/13] aha1542: Use u8 instead of unchar Ondrej Zary
2015-01-19 22:37 ` [PATCH 07/13] aha1542: Reorder functions to remove forward declarations Ondrej Zary
2015-01-19 22:37 ` [PATCH 08/13] aha1542: remove empty aha1542_stat Ondrej Zary
2015-01-19 22:37 ` [PATCH 09/13] aha1542: Use BIT() macro Ondrej Zary
2015-01-19 22:37 ` Ondrej Zary [this message]
2015-01-19 22:37 ` [PATCH 11/13] aha1542: Unify aha1542_in and aha1542_in1 Ondrej Zary
2015-01-19 22:37 ` [PATCH 12/13] aha1542: Split aha1542_out Ondrej Zary
2015-01-19 22:37 ` [PATCH 13/13] aha1542: Remove unneeded gotos Ondrej Zary
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1421707077-25291-11-git-send-email-linux@rainbow-software.org \
--to=linux@rainbow-software.org \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.