* Integration of the new driver architecture.
* Moved devfs from fs/ to device_manager/, and separated the legacy driver
support from it.
* Removed fast_log module.
* There are a couple of (temporary) regressions, though:
- legacy SATA and ISA IDE support is disabled, the drivers haven't been
ported yet.
- The not yet used ATA bus manager hasn't been ported yet, either.
- AHCI changes have not been tested.
- the listdev command has been removed from the build (as it currently
doesn't work anymore).
- device manager generated IDs currently are not freed anymore when a device
node is removed.
- generic drivers can't yet use the new driver architecture.
- simple busses that do not support device types won't work yet.
- legacy driver publishing/unpublishing (ie. what USB needs) has not been
tested, and may be broken.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25662 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
** Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
||||
** Distributed under the terms of the OpenBeOS License.
|
||||
*/
|
||||
|
||||
/*
|
||||
Fast logging facilities.
|
||||
|
||||
This logging is much faster then dprintf and is saver
|
||||
against buffer overflow conditions.
|
||||
|
||||
Clients have to define events by creating an array of
|
||||
fast_log_type entries, each consisting of a code and the
|
||||
associated human-readable description. During logging,
|
||||
only the code is stored to save space and time. Also,
|
||||
all arguments are stored binary (currently, they must
|
||||
be of type uint32). Conversion to human-readable text is
|
||||
post-poned until the logging data is read or a client
|
||||
connection is closed (as this invalidates the event-
|
||||
description binding).
|
||||
|
||||
The reader interface is /dev/FAST_LOG_DEVFS_NAME. This
|
||||
device can only be read from (no seeking or further
|
||||
functionality) and does not block if there is no data.
|
||||
This is because if you want to store the log into a
|
||||
file, the file access may lead to further logging data,
|
||||
so doing a sleep between reads saves logging entries.
|
||||
*/
|
||||
|
||||
#ifndef FAST_LOG_H
|
||||
#define FAST_LOG_H
|
||||
|
||||
#include <module.h>
|
||||
|
||||
// one event type as defined by client
|
||||
typedef struct fast_log_event_type {
|
||||
// code of event (zero means end-of-list)
|
||||
int16 event;
|
||||
// human-readable description
|
||||
const char *description;
|
||||
} fast_log_event_type;
|
||||
|
||||
|
||||
// handle of client connection
|
||||
typedef struct fast_log_connection *fast_log_handle;
|
||||
|
||||
|
||||
// client interface
|
||||
typedef struct fast_log_info {
|
||||
module_info minfo;
|
||||
|
||||
// open client connection
|
||||
// prefix - prefix to print in log before each event
|
||||
// types - array of event types; last entry must have event=0
|
||||
fast_log_handle (*start_log)(const char *prefix, fast_log_event_type types[]);
|
||||
// close client connection
|
||||
void (*stop_log)(fast_log_handle handle);
|
||||
|
||||
// log an entry without arguments
|
||||
void (*log_0)(fast_log_handle handle, int event);
|
||||
// log an entry with one argument
|
||||
void (*log_1)(fast_log_handle handle, int event, uint32 param1);
|
||||
// log an entry with two arguments
|
||||
void (*log_2)(fast_log_handle handle, int event, uint32 param1, uint32 param2);
|
||||
// log an entry with three arguments
|
||||
void (*log_3)(fast_log_handle handle, int event, uint32 param1, uint32 param2, uint32 param3);
|
||||
// log an entry with four arguments
|
||||
void (*log_4)(fast_log_handle handle, int event, uint32 param1, uint32 param2, uint32 param3, uint32 param4);
|
||||
|
||||
// log an entry with n arguments
|
||||
// don't cheat on num_params!
|
||||
void (*log_n)(fast_log_handle handle, int event, int num_params, ...);
|
||||
} fast_log_info;
|
||||
|
||||
// name of client interface module
|
||||
#define FAST_LOG_MODULE_NAME "generic/fast_log/v1"
|
||||
// name of device to read logging data from
|
||||
#define FAST_LOG_DEVFS_NAME "fast_log"
|
||||
|
||||
#endif
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
|
||||
// one Physical Region Descriptor (PRD)
|
||||
// (one region must not cross 64K boundary;
|
||||
// (one region must not cross 64K boundary;
|
||||
// the PRD table must not cross a 64K boundary)
|
||||
typedef struct prd_entry {
|
||||
uint32 address; // physical address of block (must be even)
|
||||
@@ -91,21 +91,21 @@ enum {
|
||||
// info about one channel
|
||||
typedef struct ide_adapter_channel_info {
|
||||
pci_device_module_info *pci;
|
||||
pci_device device;
|
||||
|
||||
pci_device *device;
|
||||
|
||||
uint16 command_block_base; // io address command block
|
||||
uint16 control_block_base; // io address control block
|
||||
uint16 bus_master_base;
|
||||
int intnum; // interrupt number
|
||||
|
||||
int intnum; // interrupt number
|
||||
|
||||
uint32 lost; // != 0 if device got removed, i.e. if it must not
|
||||
// be accessed anymore
|
||||
|
||||
|
||||
ide_channel ide_channel;
|
||||
device_node_handle node;
|
||||
|
||||
device_node *node;
|
||||
|
||||
int32 (*inthand)( void *arg );
|
||||
|
||||
|
||||
area_id prd_area;
|
||||
prd_entry *prdt;
|
||||
uint32 prdt_phys;
|
||||
@@ -116,14 +116,14 @@ typedef struct ide_adapter_channel_info {
|
||||
// info about controller
|
||||
typedef struct ide_adapter_controller_info {
|
||||
pci_device_module_info *pci;
|
||||
pci_device device;
|
||||
|
||||
pci_device *device;
|
||||
|
||||
uint16 bus_master_base;
|
||||
|
||||
|
||||
uint32 lost; // != 0 if device got removed, i.e. if it must not
|
||||
// be accessed anymore
|
||||
|
||||
device_node_handle node;
|
||||
|
||||
device_node *node;
|
||||
} ide_adapter_controller_info;
|
||||
|
||||
|
||||
@@ -131,6 +131,9 @@ typedef struct ide_adapter_controller_info {
|
||||
typedef struct {
|
||||
module_info info;
|
||||
|
||||
void (*set_channel)(ide_adapter_channel_info *channel,
|
||||
ide_channel ideChannel);
|
||||
|
||||
// function calls that can be forwarded from actual driver
|
||||
status_t (*write_command_block_regs)(ide_adapter_channel_info *channel,
|
||||
ide_task_file *tf, ide_reg_mask mask);
|
||||
@@ -138,7 +141,7 @@ typedef struct {
|
||||
ide_task_file *tf, ide_reg_mask mask);
|
||||
|
||||
uint8 (*get_altstatus) (ide_adapter_channel_info *channel);
|
||||
status_t (*write_device_control) (ide_adapter_channel_info *channel, uint8 val);
|
||||
status_t (*write_device_control) (ide_adapter_channel_info *channel, uint8 val);
|
||||
|
||||
status_t (*write_pio)(ide_adapter_channel_info *channel, uint16 *data, int count, bool force_16bit);
|
||||
status_t (*read_pio)(ide_adapter_channel_info *channel, uint16 *data, int count, bool force_16bit);
|
||||
@@ -153,47 +156,47 @@ typedef struct {
|
||||
int32 (*inthand)(void *arg);
|
||||
|
||||
// functions that must be called by init/uninit etc. of channel driver
|
||||
status_t (*init_channel)(device_node_handle node, ide_channel ide_channel,
|
||||
status_t (*init_channel)(device_node *node,
|
||||
ide_adapter_channel_info **cookie, size_t total_data_size,
|
||||
int32 (*inthand)(void *arg));
|
||||
status_t (*uninit_channel)(ide_adapter_channel_info *channel);
|
||||
void (*channel_removed)(device_node_handle node, ide_adapter_channel_info *channel);
|
||||
void (*uninit_channel)(ide_adapter_channel_info *channel);
|
||||
void (*channel_removed)(ide_adapter_channel_info *channel);
|
||||
|
||||
// publish channel node
|
||||
status_t (*publish_channel)(device_node_handle controller_node,
|
||||
status_t (*publish_channel)(device_node *controller_node,
|
||||
const char *channel_module_name, uint16 command_block_base,
|
||||
uint16 control_block_base, uint8 intnum, bool can_dma,
|
||||
uint8 channel_index, const char *name,
|
||||
io_resource_handle *resources, device_node_handle *node);
|
||||
uint8 channel_index, const char *name,
|
||||
const io_resource *resources, device_node **node);
|
||||
// verify channel configuration and publish node on success
|
||||
status_t (*detect_channel)(pci_device_module_info *pci, pci_device pci_device,
|
||||
device_node_handle controller_node, const char *channel_module_name,
|
||||
status_t (*detect_channel)(pci_device_module_info *pci, pci_device *pciDevice,
|
||||
device_node *controller_node, const char *channel_module_name,
|
||||
bool controller_can_dma, uint16 command_block_base,
|
||||
uint16 control_block_base, uint16 bus_master_base,
|
||||
uint8 intnum, uint8 channel_index, const char *name,
|
||||
device_node_handle *node, bool supports_compatibility_mode);
|
||||
device_node **node, bool supports_compatibility_mode);
|
||||
|
||||
// functions that must be called by init/uninit etc. of controller driver
|
||||
status_t (*init_controller)(device_node_handle node, void *user_cookie,
|
||||
status_t (*init_controller)(device_node *node,
|
||||
ide_adapter_controller_info **cookie, size_t total_data_size);
|
||||
status_t (*uninit_controller)(ide_adapter_controller_info *controller);
|
||||
void (*controller_removed)(device_node_handle node, ide_adapter_controller_info *controller);
|
||||
void (*uninit_controller)(ide_adapter_controller_info *controller);
|
||||
void (*controller_removed)(ide_adapter_controller_info *controller);
|
||||
|
||||
// publish controller node
|
||||
status_t (*publish_controller)(device_node_handle parent, uint16 bus_master_base,
|
||||
io_resource_handle *resources, const char *controller_driver,
|
||||
status_t (*publish_controller)(device_node *parent, uint16 bus_master_base,
|
||||
io_resource *resources, const char *controller_driver,
|
||||
const char *controller_driver_type, const char *controller_name,
|
||||
bool can_dma, bool can_cq, uint32 dma_alignment, uint32 dma_boundary,
|
||||
uint32 max_sg_block_size, device_node_handle *node);
|
||||
uint32 max_sg_block_size, device_node **node);
|
||||
// verify controller configuration and publish node on success
|
||||
status_t (*detect_controller)(pci_device_module_info *pci, pci_device pci_device,
|
||||
device_node_handle parent, uint16 bus_master_base,
|
||||
status_t (*detect_controller)(pci_device_module_info *pci, pci_device *pciDevice,
|
||||
device_node *parent, uint16 bus_master_base,
|
||||
const char *controller_driver, const char *controller_driver_type,
|
||||
const char *controller_name, bool can_dma, bool can_cq,
|
||||
uint32 dma_alignment, uint32 dma_boundary, uint32 max_sg_block_size,
|
||||
device_node_handle *node);
|
||||
device_node **node);
|
||||
// standard master probe for controller that registers controller and channel nodes
|
||||
status_t (*probe_controller)(device_node_handle parent, const char *controller_driver,
|
||||
status_t (*probe_controller)(device_node *parent, const char *controller_driver,
|
||||
const char *controller_driver_type, const char *controller_name,
|
||||
const char *channel_module_name, bool can_dma, bool can_cq,
|
||||
uint32 dma_alignment, uint32 dma_boundary, uint32 max_sg_block_size,
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
#define _SCSI_PERIPH_H
|
||||
|
||||
/*
|
||||
Use this module to minimize work required to write a SCSI
|
||||
Use this module to minimize work required to write a SCSI
|
||||
peripheral driver.
|
||||
|
||||
|
||||
It takes care of:
|
||||
- error handling
|
||||
- medium changes (including restarting the medium)
|
||||
- detection of medium capacity
|
||||
- detection of medium capacity
|
||||
*/
|
||||
|
||||
|
||||
@@ -72,12 +72,12 @@ typedef struct scsi_periph_callbacks {
|
||||
// (set to NULL if not a block device)
|
||||
void (*set_capacity)( periph_device_cookie periph_device, uint64 capacity,
|
||||
uint32 block_size );
|
||||
|
||||
|
||||
// *** removable devices
|
||||
// called when media got changed (can be NULL if medium is not changable)
|
||||
// (you don't need to call periph->media_changed, but it's doesn't if you do)
|
||||
// ccb - request at your disposal
|
||||
void (*media_changed)( periph_device_cookie periph_device,
|
||||
void (*media_changed)( periph_device_cookie periph_device,
|
||||
scsi_ccb *request );
|
||||
} scsi_periph_callbacks;
|
||||
|
||||
@@ -87,44 +87,44 @@ typedef struct scsi_periph_interface {
|
||||
module_info info;
|
||||
|
||||
// *** init/cleanup ***
|
||||
status_t (*register_device)(
|
||||
status_t (*register_device)(
|
||||
periph_device_cookie periph_device,
|
||||
scsi_periph_callbacks *callbacks,
|
||||
scsi_device scsi_device,
|
||||
scsi_device scsi_device,
|
||||
scsi_device_interface *scsi,
|
||||
device_node_handle node,
|
||||
device_node *node,
|
||||
bool removable,
|
||||
scsi_periph_device *driver );
|
||||
status_t (*unregister_device)( scsi_periph_device driver );
|
||||
|
||||
|
||||
// *** basic command execution ***
|
||||
// exec command, retrying on problems
|
||||
status_t (*safe_exec)(
|
||||
scsi_periph_device periph_device,
|
||||
scsi_ccb *request );
|
||||
// exec simple command
|
||||
status_t (*simple_exec)( scsi_periph_device device,
|
||||
void *cdb, uchar cdb_len, void *data, size_t data_len,
|
||||
status_t (*simple_exec)( scsi_periph_device device,
|
||||
void *cdb, uchar cdb_len, void *data, size_t data_len,
|
||||
int ccb_flags );
|
||||
|
||||
// *** file handling ***
|
||||
// *** file handling ***
|
||||
// to be called when a new file is opened
|
||||
status_t (*handle_open)( scsi_periph_device device,
|
||||
status_t (*handle_open)( scsi_periph_device device,
|
||||
periph_handle_cookie periph_handle, scsi_periph_handle *res_handle );
|
||||
// to be called when a file is closed
|
||||
status_t (*handle_close)( scsi_periph_handle handle );
|
||||
// to be called when a file is freed
|
||||
status_t (*handle_free)( scsi_periph_handle handle );
|
||||
|
||||
// *** default implementation for block devices ***
|
||||
// block read
|
||||
|
||||
// *** default implementation for block devices ***
|
||||
// block read
|
||||
// preferred_ccb_size - preferred command size; if zero, the shortest is used
|
||||
status_t (*read)( scsi_periph_handle handle, const phys_vecs *vecs,
|
||||
status_t (*read)( scsi_periph_handle handle, const phys_vecs *vecs,
|
||||
off_t pos, size_t num_blocks, uint32 block_size, size_t *bytes_transferred,
|
||||
int preferred_ccb_size );
|
||||
// block write
|
||||
// block write
|
||||
// (see block_read)
|
||||
status_t (*write)( scsi_periph_handle handle, const phys_vecs *vecs,
|
||||
status_t (*write)( scsi_periph_handle handle, const phys_vecs *vecs,
|
||||
off_t pos, size_t num_blocks, uint32 block_size, size_t *bytes_transferred,
|
||||
int preferred_ccb_size );
|
||||
// block ioctls
|
||||
@@ -139,24 +139,24 @@ typedef struct scsi_periph_interface {
|
||||
// convert result of *request to err_res
|
||||
err_res (*check_error)( scsi_periph_device device, scsi_ccb *request );
|
||||
// send start or stop command to device
|
||||
// with_LoEj = true - include loading/ejecting,
|
||||
// with_LoEj = true - include loading/ejecting,
|
||||
// false - only do allow/deny
|
||||
err_res (*send_start_stop)( scsi_periph_device device, scsi_ccb *request,
|
||||
err_res (*send_start_stop)( scsi_periph_device device, scsi_ccb *request,
|
||||
bool start, bool with_LoEj );
|
||||
// checks media status and waits for device to become ready
|
||||
// returns: B_OK, B_DEV_MEDIA_CHANGE_REQUESTED, B_NO_MEMORY or
|
||||
// returns: B_OK, B_DEV_MEDIA_CHANGE_REQUESTED, B_NO_MEMORY or
|
||||
// pending error reported by handle_get_error
|
||||
status_t (*get_media_status)( scsi_periph_handle handle );
|
||||
|
||||
// compose device name consisting of prefix and path/target/LUN
|
||||
// (result must be freed by caller)
|
||||
char *(*compose_device_name)(device_node_handle device_node, const char *prefix);
|
||||
|
||||
char *(*compose_device_name)(device_node *device_node, const char *prefix);
|
||||
|
||||
// fill data with icon (for B_GET_ICON ioctl)
|
||||
status_t (*get_icon)( icon_type type, device_icon *data );
|
||||
|
||||
// synchronizes (flush) the device cache
|
||||
err_res(*synchronize_cache)(scsi_periph_device device, scsi_ccb *request);
|
||||
err_res(*synchronize_cache)(scsi_periph_device device, scsi_ccb *request);
|
||||
} scsi_periph_interface;
|
||||
|
||||
#define SCSI_PERIPH_MODULE_NAME "generic/scsi_periph/v1"
|
||||
|
||||
Reference in New Issue
Block a user