Skip to content

Commit 8042824

Browse files
Gatis Peiseniekskuba-moo
authored andcommitted
atl1c: prepare for multiple rx queues
Move napi and other per queue members into per rx queue struct. Allocate max rx queues that any hw supported by the driver might have. Patch that actually enables multiple rx queues will follow. Signed-off-by: Gatis Peisenieks <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 20a1b6b commit 8042824

File tree

2 files changed

+57
-61
lines changed

2 files changed

+57
-61
lines changed

drivers/net/ethernet/atheros/atl1c/atl1c.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,21 +500,23 @@ struct atl1c_rfd_ring {
500500

501501
/* receive return descriptor (rrd) ring */
502502
struct atl1c_rrd_ring {
503+
struct atl1c_adapter *adapter;
503504
void *desc; /* descriptor ring virtual address */
504505
dma_addr_t dma; /* descriptor ring physical address */
506+
u16 num;
505507
u16 size; /* descriptor ring length in bytes */
506508
u16 count; /* number of descriptors in the ring */
507509
u16 next_to_use;
508510
u16 next_to_clean;
511+
struct napi_struct napi;
512+
struct page *rx_page;
513+
unsigned int rx_page_offset;
509514
};
510515

511516
/* board specific private data structure */
512517
struct atl1c_adapter {
513518
struct net_device *netdev;
514519
struct pci_dev *pdev;
515-
struct napi_struct napi;
516-
struct page *rx_page;
517-
unsigned int rx_page_offset;
518520
unsigned int rx_frag_size;
519521
struct atl1c_hw hw;
520522
struct atl1c_hw_stats hw_stats;
@@ -545,8 +547,8 @@ struct atl1c_adapter {
545547
/* All Descriptor memory */
546548
struct atl1c_ring_header ring_header;
547549
struct atl1c_tpd_ring tpd_ring[AT_MAX_TRANSMIT_QUEUE];
548-
struct atl1c_rfd_ring rfd_ring;
549-
struct atl1c_rrd_ring rrd_ring;
550+
struct atl1c_rfd_ring rfd_ring[AT_MAX_RECEIVE_QUEUE];
551+
struct atl1c_rrd_ring rrd_ring[AT_MAX_RECEIVE_QUEUE];
550552
u32 bd_number; /* board number;*/
551553
};
552554

drivers/net/ethernet/atheros/atl1c/atl1c_main.c

Lines changed: 50 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ static int atl1c_stop_mac(struct atl1c_hw *hw);
4040
static void atl1c_disable_l0s_l1(struct atl1c_hw *hw);
4141
static void atl1c_set_aspm(struct atl1c_hw *hw, u16 link_speed);
4242
static void atl1c_start_mac(struct atl1c_adapter *adapter);
43-
static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter,
44-
int *work_done, int work_to_do);
4543
static int atl1c_up(struct atl1c_adapter *adapter);
4644
static void atl1c_down(struct atl1c_adapter *adapter);
4745
static int atl1c_reset_mac(struct atl1c_hw *hw);
@@ -770,7 +768,7 @@ static int atl1c_sw_init(struct atl1c_adapter *adapter)
770768
adapter->link_speed = SPEED_0;
771769
adapter->link_duplex = FULL_DUPLEX;
772770
adapter->tpd_ring[0].count = 1024;
773-
adapter->rfd_ring.count = 512;
771+
adapter->rfd_ring[0].count = 512;
774772

775773
hw->vendor_id = pdev->vendor;
776774
hw->device_id = pdev->device;
@@ -878,8 +876,8 @@ static void atl1c_clean_tx_ring(struct atl1c_adapter *adapter,
878876
*/
879877
static void atl1c_clean_rx_ring(struct atl1c_adapter *adapter)
880878
{
881-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
882-
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring;
879+
struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
880+
struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
883881
struct atl1c_buffer *buffer_info;
884882
struct pci_dev *pdev = adapter->pdev;
885883
int j;
@@ -902,8 +900,8 @@ static void atl1c_clean_rx_ring(struct atl1c_adapter *adapter)
902900
static void atl1c_init_ring_ptrs(struct atl1c_adapter *adapter)
903901
{
904902
struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
905-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
906-
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring;
903+
struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
904+
struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
907905
struct atl1c_buffer *buffer_info;
908906
int i, j;
909907

@@ -945,9 +943,9 @@ static void atl1c_free_ring_resources(struct atl1c_adapter *adapter)
945943
kfree(adapter->tpd_ring[0].buffer_info);
946944
adapter->tpd_ring[0].buffer_info = NULL;
947945
}
948-
if (adapter->rx_page) {
949-
put_page(adapter->rx_page);
950-
adapter->rx_page = NULL;
946+
if (adapter->rrd_ring[0].rx_page) {
947+
put_page(adapter->rrd_ring[0].rx_page);
948+
adapter->rrd_ring[0].rx_page = NULL;
951949
}
952950
}
953951

@@ -961,8 +959,8 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
961959
{
962960
struct pci_dev *pdev = adapter->pdev;
963961
struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
964-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
965-
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring;
962+
struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
963+
struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
966964
struct atl1c_ring_header *ring_header = &adapter->ring_header;
967965
int size;
968966
int i;
@@ -1030,6 +1028,8 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
10301028
offset += roundup(rfd_ring->size, 8);
10311029

10321030
/* init RRD ring */
1031+
rrd_ring->adapter = adapter;
1032+
rrd_ring->num = 0;
10331033
rrd_ring->dma = ring_header->dma + offset;
10341034
rrd_ring->desc = (u8 *) ring_header->desc + offset;
10351035
rrd_ring->size = sizeof(struct atl1c_recv_ret_status) *
@@ -1046,10 +1046,9 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
10461046
static void atl1c_configure_des_ring(struct atl1c_adapter *adapter)
10471047
{
10481048
struct atl1c_hw *hw = &adapter->hw;
1049-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
1050-
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring;
1051-
struct atl1c_tpd_ring *tpd_ring = (struct atl1c_tpd_ring *)
1052-
adapter->tpd_ring;
1049+
struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
1050+
struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
1051+
struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
10531052

10541053
/* TPD */
10551054
AT_WRITE_REG(hw, REG_TX_BASE_ADDR_HI,
@@ -1608,12 +1607,12 @@ static irqreturn_t atl1c_intr(int irq, void *data)
16081607
/* Ack ISR */
16091608
AT_WRITE_REG(hw, REG_ISR, status | ISR_DIS_INT);
16101609
if (status & ISR_RX_PKT) {
1611-
if (likely(napi_schedule_prep(&adapter->napi))) {
1610+
if (napi_schedule_prep(&adapter->rrd_ring[0].napi)) {
16121611
spin_lock(&hw->intr_mask_lock);
16131612
hw->intr_mask &= ~ISR_RX_PKT;
16141613
AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
16151614
spin_unlock(&hw->intr_mask_lock);
1616-
__napi_schedule(&adapter->napi);
1615+
__napi_schedule(&adapter->rrd_ring[0].napi);
16171616
}
16181617
}
16191618
if (status & ISR_TX_PKT) {
@@ -1677,33 +1676,35 @@ static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
16771676
static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter,
16781677
bool napi_mode)
16791678
{
1679+
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring[0];
16801680
struct sk_buff *skb;
16811681
struct page *page;
16821682

16831683
if (adapter->rx_frag_size > PAGE_SIZE) {
16841684
if (likely(napi_mode))
1685-
return napi_alloc_skb(&adapter->napi,
1685+
return napi_alloc_skb(&rrd_ring->napi,
16861686
adapter->rx_buffer_len);
16871687
else
16881688
return netdev_alloc_skb_ip_align(adapter->netdev,
16891689
adapter->rx_buffer_len);
16901690
}
16911691

1692-
page = adapter->rx_page;
1692+
page = rrd_ring->rx_page;
16931693
if (!page) {
1694-
adapter->rx_page = page = alloc_page(GFP_ATOMIC);
1694+
page = alloc_page(GFP_ATOMIC);
16951695
if (unlikely(!page))
16961696
return NULL;
1697-
adapter->rx_page_offset = 0;
1697+
rrd_ring->rx_page = page;
1698+
rrd_ring->rx_page_offset = 0;
16981699
}
16991700

1700-
skb = build_skb(page_address(page) + adapter->rx_page_offset,
1701+
skb = build_skb(page_address(page) + rrd_ring->rx_page_offset,
17011702
adapter->rx_frag_size);
17021703
if (likely(skb)) {
17031704
skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
1704-
adapter->rx_page_offset += adapter->rx_frag_size;
1705-
if (adapter->rx_page_offset >= PAGE_SIZE)
1706-
adapter->rx_page = NULL;
1705+
rrd_ring->rx_page_offset += adapter->rx_frag_size;
1706+
if (rrd_ring->rx_page_offset >= PAGE_SIZE)
1707+
rrd_ring->rx_page = NULL;
17071708
else
17081709
get_page(page);
17091710
}
@@ -1712,7 +1713,7 @@ static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter,
17121713

17131714
static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, bool napi_mode)
17141715
{
1715-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
1716+
struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
17161717
struct pci_dev *pdev = adapter->pdev;
17171718
struct atl1c_buffer *buffer_info, *next_info;
17181719
struct sk_buff *skb;
@@ -1812,22 +1813,34 @@ static void atl1c_clean_rfd(struct atl1c_rfd_ring *rfd_ring,
18121813
rfd_ring->next_to_clean = rfd_index;
18131814
}
18141815

1815-
static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter,
1816-
int *work_done, int work_to_do)
1816+
/**
1817+
* atl1c_clean_rx - NAPI Rx polling callback
1818+
* @napi: napi info
1819+
* @budget: limit of packets to clean
1820+
*/
1821+
static int atl1c_clean_rx(struct napi_struct *napi, int budget)
18171822
{
1823+
struct atl1c_rrd_ring *rrd_ring =
1824+
container_of(napi, struct atl1c_rrd_ring, napi);
1825+
struct atl1c_adapter *adapter = rrd_ring->adapter;
18181826
u16 rfd_num, rfd_index;
18191827
u16 count = 0;
18201828
u16 length;
18211829
struct pci_dev *pdev = adapter->pdev;
18221830
struct net_device *netdev = adapter->netdev;
1823-
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
1824-
struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring;
1831+
struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring[rrd_ring->num];
18251832
struct sk_buff *skb;
18261833
struct atl1c_recv_ret_status *rrs;
18271834
struct atl1c_buffer *buffer_info;
1835+
int work_done = 0;
1836+
unsigned long flags;
1837+
1838+
/* Keep link state information with original netdev */
1839+
if (!netif_carrier_ok(adapter->netdev))
1840+
goto quit_polling;
18281841

18291842
while (1) {
1830-
if (*work_done >= work_to_do)
1843+
if (work_done >= budget)
18311844
break;
18321845
rrs = ATL1C_RRD_DESC(rrd_ring, rrd_ring->next_to_clean);
18331846
if (likely(RRS_RXD_IS_VALID(rrs->word3))) {
@@ -1881,32 +1894,13 @@ static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter,
18811894
vlan = le16_to_cpu(vlan);
18821895
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan);
18831896
}
1884-
napi_gro_receive(&adapter->napi, skb);
1897+
napi_gro_receive(napi, skb);
18851898

1886-
(*work_done)++;
1899+
work_done++;
18871900
count++;
18881901
}
18891902
if (count)
18901903
atl1c_alloc_rx_buffer(adapter, true);
1891-
}
1892-
1893-
/**
1894-
* atl1c_clean - NAPI Rx polling callback
1895-
* @napi: napi info
1896-
* @budget: limit of packets to clean
1897-
*/
1898-
static int atl1c_clean(struct napi_struct *napi, int budget)
1899-
{
1900-
struct atl1c_adapter *adapter =
1901-
container_of(napi, struct atl1c_adapter, napi);
1902-
int work_done = 0;
1903-
unsigned long flags;
1904-
1905-
/* Keep link state information with original netdev */
1906-
if (!netif_carrier_ok(adapter->netdev))
1907-
goto quit_polling;
1908-
/* just enable one RXQ */
1909-
atl1c_clean_rx_irq(adapter, &work_done, budget);
19101904

19111905
if (work_done < budget) {
19121906
quit_polling:
@@ -2355,7 +2349,7 @@ static int atl1c_up(struct atl1c_adapter *adapter)
23552349

23562350
atl1c_check_link_status(adapter);
23572351
clear_bit(__AT_DOWN, &adapter->flags);
2358-
napi_enable(&adapter->napi);
2352+
napi_enable(&adapter->rrd_ring[0].napi);
23592353
napi_enable(&adapter->tpd_ring[0].napi);
23602354
atl1c_irq_enable(adapter);
23612355
netif_start_queue(netdev);
@@ -2376,7 +2370,7 @@ static void atl1c_down(struct atl1c_adapter *adapter)
23762370
* reschedule our watchdog timer */
23772371
set_bit(__AT_DOWN, &adapter->flags);
23782372
netif_carrier_off(netdev);
2379-
napi_disable(&adapter->napi);
2373+
napi_disable(&adapter->rrd_ring[0].napi);
23802374
napi_disable(&adapter->tpd_ring[0].napi);
23812375
atl1c_irq_disable(adapter);
23822376
atl1c_free_irq(adapter);
@@ -2633,7 +2627,7 @@ static int atl1c_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
26332627
adapter->mii.phy_id_mask = 0x1f;
26342628
adapter->mii.reg_num_mask = MDIO_CTRL_REG_MASK;
26352629
dev_set_threaded(netdev, true);
2636-
netif_napi_add(netdev, &adapter->napi, atl1c_clean, 64);
2630+
netif_napi_add(netdev, &adapter->rrd_ring[0].napi, atl1c_clean_rx, 64);
26372631
netif_napi_add(netdev, &adapter->tpd_ring[0].napi, atl1c_clean_tx, 64);
26382632
timer_setup(&adapter->phy_config_timer, atl1c_phy_config, 0);
26392633
/* setup the private structure */

0 commit comments

Comments
 (0)