On Mon, 18 Nov 2024 at 11:48, Andrew.Yuan <andrew.y...@jaguarmicro.com> wrote: > > From: Andrew Yuan <andrew.y...@jaguarmicro.com> > > As in the Cadence IP for Gigabit Ethernet MAC Part Number: IP7014 IP Rev: > R1p12 - Doc Rev: 1.3 User Guide, > if the DISABLE_MASK bit in type2_compare_x_word_1 is set, > mask_value in type2_compare_x_word_0 is used as an additional 2 byte Compare > Value
I didn't find a copy of the datasheet to review this patch against. Edgar, Alistair -- could you have a look, please? thanks -- PMM > > Signed-off-by: Andrew Yuan <andrew.y...@jaguarmicro.com> > --- > hw/net/cadence_gem.c | 25 ++++++++++++++++++++----- > 1 file changed, 20 insertions(+), 5 deletions(-) > > diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c > index 526739887c..7ec5dbaa9c 100644 > --- a/hw/net/cadence_gem.c > +++ b/hw/net/cadence_gem.c > @@ -909,8 +909,8 @@ static int get_queue_from_screen(CadenceGEMState *s, > uint8_t *rxbuf_ptr, > > /* Compare A, B, C */ > for (j = 0; j < 3; j++) { > - uint32_t cr0, cr1, mask, compare; > - uint16_t rx_cmp; > + uint32_t cr0, cr1, mask, compare, disable_mask; > + uint32_t rx_cmp; > int offset; > int cr_idx = extract32(reg, > R_SCREENING_TYPE2_REG0_COMPARE_A_SHIFT + j * 6, > R_SCREENING_TYPE2_REG0_COMPARE_A_LENGTH); > @@ -946,9 +946,24 @@ static int get_queue_from_screen(CadenceGEMState *s, > uint8_t *rxbuf_ptr, > break; > } > > - rx_cmp = rxbuf_ptr[offset] << 8 | rxbuf_ptr[offset]; > - mask = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, MASK_VALUE); > - compare = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, COMPARE_VALUE); > + disable_mask = > + FIELD_EX32(cr1, TYPE2_COMPARE_0_WORD_1, DISABLE_MASK); > + if (disable_mask) { > + /* > + * If disable_mask is set, > + * mask_value is used as an additional 2 byte Compare Value. > + * To simple, set mask = 0xFFFFFFFF, if disable_maks is set. > + */ > + rx_cmp = rxbuf_ptr[offset + 3] << 8 | rxbuf_ptr[offset + 2] > |\ > + rxbuf_ptr[offset + 1] << 8 | rxbuf_ptr[offset]; > + mask = 0xFFFFFFFF; > + compare = cr0; > + } else { > + rx_cmp = rxbuf_ptr[offset + 1] << 8 | rxbuf_ptr[offset]; > + mask = FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, MASK_VALUE); > + compare = > + FIELD_EX32(cr0, TYPE2_COMPARE_0_WORD_0, COMPARE_VALUE); > + } > > if ((rx_cmp & mask) == (compare & mask)) { > matched = true; > -- > 2.25.1