* Removed *_BEN() macros.
* Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40222 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2008, Haiku, Inc. All RightsReserved.
|
* Copyright 2004-2011, Haiku, Inc. All RightsReserved.
|
||||||
* Copyright 2002-2003, Thomas Kurschel. All rights reserved.
|
* Copyright 2002-2003, Thomas Kurschel. All rights reserved.
|
||||||
*
|
*
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//! Handling of block device (currently, only a capacity check is provided)
|
//! Handling of block device (currently, only a capacity check is provided)
|
||||||
|
|
||||||
|
|
||||||
@@ -51,13 +52,13 @@ periph_check_capacity(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
return B_DEV_MEDIA_CHANGED;
|
return B_DEV_MEDIA_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
|
|
||||||
if (res == B_OK && request->data_resid == 0) {
|
if (res == B_OK && request->data_resid == 0) {
|
||||||
capacity = B_BENDIAN_TO_HOST_INT32(capacityResult.lba);
|
capacity = B_BENDIAN_TO_HOST_INT32(capacityResult.lba);
|
||||||
|
|
||||||
if (capacity == UINT_MAX) {
|
if (capacity == UINT_MAX) {
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
scsi_cmd_read_capacity_long *cmd
|
scsi_cmd_read_capacity_long *cmd
|
||||||
= (scsi_cmd_read_capacity_long *)request->cdb;
|
= (scsi_cmd_read_capacity_long *)request->cdb;
|
||||||
@@ -73,7 +74,7 @@ periph_check_capacity(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
|
|
||||||
res = periph_safe_exec(device, request);
|
res = periph_safe_exec(device, request);
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
|
|
||||||
if (res == B_OK && request->data_resid == 0) {
|
if (res == B_OK && request->data_resid == 0) {
|
||||||
capacity = B_BENDIAN_TO_HOST_INT64(capacityLongResult.lba);
|
capacity = B_BENDIAN_TO_HOST_INT64(capacityLongResult.lba);
|
||||||
@@ -105,7 +106,7 @@ periph_check_capacity(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
return ERR_DEV_GENERAL;
|
return ERR_DEV_GENERAL;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
SHOW_FLOW(3, "done (%s)", strerror(res));
|
SHOW_FLOW(3, "done (%s)", strerror(res));
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2008, Haiku, Inc. All RightsReserved.
|
* Copyright 2004-2011, Haiku, Inc. All RightsReserved.
|
||||||
* Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
* Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
||||||
*
|
*
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//! Basic handling of device.
|
//! Basic handling of device.
|
||||||
|
|
||||||
|
|
||||||
@@ -52,26 +53,21 @@ periph_compose_device_name(device_node *node, const char *prefix)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
periph_register_device(periph_device_cookie periph_device, scsi_periph_callbacks *callbacks,
|
periph_register_device(periph_device_cookie periph_device,
|
||||||
scsi_device scsi_device, scsi_device_interface *scsi, device_node *node,
|
scsi_periph_callbacks *callbacks, scsi_device scsi_device,
|
||||||
|
scsi_device_interface *scsi, device_node *node,
|
||||||
bool removable, int preferredCcbSize, scsi_periph_device *driver)
|
bool removable, int preferredCcbSize, scsi_periph_device *driver)
|
||||||
{
|
{
|
||||||
scsi_periph_device_info *device;
|
SHOW_FLOW0(3, "");
|
||||||
status_t res;
|
|
||||||
|
|
||||||
SHOW_FLOW0( 3, "" );
|
scsi_periph_device_info *device
|
||||||
|
= (scsi_periph_device_info *)malloc(sizeof(*device));
|
||||||
device = (scsi_periph_device_info *)malloc(sizeof(*device));
|
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
memset(device, 0, sizeof(*device));
|
memset(device, 0, sizeof(*device));
|
||||||
|
|
||||||
if (INIT_BEN(&device->mutex, "SCSI_PERIPH") != B_OK) {
|
mutex_init(&device->mutex, "SCSI_PERIPH");
|
||||||
res = B_NO_MEMORY;
|
|
||||||
goto err1;
|
|
||||||
}
|
|
||||||
|
|
||||||
device->scsi_device = scsi_device;
|
device->scsi_device = scsi_device;
|
||||||
device->scsi = scsi;
|
device->scsi = scsi;
|
||||||
device->periph_device = periph_device;
|
device->periph_device = periph_device;
|
||||||
@@ -87,9 +83,10 @@ periph_register_device(periph_device_cookie periph_device, scsi_periph_callbacks
|
|||||||
device->rw10_enabled = true;
|
device->rw10_enabled = true;
|
||||||
|
|
||||||
// launch sync daemon
|
// launch sync daemon
|
||||||
res = register_kernel_daemon(periph_sync_queue_daemon, device, 60*10);
|
status_t status = register_kernel_daemon(periph_sync_queue_daemon, device,
|
||||||
if (res != B_OK)
|
60*10);
|
||||||
goto err2;
|
if (status != B_OK)
|
||||||
|
goto err1;
|
||||||
|
|
||||||
*driver = device;
|
*driver = device;
|
||||||
|
|
||||||
@@ -97,11 +94,10 @@ periph_register_device(periph_device_cookie periph_device, scsi_periph_callbacks
|
|||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
err2:
|
|
||||||
DELETE_BEN(&device->mutex);
|
|
||||||
err1:
|
err1:
|
||||||
|
mutex_destroy(&device->mutex);
|
||||||
free(device);
|
free(device);
|
||||||
return res;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
* Copyright 2011, Haiku, Inc. All RightsReserved.
|
||||||
|
* Copyright 2002-03, Thomas Kurschel. All rights reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
Part of Open SCSI Peripheral Driver
|
|
||||||
|
|
||||||
Error handling
|
//! Error handling
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "scsi_periph_int.h"
|
#include "scsi_periph_int.h"
|
||||||
|
|
||||||
|
|
||||||
/** decode sense data and generate error code */
|
/*! Decode sense data and generate error code. */
|
||||||
|
|
||||||
static
|
static
|
||||||
err_res check_sense(scsi_periph_device_info *device, scsi_ccb *request)
|
err_res check_sense(scsi_periph_device_info *device, scsi_ccb *request)
|
||||||
{
|
{
|
||||||
@@ -86,9 +83,9 @@ err_res check_sense(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
|
|
||||||
case SCSIS_ASC_REMOVAL_REQUESTED:
|
case SCSIS_ASC_REMOVAL_REQUESTED:
|
||||||
SHOW_INFO0(2, "Removal requested");
|
SHOW_INFO0(2, "Removal requested");
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
device->removal_requested = true;
|
device->removal_requested = true;
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
return MK_ERROR(err_act_retry, B_DEV_MEDIA_CHANGE_REQUESTED);
|
return MK_ERROR(err_act_retry, B_DEV_MEDIA_CHANGE_REQUESTED);
|
||||||
|
|
||||||
@@ -207,8 +204,7 @@ err_res check_sense(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** check scsi status, using sense if available */
|
/*! Check scsi status, using sense if available. */
|
||||||
|
|
||||||
static err_res
|
static err_res
|
||||||
check_scsi_status(scsi_periph_device_info *device, scsi_ccb *request)
|
check_scsi_status(scsi_periph_device_info *device, scsi_ccb *request)
|
||||||
{
|
{
|
||||||
@@ -238,12 +234,11 @@ check_scsi_status(scsi_periph_device_info *device, scsi_ccb *request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** check result of request
|
/*! Check result of request
|
||||||
* 1. check SCSI subsystem problems
|
* 1. check SCSI subsystem problems
|
||||||
* 2. if request hit device, check SCSI status
|
* 2. if request hit device, check SCSI status
|
||||||
* 3. if request got executed, check sense
|
* 3. if request got executed, check sense
|
||||||
*/
|
*/
|
||||||
|
|
||||||
err_res
|
err_res
|
||||||
periph_check_error(scsi_periph_device_info *device, scsi_ccb *request)
|
periph_check_error(scsi_periph_device_info *device, scsi_ccb *request)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,24 +1,23 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
* Copyright 2011, Haiku, Inc. All RightsReserved.
|
||||||
** 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 Peripheral Driver
|
|
||||||
|
|
||||||
Basic handling of file handles.
|
//! Basic handling of file handles.
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "scsi_periph_int.h"
|
#include "scsi_periph_int.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "dl_list.h"
|
#include "dl_list.h"
|
||||||
#include <malloc.h>
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
periph_handle_open(scsi_periph_device_info *device, periph_handle_cookie periph_handle,
|
periph_handle_open(scsi_periph_device_info *device,
|
||||||
scsi_periph_handle_info **res_handle)
|
periph_handle_cookie periph_handle, scsi_periph_handle_info **res_handle)
|
||||||
{
|
{
|
||||||
scsi_periph_handle_info *handle;
|
scsi_periph_handle_info *handle;
|
||||||
|
|
||||||
@@ -32,9 +31,9 @@ periph_handle_open(scsi_periph_device_info *device, periph_handle_cookie periph_
|
|||||||
handle->device = device;
|
handle->device = device;
|
||||||
handle->pending_error = B_OK;
|
handle->pending_error = B_OK;
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
ADD_DL_LIST_HEAD(handle, device->handles, );
|
ADD_DL_LIST_HEAD(handle, device->handles, );
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
*res_handle = handle;
|
*res_handle = handle;
|
||||||
|
|
||||||
@@ -59,9 +58,9 @@ periph_handle_free(scsi_periph_handle_info *handle)
|
|||||||
|
|
||||||
// SHOW_FLOW( 3, "handle=%p, device=%p", handle, handle->device );
|
// SHOW_FLOW( 3, "handle=%p, device=%p", handle, handle->device );
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
REMOVE_DL_LIST(handle, device->handles, );
|
REMOVE_DL_LIST(handle, device->handles, );
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
free(handle);
|
free(handle);
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2004-2007, Haiku, Inc. All RightsReserved.
|
* Copyright 2004-2011, Haiku, Inc. All RightsReserved.
|
||||||
* Copyright 2002-2003, Thomas Kurschel. All rights reserved.
|
* Copyright 2002-2003, Thomas Kurschel. All rights reserved.
|
||||||
*
|
*
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//! Handling of removable media.
|
//! Handling of removable media.
|
||||||
|
|
||||||
|
|
||||||
@@ -70,14 +71,14 @@ periph_media_changed_public(scsi_periph_device_info *device)
|
|||||||
{
|
{
|
||||||
scsi_periph_handle_info *handle;
|
scsi_periph_handle_info *handle;
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
|
|
||||||
// when medium has changed, tell all handles
|
// when medium has changed, tell all handles
|
||||||
// (this must be atomic for each handle!)
|
// (this must be atomic for each handle!)
|
||||||
for (handle = device->handles; handle; handle = handle->next)
|
for (handle = device->handles; handle; handle = handle->next)
|
||||||
handle->pending_error = B_DEV_MEDIA_CHANGED;
|
handle->pending_error = B_DEV_MEDIA_CHANGED;
|
||||||
|
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -151,7 +152,7 @@ periph_get_media_status(scsi_periph_handle_info *handle)
|
|||||||
err_res res;
|
err_res res;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
ACQUIRE_BEN(&device->mutex);
|
mutex_lock(&device->mutex);
|
||||||
|
|
||||||
// removal requests are returned to exactly one handle
|
// removal requests are returned to exactly one handle
|
||||||
// (no real problem, as noone check medias status "by mistake")
|
// (no real problem, as noone check medias status "by mistake")
|
||||||
@@ -170,7 +171,7 @@ periph_get_media_status(scsi_periph_handle_info *handle)
|
|||||||
|
|
||||||
SHOW_FLOW0( 3, "" );
|
SHOW_FLOW0( 3, "" );
|
||||||
|
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
// finally, ask the device itself
|
// finally, ask the device itself
|
||||||
|
|
||||||
@@ -187,7 +188,7 @@ periph_get_media_status(scsi_periph_handle_info *handle)
|
|||||||
return res.error_code;
|
return res.error_code;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
RELEASE_BEN(&device->mutex);
|
mutex_unlock(&device->mutex);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,11 @@
|
|||||||
#ifndef _WRAPPER_H
|
#ifndef _WRAPPER_H
|
||||||
#define _WRAPPER_H
|
#define _WRAPPER_H
|
||||||
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <lock.h>
|
#include <lock.h>
|
||||||
|
|
||||||
|
|
||||||
// benaphores
|
|
||||||
|
|
||||||
#define INIT_BEN(x, prefix) (mutex_init_etc(x, prefix, MUTEX_FLAG_CLONE_NAME), \
|
|
||||||
B_OK)
|
|
||||||
#define DELETE_BEN(x) mutex_destroy(x)
|
|
||||||
#define ACQUIRE_BEN(x) mutex_lock(x)
|
|
||||||
#define RELEASE_BEN(x) mutex_unlock(x)
|
|
||||||
|
|
||||||
// debug output
|
// debug output
|
||||||
|
|
||||||
#ifdef DEBUG_WAIT_ON_MSG
|
#ifdef DEBUG_WAIT_ON_MSG
|
||||||
@@ -87,4 +80,5 @@
|
|||||||
dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \
|
dprintf( "%s%s: "format"\n", FUNC_NAME); DEBUG_WAIT_ERROR \
|
||||||
}} while( 0 )
|
}} while( 0 )
|
||||||
|
|
||||||
#endif /* _BENAPHORE_H */
|
|
||||||
|
#endif /* _WRAPPER_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user