diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/device.c b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/device.c index 6b3f923614..1ec38ba723 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/device.c +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/device.c @@ -1,7 +1,7 @@ /* -** Copyright 2002/03, Thomas Kurschel. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2002/03, Thomas Kurschel. All rights reserved. + * Distributed under the terms of the MIT License. + */ /* Part of Open SCSI Disk Driver @@ -9,6 +9,7 @@ Device management. */ + #include "scsi_dsk_int.h" #include @@ -23,7 +24,7 @@ das_init_device(pnp_node_handle node, void *user_cookie, void **cookie) status_t res; scsi_ccb *request; - SHOW_FLOW0( 3, "" ); + SHOW_FLOW0(3, ""); device = (das_device_info *)malloc(sizeof(*device)); if (device == NULL) @@ -135,12 +136,11 @@ das_device_added(pnp_node_handle node) goto err; } - SHOW_FLOW(3, "name=%s", name); + SHOW_FLOW(3, "name = %s", name); // ready to register { - pnp_node_attr attrs[] = - { + pnp_node_attr attrs[] = { { PNP_DRIVER_DRIVER, B_STRING_TYPE, { string: SCSI_DSK_MODULE_NAME }}, { PNP_DRIVER_TYPE, B_STRING_TYPE, { string: BLKDEV_TYPE_NAME }}, // we always want blkdev on top of us diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/handle.c b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/handle.c index dfc937df37..eaff182d23 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/handle.c +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/handle.c @@ -1,7 +1,7 @@ /* -** Copyright 2002/03, Thomas Kurschel. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2002/03, Thomas Kurschel. All rights reserved. + * Distributed under the terms of the MIT License. + */ /* Part of Open SCSI Disk Driver @@ -9,56 +9,63 @@ File handle management. */ + #include "scsi_dsk_int.h" #include -status_t das_open( das_device_info *device, das_handle_info **handle_out ) + +status_t +das_open(das_device_info *device, das_handle_info **handle_out) { das_handle_info *handle; int res; - - SHOW_FLOW0( 3, "" ); - - handle = (das_handle_info *)malloc( sizeof( *handle )); - if( handle == NULL ) + + SHOW_FLOW0(3, ""); + + handle = (das_handle_info *)malloc(sizeof(*handle)); + if (handle == NULL) return B_NO_MEMORY; - + handle->device = device; - - res = scsi_periph->handle_open( device->scsi_periph_device, + + res = scsi_periph->handle_open(device->scsi_periph_device, (periph_handle_cookie)handle, - &handle->scsi_periph_handle ); - if( res < 0 ) { - free( handle ); + &handle->scsi_periph_handle); + if (res < 0) { + free(handle); return res; } - - SHOW_FLOW0( 3, "opened" ); + + SHOW_FLOW0(3, "opened"); *handle_out = handle; return B_OK; } -status_t das_close( das_handle_info *handle ) + +status_t +das_close(das_handle_info *handle) { - SHOW_FLOW0( 3, "" ); - - scsi_periph->handle_close( handle->scsi_periph_handle ); - - SHOW_FLOW0( 3, "done" ); - + SHOW_FLOW0(3, ""); + + scsi_periph->handle_close(handle->scsi_periph_handle); + + SHOW_FLOW0(3, "done"); + return B_OK; } -status_t das_free( das_handle_info *handle ) + +status_t +das_free(das_handle_info *handle) { - SHOW_FLOW0( 3, "" ); - - scsi_periph->handle_free( handle->scsi_periph_handle ); - free( handle ); - - SHOW_FLOW0( 3, "done" ); - + SHOW_FLOW0(3, ""); + + scsi_periph->handle_free(handle->scsi_periph_handle); + free(handle); + + SHOW_FLOW0(3, "done"); + return B_OK; } diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/io.c b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/io.c index a6b36c2004..1d69e23529 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/io.c +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/io.c @@ -1,7 +1,7 @@ /* -** Copyright 2002/03, Thomas Kurschel. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2002/03, Thomas Kurschel. All rights reserved. + * Distributed under the terms of the MIT License. + */ /* Part of Open SCSI Disk Driver @@ -9,37 +9,41 @@ Everything doing the real input/output stuff. */ + #include "scsi_dsk_int.h" #define DAS_STD_TIMEOUT 10 // we don't want to inline this function - it's just not worth it -static int das_read_write( das_handle_info *handle, const phys_vecs *vecs, +static int das_read_write(das_handle_info *handle, const phys_vecs *vecs, off_t pos, size_t num_blocks, uint32 block_size, size_t *bytes_transferred, - bool write ); + bool write); -status_t das_read( das_handle_info *handle, const phys_vecs *vecs, - off_t pos, size_t num_blocks, uint32 block_size, size_t *bytes_transferred ) +status_t +das_read(das_handle_info *handle, const phys_vecs *vecs, off_t pos, size_t numBlocks, + uint32 blockSize, size_t *bytesTransferred) { - return das_read_write( handle, vecs, pos, - num_blocks, block_size, bytes_transferred, false ); + return das_read_write(handle, vecs, pos, numBlocks, blockSize, + bytesTransferred, false); } -status_t das_write( das_handle_info *handle, const phys_vecs *vecs, - off_t pos, size_t num_blocks, uint32 block_size, size_t *bytes_transferred ) +status_t +das_write(das_handle_info *handle, const phys_vecs *vecs, off_t pos, size_t numBlocks, + uint32 blockSize, size_t *bytesTransferred) { - return das_read_write( handle, vecs, pos, - num_blocks, block_size, bytes_transferred, true ); + return das_read_write(handle, vecs, pos, numBlocks, blockSize, + bytesTransferred, true); } -// universal read/write function -static int das_read_write( das_handle_info *handle, const phys_vecs *vecs, - off_t pos64, size_t num_blocks, uint32 block_size, size_t *bytes_transferred, - bool write ) +/** universal read/write function */ + +static int +das_read_write(das_handle_info *handle, const phys_vecs *vecs, off_t pos64, + size_t num_blocks, uint32 block_size, size_t *bytes_transferred, bool write) { das_device_info *device = handle->device; scsi_ccb *request; @@ -49,38 +53,37 @@ static int das_read_write( das_handle_info *handle, const phys_vecs *vecs, uint32 pos = pos64; // don't test rw10_enabled restrictions - this flag may get changed - request = device->scsi->alloc_ccb( device->scsi_device ); - - if( request == NULL ) + request = device->scsi->alloc_ccb(device->scsi_device); + if (request == NULL) return B_NO_MEMORY; do { size_t num_bytes; bool is_rw10; - + request->flags = write ? SCSI_DIR_OUT : SCSI_DIR_IN; // make sure we avoid 10 byte commands if they aren't supported - if( !device->rw10_enabled ) { + if (!device->rw10_enabled) { // restricting transfer is OK - the block manager will // take care of transferring the rest - if( num_blocks > 0x100 ) + if (num_blocks > 0x100) num_blocks = 0x100; - + // no way to break the 21 bit address limit - if( pos64 > 0x200000 ) { + if (pos64 > 0x200000) { err = B_BAD_VALUE; goto abort; } - + // don't allow transfer cross the 24 bit address limit // (I'm not sure whether this is allowed, but this way we // are sure to not ask for trouble) - num_blocks = min( num_blocks, 0x100000 - pos ); + num_blocks = min(num_blocks, 0x100000 - pos); } - + num_bytes = num_blocks * block_size; - + request->data = NULL; request->sg_list = vecs->vec; request->data_len = num_bytes; @@ -89,123 +92,126 @@ static int das_read_write( das_handle_info *handle, const phys_vecs *vecs, request->timeout = DAS_STD_TIMEOUT; // see whether daemon instructed us to post an ordered command; // reset flag after read - request->flags = atomic_and( &device->next_tag_action, 0 ); - - SHOW_FLOW( 3, "ordered: %s", - (request->flags & SCSI_ORDERED_QTAG) == 0 ? "yes" : "no" ); - + request->flags = atomic_and(&device->next_tag_action, 0); + + SHOW_FLOW(3, "ordered: %s", + (request->flags & SCSI_ORDERED_QTAG) == 0 ? "yes" : "no"); + // use 6 byte commands whenever possible - if( pos + num_blocks < 0x200000 && num_blocks <= 0x100 ) { + if (pos + num_blocks < 0x200000 && num_blocks <= 0x100) { scsi_cmd_rw_6 *cmd = (scsi_cmd_rw_6 *)request->cdb; - + is_rw10 = false; - - memset( cmd, 0, sizeof( *cmd )); + + memset(cmd, 0, sizeof(*cmd)); cmd->opcode = write ? SCSI_OP_WRITE_6 : SCSI_OP_READ_6; cmd->high_LBA = (pos >> 16) & 0x1f; cmd->mid_LBA = (pos >> 8) & 0xff; cmd->low_LBA = pos & 0xff; cmd->length = num_blocks; - - request->cdb_len = sizeof( *cmd ); + + request->cdb_len = sizeof(*cmd); } else { scsi_cmd_rw_10 *cmd = (scsi_cmd_rw_10 *)request->cdb; - + is_rw10 = true; - - memset( cmd, 0, sizeof( *cmd )); + + memset(cmd, 0, sizeof(*cmd)); cmd->opcode = write ? SCSI_OP_WRITE_10 : SCSI_OP_READ_10; cmd->RelAdr = 0; cmd->FUA = 0; cmd->DPO = 0; - + cmd->top_LBA = (pos >> 24) & 0xff; cmd->high_LBA = (pos >> 16) & 0xff; cmd->mid_LBA = (pos >> 8) & 0xff; cmd->low_LBA = pos & 0xff; - + cmd->high_length = (num_blocks >> 8) & 0xff; cmd->low_length = num_blocks & 0xff; - - request->cdb_len = sizeof( *cmd ); + + request->cdb_len = sizeof(*cmd); } // last chance to detect errors that occured during concurrent accesses err = handle->pending_error; - - if( err ) + if (err) goto abort; - - device->scsi->scsi_io( request ); - - acquire_sem( request->completion_sem ); + + device->scsi->scsi_io(request); + + acquire_sem(request->completion_sem); // ask generic peripheral layer what to do now - res = scsi_periph->check_error( device->scsi_periph_device, request ); - - switch( res.action ) { - case err_act_ok: - *bytes_transferred = num_bytes - request->data_resid; - break; - - case err_act_start: - res = scsi_periph->send_start_stop( - device->scsi_periph_device, request, 1, device->removable ); - if( res.action == err_act_ok ) - res.action = err_act_retry; - break; - - case err_act_invalid_req: - // if this was a 10 byte command, the device probably doesn't - // support them, so disable them and retry - if( is_rw10 ) { - atomic_and( &device->rw10_enabled, 0 ); - res.action = err_act_retry; - } else - res.action = err_act_fail; - break; + res = scsi_periph->check_error(device->scsi_periph_device, request); + + switch (res.action) { + case err_act_ok: + *bytes_transferred = num_bytes - request->data_resid; + break; + + case err_act_start: + res = scsi_periph->send_start_stop(device->scsi_periph_device, + request, 1, device->removable); + if (res.action == err_act_ok) + res.action = err_act_retry; + break; + + case err_act_invalid_req: + // if this was a 10 byte command, the device probably doesn't + // support them, so disable them and retry + if (is_rw10) { + atomic_and(&device->rw10_enabled, 0); + res.action = err_act_retry; + } else + res.action = err_act_fail; + break; } - - } while( - (res.action == err_act_retry && retries++ < 3) || - (res.action == err_act_many_retries && retries++ < 30 )); - - device->scsi->free_ccb( request ); - + } while ((res.action == err_act_retry && retries++ < 3) + || (res.action == err_act_many_retries && retries++ < 30)); + + device->scsi->free_ccb(request); + // peripheral layer only created "read" error, so we have to // map them to "write" errors if this was a write request - if( res.error_code == B_DEV_READ_ERROR && write ) + if (res.error_code == B_DEV_READ_ERROR && write) return B_DEV_WRITE_ERROR; - else - return res.error_code; - + + return res.error_code; + abort: - device->scsi->free_ccb( request ); - + device->scsi->free_ccb(request); + return err; } -// kernel daemon -// once in a minute, it sets a flag so that the next command is executed -// ordered; this way, we avoid starvation of SCSI commands inside the -// SCSI queuing system - the ordered command waits for all previous -// commands and thus no command can starve longer then a minute -void das_sync_queue_daemon( void *arg, int iteration ) +/** kernel daemon + * once in a minute, it sets a flag so that the next command is executed + * ordered; this way, we avoid starvation of SCSI commands inside the + * SCSI queuing system - the ordered command waits for all previous + * commands and thus no command can starve longer then a minute + */ + +void +das_sync_queue_daemon(void *arg, int iteration) { das_device_info *device = (das_device_info *)arg; - - atomic_or( &device->next_tag_action, SCSI_ORDERED_QTAG ); + + atomic_or(&device->next_tag_action, SCSI_ORDERED_QTAG); } -void das_handle_set_error( das_handle_info *handle, status_t error_code ) + +void +das_handle_set_error(das_handle_info *handle, status_t errorCode) { - handle->pending_error = error_code; + handle->pending_error = errorCode; } -status_t das_handle_get_error( das_handle_info *handle ) +status_t +das_handle_get_error(das_handle_info *handle) { return handle->pending_error; } diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/wrapper.h b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/wrapper.h index 6793cb73be..57f5c881e2 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/wrapper.h +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_dsk/wrapper.h @@ -43,7 +43,7 @@ #endif #ifndef debug_level_flow -# define debug_level_flow 3 +# define debug_level_flow 1 #endif #ifndef debug_level_info @@ -51,7 +51,7 @@ #endif #ifndef debug_level_error -# define debug_level_error 1 +# define debug_level_error 3 #endif #define FUNC_NAME DEBUG_MSG_PREFIX __FUNCTION__ ": "