If you have a sili(4) or ahci(4), I'd appreciate a quick test of the
diff below.  As long as you can still mount your disks without
panicking, then it worked. :)

One test for each is sufficient, so please reply to the list to save
others from redundant effort.

Index: ata/atascsi.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/ata/atascsi.c,v
retrieving revision 1.104
diff -u -p -r1.104 atascsi.c
--- ata/atascsi.c       5 May 2011 19:23:05 -0000       1.104
+++ ata/atascsi.c       6 May 2011 17:41:20 -0000
@@ -1590,10 +1590,12 @@ atascsi_io_get(void *cookie)
 void
 atascsi_io_put(void *cookie, void *io)
 {
-       struct ata_xfer         *xa = io;
+       struct atascsi_host_port        *ahp = cookie;
+       struct atascsi                  *as = ahp->ahp_as;
+       struct ata_xfer                 *xa = io;
 
        xa->state = ATA_S_COMPLETE; /* XXX this state machine is dumb */
-       xa->ata_put_xfer(xa);
+       as->as_methods->ata_put_xfer(xa);
 }
 
 void
Index: ata/atascsi.h
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/ata/atascsi.h,v
retrieving revision 1.45
diff -u -p -r1.45 atascsi.h
--- ata/atascsi.h       26 Jan 2011 21:41:00 -0000      1.45
+++ ata/atascsi.h       5 May 2011 19:33:35 -0000
@@ -18,6 +18,9 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifndef _DEV_ATA_ATASCSI_H_
+#define _DEV_ATA_ATASCSI_H_
+
 struct atascsi;
 struct scsi_link;
 
@@ -327,8 +330,6 @@ struct ata_xfer {
        void                    *atascsi_private;
 
        int                     pmp_port;
-
-       void                    (*ata_put_xfer)(struct ata_xfer *);
 };
 
 /*
@@ -339,6 +340,7 @@ struct atascsi_methods {
        int                     (*probe)(void *, int, int);
        void                    (*free)(void *, int, int);
        struct ata_xfer *       (*ata_get_xfer)(void *, int);
+       void                    (*ata_put_xfer)(struct ata_xfer *);
        void                    (*ata_cmd)(struct ata_xfer *);
 };
 
@@ -368,3 +370,5 @@ int         atascsi_probe_dev(struct atascsi *,
 int            atascsi_detach_dev(struct atascsi *, int, int, int);
 
 void           ata_complete(struct ata_xfer *);
+
+#endif /* _DEV_ATA_ATASCSI_H_ */
Index: ic/sili.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/ic/sili.c,v
retrieving revision 1.47
diff -u -p -r1.47 sili.c
--- ic/sili.c   26 Jan 2011 21:41:00 -0000      1.47
+++ ic/sili.c   5 May 2011 19:34:11 -0000
@@ -211,6 +211,7 @@ struct atascsi_methods sili_atascsi_meth
        sili_ata_probe,
        sili_ata_free,
        sili_ata_get_xfer,
+       sili_ata_put_xfer,
        sili_ata_cmd
 };
 
@@ -833,7 +834,6 @@ sili_ccb_alloc(struct sili_port *sp)
                ccb->ccb_xa.fis = (struct ata_fis_h2d *)&prb->fis;
                ccb->ccb_xa.packetcmd = ((struct sili_prb_packet *)prb)->cdb;
                ccb->ccb_xa.tag = i;
-               ccb->ccb_xa.ata_put_xfer = sili_ata_put_xfer;
                ccb->ccb_xa.state = ATA_S_COMPLETE;
 
                sili_put_ccb(ccb);
Index: pci/ahci.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/pci/ahci.c,v
retrieving revision 1.177
diff -u -p -r1.177 ahci.c
--- pci/ahci.c  24 Apr 2011 11:09:48 -0000      1.177
+++ pci/ahci.c  5 May 2011 19:33:58 -0000
@@ -622,6 +622,7 @@ struct atascsi_methods ahci_atascsi_meth
        ahci_ata_probe,
        ahci_ata_free,
        ahci_ata_get_xfer,
+       ahci_ata_put_xfer,
        ahci_ata_cmd
 };
 
@@ -1227,8 +1228,6 @@ nomem:
                    (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
                ccb->ccb_xa.packetcmd = ccb->ccb_cmd_table->acmd;
                ccb->ccb_xa.tag = i;
-
-               ccb->ccb_xa.ata_put_xfer = ahci_ata_put_xfer;
 
                ccb->ccb_xa.state = ATA_S_COMPLETE;
                ahci_put_ccb(ccb);

Reply via email to