Hi Pavel,

> Merge firmware files to nokia_core, so that we can reduce ammount of
> exported functions. Also replace hand-coded check for invalid
> bluetooth address with bacmp.
> 
> Signed-off-by: Pavel Machek <pa...@ucw.cz>
> 
> diff --git a/drivers/staging/nokia_h4p/Makefile 
> b/drivers/staging/nokia_h4p/Makefile
> index 310b0f2..3398a1c 100644
> --- a/drivers/staging/nokia_h4p/Makefile
> +++ b/drivers/staging/nokia_h4p/Makefile
> @@ -1,6 +1,5 @@
> 
> obj-$(CONFIG_BT_NOKIA_H4P)            += nokia_h4p.o
> -nokia_h4p-objs := nokia_core.o nokia_fw.o nokia_uart.o nokia_fw-csr.o \
> -             nokia_fw-bcm.o nokia_fw-ti1273.o
> +nokia_h4p-objs := nokia_core.o nokia_fw.o nokia_uart.o
> 
> ccflags-y += -D__CHECK_ENDIAN__
> diff --git a/drivers/staging/nokia_h4p/nokia_core.c 
> b/drivers/staging/nokia_h4p/nokia_core.c
> index 775e1d0..501be06 100644
> --- a/drivers/staging/nokia_h4p/nokia_core.c
> +++ b/drivers/staging/nokia_h4p/nokia_core.c
> @@ -1191,6 +1191,330 @@ static int hci_h4p_remove(struct platform_device 
> *pdev)
>       return 0;
> }
> 
> +/* Code specific for BCM firmware -------------------------------- */
> +
> +static int hci_h4p_bcm_set_bdaddr(struct hci_h4p_info *info,
> +                             struct sk_buff *skb)
> +{
> +     int i;
> +     static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
> +     int not_valid = !bacmp(info->bd_addr, BDADDR_ANY);
> +
> +     if (not_valid) {
> +             dev_info(info->dev, "Valid bluetooth address not found, setting 
> some random\n");
> +             /* When address is not valid, use some random but Nokia MAC */
> +             memcpy(info->bd_addr, nokia_oui, 3);
> +             get_random_bytes(info->bd_addr + 3, 3);
> +     }
> +
> +     for (i = 0; i < 6; i++)
> +             skb->data[9 - i] = info->bd_addr[i];
> +
> +     return 0;
> +}
> +
> +void hci_h4p_bcm_parse_fw_event(struct hci_h4p_info *info, struct sk_buff 
> *skb)
> +{
> +     struct sk_buff *fw_skb;
> +     int err;
> +     unsigned long flags;
> +
> +     if (skb->data[5] != 0x00) {
> +             dev_err(info->dev, "Firmware sending command failed 0x%.2x\n",
> +                     skb->data[5]);
> +             info->fw_error = -EPROTO;
> +     }
> +
> +     kfree_skb(skb);
> +
> +     fw_skb = skb_dequeue(info->fw_q);
> +     if (fw_skb == NULL || info->fw_error) {
> +             complete(&info->fw_completion);
> +             return;
> +     }
> +
> +     if (fw_skb->data[1] == 0x01 && fw_skb->data[2] == 0xfc &&
> +                     fw_skb->len >= 10) {
> +             BT_DBG("Setting bluetooth address");
> +             err = hci_h4p_bcm_set_bdaddr(info, fw_skb);
> +             if (err < 0) {
> +                     kfree_skb(fw_skb);
> +                     info->fw_error = err;
> +                     complete(&info->fw_completion);
> +                     return;
> +             }
> +     }
> +
> +     skb_queue_tail(&info->txq, fw_skb);
> +     spin_lock_irqsave(&info->lock, flags);
> +     hci_h4p_outb(info, UART_IER, hci_h4p_inb(info, UART_IER) |
> +                     UART_IER_THRI);
> +     spin_unlock_irqrestore(&info->lock, flags);
> +}

and as I explained before, this crazy can not continue. Bluetooth drivers can 
provide a hdev->setup callback for loading firmware and doing other setup 
details. You can just bring up the HCI transport. We are providing 
__hci_cmd_sync for easy loading of the firmware. Especially if the firmware 
just consists of HCI commands. Which is clearly the case with the Nokia 
firmware files.

In addition with 3.17 you can also provide hdev->set_bdaddr to allow changing 
the public BD_ADDR. You can also set HCI_QUIRK_INVALID_BDADDR and bring up the 
controller in an unconfigured state. That way you can have userspace provide 
the address and avoid the hacking around the missing address issue.

Maybe at some point someone realizes that focusing on the N900 Bluetooth 
hardware would help in making this code simpler. Adding support for older Maemo 
devices can be done later.

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to