Skip to content

Commit 33b0ee0

Browse files
Gerhard Englederkuba-moo
authored andcommitted
tsnep: Rework TX/RX queue initialization
Make initialization of TX and RX queues less dynamic by moving some initialization from netdev open/close to device probing. Additionally, move some initialization code to separate functions to enable future use in other execution paths. This is done as preparation for queue reconfigure at runtime, which is necessary for XSK zero-copy support. Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 42fb296 commit 33b0ee0

1 file changed

Lines changed: 51 additions & 43 deletions

File tree

drivers/net/ethernet/engleder/tsnep_main.c

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ static void tsnep_tx_ring_cleanup(struct tsnep_tx *tx)
265265
}
266266
}
267267

268-
static int tsnep_tx_ring_init(struct tsnep_tx *tx)
268+
static int tsnep_tx_ring_create(struct tsnep_tx *tx)
269269
{
270270
struct device *dmadev = tx->adapter->dmadev;
271271
struct tsnep_tx_entry *entry;
@@ -288,6 +288,7 @@ static int tsnep_tx_ring_init(struct tsnep_tx *tx)
288288
entry->desc = (struct tsnep_tx_desc *)
289289
(((u8 *)entry->desc_wb) + TSNEP_DESC_OFFSET);
290290
entry->desc_dma = tx->page_dma[i] + TSNEP_DESC_SIZE * j;
291+
entry->owner_user_flag = false;
291292
}
292293
}
293294
for (i = 0; i < TSNEP_RING_SIZE; i++) {
@@ -303,6 +304,19 @@ static int tsnep_tx_ring_init(struct tsnep_tx *tx)
303304
return retval;
304305
}
305306

307+
static void tsnep_tx_init(struct tsnep_tx *tx)
308+
{
309+
dma_addr_t dma;
310+
311+
dma = tx->entry[0].desc_dma | TSNEP_RESET_OWNER_COUNTER;
312+
iowrite32(DMA_ADDR_LOW(dma), tx->addr + TSNEP_TX_DESC_ADDR_LOW);
313+
iowrite32(DMA_ADDR_HIGH(dma), tx->addr + TSNEP_TX_DESC_ADDR_HIGH);
314+
tx->write = 0;
315+
tx->read = 0;
316+
tx->owner_counter = 1;
317+
tx->increment_owner_counter = TSNEP_RING_SIZE - 1;
318+
}
319+
306320
static void tsnep_tx_activate(struct tsnep_tx *tx, int index, int length,
307321
bool last)
308322
{
@@ -731,26 +745,15 @@ static bool tsnep_tx_pending(struct tsnep_tx *tx)
731745
return pending;
732746
}
733747

734-
static int tsnep_tx_open(struct tsnep_adapter *adapter, void __iomem *addr,
735-
int queue_index, struct tsnep_tx *tx)
748+
static int tsnep_tx_open(struct tsnep_tx *tx)
736749
{
737-
dma_addr_t dma;
738750
int retval;
739751

740-
memset(tx, 0, sizeof(*tx));
741-
tx->adapter = adapter;
742-
tx->addr = addr;
743-
tx->queue_index = queue_index;
744-
745-
retval = tsnep_tx_ring_init(tx);
752+
retval = tsnep_tx_ring_create(tx);
746753
if (retval)
747754
return retval;
748755

749-
dma = tx->entry[0].desc_dma | TSNEP_RESET_OWNER_COUNTER;
750-
iowrite32(DMA_ADDR_LOW(dma), tx->addr + TSNEP_TX_DESC_ADDR_LOW);
751-
iowrite32(DMA_ADDR_HIGH(dma), tx->addr + TSNEP_TX_DESC_ADDR_HIGH);
752-
tx->owner_counter = 1;
753-
tx->increment_owner_counter = TSNEP_RING_SIZE - 1;
756+
tsnep_tx_init(tx);
754757

755758
return 0;
756759
}
@@ -795,7 +798,7 @@ static void tsnep_rx_ring_cleanup(struct tsnep_rx *rx)
795798
}
796799
}
797800

798-
static int tsnep_rx_ring_init(struct tsnep_rx *rx)
801+
static int tsnep_rx_ring_create(struct tsnep_rx *rx)
799802
{
800803
struct device *dmadev = rx->adapter->dmadev;
801804
struct tsnep_rx_entry *entry;
@@ -850,6 +853,19 @@ static int tsnep_rx_ring_init(struct tsnep_rx *rx)
850853
return retval;
851854
}
852855

856+
static void tsnep_rx_init(struct tsnep_rx *rx)
857+
{
858+
dma_addr_t dma;
859+
860+
dma = rx->entry[0].desc_dma | TSNEP_RESET_OWNER_COUNTER;
861+
iowrite32(DMA_ADDR_LOW(dma), rx->addr + TSNEP_RX_DESC_ADDR_LOW);
862+
iowrite32(DMA_ADDR_HIGH(dma), rx->addr + TSNEP_RX_DESC_ADDR_HIGH);
863+
rx->write = 0;
864+
rx->read = 0;
865+
rx->owner_counter = 1;
866+
rx->increment_owner_counter = TSNEP_RING_SIZE - 1;
867+
}
868+
853869
static int tsnep_rx_desc_available(struct tsnep_rx *rx)
854870
{
855871
if (rx->read <= rx->write)
@@ -1181,26 +1197,15 @@ static bool tsnep_rx_pending(struct tsnep_rx *rx)
11811197
return false;
11821198
}
11831199

1184-
static int tsnep_rx_open(struct tsnep_adapter *adapter, void __iomem *addr,
1185-
int queue_index, struct tsnep_rx *rx)
1200+
static int tsnep_rx_open(struct tsnep_rx *rx)
11861201
{
1187-
dma_addr_t dma;
11881202
int retval;
11891203

1190-
memset(rx, 0, sizeof(*rx));
1191-
rx->adapter = adapter;
1192-
rx->addr = addr;
1193-
rx->queue_index = queue_index;
1194-
1195-
retval = tsnep_rx_ring_init(rx);
1204+
retval = tsnep_rx_ring_create(rx);
11961205
if (retval)
11971206
return retval;
11981207

1199-
dma = rx->entry[0].desc_dma | TSNEP_RESET_OWNER_COUNTER;
1200-
iowrite32(DMA_ADDR_LOW(dma), rx->addr + TSNEP_RX_DESC_ADDR_LOW);
1201-
iowrite32(DMA_ADDR_HIGH(dma), rx->addr + TSNEP_RX_DESC_ADDR_HIGH);
1202-
rx->owner_counter = 1;
1203-
rx->increment_owner_counter = TSNEP_RING_SIZE - 1;
1208+
tsnep_rx_init(rx);
12041209

12051210
tsnep_rx_refill(rx, tsnep_rx_desc_available(rx), false);
12061211

@@ -1335,8 +1340,6 @@ static int tsnep_queue_open(struct tsnep_adapter *adapter,
13351340
struct tsnep_tx *tx = queue->tx;
13361341
int retval;
13371342

1338-
queue->adapter = adapter;
1339-
13401343
netif_napi_add(adapter->netdev, &queue->napi, tsnep_poll);
13411344

13421345
if (rx) {
@@ -1377,27 +1380,18 @@ static int tsnep_queue_open(struct tsnep_adapter *adapter,
13771380
static int tsnep_netdev_open(struct net_device *netdev)
13781381
{
13791382
struct tsnep_adapter *adapter = netdev_priv(netdev);
1380-
int tx_queue_index = 0;
1381-
int rx_queue_index = 0;
1382-
void __iomem *addr;
13831383
int i, retval;
13841384

13851385
for (i = 0; i < adapter->num_queues; i++) {
13861386
if (adapter->queue[i].tx) {
1387-
addr = adapter->addr + TSNEP_QUEUE(tx_queue_index);
1388-
retval = tsnep_tx_open(adapter, addr, tx_queue_index,
1389-
adapter->queue[i].tx);
1387+
retval = tsnep_tx_open(adapter->queue[i].tx);
13901388
if (retval)
13911389
goto failed;
1392-
tx_queue_index++;
13931390
}
13941391
if (adapter->queue[i].rx) {
1395-
addr = adapter->addr + TSNEP_QUEUE(rx_queue_index);
1396-
retval = tsnep_rx_open(adapter, addr, rx_queue_index,
1397-
adapter->queue[i].rx);
1392+
retval = tsnep_rx_open(adapter->queue[i].rx);
13981393
if (retval)
13991394
goto failed;
1400-
rx_queue_index++;
14011395
}
14021396

14031397
retval = tsnep_queue_open(adapter, &adapter->queue[i], i == 0);
@@ -1796,9 +1790,16 @@ static int tsnep_queue_init(struct tsnep_adapter *adapter, int queue_count)
17961790
adapter->num_tx_queues = 1;
17971791
adapter->num_rx_queues = 1;
17981792
adapter->num_queues = 1;
1793+
adapter->queue[0].adapter = adapter;
17991794
adapter->queue[0].irq = retval;
18001795
adapter->queue[0].tx = &adapter->tx[0];
1796+
adapter->queue[0].tx->adapter = adapter;
1797+
adapter->queue[0].tx->addr = adapter->addr + TSNEP_QUEUE(0);
1798+
adapter->queue[0].tx->queue_index = 0;
18011799
adapter->queue[0].rx = &adapter->rx[0];
1800+
adapter->queue[0].rx->adapter = adapter;
1801+
adapter->queue[0].rx->addr = adapter->addr + TSNEP_QUEUE(0);
1802+
adapter->queue[0].rx->queue_index = 0;
18021803
adapter->queue[0].irq_mask = irq_mask;
18031804
adapter->queue[0].irq_delay_addr = adapter->addr + ECM_INT_DELAY;
18041805
retval = tsnep_set_irq_coalesce(&adapter->queue[0],
@@ -1820,9 +1821,16 @@ static int tsnep_queue_init(struct tsnep_adapter *adapter, int queue_count)
18201821
adapter->num_tx_queues++;
18211822
adapter->num_rx_queues++;
18221823
adapter->num_queues++;
1824+
adapter->queue[i].adapter = adapter;
18231825
adapter->queue[i].irq = retval;
18241826
adapter->queue[i].tx = &adapter->tx[i];
1827+
adapter->queue[i].tx->adapter = adapter;
1828+
adapter->queue[i].tx->addr = adapter->addr + TSNEP_QUEUE(i);
1829+
adapter->queue[i].tx->queue_index = i;
18251830
adapter->queue[i].rx = &adapter->rx[i];
1831+
adapter->queue[i].rx->adapter = adapter;
1832+
adapter->queue[i].rx->addr = adapter->addr + TSNEP_QUEUE(i);
1833+
adapter->queue[i].rx->queue_index = i;
18261834
adapter->queue[i].irq_mask =
18271835
irq_mask << (ECM_INT_TXRX_SHIFT * i);
18281836
adapter->queue[i].irq_delay_addr =

0 commit comments

Comments
 (0)