Kernel: Refactor USB mass storage code

Also increment command timeout to 10 seconds so commands don't timeout
when they are not supposted to :)
This commit is contained in:
2024-11-23 01:24:32 +02:00
parent 076001462e
commit 793c0368f2
4 changed files with 186 additions and 115 deletions

View File

@@ -14,6 +14,9 @@ namespace Kernel
BAN_NON_COPYABLE(USBMassStorageDriver);
BAN_NON_MOVABLE(USBMassStorageDriver);
public:
static constexpr size_t transfer_stall = -2;
public:
void handle_stall(uint8_t endpoint_id) override;
void handle_input_data(size_t byte_count, uint8_t endpoint_id) override;
@@ -21,14 +24,17 @@ namespace Kernel
BAN::ErrorOr<size_t> send_bytes(paddr_t, size_t count);
BAN::ErrorOr<size_t> recv_bytes(paddr_t, size_t count);
void lock() { m_mutex.lock(); }
void unlock() { m_mutex.unlock(); }
template<bool IN, typename SPAN>
BAN::ErrorOr<size_t> send_command(uint8_t lun, BAN::ConstByteSpan scsi_command, SPAN data);
private:
USBMassStorageDriver(USBDevice&, const USBDevice::InterfaceDescriptor&);
~USBMassStorageDriver();
BAN::ErrorOr<void> initialize() override;
BAN::ErrorOr<void> mass_storage_reset();
BAN::ErrorOr<void> clear_feature(uint8_t endpoint_id);
BAN::ErrorOr<void> reset_recovery();
private:
USBDevice& m_device;
@@ -42,6 +48,8 @@ namespace Kernel
uint8_t m_out_endpoint_id { 0 };
BAN::Function<void(size_t)> m_out_callback;
BAN::UniqPtr<DMARegion> m_data_region;
BAN::Vector<BAN::RefPtr<StorageDevice>> m_storage_devices;
friend class BAN::UniqPtr<USBMassStorageDriver>;

View File

@@ -19,22 +19,16 @@ namespace Kernel
BAN::StringView name() const override { return m_name; }
private:
USBSCSIDevice(USBMassStorageDriver& driver, uint8_t lun, BAN::UniqPtr<DMARegion>&&, uint64_t block_count, uint32_t block_size);
USBSCSIDevice(USBMassStorageDriver& driver, uint8_t lun, uint32_t max_packet_size, uint64_t block_count, uint32_t block_size);
~USBSCSIDevice();
template<bool IN, typename SPAN = BAN::either_or_t<IN, BAN::ByteSpan, BAN::ConstByteSpan>>
BAN::ErrorOr<size_t> send_scsi_command(BAN::ConstByteSpan command, SPAN data);
template<bool IN, typename SPAN = BAN::either_or_t<IN, BAN::ByteSpan, BAN::ConstByteSpan>>
static BAN::ErrorOr<size_t> send_scsi_command_impl(USBMassStorageDriver&, DMARegion& dma_region, uint8_t lun, BAN::ConstByteSpan command, SPAN data);
BAN::ErrorOr<void> read_sectors_impl(uint64_t first_lba, uint64_t sector_count, BAN::ByteSpan buffer) override;
BAN::ErrorOr<void> write_sectors_impl(uint64_t lba, uint64_t sector_count, BAN::ConstByteSpan buffer) override;
private:
USBMassStorageDriver& m_driver;
BAN::UniqPtr<DMARegion> m_dma_region;
const uint32_t m_max_packet_size;
const uint8_t m_lun;
const uint64_t m_block_count;