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;
}
Exemple #2
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;
}