diff mbox series

net: 6pack: Fix tx timeout and slot time

Message ID 20210909035743.1247042-1-linux@roeck-us.net (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series net: 6pack: Fix tx timeout and slot time | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Guessed tree name to be net-next
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cc_maintainers success CCed 5 of 5 maintainers
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 11 lines checked
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success Link

Commit Message

Guenter Roeck Sept. 9, 2021, 3:57 a.m. UTC
tx timeout and slot time are currently specified in units of HZ.
On Alpha, HZ is defined as 1024. When building alpha:allmodconfig,
this results in the following error message.

drivers/net/hamradio/6pack.c: In function 'sixpack_open':
drivers/net/hamradio/6pack.c:71:41: error:
	unsigned conversion from 'int' to 'unsigned char'
	changes value from '256' to '0'

In the 6PACK protocol, tx timeout is specified in units of 10 ms
and transmitted over the wire. Defining a value dependent on HZ
doesn't really make sense. Assume that the intent was to set tx
timeout and slot time based on a HZ value of 100 and use constants
instead of values depending on HZ for SIXP_TXDELAY and SIXP_SLOTTIME.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
No idea if this is correct or even makes sense. Compile tested only.

 drivers/net/hamradio/6pack.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

David Miller Sept. 9, 2021, 11:34 a.m. UTC | #1
From: Guenter Roeck <linux@roeck-us.net>
Date: Wed,  8 Sep 2021 20:57:43 -0700

> tx timeout and slot time are currently specified in units of HZ.
> On Alpha, HZ is defined as 1024. When building alpha:allmodconfig,
> this results in the following error message.
> 
> drivers/net/hamradio/6pack.c: In function 'sixpack_open':
> drivers/net/hamradio/6pack.c:71:41: error:
> 	unsigned conversion from 'int' to 'unsigned char'
> 	changes value from '256' to '0'
> 
> In the 6PACK protocol, tx timeout is specified in units of 10 ms
> and transmitted over the wire. Defining a value dependent on HZ
> doesn't really make sense. Assume that the intent was to set tx
> timeout and slot time based on a HZ value of 100 and use constants
> instead of values depending on HZ for SIXP_TXDELAY and SIXP_SLOTTIME.
> 
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> No idea if this is correct or even makes sense. Compile tested only.

These are timer offsets so they have to me HZ based.  Better to make the
structure members unsigned long, I think.

Thanks.
Guenter Roeck Sept. 9, 2021, 2:53 p.m. UTC | #2
On 9/9/21 4:34 AM, David Miller wrote:
> From: Guenter Roeck <linux@roeck-us.net>
> Date: Wed,  8 Sep 2021 20:57:43 -0700
> 
>> tx timeout and slot time are currently specified in units of HZ.
>> On Alpha, HZ is defined as 1024. When building alpha:allmodconfig,
>> this results in the following error message.
>>
>> drivers/net/hamradio/6pack.c: In function 'sixpack_open':
>> drivers/net/hamradio/6pack.c:71:41: error:
>> 	unsigned conversion from 'int' to 'unsigned char'
>> 	changes value from '256' to '0'
>>
>> In the 6PACK protocol, tx timeout is specified in units of 10 ms
>> and transmitted over the wire. Defining a value dependent on HZ
>> doesn't really make sense. Assume that the intent was to set tx
>> timeout and slot time based on a HZ value of 100 and use constants
>> instead of values depending on HZ for SIXP_TXDELAY and SIXP_SLOTTIME.
>>
>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
>> ---
>> No idea if this is correct or even makes sense. Compile tested only.
> 
> These are timer offsets so they have to me HZ based.  Better to make the
> structure members unsigned long, I think.
> 

Hmm, ok. Both tx_delay and slottime are updated in sp_encaps(), though,
from data in the transmit buffer. The KISS protocol description states
that the values are in units of 10ms; that is where my assumption
came from.

Command        Function         Comments
    0           Data frame       The  rest  of the frame is data to
                                 be sent on the HDLC channel.

    1           TXDELAY          The next  byte  is  the  transmitter
                                 keyup  delay  in  10 ms units.
                 		The default start-up value is 50
                                 (i.e., 500 ms).

    2           P                The next byte  is  the  persistence
                                 parameter,  p, scaled to the range
                                 0 - 255 with the following
                                 formula:

                                          P = p * 256 - 1

                                 The  default  value  is  P  =  63
                                 (i.e.,  p  =  0.25).

    3           SlotTime         The next byte is the slot interval
                                 in 10 ms units.
                                 The default is 10 (i.e., 100ms).

But then slottime is indeed used with jiffies, which is odd.

tx_delay is used (before it is updated) in encode_sixpack()
and added to a character buffer. I thought that was the value sent
on the wire (which would again be supposed to be in 10ms units).
I don't see where else it is used, but I may be missing it.
That means though it can not easily be changed to anything
but unsigned char.

Anyway, I am inclined to just mark the protocol as dependent on
!ALPHA. Would you accept that ?

Thanks,
Guenter
David Miller Sept. 9, 2021, 3:27 p.m. UTC | #3
From: Guenter Roeck <linux@roeck-us.net>
Date: Thu, 9 Sep 2021 07:53:29 -0700

> On 9/9/21 4:34 AM, David Miller wrote:
>> From: Guenter Roeck <linux@roeck-us.net>
>> Date: Wed,  8 Sep 2021 20:57:43 -0700
>> 
>>> tx timeout and slot time are currently specified in units of HZ.
>>> On Alpha, HZ is defined as 1024. When building alpha:allmodconfig,
>>> this results in the following error message.
>>>
>>> drivers/net/hamradio/6pack.c: In function 'sixpack_open':
>>> drivers/net/hamradio/6pack.c:71:41: error:
>>> 	unsigned conversion from 'int' to 'unsigned char'
>>> 	changes value from '256' to '0'
>>>
>>> In the 6PACK protocol, tx timeout is specified in units of 10 ms
>>> and transmitted over the wire. Defining a value dependent on HZ
>>> doesn't really make sense. Assume that the intent was to set tx
>>> timeout and slot time based on a HZ value of 100 and use constants
>>> instead of values depending on HZ for SIXP_TXDELAY and SIXP_SLOTTIME.
>>>
>>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
>>> ---
>>> No idea if this is correct or even makes sense. Compile tested only.
>> These are timer offsets so they have to me HZ based.  Better to make
>> the
>> structure members unsigned long, I think.
>> 
> 
> Hmm, ok. Both tx_delay and slottime are updated in sp_encaps(),
> though,
> from data in the transmit buffer. The KISS protocol description states
> that the values are in units of 10ms; that is where my assumption
> came from.

They are ms and must be converted using to HZ in order to use the values as timer offsets.

The values are perfectly fine, the types used to store them need to be fixed.

> Anyway, I am inclined to just mark the protocol as dependent on
> !ALPHA. Would you accept that ?

No, fix this properly.  Make the unsigfned char members be unsigned long.

Why do you not want to fix it this way?

Thank you.
Guenter Roeck Sept. 9, 2021, 4:44 p.m. UTC | #4
On 9/9/21 8:27 AM, David Miller wrote:
> From: Guenter Roeck <linux@roeck-us.net>
> Date: Thu, 9 Sep 2021 07:53:29 -0700
> 
>> On 9/9/21 4:34 AM, David Miller wrote:
>>> From: Guenter Roeck <linux@roeck-us.net>
>>> Date: Wed,  8 Sep 2021 20:57:43 -0700
>>>
>>>> tx timeout and slot time are currently specified in units of HZ.
>>>> On Alpha, HZ is defined as 1024. When building alpha:allmodconfig,
>>>> this results in the following error message.
>>>>
>>>> drivers/net/hamradio/6pack.c: In function 'sixpack_open':
>>>> drivers/net/hamradio/6pack.c:71:41: error:
>>>> 	unsigned conversion from 'int' to 'unsigned char'
>>>> 	changes value from '256' to '0'
>>>>
>>>> In the 6PACK protocol, tx timeout is specified in units of 10 ms
>>>> and transmitted over the wire. Defining a value dependent on HZ
>>>> doesn't really make sense. Assume that the intent was to set tx
>>>> timeout and slot time based on a HZ value of 100 and use constants
>>>> instead of values depending on HZ for SIXP_TXDELAY and SIXP_SLOTTIME.
>>>>
>>>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
>>>> ---
>>>> No idea if this is correct or even makes sense. Compile tested only.
>>> These are timer offsets so they have to me HZ based.  Better to make
>>> the
>>> structure members unsigned long, I think.
>>>
>>
>> Hmm, ok. Both tx_delay and slottime are updated in sp_encaps(),
>> though,
>> from data in the transmit buffer. The KISS protocol description states
>> that the values are in units of 10ms; that is where my assumption
>> came from.
> 
> They are ms and must be converted using to HZ in order to use the values as timer offsets.
> 
> The values are perfectly fine, the types used to store them need to be fixed.
> 
>> Anyway, I am inclined to just mark the protocol as dependent on
>> !ALPHA. Would you accept that ?
> 
> No, fix this properly.  Make the unsigfned char members be unsigned long.
> 
> Why do you not want to fix it this way?
> 

All I want is to get alpha:allmodconfig to compile, nothing else,
but at the same time I don't want to introduce new bugs.

If I make tx_delay unsigned long, it is still passed to encode_sixpack()
as parameter, and that parameter is declared unsigned char and put into
a byte sized buffer. If the value is 0x100, it will then be truncated to
0x0, only that is then done silently without generating a compile error.
Sure, that fixes the compile error, but not the underlying issue. Maybe
that truncation is perfectly fine, but I don't understand the code well
enough to make that call.

Never mind, I'll let someone else who has a better understanding of the code
deal with this.

Guenter
diff mbox series

Patch

diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
index 8fe8887d506a..6192244b304a 100644
--- a/drivers/net/hamradio/6pack.c
+++ b/drivers/net/hamradio/6pack.c
@@ -68,9 +68,9 @@ 
 #define SIXP_DAMA_OFF		0
 
 /* default level 2 parameters */
-#define SIXP_TXDELAY			(HZ/4)	/* in 1 s */
+#define SIXP_TXDELAY			25	/* 250 ms */
 #define SIXP_PERSIST			50	/* in 256ths */
-#define SIXP_SLOTTIME			(HZ/10)	/* in 1 s */
+#define SIXP_SLOTTIME			10	/* 100 ms */
 #define SIXP_INIT_RESYNC_TIMEOUT	(3*HZ/2) /* in 1 s */
 #define SIXP_RESYNC_TIMEOUT		5*HZ	/* in 1 s */