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