diff mbox series

Logitech Anywhere 3SB support

Message ID 20240413095453.14816-1-kde@carewolf.com (mailing list archive)
State New
Delegated to: Jiri Kosina
Headers show
Series Logitech Anywhere 3SB support | expand

Commit Message

Allan Sandfeld Jensen April 13, 2024, 9:54 a.m. UTC
From: Allan Sandfeld Jensen <allan.jensen@qt.io>

---
 drivers/hid/hid-ids.h            |  1 +
 drivers/hid/hid-logitech-dj.c    | 10 +++++++++-
 drivers/hid/hid-logitech-hidpp.c |  2 ++
 3 files changed, 12 insertions(+), 1 deletion(-)

Comments

Benjamin Tissoires April 15, 2024, 3:54 p.m. UTC | #1
[Ccing Hans as well for input]

On Apr 13 2024, kde@carewolf.com wrote:
> From: Allan Sandfeld Jensen <allan.jensen@qt.io>
> 

FWIW, this patch neesd a commit description and signed-offs

> ---
>  drivers/hid/hid-ids.h            |  1 +
>  drivers/hid/hid-logitech-dj.c    | 10 +++++++++-
>  drivers/hid/hid-logitech-hidpp.c |  2 ++
>  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 2235d78784b1..4b79c4578d32 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -849,6 +849,7 @@
>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1	0xc539
>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1	0xc53f
>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY	0xc53a
> +#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER		0xc548
>  #define USB_DEVICE_ID_SPACETRAVELLER	0xc623
>  #define USB_DEVICE_ID_SPACENAVIGATOR	0xc626
>  #define USB_DEVICE_ID_DINOVO_DESKTOP	0xc704
> diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
> index c358778e070b..92b41ae5a47c 100644
> --- a/drivers/hid/hid-logitech-dj.c
> +++ b/drivers/hid/hid-logitech-dj.c
> @@ -120,6 +120,7 @@ enum recvr_type {
>  	recvr_type_27mhz,
>  	recvr_type_bluetooth,
>  	recvr_type_dinovo,
> +	recvr_type_bolt,

I am *really* hesitant in integrating the bolt receiver into
logitech-dj.ko:
- the bolt receiver is not capable of making the distinction between the
  source of the events (so only one mouse/keyboard can be used at the
  time)
- we still have a couple of outstanding and impossible to debug issues
  with some high resolution mice connected over the unifying receiver,
  and adding one more receiver makes me nervous
- I have a strong feeling by reading the code that the keyboard part
  will fail (there is a comment "For the keyboard, we can reuse the same
  report by using the second byte which is constant in the USB HID
  report descriptor." though I can't seem to find this constant report
  on the bolt receiver)
- what are the benefits of adding it?
- will it break fwupd?

>  };
>  
>  struct dj_report {
> @@ -1068,6 +1069,7 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
>  		workitem.reports_supported |= STD_KEYBOARD;
>  		break;
>  	case 0x0f:
> +	case 0x10:
>  	case 0x11:
>  		device_type = "eQUAD Lightspeed 1.2";
>  		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
> @@ -1430,7 +1432,8 @@ static int logi_dj_ll_parse(struct hid_device *hid)
>  		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
>  			__func__, djdev->reports_supported);
>  		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
> -		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
> +		    djdev->dj_receiver_dev->type == recvr_type_mouse_only ||
> +		    djdev->dj_receiver_dev->type == recvr_type_bolt)
>  			rdcat(rdesc, &rsize, mse_high_res_descriptor,
>  			      sizeof(mse_high_res_descriptor));
>  		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
> @@ -1773,6 +1776,7 @@ static int logi_dj_probe(struct hid_device *hdev,
>  	case recvr_type_dj:		no_dj_interfaces = 3; break;
>  	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
>  	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
> +	case recvr_type_bolt:		no_dj_interfaces = 4; break;

4? The device I have here only has 3 (unless I misremember how this is
supposed to be working).

>  	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
>  	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
>  	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
> @@ -1950,6 +1954,10 @@ static const struct hid_device_id logi_dj_receivers[] = {
>  	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
>  		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
>  	 .driver_data = recvr_type_dj},
> +	{ /* Logitech bolt receiver (0xc548) */
> +	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
> +		USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER),
> +	 .driver_data = recvr_type_bolt},
>  
>  	{ /* Logitech Nano mouse only receiver (0xc52f) */
>  	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
> diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
> index 3c00e6ac8e76..509142982daa 100644
> --- a/drivers/hid/hid-logitech-hidpp.c
> +++ b/drivers/hid/hid-logitech-hidpp.c
> @@ -4380,6 +4380,8 @@ static const struct hid_device_id hidpp_devices[] = {
>  	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
>  	{ /* MX Master 3S mouse over Bluetooth */
>  	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
> +	{ /* MX Anywhere 3SB mouse over Bluetooth */
> +	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb038) },

That I can accept, however know that there is a regression in bluez
0.73[0] (but it should be fixed in 0.74)

Cheers,
Benjamin


[0] https://github.com/bluez/bluez/issues/778#issuecomment-2048870358

>  	{}
>  };
>  
> -- 
> 2.39.2
>
Allan Sandfeld Jensen April 15, 2024, 4:36 p.m. UTC | #2
On Monday 15 April 2024 17:54:57 CEST Benjamin Tissoires wrote:
> [You don't often get email from bentiss@kernel.org. Learn why this is
> important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> [Ccing Hans as well for input]
> 
> On Apr 13 2024, kde@carewolf.com wrote:
> > From: Allan Sandfeld Jensen <allan.jensen@qt.io>
> 
> FWIW, this patch neesd a commit description and signed-offs
> 
> > ---
> > 
> >  drivers/hid/hid-ids.h            |  1 +
> >  drivers/hid/hid-logitech-dj.c    | 10 +++++++++-
> >  drivers/hid/hid-logitech-hidpp.c |  2 ++
> >  3 files changed, 12 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> > index 2235d78784b1..4b79c4578d32 100644
> > --- a/drivers/hid/hid-ids.h
> > +++ b/drivers/hid/hid-ids.h
> > @@ -849,6 +849,7 @@
> > 
> >  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1    0xc539
> >  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1  0xc53f
> >  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY       0xc53a
> > 
> > +#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER         0xc548
> > 
> >  #define USB_DEVICE_ID_SPACETRAVELLER 0xc623
> >  #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
> >  #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
> > 
> > diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
> > index c358778e070b..92b41ae5a47c 100644
> > --- a/drivers/hid/hid-logitech-dj.c
> > +++ b/drivers/hid/hid-logitech-dj.c
> > @@ -120,6 +120,7 @@ enum recvr_type {
> > 
> >       recvr_type_27mhz,
> >       recvr_type_bluetooth,
> >       recvr_type_dinovo,
> > 
> > +     recvr_type_bolt,
> 
> I am *really* hesitant in integrating the bolt receiver into
> logitech-dj.ko:
> - the bolt receiver is not capable of making the distinction between the
>   source of the events (so only one mouse/keyboard can be used at the
>   time)
> - we still have a couple of outstanding and impossible to debug issues
>   with some high resolution mice connected over the unifying receiver,
>   and adding one more receiver makes me nervous
> - I have a strong feeling by reading the code that the keyboard part
>   will fail (there is a comment "For the keyboard, we can reuse the same
>   report by using the second byte which is constant in the USB HID
>   report descriptor." though I can't seem to find this constant report
>   on the bolt receiver)
> - what are the benefits of adding it?
> - will it break fwupd?
> 
I added it to get hires scroll wheel events working out of the box.

The main differences for the bolt receiver as I briefly skimmed it, are 
different peering commands, which I didn't want to touch that.

For my purpose I discovered the bolt receiver operated much like the gaming-
hidpp receiver, except that I have four interfaces.

> >  };
> >  
> >  struct dj_report {
> > 
> > @@ -1068,6 +1069,7 @@ static void logi_hidpp_recv_queue_notif(struct
> > hid_device *hdev,> 
> >               workitem.reports_supported |= STD_KEYBOARD;
> >               break;
> >       
> >       case 0x0f:
> > +     case 0x10:
> >       case 0x11:
> >               device_type = "eQUAD Lightspeed 1.2";
> >               logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report,
> >               &workitem);
> > 
> > @@ -1430,7 +1432,8 @@ static int logi_dj_ll_parse(struct hid_device *hid)
> > 
> >               dbg_hid("%s: sending a mouse descriptor, reports_supported:
> >               %llx\n",
> >               
> >                       __func__, djdev->reports_supported);
> >               
> >               if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp
> >               ||
> > 
> > -                 djdev->dj_receiver_dev->type == recvr_type_mouse_only)
> > +                 djdev->dj_receiver_dev->type == recvr_type_mouse_only ||
> > +                 djdev->dj_receiver_dev->type == recvr_type_bolt)
> > 
> >                       rdcat(rdesc, &rsize, mse_high_res_descriptor,
> >                       
> >                             sizeof(mse_high_res_descriptor));
> >               
> >               else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
> > 
> > @@ -1773,6 +1776,7 @@ static int logi_dj_probe(struct hid_device *hdev,
> > 
> >       case recvr_type_dj:             no_dj_interfaces = 3; break;
> >       case recvr_type_hidpp:          no_dj_interfaces = 2; break;
> >       case recvr_type_gaming_hidpp:   no_dj_interfaces = 3; break;
> > 
> > +     case recvr_type_bolt:           no_dj_interfaces = 4; break;
> 
> 4? The device I have here only has 3 (unless I misremember how this is
> supposed to be working).
> 
I am getting four. The fourth one is the one with 0x10 case I added above.
[    5.706399] logitech-djreceiver 0003:046D:C548.0003: device of type eQUAD 
Lightspeed 1.2 (0x10) connected on slot 2

You can leave out the added 0x10 case, and just treat the bolt receiver as a 
gaming_hidpp receiver I assume. I got an error there about unknown device, 
when I originaly tried just using the gaming_hidpp type, but it is possible it 
could still work (I hit another bug when I originally tried that) . I can go 
back and check if you would prefer this minimalist solution?

I dont have any additional bolt capable devices, so I can't test how it would 
work if I peered more devices.

Best regards
Allan
Hans de Goede April 15, 2024, 6:31 p.m. UTC | #3
Hi,

On 4/15/24 5:54 PM, Benjamin Tissoires wrote:
> [Ccing Hans as well for input]
> 
> On Apr 13 2024, kde@carewolf.com wrote:
>> From: Allan Sandfeld Jensen <allan.jensen@qt.io>
>>
> 
> FWIW, this patch neesd a commit description and signed-offs
> 
>> ---
>>  drivers/hid/hid-ids.h            |  1 +
>>  drivers/hid/hid-logitech-dj.c    | 10 +++++++++-
>>  drivers/hid/hid-logitech-hidpp.c |  2 ++
>>  3 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
>> index 2235d78784b1..4b79c4578d32 100644
>> --- a/drivers/hid/hid-ids.h
>> +++ b/drivers/hid/hid-ids.h
>> @@ -849,6 +849,7 @@
>>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1	0xc539
>>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1	0xc53f
>>  #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY	0xc53a
>> +#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER		0xc548
>>  #define USB_DEVICE_ID_SPACETRAVELLER	0xc623
>>  #define USB_DEVICE_ID_SPACENAVIGATOR	0xc626
>>  #define USB_DEVICE_ID_DINOVO_DESKTOP	0xc704
>> diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
>> index c358778e070b..92b41ae5a47c 100644
>> --- a/drivers/hid/hid-logitech-dj.c
>> +++ b/drivers/hid/hid-logitech-dj.c
>> @@ -120,6 +120,7 @@ enum recvr_type {
>>  	recvr_type_27mhz,
>>  	recvr_type_bluetooth,
>>  	recvr_type_dinovo,
>> +	recvr_type_bolt,
> 
> I am *really* hesitant in integrating the bolt receiver into
> logitech-dj.ko:
> - the bolt receiver is not capable of making the distinction between the
>   source of the events (so only one mouse/keyboard can be used at the
>   time)
> - we still have a couple of outstanding and impossible to debug issues
>   with some high resolution mice connected over the unifying receiver,
>   and adding one more receiver makes me nervous
> - I have a strong feeling by reading the code that the keyboard part
>   will fail (there is a comment "For the keyboard, we can reuse the same
>   report by using the second byte which is constant in the USB HID
>   report descriptor." though I can't seem to find this constant report
>   on the bolt receiver)
> - what are the benefits of adding it?
> - will it break fwupd?

FWIW I'm also not in favor of stretching drivers/hid/hid-logitech-dj.c
even further to also support the new bolt stuff.

AFAIK the new bolt stuff is significantly different.

Allan, I see in your other reply that you are mainly after
highres scrolling and since the bolt receiver does not do
per paired device addressing I wonder if you cannot just
get that by treating the bolt receiver as a wired HIDPP
device and just directly listing it as such in
hid-logitech-hidpp.c ?

The whole purpose of hid-logitech-dj.c is to create 1 virtual
hidpp devices per paired device and with bolt that is not
possible, so I think that we should circumvent hid-logitech-dj.c
for bolt and if we want to use any hidpp features do so
by directly listing the receivers in hid-logitech-hidpp.c .

Regards,

Hans





> 
>>  };
>>  
>>  struct dj_report {
>> @@ -1068,6 +1069,7 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
>>  		workitem.reports_supported |= STD_KEYBOARD;
>>  		break;
>>  	case 0x0f:
>> +	case 0x10:
>>  	case 0x11:
>>  		device_type = "eQUAD Lightspeed 1.2";
>>  		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
>> @@ -1430,7 +1432,8 @@ static int logi_dj_ll_parse(struct hid_device *hid)
>>  		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
>>  			__func__, djdev->reports_supported);
>>  		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
>> -		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
>> +		    djdev->dj_receiver_dev->type == recvr_type_mouse_only ||
>> +		    djdev->dj_receiver_dev->type == recvr_type_bolt)
>>  			rdcat(rdesc, &rsize, mse_high_res_descriptor,
>>  			      sizeof(mse_high_res_descriptor));
>>  		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
>> @@ -1773,6 +1776,7 @@ static int logi_dj_probe(struct hid_device *hdev,
>>  	case recvr_type_dj:		no_dj_interfaces = 3; break;
>>  	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
>>  	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
>> +	case recvr_type_bolt:		no_dj_interfaces = 4; break;
> 
> 4? The device I have here only has 3 (unless I misremember how this is
> supposed to be working).
> 
>>  	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
>>  	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
>>  	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
>> @@ -1950,6 +1954,10 @@ static const struct hid_device_id logi_dj_receivers[] = {
>>  	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
>>  		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
>>  	 .driver_data = recvr_type_dj},
>> +	{ /* Logitech bolt receiver (0xc548) */
>> +	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
>> +		USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER),
>> +	 .driver_data = recvr_type_bolt},
>>  
>>  	{ /* Logitech Nano mouse only receiver (0xc52f) */
>>  	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
>> diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
>> index 3c00e6ac8e76..509142982daa 100644
>> --- a/drivers/hid/hid-logitech-hidpp.c
>> +++ b/drivers/hid/hid-logitech-hidpp.c
>> @@ -4380,6 +4380,8 @@ static const struct hid_device_id hidpp_devices[] = {
>>  	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
>>  	{ /* MX Master 3S mouse over Bluetooth */
>>  	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
>> +	{ /* MX Anywhere 3SB mouse over Bluetooth */
>> +	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb038) },
> 
> That I can accept, however know that there is a regression in bluez
> 0.73[0] (but it should be fixed in 0.74)
> 
> Cheers,
> Benjamin
> 
> 
> [0] https://github.com/bluez/bluez/issues/778#issuecomment-2048870358
> 
>>  	{}
>>  };
>>  
>> -- 
>> 2.39.2
>>
>
Allan Sandfeld Jensen April 24, 2024, 11:30 a.m. UTC | #4
On Monday 15 April 2024 20:31:14 CEST Hans de Goede wrote:
> Hi,
> 
> On 4/15/24 5:54 PM, Benjamin Tissoires wrote:
> > [Ccing Hans as well for input]
> > 
> > On Apr 13 2024, kde@carewolf.com wrote:
> >> From: Allan Sandfeld Jensen <allan.jensen@qt.io>
> > 
> > FWIW, this patch neesd a commit description and signed-offs
> > 

Will add.

> 
> FWIW I'm also not in favor of stretching drivers/hid/hid-logitech-dj.c
> even further to also support the new bolt stuff.
> 
> AFAIK the new bolt stuff is significantly different.
> 
> Allan, I see in your other reply that you are mainly after
> highres scrolling and since the bolt receiver does not do
> per paired device addressing I wonder if you cannot just
> get that by treating the bolt receiver as a wired HIDPP
> device and just directly listing it as such in
> hid-logitech-hidpp.c ?
> 
> The whole purpose of hid-logitech-dj.c is to create 1 virtual
> hidpp devices per paired device and with bolt that is not
> possible, so I think that we should circumvent hid-logitech-dj.c
> for bolt and if we want to use any hidpp features do so
> by directly listing the receivers in hid-logitech-hidpp.c .
> 
I think the bolt receiver is able to separate devices, but yes, it appears the 
way it transmits device IDs and pairs has changed (some new registers it looks 
like). I am removing this part of the patch. I am not adding the Bolt receiver 
to hid-logitech-hidpp.c either though, because it doesnt work for me, and I 
havent invested time yet to figure out what would be needed to get it to work.

I will transmit a patch with just the new bluetooth ID, and add a few more I 
managed to find to fill out hid-logitech-hidpp.c

Best regards
Allan Sandfeld Jensen
diff mbox series

Patch

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 2235d78784b1..4b79c4578d32 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -849,6 +849,7 @@ 
 #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1	0xc539
 #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1	0xc53f
 #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY	0xc53a
+#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER		0xc548
 #define USB_DEVICE_ID_SPACETRAVELLER	0xc623
 #define USB_DEVICE_ID_SPACENAVIGATOR	0xc626
 #define USB_DEVICE_ID_DINOVO_DESKTOP	0xc704
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index c358778e070b..92b41ae5a47c 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -120,6 +120,7 @@  enum recvr_type {
 	recvr_type_27mhz,
 	recvr_type_bluetooth,
 	recvr_type_dinovo,
+	recvr_type_bolt,
 };
 
 struct dj_report {
@@ -1068,6 +1069,7 @@  static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
 		workitem.reports_supported |= STD_KEYBOARD;
 		break;
 	case 0x0f:
+	case 0x10:
 	case 0x11:
 		device_type = "eQUAD Lightspeed 1.2";
 		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
@@ -1430,7 +1432,8 @@  static int logi_dj_ll_parse(struct hid_device *hid)
 		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
 			__func__, djdev->reports_supported);
 		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
-		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
+		    djdev->dj_receiver_dev->type == recvr_type_mouse_only ||
+		    djdev->dj_receiver_dev->type == recvr_type_bolt)
 			rdcat(rdesc, &rsize, mse_high_res_descriptor,
 			      sizeof(mse_high_res_descriptor));
 		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
@@ -1773,6 +1776,7 @@  static int logi_dj_probe(struct hid_device *hdev,
 	case recvr_type_dj:		no_dj_interfaces = 3; break;
 	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
 	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
+	case recvr_type_bolt:		no_dj_interfaces = 4; break;
 	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
 	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
 	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
@@ -1950,6 +1954,10 @@  static const struct hid_device_id logi_dj_receivers[] = {
 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
 		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
 	 .driver_data = recvr_type_dj},
+	{ /* Logitech bolt receiver (0xc548) */
+	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
+		USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER),
+	 .driver_data = recvr_type_bolt},
 
 	{ /* Logitech Nano mouse only receiver (0xc52f) */
 	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 3c00e6ac8e76..509142982daa 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -4380,6 +4380,8 @@  static const struct hid_device_id hidpp_devices[] = {
 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb023) },
 	{ /* MX Master 3S mouse over Bluetooth */
 	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb034) },
+	{ /* MX Anywhere 3SB mouse over Bluetooth */
+	  HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb038) },
 	{}
 };