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()
107 int write = (request->flags & ATA_R_WRITE); in ata_begin_transaction()
110 if (ch->hw.command(request)) { in ata_begin_transaction()
111 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
112 ata_cmd2str(request)); in ata_begin_transaction()
113 request->result = EIO; in ata_begin_transaction()
118 if (request->u.ata.command == ATA_DEVICE_RESET) { in ata_begin_transaction()
123 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
124 } while (request->status & ATA_S_BUSY && timeout--); in ata_begin_transaction()
125 if (request->status & ATA_S_ERROR) in ata_begin_transaction()
126 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_begin_transaction()
127 ch->hw.tf_read(request); in ata_begin_transaction()
133 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_begin_transaction()
134 device_printf(request->parent, in ata_begin_transaction()
136 request->result = EIO; in ata_begin_transaction()
139 ata_pio_write(request, request->transfersize); in ata_begin_transaction()
147 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
148 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
149 request->result = error; in ata_begin_transaction()
155 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
156 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
157 request->result = EIO; in ata_begin_transaction()
162 if (ch->hw.command(request)) { in ata_begin_transaction()
163 device_printf(request->parent, "error issuing %s command\n", in ata_begin_transaction()
164 ata_cmd2str(request)); in ata_begin_transaction()
165 request->result = EIO; in ata_begin_transaction()
171 ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
172 device_printf(request->parent, "error starting DMA\n"); in ata_begin_transaction()
173 request->result = EIO; in ata_begin_transaction()
181 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
182 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
185 request->result = EBUSY; in ata_begin_transaction()
190 if (ch->hw.command(request)) { in ata_begin_transaction()
191 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
192 request->result = EIO; in ata_begin_transaction()
200 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
201 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); in ata_begin_transaction()
204 request->result = EBUSY; in ata_begin_transaction()
209 if ((error = ch->dma.load(request, NULL, &dummy))) { in ata_begin_transaction()
210 device_printf(request->parent, "setting up DMA failed\n"); in ata_begin_transaction()
211 request->result = error; in ata_begin_transaction()
216 if (ch->hw.command(request)) { in ata_begin_transaction()
217 device_printf(request->parent, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
218 request->result = EIO; in ata_begin_transaction()
223 if (ch->dma.start && ch->dma.start(request)) { in ata_begin_transaction()
224 request->result = EIO; in ata_begin_transaction()
234 ch->dma.unload(request); in ata_begin_transaction()
239 callout_reset(&request->callout, request->timeout * hz, in ata_begin_transaction()
240 (timeout_t*)ata_timeout, request); in ata_begin_transaction()
246 ata_end_transaction(struct ata_request *request) in ata_end_transaction() argument
248 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction()
251 ATA_DEBUG_RQ(request, "end transaction"); in ata_end_transaction()
254 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
256 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_CONTROL)) { in ata_end_transaction()
262 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
266 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
267 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
268 ch->hw.tf_read(request); in ata_end_transaction()
272 if (request->status & ATA_S_ERROR) { in ata_end_transaction()
273 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
278 if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { in ata_end_transaction()
281 if (request->flags & ATA_R_READ) { in ata_end_transaction()
284 if (request->u.ata.command != ATA_ATAPI_IDENTIFY) in ata_end_transaction()
286 if (ata_wait(ch, request->unit, flags) < 0) { in ata_end_transaction()
287 device_printf(request->parent, in ata_end_transaction()
289 request->result = EIO; in ata_end_transaction()
292 ata_pio_read(request, request->transfersize); in ata_end_transaction()
296 request->donecount += request->transfersize; in ata_end_transaction()
299 if (request->bytecount > request->donecount) { in ata_end_transaction()
302 request->transfersize = in ata_end_transaction()
303 min((request->bytecount - request->donecount), in ata_end_transaction()
304 request->transfersize); in ata_end_transaction()
307 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
310 if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { in ata_end_transaction()
311 device_printf(request->parent, in ata_end_transaction()
313 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
318 ata_pio_write(request, request->transfersize); in ata_end_transaction()
323 if (request->flags & ATA_R_READ) in ata_end_transaction()
335 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
338 if (request->status & ATA_S_ERROR) in ata_end_transaction()
339 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
340 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
341 request->status |= ATA_S_ERROR; in ata_end_transaction()
342 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
343 request->donecount = request->bytecount; in ata_end_transaction()
346 if ((request->status & ATA_S_ERROR) || in ata_end_transaction()
347 (request->flags & (ATA_R_CONTROL | ATA_R_NEEDRESULT))) { in ata_end_transaction()
348 ch->hw.tf_read(request); in ata_end_transaction()
352 ch->dma.unload(request); in ata_end_transaction()
362 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
366 (request->status & ATA_S_DRQ)) { in ata_end_transaction()
372 if (!(request->status & ATA_S_DRQ)) { in ata_end_transaction()
373 device_printf(request->parent, "command interrupt without DRQ\n"); in ata_end_transaction()
374 request->status = ATA_S_ERROR; in ata_end_transaction()
377 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
378 (request->flags & ATA_R_ATAPI16) ? 8 : 6); in ata_end_transaction()
383 if (request->flags & ATA_R_READ) { in ata_end_transaction()
384 request->status = ATA_S_ERROR; in ata_end_transaction()
385 device_printf(request->parent, in ata_end_transaction()
387 ata_cmd2str(request)); in ata_end_transaction()
390 ata_pio_write(request, length); in ata_end_transaction()
391 request->donecount += length; in ata_end_transaction()
394 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
395 request->transfersize); in ata_end_transaction()
400 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
401 request->status = ATA_S_ERROR; in ata_end_transaction()
402 device_printf(request->parent, in ata_end_transaction()
404 ata_cmd2str(request)); in ata_end_transaction()
407 ata_pio_read(request, length); in ata_end_transaction()
408 request->donecount += length; in ata_end_transaction()
411 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
412 request->transfersize); in ata_end_transaction()
417 device_printf(request->parent, in ata_end_transaction()
419 ata_cmd2str(request)); in ata_end_transaction()
420 if (request->flags & ATA_R_READ) { in ata_end_transaction()
421 ata_pio_read(request, length); in ata_end_transaction()
422 request->donecount += length; in ata_end_transaction()
424 else if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
425 ata_pio_write(request, length); in ata_end_transaction()
426 request->donecount += length; in ata_end_transaction()
429 request->status = ATA_S_ERROR; in ata_end_transaction()
434 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
435 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
439 device_printf(request->parent, "unknown transfer phase\n"); in ata_end_transaction()
440 request->status = ATA_S_ERROR; in ata_end_transaction()
451 request->dma->status = ch->dma.stop(request); in ata_end_transaction()
454 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
455 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
456 else if (request->dma->status & ATA_BMSTAT_ERROR) in ata_end_transaction()
457 request->status |= ATA_S_ERROR; in ata_end_transaction()
458 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
459 request->donecount = request->bytecount; in ata_end_transaction()
462 ch->dma.unload(request); in ata_end_transaction()
471 callout_stop(&request->callout); in ata_end_transaction()
680 ata_generic_command(struct ata_request *request) in ata_generic_command() argument
682 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command()
685 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit)); in ata_generic_command()
688 if (ata_wait(ch, request->unit, 0) < 0) { in ata_generic_command()
689 device_printf(request->parent, "timeout waiting to issue command\n"); in ata_generic_command()
690 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
697 if (request->flags & ATA_R_ATAPI) { in ata_generic_command()
702 if (request->flags & ATA_R_DMA) { in ata_generic_command()
709 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->transfersize); in ata_generic_command()
710 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->transfersize >> 8); in ata_generic_command()
715 if (request->flags & ATA_R_ATAPI_INTR) in ata_generic_command()
719 res = ata_wait(ch, request->unit, 0); in ata_generic_command()
722 device_printf(request->parent, in ata_generic_command()
724 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
739 device_printf(request->parent, in ata_generic_command()
741 request->flags |= ATA_R_TIMEOUT; in ata_generic_command()
749 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_generic_command()
750 (request->flags & ATA_R_ATAPI16) ? 8 : 6); in ata_generic_command()
753 ch->hw.tf_write(request); in ata_generic_command()
756 ATA_IDX_OUTB(ch, ATA_COMMAND, request->u.ata.command); in ata_generic_command()
762 ata_tf_read(struct ata_request *request) in ata_tf_read() argument
764 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read()
766 if (request->flags & ATA_R_48BIT) { in ata_tf_read()
768 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); 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 |= in ata_tf_read()
782 request->u.ata.count = ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
783 request->u.ata.lba = ATA_IDX_INB(ch, ATA_SECTOR) | in ata_tf_read()
791 ata_tf_write(struct ata_request *request) in ata_tf_write() argument
793 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write()
795 if (request->flags & ATA_R_48BIT) { in ata_tf_write()
796 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature >> 8); in ata_tf_write()
797 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
798 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count >> 8); in ata_tf_write()
799 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
800 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba >> 24); in ata_tf_write()
801 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
802 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 32); 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 >> 40); in ata_tf_write()
805 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
806 ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); in ata_tf_write()
809 ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); in ata_tf_write()
810 ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); in ata_tf_write()
811 ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); in ata_tf_write()
812 ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); in ata_tf_write()
813 ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); in ata_tf_write()
815 ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | in ata_tf_write()
816 ((request->u.ata.lba >> 24) & 0x0f)); in ata_tf_write()
821 ata_pio_read(struct ata_request *request, int length) in ata_pio_read() argument
823 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read()
830 todo = min(request->transfersize, length); in ata_pio_read()
836 off = request->donecount + done; in ata_pio_read()
837 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_read()
838 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_read()
839 addr = (uint8_t *)request->data + off; in ata_pio_read()
840 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_read()
841 bio = (struct bio *)request->data; in ata_pio_read()
854 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_read()
898 device_printf(request->parent, in ata_pio_read()
900 ata_cmd2str(request), length, done); in ata_pio_read()
907 ata_pio_write(struct ata_request *request, int length) in ata_pio_write() argument
909 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write()
916 todo = min(request->transfersize, length); in ata_pio_write()
922 off = request->donecount + done; in ata_pio_write()
923 if ((request->flags & ATA_R_DATA_IN_CCB) == 0 || in ata_pio_write()
924 (request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) { in ata_pio_write()
925 addr = (uint8_t *)request->data + off; in ata_pio_write()
926 } else if ((request->ccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_BIO) { in ata_pio_write()
927 bio = (struct bio *)request->data; in ata_pio_write()
940 (request->ccb->ccb_h.flags & CAM_DATA_MASK)); in ata_pio_write()
989 device_printf(request->parent, in ata_pio_write()
991 ata_cmd2str(request), length, done); in ata_pio_write()