version 1.164, 2003/12/30 17:18:11 |
version 1.165, 2004/01/01 17:18:53 |
Line 146 const struct ata_bustype wdc_ata_bustype |
|
Line 146 const struct ata_bustype wdc_ata_bustype |
|
int wdcprobe1 __P((struct channel_softc*, int)); |
int wdcprobe1 __P((struct channel_softc*, int)); |
static void __wdcerror __P((struct channel_softc*, char *)); |
static void __wdcerror __P((struct channel_softc*, char *)); |
static int __wdcwait_reset __P((struct channel_softc *, int, int)); |
static int __wdcwait_reset __P((struct channel_softc *, int, int)); |
void __wdccommand_done __P((struct channel_softc *, struct wdc_xfer *)); |
void __wdccommand_done __P((struct channel_softc *, struct ata_xfer *)); |
void __wdccommand_start __P((struct channel_softc *, struct wdc_xfer *)); |
void __wdccommand_start __P((struct channel_softc *, struct ata_xfer *)); |
int __wdccommand_intr __P((struct channel_softc *, struct wdc_xfer *, int)); |
int __wdccommand_intr __P((struct channel_softc *, struct ata_xfer *, int)); |
int __wdcwait __P((struct channel_softc *, int, int, int)); |
int __wdcwait __P((struct channel_softc *, int, int, int)); |
void wdc_finish_attach __P((struct device *)); |
void wdc_finish_attach __P((struct device *)); |
void wdc_channel_attach __P((struct channel_softc *)); |
void wdc_channel_attach __P((struct channel_softc *)); |
Line 661 wdcattach(struct channel_softc *chp) |
|
Line 661 wdcattach(struct channel_softc *chp) |
|
if (chp->wdc->drv_probe == NULL) |
if (chp->wdc->drv_probe == NULL) |
chp->wdc->drv_probe = wdc_drvprobe; |
chp->wdc->drv_probe = wdc_drvprobe; |
if (inited == 0) { |
if (inited == 0) { |
/* Initialize the wdc_xfer pool. */ |
/* Initialize the ata_xfer pool. */ |
pool_init(&wdc_xfer_pool, sizeof(struct wdc_xfer), 0, |
pool_init(&wdc_xfer_pool, sizeof(struct ata_xfer), 0, |
0, 0, "wdcspl", NULL); |
0, 0, "wdcspl", NULL); |
inited++; |
inited++; |
} |
} |
TAILQ_INIT(&chp->ch_queue->sc_xfer); |
TAILQ_INIT(&chp->ch_queue->queue_xfer); |
chp->ch_queue->queue_freeze = 0; |
chp->ch_queue->queue_freeze = 0; |
|
|
chp->atabus = config_found(&chp->wdc->sc_dev, chp, atabusprint); |
chp->atabus = config_found(&chp->wdc->sc_dev, chp, atabusprint); |
Line 722 wdcdetach(struct device *self, int flags |
|
Line 722 wdcdetach(struct device *self, int flags |
|
void |
void |
wdcstart(struct channel_softc *chp) |
wdcstart(struct channel_softc *chp) |
{ |
{ |
struct wdc_xfer *xfer; |
struct ata_xfer *xfer; |
|
|
#ifdef WDC_DIAGNOSTIC |
#ifdef WDC_DIAGNOSTIC |
int spl1, spl2; |
int spl1, spl2; |
Line 738 wdcstart(struct channel_softc *chp) |
|
Line 738 wdcstart(struct channel_softc *chp) |
|
#endif /* WDC_DIAGNOSTIC */ |
#endif /* WDC_DIAGNOSTIC */ |
|
|
/* is there a xfer ? */ |
/* is there a xfer ? */ |
if ((xfer = chp->ch_queue->sc_xfer.tqh_first) == NULL) |
if ((xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer)) == NULL) |
return; |
return; |
|
|
/* adjust chp, in case we have a shared queue */ |
/* adjust chp, in case we have a shared queue */ |
chp = xfer->chp; |
chp = xfer->c_chp; |
|
|
if ((chp->ch_flags & WDCF_ACTIVE) != 0 ) { |
if ((chp->ch_flags & WDCF_ACTIVE) != 0 ) { |
return; /* channel aleady active */ |
return; /* channel aleady active */ |
Line 759 wdcstart(struct channel_softc *chp) |
|
Line 759 wdcstart(struct channel_softc *chp) |
|
return; |
return; |
|
|
WDCDEBUG_PRINT(("wdcstart: xfer %p channel %d drive %d\n", xfer, |
WDCDEBUG_PRINT(("wdcstart: xfer %p channel %d drive %d\n", xfer, |
chp->channel, xfer->drive), DEBUG_XFERS); |
chp->channel, xfer->c_drive), DEBUG_XFERS); |
chp->ch_flags |= WDCF_ACTIVE; |
chp->ch_flags |= WDCF_ACTIVE; |
if (chp->ch_drive[xfer->drive].drive_flags & DRIVE_RESET) { |
if (chp->ch_drive[xfer->c_drive].drive_flags & DRIVE_RESET) { |
chp->ch_drive[xfer->drive].drive_flags &= ~DRIVE_RESET; |
chp->ch_drive[xfer->c_drive].drive_flags &= ~DRIVE_RESET; |
chp->ch_drive[xfer->drive].state = 0; |
chp->ch_drive[xfer->c_drive].state = 0; |
} |
} |
if (chp->wdc->cap & WDC_CAPABILITY_NOIRQ) |
if (chp->wdc->cap & WDC_CAPABILITY_NOIRQ) |
KASSERT(xfer->c_flags & C_POLL); |
KASSERT(xfer->c_flags & C_POLL); |
|
|
wdcintr(void *arg) |
wdcintr(void *arg) |
{ |
{ |
struct channel_softc *chp = arg; |
struct channel_softc *chp = arg; |
struct wdc_xfer *xfer; |
struct ata_xfer *xfer; |
int ret; |
int ret; |
|
|
if ((chp->wdc->sc_dev.dv_flags & DVF_ACTIVE) == 0) { |
if ((chp->wdc->sc_dev.dv_flags & DVF_ACTIVE) == 0) { |
Line 810 wdcintr(void *arg) |
|
Line 810 wdcintr(void *arg) |
|
} |
} |
|
|
WDCDEBUG_PRINT(("wdcintr\n"), DEBUG_INTR); |
WDCDEBUG_PRINT(("wdcintr\n"), DEBUG_INTR); |
xfer = chp->ch_queue->sc_xfer.tqh_first; |
xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer); |
if (chp->ch_flags & WDCF_DMA_WAIT) { |
if (chp->ch_flags & WDCF_DMA_WAIT) { |
chp->wdc->dma_status = |
chp->wdc->dma_status = |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, chp->channel, |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, chp->channel, |
xfer->drive, 0); |
xfer->c_drive, 0); |
if (chp->wdc->dma_status & WDC_DMAST_NOIRQ) { |
if (chp->wdc->dma_status & WDC_DMAST_NOIRQ) { |
/* IRQ not for us, not detected by DMA engine */ |
/* IRQ not for us, not detected by DMA engine */ |
return 0; |
return 0; |
Line 1035 __wdcwait(struct channel_softc *chp, int |
|
Line 1035 __wdcwait(struct channel_softc *chp, int |
|
#ifdef WDCNDELAY_DEBUG |
#ifdef WDCNDELAY_DEBUG |
/* After autoconfig, there should be no long delays. */ |
/* After autoconfig, there should be no long delays. */ |
if (!cold && time > WDCNDELAY_DEBUG) { |
if (!cold && time > WDCNDELAY_DEBUG) { |
struct wdc_xfer *xfer = chp->ch_queue->sc_xfer.tqh_first; |
struct ata_xfer *xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer); |
if (xfer == NULL) |
if (xfer == NULL) |
printf("%s channel %d: warning: busy-wait took %dus\n", |
printf("%s channel %d: warning: busy-wait took %dus\n", |
chp->wdc->sc_dev.dv_xname, chp->channel, |
chp->wdc->sc_dev.dv_xname, chp->channel, |
Line 1102 wdcwait(struct channel_softc *chp, int m |
|
Line 1102 wdcwait(struct channel_softc *chp, int m |
|
* Busy-wait for DMA to complete |
* Busy-wait for DMA to complete |
*/ |
*/ |
int |
int |
wdc_dmawait(struct channel_softc *chp, struct wdc_xfer *xfer, int timeout) |
wdc_dmawait(struct channel_softc *chp, struct ata_xfer *xfer, int timeout) |
{ |
{ |
int time; |
int time; |
for (time = 0; time < timeout * 1000 / WDCDELAY; time++) { |
for (time = 0; time < timeout * 1000 / WDCDELAY; time++) { |
chp->wdc->dma_status = |
chp->wdc->dma_status = |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
chp->channel, xfer->drive, 0); |
chp->channel, xfer->c_drive, 0); |
if ((chp->wdc->dma_status & WDC_DMAST_NOIRQ) == 0) |
if ((chp->wdc->dma_status & WDC_DMAST_NOIRQ) == 0) |
return 0; |
return 0; |
delay(WDCDELAY); |
delay(WDCDELAY); |
} |
} |
/* timeout, force a DMA halt */ |
/* timeout, force a DMA halt */ |
chp->wdc->dma_status = (*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
chp->wdc->dma_status = (*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
chp->channel, xfer->drive, 1); |
chp->channel, xfer->c_drive, 1); |
return 1; |
return 1; |
} |
} |
|
|
|
|
wdctimeout(void *arg) |
wdctimeout(void *arg) |
{ |
{ |
struct channel_softc *chp = (struct channel_softc *)arg; |
struct channel_softc *chp = (struct channel_softc *)arg; |
struct wdc_xfer *xfer = chp->ch_queue->sc_xfer.tqh_first; |
struct ata_xfer *xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer); |
int s; |
int s; |
|
|
WDCDEBUG_PRINT(("wdctimeout\n"), DEBUG_FUNCS); |
WDCDEBUG_PRINT(("wdctimeout\n"), DEBUG_FUNCS); |
Line 1138 wdctimeout(void *arg) |
|
Line 1138 wdctimeout(void *arg) |
|
if (chp->ch_flags & WDCF_DMA_WAIT) { |
if (chp->ch_flags & WDCF_DMA_WAIT) { |
chp->wdc->dma_status = |
chp->wdc->dma_status = |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
(*chp->wdc->dma_finish)(chp->wdc->dma_arg, |
chp->channel, xfer->drive, 1); |
chp->channel, xfer->c_drive, 1); |
chp->ch_flags &= ~WDCF_DMA_WAIT; |
chp->ch_flags &= ~WDCF_DMA_WAIT; |
} |
} |
/* |
/* |
|
|
wdc_exec_command(struct ata_drive_datas *drvp, struct wdc_command *wdc_c) |
wdc_exec_command(struct ata_drive_datas *drvp, struct wdc_command *wdc_c) |
{ |
{ |
struct channel_softc *chp = drvp->chnl_softc; |
struct channel_softc *chp = drvp->chnl_softc; |
struct wdc_xfer *xfer; |
struct ata_xfer *xfer; |
int s, ret; |
int s, ret; |
|
|
WDCDEBUG_PRINT(("wdc_exec_command %s:%d:%d\n", |
WDCDEBUG_PRINT(("wdc_exec_command %s:%d:%d\n", |
Line 1460 wdc_exec_command(struct ata_drive_datas |
|
Line 1460 wdc_exec_command(struct ata_drive_datas |
|
wdc_c->flags |= AT_POLL; |
wdc_c->flags |= AT_POLL; |
if (wdc_c->flags & AT_POLL) |
if (wdc_c->flags & AT_POLL) |
xfer->c_flags |= C_POLL; |
xfer->c_flags |= C_POLL; |
xfer->drive = drvp->drive; |
xfer->c_drive = drvp->drive; |
xfer->databuf = wdc_c->data; |
xfer->c_databuf = wdc_c->data; |
xfer->c_bcount = wdc_c->bcount; |
xfer->c_bcount = wdc_c->bcount; |
xfer->cmd = wdc_c; |
xfer->c_cmd = wdc_c; |
xfer->c_start = __wdccommand_start; |
xfer->c_start = __wdccommand_start; |
xfer->c_intr = __wdccommand_intr; |
xfer->c_intr = __wdccommand_intr; |
xfer->c_kill_xfer = __wdccommand_done; |
xfer->c_kill_xfer = __wdccommand_done; |
Line 1492 wdc_exec_command(struct ata_drive_datas |
|
Line 1492 wdc_exec_command(struct ata_drive_datas |
|
} |
} |
|
|
void |
void |
__wdccommand_start(struct channel_softc *chp, struct wdc_xfer *xfer) |
__wdccommand_start(struct channel_softc *chp, struct ata_xfer *xfer) |
{ |
{ |
int drive = xfer->drive; |
int drive = xfer->c_drive; |
struct wdc_command *wdc_c = xfer->cmd; |
struct wdc_command *wdc_c = xfer->c_cmd; |
|
|
WDCDEBUG_PRINT(("__wdccommand_start %s:%d:%d\n", |
WDCDEBUG_PRINT(("__wdccommand_start %s:%d:%d\n", |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive), |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->c_drive), |
DEBUG_FUNCS); |
DEBUG_FUNCS); |
|
|
if (chp->wdc->cap & WDC_CAPABILITY_SELECT) |
if (chp->wdc->cap & WDC_CAPABILITY_SELECT) |
Line 1539 __wdccommand_start(struct channel_softc |
|
Line 1539 __wdccommand_start(struct channel_softc |
|
} |
} |
|
|
int |
int |
__wdccommand_intr(struct channel_softc *chp, struct wdc_xfer *xfer, int irq) |
__wdccommand_intr(struct channel_softc *chp, struct ata_xfer *xfer, int irq) |
{ |
{ |
struct wdc_command *wdc_c = xfer->cmd; |
struct wdc_command *wdc_c = xfer->c_cmd; |
int bcount = wdc_c->bcount; |
int bcount = wdc_c->bcount; |
char *data = wdc_c->data; |
char *data = wdc_c->data; |
int wflags; |
int wflags; |
Line 1555 __wdccommand_intr(struct channel_softc * |
|
Line 1555 __wdccommand_intr(struct channel_softc * |
|
|
|
again: |
again: |
WDCDEBUG_PRINT(("__wdccommand_intr %s:%d:%d\n", |
WDCDEBUG_PRINT(("__wdccommand_intr %s:%d:%d\n", |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive), DEBUG_INTR); |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->c_drive), |
|
DEBUG_INTR); |
/* |
/* |
* after a ATAPI_SOFT_RESET, the device will have released the bus. |
* after a ATAPI_SOFT_RESET, the device will have released the bus. |
* Reselect again, it doesn't hurt for others commands, and the time |
* Reselect again, it doesn't hurt for others commands, and the time |
Line 1563 __wdccommand_intr(struct channel_softc * |
|
Line 1564 __wdccommand_intr(struct channel_softc * |
|
* wdc_exec_command() isn't called often (mosly for autoconfig) |
* wdc_exec_command() isn't called often (mosly for autoconfig) |
*/ |
*/ |
bus_space_write_1(chp->cmd_iot, chp->cmd_iohs[wd_sdh], 0, |
bus_space_write_1(chp->cmd_iot, chp->cmd_iohs[wd_sdh], 0, |
WDSD_IBM | (xfer->drive << 4)); |
WDSD_IBM | (xfer->c_drive << 4)); |
if ((wdc_c->flags & AT_XFDONE) != 0) { |
if ((wdc_c->flags & AT_XFDONE) != 0) { |
/* |
/* |
* We have completed a data xfer. The drive should now be |
* We have completed a data xfer. The drive should now be |
Line 1592 __wdccommand_intr(struct channel_softc * |
|
Line 1593 __wdccommand_intr(struct channel_softc * |
|
wdc_c->flags |= AT_TIMEOU; |
wdc_c->flags |= AT_TIMEOU; |
goto out; |
goto out; |
} |
} |
if (chp->ch_drive[xfer->drive].drive_flags & DRIVE_CAP32) { |
if (chp->ch_drive[xfer->c_drive].drive_flags & DRIVE_CAP32) { |
bus_space_read_multi_4(chp->data32iot, chp->data32ioh, |
bus_space_read_multi_4(chp->data32iot, chp->data32ioh, |
0, (u_int32_t*)data, bcount >> 2); |
0, (u_int32_t*)data, bcount >> 2); |
data += bcount & 0xfffffffc; |
data += bcount & 0xfffffffc; |
Line 1610 __wdccommand_intr(struct channel_softc * |
|
Line 1611 __wdccommand_intr(struct channel_softc * |
|
wdc_c->flags |= AT_TIMEOU; |
wdc_c->flags |= AT_TIMEOU; |
goto out; |
goto out; |
} |
} |
if (chp->ch_drive[xfer->drive].drive_flags & DRIVE_CAP32) { |
if (chp->ch_drive[xfer->c_drive].drive_flags & DRIVE_CAP32) { |
bus_space_write_multi_4(chp->data32iot, chp->data32ioh, |
bus_space_write_multi_4(chp->data32iot, chp->data32ioh, |
0, (u_int32_t*)data, bcount >> 2); |
0, (u_int32_t*)data, bcount >> 2); |
data += bcount & 0xfffffffc; |
data += bcount & 0xfffffffc; |
Line 1636 __wdccommand_intr(struct channel_softc * |
|
Line 1637 __wdccommand_intr(struct channel_softc * |
|
} |
} |
|
|
void |
void |
__wdccommand_done(struct channel_softc *chp, struct wdc_xfer *xfer) |
__wdccommand_done(struct channel_softc *chp, struct ata_xfer *xfer) |
{ |
{ |
struct wdc_command *wdc_c = xfer->cmd; |
struct wdc_command *wdc_c = xfer->c_cmd; |
|
|
WDCDEBUG_PRINT(("__wdccommand_done %s:%d:%d\n", |
WDCDEBUG_PRINT(("__wdccommand_done %s:%d:%d\n", |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive), DEBUG_FUNCS); |
chp->wdc->sc_dev.dv_xname, chp->channel, xfer->c_drive), |
|
DEBUG_FUNCS); |
|
|
callout_stop(&chp->ch_callout); |
callout_stop(&chp->ch_callout); |
|
|
Line 1790 wdccommandshort(struct channel_softc *ch |
|
Line 1792 wdccommandshort(struct channel_softc *ch |
|
|
|
/* Add a command to the queue and start controller. Must be called at splbio */ |
/* Add a command to the queue and start controller. Must be called at splbio */ |
void |
void |
wdc_exec_xfer(struct channel_softc *chp, struct wdc_xfer *xfer) |
wdc_exec_xfer(struct channel_softc *chp, struct ata_xfer *xfer) |
{ |
{ |
|
|
WDCDEBUG_PRINT(("wdc_exec_xfer %p channel %d drive %d\n", xfer, |
WDCDEBUG_PRINT(("wdc_exec_xfer %p channel %d drive %d\n", xfer, |
chp->channel, xfer->drive), DEBUG_XFERS); |
chp->channel, xfer->c_drive), DEBUG_XFERS); |
|
|
/* complete xfer setup */ |
/* complete xfer setup */ |
xfer->chp = chp; |
xfer->c_chp = chp; |
|
|
/* |
/* |
* If we are a polled command, and the list is not empty, |
* If we are a polled command, and the list is not empty, |
Line 1805 wdc_exec_xfer(struct channel_softc *chp, |
|
Line 1807 wdc_exec_xfer(struct channel_softc *chp, |
|
* to complete, we're going to reboot soon anyway. |
* to complete, we're going to reboot soon anyway. |
*/ |
*/ |
if ((xfer->c_flags & C_POLL) != 0 && |
if ((xfer->c_flags & C_POLL) != 0 && |
chp->ch_queue->sc_xfer.tqh_first != NULL) { |
TAILQ_FIRST(&chp->ch_queue->queue_xfer) != NULL) { |
TAILQ_INIT(&chp->ch_queue->sc_xfer); |
TAILQ_INIT(&chp->ch_queue->queue_xfer); |
} |
} |
/* insert at the end of command list */ |
/* insert at the end of command list */ |
TAILQ_INSERT_TAIL(&chp->ch_queue->sc_xfer,xfer , c_xferchain); |
TAILQ_INSERT_TAIL(&chp->ch_queue->queue_xfer, xfer, c_xferchain); |
WDCDEBUG_PRINT(("wdcstart from wdc_exec_xfer, flags 0x%x\n", |
WDCDEBUG_PRINT(("wdcstart from wdc_exec_xfer, flags 0x%x\n", |
chp->ch_flags), DEBUG_XFERS); |
chp->ch_flags), DEBUG_XFERS); |
wdcstart(chp); |
wdcstart(chp); |
} |
} |
|
|
struct wdc_xfer * |
struct ata_xfer * |
wdc_get_xfer(int flags) |
wdc_get_xfer(int flags) |
{ |
{ |
struct wdc_xfer *xfer; |
struct ata_xfer *xfer; |
int s; |
int s; |
|
|
s = splbio(); |
s = splbio(); |
Line 1826 wdc_get_xfer(int flags) |
|
Line 1828 wdc_get_xfer(int flags) |
|
((flags & WDC_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK)); |
((flags & WDC_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK)); |
splx(s); |
splx(s); |
if (xfer != NULL) { |
if (xfer != NULL) { |
memset(xfer, 0, sizeof(struct wdc_xfer)); |
memset(xfer, 0, sizeof(struct ata_xfer)); |
} |
} |
return xfer; |
return xfer; |
} |
} |
|
|
void |
void |
wdc_free_xfer(struct channel_softc *chp, struct wdc_xfer *xfer) |
wdc_free_xfer(struct channel_softc *chp, struct ata_xfer *xfer) |
{ |
{ |
struct wdc_softc *wdc = chp->wdc; |
struct wdc_softc *wdc = chp->wdc; |
int s; |
int s; |
Line 1841 wdc_free_xfer(struct channel_softc *chp, |
|
Line 1843 wdc_free_xfer(struct channel_softc *chp, |
|
(*wdc->free_hw)(chp); |
(*wdc->free_hw)(chp); |
s = splbio(); |
s = splbio(); |
chp->ch_flags &= ~WDCF_ACTIVE; |
chp->ch_flags &= ~WDCF_ACTIVE; |
TAILQ_REMOVE(&chp->ch_queue->sc_xfer, xfer, c_xferchain); |
TAILQ_REMOVE(&chp->ch_queue->queue_xfer, xfer, c_xferchain); |
pool_put(&wdc_xfer_pool, xfer); |
pool_put(&wdc_xfer_pool, xfer); |
splx(s); |
splx(s); |
} |
} |
Line 1854 wdc_free_xfer(struct channel_softc *chp, |
|
Line 1856 wdc_free_xfer(struct channel_softc *chp, |
|
void |
void |
wdc_kill_pending(struct channel_softc *chp) |
wdc_kill_pending(struct channel_softc *chp) |
{ |
{ |
struct wdc_xfer *xfer; |
struct ata_xfer *xfer; |
|
|
while ((xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer)) != NULL) { |
while ((xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer)) != NULL) { |
chp = xfer->chp; |
chp = xfer->c_chp; |
(*xfer->c_kill_xfer)(chp, xfer); |
(*xfer->c_kill_xfer)(chp, xfer); |
} |
} |
} |
} |
Line 1865 wdc_kill_pending(struct channel_softc *c |
|
Line 1867 wdc_kill_pending(struct channel_softc *c |
|
static void |
static void |
__wdcerror(struct channel_softc *chp, char *msg) |
__wdcerror(struct channel_softc *chp, char *msg) |
{ |
{ |
struct wdc_xfer *xfer = chp->ch_queue->sc_xfer.tqh_first; |
struct ata_xfer *xfer = TAILQ_FIRST(&chp->ch_queue->queue_xfer); |
|
|
if (xfer == NULL) |
if (xfer == NULL) |
printf("%s:%d: %s\n", chp->wdc->sc_dev.dv_xname, chp->channel, |
printf("%s:%d: %s\n", chp->wdc->sc_dev.dv_xname, chp->channel, |
msg); |
msg); |
else |
else |
printf("%s:%d:%d: %s\n", chp->wdc->sc_dev.dv_xname, |
printf("%s:%d:%d: %s\n", chp->wdc->sc_dev.dv_xname, |
chp->channel, xfer->drive, msg); |
chp->channel, xfer->c_drive, msg); |
} |
} |
|
|
/* |
/* |