diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c b/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c index 2826e48af103..9f61692b243b 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c @@ -204,9 +204,10 @@ static void sparx5_ptp_classify(struct sparx5_port *port, struct sk_buff *skb, *rew_op = IFH_REW_OP_TWO_STEP_PTP; } -static void sparx5_ptp_txtstamp_old_release(struct sparx5_port *port) +static unsigned int sparx5_ptp_txtstamp_old_release(struct sparx5_port *port) { struct sk_buff *skb, *skb_tmp; + unsigned int purged = 0; unsigned long flags; spin_lock_irqsave(&port->tx_skbs.lock, flags); @@ -217,8 +218,11 @@ static void sparx5_ptp_txtstamp_old_release(struct sparx5_port *port) __skb_unlink(skb, &port->tx_skbs); dev_kfree_skb_any(skb); + purged++; } spin_unlock_irqrestore(&port->tx_skbs.lock, flags); + + return purged; } int sparx5_ptp_txtstamp_request(struct sparx5_port *port, @@ -226,6 +230,7 @@ int sparx5_ptp_txtstamp_request(struct sparx5_port *port, { struct sparx5 *sparx5 = port->sparx5; u8 rew_op, pdu_type, pdu_w16_offset; + unsigned int purged; unsigned long flags; sparx5_ptp_classify(port, skb, &rew_op, &pdu_type, &pdu_w16_offset); @@ -236,9 +241,10 @@ int sparx5_ptp_txtstamp_request(struct sparx5_port *port, if (rew_op != IFH_REW_OP_TWO_STEP_PTP) return 0; - sparx5_ptp_txtstamp_old_release(port); + purged = sparx5_ptp_txtstamp_old_release(port); spin_lock_irqsave(&sparx5->ptp_ts_id_lock, flags); + sparx5->ptp_skbs -= purged; if (sparx5->ptp_skbs == SPARX5_MAX_PTP_ID) { spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags); return -EBUSY;