haiku/headers/private/fs_shell/fssh_drivers.h
Axel Dörfler 99086aa323 trim: Target SCSI UNMAP command instead of WRITE SAME.
* The UNMAP command is theoretically much faster, as it can get many block
  ranges instead of just a single range.
* Furthermore, the ATA TRIM command resembles it much better.
* Therefore, fs_trim_data now gets an array of ranges, and we use SCSI UNMAP
  to trim.
* Updated BFS code to collect array ranges to fully support the new
  fs_trim_data possibilities.
2013-11-07 19:03:47 +01:00

232 lines
7.6 KiB
C

#ifndef _FSSH_DRIVERS_DRIVERS_H
#define _FSSH_DRIVERS_DRIVERS_H
#include "fssh_defs.h"
#include "fssh_fs_interface.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ---
these hooks are how the kernel accesses the device
--- */
typedef fssh_status_t (*fssh_device_open_hook) (const char *name,
uint32_t flags, void **cookie);
typedef fssh_status_t (*fssh_device_close_hook) (void *cookie);
typedef fssh_status_t (*fssh_device_free_hook) (void *cookie);
typedef fssh_status_t (*fssh_device_control_hook) (void *cookie, uint32_t op,
void *data, fssh_size_t len);
typedef fssh_status_t (*fssh_device_read_hook) (void *cookie,
fssh_off_t position, void *data,
fssh_size_t *numBytes);
typedef fssh_status_t (*fssh_device_write_hook) (void *cookie,
fssh_off_t position, const void *data,
fssh_size_t *numBytes);
typedef fssh_status_t (*fssh_device_select_hook) (void *cookie, uint8_t event,
uint32_t ref, fssh_selectsync *sync);
typedef fssh_status_t (*fssh_device_deselect_hook) (void *cookie, uint8_t event,
fssh_selectsync *sync);
typedef fssh_status_t (*fssh_device_read_pages_hook)(void *cookie,
fssh_off_t position, const fssh_iovec *vec,
fssh_size_t count, fssh_size_t *_numBytes);
typedef fssh_status_t (*fssh_device_write_pages_hook) (void *cookie,
fssh_off_t position, const fssh_iovec *vec,
fssh_size_t count, fssh_size_t *_numBytes);
#define FSSH_B_CUR_DRIVER_API_VERSION 2
/* ---
the device_hooks structure is a descriptor for the device, giving its
entry points.
--- */
typedef struct {
fssh_device_open_hook open; /* called to open the device */
fssh_device_close_hook close; /* called to close the device */
fssh_device_free_hook free; /* called to free the cookie */
fssh_device_control_hook control; /* called to control the device */
fssh_device_read_hook read; /* reads from the device */
fssh_device_write_hook write; /* writes to the device */
fssh_device_select_hook select; /* start select */
fssh_device_deselect_hook deselect; /* stop select */
fssh_device_read_pages_hook read_pages; /* scatter-gather physical read from the device */
fssh_device_write_pages_hook write_pages; /* scatter-gather physical write to the device */
} fssh_device_hooks;
fssh_status_t fssh_init_hardware(void);
const char **fssh_publish_devices(void);
fssh_device_hooks *fssh_find_device(const char *name);
fssh_status_t fssh_init_driver(void);
void fssh_uninit_driver(void);
extern int32_t fssh_api_version;
enum {
FSSH_B_GET_DEVICE_SIZE = 1, /* get # bytes */
/* returns size_t in *data */
FSSH_B_SET_DEVICE_SIZE, /* set # bytes */
/* passed size_t in *data */
FSSH_B_SET_NONBLOCKING_IO, /* set to non-blocking i/o */
FSSH_B_SET_BLOCKING_IO, /* set to blocking i/o */
FSSH_B_GET_READ_STATUS, /* check if can read w/o blocking */
/* returns bool in *data */
FSSH_B_GET_WRITE_STATUS, /* check if can write w/o blocking */
/* returns bool in *data */
FSSH_B_GET_GEOMETRY, /* get info about device geometry */
/* returns struct geometry in *data */
FSSH_B_GET_DRIVER_FOR_DEVICE, /* get the path of the executable serving that device */
FSSH_B_GET_PARTITION_INFO, /* get info about a device partition */
/* returns struct partition_info in *data */
FSSH_B_SET_PARTITION, /* create a user-defined partition */
FSSH_B_FORMAT_DEVICE, /* low-level device format */
FSSH_B_EJECT_DEVICE, /* eject the media if supported */
FSSH_B_GET_ICON, /* return device icon (see struct below) */
FSSH_B_GET_BIOS_GEOMETRY, /* get info about device geometry */
/* as reported by the bios */
/* returns struct geometry in *data */
FSSH_B_GET_MEDIA_STATUS, /* get status of media. */
/* return fssh_status_t in *data: */
/* B_NO_ERROR: media ready */
/* B_DEV_NO_MEDIA: no media */
/* B_DEV_NOT_READY: device not ready */
/* B_DEV_MEDIA_CHANGED: media changed */
/* since open or last B_GET_MEDIA_STATUS */
/* B_DEV_MEDIA_CHANGE_REQUESTED: user */
/* pressed button on drive */
/* B_DEV_DOOR_OPEN: door open */
FSSH_B_LOAD_MEDIA, /* load the media if supported */
FSSH_B_GET_BIOS_DRIVE_ID, /* get bios id for this device */
FSSH_B_SET_UNINTERRUPTABLE_IO, /* prevent cntl-C from interrupting i/o */
FSSH_B_SET_INTERRUPTABLE_IO, /* allow cntl-C to interrupt i/o */
FSSH_B_FLUSH_DRIVE_CACHE, /* flush drive cache */
FSSH_B_GET_PATH_FOR_DEVICE, /* get the absolute path of the device */
FSSH_B_GET_ICON_NAME, /* get an icon name identifier */
FSSH_B_GET_VECTOR_ICON, /* retrieves the device's vector icon */
FSSH_B_GET_DEVICE_NAME, /* get name, string buffer */
FSSH_B_TRIM_DEVICE, /* trims blocks, see fs_trim_data */
FSSH_B_GET_NEXT_OPEN_DEVICE = 1000, /* iterate through open devices */
FSSH_B_ADD_FIXED_DRIVER, /* private */
FSSH_B_REMOVE_FIXED_DRIVER, /* private */
FSSH_B_AUDIO_DRIVER_BASE = 8000, /* base for codes in audio_driver.h */
FSSH_B_MIDI_DRIVER_BASE = 8100, /* base for codes in midi_driver.h */
FSSH_B_JOYSTICK_DRIVER_BASE = 8200, /* base for codes in joystick.h */
FSSH_B_GRAPHIC_DRIVER_BASE = 8300, /* base for codes in graphic_driver.h */
FSSH_B_DEVICE_OP_CODES_END = 9999 /* end of Be-defined contol id's */
};
/* ---
geometry structure for the B_GET_GEOMETRY opcode
--- */
typedef struct {
uint32_t bytes_per_sector; /* sector size in bytes */
uint32_t sectors_per_track; /* # sectors per track */
uint32_t cylinder_count; /* # cylinders */
uint32_t head_count; /* # heads */
uint8_t device_type; /* type */
bool removable; /* non-zero if removable */
bool read_only; /* non-zero if read only */
bool write_once; /* non-zero if write-once */
} fssh_device_geometry;
/* ---
Be-defined device types returned by B_GET_GEOMETRY. Use these if it makes
sense for your device.
--- */
enum {
FSSH_B_DISK = 0, /* Hard disks, floppy disks, etc. */
FSSH_B_TAPE, /* Tape drives */
FSSH_B_PRINTER, /* Printers */
FSSH_B_CPU, /* CPU devices */
FSSH_B_WORM, /* Write-once, read-many devices */
FSSH_B_CD, /* CD ROMS */
FSSH_B_SCANNER, /* Scanners */
FSSH_B_OPTICAL, /* Optical devices */
FSSH_B_JUKEBOX, /* Jukeboxes */
FSSH_B_NETWORK /* Network devices */
};
/* ---
partition_info structure used by B_GET_PARTITION_INFO and B_SET_PARTITION
--- */
typedef struct {
fssh_off_t offset; /* offset (in bytes) */
fssh_off_t size; /* size (in bytes) */
int32_t logical_block_size; /* logical block size of partition */
int32_t session; /* id of session */
int32_t partition; /* id of partition */
char device[256]; /* path to the physical device */
} fssh_partition_info;
/* ---
driver_path structure returned by the B_GET_DRIVER_FOR_DEVICE
--- */
typedef char fssh_driver_path[256];
/* ---
open_device_iterator structure used by the B_GET_NEXT_OPEN_DEVICE opcode
--- */
typedef struct {
uint32_t cookie; /* must be set to 0 before iterating */
char device[256]; /* device path */
} fssh_open_device_iterator;
/* ---
icon structure for the B_GET_ICON opcode
--- */
typedef struct {
int32_t icon_size; /* icon size requested */
void *icon_data; /* where to put 'em (usually BBitmap->Bits()) */
} fssh_device_icon;
/* B_TRIM_DEVICE data structure */
typedef struct {
uint32_t range_count;
uint64_t trimmed_size; /* filled on return */
struct range {
uint64_t offset; /* offset (in bytes) */
uint64_t size;
} ranges[1];
} fssh_fs_trim_data;
#ifdef __cplusplus
}
#endif
#endif /* _FSSH_DRIVERS_DRIVERS_H */