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


Ignore:
Timestamp:
2017-12-21T14:37:30Z (6 years ago)
Author:
Petr Mánek <petr.manek@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
119a794
Parents:
74c0de0
git-author:
Petr Mánek <petr.manek@…> (2017-12-21 14:37:23)
git-committer:
Petr Mánek <petr.manek@…> (2017-12-21 14:37:30)
Message:

usbdiag: added isochronous test

File:
1 edited

Legend:

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

    r74c0de0 rff16da5f  
    178178}
    179179
     180int usb_diag_stress_isoch_out(usb_diag_dev_t *dev, int cycles, size_t size)
     181{
     182        if (!dev)
     183                return EBADMEM;
     184
     185        char *buffer = (char *) malloc(size);
     186        if (!buffer)
     187                return ENOMEM;
     188
     189        memset(buffer, 42, size);
     190
     191        // TODO: Are we sure that no other test is running on this endpoint?
     192
     193        usb_log_info("Performing isochronous out stress test on device %s.", ddf_fun_get_name(dev->fun));
     194        int rc = EOK;
     195        for (int i = 0; i < cycles; ++i) {
     196                // Write buffer to device.
     197                if ((rc = usb_pipe_write(dev->isoch_out, buffer, size))) {
     198                        usb_log_error("Isochronous OUT write failed. %s\n", str_error(rc));
     199                        break;
     200                }
     201        }
     202
     203        free(buffer);
     204        return rc;
     205}
     206
     207int usb_diag_stress_isoch_in(usb_diag_dev_t *dev, int cycles, size_t size)
     208{
     209        if (!dev)
     210                return EBADMEM;
     211
     212        char *buffer = (char *) malloc(size);
     213        if (!buffer)
     214                return ENOMEM;
     215
     216        // TODO: Are we sure that no other test is running on this endpoint?
     217
     218        usb_log_info("Performing isochronous in stress test on device %s.", ddf_fun_get_name(dev->fun));
     219        int rc = EOK;
     220        for (int i = 0; i < cycles; ++i) {
     221                // Read device's response.
     222                size_t remaining = size;
     223                size_t transferred;
     224
     225                while (remaining > 0) {
     226                        if ((rc = usb_pipe_read(dev->isoch_in, buffer + size - remaining, remaining, &transferred))) {
     227                                usb_log_error("Isochronous IN read failed. %s\n", str_error(rc));
     228                                break;
     229                        }
     230
     231                        if (transferred > remaining) {
     232                                usb_log_error("Isochronous IN read more than expected.\n");
     233                                rc = EINVAL;
     234                                break;
     235                        }
     236
     237                        remaining -= transferred;
     238                }
     239
     240                if (rc)
     241                        break;
     242        }
     243
     244        free(buffer);
     245        return rc;
     246}
     247
    180248/**
    181249 * @}
Note: See TracChangeset for help on using the changeset viewer.