From e9a3080c80f704a070f8401b7cb1132897ecc5a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20W=C3=B3jcik?= Date: Sun, 18 Oct 2026 11:27:23 +0200 Subject: [PATCH 1/2] Fix wifi bugs introduced in #91773f57 commit --- drivers/src/wireless/cyw43439/ioctl.zig | 22 ++++++++++++++++++++++ drivers/src/wireless/cyw43439/wifi.zig | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/src/wireless/cyw43439/ioctl.zig b/drivers/src/wireless/cyw43439/ioctl.zig index 911aede7d..c0e946104 100644 --- a/drivers/src/wireless/cyw43439/ioctl.zig +++ b/drivers/src/wireless/cyw43439/ioctl.zig @@ -183,6 +183,8 @@ pub const Response = struct { else blk: { _ = self.reader.discard(@fromBackingInt(self.padding())) catch unreachable; self.bdc_hdr = self.reader.takeStruct(BDC_Header, .little) catch unreachable; + // Skip the bdc padding too, data starts right after it. + _ = self.reader.discard(@fromBackingInt(self.bdc_hdr.?.padding())) catch 0; break :blk self.bdc_hdr.?; }; } @@ -416,6 +418,26 @@ test "parse response" { try testing.expectEqualSlices(u8, expected, rsp_bytes[head..][0..len][0..expected.len]); } +test "parse event with bdc padding" { + // Event packet captured from the chip: sdp hdrlen is 178 and bdc offset is + // 1, so there are 4 padding bytes between the bdc header and the ethernet + // header. + var buf: [260]u8 = @splat(0); + const sdp = hex_to_bytes("0401fbfe1f0100b2002e0000"); + @memcpy(buf[0..sdp.len], &sdp); + const body = hex_to_bytes("20000001" ++ "00010000" ++ + "2ccf67f366942ecf67f36694886c" ++ + "80010038" ++ "00" ++ "001018" ++ "0001" ++ + "0002" ++ "0000" ++ "00000003" ++ "00000002"); + @memcpy(buf[178..][0..body.len], &body); + + var rsp = try Response.init(&buf); + try testing.expectEqual(.event, rsp.sdp.channel()); + const evt = rsp.event().?; + try testing.expectEqual(EventType.auth, evt.msg.event_type); + try testing.expectEqual(EventStatus.timeout, evt.msg.status); +} + pub fn hex_to_bytes(comptime hex: []const u8) [hex.len / 2]u8 { var res: [hex.len / 2]u8 = undefined; _ = std.fmt.hexToBytes(&res, hex) catch unreachable; diff --git a/drivers/src/wireless/cyw43439/wifi.zig b/drivers/src/wireless/cyw43439/wifi.zig index 01be9db48..fceccc443 100644 --- a/drivers/src/wireless/cyw43439/wifi.zig +++ b/drivers/src/wireless/cyw43439/wifi.zig @@ -761,7 +761,7 @@ pub fn send_zc(self: *Self, buffer: []u8) anyerror!void { const bytes_len = 18 + eth_frame_len; const words_len = ((bytes_len + 3) >> 2) + 1; // round and add 1 for bus command - self.bus.write(.wlan, 0, @intCast(bytes_len), as_words(writer.buffered(), words_len)); + self.bus.write(.wlan, 0, @intCast(bytes_len), as_words(buffer, words_len)); } pub fn has_credit(self: *Self) bool { From 87483d27f7b26248d681aca086e3e79e416d2619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20W=C3=B3jcik?= Date: Sun, 18 Oct 2026 11:31:51 +0200 Subject: [PATCH 2/2] remove test --- drivers/src/wireless/cyw43439/ioctl.zig | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/drivers/src/wireless/cyw43439/ioctl.zig b/drivers/src/wireless/cyw43439/ioctl.zig index c0e946104..291f0f4f6 100644 --- a/drivers/src/wireless/cyw43439/ioctl.zig +++ b/drivers/src/wireless/cyw43439/ioctl.zig @@ -418,26 +418,6 @@ test "parse response" { try testing.expectEqualSlices(u8, expected, rsp_bytes[head..][0..len][0..expected.len]); } -test "parse event with bdc padding" { - // Event packet captured from the chip: sdp hdrlen is 178 and bdc offset is - // 1, so there are 4 padding bytes between the bdc header and the ethernet - // header. - var buf: [260]u8 = @splat(0); - const sdp = hex_to_bytes("0401fbfe1f0100b2002e0000"); - @memcpy(buf[0..sdp.len], &sdp); - const body = hex_to_bytes("20000001" ++ "00010000" ++ - "2ccf67f366942ecf67f36694886c" ++ - "80010038" ++ "00" ++ "001018" ++ "0001" ++ - "0002" ++ "0000" ++ "00000003" ++ "00000002"); - @memcpy(buf[178..][0..body.len], &body); - - var rsp = try Response.init(&buf); - try testing.expectEqual(.event, rsp.sdp.channel()); - const evt = rsp.event().?; - try testing.expectEqual(EventType.auth, evt.msg.event_type); - try testing.expectEqual(EventStatus.timeout, evt.msg.status); -} - pub fn hex_to_bytes(comptime hex: []const u8) [hex.len / 2]u8 { var res: [hex.len / 2]u8 = undefined; _ = std.fmt.hexToBytes(&res, hex) catch unreachable;