OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [spw/] [spwtest.c] - Rev 2

Compare with Previous | Blame | View Log

/*****************************************************************************/
/*   This file is a part of the GRLIB VHDL IP LIBRARY */
/*   Copyright (C) 2004 GAISLER RESEARCH */
 
/*   This program is free software; you can redistribute it and/or modify */
/*   it under the terms of the GNU General Public License as published by */
/*   the Free Software Foundation; either version 2 of the License, or */
/*   (at your option) any later version. */
 
/*   See the file COPYING for the full details of the license. */
/*****************************************************************************/
 
 
/*****************************************************************************/
/*Testroutine for GRSPW. Must be used with one device in loopback mode       */
/*****************************************************************************/
#include <stdlib.h>
#include "spwapi.h"
#include "rmapapi.h"
 
#define SPW_ADDR    0x80000c00
#define AHBFREQ     40000
 
#define PKTTESTMAX  128
#define DESCPKT     1024
#define MAXSIZE     4194304
#define RMAPSIZE    1024
#define RMAPCRCSIZE 1024
 
static inline char loadb(int addr)
{
  char tmp;        
  asm(" lduba [%1]1, %0 "
      : "=r"(tmp)
      : "r"(addr)
    );
  return tmp;
}
 
static inline int loadmem(int addr)
{
  int tmp;        
  asm(" lda [%1]1, %0 "
      : "=r"(tmp)
      : "r"(addr)
    );
  return tmp;
}
 
int main(void) 
{
  int  i;
  int  j;
  int  k;
  int  m;
  int  l;
  int  data;
  int  hdr;
  int  notrx;
  int  tmp;
  int  eoplen;        
  int  *size;
  char *txbuf;
  char *rxbuf;
  char *rx0;
  char *rx1;
  char *rx2;
  char *rx3;
  char *tx0;
  char *tx1;
  char *tx2;
  char *tx3;
  char *tx[64];
  char *rx[128];
  struct rmap_pkt *cmd;
  int *cmdsize;
  struct rmap_pkt *reply;
  int *replysize;
  struct rxstatus *rxs;
  struct spwvars *spw;
  spw = (struct spwvars *) malloc(sizeof(struct spwvars));
  rxs = (struct rxstatus *) malloc(sizeof(struct rxstatus));
  size = (int *) malloc(sizeof(int));
 
  printf("Test started\n");
  /************************ TEST INIT ***********************************/
  /*Initalize link*/
  /*initialize parameters*/
  if (spw_setparam(0x14, 0, 0xBF, 1, 1, 1, 1048576, SPW_ADDR, AHBFREQ, spw) ) {
    printf("Illegal parameters to spacewire\n");
    exit(1);
  }
  /*reset link*/
  spw_reset(spw);
  /*initialize link*/
  if (spw_init(spw)) {
    printf("Link initialization failed\n");
  }
  /************************ TEST 1 **************************************/ 
  /*Simulatenous time-code and packet transmission/reception*/
  printf("Test transmission and reception with simultaneous time-code transmissions\n");
  rx0 = malloc(128);
  rx1 = malloc(128);
  rx2 = malloc(128);
  rx3 = malloc(128);
  tx0 = malloc(128);
  tx1 = malloc(128);
  tx2 = malloc(128);
  tx3 = malloc(128);
  for(i = 0; i < 128; i++) {
    tx0[i] = (char)i;
    tx1[i] = (char)~i;
    tx2[i] = (char)(i ^ (i + ~i));
    tx3[i] = (char)(i ^ (i + ~i + 5));
  }
  tx0[0] = 0x14;
  tx1[0] = 0x14;
  tx2[0] = 0x14;
  tx3[0] = 0x14;
  tx0[1] = 0x02;
  tx1[1] = 0x02;
  tx2[1] = 0x02;
  tx3[1] = 0x02;
  spw_rx(rx0, spw);
  spw_rx(rx1, spw);
  spw_rx(rx2, spw);
  spw_rx(rx3, spw);
  spw_tx(0, 0, 0, 0, tx0, 128, tx0, spw);
  spw_tx(0, 0, 0, 0, tx1, 128, tx1, spw);
  spw_tx(0, 0, 0, 0, tx2, 128, tx2, spw);
  spw_tx(0, 0, 0, 0, tx3, 128, tx3, spw);
  if (check_time(spw)) {
    printf("Tick out set before any time-codes were sent\n");
    exit(1);
  }
  if (get_time(spw)) {
    printf("Time-code nonzero before any time-code were sent/received\n");
    exit(1);
  }
  for(i = 0; i < 20; i++) {
    send_time(spw);
  }
  for(i = 0; i < 4; i++) {
    while(!(tmp = spw_checktx(spw))) {
      for(j = 0; j < 64; j++) {}
    }
    if (tmp != 1) {
      printf("Transmit error\n");
      exit(1);
    }
  }
  for(i = 0; i < 4; i++) {
    while(!(tmp = spw_checkrx(size, rxs, spw))) {
      for(j = 0; j < 64; j++) {}
    }
    if (rxs->truncated) {
      printf("Received packet truncated\n");
      exit(1);
    }
    if(rxs->eep) {
      printf("Received packet terminated with eep\n");
      exit(1);
    }
    if (*size != 128) {
      printf("Received packet has wrong length\n");
      exit(1);
    }
  }
  for(j = 0; j < 128; j++) {
    if (loadb((int)&(rx0[j])) != tx0[j]) {
      printf("Compare error buf 0: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx0[j])), (unsigned)tx0[j]);
      exit(1);
    }
    if (loadb((int)&(rx1[j])) != tx1[j]) {
      printf("Compare error buf 1: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx1[j])), (unsigned)tx1[j]);
      exit(1);
    }
    if (loadb((int)&(rx2[j])) != tx2[j]) {
      printf("Compare error buf 2: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx2[j])), (unsigned)tx2[j]);
      exit(1);
    }
    if (loadb((int)&(rx3[j])) != tx3[j]) {
      printf("Compare error buf 3: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx3[j])), (unsigned)tx3[j]);
      exit(1);
    }
  }
  if(get_time(spw) != 20) {
    printf("Time-counter has wrong value\n");
    exit(1);
  }
  free(rx0);
  free(rx1);
  free(rx2);
  free(rx3);
  free(tx0);
  free(tx1);
  free(tx2);
  free(tx3);
  printf("Test 1 completed successfully\n");
  /************************ TEST 2 **************************************/
  printf("Test transmission and reception of different sized packets from DMA channel\n");
  if ((txbuf = calloc(PKTTESTMAX, 1)) == NULL) {
    printf("Transmit buffer initialization failed\n");
    exit(1);
  }
  if ((rxbuf = calloc(PKTTESTMAX, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  /*initialize data*/
  for (j = 0; j < PKTTESTMAX; j++) {
    txbuf[j] = (char)j;
  }
  txbuf[0] = 0x14;
  txbuf[1] = 0x2;
  for (i = 2; i < PKTTESTMAX; i++) {
    for (j = 2; j < i; j++) {
      txbuf[j] = ~txbuf[j];
    }
    while (spw_rx(rxbuf, spw)) {
      for (k = 0; k < 64; k++) {}
    }
    if (spw_tx(0, 0, 0, 0, txbuf, i, txbuf, spw)) {
      printf("Transmission failed\n");
                        exit(1);
    }
    while (!(tmp = spw_checktx(spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (tmp != 1) {
      printf("Error in transmit \n");
      exit(1);
    }
    while (!(tmp = spw_checkrx(size, rxs, spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (rxs->truncated) {
      printf("Received packet truncated\n");
      exit(1);
    }
    if(rxs->eep) {
      printf("Received packet terminated with eep\n");
      exit(1);
    }
    if (*size != i) {
      printf("Received packet has wrong length\n");
      printf("Expected: %i, Got: %i \n", i, *size);
    }
    for(j = 0; j < i; j++) {
      if (loadb((int)&(rxbuf[j])) != txbuf[j]) {
        printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)txbuf[j]);
        //exit(1);
      }
    }
//    printf("Packet %i transferred\n", i);
  }
  free(rxbuf);
  free(txbuf);
  printf("Test 2 completed successfully\n");
  /************************ TEST 3 **************************************/
  if (spw->rmap || spw->rxunaligned) {
    printf("Test transmission and reception of different sized packets from DMA channel,\n");
    printf("with different alignment,\n");
    if ((txbuf = calloc(PKTTESTMAX, 1)) == NULL) {
      printf("Transmit buffer initialization failed\n");
      exit(1);
    }
    if ((rxbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
      printf("Receive buffer initialization failed\n");
      exit(1);
    }
    /*initialize data*/
    for (j = 0; j < PKTTESTMAX; j++) {
      txbuf[j] = (char)j;
    }
    txbuf[0] = 0x14;
    txbuf[1] = 0x2;
    for (i = 2; i < PKTTESTMAX; i++) {
      for(m = 1; m < 4; m++) {
        for (j = 2; j < i; j++) {
          txbuf[j] = ~txbuf[j];
        }
        while (spw_rx((char *)&(rxbuf[m]), spw)) {
          for (k = 0; k < 64; k++) {}
        }
        if (spw_tx(0, 0, 0, 0, txbuf, i, txbuf, spw)) {
          printf("Transmission failed\n");
          exit(1);
        }
        while (!(tmp = spw_checktx(spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (tmp != 1) {
          printf("Error in transmit \n");
          exit(1);
        }
        while (!(tmp = spw_checkrx(size, rxs, spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (rxs->truncated) {
          printf("Received packet truncated\n");
          exit(1);
        }
        if(rxs->eep) {
          printf("Received packet terminated with eep\n");
          exit(1);
        }
        if (*size != i) {
          printf("Received packet has wrong length\n");
          printf("Expected: %i, Got: %i \n", i, *size);
        }
        for(j = 0; j < i; j++) {
          if (loadb((int)&(rxbuf[j+m])) != txbuf[j]) {
            printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j+m])), (unsigned)txbuf[j]);
            exit(1);
          }
        }
//        printf("Packet %i transferred of aligment %i\n", i, m);
      }
 
    }
    free(rxbuf);
    free(txbuf);
    printf("Test 3 completed successfully\n");
  }
  /************************ TEST 4 **************************************/
  printf("Test transmission of packets with different alignment,\n");
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
    printf("Transmit buffer initialization failed\n");
    exit(1);
  }
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  /*initialize data*/
  for (j = 0; j < PKTTESTMAX+4; j++) {
    txbuf[j] = (char)j;
  }
  for(i = 2; i < PKTTESTMAX; i++) {
    for(m = 0; m < 4; m++) {
      for (j = 2; j < (i+m); j++) {
        txbuf[j] = ~txbuf[j];
      }
      txbuf[m] = 0x14;
      txbuf[m+1] = 0x2;
      while (spw_rx(rxbuf, spw)) {
        for (k = 0; k < 64; k++) {}
      }
      if (spw_tx(0, 0, 0, 0, txbuf, i, (char *)&(txbuf[m]), spw)) {
        printf("Transmission failed\n");
        exit(1);
      }
      while (!(tmp = spw_checktx(spw))) {
        for (k = 0; k < 64; k++) {}
      }
      if (tmp != 1) {
        printf("Error in transmit \n");
        exit(1);
      }
      while (!(tmp = spw_checkrx(size, rxs, spw))) {
        for (k = 0; k < 64; k++) {}
      }
      if (rxs->truncated) {
        printf("Received packet truncated\n");
        exit(1);
      }
      if(rxs->eep) {
        printf("Received packet terminated with eep\n");
        exit(1);
      }
      if (*size != i) {
        printf("Received packet has wrong length\n");
        printf("Expected: %i, Got: %i \n", i, *size);
      }
      for(j = 0; j < i; j++) {
        if (loadb((int)&(rxbuf[j])) != txbuf[j+m]) {
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)txbuf[j+m]);
          exit(1);
        }
      }
//      printf("Packet %i transferred of aligment %i\n", i, m);
    }
 
  }
  free(rxbuf);
  free(txbuf);
  printf("Test 4 completed successfully\n");
  /************************ TEST 5 **************************************/
  printf("Test transmission of packets with different alignment, and header\n");
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
    printf("Transmit buffer initialization failed\n");
    exit(1);
  }
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  if ((tx0 = calloc(260, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  /*initialize data*/
  for (j = 0; j < PKTTESTMAX; j++) {
    txbuf[j] = (char)j;
  }
  for (j = 0; j < 260; j++) {
    tx0[j] = (char)~j;
  }
  txbuf[0] = 0x14;
  txbuf[1] = 0x2;
  for(i = 0; i < 256; i++) {
    for(m = 0; m < 4; m++) {
      for (j = 2; j < PKTTESTMAX; j++) {
        txbuf[j] = ~txbuf[j];
      }
      for (j = 0; j < 260; j++) {
        tx0[j] = ~tx0[j];
      }
      tx0[m] = 0x14;
      tx0[m+1] = 0x2;
      while (spw_rx(rxbuf, spw)) {
        for (k = 0; k < 64; k++) {}
      }
      if (spw_tx(0, 0, 0, i,(char *)&(tx0[m]), PKTTESTMAX, txbuf, spw)) {
        printf("Transmission failed\n");
        exit(1);
      }
      while (!(tmp = spw_checktx(spw))) {
        for (k = 0; k < 64; k++) {}
      }
      if (tmp != 1) {
        printf("Error in transmit \n");
        exit(1);
      }
      while (!(tmp = spw_checkrx(size, rxs, spw))) {
        for (k = 0; k < 64; k++) {}
      }
      if (rxs->truncated) {
        printf("Received packet truncated\n");
        exit(1);
      }
      if(rxs->eep) {
        printf("Received packet terminated with eep\n");
        exit(1);
      }
      if (*size != (PKTTESTMAX+i)) {
        printf("Received packet has wrong length\n");
        printf("Expected: %i, Got: %i \n", i+PKTTESTMAX, *size);
      }
      for(j = 0; j < i; j++) {
        if (loadb((int)&(rxbuf[j])) != tx0[j+m]) {
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)tx0[j+m]);
        }
      }
      for(j = 0; j < PKTTESTMAX; j++) {
        if (loadb((int)&(rxbuf[j+i])) != txbuf[j]) {
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j+i])), (unsigned)txbuf[j]);
        }
      }
      if (i % 32 == 0 && m == 0)
          printf("Packet %i transferred of aligment %i\n", i, m);
    }
 
  }
  free(rxbuf);
  free(txbuf);
  free(tx0);
  printf("Test 5 completed successfully\n");
  /************************ TEST 6 **************************************/
  printf("Test transmission of packets with different alignment, and header\n");
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
    printf("Transmit buffer initialization failed\n");
    exit(1);
  }
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  if ((tx0 = calloc(260, 1)) == NULL) {
    printf("Receive buffer initialization failed\n");
    exit(1);
  }
  /*initialize data*/
  for (j = 0; j < PKTTESTMAX; j++) {
    txbuf[j] = (char)j;
  }
  for (j = 0; j < 260; j++) {
    tx0[j] = (char)~j;
  }
  notrx = 0;
  for(i = 0; i < 256; i++) {
      printf(".");
//    printf("Packet with header %i, alignment: %i and data: %i, alignment: %i transferred\n", i, m, j, l);
    for(j = 0; j < PKTTESTMAX; j++) {
      for(m = 0; m < 4; m++) {
        for(l = 0; l < 4; l++) {
          for (k = 0; k < PKTTESTMAX; k++) {
            txbuf[k] = ~txbuf[k];
          }
          for (k = 0; k < 260; k++) {
            tx0[k] = ~tx0[k];
          }
          tx0[m] = 0x14;
          tx0[m+1] = 0x2;
          txbuf[l] = 0x14;
          txbuf[l+1] = 0x2;
          if (!notrx) {
            while (spw_rx(rxbuf, spw)) {
              for (k = 0; k < 64; k++) {}
            }
          }
          if (spw_tx(0, 0, 0, i,(char *)&(tx0[m]), j, (char *)&(txbuf[l]), spw)) {
            printf("Transmission failed\n");
            exit(1);
          }
          while (!(tmp = spw_checktx(spw))) {
            for (k = 0; k < 64; k++) {}
          }
          if (tmp != 1) {
            printf("Error in transmit \n");
            exit(1);
          }
          if( (i+j) > 1) {
            while (!(tmp = spw_checkrx(size, rxs, spw))) {
              for (k = 0; k < 64; k++) {}
            }
            if (rxs->truncated) {
              printf("Received packet truncated\n");
              exit(1);
            }
            if(rxs->eep) {
              printf("Received packet terminated with eep\n");
              exit(1);
            }
            if (*size != (j+i)) {
              printf("Received packet has wrong length\n");
              printf("Expected: %i, Got: %i \n", i+j, *size);
            }
            for(k = 0; k < i; k++) {
              if (loadb((int)&(rxbuf[k])) != tx0[k+m]) {
                printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)tx0[k+m]);
                exit(1);
              }
            }
            for(k = 0; k < j; k++) {
              if (loadb((int)&(rxbuf[k+i])) != txbuf[k+l]) {
                printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+i])), (unsigned)txbuf[k+l]);
                exit(1);
              }
            }
            notrx = 0;
          } else {
            for(k = 0; k < 1048576; k++) {}
            if (spw_checkrx(size, rxs, spw)) {
              printf("Packet recevied/sent although length was too small\n");
              exit(1);
            }
            notrx = 1;
          }
        }
 
      }
    }
 
 
 
  }
  free(rxbuf);
  free(txbuf);
  free(tx0);
  printf("\nTest 6 completed successfully\n");
  /************************ TEST 7 **************************************/
  printf("Test to fill descriptor tables completely\n");
  for(i = 0; i < 64; i++) {
    tx[i] = malloc(DESCPKT);
  }
  for(i = 0; i < 128; i++) {
    rx[i] = malloc(DESCPKT+256);
  }
  txbuf = malloc(256);
  /*initialize data*/
  for(i = 0; i < 64; i++) {
    tx[i][0] = 0x14;
    tx[i][1] = 0x2;
    for(j = 2; j < DESCPKT; j++) {
      tx[i][j] = j ^ i;
    }
  }
  txbuf[0] = 0x14;
  txbuf[1] = 0x2;
  for(i = 2; i < 256; i++) {
    txbuf[i] = i;
  }
  for(i = 0; i < 128; i++) {
    while (spw_rx(rx[i], spw)) {
      for (k = 0; k < 64; k++) {}
    }
  }
  for(i = 0; i < 64; i++) {
    if (spw_tx(0, 0, 0, 255, txbuf, DESCPKT, tx[i], spw)) {
      printf("Transmission failed\n");
      exit(1);
    }
  }
  for(i = 0; i < 64; i++) {
    while (!(tmp = spw_checktx(spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (tmp != 1) {
      printf("Error in transmit \n");
      exit(1);
    }
  }
  for(i = 0; i < 64; i++) {
    while (!(tmp = spw_checkrx(size, rxs, spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (rxs->truncated) {
      printf("Received packet truncated\n");
      exit(1);
    }
    if(rxs->eep) {
      printf("Received packet terminated with eep\n");
      exit(1);
    }
    if (*size != (255+DESCPKT)) {
      printf("Received packet has wrong length\n");
      printf("Expected: %i, Got: %i \n", 255+DESCPKT, *size);
    }
    for(k = 0; k < 255; k++) {
      if (loadb((int)&(rx[i][k])) != txbuf[k]) {
        printf("Txbuf: %x Rxbuf: %x\n", (int)txbuf, (int)rx[i]);
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k])), (unsigned)txbuf[k]);
        exit(1);
      }
    }
    for(k = 0; k < DESCPKT; k++) {
      if (loadb((int)&(rx[i][k+255])) != tx[i][k]) {
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k+255])), (unsigned)tx[i][k]);
        exit(1);
      }
    }
  }
  /*second transmit loop*/
  for(i = 0; i < 64; i++) {
    if (spw_tx(0, 0, 0, 255, txbuf, DESCPKT, tx[i], spw)) {
      printf("Transmission failed\n");
      exit(1);
    }
  }
  for(i = 0; i < 64; i++) {
    while (!(tmp = spw_checktx(spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (tmp != 1) {
      printf("Error in transmit \n");
      exit(1);
    }
  }
  for(i = 0; i < 64; i++) {
    while (!(tmp = spw_checkrx(size, rxs, spw))) {
      for (k = 0; k < 64; k++) {}
    }
    if (rxs->truncated) {
      printf("Received packet truncated\n");
      exit(1);
    }
    if(rxs->eep) {
      printf("Received packet terminated with eep\n");
      exit(1);
    }
    if (*size != (255+DESCPKT)) {
      printf("Received packet has wrong length\n");
      printf("Expected: %i, Got: %i \n", 255+DESCPKT, *size);
    }
    for(k = 0; k < 255; k++) {
      if (loadb((int)&(rx[i+64][k])) != txbuf[k]) {
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k])), (unsigned)txbuf[k]);
        exit(1);
      }
    }
    for(k = 0; k < DESCPKT; k++) {
      if (loadb((int)&(rx[i+64][k+255])) != tx[i][k]) {
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+255])), (unsigned)tx[i][k]);
        exit(1);
      }
    }
  }
  for(i = 0; i < 64; i++) {
    free(tx[i]);
  }
  for(i = 0; i < 128; i++) {
    free(rx[i]);
  }
  free(txbuf);
  printf("Test 7 completed successfully\n");
  /************************ TEST 8 **************************************/
  printf("Test transmission and reception of maximum size packets\n");
  txbuf = malloc(MAXSIZE+1);
  rxbuf = malloc(MAXSIZE);
  if ((rxbuf == NULL) || (txbuf == NULL)) {
    printf("Memory allocation failed\n");
    exit(1);
  }
  txbuf[0] = 0x14;
  txbuf[1] = 0x2;
  for(i = 2; i < MAXSIZE; i++) {
    txbuf[i] = i;
  }
  while (spw_rx(rxbuf, spw)) {
    for (k = 0; k < 64; k++) {}
  }
  spw->rxmaxlen = MAXSIZE;
  if (spw_set_rxmaxlength(spw) ) {
    printf("Max length change failed\n");
    exit(1);
  }
  if (spw_tx(0, 0, 0, 0, txbuf, MAXSIZE, txbuf, spw)) {
    printf("Transmission failed\n");
    exit(1);
  }
  while (!(tmp = spw_checktx(spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (tmp != 1) {
    printf("Error in transmit \n");
    exit(1);
  }
  while (!(tmp = spw_checkrx(size, rxs, spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (rxs->truncated) {
    printf("Received packet truncated\n");
    exit(1);
  }
  if(rxs->eep) {
    printf("Received packet terminated with eep\n");
    exit(1);
  }
  if (*size != (MAXSIZE)) {
    printf("Received packet has wrong length\n");
    printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
  }
  for(k = 0; k < MAXSIZE; k++) {
    if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
      exit(1);
    }
  }
  for(i = 2; i < MAXSIZE; i++) {
    txbuf[i] = ~txbuf[i];
  }
  while (spw_rx(rxbuf, spw)) {
    for (k = 0; k < 64; k++) {}
  }
  if (spw_tx(0, 0, 0, 0, txbuf, MAXSIZE+1, txbuf, spw)) {
    printf("Transmission failed\n");
    exit(1);
  }
  while (!(tmp = spw_checktx(spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (tmp != 1) {
    printf("Error in transmit \n");
    exit(1);
  }
  while (!(tmp = spw_checkrx(size, rxs, spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (!rxs->truncated) {
    printf("Received packet not truncated\n");
    exit(1);
  }
  if(rxs->eep) {
    printf("Received packet terminated with eep\n");
    exit(1);
  }
  if (*size != (MAXSIZE)) {
    printf("Received packet has wrong length\n");
    printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
  }
  for(k = 0; k < MAXSIZE; k++) {
    if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
      exit(1);
    }
  }
  for(i = 2; i < MAXSIZE; i++) {
    txbuf[i] = ~txbuf[i];
  }
  while (spw_rx(rxbuf, spw)) {
    for (k = 0; k < 64; k++) {}
  }
  if (spw_tx(0, 0, 0, 0, txbuf, MAXSIZE, txbuf, spw)) {
    printf("Transmission failed\n");
    exit(1);
  }
  while (!(tmp = spw_checktx(spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (tmp != 1) {
    printf("Error in transmit \n");
    exit(1);
  }
  while (!(tmp = spw_checkrx(size, rxs, spw))) {
    for (k = 0; k < 64; k++) {}
  }
  if (rxs->truncated) {
    printf("Received packet truncated\n");
    exit(1);
  }
  if(rxs->eep) {
    printf("Received packet terminated with eep\n");
    exit(1);
  }
  if (*size != (MAXSIZE)) {
    printf("Received packet has wrong length\n");
    printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
  }
  for(k = 0; k < MAXSIZE; k++) {
    if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
      exit(1);
    }
  }
  free(rxbuf);
  free(txbuf);
  printf("Test 8 completed successfully\n");
  /************************ TEST 9 **************************************/
/*   printf("Test crc\n"); */
/*   if (spw->rmap || spw->rmapcrc) { */
/*     printf("Test transmission of packets with different alignment, and header\n"); */
/*     if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) { */
/*       printf("Transmit buffer initialization failed\n"); */
/*       exit(1); */
/*     } */
/*     if ((rxbuf = calloc(PKTTESTMAX+256+2, 1)) == NULL) { */
/*       printf("Receive buffer initialization failed\n"); */
/*       exit(1); */
/*     } */
/*     if ((tx0 = calloc(260, 1)) == NULL) { */
/*       printf("Receive buffer initialization failed\n"); */
/*       exit(1); */
/*     } */
/*     /\*initialize data*\/ */
/*     for (j = 0; j < PKTTESTMAX; j++) { */
/*       txbuf[j] = (char)j; */
/*     } */
/*     for (j = 0; j < 260; j++) { */
/*       tx0[j] = (char)~j; */
/*     } */
/*     notrx = 0; data = 0; hdr = 0; */
/*     for(i = 0; i < 256; i++) { */
/* //      printf("Packet with header %i, alignment: %i and data: %i, alignment: %i transferred\n", i, m, j, l); */
/*       for(j = 0; j < PKTTESTMAX; j++) { */
/*         for(m = 0; m < 4; m++) { */
/*           for(l = 0; l < 4; l++) { */
/*             for (k = 0; k < PKTTESTMAX; k++) { */
/*               txbuf[k] = ~txbuf[k]; */
/*             } */
/*             for (k = 0; k < 260; k++) { */
/*               tx0[k] = ~tx0[k]; */
/*             } */
/*             if (i != 0) { */
/*               hdr = 1; */
/*             } else { */
/*               hdr = 0; */
/*             } */
/*             if (j != 0) { */
/*               data = 1; */
 
/*             } else { */
/*               data = 0; */
/*             } */
/*             tx0[m] = 0x14; */
/*             tx0[m+1] = 0x2; */
/*             txbuf[l] = 0x14; */
/*             txbuf[l+1] = 0x2; */
/*             if (!notrx) { */
/*               while (spw_rx(rxbuf, spw)) { */
/*                 for (k = 0; k < 64; k++) {} */
/*               } */
/*             } */
/*             if (spw_tx(1, 1, 0, i,(char *)&(tx0[m]), j, (char *)&(txbuf[l]), spw)) { */
/*               printf("Transmission failed\n"); */
/*               exit(1); */
/*             } */
/*             while (!(tmp = spw_checktx(spw))) { */
/*               for (k = 0; k < 64; k++) {} */
/*             } */
/*             if (tmp != 1) { */
/*               printf("Error in transmit \n"); */
/*               exit(1); */
/*             } */
/*             if( (i+j+hdr+data) > 1) { */
/*               while (!(tmp = spw_checkrx(size, rxs, spw))) { */
/*                 for (k = 0; k < 64; k++) {} */
/*               } */
/*               if (rxs->truncated) { */
/*                 printf("Received packet truncated\n"); */
/*                 exit(1); */
/*               } */
/*               if(rxs->eep) { */
/*                 printf("Received packet terminated with eep\n"); */
/*                 exit(1); */
/*               } */
/*               if (*size != (j+i+hdr+data)) { */
/*                 printf("Received packet has wrong length\n"); */
/*                 printf("Expected: %i, Got: %i \n", i+j, *size); */
/*               } */
/*               for(k = 0; k < i; k++) { */
/*                 if (loadb((int)&(rxbuf[k])) != tx0[k+m]) { */
/*                   printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)tx0[k+m]); */
/*                   exit(1); */
/*                 } */
/*               } */
/*               for(k = 0; k < j; k++) { */
/*                 if (loadb((int)&(rxbuf[k+i+hdr])) != txbuf[k+l]) { */
/*                   printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+i+hdr])), (unsigned)txbuf[k+l]); */
/*                   exit(1); */
/*                 } */
/*               } */
/*               notrx = 0; */
/*             } else { */
/*               for(k = 0; k < 1048576; k++) {} */
/*               if (spw_checkrx(size, rxs, spw)) { */
/*                 printf("Packet recevied/sent although length was too small\n"); */
/*                 exit(1); */
/*               } */
/*               notrx = 1; */
/*             } */
/*           } */
 
/*         } */
/*       } */
 
 
 
/*     } */
/*     free(rxbuf); */
/*     free(txbuf); */
/*     free(tx0); */
/*     printf("Test 9 completed successfully\n"); */
/*   } */
  /************************ TEST 10 **************************************/
  if (spw->rmap == 1) {
    printf("Test RMAP, including transmit spa test\n");
    tx0 = (char *)malloc(64);
    tx1 = (char *)calloc(RMAPSIZE, 1);
    rx0 = (char *)malloc(RMAPSIZE+4);
    rx1 = (char *)malloc(32+RMAPSIZE);
    rx2 = (char *)malloc(32+RMAPSIZE);
    if( (tx0 == NULL) || (tx1 == NULL) || (rx0 == NULL) ||
        (rx1 == NULL) || (rx2 == NULL) ) {
      printf("Memory initialization error\n");
      exit(1);
    }
    cmd = (struct rmap_pkt *) malloc(sizeof(struct rmap_pkt));
    reply = (struct rmap_pkt *) malloc(sizeof(struct rmap_pkt));
    cmdsize = (int *) malloc(sizeof(int));
    replysize = (int *) malloc(sizeof(int));
    /* enable rmap*/
    spw_rmapen(spw);
    for(i = 0; i < RMAPSIZE; i++) {
      for(m = 0; m < 8; m++) {
        for(j = 0; j < i; j++) {
          tx1[j]  = ~tx1[j];
        }
        if (m >= 4) {
          cmd->incr     = no;
        } else {
          cmd->incr     = yes;
        }
        cmd->type     = writecmd;
        cmd->verify   = no;
        cmd->ack      = yes;
        cmd->destaddr = 0x14;
        cmd->destkey  = 0xBF;
        cmd->srcaddr  = 0x14;
        cmd->tid      = i;
        cmd->addr     = (int)&(rx0[(m%4)]);
        cmd->len      = i;
        cmd->status   = 0;
        cmd->dstspalen = 0;
        cmd->dstspa  = (char *)NULL;
        cmd->srcspalen = 0;
        cmd->srcspa = (char *)NULL;
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
          printf("RMAP cmd build failed\n");
          exit(1);
        }
        reply->type     = writerep;
        reply->verify   = no;
        reply->ack      = yes;
        if (m >= 4) {
          reply->incr     = no;
          if ( ((((int)&(rx0[(m%4)])) % 4) != 0) || ((cmd->len % 4) != 0) )  {
            reply->status   = 10;
          } else {
            reply->status   = 0;
          }
        } else {
          reply->incr     = yes;
          reply->status   = 0;
        }
        reply->destaddr = 0x14;
        reply->destkey  = 0XBF;
        reply->srcaddr  = 0x14;
        reply->tid      = i;
        reply->addr     = (int)&(rx0[(m%4)]);
        reply->len      = i;
        reply->dstspalen = 0;
        reply->dstspa  = (char *)NULL;
        reply->srcspalen = 0;
        reply->srcspa = (char *)NULL;
        if (build_rmap_hdr(reply, rx2, replysize)) {
          printf("RMAP reply build failed\n");
          exit(1);
        }
        while (spw_rx(rx1, spw)) {
          for (k = 0; k < 64; k++) {}
        }
        if (spw_tx(1, 1, 0, *cmdsize, tx0, j, tx1, spw)) {
          printf("Transmission failed\n");
          exit(1);
        }
        while (!(tmp = spw_checktx(spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (tmp != 1) {
          printf("Error in transmit \n");
          exit(1);
        }
        while (!(tmp = spw_checkrx(size, rxs, spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (rxs->truncated) {
          printf("Received packet truncated\n");
          exit(1);
        }
        if(rxs->eep) {
          printf("Received packet terminated with eep\n");
          exit(1);
        }
        if(rxs->hcrcerr) {
          printf("Received packet header crc error detected\n");
          exit(1);
        }
        if(rxs->dcrcerr) {
          printf("Received packet data crc error detected\n");
          exit(1);
        }
        if (*size != (*replysize+1)) {
          printf("Received packet has wrong length\n");
          printf("Expected: %i, Got: %i \n", *replysize+1, *size);
        }
        for(k = 0; k < *replysize; k++) {
          if (loadb((int)&(rx1[k])) != rx2[k]) {
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
            exit(1);
          }
        }
        if (reply->status == 0) {
          if (m < 4) {
            for(k = 0; k < i; k++) {
              if (loadb((int)&(rx0[k+(m%4)])) != tx1[k]) {
                printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]);
                exit(1);
              }
            }
          } else {
            if (i != 0) {
              for(k = 0; k < 4; k++) {
                if (loadb((int)&(rx0[k+(m%4)])) != tx1[k + (i - 4)]) {
                  printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k+(i-4)]);
                  exit(1);
                }
              }
            }
          }
        }
        if ((i % 512) == 0) {
          printf("Packet  %i, alignment %i\n", i, m);
        }
      }
    }
    printf("Non-verified write test passed\n");
    for(i = 0; i < 64; i++) {
      for(m = 0; m < 8; m++) {
        for(j = 0; j < i; j++) {
          tx1[j]  = ~tx1[j];
        }
        if (m >= 4) {
          cmd->incr     = no;
        } else {
          cmd->incr     = yes;
        }
        cmd->type     = writecmd;
        cmd->verify   = yes;
        cmd->ack      = yes;
        cmd->destaddr = 0x14;
        cmd->destkey  = 0xBF;
        cmd->srcaddr  = 0x14;
        cmd->tid      = i;
        cmd->addr     = (int)&(rx0[(m%4)]);
        cmd->len      = i;
        cmd->status   = 0;
        cmd->dstspalen = 0;
        cmd->dstspa  = (char *)NULL;
        cmd->srcspalen = 0;
        cmd->srcspa = (char *)NULL;
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
          printf("RMAP cmd build failed\n");
          exit(1);
        }
        reply->type     = writerep;
        reply->verify   = yes;
        reply->ack      = yes;
        if (m >= 4) {
          reply->incr     = no;
 
        } else {
          reply->incr     = yes;
        }
        if ( (((((int)&(rx0[(m%4)])) % 2) != 0) && (cmd->len == 2)) ||
             (((((int)&(rx0[(m%4)])) % 4) != 0) && (cmd->len == 4)) ||
             (cmd->len == 3) ) {
          reply->status   = 10;
        } else {
          reply->status   = 0;
        }
        if (cmd->len > 4) {
          reply->status = 9;
 
        }
        reply->destaddr = 0x14;
        reply->destkey  = 0XBF;
        reply->srcaddr  = 0x14;
        reply->tid      = i;
        reply->addr     = (int)&(rx0[(m%4)]);
        reply->len      = i;
        reply->dstspalen = 0;
        reply->dstspa  = (char *)NULL;
        reply->srcspalen = 0;
        reply->srcspa = (char *)NULL;
        if (build_rmap_hdr(reply, rx2, replysize)) {
          printf("RMAP reply build failed\n");
          exit(1);
        }
        while (spw_rx(rx1, spw)) {
          for (k = 0; k < 64; k++) {}
        }
        if (spw_tx(1, 1, 0, *cmdsize, tx0, j, tx1, spw)) {
          printf("Transmission failed\n");
          exit(1);
        }
        while (!(tmp = spw_checktx(spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (tmp != 1) {
          printf("Error in transmit \n");
          exit(1);
        }
        while (!(tmp = spw_checkrx(size, rxs, spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (rxs->truncated) {
          printf("Received packet truncated\n");
          exit(1);
        }
        if(rxs->eep) {
          printf("Received packet terminated with eep\n");
          exit(1);
        }
        if(rxs->hcrcerr) {
          printf("Received packet header crc error detected\n");
          exit(1);
        }
        if(rxs->dcrcerr) {
          printf("Received packet data crc error detected\n");
          exit(1);
        }
        if (*size != (*replysize+1)) {
          printf("Received packet has wrong length\n");
          printf("Expected: %i, Got: %i \n", *replysize+1, *size);
          exit(1);
        }
        for(k = 0; k < *replysize; k++) {
          if (loadb((int)&(rx1[k])) != rx2[k]) {
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
            exit(1);
          }
        }
        if (reply->status == 0) {
          for(k = 0; k < i; k++) {
            if (loadb((int)&(rx0[k+(m%4)])) != tx1[k]) {
              printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]);
              exit(1);
            }
          }
 
        }
        if (((i % 4) == 0) && ((m % 8) == 0)) {
          printf("Packet  %i, alignment %i\n", i, m);
        }
      }
    }
    printf("Verified write test passed\n");
 
/*     for(i = 0; i < 64; i++) { */
/*       for(m = 0; m < 8; m++) { */
/*         for(j = 0; j < i; j++) { */
/*           tx1[j]  = ~tx1[j]; */
/*         } */
/*         if (m >= 4) { */
/*           cmd->incr     = no; */
/*         } else { */
/*           cmd->incr     = yes; */
/*         } */
/*         cmd->type     = rmwcmd; */
/*         cmd->verify   = yes; */
/*         cmd->ack      = yes; */
/*         cmd->destaddr = 0x14; */
/*         cmd->destkey  = 0xBF; */
/*         cmd->srcaddr  = 0x14; */
/*         cmd->tid      = i; */
/*         cmd->addr     = (int)&(rx0[(m%4)]); */
/*         cmd->len      = i; */
/*         cmd->status   = 0; */
/*         cmd->dstspalen = 0; */
/*         cmd->dstspa  = (char *)NULL; */
/*         cmd->srcspalen = 0; */
/*         cmd->srcspa = (char *)NULL; */
/*         if (build_rmap_hdr(cmd, tx0, cmdsize)) { */
/*           printf("RMAP cmd build failed\n"); */
/*           exit(1); */
/*         } */
/*         reply->type     = rmwrep; */
/*         reply->verify   = yes; */
/*         reply->ack      = yes; */
/*         if (m >= 4) { */
/*           reply->incr     = no; */
 
/*         } else { */
/*           reply->incr     = yes; */
/*         } */
/*         if ( (((((int)&(rx0[(m%4)])) % 2) != 0) && ((cmd->len/2) == 2)) || */
/*              (((((int)&(rx0[(m%4)])) % 4) != 0) && ((cmd->len/2) == 4)) || */
/*              ((cmd->len/2) == 3) ) { */
/*           reply->status   = 10; */
/*         } else { */
/*           reply->status   = 0; */
/*         } */
/*         if ( (cmd->len != 0) && (cmd->len != 2) && (cmd->len != 4) && */
/*              (cmd->len != 6) && (cmd->len != 8)) { */
/*           reply->status = 11; */
/*         } */
/*         if (m >= 4) { */
/*           reply->status = 2; */
/*         } */
/*         if (reply->status == 0) { */
/*           for(k = 0; k < (i/2); k++) { */
/*             rx2[*replysize+1+k] = rx0[k+m]; */
/*           } */
/*         } */
/*         reply->destaddr = 0x14; */
/*         reply->destkey  = 0XBF; */
/*         reply->srcaddr  = 0x14; */
/*         reply->tid      = i; */
/*         reply->addr     = (int)&(rx0[(m%4)]); */
/*         if (reply->status == 0) { */
/*           reply->len      = (i/2); */
/*         } else { */
/*           reply->len      = 0; */
/*         } */
/*         reply->dstspalen = 0; */
/*         reply->dstspa  = (char *)NULL; */
/*         reply->srcspalen = 0; */
/*         reply->srcspa = (char *)NULL; */
/*         if (build_rmap_hdr(reply, rx2, replysize)) { */
/*           printf("RMAP reply build failed\n"); */
/*           exit(1); */
/*         } */
/*         while (spw_rx(rx1, spw)) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (spw_tx(1, 1, 0, *cmdsize, tx0, j, tx1, spw)) { */
/*           printf("Transmission failed\n"); */
/*           exit(1); */
/*         } */
/*         while (!(tmp = spw_checktx(spw))) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (tmp != 1) { */
/*           printf("Error in transmit \n"); */
/*           exit(1); */
/*         } */
/*         while (!(tmp = spw_checkrx(size, rxs, spw))) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (rxs->truncated) { */
/*           printf("Received packet truncated\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->eep) { */
/*           printf("Received packet terminated with eep\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->hcrcerr) { */
/*           printf("Received packet header crc error detected\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->dcrcerr) { */
/*           printf("Received packet data crc error detected\n"); */
/*           exit(1); */
/*         } */
/*         if ((reply->status == 0) && (i != 0)) { */
/*           if (*size != (*replysize+1+(i/2)+1)) { */
/*             printf("Received packet has wrong length\n"); */
/*             printf("Expected: %i, Got: %i \n", *replysize+2+(i/2), *size); */
/*             exit(1); */
/*           } */
/*         } else { */
/*           if (*size != (*replysize+1)) { */
/*             printf("Received packet has wrong length\n"); */
/*             printf("Expected: %i, Got: %i \n", *replysize+1, *size); */
/*             exit(1); */
/*           } */
/*         } */
/*         for(k = 0; k < *replysize; k++) { */
/*           if (loadb((int)&(rx1[k])) != rx2[k]) { */
/*             printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]); */
/*             exit(1); */
/*           } */
/*         } */
/*         if (reply->status == 0) { */
/*           for(k = *replysize+1; k < *replysize+1+(i/2); k++) { */
/*             if (loadb((int)&(rx1[k])) != rx2[k]) { */
/*               printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]); */
/*               exit(1); */
/*             } */
/*           } */
/*           for(k = 0; k < (i/2); k++) { */
/*             if (loadb((int)&(rx0[k+(m%4)])) != ((tx1[k] & tx1[k+(i/2)]) | (rx2[*replysize+1+k] & ~tx1[k+(i/2)]) )) { */
/*               printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]); */
/*               exit(1); */
/*             } */
/*           } */
 
/*         } */
/*         if (((i % 4) == 0) && ((m % 8) == 0)) { */
/*           printf("Packet  %i, alignment %i\n", i, m); */
/*         } */
/*       } */
/*     } */
/*     printf("RMW test passed\n"); */
 
/*     for(i = 0; i < RMAPSIZE; i++) { */
/*       for(m = 0; m < 8; m++) { */
/*         for(j = 0; j < i+4; j++) { */
/*           rx0[j]  = ~rx0[j]; */
/*         } */
/*         if (m >= 4) { */
/*           cmd->incr     = no; */
/*         } else { */
/*           cmd->incr     = yes; */
/*         } */
/*         cmd->type     = readcmd; */
/*         cmd->verify   = no; */
/*         cmd->ack      = yes; */
/*         cmd->destaddr = 0x14; */
/*         cmd->destkey  = 0xBF; */
/*         cmd->srcaddr  = 0x14; */
/*         cmd->tid      = i; */
/*         cmd->addr     = (int)&(rx0[(m%4)]); */
/*         cmd->len      = i; */
/*         cmd->status   = 0; */
/*         cmd->dstspalen = 0; */
/*         cmd->dstspa  = (char *)NULL; */
/*         cmd->srcspalen = 0; */
/*         cmd->srcspa = (char *)NULL; */
/*         if (build_rmap_hdr(cmd, tx0, cmdsize)) { */
/*           printf("RMAP cmd build failed\n"); */
/*           exit(1); */
/*         } */
/*         reply->type     = readrep; */
/*         reply->verify   = no; */
/*         reply->ack      = yes; */
/*         if (m >= 4) { */
/*           reply->incr     = no; */
/*           if ( ((((int)&(rx0[(m%4)])) % 4) != 0) || ((cmd->len % 4) != 0) )  { */
/*             reply->status   = 10; */
/*           } else { */
/*             reply->status   = 0; */
/*           } */
/*         } else { */
/*           reply->incr     = yes; */
/*           reply->status   = 0; */
/*         } */
/*         if (reply->status == 0) { */
/*           reply->len      = i; */
/*         } else { */
/*           reply->len      = 0; */
/*         } */
/*         reply->destaddr = 0x14; */
/*         reply->destkey  = 0XBF; */
/*         reply->srcaddr  = 0x14; */
/*         reply->tid      = i; */
/*         reply->addr     = (int)&(rx0[(m%4)]); */
/*         reply->dstspalen = 0; */
/*         reply->dstspa  = (char *)NULL; */
/*         reply->srcspalen = 0; */
/*         reply->srcspa = (char *)NULL; */
/*         if (build_rmap_hdr(reply, rx2, replysize)) { */
/*           printf("RMAP reply build failed\n"); */
/*           exit(1); */
/*         } */
/*         while (spw_rx(rx1, spw)) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (spw_tx(1, 0, 0, *cmdsize, tx0, 0, tx1, spw)) { */
/*           printf("Transmission failed\n"); */
/*           exit(1); */
/*         } */
/*         while (!(tmp = spw_checktx(spw))) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (tmp != 1) { */
/*           printf("Error in transmit \n"); */
/*           exit(1); */
/*         } */
/*         while (!(tmp = spw_checkrx(size, rxs, spw))) { */
/*           for (k = 0; k < 64; k++) {} */
/*         } */
/*         if (rxs->truncated) { */
/*           printf("Received packet truncated\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->eep) { */
/*           printf("Received packet terminated with eep\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->hcrcerr) { */
/*           printf("Received packet header crc error detected\n"); */
/*           exit(1); */
/*         } */
/*         if(rxs->dcrcerr) { */
/*           printf("Received packet data crc error detected\n"); */
/*           exit(1); */
/*         } */
/*         for (k = 0; k < *replysize; k++) { */
/*           if (loadb((int)&(rx1[k])) != rx2[k]) { */
/*             printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]); */
/*             exit(1); */
/*           } */
/*         } */
/*         if ((reply->status) == 0 && (i != 0)) { */
/*           if (*size != (*replysize+2+i)) { */
/*             printf("Received packet has wrong length\n"); */
/*             printf("Expected: %i, Got: %i \n", *replysize+2+i, *size); */
/*           } */
/*           if (cmd->incr == yes) { */
/*             for(k = 0; k < i; k++) { */
/*               if (loadb((int)&(rx1[*replysize+1+k])) != rx0[k+(m%4)]) { */
/*                 printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[*replysize+1+k])), (unsigned)rx0[k+(m%4)]); */
/*                 exit(1); */
/*               } */
/*             } */
/*           } else { */
/*             for(k = 0; k < i; k++) { */
/*               if (loadb((int)&(rx1[*replysize+1+k])) != rx0[(k%4)+(m%4)]) { */
/*                 printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[*replysize+1+k])), (unsigned)rx0[(k%4)+(m%4)]); */
/*                 printf("Rx1: %x, Rx0: %x\n", (int)rx1, (int)rx0); */
/*                 //exit(1); */
/*               } */
/*             } */
/*           } */
/*         } else { */
/*           if (*size != (*replysize+1)) { */
/*             printf("Received packet has wrong length\n"); */
/*             printf("Expected: %i, Got: %i \n", *replysize+1, *size); */
/*           } */
/*         } */
/*         if ((i % 512) == 0) { */
/*           printf("Packet  %i, alignment %i\n", i, m); */
/*         } */
/*       } */
/*     } */
/*     printf("Read test passed\n"); */
 
/*     /\*late and early eop tests*\/ */
/*     for(i = 0; i < RMAPSIZE; i++) { */
/*       if (i < 16) { */
/*         tmp = -i; */
/*       } else { */
/*         tmp = -16; */
/*       } */
/*       for (j = tmp; j < i; j++) { */
/*         for (m = 0; m < 3; m++) { */
/*           for(k = 0; k < i; k++) { */
/*             tx1[k]  = ~tx1[k]; */
/*           } */
/*           if (m == 0) { */
/*             cmd->type     = writecmd; */
/*             cmd->verify   = no; */
/*             reply->type   = writerep; */
/*             reply->verify = no; */
/*           } else if (m == 2) { */
/*             cmd->type     = rmwcmd; */
/*             cmd->verify   = yes; */
/*             reply->type    = rmwrep; */
/*             reply->verify = yes; */
/*           } else { */
/*             cmd->type     = writecmd; */
/*             cmd->verify   = yes; */
/*             reply->type    = writerep; */
/*             reply->verify = yes; */
/*           } */
/*           cmd->incr     = yes; */
/*           cmd->ack      = yes; */
/*           cmd->destaddr = 0x14; */
/*           cmd->destkey  = 0xBF; */
/*           cmd->srcaddr  = 0x14; */
/*           cmd->tid      = i; */
/*           cmd->addr     = (int)rx0; */
/*           cmd->len      = i; */
/*           cmd->status   = 0; */
/*           cmd->dstspalen = 0; */
/*           cmd->dstspa  = (char *)NULL; */
/*           cmd->srcspalen = 0; */
/*           cmd->srcspa = (char *)NULL; */
/*           if (build_rmap_hdr(cmd, tx0, cmdsize)) { */
/*             printf("RMAP cmd build failed\n"); */
/*             exit(1); */
/*           } */
/*           reply->len       = 0; */
/*           if (j < 0 ) { */
/*             reply->status = 5; */
/*           } else if (j == 0) { */
/*             reply->status = 0; */
 
/*           } else { */
/*             reply->status = 6; */
/*             for(l = 0; l < i; l++) { */
/*               if ((int)tx1[l] != 0) { */
/*                 reply->status = 4; */
/*               } */
/*             } */
/*           } */
/*           if(m == 2 ) { */
/*             if((cmd->len != 0) && (cmd->len != 2) && (cmd->len != 4) && */
/*                (cmd->len != 6) && (cmd->len != 8)) { */
/*               reply->status = 11; */
/*             } else if( (((cmd->len/2) == 2) && (cmd->addr % 2 != 0)) || */
/*                        (((cmd->len/2) == 4) && (cmd->addr % 4 != 0)) || */
/*                        ((cmd->len/2) == 3) ) { */
/*               reply->status = 10; */
/*             } else { */
/*               if ((reply->status != 0) && (reply->status != 6)) { */
/*                 reply->len = 0; */
/*               } else { */
/*                 reply->len = cmd->len/2; */
/*               } */
/*             } */
/*           } else if (m != 0) { */
/*             if(cmd->len > 4) { */
/*               reply->status = 9; */
/*             } else if( (((cmd->len) == 2) && (cmd->addr % 2 != 0)) || */
/*                        (((cmd->len) == 4) && (cmd->addr % 4 != 0)) || */
/*                        ((cmd->len) == 3) ) { */
/*               reply->status = 10; */
/*             } */
/*           } */
/*           reply->incr      = yes; */
/*           reply->ack       = yes; */
/*           reply->destaddr  = 0x14; */
/*           reply->destkey   = 0xBF; */
/*           reply->srcaddr   = 0x14; */
/*           reply->tid       = i; */
/*           reply->addr      = (int)rx0; */
/*           reply->dstspalen = 0; */
/*           reply->dstspa    = (char *) NULL; */
/*           reply->srcspalen = 0; */
/*           reply->srcspa    = (char *) NULL; */
/*           if (build_rmap_hdr(reply, rx2, replysize)) { */
/*             printf("RMAP reply build failed\n"); */
/*             exit(1); */
/*           } */
/*           if ((reply->status == 0) || (reply->status == 6)) { */
/*             for(k = 0; k < reply->len; k++) { */
/*               rx2[*replysize+1+k] = loadb((int)&(rx0[k])); */
/*             } */
/*           } */
/*           while (spw_rx(rx1, spw)) { */
/*             for (k = 0; k < 64; k++) {} */
/*           } */
/*           if (spw_tx(1, 1, 0, *cmdsize, tx0, i+j, tx1, spw)) { */
/*             printf("Transmission failed\n"); */
/*             exit(1); */
/*           } */
/*           while (!(tmp = spw_checktx(spw))) { */
/*             for (k = 0; k < 64; k++) {} */
/*           } */
/*           if (tmp != 1) { */
/*             printf("Error in transmit \n"); */
/*             exit(1); */
/*           } */
/*           while (!(tmp = spw_checkrx(size, rxs, spw))) { */
/*             for (k = 0; k < 64; k++) {} */
/*           } */
/*           if (rxs->truncated) { */
/*             printf("Received packet truncated\n"); */
/*             exit(1); */
/*           } */
/*           if(rxs->eep) { */
/*             printf("Received packet terminated with eep\n"); */
/*             exit(1); */
/*           } */
/*           if(rxs->hcrcerr) { */
/*             printf("Received packet header crc error detected\n"); */
/*             exit(1); */
/*           } */
/*           if(rxs->dcrcerr) { */
/*             printf("Received packet data crc error detected\n"); */
/*             exit(1); */
/*           } */
/*           if (m == 2) { */
/*             if ((i != 0) && ((reply->status == 0) || (reply->status == 6))) { */
/*               tmp = reply->len+1; */
/*             } else { */
/*               tmp = 0; */
/*             } */
/*           } else { */
/*             tmp = 0; */
/*           } */
/*           if (*size != (*replysize+1+tmp)) { */
/*             printf("Received packet has wrong length\n"); */
/*             printf("Expected: %i, Got: %i \n", *replysize+1+tmp, *size); */
/*             exit(1); */
/*           } */
/*           if (tmp == 0) { */
/*             tmp++; */
/*           } */
/*           for(k = 0; k < *replysize; k++) { */
/*             if (loadb((int)&(rx1[k])) != rx2[k]) { */
/*               if (k != 3) { */
/*                 printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]); */
/*                 printf("Packet  %i, type %i, offset: %i\n", i, m, j); */
/*                 exit(1); */
/*               } */
/*             } */
/*           } */
/*           if ((reply->status == 0) || (reply->status == 6)) { */
/*             if (m == 2) { */
/*               for(k = 0; k < reply->len; k++) { */
/*                 if (loadb((int)&(rx1[k+*replysize+1])) != rx2[k+*replysize+1]) { */
/*                   printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k+*replysize+1])), (unsigned)rx2[k+*replysize+1]); */
/*                   printf("Rx0: %x, Rx1: %x, Rx2: %x\n", (int)rx0, (int)rx1, (int)rx2); */
/*                   exit(1); */
/*                 } */
/*               } */
/*               for(k = 0; k < (reply->len/2); k++) { */
/*                 if (loadb((int)&(rx0[k])) != ((tx1[k] & tx1[k+(i/2)]) | (rx2[*replysize+1+k] & ~tx1[k+(i/2)]) )) { */
/*                   printf("Compare error 3: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)tx1[k]); */
/*                   exit(1); */
/*                 } */
/*               } */
/*             } else { */
/*               for (k = 0; k < i; k++) { */
/*                 if (loadb((int)&(rx0[k])) != tx1[k]) { */
/*                   printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)tx1[k]); */
/*                   exit(1); */
/*                 } */
/*               } */
/*             } */
/*           } */
/*           if (((i % 8) == 0) && (m == 0) && (j == 0)) { */
/*             printf("Packet  %i, type %i, offset: %i\n", i, m, j); */
/*           } */
/*         } */
/*       } */
 
/*     } */
/*     printf("Test 10 completed successfully\n"); */
   } 
 
  /************************ TEST 11 **************************************/
  printf("Dma channel RMAP CRC test\n");
  if ((spw->rmapcrc == 1) && (spw->rmap == 0)) {
    tx0 = (char *)malloc(64); 
    tx1 = (char *)calloc(RMAPCRCSIZE, 1);
    rx1 = (char *)malloc(32+RMAPCRCSIZE);
    for(i = 0; i < RMAPCRCSIZE; i++) {
      for(m = 0; m < 6; m++) {
        for(k = 0; k < i; k++) {
          tx1[k]  = ~tx1[k];
        }
        switch (m) {
          case 0:
            cmd->type     = writecmd;
            cmd->verify   = no;
            j = i;
            break;
          case 1:
            cmd->type     = readcmd;
            cmd->verify   = no;
            j = 0;
            break;
          case 2:
            cmd->type     = rmwcmd;
            j           = (i % 8);
            cmd->verify   = yes;
            break;
          case 3:
            cmd->type     = writerep;
            j           = 0;
            cmd->verify   = no;
            break;
          case 4:
            cmd->type     = readrep;
            cmd->verify   = no;
            j           = i;
            break;
          case 5:
            cmd->type     = rmwrep;
            j           = (i/2);
            cmd->verify   = yes;
            break;
          default:
            break;
        }
        cmd->incr     = no;
        cmd->ack      = yes;
        cmd->destaddr = 0x14;
        cmd->destkey  = 0xBF;
        cmd->srcaddr  = 0x14;
        cmd->tid      = i;
        cmd->addr     = (int)(rx0);
        cmd->len      = i;
        cmd->status   = 0;
        cmd->dstspalen = 0;
        cmd->dstspa  = (char *)NULL;
        cmd->srcspalen = 0;
        cmd->srcspa = (char *)NULL;
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
          printf("RMAP cmd build failed\n");
          exit(1);
        }
        while (spw_rx(rx1, spw)) {
          for (k = 0; k < 64; k++) {}
        }
        if (spw_tx(1, 1, 0, *cmdsize, tx0, j, tx1, spw)) {
          printf("Transmission failed\n");
          exit(1);
        }
        while (!(tmp = spw_checktx(spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (tmp != 1) {
          printf("Error in transmit \n");
          exit(1);
        }
        while (!(tmp = spw_checkrx(size, rxs, spw))) {
          for (k = 0; k < 64; k++) {}
        }
        if (rxs->truncated) {
          printf("Received packet truncated\n");
          exit(1);
        }
        if(rxs->eep) {
          printf("Received packet terminated with eep\n");
          exit(1);
        }
        if(rxs->hcrcerr) {
          printf("Received packet header crc error detected\n");
          exit(1);
        }
        if(rxs->dcrcerr) {
          printf("Received packet data crc error detected\n");
          exit(1);
        }
        if (j != 0) {
          l = 1;
        } else {
          l = 0;
        }
        if (*size != (*cmdsize+1+j+l)) {
          printf("Received packet has wrong length\n");
          printf("Expected: %i, Got: %i \n", *cmdsize+1+j+l, *size);
          exit(1);
        }
        for(k = 0; k < *cmdsize; k++) {
          if (loadb((int)&(rx1[k])) != tx0[k]) {
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)tx0[k]);
            printf("Packet  %i, type %i\n", i, m);
            exit(1);
          }
        }
        for(k = 0; k < j; k++) {
          if (loadb((int)&(rx1[k+*cmdsize+1])) != tx1[k]) {
            printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k+*cmdsize+1])), (unsigned)tx1[k]);
            exit(1);
          }
        }
        if (((i % 4) == 0) && ((m % 3) == 0)) {
          printf("Packet  %i, type %i\n", i, m);
        }
      }
    }
  }
  printf("Test 11 completed successfully\n");
  printf("*********** Test suite completed successfully ************\n");
  exit(0);
 
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.