* Copyright (C) 1997 Wu Ching Chen
* 2.1.x update (C) 1998 Krzysztof G. Baranowski
* 2.5.x update (C) 2002 Red Hat <alan@redhat.com>
+ * 2.6.x update (C) 2004 Red Hat <alan@redhat.com>
*
* Marcelo Tosatti <marcelo@conectiva.com.br> : SMP fixes
*
#include <asm/io.h>
#include "scsi.h"
-#include "hosts.h"
+#include <scsi/scsi_host.h>
#include "atp870u.h"
/*
/*
* Issue more commands
*/
+ spin_lock_irqsave(dev->host->host_lock, flags);
if (((dev->quhdu != dev->quendu) || (dev->last_cmd != 0xff)) && (dev->in_snd == 0)) {
send_s870(host);
}
+ spin_unlock_irqrestore(dev->host->host_lock, flags);
/*
* Done
*/
/*
* If there is stuff to send and nothing going then send it
*/
+ spin_lock_irqsave(dev->host->host_lock, flags);
if (((dev->last_cmd != 0xff) || (dev->quhdu != dev->quendu)) && (dev->in_snd == 0)) {
send_s870(host);
}
+ spin_unlock_irqrestore(dev->host->host_lock, flags);
dev->in_int = 0;
goto out;
}
return IRQ_HANDLED;
}
+/**
+ * atp870u_queuecommand - Queue SCSI command
+ * @req_p: request block
+ * @done: completion function
+ *
+ * Queue a command to the ATP queue. Called with the host lock held.
+ */
+
static int atp870u_queuecommand(Scsi_Cmnd * req_p, void (*done) (Scsi_Cmnd *))
{
- unsigned long flags;
unsigned short int m;
unsigned int tmport;
struct Scsi_Host *host;
* Count new command
*/
- spin_lock_irqsave(host->host_lock, flags);
dev->quendu++;
if (dev->quendu >= qcnt) {
dev->quendu = 0;
}
dev->quendu--;
req_p->result = 0x00020000;
- spin_unlock_irqrestore(host->host_lock, flags);
done(req_p);
return 0;
}
dev->querequ[dev->quendu] = req_p;
tmport = dev->ioport + 0x1c;
- spin_unlock_irqrestore(host->host_lock, flags);
if ((inb(tmport) == 0) && (dev->in_int == 0) && (dev->in_snd == 0)) {
send_s870(host);
}
return 0;
}
+/**
+ * send_s870 - send a command to the controller
+ * @host: host
+ *
+ * On entry there is work queued to be done. We move some of that work to the
+ * controller itself.
+ *
+ * Caller holds the host lock.
+ */
+
static void send_s870(struct Scsi_Host *host)
{
unsigned int tmport;
Scsi_Cmnd *workrequ;
- unsigned long flags;
unsigned int i;
unsigned char j, target_id;
unsigned char *prd;
struct atp_unit *dev = (struct atp_unit *)&host->hostdata;
int sg_count;
- spin_lock_irqsave(host->host_lock, flags);
-
if (dev->in_snd != 0) {
- spin_unlock_irqrestore(host->host_lock, flags);
return;
}
dev->in_snd = 1;
dev->last_cmd = 0xff;
if (dev->quhdu == dev->quendu) {
dev->in_snd = 0;
- spin_unlock_irqrestore(dev->host->host_lock, flags);
return;
}
}
if ((dev->last_cmd != 0xff) && (dev->working != 0)) {
dev->in_snd = 0;
- spin_unlock_irqrestore(dev->host->host_lock, flags);
return;
}
dev->working++;
dev->quhdu = j;
dev->working--;
dev->in_snd = 0;
- spin_unlock_irqrestore(host->host_lock, flags);
return;
cmd_subp:
workportu = dev->ioport;
abortsnd:
dev->last_cmd |= 0x40;
dev->in_snd = 0;
- spin_unlock_irqrestore(dev->host->host_lock, flags);
return;
oktosend:
memcpy(&dev->ata_cdbu[0], &workrequ->cmnd[0], workrequ->cmd_len);
dev->last_cmd |= 0x40;
}
dev->in_snd = 0;
- spin_unlock_irqrestore(host->host_lock, flags);
return;
}
tmpcip = dev->pciport;
dev->last_cmd |= 0x40;
}
dev->in_snd = 0;
- spin_unlock_irqrestore(host->host_lock, flags);
return;
}
if (inb(tmport) == 0) {
dev->last_cmd |= 0x40;
}
dev->in_snd = 0;
- spin_unlock_irqrestore(host->host_lock, flags);
- return;
-
}
static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)