Changes in uspace/drv/ohci/root_hub.c [be11749:8148ee3a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/root_hub.c
rbe11749 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; … … 236 233 usb_log_info("Root hub got CONTROL packet\n"); 237 234 opResult = process_ctrl_request(instance, request); 238 usb_transfer_batch_finish_error(request, opResult);239 235 } else if (request->ep->transfer_type == USB_TRANSFER_INTERRUPT) { 240 236 usb_log_info("Root hub got INTERRUPT packet\n"); 241 237 void * buffer; 242 size_t buffer_size;243 238 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); 239 &(request->transfered_size)); 240 memcpy(request->data_buffer, buffer, 241 request->transfered_size); 256 242 opResult = EOK; 257 243 } else { 258 244 opResult = EINVAL; 259 usb_transfer_batch_finish_error(request, opResult);260 }245 } 246 usb_transfer_batch_finish_error(request, opResult); 261 247 return EOK; 262 248 } … … 266 252 267 253 void 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); 254 usb_log_info("Whoa whoa wait, I`m not supposed to receive any " 255 "interrupts, am I?\n"); 256 /* TODO: implement? */ 280 257 } 281 258 /*----------------------------------------------------------------------------*/ … … 882 859 return opResult; 883 860 } 884 /*----------------------------------------------------------------------------*/885 886 /**887 * process hanging interrupt request888 *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 interrupt892 * transfer.893 *894 * @param instance hub instance895 * @param request batch request to be processed896 * @param change_buffer chages on hub897 * @param buffer_size size of change buffer898 *899 * @return900 */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 zeros915 *916 * Convenience function.917 * @param buffer918 * @param size919 * @return920 */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 }931 861 932 862 /**
Note:
See TracChangeset
for help on using the changeset viewer.