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
[email protected]