Skip to content

Commit 057f4af

Browse files
Gatis Peiseniekskuba-moo
authored andcommitted
atl1c: add 4 RX/TX queue support for Mikrotik 10/25G NIC
More RX/TX queues on a network card help spread the CPU load among cores and achieve higher overall networking performance. The new Mikrotik 10/25G NIC supports 4 RX and 4 TX queues. TX queues are treated with equal priority. RX queue balancing is fixed based on L2/L3/L4 hash. This adds support for 4 RX/TX queues while maintaining backwards compatibility with older hardware. Simultaneous TX + RX performance on AMD Threadripper 3960X with Mikrotik 10/25G NIC improved from 1.6Mpps to 3.2Mpps per port. Backwards compatiblitiy was verified with AR8151 and AR8131 based NICs. Signed-off-by: Gatis Peisenieks <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 8042824 commit 057f4af

File tree

3 files changed

+291
-158
lines changed

3 files changed

+291
-158
lines changed

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363

6464
#define AT_MAX_RECEIVE_QUEUE 4
6565
#define AT_DEF_RECEIVE_QUEUE 1
66-
#define AT_MAX_TRANSMIT_QUEUE 2
66+
#define AT_MAX_TRANSMIT_QUEUE 4
6767

6868
#define AT_DMA_HI_ADDR_MASK 0xffffffff00000000ULL
6969
#define AT_DMA_LO_ADDR_MASK 0x00000000ffffffffULL
@@ -294,11 +294,6 @@ enum atl1c_nic_type {
294294
athr_mt,
295295
};
296296

297-
enum atl1c_trans_queue {
298-
atl1c_trans_normal = 0,
299-
atl1c_trans_high = 1
300-
};
301-
302297
struct atl1c_hw_stats {
303298
/* rx */
304299
unsigned long rx_ok; /* The number of good packet received. */
@@ -522,6 +517,8 @@ struct atl1c_adapter {
522517
struct atl1c_hw_stats hw_stats;
523518
struct mii_if_info mii; /* MII interface info */
524519
u16 rx_buffer_len;
520+
unsigned int tx_queue_count;
521+
unsigned int rx_queue_count;
525522

526523
unsigned long flags;
527524
#define __AT_TESTING 0x0001

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,15 +528,24 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
528528
#define REG_RX_BASE_ADDR_HI 0x1540
529529
#define REG_TX_BASE_ADDR_HI 0x1544
530530
#define REG_RFD0_HEAD_ADDR_LO 0x1550
531+
#define REG_RFD1_HEAD_ADDR_LO 0x1554
532+
#define REG_RFD2_HEAD_ADDR_LO 0x1558
533+
#define REG_RFD3_HEAD_ADDR_LO 0x155C
531534
#define REG_RFD_RING_SIZE 0x1560
532535
#define RFD_RING_SIZE_MASK 0x0FFF
533536
#define REG_RX_BUF_SIZE 0x1564
534537
#define RX_BUF_SIZE_MASK 0xFFFF
535538
#define REG_RRD0_HEAD_ADDR_LO 0x1568
539+
#define REG_RRD1_HEAD_ADDR_LO 0x156C
540+
#define REG_RRD2_HEAD_ADDR_LO 0x1570
541+
#define REG_RRD3_HEAD_ADDR_LO 0x1574
536542
#define REG_RRD_RING_SIZE 0x1578
537543
#define RRD_RING_SIZE_MASK 0x0FFF
538544
#define REG_TPD_PRI1_ADDR_LO 0x157C
539545
#define REG_TPD_PRI0_ADDR_LO 0x1580
546+
#define REG_TPD_PRI2_ADDR_LO 0x1F10
547+
#define REG_TPD_PRI3_ADDR_LO 0x1F14
548+
540549
#define REG_TPD_RING_SIZE 0x1584
541550
#define TPD_RING_SIZE_MASK 0xFFFF
542551

@@ -655,15 +664,26 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
655664
/* Mail box */
656665
#define MB_RFDX_PROD_IDX_MASK 0xFFFF
657666
#define REG_MB_RFD0_PROD_IDX 0x15E0
667+
#define REG_MB_RFD1_PROD_IDX 0x15E4
668+
#define REG_MB_RFD2_PROD_IDX 0x15E8
669+
#define REG_MB_RFD3_PROD_IDX 0x15EC
658670

659671
#define REG_TPD_PRI1_PIDX 0x15F0 /* 16bit,hi-tpd producer idx */
660672
#define REG_TPD_PRI0_PIDX 0x15F2 /* 16bit,lo-tpd producer idx */
661673
#define REG_TPD_PRI1_CIDX 0x15F4 /* 16bit,hi-tpd consumer idx */
662674
#define REG_TPD_PRI0_CIDX 0x15F6 /* 16bit,lo-tpd consumer idx */
675+
#define REG_TPD_PRI3_PIDX 0x1F18
676+
#define REG_TPD_PRI2_PIDX 0x1F1A
677+
#define REG_TPD_PRI3_CIDX 0x1F1C
678+
#define REG_TPD_PRI2_CIDX 0x1F1E
679+
663680

664681
#define REG_MB_RFD01_CONS_IDX 0x15F8
665682
#define MB_RFD0_CONS_IDX_MASK 0x0000FFFF
666683
#define MB_RFD1_CONS_IDX_MASK 0xFFFF0000
684+
#define REG_MB_RFD23_CONS_IDX 0x15FC
685+
#define MB_RFD2_CONS_IDX_MASK 0x0000FFFF
686+
#define MB_RFD3_CONS_IDX_MASK 0xFFFF0000
667687

668688
/* Interrupt Status Register */
669689
#define REG_ISR 0x1600
@@ -687,7 +707,7 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
687707
/* GPHY low power state interrupt */
688708
#define ISR_GPHY_LPW 0x00002000
689709
#define ISR_TXQ_TO_RST 0x00004000
690-
#define ISR_TX_PKT 0x00008000
710+
#define ISR_TX_PKT_0 0x00008000
691711
#define ISR_RX_PKT_0 0x00010000
692712
#define ISR_RX_PKT_1 0x00020000
693713
#define ISR_RX_PKT_2 0x00040000
@@ -699,6 +719,9 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
699719
#define ISR_NFERR_DETECTED 0x01000000
700720
#define ISR_CERR_DETECTED 0x02000000
701721
#define ISR_PHY_LINKDOWN 0x04000000
722+
#define ISR_TX_PKT_1 0x10000000
723+
#define ISR_TX_PKT_2 0x20000000
724+
#define ISR_TX_PKT_3 0x40000000
702725
#define ISR_DIS_INT 0x80000000
703726

704727
/* Interrupt Mask Register */
@@ -713,11 +736,15 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
713736
ISR_TXQ_TO_RST |\
714737
ISR_DMAW_TO_RST |\
715738
ISR_GPHY |\
716-
ISR_TX_PKT |\
717-
ISR_RX_PKT_0 |\
718739
ISR_GPHY_LPW |\
719740
ISR_PHY_LINKDOWN)
720741

742+
#define ISR_TX_PKT ( \
743+
ISR_TX_PKT_0 | \
744+
ISR_TX_PKT_1 | \
745+
ISR_TX_PKT_2 | \
746+
ISR_TX_PKT_3)
747+
721748
#define ISR_RX_PKT (\
722749
ISR_RX_PKT_0 |\
723750
ISR_RX_PKT_1 |\
@@ -771,6 +798,7 @@ void atl1c_post_phy_linkchg(struct atl1c_hw *hw, u16 link_speed);
771798
#define REG_MT_VERSION 0x1F0C
772799

773800
#define MT_MAGIC 0xaabb1234
801+
#define MT_MODE_4Q BIT(0)
774802

775803
#define L1D_MPW_PHYID1 0xD01C /* V7 */
776804
#define L1D_MPW_PHYID2 0xD01D /* V1-V6 */

0 commit comments

Comments
 (0)