|
@@ -251,6 +251,13 @@ impl Transport for PciTransport {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ fn get_status(&self) -> DeviceStatus {
|
|
|
+ // Safe because the common config pointer is valid and we checked in get_bar_region that it
|
|
|
+ // was aligned.
|
|
|
+ let status = unsafe { volread!(self.common_cfg, device_status) };
|
|
|
+ DeviceStatus::from_bits_truncate(status.into())
|
|
|
+ }
|
|
|
+
|
|
|
fn set_status(&mut self, status: DeviceStatus) {
|
|
|
// Safe because the common config pointer is valid and we checked in get_bar_region that it
|
|
|
// was aligned.
|
|
@@ -287,16 +294,9 @@ impl Transport for PciTransport {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fn queue_unset(&mut self, queue: u16) {
|
|
|
- // Safe because the common config pointer is valid and we checked in get_bar_region that it
|
|
|
- // was aligned.
|
|
|
- unsafe {
|
|
|
- volwrite!(self.common_cfg, queue_select, queue);
|
|
|
- volwrite!(self.common_cfg, queue_size, 0);
|
|
|
- volwrite!(self.common_cfg, queue_desc, 0);
|
|
|
- volwrite!(self.common_cfg, queue_driver, 0);
|
|
|
- volwrite!(self.common_cfg, queue_device, 0);
|
|
|
- }
|
|
|
+ fn queue_unset(&mut self, _queue: u16) {
|
|
|
+ // The VirtIO spec doesn't allow queues to be unset once they have been set up for the PCI
|
|
|
+ // transport, so this is a no-op.
|
|
|
}
|
|
|
|
|
|
fn queue_used(&mut self, queue: u16) -> bool {
|
|
@@ -341,7 +341,8 @@ impl Transport for PciTransport {
|
|
|
impl Drop for PciTransport {
|
|
|
fn drop(&mut self) {
|
|
|
// Reset the device when the transport is dropped.
|
|
|
- self.set_status(DeviceStatus::empty())
|
|
|
+ self.set_status(DeviceStatus::empty());
|
|
|
+ while self.get_status() != DeviceStatus::empty() {}
|
|
|
}
|
|
|
}
|
|
|
|