Re: [PATCH v2 4/5] Bluetooth: btbcm: Split setup() function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Fred,

> Split btbcm_setup_patchram in 3 functions : btbcm_setup_patchram,
> btbcm_patchram (already existing) and btbcm_setup_post.
> For UART controllers this will allow to reset speed to default one
> after firmware loading, which will have reseted controller speed to
> default one.
> 
> Signed-off-by: Frederic Danis <frederic.danis@xxxxxxxxxxxxxxx>
> ---
> drivers/bluetooth/btbcm.c   | 29 +++++++++++++++++------------
> drivers/bluetooth/btbcm.h   | 11 +++++++++--
> drivers/bluetooth/btusb.c   | 23 ++++++++++++++++++++++-
> drivers/bluetooth/hci_bcm.c | 19 ++++++++++++++++++-
> 4 files changed, 66 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
> index b258454..f2efbbd 100644
> --- a/drivers/bluetooth/btbcm.c
> +++ b/drivers/bluetooth/btbcm.c
> @@ -277,9 +277,8 @@ static const struct {
> 	{ }
> };
> 
> -int btbcm_setup_patchram(struct hci_dev *hdev)
> +int btbcm_setup_patchram(struct hci_dev *hdev, char *fw_name, size_t len)

what is this len for? The fw_name is not a return value. I think the functions for doing the patchram should just get a firmware and then just do patchram.

> {
> -	char fw_name[64];
> 	u16 subver, rev, pid, vid;
> 	const char *hw_name = NULL;
> 	struct sk_buff *skb;
> @@ -319,8 +318,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
> 			}
> 		}
> 
> -		snprintf(fw_name, sizeof(fw_name), "brcm/%s.hcd",
> -			 hw_name ? : "BCM");
> +		snprintf(fw_name, len, "brcm/%s.hcd", hw_name ? : "BCM");
> 		break;
> 	case 1:
> 	case 2:
> @@ -340,7 +338,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
> 			}
> 		}
> 
> -		snprintf(fw_name, sizeof(fw_name), "brcm/%s-%4.4x-%4.4x.hcd",
> +		snprintf(fw_name, len, "brcm/%s-%4.4x-%4.4x.hcd",
> 			 hw_name ? : "BCM", vid, pid);
> 		break;
> 	default:
> @@ -351,9 +349,16 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
> 		hw_name ? : "BCM", (subver & 0x7000) >> 13,
> 		(subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
> 
> -	err = btbcm_patchram(hdev, fw_name);
> -	if (err == -ENOENT)
> -		return 0;
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
> +
> +int btbcm_setup_post(struct hci_dev *hdev)
> +{
> +	struct sk_buff *skb;
> +	struct hci_rp_read_local_version *ver;
> +	u16 subver, rev;
> +	int err;
> 
> 	/* Reset */
> 	err = btbcm_reset(hdev);
> @@ -370,9 +375,9 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
> 	subver = le16_to_cpu(ver->lmp_subver);
> 	kfree_skb(skb);
> 
> -	BT_INFO("%s: %s (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name,
> -		hw_name ? : "BCM", (subver & 0x7000) >> 13,
> -		(subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
> +	BT_INFO("%s: BCM (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name,
> +		(subver & 0x7000) >> 13, (subver & 0x1f00) >> 8,
> +		(subver & 0x00ff), rev & 0x0fff);
> 
> 	btbcm_check_bdaddr(hdev);
> 
> @@ -380,7 +385,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
> 
> 	return 0;
> }
> -EXPORT_SYMBOL_GPL(btbcm_setup_patchram);
> +EXPORT_SYMBOL_GPL(btbcm_setup_post);
> 
> int btbcm_setup_apple(struct hci_dev *hdev)
> {
> diff --git a/drivers/bluetooth/btbcm.h b/drivers/bluetooth/btbcm.h
> index eb6ab5f..73d92a2 100644
> --- a/drivers/bluetooth/btbcm.h
> +++ b/drivers/bluetooth/btbcm.h
> @@ -27,7 +27,8 @@ int btbcm_check_bdaddr(struct hci_dev *hdev);
> int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
> int btbcm_patchram(struct hci_dev *hdev, const char *firmware);
> 
> -int btbcm_setup_patchram(struct hci_dev *hdev);
> +int btbcm_setup_patchram(struct hci_dev *hdev, char *fw_name, size_t len);
> +int btbcm_setup_post(struct hci_dev *hdev);
> int btbcm_setup_apple(struct hci_dev *hdev);
> 
> #else
> @@ -47,7 +48,13 @@ static inline int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
> 	return -EOPNOTSUPP;
> }
> 
> -static inline int btbcm_setup_patchram(struct hci_dev *hdev)
> +static inline int btbcm_setup_patchram(struct hci_dev *hdev, char *fw_name,
> +								size_t len)
> +{
> +	return 0;
> +}
> +
> +static int btbcm_setup_post(struct hci_dev *hdev)
> {
> 	return 0;
> }
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index 77c1f8c..15225d9 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -1333,6 +1333,27 @@ static int btusb_setup_bcm92035(struct hci_dev *hdev)
> 	return 0;
> }
> 
> +#ifdef CONFIG_BT_HCIBTUSB_BCM
> +static int btusb_setup_bcm(struct hci_dev *hdev)
> +{
> +	char fw_name[64];
> +	int err;
> +
> +	err = btbcm_setup_patchram(hdev, fw_name, sizeof(fw_name));
> +	if (err)
> +		return err;
> +
> +	err = btbcm_patchram(hdev, fw_name);
> +	/* If there is no firmware (-ENOENT), discard the error and continue */
> +	if (err == -ENOENT)
> +		return 0;
> +
> +	err = btbcm_setup_post(hdev);
> +
> +	return err;
> +}
> +#endif
> +
> static int btusb_setup_csr(struct hci_dev *hdev)
> {
> 	struct hci_rp_read_local_version *rp;
> @@ -3132,7 +3153,7 @@ static int btusb_probe(struct usb_interface *intf,
> 
> #ifdef CONFIG_BT_HCIBTUSB_BCM
> 	if (id->driver_info & BTUSB_BCM_PATCHRAM) {
> -		hdev->setup = btbcm_setup_patchram;
> +		hdev->setup = btusb_setup_bcm;
> 		hdev->set_bdaddr = btbcm_set_bdaddr;
> 	}
> 
> diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
> index 1ec0b4a..0e77b9a 100644
> --- a/drivers/bluetooth/hci_bcm.c
> +++ b/drivers/bluetooth/hci_bcm.c
> @@ -79,11 +79,28 @@ static int bcm_flush(struct hci_uart *hu)
> 
> static int bcm_setup(struct hci_uart *hu)
> {
> +	char fw_name[64];
> +	int err;
> +
> 	BT_DBG("hu %p", hu);
> 
> 	hu->hdev->set_bdaddr = btbcm_set_bdaddr;
> 
> -	return btbcm_setup_patchram(hu->hdev);
> +	err = btbcm_setup_patchram(hu->hdev, fw_name, sizeof(fw_name));
> +	if (err)
> +		return err;
> +
> +	err = btbcm_patchram(hu->hdev, fw_name);
> +	/* If there is no firmware (-ENOENT), discard the error and continue */
> +	if (err == -ENOENT)
> +		return 0;
> +
> +	if (hu->proto->default_speed)
> +		hci_uart_set_baudrate(hu, hu->proto->default_speed);
> +
> +	err = btbcm_setup_post(hu->hdev);
> +
> +	return err;
> }
> 
> static const struct h4_recv_pkt bcm_recv_pkts[] = {

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux