107
112
dma_nwl_enable_engine_irq(ctx, writeid);
108
113
#endif /* NWL_GENERATE_DMA_IRQ */
110
dma_nwl_start_loopback(ctx, direction, size * sizeof(uint32_t));
115
if (size * sizeof(uint32_t) > NWL_MAX_PACKET_SIZE) {
116
packet_size = NWL_MAX_PACKET_SIZE;
117
blocks = (size * sizeof(uint32_t)) / packet_size + (((size*sizeof(uint32_t))%packet_size)?1:0);
119
packet_size = size * sizeof(uint32_t);
123
dma_nwl_start_loopback(ctx, direction, packet_size);
112
125
// Allocate memory and prepare data
113
buf = malloc(size * sizeof(uint32_t));
114
cmp = malloc(size * sizeof(uint32_t));
126
buf = malloc(blocks * packet_size * sizeof(uint32_t));
127
cmp = malloc(blocks * packet_size * sizeof(uint32_t));
115
128
if ((!buf)||(!cmp)) {
116
129
if (buf) free(buf);
117
130
if (cmp) free(cmp);
121
//#ifdef DEBUG_HARDWARE
122
134
if (ctx->type == PCILIB_NWL_MODIFICATION_IPECAMERA) {
123
135
pcilib_write_register(ctx->pcilib, NULL, "control", 0x1e5);
125
137
pcilib_write_register(ctx->pcilib, NULL, "control", 0x1e1);
139
// This way causes more problems with garbage
140
//pcilib_write_register(ctx->pcilib, NULL, "control", 0x3e1);
127
//#endif /* DEBUG_HARDWARE */
130
144
for (iter = 0; iter < iterations; iter++) {
131
145
memset(cmp, 0x13 + iter, size * sizeof(uint32_t));
133
//#ifdef DEBUG_HARDWARE
134
147
if (ctx->type == PCILIB_NWL_MODIFICATION_IPECAMERA) {
135
148
pcilib_write_register(ctx->pcilib, NULL, "control", 0x1e1);
137
//#endif /* DEBUG_HARDWARE */
139
gettimeofday(&start, NULL);
140
if (direction&PCILIB_DMA_TO_DEVICE) {
151
if ((direction&PCILIB_DMA_TO_DEVICE)||(ctx->type != PCILIB_DMA_MODIFICATION_DEFAULT)) {
141
152
memcpy(buf, cmp, size * sizeof(uint32_t));
154
if (direction&PCILIB_DMA_TO_DEVICE) {
155
gettimeofday(&start, NULL);
143
158
err = pcilib_write_dma(ctx->pcilib, writeid, addr, size * sizeof(uint32_t), buf, &bytes);
144
159
if ((err)||(bytes != size * sizeof(uint32_t))) {
145
160
error = "Write failed";
164
if (direction&PCILIB_DMA_TO_DEVICE) {
166
if (direction == PCILIB_DMA_TO_DEVICE) {
167
dma_nwl_wait_completion(ctx, writeid, PCILIB_DMA_TIMEOUT);
169
gettimeofday(&cur, NULL);
170
us += ((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec));
150
//#ifdef DEBUG_HARDWARE
151
174
if (ctx->type == PCILIB_NWL_MODIFICATION_IPECAMERA) {
152
175
pcilib_write_register(ctx->pcilib, NULL, "control", 0x3e1);
154
//#endif /* DEBUG_HARDWARE */
156
178
memset(buf, 0, size * sizeof(uint32_t));
158
err = pcilib_read_dma(ctx->pcilib, readid, addr, size * sizeof(uint32_t), buf, &bytes);
159
gettimeofday(&cur, NULL);
160
us += ((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec));
180
if (direction&PCILIB_DMA_FROM_DEVICE) {
181
gettimeofday(&start, NULL);
184
for (i = 0, bytes = 0; i < blocks; i++) {
185
#ifdef NWL_BUG_EXTRA_DATA
189
err = pcilib_read_dma(ctx->pcilib, readid, addr, packet_size * sizeof(uint32_t), buf + (bytes>>2), &rbytes);
190
if ((err)||(rbytes%sizeof(uint32_t))) {
193
#ifdef NWL_BUG_EXTRA_DATA
194
else if (rbytes == 8) {
201
if (direction&PCILIB_DMA_FROM_DEVICE) {
202
gettimeofday(&cur, NULL);
203
us += ((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec));
205
#ifdef NWL_BUG_EXTRA_DATA
206
if ((err)||((bytes != size * sizeof(uint32_t))&&((bytes - 8) != size * sizeof(uint32_t)))) {
162
208
if ((err)||(bytes != size * sizeof(uint32_t))) {
163
error = "Read failed";
210
printf("Expected: %zu bytes, but %zu read, error: %i\n", size * sizeof(uint32_t), bytes, err);
211
error = "Read failed";
215
#ifndef NWL_BUG_EXTRA_DATA
167
216
if (direction == PCILIB_DMA_BIDIRECTIONAL) {
168
217
res = memcmp(buf, cmp, size * sizeof(uint32_t));
186
#ifdef DEBUG_HARDWARE
187
puts("====================================");
189
err = pcilib_read_register(ctx->pcilib, NULL, "reg9050", ®val);
190
printf("Status1: %i 0x%lx\n", err, regval);
191
err = pcilib_read_register(ctx->pcilib, NULL, "reg9080", ®val);
192
printf("Start address: %i 0x%lx\n", err, regval);
193
err = pcilib_read_register(ctx->pcilib, NULL, "reg9090", ®val);
194
printf("End address: %i 0x%lx\n", err, regval);
195
err = pcilib_read_register(ctx->pcilib, NULL, "reg9100", ®val);
196
printf("Status2: %i 0x%lx\n", err, regval);
197
err = pcilib_read_register(ctx->pcilib, NULL, "reg9110", ®val);
198
printf("Status3: %i 0x%lx\n", err, regval);
199
err = pcilib_read_register(ctx->pcilib, NULL, "reg9160", ®val);
200
printf("Add_rd_ddr: %i 0x%lx\n", err, regval);
201
#endif /* DEBUG_HARDWARE */
205
#ifdef DEBUG_HARDWARE
206
puts("------------------------------------------------");
207
err = pcilib_read_register(ctx->pcilib, NULL, "reg9050", ®val);
208
printf("Status1: %i 0x%lx\n", err, regval);
209
err = pcilib_read_register(ctx->pcilib, NULL, "reg9080", ®val);
210
printf("Start address: %i 0x%lx\n", err, regval);
211
err = pcilib_read_register(ctx->pcilib, NULL, "reg9090", ®val);
212
printf("End address: %i 0x%lx\n", err, regval);
213
err = pcilib_read_register(ctx->pcilib, NULL, "reg9100", ®val);
214
printf("Status2: %i 0x%lx\n", err, regval);
215
err = pcilib_read_register(ctx->pcilib, NULL, "reg9110", ®val);
216
printf("Status3: %i 0x%lx\n", err, regval);
217
err = pcilib_read_register(ctx->pcilib, NULL, "reg9160", ®val);
218
printf("Add_rd_ddr: %i 0x%lx\n", err, regval);
219
#endif /* DEBUG_HARDWARE */
237
if (ctx->type == PCILIB_NWL_MODIFICATION_IPECAMERA) {
238
pcilib_write_register(ctx->pcilib, NULL, "control", 0x1e1);
222
242
pcilib_warning("%s at iteration %i, error: %i, bytes: %zu", error, iter, err, bytes);