hid-tmff2
hid-tmff2 copied to clipboard
Thrustmaster TX Support
Hello,
I was looking for support for a Thrustmaster TX wheel. Mine is the Ferrari 458 wheel, but it is technically a Thrustmaster TX.
https://support.thrustmaster.com/en/product/txracingwheel-en/
From my understanding, this wheel is the same as the T300RS, but for Xbox/PC instead of PS4/PC. The drivers on Windows use the same files.
I was able to get the wheel working with tmdriv, but it did not have FFB.
I would love if there would be support for my wheel on Linux!
thanks!
Hi, I could try adding the wheel ID to my driver, if we're lucky it might work without much tweaking. Although I wouldn't say it's bound to work, as the T500 also uses the same driver installer files but doesn't work the same way as a T300. Not sure about the base, looks very similar but I guess we'll see.
I see you've found the hid-tminit
repo. Apparently the TX requires a two-step boot process, at least based on https://gitlab.com/her0/tmdrv/-/blob/master/tmdrv_devices/thrustmaster_tx.py. Shouldn't be an issue, but probably requires modifying the driver a bit more than just adding a wheel value as all other wheels are single stage.
Okay, let's try to get the PC mode working. I added the TX to the hid-tminit
module accept list according to what I found in tmdrv. Please install my fork: https://github.com/Kimplul/hid-tminit/tree/master
With the fork installed, please show the dmesg
output when plugging in the wheel. There should be an error about an unknown ID, which should be one of the values we're missing. Once we have this, we should be able to move on to tackle the second boot stage.
Okay, let's try to get the PC mode working. I added the TX to the hid-tminit module accept list according to what I found in tmdrv. Please install my fork: https://github.com/Kimplul/hid-tminit/tree/master
First off, thanks for looking into this for me! I am a bit of a linux noob (trying to set this up on my steamdeck).
I cloned your fork into a folder, went into that folder and ran make
and it returned this error:
error: implicit declaration of function ‘hid_is_usb’ [-Werror=implicit-function-declaration] 300 | if (!hid_is_usb(hdev)) | ^~~~~~~~~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:272: /home/deck/Downloads/hid-tminit/hid-tminit.o] Error 1 make[1]: *** [Makefile:1847: /home/deck/Downloads/hid-tminit] Error 2 make[1]: Leaving directory '/usr/lib/modules/5.13.0-valve21.3-1-neptune/build' make: *** [Makefile:5: all] Error 2
Not sure if it is a configuration issue on my end, or something with the file. I am getting the sense that the veriable needs to be declared before it is used, but I am unsure what to declare it as.
Any help is appreciated.
Not sure if it is a configuration issue on my end, or something with the file. I am getting the sense that the veriable needs to be declared before it is used, but I am unsure what to declare it as.
Should be provided for you in linux/hid.h
: https://elixir.bootlin.com/linux/v6.1-rc1/source/include/linux/hid.h#L867
Apparently the steam deck headers are slightly different, or there's some config issues. If that is the only error, you could try removing the if statement, it's mostly for paranoia, and we can try to figure out the root cause later.
Btw, I'm not familiar with the steam deck, how are you compiling things? Is there a kernel header package and have you installed it?
I think this inline wasn't introduced until some later 5.x version. Probably Steam Deck uses a kernel that doesn't have this inline yet.
Thanks for the tip, 5.15 apparently. Solves that mystery.
Btw, I'm not familiar with the steam deck, how are you compiling things? Is there a kernel header package and have you installed it?
I am not 100% on linux things, but I installed the 5.13.0-valve21.3-1-neptune header via pacman. The package was called pacman -S linux-neptune-headers
I can try removing that if and seeing where that gets me. Thanks to both for the help so far!
@Kimplul
It was able to make and install after removing the if. Wheel is showing in dmesg but not recognized in games just yet.
dmesg didn't work at first so I ran what I found here: https://unix.stackexchange.com/questions/390184/dmesg-read-kernel-buffer-failed-permission-denied
% sudo sysctl kernel.dmesg_restrict=0
kernel.dmesg_restrict = 0
My dmesg
is as follows:
[ 256.681760] usb 1-1.3: new full-speed USB device number 4 using xhci_hcd [ 256.810799] usb 1-1.3: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 256.810812] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 256.810816] usb 1-1.3: Product: Thrustmaster TX GIP Racing Wheel [ 256.810819] usb 1-1.3: Manufacturer: Thrustmaster [ 256.810822] usb 1-1.3: SerialNumber: 0000000000000000 (deck@steamdeck hid-tminit)$
I suspect sudo dmesg
would also work but in any case, the hid-tminit
driver isn't picking up the wheel for some reason. Could you try sudo modprobe hid-tminit
and replugging the wheel?
[ 852.382679] cs35l41 spi-VLV1776:00: DSP1: Firmware version: 3 [ 852.382688] cs35l41 spi-VLV1776:00: DSP1: cs35l41-dsp1-spk-prot.wmfw: Fri 02 Apr 2021 21:03:50 W. Europe Daylight Time [ 852.446128] cs35l41 spi-VLV1776:00: DSP1: Firmware: 400a4 vendor: 0x2 v0.33.0, 2 algorithms [ 852.446325] cs35l41 spi-VLV1776:00: DSP1: 0: ID cd v29.53.0 XM@94 YM@e [ 852.446345] cs35l41 spi-VLV1776:00: DSP1: 1: ID f20b v0.0.1 XM@170 YM@0 [ 852.458279] cs35l41 spi-VLV1776:01: DSP1: Firmware version: 3 [ 852.458288] cs35l41 spi-VLV1776:01: DSP1: cs35l41-dsp1-spk-prot.wmfw: Fri 02 Apr 2021 21:03:50 W. Europe Daylight Time [ 852.521241] cs35l41 spi-VLV1776:01: DSP1: Firmware: 400a4 vendor: 0x2 v0.33.0, 2 algorithms [ 852.521412] cs35l41 spi-VLV1776:01: DSP1: 0: ID cd v29.53.0 XM@94 YM@e [ 852.521420] cs35l41 spi-VLV1776:01: DSP1: 1: ID f20b v0.0.1 XM@170 YM@0 [ 853.105809] cs35l41 spi-VLV1776:00: DSP1: Firmware version: 3 [ 853.105820] cs35l41 spi-VLV1776:00: DSP1: cs35l41-dsp1-spk-prot.wmfw: Fri 02 Apr 2021 21:03:50 W. Europe Daylight Time [ 853.170199] cs35l41 spi-VLV1776:00: DSP1: Firmware: 400a4 vendor: 0x2 v0.33.0, 2 algorithms [ 853.170345] cs35l41 spi-VLV1776:00: DSP1: 0: ID cd v29.53.0 XM@94 YM@e [ 853.170352] cs35l41 spi-VLV1776:00: DSP1: 1: ID f20b v0.0.1 XM@170 YM@0 [ 853.183271] cs35l41 spi-VLV1776:01: DSP1: Firmware version: 3 [ 853.183280] cs35l41 spi-VLV1776:01: DSP1: cs35l41-dsp1-spk-prot.wmfw: Fri 02 Apr 2021 21:03:50 W. Europe Daylight Time [ 853.246664] cs35l41 spi-VLV1776:01: DSP1: Firmware: 400a4 vendor: 0x2 v0.33.0, 2 algorithms [ 853.246825] cs35l41 spi-VLV1776:01: DSP1: 0: ID cd v29.53.0 XM@94 YM@e [ 853.246832] cs35l41 spi-VLV1776:01: DSP1: 1: ID f20b v0.0.1 XM@170 YM@0 [ 858.539212] input: Microsoft X-Box 360 pad 0 as /devices/virtual/input/input33 [ 880.266571] hid_tminit: loading out-of-tree module taints kernel. [ 880.266654] hid_tminit: module verification failed: signature and/or required key missing - tainting kernel [ 888.822475] usb 1-1.3: new full-speed USB device number 6 using xhci_hcd [ 888.950433] usb 1-1.3: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 888.950442] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 888.950444] usb 1-1.3: Product: Thrustmaster TX GIP Racing Wheel [ 888.950446] usb 1-1.3: Manufacturer: Thrustmaster [ 888.950448] usb 1-1.3: SerialNumber: 0000000000000000
Added everything that seemed kinda relevant. but it looks like I am seeing something from tminit.
Just checking: did you also remove return -EINVAL;
after the if statement?
Just checking: did you also remove
return -EINVAL;
after the if statement?
Yep, commented out the statement like this:
FWIW, I did run into SSL errors when running the make. From what I am reading online, it looks like the module has to be signed, which I am not sure is possible on the steamdeck. Trying to look if there is a way to sign it myself or bypass the check altogether.
Generally speaking the SSL error should be treated more as a warning, and I can't see anything in the pasted output about the module being rejected, so I'm not entirely sure what's going on. Signing yourself is still probably a good idea.
I did notice that the dmesg
output reads hid-tminit
, whereas the current driver should show up as hid-thrustmaster
. Wonder if that's still the old version?
Could you paste the output of
sudo rmmod hid-tminit
sudo modprobe hid-thrustmaster
sude dmesg
Preferably unplugging the wheel before running the commands?
sudo rmmod hid-tminit sudo modprobe hid-thrustmaster sude dmesg
the output of this was insanely large. Saved to a file, hope its not a pain to look through :smile:
Sorry, should've been more clear, didn't need the whole output, just the bit that's generated when the wheel is plugged in.
Sorry, should've been more clear, didn't need the whole output, just the bit that's generated when the wheel is plugged in.
Do you need me to generate a new message? I made that dmesg when my wheel was unplugged. I can another one with the wheel plugged in or out if you need.
Yeah, what I meant was that the two first commands would hopefully load the newer module and the dmesg
to be like https://github.com/Kimplul/hid-tmff2/issues/48#issuecomment-1287086087 but hopefully with different output.
Yeah, what I meant was that the two first commands would hopefully load the newer module and the
dmesg
to be like #48 (comment) but hopefully with different output.
So we are looking for
[ 880.266571] hid_tminit: loading out-of-tree module taints kernel.
[ 880.266654] hid_tminit: module verification failed: signature and/or required key missing - tainting kernel
to instead say something about hid-thrustmaster?
Okay, so just to confirm, I am a bit confused on what would help you more:
- Remove existing tminit
-
sudo rmmod hid-tminit
-
sudo modprobe hid-thrustmaster
- plug in wheel
-
sudo dmesg
-
- Remove existing tminit and redo the install.
-
sudo rmmod hid-tminit
-
sudo modprobe hid-thrustmaster
- make
- sudo make install
- plug in wheel
-
sudo dmesg
-
What would you advise?
EDIT: After doing the second option dmesg no longer shows hid-tminit, but no mention of hid-thrustmaster. I have confirmed hid-thrustmaster exists in in my modules.
[ 77.712651] usb 1-1.2: new full-speed USB device number 4 using xhci_hcd [ 77.831882] usb 1-1.2: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 77.831909] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 77.831913] usb 1-1.2: Product: Thrustmaster TX GIP Racing Wheel [ 77.831916] usb 1-1.2: Manufacturer: Thrustmaster [ 77.831919] usb 1-1.2: SerialNumber: 0000000000000000
So we are looking for
[ 880.266571] hid_tminit: loading out-of-tree module > taints kernel. [ 880.266654] hid_tminit: module verification failed: signature and/or required key missing - tainting kernel
to instead say something about hid-thrustmaster?
Yep, pretty much. The confusing bit here is that the module's filename is hid-tminit
, but the .name
property in the driver is hid-thrustmaster
. This is apparently to keep up to the in-kernel counterpart.
Okay, so just to confirm, I am a bit confused on what would help you more:
Remove existing tminit sudo rmmod hid-tminit sudo modprobe hid-thrustmaster plug in wheel sudo dmesg Remove existing tminit and redo the install. sudo rmmod hid-tminit sudo modprobe hid-thrustmaster make sudo make install plug in wheel sudo dmesg
What would you advise?
The second one. Possibly also run sudo depmod -A
before plugging in the wheel.
By the by, you can also run sudo dmesg -w
first and then plug in the wheel, makes it a bit easier to see what exactly is new and what isn't. Same goes for rmmod
and modprobe
, so in one terminal sudo dmesg -w
and in another sudo modprobe ...
but do whatever is easier for you.
Sorry again for the confusing requests.
So we are looking for [ 880.266571] hid_tminit: loading out-of-tree module > taints kernel. [ 880.266654] hid_tminit: module verification failed: signature and/or required key missing - tainting kernel to instead say something about hid-thrustmaster?
Yep, pretty much. The confusing bit here is that the module's filename is
hid-tminit
, but the.name
property in the driver ishid-thrustmaster
. This is apparently to keep up to the in-kernel counterpart.Okay, so just to confirm, I am a bit confused on what would help you more:
Remove existing tminit sudo rmmod hid-tminit sudo modprobe hid-thrustmaster plug in wheel sudo dmesg Remove existing tminit and redo the install. sudo rmmod hid-tminit sudo modprobe hid-thrustmaster make sudo make install plug in wheel sudo dmesg
What would you advise?
The second one. Possibly also run
sudo depmod -A
before plugging in the wheel.By the by, you can also run
sudo dmesg -w
first and then plug in the wheel, makes it a bit easier to see what exactly is new and what isn't. Same goes forrmmod
andmodprobe
, so in one terminalsudo dmesg -w
and in anothersudo modprobe ...
but do whatever is easier for you.Sorry again for the confusing requests.
Lol do not be sorry, you are helping out here which I really appreciate :smile: But yeah, i was a bit confused as to why the driver would be hid-thrustmaster when the file is tminit, but i understand now.
I ran the second set of commands. I edited my last reply a ton to update info but I did run the second set of commands again, and hid-tminit is no longer showing up.
[ 1276.560471] usb 1-1.2: new full-speed USB device number 9 using xhci_hcd [ 1276.690403] usb 1-1.2: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 1276.690415] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1276.690419] usb 1-1.2: Product: Thrustmaster TX GIP Racing Wheel [ 1276.690450] usb 1-1.2: Manufacturer: Thrustmaster [ 1276.690453] usb 1-1.2: SerialNumber: 0000000000000000
I confirmed that hid-thrustmaster exists as a module and it is loaded via modprobe
but still not showing up when I plug in the wheel. It is loaded, as I can see it when i run lsmod
, but it says 0 devices are using it.
EDIT: On a side note, I have tried rebooting after all this, and I don't see hid-thrustmaster
loaded anymore, until I manually load it with modprobe hid-thrustmaster
.
Also, I ran sudo depmod -A
and nothing happened. It looks like it generates a make file? do I need to run that make file?
I love Plasma too.
But pasting screenshots instead of code diffs ('git diff $file.c' does wonders) is ridiculous at best.
On 10/21/22, Austin-2 @.***> wrote:
Just checking: did you also remove
return -EINVAL;
after the if statement?Yep, commented out the statement like this:
-- Reply to this email directly or view it on GitHub: https://github.com/Kimplul/hid-tmff2/issues/48#issuecomment-1287091836 You are receiving this because you are subscribed to this thread.
Message ID: @.***>
EDIT: On a side note, I have tried rebooting after all this, and I don't see hid-thrustmaster loaded anymore, until I manually load it with modprobe hid-thrustmaster.
Yeah, typically the kernel only loads the drivers when it needs to, and in this case the kernel for some reason doesn't associate the driver with the wheel, though I don't really understand why. The thrustmaster_devices
array contains the USB vendor and product IDs that the driver would like to be probed for, after which thrustmaster_probe()
should be called, but I don't see it happening in your dmesg
output for some reason. Manually loading the driver should really never be necessary, but it can be useful for forcing it out or in to the kernel when testing out changes.
Also, I ran sudo depmod -A and nothing happened. It looks like it generates a make file? do I need to run that make file?
I believe it updates the kernel's internal cache of available modules, it doesn't generate any files.
@isopix
But pasting screenshots instead of code diffs ('git diff $file.c' does wonders) is ridiculous at best.
Bit rude, though I agree with the sentiment.
EDIT: On a side note, I have tried rebooting after all this, and I don't see hid-thrustmaster loaded anymore, until I manually load it with modprobe hid-thrustmaster.
Yeah, typically the kernel only loads the drivers when it needs to, and in this case the kernel for some reason doesn't associate the driver with the wheel, though I don't really understand why. The
thrustmaster_devices
array contains the USB vendor and product IDs that the driver would like to be probed for, after whichthrustmaster_probe()
should be called, but I don't see it happening in yourdmesg
output for some reason. Manually loading the driver should really never be necessary, but it can be useful for forcing it out or in to the kernel when testing out changes.Also, I ran sudo depmod -A and nothing happened. It looks like it generates a make file? do I need to run that make file?
I believe it updates the kernel's internal cache of available modules, it doesn't generate any files.
Any ideas on where to go from here? Would the answer lie in updating hid-tminit to accept my device idea be the key here? Or really any other reasonable next steps
I suspect the tminit/thrustmaster
thing might be blocking us, I went ahead and created a dev
branch and renamed everything to hid-tminit-dev
:
https://github.com/Kimplul/hid-tminit/tree/dev
Please try it out, so
-
make
-
sudo make install
-
sudo depmod -A
-
sudo modprobe hid-tminit-dev
- plug in wheel
-
dmesg
We should see hid-tminit-dev
and at least know the newest code is being loaded.
No luck with that one.
[13302.158376] usb 1-1.2: new full-speed USB device number 10 using xhci_hcd [13302.286933] usb 1-1.2: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [13302.286946] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [13302.286950] usb 1-1.2: Product: Thrustmaster TX GIP Racing Wheel [13302.286953] usb 1-1.2: Manufacturer: Thrustmaster [13302.286956] usb 1-1.2: SerialNumber: 0000000000000000 [13387.200410] usb 1-1.2: USB disconnect, device number 10 [13395.084779] usb 1-1.2: new full-speed USB device number 11 using xhci_hcd [13395.213947] usb 1-1.2: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [13395.213958] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [13395.213962] usb 1-1.2: Product: Thrustmaster TX GIP Racing Wheel [13395.213965] usb 1-1.2: Manufacturer: Thrustmaster [13395.213967] usb 1-1.2: SerialNumber: 0000000000000000
No mention of hid-tminit-dev in that. Something odd I noticed, not sure if it will lead us anywhere, but `listing the modules returns
hid_tminit_dev 16384 0
Should it be hid_tminit_dev
or hid-tminit-dev
?
To be safe, I ran sudo modprobe
on both.
Also, part of me is wondering if !hid_is_usb
was necessary, is there any way I can declare that not inline?
Should it be hid_tminit_dev or hid-tminit-dev?
The underscores are expected, they're just for show I suppose. The commands work with dashes.
Also, part of me is wondering if !hid_is_usb was necessary, is there any way I can declare that not inline?
If you want to, you could just copy the definition from here: https://elixir.bootlin.com/linux/v6.1-rc1/source/include/linux/hid.h#L867
Though I doubt it'll do much, as I'm guessing you're connecting the wheel via USB and the line exists to fail if the device is not a USB device.
Did you get the module signing to work? My understanding is that unsigned modules should be prevented from loading, but I guess it could be possible that they're prevented from being probed as well.
Also, I wonder if the Steam Deck is making things difficult. Do you have some other Linux machine or virtual machine you could test?
Should it be hid_tminit_dev or hid-tminit-dev?
The underscores are expected, they're just for show I suppose. The commands work with dashes.
Also, part of me is wondering if !hid_is_usb was necessary, is there any way I can declare that not inline?
If you want to, you could just copy the definition from here: https://elixir.bootlin.com/linux/v6.1-rc1/source/include/linux/hid.h#L867
Though I doubt it'll do much, as I'm guessing you're connecting the wheel via USB and the line exists to fail if the device is not a USB device.
Yes it is a USB device. I can try this out. I assume I just copy over that definition somewhere before of that if statement and remove the exclamation from the original script.
Did you get the module signing to work? My understanding is that unsigned modules should be prevented from loading, but I guess it could be possible that they're prevented from being probed as well.
I didn’t try to sign the modules at all. Your understanding is what I have as well. The modules did show as loaded, and tminit did show the message in dmesg
and I believe it at least showing is just a warning that it is loaded, but not signed.
Also, I wonder if the Steam Deck is making things difficult. Do you have some other Linux machine or virtual machine you could test?
If the hid_is_usb doesn’t work, i can try this hopefully today or more likely tomorrow. Might just go with Ubuntu as that is what I am familiar with. Just gotta grab a usb drive big enough to run it off of.
Also, part of me is wondering if !hid_is_usb was necessary, is there any way I can declare that not inline?
If you want to, you could just copy the definition from here: https://elixir.bootlin.com/linux/v6.1-rc1/source/include/linux/hid.h#L867
Though I doubt it'll do much, as I'm guessing you're connecting the wheel via USB and the line exists to fail if the device is not a USB device.
Got the module to make and install, but had to manually load by inserting this definition. Since it has been a couple of days I forgot if this is new, but I am seeing hid-tminit-dev
in dmesg
[ 63.779627] hid_tminit_dev: loading out-of-tree module taints kernel. [ 63.779721] hid_tminit_dev: module verification failed: signature and/or required key missing - tainting kernel [ 78.664771] usb 1-1.2: new full-speed USB device number 4 using xhci_hcd [ 78.793641] usb 1-1.2: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 78.793653] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 78.793656] usb 1-1.2: Product: Thrustmaster TX GIP Racing Wheel [ 78.793659] usb 1-1.2: Manufacturer: Thrustmaster [ 78.793661] usb 1-1.2: SerialNumber: 0000000000000000
Did you get the module signing to work? My understanding is that unsigned modules should be prevented from loading, but I guess it could be possible that they're prevented from being probed as well.
Haven't figured out how to do this quite yet.
Also, I wonder if the Steam Deck is making things difficult. Do you have some other Linux machine or virtual machine you could test?
Just tried on Ubuntu, and no major differences vs. what I am seeing on the Steamdeck in regards to the dmesg
, except it is using usb 3.1 instead of 1.1.2, and I did not get the taints kernel message.
[ 1060.907810] hid_tminit_dev: module verification failed: signature and/or required key missing - tainting kernel [ 1081.896371] usb 3-1: new full-speed USB device number 4 using xhci_hcd [ 1082.070334] usb 3-1: New USB device found, idVendor=044f, idProduct=b664, bcdDevice= 1.01 [ 1082.070340] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1082.070342] usb 3-1: Product: Thrustmaster TX GIP Racing Wheel [ 1082.070344] usb 3-1: Manufacturer: Thrustmaster [ 1082.070345] usb 3-1: SerialNumber: 0000000000000000 [ 1162.405466] usb 3-1: USB disconnect, device number 4
Just tried on Ubuntu, and no differences vs. what I am seeing on the Steamdeck in regards to the dmesg.
This is arguably the most telling. Based on the dmesg
output, I'm starting to suspect that the wheel (or at least the initial stage) isn't reporting itself as a HID device, rather a raw USB device. hid-tminit
is a HID driver, and that might explain why it doesn't show up.
I don't know if it's possible to make the driver accept raw USB IDs or if we'd need a separate driver for it. I'll do some research and report back.
This is arguably the most telling. Based on the
dmesg
output, I'm starting to suspect that the wheel (or at least the initial stage) isn't reporting itself as a HID device, rather a raw USB device.hid-tminit
is a HID driver, and that might explain why it doesn't show up.
Do you know if there is anyway I can confirm this for you? Either on windows or Linux?
Not really, no. My plan is to maybe write a couple skeleton drivers to check if this theory holds water. Typically a HID device would get picked up by hid-generic
, which doesn't seem to be happening in this case, but I don't know if there are corner cases where this doesn't apply.
In other words, uncharted territory for me.