1/* 2 * Copyright 2008-2023, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Michael Lotz <mmlr@mlotz.ch> 7 */ 8#ifndef _USB_DISK_H_ 9#define _USB_DISK_H_ 10 11 12#include <util/Vector.h> 13#include <util/DoublyLinkedList.h> 14 15#include <lock.h> 16#include <USB3.h> 17#include <device_manager.h> 18#include <usb/USB_massbulk.h> 19 20 21#define REQUEST_MASS_STORAGE_RESET 0xff 22#define REQUEST_GET_MAX_LUN 0xfe 23#define MAX_LOGICAL_UNIT_NUMBER 15 24#define ATAPI_COMMAND_LENGTH 12 25 26#define SYNC_SUPPORT_RELOAD 5 27 28struct IOScheduler; 29struct DMAResource; 30typedef struct device_lun_s device_lun; 31 32// holds common information about an attached device (pointed to by luns) 33typedef struct disk_device_s { 34 disk_device_s(); 35 ~disk_device_s(); 36 37 int32 number; 38 device_node *node; 39 40 usb_device device; 41 bool removed; 42 uint32 open_count; 43 recursive_lock io_lock; 44 mutex lock; 45 46 // IO operations 47 Vector<DMAResource*> dma_resources; 48 49 // device state 50 usb_pipe bulk_in; 51 usb_pipe bulk_out; 52 usb_pipe interrupt; 53 uint8 interface; 54 uint32 current_tag; 55 uint8 sync_support; 56 bool tur_supported; 57 bool is_atapi; 58 bool is_ufi; 59 60 // used to store callback information 61 sem_id notify; 62 status_t status; 63 size_t actual_length; 64 65 // used to store interrupt result 66 unsigned char interruptBuffer[2]; 67 sem_id interruptLock; 68 69 // logical units of this device 70 uint8 lun_count; 71 device_lun **luns; 72} disk_device; 73 74 75// represents a logical unit on the pointed to device - this gets published 76struct device_lun_s { 77 disk_device *device; 78 char name[32]; 79 uint8 logical_unit_number; 80 bool should_sync; 81 82 // device information through read capacity/inquiry 83 bool media_present; 84 bool media_changed; 85 uint64 block_count; 86 uint32 block_size; 87 uint32 physical_block_size; 88 uint8 device_type; 89 bool removable; 90 bool write_protected; 91 92 char vendor_name[8]; 93 char product_name[16]; 94 char product_revision[4]; 95}; 96 97 98typedef struct interrupt_status_wrapper_s { 99 uint8 status; 100 uint8 misc; 101} _PACKED interrupt_status_wrapper; 102 103 104#endif // _USB_DISK_H_ 105