Message ID | 20210213223801.1334216-3-olteanv@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | d7795f8f26d944ede937d750b1804c080edf86c3 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | PTP for DSA tag_ocelot_8021q | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | success | CCed 7 of 7 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, 8 lines checked |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
netdev/stable | success | Stable not CCed |
On 2/13/2021 14:37, Vladimir Oltean wrote: > From: Vladimir Oltean <vladimir.oltean@nxp.com> > > It appears that the intention of this snippet of code is to not exit > ocelot_xtr_irq_handler() while in the middle of extracting a frame. > The problem in extracting it word by word is that future extraction > attempts are really easy to get desynchronized, since the IRQ handler > assumes that the first 16 bytes are the IFH, which give further > information about the frame, such as frame length. > > But during normal operation, "err" will not be 0, but 4, set from here: > > for (i = 0; i < OCELOT_TAG_LEN / 4; i++) { > err = ocelot_rx_frame_word(ocelot, grp, true, &ifh[i]); > if (err != 4) > break; > } > > if (err != 4) > break; > > In that case, draining the extraction queue is a no-op. So explicitly > make this code execute only on negative err. > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff --git a/drivers/net/ethernet/mscc/ocelot_vsc7514.c b/drivers/net/ethernet/mscc/ocelot_vsc7514.c index 590297d5e144..d19efbe6ffd3 100644 --- a/drivers/net/ethernet/mscc/ocelot_vsc7514.c +++ b/drivers/net/ethernet/mscc/ocelot_vsc7514.c @@ -701,7 +701,7 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void *arg) dev->stats.rx_packets++; } - if (err) + if (err < 0) while (ocelot_read(ocelot, QS_XTR_DATA_PRESENT) & BIT(grp)) ocelot_read_rix(ocelot, QS_XTR_RD, grp);