Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167958587
D58945.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D58945.id.diff
View Options
diff --git a/sys/dev/ufshci/ufshci_req_queue.c b/sys/dev/ufshci/ufshci_req_queue.c
--- a/sys/dev/ufshci/ufshci_req_queue.c
+++ b/sys/dev/ufshci/ufshci_req_queue.c
@@ -182,29 +182,6 @@
ufshci_req_queue_complete_tracker(tr);
}
-static void
-ufshci_req_queue_manual_complete_request(struct ufshci_req_queue *req_queue,
- struct ufshci_request *req, uint8_t ocs, uint8_t rc)
-{
- struct ufshci_completion cpl;
- bool error;
-
- memset(&cpl, 0, sizeof(cpl));
- cpl.response_upiu.header.response = rc;
- error = ufshci_req_queue_response_is_error(req_queue, ocs,
- &cpl.response_upiu);
-
- if (error) {
- ufshci_printf(req_queue->ctrlr,
- "Manual complete request error:0x%x", error);
- }
-
- if (req->cb_fn)
- req->cb_fn(req->cb_arg, &cpl, error);
-
- ufshci_free_request(req);
-}
-
void
ufshci_req_queue_fail(struct ufshci_controller *ctrlr,
struct ufshci_req_queue *req_queue)
@@ -221,23 +198,26 @@
for (i = 0; i < req_queue->num_trackers; i++) {
tr = hwq->act_tr[i];
- if (tr->slot_state == UFSHCI_SLOT_STATE_RESERVED) {
- mtx_unlock(&hwq->qlock);
- ufshci_req_queue_manual_complete_request(req_queue,
- tr->req, UFSHCI_DESC_ABORTED,
- UFSHCI_RESPONSE_CODE_GENERAL_FAILURE);
- mtx_lock(&hwq->qlock);
- } else if (tr->slot_state == UFSHCI_SLOT_STATE_SCHEDULED) {
- /*
- * Do not remove the tracker. The abort_tracker path
- * will do that for us.
- */
- mtx_unlock(&hwq->qlock);
- ufshci_req_queue_manual_complete_tracker(tr,
- UFSHCI_DESC_ABORTED,
- UFSHCI_RESPONSE_CODE_GENERAL_FAILURE);
- mtx_lock(&hwq->qlock);
- }
+ /*
+ * A slot in UFSHCI_SLOT_STATE_RESERVED is visible here
+ * only while its submit thread is failing a PRDT setup.
+ * That thread completes the request, so leave the slot
+ * alone.
+ */
+ if (tr->slot_state != UFSHCI_SLOT_STATE_SCHEDULED)
+ continue;
+
+ /*
+ * Claim the tracker under the lock. The completion
+ * scan only completes SCHEDULED slots, so it will
+ * skip this one while the lock is dropped.
+ */
+ tr->slot_state = UFSHCI_SLOT_STATE_NEED_ERROR_HANDLING;
+ mtx_unlock(&hwq->qlock);
+ ufshci_req_queue_manual_complete_tracker(tr,
+ UFSHCI_DESC_ABORTED,
+ UFSHCI_RESPONSE_CODE_GENERAL_FAILURE);
+ mtx_lock(&hwq->qlock);
}
mtx_unlock(&hwq->qlock);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 26, 3:24 PM (17 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36979894
Default Alt Text
D58945.id.diff (2 KB)
Attached To
Mode
D58945: ufshci: claim trackers before failing them
Attached
Detach File
Event Timeline
Log In to Comment