Changes in uspace/drv/ohci/root_hub.c [3a85a2b:8148ee3a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/root_hub.c
r3a85a2b r8148ee3a 198 198 static int process_ctrl_request(rh_t *instance, usb_transfer_batch_t *request); 199 199 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 204 201 205 202 … … 216 213 // set port power mode to no-power-switching 217 214 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 218 instance->unfinished_interrupt_transfer = NULL; 215 219 216 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count); 220 217 return EOK; … … 239 236 usb_log_info("Root hub got INTERRUPT packet\n"); 240 237 void * buffer; 241 size_t buffer_size;242 238 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); 255 242 opResult = EOK; 256 243 } else { 257 244 opResult = EINVAL; 258 usb_transfer_batch_finish_error(request, opResult);259 }245 } 246 usb_transfer_batch_finish_error(request, opResult); 260 247 return EOK; 261 248 } … … 265 252 266 253 void 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? */ 279 257 } 280 258 /*----------------------------------------------------------------------------*/ … … 881 859 return opResult; 882 860 } 883 /*----------------------------------------------------------------------------*/884 885 /**886 * process hanging interrupt request887 *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 interrupt891 * transfer.892 *893 * @param instance hub instance894 * @param request batch request to be processed895 * @param change_buffer chages on hub896 * @param buffer_size size of change buffer897 *898 * @return899 */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 zeros914 *915 * Convenience function.916 * @param buffer917 * @param size918 * @return919 */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 }930 861 931 862 /**
Note:
See TracChangeset
for help on using the changeset viewer.