summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/ami.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/sys/dev/ic/ami.c b/sys/dev/ic/ami.c
index 9e0d0e2d778..3b4c68cd71d 100644
--- a/sys/dev/ic/ami.c
+++ b/sys/dev/ic/ami.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ami.c,v 1.129 2006/03/20 09:12:05 dlg Exp $ */
+/* $OpenBSD: ami.c,v 1.130 2006/03/20 09:34:37 dlg Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -137,7 +137,9 @@ int ami_done_xs(struct ami_softc *, struct ami_ccb *);
int ami_done_pt(struct ami_softc *, struct ami_ccb *);
void ami_stimeout(void *);
+int ami_done_ioctl(struct ami_softc *, struct ami_ccb *);
int ami_done_ccb(struct ami_softc *, struct ami_ccb *);
+
void ami_copy_internal_data(struct scsi_xfer *, void *, size_t);
int ami_inquire(struct ami_softc *, u_int8_t);
@@ -1174,6 +1176,15 @@ ami_done_xs(struct ami_softc *sc, struct ami_ccb *ccb)
}
int
+ami_done_ioctl(struct ami_softc *sc, struct ami_ccb *ccb)
+{
+ ccb->ccb_wakeup = 0;
+ wakeup(ccb);
+
+ return (0);
+}
+
+int
ami_done_ccb(struct ami_softc *sc, struct ami_ccb *ccb)
{
int s;
@@ -1670,16 +1681,14 @@ ami_drv_inq(struct ami_softc *sc, u_int8_t ch, u_int8_t tg, u_int8_t page,
struct ami_ccb *ccb;
struct ami_passthrough *pt;
struct scsi_inquiry_data *inq = inqbuf;
+ int error = 0;
ccb = ami_get_ccb(sc);
if (ccb == NULL)
return (ENOMEM);
ccb->ccb_wakeup = 1;
- ccb->ccb_data = inqbuf;
- ccb->ccb_len = sizeof(struct scsi_inquiry_data);
- ccb->ccb_dir = AMI_CCB_IN;
- ccb->ccb_done = ami_done_ccb;
+ ccb->ccb_done = ami_done_ioctl;
ccb->ccb_cmd.acc_cmd = AMI_PASSTHRU;
ccb->ccb_cmd.acc_passthru.apt_data = ccb->ccb_ptpa;
@@ -1716,15 +1725,23 @@ ami_drv_inq(struct ami_softc *sc, u_int8_t ch, u_int8_t tg, u_int8_t page,
while (ccb->ccb_wakeup)
tsleep(ccb, PRIBIO, "ami_drv_inq", 0);
- ami_put_ccb(ccb);
+ bus_dmamap_sync(sc->sc_dmat, ccb->ccb_dmamap, 0,
+ ccb->ccb_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
+ bus_dmamap_sync(sc->sc_dmat, AMIMEM_MAP(sc->sc_ccbmem_am),
+ ccb->ccb_offset, sizeof(struct ami_ccbmem),
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(sc->sc_dmat, ccb->ccb_dmamap);
- if (pt->apt_scsistat != 0x00)
- return (EIO);
+ if (ccb->ccb_flags & AMI_CCB_F_ERR)
+ error = EIO;
+ else if (pt->apt_scsistat != 0x00)
+ error = EIO;
+ else if ((inq->device & SID_TYPE) != T_DIRECT)
+ error = EINVAL;
- if ((inq->device & SID_TYPE) != T_DIRECT)
- return (EINVAL);
+ ami_put_ccb(ccb);
- return (0);
+ return (error);
}
int