]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
samples: rust: pci: reset pci-testdev in unbind()
authorDanilo Krummrich <dakr@kernel.org>
Sat, 21 Jun 2025 19:43:34 +0000 (21:43 +0200)
committerDanilo Krummrich <dakr@kernel.org>
Tue, 8 Jul 2025 22:04:33 +0000 (00:04 +0200)
Reset the pci-testdev when the driver is unbound from its device.

Link: https://lore.kernel.org/r/20250621195118.124245-9-dakr@kernel.org
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
samples/rust/rust_driver_pci.rs

index 5c35f1414172a7351656b2ea097dc871580d7ba1..606946ff4d7fd98e206ee6420a620d1c44eb0377 100644 (file)
@@ -18,7 +18,7 @@ impl Regs {
 
 type Bar0 = pci::Bar<{ Regs::END }>;
 
-#[derive(Debug)]
+#[derive(Copy, Clone, Debug)]
 struct TestIndex(u8);
 
 impl TestIndex {
@@ -30,6 +30,7 @@ struct SampleDriver {
     pdev: ARef<pci::Device>,
     #[pin]
     bar: Devres<Bar0>,
+    index: TestIndex,
 }
 
 kernel::pci_device_table!(
@@ -79,6 +80,7 @@ impl pci::Driver for SampleDriver {
             try_pin_init!(Self {
                 pdev: pdev.into(),
                 bar <- pdev.iomap_region_sized::<{ Regs::END }>(0, c_str!("rust_driver_pci")),
+                index: *info,
             }),
             GFP_KERNEL,
         )?;
@@ -92,6 +94,13 @@ impl pci::Driver for SampleDriver {
 
         Ok(drvdata)
     }
+
+    fn unbind(pdev: &pci::Device<Core>, this: Pin<&Self>) {
+        if let Ok(bar) = this.bar.access(pdev.as_ref()) {
+            // Reset pci-testdev by writing a new test index.
+            bar.write8(this.index.0, Regs::TEST);
+        }
+    }
 }
 
 #[pinned_drop]