summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ata/ata-all.c61
1 files changed, 28 insertions, 33 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index f9683b9..f57e1f5 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: ata-all.c,v 1.7 1999/04/16 21:21:52 peter Exp $
+ * $Id: ata-all.c,v 1.8 1999/04/18 20:48:15 sos Exp $
*/
#include "ata.h"
@@ -52,6 +52,7 @@
#include <machine/clock.h>
#ifdef __i386__
#include <machine/smp.h>
+#include <i386/isa/intr_machdep.h>
#endif
#include <pci/pcivar.h>
#include <pci/pcireg.h>
@@ -70,10 +71,10 @@
/* prototypes */
#if NPCI > 0
-static void promise_intr(int32_t);
+static void promise_intr(void *);
#endif
static int32_t ata_probe(int32_t, int32_t, int32_t, device_t, int32_t *);
-static void ataintr(int32_t);
+static void ataintr(void *);
/*
* Ought to be handled by the devclass.
@@ -132,8 +133,9 @@ ata_isaattach(device_t dev)
{
struct resource *port;
struct resource *irq;
- int rid, unit;
void *ih;
+ int rid;
+ struct ata_softc *softc;
/* Allocate the port range and interrupt */
rid = 0;
@@ -147,14 +149,8 @@ ata_isaattach(device_t dev)
bus_release_resource(dev, SYS_RES_IOPORT, 0, port);
return (ENOMEM);
}
-
- /*
- * The interrupt code could be changed to take the ata_softc as
- * its argument directly.
- */
- unit = *(int *) device_get_softc(dev);
- return bus_setup_intr(dev, irq, (driver_intr_t *) ataintr,
- (void*)(uintptr_t) unit, &ih);
+ softc = device_get_softc(dev);
+ return bus_setup_intr(dev, irq, ataintr, softc, &ih);
}
static device_method_t ata_isa_methods[] = {
@@ -232,6 +228,7 @@ static int
ata_pciattach(device_t dev)
{
int unit = device_get_unit(dev);
+ struct ata_softc *softc;
u_int32_t type;
u_int8_t class, subclass;
u_int32_t cmd;
@@ -310,12 +307,14 @@ ata_pciattach(device_t dev)
/* now probe the addresse found for "real" ATA/ATAPI hardware */
lun = 0;
if (ata_probe(iobase_1, altiobase_1, bmaddr_1, dev, &lun)) {
+ softc = atadevices[lun];
if (iobase_1 == IO_WD1)
#ifdef __i386__
- register_intr(irq1,(int)"",0,(inthand2_t *)ataintr,&bio_imask,lun);
+ inthand_add(device_get_nameunit(dev), irq1, ataintr, softc,
+ &bio_imask, INTR_EXCL);
#endif
#ifdef __alpha__
- alpha_platform_setup_ide_intr(0, ataintr, (void *)(intptr_t)lun);
+ alpha_platform_setup_ide_intr(0, ataintr, softc);
#endif
else {
struct resource *irq;
@@ -324,23 +323,23 @@ ata_pciattach(device_t dev)
irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0,1,RF_ACTIVE);
if (sysctrl)
- bus_setup_intr(dev, irq, (driver_intr_t *)promise_intr,
- (void *)lun, &ih);
+ bus_setup_intr(dev, irq, promise_intr, softc, &ih);
else
- bus_setup_intr(dev, irq, (driver_intr_t *)ataintr,
- (void *)lun, &ih);
+ bus_setup_intr(dev, irq, ataintr, softc, &ih);
}
printf("ata%d at 0x%04x irq %d on ata-pci%d\n",
lun, iobase_1, isa_apic_irq(irq1), unit);
}
lun = 1;
if (ata_probe(iobase_2, altiobase_2, bmaddr_2, dev, &lun)) {
+ softc = atadevices[lun];
if (iobase_2 == IO_WD2)
#ifdef __i386__
- register_intr(irq2,(int)"",0,(inthand2_t *)ataintr,&bio_imask,lun);
+ inthand_add(device_get_nameunit(dev), irq2, ataintr, softc,
+ &bio_imask, INTR_EXCL);
#endif
#ifdef __alpha__
- alpha_platform_setup_ide_intr(1, ataintr, (void *)(intptr_t)lun);
+ alpha_platform_setup_ide_intr(1, ataintr, softc);
#endif
else {
struct resource *irq;
@@ -349,8 +348,7 @@ ata_pciattach(device_t dev)
irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0,1,RF_ACTIVE);
if (!sysctrl)
- bus_setup_intr(dev, irq, (driver_intr_t *)ataintr,
- (void *)lun, &ih);
+ bus_setup_intr(dev, irq, ataintr, softc, &ih);
}
printf("ata%d at 0x%04x irq %d on ata-pci%d\n",
lun, iobase_2, isa_apic_irq(irq2), unit);
@@ -375,16 +373,16 @@ static driver_t ata_pci_driver = {
DRIVER_MODULE(ata, pci, ata_pci_driver, ata_devclass, 0, 0);
static void
-promise_intr(int32_t unit)
+promise_intr(void *data)
{
- struct ata_softc *scp = atadevices[unit];
+ struct ata_softc *scp = (struct ata_softc *)data;
int32_t channel = inl((pci_read_config(scp->dev, 0x20, 4) & 0xfffc) + 0x1c);
if (channel & 0x00000400)
- ataintr(unit);
+ ataintr(data);
if (channel & 0x00004000)
- ataintr(unit+1);
+ ataintr(atadevices[scp->unit + 1]);
}
#endif
@@ -548,20 +546,17 @@ ata_probe(int32_t ioaddr, int32_t altioaddr, int32_t bmaddr,
}
static void
-ataintr(int32_t unit)
+ataintr(void *data)
{
struct ata_softc *scp;
struct atapi_request *atapi_request;
struct buf *ata_request;
u_int8_t status;
static int32_t intr_count = 0;
+ int unit;
- if (unit < 0 || unit > atanlun) {
- printf("ataintr: unit %d unusable\n", unit);
- return;
- }
-
- scp = atadevices[unit];
+ scp = (struct ata_softc *)data;
+ unit = scp->unit;
/* find & call the responsible driver to process this interrupt */
switch (scp->active) {
OpenPOWER on IntegriCloud