Style cleanup.

Some more useful default levels for the debug output (only wrapper.h, the
values actually used were okay).


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10303 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-11-30 18:00:26 +00:00
parent 1ed378f0cc
commit 959aeaf834
4 changed files with 154 additions and 141 deletions
@@ -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 <pnp_devfs.h>
@@ -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
@@ -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 <malloc.h>
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;
}
+106 -100
View File
@@ -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;
}
@@ -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__ ": "