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.ro...@gmail.com

Reply via email to