Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/batch.c

    rc15070c r20a1e76  
    4040#include "batch.h"
    4141#include "transfer_list.h"
    42 #include "uhci_hc.h"
     42#include "hw_struct/transfer_descriptor.h"
    4343#include "utils/malloc32.h"
    44 #include "uhci_struct/transfer_descriptor.h"
    4544
    4645#define DEFAULT_ERROR_COUNT 3
     
    4948        qh_t *qh;
    5049        td_t *tds;
    51         size_t packets;
    52         device_keeper_t *manager;
     50        size_t transfers;
     51        usb_device_keeper_t *manager;
    5352} uhci_batch_t;
    5453
    55 static void batch_control(batch_t *instance,
     54static void batch_control(usb_transfer_batch_t *instance,
    5655    usb_packet_id data_stage, usb_packet_id status_stage);
    57 static void batch_data(batch_t *instance, usb_packet_id pid);
    58 static void batch_call_in_and_dispose(batch_t *instance);
    59 static void batch_call_out_and_dispose(batch_t *instance);
     56static void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid);
     57static void batch_call_in_and_dispose(usb_transfer_batch_t *instance);
     58static void batch_call_out_and_dispose(usb_transfer_batch_t *instance);
    6059
    6160
     
    6564 * @param[in] target Device and endpoint target of the transaction.
    6665 * @param[in] transfer_type Interrupt, Control or Bulk.
    67  * @param[in] max_packet_size maximum allowed size of data packets.
     66 * @param[in] max_packet_size maximum allowed size of data transfers.
    6867 * @param[in] speed Speed of the transaction.
    6968 * @param[in] buffer Data source/destination.
     
    7877 * NULL otherwise.
    7978 *
    80  * Determines the number of needed packets (TDs). Prepares a transport buffer
     79 * Determines the number of needed transfers (TDs). Prepares a transport buffer
    8180 * (that is accessible by the hardware). Initializes parameters needed for the
    8281 * transaction and callback.
    8382 */
    84 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
     83usb_transfer_batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
    8584    usb_transfer_type_t transfer_type, size_t max_packet_size,
    8685    usb_speed_t speed, char *buffer, size_t buffer_size,
     
    8887    usbhc_iface_transfer_in_callback_t func_in,
    8988    usbhc_iface_transfer_out_callback_t func_out, void *arg,
    90     device_keeper_t *manager
     89    usb_device_keeper_t *manager
    9190    )
    9291{
     
    103102        } else (void)0
    104103
    105         batch_t *instance = malloc(sizeof(batch_t));
     104        usb_transfer_batch_t *instance = malloc(sizeof(usb_transfer_batch_t));
    106105        CHECK_NULL_DISPOSE_RETURN(instance,
    107106            "Failed to allocate batch instance.\n");
    108         batch_init(instance, target, transfer_type, speed, max_packet_size,
     107        usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size,
    109108            buffer, NULL, buffer_size, NULL, setup_size, func_in,
    110109            func_out, arg, fun, NULL);
     
    118117        instance->private_data = data;
    119118
    120         data->packets = (buffer_size + max_packet_size - 1) / max_packet_size;
     119        data->transfers = (buffer_size + max_packet_size - 1) / max_packet_size;
    121120        if (transfer_type == USB_TRANSFER_CONTROL) {
    122                 data->packets += 2;
    123         }
    124 
    125         data->tds = malloc32(sizeof(td_t) * data->packets);
     121                data->transfers += 2;
     122        }
     123
     124        data->tds = malloc32(sizeof(td_t) * data->transfers);
    126125        CHECK_NULL_DISPOSE_RETURN(
    127126            data->tds, "Failed to allocate transfer descriptors.\n");
    128         bzero(data->tds, sizeof(td_t) * data->packets);
     127        bzero(data->tds, sizeof(td_t) * data->transfers);
    129128
    130129        data->qh = malloc32(sizeof(qh_t));
     
    161160 * is reached.
    162161 */
    163 bool batch_is_complete(batch_t *instance)
     162bool batch_is_complete(usb_transfer_batch_t *instance)
    164163{
    165164        assert(instance);
     
    167166        assert(data);
    168167
    169         usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n",
    170             instance, data->packets);
     168        usb_log_debug2("Batch(%p) checking %d transfer(s) for completion.\n",
     169            instance, data->transfers);
    171170        instance->transfered_size = 0;
    172171        size_t i = 0;
    173         for (;i < data->packets; ++i) {
     172        for (;i < data->transfers; ++i) {
    174173                if (td_is_active(&data->tds[i])) {
    175174                        return false;
     
    182181                        td_print_status(&data->tds[i]);
    183182
    184                         device_keeper_set_toggle(data->manager,
     183                        usb_device_keeper_set_toggle(data->manager,
    185184                            instance->target, instance->direction,
    186185                            td_toggle(&data->tds[i]));
     
    205204 * Uses genercir control function with pids OUT and IN.
    206205 */
    207 void batch_control_write(batch_t *instance)
     206void batch_control_write(usb_transfer_batch_t *instance)
    208207{
    209208        assert(instance);
     
    222221 * Uses generic control with pids IN and OUT.
    223222 */
    224 void batch_control_read(batch_t *instance)
     223void batch_control_read(usb_transfer_batch_t *instance)
    225224{
    226225        assert(instance);
     
    236235 * Data transaction with PID_IN.
    237236 */
    238 void batch_interrupt_in(batch_t *instance)
     237void batch_interrupt_in(usb_transfer_batch_t *instance)
    239238{
    240239        assert(instance);
     
    251250 * Data transaction with PID_OUT.
    252251 */
    253 void batch_interrupt_out(batch_t *instance)
     252void batch_interrupt_out(usb_transfer_batch_t *instance)
    254253{
    255254        assert(instance);
     
    269268 * Data transaction with PID_IN.
    270269 */
    271 void batch_bulk_in(batch_t *instance)
     270void batch_bulk_in(usb_transfer_batch_t *instance)
    272271{
    273272        assert(instance);
     
    284283 * Data transaction with PID_OUT.
    285284 */
    286 void batch_bulk_out(batch_t *instance)
     285void batch_bulk_out(usb_transfer_batch_t *instance)
    287286{
    288287        assert(instance);
     
    299298 *
    300299 * @param[in] instance Batch structure to use.
    301  * @param[in] pid to use for data packets.
     300 * @param[in] pid Pid to use for data transfers.
    302301 *
    303302 * Packets with alternating toggle bit and supplied pid value.
    304  * The last packet is marked with IOC flag.
    305  */
    306 void batch_data(batch_t *instance, usb_packet_id pid)
     303 * The last transfer is marked with IOC flag.
     304 */
     305void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid)
    307306{
    308307        assert(instance);
     
    311310
    312311        const bool low_speed = instance->speed == USB_SPEED_LOW;
    313         int toggle = device_keeper_get_toggle(
     312        int toggle = usb_device_keeper_get_toggle(
    314313            data->manager, instance->target, instance->direction);
    315314        assert(toggle == 0 || toggle == 1);
    316315
    317         size_t packet = 0;
     316        size_t transfer = 0;
    318317        size_t remain_size = instance->buffer_size;
    319318        while (remain_size > 0) {
     
    326325                    remain_size : instance->max_packet_size;
    327326
    328                 td_t *next_packet = (packet + 1 < data->packets)
    329                     ? &data->tds[packet + 1] : NULL;
    330 
    331                 assert(packet < data->packets);
     327                td_t *next_transfer = (transfer + 1 < data->transfers)
     328                    ? &data->tds[transfer + 1] : NULL;
     329
     330                assert(transfer < data->transfers);
    332331                assert(packet_size <= remain_size);
    333332
    334333                td_init(
    335                     &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,
     334                    &data->tds[transfer], DEFAULT_ERROR_COUNT, packet_size,
    336335                    toggle, false, low_speed, instance->target, pid, trans_data,
    337                     next_packet);
     336                    next_transfer);
    338337
    339338
    340339                toggle = 1 - toggle;
    341340                remain_size -= packet_size;
    342                 ++packet;
    343         }
    344         td_set_ioc(&data->tds[packet - 1]);
    345         device_keeper_set_toggle(data->manager, instance->target,
     341                ++transfer;
     342        }
     343        td_set_ioc(&data->tds[transfer - 1]);
     344        usb_device_keeper_set_toggle(data->manager, instance->target,
    346345            instance->direction, toggle);
    347346}
     
    350349 *
    351350 * @param[in] instance Batch structure to use.
    352  * @param[in] data_stage to use for data packets.
    353  * @param[in] status_stage to use for data packets.
     351 * @param[in] data_stage Pid to use for data transfers.
     352 * @param[in] status_stage Pid to use for data transfers.
    354353 *
    355354 * Setup stage with toggle 0 and USB_PID_SETUP.
    356355 * Data stage with alternating toggle and pid supplied by parameter.
    357356 * Status stage with toggle 1 and pid supplied by parameter.
    358  * The last packet is marked with IOC.
    359  */
    360 void batch_control(batch_t *instance,
     357 * The last transfer is marked with IOC.
     358 */
     359void batch_control(usb_transfer_batch_t *instance,
    361360   usb_packet_id data_stage, usb_packet_id status_stage)
    362361{
     
    364363        uhci_batch_t *data = instance->private_data;
    365364        assert(data);
    366         assert(data->packets >= 2);
     365        assert(data->transfers >= 2);
    367366
    368367        const bool low_speed = instance->speed == USB_SPEED_LOW;
     
    375374
    376375        /* data stage */
    377         size_t packet = 1;
     376        size_t transfer = 1;
    378377        size_t remain_size = instance->buffer_size;
    379378        while (remain_size > 0) {
     
    389388
    390389                td_init(
    391                     &data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,
     390                    &data->tds[transfer], DEFAULT_ERROR_COUNT, packet_size,
    392391                    toggle, false, low_speed, instance->target, data_stage,
    393                     control_data, &data->tds[packet + 1]);
    394 
    395                 ++packet;
    396                 assert(packet < data->packets);
     392                    control_data, &data->tds[transfer + 1]);
     393
     394                ++transfer;
     395                assert(transfer < data->transfers);
    397396                assert(packet_size <= remain_size);
    398397                remain_size -= packet_size;
     
    400399
    401400        /* status stage */
    402         assert(packet == data->packets - 1);
     401        assert(transfer == data->transfers - 1);
    403402
    404403        td_init(
    405             &data->tds[packet], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed,
     404            &data->tds[transfer], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed,
    406405            instance->target, status_stage, NULL, NULL);
    407         td_set_ioc(&data->tds[packet]);
     406        td_set_ioc(&data->tds[transfer]);
    408407
    409408        usb_log_debug2("Control last TD status: %x.\n",
    410             data->tds[packet].status);
    411 }
    412 /*----------------------------------------------------------------------------*/
    413 qh_t * batch_qh(batch_t *instance)
     409            data->tds[transfer].status);
     410}
     411/*----------------------------------------------------------------------------*/
     412qh_t * batch_qh(usb_transfer_batch_t *instance)
    414413{
    415414        assert(instance);
     
    423422 * @param[in] instance Batch structure to use.
    424423 */
    425 void batch_call_in_and_dispose(batch_t *instance)
    426 {
    427         assert(instance);
    428         batch_call_in(instance);
     424void batch_call_in_and_dispose(usb_transfer_batch_t *instance)
     425{
     426        assert(instance);
     427        usb_transfer_batch_call_in(instance);
    429428        batch_dispose(instance);
    430429}
     
    434433 * @param[in] instance Batch structure to use.
    435434 */
    436 void batch_call_out_and_dispose(batch_t *instance)
    437 {
    438         assert(instance);
    439         batch_call_out(instance);
     435void batch_call_out_and_dispose(usb_transfer_batch_t *instance)
     436{
     437        assert(instance);
     438        usb_transfer_batch_call_out(instance);
    440439        batch_dispose(instance);
    441440}
     
    445444 * @param[in] instance Batch structure to use.
    446445 */
    447 void batch_dispose(batch_t *instance)
     446void batch_dispose(usb_transfer_batch_t *instance)
    448447{
    449448        assert(instance);
Note: See TracChangeset for help on using the changeset viewer.