aic8800 0.3.0

OS-independent AIC8800 Wi-Fi driver core
use alloc::sync::Arc;

use rdif_eth::{NetHardIrqHandler, NetHardIrqResult, NetIrqSnapshot};
use sdmmc_protocol::sdio::{HostEvent, HostEventKind, SdMmcIrqHandle};

use crate::rdif::device::IrqLatch;

pub(super) struct AicHardIrq<I: SdMmcIrqHandle> {
    irq: I,
    latch: Arc<IrqLatch>,
}

impl<I: SdMmcIrqHandle> AicHardIrq<I> {
    pub(super) fn new(irq: I, latch: Arc<IrqLatch>) -> Self {
        Self { irq, latch }
    }
}

impl<I: SdMmcIrqHandle> NetHardIrqHandler for AicHardIrq<I> {
    fn handle_irq(&mut self) -> NetHardIrqResult {
        let event = self.irq.handle_irq();
        if !self.latch.publish(&event) {
            return NetHardIrqResult::Spurious;
        }
        let snapshot = match event.kind() {
            HostEventKind::Error => NetIrqSnapshot::ERROR,
            HostEventKind::CardInterrupt => NetIrqSnapshot::RX,
            _ => NetIrqSnapshot::all_queue_work(),
        };
        NetHardIrqResult::Schedule(snapshot)
    }
}