From 25f926d8e4b852f0d88a63ce005c18309205407b Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sat, 1 Sep 2007 20:26:07 +0000 Subject: [PATCH] forward scsi request to the ports git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22146 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../busses/scsi/ahci/ahci_controller.cpp | 46 ++++++++----------- .../kernel/busses/scsi/ahci/ahci_controller.h | 12 ++--- .../kernel/busses/scsi/ahci/ahci_port.cpp | 40 ++++++++++++++++ .../kernel/busses/scsi/ahci/ahci_port.h | 10 +++- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp index f2e5ec7228..0bb50cb67e 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp @@ -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(); } diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h index 92d30c86f4..25e2f5ffc1 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h @@ -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() { diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp index 2cc60d8a70..62a1fe0055 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -4,6 +4,7 @@ */ #include "ahci_port.h" +#include "ahci_controller.h" #include #include @@ -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; +} + diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h index 8da68672ad..ca487d9c83 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.h @@ -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