Page MenuHomeFreeBSD

D58944.id.diff
No OneTemporary

D58944.id.diff

diff --git a/sys/dev/ufshci/ufshci_ctrlr.c b/sys/dev/ufshci/ufshci_ctrlr.c
--- a/sys/dev/ufshci/ufshci_ctrlr.c
+++ b/sys/dev/ufshci/ufshci_ctrlr.c
@@ -15,7 +15,13 @@
static void
ufshci_ctrlr_fail(struct ufshci_controller *ctrlr)
{
- ctrlr->is_failed = true;
+ /*
+ * The attach thread and the reset task can both fail the
+ * controller. A second queue walk would complete the same
+ * trackers again.
+ */
+ if (atomic_swap_32(&ctrlr->is_failed, 1) != 0)
+ return;
ufshci_req_queue_fail(ctrlr, &ctrlr->task_mgmt_req_queue);
ufshci_req_queue_fail(ctrlr, &ctrlr->transfer_req_queue);
@@ -312,6 +318,10 @@
struct ufshci_controller *ctrlr = arg;
int error;
+ /* A failed controller must not be re-enabled. */
+ if (ctrlr->is_failed)
+ return;
+
/* Release resources */
ufshci_utmr_req_queue_disable(ctrlr);
ufshci_utr_req_queue_disable(ctrlr);
diff --git a/sys/dev/ufshci/ufshci_private.h b/sys/dev/ufshci/ufshci_private.h
--- a/sys/dev/ufshci/ufshci_private.h
+++ b/sys/dev/ufshci/ufshci_private.h
@@ -409,7 +409,7 @@
uint32_t max_tx_lanes;
uint32_t max_rx_lanes;
- bool is_failed;
+ uint32_t is_failed;
};
#define ufshci_mmio_offsetof(reg) offsetof(struct ufshci_registers, reg)

File Metadata

Mime Type
text/plain
Expires
Wed, Aug 26, 12:57 AM (5 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37130916
Default Alt Text
D58944.id.diff (1 KB)

Event Timeline