VirtualBox

Changeset 81368 in vbox


Ignore:
Timestamp:
Oct 18, 2019 7:36:19 PM (5 years ago)
Author:
vboxsync
Message:

Storage/DevVirtioSCSI.cpp: While trying to diagnose issue seen with EFI boot, fixed problem it had working on Windows. At least Windows was able to find and format a disk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp

    r81367 r81368  
    9292#define VIRTIOSCSI_REQ_QUEUE_CNT                    1            /**< Number of req queues exposed by dev.            */
    9393#define VIRTIOSCSI_QUEUE_CNT                        VIRTIOSCSI_REQ_QUEUE_CNT + 2
    94 #define VIRTIOSCSI_MAX_LUN                                    /* < VirtIO specification, section 5.6.4             */
    95 #define VIRTIOSCSI_MAX_COMMANDS_PER_LUN             128          /* < T.B.D. What is a good value for this?           */
    96 #define VIRTIOSCSI_MAX_SEG_COUNT                    126          /* < T.B.D. What is a good value for this?           */
     94#define VIRTIOSCSI_MAX_LUN                          256          /* < VirtIO specification, section 5.6.4             */
     95#define VIRTIOSCSI_MAX_COMMANDS_PER_LUN             128            /* < T.B.D. What is a good value for this?           */
     96#define VIRTIOSCSI_MAX_SEG_COUNT                    126         /* < T.B.D. What is a good value for this?           */
    9797#define VIRTIOSCSI_MAX_SECTORS_HINT                 0x10000      /* < VirtIO specification, section 5.6.4             */
    9898#define VIRTIOSCSI_MAX_CHANNEL_HINT                 0            /* < VirtIO specification, section 5.6.4 should be 0 */
     
    781781    RT_NOREF(pszCtrlRespText);
    782782
    783     RTSGSEG aRespSegs[2];
    784     aRespSegs[0].cbSeg = sizeof(struct REQ_RESP_HDR);
    785     aRespSegs[0].pvSeg = pRespHdr;
    786     aRespSegs[1].cbSeg = pThis->virtioScsiConfig.uSenseSize;
    787     aRespSegs[1].pvSeg = abSenseBuf;
     783    RTSGSEG aReqSegs[2];
     784    aReqSegs[0].cbSeg = sizeof(pRespHdr);
     785    aReqSegs[0].pvSeg = pRespHdr;
     786    aReqSegs[1].cbSeg = pThis->virtioScsiConfig.uSenseSize;
     787    aReqSegs[1].pvSeg = abSenseBuf;
    788788
    789789    if (pbSense && pRespHdr->uSenseLen)
     
    792792        pRespHdr->uSenseLen = 0;
    793793
    794     RTSGBUF respSegBuf;
    795     RTSgBufInit(&respSegBuf, aRespSegs, RT_ELEMENTS(aRespSegs));
     794    RTSGBUF reqSegBuf;
     795    RTSgBufInit(&reqSegBuf, aReqSegs, RT_ELEMENTS(aReqSegs));
    796796
    797797    if (pThis->fResetting)
    798798        pRespHdr->uResponse = VIRTIOSCSI_S_RESET;
    799799
    800     virtioQueuePut(pThis->hVirtio, qIdx, &respSegBuf, pDescChain, true /* fFence */);
     800    virtioQueuePut(pThis->hVirtio, qIdx, &reqSegBuf, pDescChain, true /* fFence */);
    801801    virtioQueueSync(pThis->hVirtio, qIdx);
    802802
     
    966966        RTSGSEG aReqSegs[4];
    967967        aReqSegs[cSegs].pvSeg = &respHdr;
    968         aReqSegs[cSegs++].cbSeg = sizeof(x);
     968        aReqSegs[cSegs++].cbSeg = sizeof(respHdr);
    969969
    970970        aReqSegs[cSegs].pvSeg = pReq->pbSense;
     
    11451145    }
    11461146    else
     1147    if (RT_UNLIKELY(uScsiLun != 0))
     1148    {
     1149        Log2Func(("Error submitting request to bad target (%d) or bad LUN (%d)\n", uTarget, uScsiLun));
     1150        uint8_t abSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED,
     1151                              0, SCSI_SENSE_ILLEGAL_REQUEST,
     1152                              0, 0, 0, 0, 10, SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED, 0, 0 };
     1153        struct REQ_RESP_HDR respHdr = { 0 };
     1154        respHdr.uSenseLen = sizeof(abSense);
     1155        respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
     1156        respHdr.uResponse = VIRTIOSCSI_S_OK;
     1157        respHdr.uResidual = cbDataOut + cbDataIn;
     1158        virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr, abSense);
     1159        return VINF_SUCCESS;
     1160    }
     1161    else
    11471162    if (RT_UNLIKELY(uTarget >= pThis->cTargets || !pTarget->fPresent))
    11481163    {
     
    11561171        respHdr.uResidual = cbDataIn + cbDataOut;
    11571172        virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr , abSense);
    1158         return VINF_SUCCESS;
    1159     }
    1160     else
    1161     if (RT_UNLIKELY(uScsiLun != 0))
    1162     {
    1163         Log2Func(("Error submitting request to bad LUN (%d)\n", uScsiLun));
    1164         uint8_t abSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED,
    1165                               0, SCSI_SENSE_ILLEGAL_REQUEST,
    1166                               0, 0, 0, 0, 10, SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED, 0, 0 };
    1167         struct REQ_RESP_HDR respHdr = { 0 };
    1168         respHdr.uSenseLen = sizeof(abSense);
    1169         respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
    1170         respHdr.uResponse = VIRTIOSCSI_S_OK;
    1171         respHdr.uResidual = cbDataOut + cbDataIn;
    1172         virtioScsiReqErr(pThis, qIdx, pDescChain, &respHdr, abSense);
    11731173        return VINF_SUCCESS;
    11741174    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette