* [PATCH] Add support for sq905 based cameras to gspca
@ 2009-01-19 23:22 Adam Baker
2009-01-20 3:33 ` Alexey Klimov
` (2 more replies)
0 siblings, 3 replies; 28+ messages in thread
From: Adam Baker @ 2009-01-19 23:22 UTC (permalink / raw)
To: Jean-Francois Moine, linux-media; +Cc: kilgota, Driver Development
Add initial support for cameras based on the SQ Technologies SQ-905
chipset (USB ID 2770:9120) to V4L2 using the gspca infrastructure.
Currently only supports one resolution and doesn't attempt to inform
libv4l what image flipping options are needed.
Signed-off-by: Adam Baker <linux@baker-net.org.uk>
Signed-off-by: Theodore Kilgore <kilgota@auburn.edu>
---
Following all the comments when I posted this for review Theodore and I have
produced 2 new versions. The most critical comment last time was that we
were using the system work queue inappropriately so this version creates
its own work queue. The alternative version that I will post shortly avoids a
work queue altogether by using asynchronous USB commands but in order to
do so has increased the code size.
I'll leave it to the assembled list expertise to say which option is preferable.
I think we've included all of Hans de Goede's review suggestions and most
of Alexey Klimov's, the exception being about the format of the camera ID debug
message which I have other plans for once we can actually make use of
that info.
---
diff -r c1ebc0e03fa1 linux/drivers/media/video/gspca/Kconfig
--- a/linux/drivers/media/video/gspca/Kconfig Sun Jan 18 18:24:52 2009 +0100
+++ b/linux/drivers/media/video/gspca/Kconfig Mon Jan 19 22:59:24 2009 +0000
@@ -176,6 +176,15 @@ config USB_GSPCA_SPCA561
To compile this driver as a module, choose M here: the
module will be called gspca_spca561.
+config USB_GSPCA_SQ905
+ tristate "SQ Technologies SQ905 based USB Camera Driver"
+ depends on VIDEO_V4L2 && USB_GSPCA
+ help
+ Say Y here if you want support for cameras based on the SQ905 chip.
+
+ To compile this driver as a module, choose M here: the
+ module will be called gspca_sq905.
+
config USB_GSPCA_STK014
tristate "Syntek DV4000 (STK014) USB Camera Driver"
depends on VIDEO_V4L2 && USB_GSPCA
diff -r c1ebc0e03fa1 linux/drivers/media/video/gspca/Makefile
--- a/linux/drivers/media/video/gspca/Makefile Sun Jan 18 18:24:52 2009 +0100
+++ b/linux/drivers/media/video/gspca/Makefile Mon Jan 19 22:59:24 2009 +0000
@@ -16,6 +16,7 @@ obj-$(CONFIG_USB_GSPCA_SPCA506) += gspc
obj-$(CONFIG_USB_GSPCA_SPCA506) += gspca_spca506.o
obj-$(CONFIG_USB_GSPCA_SPCA508) += gspca_spca508.o
obj-$(CONFIG_USB_GSPCA_SPCA561) += gspca_spca561.o
+obj-$(CONFIG_USB_GSPCA_SQ905) += gspca_sq905.o
obj-$(CONFIG_USB_GSPCA_SUNPLUS) += gspca_sunplus.o
obj-$(CONFIG_USB_GSPCA_STK014) += gspca_stk014.o
obj-$(CONFIG_USB_GSPCA_T613) += gspca_t613.o
@@ -41,6 +42,7 @@ gspca_spca506-objs := spca506.o
gspca_spca506-objs := spca506.o
gspca_spca508-objs := spca508.o
gspca_spca561-objs := spca561.o
+gspca_sq905-objs := sq905.o
gspca_stk014-objs := stk014.o
gspca_sunplus-objs := sunplus.o
gspca_t613-objs := t613.o
diff -r c1ebc0e03fa1 linux/drivers/media/video/gspca/sq905.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux/drivers/media/video/gspca/sq905.c Mon Jan 19 22:59:24 2009 +0000
@@ -0,0 +1,410 @@
+/*
+ * SQ905 subdriver
+ *
+ * Copyright (C) 2008, 2009 Adam Baker and Theodore Kilgore
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * History and Acknowledgments
+ *
+ * The original Linux driver for SQ905 based cameras was written by
+ * Marcell Lengyel and furter developed by many other contributers
+ * and is available from http://sourceforge.net/projects/sqcam/
+ *
+ * This driver takes advantage of the reverse engineering work done for
+ * that driver and for libgphoto2 but shares no code with them.
+ *
+ * This driver has used as a base the finepix driver and other gspca
+ * based drivers and may still contain code fragments taken from those
+ * drivers.
+ */
+
+#define MODULE_NAME "sq905"
+
+#include <linux/workqueue.h>
+#include "gspca.h"
+
+MODULE_AUTHOR("Adam Baker <linux@baker-net.org.uk>, "
+ "Theodore Kilgore <kilgota@auburn.edu>");
+MODULE_DESCRIPTION("GSPCA/SQ905 USB Camera Driver");
+MODULE_LICENSE("GPL");
+
+/* Default timeouts, in ms */
+#define SQ905_CMD_TIMEOUT 500
+#define SQ905_DATA_TIMEOUT 250
+
+/* Maximum transfer size to use. */
+#define SQ905_MAX_TRANSFER 0x8000
+#define FRAME_HEADER_LEN 64
+
+/* The known modes, or registers. These go in the "value" slot. */
+
+/* 00 is "none" obviously */
+
+#define SQ905_BULK_READ 0x03 /* precedes any bulk read */
+#define SQ905_COMMAND 0x06 /* precedes the command codes below */
+#define SQ905_PING 0x07 /* when reading an "idling" command */
+#define SQ905_READ_DONE 0xc0 /* ack bulk read completed */
+
+/* Some command codes. These go in the "index" slot. */
+
+#define SQ905_ID 0xf0 /* asks for model string */
+#define SQ905_CONFIG 0x20 /* gets photo alloc. table, not used here */
+#define SQ905_DATA 0x30 /* accesses photo data, not used here */
+#define SQ905_CLEAR 0xa0 /* clear everything */
+#define SQ905_CAPTURE_LOW 0x60 /* Starts capture at 160x120 */
+#define SQ905_CAPTURE_MED 0x61 /* Starts capture at 320x240 */
+/* note that the capture command also controls the output dimensions */
+/* 0x60 -> 160x120, 0x61 -> 320x240 0x62 -> 640x480 depends on camera */
+/* 0x62 is not correct, at least for some cams. Should be 0x63 ? */
+
+
+
+/* Structure to hold all of our device specific stuff */
+struct sd {
+ struct gspca_dev gspca_dev; /* !! must be the first item */
+
+ enum {
+ SQ905_MODEL_DEFAULT,
+ SQ905_MODEL_POCK_CAM,
+ SQ905_MODEL_MAGPIX
+ } cam_model;
+
+ /*
+ * Driver stuff
+ */
+ __u8 *buffer;
+ struct work_struct work_struct;
+ struct workqueue_struct *work_thread;
+ struct completion can_close;
+ int streaming;
+};
+
+/* The driver only supports 320x240 so far. */
+static struct v4l2_pix_format sq905_mode[1] = {
+ { 320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
+ .bytesperline = 320,
+ .sizeimage = 320 * 240,
+ .colorspace = V4L2_COLORSPACE_SRGB,
+ .priv = 0}
+};
+
+/*
+ * Send a command to the camera - this function, sq905_ack_frame and
+ * sq905_read_data must only be called from start / stop or init
+ * when not streaming or from the streaming thread when streaming to avoid
+ * a race on accessing usb_buf.
+ */
+static int sq905_command(struct gspca_dev *gspca_dev, __u16 index)
+{
+ int ret;
+ gspca_dev->usb_buf[0] = '\0';
+ ret = usb_control_msg(gspca_dev->dev,
+ usb_sndctrlpipe(gspca_dev->dev, 0),
+ USB_REQ_SYNCH_FRAME, /* request */
+ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ SQ905_COMMAND, index, gspca_dev->usb_buf, 1,
+ SQ905_CMD_TIMEOUT);
+ if (ret != 1) {
+ PDEBUG(D_ERR, "%s: usb_control_msg failed (%d)",
+ __func__, ret);
+ return -EIO;
+ }
+
+ ret = usb_control_msg(gspca_dev->dev,
+ usb_sndctrlpipe(gspca_dev->dev, 0),
+ USB_REQ_SYNCH_FRAME, /* request */
+ USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ SQ905_PING, 0, gspca_dev->usb_buf, 1,
+ SQ905_CMD_TIMEOUT);
+ if (ret != 1) {
+ PDEBUG(D_ERR, "%s: usb_control_msg failed 2 (%d)",
+ __func__, ret);
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * Acknowledge the end of a frame - see warning on sq905_command.
+ */
+static int sq905_ack_frame(struct gspca_dev *gspca_dev)
+{
+ int ret;
+ gspca_dev->usb_buf[0] = '\0';
+ ret = usb_control_msg(gspca_dev->dev,
+ usb_sndctrlpipe(gspca_dev->dev, 0),
+ USB_REQ_SYNCH_FRAME, /* request */
+ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ SQ905_READ_DONE, 0, gspca_dev->usb_buf, 1,
+ SQ905_CMD_TIMEOUT);
+ if (ret != 1) {
+ PDEBUG(D_ERR, "%s: usb_control_msg failed (%d)", __func__, ret);
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * request and read a block of data - see warning on sq905_command.
+ */
+static int
+sq905_read_data(struct gspca_dev *gspca_dev, __u8 *data, int size)
+{
+ int ret;
+ int act_len;
+
+ if (!data) {
+ PDEBUG(D_ERR, "%s: data pointer was NULL\n", __func__);
+ return -EINVAL;
+ }
+
+ gspca_dev->usb_buf[0] = '\0';
+ ret = usb_control_msg(gspca_dev->dev,
+ usb_sndctrlpipe(gspca_dev->dev, 0),
+ USB_REQ_SYNCH_FRAME, /* request */
+ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ SQ905_BULK_READ, size, gspca_dev->usb_buf,
+ 1, SQ905_CMD_TIMEOUT);
+ if (ret != 1) {
+ PDEBUG(D_ERR, "%s: usb_control_msg failed (%d)", __func__, ret);
+ return -EIO;
+ }
+ ret = usb_bulk_msg(gspca_dev->dev,
+ usb_rcvbulkpipe(gspca_dev->dev, 0x81),
+ data, size, &act_len, SQ905_DATA_TIMEOUT);
+ /* successful, it returns 0, otherwise negative */
+ if ((ret != 0) || (act_len != size)) {
+ PDEBUG(D_ERR, "%s: bulk read fail (%d) len %d/%d",
+ __func__, ret, act_len, size);
+ return -EIO;
+ }
+ return 0;
+}
+
+/* This function is called as a workqueue function and runs whenever the camera
+ * is streaming data. Because it is a workqueue function it is allowed to sleep
+ * so we can use synchronous USB calls. There appears to be no reason to
+ * terminate before we stop streaming.
+ */
+static void sq905_dostream(struct work_struct *work)
+{
+ struct sd *dev = container_of(work, struct sd, work_struct);
+ struct gspca_frame *frame;
+ int bytes_left; /* bytes remaining in current frame. */
+ int data_len; /* size to use for the next read. */
+ int header_read; /* true if we have already read the frame header. */
+ int discarding; /* true if we failed to get space for frame. */
+ int packet_type;
+ __u8 *data;
+
+ while ((dev->gspca_dev.present) && (dev->streaming)) {
+ /* request some data and then read it until we have
+ * a complete frame. */
+ bytes_left = sq905_mode[0].sizeimage + FRAME_HEADER_LEN;
+ header_read = 0;
+ discarding = 0;
+
+ while (bytes_left > 0) {
+ data_len = bytes_left > SQ905_MAX_TRANSFER ?
+ SQ905_MAX_TRANSFER : bytes_left;
+ if (sq905_read_data(&dev->gspca_dev, dev->buffer,
+ data_len) == 0) {
+ PDEBUG(D_STREAM,
+ "Got %d bytes out of %d for frame",
+ data_len, bytes_left);
+ bytes_left -= data_len;
+ data = dev->buffer;
+ if (!header_read) {
+ packet_type = FIRST_PACKET;
+ /* The first 64 bytes of each frame are
+ * a header full of FF 00 bytes */
+ data += FRAME_HEADER_LEN;
+ data_len -= FRAME_HEADER_LEN;
+ header_read = 1;
+ } else if (bytes_left == 0) {
+ packet_type = LAST_PACKET;
+ } else {
+ packet_type = INTER_PACKET;
+ }
+ frame = gspca_get_i_frame(&dev->gspca_dev);
+ if (frame && !discarding)
+ gspca_frame_add(&dev->gspca_dev,
+ packet_type, frame,
+ data, data_len);
+ else
+ discarding = 1;
+ } else {
+ /* shut down if we got a USB error. */
+ dev->streaming = 0;
+ goto quit_stream;
+ }
+ }
+ /* acknowledge the frame */
+ sq905_ack_frame(&dev->gspca_dev);
+ }
+quit_stream:
+ complete(&dev->can_close);
+}
+
+/* this function is called at probe time */
+static int sd_config(struct gspca_dev *gspca_dev,
+ const struct usb_device_id *id)
+{
+ struct cam *cam = &gspca_dev->cam;
+
+ cam->cam_mode = sq905_mode;
+ cam->nmodes = 1;
+ /* We don't use the buffer gspca allocates so make it small. */
+ cam->bulk_size = 64;
+ return 0;
+}
+
+/* Stop streaming and free the resources allocated by sd_start. */
+static void sd_stopN(struct gspca_dev *gspca_dev)
+{
+ struct sd *dev = (struct sd *) gspca_dev;
+
+ dev->streaming = 0;
+
+ /* wait for the work queue to terminate */
+ wait_for_completion(&dev->can_close);
+}
+
+/* called on streamoff with alt 0 and disconnect */
+static void sd_stop0(struct gspca_dev *gspca_dev)
+{
+ struct sd *dev = (struct sd *) gspca_dev;
+ sq905_command(gspca_dev, SQ905_CLEAR);
+ kfree(dev->buffer);
+ destroy_workqueue(dev->work_thread);
+ dev->work_thread = NULL;
+}
+
+/* this function is called at probe and resume time */
+static int sd_init(struct gspca_dev *gspca_dev)
+{
+ struct sd *dev = (struct sd *) gspca_dev;
+ dev->work_thread = NULL;
+ INIT_WORK(&dev->work_struct, sq905_dostream);
+
+ /* connect to the camera and read
+ * the model ID and process that and put it away.
+ */
+ sq905_command(gspca_dev, SQ905_CLEAR);
+ sq905_command(gspca_dev, SQ905_ID);
+ sq905_read_data(gspca_dev, gspca_dev->usb_buf, 4);
+ sq905_command(gspca_dev, SQ905_CLEAR);
+ if (!memcmp(gspca_dev->usb_buf, "\x09\x05\x01\x19", 4)) {
+ dev->cam_model = SQ905_MODEL_POCK_CAM;
+ PDEBUG(D_CONF, "Model is SQ905_MODEL_POCK_CAM");
+ } else if (!memcmp(gspca_dev->usb_buf, "\x09\x05\x01\x32", 4)) {
+ dev->cam_model = SQ905_MODEL_MAGPIX;
+ PDEBUG(D_CONF, "Model is SQ905_MODEL_MAGPIX");
+ } else {
+ dev->cam_model = SQ905_MODEL_DEFAULT;
+ PDEBUG(D_CONF, "Model is SQ905_MODEL_DEFAULT");
+ }
+ return 0;
+}
+
+/* Set up for getting frames. */
+static int sd_start(struct gspca_dev *gspca_dev)
+{
+ struct sd *dev = (struct sd *) gspca_dev;
+
+ /* Various initializations. */
+ dev->buffer = kmalloc(SQ905_MAX_TRANSFER, GFP_KERNEL | GFP_DMA);
+ if (!dev->buffer) {
+ PDEBUG(D_ERR, "%s: Couldn't allocate USB buffer\n", __func__);
+ return -ENOMEM;
+ }
+ init_completion(&dev->can_close);
+ dev->streaming = 1;
+
+ /* "Open the shutter" and set size, to start capture */
+ if (sq905_command(gspca_dev, SQ905_CAPTURE_MED)) {
+ PDEBUG(D_ERR, "%s: start streaming command failed\n",
+ __func__);
+ dev->streaming = 0;
+ return -EIO;
+ }
+ /* Start the workqueue function to do the streaming */
+ BUG_ON(dev->work_thread);
+ dev->work_thread = create_workqueue(MODULE_NAME);
+ queue_work(dev->work_thread, &dev->work_struct);
+
+ return 0;
+}
+
+/* Table of supported USB devices */
+static const __devinitdata struct usb_device_id device_table[] = {
+ {USB_DEVICE(0x2770, 0x9120)},
+ {}
+};
+
+MODULE_DEVICE_TABLE(usb, device_table);
+
+/* sub-driver description */
+static const struct sd_desc sd_desc = {
+ .name = MODULE_NAME,
+ .config = sd_config,
+ .init = sd_init,
+ .start = sd_start,
+ .stopN = sd_stopN,
+ .stop0 = sd_stop0,
+};
+
+/* -- device connect -- */
+static int sd_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+ return gspca_dev_probe(intf, id,
+ &sd_desc,
+ sizeof(struct sd),
+ THIS_MODULE);
+}
+
+static struct usb_driver sd_driver = {
+ .name = MODULE_NAME,
+ .id_table = device_table,
+ .probe = sd_probe,
+ .disconnect = gspca_disconnect,
+#ifdef CONFIG_PM
+ .suspend = gspca_suspend,
+ .resume = gspca_resume,
+#endif
+};
+
+/* -- module insert / remove -- */
+static int __init sd_mod_init(void)
+{
+ if (usb_register(&sd_driver) < 0)
+ return -1;
+ PDEBUG(D_PROBE, "registered");
+ return 0;
+}
+static void __exit sd_mod_exit(void)
+{
+ usb_deregister(&sd_driver);
+ PDEBUG(D_PROBE, "deregistered");
+}
+
+module_init(sd_mod_init);
+module_exit(sd_mod_exit);
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-01-19 23:22 [PATCH] Add support for sq905 based cameras to gspca Adam Baker @ 2009-01-20 3:33 ` Alexey Klimov 2009-01-21 17:20 ` Jean-Francois Moine [not found] ` <200901272101.27451.linux@baker-net.org.uk> 2 siblings, 0 replies; 28+ messages in thread From: Alexey Klimov @ 2009-01-20 3:33 UTC (permalink / raw) To: Adam Baker; +Cc: Jean-Francois Moine, linux-media, kilgota, Driver Development Hello, Adam May i add small note if you don't mind ? On Mon, 2009-01-19 at 23:22 +0000, Adam Baker wrote: <snip> > +/* -- module insert / remove -- */ > +static int __init sd_mod_init(void) > +{ > + if (usb_register(&sd_driver) < 0) > + return -1; > + PDEBUG(D_PROBE, "registered"); > + return 0; > +} > +static void __exit sd_mod_exit(void) > +{ > + usb_deregister(&sd_driver); > + PDEBUG(D_PROBE, "deregistered"); > +} May be it's better for CodingStyle if sd_mod_init will look like this: static int __init sd_mod_init(void) { int ret; ret = usb_register(&sd_driver); if (ret < 0) return ret; PDEBUG(D_PROBE, "registered"); return 0; } ? > +module_init(sd_mod_init); > +module_exit(sd_mod_exit); > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Best regards, Klimov Alexey ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-01-19 23:22 [PATCH] Add support for sq905 based cameras to gspca Adam Baker 2009-01-20 3:33 ` Alexey Klimov @ 2009-01-21 17:20 ` Jean-Francois Moine 2009-01-21 19:10 ` kilgota 2009-01-22 4:17 ` Why not to try to combine sq905 and sq kilgota [not found] ` <200901272101.27451.linux@baker-net.org.uk> 2 siblings, 2 replies; 28+ messages in thread From: Jean-Francois Moine @ 2009-01-21 17:20 UTC (permalink / raw) To: Adam Baker, kilgota; +Cc: linux-media, Driver Development, Gerard Klaver On Mon, 19 Jan 2009 23:22:33 +0000 Adam Baker <linux@baker-net.org.uk> wrote: > Add initial support for cameras based on the SQ Technologies SQ-905 > chipset (USB ID 2770:9120) to V4L2 using the gspca infrastructure. [snip] > --- > Following all the comments when I posted this for review Theodore and > I have produced 2 new versions. The most critical comment last time > was that we were using the system work queue inappropriately so this > version creates its own work queue. The alternative version that I > will post shortly avoids a work queue altogether by using > asynchronous USB commands but in order to do so has increased the > code size. > > I'll leave it to the assembled list expertise to say which option is > preferable. [snip] Hello Adam and Theodore, I looked at your two versions, and I think the first one (work queue) is the simplest. So, I am ready to put your driver in my repository for inclusion in a next linux kernel. I have just a few remarks and a request. - There are still small CodingStyle errors. - Why do you need the function name in the debug messages? - In sd_init, you should better convert the 4 bytes to u32 and do a switch. - On disconnection, the function sd_stopN is not called, so the workqueue may be still running. - At streamon time (sd_start), you allocate the buffer and send a command. This may be done in the workqueue function. This function may also do the buffer free and send the stop command on exit. Re-thinking the streaming part gives: . streamon (sd_start) . init_completion() . start the workqueue (dev->streaming is not useful) . workqueue function . allocate the transfer buffer (pointer in the stack) . send 'start capture' . read loop - don't forget: - to test gspca_dev->streaming: it may be streamoff, close or disconnect - to protect to usb_control_msg by the gspca_dev->usb_lock mutex: this will permit to handle future webcam controls. . on streamoff or USB error . free the transfer buffer . complete() . streamoff . sd_stopN: non useful . sd_stop0: . wait_for_completion . dev->work_thread = NULL Now, the request: some guys asked for support of their webcams based on sq930x chips. A SANE backend driver exists, written by Gerard Klaver (http://gkall.hobby.nl/sq930x.html). May you have a look and say if handling these chips may be done in your driver? Regards. -- Ken ar c'hentañ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-01-21 17:20 ` Jean-Francois Moine @ 2009-01-21 19:10 ` kilgota 2009-01-22 4:17 ` Why not to try to combine sq905 and sq kilgota 1 sibling, 0 replies; 28+ messages in thread From: kilgota @ 2009-01-21 19:10 UTC (permalink / raw) To: Jean-Francois Moine Cc: Adam Baker, linux-media, Driver Development, Gerard Klaver On Wed, 21 Jan 2009, Jean-Francois Moine wrote: <snip> > Hello Adam and Theodore, > > I looked at your two versions, and I think the first one (work queue) > is the simplest. So, I am ready to put your driver in my repository for > inclusion in a next linux kernel. Thank you. > > I have just a few remarks and a request. The remarks need close attention, which will be applied. Thank you again for attention to detail. The request I can deal with right now. > Now, the request: some guys asked for support of their webcams based on > sq930x chips. A SANE backend driver exists, written by Gerard Klaver > (http://gkall.hobby.nl/sq930x.html). > May you have a look and say if handling these chips may be done in your > driver? In a word, no. Sorry. The only real resemblance of either of these devices to the other is that they share the same Vendor number. Now, thanks again for the comments. Adam and I will get busy on them. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Why not to try to combine sq905 and sq 2009-01-21 17:20 ` Jean-Francois Moine 2009-01-21 19:10 ` kilgota @ 2009-01-22 4:17 ` kilgota 1 sibling, 0 replies; 28+ messages in thread From: kilgota @ 2009-01-22 4:17 UTC (permalink / raw) To: Jean-Francois Moine Cc: Adam Baker, linux-media, Driver Development, Gerard Klaver On Wed, 21 Jan 2009, Jean-Francois Moine wrote: (previous material covered a different topic) > Now, the request: some guys asked for support of their webcams based on > sq930x chips. A SANE backend driver exists, written by Gerard Klaver > (http://gkall.hobby.nl/sq930x.html). > May you have a look and say if handling these chips may be done in your > driver? I am sorry to have been rather brief about this one in my previous message, but I am quite serious in saying "no." Clearly it is always possible somehow to jam-fit the support for two or more very different devices into one block of code. One would require some kind of branching at every logical step in the code, and nobody would be able to read it and make sense of that code, or to maintain it. In this present case of the sq930x, I did look at Gerard's information. Indeed, the very structure of the commands is different from the commands for the sq905 and for that matter from the sq905c cameras, with both of which I am intimately familiar. A mere glance at the file creative protocol I420.txt at Gerard's web page suffices to show that the command sequences are completely different. One can add to this that the frames are JPEG, whereas the frames for the sq905 are uncompressed bitmap data. I would be glad to help with the sq930x if there is any help I can give and if the help is wanted. Anyone who wants me to do that should just ask. But that is a totally different matter from trying to glue together the support for two very unlike devices in one driver module, apparently for the reason that the two devices share the same Vendor number. As a very relevant analogy, permit me to say that I wrote the driver in libgphoto2 for the Logitech Clicksmart 310 camera. When it became clear that this is yet another spca50x camera, I contacted the person who had written the unified spca50x driver for libgphoto2 and asked him if, because of this, he wanted this new spca5x camera to be included there. I sent him my code. He looked at it, and he said to leave it as a separate driver. In spite of using the same chipset, the camera was just too different. He further added that he was sorry he had tried to put so many cameras into one driver in the first place, had learned a lesson from the experience, and if he had it to do over again he would not. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
[parent not found: <200901272101.27451.linux@baker-net.org.uk>]
[parent not found: <alpine.LNX.2.00.0901271543560.21122@banach.math.auburn.edu>]
[parent not found: <200901272228.42610.linux@baker-net.org.uk>]
[parent not found: <20090128113540.25536301@free.fr>]
[parent not found: <alpine.LNX.2.00.0901281554500.22748@banach.math.auburn.edu>]
[parent not found: <20090131203650.36369153@free.fr>]
[parent not found: <alpine.LNX.2.00.0902022032230.1080@banach.math.auburn.edu>]
* Re: [PATCH] Add support for sq905 based cameras to gspca [not found] ` <alpine.LNX.2.00.0902022032230.1080@banach.math.auburn.edu> @ 2009-02-03 9:39 ` Jean-Francois Moine 2009-02-03 17:30 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: Jean-Francois Moine @ 2009-02-03 9:39 UTC (permalink / raw) To: kilgota, Adam Baker; +Cc: linux-media, Alan Stern On Mon, 2 Feb 2009 20:36:31 -0600 (CST) kilgota@banach.math.auburn.edu wrote: > Just now when I logged in, a fortune came up which says: > > "A little experience often upsets a lot of theory." > > It struck me funny after our recent experiences, so I thought I would > share it with both of you. Hello, May be this message made me to look again at the gspca code. Well, it's my fault: I did not check the previous patch. Sorry for all trouble. The patch is simply: diff -r 3f4a7bc53d8e linux/drivers/media/video/gspca/gspca.c --- a/linux/drivers/media/video/gspca/gspca.c Mon Feb 02 20:25:38 2009 +0100 +++ b/linux/drivers/media/video/gspca/gspca.c Tue Feb 03 10:37:51 2009 +0100 @@ -435,7 +435,7 @@ break; gspca_dev->urb[i] = NULL; - if (!gspca_dev->present) + if (gspca_dev->present) usb_kill_urb(urb); if (urb->transfer_buffer != NULL) usb_buffer_free(gspca_dev->dev, Best regards. -- Ken ar c'hentan | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 9:39 ` [PATCH] Add support for sq905 based cameras to gspca Jean-Francois Moine @ 2009-02-03 17:30 ` kilgota 2009-02-03 18:21 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-03 17:30 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > On Mon, 2 Feb 2009 20:36:31 -0600 (CST) > kilgota@banach.math.auburn.edu wrote: >> Just now when I logged in, a fortune came up which says: >> >> "A little experience often upsets a lot of theory." >> >> It struck me funny after our recent experiences, so I thought I would >> share it with both of you. > > Hello, > > May be this message made me to look again at the gspca code. Well, it's > my fault: I did not check the previous patch. Sorry for all trouble. > > The patch is simply: > > diff -r 3f4a7bc53d8e linux/drivers/media/video/gspca/gspca.c > --- a/linux/drivers/media/video/gspca/gspca.c Mon Feb 02 20:25:38 2009 +0100 > +++ b/linux/drivers/media/video/gspca/gspca.c Tue Feb 03 10:37:51 2009 +0100 > @@ -435,7 +435,7 @@ > break; > > gspca_dev->urb[i] = NULL; > - if (!gspca_dev->present) > + if (gspca_dev->present) > usb_kill_urb(urb); > if (urb->transfer_buffer != NULL) > usb_buffer_free(gspca_dev->dev, > Well, OK. But this will solve the problem which comes from disconnect while streaming? Sure, I will try this and see if it does the job or not. But whatever the outcome of that might be, I do not follow the logic. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 17:30 ` kilgota @ 2009-02-03 18:21 ` kilgota 2009-02-03 18:13 ` Jean-Francois Moine 0 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-03 18:21 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009, kilgota@banach.math.auburn.edu wrote: > > > On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > >> On Mon, 2 Feb 2009 20:36:31 -0600 (CST) >> kilgota@banach.math.auburn.edu wrote: >>> Just now when I logged in, a fortune came up which says: >>> >>> "A little experience often upsets a lot of theory." >>> >>> It struck me funny after our recent experiences, so I thought I would >>> share it with both of you. >> >> Hello, >> >> May be this message made me to look again at the gspca code. Well, it's >> my fault: I did not check the previous patch. Sorry for all trouble. >> >> The patch is simply: >> >> diff -r 3f4a7bc53d8e linux/drivers/media/video/gspca/gspca.c >> --- a/linux/drivers/media/video/gspca/gspca.c Mon Feb 02 20:25:38 2009 >> +0100 >> +++ b/linux/drivers/media/video/gspca/gspca.c Tue Feb 03 10:37:51 2009 >> +0100 >> @@ -435,7 +435,7 @@ >> break; >> >> gspca_dev->urb[i] = NULL; >> - if (!gspca_dev->present) >> + if (gspca_dev->present) >> usb_kill_urb(urb); >> if (urb->transfer_buffer != NULL) >> usb_buffer_free(gspca_dev->dev, >> > > Well, OK. But this will solve the problem which comes from disconnect while > streaming? Sure, I will try this and see if it does the job or not. But > whatever the outcome of that might be, I do not follow the logic. > > Theodore Kilgore I should add to the above that now I have tested, and indeed this change does not solve the problem of kernel oops after disconnect while streaming. It does make one change. The xterm does not go wild with error messages. But it is still not possible to close the svv window. Moreover, ps ax reveals that [svv] is running as an unkillable process, with [sq905/0] and [sq905/1], equally unkillable, in supporting roles. And dmesg reveals an oops. The problem is after all notorious by now, so I do not see much need for yet another log of debug output unless specifically asked for such. Perhaps we also need to do what Adam suggested yesterday, and add a call to destroy_urbs() in gspca_disconnect()? That really did appear to cure the problem. But the way I did it is void gspca_disconnect(struct usb_interface *intf) { struct gspca_dev *gspca_dev = usb_get_intfdata(intf); gspca_dev->present = 0; destroy_urbs(gspca_dev); usb_set_intfdata(intf, NULL); /* release the device */ /* (this will call gspca_release() immediatly or on last close) */ video_unregister_device(&gspca_dev->vdev); PDEBUG(D_PROBE, "disconnect complete"); } and it would appear that with your changes above it would work better to do here first destroy_urbs(gspca_dev); and then only after that gspca_dev->present = 0; Or? Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 18:21 ` kilgota @ 2009-02-03 18:13 ` Jean-Francois Moine 2009-02-03 19:15 ` kilgota ` (2 more replies) 0 siblings, 3 replies; 28+ messages in thread From: Jean-Francois Moine @ 2009-02-03 18:13 UTC (permalink / raw) To: kilgota; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009 12:21:55 -0600 (CST) kilgota@banach.math.auburn.edu wrote: > I should add to the above that now I have tested, and indeed this > change does not solve the problem of kernel oops after disconnect > while streaming. It does make one change. The xterm does not go wild > with error messages. But it is still not possible to close the svv > window. Moreover, ps ax reveals that [svv] is running as an > unkillable process, with [sq905/0] and [sq905/1], equally unkillable, > in supporting roles. And dmesg reveals an oops. The problem is after > all notorious by now, so I do not see much need for yet another log > of debug output unless specifically asked for such. Why is there 2 sq905 processes? What is the oops? (Your last trace was good, because it gave the last gspca/sq905 messages and the full oops) > Perhaps we also need to do what Adam suggested yesterday, and add a > call to destroy_urbs() in gspca_disconnect()? Surely not! The destroy_urbs() must be called at the right time, i.e. on close(). -- Ken ar c'hentan | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 18:13 ` Jean-Francois Moine @ 2009-02-03 19:15 ` kilgota 2009-02-03 19:23 ` Jean-Francois Moine 2009-02-03 19:42 ` kilgota 2009-02-03 19:53 ` Alan Stern 2 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-03 19:15 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > On Tue, 3 Feb 2009 12:21:55 -0600 (CST) > kilgota@banach.math.auburn.edu wrote: > >> I should add to the above that now I have tested, and indeed this >> change does not solve the problem of kernel oops after disconnect >> while streaming. It does make one change. The xterm does not go wild >> with error messages. But it is still not possible to close the svv >> window. Moreover, ps ax reveals that [svv] is running as an >> unkillable process, with [sq905/0] and [sq905/1], equally unkillable, >> in supporting roles. And dmesg reveals an oops. The problem is after >> all notorious by now, so I do not see much need for yet another log >> of debug output unless specifically asked for such. > > Why is there 2 sq905 processes? I of course do not fully understand why there are two such processes. However, I would suspect that [sq905/0] is running on processor 0 and [sq905/1] is running on processor 1. As I remember, there is only one [sq905] process which runs on a single-core machine. > > What is the oops? (Your last trace was good, because it gave the last > gspca/sq905 messages and the full oops) Well, I can do it again, I suppose. So you get that in a few minutes. But my private speculation is it will look just about like the last one, because the problem is not addressed. > >> Perhaps we also need to do what Adam suggested yesterday, and add a >> call to destroy_urbs() in gspca_disconnect()? > > Surely not! The destroy_urbs() must be called at the right time, i.e. > on close(). Hmmm. well, the problem is that we are down there in a workqueue. We have to force the workqueue to close. I do not see a way to do that, even with the exit routines at the end of the workqueue, if it is not possible to call upon the functions there which will do the job (and it appears to me it is not thus possible, because those gspca functions are not public). And if we try to close the workqueue without doing something like destroy_urbs() as a consequence of a violent disconnect, then the workqueue just does not understand it is supposed to stop and merrily goes on its way in spite of all. Then it can not be closed because it is "busy" talking to a now-nonexistent piece of hardware, and the calling program can not be closed, either, because it is "busy" as well. Unless I get interrupted by something extraneous, I should have a log sent along in a few minutes. God knows, it is easy enough to create one. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:15 ` kilgota @ 2009-02-03 19:23 ` Jean-Francois Moine 2009-02-03 19:54 ` kilgota 2009-02-03 22:09 ` Adam Baker 0 siblings, 2 replies; 28+ messages in thread From: Jean-Francois Moine @ 2009-02-03 19:23 UTC (permalink / raw) To: kilgota; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009 13:15:58 -0600 (CST) kilgota@banach.math.auburn.edu wrote: > > Why is there 2 sq905 processes? > > I of course do not fully understand why there are two such processes. > However, I would suspect that [sq905/0] is running on processor 0 and > [sq905/1] is running on processor 1. As I remember, there is only one > [sq905] process which runs on a single-core machine. Indeed, the problem is there! You must have only one process reading the webcam! I do not see how this can work with these 2 processes... -- Ken ar c'hentan | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:23 ` Jean-Francois Moine @ 2009-02-03 19:54 ` kilgota 2009-02-03 19:47 ` Jean-Francois Moine 2009-02-03 19:59 ` Alan Stern 2009-02-03 22:09 ` Adam Baker 1 sibling, 2 replies; 28+ messages in thread From: kilgota @ 2009-02-03 19:54 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > On Tue, 3 Feb 2009 13:15:58 -0600 (CST) > kilgota@banach.math.auburn.edu wrote: > >>> Why is there 2 sq905 processes? >> >> I of course do not fully understand why there are two such processes. >> However, I would suspect that [sq905/0] is running on processor 0 and >> [sq905/1] is running on processor 1. As I remember, there is only one >> [sq905] process which runs on a single-core machine. > > Indeed, the problem is there! You must have only one process reading the > webcam! I do not see how this can work with these 2 processes... The problem, then, would seem to me to boil down to the question of whether that is up to us. Apparently, a decision like that is not up to us, but rather it is up to the compiler and to the rest of the kernel to decide. Which, incidentally, appears to me to be a very logical way to arrange things. Presumably, a dual- or multi-core machine gives certain advantages, or it ought to, but it also requires certain accommodations. You know, Jean-Francois, in a way it is a lucky accident that I got this machine for Christmas. I would never have fired up the Pentium 4, at least until sometime in the unforeseeable future, because in fact I was getting quite adequate performance out of the old Sempron box. Thus, I would not have been aware of this problem, either. We would have gone right ahead, Adam and I, blissfully ignorant, and published a module which has a flaw on a dual-core machine. So, in spite of the problems I say it is better to face the problems now. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:54 ` kilgota @ 2009-02-03 19:47 ` Jean-Francois Moine 2009-02-03 19:59 ` Alan Stern 1 sibling, 0 replies; 28+ messages in thread From: Jean-Francois Moine @ 2009-02-03 19:47 UTC (permalink / raw) To: kilgota; +Cc: Adam Baker, linux-media, Alan Stern On Tue, 3 Feb 2009 13:54:15 -0600 (CST) kilgota@banach.math.auburn.edu wrote: > > Indeed, the problem is there! You must have only one process > > reading the webcam! I do not see how this can work with these 2 > > processes... > > The problem, then, would seem to me to boil down to the question of > whether that is up to us. Apparently, a decision like that is not up > to us, but rather it is up to the compiler and to the rest of the > kernel to decide. Which, incidentally, appears to me to be a very > logical way to arrange things. Presumably, a dual- or multi-core > machine gives certain advantages, or it ought to, but it also > requires certain accommodations. Yes, a multiprocessor machine is a plus, but, you must run only one process to handle streaming. If you have not seen it yet, this is done changing the line 373 of sq905.c (if I have the same source as yours) from: dev->work_thread = create_workqueue(MODULE_NAME); to dev->work_thread = create_singlethread_workqueue(MODULE_NAME); -- Ken ar c'hentan | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:54 ` kilgota 2009-02-03 19:47 ` Jean-Francois Moine @ 2009-02-03 19:59 ` Alan Stern 2009-02-03 22:23 ` kilgota 1 sibling, 1 reply; 28+ messages in thread From: Alan Stern @ 2009-02-03 19:59 UTC (permalink / raw) To: kilgota; +Cc: Jean-Francois Moine, Adam Baker, linux-media On Tue, 3 Feb 2009 kilgota@banach.math.auburn.edu wrote: > > > On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > > > On Tue, 3 Feb 2009 13:15:58 -0600 (CST) > > kilgota@banach.math.auburn.edu wrote: > > > >>> Why is there 2 sq905 processes? > >> > >> I of course do not fully understand why there are two such processes. > >> However, I would suspect that [sq905/0] is running on processor 0 and > >> [sq905/1] is running on processor 1. As I remember, there is only one > >> [sq905] process which runs on a single-core machine. > > > > Indeed, the problem is there! You must have only one process reading the > > webcam! I do not see how this can work with these 2 processes... > > The problem, then, would seem to me to boil down to the question of > whether that is up to us. Apparently, a decision like that is not up to > us, but rather it is up to the compiler and to the rest of the kernel to > decide. Nonsense. It's simply a matter of how you create your workqueue. In the code you sent me, you call create_workqueue(). Instead, just call create_singlethread_workqueue(). Or maybe even create_freezeable_workqueue(). Alan Stern ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:59 ` Alan Stern @ 2009-02-03 22:23 ` kilgota 2009-02-04 2:02 ` Alan Stern 0 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-03 22:23 UTC (permalink / raw) To: Alan Stern; +Cc: Jean-Francois Moine, Adam Baker, linux-media [-- Attachment #1: Type: TEXT/PLAIN, Size: 2497 bytes --] On Tue, 3 Feb 2009, Alan Stern wrote: > On Tue, 3 Feb 2009 kilgota@banach.math.auburn.edu wrote: > >> >> >> On Tue, 3 Feb 2009, Jean-Francois Moine wrote: >> >>> On Tue, 3 Feb 2009 13:15:58 -0600 (CST) >>> kilgota@banach.math.auburn.edu wrote: >>> >>>>> Why is there 2 sq905 processes? >>>> >>>> I of course do not fully understand why there are two such processes. >>>> However, I would suspect that [sq905/0] is running on processor 0 and >>>> [sq905/1] is running on processor 1. As I remember, there is only one >>>> [sq905] process which runs on a single-core machine. >>> >>> Indeed, the problem is there! You must have only one process reading the >>> webcam! I do not see how this can work with these 2 processes... >> >> The problem, then, would seem to me to boil down to the question of >> whether that is up to us. Apparently, a decision like that is not up to >> us, but rather it is up to the compiler and to the rest of the kernel to >> decide. > > Nonsense. It's simply a matter of how you create your workqueue. In > the code you sent me, you call create_workqueue(). Instead, just call > create_singlethread_workqueue(). Or maybe even > create_freezeable_workqueue(). > > Alan Stern > OK, seems one way out, might even work. I will definitely try that. Update. I did try it. No it does not work, sorry. :/ I changed the line dev->work_thread = create_workqueue(MODULE_NAME); to read dev->work_thread = create_singlethread_workqueue(MODULE_NAME); As a result, I can definitely report that only _two_ processes were frozen when the cord was pulled, named [svv] and [sq905]. I am sure that the attached log file of the oops looks a little bit different from the previous ones. It must, after all. While you have this matter on your mind, I am curious about the following: As the code for the sq905 module evolved through various stages, the only occasion on which any real trouble arose was at the end, when we put in the mutex locks which you can see in the code now. Before they were put in, these problems which we are discussing now did not occur. Specifically, there was not any such problem about an oops caused by camera removal until the mutex locks were put in the code. And I strongly suspect -- nay, I am almost certain -- that with that the same code you are looking at now, the oops would go away if all those mutex locks were simply commented out and the code re-compiled and reinstalled. Can you explain this? I am just curious about why. [-- Attachment #2: Type: APPLICATION/octet-stream, Size: 1476 bytes --] ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 22:23 ` kilgota @ 2009-02-04 2:02 ` Alan Stern 2009-02-04 3:12 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: Alan Stern @ 2009-02-04 2:02 UTC (permalink / raw) To: kilgota; +Cc: Jean-Francois Moine, Adam Baker, linux-media On Tue, 3 Feb 2009 kilgota@banach.math.auburn.edu wrote: > > Nonsense. It's simply a matter of how you create your workqueue. In > > the code you sent me, you call create_workqueue(). Instead, just call > > create_singlethread_workqueue(). Or maybe even > > create_freezeable_workqueue(). > > > > Alan Stern > > > > OK, seems one way out, might even work. I will definitely try that. > > Update. I did try it. > > No it does not work, sorry. :/ Again, nonsense. Of course it works. It causes the kernel to create only one workqueue thread instead of two. That's what it's supposed to do -- it was never intended to fix your oops. > While you have this matter on your mind, I am curious about the following: > > As the code for the sq905 module evolved through various stages, the > only occasion on which any real trouble arose was at the end, when we put > in the mutex locks which you can see in the code now. Before they were put > in, these problems which we are discussing now did not occur. > Specifically, there was not any such problem about an oops caused by > camera removal until the mutex locks were put in the code. And I strongly > suspect -- nay, I am almost certain -- that with that the same code you > are looking at now, the oops would go away if all those mutex locks were > simply commented out and the code re-compiled and reinstalled. Can you > explain this? I am just curious about why. You're wrong, the oops would not go away. It would just become a lot less likely to occur -- and thereby all the more insidious. Alan Stern ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 2:02 ` Alan Stern @ 2009-02-04 3:12 ` kilgota 0 siblings, 0 replies; 28+ messages in thread From: kilgota @ 2009-02-04 3:12 UTC (permalink / raw) To: Alan Stern; +Cc: Jean-Francois Moine, Adam Baker, linux-media On Tue, 3 Feb 2009, Alan Stern wrote: > On Tue, 3 Feb 2009 kilgota@banach.math.auburn.edu wrote: > >>> Nonsense. It's simply a matter of how you create your workqueue. In >>> the code you sent me, you call create_workqueue(). Instead, just call >>> create_singlethread_workqueue(). Or maybe even >>> create_freezeable_workqueue(). >>> >>> Alan Stern >>> >> >> OK, seems one way out, might even work. I will definitely try that. >> >> Update. I did try it. >> >> No it does not work, sorry. :/ > > Again, nonsense. Of course it works. It causes the kernel to create > only one workqueue thread instead of two. OK, yes, it did do that. That's what it's supposed to > do -- it was never intended to fix your oops. OK. > >> While you have this matter on your mind, I am curious about the following: >> >> As the code for the sq905 module evolved through various stages, the >> only occasion on which any real trouble arose was at the end, when we put >> in the mutex locks which you can see in the code now. Before they were put >> in, these problems which we are discussing now did not occur. >> Specifically, there was not any such problem about an oops caused by >> camera removal until the mutex locks were put in the code. And I strongly >> suspect -- nay, I am almost certain -- that with that the same code you >> are looking at now, the oops would go away if all those mutex locks were >> simply commented out and the code re-compiled and reinstalled. Can you >> explain this? I am just curious about why. > > You're wrong, the oops would not go away. It would just become a lot > less likely to occur -- and thereby all the more insidious. How nice. Thanks for explaining. > > Alan Stern > ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 19:23 ` Jean-Francois Moine 2009-02-03 19:54 ` kilgota @ 2009-02-03 22:09 ` Adam Baker 2009-02-03 22:28 ` kilgota ` (2 more replies) 1 sibling, 3 replies; 28+ messages in thread From: Adam Baker @ 2009-02-03 22:09 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: kilgota, linux-media, Alan Stern On Tuesday 03 February 2009, Jean-Francois Moine wrote: > Indeed, the problem is there! You must have only one process reading the > webcam! I do not see how this can work with these 2 processes... Although 2 processes are created only one ever gets used. create_singlethread_workqueue would therefore be less wasteful but make no other difference. Google searches for create_freezeable_workqueue bring up suggestions to avoid it so I think I will although I guess we ought to check at some point how well the camera copes with suspend while streaming. At 19:53:31 Alan Stern wrote > If a camera is unplugged while it is in use then > waiting until close() is no good -- it will cause destroy_urbs() to > pass a stale pointer to usb_buffer_free(). That's the reason for the > oops. I'd go further and suggest that gspca_disconnect should, after calling destroy_urbs() do gspca_dev->dev = NULL; Any use of that pointer past that point is a bug (the downside is that doing so would have turned the current bug into a hard to spot memory leak). At 03:37:35 Alan Stern wrote > On Mon, 2 Feb 2009, Adam Baker wrote: >> This shouldn't be a problem for sq905 (which doesn't use these URBs) or >> isochronous cameras (which don't need to resubmit URBs) but the finepix >> driver (the other supported bulk device) will need some careful >> consideration to avoid a race between killing the URB and resubmitting it. > > You shouldn't need to take any special action. usb_kill_urb() solves > these races for you; it guarantees not to return until the URB has been > unlinked and the completion handler has finished, and it guarantees > that attempts by the completion handler to resubmit the URB will fail. The sq905 driver doesn't use the URBs provided by gspca, it uses usb_control_msg and usb_bulk_msg which I presume do the right thing internally. There would be a tiny window in between when it checks the dev->streaming flag and when it sends a new USB msg for the disconnect to occur and invalidate the dev pointer. That could be fixed by holding gspca_dev->usb_lock in gspca_disconnect when it sets gspca_dev->present = 0. That would also address the race between open and disconnect. Unfortunately the finepix driver sometimes uses calls to schedule_delayed_work in the completion handler which then makes the call to usb_submit_urb. Fixing that will require someone with access to a suitable camera to test it otherwise there is a significant risk of adding deadlocks. It already suffers from this bug so we aren't making it worse. Calling destroy_urbs from dev_close rather than gspca_disconnect could also trigger the same bug on isochronous cameras. I haven't looked at them closely but they probably also have the race between open and disconnect which taking the lock in disconnect is likely to fix. I'll do some testing and post a patch if it looks promising. Adam ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 22:09 ` Adam Baker @ 2009-02-03 22:28 ` kilgota 2009-02-04 1:59 ` Alan Stern 2009-02-04 2:33 ` Andy Walls 2 siblings, 0 replies; 28+ messages in thread From: kilgota @ 2009-02-03 22:28 UTC (permalink / raw) To: Adam Baker; +Cc: Jean-Francois Moine, linux-media, Alan Stern On Tue, 3 Feb 2009, Adam Baker wrote: > On Tuesday 03 February 2009, Jean-Francois Moine wrote: >> Indeed, the problem is there! You must have only one process reading the >> webcam! I do not see how this can work with these 2 processes... > > Although 2 processes are created only one ever gets used. How do you know that? Just curious. > create_singlethread_workqueue would therefore be less wasteful but make no > other difference. In at least one respect, you seem to be right. The oops still occurs. See my previous mail. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 22:09 ` Adam Baker 2009-02-03 22:28 ` kilgota @ 2009-02-04 1:59 ` Alan Stern 2009-02-04 2:33 ` Andy Walls 2 siblings, 0 replies; 28+ messages in thread From: Alan Stern @ 2009-02-04 1:59 UTC (permalink / raw) To: Adam Baker; +Cc: Jean-Francois Moine, kilgota, linux-media On Tue, 3 Feb 2009, Adam Baker wrote: > The sq905 driver doesn't use the URBs provided by gspca, it uses > usb_control_msg and usb_bulk_msg which I presume do the right thing > internally. There would be a tiny window in between when it checks the > dev->streaming flag and when it sends a new USB msg for the disconnect to > occur and invalidate the dev pointer. That could be fixed by holding > gspca_dev->usb_lock in gspca_disconnect when it sets gspca_dev->present = 0. > > That would also address the race between open and disconnect. > > Unfortunately the finepix driver sometimes uses calls to schedule_delayed_work > in the completion handler which then makes the call to usb_submit_urb. Fixing > that will require someone with access to a suitable camera to test it > otherwise there is a significant risk of adding deadlocks. It already suffers > from this bug so we aren't making it worse. If the driver submits URBs from a work routine then usb_kill_urb's guarantees don't apply. You'll need to synchronize all three routines: disconnect, the completion handler, and the work routine. That means you'll have to use a spinlock, since a completion handler isn't allowed to acquire a mutex. Alan Stern ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 22:09 ` Adam Baker 2009-02-03 22:28 ` kilgota 2009-02-04 1:59 ` Alan Stern @ 2009-02-04 2:33 ` Andy Walls 2009-02-04 21:38 ` Adam Baker 2 siblings, 1 reply; 28+ messages in thread From: Andy Walls @ 2009-02-04 2:33 UTC (permalink / raw) To: Adam Baker; +Cc: Jean-Francois Moine, kilgota, linux-media, Alan Stern On Tue, 2009-02-03 at 22:09 +0000, Adam Baker wrote: > On Tuesday 03 February 2009, Jean-Francois Moine wrote: > > Indeed, the problem is there! You must have only one process reading the > > webcam! I do not see how this can work with these 2 processes... > > Although 2 processes are created only one ever gets used. > create_singlethread_workqueue would therefore be less wasteful but make no > other difference. This is generally not the case. There is a single workqueue as far as a driver is concerned. Work items submitted to the queue by the driver are set to be processed by the same CPU submitting the work item (unless you call queue_work_on() to specify the CPU). However, there is no guarantee that the same CPU will be submitting work requests to the workqueue every time. For most drivers this is a moot point though, because they only ever instantiate and submit one work object ever per device. This means the workqueue depth never exceeds 1 for most drivers. So the correct statement would be, I believe, "only one sq905 worker thread ever gets used (per device per capture) at a time in sq905.c" (For the cx18 driver, where the workqueue can have up to 70 items queued for all ongoing capture streams per device, it makes quite a difference on whether a single thread or multiple threads process the work queue. To preserve ordering of the work items, as needed for work orders for moving video buffers from one place to another, a singlethreaded workqueue had to be used.) I did look at the patch as submitted on Jan 19, and do have what I intend to be constructive criticisms (sorry if they're overcome by events by now): Creating and destroying the worker thread(s) at the start and stop of each capture is a bit overkill. It's akin to registering and unregistering a device's interrupt handler before and after every capture, but it's a bit worse overhead-wise. It's probably better to just instantiate the workqueue when the device "appears" (I'm not a USB guy so insert appropraite term there) and destroy the workqueue and worker threads(s) when the device is going to "disappear". Or if it will meet your performance requirements, create and destroy the workqueue when you init and remove the module. The workqueue and its thread(s) are essentially the bottom half of your interrupt handler to handle deferrable work - no point in killing them off until you really don't need them anymore. Also, you've created the workqueue threads with a non-unique name: the expansion of MODULE_NAME. You're basically saying that you only need one workqueue, with it's per CPU thread(s), for all instantiations of an sq905 device - which *can* be a valid design choice. However, you're bringing them up and tearing them down on a per capture basis. That's a problem that needs to be corrected if you intend to support multiple sq905 devices on a single machine. What happens when you attempt to have two sq905 devices do simultaneous captures? I don't know myself; I've never tried to create 2 separate instantiations of a workqueue object with the same name. Regards, Andy ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 2:33 ` Andy Walls @ 2009-02-04 21:38 ` Adam Baker 2009-02-04 22:31 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: Adam Baker @ 2009-02-04 21:38 UTC (permalink / raw) To: Andy Walls; +Cc: Jean-Francois Moine, kilgota, linux-media On Wednesday 04 February 2009, Andy Walls wrote: > On Tue, 2009-02-03 at 22:09 +0000, Adam Baker wrote: > > On Tuesday 03 February 2009, Jean-Francois Moine wrote: > > > Indeed, the problem is there! You must have only one process reading > > > the webcam! I do not see how this can work with these 2 processes... > > > > Although 2 processes are created only one ever gets used. > > create_singlethread_workqueue would therefore be less wasteful but make > > no other difference. > > This is generally not the case. There is a single workqueue as far as a > driver is concerned. Work items submitted to the queue by the driver > are set to be processed by the same CPU submitting the work item (unless > you call queue_work_on() to specify the CPU). However, there is no > guarantee that the same CPU will be submitting work requests to the > workqueue every time. > > For most drivers this is a moot point though, because they only ever > instantiate and submit one work object ever per device. This means the > workqueue depth never exceeds 1 for most drivers. So the correct > statement would be, I believe, "only one sq905 worker thread ever gets > used (per device per capture) at a time in sq905.c" Yes, I did mean only one gets used in the case of sq905.c (because the queue is created per capture and only one item gets submitted to it). <snip> > > I did look at the patch as submitted on Jan 19, and do have what I > intend to be constructive criticisms (sorry if they're overcome by > events by now): > > Creating and destroying the worker thread(s) at the start and stop of > each capture is a bit overkill. It's akin to registering and > unregistering a device's interrupt handler before and after every > capture, but it's a bit worse overhead-wise. It's probably better to > just instantiate the workqueue when the device "appears" (I'm not a USB > guy so insert appropraite term there) and destroy the workqueue and > worker threads(s) when the device is going to "disappear". Or if it > will meet your performance requirements, create and destroy the > workqueue when you init and remove the module. The workqueue and its > thread(s) are essentially the bottom half of your interrupt handler to > handle deferrable work - no point in killing them off until you really > don't need them anymore. > My thought was that the camera was likely to remain plugged in even if it wasn't being used so it was best to clean up as much as possible when it wasn't in use. I don't really know how the overheads of creating a workqueue when you do need it compares to leaving an unused one around sitting on the not ready queue in the process table but starting a capture is going to take many ms just for the USB traffic so a little extra overhead doesn't seem too worrying. > Also, you've created the workqueue threads with a non-unique name: the > expansion of MODULE_NAME. You're basically saying that you only need > one workqueue, with it's per CPU thread(s), for all instantiations of an > sq905 device - which *can* be a valid design choice. However, you're > bringing them up and tearing them down on a per capture basis. That's a > problem that needs to be corrected if you intend to support multiple > sq905 devices on a single machine. What happens when you attempt to > have two sq905 devices do simultaneous captures? I don't know myself; > I've never tried to create 2 separate instantiations of a workqueue > object with the same name. > I see multiple instance of [pdflush] and [nfsd] which seem to work fine so I believe the name doesn't need to be unique, just a guide to the user of what is eating CPU time. I don't have 2 sq905 cameras to test it but I have had left over workqueues caused by a driver bug stopping it shut down and new ones that started also worked fine. > > Regards, > Andy ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 21:38 ` Adam Baker @ 2009-02-04 22:31 ` kilgota 2009-02-04 22:34 ` Adam Baker 0 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-04 22:31 UTC (permalink / raw) To: Adam Baker; +Cc: Andy Walls, Jean-Francois Moine, linux-media On Wed, 4 Feb 2009, Adam Baker wrote: > On Wednesday 04 February 2009, Andy Walls wrote: >> On Tue, 2009-02-03 at 22:09 +0000, Adam Baker wrote: >>> On Tuesday 03 February 2009, Jean-Francois Moine wrote: >>>> Indeed, the problem is there! You must have only one process reading >>>> the webcam! I do not see how this can work with these 2 processes... >>> >>> Although 2 processes are created only one ever gets used. >>> create_singlethread_workqueue would therefore be less wasteful but make >>> no other difference. >> >> This is generally not the case. There is a single workqueue as far as a >> driver is concerned. Work items submitted to the queue by the driver >> are set to be processed by the same CPU submitting the work item (unless >> you call queue_work_on() to specify the CPU). However, there is no >> guarantee that the same CPU will be submitting work requests to the >> workqueue every time. >> >> For most drivers this is a moot point though, because they only ever >> instantiate and submit one work object ever per device. This means the >> workqueue depth never exceeds 1 for most drivers. So the correct >> statement would be, I believe, "only one sq905 worker thread ever gets >> used (per device per capture) at a time in sq905.c" > > Yes, I did mean only one gets used in the case of sq905.c (because the queue > is created per capture and only one item gets submitted to it). > > <snip> >> >> I did look at the patch as submitted on Jan 19, and do have what I >> intend to be constructive criticisms (sorry if they're overcome by >> events by now): >> >> Creating and destroying the worker thread(s) at the start and stop of >> each capture is a bit overkill. It's akin to registering and >> unregistering a device's interrupt handler before and after every >> capture, but it's a bit worse overhead-wise. It's probably better to >> just instantiate the workqueue when the device "appears" (I'm not a USB >> guy so insert appropraite term there) and destroy the workqueue and >> worker threads(s) when the device is going to "disappear". Or if it >> will meet your performance requirements, create and destroy the >> workqueue when you init and remove the module. The workqueue and its >> thread(s) are essentially the bottom half of your interrupt handler to >> handle deferrable work - no point in killing them off until you really >> don't need them anymore. >> > > My thought was that the camera was likely to remain plugged in even if it > wasn't being used so it was best to clean up as much as possible when it > wasn't in use. I don't really know how the overheads of creating a workqueue > when you do need it compares to leaving an unused one around sitting on the > not ready queue in the process table but starting a capture is going to take > many ms just for the USB traffic so a little extra overhead doesn't seem too > worrying. > >> Also, you've created the workqueue threads with a non-unique name: the >> expansion of MODULE_NAME. You're basically saying that you only need >> one workqueue, with it's per CPU thread(s), for all instantiations of an >> sq905 device - which *can* be a valid design choice. However, you're >> bringing them up and tearing them down on a per capture basis. That's a >> problem that needs to be corrected if you intend to support multiple >> sq905 devices on a single machine. What happens when you attempt to >> have two sq905 devices do simultaneous captures? I don't know myself; >> I've never tried to create 2 separate instantiations of a workqueue >> object with the same name. >> > > I see multiple instance of [pdflush] and [nfsd] which seem to work fine so I > believe the name doesn't need to be unique, just a guide to the user of what > is eating CPU time. I don't have 2 sq905 cameras to test it ... Well, I do. Here is what happens: 1. Plugged in one of them, started the streaming. 2. Plugged in the second one. First one continues to stream, no problem. Attempt to start a stream from the second camera while the first one is streaming results in the error message, VIDIOC_REQBUFS error 16, Device or resource busy and the command line reappears. No obvious interference with the stream from the first camera is apparent. 3. After the stream from the first camera is closed, the streaming can be started again. However, the stream is again from the first camera which was plugged in. 4. After removing the first camera which was plugged in, I tried to start the stream from the second one. The stream will not start. A message says that Cannot identify 'dev/video0': 2. No such file or directory. 5. Second camera left attached, first camera plugged in again. The first camera can stream again. The second one can not. 6. When the first camera is removed and the second one is then re-plugged, the second one will stream. So, we can safely conclude that, as the module is presently constituted, there can be only one stream at a time. The second camera plugged in cannot stream. Neither can it conflict with the first one. The only thing which puzzles me a little bit is item 5. Apparently, the question is about which port the camera was connected to. So let's try three cameras. I will hook up camera number one, get a stream, close it, hook up number two through a different port, then remove number one and replace it with number three on the same port where number one was. What I suspected would happen is what happened. Number two would not stream. Number three would stream just as number one did. In other words, this was determined by which port was in use for number one, which is now also in use for number three. So, now we know what happens. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 22:31 ` kilgota @ 2009-02-04 22:34 ` Adam Baker 2009-02-04 22:53 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: Adam Baker @ 2009-02-04 22:34 UTC (permalink / raw) To: kilgota; +Cc: Andy Walls, Jean-Francois Moine, linux-media On Wednesday 04 February 2009, kilgota@banach.math.auburn.edu wrote: <snip description of attempting to stream from 2 cameras at once> > 4. After removing the first camera which was plugged in, I tried to start > the stream from the second one. The stream will not start. A message says > that > > Cannot identify 'dev/video0': 2. No such file or directory. This line points to an error in your test method. You need to start the second stream with svv -d /dev/video1 to tell it to pick the second camera. Adam ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 22:34 ` Adam Baker @ 2009-02-04 22:53 ` kilgota 2009-02-04 23:09 ` kilgota 0 siblings, 1 reply; 28+ messages in thread From: kilgota @ 2009-02-04 22:53 UTC (permalink / raw) To: Adam Baker; +Cc: Andy Walls, Jean-Francois Moine, linux-media On Wed, 4 Feb 2009, Adam Baker wrote: > On Wednesday 04 February 2009, kilgota@banach.math.auburn.edu wrote: > <snip description of attempting to stream from 2 cameras at once> >> 4. After removing the first camera which was plugged in, I tried to start >> the stream from the second one. The stream will not start. A message says >> that >> >> Cannot identify 'dev/video0': 2. No such file or directory. > > This line points to an error in your test method. > > You need to start the second stream with svv -d /dev/video1 to tell it to pick > the second camera. > > Adam > Oops, right. Well, in that case I have to report that two cameras work simultaneously just fine. No problem at all. Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-04 22:53 ` kilgota @ 2009-02-04 23:09 ` kilgota 0 siblings, 0 replies; 28+ messages in thread From: kilgota @ 2009-02-04 23:09 UTC (permalink / raw) To: Adam Baker; +Cc: Andy Walls, Jean-Francois Moine, linux-media On Wed, 4 Feb 2009, kilgota@banach.math.auburn.edu wrote: > > > On Wed, 4 Feb 2009, Adam Baker wrote: > >> On Wednesday 04 February 2009, kilgota@banach.math.auburn.edu wrote: >> <snip description of attempting to stream from 2 cameras at once> >>> 4. After removing the first camera which was plugged in, I tried to start >>> the stream from the second one. The stream will not start. A message says >>> that >>> >>> Cannot identify 'dev/video0': 2. No such file or directory. >> >> This line points to an error in your test method. >> >> You need to start the second stream with svv -d /dev/video1 to tell it to >> pick >> the second camera. >> >> Adam >> > > Oops, right. > > Well, in that case I have to report that two cameras work simultaneously just > fine. No problem at all. For completeness, I should add the following: ps ax now shows two svv processes. One of them is svv -d /dev/video1 and is followed by [sq905] and the second one is svv followed by [sq905]. Why in reverse order? Well, probably it is that I now fired up the second camera first and the first one after that. The workqueue in the module is started with dev->work_thread = create_singlethread_workqueue(MODULE_NAME); so these are distinct instances of [sq905]. Now am I supposed to check what happens if I start jerking them off of their tethers without closing the capture windows? No thanks, not this time. Let's wait until that problem is solved with just one camera. :) Theodore Kilgore ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 18:13 ` Jean-Francois Moine 2009-02-03 19:15 ` kilgota @ 2009-02-03 19:42 ` kilgota 2009-02-03 19:53 ` Alan Stern 2 siblings, 0 replies; 28+ messages in thread From: kilgota @ 2009-02-03 19:42 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: Adam Baker, linux-media, Alan Stern [-- Attachment #1: Type: TEXT/PLAIN, Size: 1245 bytes --] On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > On Tue, 3 Feb 2009 12:21:55 -0600 (CST) > kilgota@banach.math.auburn.edu wrote: > >> I should add to the above that now I have tested, and indeed this >> change does not solve the problem of kernel oops after disconnect >> while streaming. It does make one change. The xterm does not go wild >> with error messages. But it is still not possible to close the svv >> window. Moreover, ps ax reveals that [svv] is running as an >> unkillable process, with [sq905/0] and [sq905/1], equally unkillable, >> in supporting roles. And dmesg reveals an oops. The problem is after >> all notorious by now, so I do not see much need for yet another log >> of debug output unless specifically asked for such. > > Why is there 2 sq905 processes? > > What is the oops? (Your last trace was good, because it gave the last > gspca/sq905 messages and the full oops) Right, here is the output. I have not searched for precise differences, but a glance at it leaves me with the feeling that it is the same old same old. This was done on the Pentium 4 Dual Core, with gspca_main loaded with option debug=255, and this is the dmesg output which resulted when I pulled the cord of the camera. Theodore Kilgore [-- Attachment #2: Type: APPLICATION/OCTET-STREAM, Size: 1466 bytes --] ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH] Add support for sq905 based cameras to gspca 2009-02-03 18:13 ` Jean-Francois Moine 2009-02-03 19:15 ` kilgota 2009-02-03 19:42 ` kilgota @ 2009-02-03 19:53 ` Alan Stern 2 siblings, 0 replies; 28+ messages in thread From: Alan Stern @ 2009-02-03 19:53 UTC (permalink / raw) To: Jean-Francois Moine; +Cc: kilgota, Adam Baker, linux-media On Tue, 3 Feb 2009, Jean-Francois Moine wrote: > > Perhaps we also need to do what Adam suggested yesterday, and add a > > call to destroy_urbs() in gspca_disconnect()? > > Surely not! The destroy_urbs() must be called at the right time, i.e. > on close(). Theodore was pointing out that destroy_urbs() must also be called during disconnect. If a camera is unplugged while it is in use then waiting until close() is no good -- it will cause destroy_urbs() to pass a stale pointer to usb_buffer_free(). That's the reason for the oops. Alan Stern ^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2009-02-04 22:58 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-19 23:22 [PATCH] Add support for sq905 based cameras to gspca Adam Baker
2009-01-20 3:33 ` Alexey Klimov
2009-01-21 17:20 ` Jean-Francois Moine
2009-01-21 19:10 ` kilgota
2009-01-22 4:17 ` Why not to try to combine sq905 and sq kilgota
[not found] ` <200901272101.27451.linux@baker-net.org.uk>
[not found] ` <alpine.LNX.2.00.0901271543560.21122@banach.math.auburn.edu>
[not found] ` <200901272228.42610.linux@baker-net.org.uk>
[not found] ` <20090128113540.25536301@free.fr>
[not found] ` <alpine.LNX.2.00.0901281554500.22748@banach.math.auburn.edu>
[not found] ` <20090131203650.36369153@free.fr>
[not found] ` <alpine.LNX.2.00.0902022032230.1080@banach.math.auburn.edu>
2009-02-03 9:39 ` [PATCH] Add support for sq905 based cameras to gspca Jean-Francois Moine
2009-02-03 17:30 ` kilgota
2009-02-03 18:21 ` kilgota
2009-02-03 18:13 ` Jean-Francois Moine
2009-02-03 19:15 ` kilgota
2009-02-03 19:23 ` Jean-Francois Moine
2009-02-03 19:54 ` kilgota
2009-02-03 19:47 ` Jean-Francois Moine
2009-02-03 19:59 ` Alan Stern
2009-02-03 22:23 ` kilgota
2009-02-04 2:02 ` Alan Stern
2009-02-04 3:12 ` kilgota
2009-02-03 22:09 ` Adam Baker
2009-02-03 22:28 ` kilgota
2009-02-04 1:59 ` Alan Stern
2009-02-04 2:33 ` Andy Walls
2009-02-04 21:38 ` Adam Baker
2009-02-04 22:31 ` kilgota
2009-02-04 22:34 ` Adam Baker
2009-02-04 22:53 ` kilgota
2009-02-04 23:09 ` kilgota
2009-02-03 19:42 ` kilgota
2009-02-03 19:53 ` Alan Stern
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox