VirtualBox

source: vbox/trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h@ 65620

Last change on this file since 65620 was 65111, checked in by vboxsync, 8 years ago

Storage/Devices/VSCSI: Make use of the new SCSI inline helpers and remove the the local inlines

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.1 KB
Line 
1/* $Id: VSCSIInternal.h 65111 2017-01-04 14:07:58Z vboxsync $ */
2/** @file
3 * Virtual SCSI driver: Internal defines
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17#ifndef ___VSCSIInternal_h
18#define ___VSCSIInternal_h
19
20#include <VBox/vscsi.h>
21#include <VBox/scsi.h>
22#include <VBox/scsiinline.h>
23#include <iprt/memcache.h>
24#include <iprt/sg.h>
25#include <iprt/list.h>
26
27#include "VSCSIVpdPages.h"
28
29/** Pointer to an internal virtual SCSI device. */
30typedef VSCSIDEVICEINT *PVSCSIDEVICEINT;
31/** Pointer to an internal virtual SCSI device LUN. */
32typedef VSCSILUNINT *PVSCSILUNINT;
33/** Pointer to an internal virtual SCSI device LUN pointer. */
34typedef PVSCSILUNINT *PPVSCSILUNINT;
35/** Pointer to a virtual SCSI LUN descriptor. */
36typedef struct VSCSILUNDESC *PVSCSILUNDESC;
37/** Pointer to a virtual SCSI request. */
38typedef VSCSIREQINT *PVSCSIREQINT;
39/** Pointer to a virtual SCSI I/O request. */
40typedef VSCSIIOREQINT *PVSCSIIOREQINT;
41/** Pointer to virtual SCSI sense data state. */
42typedef struct VSCSISENSE *PVSCSISENSE;
43
44/**
45 * Virtual SCSI sense data handling.
46 */
47typedef struct VSCSISENSE
48{
49 /** Buffer holding the sense data. */
50 uint8_t abSenseBuf[32];
51} VSCSISENSE;
52
53/**
54 * Virtual SCSI device.
55 */
56typedef struct VSCSIDEVICEINT
57{
58 /** Request completion callback */
59 PFNVSCSIREQCOMPLETED pfnVScsiReqCompleted;
60 /** Opaque user data. */
61 void *pvVScsiDeviceUser;
62 /** Number of LUNs currently attached. */
63 uint32_t cLunsAttached;
64 /** How many LUNs are fitting in the array. */
65 uint32_t cLunsMax;
66 /** Request cache */
67 RTMEMCACHE hCacheReq;
68 /** Sense data handling. */
69 VSCSISENSE VScsiSense;
70 /** Pointer to the array of LUN handles.
71 * The index is the LUN id. */
72 PPVSCSILUNINT papVScsiLun;
73} VSCSIDEVICEINT;
74
75/**
76 * Virtual SCSI device LUN.
77 */
78typedef struct VSCSILUNINT
79{
80 /** Pointer to the parent SCSI device. */
81 PVSCSIDEVICEINT pVScsiDevice;
82 /** Opaque user data */
83 void *pvVScsiLunUser;
84 /** I/O callback table */
85 PVSCSILUNIOCALLBACKS pVScsiLunIoCallbacks;
86 /** Pointer to the LUN type descriptor. */
87 PVSCSILUNDESC pVScsiLunDesc;
88 /** Flag indicating whether LUN is ready. */
89 bool fReady;
90 /** Flag indicating media presence in LUN. */
91 bool fMediaPresent;
92 /** Flags of supported features. */
93 uint64_t fFeatures;
94 /** I/O request processing data */
95 struct
96 {
97 /** Number of outstanding tasks on this LUN. */
98 volatile uint32_t cReqOutstanding;
99 } IoReq;
100} VSCSILUNINT;
101
102/**
103 * Virtual SCSI request.
104 */
105typedef struct VSCSIREQINT
106{
107 /** The LUN the request is for. */
108 uint32_t iLun;
109 /** The CDB */
110 uint8_t *pbCDB;
111 /** Size of the CDB */
112 size_t cbCDB;
113 /** S/G buffer. */
114 RTSGBUF SgBuf;
115 /** Pointer to the sense buffer. */
116 uint8_t *pbSense;
117 /** Size of the sense buffer */
118 size_t cbSense;
119 /** Opaque user data associated with this request */
120 void *pvVScsiReqUser;
121 /** Transfer size determined from the CDB. */
122 size_t cbXfer;
123} VSCSIREQINT;
124
125/**
126 * Virtual SCSI I/O request.
127 */
128typedef struct VSCSIIOREQINT
129{
130 /** The associated request. */
131 PVSCSIREQINT pVScsiReq;
132 /** Lun for this I/O request. */
133 PVSCSILUNINT pVScsiLun;
134 /** Transfer direction */
135 VSCSIIOREQTXDIR enmTxDir;
136 /** Direction dependent data. */
137 union
138 {
139 /** Read/Write request. */
140 struct
141 {
142 /** Start offset */
143 uint64_t uOffset;
144 /** Number of bytes to transfer */
145 size_t cbTransfer;
146 /** Number of bytes the S/G list holds */
147 size_t cbSeg;
148 /** Number of segments. */
149 unsigned cSeg;
150 /** Segment array. */
151 PCRTSGSEG paSeg;
152 } Io;
153 /** Unmap request. */
154 struct
155 {
156 /** Array of ranges to unmap. */
157 PRTRANGE paRanges;
158 /** Number of ranges. */
159 unsigned cRanges;
160 } Unmap;
161 } u;
162} VSCSIIOREQINT;
163
164/**
165 * VPD page pool.
166 */
167typedef struct VSCSIVPDPOOL
168{
169 /** List of registered pages (VSCSIVPDPAGE). */
170 RTLISTANCHOR ListPages;
171} VSCSIVPDPOOL;
172/** Pointer to the VSCSI VPD page pool. */
173typedef VSCSIVPDPOOL *PVSCSIVPDPOOL;
174
175/**
176 * Supported operation code information entry.
177 */
178typedef struct VSCSILUNSUPOPC
179{
180 /** The operation code. */
181 uint8_t u8Opc;
182 /** Service action code if required as indicated by
183 * VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED */
184 uint16_t u16SvcAction;
185 /** Flags. */
186 uint32_t fFlags;
187 /** Readable description for the op code. */
188 const char *pszOpc;
189 /** The length of the CDB for this operation code. */
190 uint8_t cbCdb;
191 /** Pointer to the CDB usage data. */
192 uint8_t *pbCdbUsage;
193 /* The operation specific valuefor the timeout descriptor. */
194 uint8_t u8OpcTimeoutSpec;
195 /** The nominal processing timeout in seconds. */
196 uint16_t cNominalProcessingTimeout;
197 /** The recommend timeout in seconds. */
198 uint16_t cRecommendTimeout;
199} VSCSILUNSUPOPC;
200/** Pointer to a operation code information entry. */
201typedef VSCSILUNSUPOPC *PVSCSILUNSUPOPC;
202/** Pointer to a const operation code information entry. */
203typedef const VSCSILUNSUPOPC *PCVSCSILUNSUPOPC;
204
205/** @name Flags for the supported operation code infromation entries.
206 * @{ */
207/** Flag indicating wheter the service action member is valid and should be
208 * evaluated to find the desired opcode information. */
209#define VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED RT_BIT_32(0)
210/** Flag whether the values for the timeout descriptor are valid. */
211#define VSCSI_LUN_SUP_OPC_TIMEOUT_DESC_VALID RT_BIT_32(1)
212/** @} */
213
214/** @name Support macros to create supported operation code information entries.
215 * @{ */
216#define VSCSI_LUN_SUP_OPC(a_u8Opc, a_pszOpc, a_cbCdb, a_pbCdbUsage) \
217 { a_u8Opc, 0, 0, a_pszOpc, a_cbCdb, a_pbCdbUsage, 0, 0, 0}
218#define VSCSI_LUN_SUP_OPC_SVC(a_u8Opc, a_u16SvcAction, a_pszOpc, a_cbCdb, a_pbCdbUsage) \
219 { a_u8Opc, a_u16SvcAction, VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED, a_pszOpc, a_cbCdb, a_pbCdbUsage, 0, 0, 0}
220/** @} */
221
222/**
223 * Virtual SCSI LUN descriptor.
224 */
225typedef struct VSCSILUNDESC
226{
227 /** Device type this descriptor emulates. */
228 VSCSILUNTYPE enmLunType;
229 /** Descriptor name */
230 const char *pcszDescName;
231 /** LUN type size */
232 size_t cbLun;
233 /** Number of entries in the supported operation codes array. */
234 uint32_t cSupOpcInfo;
235 /** Pointer to the array of supported operation codes for the
236 * REPORT RUPPORTED OPERATION CODES command handled by the generic
237 * device driver - optional.
238 */
239 PCVSCSILUNSUPOPC paSupOpcInfo;
240
241 /**
242 * Initialise a Lun instance.
243 *
244 * @returns VBox status code.
245 * @param pVScsiLun The SCSI LUN instance.
246 */
247 DECLR3CALLBACKMEMBER(int, pfnVScsiLunInit, (PVSCSILUNINT pVScsiLun));
248
249 /**
250 * Destroy a Lun instance.
251 *
252 * @returns VBox status code.
253 * @param pVScsiLun The SCSI LUN instance.
254 */
255 DECLR3CALLBACKMEMBER(int, pfnVScsiLunDestroy, (PVSCSILUNINT pVScsiLun));
256
257 /**
258 * Processes a SCSI request.
259 *
260 * @returns VBox status code.
261 * @param pVScsiLun The SCSI LUN instance.
262 * @param pVScsiReq The SCSi request to process.
263 */
264 DECLR3CALLBACKMEMBER(int, pfnVScsiLunReqProcess, (PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq));
265
266 /**
267 * Informs about a medium being inserted - optional.
268 *
269 * @returns VBox status code.
270 * @param pVScsiLun The SCSI LUN instance.
271 */
272 DECLR3CALLBACKMEMBER(int, pfnVScsiLunMediumInserted, (PVSCSILUNINT pVScsiLun));
273
274 /**
275 * Informs about a medium being removed - optional.
276 *
277 * @returns VBox status code.
278 * @param pVScsiLun The SCSI LUN instance.
279 */
280 DECLR3CALLBACKMEMBER(int, pfnVScsiLunMediumRemoved, (PVSCSILUNINT pVScsiLun));
281
282} VSCSILUNDESC;
283
284/** Maximum number of LUNs a device can have. */
285#define VSCSI_DEVICE_LUN_MAX 128
286
287/**
288 * Completes a SCSI request and calls the completion handler.
289 *
290 * @returns nothing.
291 * @param pVScsiDevice The virtual SCSI device.
292 * @param pVScsiReq The request which completed.
293 * @param rcScsiCode The status code
294 * One of the SCSI_STATUS_* #defines.
295 * @param fRedoPossible Flag whether redo is possible.
296 * @param rcReq Informational return code of the request.
297 */
298void vscsiDeviceReqComplete(PVSCSIDEVICEINT pVScsiDevice, PVSCSIREQINT pVScsiReq,
299 int rcScsiCode, bool fRedoPossible, int rcReq);
300
301/**
302 * Init the sense data state.
303 *
304 * @returns nothing.
305 * @param pVScsiSense The SCSI sense data state to init.
306 */
307void vscsiSenseInit(PVSCSISENSE pVScsiSense);
308
309/**
310 * Sets a ok sense code.
311 *
312 * @returns SCSI status code.
313 * @param pVScsiSense The SCSI sense state to use.
314 * @param pVScsiReq The SCSI request.
315 */
316int vscsiReqSenseOkSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq);
317
318/**
319 * Sets an error sense code.
320 *
321 * @returns SCSI status code.
322 * @param pVScsiSense The SCSI sense state to use.
323 * @param pVScsiReq The SCSI request.
324 * @param uSCSISenseKey The SCSI sense key to set.
325 * @param uSCSIASC The ASC value.
326 * @param uSCSIASC The ASCQ value.
327 */
328int vscsiReqSenseErrorSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey,
329 uint8_t uSCSIASC, uint8_t uSCSIASCQ);
330
331/**
332 * Sets an error sense code with additional information.
333 *
334 * @returns SCSI status code.
335 * @param pVScsiSense The SCSI sense state to use.
336 * @param pVScsiReq The SCSI request.
337 * @param uSCSISenseKey The SCSI sense key to set.
338 * @param uSCSIASC The ASC value.
339 * @param uSCSIASC The ASCQ value.
340 * @param uInfo The 32-bit sense information.
341 */
342int vscsiReqSenseErrorInfoSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey,
343 uint8_t uSCSIASC, uint8_t uSCSIASCQ, uint32_t uInfo);
344
345/**
346 * Process a request sense command.
347 *
348 * @returns SCSI status code.
349 * @param pVScsiSense The SCSI sense state to use.
350 * @param pVScsiReq The SCSI request.
351 */
352int vscsiReqSenseCmd(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq);
353
354/**
355 * Inits the VPD page pool.
356 *
357 * @returns VBox status code.
358 * @param pVScsiVpdPool The VPD page pool to initialize.
359 */
360int vscsiVpdPagePoolInit(PVSCSIVPDPOOL pVScsiVpdPool);
361
362/**
363 * Destroys the given VPD page pool freeing all pages in it.
364 *
365 * @returns nothing.
366 * @param pVScsiVpdPool The VPD page pool to destroy.
367 */
368void vscsiVpdPagePoolDestroy(PVSCSIVPDPOOL pVScsiVpdPool);
369
370/**
371 * Allocates a new page in the VPD page pool with the given number.
372 *
373 * @returns VBox status code.
374 * @retval VERR_ALREADY_EXIST if the page number is in use.
375 * @param pVScsiVpdPool The VPD page pool the page will belong to.
376 * @param uPage The page number, must be unique.
377 * @param cbPage Size of the page in bytes.
378 * @param ppbPage Where to store the pointer to the raw page data on success.
379 */
380int vscsiVpdPagePoolAllocNewPage(PVSCSIVPDPOOL pVScsiVpdPool, uint8_t uPage, size_t cbPage, uint8_t **ppbPage);
381
382/**
383 * Queries the given page from the pool and cpies it to the buffer given
384 * by the SCSI request.
385 *
386 * @returns VBox status code.
387 * @retval VERR_NOT_FOUND if the page is not in the pool.
388 * @param pVScsiVpdPool The VPD page pool to use.
389 * @param pVScsiReq The SCSI request.
390 * @param uPage Page to query.
391 */
392int vscsiVpdPagePoolQueryPage(PVSCSIVPDPOOL pVScsiVpdPool, PVSCSIREQINT pVScsiReq, uint8_t uPage);
393
394/**
395 * Inits the I/O request related state for the LUN.
396 *
397 * @returns VBox status code.
398 * @param pVScsiLun The LUN instance.
399 */
400int vscsiIoReqInit(PVSCSILUNINT pVScsiLun);
401
402/**
403 * Enqueues a new flush request
404 *
405 * @returns VBox status code.
406 * @param pVScsiLun The LUN instance which issued the request.
407 * @param pVScsiReq The virtual SCSI request associated with the flush.
408 */
409int vscsiIoReqFlushEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq);
410
411/**
412 * Enqueue a new data transfer request.
413 *
414 * @returns VBox status code.
415 * @param pVScsiLun The LUN instance which issued the request.
416 * @param pVScsiReq The virtual SCSI request associated with the transfer.
417 * @param enmTxDir Transfer direction.
418 * @param uOffset Start offset of the transfer.
419 * @param cbTransfer Number of bytes to transfer.
420 */
421int vscsiIoReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
422 VSCSIIOREQTXDIR enmTxDir, uint64_t uOffset,
423 size_t cbTransfer);
424
425/**
426 * Enqueue a new unmap request.
427 *
428 * @returns VBox status code.
429 * @param pVScsiLun The LUN instance which issued the request.
430 * @param pVScsiReq The virtual SCSI request associated with the transfer.
431 * @param paRanges The array of ranges to unmap.
432 * @param cRanges Number of ranges in the array.
433 */
434int vscsiIoReqUnmapEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
435 PRTRANGE paRanges, unsigned cRanges);
436
437/**
438 * Returns the current number of outstanding tasks on the given LUN.
439 *
440 * @returns Number of outstanding tasks.
441 * @param pVScsiLun The LUN to check.
442 */
443uint32_t vscsiIoReqOutstandingCountGet(PVSCSILUNINT pVScsiLun);
444
445/**
446 * Sets the transfer size for the given request.
447 *
448 * @returns nothing.
449 * @param pVScsiReq The SCSI request.
450 * @param cbXfer The transfer size for the request.
451 */
452DECLINLINE(void) vscsiReqSetXferSize(PVSCSIREQINT pVScsiReq, size_t cbXfer)
453{
454 pVScsiReq->cbXfer = cbXfer;
455}
456
457/**
458 * Wrapper for the set I/O request allocation size I/O callback.
459 *
460 * @returns VBox status code.
461 * @param pVScsiLun The LUN.
462 * @param cbVScsiIoReqAlloc The additional size for the request to allocate.
463 */
464DECLINLINE(int) vscsiLunReqAllocSizeSet(PVSCSILUNINT pVScsiLun, size_t cbVScsiIoReqAlloc)
465{
466 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqAllocSizeSet(pVScsiLun,
467 pVScsiLun->pvVScsiLunUser,
468 cbVScsiIoReqAlloc);
469}
470
471/**
472 * Wrapper for the allocate I/O request I/O callback.
473 *
474 * @returns VBox status code.
475 * @param pVScsiLun The LUN.
476 * @param u64Tag A unique tag to assign to the request.
477 * @param ppVScsiIoReq Where to store the pointer to the request on success.
478 */
479DECLINLINE(int) vscsiLunReqAlloc(PVSCSILUNINT pVScsiLun, uint64_t u64Tag, PVSCSIIOREQINT *ppVScsiIoReq)
480{
481 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqAlloc(pVScsiLun,
482 pVScsiLun->pvVScsiLunUser,
483 u64Tag, ppVScsiIoReq);
484}
485
486/**
487 * Wrapper for the free I/O request I/O callback.
488 *
489 * @returns VBox status code.
490 * @param pVScsiLun The LUN.
491 * @param pVScsiIoReq The request to free.
492 */
493DECLINLINE(int) vscsiLunReqFree(PVSCSILUNINT pVScsiLun, PVSCSIIOREQINT pVScsiIoReq)
494{
495 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqFree(pVScsiLun,
496 pVScsiLun->pvVScsiLunUser,
497 pVScsiIoReq);
498}
499
500/**
501 * Wrapper for the get medium size I/O callback.
502 *
503 * @returns VBox status code.
504 * @param pVScsiLun The LUN.
505 * @param pcbSize Where to store the size on success.
506 */
507DECLINLINE(int) vscsiLunMediumGetSize(PVSCSILUNINT pVScsiLun, uint64_t *pcbSize)
508{
509 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumGetSize(pVScsiLun,
510 pVScsiLun->pvVScsiLunUser,
511 pcbSize);
512}
513
514/**
515 * Wrapper for the get medium sector size I/O callback.
516 *
517 * @returns VBox status code.
518 * @param pVScsiLun The LUN.
519 * @param pcbSectorSize Where to store the sector size on success.
520 */
521DECLINLINE(int) vscsiLunMediumGetSectorSize(PVSCSILUNINT pVScsiLun, uint32_t *pcbSectorSize)
522{
523 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumGetSectorSize(pVScsiLun,
524 pVScsiLun->pvVScsiLunUser,
525 pcbSectorSize);
526}
527
528/**
529 * Wrapper for the get medium lock/unlock I/O callback.
530 *
531 * @returns VBox status code.
532 * @param pVScsiLun The LUN.
533 * @param bool The new medium lock state.
534 */
535DECLINLINE(int) vscsiLunMediumSetLock(PVSCSILUNINT pVScsiLun, bool fLocked)
536{
537 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumSetLock(pVScsiLun,
538 pVScsiLun->pvVScsiLunUser,
539 fLocked);
540}
541
542/**
543 * Wrapper for the eject medium I/O callback.
544 *
545 * @returns VBox status code.
546 * @param pVScsiLun The LUN.
547 */
548DECLINLINE(int) vscsiLunMediumEject(PVSCSILUNINT pVScsiLun)
549{
550 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumEject(pVScsiLun,
551 pVScsiLun->pvVScsiLunUser);
552}
553
554/**
555 * Wrapper for the I/O request enqueue I/O callback.
556 *
557 * @returns VBox status code.
558 * @param pVScsiLun The LUN.
559 * @param pVScsiIoReq The I/O request to enqueue.
560 */
561DECLINLINE(int) vscsiLunReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIIOREQINT pVScsiIoReq)
562{
563 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqTransferEnqueue(pVScsiLun,
564 pVScsiLun->pvVScsiLunUser,
565 pVScsiIoReq);
566}
567
568/**
569 * Wrapper for the get feature flags I/O callback.
570 *
571 * @returns VBox status code.
572 * @param pVScsiLun The LUN.
573 * @param pVScsiIoReq The I/O request to enqueue.
574 */
575DECLINLINE(int) vscsiLunGetFeatureFlags(PVSCSILUNINT pVScsiLun, uint64_t *pfFeatures)
576{
577 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunGetFeatureFlags(pVScsiLun,
578 pVScsiLun->pvVScsiLunUser,
579 pfFeatures);
580}
581
582/**
583 * Wrapper around vscsiReqSenseOkSet()
584 */
585DECLINLINE(int) vscsiLunReqSenseOkSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq)
586{
587 return vscsiReqSenseOkSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq);
588}
589
590/**
591 * Wrapper around vscsiReqSenseErrorSet()
592 */
593DECLINLINE(int) vscsiLunReqSenseErrorSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ)
594{
595 return vscsiReqSenseErrorSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq, uSCSISenseKey, uSCSIASC, uSCSIASCQ);
596}
597
598/**
599 * Wrapper around vscsiReqSenseErrorInfoSet()
600 */
601DECLINLINE(int) vscsiLunReqSenseErrorInfoSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ, uint32_t uInfo)
602{
603 return vscsiReqSenseErrorInfoSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq, uSCSISenseKey, uSCSIASC, uSCSIASCQ, uInfo);
604}
605
606#endif /* ___VSCSIInternal_h */
607
Note: See TracBrowser for help on using the repository browser.

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