]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
major bug in FIFO_READ_MEM, second try
authorhadaq <hadaq>
Fri, 29 Oct 2010 19:21:55 +0000 (19:21 +0000)
committerhadaq <hadaq>
Fri, 29 Oct 2010 19:21:55 +0000 (19:21 +0000)
libtrbnet/trbnet.c

index 1914c0a347d8f47d78311a726308db680dd488e1..efac30a00cfb77985164dd16f7e2c663bca3bc28 100644 (file)
@@ -1,4 +1,4 @@
-const char trbnet_version[] = "$Revision: 2.86 $";
+const char trbnet_version[] = "$Revision: 2.87 $";
 
 #include <stdlib.h>
 #include <signal.h>
@@ -481,6 +481,10 @@ static int trb_fifo_read(uint8_t channel,
   int userBufferOvf = 0;
   unsigned int timeout = 0;
 
+  uint32_t* lastHeader = NULL;   /* used by FIFO_MODE_REG_READ_MEM Mode */
+  uint32_t memLen = 0;           /* used by FIFO_MODE_REG_READ_MEM     
+                                    and FIFO_MODE_IPU_DATA Mode         */
+
   /* Determin FIFO-Address */
   if (channel >= 4) {
     trb_errno = TRB_INVALID_CHANNEL;
@@ -512,9 +516,7 @@ static int trb_fifo_read(uint8_t channel,
 
   /* Read FIFO-Buffer, copy to User-Buffer */
   while ((*tmp & MASK_FIFO_VALID) != 0) {
-    uint32_t* lastHeader = NULL; /* used by FIFO_MODE_REG_READ_MEM Mode */
-    uint32_t memLen = 0;         /* used by FIFO_MODE_REG_READ_MEM     
-                                    and FIFO_MODE_IPU_DATA Mode         */
+
     fifoDebugCtr++;
 
     if (((*tmp & MASK_FIFO_TYPE) >> SHIFT_FIFO_TYPE) == FIFO_TYPE_IS_HEADER) {
@@ -737,7 +739,6 @@ static int trb_fifo_read(uint8_t channel,
           break;
 
         case FIFO_MODE_REG_READ_MEM:
-          {
             switch (headerType) {
             case HEADER_HDR:
               if (dataCtr < dsize) {
@@ -773,7 +774,6 @@ static int trb_fifo_read(uint8_t channel,
             case HEADER_TRM:
               if (lastHeader != NULL) {
                 *lastHeader |= (memLen << 16);
-                lastHeader = NULL;
               }
               break;
 
@@ -782,64 +782,60 @@ static int trb_fifo_read(uint8_t channel,
               trb_errno = TRB_FIFO_INVALID_HEADER;
               return -1;
             }
-          }
-          break;
+            break;
 
 
         case FIFO_MODE_REGTIME_READ_MEM:
-          {
-            switch (headerType) {
-            case HEADER_HDR:
-              if (dataCtr < dsize) {
-                if (lastHeader != NULL) {
-                  *lastHeader |= (memLen << 16);
-                }
-                memLen = 0;
-                lastHeader = &data[dataCtr];
-                data[dataCtr++] = (uint32_t)package.F0;
+          switch (headerType) {
+          case HEADER_HDR:
+            if (dataCtr < dsize) {
+              if (lastHeader != NULL) {
+                *lastHeader |= (memLen << 16);
+              }
+              memLen = 0;
+              lastHeader = &data[dataCtr];
+              data[dataCtr++] = (uint32_t)package.F0;
 #ifdef TRB_DEBUGGER
-                fprintf(stderr, "D: H: 0x%04x\n", data[dataCtr - 1]);
+              fprintf(stderr, "D: H: 0x%04x\n", data[dataCtr - 1]);
 #endif
-              } else {
-                userBufferOvf = 1;
-              }
-              break;
-              
-            case HEADER_DAT:
-              if (dataCtr + 1< dsize) {
-                if (package.F0 == 0x0000) break; /* it a hack, ask Jan */
-                data[dataCtr++] = (((uint32_t)package.F1 << 16) |
-                                   ((uint32_t)package.F2));
-                data[dataCtr++] = (uint32_t)package.F3; 
+            } else {
+              userBufferOvf = 1;
+            }
+            break;
+            
+          case HEADER_DAT:
+            if (dataCtr + 1< dsize) {
+              if (package.F0 == 0x0000) break; /* it a hack, ask Jan */
+              data[dataCtr++] = (((uint32_t)package.F1 << 16) |
+                                 ((uint32_t)package.F2));
+              data[dataCtr++] = (uint32_t)package.F3; 
 #ifdef TRB_DEBUGGER
-                fprintf(stderr,
-                        "D: 0x%04x  0x%08x\n", memLen, data[dataCtr - 1]); 
+              fprintf(stderr,
+                      "D: 0x%04x  0x%08x\n", memLen, data[dataCtr - 1]); 
 #endif
-                memLen++;
-              } else {
-                userBufferOvf = 1;
-              }
-              break;
-
-            case HEADER_TRM:
-              if (lastHeader != NULL) {
-                *lastHeader |= (memLen << 16);
-                lastHeader = NULL;
-              }
-              break;
-
-            default:
-              fifo_flush(channel);
-              trb_errno = TRB_FIFO_INVALID_HEADER;
-              return -1;
+              memLen++;
+            } else {
+              userBufferOvf = 1;
+            }
+            break;
+            
+          case HEADER_TRM:
+            if (lastHeader != NULL) {
+              *lastHeader |= (memLen << 16);
             }
+            break;
+            
+          default:
+            fifo_flush(channel);
+            trb_errno = TRB_FIFO_INVALID_HEADER;
+            return -1;
           }
           break;
-
+          
         case FIFO_MODE_REG_WRITE:
           if (headerType == HEADER_TRM) break;
           break;
-
+          
         case FIFO_MODE_IPU_DATA:
           {
             unsigned int i;
@@ -2025,3 +2021,4 @@ int trb_register_modify(uint16_t trb_address,
   
   return 0;
 }
+