Minor cleanup.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11738 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-03-14 17:51:03 +00:00
parent eec5ba5ba7
commit f77f93d98a
+22 -23
View File
@@ -20,9 +20,9 @@
- single entry system as proposed by CAM involves extra tests and overhead - single entry system as proposed by CAM involves extra tests and overhead
because of generalized data structure because of generalized data structure
For peripheral driver writers: For peripheral driver writers:
Something about requests involving data transfer: you can either specify Something about requests involving data transfer: you can either specify
the virtual address in <data> of CCB (in which case it must be continuous), the virtual address in <data> of CCB (in which case it must be continuous),
or store a pointer to a S/G list that contains physical addresses in or store a pointer to a S/G list that contains physical addresses in
@@ -31,12 +31,12 @@
in a different thread context. This is also the reason why the S/G list has in a different thread context. This is also the reason why the S/G list has
to contain physical addresses. For obvious reason, the data buffer specified to contain physical addresses. For obvious reason, the data buffer specified
by <sg_list> must be locked, but <data> doesn't need to be. by <sg_list> must be locked, but <data> doesn't need to be.
You can either execute the request synchronously ("sync_io") or You can either execute the request synchronously ("sync_io") or
asynchronously ("async_io"; you have to acquire <completion_sem> to find asynchronously ("async_io"; you have to acquire <completion_sem> to find
out when the request is finished). In the first case you can use either out when the request is finished). In the first case you can use either
<data> or <sg_list>, in the latter <sg_list> only. <data> or <sg_list>, in the latter <sg_list> only.
The SCSI bus manager takes care that the controller can access the data The SCSI bus manager takes care that the controller can access the data
via DMA by copying it into a buffer if necessary. For the paging path, via DMA by copying it into a buffer if necessary. For the paging path,
this can lead to problems (if the system writes a page to disk and the SCSI this can lead to problems (if the system writes a page to disk and the SCSI
@@ -44,13 +44,13 @@
therefore the blk_man takes care that is not necessary for reads/writes. therefore the blk_man takes care that is not necessary for reads/writes.
To safe some microseconds, you should set the SCSI_DMA_SAFE flag for these To safe some microseconds, you should set the SCSI_DMA_SAFE flag for these
requests, so the SCSI bus manager ommittes the test. requests, so the SCSI bus manager ommittes the test.
Effectively, using synchronous execution and specifying the address via Effectively, using synchronous execution and specifying the address via
<data> is a safe bet. <data> is a safe bet.
For SIM writers: For SIM writers:
Requests sent by peripheral drivers are forwarded to the <scsi_io> entry Requests sent by peripheral drivers are forwarded to the <scsi_io> entry
of the SIM. You should return as soon as some waiting is required. of the SIM. You should return as soon as some waiting is required.
Usually, the controller raises an IRQ when a request can be continued Usually, the controller raises an IRQ when a request can be continued
@@ -71,14 +71,14 @@
Because of the asynchronous nature, requests may still arrive after the Because of the asynchronous nature, requests may still arrive after the
overflow condition being signalled, so you should add a safety test to overflow condition being signalled, so you should add a safety test to
<scsi_io>. <scsi_io>.
If a problem occurs during execution, you can ask for a restart via If a problem occurs during execution, you can ask for a restart via
<resubmit>. The request in question will be submitted as soon as possible. <resubmit>. The request in question will be submitted as soon as possible.
If you want to be not disturbed, you can block further requests via If you want to be not disturbed, you can block further requests via
<block_bus>/<block_device>. As said above, you must have a safety test <block_bus>/<block_device>. As said above, you must have a safety test
at <scsi_io> though. at <scsi_io> though.
If the SIM uses a non-SCSI protocol, it can ask the SCSI bus manager If the SIM uses a non-SCSI protocol, it can ask the SCSI bus manager
to emulate unsupported SCSI commands by translating them other (supported) to emulate unsupported SCSI commands by translating them other (supported)
commands. The bus manager calls <get_restriction> during detection for commands. The bus manager calls <get_restriction> during detection for
@@ -95,7 +95,6 @@
#include <KernelExport.h> #include <KernelExport.h>
#include <device_manager.h> #include <device_manager.h>
//#include "r5_wrapper.h"
#define SCSI_MAX_CDB_SIZE 16 // max size of cdb #define SCSI_MAX_CDB_SIZE 16 // max size of cdb
@@ -112,7 +111,7 @@ typedef struct scsi_device_info *scsi_device;
typedef struct scsi_ccb typedef struct scsi_ccb
{ {
struct scsi_ccb *next, *prev; // internal struct scsi_ccb *next, *prev; // internal
uchar subsys_status; // Returned subsystem status uchar subsys_status; // Returned subsystem status
uchar device_status; // Returned scsi device status uchar device_status; // Returned scsi device status
@@ -120,36 +119,36 @@ typedef struct scsi_ccb
uchar target_id; // Target device ID uchar target_id; // Target device ID
uchar target_lun; // Target LUN number uchar target_lun; // Target LUN number
uint32 flags; // Flags for operation of the subsystem uint32 flags; // Flags for operation of the subsystem
// released once after asynchronous execution of request; // released once after asynchronous execution of request;
// initialised by alloc_ccb, can be replaced for action but // initialised by alloc_ccb, can be replaced for action but
// must be restored before returning via free_ccb // must be restored before returning via free_ccb
sem_id completion_sem; sem_id completion_sem;
uint8 cdb[SCSI_MAX_CDB_SIZE]; // command data block uint8 cdb[SCSI_MAX_CDB_SIZE]; // command data block
uchar cdb_len; // length of command in bytes uchar cdb_len; // length of command in bytes
int64 sort; // value of command to sort on (<0 means n/a) int64 sort; // value of command to sort on (<0 means n/a)
bigtime_t timeout; // timeout - 0 = use default bigtime_t timeout; // timeout - 0 = use default
uchar *data; // pointer to data uchar *data; // pointer to data
const physical_entry *sg_list; // SG list const physical_entry *sg_list; // SG list
uint16 sg_cnt; // number of SG entries uint16 sg_cnt; // number of SG entries
uint32 data_len; // length of data uint32 data_len; // length of data
int32 data_resid; // data transfer residual length: 2's comp int32 data_resid; // data transfer residual length: 2's comp
uchar sense[SCSI_MAX_SENSE_SIZE]; // autosense data uchar sense[SCSI_MAX_SENSE_SIZE]; // autosense data
uchar sense_resid; // autosense resid length: 2's comp uchar sense_resid; // autosense resid length: 2's comp
// private // private
bool ordered : 1; // request cannot overtake/be overtaken by others bool ordered : 1; // request cannot overtake/be overtaken by others
bool buffered : 1; // data is buffered to make it DMA safe bool buffered : 1; // data is buffered to make it DMA safe
bool emulated : 1; // command is executed as part of emulation bool emulated : 1; // command is executed as part of emulation
scsi_bus bus; // associated bus scsi_bus bus; // associated bus
scsi_device device; // associated device scsi_device device; // associated device
struct dma_buffer *dma_buffer; // used dma buffer, or NULL struct dma_buffer *dma_buffer; // used dma buffer, or NULL
uchar state; // bus manager state uchar state; // bus manager state
// original data before command emulation was applied // original data before command emulation was applied
uint8 orig_cdb[SCSI_MAX_CDB_SIZE]; uint8 orig_cdb[SCSI_MAX_CDB_SIZE];
uchar orig_cdb_len; uchar orig_cdb_len;
@@ -261,7 +260,7 @@ typedef struct
uint32 hba_queue_size; // size of adapaters command queue uint32 hba_queue_size; // size of adapaters command queue
char sim_vid[SCSI_SIM_ID]; /* Vendor ID of the SIM */ char sim_vid[SCSI_SIM_ID]; /* Vendor ID of the SIM */
char hba_vid[SCSI_HBA_ID]; /* Vendor ID of the HBA */ char hba_vid[SCSI_HBA_ID]; /* Vendor ID of the HBA */
char sim_version[SCSI_VERS]; /* SIM version number */ char sim_version[SCSI_VERS]; /* SIM version number */
char hba_version[SCSI_VERS]; /* HBA version number */ char hba_version[SCSI_VERS]; /* HBA version number */
char controller_family[SCSI_FAM_ID]; /* Controller family */ char controller_family[SCSI_FAM_ID]; /* Controller family */
@@ -301,7 +300,7 @@ typedef struct scsi_device_interface {
scsi_ccb *(*alloc_ccb)(scsi_device device); scsi_ccb *(*alloc_ccb)(scsi_device device);
// free CCB // free CCB
void (*free_ccb)(scsi_ccb *ccb); void (*free_ccb)(scsi_ccb *ccb);
// execute command asynchronously // execute command asynchronously
// when it's finished, the semaphore of the ccb is released // when it's finished, the semaphore of the ccb is released
// you must provide a S/G list if data_len != 0 // you must provide a S/G list if data_len != 0
@@ -309,7 +308,7 @@ typedef struct scsi_device_interface {
// execute command synchronously // execute command synchronously
// you don't need to provide a S/G list nor have to lock data // you don't need to provide a S/G list nor have to lock data
void (*sync_io)(scsi_ccb *ccb); void (*sync_io)(scsi_ccb *ccb);
// abort request // abort request
uchar (*abort)(scsi_ccb *ccb_to_abort); uchar (*abort)(scsi_ccb *ccb_to_abort);
// reset device // reset device
@@ -375,7 +374,7 @@ typedef struct scsi_for_sim_interface {
// e.g. if three were already running plus this request makes // e.g. if three were already running plus this request makes
// num_requests=4 // num_requests=4
void (*finished)(scsi_ccb *ccb, uint num_requests); void (*finished)(scsi_ccb *ccb, uint num_requests);
// following functions return error on invalid arguments only // following functions return error on invalid arguments only
status_t (*alloc_dpc)(scsi_dpc_cookie *dpc); status_t (*alloc_dpc)(scsi_dpc_cookie *dpc);
status_t (*free_dpc)(scsi_dpc_cookie dpc); status_t (*free_dpc)(scsi_dpc_cookie dpc);