Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions drivers/net/ethernet/microchip/lan966x/lan966x_fdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -717,11 +717,6 @@ int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev)
return NETDEV_TX_BUSY;
}

if (skb_put_padto(skb, ETH_ZLEN)) {
dev->stats.tx_dropped++;
return NETDEV_TX_OK;
}

/* skb processing */
needed_headroom = max_t(int, IFH_LEN_BYTES - skb_headroom(skb), 0);
needed_tailroom = max_t(int, ETH_FCS_LEN - skb_tailroom(skb), 0);
Expand Down
5 changes: 0 additions & 5 deletions drivers/net/ethernet/microchip/lan966x/lan966x_fdma_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,11 +283,6 @@ static int lan966x_fdma_pci_xmit(struct sk_buff *skb, __be32 *ifh,
return NETDEV_TX_BUSY;
}

if (skb_put_padto(skb, ETH_ZLEN)) {
dev->stats.tx_dropped++;
return NETDEV_TX_OK;
}

skb_tx_timestamp(skb);

virt_addr = fdma_dataptr_virt_get_contiguous(fdma, next_to_use, 0);
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/ethernet/microchip/lan966x/lan966x_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,11 @@ netdev_tx_t lan966x_xmit(struct lan966x_port *port,

ops = &lan966x->data->ops;

if (skb_put_padto(skb, ETH_ZLEN)) {
dev->stats.tx_dropped++;
return NETDEV_TX_OK;
}

spin_lock(&lan966x->tx_lock);
if (port->lan966x->fdma)
err = ops->fdma_xmit(skb, ifh, port->dev);
Expand Down
3 changes: 1 addition & 2 deletions drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_fdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,7 @@ static void lan969x_fdma_tx_clear_buf(struct sparx5 *sparx5, int weight)
db->len,
DMA_TO_DEVICE);

if (!db->ptp)
napi_consume_skb(db->skb, weight);
napi_consume_skb(db->skb, weight);
break;
case SPX5_DB_DATA_TYPE_XDPF:
/* XDP_REDIRECT or AF_XDP */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,7 @@ int lan969x_fdma_pci_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb)
sparx5_fdma_reload(sparx5, fdma);
}

if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
ptp = true;

if (!ptp)
dev_consume_skb_any(skb);
dev_consume_skb_any(skb);

return NETDEV_TX_OK;
}
Expand Down
5 changes: 1 addition & 4 deletions drivers/net/ethernet/microchip/sparx5/sparx5_fdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,6 @@ int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb)

fdma_dcb_advance(fdma);

if (skb_put_padto(skb, ETH_ZLEN))
return NETDEV_TX_OK;

if (!fdma_db_is_done(fdma_db_get(fdma, fdma->dcb_index, 0)))
return NETDEV_TX_BUSY;

Expand All @@ -299,7 +296,7 @@ int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb)

sparx5_fdma_reload(sparx5, fdma);

sparx5_consume_skb(skb);
dev_consume_skb_any(skb);

return NETDEV_TX_OK;
}
Expand Down
1 change: 0 additions & 1 deletion drivers/net/ethernet/microchip/sparx5/sparx5_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -1081,7 +1081,6 @@ u32 sparx5_mirror_monitor_get(struct sparx5 *sparx5, u32 idx);

/* sparx5_packet.c */
u32 sparx5_get_packet_pipeline_pt(enum sparx5_packet_pipeline_pt pt);
void sparx5_consume_skb(struct sk_buff *skb);
bool sparx5_skb_offloaded(struct sparx5 *sparx5, u32 port, struct sk_buff *skb);

/* sparx5_afi.c */
Expand Down
20 changes: 7 additions & 13 deletions drivers/net/ethernet/microchip/sparx5/sparx5_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ static int sparx5_inject(struct sparx5 *sparx5,
HRTIMER_MODE_REL);
}

sparx5_consume_skb(skb);
dev_consume_skb_any(skb);

return NETDEV_TX_OK;
}
Expand All @@ -297,6 +297,9 @@ netdev_tx_t sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev)
sparx5_set_port_ifh(sparx5, ifh, port->portno,
SPX5_PACKET_PIPELINE_PT_ANA_DONE);

if (skb_put_padto(skb, ETH_ZLEN))
return NETDEV_TX_OK;

if (sparx5->ptp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
if (sparx5_ptp_txtstamp_request(port, skb) < 0)
return NETDEV_TX_BUSY;
Expand Down Expand Up @@ -355,6 +358,9 @@ netdev_tx_t sparx5_port_xmit(struct sparx5_port *port, struct sk_buff *skb,

ops = &sparx5->data->ops;

if (skb_put_padto(skb, ETH_ZLEN))
return NETDEV_TX_OK;

spin_lock(&sparx5->tx_lock);
if (sparx5->fdma_irq > 0)
ret = ops->fdma_xmit(sparx5, ifh, skb);
Expand Down Expand Up @@ -448,18 +454,6 @@ void sparx5_port_inj_timer_setup(struct sparx5_port *port)
port->inj_timer.function = sparx5_injection_timeout;
}

void sparx5_consume_skb(struct sk_buff *skb)
{
bool ptp = false;

if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
ptp = true;

if (!ptp)
dev_consume_skb_any(skb);
}

bool sparx5_skb_offloaded(struct sparx5 *sparx5, u32 port, struct sk_buff *skb)
{
u32 val;
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,13 @@ int sparx5_ptp_txtstamp_request(struct sparx5_port *port,
}

skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
/* Increase reference count, in order to prevent double-free,
in case PTP IRQ happens after DMA is kicked off, but before
dev_consume_skb_any is called.
For PTP packets, skb is freed extra time by the PTP IRQ handler,
so we need to increase the reference count here.
*/
skb_get(skb);

skb_queue_tail(&port->tx_skbs, skb);
SPARX5_SKB_CB(skb)->ts_id = port->ts_id;
Expand All @@ -593,6 +600,7 @@ void sparx5_ptp_txtstamp_release(struct sparx5_port *port,
port->ts_id--;
sparx5->ptp_skbs--;
skb_unlink(skb, &port->tx_skbs);
dev_kfree_skb_any(skb);
spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags);
}

Expand Down