void diag_close(void) { unsigned long flags; struct diag_context *ctxt = &_context; struct diag_req_entry *req_entry; /* free write requests */ spin_lock_irqsave(&ctxt->dev_lock , flags); if(ctxt->diag_opened) { while (!list_empty(&ctxt->dev_write_req_list)) { req_entry = list_entry(ctxt->dev_write_req_list.next, struct diag_req_entry, re_entry); list_del(&req_entry->re_entry); diag_free_req_entry(ctxt->epin, req_entry); } /* free read requests */ while (!list_empty(&ctxt->dev_read_req_list)) { req_entry = list_entry(ctxt->dev_read_req_list.next, struct diag_req_entry, re_entry); list_del(&req_entry->re_entry); diag_free_req_entry(ctxt->epout, req_entry); } } spin_unlock_irqrestore(&ctxt->dev_lock , flags); return; }
int diag_open(int num_req) { unsigned long flags; struct diag_context *ctxt = &_context; struct diag_req_entry *write_entry; struct diag_req_entry *read_entry; int i = 0; // put in by jwnd84... to keep funny things from happening. spin_lock_irqsave(&ctxt->dev_lock , flags); for (i = 0; i < num_req; i++) { write_entry = diag_alloc_req_entry(ctxt->epin, 0, GFP_KERNEL); if (write_entry) { write_entry->usb_req->complete = diag_write_complete; write_entry->usb_req->device = (void *)ctxt; list_add(&write_entry->re_entry, &ctxt->dev_write_req_list); } else goto write_error; } for (i = 0; i < num_req ; i++) { read_entry = diag_alloc_req_entry(ctxt->epout, 0 , GFP_KERNEL); if (read_entry) { read_entry->usb_req->complete = diag_read_complete; read_entry->usb_req->device = (void *)ctxt; list_add(&read_entry->re_entry , &ctxt->dev_read_req_list); } else goto read_error; } ctxt->diag_opened = 1; spin_unlock_irqrestore(&ctxt->dev_lock , flags); return 0; read_error: printk(KERN_ERR "%s:read requests allocation failure\n", __func__); while (!list_empty(&ctxt->dev_read_req_list)) { read_entry = list_entry(ctxt->dev_read_req_list.next, struct diag_req_entry, re_entry); list_del(&read_entry->re_entry); diag_free_req_entry(ctxt->epout, read_entry); } write_error: printk(KERN_ERR "%s: write requests allocation failure\n", __func__); while (!list_empty(&ctxt->dev_write_req_list)) { write_entry = list_entry(ctxt->dev_write_req_list.next, struct diag_req_entry, re_entry); list_del(&write_entry->re_entry); diag_free_req_entry(ctxt->epin, write_entry); } ctxt->diag_opened = 0; spin_unlock_irqrestore(&ctxt->dev_lock , flags); return -ENOMEM; }
int diag_open(int num_req) { struct diag_context *ctxt = &_context; struct diag_req_entry *write_entry; struct diag_req_entry *read_entry; int i = 0; for (i = 0; i < num_req; i++) { write_entry = diag_alloc_req_entry(ctxt->epin, 0, GFP_KERNEL); if (write_entry) { write_entry->usb_req->complete = diag_write_complete; write_entry->usb_req->device = (void *)ctxt; list_add(&write_entry->re_entry, &ctxt->dev_write_req_list); } else goto write_error; } for (i = 0; i < num_req ; i++) { read_entry = diag_alloc_req_entry(ctxt->epout, 0 , GFP_KERNEL); if (read_entry) { read_entry->usb_req->complete = diag_read_complete; read_entry->usb_req->device = (void *)ctxt; list_add(&read_entry->re_entry , &ctxt->dev_read_req_list); } else goto read_error; } ctxt->diag_opened = 1; return 0; read_error: printk(KERN_ERR "%s:read requests allocation failure\n", __func__); while (!list_empty(&ctxt->dev_read_req_list)) { read_entry = list_entry(ctxt->dev_read_req_list.next, struct diag_req_entry, re_entry); list_del(&read_entry->re_entry); diag_free_req_entry(ctxt->epout, read_entry); } write_error: printk(KERN_ERR "%s: write requests allocation failure\n", __func__); while (!list_empty(&ctxt->dev_write_req_list)) { write_entry = list_entry(ctxt->dev_write_req_list.next, struct diag_req_entry, re_entry); list_del(&write_entry->re_entry); diag_free_req_entry(ctxt->epin, write_entry); } ctxt->diag_opened = 0; return -ENOMEM; }
void diag_close(void) { struct diag_context *ctxt = &_context; struct diag_req_entry *req_entry; /* free write requests */ while (!list_empty(&ctxt->dev_write_req_list)) { req_entry = list_entry(ctxt->dev_write_req_list.next, struct diag_req_entry, re_entry); list_del(&req_entry->re_entry); diag_free_req_entry(ctxt->epin, req_entry); } /* free read requests */ while (!list_empty(&ctxt->dev_read_req_list)) { req_entry = list_entry(ctxt->dev_read_req_list.next, struct diag_req_entry, re_entry); list_del(&req_entry->re_entry); diag_free_req_entry(ctxt->epout, req_entry); } return; }