Rename the methods in the interface of VirtioTransport

This commit is contained in:
Cautreoxit
2024-11-14 21:05:38 +08:00
committed by Tate, Hongliang Tian
parent 300403e3eb
commit 3cb7f5b721
6 changed files with 23 additions and 20 deletions

View File

@ -410,7 +410,7 @@ impl DeviceInner {
/// Flushes any cached data from the guest to the persistent storage on the host.
/// This will be ignored if the device doesn't support the `VIRTIO_BLK_F_FLUSH` feature.
fn flush(&self, bio_request: BioRequest) {
if self.transport.lock().device_features() & BlockFeatures::FLUSH.bits() == 0 {
if self.transport.lock().read_device_features() & BlockFeatures::FLUSH.bits() == 0 {
bio_request.bios().for_each(|bio| {
bio.complete(BioStatus::Complete);
});

View File

@ -51,7 +51,7 @@ impl NetworkDevice {
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
let virtio_net_config = VirtioNetConfig::new(transport.as_mut());
let features = NetworkFeatures::from_bits_truncate(Self::negotiate_features(
transport.device_features(),
transport.read_device_features(),
));
debug!("virtio_net_config = {:?}", virtio_net_config);
debug!("features = {:?}", features);

View File

@ -40,17 +40,19 @@ fn virtio_component_init() -> Result<(), ComponentInitError> {
socket::init();
while let Some(mut transport) = pop_device_transport() {
// Reset device
transport.set_device_status(DeviceStatus::empty()).unwrap();
transport
.write_device_status(DeviceStatus::empty())
.unwrap();
// Set to acknowledge
transport
.set_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER)
.write_device_status(DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER)
.unwrap();
// negotiate features
negotiate_features(&mut transport);
// change to features ok status
transport
.set_device_status(
.write_device_status(
DeviceStatus::ACKNOWLEDGE | DeviceStatus::DRIVER | DeviceStatus::FEATURES_OK,
)
.unwrap();
@ -87,7 +89,7 @@ fn pop_device_transport() -> Option<Box<dyn VirtioTransport>> {
}
fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
let features = transport.device_features();
let features = transport.read_device_features();
let mask = ((1u64 << 24) - 1) | (((1u64 << 24) - 1) << 50);
let device_specified_features = features & mask;
let device_support_features = match transport.device_type() {
@ -101,7 +103,7 @@ fn negotiate_features(transport: &mut Box<dyn VirtioTransport>) {
let mut support_feature = Feature::from_bits_truncate(features);
support_feature.remove(Feature::RING_EVENT_IDX);
transport
.set_driver_features(features & (support_feature.bits | device_support_features))
.write_driver_features(features & (support_feature.bits | device_support_features))
.unwrap();
}

View File

@ -201,7 +201,7 @@ impl VirtioTransport for VirtioMmioTransport {
self.common_device.io_mem().slice(0x100..0x200)
}
fn device_features(&self) -> u64 {
fn read_device_features(&self) -> u64 {
// select low
field_ptr!(&self.layout, VirtioMmioLayout, device_features_select)
.write_once(&0u32)
@ -219,7 +219,7 @@ impl VirtioTransport for VirtioMmioTransport {
device_feature_high << 32 | device_feature_low as u64
}
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
let low = features as u32;
let high = (features >> 32) as u32;
field_ptr!(&self.layout, VirtioMmioLayout, driver_features_select)
@ -237,7 +237,7 @@ impl VirtioTransport for VirtioMmioTransport {
Ok(())
}
fn device_status(&self) -> DeviceStatus {
fn read_device_status(&self) -> DeviceStatus {
DeviceStatus::from_bits(
field_ptr!(&self.layout, VirtioMmioLayout, status)
.read_once()
@ -246,7 +246,7 @@ impl VirtioTransport for VirtioMmioTransport {
.unwrap()
}
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
field_ptr!(&self.layout, VirtioMmioLayout, status)
.write_once(&(status.bits() as u32))
.unwrap();

View File

@ -24,23 +24,24 @@ pub mod pci;
pub trait VirtioTransport: Sync + Send + Debug {
// ====================Device related APIs=======================
/// Get device type.
fn device_type(&self) -> VirtioDeviceType;
/// Get device features.
fn device_features(&self) -> u64;
fn read_device_features(&self) -> u64;
/// Set driver features.
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>;
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError>;
/// Get device status.
fn device_status(&self) -> DeviceStatus;
fn read_device_status(&self) -> DeviceStatus;
/// Set device status.
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>;
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError>;
// Set to driver ok status
fn finish_init(&mut self) {
self.set_device_status(
self.write_device_status(
DeviceStatus::ACKNOWLEDGE
| DeviceStatus::DRIVER
| DeviceStatus::FEATURES_OK

View File

@ -132,7 +132,7 @@ impl VirtioTransport for VirtioPciTransport {
memory.slice(offset..offset + length)
}
fn device_features(&self) -> u64 {
fn read_device_features(&self) -> u64 {
// select low
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_feature_select)
.write_once(&0u32)
@ -150,7 +150,7 @@ impl VirtioTransport for VirtioPciTransport {
device_feature_high << 32 | device_feature_low as u64
}
fn set_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
fn write_driver_features(&mut self, features: u64) -> Result<(), VirtioTransportError> {
let low = features as u32;
let high = (features >> 32) as u32;
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, driver_feature_select)
@ -168,14 +168,14 @@ impl VirtioTransport for VirtioPciTransport {
Ok(())
}
fn device_status(&self) -> DeviceStatus {
fn read_device_status(&self) -> DeviceStatus {
let status = field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
.read_once()
.unwrap();
DeviceStatus::from_bits(status).unwrap()
}
fn set_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
fn write_device_status(&mut self, status: DeviceStatus) -> Result<(), VirtioTransportError> {
field_ptr!(&self.common_cfg, VirtioPciCommonCfg, device_status)
.write_once(&(status.bits()))
.unwrap();