mirror of
https://github.com/moibenko/mtx.git
synced 2025-12-23 05:55:13 +00:00
124 lines
4.5 KiB
Diff
124 lines
4.5 KiB
Diff
diff --git a/mtxl.c b/mtxl.c
|
|
index 3ae77a6..12ea157 100644
|
|
--- a/mtxl.c
|
|
+++ b/mtxl.c
|
|
@@ -39,6 +39,9 @@
|
|
/* zap the following define when we finally add real import/export support */
|
|
#define IMPORT_EXPORT_HACK 1 /* for the moment, import/export == storage */
|
|
|
|
+/* only so many element per SCSI Read Element Status */
|
|
+#define SCSI_RES_ELEMENTS 5000
|
|
+
|
|
/* First, do some SCSI routines: */
|
|
|
|
/* the camlib is used on FreeBSD. */
|
|
@@ -1055,7 +1058,7 @@ static void ParseElementStatus( int *EmptyStorageElementAddress,
|
|
ElementStatus->DataTransferElementSourceStorageElementNumber[ElementStatus->DataTransferElementCount] =
|
|
BigEndian16(TransportElementDescriptor->SourceStorageElementAddress);
|
|
|
|
-#if DEBUG
|
|
+#ifdef DEBUG
|
|
fprintf(stderr, "%d: ElementAddress = %d, Full = %d, SourceElement = %d\n",
|
|
ElementStatus->DataTransferElementCount,
|
|
ElementStatus->DataTransferElementAddress[ElementStatus->DataTransferElementCount],
|
|
@@ -1141,6 +1144,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T *
|
|
int empty_idx = 0;
|
|
boolean is_attached = false;
|
|
int i,j;
|
|
+ int FirstElem, NumElements, NumThisRES;
|
|
|
|
ElementModeSense_T *mode_sense = NULL;
|
|
|
|
@@ -1205,35 +1209,46 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T *
|
|
{
|
|
#ifdef DEBUG
|
|
fprintf(stderr,"Using original element status polling method (storage, import/export, drivers etc independantly)\n");
|
|
+ fprintf(stderr,"Storage start %d, Num %d, max %d\n", mode_sense->StorageStart, mode_sense->NumStorage - mode_sense->NumImportExport, mode_sense->MaxReadElementStatusData);
|
|
#endif
|
|
flags->elementtype = StorageElement; /* sigh! */
|
|
- DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense,
|
|
+
|
|
+ NumElements = mode_sense->NumStorage - mode_sense->NumImportExport;
|
|
+ FirstElem = mode_sense->StorageStart;
|
|
+
|
|
+ do
|
|
+ {
|
|
+ NumThisRES = (NumElements > SCSI_RES_ELEMENTS ? SCSI_RES_ELEMENTS : NumElements);
|
|
+ DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense,
|
|
inquiry_info, flags,
|
|
- mode_sense->StorageStart,
|
|
+ FirstElem,
|
|
/* adjust for import/export. */
|
|
- mode_sense->NumStorage - mode_sense->NumImportExport,
|
|
- mode_sense->MaxReadElementStatusData);
|
|
+ NumThisRES,
|
|
+ SCSI_RES_ELEMENTS * 52 +120);
|
|
|
|
- if (!DataBuffer)
|
|
- {
|
|
+ if (!DataBuffer)
|
|
+ {
|
|
#ifdef DEBUG
|
|
- fprintf(stderr,"Had no elements!\n");
|
|
+ fprintf(stderr,"Had no elements!\n");
|
|
#endif
|
|
- /* darn. Free up stuff and return. */
|
|
+ /* darn. Free up stuff and return. */
|
|
#ifdef DEBUG_MODE_SENSE
|
|
- PrintRequestSense(RequestSense);
|
|
+ PrintRequestSense(RequestSense);
|
|
#endif
|
|
- FreeElementData(ElementStatus);
|
|
- return NULL;
|
|
- }
|
|
+ FreeElementData(ElementStatus);
|
|
+ return NULL;
|
|
+ }
|
|
|
|
#ifdef DEBUG
|
|
- fprintf(stderr, "Parsing storage elements\n");
|
|
+ fprintf(stderr, "Parsing storage elements\n");
|
|
#endif
|
|
- ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount,
|
|
- DataBuffer,ElementStatus,mode_sense,NULL);
|
|
+ ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount,
|
|
+ DataBuffer,ElementStatus,mode_sense,NULL);
|
|
|
|
- free(DataBuffer); /* sigh! */
|
|
+ free(DataBuffer); /* sigh! */
|
|
+ FirstElem += SCSI_RES_ELEMENTS;
|
|
+ NumElements -= SCSI_RES_ELEMENTS;
|
|
+ } while ( NumElements > 0 );
|
|
|
|
/* --------------IMPORT/EXPORT--------------- */
|
|
/* Next let's see if we need to do Import/Export: */
|
|
@@ -1247,8 +1262,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T *
|
|
inquiry_info, flags,
|
|
mode_sense->ImportExportStart,
|
|
mode_sense->NumImportExport,
|
|
- mode_sense->MaxReadElementStatusData);
|
|
-
|
|
+ SCSI_RES_ELEMENTS * 52 +120);
|
|
if (!DataBuffer)
|
|
{
|
|
#ifdef DEBUG
|
|
@@ -1283,7 +1297,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T *
|
|
inquiry_info, flags,
|
|
mode_sense->DataTransferStart,
|
|
mode_sense->NumDataTransfer,
|
|
- mode_sense->MaxReadElementStatusData);
|
|
+ SCSI_RES_ELEMENTS * 52 +120);
|
|
if (!DataBuffer)
|
|
{
|
|
#ifdef DEBUG
|
|
@@ -1322,7 +1336,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T *
|
|
inquiry_info, flags,
|
|
mode_sense->MediumTransportStart,
|
|
1, /* only get 1, sigh. */
|
|
- mode_sense->MaxReadElementStatusData);
|
|
+ SCSI_RES_ELEMENTS * 52 +120);
|
|
if (!DataBuffer)
|
|
{
|
|
#ifdef DEBUG
|
|
|