Lines Matching refs:djrcv_dev
514 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
530 struct dj_receiver_dev *djrcv_dev;
540 list_for_each_entry(djrcv_dev, &dj_hdev_list, list) {
541 if (djrcv_dev->mouse &&
542 hid_compare_device_paths(hdev, djrcv_dev->mouse, sep)) {
543 kref_get(&djrcv_dev->kref);
544 return djrcv_dev;
546 if (djrcv_dev->keyboard &&
547 hid_compare_device_paths(hdev, djrcv_dev->keyboard, sep)) {
548 kref_get(&djrcv_dev->kref);
549 return djrcv_dev;
551 if (djrcv_dev->hidpp &&
552 hid_compare_device_paths(hdev, djrcv_dev->hidpp, sep)) {
553 kref_get(&djrcv_dev->kref);
554 return djrcv_dev;
563 struct dj_receiver_dev *djrcv_dev = container_of(kref, struct dj_receiver_dev, kref);
565 list_del(&djrcv_dev->list);
566 kfifo_free(&djrcv_dev->notif_fifo);
567 kfree(djrcv_dev);
572 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
576 if (djrcv_dev->mouse == hdev)
577 djrcv_dev->mouse = NULL;
578 if (djrcv_dev->keyboard == hdev)
579 djrcv_dev->keyboard = NULL;
580 if (djrcv_dev->hidpp == hdev)
581 djrcv_dev->hidpp = NULL;
583 kref_put(&djrcv_dev->kref, dj_release_receiver_dev);
593 struct dj_receiver_dev *djrcv_dev;
597 djrcv_dev = dj_find_receiver_dev(hdev, type);
598 if (!djrcv_dev) {
599 djrcv_dev = kzalloc(sizeof(*djrcv_dev), GFP_KERNEL);
600 if (!djrcv_dev)
603 INIT_WORK(&djrcv_dev->work, delayedwork_callback);
604 spin_lock_init(&djrcv_dev->lock);
605 if (kfifo_alloc(&djrcv_dev->notif_fifo,
608 kfree(djrcv_dev);
609 djrcv_dev = NULL;
612 kref_init(&djrcv_dev->kref);
613 list_add_tail(&djrcv_dev->list, &dj_hdev_list);
614 djrcv_dev->last_query = jiffies;
615 djrcv_dev->type = type;
619 djrcv_dev->keyboard = hdev;
621 djrcv_dev->mouse = hdev;
623 djrcv_dev->hidpp = hdev;
625 hid_set_drvdata(hdev, djrcv_dev);
628 return djrcv_dev;
631 static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
638 spin_lock_irqsave(&djrcv_dev->lock, flags);
639 dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index];
640 djrcv_dev->paired_dj_devices[workitem->device_index] = NULL;
641 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
647 hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n",
652 static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
656 struct hid_device *djrcv_hdev = djrcv_dev->hidpp;
668 if (djrcv_dev->paired_dj_devices[device_index]) {
708 if (djrcv_dev->type == recvr_type_27mhz)
726 dj_dev->dj_receiver_dev = djrcv_dev;
730 spin_lock_irqsave(&djrcv_dev->lock, flags);
731 djrcv_dev->paired_dj_devices[device_index] = dj_dev;
732 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
742 spin_lock_irqsave(&djrcv_dev->lock, flags);
743 djrcv_dev->paired_dj_devices[device_index] = NULL;
744 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
752 struct dj_receiver_dev *djrcv_dev =
762 spin_lock_irqsave(&djrcv_dev->lock, flags);
768 if (!djrcv_dev->ready) {
771 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
775 count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
778 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
782 if (!kfifo_is_empty(&djrcv_dev->notif_fifo))
783 schedule_work(&djrcv_dev->work);
785 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
789 logi_dj_recv_add_djhid_device(djrcv_dev, &workitem);
792 logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem);
795 retval = logi_dj_recv_query_paired_devices(djrcv_dev);
797 hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n",
819 static void logi_dj_recv_queue_unknown_work(struct dj_receiver_dev *djrcv_dev)
824 if (time_before(jiffies, djrcv_dev->last_query + HZ / 2))
827 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
828 schedule_work(&djrcv_dev->work);
831 static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
861 logi_dj_recv_queue_unknown_work(djrcv_dev);
865 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
866 schedule_work(&djrcv_dev->work);
885 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
908 if (djrcv_dev->type == recvr_type_mouse_only)
942 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1028 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1029 schedule_work(&djrcv_dev->work);
1032 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
1040 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
1058 static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev,
1064 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
1090 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1101 spin_lock_irqsave(&djrcv_dev->lock, flags);
1103 dj_dev = djrcv_dev->paired_dj_devices[i];
1106 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1111 logi_dj_recv_queue_unknown_work(djrcv_dev);
1112 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1117 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
1120 struct hid_device *hdev = djrcv_dev->hidpp;
1142 static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev)
1159 retval = hid_hw_raw_request(djrcv_dev->hidpp,
1169 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
1174 djrcv_dev->last_query = jiffies;
1176 if (djrcv_dev->type != recvr_type_dj)
1177 return logi_dj_recv_query_hidpp_devices(djrcv_dev);
1185 retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1191 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
1194 struct hid_device *hdev = djrcv_dev->hidpp;
1203 if (djrcv_dev->type == recvr_type_dj) {
1211 retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1286 struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev;
1303 return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf,
1310 if (djrcv_dev->type != recvr_type_dj && count >= 2) {
1311 if (!djrcv_dev->keyboard) {
1316 return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count,
1331 ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf,
1445 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1480 spin_lock_irqsave(&djrcv_dev->lock, flags);
1482 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) {
1484 logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1493 logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1498 logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
1502 logi_dj_recv_forward_dj(djrcv_dev, dj_report);
1506 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1515 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1552 spin_lock_irqsave(&djrcv_dev->lock, flags);
1554 dj_dev = djrcv_dev->paired_dj_devices[device_index];
1560 if (djrcv_dev->type == recvr_type_27mhz && dj_dev &&
1569 kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1580 logi_dj_recv_queue_unknown_work(djrcv_dev);
1583 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1592 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1595 if (!djrcv_dev)
1600 if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) {
1619 if (djrcv_dev->unnumbered_application == HID_GD_MOUSE &&
1670 struct dj_receiver_dev *djrcv_dev;
1736 djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data,
1738 if (!djrcv_dev) {
1744 djrcv_dev->unnumbered_application = rep->application;
1755 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1775 spin_lock_irqsave(&djrcv_dev->lock, flags);
1776 djrcv_dev->ready = true;
1777 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1778 retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1804 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1806 if (!djrcv_dev || djrcv_dev->hidpp != hdev)
1809 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1821 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1828 if (!djrcv_dev)
1835 spin_lock_irqsave(&djrcv_dev->lock, flags);
1836 djrcv_dev->ready = false;
1837 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1839 cancel_work_sync(&djrcv_dev->work);
1849 * djrcv_dev, so we need locking here.
1852 spin_lock_irqsave(&djrcv_dev->lock, flags);
1853 dj_dev = djrcv_dev->paired_dj_devices[i];
1854 djrcv_dev->paired_dj_devices[i] = NULL;
1855 spin_unlock_irqrestore(&djrcv_dev->lock, flags);