diff options
Diffstat (limited to 'drivers/usb/misc/uss720.c')
| -rw-r--r-- | drivers/usb/misc/uss720.c | 83 | 
1 files changed, 48 insertions, 35 deletions
diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c index 796e2f68f74..40ef40affe8 100644 --- a/drivers/usb/misc/uss720.c +++ b/drivers/usb/misc/uss720.c @@ -3,7 +3,7 @@  /*   *	uss720.c  --  USS720 USB Parport Cable.   * - *	Copyright (C) 1999, 2005 + *	Copyright (C) 1999, 2005, 2010   *	    Thomas Sailer (t.sailer@alumni.ethz.ch)   *   *	This program is free software; you can redistribute it and/or modify @@ -75,7 +75,7 @@ struct uss720_async_request {  	struct list_head asynclist;  	struct completion compl;  	struct urb *urb; -	struct usb_ctrlrequest dr; +	struct usb_ctrlrequest *dr;  	__u8 reg[7];  }; @@ -85,9 +85,9 @@ static void destroy_priv(struct kref *kref)  {  	struct parport_uss720_private *priv = container_of(kref, struct parport_uss720_private, ref_count); +	dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n");  	usb_put_dev(priv->usbdev);  	kfree(priv); -	dbg("destroying priv datastructure");  }  static void destroy_async(struct kref *kref) @@ -98,6 +98,7 @@ static void destroy_async(struct kref *kref)  	if (likely(rq->urb))  		usb_free_urb(rq->urb); +	kfree(rq->dr);  	spin_lock_irqsave(&priv->asynclock, flags);  	list_del_init(&rq->asynclist);  	spin_unlock_irqrestore(&priv->asynclock, flags); @@ -118,14 +119,17 @@ static void async_complete(struct urb *urb)  	priv = rq->priv;  	pp = priv->pp;  	if (status) { -		err("async_complete: urb error %d", status); -	} else if (rq->dr.bRequest == 3) { +		dev_err(&urb->dev->dev, "async_complete: urb error %d\n", +			status); +	} else if (rq->dr->bRequest == 3) {  		memcpy(priv->reg, rq->reg, sizeof(priv->reg));  #if 0 -		dbg("async_complete regs %02x %02x %02x %02x %02x %02x %02x", -		    (unsigned int)priv->reg[0], (unsigned int)priv->reg[1], (unsigned int)priv->reg[2], -		    (unsigned int)priv->reg[3], (unsigned int)priv->reg[4], (unsigned int)priv->reg[5], -		    (unsigned int)priv->reg[6]); +		dev_dbg(&priv->usbdev->dev, +			"async_complete regs %02x %02x %02x %02x %02x %02x %02x\n", +			(unsigned int)priv->reg[0], (unsigned int)priv->reg[1], +			(unsigned int)priv->reg[2], (unsigned int)priv->reg[3], +			(unsigned int)priv->reg[4], (unsigned int)priv->reg[5], +			(unsigned int)priv->reg[6]);  #endif  		/* if nAck interrupts are enabled and we have an interrupt, call the interrupt procedure */  		if (rq->reg[2] & rq->reg[1] & 0x10 && pp) @@ -149,9 +153,9 @@ static struct uss720_async_request *submit_async_request(struct parport_uss720_p  	usbdev = priv->usbdev;  	if (!usbdev)  		return NULL; -	rq = kmalloc(sizeof(struct uss720_async_request), mem_flags); +	rq = kzalloc(sizeof(struct uss720_async_request), mem_flags);  	if (!rq) { -		err("submit_async_request out of memory"); +		dev_err(&usbdev->dev, "submit_async_request out of memory\n");  		return NULL;  	}  	kref_init(&rq->ref_count); @@ -162,28 +166,32 @@ static struct uss720_async_request *submit_async_request(struct parport_uss720_p  	rq->urb = usb_alloc_urb(0, mem_flags);  	if (!rq->urb) {  		kref_put(&rq->ref_count, destroy_async); -		err("submit_async_request out of memory"); +		dev_err(&usbdev->dev, "submit_async_request out of memory\n");  		return NULL;  	} -	rq->dr.bRequestType = requesttype; -	rq->dr.bRequest = request; -	rq->dr.wValue = cpu_to_le16(value); -	rq->dr.wIndex = cpu_to_le16(index); -	rq->dr.wLength = cpu_to_le16((request == 3) ? sizeof(rq->reg) : 0); +	rq->dr = kmalloc(sizeof(*rq->dr), mem_flags); +	if (!rq->dr) { +		kref_put(&rq->ref_count, destroy_async); +		return NULL; +	} +	rq->dr->bRequestType = requesttype; +	rq->dr->bRequest = request; +	rq->dr->wValue = cpu_to_le16(value); +	rq->dr->wIndex = cpu_to_le16(index); +	rq->dr->wLength = cpu_to_le16((request == 3) ? sizeof(rq->reg) : 0);  	usb_fill_control_urb(rq->urb, usbdev, (requesttype & 0x80) ? usb_rcvctrlpipe(usbdev, 0) : usb_sndctrlpipe(usbdev, 0), -			     (unsigned char *)&rq->dr, +			     (unsigned char *)rq->dr,  			     (request == 3) ? rq->reg : NULL, (request == 3) ? sizeof(rq->reg) : 0, async_complete, rq);  	/* rq->urb->transfer_flags |= URB_ASYNC_UNLINK; */  	spin_lock_irqsave(&priv->asynclock, flags);  	list_add_tail(&rq->asynclist, &priv->asynclist);  	spin_unlock_irqrestore(&priv->asynclock, flags); +	kref_get(&rq->ref_count);  	ret = usb_submit_urb(rq->urb, mem_flags); -	if (!ret) { -		kref_get(&rq->ref_count); +	if (!ret)  		return rq; -	} -	kref_put(&rq->ref_count, destroy_async); -	err("submit_async_request submit_urb failed with %d", ret); +	destroy_async(&rq->ref_count); +	dev_err(&usbdev->dev, "submit_async_request submit_urb failed with %d\n", ret);  	return NULL;  } @@ -218,7 +226,8 @@ static int get_1284_register(struct parport *pp, unsigned char reg, unsigned cha  	priv = pp->private_data;  	rq = submit_async_request(priv, 3, 0xc0, ((unsigned int)reg) << 8, 0, mem_flags);  	if (!rq) { -		err("get_1284_register(%u) failed", (unsigned int)reg); +		dev_err(&priv->usbdev->dev, "get_1284_register(%u) failed", +			(unsigned int)reg);  		return -EIO;  	}  	if (!val) { @@ -249,7 +258,8 @@ static int set_1284_register(struct parport *pp, unsigned char reg, unsigned cha  	priv = pp->private_data;  	rq = submit_async_request(priv, 4, 0x40, (((unsigned int)reg) << 8) | val, 0, mem_flags);  	if (!rq) { -		err("set_1284_register(%u,%u) failed", (unsigned int)reg, (unsigned int)val); +		dev_err(&priv->usbdev->dev, "set_1284_register(%u,%u) failed", +			(unsigned int)reg, (unsigned int)val);  		return -EIO;  	}  	kref_put(&rq->ref_count, destroy_async); @@ -691,9 +701,9 @@ static int uss720_probe(struct usb_interface *intf,  	unsigned char reg;  	int i; -	dbg("probe: vendor id 0x%x, device id 0x%x\n", -	    le16_to_cpu(usbdev->descriptor.idVendor), -	    le16_to_cpu(usbdev->descriptor.idProduct)); +	dev_dbg(&intf->dev, "probe: vendor id 0x%x, device id 0x%x\n", +		le16_to_cpu(usbdev->descriptor.idVendor), +		le16_to_cpu(usbdev->descriptor.idProduct));  	/* our known interfaces have 3 alternate settings */  	if (intf->num_altsetting != 3) { @@ -701,7 +711,7 @@ static int uss720_probe(struct usb_interface *intf,  		return -ENODEV;  	}  	i = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2); -	dbg("set inteface result %d", i); +	dev_dbg(&intf->dev, "set interface result %d\n", i);  	interface = intf->cur_altsetting; @@ -732,11 +742,13 @@ static int uss720_probe(struct usb_interface *intf,  	set_1284_register(pp, 2, 0x0c, GFP_KERNEL);  	/* debugging */  	get_1284_register(pp, 0, ®, GFP_KERNEL); -	dbg("reg: %02x %02x %02x %02x %02x %02x %02x", -	    priv->reg[0], priv->reg[1], priv->reg[2], priv->reg[3], priv->reg[4], priv->reg[5], priv->reg[6]); +	dev_dbg(&intf->dev, "reg: %02x %02x %02x %02x %02x %02x %02x\n", +		priv->reg[0], priv->reg[1], priv->reg[2], priv->reg[3], +		priv->reg[4], priv->reg[5], priv->reg[6]);  	endpoint = &interface->endpoint[2]; -	dbg("epaddr %d interval %d", endpoint->desc.bEndpointAddress, endpoint->desc.bInterval); +	dev_dbg(&intf->dev, "epaddr %d interval %d\n", +		endpoint->desc.bEndpointAddress, endpoint->desc.bInterval);  	parport_announce_port(pp);  	usb_set_intfdata(intf, pp); @@ -754,20 +766,20 @@ static void uss720_disconnect(struct usb_interface *intf)  	struct parport_uss720_private *priv;  	struct usb_device *usbdev; -	dbg("disconnect"); +	dev_dbg(&intf->dev, "disconnect\n");  	usb_set_intfdata(intf, NULL);  	if (pp) {  		priv = pp->private_data;  		usbdev = priv->usbdev;  		priv->usbdev = NULL;  		priv->pp = NULL; -		dbg("parport_remove_port"); +		dev_dbg(&intf->dev, "parport_remove_port\n");  		parport_remove_port(pp);  		parport_put_port(pp);  		kill_all_async_requests_priv(priv);  		kref_put(&priv->ref_count, destroy_priv);  	} -	dbg("disconnect done"); +	dev_dbg(&intf->dev, "disconnect done\n");  }  /* table of cables that work through this driver */ @@ -776,6 +788,7 @@ static const struct usb_device_id uss720_table[] = {  	{ USB_DEVICE(0x0557, 0x2001) },  	{ USB_DEVICE(0x0729, 0x1284) },  	{ USB_DEVICE(0x1293, 0x0002) }, +	{ USB_DEVICE(0x050d, 0x0002) },  	{ }						/* Terminating entry */  };  | 
