LF-457: ocelot: tsn: clean preempt interrupt status

The INTB interrupt is used both for 1588 interrupt and preemption status
change interrupt on each port. So clean preempt status interrupt in IRQ
handle function. Without handling it, driver may get interrupt storm.

Signed-off-by: Xiaoliang Yang <xiaoliang.yang_1@nxp.com>
Reviewed-by: Po Liu <Po.Liu@nxp.com>
(cherry picked from commit 0df3452eb1)
This commit is contained in:
Xiaoliang Yang 2020-02-11 15:33:46 +08:00 committed by Jason Liu
parent 728ee5c427
commit 68430e200e
3 changed files with 16 additions and 4 deletions

View File

@ -688,12 +688,9 @@ static irqreturn_t felix_irq_handler(int irq, void *data)
/* The INTB interrupt is used for both PTP TX timestamp interrupt
* and preemption status change interrupt on each port.
*
* - Get txtstamp if have
* - TODO: handle preemption. Without handling it, driver may get
* interrupt storm.
*/
ocelot_preempt_irq_clean(ocelot);
ocelot_get_txtstamp(ocelot);
return IRQ_HANDLED;

View File

@ -1570,3 +1570,17 @@ int ocelot_dscp_set(struct ocelot *ocelot, int port,
return 0;
}
void ocelot_preempt_irq_clean(struct ocelot *ocelot)
{
struct ocelot_port *ocelot_port;
int port;
u32 val;
val = DEV_GMII_MM_STATISTICS_MM_STATUS_PRMPT_ACTIVE_STICKY;
for (port = 0; port < ocelot->num_phys_ports; port++) {
ocelot_port = ocelot->ports[port];
ocelot_port_rmwl(ocelot_port, val, val,
DEV_GMII_MM_STATISTICS_MM_STATUS);
}
}

View File

@ -592,4 +592,5 @@ int ocelot_rtag_parse_enable(struct ocelot *ocelot, u8 port);
int ocelot_dscp_set(struct ocelot *ocelot, int port,
bool enable, const u8 dscp_ix,
struct tsn_qos_switch_dscp_conf *c);
void ocelot_preempt_irq_clean(struct ocelot *ocelot);
#endif