Lines Matching refs:request
85 ata_begin_transaction(struct ata_request *request) in ata_begin_transaction() argument
87 struct ata_channel *ch = device_get_softc(request->parent); in ata_begin_transaction()
90 ATA_DEBUG_RQ(request, "begin transaction"); in ata_begin_transaction()
94 (request->flags & ATA_R_ATAPI) == ATA_R_ATAPI) in ata_begin_transaction()
95 request->flags &= ~ATA_R_DMA; in ata_begin_transaction()
97 ((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) == in ata_begin_transaction()
99 request->flags &= ~ATA_R_DMA; in ata_begin_transaction()
101 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) { in ata_begin_transaction()
106 int write = (request->flags & ATA_R_WRITE); in ata_begin_transaction()
109 if (ch->hw.command(request)) { in ata_begin_transaction()
110 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
111 ata_cmd2str(request)); in ata_begin_transaction()
112 request->result = EIO; in ata_begin_transaction()
117 if (request->u.ata.command == ATA_DEVICE_RESET) { in ata_begin_transaction()
121 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
122 } while (request->status & ATA_S_BUSY && timeout--); in ata_begin_transaction()
123 if (request->status & ATA_S_ERROR) in ata_begin_transaction()
124 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_begin_transaction()
125 ch->hw.tf_read(request); in ata_begin_transaction()
131 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_begin_transaction()
132 device_printf(request->parent, in ata_begin_transaction()
134 request->result = EIO; in ata_begin_transaction()
137 ata_pio_write(request, request->transfersize); in ata_begin_transaction()
145 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
146 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
147 request->result = error; in ata_begin_transaction()
153 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
154 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
155 request->result = EIO; in ata_begin_transaction()
160 if (ch->hw.command(request)) { in ata_begin_transaction()
161 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
162 ata_cmd2str(request)); in ata_begin_transaction()
163 request->result = EIO; in ata_begin_transaction()
169 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
170 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
171 request->result = EIO; in ata_begin_transaction()
179 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
180 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
183 request->result = EBUSY; in ata_begin_transaction()
188 if (ch->hw.command(request)) { in ata_begin_transaction()
189 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
190 request->result = EIO; in ata_begin_transaction()
198 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
199 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
202 request->result = EBUSY; in ata_begin_transaction()
207 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
208 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
209 request->result = error; in ata_begin_transaction()
214 if (ch->hw.command(request)) { in ata_begin_transaction()
215 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
216 request->result = EIO; in ata_begin_transaction()
221 if (ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
222 request->result = EIO; in ata_begin_transaction()
232 ch->dma.unload(request); in ata_begin_transaction()
237 callout_reset(&request->callout, request->timeout * hz, in ata_begin_transaction()
238 ata_timeout, request); in ata_begin_transaction()
244 ata_end_transaction(struct ata_request *request) in ata_end_transaction() argument
246 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction()
249 ATA_DEBUG_RQ(request, "end transaction"); in ata_end_transaction()
252 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
254 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_CONTROL)) { in ata_end_transaction()
259 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
263 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
264 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
265 ch->hw.tf_read(request); in ata_end_transaction()
269 if (request->status & ATA_S_ERROR) { in ata_end_transaction()
270 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
275 if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { in ata_end_transaction()
277 if (request->flags & ATA_R_READ) { in ata_end_transaction()
280 if (request->u.ata.command != ATA_ATAPI_IDENTIFY) in ata_end_transaction()
282 if (ata_wait(ch, request->unit, flags) < 0) { in ata_end_transaction()
283 device_printf(request->parent, in ata_end_transaction()
285 request->result = EIO; in ata_end_transaction()
288 ata_pio_read(request, request->transfersize); in ata_end_transaction()
292 request->donecount += request->transfersize; in ata_end_transaction()
295 if (request->bytecount > request->donecount) { in ata_end_transaction()
297 request->transfersize = in ata_end_transaction()
298 min((request->bytecount - request->donecount), in ata_end_transaction()
299 request->transfersize); in ata_end_transaction()
302 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
304 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_end_transaction()
305 device_printf(request->parent, in ata_end_transaction()
307 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
312 ata_pio_write(request, request->transfersize); in ata_end_transaction()
317 if (request->flags & ATA_R_READ) in ata_end_transaction()
329 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
332 if (request->status & ATA_S_ERROR) in ata_end_transaction()
333 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
334 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
335 request->status |= ATA_S_ERROR; in ata_end_transaction()
336 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
337 request->donecount = request->bytecount; in ata_end_transaction()
340 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
341 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
342 ch->hw.tf_read(request); in ata_end_transaction()
346 ch->dma.unload(request); in ata_end_transaction()
356 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
360 (request->status & ATA_S_DRQ)) { in ata_end_transaction()
365 if (!(request->status & ATA_S_DRQ)) { in ata_end_transaction()
366 device_printf(request->parent, "command interrupt without DRQ\n"); in ata_end_transaction()
367 request->status = ATA_S_ERROR; in ata_end_transaction()
370 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
371 (request->flags & ATA_R_ATAPI16) ? 8 : 6); in ata_end_transaction()
376 if (request->flags & ATA_R_READ) { in ata_end_transaction()
377 request->status = ATA_S_ERROR; in ata_end_transaction()
378 device_printf(request->parent, in ata_end_transaction()
380 ata_cmd2str(request)); in ata_end_transaction()
383 ata_pio_write(request, length); in ata_end_transaction()
384 request->donecount += length; in ata_end_transaction()
387 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
388 request->transfersize); in ata_end_transaction()
393 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
394 request->status = ATA_S_ERROR; in ata_end_transaction()
395 device_printf(request->parent, in ata_end_transaction()
397 ata_cmd2str(request)); in ata_end_transaction()
400 ata_pio_read(request, length); in ata_end_transaction()
401 request->donecount += length; in ata_end_transaction()
404 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
405 request->transfersize); in ata_end_transaction()
410 device_printf(request->parent, in ata_end_transaction()
412 ata_cmd2str(request)); in ata_end_transaction()
413 if (request->flags & ATA_R_READ) { in ata_end_transaction()
414 ata_pio_read(request, length); in ata_end_transaction()
415 request->donecount += length; in ata_end_transaction()
417 else if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
418 ata_pio_write(request, length); in ata_end_transaction()
419 request->donecount += length; in ata_end_transaction()
422 request->status = ATA_S_ERROR; in ata_end_transaction()
427 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
428 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
432 device_printf(request->parent, "unknown transfer phase\n"); in ata_end_transaction()
433 request->status = ATA_S_ERROR; in ata_end_transaction()
444 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
447 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
448 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
449 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
450 request->status |= ATA_S_ERROR; in ata_end_transaction()
451 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
452 request->donecount = request->bytecount; in ata_end_transaction()
455 ch->dma.unload(request); in ata_end_transaction()
464 callout_stop(&request->callout); in ata_end_transaction()
673 ata_generic_command(struct ata_request *request) in ata_generic_command() argument
675 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command()
678 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit)); in ata_generic_command()
681 if (ata_wait(ch, request->unit, 0) < 0) { in ata_generic_command()
682 device_printf(request->parent, "timeout waiting to issue command\n"); in ata_generic_command()
683 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
690 if (request->flags & ATA_R_ATAPI) { in ata_generic_command()
695 if (request->flags & ATA_R_DMA) { in ata_generic_command()
702 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->transfersize); in ata_generic_command()
703 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->transfersize >> 8); in ata_generic_command()
708 if (request->flags & ATA_R_ATAPI_INTR) in ata_generic_command()
712 res = ata_wait(ch, request->unit, 0); in ata_generic_command()
715 device_printf(request->parent, in ata_generic_command()
717 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
732 device_printf(request->parent, in ata_generic_command()
734 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
742 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_generic_command()
743 (request->flags & ATA_R_ATAPI16) ? 8 : 6); in ata_generic_command()
746 ch->hw.tf_write(request); in ata_generic_command()
749 ATA_IDX_OUTB(ch, ATA_COMMAND, request->u.ata.command); in ata_generic_command()
755 ata_tf_read(struct ata_request *request) in ata_tf_read() argument
757 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read()
759 if (request->flags & ATA_R_48BIT) { in ata_tf_read()
761 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); in ata_tf_read()
762 request->u.ata.lba = in ata_tf_read()
768 request->u.ata.count |= ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
769 request->u.ata.lba |= in ata_tf_read()
775 request->u.ata.count = ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
776 request->u.ata.lba = ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
784 ata_tf_write(struct ata_request *request) in ata_tf_write() argument
786 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write()
788 if (request->flags & ATA_R_48BIT) { in ata_tf_write()
789 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature >> 8); in ata_tf_write()
790 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
791 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count >> 8); in ata_tf_write()
792 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
793 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba >> 24); in ata_tf_write()
794 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
795 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 32); in ata_tf_write()
796 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
797 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 40); in ata_tf_write()
798 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
799 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); in ata_tf_write()
802 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
803 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
804 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
805 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
806 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
808 ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | in ata_tf_write()
809 ((request->u.ata.lba >> 24) & 0x0f)); in ata_tf_write()
814 ata_pio_read(struct ata_request *request, int length) in ata_pio_read() argument
816 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read()
823 todo = min(request->transfersize, length); in ata_pio_read()
829 off = request->donecount + done; in ata_pio_read()
830 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_read()
831 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_read()
832 addr = (uint8_t *)request->data + off; in ata_pio_read()
833 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_read()
834 bio = (struct bio *)request->data; in ata_pio_read()
847 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_read()
891 device_printf(request->parent, in ata_pio_read()
893 ata_cmd2str(request), length, done); in ata_pio_read()
900 ata_pio_write(struct ata_request *request, int length) in ata_pio_write() argument
902 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write()
909 todo = min(request->transfersize, length); in ata_pio_write()
915 off = request->donecount + done; in ata_pio_write()
916 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_write()
917 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_write()
918 addr = (uint8_t *)request->data + off; in ata_pio_write()
919 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_write()
920 bio = (struct bio *)request->data; in ata_pio_write()
933 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_write()
982 device_printf(request->parent, in ata_pio_write()
984 ata_cmd2str(request), length, done); in ata_pio_write()