i2c: fix slave IRQ — SlaveWrReq no longer triggers spurious DataReceived, RdReq/Stop now wake client
diff --git a/services/i2c/server-runtime/src/lib.rs b/services/i2c/server-runtime/src/lib.rs
index 3052cae..f531aa0 100644
--- a/services/i2c/server-runtime/src/lib.rs
+++ b/services/i2c/server-runtime/src/lib.rs
@@ -127,16 +127,10 @@
             if let Some(bus) = buses.iter_mut().find(|b| b.irq == irq) {
                 if bus.notif_enabled {
                     match bus.driver.try_next_slave_event() {
-                        Ok(Some((kind, _))) => {
-                            // Store the actual hardware event kind
-                            bus.rx_event_kind = match kind {
-                                I2cIsrEvent::SlaveWrRecvd => SlaveEvent::DataReceived,
-                                I2cIsrEvent::SlaveRdReq => SlaveEvent::ReadRequest,
-                                I2cIsrEvent::SlaveStop => SlaveEvent::Stop,
-                                _ => SlaveEvent::DataReceived,
-                            };
-                            // For DataReceived, read the buffer; other events have no data
-                            if kind == I2cIsrEvent::SlaveWrRecvd {
+                        Ok(Some((kind, _))) => match kind {
+                            I2cIsrEvent::SlaveWrRecvd => {
+                                // Master finished writing — drain buffer into latch.
+                                bus.rx_event_kind = SlaveEvent::DataReceived;
                                 match bus.driver.read_slave_buffer(&mut bus.rx) {
                                     Ok(n) => {
                                         if n > 0 {
@@ -158,7 +152,22 @@
                                     }
                                 }
                             }
-                        }
+                            I2cIsrEvent::SlaveRdReq => {
+                                // Master wants to read from us — no RX data, update kind only.
+                                bus.rx_event_kind = SlaveEvent::ReadRequest;
+                            }
+                            I2cIsrEvent::SlaveStop => {
+                                // Transaction ended — update kind so client can detect boundaries.
+                                bus.rx_event_kind = SlaveEvent::Stop;
+                            }
+                            I2cIsrEvent::SlaveWrReq | _ => {
+                                // SlaveWrReq: write is starting, data not yet received.
+                                // SlaveRdProc: our TX bytes were clocked out, informational.
+                                // Unknown future events: ignore.
+                                // Do not update rx_event_kind or wake the client.
+                                pw_log::debug!("slave IRQ: intermediate or unknown event, no latch update");
+                            }
+                        },
                         Ok(None) => {
                             pw_log::debug!(
                                 "slave IRQ fired but no data ready — spurious or non-data event"