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:
@@ -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>;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user