diff options
Diffstat (limited to 'drivers/bluetooth/btsdio.c')
| -rw-r--r-- | drivers/bluetooth/btsdio.c | 39 | 
1 files changed, 13 insertions, 26 deletions
diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c index 792e32d29a1..83f6437dd91 100644 --- a/drivers/bluetooth/btsdio.c +++ b/drivers/bluetooth/btsdio.c @@ -73,6 +73,7 @@ struct btsdio_data {  #define REG_CL_INTRD 0x13	/* Interrupt Clear */  #define REG_EN_INTRD 0x14	/* Interrupt Enable */  #define REG_MD_STAT  0x20	/* Bluetooth Mode Status */ +#define REG_MD_SET   0x20	/* Bluetooth Mode Set */  static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)  { @@ -157,10 +158,9 @@ static int btsdio_rx_packet(struct btsdio_data *data)  	data->hdev->stat.byte_rx += len; -	skb->dev = (void *) data->hdev;  	bt_cb(skb)->pkt_type = hdr[3]; -	err = hci_recv_frame(skb); +	err = hci_recv_frame(data->hdev, skb);  	if (err < 0)  		return err; @@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func)  static int btsdio_open(struct hci_dev *hdev)  { -	struct btsdio_data *data = hdev->driver_data; +	struct btsdio_data *data = hci_get_drvdata(hdev);  	int err;  	BT_DBG("%s", hdev->name); @@ -213,7 +213,7 @@ static int btsdio_open(struct hci_dev *hdev)  	}  	if (data->func->class == SDIO_CLASS_BT_B) -		sdio_writeb(data->func, 0x00, REG_MD_STAT, NULL); +		sdio_writeb(data->func, 0x00, REG_MD_SET, NULL);  	sdio_writeb(data->func, 0x01, REG_EN_INTRD, NULL); @@ -225,7 +225,7 @@ release:  static int btsdio_close(struct hci_dev *hdev)  { -	struct btsdio_data *data = hdev->driver_data; +	struct btsdio_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s", hdev->name); @@ -246,7 +246,7 @@ static int btsdio_close(struct hci_dev *hdev)  static int btsdio_flush(struct hci_dev *hdev)  { -	struct btsdio_data *data = hdev->driver_data; +	struct btsdio_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s", hdev->name); @@ -255,10 +255,9 @@ static int btsdio_flush(struct hci_dev *hdev)  	return 0;  } -static int btsdio_send_frame(struct sk_buff *skb) +static int btsdio_send_frame(struct hci_dev *hdev, struct sk_buff *skb)  { -	struct hci_dev *hdev = (struct hci_dev *) skb->dev; -	struct btsdio_data *data = hdev->driver_data; +	struct btsdio_data *data = hci_get_drvdata(hdev);  	BT_DBG("%s", hdev->name); @@ -289,15 +288,6 @@ static int btsdio_send_frame(struct sk_buff *skb)  	return 0;  } -static void btsdio_destruct(struct hci_dev *hdev) -{ -	struct btsdio_data *data = hdev->driver_data; - -	BT_DBG("%s", hdev->name); - -	kfree(data); -} -  static int btsdio_probe(struct sdio_func *func,  				const struct sdio_device_id *id)  { @@ -313,7 +303,7 @@ static int btsdio_probe(struct sdio_func *func,  		tuple = tuple->next;  	} -	data = kzalloc(sizeof(*data), GFP_KERNEL); +	data = devm_kzalloc(&func->dev, sizeof(*data), GFP_KERNEL);  	if (!data)  		return -ENOMEM; @@ -324,13 +314,11 @@ static int btsdio_probe(struct sdio_func *func,  	skb_queue_head_init(&data->txq);  	hdev = hci_alloc_dev(); -	if (!hdev) { -		kfree(data); +	if (!hdev)  		return -ENOMEM; -	}  	hdev->bus = HCI_SDIO; -	hdev->driver_data = data; +	hci_set_drvdata(hdev, data);  	if (id->class == SDIO_CLASS_BT_AMP)  		hdev->dev_type = HCI_AMP; @@ -345,14 +333,13 @@ static int btsdio_probe(struct sdio_func *func,  	hdev->close    = btsdio_close;  	hdev->flush    = btsdio_flush;  	hdev->send     = btsdio_send_frame; -	hdev->destruct = btsdio_destruct; -	hdev->owner = THIS_MODULE; +	if (func->vendor == 0x0104 && func->device == 0x00c5) +		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;  	}  | 
