diff options
Diffstat (limited to 'linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c')
-rw-r--r-- | linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c b/linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c index 2c97a18dc..4f07b5063 100644 --- a/linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c +++ b/linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c @@ -132,7 +132,7 @@ int dibusb_streaming(struct usb_dibusb *dib,int onoff) return dibusb_ioctl_cmd(dib,DIBUSB_IOCTL_CMD_DISABLE_STREAM,NULL,0); } -int dibusb_usb_init(struct usb_dibusb *dib) +int dibusb_urb_init(struct usb_dibusb *dib) { int ret,i,bufsize; @@ -150,6 +150,8 @@ int dibusb_usb_init(struct usb_dibusb *dib) return -ENOMEM; memset(dib->urb_list,0,dib->dibdev->parm->num_urbs*sizeof(struct urb *)); + dib->init_state |= DIBUSB_STATE_URB_LIST; + bufsize = dib->dibdev->parm->num_urbs*dib->dibdev->parm->urb_buf_size; deb_info("allocate %d bytes as buffersize for all URBs\n",bufsize); /* allocate the actual buffer for the URBs */ @@ -159,6 +161,8 @@ int dibusb_usb_init(struct usb_dibusb *dib) } deb_info("allocation complete\n"); memset(dib->buffer,0,bufsize); + + dib->init_state |= DIBUSB_STATE_URB_BUF; /* allocate and submit the URBs */ for (i = 0; i < dib->dibdev->parm->num_urbs; i++) { @@ -166,7 +170,7 @@ int dibusb_usb_init(struct usb_dibusb *dib) return -ENOMEM; } deb_info("submitting URB no. %d\n",i); - + usb_fill_bulk_urb( dib->urb_list[i], dib->udev, usb_rcvbulkpipe(dib->udev,dib->dibdev->parm->data_pipe), &dib->buffer[i*dib->dibdev->parm->urb_buf_size], @@ -182,14 +186,15 @@ int dibusb_usb_init(struct usb_dibusb *dib) err("could not submit buffer urb no. %d\n",i); return ret; } + dib->init_state |= DIBUSB_STATE_URB_SUBMIT; } return 0; } -int dibusb_usb_exit(struct usb_dibusb *dib) +int dibusb_urb_exit(struct usb_dibusb *dib) { int i; - if (dib->urb_list != NULL) { + if (dib->init_state & DIBUSB_STATE_URB_LIST) { for (i = 0; i < dib->dibdev->parm->num_urbs; i++) { if (dib->urb_list[i] != NULL) { deb_info("killing URB no. %d.\n",i); @@ -208,10 +213,15 @@ int dibusb_usb_exit(struct usb_dibusb *dib) } /* free the urb array */ kfree(dib->urb_list); + dib->init_state &= ~DIBUSB_STATE_URB_SUBMIT; + dib->init_state &= ~DIBUSB_STATE_URB_LIST; } - - pci_free_consistent(NULL, - dib->dibdev->parm->urb_buf_size*dib->dibdev->parm->num_urbs,dib->buffer, - dib->dma_handle); + + if (dib->init_state & DIBUSB_STATE_URB_BUF) + pci_free_consistent(NULL, + dib->dibdev->parm->urb_buf_size*dib->dibdev->parm->num_urbs, + dib->buffer,dib->dma_handle); + + dib->init_state &= ~DIBUSB_STATE_URB_BUF; return 0; } |