Lines Matching refs:request
46 static void ata_sort_queue(struct ata_channel *ch, struct ata_request *request);
66 struct ata_request *request, *tmp; in ata_drop_requests() local
69 TAILQ_FOREACH_MUTABLE(request, &ch->ata_queue, chain, tmp) { in ata_drop_requests()
70 TAILQ_REMOVE(&ch->ata_queue, request, chain); in ata_drop_requests()
71 request->result = ENXIO; in ata_drop_requests()
77 ata_queue_request(struct ata_request *request) in ata_queue_request() argument
82 request->result = request->status = request->error = 0; in ata_queue_request()
85 if (!(request->parent = device_get_parent(request->dev))) { in ata_queue_request()
86 request->result = ENXIO; in ata_queue_request()
87 if (request->callback) in ata_queue_request()
88 (request->callback)(request); in ata_queue_request()
91 ch = device_get_softc(request->parent); in ata_queue_request()
93 callout_init_lk(&request->callout, &ch->state_mtx); in ata_queue_request()
94 if (!request->callback && !(request->flags & ATA_R_REQUEUE)) in ata_queue_request()
95 lockinit(&request->done, "ataqueuerqdone", 0, 0); in ata_queue_request()
98 if ((ch->state & ATA_STALL_QUEUE) && (request->flags & ATA_R_CONTROL)) { in ata_queue_request()
100 ch->running = request; in ata_queue_request()
101 if (ch->hw.begin_transaction(request) == ATA_OP_FINISHED) { in ata_queue_request()
103 if (!request->callback) in ata_queue_request()
104 lockuninit(&request->done); in ata_queue_request()
109 request->flags |= ATA_R_HWCMDQUEUED; in ata_queue_request()
115 if (request->flags & ATA_R_AT_HEAD) { in ata_queue_request()
116 TAILQ_INSERT_HEAD(&ch->ata_queue, request, chain); in ata_queue_request()
117 } else if (request->flags & ATA_R_ORDERED) { in ata_queue_request()
118 ata_sort_queue(ch, request); in ata_queue_request()
120 TAILQ_INSERT_TAIL(&ch->ata_queue, request, chain); in ata_queue_request()
124 ATA_DEBUG_RQ(request, "queued"); in ata_queue_request()
129 if (request->flags & ATA_R_REQUEUE) in ata_queue_request()
133 if (!request->callback) { in ata_queue_request()
134 ATA_DEBUG_RQ(request, "wait for completion"); in ata_queue_request()
137 lockmgr(&request->done, LK_EXCLUSIVE); in ata_queue_request()
139 if (!(request->flags & ATA_R_COMPLETED)) in ata_queue_request()
140 lksleep(request, &request->done, 0, "ATA request completion " in ata_queue_request()
141 "wait", request->timeout * hz * 4); in ata_queue_request()
142 lockmgr(&request->done, LK_RELEASE); in ata_queue_request()
144 if (!(request->flags & ATA_R_COMPLETED)) { in ata_queue_request()
146 device_printf(request->dev, "WARNING - %s taskqueue timeout - " in ata_queue_request()
148 ata_cmd2str(request)); in ata_queue_request()
149 request->flags |= ATA_R_DANGER1; in ata_queue_request()
150 ata_completed(request, 0); in ata_queue_request()
153 lockuninit(&request->done); in ata_queue_request()
162 struct ata_request *request = ata_alloc_request(); in ata_controlcmd() local
165 if (request) { in ata_controlcmd()
166 request->dev = dev; in ata_controlcmd()
167 request->u.ata.command = command; in ata_controlcmd()
168 request->u.ata.lba = lba; in ata_controlcmd()
169 request->u.ata.count = count; in ata_controlcmd()
170 request->u.ata.feature = feature; in ata_controlcmd()
171 request->flags = ATA_R_CONTROL; in ata_controlcmd()
175 request->timeout = MAX(ATA_DEFAULT_TIMEOUT, 31); in ata_controlcmd()
177 request->timeout = ATA_DEFAULT_TIMEOUT; in ata_controlcmd()
179 request->retries = 0; in ata_controlcmd()
180 ata_queue_request(request); in ata_controlcmd()
181 error = request->result; in ata_controlcmd()
182 ata_free_request(request); in ata_controlcmd()
191 struct ata_request *request = ata_alloc_request(); in ata_atapicmd() local
195 if (request) { in ata_atapicmd()
196 request->dev = dev; in ata_atapicmd()
198 bcopy(ccb, request->u.atapi.ccb, 12); in ata_atapicmd()
200 bcopy(ccb, request->u.atapi.ccb, 16); in ata_atapicmd()
201 request->data = data; in ata_atapicmd()
202 request->bytecount = count; in ata_atapicmd()
203 request->transfersize = min(request->bytecount, 65534); in ata_atapicmd()
204 request->flags = flags | ATA_R_ATAPI; in ata_atapicmd()
205 request->timeout = timeout; in ata_atapicmd()
206 request->retries = 0; in ata_atapicmd()
207 ata_queue_request(request); in ata_atapicmd()
208 error = request->result; in ata_atapicmd()
209 ata_free_request(request); in ata_atapicmd()
218 struct ata_request *request; in ata_start() local
224 if ((request = TAILQ_FIRST(&ch->ata_queue))) { in ata_start()
230 if ((cptr = request->composite)) { in ata_start()
232 if ((request->flags & ATA_R_WRITE) && in ata_start()
242 ATA_DEBUG_RQ(request, "starting"); in ata_start()
244 if (ch->transition == request) in ata_start()
245 ch->transition = TAILQ_NEXT(request, chain); in ata_start()
246 TAILQ_REMOVE(&ch->ata_queue, request, chain); in ata_start()
247 ch->running = request; in ata_start()
250 if (ch->hw.begin_transaction(request) == ATA_OP_FINISHED) { in ata_start()
256 ata_finish(request); in ata_start()
261 request->flags |= ATA_R_HWCMDQUEUED; in ata_start()
278 ata_finish(struct ata_request *request) in ata_finish() argument
280 struct ata_channel *ch = device_get_softc(request->parent); in ata_finish()
287 (ch->state & ATA_STALL_QUEUE) || (request->flags & ATA_R_DIRECT)) { in ata_finish()
288 ATA_DEBUG_RQ(request, "finish directly"); in ata_finish()
289 ata_completed(request, 0); in ata_finish()
294 TASK_INIT(&request->task, 0, ata_completed, request); in ata_finish()
295 ATA_DEBUG_RQ(request, "finish taskqueue_swi_mp"); in ata_finish()
296 taskqueue_enqueue(taskqueue_swi_mp, &request->task); in ata_finish()
303 struct ata_request *request = (struct ata_request *)context; in ata_completed() local
304 struct ata_channel *ch = device_get_softc(request->parent); in ata_completed()
305 struct ata_device *atadev = device_get_softc(request->dev); in ata_completed()
308 if (request->flags & ATA_R_DANGER2) { in ata_completed()
309 device_printf(request->dev, in ata_completed()
311 ata_cmd2str(request)); in ata_completed()
312 request->flags &= ~(ATA_R_DANGER1 | ATA_R_DANGER2); in ata_completed()
313 ata_free_request(request); in ata_completed()
316 if (request->flags & ATA_R_DANGER1) in ata_completed()
317 request->flags |= ATA_R_DANGER2; in ata_completed()
319 ATA_DEBUG_RQ(request, "completed entered"); in ata_completed()
322 if (request->flags & ATA_R_TIMEOUT) { in ata_completed()
329 if (ch && !ata_reinit(ch->dev) && !request->result && in ata_completed()
330 (request->retries-- > 0)) { in ata_completed()
331 if (!(request->flags & ATA_R_QUIET)) { in ata_completed()
332 device_printf(request->dev, in ata_completed()
334 ata_cmd2str(request), request->retries, in ata_completed()
335 request->retries == 1 ? "y" : "ies"); in ata_completed()
336 if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) in ata_completed()
337 kprintf(" LBA=%ju", request->u.ata.lba); in ata_completed()
340 request->flags &= ~(ATA_R_TIMEOUT | ATA_R_DEBUG); in ata_completed()
341 request->flags |= (ATA_R_AT_HEAD | ATA_R_REQUEUE); in ata_completed()
342 ATA_DEBUG_RQ(request, "completed reinject"); in ata_completed()
343 ata_queue_request(request); in ata_completed()
348 if (!request->result) { in ata_completed()
349 if (!(request->flags & ATA_R_QUIET)) { in ata_completed()
350 if (request->dev) { in ata_completed()
351 device_printf(request->dev, "FAILURE - %s timed out", in ata_completed()
352 ata_cmd2str(request)); in ata_completed()
353 if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) in ata_completed()
354 kprintf(" LBA=%ju", request->u.ata.lba); in ata_completed()
358 request->result = EIO; in ata_completed()
361 else if (!(request->flags & ATA_R_ATAPI) ){ in ata_completed()
364 if ((request->status & (ATA_S_CORR | ATA_S_ERROR)) == ATA_S_CORR) { in ata_completed()
365 device_printf(request->dev, in ata_completed()
367 ata_cmd2str(request)); in ata_completed()
368 if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) in ata_completed()
369 kprintf(" LBA=%ju", request->u.ata.lba); in ata_completed()
374 if (request->flags & ATA_R_DMA && request->error & ATA_E_ICRC) { in ata_completed()
375 if (request->retries-- > 0) { in ata_completed()
376 device_printf(request->dev, in ata_completed()
378 ata_cmd2str(request)); in ata_completed()
379 if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) in ata_completed()
380 kprintf(" LBA=%ju", request->u.ata.lba); in ata_completed()
382 request->flags |= (ATA_R_AT_HEAD | ATA_R_REQUEUE); in ata_completed()
383 ata_queue_request(request); in ata_completed()
389 switch (request->flags & ATA_R_ATAPI) { in ata_completed()
393 if (!request->result && request->status & ATA_S_ERROR) { in ata_completed()
394 if (!(request->flags & ATA_R_QUIET)) { in ata_completed()
395 device_printf(request->dev, in ata_completed()
397 ata_cmd2str(request), in ata_completed()
400 request->status, in ata_completed()
405 request->error); in ata_completed()
406 if ((request->flags & ATA_R_DMA) && in ata_completed()
407 (request->dmastat & ATA_BMSTAT_ERROR)) in ata_completed()
408 kprintf(" dma=0x%02x", request->dmastat); in ata_completed()
409 if (!(request->flags & (ATA_R_ATAPI | ATA_R_CONTROL))) in ata_completed()
410 kprintf(" LBA=%ju", request->u.ata.lba); in ata_completed()
413 request->result = EIO; in ata_completed()
420 if (request->result) in ata_completed()
424 if ((request->error & ATA_E_ATAPI_SENSE_MASK) && in ata_completed()
425 (request->u.atapi.ccb[0] != ATAPI_REQUEST_SENSE)) { in ata_completed()
430 request->u.atapi.saved_cmd = request->u.atapi.ccb[0]; in ata_completed()
431 bcopy(ccb, request->u.atapi.ccb, 16); in ata_completed()
432 request->data = (caddr_t)&request->u.atapi.sense; in ata_completed()
433 request->bytecount = sizeof(struct atapi_sense); in ata_completed()
434 request->donecount = 0; in ata_completed()
435 request->transfersize = sizeof(struct atapi_sense); in ata_completed()
436 request->timeout = ATA_DEFAULT_TIMEOUT; in ata_completed()
437 request->flags &= (ATA_R_ATAPI | ATA_R_QUIET); in ata_completed()
438 request->flags |= (ATA_R_READ | ATA_R_AT_HEAD | ATA_R_REQUEUE); in ata_completed()
439 ATA_DEBUG_RQ(request, "autoissue request sense"); in ata_completed()
440 ata_queue_request(request); in ata_completed()
444 switch (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK) { in ata_completed()
446 device_printf(request->dev, "WARNING - %s recovered error\n", in ata_completed()
447 ata_cmd2str(request)); in ata_completed()
451 request->result = 0; in ata_completed()
455 request->result = EBUSY; in ata_completed()
460 request->result = EIO; in ata_completed()
464 request->result = EIO; in ata_completed()
465 if (request->flags & ATA_R_QUIET) in ata_completed()
468 device_printf(request->dev, in ata_completed()
470 ata_cmd2str(request), ata_skey2str( in ata_completed()
471 (request->u.atapi.sense.key & ATA_SENSE_KEY_MASK)), in ata_completed()
472 request->u.atapi.sense.asc, in ata_completed()
473 request->u.atapi.sense.ascq); in ata_completed()
474 if (request->u.atapi.sense.specific & ATA_SENSE_SPEC_VALID) in ata_completed()
476 request->u.atapi.sense.specific & ATA_SENSE_SPEC_MASK, in ata_completed()
477 request->u.atapi.sense.specific1, in ata_completed()
478 request->u.atapi.sense.specific2); in ata_completed()
483 if ((request->u.atapi.sense.key & ATA_SENSE_KEY_MASK ? in ata_completed()
484 request->u.atapi.sense.key & ATA_SENSE_KEY_MASK : in ata_completed()
485 request->error)) in ata_completed()
486 request->result = EIO; in ata_completed()
489 ATA_DEBUG_RQ(request, "completed callback/wakeup"); in ata_completed()
492 if ((composite = request->composite)) { in ata_completed()
498 if (request->flags & ATA_R_READ) in ata_completed()
499 composite->rd_done |= (1 << request->this); in ata_completed()
500 if (request->flags & ATA_R_WRITE) in ata_completed()
501 composite->wr_done |= (1 << request->this); in ata_completed()
518 ata_start(device_get_parent(composite->request[bit]->dev)); in ata_completed()
524 if (request->callback) in ata_completed()
525 (request->callback)(request); in ata_completed()
527 lockmgr(&request->done, LK_EXCLUSIVE); in ata_completed()
528 request->flags |= ATA_R_COMPLETED; in ata_completed()
529 lockmgr(&request->done, LK_RELEASE); in ata_completed()
530 wakeup_one(request); in ata_completed()
539 ata_timeout(struct ata_request *request) in ata_timeout() argument
541 struct ata_channel *ch = device_get_softc(request->parent); in ata_timeout()
547 ATA_DEBUG_RQ(request, "timeout"); in ata_timeout()
556 request->flags |= ATA_R_TIMEOUT; in ata_timeout()
559 ata_finish(request); in ata_timeout()
568 struct ata_request *request, *tmp; in ata_fail_requests() local
577 if ((request = ch->running) && (!dev || request->dev == dev)) { in ata_fail_requests()
578 callout_cancel(&request->callout); in ata_fail_requests()
580 request->result = ENXIO; in ata_fail_requests()
581 TAILQ_INSERT_TAIL(&fail_requests, request, chain); in ata_fail_requests()
585 TAILQ_FOREACH_MUTABLE(request, &ch->ata_queue, chain, tmp) { in ata_fail_requests()
586 if (!dev || request->dev == dev) { in ata_fail_requests()
587 if (ch->transition == request) in ata_fail_requests()
588 ch->transition = TAILQ_NEXT(request, chain); in ata_fail_requests()
589 TAILQ_REMOVE(&ch->ata_queue, request, chain); in ata_fail_requests()
590 request->result = ENXIO; in ata_fail_requests()
591 TAILQ_INSERT_TAIL(&fail_requests, request, chain); in ata_fail_requests()
599 TAILQ_FOREACH_MUTABLE(request, &fail_requests, chain, tmp) { in ata_fail_requests()
600 TAILQ_REMOVE(&fail_requests, request, chain); in ata_fail_requests()
601 ata_finish(request); in ata_fail_requests()
606 ata_get_lba(struct ata_request *request) in ata_get_lba() argument
608 if (request->flags & ATA_R_ATAPI) { in ata_get_lba()
609 switch (request->u.atapi.ccb[0]) { in ata_get_lba()
613 return (request->u.atapi.ccb[5]) | (request->u.atapi.ccb[4]<<8) | in ata_get_lba()
614 (request->u.atapi.ccb[3]<<16)|(request->u.atapi.ccb[2]<<24); in ata_get_lba()
617 return (request->u.atapi.ccb[4]) | (request->u.atapi.ccb[3]<<8) | in ata_get_lba()
618 (request->u.atapi.ccb[2]<<16); in ata_get_lba()
624 return request->u.ata.lba; in ata_get_lba()
634 ata_sort_queue(struct ata_channel *ch, struct ata_request *request) in ata_sort_queue() argument
636 if ((request->flags & ATA_R_WRITE) == 0) { in ata_sort_queue()
641 TAILQ_INSERT_BEFORE(ch->transition, request, chain); in ata_sort_queue()
651 TAILQ_INSERT_TAIL(&ch->ata_queue, request, chain); in ata_sort_queue()
659 TAILQ_INSERT_TAIL(&ch->ata_queue, request, chain); in ata_sort_queue()
661 ch->transition = request; in ata_sort_queue()
663 if (request->composite) { in ata_sort_queue()
695 ata_cmd2str(struct ata_request *request) in ata_cmd2str() argument
699 if (request->flags & ATA_R_ATAPI) { in ata_cmd2str()
700 switch (request->u.atapi.sense.key ? in ata_cmd2str()
701 request->u.atapi.saved_cmd : request->u.atapi.ccb[0]) { in ata_cmd2str()
757 switch (request->u.ata.command) { in ata_cmd2str()
789 switch (request->u.ata.feature) { in ata_cmd2str()
796 ksprintf(buffer, "SETFEATURES 0x%02x", request->u.ata.feature); in ata_cmd2str()
801 ksprintf(buffer, "unknown CMD (0x%02x)", request->u.ata.command); in ata_cmd2str()