Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/src/altiface.c

    rab27e01 r160b75e  
    4848 * @return Number of alternate interfaces for @p interface_no interface.
    4949 */
    50 size_t usb_interface_count_alternates(const uint8_t *config_descr,
     50size_t usb_interface_count_alternates(uint8_t *config_descr,
    5151    size_t config_descr_size, uint8_t interface_no)
    5252{
     
    5454        assert(config_descr_size > 0);
    5555
    56         const usb_dp_parser_t dp_parser = {
     56        usb_dp_parser_t dp_parser = {
    5757                .nesting = usb_dp_standard_descriptor_nesting
    5858        };
    59         const usb_dp_parser_data_t dp_data = {
     59        usb_dp_parser_data_t dp_data = {
    6060                .data = config_descr,
    6161                .size = config_descr_size,
     
    6565        size_t alternate_count = 0;
    6666
    67         const uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
     67        uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
    6868            &dp_data, config_descr);
    6969        while (iface_ptr != NULL) {
     
    9090 * @return Error code.
    9191 */
    92 int usb_alternate_interfaces_init(usb_alternate_interfaces_t *alternates,
    93     const uint8_t *config_descr, size_t config_descr_size, int interface_number)
     92int usb_alternate_interfaces_create(uint8_t *config_descr,
     93    size_t config_descr_size, int interface_number,
     94    usb_alternate_interfaces_t **alternates_ptr)
    9495{
    95         assert(alternates != NULL);
     96        assert(alternates_ptr != NULL);
    9697        assert(config_descr != NULL);
    9798        assert(config_descr_size > 0);
    9899
    99         alternates->alternatives = NULL;
    100         alternates->alternative_count = 0;
    101         alternates->current = 0;
     100        if (interface_number < 0) {
     101                alternates_ptr = NULL;
     102                return EOK;
     103        }
    102104
    103         if (interface_number < 0) {
    104                 return EOK;
     105        usb_alternate_interfaces_t *alternates
     106            = malloc(sizeof(usb_alternate_interfaces_t));
     107
     108        if (alternates == NULL) {
     109                return ENOMEM;
    105110        }
    106111
     
    110115
    111116        if (alternates->alternative_count == 0) {
     117                free(alternates);
    112118                return ENOENT;
    113119        }
    114120
    115         alternates->alternatives = calloc(alternates->alternative_count,
    116             sizeof(usb_alternate_interface_descriptors_t));
     121        alternates->alternatives = malloc(alternates->alternative_count
     122            * sizeof(usb_alternate_interface_descriptors_t));
    117123        if (alternates->alternatives == NULL) {
     124                free(alternates);
    118125                return ENOMEM;
    119126        }
    120127
    121         const usb_dp_parser_t dp_parser = {
     128        alternates->current = 0;
     129
     130        usb_dp_parser_t dp_parser = {
    122131                .nesting = usb_dp_standard_descriptor_nesting
    123132        };
    124         const usb_dp_parser_data_t dp_data = {
     133        usb_dp_parser_data_t dp_data = {
    125134                .data = config_descr,
    126135                .size = config_descr_size,
     
    131140            = &alternates->alternatives[0];
    132141
    133         const uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
     142        uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
    134143            &dp_data, dp_data.data);
    135144        while (iface_ptr != NULL) {
     
    139148                    || (iface->interface_number != interface_number)) {
    140149                        iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser,
    141                             &dp_data, dp_data.data, iface_ptr);
     150                            &dp_data,
     151                            dp_data.data, iface_ptr);
    142152                        continue;
    143153                }
     
    150160                    dp_data.data, iface_ptr);
    151161                if (iface_ptr == NULL) {
    152                         const uint8_t *next = dp_data.data + dp_data.size;
     162                        uint8_t *next = dp_data.data + dp_data.size;
    153163                        cur_alt_iface->nested_descriptors_size
    154164                            = next - cur_alt_iface->nested_descriptors;
     
    161171        }
    162172
     173        *alternates_ptr = alternates;
     174
    163175        return EOK;
    164176}
    165177
    166 void usb_alternate_interfaces_deinit(usb_alternate_interfaces_t *alternate)
    167 {
    168         if (!alternate)
    169                 return;
    170         free(alternate->alternatives);
    171 }
     178
    172179/**
    173180 * @}
Note: See TracChangeset for help on using the changeset viewer.