summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/Storage/ATAController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Devices/Storage/ATAController.cpp')
-rw-r--r--src/VBox/Devices/Storage/ATAController.cpp81
1 files changed, 24 insertions, 57 deletions
diff --git a/src/VBox/Devices/Storage/ATAController.cpp b/src/VBox/Devices/Storage/ATAController.cpp
index accf49b81..2ccda9c2d 100644
--- a/src/VBox/Devices/Storage/ATAController.cpp
+++ b/src/VBox/Devices/Storage/ATAController.cpp
@@ -1,4 +1,4 @@
-/* $Id: ATAController.cpp 28800 2010-04-27 08:22:32Z vboxsync $ */
+/* $Id: ATAController.cpp 29941 2010-06-01 11:49:49Z vboxsync $ */
/** @file
* DevATA, DevAHCI - Shared ATA/ATAPI controller code (disk and cdrom).
*
@@ -4964,32 +4964,23 @@ int ataControllerDestroy(PAHCIATACONTROLLER pCtl)
return VINF_SUCCESS;
}
-#if 0
/**
* Detach notification.
*
* The DVD drive has been unplugged.
*
* @param pDevIns The device instance.
- * @param iLUN The logical unit which is being detached.
+ * @param fMaster True if the master is detached
+ * false for the slave
*/
-static DECLCALLBACK(void) ataDetach(PPDMDEVINS pDevIns, unsigned iLUN)
+void ataControllerDetach(PAHCIATACONTROLLER pCtl, bool fMaster)
{
- PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
- PAHCIATACONTROLLER pCtl;
AHCIATADevState *pIf;
- unsigned iController;
- unsigned iInterface;
/*
* Locate the controller and stuff.
*/
- iController = iLUN / RT_ELEMENTS(pThis->aCts[0].aIfs);
- AssertReleaseMsg(iController < RT_ELEMENTS(pThis->aCts), ("iController=%d iLUN=%d\n", iController, iLUN));
- pCtl = &pThis->aCts[iController];
-
- iInterface = iLUN % RT_ELEMENTS(pThis->aCts[0].aIfs);
- pIf = &pCtl->aIfs[iInterface];
+ pIf = &pCtl->aIfs[fMaster ? 0 : 1];
/*
* Zero some important members.
@@ -4998,16 +4989,7 @@ static DECLCALLBACK(void) ataDetach(PPDMDEVINS pDevIns, unsigned iLUN)
pIf->pDrvBlock = NULL;
pIf->pDrvBlockBios = NULL;
pIf->pDrvMount = NULL;
-
- /*
- * Just in case there was a medium inserted. Only required when attached to a physical drive
- * in passthrough mode as in virtual ATAPI mode we've got an unmount notification.
- */
- if (pIf->fATAPIPassthrough)
- ataMediumRemoved(pIf);
-
}
-#endif
/**
* Configure a LUN.
@@ -5138,7 +5120,6 @@ static int ataConfigLun(PPDMDEVINS pDevIns, AHCIATADevState *pIf)
return VINF_SUCCESS;
}
-#if 0
/**
* Attach command.
*
@@ -5148,57 +5129,41 @@ static int ataConfigLun(PPDMDEVINS pDevIns, AHCIATADevState *pIf)
* @param pDevIns The device instance.
* @param iLUN The logical unit which is being detached.
*/
-static DECLCALLBACK(int) ataAttach(PPDMDEVINS pDevIns, unsigned iLUN)
+int ataControllerAttach(PAHCIATACONTROLLER pCtl, PPDMIBASE pDrvBase, bool fMaster)
{
- PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
- PAHCIATACONTROLLER pCtl;
- AHCIATADevState *pIf;
- int rc;
- unsigned iController;
- unsigned iInterface;
+ AHCIATADevState *pIf;
+ int rc = VINF_SUCCESS;
/*
* Locate the controller and stuff.
*/
- iController = iLUN / RT_ELEMENTS(pThis->aCts[0].aIfs);
- AssertReleaseMsg(iController < RT_ELEMENTS(pThis->aCts), ("iController=%d iLUN=%d\n", iController, iLUN));
- pCtl = &pThis->aCts[iController];
-
- iInterface = iLUN % RT_ELEMENTS(pThis->aCts[0].aIfs);
- pIf = &pCtl->aIfs[iInterface];
+ pIf = &pCtl->aIfs[fMaster ? 0 : 1];
/* the usual paranoia */
AssertRelease(!pIf->pDrvBase);
AssertRelease(!pIf->pDrvBlock);
Assert(ATADEVSTATE_2_CONTROLLER(pIf) == pCtl);
- Assert(pIf->iLUN == iLUN);
/*
* Try attach the block device and get the interfaces,
* required as well as optional.
*/
- rc = PDMDevHlpDriverAttach(pDevIns, pIf->iLUN, &pIf->IBase, &pIf->pDrvBase, NULL);
- if (RT_SUCCESS(rc))
+
+ pIf->pDrvBase = pDrvBase;
+ if (pDrvBase)
{
- rc = ataConfigLun(pDevIns, pIf);
- /*
- * In case there is a new medium inserted. In virtual ATAPI mode we get an mount
- * notification.
- */
- if (pIf->fATAPIPassthrough)
- ataMediumInserted(pIf);
- }
- else
- AssertMsgFailed(("Failed to attach LUN#%d. rc=%Rrc\n", pIf->iLUN, rc));
+ rc = ataConfigLun(pCtl->pDevInsR3, pIf);
+ AssertRC(rc);
- if (RT_FAILURE(rc))
- {
- pIf->pDrvBase = NULL;
- pIf->pDrvBlock = NULL;
+ if (RT_FAILURE(rc))
+ {
+ pIf->pDrvBase = NULL;
+ pIf->pDrvBlock = NULL;
+ }
}
+
return rc;
}
-#endif
/**
@@ -5465,7 +5430,9 @@ int ataControllerLoadExec(PAHCIATACONTROLLER pCtl, PSSMHANDLE pSSM)
return VINF_SUCCESS;
}
-DECLCALLBACK(int) ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl, PPDMIBASE pDrvBaseMaster, PPDMIBASE pDrvBaseSlave,
+DECLCALLBACK(int) ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl,
+ unsigned iLUNMaster, PPDMIBASE pDrvBaseMaster,
+ unsigned iLUNSlave, PPDMIBASE pDrvBaseSlave,
uint32_t *pcbSSMState, const char *szName, PPDMLED pLed,
PSTAMCOUNTER pStatBytesRead, PSTAMCOUNTER pStatBytesWritten)
{
@@ -5483,7 +5450,7 @@ DECLCALLBACK(int) ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl,
for (uint32_t j = 0; j < RT_ELEMENTS(pCtl->aIfs); j++)
{
- pCtl->aIfs[j].iLUN = j;
+ pCtl->aIfs[j].iLUN = j == 0 ? iLUNMaster : iLUNSlave;
pCtl->aIfs[j].pDevInsR3 = pDevIns;
pCtl->aIfs[j].pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
pCtl->aIfs[j].pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);