atapi.c revision c8531848467a8747b65b91ab83c4b57f4c000848
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER START
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The contents of this file are subject to the terms of the
ae115bc77f6fcde83175c75b4206dc2e50747966mrj * Common Development and Distribution License (the "License").
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You may not use this file except in compliance with the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * See the License for the specific language governing permissions
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * and limitations under the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * When distributing Covered Code, include this CDDL HEADER in each
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If applicable, add the following below this CDDL HEADER, with the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * fields enclosed by brackets "[]" replaced with your own identifying
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * information: Portions Copyright [yyyy] [name of copyright owner]
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER END
6fd12ef379fdceac740caa2565388cb7d7aee547lh * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Use is subject to license terms.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#pragma ident "%Z%%M% %I% %E% SMI"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* SCSA entry points */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_tgt_probe(struct scsi_device *sd, int (*callback)(void));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void atapi_tran_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_abort(struct scsi_address *ap, struct scsi_pkt *spktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_reset(struct scsi_address *ap, int level);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_getcap(struct scsi_address *ap, char *capstr, int whom);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_setcap(struct scsi_address *ap, char *capstr,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic struct scsi_pkt *atapi_tran_init_pkt(struct scsi_address *ap,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct scsi_pkt *spktp, struct buf *bp, int cmdlen, int statuslen,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int tgtlen, int flags, int (*callback)(caddr_t), caddr_t arg);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void atapi_tran_destroy_pkt(struct scsi_address *ap,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void atapi_tran_dmafree(struct scsi_address *ap, struct scsi_pkt *spktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_tran_start(struct scsi_address *ap, struct scsi_pkt *spktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * packet callbacks
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void atapi_complete(ata_drv_t *ata_drvp, ata_pkt_t *ata_pktp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic int atapi_id_update(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* external dependencies */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Local static data
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf 0, /* address low */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf 0, /* counter max */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf 0, /* dma speed */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Call SCSA init to initialize the ATAPI half of the driver
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* allocate transport structure */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_WARN(("atapi_init: scsi_hba_tran_alloc failed\n"));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* initialize transport structure */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (scsi_hba_attach_setup(ata_ctlp->ac_dip, &ata_pciide_dma_attr, tran,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_WARN(("atapi_init: scsi_hba_attach_setup failed\n"));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * destroy the atapi sub-system
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * initialize the ATAPI drive's soft-state based on the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * response to IDENTIFY PACKET DEVICE command
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Determine ATAPI CDB size */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf switch (ata_drvp->ad_id.ai_config & ATAPI_ID_CFG_PKT_SZ) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_WARN(("atapi_init_drive: bad pkt size support\n"));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* determine if drive gives an intr when it wants the CDB */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((ata_drvp->ad_id.ai_config & ATAPI_ID_CFG_DRQ_TYPE) !=
c8531848467a8747b65b91ab83c4b57f4c000848yt * Some devices may have no DMA mode enabled (UDMA or MWDMA)
c8531848467a8747b65b91ab83c4b57f4c000848yt * by default, so here we need check and enable DMA if none
c8531848467a8747b65b91ab83c4b57f4c000848yt * mode is selected.
c8531848467a8747b65b91ab83c4b57f4c000848yt /* Update the IDENTIFY PACKET DEVICE data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * destroy an atapi drive
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Issue an IDENTIFY PACKET (ATAPI) DEVICE command
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf rc = ata_id_common(ATC_ID_PACKET_DEVICE, FALSE, io_hdl1, ioaddr1,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((ata_idp->ai_config & ATAC_ATAPI_TYPE_MASK) != ATAC_ATAPI_TYPE)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Check the device's register block for the ATAPI signature.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Although the spec says the sector count, sector number and device/head
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * registers are also part of the signature, for some unknown reason, this
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * routine only checks the cyl hi and cyl low registers. I'm just
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * guessing, but it might be because ATA and ATAPI devices return
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * identical values in those registers and we actually rely on the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * IDENTIFY DEVICE and IDENTIFY PACKET DEVICE commands to recognize the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * device type.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (ddi_get8(io_hdl, (uchar_t *)ioaddr + AT_HCYL) == ATAPI_SIG_HI &&
6fd12ef379fdceac740caa2565388cb7d7aee547lh ddi_get8(io_hdl, (uchar_t *)ioaddr + AT_LCYL) != ATAPI_SIG_LO)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The following is a little bit of bullet proofing.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * When some drives are configured on a master-only bus they
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * "shadow" their registers for the not-present slave drive.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * This is bogus and if you're not careful it may cause a
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * master-only drive to be mistakenly recognized as both
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * master and slave. By clearing the signature registers here
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * I can make certain that when ata_drive_type() switches from
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * the master to slave drive that I'll read back non-signature
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * values regardless of whether the master-only drive does
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * the "shadow" register trick. This prevents a bogus
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * IDENTIFY PACKET DEVICE command from being issued which
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * a really bogus master-only drive will return "shadow"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * data for.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_tgt_init entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf gtgt_t *gtgtp; /* GHD's per-target-instance structure */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Qualification of targ, lun, and ATAPI device presence
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * have already been taken care of by ata_bus_ctl
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* store pointer to drive struct in cloned tran struct */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Create the "atapi" property so the target driver knows
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * to use the correct set of SCSI commands
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf gtgtp = ghd_target_init(hba_dip, tgt_dip, &ata_ctlp->ac_ccc,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* tran_tgt_private points to gtgt_t */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* gt_tgt_private points to ata_tgt_t */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* initialize the per-target-instance data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_tgt_probe entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfatapi_tran_tgt_probe(struct scsi_device *sd, int (*callback)(void))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_tgt_free entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ghd_target_free(hba_dip, tgt_dip, &TRAN2ATAP(hba_tran)->ac_ccc,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_abort entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (ghd_tran_abort(&ADDR2CTL(ap)->ac_ccc, PKTP2GCMDP(spktp),
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (ghd_tran_abort_lun(&ADDR2CTL(ap)->ac_ccc, ADDR2GTGTP(ap),
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_reset entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_setcap entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_getcap entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (-1);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* XXX - what should the real limit be?? */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* limit to 64K ??? */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Default geometry */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* this code is currently not used */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * retrieve the current IDENTIFY PACKET DEVICE info
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf return (0);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * save the new response data
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_init_pkt entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic struct scsi_pkt *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Determine whether to do PCI-IDE DMA setup, start out by
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * assuming we're not.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* no data to transfer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* no data to transfer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if ((GTGTP2ATADRVP(ADDR2GTGTP(ap))->ad_pciide_dma == ATA_DMA_OFF)) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The PCI-IDE DMA engine is brain-damaged and can't
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * DMA non-aligned buffers.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * if the virtual address isn't aligned, then the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * physical address also isn't aligned.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * It also insists that the byte count must be even.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* something odd here */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Huzza! We're really going to do it
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Call GHD packet init function
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf new_spktp = ghd_tran_init_pkt_attr(&ata_ctlp->ac_ccc, ap, spktp, bp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* reset data direction flags */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * check for ARQ mode
6fd12ef379fdceac740caa2565388cb7d7aee547lh ata_pktp->ap_statuslen >= sizeof (struct scsi_arq_status)) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * fill these with zeros for ATA/ATAPI-4 compatibility
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* determine direction to program the DMA engine later */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Since we're not using DMA, we need to map the buffer into
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * kernel address space
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If this is a fresh request map the buffer and
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * reset the ap_baddr pointer and the current offset
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * and byte count.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The ap_boffset is used to set the ap_v_addr ptr at
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * the start of each I/O request.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The ap_bcount is used to update ap_boffset when the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * target driver requests the next segment.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* determine direction for the PIO FSM */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If the drive has the Single Sector bug, limit
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * the transfer to a single sector. This assumes
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * ATAPI CD drives always use 2k sectors.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (GTGTP2ATADRVP(ADDR2GTGTP(ap))->ad_flags & AD_1SECTOR) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* adjust offset based on prior request */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* compute number of bytes left to transfer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* limit the transfer to 2k */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* tell target driver how much is left for next time */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* do the whole request in one swell foop */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * determine the size of each partial data transfer
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * to/from the drive
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf bytes = min(ata_pktp->ap_bcount, ATAPI_MAX_BYTES_PER_DRQ);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * GHD ccballoc callback
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Initializing the ata_pkt, and return the ptr to the gcmd_t to GHD.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* set the back ptr from the ata_pkt to the gcmd_t */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* check length of SCSI CDB is not larger than drive expects */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * save length of the SCSI CDB, and calculate CDB padding
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * note that for convenience, padding is expressed in shorts.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* set up callback functions */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* set-up for start */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_destroy_pkt entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * GHD ccbfree callback function
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* nothing to do */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_dmafree entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*ARGSUSED*/
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_sync_pkt entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*ARGSUSED*/
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * SCSA tran_start entry point
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Basic initialization performed each and every time a
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * scsi_pkt is submitted. A single scsi_pkt may be submitted
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * multiple times so this routine has to be idempotent. One
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * time initializations don't belong here.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The ap_v_addr pointer is incremented by the PIO data
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * transfer routine as each word is transferred. Therefore, need
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * to reset ap_v_addr here (rather than atapi_tran_init_pkt())
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * in case the target resubmits the same pkt multiple times
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (which is permitted by SCSA).
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ata_pktp->ap_v_addr = ata_pktp->ap_baddr + ata_pktp->ap_boffset;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* ap_resid is decremented as the data transfer progresses */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* clear error flags */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ata_pktp->ap_flags &= (AP_ATAPI | AP_READ | AP_WRITE | AP_ARQ_ON_ERROR);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * check for polling pkt
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* driver cannot accept tagged commands */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (spktp->pkt_flags & (FLAG_HTAG|FLAG_OTAG|FLAG_STAG)) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* call common transport routine */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf rc = ghd_transport(&ata_ctlp->ac_ccc, gcmdp, gcmdp->cmd_gtgtp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* see if pkt was not accepted */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * GHD packet complete callback
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ARGSUSED */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstatic void
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct scsi_status *scsi_stat = (struct scsi_status *)spktp->pkt_scbp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_TRANSPORT(("atapi_complete: pkt = 0x%p\n", ata_pktp));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* update resid */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* check for fatal errors */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* non-fatal errors */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_ARQ(("atapi_complete ARQ error 0x%p\n", ata_pktp));
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ADBG_TRANSPORT(("atapi_complete: reason = 0x%x stats = 0x%x "
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf "sts_chk = %d\n", spktp->pkt_reason, spktp->pkt_statistics,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Update the IDENTIFY PACKET DEVICE info
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * select the appropriate drive and LUN
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * make certain the drive is selected, and wait for not busy
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf if (!ata_wait(io_hdl2, ioaddr2, ATS_DRDY, ATS_BSY, 5 * 1000000)) {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf rc = atapi_id(ata_ctlp->ac_iohandle1, ata_ctlp->ac_ioaddr1,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Both drives on the controller share a common pkt to do
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * ARQ processing. Therefore the pkt is only partially
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * initialized here. The rest of initialization occurs
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * just before starting the ARQ pkt when an error is
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * detected.