diff options
Diffstat (limited to 'drivers/bluetooth/bpa10x.c')
| -rw-r--r-- | drivers/bluetooth/bpa10x.c | 70 | 
1 files changed, 21 insertions, 49 deletions
diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 751b338d904..8a319913c9a 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c @@ -37,7 +37,7 @@  #define VERSION "0.10" -static struct usb_device_id bpa10x_table[] = { +static const struct usb_device_id bpa10x_table[] = {  	/* Tektronix BPA 100/105 (Digianswer) */  	{ USB_DEVICE(0x08fd, 0x0002) }, @@ -66,7 +66,7 @@ struct hci_vendor_hdr {  static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s queue %d buffer %p count %d", hdev->name,  							queue, buf, count); @@ -129,8 +129,6 @@ static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count)  				return -ENOMEM;  			} -			skb->dev = (void *) hdev; -  			data->rx_skb[queue] = skb;  			scb = (void *) skb->cb; @@ -155,7 +153,7 @@ static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count)  			data->rx_skb[queue] = NULL;  			bt_cb(skb)->pkt_type = scb->type; -			hci_recv_frame(skb); +			hci_recv_frame(hdev, skb);  		}  		count -= len; buf += len; @@ -189,7 +187,7 @@ done:  static void bpa10x_rx_complete(struct urb *urb)  {  	struct hci_dev *hdev = urb->context; -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	int err;  	BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -219,7 +217,7 @@ static void bpa10x_rx_complete(struct urb *urb)  static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	struct urb *urb;  	unsigned char *buf;  	unsigned int pipe; @@ -260,7 +258,7 @@ static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)  static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	struct urb *urb;  	unsigned char *buf;  	unsigned int pipe; @@ -301,7 +299,7 @@ static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)  static int bpa10x_open(struct hci_dev *hdev)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	int err;  	BT_DBG("%s", hdev->name); @@ -329,7 +327,7 @@ error:  static int bpa10x_close(struct hci_dev *hdev)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s", hdev->name); @@ -343,7 +341,7 @@ static int bpa10x_close(struct hci_dev *hdev)  static int bpa10x_flush(struct hci_dev *hdev)  { -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s", hdev->name); @@ -352,10 +350,9 @@ static int bpa10x_flush(struct hci_dev *hdev)  	return 0;  } -static int bpa10x_send_frame(struct sk_buff *skb) +static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb)  { -	struct hci_dev *hdev = (struct hci_dev *) skb->dev; -	struct bpa10x_data *data = hdev->driver_data; +	struct bpa10x_data *data = hci_get_drvdata(hdev);  	struct usb_ctrlrequest *dr;  	struct urb *urb;  	unsigned int pipe; @@ -366,6 +363,8 @@ static int bpa10x_send_frame(struct sk_buff *skb)  	if (!test_bit(HCI_RUNNING, &hdev->flags))  		return -EBUSY; +	skb->dev = (void *) hdev; +  	urb = usb_alloc_urb(0, GFP_ATOMIC);  	if (!urb)  		return -ENOMEM; @@ -432,17 +431,6 @@ static int bpa10x_send_frame(struct sk_buff *skb)  	return 0;  } -static void bpa10x_destruct(struct hci_dev *hdev) -{ -	struct bpa10x_data *data = hdev->driver_data; - -	BT_DBG("%s", hdev->name); - -	kfree_skb(data->rx_skb[0]); -	kfree_skb(data->rx_skb[1]); -	kfree(data); -} -  static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id)  {  	struct bpa10x_data *data; @@ -454,7 +442,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *  	if (intf->cur_altsetting->desc.bInterfaceNumber != 0)  		return -ENODEV; -	data = kzalloc(sizeof(*data), GFP_KERNEL); +	data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);  	if (!data)  		return -ENOMEM; @@ -464,13 +452,11 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *  	init_usb_anchor(&data->rx_anchor);  	hdev = hci_alloc_dev(); -	if (!hdev) { -		kfree(data); +	if (!hdev)  		return -ENOMEM; -	}  	hdev->bus = HCI_USB; -	hdev->driver_data = data; +	hci_set_drvdata(hdev, data);  	data->hdev = hdev; @@ -480,16 +466,12 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *  	hdev->close    = bpa10x_close;  	hdev->flush    = bpa10x_flush;  	hdev->send     = bpa10x_send_frame; -	hdev->destruct = bpa10x_destruct; - -	hdev->owner = THIS_MODULE; -	set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks); +	set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);  	err = hci_register_dev(hdev);  	if (err < 0) {  		hci_free_dev(hdev); -		kfree(data);  		return err;  	} @@ -512,6 +494,8 @@ static void bpa10x_disconnect(struct usb_interface *intf)  	hci_unregister_dev(data->hdev);  	hci_free_dev(data->hdev); +	kfree_skb(data->rx_skb[0]); +	kfree_skb(data->rx_skb[1]);  }  static struct usb_driver bpa10x_driver = { @@ -519,22 +503,10 @@ static struct usb_driver bpa10x_driver = {  	.probe		= bpa10x_probe,  	.disconnect	= bpa10x_disconnect,  	.id_table	= bpa10x_table, +	.disable_hub_initiated_lpm = 1,  }; -static int __init bpa10x_init(void) -{ -	BT_INFO("Digianswer Bluetooth USB driver ver %s", VERSION); - -	return usb_register(&bpa10x_driver); -} - -static void __exit bpa10x_exit(void) -{ -	usb_deregister(&bpa10x_driver); -} - -module_init(bpa10x_init); -module_exit(bpa10x_exit); +module_usb_driver(bpa10x_driver);  MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");  MODULE_DESCRIPTION("Digianswer Bluetooth USB driver ver " VERSION);  | 
