Changeset bf7b747 in mainline for uspace/drv/bus/usb/usbdiag/tests.c


Ignore:
Timestamp:
2017-12-30T21:36:08Z (6 years ago)
Author:
Petr Manek <petr.manek@…>
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)
Message:

usbdiag: add data validity tests

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbdiag/tests.c

    r5c75456 rbf7b747  
    140140}
    141141
     142static const uint32_t test_data = uint32_host2usb(0xDEADBEEF);
     143
     144static 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
     213static 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
    142259int usbdiag_burst_test_intr_in(ddf_fun_t *fun, int cycles, size_t size, usbdiag_dur_t *duration)
    143260{
     
    192309
    193310        return burst_out_test(dev->isoch_out, cycles, size, duration);
     311}
     312
     313int 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
     322int 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
     331int 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
     340int 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
     349int 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
     358int 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);
    194365}
    195366
Note: See TracChangeset for help on using the changeset viewer.