Re: I need advice with UPS connection. (ping)

From: Benjamin Tissoires
Date: Tue Nov 23 2021 - 11:33:54 EST

On Mon, Nov 22, 2021 at 10:35 PM Filipe Laíns <lains@xxxxxxxxxxxxx> wrote:
> On Mon, 2021-11-22 at 15:13 -0500, Alan Stern wrote:
> > On Mon, Nov 22, 2021 at 11:25:26AM -0500, David Niklas wrote:
> > > Ok, I first edited the kernel to return -ENOMEM like you suggested but
> > > the UPS still disconnected. I then edited it again to re-add the 1060
> > > byte request and the UPS still disconnected.
> > >
> > > I'm attaching the usbmon traces.
> > > If you need any additional info I'll do my best to provide it.
> >
> > Holy cow! I just realized what's going on. And these little changes
> > we've been messing around with have nothing to do with it.
> >
> > For the first time, I looked at the timestamps in the usbmon traces. It
> > turns out that the disconnects occur several seconds after the kernel
> > retrieves the HID report descriptor from the device. Under normal
> > conditions we would expect to see report packets coming in from the
> > device, starting just a fraction of a second after the descriptor is
> > received. But that isn't happening in the Linux traces, whereas it does
> > happen in the Windows pcap log.
> >
> > I would guess that the UPS is programmed to disconnect itself
> > electronically from the USB bus if it doesn't get any requests for
> > reports within a couple of seconds. That certainly would explain what
> > you've been seeing. I can't imagine why it would be programmed to
> > behave this way, but companies have been known to do stranger things.
> >
> > As for why the kernel doesn't try to get the reports... That's a little
> > harder to answer. Maybe Jiri or Benjamin will know something about it.

I am not sure exactly what is going on there.
There are a couple of things that come to my mind:
- for quite some time now, we don't fetch all reports whenever we
connect a new device. This was known to be problematic on some devices
(see all the devices with HID_QUIRK_NOGET or
HID_QUIRK_NO_INIT_REPORT), and the default to not poll input values on
plug for devices is actually safer. If you want to revert, we will
have to have a special driver for this one I guess
- HID_QUIRK_ALWAYS_POLL *might* be a way to force the device to stay
with a USB connection up.

> >
> > The UPS's vendor ID is 0d9f (POWERCOM) and the product ID is 0004. Now,
> > the drivers/hid/hid-quirks.c file contains a quirk entry for 0d9f:0002
> > (product POWERCOM_UPS), which is probably an earlier model of the same
> > device, or a very similar device. This quirk entry is in the
> > hid_ignore_list; it tells the HID core not to handle the device at all.
> >
> > I don't know why that quirk entry is present, and furthermore, it can't
> > directly affect what is happening with your device because the product
> > IDs are different. Still, it is an indication that something strange is
> > going on behind the scenes.
> >
> > Perhaps there is no kernel driver for these UPS devices? Perhaps the
> > intention is that some user program will handle all the communication
> > when one of them is detected? A quick search on Google turns up
> > usbhid-ups, part of Network USB Tools (NUT) -- maybe you need to
> > install that package in order to use the device.

I don't have enough experience with UPS here to be helpful,
unfortunately. But What Alan said made a lot of sense. Maybe the NUT
people will have a better insight.

> >
> > I don't know what the full story is. With luck, Jiri or Benjamin can
> > help more.
> >
> > Alan Stern
> hid-generic should be able to handle these devices, but UPSes are much less
> tested than normal input peripherals, so it's not that surprising that there may
> be some unexpected weirdness. FWIW, I have two UPSes, one works OOTB and the
> other doesn't, I have been meaning to investigate the issue. However, David's
> case seems to me like a hardware quirk, but that's just my guess.

Yep, that seems to validate the fact that this UPS needs some care...