+static size_t eeprom_writeDirect(KBlock *blk, block_idx_t idx, const void *buf, size_t offset, size_t size)
+{
+ Eeprom *eep = EEPROM_CAST_KBLOCK(blk);
+ if (!eep->verify)
+ return eeprom_write(blk, idx, buf, offset, size);
+ else
+ {
+ int retries = 5;
+ while (retries--)
+ {
+ uint8_t verify_buf[CHUNCK_SIZE];
+ size_t wr_len = 0;
+ size_t len = 0;
+ while (size)
+ {
+ /* Split read in smaller pieces */
+ size_t count = MIN(size, (size_t)CHUNCK_SIZE);
+ if ((wr_len = eeprom_write(blk, idx, buf, offset, count)) != 0)
+ {
+ if (eeprom_readDirect(blk, idx, verify_buf, offset, count) != wr_len)
+ {
+ LOG_ERR("Verify read fail.\n");
+ return 0;
+ }
+ else if (memcmp(buf, verify_buf, wr_len) != 0)
+ {
+ LOG_ERR("Data mismatch!\n");
+ continue;
+ }
+ }
+ else
+ {
+ LOG_ERR("Write fail.\n");
+ return 0;
+ }
+ size -= wr_len;
+ len += wr_len;
+ buf = ((const char *)buf) + wr_len;
+ }
+ return len;
+ }
+ }
+
+ return 0;
+}
+