SANBlaze I3C Controller — Release Notes

V1530 (April 2026)

Previous release: V1529

Summary

V1530 fixes a critical SMBus multi-chunk read bug where mi commands requesting more than 56 bytes via the SMBus path returned the first 56 bytes repeated to fill the requested length. The fix required a coordinated change between the firmware and the SANBlaze i2c-tiny-usb kernel module. This release resolves the V1529 known issue “VPD Full Read (256 bytes) — Partial Response.” All V1529 features and fixes are preserved unchanged.


Bug Fixes

Multi-Chunk SMBus Read Returns Repeated Data (Critical)

  • Fixed: mi -t 18 -T smbus -s 1 -d <slot> -o 0 -l 256 (and any SMBus read requesting more than 56 bytes) returned the first 56 bytes of the response repeated to fill the full requested length. VPD data beyond the first 56 bytes was silently wrong. Shorter reads (-l 56 or less, fitting in one USB chunk) were unaffected.

  • Root cause: The SANBlaze i2c-tiny-usb kernel module splits large reads into 56-byte USB chunks and issues a separate i2c_read_timeout_us call per chunk in the firmware. Each call to i2c_read_timeout_us generates a REPEATED START condition on the I2C bus. NVMe-MI SMBus devices (including the Samsung PM1763 and Micron 9650) reset their internal read-pointer on every START/REPEATED START, so each chunk read from offset 0, returning the same first 56 bytes.

  • Fix (firmware): On the first read chunk in I2C mode, the firmware now reads the full requested length in a single i2c_read_timeout_us call (one START, one STOP, no REPEATED STARTs), buffers the complete response in g_restart_read_buf, and returns the first 56 bytes. Subsequent chunk requests are served directly from the buffer with no I2C bus activity. The fix is gated to I2C mode and non-PRIVATE reads only; I3C reads are unaffected.

  • Fix (kernel module): The SANBlaze i2c-tiny-usb kernel module was updated to send wIndex = total message length (instead of wIndex = chunk length) on the first read chunk of each transfer. This allows the firmware to issue the correctly-sized single I2C transaction. On subsequent chunks wIndex also carries total length; the firmware ignores it after the first chunk since the buffer is already populated.

  • Validated: mi -t 18 -T smbus -s 1 -d <slot> -o 0 -l 256 now returns 256 unique sequential bytes. Full VPD including Product Info Area, MultiRecord NVMe, PCIe Port, and Topology records parsed correctly on Samsung PM1763.

  • Resolves: V1529 known issue “VPD Full Read (256 bytes) — Partial Response.”


New Features

None. This is a targeted bug-fix release.


Test Suite Updates

sb_i3c_test.sh (V28)

  • Fixed: TEST40 and TEST41 were skipping on V1530 firmware due to a version gate that excluded any version beyond V1529 from the manual i3c_poll path. The gate was written in anticipation of an autonomous IBI handler in V1530 that was subsequently deferred to V1531. The skip condition now explicitly excludes V1530 alongside V1528 and V1529, so TEST40 and TEST41 run normally on V1530.

  • EXPECTED_VERSION updated from 1528 to 1530. ACCEPTED_VERSIONS updated to include 1530.


Known Issues

None at time of release.


Upgrade Notes

  • Firmware binary replaces V1529 with no configuration changes required.

  • Kernel module updated alongside firmware as part of this release.

  • CLI binary (sb_i3c) unchanged from V1529; no update required.

  • Test script sb_i3c_test.sh must be updated to V28 to pick up the TEST40/41 version gate fix.

  • Python test wrappers: no changes required.