blob: ab5327456858913a2c8fa966fd1ba6ffa2ff3eb9 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "libec/flash_write_command.h"
#include <algorithm>
#include <vector>
namespace ec {
bool FlashWriteCommand::Run(int fd) {
uint32_t max_data_chunk = max_packet_size_ - sizeof(flash_write::Header);
auto pos = write_data_.begin();
while (pos < write_data_.end()) {
uint32_t remaining = write_data_.end() - pos;
uint32_t transfer_len = std::min(max_data_chunk, remaining);
Req()->req.offset = pos - write_data_.begin() + offset_;
Req()->req.size = transfer_len;
std::copy(pos, pos + transfer_len, Req()->data.begin());
SetReqSize(transfer_len + sizeof(flash_write::Header));
if (!EcCommandRun(fd)) {
return false;
}
if (Result() != EC_RES_SUCCESS) {
LOG(ERROR) << "FLASH_WRITE command failed @ "
<< pos - write_data_.begin();
return false;
}
pos += transfer_len;
}
return true;
}
bool FlashWriteCommand::EcCommandRun(int fd) {
return EcCommand::Run(fd);
}
} // namespace ec