Message ID | 20240529102458.557522-1-Shivasagar.Myana@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [QEMU,1/1] hw/net/can: Fix sorting of the tx queue | expand |
Hi Shiva, On Wed, May 29, 2024 at 03:54:58PM +0530, Shiva sagar Myana wrote: > Returning an uint32_t casted to a gint from g_cmp_ids causes the tx queue to > become wrongly sorted when executing g_slist_sort. Fix this by always > returning -1 or 1 from g_cmp_ids based on the ID comparison instead. > Also, if two message IDs are the same, sort them by using their index and > transmit the message at the lowest index first. > > Signed-off-by: Shiva sagar Myana <Shivasagar.Myana@amd.com> With the subject line modified to below (for clarity): "hw/net/can/xlnx-versal-canfd: Fix sorting of the tx queue" Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com> BR, F > --- > hw/net/can/xlnx-versal-canfd.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/hw/net/can/xlnx-versal-canfd.c b/hw/net/can/xlnx-versal-canfd.c > index 47a14cfe63..5f083c21e9 100644 > --- a/hw/net/can/xlnx-versal-canfd.c > +++ b/hw/net/can/xlnx-versal-canfd.c > @@ -1312,7 +1312,10 @@ static gint g_cmp_ids(gconstpointer data1, gconstpointer data2) > tx_ready_reg_info *tx_reg_1 = (tx_ready_reg_info *) data1; > tx_ready_reg_info *tx_reg_2 = (tx_ready_reg_info *) data2; > > - return tx_reg_1->can_id - tx_reg_2->can_id; > + if (tx_reg_1->can_id == tx_reg_2->can_id) { > + return (tx_reg_1->reg_num < tx_reg_2->reg_num) ? -1 : 1; > + } > + return (tx_reg_1->can_id < tx_reg_2->can_id) ? -1 : 1; > } > > static void free_list(GSList *list) > -- > 2.34.1 >
diff --git a/hw/net/can/xlnx-versal-canfd.c b/hw/net/can/xlnx-versal-canfd.c index 47a14cfe63..5f083c21e9 100644 --- a/hw/net/can/xlnx-versal-canfd.c +++ b/hw/net/can/xlnx-versal-canfd.c @@ -1312,7 +1312,10 @@ static gint g_cmp_ids(gconstpointer data1, gconstpointer data2) tx_ready_reg_info *tx_reg_1 = (tx_ready_reg_info *) data1; tx_ready_reg_info *tx_reg_2 = (tx_ready_reg_info *) data2; - return tx_reg_1->can_id - tx_reg_2->can_id; + if (tx_reg_1->can_id == tx_reg_2->can_id) { + return (tx_reg_1->reg_num < tx_reg_2->reg_num) ? -1 : 1; + } + return (tx_reg_1->can_id < tx_reg_2->can_id) ? -1 : 1; } static void free_list(GSList *list)
Returning an uint32_t casted to a gint from g_cmp_ids causes the tx queue to become wrongly sorted when executing g_slist_sort. Fix this by always returning -1 or 1 from g_cmp_ids based on the ID comparison instead. Also, if two message IDs are the same, sort them by using their index and transmit the message at the lowest index first. Signed-off-by: Shiva sagar Myana <Shivasagar.Myana@amd.com> --- hw/net/can/xlnx-versal-canfd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)