Re: [RFC 5/7] Bluetooth: hci_nokia: Introduce new driver

Pali Rohár
2016-08-16T07:53:18Z

On Tuesday 16 August 2016 09:02:14 Marcel Holtmann wrote:
> > +static int nokia_setup_fw(struct hci_uart *hu)
> > +{
> > + struct nokia_bt_dev *btdev = hu->priv;
> > + const struct firmware *fw;
> > + const u8 *fw_ptr;
> > + size_t fw_size;
> > + int err;
> > +
> > + BT_DBG("hu %p", hu);
> > +
> > + err = request_firmware(&fw, nokia_get_fw_name(btdev), hu->tty->dev);
>
> So does this nokia_get_fw_name really needs to be a separate function? Or can this just be done right here in this function? I prefer it to be done where it is actually used. Unless you use that name in many places.
>
> > + if (err < 0) {
> > + BT_ERR("%s: Failed to load Nokia firmware file (%d)",
> > + hu->hdev->name, err);
> > + return err;
> > + }
> > +
> > + fw_ptr = fw->data;
> > + fw_size = fw->size;
> > +
> > + while (fw_size >= 4) {
> > + u16 pkt_size = get_unaligned_le16(fw_ptr);
> > + u8 pkt_type = fw_ptr[2];
> > + const struct hci_command_hdr *cmd;
> > + u16 opcode;
> > + struct sk_buff *skb;
> > +
> > + switch (pkt_type) {
> > + case HCI_COMMAND_PKT:
> > + cmd = (struct hci_command_hdr *)(fw_ptr + 3);
> > + opcode = le16_to_cpu(cmd->opcode);
> > +
> > + skb = __hci_cmd_sync(hu->hdev, opcode, cmd->plen,
> > + fw_ptr + 3 + HCI_COMMAND_HDR_SIZE,
> > + HCI_INIT_TIMEOUT);
> > + if (IS_ERR(skb)) {
> > + err = PTR_ERR(skb);
> > + BT_ERR("%s: Firmware command %04x failed (%d)",
> > + hu->hdev->name, opcode, err);
> > + goto done;
> > + }
> > + kfree_skb(skb);
> > + break;
> > + case HCI_NOKIA_RADIO_PKT:
>
> Are you sure you can ignore the RADIO_PKT commands. They are used to set up the FM radio parts of the chip. They are standard HCI commands (in the case of Broadcom at least). At minimum it should be added a comment here that you are ignoring them on purpose.
>
> > + case HCI_NOKIA_NEG_PKT:
> > + case HCI_NOKIA_ALIVE_PKT:
>
> And here I would also a comment on why are we ignore these commands and driving this all by ourselves.
>

Good question... In Pavel's version of bluetooth driver, which is
working on Nokia N900, is sent whole firmware at one __hci_cmd_sync
step. It does not skip any packets, plus he added this comment:

/* Note that this is timing-critical. If sending packets takes
* too long, initialization will fail.
*/

So really, can we skip those packets? And is not this reason why
this bluetooth driver does not work on Nokia N900?

--
Pali Rohár
pali.rohar@gmail.com