示例#1
0
文件: bounce.c 项目: dcobas/banctest
int bounce (void)
{
    unsigned short csr;
    unsigned short buff[4096], data[4096], *pts, *ptd;
    int i, l = 0, flag = 0;
    int seuil = 0;
    unsigned char str1[20], str2[20];
    char dir;

    seuil = 128;
    dir = 8;
    /* tell G64 to start bounce with LRR and NEM set */
    csr = LRREQ_BIT + NEM_BIT;
    if (set_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in set LRR+NEM");

    /* reset bit TB et RB */
    csr = TB_BIT + RB_BIT;
    if (clr_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in clr RB+TB");

    /* fill data */
    for (i = 0; i < seuil; i++)
	data[i] = (i * (0xffff / seuil)) + ((0xffff / seuil) * l + l);

    l = 1;
    while (go_on) {
	print (1, "%c%c", '|' + (l & 0xfffe), dir);
	print (2, "Test avec %4d mots\n", l);

	/* reset receive pointer */
	csr = RRP_BIT;
	if (set_csr (bc, rt, &csr, &status) == -1)
	    BAD ("system error in set RRP");

	/* fill buffer */
	if (set_rx_buf (bc, rt, l * 2, (char *) data, &status) != 0)
	    BAD ("system error in set_rc_buf");

	/* set bits RB */
	csr = RB_BIT;
	if (set_csr (bc, rt, &csr, &status) == -1)
	    BAD ("system error in set RB");

	/* wait for reponse */
	if (wait_for_csr (TB_BIT, TB_BIT, 20000, 0) == 0) {
	    print (1, "TIME_OUT a l'attente du Transmit Buffer plein.\n");
	    erreur++;
	    if (t_err)
		continue;
	}

	/* reset transmit pointer */
	csr = RTP_BIT;
	if (set_csr (bc, rt, &csr, &status) == -1)
	    BAD ("system error in set RTP");

	/* read reponse */
	for (i = 0; i < l; i++)
	    buff[i] = 0;
	if (get_tx_buf (bc, rt, l * 2, (char *) buff, &status) != 0)
	    BAD ("system error in get_tx_buf");

	/* reset bit TB */
	csr = TB_BIT;
	if (clr_csr (bc, rt, &csr, &status) == -1)
	    BAD ("system error in clr TB");

	/* compare */
	flag = 0;
	i = l;
	pts = data;
	ptd = buff;
	do {
	    if (*pts != *ptd) {
		flag++;
		erreur++;
		convbin (*pts, (char *) str1);
		convbin (*ptd, (char *) str2);
		print (1, "DATA error in test_BOUNCE:\tPointer %d\n  read [%s]\n write [%s]\n", i, str2, str1);
		break;
	    }
	    pts++;
	    ptd++;
	} while (--i);
	if (++l > seuil)
	    break;
    }
    /* clear collision pattern LRR and NEM set */
    csr = LRREQ_BIT + NEM_BIT;
    if (clr_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in clr LRR+NEM");

    if (get_csr (bc, rt, &csr, &status) == -1)
	BAD1 ("system error in get_csr");
    if ((csr & INV_BIT) == INV_BIT) {
	print (0, "Le G64 a detecte une ou plusieurs erreurs au cours du test collision\n");
	erreur++;
	csr = INV_BIT;
	if (clr_csr (bc, rt, &csr, &status) == -1)
	    BAD1 ("system error in clr INV");
	if (t_err)
	    return t_err;
    }
    return (erreur);
}
示例#2
0
static int run_test_loop(void)
{
	int ret = 0;
	uint64_t op_data = send_data ? opts.transfer_size : NO_CQ_DATA;
	uint64_t op_tag = 0x1234;
	char *op_buf;
	int i, j;

	for (i = 0; i < num_iters; i++) {
		for (j = 0; j < concurrent_msgs; j++) {
			op_buf = get_tx_buf(j);
			if (ft_check_opts(FT_OPT_VERIFY_DATA))
				ft_fill_buf(op_buf + ft_tx_prefix_size(),
					    opts.transfer_size);

			ret = ft_post_tx_buf(ep, remote_fi_addr,
					     opts.transfer_size,
					     op_data, &tx_ctx_arr[j],
					     op_buf, mr_desc, op_tag);
			if (ret) {
				printf("ERROR send_msg returned %d\n", ret);
				return ret;
			}
		}

		ret = ft_sync();
		if (ret)
			return ret;

		for (j = 0; j < concurrent_msgs; j++) {
			op_buf = get_rx_buf(j);
			ret = ft_post_rx_buf(ep, opts.transfer_size,
					     &rx_ctx_arr[j], op_buf,
					     mr_desc, op_tag);
			if (ret) {
				printf("ERROR recv_msg returned %d\n", ret);
				return ret;
			}
		}

		for (j = 0; j < concurrent_msgs; j++) {
			ret = wait_recvs();
			if (ret < 1)
				return ret;
		}

		if (ft_check_opts(FT_OPT_VERIFY_DATA)) {
			for (j = 0; j < concurrent_msgs; j++) {
				op_buf = get_rx_buf(j);
				if (ft_check_buf(op_buf + ft_rx_prefix_size(),
						 opts.transfer_size))
					return -FI_EOTHER;
			}
		}

		for (j = 0; j < concurrent_msgs; j++) {
			ret = ft_get_tx_comp(tx_seq);
			if (ret)
				return ret;
		}

		if (i % 100 == 0)
			printf("PID %d GOOD iter %d/%ld completed\n",
				getpid(), i, num_iters);
	}

	(void) ft_sync();
	printf("PID %d GOOD all done\n", getpid());
	return ret;
}