Changes in uspace/drv/ohci/root_hub.c [be11749:f35b294] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/root_hub.c
rbe11749 rf35b294 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 … … 208 205 * @return Error code. 209 206 */ 210 int rh_init(rh_t *instance, ohci_regs_t *regs) {207 int rh_init(rh_t *instance, ddf_dev_t *dev, ohci_regs_t *regs) { 211 208 assert(instance); 209 //instance->address = -1; 212 210 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; 215 213 rh_init_descriptors(instance); 216 214 // 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 219 218 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count); 219 220 //start generic usb hub driver 221 222 /* TODO: implement */ 220 223 return EOK; 221 224 } … … 233 236 assert(request); 234 237 int opResult; 235 if (request-> ep->transfer_type == USB_TRANSFER_CONTROL) {238 if (request->transfer_type == USB_TRANSFER_CONTROL) { 236 239 usb_log_info("Root hub got CONTROL packet\n"); 237 240 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) { 240 242 usb_log_info("Root hub got INTERRUPT packet\n"); 241 243 void * buffer; 242 size_t buffer_size;243 244 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); 256 248 opResult = EOK; 257 249 } else { 258 250 opResult = EINVAL; 259 usb_transfer_batch_finish_error(request, opResult);260 }251 } 252 usb_transfer_batch_finish_error(request, opResult); 261 253 return EOK; 262 254 } … … 266 258 267 259 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); 260 usb_log_info("Whoa whoa wait, I`m not supposed to receive any " 261 "interrupts, am I?\n"); 262 /* TODO: implement? */ 280 263 } 281 264 /*----------------------------------------------------------------------------*/ … … 390 373 if (port < 1 || port > instance->port_count) 391 374 return EINVAL; 392 uint32_t * uint32_buffer = (uint32_t*) request-> data_buffer;375 uint32_t * uint32_buffer = (uint32_t*) request->transport_buffer; 393 376 request->transfered_size = 4; 394 377 uint32_buffer[0] = instance->registers->rh_port_status[port - 1]; … … 416 399 static int process_get_hub_status_request(rh_t *instance, 417 400 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; 419 402 request->transfered_size = 4; 420 403 //bits, 0,1,16,17 … … 566 549 } 567 550 request->transfered_size = size; 568 memcpy(request-> data_buffer, result_descriptor, size);551 memcpy(request->transport_buffer, result_descriptor, size); 569 552 if (del) 570 553 free(result_descriptor); … … 587 570 if (request->buffer_size != 1) 588 571 return EINVAL; 589 request-> data_buffer[0] = 1;572 request->transport_buffer[0] = 1; 590 573 request->transfered_size = 1; 591 574 return EOK; … … 882 865 return opResult; 883 866 } 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 867 932 868 /**
Note:
See TracChangeset
for help on using the changeset viewer.