routine does not send something out while we are in the middle of this.
Fortunately, it is only at boot time that multi-byte messages
are ever sent. */
-static int aha1542_out(unsigned int base, u8 *cmdp, int len)
+static int aha1542_outb(unsigned int base, u8 cmd)
{
- unsigned long flags = 0;
- int got_lock;
-
- if (len == 1) {
- got_lock = 0;
- while (1 == 1) {
- 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);
- continue;
- }
- outb(*cmdp, DATA(base));
- spin_unlock_irqrestore(&aha1542_lock, flags);
- return 0;
+ unsigned long flags;
+
+ while (1) {
+ if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) {
+ printk(KERN_ERR "aha1542_outb failed");
+ return 1;
}
- } else {
spin_lock_irqsave(&aha1542_lock, flags);
- got_lock = 1;
- while (len--) {
- if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
- goto fail;
- outb(*cmdp++, DATA(base));
+ if (inb(STATUS(base)) & CDF) {
+ spin_unlock_irqrestore(&aha1542_lock, flags);
+ continue;
}
+ outb(cmd, DATA(base));
spin_unlock_irqrestore(&aha1542_lock, flags);
+ return 0;
}
+}
+
+static int aha1542_out(unsigned int base, u8 *cmdp, int len)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&aha1542_lock, flags);
+ while (len--) {
+ if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) {
+ spin_unlock_irqrestore(&aha1542_lock, flags);
+ printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
+ return 1;
+ }
+ outb(*cmdp++, DATA(base));
+ }
+ spin_unlock_irqrestore(&aha1542_lock, flags);
+
return 0;
-fail:
- if (got_lock)
- spin_unlock_irqrestore(&aha1542_lock, flags);
- printk(KERN_ERR "aha1542_out failed(%d): ", len + 1);
- return 1;
}
/* Only used at boot time, so we do not need to worry about latency as much
static int aha1542_test_port(int bse, struct Scsi_Host *shpnt)
{
- u8 inquiry_cmd[] = {CMD_INQUIRY};
u8 inquiry_result[4];
u8 *cmdp;
int len;
/* Perform a host adapter inquiry instead so we do not need to set
up the mailboxes ahead of time */
- aha1542_out(bse, inquiry_cmd, 1);
+ aha1542_outb(bse, CMD_INQUIRY);
debug = 3;
len = 4;
static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
{
struct aha1542_hostdata *aha1542 = shost_priv(SCpnt->device->host);
- u8 ahacmd = CMD_START_SCSI;
u8 direction;
u8 *cmd = (u8 *) SCpnt->cmnd;
u8 target = SCpnt->device->id;
DEB(printk("aha1542_queuecommand: now waiting for interrupt "));
SCpnt->scsi_done = done;
mb[mbo].status = 1;
- aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1); /* start scsi command */
+ aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
} else
printk("aha1542_queuecommand: done can't be NULL\n");
static int aha1542_getconfig(int base_io, unsigned char *irq_level, unsigned char *dma_chan, unsigned char *scsi_id)
{
- u8 inquiry_cmd[] = {CMD_RETCONF};
u8 inquiry_result[3];
int i;
i = inb(STATUS(base_io));
if (i & DF) {
i = inb(DATA(base_io));
};
- aha1542_out(base_io, inquiry_cmd, 1);
+ aha1542_outb(base_io, CMD_RETCONF);
aha1542_in(base_io, inquiry_result, 3, 0);
if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
goto fail;
retval = BIOS_TRANSLATION_6432;
- mbenable_cmd[0] = CMD_EXTBIOS;
- aha1542_out(base, mbenable_cmd, 1);
+ aha1542_outb(base, CMD_EXTBIOS);
if (aha1542_in(base, mbenable_result, 2, 100))
return retval;
if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 100))
/* Query the board to find out if it is a 1542 or a 1740, or whatever. */
static int aha1542_query(int base_io, int *transl)
{
- u8 inquiry_cmd[] = {CMD_INQUIRY};
u8 inquiry_result[4];
int i;
i = inb(STATUS(base_io));
if (i & DF) {
i = inb(DATA(base_io));
};
- aha1542_out(base_io, inquiry_cmd, 1);
+ aha1542_outb(base_io, CMD_INQUIRY);
aha1542_in(base_io, inquiry_result, 4, 0);
if (!wait_mask(INTRFLAGS(base_io), INTRMASK, HACC, 0, 0))
goto fail;
u8 lun = SCpnt->device->lun;
int mbo;
struct ccb *ccb = aha1542->ccb;
- u8 ahacmd = CMD_START_SCSI;
spin_lock_irqsave(&aha1542_lock, flags);
mbo = aha1542->aha1542_last_mbo_used + 1;
* Now tell the 1542 to flush all pending commands for this
* target
*/
- aha1542_out(SCpnt->device->host->io_port, &ahacmd, 1);
+ aha1542_outb(SCpnt->device->host->io_port, CMD_START_SCSI);
scmd_printk(KERN_WARNING, SCpnt,
"Trying device reset for target\n");