20#include "ScsiController.h"
21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/panic.h"
23#include "pedigree/kernel/process/TerminationDeferral.h"
24#include "pedigree/kernel/utilities/new"
28ScsiController::ScsiController(
Controller* pDev,
bool startWorker)
34ScsiController::ScsiController() :
RequestQueue(MakeConstantString(
"ScsiController")) {
39ScsiController::~ScsiController() {
61 panic(
"SCSI controller could not drain work before cache shutdown");
69 panic(
"SCSI controller cache shutdown left queued work behind");
72 if (deviceAvailable) {
79void ScsiController::searchDisks() {
80 for (
size_t i = 0; i < getNumUnits(); i++) {
90 uint64_t p5, uint64_t p6, uint64_t p7, uint64_t p8) {
92 if (p1 == SCSI_REQUEST_PAGING) {
94 request->result = pDisk->doPagingTransfer(request->operation, request->offset, request->page);
95 return request->result == PagingStatus::Success;
97 if (p1 == SCSI_REQUEST_READ)
99 else if (p1 == SCSI_REQUEST_WRITE) {
100 uint64_t result = pDisk->doWrite(p3);
105 }
else if (p1 == SCSI_REQUEST_SYNC)
106 return pDisk->doSync(p3);
107 else if (p1 == SCSI_REQUEST_WRITE_DIRECT)
114 if (request.p1 == SCSI_REQUEST_PAGING && request.p3)
115 reinterpret_cast<PagingRequest*
>(request.p3)->result = PagingStatus::Closed;
117 if (request.p1 == SCSI_REQUEST_WRITE && request.p2) {
119 disk->
unpin(request.p3);
123bool ScsiController::prepareDiskRemoval() {
143void ScsiController::cancelDiskRemoval() {
Device * getChild(size_t n)
void addChild(Device *pDevice)
MUST_USE_RESULT bool tryAcquire(Lease &lease)
bool canWaitForCompletion()
void shutdownDiskCaches(bool deviceAvailable=true)
virtual void cancelRequest(const Request &request)
virtual uint64_t executeRequest(uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5, uint64_t p6, uint64_t p7, uint64_t p8)
OperationBarrier m_DiskOperations
virtual uint64_t doRead(uint64_t location)
bool initialise(class ScsiController *pController, size_t nUnit)
virtual void unpin(uint64_t location)
virtual MUST_USE_RESULT uint64_t doWriteDirect(uint64_t location, uintptr_t page)
void EXPORTED_PUBLIC panic(const char *msg) NORETURN