Move the lock into the request.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30100 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -22,7 +22,6 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
fUseDMA(true),
|
fUseDMA(true),
|
||||||
fRequest(NULL)
|
fRequest(NULL)
|
||||||
{
|
{
|
||||||
mutex_init(&fExecutionLock, "ata io execution");
|
|
||||||
B_INITIALIZE_SPINLOCK(&fInterruptLock);
|
B_INITIALIZE_SPINLOCK(&fInterruptLock);
|
||||||
fInterruptCondition.Init(this, "ata dma transfer");
|
fInterruptCondition.Init(this, "ata dma transfer");
|
||||||
|
|
||||||
@@ -57,7 +56,7 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fRequest = new(std::nothrow) ATARequest();
|
fRequest = new(std::nothrow) ATARequest(true);
|
||||||
if (fRequest == NULL) {
|
if (fRequest == NULL) {
|
||||||
fStatus = B_NO_MEMORY;
|
fStatus = B_NO_MEMORY;
|
||||||
return;
|
return;
|
||||||
@@ -90,8 +89,6 @@ ATAChannel::ATAChannel(device_node *node)
|
|||||||
|
|
||||||
ATAChannel::~ATAChannel()
|
ATAChannel::~ATAChannel()
|
||||||
{
|
{
|
||||||
mutex_lock(&fExecutionLock);
|
|
||||||
|
|
||||||
if (fDevices) {
|
if (fDevices) {
|
||||||
for (uint8 i = 0; i < fDeviceCount; i++)
|
for (uint8 i = 0; i < fDeviceCount; i++)
|
||||||
delete fDevices[i];
|
delete fDevices[i];
|
||||||
@@ -99,7 +96,6 @@ ATAChannel::~ATAChannel()
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete fRequest;
|
delete fRequest;
|
||||||
mutex_destroy(&fExecutionLock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -222,16 +218,14 @@ status_t
|
|||||||
ATAChannel::ExecuteIO(scsi_ccb *ccb)
|
ATAChannel::ExecuteIO(scsi_ccb *ccb)
|
||||||
{
|
{
|
||||||
TRACE_FUNCTION("%p\n", ccb);
|
TRACE_FUNCTION("%p\n", ccb);
|
||||||
if (mutex_trylock(&fExecutionLock) != B_OK) {
|
status_t result = fRequest->Start(ccb);
|
||||||
TRACE("channel is busy\n");
|
if (result != B_OK)
|
||||||
return B_BUSY;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
fRequest->SetCCB(ccb);
|
|
||||||
if (ccb->cdb[0] == SCSI_OP_REQUEST_SENSE) {
|
if (ccb->cdb[0] == SCSI_OP_REQUEST_SENSE) {
|
||||||
TRACE("request sense\n");
|
TRACE("request sense\n");
|
||||||
fRequest->RequestSense();
|
fRequest->RequestSense();
|
||||||
fRequest->Finish(false, &fExecutionLock);
|
fRequest->Finish(false);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +235,7 @@ ATAChannel::ExecuteIO(scsi_ccb *ccb)
|
|||||||
if (ccb->target_id >= fDeviceCount) {
|
if (ccb->target_id >= fDeviceCount) {
|
||||||
TRACE_ERROR("invalid target device\n");
|
TRACE_ERROR("invalid target device\n");
|
||||||
fRequest->SetStatus(SCSI_SEL_TIMEOUT);
|
fRequest->SetStatus(SCSI_SEL_TIMEOUT);
|
||||||
fRequest->Finish(false, &fExecutionLock);
|
fRequest->Finish(false);
|
||||||
return B_BAD_INDEX;
|
return B_BAD_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,15 +243,15 @@ ATAChannel::ExecuteIO(scsi_ccb *ccb)
|
|||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
TRACE_ERROR("target device not present\n");
|
TRACE_ERROR("target device not present\n");
|
||||||
fRequest->SetStatus(SCSI_SEL_TIMEOUT);
|
fRequest->SetStatus(SCSI_SEL_TIMEOUT);
|
||||||
fRequest->Finish(false, &fExecutionLock);
|
fRequest->Finish(false);
|
||||||
return B_BAD_INDEX;
|
return B_BAD_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
fRequest->SetTimeout(ccb->timeout > 0 ? ccb->timeout * 1000 * 1000
|
fRequest->SetTimeout(ccb->timeout > 0 ? ccb->timeout * 1000 * 1000
|
||||||
: ATA_STANDARD_TIMEOUT);
|
: ATA_STANDARD_TIMEOUT);
|
||||||
|
|
||||||
status_t result = device->ExecuteIO(fRequest);
|
result = device->ExecuteIO(fRequest);
|
||||||
fRequest->Finish(false, &fExecutionLock);
|
fRequest->Finish(false);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ ATADevice::SetFeature(int feature)
|
|||||||
{
|
{
|
||||||
TRACE("device_set_feature: feature %d\n", feature);
|
TRACE("device_set_feature: feature %d\n", feature);
|
||||||
|
|
||||||
ATARequest request;
|
ATARequest request(false);
|
||||||
request.SetDevice(this);
|
request.SetDevice(this);
|
||||||
request.SetTimeout(1 * 1000 * 1000);
|
request.SetTimeout(1 * 1000 * 1000);
|
||||||
|
|
||||||
@@ -464,7 +464,7 @@ ATADevice::Identify()
|
|||||||
snprintf(fDebugContext, sizeof(fDebugContext), "%s %lu-%u",
|
snprintf(fDebugContext, sizeof(fDebugContext), "%s %lu-%u",
|
||||||
IsATAPI() ? "pi " : "", fChannel->ChannelID(), fIndex);
|
IsATAPI() ? "pi " : "", fChannel->ChannelID(), fIndex);
|
||||||
|
|
||||||
ATARequest request;
|
ATARequest request(false);
|
||||||
request.SetDevice(this);
|
request.SetDevice(this);
|
||||||
request.SetTimeout(20 * 1000 * 1000);
|
request.SetTimeout(20 * 1000 * 1000);
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ private:
|
|||||||
ata_controller_interface * fController;
|
ata_controller_interface * fController;
|
||||||
void * fCookie;
|
void * fCookie;
|
||||||
|
|
||||||
mutex fExecutionLock;
|
|
||||||
spinlock fInterruptLock;
|
spinlock fInterruptLock;
|
||||||
ConditionVariable fInterruptCondition;
|
ConditionVariable fInterruptCondition;
|
||||||
ConditionVariableEntry fInterruptConditionEntry;
|
ConditionVariableEntry fInterruptConditionEntry;
|
||||||
@@ -240,7 +239,8 @@ private:
|
|||||||
|
|
||||||
class ATARequest {
|
class ATARequest {
|
||||||
public:
|
public:
|
||||||
ATARequest();
|
ATARequest(bool hasLock);
|
||||||
|
~ATARequest();
|
||||||
|
|
||||||
void SetStatus(uint8 status);
|
void SetStatus(uint8 status);
|
||||||
uint8 Status() { return fStatus; };
|
uint8 Status() { return fStatus; };
|
||||||
@@ -266,11 +266,10 @@ public:
|
|||||||
void SetBlocksLeft(uint32 blocksLeft);
|
void SetBlocksLeft(uint32 blocksLeft);
|
||||||
uint32 * BlocksLeft() { return &fBlocksLeft; };
|
uint32 * BlocksLeft() { return &fBlocksLeft; };
|
||||||
|
|
||||||
status_t Finish(bool resubmit,
|
status_t Finish(bool resubmit);
|
||||||
mutex *mutexToUnlock);
|
|
||||||
|
|
||||||
// SCSI stuff
|
// SCSI stuff
|
||||||
void SetCCB(scsi_ccb *ccb);
|
status_t Start(scsi_ccb *ccb);
|
||||||
scsi_ccb * CCB() { return fCCB; };
|
scsi_ccb * CCB() { return fCCB; };
|
||||||
|
|
||||||
void PrepareSGInfo();
|
void PrepareSGInfo();
|
||||||
@@ -293,6 +292,9 @@ private:
|
|||||||
|
|
||||||
const char * _DebugContext() { return " request"; };
|
const char * _DebugContext() { return " request"; };
|
||||||
|
|
||||||
|
mutex fLock;
|
||||||
|
bool fHasLock;
|
||||||
|
|
||||||
uint8 fStatus;
|
uint8 fStatus;
|
||||||
uint8 fSenseKey;
|
uint8 fSenseKey;
|
||||||
uint8 fSenseCode;
|
uint8 fSenseCode;
|
||||||
|
|||||||
@@ -5,18 +5,29 @@
|
|||||||
|
|
||||||
#include "ATAPrivate.h"
|
#include "ATAPrivate.h"
|
||||||
|
|
||||||
ATARequest::ATARequest()
|
ATARequest::ATARequest(bool hasLock)
|
||||||
: fDevice(NULL),
|
: fHasLock(hasLock),
|
||||||
|
fDevice(NULL),
|
||||||
fTimeout(0),
|
fTimeout(0),
|
||||||
fBlocksLeft(0),
|
fBlocksLeft(0),
|
||||||
fIsWrite(false),
|
fIsWrite(false),
|
||||||
fUseDMA(false),
|
fUseDMA(false),
|
||||||
fCCB(NULL)
|
fCCB(NULL)
|
||||||
{
|
{
|
||||||
|
if (hasLock)
|
||||||
|
mutex_init(&fLock, "ata request");
|
||||||
|
|
||||||
ClearSense();
|
ClearSense();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ATARequest::~ATARequest()
|
||||||
|
{
|
||||||
|
if (fHasLock)
|
||||||
|
mutex_destroy(&fLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ATARequest::SetStatus(uint8 status)
|
ATARequest::SetStatus(uint8 status)
|
||||||
{
|
{
|
||||||
@@ -76,7 +87,19 @@ ATARequest::SetBlocksLeft(uint32 blocksLeft)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
ATARequest::Finish(bool resubmit, mutex *mutexToUnlock)
|
ATARequest::Start(scsi_ccb *ccb)
|
||||||
|
{
|
||||||
|
if (mutex_trylock(&fLock) != B_OK)
|
||||||
|
return B_BUSY;
|
||||||
|
|
||||||
|
fCCB = ccb;
|
||||||
|
fStatus = SCSI_REQ_CMP;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
ATARequest::Finish(bool resubmit)
|
||||||
{
|
{
|
||||||
// when the request completed and has set sense
|
// when the request completed and has set sense
|
||||||
// data, report this to the scsi stack by setting
|
// data, report this to the scsi stack by setting
|
||||||
@@ -102,7 +125,7 @@ ATARequest::Finish(bool resubmit, mutex *mutexToUnlock)
|
|||||||
} else
|
} else
|
||||||
fCCB->subsys_status = fStatus;
|
fCCB->subsys_status = fStatus;
|
||||||
|
|
||||||
mutex_unlock(mutexToUnlock);
|
mutex_unlock(&fLock);
|
||||||
|
|
||||||
if (resubmit)
|
if (resubmit)
|
||||||
gSCSIModule->resubmit(fCCB);
|
gSCSIModule->resubmit(fCCB);
|
||||||
@@ -113,14 +136,6 @@ ATARequest::Finish(bool resubmit, mutex *mutexToUnlock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ATARequest::SetCCB(scsi_ccb *ccb)
|
|
||||||
{
|
|
||||||
fCCB = ccb;
|
|
||||||
fStatus = SCSI_REQ_CMP;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ATARequest::RequestSense()
|
ATARequest::RequestSense()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user