Lines Matching refs:ch

56 static int ata_wait(struct ata_channel *ch, int unit, u_int8_t);
68 struct ata_channel *ch = device_get_softc(dev); in ata_generic_hw() local
70 ch->hw.begin_transaction = ata_begin_transaction; in ata_generic_hw()
71 ch->hw.end_transaction = ata_end_transaction; in ata_generic_hw()
72 ch->hw.status = ata_generic_status; in ata_generic_hw()
73 ch->hw.softreset = NULL; in ata_generic_hw()
74 ch->hw.command = ata_generic_command; in ata_generic_hw()
75 ch->hw.tf_read = ata_tf_read; in ata_generic_hw()
76 ch->hw.tf_write = ata_tf_write; in ata_generic_hw()
77 ch->hw.pm_read = NULL; in ata_generic_hw()
78 ch->hw.pm_write = NULL; in ata_generic_hw()
85 struct ata_channel *ch = device_get_softc(request->parent); in ata_begin_transaction() local
91 if ((ch->flags & ATA_NO_ATAPI_DMA) && in ata_begin_transaction()
94 if ((ch->flags & ATA_ATAPI_DMA_RO) && in ata_begin_transaction()
107 if (ch->hw.command(request)) { in ata_begin_transaction()
119 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
122 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_begin_transaction()
123 ch->hw.tf_read(request); in ata_begin_transaction()
129 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_begin_transaction()
143 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
150 if ((ch->flags & ATA_DMA_BEFORE_CMD) && in ata_begin_transaction()
151 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
158 if (ch->hw.command(request)) { in ata_begin_transaction()
166 if (!(ch->flags & ATA_DMA_BEFORE_CMD) && in ata_begin_transaction()
167 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
178 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
180 if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) in ata_begin_transaction()
186 if (ch->hw.command(request)) { in ata_begin_transaction()
197 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
199 if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) in ata_begin_transaction()
205 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
212 if (ch->hw.command(request)) { in ata_begin_transaction()
219 if (ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
229 if (ch->dma.unload) { in ata_begin_transaction()
230 ch->dma.unload(request); in ata_begin_transaction()
244 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction() local
250 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
263 ch->hw.tf_read(request); in ata_end_transaction()
268 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
280 if (ata_wait(ch, request->unit, flags) < 0) { in ata_end_transaction()
302 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_end_transaction()
305 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
326 if (ch->dma.stop) in ata_end_transaction()
327 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
331 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
340 ch->hw.tf_read(request); in ata_end_transaction()
344 ch->dma.unload(request); in ata_end_transaction()
351 length = ATA_IDX_INB(ch, ATA_CYL_LSB)|(ATA_IDX_INB(ch, ATA_CYL_MSB)<<8); in ata_end_transaction()
357 switch ((ATA_IDX_INB(ch, ATA_IREASON) & (ATA_I_CMD | ATA_I_IN)) | in ata_end_transaction()
368 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
426 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
441 if (ch->dma.stop) in ata_end_transaction()
442 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
446 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
453 ch->dma.unload(request); in ata_end_transaction()
473 struct ata_channel *ch = device_get_softc(dev); in ata_generic_reset() local
480 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
482 ostat0 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
483 if (((ostat0 & 0xf8) != 0xf8 || (ch->flags & ATA_KNOWN_PRESENCE)) && in ata_generic_reset()
490 if (!(ch->flags & ATA_NO_SLAVE)) { in ata_generic_reset()
491 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_SLAVE)); in ata_generic_reset()
493 ostat1 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
494 if (((ostat1 & 0xf8) != 0xf8 || (ch->flags & ATA_KNOWN_PRESENCE)) && in ata_generic_reset()
507 ch->devices = 0; in ata_generic_reset()
512 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
514 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_IDS | ATA_A_RESET); in ata_generic_reset()
516 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_IDS); in ata_generic_reset()
518 ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
523 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_MASTER)); in ata_generic_reset()
525 if (ch->flags & ATA_STATUS_IS_LONG) in ata_generic_reset()
526 stat0 = ATA_IDX_INL(ch, ATA_STATUS) & 0xff; in ata_generic_reset()
528 stat0 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
529 err = ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
530 lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); in ata_generic_reset()
531 msb = ATA_IDX_INB(ch, ATA_CYL_MSB); in ata_generic_reset()
542 ch->devices |= ATA_ATAPI_MASTER; in ata_generic_reset()
545 ch->devices |= ATA_ATA_MASTER; in ata_generic_reset()
556 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_SLAVE)); in ata_generic_reset()
558 if (ch->flags & ATA_STATUS_IS_LONG) in ata_generic_reset()
559 stat1 = ATA_IDX_INL(ch, ATA_STATUS) & 0xff; in ata_generic_reset()
561 stat1 = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_reset()
562 err = ATA_IDX_INB(ch, ATA_ERROR); in ata_generic_reset()
563 lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); in ata_generic_reset()
564 msb = ATA_IDX_INB(ch, ATA_CYL_MSB); in ata_generic_reset()
575 ch->devices |= ATA_ATAPI_SLAVE; in ata_generic_reset()
578 ch->devices |= ATA_ATA_SLAVE; in ata_generic_reset()
587 if ((ch->flags & ATA_KNOWN_PRESENCE) == 0 && in ata_generic_reset()
602 stat0, stat1, ch->devices); in ata_generic_reset()
609 struct ata_channel *ch = device_get_softc(dev); in ata_generic_status() local
611 if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) { in ata_generic_status()
613 if (ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_BUSY) in ata_generic_status()
620 ata_wait(struct ata_channel *ch, int unit, u_int8_t mask) in ata_wait() argument
629 status = ATA_IDX_INB(ch, ATA_ALTSTAT); in ata_wait()
633 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(unit)); in ata_wait()
662 status = ATA_IDX_INB(ch, ATA_ALTSTAT); in ata_wait()
673 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command() local
676 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit)); in ata_generic_command()
679 if (ata_wait(ch, request->unit, 0) < 0) { in ata_generic_command()
686 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT); in ata_generic_command()
694 ATA_IDX_OUTB(ch, ATA_FEATURE, ATA_F_DMA); in ata_generic_command()
695 ATA_IDX_OUTB(ch, ATA_CYL_LSB, 0); in ata_generic_command()
696 ATA_IDX_OUTB(ch, ATA_CYL_MSB, 0); in ata_generic_command()
699 ATA_IDX_OUTB(ch, ATA_FEATURE, 0); in ata_generic_command()
700 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->transfersize); in ata_generic_command()
701 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->transfersize >> 8); in ata_generic_command()
703 ATA_IDX_OUTB(ch, ATA_COMMAND, ATA_PACKET_CMD); in ata_generic_command()
710 res = ata_wait(ch, request->unit, 0); in ata_generic_command()
721 int reason = ATA_IDX_INB(ch, ATA_IREASON); in ata_generic_command()
722 int status = ATA_IDX_INB(ch, ATA_STATUS); in ata_generic_command()
740 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_generic_command()
744 ch->hw.tf_write(request); in ata_generic_command()
747 ATA_IDX_OUTB(ch, ATA_COMMAND, request->u.ata.command); in ata_generic_command()
755 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read() local
758 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT | ATA_A_HOB); in ata_tf_read()
759 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); in ata_tf_read()
761 ((u_int64_t)(ATA_IDX_INB(ch, ATA_SECTOR)) << 24) | in ata_tf_read()
762 ((u_int64_t)(ATA_IDX_INB(ch, ATA_CYL_LSB)) << 32) | in ata_tf_read()
763 ((u_int64_t)(ATA_IDX_INB(ch, ATA_CYL_MSB)) << 40); in ata_tf_read()
765 ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT); in ata_tf_read()
766 request->u.ata.count |= ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
768 (ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
769 (ATA_IDX_INB(ch, ATA_CYL_LSB) << 8) | in ata_tf_read()
770 (ATA_IDX_INB(ch, ATA_CYL_MSB) << 16)); in ata_tf_read()
773 request->u.ata.count = ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
774 request->u.ata.lba = ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
775 (ATA_IDX_INB(ch, ATA_CYL_LSB) << 8) | in ata_tf_read()
776 (ATA_IDX_INB(ch, ATA_CYL_MSB) << 16) | in ata_tf_read()
777 ((ATA_IDX_INB(ch, ATA_DRIVE) & 0xf) << 24); in ata_tf_read()
784 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write() local
787 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature >> 8); in ata_tf_write()
788 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
789 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count >> 8); in ata_tf_write()
790 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
791 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba >> 24); in ata_tf_write()
792 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
793 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 32); 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 >> 40); in ata_tf_write()
796 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
797 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); in ata_tf_write()
800 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
801 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
802 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
803 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
804 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
805 ATA_IDX_OUTB(ch, ATA_DRIVE, in ata_tf_write()
814 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read() local
857 if (__predict_false((ch->flags & ATA_USE_16BIT) || in ata_pio_read()
863 ATA_IDX_INW_STRM(ch, ATA_DATA); in ata_pio_read()
869 ATA_IDX_INSW_STRM(ch, ATA_DATA, (void*)addr, in ata_pio_read()
875 ATA_IDX_INW_STRM(ch, ATA_DATA); in ata_pio_read()
879 ATA_IDX_INSL_STRM(ch, ATA_DATA, (void*)addr, size / 4); in ata_pio_read()
893 ATA_IDX_INW(ch, ATA_DATA); in ata_pio_read()
900 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write() local
936 ATA_IDX_OUTW_STRM(ch, ATA_DATA, *(uint16_t *)&buf); in ata_pio_write()
944 if (__predict_false((ch->flags & ATA_USE_16BIT) || in ata_pio_write()
951 ATA_IDX_OUTW_STRM(ch, ATA_DATA, in ata_pio_write()
956 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (void*)addr, in ata_pio_write()
963 ATA_IDX_OUTSL_STRM(ch, ATA_DATA, in ata_pio_write()
976 ATA_IDX_OUTW_STRM(ch, ATA_DATA, *(uint16_t *)&buf); in ata_pio_write()
984 ATA_IDX_OUTW(ch, ATA_DATA, 0); in ata_pio_write()