static void hci_smd_notify_data(void *data, unsigned int event) { struct hci_dev *hdev = hs.hdev; struct hci_smd_data *hsmd = &hs; int len = 0; if (!hdev) { BT_ERR("Frame for unknown HCI device (hdev=NULL)"); return; } switch (event) { case SMD_EVENT_DATA: len = smd_read_avail(hsmd->data_channel); if (len > 0) tasklet_hi_schedule(&hs.rx_task); else if (len < 0) BT_ERR("Failed to read data from smd %d", len); break; case SMD_EVENT_OPEN: BT_INFO("opening HCI-SMD channel :%s", DATA_CHANNEL); hci_smd_open(hdev); break; case SMD_EVENT_CLOSE: BT_INFO("Closing HCI-SMD channel :%s", DATA_CHANNEL); hci_smd_close(hdev); break; default: break; } }
static void hci_smd_notify_event(void *data, unsigned int event) { struct hci_dev *hdev = hs.hdev; struct hci_smd_data *hsmd = &hs; struct work_struct *reset_worker; struct work_struct *open_worker; int len = 0; if (!hdev) { BT_ERR("Frame for unknown HCI device (hdev=NULL)"); return; } switch (event) { case SMD_EVENT_DATA: len = smd_read_avail(hsmd->event_channel); if (len > 0) tasklet_hi_schedule(&hs.rx_task); else if (len < 0) BT_ERR("Failed to read event from smd %d", len); break; case SMD_EVENT_OPEN: BT_INFO("opening HCI-SMD channel :%s", EVENT_CHANNEL); hci_smd_open(hdev); open_worker = kzalloc(sizeof(*open_worker), GFP_ATOMIC); if (!open_worker) { BT_ERR("Out of memory"); break; } INIT_WORK(open_worker, hci_dev_smd_open); schedule_work(open_worker); break; case SMD_EVENT_CLOSE: BT_INFO("Closing HCI-SMD channel :%s", EVENT_CHANNEL); hci_smd_close(hdev); reset_worker = kzalloc(sizeof(*reset_worker), GFP_ATOMIC); if (!reset_worker) { BT_ERR("Out of memory"); break; } INIT_WORK(reset_worker, hci_dev_restart); schedule_work(reset_worker); break; default: break; } }
static void hci_smd_notify_cmd(void *data, unsigned int event) { struct hci_dev *hdev = ((struct hci_smd_data *)data)->hdev; if (!hdev) { BT_ERR("Frame for unknown HCI device (hdev=NULL)"); return; } switch (event) { case SMD_EVENT_DATA: hci_smd_recv_frame(hdev, BT_CMD); break; case SMD_EVENT_OPEN: hci_smd_open(hdev); break; case SMD_EVENT_CLOSE: hci_smd_close(hdev); break; default: break; } }