Ignore:
File:
1 edited

Legend:

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

    r3a85a2b r8148ee3a  
    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
     
    216213        // set port power mode to no-power-switching
    217214        instance->registers->rh_desc_a |= RHDA_NPS_FLAG;
    218         instance->unfinished_interrupt_transfer = NULL;
     215
    219216        usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);
    220217        return EOK;
     
    239236                usb_log_info("Root hub got INTERRUPT packet\n");
    240237                void * buffer;
    241                 size_t buffer_size;
    242238                create_interrupt_mask(instance, &buffer,
    243                         &buffer_size);
    244                 if(is_zeros(buffer,buffer_size)){
    245                         usb_log_debug("no changes..");
    246                         instance->unfinished_interrupt_transfer=
    247                             request;
    248                         //will be finished later
    249                 }else{
    250                         usb_log_debug("processing changes..");
    251                         process_interrupt(instance, request,
    252                             buffer, buffer_size);
    253                 }
    254                 free(buffer);
     239                        &(request->transfered_size));
     240                memcpy(request->data_buffer, buffer,
     241                        request->transfered_size);
    255242                opResult = EOK;
    256243        } else {
    257244                opResult = EINVAL;
    258                 usb_transfer_batch_finish_error(request, opResult);
    259         }
     245        }
     246        usb_transfer_batch_finish_error(request, opResult);
    260247        return EOK;
    261248}
     
    265252
    266253void rh_interrupt(rh_t *instance) {
    267         //usb_log_info("Whoa whoa wait, I`m not supposed to receive any "
    268         //      "interrupts, am I?\n");
    269         if(!instance->unfinished_interrupt_transfer){
    270                 return;
    271         }
    272         size_t size;
    273         void * buffer;
    274         create_interrupt_mask(instance, &buffer,
    275                         &size);
    276         process_interrupt(instance,instance->unfinished_interrupt_transfer,
    277             buffer,size);
    278         free(buffer);
     254        usb_log_info("Whoa whoa wait, I`m not supposed to receive any "
     255                "interrupts, am I?\n");
     256        /* TODO: implement? */
    279257}
    280258/*----------------------------------------------------------------------------*/
     
    881859        return opResult;
    882860}
    883 /*----------------------------------------------------------------------------*/
    884 
    885 /**
    886  * process hanging interrupt request
    887  *
    888  * If an interrupt transfer has been received and there was no change,
    889  * the driver stores the transfer information and waits for change to occcur.
    890  * This routine is called when that happens and it finalizes the interrupt
    891  * transfer.
    892  *
    893  * @param instance hub instance
    894  * @param request batch request to be processed
    895  * @param change_buffer chages on hub
    896  * @param buffer_size size of change buffer
    897  *
    898  * @return
    899  */
    900 static int process_interrupt(rh_t *instance, usb_transfer_batch_t * request,
    901     void * change_buffer, size_t buffe_size){
    902         create_interrupt_mask(instance, &change_buffer,
    903             &(request->transfered_size));
    904         memcpy(request->data_buffer, change_buffer,request->transfered_size);
    905         instance->unfinished_interrupt_transfer = NULL;
    906         usb_transfer_batch_finish_error(request, EOK);
    907         return EOK;
    908 }
    909 
    910 /*----------------------------------------------------------------------------*/
    911 
    912 /**
    913  * return whether the buffer is full of zeros
    914  *
    915  * Convenience function.
    916  * @param buffer
    917  * @param size
    918  * @return
    919  */
    920 static bool is_zeros(void * buffer, size_t size){
    921         if(!buffer) return true;
    922         if(!size) return true;
    923         size_t i;
    924         for(i=0;i<size;++i){
    925                 if(((char*)buffer)[i])
    926                         return false;
    927         }
    928         return true;
    929 }
    930861
    931862/**
Note: See TracChangeset for help on using the changeset viewer.