use alloc::sync::Arc;
use sdio_host::SdioHost;
use crate::{common::ChipVariant, fdrv::AicWifiNetDev};
pub fn probe<H: SdioHost + 'static>(mut sdio: H) -> Result<AicWifiNetDev, alloc::string::String> {
let (vid, did) = sdio.vendor_device_id();
let chip = ChipVariant::from_vid_did(vid, did);
log::info!(
"[aic8800] chip={:?} vid=0x{:04x} did=0x{:04x}",
chip,
vid,
did
);
if chip == ChipVariant::Unknown {
return Err(alloc::format!(
"unknown Wi-Fi chip: vid=0x{:04x} did=0x{:04x}",
vid,
did
));
}
crate::fw::firmware_init(&mut sdio, chip).map_err(|e| {
log::error!("[aic8800] firmware init failed: {:?}", e);
alloc::format!("firmware init failed: {:?}", e)
})?;
log::info!("[aic8800] firmware loaded");
let bus = crate::fdrv::init(sdio, chip).map_err(|e| {
log::error!("[aic8800] FDRV init failed: {}", e);
alloc::format!("FDRV init failed: {}", e)
})?;
sdhci_cv1800::irq::register_card_irq_callback(crate::fdrv::sdio1_irq_handler);
let mac = bus.conn.sta_mac.lock().unwrap_or([0; 6]);
Ok(AicWifiNetDev::new(Arc::clone(&bus), chip, mac))
}