summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c')
-rw-r--r--linux/drivers/media/dvb/dibusb/dvb-dibusb-usb.c26
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;
}