Lines Matching refs:request

83 ata_begin_transaction(struct ata_request *request)  in ata_begin_transaction()  argument
85 struct ata_channel *ch = device_get_softc(request->parent); in ata_begin_transaction()
88 ATA_DEBUG_RQ(request, "begin transaction"); in ata_begin_transaction()
92 (request->flags & ATA_R_ATAPI) == ATA_R_ATAPI) in ata_begin_transaction()
93 request->flags &= ~ATA_R_DMA; in ata_begin_transaction()
95 ((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) == in ata_begin_transaction()
97 request->flags &= ~ATA_R_DMA; in ata_begin_transaction()
99 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) { in ata_begin_transaction()
104 int write = (request->flags & ATA_R_WRITE); in ata_begin_transaction()
107 if (ch->hw.command(request)) { in ata_begin_transaction()
108 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
109 ata_cmd2str(request)); in ata_begin_transaction()
110 request->result = EIO; in ata_begin_transaction()
115 if (request->u.ata.command == ATA_DEVICE_RESET) { in ata_begin_transaction()
119 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
120 } while (request->status & ATA_S_BUSY && timeout--); in ata_begin_transaction()
121 if (request->status & ATA_S_ERROR) 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()
130 device_printf(request->parent, in ata_begin_transaction()
132 request->result = EIO; in ata_begin_transaction()
135 ata_pio_write(request, request->transfersize); in ata_begin_transaction()
143 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
144 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
145 request->result = error; in ata_begin_transaction()
151 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
152 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
153 request->result = EIO; in ata_begin_transaction()
158 if (ch->hw.command(request)) { in ata_begin_transaction()
159 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
160 ata_cmd2str(request)); in ata_begin_transaction()
161 request->result = EIO; in ata_begin_transaction()
167 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
168 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
169 request->result = EIO; in ata_begin_transaction()
177 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
178 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
181 request->result = EBUSY; in ata_begin_transaction()
186 if (ch->hw.command(request)) { in ata_begin_transaction()
187 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
188 request->result = EIO; in ata_begin_transaction()
196 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
197 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
200 request->result = EBUSY; in ata_begin_transaction()
205 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
206 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
207 request->result = error; in ata_begin_transaction()
212 if (ch->hw.command(request)) { in ata_begin_transaction()
213 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
214 request->result = EIO; in ata_begin_transaction()
219 if (ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
220 request->result = EIO; in ata_begin_transaction()
230 ch->dma.unload(request); in ata_begin_transaction()
235 callout_reset(&request->callout, request->timeout * hz, in ata_begin_transaction()
236 ata_timeout, request); in ata_begin_transaction()
242 ata_end_transaction(struct ata_request *request) in ata_end_transaction() argument
244 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction()
247 ATA_DEBUG_RQ(request, "end transaction"); in ata_end_transaction()
250 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
252 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_CONTROL)) { in ata_end_transaction()
257 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
261 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
262 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
263 ch->hw.tf_read(request); in ata_end_transaction()
267 if (request->status & ATA_S_ERROR) { in ata_end_transaction()
268 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
273 if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { in ata_end_transaction()
275 if (request->flags & ATA_R_READ) { in ata_end_transaction()
278 if (request->u.ata.command != ATA_ATAPI_IDENTIFY) in ata_end_transaction()
280 if (ata_wait(ch, request->unit, flags) < 0) { in ata_end_transaction()
281 device_printf(request->parent, in ata_end_transaction()
283 request->result = EIO; in ata_end_transaction()
286 ata_pio_read(request, request->transfersize); in ata_end_transaction()
290 request->donecount += request->transfersize; in ata_end_transaction()
293 if (request->bytecount > request->donecount) { in ata_end_transaction()
295 request->transfersize = in ata_end_transaction()
296 min((request->bytecount - request->donecount), in ata_end_transaction()
297 request->transfersize); in ata_end_transaction()
300 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
302 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_end_transaction()
303 device_printf(request->parent, in ata_end_transaction()
305 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
310 ata_pio_write(request, request->transfersize); in ata_end_transaction()
315 if (request->flags & ATA_R_READ) in ata_end_transaction()
327 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
330 if (request->status & ATA_S_ERROR) in ata_end_transaction()
331 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
332 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
333 request->status |= ATA_S_ERROR; in ata_end_transaction()
334 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
335 request->donecount = request->bytecount; in ata_end_transaction()
338 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
339 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
340 ch->hw.tf_read(request); in ata_end_transaction()
344 ch->dma.unload(request); in ata_end_transaction()
354 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
358 (request->status & ATA_S_DRQ)) { in ata_end_transaction()
363 if (!(request->status & ATA_S_DRQ)) { in ata_end_transaction()
364 device_printf(request->parent, "command interrupt without DRQ\n"); in ata_end_transaction()
365 request->status = ATA_S_ERROR; in ata_end_transaction()
368 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
369 (request->flags & ATA_R_ATAPI16) ? 8 : 6); in ata_end_transaction()
374 if (request->flags & ATA_R_READ) { in ata_end_transaction()
375 request->status = ATA_S_ERROR; in ata_end_transaction()
376 device_printf(request->parent, in ata_end_transaction()
378 ata_cmd2str(request)); in ata_end_transaction()
381 ata_pio_write(request, length); in ata_end_transaction()
382 request->donecount += length; in ata_end_transaction()
385 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
386 request->transfersize); in ata_end_transaction()
391 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
392 request->status = ATA_S_ERROR; in ata_end_transaction()
393 device_printf(request->parent, in ata_end_transaction()
395 ata_cmd2str(request)); in ata_end_transaction()
398 ata_pio_read(request, length); in ata_end_transaction()
399 request->donecount += length; in ata_end_transaction()
402 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
403 request->transfersize); in ata_end_transaction()
408 device_printf(request->parent, in ata_end_transaction()
410 ata_cmd2str(request)); in ata_end_transaction()
411 if (request->flags & ATA_R_READ) { in ata_end_transaction()
412 ata_pio_read(request, length); in ata_end_transaction()
413 request->donecount += length; in ata_end_transaction()
415 else if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
416 ata_pio_write(request, length); in ata_end_transaction()
417 request->donecount += length; in ata_end_transaction()
420 request->status = ATA_S_ERROR; in ata_end_transaction()
425 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
426 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
430 device_printf(request->parent, "unknown transfer phase\n"); in ata_end_transaction()
431 request->status = ATA_S_ERROR; in ata_end_transaction()
442 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
445 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
446 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
447 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
448 request->status |= ATA_S_ERROR; in ata_end_transaction()
449 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
450 request->donecount = request->bytecount; in ata_end_transaction()
453 ch->dma.unload(request); in ata_end_transaction()
462 callout_stop(&request->callout); in ata_end_transaction()
671 ata_generic_command(struct ata_request *request) in ata_generic_command() argument
673 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command()
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()
680 device_printf(request->parent, "timeout waiting to issue command\n"); in ata_generic_command()
681 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
688 if (request->flags & ATA_R_ATAPI) { in ata_generic_command()
693 if (request->flags & ATA_R_DMA) { 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()
706 if (request->flags & ATA_R_ATAPI_INTR) in ata_generic_command()
710 res = ata_wait(ch, request->unit, 0); in ata_generic_command()
713 device_printf(request->parent, in ata_generic_command()
715 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
730 device_printf(request->parent, in ata_generic_command()
732 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
740 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_generic_command()
741 (request->flags & ATA_R_ATAPI16) ? 8 : 6); 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()
753 ata_tf_read(struct ata_request *request) in ata_tf_read() argument
755 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read()
757 if (request->flags & ATA_R_48BIT) { in ata_tf_read()
759 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); in ata_tf_read()
760 request->u.ata.lba = in ata_tf_read()
766 request->u.ata.count |= ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
767 request->u.ata.lba |= 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()
782 ata_tf_write(struct ata_request *request) in ata_tf_write() argument
784 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write()
786 if (request->flags & ATA_R_48BIT) { in ata_tf_write()
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()
806 ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | in ata_tf_write()
807 ((request->u.ata.lba >> 24) & 0x0f)); in ata_tf_write()
812 ata_pio_read(struct ata_request *request, int length) in ata_pio_read() argument
814 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read()
821 todo = min(request->transfersize, length); in ata_pio_read()
827 off = request->donecount + done; in ata_pio_read()
828 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_read()
829 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_read()
830 addr = (uint8_t *)request->data + off; in ata_pio_read()
831 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_read()
832 bio = (struct bio *)request->data; in ata_pio_read()
845 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_read()
889 device_printf(request->parent, in ata_pio_read()
891 ata_cmd2str(request), length, done); in ata_pio_read()
898 ata_pio_write(struct ata_request *request, int length) in ata_pio_write() argument
900 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write()
907 todo = min(request->transfersize, length); in ata_pio_write()
913 off = request->donecount + done; in ata_pio_write()
914 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_write()
915 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_write()
916 addr = (uint8_t *)request->data + off; in ata_pio_write()
917 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_write()
918 bio = (struct bio *)request->data; in ata_pio_write()
931 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_write()
980 device_printf(request->parent, in ata_pio_write()
982 ata_cmd2str(request), length, done); in ata_pio_write()