Lines Matching refs:ch

43 static int ata_wait(struct ata_channel *ch, struct ata_device *, u_int8_t);
55 struct ata_channel *ch = device_get_softc(dev); in ata_generic_hw() local
57 ch->hw.begin_transaction = ata_begin_transaction; in ata_generic_hw()
58 ch->hw.end_transaction = ata_end_transaction; in ata_generic_hw()
59 ch->hw.status = ata_generic_status; in ata_generic_hw()
60 ch->hw.command = ata_generic_command; in ata_generic_hw()
61 ch->hw.tf_read = ata_tf_read; in ata_generic_hw()
62 ch->hw.tf_write = ata_tf_write; in ata_generic_hw()
69 struct ata_channel *ch = device_get_softc(request->parent); in ata_begin_transaction() local
76 if ((ch->flags & ATA_ATAPI_DMA_RO) && in ata_begin_transaction()
93 if (ch->hw.command(request)) { in ata_begin_transaction()
105 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
108 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_begin_transaction()
114 if (ata_wait(ch, atadev, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_begin_transaction()
128 if ((error = ch->dma->load(ch->dev, request->data, request->bytecount, in ata_begin_transaction()
129 request->flags & ATA_R_READ, ch->dma->sg, in ata_begin_transaction()
137 if (ch->hw.command(request)) { in ata_begin_transaction()
145 if (ch->dma->start && ch->dma->start(request->dev)) { in ata_begin_transaction()
156 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); in ata_begin_transaction()
158 if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) in ata_begin_transaction()
164 if (ch->hw.command(request)) { in ata_begin_transaction()
175 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); in ata_begin_transaction()
177 if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) in ata_begin_transaction()
183 if ((error = ch->dma->load(ch->dev, request->data, request->bytecount, in ata_begin_transaction()
184 request->flags & ATA_R_READ, ch->dma->sg, in ata_begin_transaction()
192 if (ch->hw.command(request)) { in ata_begin_transaction()
199 if (ch->dma->start && ch->dma->start(request->dev)) { in ata_begin_transaction()
209 if (ch->dma && ch->dma->flags & ATA_DMA_LOADED) in ata_begin_transaction()
210 ch->dma->unload(ch->dev); in ata_begin_transaction()
224 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction() local
231 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
244 ch->hw.tf_read(request); in ata_end_transaction()
249 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
262 if (ata_wait(ch, atadev, flags) < 0) { in ata_end_transaction()
286 if (ata_wait(ch, atadev, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_end_transaction()
289 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
310 if (ch->dma->stop) in ata_end_transaction()
311 request->dmastat = ch->dma->stop(request->dev); in ata_end_transaction()
315 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
322 ch->dma->unload(ch->dev); in ata_end_transaction()
329 length = ATA_IDX_INB(ch, ATA_CYL_LSB)|(ATA_IDX_INB(ch, ATA_CYL_MSB)<<8); in ata_end_transaction()
335 switch ((ATA_IDX_INB(ch, ATA_IREASON) & (ATA_I_CMD | ATA_I_IN)) | in ata_end_transaction()
347 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
406 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
421 if (ch->dma->stop) in ata_end_transaction()
422 request->dmastat = ch->dma->stop(request->dev); in ata_end_transaction()
426 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
433 ch->dma->unload(ch->dev); in ata_end_transaction()
453 struct ata_channel *ch = device_get_softc(dev); in ata_generic_reset() local
460 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
462 ostat0 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
469 if (!(ch->flags & ATA_NO_SLAVE)) { in ata_generic_reset()
470 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_SLAVE)); in ata_generic_reset()
472 ostat1 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
485 ch->devices = 0; in ata_generic_reset()
490 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
492 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_IDS | ATA_A_RESET); in ata_generic_reset()
494 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_IDS); in ata_generic_reset()
496 ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
501 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
503 err = ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
504 lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); in ata_generic_reset()
505 msb = ATA_IDX_INB(ch, ATA_CYL_MSB); in ata_generic_reset()
506 stat0 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
517 ch->devices |= ATA_ATAPI_MASTER; in ata_generic_reset()
520 ch->devices |= ATA_ATA_MASTER; in ata_generic_reset()
531 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_SLAVE)); in ata_generic_reset()
533 err = ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
534 lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); in ata_generic_reset()
535 msb = ATA_IDX_INB(ch, ATA_CYL_MSB); in ata_generic_reset()
536 stat1 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
547 ch->devices |= ATA_ATAPI_SLAVE; in ata_generic_reset()
550 ch->devices |= ATA_ATA_SLAVE; in ata_generic_reset()
580 stat0, stat1, ch->devices); in ata_generic_reset()
587 struct ata_channel *ch = device_get_softc(dev); in ata_generic_status() local
589 if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) { in ata_generic_status()
591 if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) in ata_generic_status()
598 ata_wait(struct ata_channel *ch, struct ata_device *atadev, u_int8_t mask) in ata_wait() argument
607 status = ATA_IDX_INB(ch, ATA_ALTSTAT); in ata_wait()
611 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); in ata_wait()
640 status = ATA_IDX_INB(ch, ATA_ALTSTAT); in ata_wait()
651 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command() local
655 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit)); in ata_generic_command()
658 if (ata_wait(ch, atadev, 0) < 0) { in ata_generic_command()
664 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT); in ata_generic_command()
671 ATA_IDX_OUTB(ch, ATA_FEATURE, ATA_F_DMA); in ata_generic_command()
672 ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0); in ata_generic_command()
673 ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0); in ata_generic_command()
676 ATA_IDX_OUTB(ch, ATA_FEATURE, 0); in ata_generic_command()
677 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->transfersize); in ata_generic_command()
678 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->transfersize >> 8); in ata_generic_command()
680 ATA_IDX_OUTB(ch, ATA_COMMAND, ATA_PACKET_CMD); in ata_generic_command()
688 int reason = ATA_IDX_INB(ch, ATA_IREASON); in ata_generic_command()
689 int status = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_command()
706 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_generic_command()
711 ch->hw.tf_write(request); in ata_generic_command()
714 ATA_IDX_OUTB(ch, ATA_COMMAND, request->u.ata.command); in ata_generic_command()
722 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read() local
726 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT | ATA_A_HOB); in ata_tf_read()
727 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); in ata_tf_read()
729 ((u_int64_t)(ATA_IDX_INB(ch, ATA_SECTOR)) << 24) | in ata_tf_read()
730 ((u_int64_t)(ATA_IDX_INB(ch, ATA_CYL_LSB)) << 32) | in ata_tf_read()
731 ((u_int64_t)(ATA_IDX_INB(ch, ATA_CYL_MSB)) << 40); in ata_tf_read()
733 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT); in ata_tf_read()
734 request->u.ata.count |= ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
736 (ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
737 (ATA_IDX_INB(ch, ATA_CYL_LSB) << 8) | in ata_tf_read()
738 (ATA_IDX_INB(ch, ATA_CYL_MSB) << 16)); in ata_tf_read()
741 request->u.ata.count = ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
742 request->u.ata.lba = ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
743 (ATA_IDX_INB(ch, ATA_CYL_LSB) << 8) | in ata_tf_read()
744 (ATA_IDX_INB(ch, ATA_CYL_MSB) << 16) | in ata_tf_read()
745 ((ATA_IDX_INB(ch, ATA_DRIVE) & 0xf) << 24); in ata_tf_read()
752 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write() local
756 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature >> 8); in ata_tf_write()
757 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
758 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count >> 8); in ata_tf_write()
759 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
760 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba >> 24); in ata_tf_write()
761 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
762 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 32); in ata_tf_write()
763 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
764 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 40); in ata_tf_write()
765 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
766 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); in ata_tf_write()
769 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
770 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
783 ATA_IDX_OUTB(ch, ATA_SECTOR, (request->u.ata.lba % sectors)+1); in ata_tf_write()
784 ATA_IDX_OUTB(ch, ATA_CYL_LSB, in ata_tf_write()
786 ATA_IDX_OUTB(ch, ATA_CYL_MSB, in ata_tf_write()
788 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | in ata_tf_write()
793 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
794 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
795 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
796 ATA_IDX_OUTB(ch, ATA_DRIVE, in ata_tf_write()
806 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read() local
810 if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t))) in ata_pio_read()
811 ATA_IDX_INSW_STRM(ch, ATA_DATA, in ata_pio_read()
815 ATA_IDX_INSL_STRM(ch, ATA_DATA, in ata_pio_read()
824 ATA_IDX_INW(ch, ATA_DATA); in ata_pio_read()
831 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write() local
835 if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t))) in ata_pio_write()
836 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, in ata_pio_write()
840 ATA_IDX_OUTSL_STRM(ch, ATA_DATA, in ata_pio_write()
849 ATA_IDX_OUTW(ch, ATA_DATA, 0); in ata_pio_write()