[OpenWrt-Devel] [BUG] lantiq: net: wrong operator
Kevin 'ldir' Darbyshire-Bryant
ldir at darbyshire-bryant.me.uk
Sun Feb 17 09:05:01 EST 2019
> On 17 Feb 2019, at 08:57, Mathias Kresin <dev at kresin.me> wrote:
>
> 08/02/2019 09:23, Petr Cvek:
>> Hello,
>> There is a wrong code in 0025-NET-MIPS-lantiq-adds-xrx200-net.patch [1], the original code:
>> + link->rx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0010);
>> + link->tx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) && 0x0020);
>> wants to mask the register value and is using a logical AND and not a bitwise AND.
>> The fix should be:
>> + link->rx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) & 0x0010);
>> + link->tx_flow = !!(xrx200sw_read_x(XRX200_MAC_CTRL_0_FCON, port) & 0x0020);
>> References:
>> [1] https://github.com/openwrt/openwrt/blob/master/target/linux/lantiq/patches-4.14/0025-NET-MIPS-lantiq-adds-xrx200-net.patch#L937
>>
>
> Hey Petr,
>
> it looks indeed wrong. And looking more closer at the lines, I don't get why we need the double negation.
Having seen this code structure before, it’s a non-obvious way of turning a masked and hence value based true/false into a binary 0 or 1 result: Exhibit A moronic demo c programme:
#include <stdio.h>
int main()
{
printf("%d\n", 5 & 4);
printf("%d\n", (5 & 4));
printf("%d\n", !(5 & 4));
printf("%d\n", !!(5 & 4));
}
Results in:
4
4
0
1
Cheers,
Kevin D-B
012C ACB2 28C6 C53E 9775 9123 B3A2 389B 9DE2 334A
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list