forward scsi request to the ports

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22146 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Marcus Overhagen 2007-09-01 20:26:07 +00:00
parent 4f733fe93b
commit 25f926d8e4
4 changed files with 71 additions and 37 deletions

View File

@ -18,7 +18,6 @@
AHCIController::AHCIController(device_node_handle node, pci_device_info *device)
: fNode(node)
, fPCIDevice(device)
, fDevicePresentMask(0)
, fPCIVendorID(0xffff)
, fPCIDeviceID(0xffff)
, fCommandSlotCount(0)
@ -27,7 +26,7 @@ AHCIController::AHCIController(device_node_handle node, pci_device_info *device)
, fIRQ(0)
, fInstanceCheck(-1)
{
memset(fPorts, 0, sizeof(fPorts));
memset(fPort, 0, sizeof(fPort));
}
@ -135,16 +134,16 @@ AHCIController::Init()
for (int i = 0; i <= fPortMax; i++) {
if (fRegs->pi & (1 << i)) {
fPorts[i] = new (std::nothrow)AHCIPort(this, i);
if (!fPorts[i]) {
fPort[i] = new (std::nothrow)AHCIPort(this, i);
if (!fPort[i]) {
TRACE("out of memory creating port %d", i);
break;
}
status_t status = fPorts[i]->Init();
status_t status = fPort[i]->Init();
if (status < B_OK) {
TRACE("init port %d failed", i);
delete fPorts[i];
fPorts[i] = NULL;
delete fPort[i];
fPort[i] = NULL;
break;
}
}
@ -164,9 +163,9 @@ AHCIController::Uninit()
TRACE("AHCIController::Uninit\n");
for (int i = 0; i <= fPortMax; i++) {
if (fPorts[i]) {
fPorts[i]->Uninit();
delete fPorts[i];
if (fPort[i]) {
fPort[i]->Uninit();
delete fPort[i];
}
}
@ -229,8 +228,8 @@ AHCIController::Interrupt(void *data)
for (int i = 0; i < self->fPortMax; i++) {
if (int_stat & (1 << i)) {
if (self->fPorts[i]) {
self->fPorts[i]->Interrupt();
if (self->fPort[i]) {
self->fPort[i]->Interrupt();
} else {
FLOW("interrupt on non-existent port %d\n", i);
}
@ -247,49 +246,42 @@ AHCIController::Interrupt(void *data)
void
AHCIController::ExecuteRequest(scsi_ccb *request)
{
if (request->target_lun || !IsDevicePresent(request->target_id)) {
if (request->target_lun || !fPort[request->target_id]) {
request->subsys_status = SCSI_DEV_NOT_THERE;
gSCSI->finished(request, 1);
return;
}
TRACE("AHCIController::ExecuteRequest opcode %u, length %u\n", request->cdb[0], request->cdb_length);
request->subsys_status = SCSI_DEV_NOT_THERE;
gSCSI->finished(request, 1);
return;
request->subsys_status = SCSI_REQ_CMP;
gSCSI->finished(request, 1);
fPort[request->target_id]->ExecuteRequest(request);
}
uchar
AHCIController::AbortRequest(scsi_ccb *request)
{
if (request->target_lun || !IsDevicePresent(request->target_id))
if (request->target_lun || !fPort[request->target_id])
return SCSI_DEV_NOT_THERE;
return SCSI_REQ_CMP;
return fPort[request->target_id]->AbortRequest(request);
}
uchar
AHCIController::TerminateRequest(scsi_ccb *request)
{
if (request->target_lun || !IsDevicePresent(request->target_id))
if (request->target_lun || !fPort[request->target_id])
return SCSI_DEV_NOT_THERE;
return SCSI_REQ_CMP;
return fPort[request->target_id]->TerminateRequest(request);
}
uchar
AHCIController::ResetDevice(uchar targetID, uchar targetLUN)
{
if (targetLUN || !IsDevicePresent(targetID))
if (targetLUN || !fPort[targetID])
return SCSI_DEV_NOT_THERE;
return SCSI_REQ_CMP;
return fPort[targetID]->ResetDevice();
}

View File

@ -33,10 +33,11 @@ private:
static int32 Interrupt(void *data);
friend class AHCIPort;
private:
device_node_handle fNode;
pci_device_info* fPCIDevice;
uint32 fDevicePresentMask;
uint16 fPCIVendorID;
uint16 fPCIDeviceID;
@ -46,7 +47,7 @@ private:
int fPortCount;
int fPortMax;
uint8 fIRQ;
AHCIPort * fPorts[32];
AHCIPort * fPort[32];
// --- Instance check workaround begin
@ -56,13 +57,6 @@ private:
};
inline bool
AHCIController::IsDevicePresent(uint device)
{
return fDevicePresentMask & (1 << device);
}
inline void
AHCIController::RegsFlush()
{

View File

@ -4,6 +4,7 @@
*/
#include "ahci_port.h"
#include "ahci_controller.h"
#include <KernelExport.h>
#include <stdio.h>
@ -14,6 +15,7 @@
AHCIPort::AHCIPort(AHCIController *controller, int index)
: fIndex(index)
, fRegs(&controller->fRegs->port[index])
{
}
@ -43,3 +45,41 @@ AHCIPort::Interrupt()
{
TRACE("AHCIPort::Interrupt port %d\n", fIndex);
}
void
AHCIPort::ExecuteRequest(scsi_ccb *request)
{
TRACE("AHCIPort::ExecuteRequest port %d, opcode %u, length %u\n", fIndex, request->cdb[0], request->cdb_length);
request->subsys_status = SCSI_DEV_NOT_THERE;
gSCSI->finished(request, 1);
return;
request->subsys_status = SCSI_REQ_CMP;
gSCSI->finished(request, 1);
}
uchar
AHCIPort::AbortRequest(scsi_ccb *request)
{
return SCSI_REQ_CMP;
}
uchar
AHCIPort::TerminateRequest(scsi_ccb *request)
{
return SCSI_REQ_CMP;
}
uchar
AHCIPort::ResetDevice()
{
return SCSI_REQ_CMP;
}

View File

@ -19,8 +19,16 @@ public:
void Interrupt();
void ExecuteRequest(scsi_ccb *request);
uchar AbortRequest(scsi_ccb *request);
uchar TerminateRequest(scsi_ccb *request);
uchar ResetDevice();
private:
int fIndex;
int fIndex;
volatile ahci_port * fRegs;
};
#endif // _AHCI_PORT_H