Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/root_hub.c

    rbe11749 rf35b294  
    198198static int process_ctrl_request(rh_t *instance, usb_transfer_batch_t *request);
    199199
    200 static int process_interrupt(rh_t *instance, usb_transfer_batch_t * request,
    201     void * change_buffer, size_t buffe_size);
    202 
    203 static bool is_zeros(void * buffer, size_t size);
     200
    204201
    205202
     
    208205 * @return Error code.
    209206 */
    210 int rh_init(rh_t *instance, ohci_regs_t *regs) {
     207int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs) {
    211208        assert(instance);
     209        //instance->address = -1;
    212210        instance->registers = regs;
    213         instance->port_count =
    214             (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK;
     211        instance->device = dev;
     212        instance->port_count = instance->registers->rh_desc_a & 0xff;
    215213        rh_init_descriptors(instance);
    216214        // set port power mode to no-power-switching
    217         instance->registers->rh_desc_a |= RHDA_NPS_FLAG;
    218         instance->unfinished_interrupt_transfer = NULL;
     215        instance->registers->rh_desc_a =
     216                instance->registers->rh_desc_a | (1<<9);
     217
    219218        usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);
     219
     220        //start generic usb hub driver
     221
     222        /* TODO: implement */
    220223        return EOK;
    221224}
     
    233236        assert(request);
    234237        int opResult;
    235         if (request->ep->transfer_type == USB_TRANSFER_CONTROL) {
     238        if (request->transfer_type == USB_TRANSFER_CONTROL) {
    236239                usb_log_info("Root hub got CONTROL packet\n");
    237240                opResult = process_ctrl_request(instance, request);
    238                 usb_transfer_batch_finish_error(request, opResult);
    239         } else if (request->ep->transfer_type == USB_TRANSFER_INTERRUPT) {
     241        } else if (request->transfer_type == USB_TRANSFER_INTERRUPT) {
    240242                usb_log_info("Root hub got INTERRUPT packet\n");
    241243                void * buffer;
    242                 size_t buffer_size;
    243244                create_interrupt_mask(instance, &buffer,
    244                         &buffer_size);
    245                 if(is_zeros(buffer,buffer_size)){
    246                         usb_log_debug("no changes..");
    247                         instance->unfinished_interrupt_transfer=
    248                             request;
    249                         //will be finished later
    250                 }else{
    251                         usb_log_debug("processing changes..");
    252                         process_interrupt(instance, request,
    253                             buffer, buffer_size);
    254                 }
    255                 free(buffer);
     245                        &(request->transfered_size));
     246                memcpy(request->transport_buffer, buffer,
     247                        request->transfered_size);
    256248                opResult = EOK;
    257249        } else {
    258250                opResult = EINVAL;
    259                 usb_transfer_batch_finish_error(request, opResult);
    260         }
     251        }
     252        usb_transfer_batch_finish_error(request, opResult);
    261253        return EOK;
    262254}
     
    266258
    267259void rh_interrupt(rh_t *instance) {
    268         //usb_log_info("Whoa whoa wait, I`m not supposed to receive any "
    269         //      "interrupts, am I?\n");
    270         if(!instance->unfinished_interrupt_transfer){
    271                 return;
    272         }
    273         size_t size;
    274         void * buffer;
    275         create_interrupt_mask(instance, &buffer,
    276                         &size);
    277         process_interrupt(instance,instance->unfinished_interrupt_transfer,
    278             buffer,size);
    279         free(buffer);
     260        usb_log_info("Whoa whoa wait, I`m not supposed to receive any "
     261                "interrupts, am I?\n");
     262        /* TODO: implement? */
    280263}
    281264/*----------------------------------------------------------------------------*/
     
    390373        if (port < 1 || port > instance->port_count)
    391374                return EINVAL;
    392         uint32_t * uint32_buffer = (uint32_t*) request->data_buffer;
     375        uint32_t * uint32_buffer = (uint32_t*) request->transport_buffer;
    393376        request->transfered_size = 4;
    394377        uint32_buffer[0] = instance->registers->rh_port_status[port - 1];
     
    416399static int process_get_hub_status_request(rh_t *instance,
    417400        usb_transfer_batch_t * request) {
    418         uint32_t * uint32_buffer = (uint32_t*) request->data_buffer;
     401        uint32_t * uint32_buffer = (uint32_t*) request->transport_buffer;
    419402        request->transfered_size = 4;
    420403        //bits, 0,1,16,17
     
    566549        }
    567550        request->transfered_size = size;
    568         memcpy(request->data_buffer, result_descriptor, size);
     551        memcpy(request->transport_buffer, result_descriptor, size);
    569552        if (del)
    570553                free(result_descriptor);
     
    587570        if (request->buffer_size != 1)
    588571                return EINVAL;
    589         request->data_buffer[0] = 1;
     572        request->transport_buffer[0] = 1;
    590573        request->transfered_size = 1;
    591574        return EOK;
     
    882865        return opResult;
    883866}
    884 /*----------------------------------------------------------------------------*/
    885 
    886 /**
    887  * process hanging interrupt request
    888  *
    889  * If an interrupt transfer has been received and there was no change,
    890  * the driver stores the transfer information and waits for change to occcur.
    891  * This routine is called when that happens and it finalizes the interrupt
    892  * transfer.
    893  *
    894  * @param instance hub instance
    895  * @param request batch request to be processed
    896  * @param change_buffer chages on hub
    897  * @param buffer_size size of change buffer
    898  *
    899  * @return
    900  */
    901 static int process_interrupt(rh_t *instance, usb_transfer_batch_t * request,
    902     void * change_buffer, size_t buffe_size){
    903         create_interrupt_mask(instance, &change_buffer,
    904             &(request->transfered_size));
    905         memcpy(request->data_buffer, change_buffer,request->transfered_size);
    906         instance->unfinished_interrupt_transfer = NULL;
    907         usb_transfer_batch_finish_error(request, EOK);
    908         return EOK;
    909 }
    910 
    911 /*----------------------------------------------------------------------------*/
    912 
    913 /**
    914  * return whether the buffer is full of zeros
    915  *
    916  * Convenience function.
    917  * @param buffer
    918  * @param size
    919  * @return
    920  */
    921 static bool is_zeros(void * buffer, size_t size){
    922         if(!buffer) return true;
    923         if(!size) return true;
    924         size_t i;
    925         for(i=0;i<size;++i){
    926                 if(((char*)buffer)[i])
    927                         return false;
    928         }
    929         return true;
    930 }
    931867
    932868/**
Note: See TracChangeset for help on using the changeset viewer.