int rtbt_hci_dev_send(struct hci_dev *hdev, struct sk_buff *skb) { //struct hci_dev *hdev = (struct hci_dev *)skb->dev; struct rtbt_os_ctrl *os_ctrl = (struct rtbt_os_ctrl *)hci_get_drvdata(hdev); struct rtbt_hps_ops *hps_ops; unsigned char pkt_type; int status; //printk("-->%s():\n", __FUNCTION__); pkt_type = rtbt_get_pkt_type(skb); //printk("hciName:%s type:%s(%d) len:%d\n", // hdev->name, pkt_type_str[pkt_type], // pkt_type, skb->len); // if (pkt_type == HCI_COMMAND_PKT) // hex_dump("rtbt_hci_dev_send: HCI_CMD", skb->data, skb->len); // else if (pkt_type == HCI_SCODATA_PKT) // hex_dump("rtbt_hci_dev_send: HCI_SCO", skb->data, skb->len); if (!os_ctrl || !os_ctrl->hps_ops) { kfree_skb(skb); return -1; } hps_ops = os_ctrl->hps_ops; if ((!hps_ops->hci_cmd) || (!hps_ops->hci_acl_data) || (!hps_ops->hci_sco_data)) { printk("Err, Null Handler!hci_cmd=0x%p, acl_data=0x%p, sco_data=0x%p!\n", hps_ops->hci_cmd, hps_ops->hci_acl_data, hps_ops->hci_sco_data); kfree_skb(skb); return -1; } switch (pkt_type) { case HCI_COMMAND_PKT: status = hps_ops->hci_cmd(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.cmd_tx++; } break; case HCI_ACLDATA_PKT: status = hps_ops->hci_acl_data(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.acl_tx++; } break; case HCI_SCODATA_PKT: printk("-->%s():sco len=%d,time=0x%lx\n", __FUNCTION__, skb->len, jiffies); //os_ctrl->sco_tx_seq = bt_cb(skb)->control.txseq; os_ctrl->sco_time_hci = jiffies; status = hps_ops->hci_sco_data(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.sco_tx++; } printk("<--%s():sco done, time=0x%lx\n", __FUNCTION__, jiffies); break; case HCI_VENDOR_PKT: break; } if( (hdev!=0) && (status == 0)){ hdev->stat.byte_tx += skb->len; } else { hdev->stat.err_tx++; } kfree_skb(skb); //printk("<--%s():\n", __FUNCTION__); return 0; }
int rtbt_hci_dev_send(struct hci_dev *hdev, struct sk_buff *skb) { struct rtbt_os_ctrl *os_ctrl = (struct rtbt_os_ctrl *)hci_get_drvdata(hdev); struct rtbt_hps_ops *hps_ops; unsigned char pkt_type; int status; //printk("-->%s():\n", __FUNCTION__); pkt_type = rtbt_get_pkt_type(skb); //printk("hciName:%s type:%s(%d) len:%d\n", // hdev->name, pkt_type_str[pkt_type], // pkt_type, skb->len); // if (pkt_type == HCI_COMMAND_PKT) // hex_dump("rtbt_hci_dev_send: HCI_CMD", skb->data, skb->len); // else if (pkt_type == HCI_SCODATA_PKT) // hex_dump("rtbt_hci_dev_send: HCI_SCO", skb->data, skb->len); if (!os_ctrl || !os_ctrl->hps_ops) { kfree_skb(skb); return -1; } hps_ops = os_ctrl->hps_ops; if ((!hps_ops->hci_cmd) || (!hps_ops->hci_acl_data) || (!hps_ops->hci_sco_data)) { printk("Err, Null Handler!hci_cmd=0x%p, acl_data=0x%p, sco_data=0x%p!\n", hps_ops->hci_cmd, hps_ops->hci_acl_data, hps_ops->hci_sco_data); kfree_skb(skb); return -1; } switch (pkt_type) { case HCI_COMMAND_PKT: status = hps_ops->hci_cmd(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.cmd_tx++; } break; case HCI_ACLDATA_PKT: status = hps_ops->hci_acl_data(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.acl_tx++; } break; case HCI_SCODATA_PKT: printk("-->%s():sco len=%d,time=0x%lx\n", __FUNCTION__, skb->len, jiffies); /* Another kludge to get it to compile in 3.2.51 of debian. - The version is probably incorrect, but it is good enough for my purposes. */ #if LINUX_VERSION_CODE <= KERNEL_VERSION(3,2,51) os_ctrl->sco_tx_seq = bt_cb(skb)->tx_seq; #else os_ctrl->sco_tx_seq = bt_cb(skb)->control.txseq; #endif os_ctrl->sco_time_hci = jiffies; status = hps_ops->hci_sco_data(os_ctrl->dev_ctrl, skb->data, skb->len); if( (hdev!=0) && (status == 0)){ hdev->stat.sco_tx++; } printk("<--%s():sco done, time=0x%lx\n", __FUNCTION__, jiffies); break; case HCI_VENDOR_PKT: break; } if( (hdev!=0) && (status == 0)){ hdev->stat.byte_tx += skb->len; } else { hdev->stat.err_tx++; } kfree_skb(skb); //printk("<--%s():\n", __FUNCTION__); return 0; }