Am Freitag, 5. Januar 2007 19:10 schrieb Greg KH:
> On Fri, Jan 05, 2007 at 02:39:21PM +0100, Oliver Neukum wrote:
> > +/* --- prototypes --- */
> > +
> > +static int __init wdm_init(void);
> > +static void __exit wdm_exit(void);
> > +
> > +static int wdm_probe(struct usb_interface *intf, const struct
> > usb_device_id *id);
> > +static void wdm_disconnect(struct usb_interface *intf);
> > +
> > +static ssize_t wdm_read(struct file *file, char __user *buffer, size_t
> > count, loff_t *ppos);
> > +static ssize_t wdm_write(struct file *file, const char __user *buffer,
> > size_t count, loff_t *ppos);
> > +static int wdm_release(struct inode *inode, struct file *file);
> > +static int wdm_open(struct inode *inode, struct file *file);
> > +static int wdm_flush (struct file * file, fl_owner_t id);
> > +
> > +static void wdm_out_callback (struct urb *urb);
> > +static void wdm_in_callback (struct urb *urb);
> > +
> > +static void free_urbs(struct wdm_device *desc);
> > +static void cleanup (struct wdm_device *desc);
> > +static void kill_urbs (struct wdm_device *desc);
> > +static int run_poll(struct wdm_device *desc, gfp_t gfp);
>
> Are all of these prototypes really needed?
Yes. Compilation breaks without them.
> > +/* --- table of supported interfaces ---*/
> > +
> > +static struct usb_device_id wdm_ids[] = {
> > + {
> > + .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
> > USB_DEVICE_ID_MATCH_INT_SUBCLASS,
> > + .bInterfaceClass = USB_CLASS_COMM,
> > + .bInterfaceSubClass = USB_CDC_SUBCLASS_DMM
> > + },
> > + { }
> > +};
> > +
> > +MODULE_DEVICE_TABLE (usb, wdm_ids);
> > +
> > +#define WDM_MINOR_BASE 32
>
> Where did you get this minor number from? I think it conflicts with a
> very old usb driver, but you still need to reserve a real number from me
> :)
I needed one for experimentation. This driver is not yet ready.
But if you feel like assigning a number, I'll take it.
> Oh, and this will not work with the dynamic minors for usb devices, you
> need to fix that up.
Roger.
> > --- /dev/null 2005-03-19 23:01:40.000000000 +0100
> > +++ drivers/usb/class/cdc-wdm.c 2007-01-05 12:52:33.000000000 +0100
> > @@ -0,0 +1,576 @@
> > +/* cdc-wdm.c
> > +
> > +This driver supports USB CDC WCM Device Management.
> > +
> > +Copyright (c) 2007 Oliver Neukum
>
> Need an email and a license here.
Roger.
> > +
> > +Some code taken from cdc-acm.c
> > +*/
> > +#include <linux/kernel.h>
> > +#include <linux/errno.h>
> > +#include <linux/slab.h>
> > +#include <linux/module.h>
> > +#include <linux/smp_lock.h>
> > +#include <linux/mutex.h>
> > +#include <asm/uaccess.h>
> > +#include <linux/usb.h>
> > +#include <linux/usb/cdc.h>
> > +#include <asm/byteorder.h>
> > +#include <asm/bitops.h>
> > +#include <asm/unaligned.h>
> > +
> > +#include "cdc-wdm.h"
>
> Do we really need a separate .h file for this driver?
Don't you like header files? They make things cleaner.
> > +#include "cdc-acm.h" /* for request types */
> > +
> > +#define DEBUG
>
> This should not be needed due to the CONFIG_USB_DEBUG config option.
Roger.
> > +static ssize_t wdm_write(struct file *file, const char __user *buffer,
> > size_t count, loff_t *ppos)
> > +{
> > + u8 *buf;
> > + int rv = -EMSGSIZE, r, we;
> > + unsigned long flags;
> > + struct wdm_device *desc = file->private_data;
> > + struct usb_ctrlrequest *req;
> > +
> > + if (count > desc->wMaxCommand)
> > + count = desc->wMaxCommand;
> > +
> > + spin_lock_irqsave(&desc->iuspin, flags);
> > + we = desc->werr;
> > + desc->werr = 0;
> > + spin_unlock_irqrestore(&desc->iuspin, flags);
> > + if (we < 0)
> > + return -EIO;
> > +
> > + run_poll(desc, GFP_KERNEL); /* read responses right on so that the
> > output buffer not stall */
> > + r = mutex_lock_interruptible(&desc->wlock); /* concurrent writes */
> > + rv = -ERESTARTSYS;
> > + if (r) {
> > + goto outnl;
> > + }
>
> Minor nit, no { } needed for one line if statements. You do this in a
> few other places.
Yes, leftover from versions with debugging instructions. They'll be removed.
[..]
> > + rv = wait_event_interruptible(desc->wait, test_bit(WDM_READ,
> > &desc->flags));
> > +
>
> Trailing whitespace :(
Roger.
> > +static void cleanup (struct wdm_device *desc)
> > +{
> > + //usb_buffer_free(interface_to_usbdev(desc->intf), sizeof(struct
> > usb_cdc_notification), desc->sbuf, desc->shandle);
> > + //usb_buffer_free(interface_to_usbdev(desc->intf), desc->wMaxCommand,
> > desc->inbuf, desc->ihandle);
> > +kfree(desc->sbuf);
> > +kfree(desc->inbuf);
> > + kfree(desc->orq);
> > + kfree(desc->irq);
> > + kfree(desc->ubuf);
> > + free_urbs(desc);
> > + kfree(desc);
> > +}
>
> Odd indentation...
Roger.
Thanks
Oliver
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel