@@ -128,6 +128,7 @@ enum recvr_type {
128
128
recvr_type_dj ,
129
129
recvr_type_hidpp ,
130
130
recvr_type_gaming_hidpp ,
131
+ recvr_type_mouse_only ,
131
132
recvr_type_27mhz ,
132
133
recvr_type_bluetooth ,
133
134
};
@@ -879,9 +880,12 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
879
880
schedule_work (& djrcv_dev -> work );
880
881
}
881
882
882
- static void logi_hidpp_dev_conn_notif_equad (struct hidpp_event * hidpp_report ,
883
+ static void logi_hidpp_dev_conn_notif_equad (struct hid_device * hdev ,
884
+ struct hidpp_event * hidpp_report ,
883
885
struct dj_workitem * workitem )
884
886
{
887
+ struct dj_receiver_dev * djrcv_dev = hid_get_drvdata (hdev );
888
+
885
889
workitem -> type = WORKITEM_TYPE_PAIRED ;
886
890
workitem -> device_type = hidpp_report -> params [HIDPP_PARAM_DEVICE_INFO ] &
887
891
HIDPP_DEVICE_TYPE_MASK ;
@@ -895,6 +899,8 @@ static void logi_hidpp_dev_conn_notif_equad(struct hidpp_event *hidpp_report,
895
899
break ;
896
900
case REPORT_TYPE_MOUSE :
897
901
workitem -> reports_supported |= STD_MOUSE | HIDPP ;
902
+ if (djrcv_dev -> type == recvr_type_mouse_only )
903
+ workitem -> reports_supported |= MULTIMEDIA ;
898
904
break ;
899
905
}
900
906
}
@@ -938,7 +944,7 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
938
944
case 0x01 :
939
945
device_type = "Bluetooth" ;
940
946
/* Bluetooth connect packet contents is the same as (e)QUAD */
941
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
947
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
942
948
if (!(hidpp_report -> params [HIDPP_PARAM_DEVICE_INFO ] &
943
949
HIDPP_MANUFACTURER_MASK )) {
944
950
hid_info (hdev , "Non Logitech device connected on slot %d\n" ,
@@ -952,18 +958,18 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
952
958
break ;
953
959
case 0x03 :
954
960
device_type = "QUAD or eQUAD" ;
955
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
961
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
956
962
break ;
957
963
case 0x04 :
958
964
device_type = "eQUAD step 4 DJ" ;
959
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
965
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
960
966
break ;
961
967
case 0x05 :
962
968
device_type = "DFU Lite" ;
963
969
break ;
964
970
case 0x06 :
965
971
device_type = "eQUAD step 4 Lite" ;
966
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
972
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
967
973
break ;
968
974
case 0x07 :
969
975
device_type = "eQUAD step 4 Gaming" ;
@@ -973,11 +979,11 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
973
979
break ;
974
980
case 0x0a :
975
981
device_type = "eQUAD nano Lite" ;
976
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
982
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
977
983
break ;
978
984
case 0x0c :
979
985
device_type = "eQUAD Lightspeed" ;
980
- logi_hidpp_dev_conn_notif_equad (hidpp_report , & workitem );
986
+ logi_hidpp_dev_conn_notif_equad (hdev , hidpp_report , & workitem );
981
987
workitem .reports_supported |= STD_KEYBOARD ;
982
988
break ;
983
989
}
@@ -1328,7 +1334,8 @@ static int logi_dj_ll_parse(struct hid_device *hid)
1328
1334
if (djdev -> reports_supported & STD_MOUSE ) {
1329
1335
dbg_hid ("%s: sending a mouse descriptor, reports_supported: %llx\n" ,
1330
1336
__func__ , djdev -> reports_supported );
1331
- if (djdev -> dj_receiver_dev -> type == recvr_type_gaming_hidpp )
1337
+ if (djdev -> dj_receiver_dev -> type == recvr_type_gaming_hidpp ||
1338
+ djdev -> dj_receiver_dev -> type == recvr_type_mouse_only )
1332
1339
rdcat (rdesc , & rsize , mse_high_res_descriptor ,
1333
1340
sizeof (mse_high_res_descriptor ));
1334
1341
else if (djdev -> dj_receiver_dev -> type == recvr_type_27mhz )
@@ -1571,15 +1578,19 @@ static int logi_dj_raw_event(struct hid_device *hdev,
1571
1578
data [0 ] = data [1 ];
1572
1579
data [1 ] = 0 ;
1573
1580
}
1574
- /* The 27 MHz mouse-only receiver sends unnumbered mouse data */
1581
+ /*
1582
+ * Mouse-only receivers send unnumbered mouse data. The 27 MHz
1583
+ * receiver uses 6 byte packets, the nano receiver 8 bytes.
1584
+ */
1575
1585
if (djrcv_dev -> unnumbered_application == HID_GD_MOUSE &&
1576
- size == 6 ) {
1577
- u8 mouse_report [7 ];
1586
+ size <= 8 ) {
1587
+ u8 mouse_report [9 ];
1578
1588
1579
1589
/* Prepend report id */
1580
1590
mouse_report [0 ] = REPORT_TYPE_MOUSE ;
1581
- memcpy (mouse_report + 1 , data , 6 );
1582
- logi_dj_recv_forward_input_report (hdev , mouse_report , 7 );
1591
+ memcpy (mouse_report + 1 , data , size );
1592
+ logi_dj_recv_forward_input_report (hdev , mouse_report ,
1593
+ size + 1 );
1583
1594
}
1584
1595
1585
1596
return false;
@@ -1650,6 +1661,7 @@ static int logi_dj_probe(struct hid_device *hdev,
1650
1661
case recvr_type_dj : no_dj_interfaces = 3 ; break ;
1651
1662
case recvr_type_hidpp : no_dj_interfaces = 2 ; break ;
1652
1663
case recvr_type_gaming_hidpp : no_dj_interfaces = 3 ; break ;
1664
+ case recvr_type_mouse_only : no_dj_interfaces = 2 ; break ;
1653
1665
case recvr_type_27mhz : no_dj_interfaces = 2 ; break ;
1654
1666
case recvr_type_bluetooth : no_dj_interfaces = 2 ; break ;
1655
1667
}
@@ -1823,10 +1835,10 @@ static const struct hid_device_id logi_dj_receivers[] = {
1823
1835
{HID_USB_DEVICE (USB_VENDOR_ID_LOGITECH ,
1824
1836
USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 ),
1825
1837
.driver_data = recvr_type_dj },
1826
- { /* Logitech Nano (non DJ) receiver */
1838
+ { /* Logitech Nano mouse only receiver */
1827
1839
HID_USB_DEVICE (USB_VENDOR_ID_LOGITECH ,
1828
1840
USB_DEVICE_ID_LOGITECH_NANO_RECEIVER ),
1829
- .driver_data = recvr_type_hidpp },
1841
+ .driver_data = recvr_type_mouse_only },
1830
1842
{ /* Logitech Nano (non DJ) receiver */
1831
1843
HID_USB_DEVICE (USB_VENDOR_ID_LOGITECH ,
1832
1844
USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2 ),
0 commit comments