Lines Matching refs:request

67 ata_begin_transaction(struct ata_request *request)  in ata_begin_transaction()  argument
69 struct ata_channel *ch = device_get_softc(request->parent); in ata_begin_transaction()
70 struct ata_device *atadev = device_get_softc(request->dev); in ata_begin_transaction()
73 ATA_DEBUG_RQ(request, "begin transaction"); in ata_begin_transaction()
77 ((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) == in ata_begin_transaction()
79 request->flags &= ~ATA_R_DMA; in ata_begin_transaction()
82 ata_modify_if_48bit(request); in ata_begin_transaction()
84 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) { in ata_begin_transaction()
90 int write = (request->flags & ATA_R_WRITE); in ata_begin_transaction()
93 if (ch->hw.command(request)) { in ata_begin_transaction()
94 device_printf(request->dev, "error issuing %s command\n", in ata_begin_transaction()
95 ata_cmd2str(request)); in ata_begin_transaction()
96 request->result = EIO; in ata_begin_transaction()
101 if (request->u.ata.command == ATA_DEVICE_RESET) { in ata_begin_transaction()
105 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_begin_transaction()
106 } while (request->status & ATA_S_BUSY && timeout--); in ata_begin_transaction()
107 if (request->status & ATA_S_ERROR) in ata_begin_transaction()
108 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_begin_transaction()
115 device_printf(request->dev, in ata_begin_transaction()
117 request->result = EIO; in ata_begin_transaction()
120 ata_pio_write(request, request->transfersize); 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()
131 device_printf(request->dev, "setting up DMA failed\n"); in ata_begin_transaction()
132 request->result = error; in ata_begin_transaction()
137 if (ch->hw.command(request)) { in ata_begin_transaction()
138 device_printf(request->dev, "error issuing %s command\n", in ata_begin_transaction()
139 ata_cmd2str(request)); in ata_begin_transaction()
140 request->result = EIO; in ata_begin_transaction()
145 if (ch->dma->start && ch->dma->start(request->dev)) { in ata_begin_transaction()
146 device_printf(request->dev, "error starting DMA\n"); in ata_begin_transaction()
147 request->result = EIO; in ata_begin_transaction()
155 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
159 request->result = EBUSY; in ata_begin_transaction()
164 if (ch->hw.command(request)) { in ata_begin_transaction()
165 device_printf(request->dev, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
166 request->result = EIO; in ata_begin_transaction()
174 if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { in ata_begin_transaction()
178 request->result = EBUSY; 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()
186 device_printf(request->dev, "setting up DMA failed\n"); in ata_begin_transaction()
187 request->result = error; in ata_begin_transaction()
192 if (ch->hw.command(request)) { in ata_begin_transaction()
193 device_printf(request->dev, "error issuing ATA PACKET command\n"); in ata_begin_transaction()
194 request->result = EIO; in ata_begin_transaction()
199 if (ch->dma->start && ch->dma->start(request->dev)) { in ata_begin_transaction()
200 request->result = EIO; in ata_begin_transaction()
215 callout_reset(&request->callout, request->timeout * hz, in ata_begin_transaction()
216 (timeout_t*)ata_timeout, request); in ata_begin_transaction()
222 ata_end_transaction(struct ata_request *request) in ata_end_transaction() argument
224 struct ata_channel *ch = device_get_softc(request->parent); in ata_end_transaction()
225 struct ata_device *atadev = device_get_softc(request->dev); in ata_end_transaction()
228 ATA_DEBUG_RQ(request, "end transaction"); in ata_end_transaction()
231 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
233 switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_CONTROL)) { in ata_end_transaction()
239 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
243 if (request->flags & ATA_R_CONTROL) { in ata_end_transaction()
244 ch->hw.tf_read(request); in ata_end_transaction()
248 if (request->status & ATA_S_ERROR) { in ata_end_transaction()
249 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
254 if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { in ata_end_transaction()
257 if (request->flags & ATA_R_READ) { in ata_end_transaction()
260 if (request->u.ata.command != ATA_ATAPI_IDENTIFY) in ata_end_transaction()
263 device_printf(request->dev, in ata_end_transaction()
265 request->result = EIO; in ata_end_transaction()
268 ata_pio_read(request, request->transfersize); in ata_end_transaction()
272 request->donecount += request->transfersize; in ata_end_transaction()
275 if (request->bytecount > request->donecount) { in ata_end_transaction()
278 request->transfersize = in ata_end_transaction()
279 min((request->bytecount - request->donecount), in ata_end_transaction()
280 request->transfersize); in ata_end_transaction()
283 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
287 device_printf(request->dev, in ata_end_transaction()
289 request->status = ATA_IDX_INB(ch, ATA_STATUS); in ata_end_transaction()
294 ata_pio_write(request, request->transfersize); in ata_end_transaction()
299 if (request->flags & ATA_R_READ) in ata_end_transaction()
311 request->dmastat = ch->dma->stop(request->dev); in ata_end_transaction()
314 if (request->status & ATA_S_ERROR) in ata_end_transaction()
315 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
316 else if (request->dmastat & ATA_BMSTAT_ERROR) in ata_end_transaction()
317 request->status |= ATA_S_ERROR; in ata_end_transaction()
318 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
319 request->donecount = request->bytecount; in ata_end_transaction()
332 if (request->flags & ATA_R_TIMEOUT) in ata_end_transaction()
336 (request->status & ATA_S_DRQ)) { in ata_end_transaction()
342 if (!(request->status & ATA_S_DRQ)) { in ata_end_transaction()
343 device_printf(request->dev, "command interrupt without DRQ\n"); in ata_end_transaction()
344 request->status = ATA_S_ERROR; in ata_end_transaction()
347 ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, in ata_end_transaction()
354 if (request->flags & ATA_R_READ) { in ata_end_transaction()
355 request->status = ATA_S_ERROR; in ata_end_transaction()
356 device_printf(request->dev, in ata_end_transaction()
358 ata_cmd2str(request)); in ata_end_transaction()
361 ata_pio_write(request, length); in ata_end_transaction()
362 request->donecount += length; in ata_end_transaction()
365 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
366 request->transfersize); in ata_end_transaction()
371 if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
372 request->status = ATA_S_ERROR; in ata_end_transaction()
373 device_printf(request->dev, in ata_end_transaction()
375 ata_cmd2str(request)); in ata_end_transaction()
378 ata_pio_read(request, length); in ata_end_transaction()
379 request->donecount += length; in ata_end_transaction()
382 request->transfersize = min((request->bytecount-request->donecount), in ata_end_transaction()
383 request->transfersize); in ata_end_transaction()
388 device_printf(request->dev, in ata_end_transaction()
390 ata_cmd2str(request)); in ata_end_transaction()
391 if (request->flags & ATA_R_READ) { in ata_end_transaction()
392 ata_pio_read(request, length); in ata_end_transaction()
393 request->donecount += length; in ata_end_transaction()
395 else if (request->flags & ATA_R_WRITE) { in ata_end_transaction()
396 ata_pio_write(request, length); in ata_end_transaction()
397 request->donecount += length; in ata_end_transaction()
400 request->status = ATA_S_ERROR; in ata_end_transaction()
405 if (request->status & (ATA_S_ERROR | ATA_S_DWF)) in ata_end_transaction()
406 request->error = ATA_IDX_INB(ch, ATA_ERROR); in ata_end_transaction()
410 device_printf(request->dev, "unknown transfer phase\n"); in ata_end_transaction()
411 request->status = ATA_S_ERROR; in ata_end_transaction()
422 request->dmastat = ch->dma->stop(request->dev); 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()
427 else if (request->dmastat & ATA_BMSTAT_ERROR) in ata_end_transaction()
428 request->status |= ATA_S_ERROR; in ata_end_transaction()
429 else if (!(request->flags & ATA_R_TIMEOUT)) in ata_end_transaction()
430 request->donecount = request->bytecount; in ata_end_transaction()
442 callout_cancel(&request->callout); in ata_end_transaction()
649 ata_generic_command(struct ata_request *request) in ata_generic_command() argument
651 struct ata_channel *ch = device_get_softc(request->parent); in ata_generic_command()
652 struct ata_device *atadev = device_get_softc(request->dev); in ata_generic_command()
659 device_printf(request->dev, "timeout waiting to issue command\n"); in ata_generic_command()
666 if (request->flags & ATA_R_ATAPI) { in ata_generic_command()
670 if (request->flags & ATA_R_DMA) { 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()
697 device_printf(request->dev, "timeout waiting for ATAPI ready\n"); in ata_generic_command()
698 request->result = EIO; 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()
720 ata_tf_read(struct ata_request *request) in ata_tf_read() argument
722 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_read()
723 struct ata_device *atadev = device_get_softc(request->dev); in ata_tf_read()
727 request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); in ata_tf_read()
728 request->u.ata.lba = in ata_tf_read()
734 request->u.ata.count |= ATA_IDX_INB(ch, ATA_COUNT); in ata_tf_read()
735 request->u.ata.lba |= 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()
750 ata_tf_write(struct ata_request *request) in ata_tf_write() argument
752 struct ata_channel *ch = device_get_softc(request->parent); in ata_tf_write()
753 struct ata_device *atadev = device_get_softc(request->dev); in ata_tf_write()
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()
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()
785 (request->u.ata.lba / (sectors * heads))); in ata_tf_write()
787 (request->u.ata.lba / (sectors * heads)) >> 8); in ata_tf_write()
789 (((request->u.ata.lba% (sectors * heads)) / 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()
798 ((request->u.ata.lba >> 24) & 0x0f)); in ata_tf_write()
804 ata_pio_read(struct ata_request *request, int length) in ata_pio_read() argument
806 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_read()
807 int size = min(request->transfersize, length); in ata_pio_read()
812 (void*)((uintptr_t)request->data+request->donecount), in ata_pio_read()
816 (void*)((uintptr_t)request->data+request->donecount), in ata_pio_read()
819 if (request->transfersize < length) { in ata_pio_read()
820 device_printf(request->dev, "WARNING - %s read data overrun %d>%d\n", in ata_pio_read()
821 ata_cmd2str(request), length, request->transfersize); in ata_pio_read()
822 for (resid = request->transfersize; resid < length; in ata_pio_read()
829 ata_pio_write(struct ata_request *request, int length) in ata_pio_write() argument
831 struct ata_channel *ch = device_get_softc(request->parent); in ata_pio_write()
832 int size = min(request->transfersize, length); in ata_pio_write()
837 (void*)((uintptr_t)request->data+request->donecount), in ata_pio_write()
841 (void*)((uintptr_t)request->data+request->donecount), in ata_pio_write()
844 if (request->transfersize < length) { in ata_pio_write()
845 device_printf(request->dev, "WARNING - %s write data underrun %d>%d\n", in ata_pio_write()
846 ata_cmd2str(request), length, request->transfersize); in ata_pio_write()
847 for (resid = request->transfersize; resid < length; in ata_pio_write()