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/] [spw_test_dual.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/*****************************************************************************/
2
/*   This file is a part of the GRLIB VHDL IP LIBRARY */
3
/*   Copyright (C) 2004 GAISLER RESEARCH */
4
 
5
/*   This program is free software; you can redistribute it and/or modify */
6
/*   it under the terms of the GNU General Public License as published by */
7
/*   the Free Software Foundation; either version 2 of the License, or */
8
/*   (at your option) any later version. */
9
 
10
/*   See the file COPYING for the full details of the license. */
11
/******************************************************************************/
12
 
13
#define SPW1_ADDR    0x80000a00
14
#define SPW2_ADDR    0x80000b00 
15
#define SPW1_FREQ    50000       /* Frequency of txclk in khz, set to 0 to use reset value  */
16
#define SPW2_FREQ    50000       /* Frequency of txclk in khz, set to 0 to use reset value  */
17
#define AHBFREQ      75000        /* Set to zero to leave reset values */
18
 
19
#define SPW_CLKDIV   5
20
 
21
#include <stdlib.h>
22
#include "spwapi.h"
23
#include "rmapapi.h"
24
#include <time.h>
25
#include <string.h>
26
#include <limits.h>
27
 
28
#define PKTTESTMAX  128
29
#define DESCPKT     1024
30
#define MAXSIZE     16777215     /*must not be set to more than 16777216 (2^24)*/
31
#define RMAPSIZE    1024
32
#define RMAPCRCSIZE 1024
33
 
34
#define TEST1       1
35
#define TEST2       1
36
#define TEST3       1
37
#define TEST4       1 
38
#define TEST5       1 
39
#define TEST6       1
40
#define TEST7       1 
41
#define TEST8       1
42
#define TEST9       1
43
#define TEST10      1
44
#define TEST11      1
45
#define TEST12      1
46
 
47
static inline char loadb(int addr)
48
{
49
  char tmp;
50
  asm(" lduba [%1]1, %0 "
51
      : "=r"(tmp)
52
      : "r"(addr)
53
    );
54
  return tmp;
55
}
56
 
57
static inline int loadmem(int addr)
58
{
59
  int tmp;
60
  asm(" lda [%1]1, %0 "
61
      : "=r"(tmp)
62
      : "r"(addr)
63
    );
64
  return tmp;
65
}
66
 
67
int main(int argc, char *argv[])
68
{
69
  int  ret;
70
  clock_t t1, t2;
71
  double t3, bitrate;
72
  int  dmachan;
73
  int  sysfreq;
74
  int  txfreq1;
75
  int  txfreq2;
76
  int  i;
77
  int  j;
78
  int  k;
79
  int  m;
80
  int  l;
81
  int  iterations;
82
  int  data;
83
  int  hdr;
84
  int  notrx;
85
  int  tmp;
86
  int  eoplen;
87
  int  *size;
88
  char *txbuf;
89
  char *rxbuf;
90
  char *rx0;
91
  char *rx1;
92
  char *rx2;
93
  char *rx3;
94
  char *tx0;
95
  char *tx1;
96
  char *tx2;
97
  char *tx3;
98
  char *tx[64];
99
  char *rx[128];
100
  struct rxstatus *rxs;
101
  struct spwvars *spw1;
102
  struct spwvars *spw2;
103
  struct rmap_pkt *cmd;
104
  struct rmap_pkt *reply;
105
  int *cmdsize;
106
  int *replysize;
107
  int startrx[4];
108
  int rmappkt;
109
  int rmapincr;
110
  int destaddr;
111
  int sepaddr[4];
112
  int chanen[4];
113
  int rmaprx;
114
  int found;
115
  int rxchan;
116
  int length;
117
  int maxlen;
118
  spw1 = (struct spwvars *) malloc(sizeof(struct spwvars));
119
  spw2 = (struct spwvars *) malloc(sizeof(struct spwvars));
120
  rxs = (struct rxstatus *) malloc(sizeof(struct rxstatus));
121
  size = (int *) malloc(sizeof(int));
122
 
123
  cmd = (struct rmap_pkt *) malloc(sizeof(struct rmap_pkt));
124
  reply = (struct rmap_pkt *) malloc(sizeof(struct rmap_pkt));
125
  cmdsize = (int *) malloc(sizeof(int));
126
  replysize = (int *) malloc(sizeof(int));
127
 
128
  if (SPW1_FREQ == 0) {
129
          spw1->clkdivs = loadmem((int)&(spw1->regs->clkdiv));
130
  } else {
131
          spw1->clkdivs = SPW1_FREQ/10000;
132
          if (spw1->clkdivs)
133
                  spw1->clkdivs--;
134
  }
135
 
136
  if (SPW2_FREQ == 0) {
137
          spw2->clkdivs = loadmem((int)&(spw2->regs->clkdiv));
138
  } else {
139
          spw2->clkdivs = SPW2_FREQ/10000;
140
          if (spw2->clkdivs)
141
                  spw2->clkdivs--;
142
  }
143
 
144
  printf("**** TEST STARTED **** \n\n");
145
  /************************ TEST INIT ***********************************/
146
  /*Initalize link*/
147
  /*initialize parameters*/
148
  if (spw_setparam(0x1, SPW_CLKDIV, 0xBF, 0, 0, SPW1_ADDR, AHBFREQ, spw1) ) {
149
    printf("Illegal parameters to spacewire\n");
150
    exit(1);
151
  }
152
  if (spw_setparam(0x2, SPW_CLKDIV, 0xBF, 0, 0, SPW2_ADDR, AHBFREQ ,spw2) ) {
153
    printf("Illegal parameters to spacewire\n");
154
    exit(1);
155
  }
156
 
157
  for(i = 0; i < 4; i++) {
158
    spw_setparam_dma(i, 0x1, 0x0, 1, 1048576, spw1);
159
  }
160
  for(i = 0; i < 4; i++) {
161
    spw_setparam_dma(i, 0x2, 0x0, 1, 1048576, spw2);
162
  }
163
 
164
  /* reset links */
165
  spw_reset(spw1);
166
  spw_reset(spw2);
167
  /* initialize links */
168
  if ((ret = spw_init(spw1))) {
169
    printf("Link initialization failed for link1: %d\n", ret);
170
  }
171
  if ((ret = spw_init(spw2))) {
172
    printf("Link initialization failed for link2: %d\n", ret);
173
  }
174
 
175
  printf("SPW 1 version: %d \n", spw1->ver);
176
  printf("SPW 2 version: %d \n", spw2->ver);
177
 
178
  if (wait_running(spw1)) {
179
          printf("Link 1 did not enter run-state\n");
180
  }
181
  if (wait_running(spw2)) {
182
          printf("Link 2 did not enter run-state\n");
183
  }
184
 
185
/*   /\************************ TEST 1 **************************************\/  */
186
/*   /\*Simulatenous time-code and packet transmission/reception*\/ */
187
#if TEST1 == 1 
188
  printf("TEST 1: Tx and Rx with simultaneous time-code transmissions \n\n");
189
  rx0 = malloc(128);
190
  rx1 = malloc(128);
191
  rx2 = malloc(128);
192
  rx3 = malloc(128);
193
  tx0 = malloc(128);
194
  tx1 = malloc(128);
195
  tx2 = malloc(128);
196
  tx3 = malloc(128);
197
  /* for(i = 2; i < 128; i++) { */
198
/*     tx0[i] = (char)i; */
199
/*     tx1[i] = (char)~i; */
200
/*     tx2[i] = (char)(i ^ (i + ~i)); */
201
/*     tx3[i] = (char)(i ^ (i + ~i + 5)); */
202
/*   } */
203
  tx0[0] = (char)0x2;
204
  tx1[0] = (char)0x2;
205
  tx2[0] = (char)0x1;
206
  tx3[0] = (char)0x1;
207
 /*  tx0[1] = (char)0x02; */
208
/*   tx1[1] = (char)0x02; */
209
/*   tx2[1] = (char)0x02; */
210
/*   tx3[1] = (char)0x02; */
211
  spw_rx(0, rx0, spw1);
212
  spw_rx(0, rx1, spw1);
213
  spw_rx(0, rx2, spw2);
214
  spw_rx(0, rx3, spw2);
215
  spw_tx(0, 0, 0, 0, 0, tx0, 128, tx0, spw1);
216
  spw_tx(0, 0, 0, 0, 0, tx1, 128, tx1, spw1);
217
  spw_tx(0, 0, 0, 0, 0, tx2, 128, tx2, spw2);
218
  spw_tx(0, 0, 0, 0, 0, tx3, 128, tx3, spw2);
219
 
220
  for (i = 0; i < 2; i++) {
221
    while(!(tmp = spw_checktx(0, spw1))) {
222
      for(j = 0; j < 64; j++) {}
223
    }
224
    if (tmp != 1) {
225
      printf("Transmit error link 1\n");
226
      exit(1);
227
    }
228
  }
229
 
230
  for(i = 0; i < 2; i++) {
231
    while(!(tmp = spw_checktx(0, spw2))) {
232
      for(j = 0; j < 64; j++) {}
233
    }
234
    if (tmp != 1) {
235
      printf("Transmit error link 2\n");
236
      exit(1);
237
    }
238
  }
239
 
240
  for(i = 0; i < 2; i++) {
241
    while(!(tmp = spw_checkrx(0, size, rxs, spw1))) {
242
      for(j = 0; j < 64; j++) {}
243
    }
244
    if (rxs->truncated) {
245
      printf("Received packet truncated link 1\n");
246
      exit(1);
247
    }
248
    if(rxs->eep) {
249
      printf("Received packet terminated with eep link 1\n");
250
      exit(1);
251
    }
252
    if (*size != 128) {
253
      printf("Received packet has wrong length link 1\n");
254
      exit(1);
255
    }
256
  }
257
 
258
  printf("Link 1 received\n");
259
 
260
  for(i = 0; i < 2; i++) {
261
    while(!(tmp = spw_checkrx(0, size, rxs, spw2))) {
262
      for(j = 0; j < 64; j++) {}
263
    }
264
    if (rxs->truncated) {
265
      printf("Received packet truncated link 2\n");
266
      exit(1);
267
    }
268
    if(rxs->eep) {
269
      printf("Received packet terminated with eep link 2\n");
270
      exit(1);
271
    }
272
    if (*size != 128) {
273
      printf("Received packet has wrong length link 2\n");
274
      exit(1);
275
    }
276
  }
277
 
278
  printf("Link 2 received\n");
279
 
280
  for(j = 0; j < 128; j++) {
281
    if (loadb((int)&(rx2[j])) != tx0[j]) {
282
      printf("Compare error buf 0: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx2[j])), (unsigned)tx0[j]);
283
      exit(1);
284
    }
285
    if (loadb((int)&(rx3[j])) != tx1[j]) {
286
      printf("Compare error buf 1: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx3[j])), (unsigned)tx1[j]);
287
      exit(1);
288
    }
289
    if (loadb((int)&(rx0[j])) != tx2[j]) {
290
      printf("Compare error buf 2: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx0[j])), (unsigned)tx2[j]);
291
      exit(1);
292
    }
293
    if (loadb((int)&(rx1[j])) != tx3[j]) {
294
      printf("Compare error buf 3: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rx1[j])), (unsigned)tx3[j]);
295
      exit(1);
296
    }
297
  }
298
  free(rx0);
299
  free(rx1);
300
  free(rx2);
301
  free(rx3);
302
  free(tx0);
303
  free(tx1);
304
  free(tx2);
305
  free(tx3);
306
  printf("TEST 1: completed successfully\n\n");
307
#endif
308
/* /\************************ TEST 2 **************************************\/ */
309
#if TEST2 == 1
310
  printf("TEST 2: Tx and Rx of varying sized packets from/to DMA channel \n\n");
311
  if ((txbuf = calloc(PKTTESTMAX, 1)) == NULL) {
312
    printf("Transmit buffer initialization failed\n");
313
    exit(1);
314
  }
315
  if ((rxbuf = calloc(PKTTESTMAX, 1)) == NULL) {
316
    printf("Receive buffer initialization failed\n");
317
    exit(1);
318
  }
319
  /*initialize data*/
320
  for (j = 0; j < PKTTESTMAX; j++) {
321
    txbuf[j] = (char)j;
322
  }
323
  txbuf[0] = 0x2;
324
  txbuf[1] = 0x2;
325
  for (i = 2; i < PKTTESTMAX; i++) {
326
    printf(".");
327
    for (j = 2; j < i; j++) {
328
      txbuf[j] = ~txbuf[j];
329
    }
330
    while (spw_rx(0, rxbuf, spw2)) {
331
      for (k = 0; k < 64; k++) {}
332
    }
333
    if (spw_tx(0, 0, 0, 0, 0, txbuf, i, txbuf, spw1)) {
334
      printf("Transmission failed\n");
335
      exit(1);
336
    }
337
    while (!(tmp = spw_checktx(0, spw1))) {
338
      for (k = 0; k < 64; k++) {}
339
    }
340
    if (tmp != 1) {
341
      printf("Error in transmit \n");
342
      exit(1);
343
    }
344
    while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
345
      for (k = 0; k < 64; k++) {}
346
    }
347
    if (rxs->truncated) {
348
      printf("Received packet truncated\n");
349
      exit(1);
350
    }
351
    if(rxs->eep) {
352
      printf("Received packet terminated with eep\n");
353
      exit(1);
354
    }
355
    if (*size != i) {
356
      printf("Received packet has wrong length\n");
357
      printf("Expected: %i, Got: %i \n", i, *size);
358
    }
359
    for(j = 0; j < i; j++) {
360
      if (loadb((int)&(rxbuf[j])) != txbuf[j]) {
361
        printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)txbuf[j]);
362
        //exit(1);
363
      }
364
    }
365
    /*printf("Packet %i transferred\n", i);*/
366
  }
367
  free(rxbuf);
368
  free(txbuf);
369
  printf("\n");
370
  printf("TEST 2: completed successfully\n\n");
371
#endif
372
/*   /\************************ TEST 3 **************************************\/ */
373
#if TEST3 == 1
374
  if (spw2->rmap || spw2->rxunaligned) {
375
    printf("TEST 3: Tx and Rx with varying size and alignment from/to DMA channel\n\n");
376
    if ((txbuf = calloc(PKTTESTMAX, 1)) == NULL) {
377
      printf("Transmit buffer initialization failed\n");
378
      exit(1);
379
    }
380
    if ((rxbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
381
      printf("Receive buffer initialization failed\n");
382
      exit(1);
383
    }
384
    /*initialize data*/
385
    for (j = 0; j < PKTTESTMAX; j++) {
386
      txbuf[j] = (char)j;
387
    }
388
    txbuf[0] = 0x2;
389
    txbuf[1] = 0x2;
390
    for (i = 2; i < PKTTESTMAX; i++) {
391
      for(m = 1; m < 4; m++) {
392
        printf(".");
393
        for (j = 2; j < i; j++) {
394
          txbuf[j] = ~txbuf[j];
395
        }
396
        while (spw_rx(0, (char *)&(rxbuf[m]), spw2)) {
397
          for (k = 0; k < 64; k++) {}
398
        }
399
        if (spw_tx(0, 0, 0, 0, 0, txbuf, i, txbuf, spw1)) {
400
          printf("Transmission failed\n");
401
          exit(1);
402
        }
403
        while (!(tmp = spw_checktx(0, spw1))) {
404
          for (k = 0; k < 64; k++) {}
405
        }
406
        if (tmp != 1) {
407
          printf("Error in transmit \n");
408
          exit(1);
409
        }
410
        while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
411
          for (k = 0; k < 64; k++) {}
412
        }
413
        if (rxs->truncated) {
414
          printf("Received packet truncated\n");
415
          exit(1);
416
        }
417
        if(rxs->eep) {
418
          printf("Received packet terminated with eep\n");
419
          exit(1);
420
        }
421
        if (*size != i) {
422
          printf("Received packet has wrong length\n");
423
          printf("Expected: %i, Got: %i \n", i, *size);
424
        }
425
        for(j = 0; j < i; j++) {
426
          if (loadb((int)&(rxbuf[j+m])) != txbuf[j]) {
427
            printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j+m])), (unsigned)txbuf[j]);
428
            exit(1);
429
          }
430
        }
431
        /* printf("Packet %i transferred with alignment %i\n", i, m); */
432
      }
433
 
434
    }
435
    free(rxbuf);
436
    free(txbuf);
437
    printf("\n");
438
    printf("TEST 3: completed successfully\n\n");
439
  }
440
#endif
441
/*   /\************************ TEST 4 **************************************\/ */
442
#if TEST4 == 1 
443
  printf("TEST 4: Tx from data pointer with varying alignment\n\n");
444
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
445
    printf("Transmit buffer initialization failed\n");
446
    exit(1);
447
  }
448
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
449
    printf("Receive buffer initialization failed\n");
450
    exit(1);
451
  }
452
  /*initialize data*/
453
  for (j = 0; j < PKTTESTMAX+4; j++) {
454
    txbuf[j] = (char)j;
455
  }
456
  for(i = 2; i < PKTTESTMAX; i++) {
457
    for(m = 0; m < 4; m++) {
458
      printf(".");
459
      for (j = 2; j < (i+m); j++) {
460
        txbuf[j] = ~txbuf[j];
461
      }
462
      txbuf[m] = 0x2;
463
      txbuf[m+1] = 0x2;
464
      while (spw_rx(0, rxbuf, spw2)) {
465
        for (k = 0; k < 64; k++) {}
466
      }
467
      if (spw_tx(0, 0, 0, 0, 0, txbuf, i, (char *)&(txbuf[m]), spw1)) {
468
        printf("Transmission failed\n");
469
        exit(1);
470
      }
471
      while (!(tmp = spw_checktx(0, spw1))) {
472
        for (k = 0; k < 64; k++) {}
473
      }
474
      if (tmp != 1) {
475
        printf("Error in transmit \n");
476
        exit(1);
477
      }
478
      while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
479
        for (k = 0; k < 64; k++) {}
480
      }
481
      if (rxs->truncated) {
482
        printf("Received packet truncated\n");
483
        exit(1);
484
      }
485
      if(rxs->eep) {
486
        printf("Received packet terminated with eep\n");
487
        exit(1);
488
      }
489
      if (*size != i) {
490
        printf("Received packet has wrong length\n");
491
        printf("Expected: %i, Got: %i \n", i, *size);
492
      }
493
      for(j = 0; j < i; j++) {
494
        if (loadb((int)&(rxbuf[j])) != txbuf[j+m]) {
495
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)txbuf[j+m]);
496
          exit(1);
497
        }
498
      }
499
      /* printf("Packet %i transferred with alignment %i\n", i, m); */
500
    }
501
 
502
  }
503
  free(rxbuf);
504
  free(txbuf);
505
  printf("\n");
506
  printf("TEST 4: completed successfully\n\n");
507
#endif
508
  /************************ TEST 5 **************************************/
509
#if TEST5 == 1
510
  printf("TEST 5: Tx with header and data pointers with varying aligment on header \n\n");
511
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
512
    printf("Transmit buffer initialization failed\n");
513
    exit(1);
514
  }
515
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
516
    printf("Receive buffer initialization failed\n");
517
    exit(1);
518
  }
519
  if ((tx0 = calloc(260, 1)) == NULL) {
520
    printf("Receive buffer initialization failed\n");
521
    exit(1);
522
  }
523
  /*initialize data*/
524
  for (j = 0; j < PKTTESTMAX; j++) {
525
    txbuf[j] = (char)j;
526
  }
527
  for (j = 0; j < 260; j++) {
528
    tx0[j] = (char)~j;
529
  }
530
  txbuf[0] = 0x2;
531
  txbuf[1] = 0x2;
532
  for(i = 0; i < 256; i++) {
533
    for(m = 0; m < 4; m++) {
534
      printf(".");
535
      for (j = 2; j < PKTTESTMAX; j++) {
536
        txbuf[j] = ~txbuf[j];
537
      }
538
      for (j = 0; j < 260; j++) {
539
        tx0[j] = ~tx0[j];
540
      }
541
      tx0[m] = 0x2;
542
      tx0[m+1] = 0x2;
543
      while (spw_rx(0, rxbuf, spw2)) {
544
        for (k = 0; k < 64; k++) {}
545
      }
546
      if (spw_tx(0, 0, 0, 0, i,(char *)&(tx0[m]), PKTTESTMAX, txbuf, spw1)) {
547
        printf("Transmission failed\n");
548
        exit(1);
549
      }
550
      while (!(tmp = spw_checktx(0, spw1))) {
551
        for (k = 0; k < 64; k++) {}
552
      }
553
      if (tmp != 1) {
554
        printf("Error in transmit \n");
555
        exit(1);
556
      }
557
      while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
558
        for (k = 0; k < 64; k++) {}
559
      }
560
      if (rxs->truncated) {
561
        printf("Received packet truncated\n");
562
        exit(1);
563
      }
564
      if(rxs->eep) {
565
        printf("Received packet terminated with eep\n");
566
        exit(1);
567
      }
568
      if (*size != (PKTTESTMAX+i)) {
569
        printf("Received packet has wrong length\n");
570
        printf("Expected: %i, Got: %i \n", i+PKTTESTMAX, *size);
571
      }
572
      for(j = 0; j < i; j++) {
573
        if (loadb((int)&(rxbuf[j])) != tx0[j+m]) {
574
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j])), (unsigned)tx0[j+m]);
575
        }
576
      }
577
      for(j = 0; j < PKTTESTMAX; j++) {
578
        if (loadb((int)&(rxbuf[j+i])) != txbuf[j]) {
579
          printf("Compare error: %u Data: %x Expected: %x \n", j, (unsigned)loadb((int)&(rxbuf[j+i])), (unsigned)txbuf[j]);
580
        }
581
      }
582
      /* printf("Packet %i transferred with alignment %i\n", i, m); */
583
    }
584
 
585
  }
586
  free(rxbuf);
587
  free(txbuf);
588
  free(tx0);
589
  printf("\n");
590
  printf("TEST 5: completed successfully\n\n");
591
#endif
592
/*   /\************************ TEST 6 **************************************\/ */
593
#if TEST6 == 1
594
  printf("TEST 6: Tx with data and header both with varying alignment \n\n");
595
  if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
596
    printf("Transmit buffer initialization failed\n");
597
    exit(1);
598
  }
599
  if ((rxbuf = calloc(PKTTESTMAX+256, 1)) == NULL) {
600
    printf("Receive buffer initialization failed\n");
601
    exit(1);
602
  }
603
  if ((tx0 = calloc(260, 1)) == NULL) {
604
    printf("Receive buffer initialization failed\n");
605
    exit(1);
606
  }
607
  /*initialize data*/
608
  for (j = 0; j < PKTTESTMAX; j++) {
609
    txbuf[j] = (char)j;
610
  }
611
  for (j = 0; j < 260; j++) {
612
    tx0[j] = (char)~j;
613
  }
614
  notrx = 0;
615
  for(i = 0; i < 256; i++) {
616
    printf(".");
617
    /* printf("Packet with header %i, alignment: %i and data: %i, alignment: %i transferred\n", i, m, j, l); */
618
    for(j = 0; j < PKTTESTMAX; j++) {
619
      for(m = 0; m < 4; m++) {
620
        for(l = 0; l < 4; l++) {
621
          for (k = 0; k < PKTTESTMAX; k++) {
622
            txbuf[k] = ~txbuf[k];
623
          }
624
          for (k = 0; k < 260; k++) {
625
            tx0[k] = ~tx0[k];
626
          }
627
          tx0[m] = 0x2;
628
          tx0[m+1] = 0x2;
629
          txbuf[l] = 0x2;
630
          txbuf[l+1] = 0x2;
631
          if (!notrx) {
632
            while (spw_rx(0, rxbuf, spw2)) {
633
              for (k = 0; k < 64; k++) {}
634
            }
635
          }
636
          if (spw_tx(0, 0, 0, 0, i,(char *)&(tx0[m]), j, (char *)&(txbuf[l]), spw1)) {
637
            printf("Transmission failed\n");
638
            exit(1);
639
          }
640
          while (!(tmp = spw_checktx(0, spw1))) {
641
            for (k = 0; k < 64; k++) {}
642
          }
643
          if (tmp != 1) {
644
            printf("Error in transmit \n");
645
            exit(1);
646
          }
647
          if( (i+j) > 1) {
648
            while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
649
              for (k = 0; k < 64; k++) {}
650
            }
651
            if (rxs->truncated) {
652
              printf("Received packet truncated\n");
653
              exit(1);
654
            }
655
            if(rxs->eep) {
656
              printf("Received packet terminated with eep\n");
657
              exit(1);
658
            }
659
            if (*size != (j+i)) {
660
              printf("Received packet has wrong length\n");
661
              printf("Expected: %i, Got: %i \n", i+j, *size);
662
            }
663
            for(k = 0; k < i; k++) {
664
              if (loadb((int)&(rxbuf[k])) != tx0[k+m]) {
665
                printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)tx0[k+m]);
666
                exit(1);
667
              }
668
            }
669
            for(k = 0; k < j; k++) {
670
              if (loadb((int)&(rxbuf[k+i])) != txbuf[k+l]) {
671
                printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+i])), (unsigned)txbuf[k+l]);
672
                exit(1);
673
              }
674
            }
675
            notrx = 0;
676
          } else {
677
            for(k = 0; k < 1048576; k++) {}
678
            if (spw_checkrx(0, size, rxs, spw2)) {
679
              printf("Packet recevied/sent although length was too small\n");
680
              exit(1);
681
            }
682
            notrx = 1;
683
          }
684
        }
685
 
686
      }
687
    }
688
  }
689
  free(rxbuf);
690
  free(txbuf);
691
  free(tx0);
692
  printf("\n");
693
  printf("TEST 6: completed successfully\n\n");
694
#endif
695
/*   /\************************ TEST 7 **************************************\/ */
696
#if TEST7 == 1
697
  printf("TEST 7: Fill descriptor tables completely \n\n");
698
  for(i = 0; i < 64; i++) {
699
    tx[i] = malloc(DESCPKT);
700
  }
701
  for(i = 0; i < 128; i++) {
702
    rx[i] = malloc(DESCPKT+256);
703
  }
704
  txbuf = malloc(256);
705
  /*initialize data*/
706
  for(i = 0; i < 64; i++) {
707
    tx[i][0] = 0x2;
708
    tx[i][1] = 0x2;
709
    for(j = 2; j < DESCPKT; j++) {
710
      tx[i][j] = j ^ i;
711
    }
712
  }
713
  txbuf[0] = 0x2;
714
  txbuf[1] = 0x2;
715
  for(i = 2; i < 256; i++) {
716
    txbuf[i] = i;
717
  }
718
  for(i = 0; i < 128; i++) {
719
    while (spw_rx(0, rx[i], spw2)) {
720
      for (k = 0; k < 64; k++) {}
721
    }
722
  }
723
  for(i = 0; i < 64; i++) {
724
    if (spw_tx(0, 0, 0, 0, 255, txbuf, DESCPKT, tx[i], spw1)) {
725
      printf("Transmission failed\n");
726
      exit(1);
727
    }
728
  }
729
  for(i = 0; i < 64; i++) {
730
    while (!(tmp = spw_checktx(0, spw1))) {
731
      for (k = 0; k < 64; k++) {}
732
    }
733
    if (tmp != 1) {
734
      printf("Error in transmit \n");
735
      exit(1);
736
    }
737
  }
738
  for(i = 0; i < 64; i++) {
739
    while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
740
      for (k = 0; k < 64; k++) {}
741
    }
742
    if (rxs->truncated) {
743
      printf("Received packet truncated\n");
744
      exit(1);
745
    }
746
    if(rxs->eep) {
747
      printf("Received packet terminated with eep\n");
748
      exit(1);
749
    }
750
    if (*size != (255+DESCPKT)) {
751
      printf("Received packet has wrong length\n");
752
      printf("Expected: %i, Got: %i \n", 255+DESCPKT, *size);
753
    }
754
    for(k = 0; k < 255; k++) {
755
      if (loadb((int)&(rx[i][k])) != txbuf[k]) {
756
        printf("Txbuf: %x Rxbuf: %x\n", (int)txbuf, (int)rx[i]);
757
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k])), (unsigned)txbuf[k]);
758
        exit(1);
759
      }
760
    }
761
    for(k = 0; k < DESCPKT; k++) {
762
      if (loadb((int)&(rx[i][k+255])) != tx[i][k]) {
763
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k+255])), (unsigned)tx[i][k]);
764
        exit(1);
765
      }
766
    }
767
  }
768
  /*second transmit loop*/
769
  for(i = 0; i < 64; i++) {
770
    if (spw_tx(0, 0, 0, 0, 255, txbuf, DESCPKT, tx[i], spw1)) {
771
      printf("Transmission failed\n");
772
      exit(1);
773
    }
774
  }
775
  for(i = 0; i < 64; i++) {
776
    while (!(tmp = spw_checktx(0, spw1))) {
777
      for (k = 0; k < 64; k++) {}
778
    }
779
    if (tmp != 1) {
780
      printf("Error in transmit \n");
781
      exit(1);
782
    }
783
  }
784
  for(i = 0; i < 64; i++) {
785
    while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
786
      for (k = 0; k < 64; k++) {}
787
    }
788
    if (rxs->truncated) {
789
      printf("Received packet truncated\n");
790
      exit(1);
791
    }
792
    if(rxs->eep) {
793
      printf("Received packet terminated with eep\n");
794
      exit(1);
795
    }
796
    if (*size != (255+DESCPKT)) {
797
      printf("Received packet has wrong length\n");
798
      printf("Expected: %i, Got: %i \n", 255+DESCPKT, *size);
799
    }
800
    for(k = 0; k < 255; k++) {
801
      if (loadb((int)&(rx[i+64][k])) != txbuf[k]) {
802
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx[i][k])), (unsigned)txbuf[k]);
803
        exit(1);
804
      }
805
    }
806
    for(k = 0; k < DESCPKT; k++) {
807
      if (loadb((int)&(rx[i+64][k+255])) != tx[i][k]) {
808
        printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+255])), (unsigned)tx[i][k]);
809
        exit(1);
810
      }
811
    }
812
  }
813
  for(i = 0; i < 64; i++) {
814
    free(tx[i]);
815
  }
816
  for(i = 0; i < 128; i++) {
817
    free(rx[i]);
818
  }
819
  free(txbuf);
820
  printf("TEST 7: completed successfully\n\n");
821
#endif
822
 
823
/*   /\************************ TEST 8 **************************************\/ */
824
#if TEST8 == 1
825
  printf("TEST 8: Transmission and reception of maximum size packets\n");
826
  txbuf = malloc(MAXSIZE+1);
827
  rxbuf = malloc(MAXSIZE);
828
  rx0   = malloc(MAXSIZE);
829
  tx0   = malloc(64);
830
 
831
  if ((rxbuf == NULL) || (txbuf == NULL) || (rx0 == NULL) || (tx0 == NULL)) {
832
    printf("Memory allocation failed\n");
833
    exit(1);
834
  }
835
  txbuf[0] = 0x2;
836
  txbuf[1] = 0x2;
837
  for(i = 2; i < MAXSIZE; i++) {
838
    txbuf[i] = (i % 256);
839
  }
840
  for (i = 0; i < 64; i++) {
841
          while (spw_rx(0, rxbuf, spw2)) {
842
                  for (k = 0; k < 64; k++) {}
843
          }
844
  }
845
  spw2->dma[0].rxmaxlen = MAXSIZE+4;
846
  if (spw_set_rxmaxlength(0, spw2) ) {
847
    printf("Max length change failed\n");
848
    exit(1);
849
  }
850
  printf("Maximum speed test started (several minutes can pass before the next output on screen)\n");
851
  t1 = clock();
852
  for (i = 0; i < 64; i++) {
853
          if (spw_tx(0, 0, 0, 0, 0, txbuf, MAXSIZE, txbuf, spw1)) {
854
                  printf("Transmission failed\n");
855
                  exit(1);
856
          }
857
  }
858
  for (i = 0; i < 64; i++) {
859
          while (!(tmp = spw_checktx(0, spw1))) {
860
                  for (k = 0; k < 64; k++) {}
861
          }
862
  }
863
  t2 = clock();
864
  if (tmp != 1) {
865
    printf("Error in transmit \n");
866
    exit(1);
867
  }
868
  for (i = 0; i < 64; i++) {
869
          while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
870
                  for (k = 0; k < 64; k++) {}
871
          }
872
          if (rxs->truncated) {
873
                  printf("Received packet truncated\n");
874
                  exit(1);
875
          }
876
          if(rxs->eep) {
877
                  printf("Received packet terminated with eep\n");
878
                  exit(1);
879
          }
880
          if (*size != (MAXSIZE)) {
881
                  printf("Received packet has wrong length\n");
882
                  printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
883
          }
884
 
885
  }
886
  /* The same buffer is used for all descriptors so check is done only once*/
887
  for(k = 0; k < MAXSIZE; k++) {
888
          if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
889
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
890
                  exit(1);
891
          }
892
  }
893
  printf("\n");
894
  t2 = t2 - t1;
895
  t3 = t2/CLOCKS_PER_SEC;
896
  bitrate = MAXSIZE/(t3*1000);
897
  bitrate = bitrate*64*8;
898
  bitrate /= 1000.0;
899
  printf("Effective bitrate: %3.1f Mbit/s\n", bitrate);
900
  printf("Maximum speed test full-duplex started (several minutes can pass before the next output on screen)\n");
901
  tx0[0] = 0x1;
902
  tx0[1] = 0x2;
903
  for(i = 2; i < MAXSIZE; i++) {
904
    txbuf[i] = ((~txbuf[i]+i) % 256);
905
  }
906
  for (i = 0; i < 64; i++) {
907
          while (spw_rx(0, rxbuf, spw2)) {
908
                  for (k = 0; k < 64; k++) {}
909
          }
910
  }
911
  for (i = 0; i < 64; i++) {
912
          while (spw_rx(0, rx0, spw1)) {
913
                  for (k = 0; k < 64; k++) {}
914
          }
915
  }
916
  spw1->dma[0].rxmaxlen = MAXSIZE+4;
917
  if (spw_set_rxmaxlength(0, spw1)) {
918
    printf("Max length change failed\n");
919
    exit(1);
920
  }
921
  t1 = clock();
922
  for (i = 0; i < 64; i++) {
923
          if (spw_tx(0, 0, 0, 0, 0, txbuf, MAXSIZE, txbuf, spw1)) {
924
                  printf("Transmission failed link 1\n");
925
                  exit(1);
926
          }
927
          if (spw_tx(0, 0, 0, 0, 2, tx0, MAXSIZE-2, txbuf, spw2)) {
928
                  printf("Transmission failed link 2\n");
929
                  exit(1);
930
          }
931
  }
932
  for (i = 0; i < 64; i++) {
933
          while (!(tmp = spw_checktx(0, spw1))) {
934
                  for (k = 0; k < 64; k++) {}
935
          }
936
          if (tmp != 1) {
937
                  printf("Error in transmit \n");
938
                  exit(1);
939
          }
940
          while (!(tmp = spw_checktx(0, spw2))) {
941
                  for (k = 0; k < 64; k++) {}
942
          }
943
          if (tmp != 1) {
944
                  printf("Error in transmit \n");
945
                  exit(1);
946
          }
947
  }
948
  t2 = clock();
949
  for (i = 0; i < 64; i++) {
950
          while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
951
                  for (k = 0; k < 64; k++) {}
952
          }
953
          if (rxs->truncated) {
954
                  printf("Received packet truncated\n");
955
                  exit(1);
956
          }
957
          if(rxs->eep) {
958
                  printf("Received packet terminated with eep\n");
959
                  exit(1);
960
          }
961
          if (*size != (MAXSIZE)) {
962
                  printf("Received packet has wrong length\n");
963
                  printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
964
          }
965
          while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
966
                  for (k = 0; k < 64; k++) {}
967
          }
968
          if (rxs->truncated) {
969
                  printf("Received packet truncated\n");
970
                  exit(1);
971
          }
972
          if(rxs->eep) {
973
                  printf("Received packet terminated with eep\n");
974
                  exit(1);
975
          }
976
          if (*size != (MAXSIZE)) {
977
                  printf("Received packet has wrong length\n");
978
                  printf("Expected: %i, Got: %i \n", MAXSIZE, *size);
979
          }
980
 
981
  }
982
  /* The same buffer is used for all descriptors so check is done only once*/
983
  for(k = 0; k < MAXSIZE; k++) {
984
          if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
985
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
986
                  exit(1);
987
          }
988
  }
989
  for(k = 0; k < 2; k++) {
990
          if (loadb((int)&(rx0[k])) != tx0[k]) {
991
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)tx0[k]);
992
                  exit(1);
993
          }
994
  }
995
  for(k = 2; k < MAXSIZE; k++) {
996
          if (loadb((int)&(rx0[k])) != txbuf[k-2]) {
997
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)txbuf[k-2]);
998
                  exit(1);
999
          }
1000
  }
1001
  printf("\n");
1002
  t2 = t2 - t1;
1003
  t3 = t2/CLOCKS_PER_SEC;
1004
  bitrate = MAXSIZE/(t3*1000);
1005
  bitrate = bitrate*128*8;
1006
  bitrate /= 1000.0;
1007
  printf("Effective bitrate: %3.1f Mbit/s\n", bitrate);
1008
 
1009
  for(i = 2; i < MAXSIZE; i++) {
1010
    txbuf[i] = ~txbuf[i];
1011
  }
1012
  spw2->dma[0].rxmaxlen = MAXSIZE;
1013
  if (spw_set_rxmaxlength(0, spw2) ) {
1014
    printf("Max length change failed\n");
1015
    exit(1);
1016
  }
1017
  maxlen = loadmem((int)&(spw2->regs->dma[0].rxmaxlen));
1018
  printf("Maxlen: %d\n", maxlen);
1019
  while (spw_rx(0, rxbuf, spw2)) {
1020
    for (k = 0; k < 64; k++) {}
1021
  }
1022
  if ((ret = spw_tx(0, 0, 0, 0, 2, txbuf, maxlen-1, txbuf, spw1))) {
1023
    printf("Transmission failed: %d\n", ret);
1024
    exit(1);
1025
  }
1026
  while (!(tmp = spw_checktx(0, spw1))) {
1027
    for (k = 0; k < 64; k++) {}
1028
  }
1029
  if (tmp != 1) {
1030
    printf("Error in transmit \n");
1031
    exit(1);
1032
  }
1033
  while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
1034
    for (k = 0; k < 64; k++) {}
1035
  }
1036
  if (!rxs->truncated) {
1037
    printf("Received packet not truncated\n");
1038
    exit(1);
1039
  }
1040
  if(rxs->eep) {
1041
    printf("Received packet terminated with eep\n");
1042
    exit(1);
1043
  }
1044
  if (*size != (maxlen)) {
1045
    printf("Received packet has wrong length\n");
1046
    printf("Expected: %i, Got: %i \n", maxlen, *size);
1047
  }
1048
  for(k = 0; k < 2; k++) {
1049
    if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
1050
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
1051
      exit(1);
1052
    }
1053
  }
1054
  for(k = 0; k < maxlen-2; k++) {
1055
    if (loadb((int)&(rxbuf[k+2])) != txbuf[k]) {
1056
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+2])), (unsigned)txbuf[k]);
1057
      exit(1);
1058
    }
1059
  }
1060
  for(i = 2; i < MAXSIZE; i++) {
1061
    txbuf[i] = ~txbuf[i];
1062
  }
1063
  printf("\n");
1064
  spw2->dma[0].rxmaxlen = maxlen+4;
1065
  if (spw_set_rxmaxlength(0, spw2) ) {
1066
    printf("Max length change failed\n");
1067
    exit(1);
1068
  }
1069
  while (spw_rx(0, rxbuf, spw2)) {
1070
    for (k = 0; k < 64; k++) {}
1071
  }
1072
  if (spw_tx(0, 0, 0, 0, 2, txbuf, maxlen-1, txbuf, spw1)) {
1073
    printf("Transmission failed\n");
1074
    exit(1);
1075
  }
1076
  while (!(tmp = spw_checktx(0, spw1))) {
1077
    for (k = 0; k < 64; k++) {}
1078
  }
1079
  if (tmp != 1) {
1080
    printf("Error in transmit \n");
1081
    exit(1);
1082
  }
1083
  while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
1084
    for (k = 0; k < 64; k++) {}
1085
  }
1086
  if (rxs->truncated) {
1087
    printf("Received packet truncated\n");
1088
    exit(1);
1089
  }
1090
  if(rxs->eep) {
1091
    printf("Received packet terminated with eep\n");
1092
    exit(1);
1093
  }
1094
  if (*size != (maxlen+1)) {
1095
    printf("Received packet has wrong length\n");
1096
    printf("Expected: %i, Got: %i \n", maxlen+1, *size);
1097
  }
1098
  for(k = 0; k < 2; k++) {
1099
    if (loadb((int)&(rxbuf[k])) != txbuf[k]) {
1100
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)txbuf[k]);
1101
      exit(1);
1102
    }
1103
  }
1104
  for(k = 0; k < maxlen-2; k++) {
1105
    if (loadb((int)&(rxbuf[k+2])) != txbuf[k]) {
1106
      printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+2])), (unsigned)txbuf[k]);
1107
      exit(1);
1108
    }
1109
  }
1110
  free(rxbuf);
1111
  free(txbuf);
1112
  free(tx0);
1113
  free(rx0);
1114
  printf("TEST 8: completed successfully\n");
1115
#endif
1116
/*   /\************************ TEST 9 **************************************\/ */
1117
#if TEST9 == 1
1118
  printf("TEST 9: RMAP CRC for DMA channel(random data) \n\n");
1119
  if (spw2->rmap || spw2->rmapcrc) {
1120
    if ((txbuf = calloc(PKTTESTMAX+4, 1)) == NULL) {
1121
      printf("Transmit buffer initialization failed\n");
1122
      exit(1);
1123
    }
1124
    if ((rxbuf = calloc(PKTTESTMAX+256+2, 1)) == NULL) {
1125
      printf("Receive buffer initialization failed\n");
1126
      exit(1);
1127
    }
1128
    if ((tx0 = calloc(260, 1)) == NULL) {
1129
      printf("Receive buffer initialization failed\n");
1130
      exit(1);
1131
    }
1132
    /*initialize data*/
1133
    for (j = 0; j < PKTTESTMAX; j++) {
1134
      txbuf[j] = (char)j;
1135
    }
1136
    for (j = 0; j < 260; j++) {
1137
      tx0[j] = (char)~j;
1138
    }
1139
    notrx = 0; data = 0; hdr = 0;
1140
    for(i = 0; i < 256; i++) {
1141
      printf(".");
1142
      for(j = 0; j < PKTTESTMAX; j++) {
1143
        for(m = 0; m < 4; m++) {
1144
          for(l = 0; l < 4; l++) {
1145
            /* printf("h %i, a: %i d: %i, a: %i\n", i, m, j, l);  */
1146
            for (k = 0; k < PKTTESTMAX; k++) {
1147
              txbuf[k] = ~txbuf[k];
1148
            }
1149
            for (k = 0; k < 260; k++) {
1150
              tx0[k] = ~tx0[k];
1151
            }
1152
            if (i != 0) {
1153
              hdr = 1;
1154
            } else {
1155
              hdr = 0;
1156
            }
1157
            if ((i != 0) || (j != 0)) {
1158
                    data = 1;
1159
            } else {
1160
                    data = 0;
1161
            }
1162
            tx0[m] = 0x2;
1163
            tx0[m+1] = 0x2;
1164
            txbuf[l] = 0x2;
1165
            txbuf[l+1] = 0x2;
1166
            if (!notrx) {
1167
              while (spw_rx(0, rxbuf, spw2)) {
1168
                for (k = 0; k < 64; k++) {}
1169
              }
1170
            }
1171
            if (spw_tx(0, hdr, 1, 0, i,(char *)&(tx0[m]), j, (char *)&(txbuf[l]), spw1)) {
1172
              printf("Transmission failed\n");
1173
              exit(1);
1174
            }
1175
            while (!(tmp = spw_checktx(0, spw1))) {
1176
              for (k = 0; k < 64; k++) {}
1177
            }
1178
            if (tmp != 1) {
1179
              printf("Error in transmit \n");
1180
              exit(1);
1181
            }
1182
            if( (i+j+hdr+data) > 1) {
1183
              while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
1184
                for (k = 0; k < 64; k++) {}
1185
              }
1186
              if (rxs->truncated) {
1187
                printf("Received packet truncated\n");
1188
                exit(1);
1189
              }
1190
              if(rxs->eep) {
1191
                printf("Received packet terminated with eep\n");
1192
                exit(1);
1193
              }
1194
              if (*size != (j+i+hdr+data)) {
1195
                printf("Received packet has wrong length\n");
1196
                printf("Expected: %i, Got: %i \n", i+j, *size);
1197
              }
1198
              for(k = 0; k < i; k++) {
1199
                if (loadb((int)&(rxbuf[k])) != tx0[k+m]) {
1200
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k])), (unsigned)tx0[k+m]);
1201
                  exit(1);
1202
                }
1203
              }
1204
              for(k = 0; k < j; k++) {
1205
                if (loadb((int)&(rxbuf[k+i+hdr])) != txbuf[k+l]) {
1206
                  printf("Compare error: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rxbuf[k+i+hdr])), (unsigned)txbuf[k+l]);
1207
                  exit(1);
1208
                }
1209
              }
1210
              notrx = 0;
1211
            } else {
1212
              for(k = 0; k < 1048576; k++) {}
1213
              if (spw_checkrx(0, size, rxs, spw2)) {
1214
                printf("Packet recevied/sent although length was too small\n");
1215
                exit(1);
1216
              }
1217
              notrx = 1;
1218
            }
1219
          }
1220
 
1221
        }
1222
      }
1223
    }
1224
    free(rxbuf);
1225
    free(txbuf);
1226
    free(tx0);
1227
    printf("\n");
1228
    printf("TEST: 9 completed successfully\n\n");
1229
  }
1230
#endif 
1231
/*   /\************************ TEST 10 **************************************\/ */
1232
#if TEST10==1
1233
  if (spw2->rmap == 1) {
1234
    printf("TEST 10: RMAP and transmit spa test\n");
1235
    tx0 = (char *)malloc(64);
1236
    tx1 = (char *)calloc(RMAPSIZE, 1);
1237
    rx0 = (char *)malloc(RMAPSIZE+4);
1238
    rx1 = (char *)malloc(32+RMAPSIZE);
1239
    rx2 = (char *)malloc(32+RMAPSIZE);
1240
    if( (tx0 == NULL) || (tx1 == NULL) || (rx0 == NULL) ||
1241
        (rx1 == NULL) || (rx2 == NULL) ) {
1242
      printf("Memory initialization error\n");
1243
      exit(1);
1244
    }
1245
 
1246
    printf("\nNon verified writes\n");
1247
    /* enable rmap*/
1248
    spw_rmapen(spw2);
1249
    for(i = 0; i < RMAPSIZE; i++) {
1250
      printf(".");
1251
      for(m = 0; m < 8; m++) {
1252
        for(j = 0; j < i; j++) {
1253
          tx1[j]  = ~tx1[j];
1254
        }
1255
        if (m >= 4) {
1256
          cmd->incr     = no;
1257
        } else {
1258
          cmd->incr     = yes;
1259
        }
1260
        cmd->type     = writecmd;
1261
        cmd->verify   = no;
1262
        cmd->ack      = yes;
1263
        cmd->destaddr = 0x2;
1264
        cmd->destkey  = 0xBF;
1265
        cmd->srcaddr  = 0x1;
1266
        cmd->tid      = i;
1267
        cmd->addr     = (int)&(rx0[(m%4)]);
1268
        cmd->len      = i;
1269
        cmd->status   = 0;
1270
        cmd->dstspalen = 0;
1271
        cmd->dstspa  = (char *)NULL;
1272
        cmd->srcspalen = 0;
1273
        cmd->srcspa = (char *)NULL;
1274
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
1275
          printf("RMAP cmd build failed\n");
1276
          exit(1);
1277
        }
1278
        reply->type     = writerep;
1279
        reply->verify   = no;
1280
        reply->ack      = yes;
1281
        if (m >= 4) {
1282
          reply->incr     = no;
1283
          if ( ((((int)&(rx0[(m%4)])) % 4) != 0) || ((cmd->len % 4) != 0) )  {
1284
            reply->status   = 10;
1285
          } else {
1286
            reply->status   = 0;
1287
          }
1288
        } else {
1289
          reply->incr     = yes;
1290
          reply->status   = 0;
1291
        }
1292
        reply->destaddr = 0x2;
1293
        reply->destkey  = 0XBF;
1294
        reply->srcaddr  = 0x1;
1295
        reply->tid      = i;
1296
        reply->addr     = (int)&(rx0[(m%4)]);
1297
        reply->len      = i;
1298
        reply->dstspalen = 0;
1299
        reply->dstspa  = (char *)NULL;
1300
        reply->srcspalen = 0;
1301
        reply->srcspa = (char *)NULL;
1302
        if (build_rmap_hdr(reply, rx2, replysize)) {
1303
          printf("RMAP reply build failed\n");
1304
          exit(1);
1305
        }
1306
        while (spw_rx(0, rx1, spw1)) {
1307
          for (k = 0; k < 64; k++) {}
1308
        }
1309
        if (spw_tx(0, 1, 1, 0, *cmdsize, tx0, j, tx1, spw1)) {
1310
          printf("Transmission failed\n");
1311
          exit(1);
1312
        }
1313
        while (!(tmp = spw_checktx(0, spw1))) {
1314
          for (k = 0; k < 64; k++) {}
1315
        }
1316
        if (tmp != 1) {
1317
          printf("Error in transmit \n");
1318
          exit(1);
1319
        }
1320
        iterations = 0;
1321
        while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
1322
          if (iterations > 1000) {
1323
            printf("ERROR: Time limit exceeded while waiting for RMAP reply\n");
1324
            exit(0);
1325
          }
1326
          for (k = 0; k < 64; k++) {}
1327
          /* printf("0x%x\n", spw2->regs->status);*/
1328
          iterations++;
1329
        }
1330
        if (rxs->truncated) {
1331
          printf("Received packet truncated\n");
1332
          exit(1);
1333
        }
1334
        if(rxs->eep) {
1335
          printf("Received packet terminated with eep\n");
1336
          exit(1);
1337
        }
1338
        if(rxs->hcrcerr) {
1339
          printf("Received packet header crc error detected\n");
1340
          exit(1);
1341
        }
1342
        if(rxs->dcrcerr) {
1343
          printf("Received packet data crc error detected\n");
1344
          exit(1);
1345
        }
1346
        if (*size != (*replysize+1)) {
1347
          printf("Received packet has wrong length\n");
1348
          printf("Expected: %i, Got: %i \n", *replysize+1, *size);
1349
        }
1350
        for(k = 0; k < *replysize; k++) {
1351
          if (loadb((int)&(rx1[k])) != rx2[k]) {
1352
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1353
            exit(1);
1354
          }
1355
        }
1356
        if (reply->status == 0) {
1357
          if (m < 4) {
1358
            for(k = 0; k < i; k++) {
1359
              if (loadb((int)&(rx0[k+(m%4)])) != tx1[k]) {
1360
                printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]);
1361
                exit(1);
1362
              }
1363
            }
1364
          } else {
1365
            if (i != 0) {
1366
              for(k = 0; k < 4; k++) {
1367
                if (loadb((int)&(rx0[k+(m%4)])) != tx1[k + (i - 4)]) {
1368
                  printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k+(i-4)]);
1369
                  exit(1);
1370
                }
1371
              }
1372
            }
1373
          }
1374
        }
1375
        /* if ((i % 512) == 0) { */
1376
/*           printf("Packet  %i, alignment %i\n", i, m); */
1377
/*         } */
1378
      }
1379
    }
1380
    printf("\n");
1381
    printf("Non-verified write test passed\n");
1382
    printf("\nVerified writes\n");
1383
    for(i = 0; i < 64; i++) {
1384
      printf(".");
1385
      for(m = 0; m < 8; m++) {
1386
        for(j = 0; j < i; j++) {
1387
          tx1[j]  = ~tx1[j];
1388
        }
1389
        if (m >= 4) {
1390
          cmd->incr     = no;
1391
        } else {
1392
          cmd->incr     = yes;
1393
        }
1394
        cmd->type     = writecmd;
1395
        cmd->verify   = yes;
1396
        cmd->ack      = yes;
1397
        cmd->destaddr = 0x2;
1398
        cmd->destkey  = 0xBF;
1399
        cmd->srcaddr  = 0x1;
1400
        cmd->tid      = i;
1401
        cmd->addr     = (int)&(rx0[(m%4)]);
1402
        cmd->len      = i;
1403
        cmd->status   = 0;
1404
        cmd->dstspalen = 0;
1405
        cmd->dstspa  = (char *)NULL;
1406
        cmd->srcspalen = 0;
1407
        cmd->srcspa = (char *)NULL;
1408
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
1409
          printf("RMAP cmd build failed\n");
1410
          exit(1);
1411
        }
1412
        reply->type     = writerep;
1413
        reply->verify   = yes;
1414
        reply->ack      = yes;
1415
        if (m >= 4) {
1416
          reply->incr     = no;
1417
 
1418
        } else {
1419
          reply->incr     = yes;
1420
        }
1421
        if ( (((((int)&(rx0[(m%4)])) % 2) != 0) && (cmd->len == 2)) ||
1422
             (((((int)&(rx0[(m%4)])) % 4) != 0) && (cmd->len == 4)) ||
1423
             (cmd->len == 3) ) {
1424
          reply->status   = 10;
1425
        } else {
1426
          reply->status   = 0;
1427
        }
1428
        if (cmd->len > 4) {
1429
          reply->status = 9;
1430
 
1431
        }
1432
        reply->destaddr = 0x2;
1433
        reply->destkey  = 0XBF;
1434
        reply->srcaddr  = 0x1;
1435
        reply->tid      = i;
1436
        reply->addr     = (int)&(rx0[(m%4)]);
1437
        reply->len      = i;
1438
        reply->dstspalen = 0;
1439
        reply->dstspa  = (char *)NULL;
1440
        reply->srcspalen = 0;
1441
        reply->srcspa = (char *)NULL;
1442
        if (build_rmap_hdr(reply, rx2, replysize)) {
1443
          printf("RMAP reply build failed\n");
1444
          exit(1);
1445
        }
1446
        while (spw_rx(0, rx1, spw1)) {
1447
          for (k = 0; k < 64; k++) {}
1448
        }
1449
        if (spw_tx(0, 1, 1, 0, *cmdsize, tx0, j, tx1, spw1)) {
1450
          printf("Transmission failed\n");
1451
          exit(1);
1452
        }
1453
        while (!(tmp = spw_checktx(0, spw1))) {
1454
          for (k = 0; k < 64; k++) {}
1455
        }
1456
        if (tmp != 1) {
1457
          printf("Error in transmit \n");
1458
          exit(1);
1459
        }
1460
        iterations = 0;
1461
        while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
1462
          if (iterations > 1000) {
1463
            printf("ERROR: Time limit exceeded while waiting for RMAP reply\n");
1464
            exit(0);
1465
          }
1466
          for (k = 0; k < 64; k++) {}
1467
          /* printf("0x%x\n", spw2->regs->status);*/
1468
          iterations++;
1469
        }
1470
        if (rxs->truncated) {
1471
          printf("Received packet truncated\n");
1472
          exit(1);
1473
        }
1474
        if(rxs->eep) {
1475
          printf("Received packet terminated with eep\n");
1476
          exit(1);
1477
        }
1478
        if(rxs->hcrcerr) {
1479
          printf("Received packet header crc error detected\n");
1480
          exit(1);
1481
        }
1482
        if(rxs->dcrcerr) {
1483
          printf("Received packet data crc error detected\n");
1484
          exit(1);
1485
        }
1486
        if (*size != (*replysize+1)) {
1487
          printf("Received packet has wrong length\n");
1488
          printf("Expected: %i, Got: %i \n", *replysize+1, *size);
1489
          exit(1);
1490
        }
1491
        for(k = 0; k < *replysize; k++) {
1492
          if (loadb((int)&(rx1[k])) != rx2[k]) {
1493
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1494
            exit(1);
1495
          }
1496
        }
1497
        if (reply->status == 0) {
1498
          for(k = 0; k < i; k++) {
1499
            if (loadb((int)&(rx0[k+(m%4)])) != tx1[k]) {
1500
              printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]);
1501
              exit(1);
1502
            }
1503
          }
1504
 
1505
        }
1506
        /* if (((i % 4) == 0) && ((m % 8) == 0)) { */
1507
/*           printf("Packet  %i, alignment %i\n", i, m); */
1508
/*         } */
1509
      }
1510
    }
1511
    printf("\n");
1512
    printf("Verified write test passed\n");
1513
    printf("\nRMW\n");
1514
    for(i = 0; i < 64; i++) {
1515
      printf(".");
1516
      for(m = 0; m < 8; m++) {
1517
        for(j = 0; j < i; j++) {
1518
          tx1[j]  = ~tx1[j];
1519
        }
1520
        if (m >= 4) {
1521
          cmd->incr     = no;
1522
        } else {
1523
          cmd->incr     = yes;
1524
        }
1525
        cmd->type     = rmwcmd;
1526
        cmd->verify   = yes;
1527
        cmd->ack      = yes;
1528
        cmd->destaddr = 0x2;
1529
        cmd->destkey  = 0xBF;
1530
        cmd->srcaddr  = 0x1;
1531
        cmd->tid      = i;
1532
        cmd->addr     = (int)&(rx0[(m%4)]);
1533
        cmd->len      = i;
1534
        cmd->status   = 0;
1535
        cmd->dstspalen = 0;
1536
        cmd->dstspa  = (char *)NULL;
1537
        cmd->srcspalen = 0;
1538
        cmd->srcspa = (char *)NULL;
1539
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
1540
          printf("RMAP cmd build failed\n");
1541
          exit(1);
1542
        }
1543
        reply->type     = rmwrep;
1544
        reply->verify   = yes;
1545
        reply->ack      = yes;
1546
        if (m >= 4) {
1547
          reply->incr     = no;
1548
 
1549
        } else {
1550
          reply->incr     = yes;
1551
        }
1552
        if ( (((((int)&(rx0[(m%4)])) % 2) != 0) && ((cmd->len/2) == 2)) ||
1553
             (((((int)&(rx0[(m%4)])) % 4) != 0) && ((cmd->len/2) == 4)) ||
1554
             ((cmd->len/2) == 3) ) {
1555
          reply->status   = 10;
1556
        } else {
1557
          reply->status   = 0;
1558
        }
1559
        if ( (cmd->len != 0) && (cmd->len != 2) && (cmd->len != 4) &&
1560
             (cmd->len != 6) && (cmd->len != 8)) {
1561
          reply->status = 11;
1562
        }
1563
        if (m >= 4) {
1564
          reply->status = 2;
1565
        }
1566
        if (reply->status == 0) {
1567
          for(k = 0; k < (i/2); k++) {
1568
            rx2[*replysize+1+k] = loadb((int)&(rx0[k+m]));
1569
          }
1570
        }
1571
        reply->destaddr = 0x2;
1572
        reply->destkey  = 0xBF;
1573
        reply->srcaddr  = 0x1;
1574
        reply->tid      = i;
1575
        reply->addr     = (int)&(rx0[(m%4)]);
1576
        if (reply->status == 0) {
1577
          reply->len      = (i/2);
1578
        } else {
1579
          reply->len      = 0;
1580
        }
1581
        reply->dstspalen = 0;
1582
        reply->dstspa  = (char *)NULL;
1583
        reply->srcspalen = 0;
1584
        reply->srcspa = (char *)NULL;
1585
        if (build_rmap_hdr(reply, rx2, replysize)) {
1586
          printf("RMAP reply build failed\n");
1587
          exit(1);
1588
        }
1589
        while (spw_rx(0, rx1, spw1)) {
1590
          for (k = 0; k < 64; k++) {}
1591
        }
1592
        if (spw_tx(0, 1, 1, 0, *cmdsize, tx0, j, tx1, spw1)) {
1593
          printf("Transmission failed\n");
1594
          exit(1);
1595
        }
1596
        while (!(tmp = spw_checktx(0, spw1))) {
1597
          for (k = 0; k < 64; k++) {}
1598
        }
1599
        if (tmp != 1) {
1600
          printf("Error in transmit \n");
1601
          exit(1);
1602
        }
1603
        iterations = 0;
1604
        while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
1605
          if (iterations > 1000) {
1606
            printf("ERROR: Time limit exceeded while waiting for RMAP reply\n");
1607
            exit(0);
1608
          }
1609
          for (k = 0; k < 64; k++) {}
1610
          /* printf("0x%x\n", spw2->regs->status);*/
1611
          iterations++;
1612
        }
1613
        if (rxs->truncated) {
1614
          printf("Received packet truncated\n");
1615
          exit(1);
1616
        }
1617
        if(rxs->eep) {
1618
          printf("Received packet terminated with eep\n");
1619
          exit(1);
1620
        }
1621
        if(rxs->hcrcerr) {
1622
          printf("Received packet header crc error detected\n");
1623
          exit(1);
1624
        }
1625
        if(rxs->dcrcerr) {
1626
          printf("Received packet data crc error detected\n");
1627
          exit(1);
1628
        }
1629
        if ((reply->status == 0) && (i != 0)) {
1630
          if (*size != (*replysize+1+(i/2)+1)) {
1631
            printf("Received packet has wrong length\n");
1632
            printf("Expected: %i, Got: %i \n", *replysize+2+(i/2), *size);
1633
            exit(1);
1634
          }
1635
        } else {
1636
          if (*size != (*replysize+2)) {
1637
            printf("Received packet has wrong length\n");
1638
            printf("Expected: %i, Got: %i \n", *replysize+1, *size);
1639
            exit(1);
1640
          }
1641
        }
1642
        for(k = 0; k < *replysize; k++) {
1643
          if (loadb((int)&(rx1[k])) != rx2[k]) {
1644
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1645
            exit(1);
1646
          }
1647
        }
1648
        if (reply->status == 0) {
1649
          for(k = *replysize+1; k < *replysize+1+(i/2); k++) {
1650
            if (loadb((int)&(rx1[k])) != rx2[k]) {
1651
              printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1652
              exit(1);
1653
            }
1654
          }
1655
          for(k = 0; k < (i/2); k++) {
1656
            if (loadb((int)&(rx0[k+(m%4)])) != ((tx1[k] & tx1[k+(i/2)]) | (rx2[*replysize+1+k] & ~tx1[k+(i/2)]) )) {
1657
              printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k+(m%4)])), (unsigned)tx1[k]);
1658
              exit(1);
1659
            }
1660
          }
1661
 
1662
        }
1663
        /* if (((i % 4) == 0) && ((m % 8) == 0)) { */
1664
/*           printf("Packet  %i, alignment %i\n", i, m); */
1665
/*         } */
1666
      }
1667
    }
1668
    printf("\n");
1669
    printf("RMW test passed\n");
1670
    printf("\nReads\n");
1671
    for(i = 0; i < RMAPSIZE; i++) {
1672
      printf(".");
1673
      for(m = 0; m < 8; m++) {
1674
        for(j = 0; j < i+4; j++) {
1675
          rx0[j]  = ~rx0[j];
1676
        }
1677
        if (m >= 4) {
1678
          cmd->incr     = no;
1679
        } else {
1680
          cmd->incr     = yes;
1681
        }
1682
        cmd->type     = readcmd;
1683
        cmd->verify   = no;
1684
        cmd->ack      = yes;
1685
        cmd->destaddr = 0x2;
1686
        cmd->destkey  = 0xBF;
1687
        cmd->srcaddr  = 0x1;
1688
        cmd->tid      = i;
1689
        cmd->addr     = (int)&(rx0[(m%4)]);
1690
        cmd->len      = i;
1691
        cmd->status   = 0;
1692
        cmd->dstspalen = 0;
1693
        cmd->dstspa  = (char *)NULL;
1694
        cmd->srcspalen = 0;
1695
        cmd->srcspa = (char *)NULL;
1696
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
1697
          printf("RMAP cmd build failed\n");
1698
          exit(1);
1699
        }
1700
        reply->type     = readrep;
1701
        reply->verify   = no;
1702
        reply->ack      = yes;
1703
        if (m >= 4) {
1704
          reply->incr     = no;
1705
          if ( ((((int)&(rx0[(m%4)])) % 4) != 0) || ((cmd->len % 4) != 0) )  {
1706
            reply->status   = 10;
1707
          } else {
1708
            reply->status   = 0;
1709
          }
1710
        } else {
1711
          reply->incr     = yes;
1712
          reply->status   = 0;
1713
        }
1714
        if (reply->status == 0) {
1715
          reply->len      = i;
1716
        } else {
1717
          reply->len      = 0;
1718
        }
1719
        reply->destaddr = 0x2;
1720
        reply->destkey  = 0xBF;
1721
        reply->srcaddr  = 0x1;
1722
        reply->tid      = i;
1723
        reply->addr     = (int)&(rx0[(m%4)]);
1724
        reply->dstspalen = 0;
1725
        reply->dstspa  = (char *)NULL;
1726
        reply->srcspalen = 0;
1727
        reply->srcspa = (char *)NULL;
1728
        if (build_rmap_hdr(reply, rx2, replysize)) {
1729
          printf("RMAP reply build failed\n");
1730
          exit(1);
1731
        }
1732
        while (spw_rx(0, rx1, spw1)) {
1733
          for (k = 0; k < 64; k++) {}
1734
        }
1735
        if (spw_tx(0, 1, 0, 0, *cmdsize, tx0, 0, tx1, spw1)) {
1736
          printf("Transmission failed\n");
1737
          exit(1);
1738
        }
1739
        while (!(tmp = spw_checktx(0, spw1))) {
1740
          for (k = 0; k < 64; k++) {}
1741
        }
1742
        if (tmp != 1) {
1743
          printf("Error in transmit \n");
1744
          exit(1);
1745
        }
1746
        iterations = 0;
1747
        while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
1748
          if (iterations > 1000) {
1749
            printf("ERROR: Time limit exceeded while waiting for RMAP reply\n");
1750
            exit(0);
1751
          }
1752
          for (k = 0; k < 64; k++) {}
1753
          /* printf("0x%x\n", spw2->regs->status);*/
1754
          iterations++;
1755
        }
1756
        if (rxs->truncated) {
1757
          printf("Received packet truncated\n");
1758
          exit(1);
1759
        }
1760
        if(rxs->eep) {
1761
          printf("Received packet terminated with eep\n");
1762
          exit(1);
1763
        }
1764
        if(rxs->hcrcerr) {
1765
          printf("Received packet header crc error detected\n");
1766
          exit(1);
1767
        }
1768
        if(rxs->dcrcerr) {
1769
          printf("Received packet data crc error detected\n");
1770
          exit(1);
1771
        }
1772
        for (k = 0; k < *replysize; k++) {
1773
          if (loadb((int)&(rx1[k])) != rx2[k]) {
1774
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1775
            exit(1);
1776
          }
1777
        }
1778
        if ((reply->status) == 0 && (i != 0)) {
1779
          if (*size != (*replysize+2+i)) {
1780
            printf("Received packet has wrong length\n");
1781
            printf("Expected: %i, Got: %i \n", *replysize+2+i, *size);
1782
          }
1783
          if (cmd->incr == yes) {
1784
            for(k = 0; k < i; k++) {
1785
              if (loadb((int)&(rx1[*replysize+1+k])) != rx0[k+(m%4)]) {
1786
                printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[*replysize+1+k])), (unsigned)rx0[k+(m%4)]);
1787
                exit(1);
1788
              }
1789
            }
1790
          } else {
1791
            for(k = 0; k < i; k++) {
1792
              if (loadb((int)&(rx1[*replysize+1+k])) != rx0[(k%4)+(m%4)]) {
1793
                printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[*replysize+1+k])), (unsigned)rx0[(k%4)+(m%4)]);
1794
                printf("Rx1: %x, Rx0: %x\n", (int)rx1, (int)rx0);
1795
                //exit(1);
1796
              }
1797
            }
1798
          }
1799
        } else {
1800
          if (*size != (*replysize+2)) {
1801
            printf("Received packet has wrong length\n");
1802
            printf("Expected: %i, Got: %i \n", *replysize+2, *size);
1803
          }
1804
        }
1805
        /* if ((i % 512) == 0) { */
1806
/*           printf("Packet  %i, alignment %i\n", i, m); */
1807
/*         } */
1808
      }
1809
    }
1810
    printf("\n");
1811
    printf("Read test passed\n");
1812
    /*late and early eop tests*/
1813
    printf("\nLate and early eop\n");
1814
    for(i = 0; i < RMAPSIZE; i++) {
1815
      printf(".");
1816
      if (i < 16) {
1817
        tmp = -i;
1818
      } else {
1819
        tmp = -16;
1820
      }
1821
      for (j = tmp; j < i; j++) {
1822
        for (m = 0; m < 3; m++) {
1823
/*           printf("Packet  %i, type %i, offset: %i\n", i, m, j); */
1824
          for(k = 0; k < i; k++) {
1825
            tx1[k]  = ~tx1[k];
1826
          }
1827
          if (m == 0) {
1828
            cmd->type     = writecmd;
1829
            cmd->verify   = no;
1830
            reply->type   = writerep;
1831
            reply->verify = no;
1832
          } else if (m == 2) {
1833
            cmd->type     = rmwcmd;
1834
            cmd->verify   = yes;
1835
            reply->type    = rmwrep;
1836
            reply->verify = yes;
1837
          } else {
1838
            cmd->type     = writecmd;
1839
            cmd->verify   = yes;
1840
            reply->type    = writerep;
1841
            reply->verify = yes;
1842
          }
1843
          cmd->incr     = yes;
1844
          cmd->ack      = yes;
1845
          cmd->destaddr = 0x2;
1846
          cmd->destkey  = 0xBF;
1847
          cmd->srcaddr  = 0x1;
1848
          cmd->tid      = i;
1849
          cmd->addr     = (int)rx0;
1850
          cmd->len      = i;
1851
          cmd->status   = 0;
1852
          cmd->dstspalen = 0;
1853
          cmd->dstspa  = (char *)NULL;
1854
          cmd->srcspalen = 0;
1855
          cmd->srcspa = (char *)NULL;
1856
          if (build_rmap_hdr(cmd, tx0, cmdsize)) {
1857
            printf("RMAP cmd build failed\n");
1858
            exit(1);
1859
          }
1860
          reply->len       = 0;
1861
          if (j < 0 ) {
1862
            reply->status = 5;
1863
          } else if (j == 0) {
1864
            reply->status = 0;
1865
 
1866
          } else {
1867
            reply->status = 6;
1868
            for(l = 0; l < i; l++) {
1869
              if ((int)tx1[l] != 0) {
1870
                reply->status = 4;
1871
              }
1872
            }
1873
          }
1874
          if(m == 2 ) {
1875
            if((cmd->len != 0) && (cmd->len != 2) && (cmd->len != 4) &&
1876
               (cmd->len != 6) && (cmd->len != 8)) {
1877
              reply->status = 11;
1878
            } else if( (((cmd->len/2) == 2) && (cmd->addr % 2 != 0)) ||
1879
                       (((cmd->len/2) == 4) && (cmd->addr % 4 != 0)) ||
1880
                       ((cmd->len/2) == 3) ) {
1881
              reply->status = 10;
1882
            } else {
1883
              if (reply->status != 0) {
1884
                reply->len = 0;
1885
              } else {
1886
                reply->len = cmd->len/2;
1887
              }
1888
            }
1889
          } else if (m != 0) {
1890
            if(cmd->len > 4) {
1891
              reply->status = 9;
1892
            } else if( (((cmd->len) == 2) && (cmd->addr % 2 != 0)) ||
1893
                       (((cmd->len) == 4) && (cmd->addr % 4 != 0)) ||
1894
                       ((cmd->len) == 3) ) {
1895
              reply->status = 10;
1896
            }
1897
          }
1898
          reply->incr      = yes;
1899
          reply->ack       = yes;
1900
          reply->destaddr  = 0x2;
1901
          reply->destkey   = 0xBF;
1902
          reply->srcaddr   = 0x1;
1903
          reply->tid       = i;
1904
          reply->addr      = (int)rx0;
1905
          reply->dstspalen = 0;
1906
          reply->dstspa    = (char *) NULL;
1907
          reply->srcspalen = 0;
1908
          reply->srcspa    = (char *) NULL;
1909
          if (build_rmap_hdr(reply, rx2, replysize)) {
1910
            printf("RMAP reply build failed\n");
1911
            exit(1);
1912
          }
1913
          if ((reply->status == 0) || (reply->status == 6)) {
1914
            for(k = 0; k < reply->len; k++) {
1915
              rx2[*replysize+1+k] = loadb((int)&(rx0[k]));
1916
            }
1917
          }
1918
          while (spw_rx(0, rx1, spw1)) {
1919
            for (k = 0; k < 64; k++) {}
1920
          }
1921
          if (spw_tx(0, 1, 1, 0, *cmdsize, tx0, i+j, tx1, spw1)) {
1922
            printf("Transmission failed\n");
1923
            exit(1);
1924
          }
1925
          while (!(tmp = spw_checktx(0, spw1))) {
1926
            for (k = 0; k < 64; k++) {}
1927
          }
1928
          if (tmp != 1) {
1929
            printf("Error in transmit \n");
1930
            exit(1);
1931
          }
1932
          iterations = 0;
1933
          while (!(tmp = spw_checkrx(0, size, rxs, spw1))) {
1934
            if (iterations > 1000) {
1935
              printf("ERROR: Time limit exceeded while waiting for RMAP reply\n");
1936
              exit(0);
1937
            }
1938
            for (k = 0; k < 64; k++) {}
1939
            /* printf("0x%x\n", spw2->regs->status);*/
1940
            iterations++;
1941
          }
1942
          if (rxs->truncated) {
1943
            printf("Received packet truncated\n");
1944
            exit(1);
1945
          }
1946
          if(rxs->eep) {
1947
            printf("Received packet terminated with eep\n");
1948
            exit(1);
1949
          }
1950
          if(rxs->hcrcerr) {
1951
            printf("Received packet header crc error detected\n");
1952
            exit(1);
1953
          }
1954
          if(rxs->dcrcerr) {
1955
            printf("Received packet data crc error detected\n");
1956
            exit(1);
1957
          }
1958
          if (m == 2) {
1959
            if ((i != 0) && ((reply->status == 0) || (reply->status == 6))) {
1960
              tmp = reply->len+1;
1961
            } else {
1962
              tmp = 1;
1963
            }
1964
          } else {
1965
            tmp = 0;
1966
          }
1967
          if (*size != (*replysize+1+tmp)) {
1968
            printf("Received packet has wrong length\n");
1969
            printf("Expected: %i, Got: %i \n", *replysize+1+tmp, *size);
1970
            exit(1);
1971
          }
1972
          if (tmp == 0) {
1973
            tmp++;
1974
          }
1975
          for(k = 0; k < *replysize; k++) {
1976
            if (loadb((int)&(rx1[k])) != rx2[k]) {
1977
              if (k != 3) {
1978
                printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)rx2[k]);
1979
                printf("Packet  %i, type %i, offset: %i\n", i, m, j);
1980
                exit(1);
1981
              }
1982
            }
1983
          }
1984
          if ((reply->status == 0) || (reply->status == 6)) {
1985
            if (m == 2) {
1986
              for(k = 0; k < reply->len; k++) {
1987
                if (loadb((int)&(rx1[k+*replysize+1])) != rx2[k+*replysize+1]) {
1988
                  printf("Compare error 2: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k+*replysize+1])), (unsigned)rx2[k+*replysize+1]);
1989
                  printf("Rx0: %x, Rx1: %x, Rx2: %x\n", (int)rx0, (int)rx1, (int)rx2);
1990
                  exit(1);
1991
                }
1992
              }
1993
              for(k = 0; k < (reply->len/2); k++) {
1994
                if (loadb((int)&(rx0[k])) != ((tx1[k] & tx1[k+(i/2)]) | (rx2[*replysize+1+k] & ~tx1[k+(i/2)]) )) {
1995
                  printf("Compare error 3: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)tx1[k]);
1996
                  exit(1);
1997
                }
1998
              }
1999
            } else {
2000
              for (k = 0; k < i; k++) {
2001
                if (loadb((int)&(rx0[k])) != tx1[k]) {
2002
                  printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx0[k])), (unsigned)tx1[k]);
2003
                  exit(1);
2004
                }
2005
              }
2006
            }
2007
          }
2008
        }
2009
      }
2010
 
2011
    }
2012
    printf("\n");
2013
    printf("TEST 10: completed successfully\n\n");
2014
  }
2015
#endif
2016
/*   /\************************ TEST 11 **************************************\/ */
2017
#if TEST11 == 1
2018
  printf("TEST 11: DMA channel RMAP CRC test\n\n");
2019
  if ((spw2->rmapcrc == 1) && (spw2->rmap == 0)) {
2020
    tx0 = (char *)malloc(64);
2021
    tx1 = (char *)calloc(RMAPCRCSIZE, 1);
2022
    rx1 = (char *)malloc(32+RMAPCRCSIZE);
2023
    for(i = 0; i < RMAPCRCSIZE; i++) {
2024
      for(m = 0; m < 6; m++) {
2025
 
2026
        for(k = 0; k < i; k++) {
2027
          tx1[k]  = ~tx1[k];
2028
        }
2029
        switch (m) {
2030
          case 0:
2031
            cmd->type     = writecmd;
2032
            cmd->verify   = no;
2033
            j = i;
2034
            l = 1;
2035
            break;
2036
          case 1:
2037
            cmd->type     = readcmd;
2038
            cmd->verify   = no;
2039
            j = 0;
2040
            l = 0;
2041
            break;
2042
          case 2:
2043
            cmd->type     = rmwcmd;
2044
            j           = (i % 8);
2045
            cmd->verify   = yes;
2046
            l = 1;
2047
            break;
2048
          case 3:
2049
            cmd->type     = writerep;
2050
            j           = 0;
2051
            cmd->verify   = no;
2052
            l = 0;
2053
            break;
2054
          case 4:
2055
            cmd->type     = readrep;
2056
            cmd->verify   = no;
2057
            j           = i;
2058
            l = 1;
2059
            break;
2060
          case 5:
2061
            cmd->type     = rmwrep;
2062
            j           = (i/2);
2063
            cmd->verify   = yes;
2064
            l = 1;
2065
            break;
2066
          default:
2067
            break;
2068
        }
2069
 
2070
        if (m < 3) {
2071
            cmd->destaddr = 0x2;
2072
            cmd->srcaddr  = 0x1;
2073
        }
2074
        else {
2075
            cmd->destaddr = 0x1;
2076
            cmd->srcaddr  = 0x2;
2077
        }
2078
 
2079
        cmd->incr     = no;
2080
        cmd->ack      = yes;
2081
        cmd->destkey  = 0xBF;
2082
        cmd->tid      = i;
2083
        cmd->addr     = (int)(rx0);
2084
        cmd->len      = i;
2085
        cmd->status   = 0;
2086
        cmd->dstspalen = 0;
2087
        cmd->dstspa  = (char *)NULL;
2088
        cmd->srcspalen = 0;
2089
        cmd->srcspa = (char *)NULL;
2090
        if (build_rmap_hdr(cmd, tx0, cmdsize)) {
2091
          printf("RMAP cmd build failed\n");
2092
          exit(1);
2093
        }
2094
 
2095
        while (spw_rx(0, rx1, spw2)) {
2096
          for (k = 0; k < 64; k++) {}
2097
        }
2098
        if (spw_tx(0, 1, l, 0, *cmdsize, tx0, j, tx1, spw1)) {
2099
          printf("Transmission failed\n");
2100
          exit(1);
2101
        }
2102
        while (!(tmp = spw_checktx(0, spw1))) {
2103
          for (k = 0; k < 64; k++) {}
2104
        }
2105
 
2106
        if (tmp != 1) {
2107
          printf("Error in transmit \n");
2108
          exit(1);
2109
        }
2110
 
2111
        while (!(tmp = spw_checkrx(0, size, rxs, spw2))) {
2112
          for (k = 0; k < 64; k++) {}
2113
        }
2114
        if (rxs->truncated) {
2115
          printf("Received packet truncated\n");
2116
          exit(1);
2117
        }
2118
        if(rxs->eep) {
2119
          printf("Received packet terminated with eep\n");
2120
          exit(1);
2121
        }
2122
        if(rxs->hcrcerr) {
2123
          printf("Received packet header crc error detected\n");
2124
          exit(1);
2125
        }
2126
        if(rxs->dcrcerr) {
2127
          printf("Received packet data crc error detected\n");
2128
          exit(1);
2129
        }
2130
 
2131
        if (*size != (*cmdsize+1+j+l)) {
2132
          printf("Received packet has wrong length\n");
2133
          printf("Expected: %i, Got: %i \n", *cmdsize+1+j+l, *size);
2134
          exit(1);
2135
        }
2136
        for(k = 0; k < *cmdsize; k++) {
2137
          if (loadb((int)&(rx1[k])) != tx0[k]) {
2138
            printf("Compare error 0: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k])), (unsigned)tx0[k]);
2139
            printf("Packet  %i, type %i\n", i, m);
2140
            exit(1);
2141
          }
2142
        }
2143
        for(k = 0; k < j; k++) {
2144
          if (loadb((int)&(rx1[k+*cmdsize+1])) != tx1[k]) {
2145
            printf("Compare error 1: %u Data: %x Expected: %x \n", k, (unsigned)loadb((int)&(rx1[k+*cmdsize+1])), (unsigned)tx1[k]);
2146
            exit(1);
2147
          }
2148
        }
2149
 
2150
        if (((i % 4) == 0) && ((m % 3) == 0)) {
2151
          printf("Packet  %i, type %i\n", i, m);
2152
        }
2153
      }
2154
    }
2155
  }
2156
  printf("TEST 11: completed successfully\n\n");
2157
#endif
2158
/*   /\************************ TEST 12 **************************************\/ */
2159
#if TEST12 == 1
2160
  printf("TEST 12 Multiple DMA channel test\n\n");
2161
  if ((spw1->ver == 1) && (spw2->ver == 1)) {
2162
          printf("Check address mask with one channel enabled using default addressing\n");
2163
          rx0 = malloc(256);
2164
          rx1 = malloc(256);
2165
          rx2 = malloc(256);
2166
          for(l = 0; l < spw2->dmachan; l++) {
2167
                  rx[l] = malloc(256);
2168
          }
2169
          tx0 = malloc(128);
2170
          tx1 = malloc(128);
2171
          if (spw2->rmap) {
2172
                  spw_rmapen(spw2);
2173
          }
2174
          for(i = 1; i < 128; i++) {
2175
                  tx0[i] = (i % 256);
2176
          }
2177
          printf("Dmachan: %d\n", spw2->dmachan);
2178
          for(i = 0; i < 1048576; i++) {
2179
                  if ((i % 1000) == 0) {
2180
                          printf(".");
2181
                  }
2182
                  for(l = 0; l < spw2->dmachan; l++) {
2183
                          chanen[l] = (rand() % 2);
2184
                          if (chanen[l]) {
2185
                                  spw_enablerx(l, spw2);
2186
                                  spw_rx(l, rx[l], spw2);
2187
                          } else {
2188
                                  spw_disablerx(l, spw2);
2189
                          }
2190
                          sepaddr[l] = (rand() % 2);
2191
                          if (sepaddr[l]) {
2192
                                  spw_setsepaddr(l, spw2);
2193
                          } else {
2194
                                  spw_disablesepaddr(l, spw2);
2195
                          }
2196
                          spw2->dma[l].addr = (rand() % 256);
2197
                          spw2->dma[l].mask = (rand() % 256);
2198
                          spw_set_chanadr(l, spw2);
2199
                  }
2200
                  spw2->nodeaddr = (rand() % 256);
2201
                  spw2->mask = (rand() % 256);
2202
                  spw_set_nodeadr(spw2);
2203
                  if (spw2->rmap) {
2204
                  /*         printf("Rmap\n"); */
2205
                          rmappkt = (rand() % 2);
2206
                  } else {
2207
                          rmappkt = 0;
2208
                  }
2209
                  rmapincr = (rand() % 2);
2210
                  destaddr = (rand() % 256);
2211
                  tx0[0] = (char)destaddr;
2212
                  tx0[1] = (char)0x5;
2213
                  for(l = 2; l < 128; l++) {
2214
                          tx0[l] = ~((tx0[l] + i) % 256);
2215
                  }
2216
             /*      printf("Destaddr: %x\n", destaddr); */
2217
/*                   printf("DefAddr: %x, DefMask: %x, EffAddr: %x, EffDestAddr: %x\n", spw2->nodeaddr, spw2->mask, spw2->nodeaddr & ~spw2->mask, destaddr & ~spw2->mask); */
2218
/*                   for(l = 0; l < spw2->dmachan; l++) { */
2219
/*                           printf("Addr: %x, Mask: %x, EffAddr: %x, EffDestAddr: %x\n", spw2->dma[l].addr, spw2->dma[l].mask, spw2->dma[l].addr & ~spw2->dma[l].mask, destaddr & ~spw2->dma[l].mask); */
2220
/*                   } */
2221
                  rmaprx = 0;
2222
                  if (rmappkt) {
2223
                          if (rmapincr) {
2224
                                  cmd->incr     = no;
2225
                          } else {
2226
                                  cmd->incr     = yes;
2227
                          }
2228
                          cmd->type     = writecmd;
2229
                          cmd->verify   = no;
2230
                          cmd->ack      = yes;
2231
                          cmd->destaddr = destaddr;
2232
                          cmd->destkey  = 0xBF;
2233
                          cmd->srcaddr  = 0x1;
2234
                          cmd->tid      = (i % 65536);
2235
                          cmd->addr     = (int)&(rx1[0]);
2236
                          cmd->len      = 128;
2237
                          cmd->status   = 0;
2238
                          cmd->dstspalen = 0;
2239
                          cmd->dstspa  = (char *)NULL;
2240
                          cmd->srcspalen = 0;
2241
                          cmd->srcspa = (char *)NULL;
2242
                          if ((ret = build_rmap_hdr(cmd, tx1, cmdsize))) {
2243
                                  printf("RMAP cmd build failed: %d\n", ret);
2244
                                  exit(1);
2245
                          }
2246
                          reply->type     = writerep;
2247
                          reply->verify   = no;
2248
                          reply->ack      = yes;
2249
                          if (rmapincr) {
2250
                                  reply->incr     = no;
2251
                          } else {
2252
                                  reply->incr     = yes;
2253
                          }
2254
                          reply->destaddr = destaddr;
2255
                          reply->destkey  = 0xBF;
2256
                          reply->srcaddr  = 0x1;
2257
                          reply->tid      = (i % 65536);
2258
                          reply->addr     = (int)&(rx1[0]);
2259
                          reply->len      = 0;
2260
                          reply->dstspalen = 0;
2261
                          reply->dstspa  = (char *)NULL;
2262
                          reply->srcspalen = 0;
2263
                          reply->srcspa = (char *)NULL;
2264
                          if ((destaddr & ~spw2->mask) == (spw2->nodeaddr & ~spw2->mask)) {
2265
                                  reply->status = 0; rmaprx = 1;
2266
                          } else {
2267
                                  reply->status = 12;
2268
                                  reply->destaddr = spw2->nodeaddr;
2269
                          }
2270
                          if ((ret = build_rmap_hdr(reply, rx2, replysize))) {
2271
                                  printf("RMAP reply build failed: %d\n", ret);
2272
                                  exit(1);
2273
                          }
2274
 
2275
                  }
2276
                  found = 0;
2277
                  for (l = 0; l < spw2->dmachan; l++) {
2278
                          /* printf("Chan: %d En: %d Sep: %d\n", l, chanen[l], sepaddr[l]); */
2279
                          if (chanen[l]) {
2280
                                  if (((spw2->dma[l].addr & ~spw2->dma[l].mask) == (destaddr & ~spw2->dma[l].mask)) && sepaddr[l]) {
2281
                                          if (!(rmaprx) && !(found)) {
2282
                                                  startrx[l] = 0; rxchan = l;
2283
                                                  found = 1;
2284
                                          }
2285
                                  } else if (((spw2->nodeaddr & ~spw2->mask) == (destaddr & ~spw2->mask)) && !(sepaddr[l]) && !(rmappkt)) {
2286
                                          if (!(found)) {
2287
                                                  startrx[l] = 0; rxchan = l;
2288
                                                  found = 1;
2289
                                          }
2290
                                  }
2291
                          }
2292
                  }
2293
                  length = (rand() % 128);
2294
                  if (length < 3) {
2295
                          length = 3;
2296
                  }
2297
                  if (!(found) && rmappkt) {
2298
                          rmaprx = 1;
2299
                  } else if (!found) {
2300
                          rxchan = -1;
2301
                  }
2302
                  if (rmappkt && rmaprx) {
2303
                          spw_rx(0, rx1, spw1);
2304
                  }
2305
                  if (rmappkt) {
2306
                          /* printf("Rmap\n"); */
2307
                          spw_tx(0, 1, 1, 0, *cmdsize, tx1, 128, tx0, spw1);
2308
                  } else {
2309
                          /* printf("Len: %d\n", length); */
2310
                          spw_tx(0, 0, 0, 0, 0, tx0, length, tx0, spw1);
2311
                  }
2312
                  /* printf("Addr: %x, Rxchan: %d, sepaddr: %d, DefAddr: %x, DefMask: %x, RxAddr: %x, RxMask: %x, Rmap: %d\n", tx0[0], rxchan, sepaddr[rxchan], spw2->nodeaddr, spw2->mask, spw2->dma[rxchan].addr, spw2->dma[rxchan].mask, rmappkt); */
2313
/*                   printf("Here\n"); */
2314
 
2315
                  while(!(tmp = spw_checktx(0, spw1))) {
2316
                          for(l = 0; l < 64; l++) {}
2317
                  }
2318
                  if (tmp != 1) {
2319
                          printf("Transmit error link 1\n");
2320
                          exit(1);
2321
                  }
2322
                  /* if (i == 78) { */
2323
/*                           printf("Here2\n"); */
2324
/*                   } */
2325
                  if (!(rmaprx) && found) {
2326
                          if (rmappkt) {
2327
                                  length = 128+*cmdsize+2;
2328
                          }
2329
                          /* printf("Here3\n"); */
2330
                          while(!(tmp = spw_checkrx(rxchan, size, rxs, spw2))) {
2331
                                  for(l = 0; l < 64; l++) {}
2332
                          }
2333
                          /* printf("Received link %d\n", rxchan); */
2334
/*                           printf("Here4\n");  */
2335
                          if (rxs->truncated) {
2336
                                  printf("Received packet truncated link 2\n");
2337
                                  exit(1);
2338
                          }
2339
                          if(rxs->eep) {
2340
                                  printf("Received packet terminated with eep link 2\n");
2341
                                  exit(1);
2342
                          }
2343
                          if (*size != length) {
2344
                                  printf("Received packet has wrong length link 2. Expected: %d, Got: %d\n", length, *size);
2345
                                  exit(1);
2346
                          }
2347
                          /* if (i == 1) { */
2348
/*                                   for(l = 0; l < length; l++) { */
2349
/*                                           printf("Tx0: %x, Rx0: %x\n", tx0[l], loadb((int)&(rx[rxchan][l]))); */
2350
/*                                   } */
2351
/*                           } */
2352
                          if (rmappkt) {
2353
                                  for(l = 0; l < *cmdsize; l++) {
2354
                                          if (loadb((int)&(rx[rxchan][l])) != tx1[l]) {
2355
                                                  printf("Compare error buf 0: %u Data: %x Expected: %x \n", l, (unsigned)loadb((int)&(rx[rxchan][l])), (unsigned)tx1[l]);
2356
                                                  exit(1);
2357
                                          }
2358
                                  }
2359
                                  for(l = 0; l < 128; l++) {
2360
                                          if (loadb((int)&(rx[rxchan][l+*cmdsize+1])) != tx0[l]) {
2361
                                                  printf("Compare error buf 0: %u Data: %x Expected: %x \n", l, (unsigned)loadb((int)&(rx[rxchan][l+*cmdsize+1])), (unsigned)tx0[l]);
2362
                                                  exit(1);
2363
                                          }
2364
                                  }
2365
                          } else {
2366
                                  for(l = 0; l < length; l++) {
2367
                                          if (loadb((int)&(rx[rxchan][l])) != tx0[l]) {
2368
                                                  printf("Compare error buf 0: %u Data: %x Expected: %x \n", l, (unsigned)loadb((int)&(rx[rxchan][l])), (unsigned)tx0[l]);
2369
                                                  exit(1);
2370
                                          }
2371
                                  }
2372
                          }
2373
                  } else if (rmaprx) {
2374
                          /* printf("Here5\n"); */
2375
                          while(!(tmp = spw_checkrx(0, size, rxs, spw1))) {
2376
                                  for(l = 0; l < 64; l++) {}
2377
                          }
2378
                          /* printf("Here6\n"); */
2379
                          if (rxs->truncated) {
2380
                                  printf("Received packet truncated link 2\n");
2381
                                  exit(1);
2382
                          }
2383
                          if(rxs->eep) {
2384
                                  printf("Received packet terminated with eep link 2\n");
2385
                                  exit(1);
2386
                          }
2387
                          if (*size != (*replysize+1)) {
2388
                                  printf("Received packet has wrong length link 2\n");
2389
                                  exit(1);
2390
                          }
2391
                          for(l = 0; l < *replysize; l++) {
2392
                                  if (loadb((int)&(rx1[l])) != rx2[l]) {
2393
                                          printf("Compare error buf 0: %u Data: %x Expected: %x \n", l, (unsigned)loadb((int)&(rx1[l])), (unsigned)rx2[l]);
2394
                                          exit(1);
2395
                                  }
2396
                          }
2397
                  }
2398
                  /* send dummy packets to disable all channels*/
2399
                  for (l = 0; l < spw2->dmachan; l++) {
2400
                          if (chanen[l] && (l != rxchan)) {
2401
                                  if (sepaddr[l]) {
2402
                                          tx0[0] = spw2->dma[l].addr;
2403
/*                                           printf("Addr: %x\n", tx0[0]); */
2404
                                  } else {
2405
                                          tx0[0] = spw2->nodeaddr;
2406
/*                                           printf("Addr: %x\n", tx0[0]); */
2407
                                  }
2408
                                  spw_tx(0, 0, 0, 0, 0, tx0, 128, tx0, spw1);
2409
                                  while(!(tmp = spw_checkrx(l, size, rxs, spw2))) {
2410
                                          for(k = 0; k < 64; k++) {}
2411
                                  }
2412
                          }
2413
                          spw_disablerx(l, spw2);
2414
                  }
2415
 
2416
          }
2417
          free(rx0);
2418
          free(rx1);
2419
          free(rx2);
2420
          free(tx0);
2421
          for(l = 0; l < spw2->dmachan; l++) {
2422
                  free(rx[l]);
2423
          }
2424
 
2425
  }
2426
  printf("\nTEST 12: completed successfully\n\n");
2427
#endif
2428
  printf("*********** Test suite completed successfully ************\n");
2429
  exit(0);
2430
 
2431
}

powered by: WebSVN 2.1.0

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