Skip to content

Commit edb72cf

Browse files
vlrplnbuchwitz
authored andcommitted
net: macb: generalize tx buffer handling
Rename struct macb_tx_buff member skb to ptr and introduce macb_tx_buff_type to identify the buffer type macb_tx_buff represents. Currently the buffer can only be MACB_TYPE_SKB, so the sk_buff case is handled unconditionally in the tx path. The remaining type handling will be handled by subsequent patches. This is the last preparatory step for XDP xmit support. Signed-off-by: Paolo Valerio <pvalerio@redhat.com>
1 parent 069e1f8 commit edb72cf

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

drivers/net/ethernet/cadence/macb.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -988,19 +988,28 @@ struct macb_dma_desc_ptp {
988988
/* Scaled PPM fraction */
989989
#define PPM_FRACTION 16
990990

991-
/* struct macb_tx_buff - data about an skb which is being transmitted
992-
* @skb: skb currently being transmitted, only set for the last buffer
993-
* of the frame
994-
* @mapping: DMA address of the skb's fragment buffer
991+
enum macb_tx_buff_type {
992+
MACB_TYPE_SKB,
993+
MACB_TYPE_XDP_TX,
994+
MACB_TYPE_XDP_NDO,
995+
};
996+
997+
/* struct macb_tx_buff - data about an skb or xdp frame which is being
998+
* transmitted.
999+
* @ptr: pointer to skb or xdp frame being transmitted, only set
1000+
* for the last buffer for sk_buff
1001+
* @mapping: DMA address of the skb's fragment or xdp buffer
9951002
* @size: size of the DMA mapped buffer
9961003
* @mapped_as_page: true when buffer was mapped with skb_frag_dma_map(),
9971004
* false when buffer was mapped with dma_map_single()
1005+
* @type: type of buffer (MACB_TYPE_SKB, MACB_TYPE_XDP_TX, MACB_TYPE_XDP_NDO)
9981006
*/
9991007
struct macb_tx_buff {
1000-
struct sk_buff *skb;
1001-
dma_addr_t mapping;
1002-
size_t size;
1003-
bool mapped_as_page;
1008+
void *ptr;
1009+
dma_addr_t mapping;
1010+
size_t size;
1011+
bool mapped_as_page;
1012+
enum macb_tx_buff_type type;
10041013
};
10051014

10061015
/* Hardware-collected statistics. Used when updating the network

drivers/net/ethernet/cadence/macb_main.c

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,8 @@ static int macb_halt_tx(struct macb *bp)
11361136
bp, TSR);
11371137
}
11381138

1139-
static void macb_tx_unmap(struct macb *bp, struct macb_tx_buff *tx_buff, int budget)
1139+
static void macb_tx_unmap(struct macb *bp, struct macb_tx_buff *tx_buff,
1140+
int budget)
11401141
{
11411142
if (tx_buff->mapping) {
11421143
if (tx_buff->mapped_as_page)
@@ -1148,9 +1149,9 @@ static void macb_tx_unmap(struct macb *bp, struct macb_tx_buff *tx_buff, int bud
11481149
tx_buff->mapping = 0;
11491150
}
11501151

1151-
if (tx_buff->skb) {
1152-
napi_consume_skb(tx_buff->skb, budget);
1153-
tx_buff->skb = NULL;
1152+
if (tx_buff->ptr) {
1153+
napi_consume_skb(tx_buff->ptr, budget);
1154+
tx_buff->ptr = NULL;
11541155
}
11551156
}
11561157

@@ -1241,15 +1242,15 @@ static void macb_tx_error_task(struct work_struct *work)
12411242
desc = macb_tx_desc(queue, tail);
12421243
ctrl = desc->ctrl;
12431244
tx_buff = macb_tx_buff(queue, tail);
1244-
skb = tx_buff->skb;
1245+
skb = tx_buff->ptr;
12451246

12461247
if (ctrl & MACB_BIT(TX_USED)) {
12471248
/* skb is set for the last buffer of the frame */
12481249
while (!skb) {
12491250
macb_tx_unmap(bp, tx_buff, 0);
12501251
tail++;
12511252
tx_buff = macb_tx_buff(queue, tail);
1252-
skb = tx_buff->skb;
1253+
skb = tx_buff->ptr;
12531254
}
12541255

12551256
/* ctrl still refers to the first buffer descriptor
@@ -1346,20 +1347,22 @@ static bool ptp_one_step_sync(struct sk_buff *skb)
13461347
static int macb_tx_complete(struct macb_queue *queue, int budget)
13471348
{
13481349
struct macb *bp = queue->bp;
1349-
u16 queue_index = queue - bp->queues;
13501350
unsigned long flags;
13511351
unsigned int tail;
13521352
unsigned int head;
1353+
u16 queue_index;
13531354
int packets = 0;
13541355
u32 bytes = 0;
13551356

1357+
queue_index = queue - bp->queues;
1358+
13561359
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
13571360
head = queue->tx_head;
13581361
for (tail = queue->tx_tail; tail != head && packets < budget; tail++) {
1359-
struct macb_tx_buff *tx_buff;
1360-
struct sk_buff *skb;
1361-
struct macb_dma_desc *desc;
1362-
u32 ctrl;
1362+
struct macb_tx_buff *tx_buff;
1363+
struct macb_dma_desc *desc;
1364+
struct sk_buff *skb;
1365+
u32 ctrl;
13631366

13641367
desc = macb_tx_desc(queue, tail);
13651368

@@ -1377,7 +1380,7 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
13771380
/* Process all buffers of the current transmitted frame */
13781381
for (;; tail++) {
13791382
tx_buff = macb_tx_buff(queue, tail);
1380-
skb = tx_buff->skb;
1383+
skb = tx_buff->ptr;
13811384

13821385
/* First, update TX stats if needed */
13831386
if (skb) {
@@ -2314,7 +2317,8 @@ static unsigned int macb_tx_map(struct macb *bp,
23142317
goto dma_error;
23152318

23162319
/* Save info to properly release resources */
2317-
tx_buff->skb = NULL;
2320+
tx_buff->ptr = NULL;
2321+
tx_buff->type = MACB_TYPE_SKB;
23182322
tx_buff->mapping = mapping;
23192323
tx_buff->size = size;
23202324
tx_buff->mapped_as_page = false;
@@ -2343,7 +2347,8 @@ static unsigned int macb_tx_map(struct macb *bp,
23432347
goto dma_error;
23442348

23452349
/* Save info to properly release resources */
2346-
tx_buff->skb = NULL;
2350+
tx_buff->ptr = NULL;
2351+
tx_buff->type = MACB_TYPE_SKB;
23472352
tx_buff->mapping = mapping;
23482353
tx_buff->size = size;
23492354
tx_buff->mapped_as_page = true;
@@ -2362,7 +2367,8 @@ static unsigned int macb_tx_map(struct macb *bp,
23622367
}
23632368

23642369
/* This is the last buffer of the frame: save socket buffer */
2365-
tx_buff->skb = skb;
2370+
tx_buff->ptr = skb;
2371+
tx_buff->type = MACB_TYPE_SKB;
23662372

23672373
/* Update TX ring: update buffer descriptors in reverse order
23682374
* to avoid race condition
@@ -5280,8 +5286,9 @@ static netdev_tx_t at91ether_start_xmit(struct sk_buff *skb,
52805286
netif_stop_queue(dev);
52815287

52825288
/* Store packet information (to free when Tx completed) */
5283-
lp->rm9200_txq[desc].skb = skb;
5289+
lp->rm9200_txq[desc].ptr = skb;
52845290
lp->rm9200_txq[desc].size = skb->len;
5291+
lp->rm9200_txq[desc].type = MACB_TYPE_SKB;
52855292
lp->rm9200_txq[desc].mapping = dma_map_single(&lp->pdev->dev, skb->data,
52865293
skb->len, DMA_TO_DEVICE);
52875294
if (dma_mapping_error(&lp->pdev->dev, lp->rm9200_txq[desc].mapping)) {
@@ -5373,9 +5380,9 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
53735380
dev->stats.tx_errors++;
53745381

53755382
desc = 0;
5376-
if (lp->rm9200_txq[desc].skb) {
5377-
dev_consume_skb_irq(lp->rm9200_txq[desc].skb);
5378-
lp->rm9200_txq[desc].skb = NULL;
5383+
if (lp->rm9200_txq[desc].ptr) {
5384+
dev_consume_skb_irq(lp->rm9200_txq[desc].ptr);
5385+
lp->rm9200_txq[desc].ptr = NULL;
53795386
dma_unmap_single(&lp->pdev->dev, lp->rm9200_txq[desc].mapping,
53805387
lp->rm9200_txq[desc].size, DMA_TO_DEVICE);
53815388
dev->stats.tx_packets++;

0 commit comments

Comments
 (0)