int dibusb_urb_exit(struct usb_dibusb *dib) { int i; dibusb_urb_kill(dib); if((dib->init_state & DIBUSB_STATE_URB_LIST)) { for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { if (dib->urb_list[i] != NULL) { deb_info("freeing URB no. %d.\n",i); /* free the URBs */ usb_free_urb(dib->urb_list[i]); } } /* free the urb array */ kfree(dib->urb_list); dib->init_state &= ~DIBUSB_STATE_URB_LIST; } if (dib->init_state & DIBUSB_STATE_URB_BUF) pci_free_consistent(NULL, dib->dibdev->dev_cl->urb_buffer_size*dib->dibdev->dev_cl->urb_count, dib->buffer,dib->dma_handle); dib->init_state &= ~DIBUSB_STATE_URB_BUF; dib->init_state &= ~DIBUSB_STATE_URB_INIT; return 0; }
int dibusb_streaming(struct usb_dibusb *dib,int onoff) { if (onoff) dibusb_urb_submit(dib); else dibusb_urb_kill(dib); return 0; }
static int dibusb_urb_submit(struct usb_dibusb *dib) { int i,ret; if (dib->init_state & DIBUSB_STATE_URB_INIT) { for (i = 0; i < dib->dibdev->dev_cl->urb_count; i++) { deb_info("submitting URB no. %d\n",i); if ((ret = usb_submit_urb(dib->urb_list[i],GFP_ATOMIC))) { err("could not submit buffer urb no. %d - get them all back\n",i); dibusb_urb_kill(dib); return ret; } dib->init_state |= DIBUSB_STATE_URB_SUBMIT; } } return 0; }
int dibusb_streaming(struct usb_dibusb *dib,int onoff) { if (onoff) dibusb_urb_submit(dib); else dibusb_urb_kill(dib); switch (dib->dibdev->dev_cl->id) { case DIBUSB2_0: case DIBUSB2_0B: case NOVAT_USB2: case UMT2_0: if (onoff) return dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_ENABLE_STREAM,NULL,0); else return dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_DISABLE_STREAM,NULL,0); break; default: break; } return 0; }