Make all pcid_interface methods abort the process on errors
Effectively the only way to recover from errors in the communication with pcid is by restarting the driver from scratch possibly after restarting pcid. As such moving the aborts from individual drivers to pcid_interface simplifies drivers while at the same time allowing nicer error messages.
This commit is contained in:
@@ -12,13 +12,13 @@ pub fn enable_msix(pcid_handle: &mut PciFunctionHandle) -> Result<File, Error> {
|
||||
let pci_config = pcid_handle.config();
|
||||
|
||||
// Extended message signaled interrupts.
|
||||
let msix_info = match pcid_handle.feature_info(PciFeature::MsiX)? {
|
||||
let msix_info = match pcid_handle.feature_info(PciFeature::MsiX) {
|
||||
PciFeatureInfo::MsiX(capability) => capability,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
msix_info.validate(pci_config.func.bars);
|
||||
|
||||
let bar_address = unsafe { pcid_handle.map_bar(msix_info.table_bar)? }
|
||||
let bar_address = unsafe { pcid_handle.map_bar(msix_info.table_bar) }
|
||||
.ptr
|
||||
.as_ptr() as usize;
|
||||
let virt_table_base = (bar_address + msix_info.table_offset as usize) as *mut MsixTableEntry;
|
||||
@@ -43,7 +43,7 @@ pub fn enable_msix(pcid_handle: &mut PciFunctionHandle) -> Result<File, Error> {
|
||||
interrupt_handle
|
||||
};
|
||||
|
||||
pcid_handle.enable_feature(PciFeature::MsiX)?;
|
||||
pcid_handle.enable_feature(PciFeature::MsiX);
|
||||
|
||||
log::info!("virtio: using MSI-X (interrupt_handle={interrupt_handle:?})");
|
||||
Ok(interrupt_handle)
|
||||
|
||||
@@ -66,7 +66,7 @@ pub fn probe_device(pcid_handle: &mut PciFunctionHandle) -> Result<Device, Error
|
||||
let mut notify_addr = None;
|
||||
let mut device_addr = None;
|
||||
|
||||
for raw_capability in pcid_handle.get_vendor_capabilities()? {
|
||||
for raw_capability in pcid_handle.get_vendor_capabilities() {
|
||||
// SAFETY: We have verified that the length of the data is correct.
|
||||
let capability = unsafe { &*(raw_capability.data.as_ptr() as *const PciCapability) };
|
||||
|
||||
@@ -147,7 +147,7 @@ pub fn probe_device(pcid_handle: &mut PciFunctionHandle) -> Result<Device, Error
|
||||
);
|
||||
|
||||
// Setup interrupts.
|
||||
let all_pci_features = pcid_handle.fetch_all_features()?;
|
||||
let all_pci_features = pcid_handle.fetch_all_features();
|
||||
let has_msix = all_pci_features.iter().any(|feature| feature.is_msix());
|
||||
|
||||
// According to the virtio specification, the device REQUIRED to support MSI-X.
|
||||
|
||||
@@ -17,18 +17,10 @@ use std::task::{Poll, Waker};
|
||||
pub enum Error {
|
||||
#[error("syscall failed")]
|
||||
SyscallError(#[from] libredox::error::Error),
|
||||
#[error("pcid client handle error")]
|
||||
PcidClientHandle(pcid_interface::PcidClientHandleError),
|
||||
#[error("the device is incapable of {0:?}")]
|
||||
InCapable(CfgType),
|
||||
}
|
||||
|
||||
impl From<pcid_interface::PcidClientHandleError> for Error {
|
||||
fn from(value: pcid_interface::PcidClientHandleError) -> Self {
|
||||
Self::PcidClientHandle(value)
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the queue part sizes in bytes.
|
||||
///
|
||||
/// ## Reference
|
||||
|
||||
Reference in New Issue
Block a user