Changeset bf7b747 in mainline
- Timestamp:
- 2017-12-30T21:36:08Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 24c8bf8
- Parents:
- 5c75456
- git-author:
- Petr Manek <petr.manek@…> (2017-12-30 21:28:26)
- git-committer:
- Petr Manek <petr.manek@…> (2017-12-30 21:36:08)
- Location:
- uspace/drv/bus/usb/usbdiag
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbdiag/tests.c
r5c75456 rbf7b747 140 140 } 141 141 142 static const uint32_t test_data = uint32_host2usb(0xDEADBEEF); 143 144 static int data_in_test(usb_pipe_t *pipe, int cycles, size_t size, usbdiag_dur_t *duration) 145 { 146 if (!pipe) 147 return EBADMEM; 148 149 if (size % sizeof(test_data)) 150 return EINVAL; 151 152 char *buffer = (char *) malloc(size); 153 if (!buffer) 154 return ENOMEM; 155 156 // TODO: Are we sure that no other test is running on this endpoint? 157 158 usb_log_info("Performing %s IN data test.", usb_str_transfer_type(pipe->desc.transfer_type)); 159 160 int rc = EOK; 161 struct timeval start_time; 162 gettimeofday(&start_time, NULL); 163 164 for (int i = 0; i < cycles; ++i) { 165 // Read device's response. 166 size_t remaining = size; 167 size_t transferred; 168 169 while (remaining > 0) { 170 if ((rc = usb_pipe_read(pipe, buffer + size - remaining, remaining, &transferred))) { 171 usb_log_error("Read of %s IN endpoint failed with error: %s\n", usb_str_transfer_type(pipe->desc.transfer_type), str_error(rc)); 172 break; 173 } 174 175 if (transferred > remaining) { 176 usb_log_error("Read of %s IN endpoint returned more data than expected.\n", usb_str_transfer_type(pipe->desc.transfer_type)); 177 rc = EINVAL; 178 break; 179 } 180 181 remaining -= transferred; 182 } 183 184 if (rc) 185 break; 186 187 for (size_t i = 0; i < size; i += sizeof(test_data)) { 188 if (*(uint32_t *)(buffer + i) != test_data) { 189 usb_log_error("Read of %s IN endpoint returned invald data at address %lu.\n", usb_str_transfer_type(pipe->desc.transfer_type), i); 190 rc = EINVAL; 191 break; 192 } 193 } 194 195 if (rc) 196 break; 197 } 198 199 struct timeval final_time; 200 gettimeofday(&final_time, NULL); 201 usbdiag_dur_t in_duration = ((final_time.tv_usec - start_time.tv_usec) / 1000) + 202 ((final_time.tv_sec - start_time.tv_sec) * 1000); 203 204 usb_log_info("Data test on %s IN endpoint completed in %lu ms.", usb_str_transfer_type(pipe->desc.transfer_type), in_duration); 205 206 free(buffer); 207 if (duration) 208 *duration = in_duration; 209 210 return rc; 211 } 212 213 static int data_out_test(usb_pipe_t *pipe, int cycles, size_t size, usbdiag_dur_t *duration) 214 { 215 if (!pipe) 216 return EBADMEM; 217 218 if (size % sizeof(test_data)) 219 return EINVAL; 220 221 char *buffer = (char *) malloc(size); 222 if (!buffer) 223 return ENOMEM; 224 225 for (size_t i = 0; i < size; i += sizeof(test_data)) { 226 memcpy(buffer + i, &test_data, sizeof(test_data)); 227 } 228 229 // TODO: Are we sure that no other test is running on this endpoint? 230 231 usb_log_info("Performing %s OUT data test.", usb_str_transfer_type(pipe->desc.transfer_type)); 232 233 int rc = EOK; 234 struct timeval start_time; 235 gettimeofday(&start_time, NULL); 236 237 for (int i = 0; i < cycles; ++i) { 238 // Write buffer to device. 239 if ((rc = usb_pipe_write(pipe, buffer, size))) { 240 usb_log_error("Write to %s OUT endpoint failed with error: %s\n", usb_str_transfer_type(pipe->desc.transfer_type), str_error(rc)); 241 break; 242 } 243 } 244 245 struct timeval final_time; 246 gettimeofday(&final_time, NULL); 247 usbdiag_dur_t in_duration = ((final_time.tv_usec - start_time.tv_usec) / 1000) + 248 ((final_time.tv_sec - start_time.tv_sec) * 1000); 249 250 usb_log_info("Data test on %s OUT endpoint completed in %ld ms.", usb_str_transfer_type(pipe->desc.transfer_type), in_duration); 251 252 free(buffer); 253 if (duration) 254 *duration = in_duration; 255 256 return rc; 257 } 258 142 259 int usbdiag_burst_test_intr_in(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 143 260 { … … 192 309 193 310 return burst_out_test(dev->isoch_out, cycles, size, duration); 311 } 312 313 int usbdiag_data_test_intr_in(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 314 { 315 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 316 if (!dev) 317 return EBADMEM; 318 319 return data_in_test(dev->intr_in, cycles, size, duration); 320 } 321 322 int usbdiag_data_test_intr_out(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 323 { 324 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 325 if (!dev) 326 return EBADMEM; 327 328 return data_out_test(dev->intr_out, cycles, size, duration); 329 } 330 331 int usbdiag_data_test_bulk_in(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 332 { 333 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 334 if (!dev) 335 return EBADMEM; 336 337 return data_in_test(dev->bulk_in, cycles, size, duration); 338 } 339 340 int usbdiag_data_test_bulk_out(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 341 { 342 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 343 if (!dev) 344 return EBADMEM; 345 346 return data_out_test(dev->bulk_out, cycles, size, duration); 347 } 348 349 int usbdiag_data_test_isoch_in(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 350 { 351 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 352 if (!dev) 353 return EBADMEM; 354 355 return data_in_test(dev->isoch_in, cycles, size, duration); 356 } 357 358 int usbdiag_data_test_isoch_out(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration) 359 { 360 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 361 if (!dev) 362 return EBADMEM; 363 364 return data_out_test(dev->isoch_out, cycles, size, duration); 194 365 } 195 366 -
uspace/drv/bus/usb/usbdiag/tests.h
r5c75456 rbf7b747 46 46 int usbdiag_burst_test_isoch_out(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 47 47 48 int usbdiag_data_test_intr_in(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 49 int usbdiag_data_test_intr_out(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 50 int usbdiag_data_test_bulk_in(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 51 int usbdiag_data_test_bulk_out(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 52 int usbdiag_data_test_isoch_in(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 53 int usbdiag_data_test_isoch_out(ddf_fun_t *, int, size_t, usbdiag_dur_t *); 54 48 55 #endif /* USBDIAG_TESTS_H_ */ 49 56
Note:
See TracChangeset
for help on using the changeset viewer.