Changeset b7b7898 in mainline for uspace/drv/bus/usb/usbdiag
- Timestamp:
- 2017-12-22T12:03:16Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 96c416a
- Parents:
- 2986763
- git-author:
- Petr Mánek <petr.manek@…> (2017-12-22 12:02:50)
- git-committer:
- Petr Mánek <petr.manek@…> (2017-12-22 12:03:16)
- Location:
- uspace/drv/bus/usb/usbdiag
- Files:
-
- 1 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbdiag/device.c
r2986763 rb7b7898 45 45 #define NAME "usbdiag" 46 46 47 #define TRANSLATE_FUNC_NAME(fun) translate_##fun48 #define TRANSLATE_FUNC(fun) \49 static int TRANSLATE_FUNC_NAME(fun)(ddf_fun_t *f, int cycles, size_t size)\50 {\51 usb_diag_dev_t *dev = ddf_fun_to_usb_diag_dev(f);\52 return fun(dev, cycles, size);\53 }54 55 TRANSLATE_FUNC(usb_diag_stress_intr_out)56 TRANSLATE_FUNC(usb_diag_stress_intr_in)57 TRANSLATE_FUNC(usb_diag_stress_bulk_out)58 TRANSLATE_FUNC(usb_diag_stress_bulk_in)59 TRANSLATE_FUNC(usb_diag_stress_isoch_out)60 TRANSLATE_FUNC(usb_diag_stress_isoch_in)61 62 47 static usbdiag_iface_t diag_interface = { 63 . stress_intr_out = TRANSLATE_FUNC_NAME(usb_diag_stress_intr_out),64 . stress_intr_in = TRANSLATE_FUNC_NAME(usb_diag_stress_intr_in),65 . stress_bulk_out = TRANSLATE_FUNC_NAME(usb_diag_stress_bulk_out),66 . stress_bulk_in = TRANSLATE_FUNC_NAME(usb_diag_stress_bulk_in),67 . stress_isoch_out = TRANSLATE_FUNC_NAME(usb_diag_stress_isoch_out),68 . stress_isoch_in = TRANSLATE_FUNC_NAME(usb_diag_stress_isoch_in)48 .burst_intr_in = usbdiag_burst_test_intr_in, 49 .burst_intr_out = usbdiag_burst_test_intr_out, 50 .burst_bulk_in = usbdiag_burst_test_bulk_in, 51 .burst_bulk_out = usbdiag_burst_test_bulk_out, 52 .burst_isoch_in = usbdiag_burst_test_isoch_in, 53 .burst_isoch_out = usbdiag_burst_test_isoch_out 69 54 }; 70 71 #undef TRANSLATE_FUNC_NAME72 #undef TRANSLATE_FUNC73 55 74 56 static ddf_dev_ops_t diag_ops = { … … 76 58 }; 77 59 78 static int device_init(usb _diag_dev_t *dev)60 static int device_init(usbdiag_dev_t *dev) 79 61 { 80 62 int rc; … … 89 71 90 72 #define _MAP_EP(target, ep_no) do {\ 91 usb_endpoint_mapping_t *epm = usb_device_get_mapped_ep(dev->usb_dev, USB _DIAG_EP_##ep_no);\73 usb_endpoint_mapping_t *epm = usb_device_get_mapped_ep(dev->usb_dev, USBDIAG_EP_##ep_no);\ 92 74 if (!epm || !epm->present) {\ 93 75 usb_log_error("Failed to map endpoint: " #ep_no ".\n");\ … … 115 97 } 116 98 117 static void device_fini(usb _diag_dev_t *dev)99 static void device_fini(usbdiag_dev_t *dev) 118 100 { 119 101 ddf_fun_destroy(dev->fun); 120 102 } 121 103 122 int usb _diag_dev_create(usb_device_t *dev, usb_diag_dev_t **out_diag_dev)104 int usbdiag_dev_create(usb_device_t *dev, usbdiag_dev_t **out_diag_dev) 123 105 { 124 106 assert(dev); 125 107 assert(out_diag_dev); 126 108 127 usb _diag_dev_t *diag_dev = usb_device_data_alloc(dev, sizeof(usb_diag_dev_t));109 usbdiag_dev_t *diag_dev = usb_device_data_alloc(dev, sizeof(usbdiag_dev_t)); 128 110 if (!diag_dev) 129 111 return ENOMEM; … … 143 125 } 144 126 145 void usb _diag_dev_destroy(usb_diag_dev_t *dev)127 void usbdiag_dev_destroy(usbdiag_dev_t *dev) 146 128 { 147 129 assert(dev); -
uspace/drv/bus/usb/usbdiag/device.h
r2986763 rb7b7898 34 34 */ 35 35 36 #ifndef USB _DIAG_DEVICE_H_37 #define USB _DIAG_DEVICE_H_36 #ifndef USBDIAG_DEVICE_H_ 37 #define USBDIAG_DEVICE_H_ 38 38 39 39 #include <usb/dev/device.h> 40 40 41 #define USB _DIAG_EP_INTR_IN 142 #define USB _DIAG_EP_INTR_OUT 243 #define USB _DIAG_EP_BULK_IN 344 #define USB _DIAG_EP_BULK_OUT 445 #define USB _DIAG_EP_ISOCH_IN 546 #define USB _DIAG_EP_ISOCH_OUT 641 #define USBDIAG_EP_INTR_IN 1 42 #define USBDIAG_EP_INTR_OUT 2 43 #define USBDIAG_EP_BULK_IN 3 44 #define USBDIAG_EP_BULK_OUT 4 45 #define USBDIAG_EP_ISOCH_IN 5 46 #define USBDIAG_EP_ISOCH_OUT 6 47 47 48 48 /** 49 49 * USB diagnostic device. 50 50 */ 51 typedef struct usb _diag_dev {51 typedef struct usbdiag_dev { 52 52 usb_device_t *usb_dev; 53 53 ddf_fun_t *fun; … … 58 58 usb_pipe_t *isoch_in; 59 59 usb_pipe_t *isoch_out; 60 } usb _diag_dev_t;60 } usbdiag_dev_t; 61 61 62 int usb _diag_dev_create(usb_device_t *, usb_diag_dev_t **);63 void usb _diag_dev_destroy(usb_diag_dev_t *);62 int usbdiag_dev_create(usb_device_t *, usbdiag_dev_t **); 63 void usbdiag_dev_destroy(usbdiag_dev_t *); 64 64 65 static inline usb _diag_dev_t * usb_device_to_usb_diag_dev(usb_device_t *usb_dev)65 static inline usbdiag_dev_t * usb_device_to_usbdiag_dev(usb_device_t *usb_dev) 66 66 { 67 67 assert(usb_dev); … … 69 69 } 70 70 71 static inline usb _diag_dev_t * ddf_dev_to_usb_diag_dev(ddf_dev_t *ddf_dev)71 static inline usbdiag_dev_t * ddf_dev_to_usbdiag_dev(ddf_dev_t *ddf_dev) 72 72 { 73 73 assert(ddf_dev); 74 return usb_device_to_usb _diag_dev(usb_device_get(ddf_dev));74 return usb_device_to_usbdiag_dev(usb_device_get(ddf_dev)); 75 75 } 76 76 77 static inline usb _diag_dev_t * ddf_fun_to_usb_diag_dev(ddf_fun_t *ddf_fun)77 static inline usbdiag_dev_t * ddf_fun_to_usbdiag_dev(ddf_fun_t *ddf_fun) 78 78 { 79 79 assert(ddf_fun); 80 return ddf_dev_to_usb _diag_dev(ddf_fun_get_dev(ddf_fun));80 return ddf_dev_to_usbdiag_dev(ddf_fun_get_dev(ddf_fun)); 81 81 } 82 82 83 #endif /* USB _DIAG_USBDIAG_H_ */83 #endif /* USBDIAG_USBDIAG_H_ */ 84 84 85 85 /** -
uspace/drv/bus/usb/usbdiag/main.c
r2986763 rb7b7898 41 41 #include <str_error.h> 42 42 43 #include "usbdiag.h"44 43 #include "device.h" 45 44 … … 51 50 usb_log_info("Adding device '%s'", usb_device_get_name(dev)); 52 51 53 usb _diag_dev_t *diag_dev;54 if ((rc = usb _diag_dev_create(dev, &diag_dev))) {52 usbdiag_dev_t *diag_dev; 53 if ((rc = usbdiag_dev_create(dev, &diag_dev))) { 55 54 usb_log_error("Failed create device: %s.\n", str_error(rc)); 56 55 goto err; … … 73 72 ddf_fun_unbind(diag_dev->fun); 74 73 err_create: 75 usb _diag_dev_destroy(diag_dev);74 usbdiag_dev_destroy(diag_dev); 76 75 err: 77 76 return rc; … … 83 82 usb_log_info("Removing device '%s'", usb_device_get_name(dev)); 84 83 85 usb _diag_dev_t *diag_dev = usb_device_to_usb_diag_dev(dev);84 usbdiag_dev_t *diag_dev = usb_device_to_usbdiag_dev(dev); 86 85 87 86 /* TODO: Make sure nothing is going on with the device. */ … … 92 91 } 93 92 94 usb _diag_dev_destroy(diag_dev);93 usbdiag_dev_destroy(diag_dev); 95 94 96 95 return EOK; … … 104 103 usb_log_info("Device '%s' gone.", usb_device_get_name(dev)); 105 104 106 usb _diag_dev_t *diag_dev = usb_device_to_usb_diag_dev(dev);105 usbdiag_dev_t *diag_dev = usb_device_to_usbdiag_dev(dev); 107 106 108 107 /* TODO: Make sure nothing is going on with the device. */ … … 110 109 /* TODO: Remove device from list */ 111 110 112 usb _diag_dev_destroy(diag_dev);111 usbdiag_dev_destroy(diag_dev); 113 112 114 113 return EOK; … … 175 174 176 175 static const usb_endpoint_description_t *diag_endpoints[] = { 177 [USB _DIAG_EP_INTR_IN] = &intr_in_ep,178 [USB _DIAG_EP_INTR_OUT] = &intr_out_ep,179 [USB _DIAG_EP_BULK_IN] = &bulk_in_ep,180 [USB _DIAG_EP_BULK_OUT] = &bulk_out_ep,181 [USB _DIAG_EP_ISOCH_IN] = &isoch_in_ep,182 [USB _DIAG_EP_ISOCH_OUT] = &isoch_out_ep,176 [USBDIAG_EP_INTR_IN] = &intr_in_ep, 177 [USBDIAG_EP_INTR_OUT] = &intr_out_ep, 178 [USBDIAG_EP_BULK_IN] = &bulk_in_ep, 179 [USBDIAG_EP_BULK_OUT] = &bulk_out_ep, 180 [USBDIAG_EP_ISOCH_IN] = &isoch_in_ep, 181 [USBDIAG_EP_ISOCH_OUT] = &isoch_out_ep, 183 182 NULL 184 183 }; -
uspace/drv/bus/usb/usbdiag/tests.c
r2986763 rb7b7898 37 37 #include <str_error.h> 38 38 #include <usb/debug.h> 39 #include "device.h" 39 40 #include "tests.h" 40 41 41 42 #define NAME "usbdiag" 42 43 44 static int burst_in_test(usb_pipe_t *pipe, int cycles, size_t size) 45 { 46 if (!pipe) 47 return EBADMEM; 43 48 44 int usb_diag_stress_intr_out(usb_diag_dev_t *dev, int cycles, size_t size) 49 char *buffer = (char *) malloc(size); 50 if (!buffer) 51 return ENOMEM; 52 53 // TODO: Are we sure that no other test is running on this endpoint? 54 55 usb_log_info("Performing %s IN burst test.", usb_str_transfer_type(pipe->desc.transfer_type)); 56 int rc = EOK; 57 for (int i = 0; i < cycles; ++i) { 58 // Read device's response. 59 size_t remaining = size; 60 size_t transferred; 61 62 while (remaining > 0) { 63 if ((rc = usb_pipe_read(pipe, buffer + size - remaining, remaining, &transferred))) { 64 usb_log_error("Read of %s IN endpoint failed with error: %s\n", usb_str_transfer_type(pipe->desc.transfer_type), str_error(rc)); 65 break; 66 } 67 68 if (transferred > remaining) { 69 usb_log_error("Read of %s IN endpoint returned more data than expected.\n", usb_str_transfer_type(pipe->desc.transfer_type)); 70 rc = EINVAL; 71 break; 72 } 73 74 remaining -= transferred; 75 } 76 77 if (rc) 78 break; 79 } 80 usb_log_info("Burst test on %s IN endpoint completed.", usb_str_transfer_type(pipe->desc.transfer_type)); 81 82 free(buffer); 83 return rc; 84 } 85 86 static int burst_out_test(usb_pipe_t *pipe, int cycles, size_t size) 45 87 { 46 if (! dev)88 if (!pipe) 47 89 return EBADMEM; 48 90 … … 55 97 // TODO: Are we sure that no other test is running on this endpoint? 56 98 57 usb_log_info("Performing interrupt out stress test on device %s.", ddf_fun_get_name(dev->fun));99 usb_log_info("Performing %s OUT burst test.", usb_str_transfer_type(pipe->desc.transfer_type)); 58 100 int rc = EOK; 59 101 for (int i = 0; i < cycles; ++i) { 60 102 // Write buffer to device. 61 if ((rc = usb_pipe_write( dev->intr_out, buffer, size))) {62 usb_log_error(" Interrupt OUT write failed. %s\n", str_error(rc));103 if ((rc = usb_pipe_write(pipe, buffer, size))) { 104 usb_log_error("Write to %s OUT endpoint failed with error: %s\n", usb_str_transfer_type(pipe->desc.transfer_type), str_error(rc)); 63 105 break; 64 106 } 65 107 } 108 usb_log_info("Burst test on %s OUT endpoint completed.", usb_str_transfer_type(pipe->desc.transfer_type)); 66 109 67 110 free(buffer); … … 69 112 } 70 113 71 int usb _diag_stress_intr_in(usb_diag_dev_t *dev, int cycles, size_t size)114 int usbdiag_burst_test_intr_in(ddf_fun_t *fun, int cycles, size_t size) 72 115 { 116 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 73 117 if (!dev) 74 118 return EBADMEM; 75 119 76 char *buffer = (char *) malloc(size); 77 if (!buffer) 78 return ENOMEM; 79 80 // TODO: Are we sure that no other test is running on this endpoint? 81 82 usb_log_info("Performing interrupt in stress test on device %s.", ddf_fun_get_name(dev->fun)); 83 int rc = EOK; 84 for (int i = 0; i < cycles; ++i) { 85 // Read device's response. 86 size_t remaining = size; 87 size_t transferred; 88 89 while (remaining > 0) { 90 if ((rc = usb_pipe_read(dev->intr_in, buffer + size - remaining, remaining, &transferred))) { 91 usb_log_error("Interrupt IN read failed. %s\n", str_error(rc)); 92 break; 93 } 94 95 if (transferred > remaining) { 96 usb_log_error("Interrupt IN read more than expected.\n"); 97 rc = EINVAL; 98 break; 99 } 100 101 remaining -= transferred; 102 } 103 104 if (rc) 105 break; 106 } 107 108 free(buffer); 109 return rc; 120 return burst_in_test(dev->intr_in, cycles, size); 110 121 } 111 122 112 int usb _diag_stress_bulk_out(usb_diag_dev_t *dev, int cycles, size_t size)123 int usbdiag_burst_test_intr_out(ddf_fun_t *fun, int cycles, size_t size) 113 124 { 125 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 114 126 if (!dev) 115 127 return EBADMEM; 116 128 117 char *buffer = (char *) malloc(size); 118 if (!buffer) 119 return ENOMEM; 120 121 memset(buffer, 42, size); 122 123 // TODO: Are we sure that no other test is running on this endpoint? 124 125 usb_log_info("Performing bulk out stress test on device %s.", ddf_fun_get_name(dev->fun)); 126 int rc = EOK; 127 for (int i = 0; i < cycles; ++i) { 128 // Write buffer to device. 129 if ((rc = usb_pipe_write(dev->bulk_out, buffer, size))) { 130 usb_log_error("Bulk OUT write failed. %s\n", str_error(rc)); 131 break; 132 } 133 } 134 135 free(buffer); 136 return rc; 129 return burst_out_test(dev->intr_out, cycles, size); 137 130 } 138 131 139 int usb _diag_stress_bulk_in(usb_diag_dev_t *dev, int cycles, size_t size)132 int usbdiag_burst_test_bulk_in(ddf_fun_t *fun, int cycles, size_t size) 140 133 { 134 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 141 135 if (!dev) 142 136 return EBADMEM; 143 137 144 char *buffer = (char *) malloc(size); 145 if (!buffer) 146 return ENOMEM; 147 148 // TODO: Are we sure that no other test is running on this endpoint? 149 150 usb_log_info("Performing bulk in stress test on device %s.", ddf_fun_get_name(dev->fun)); 151 int rc = EOK; 152 for (int i = 0; i < cycles; ++i) { 153 // Read device's response. 154 size_t remaining = size; 155 size_t transferred; 156 157 while (remaining > 0) { 158 if ((rc = usb_pipe_read(dev->bulk_in, buffer + size - remaining, remaining, &transferred))) { 159 usb_log_error("Bulk IN read failed. %s\n", str_error(rc)); 160 break; 161 } 162 163 if (transferred > remaining) { 164 usb_log_error("Bulk IN read more than expected.\n"); 165 rc = EINVAL; 166 break; 167 } 168 169 remaining -= transferred; 170 } 171 172 if (rc) 173 break; 174 } 175 176 free(buffer); 177 return rc; 138 return burst_in_test(dev->bulk_in, cycles, size); 178 139 } 179 140 180 int usb _diag_stress_isoch_out(usb_diag_dev_t *dev, int cycles, size_t size)141 int usbdiag_burst_test_bulk_out(ddf_fun_t *fun, int cycles, size_t size) 181 142 { 143 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 182 144 if (!dev) 183 145 return EBADMEM; 184 146 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; 147 return burst_out_test(dev->bulk_out, cycles, size); 205 148 } 206 149 207 int usb _diag_stress_isoch_in(usb_diag_dev_t *dev, int cycles, size_t size)150 int usbdiag_burst_test_isoch_in(ddf_fun_t *fun, int cycles, size_t size) 208 151 { 152 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 209 153 if (!dev) 210 154 return EBADMEM; 211 155 212 char *buffer = (char *) malloc(size); 213 if (!buffer) 214 return ENOMEM; 156 return burst_in_test(dev->isoch_in, cycles, size); 157 } 215 158 216 // TODO: Are we sure that no other test is running on this endpoint? 159 int usbdiag_burst_test_isoch_out(ddf_fun_t *fun, int cycles, size_t size) 160 { 161 usbdiag_dev_t *dev = ddf_fun_to_usbdiag_dev(fun); 162 if (!dev) 163 return EBADMEM; 217 164 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; 165 return burst_out_test(dev->isoch_out, cycles, size); 246 166 } 247 167 -
uspace/drv/bus/usb/usbdiag/tests.h
r2986763 rb7b7898 34 34 */ 35 35 36 #ifndef USB _DIAG_TESTS_H_37 #define USB _DIAG_TESTS_H_36 #ifndef USBDIAG_TESTS_H_ 37 #define USBDIAG_TESTS_H_ 38 38 39 #include "device.h"39 #include <ddf/driver.h> 40 40 41 int usb _diag_stress_intr_out(usb_diag_dev_t *, int, size_t);42 int usb _diag_stress_intr_in(usb_diag_dev_t *, int, size_t);43 int usb _diag_stress_bulk_out(usb_diag_dev_t *, int, size_t);44 int usb _diag_stress_bulk_in(usb_diag_dev_t *, int, size_t);45 int usb _diag_stress_isoch_out(usb_diag_dev_t *, int, size_t);46 int usb _diag_stress_isoch_in(usb_diag_dev_t *, int, size_t);41 int usbdiag_burst_test_intr_in(ddf_fun_t *, int, size_t); 42 int usbdiag_burst_test_intr_out(ddf_fun_t *, int, size_t); 43 int usbdiag_burst_test_bulk_in(ddf_fun_t *, int, size_t); 44 int usbdiag_burst_test_bulk_out(ddf_fun_t *, int, size_t); 45 int usbdiag_burst_test_isoch_in(ddf_fun_t *, int, size_t); 46 int usbdiag_burst_test_isoch_out(ddf_fun_t *, int, size_t); 47 47 48 #endif /* USB _DIAG_TESTS_H_ */48 #endif /* USBDIAG_TESTS_H_ */ 49 49 50 50 /**
Note:
See TracChangeset
for help on using the changeset viewer.
