aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel
diff options
context:
space:
mode:
authorSasha Neftin <sasha.neftin@intel.com>2019-02-06 02:48:37 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2019-03-19 17:42:02 -0400
commit2121c2712f8249e4d2555a4c989e4666aba34031 (patch)
tree063ed62dcb489c0b8940182ab1023082c3848334 /drivers/net/ethernet/intel
parent459d69c407f9ba122f12216555c3012284dc9fd7 (diff)
igc: Add multiple receive queues control supporting
Enable the multi queues to receive. Program the direction of packets to specified queues according to the mode selected in the MRQC register. Multiple receive queues defined by filters and RSS for 4 queues. Enable/disable RSS hashing and also to enable multiple receive queues. This patch will allow further ethtool support development. Signed-off-by: Sasha Neftin <sasha.neftin@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel')
-rw-r--r--drivers/net/ethernet/intel/igc/igc.h9
-rw-r--r--drivers/net/ethernet/intel/igc/igc_defines.h10
-rw-r--r--drivers/net/ethernet/intel/igc/igc_main.c49
-rw-r--r--drivers/net/ethernet/intel/igc/igc_regs.h5
4 files changed, 73 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h
index 80faccc34cda..473a65c51382 100644
--- a/drivers/net/ethernet/intel/igc/igc.h
+++ b/drivers/net/ethernet/intel/igc/igc.h
@@ -29,6 +29,7 @@ unsigned int igc_get_max_rss_queues(struct igc_adapter *adapter);
29void igc_set_flag_queue_pairs(struct igc_adapter *adapter, 29void igc_set_flag_queue_pairs(struct igc_adapter *adapter,
30 const u32 max_rss_queues); 30 const u32 max_rss_queues);
31int igc_reinit_queues(struct igc_adapter *adapter); 31int igc_reinit_queues(struct igc_adapter *adapter);
32void igc_write_rss_indir_tbl(struct igc_adapter *adapter);
32bool igc_has_link(struct igc_adapter *adapter); 33bool igc_has_link(struct igc_adapter *adapter);
33void igc_reset(struct igc_adapter *adapter); 34void igc_reset(struct igc_adapter *adapter);
34int igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx); 35int igc_set_spd_dplx(struct igc_adapter *adapter, u32 spd, u8 dplx);
@@ -51,6 +52,13 @@ extern char igc_driver_version[];
51#define IGC_FLAG_VLAN_PROMISC BIT(15) 52#define IGC_FLAG_VLAN_PROMISC BIT(15)
52#define IGC_FLAG_RX_LEGACY BIT(16) 53#define IGC_FLAG_RX_LEGACY BIT(16)
53 54
55#define IGC_FLAG_RSS_FIELD_IPV4_UDP BIT(6)
56#define IGC_FLAG_RSS_FIELD_IPV6_UDP BIT(7)
57
58#define IGC_MRQC_ENABLE_RSS_MQ 0x00000002
59#define IGC_MRQC_RSS_FIELD_IPV4_UDP 0x00400000
60#define IGC_MRQC_RSS_FIELD_IPV6_UDP 0x00800000
61
54#define IGC_START_ITR 648 /* ~6000 ints/sec */ 62#define IGC_START_ITR 648 /* ~6000 ints/sec */
55#define IGC_4K_ITR 980 63#define IGC_4K_ITR 980
56#define IGC_20K_ITR 196 64#define IGC_20K_ITR 196
@@ -359,6 +367,7 @@ struct igc_adapter {
359 u32 *shadow_vfta; 367 u32 *shadow_vfta;
360 368
361 u32 rss_queues; 369 u32 rss_queues;
370 u32 rss_indir_tbl_init;
362 371
363 /* lock for RX network flow classification filter */ 372 /* lock for RX network flow classification filter */
364 spinlock_t nfc_lock; 373 spinlock_t nfc_lock;
diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h
index 7d1bdcd1225a..3666f8837cc8 100644
--- a/drivers/net/ethernet/intel/igc/igc_defines.h
+++ b/drivers/net/ethernet/intel/igc/igc_defines.h
@@ -310,6 +310,12 @@
310 IGC_RXDEXT_STATERR_CXE | \ 310 IGC_RXDEXT_STATERR_CXE | \
311 IGC_RXDEXT_STATERR_RXE) 311 IGC_RXDEXT_STATERR_RXE)
312 312
313#define IGC_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
314#define IGC_MRQC_RSS_FIELD_IPV4 0x00020000
315#define IGC_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000
316#define IGC_MRQC_RSS_FIELD_IPV6 0x00100000
317#define IGC_MRQC_RSS_FIELD_IPV6_TCP 0x00200000
318
313/* Header split receive */ 319/* Header split receive */
314#define IGC_RFCTL_IPV6_EX_DIS 0x00010000 320#define IGC_RFCTL_IPV6_EX_DIS 0x00010000
315#define IGC_RFCTL_LEF 0x00040000 321#define IGC_RFCTL_LEF 0x00040000
@@ -325,6 +331,10 @@
325#define I225_RXPBSIZE_DEFAULT 0x000000A2 /* RXPBSIZE default */ 331#define I225_RXPBSIZE_DEFAULT 0x000000A2 /* RXPBSIZE default */
326#define I225_TXPBSIZE_DEFAULT 0x04000014 /* TXPBSIZE default */ 332#define I225_TXPBSIZE_DEFAULT 0x04000014 /* TXPBSIZE default */
327 333
334/* Receive Checksum Control */
335#define IGC_RXCSUM_CRCOFL 0x00000800 /* CRC32 offload enable */
336#define IGC_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */
337
328/* GPY211 - I225 defines */ 338/* GPY211 - I225 defines */
329#define GPY_MMD_MASK 0xFFFF0000 339#define GPY_MMD_MASK 0xFFFF0000
330#define GPY_MMD_SHIFT 16 340#define GPY_MMD_SHIFT 16
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 87a11879bf2d..a6fe614820b6 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -620,6 +620,55 @@ static void igc_configure_tx(struct igc_adapter *adapter)
620 */ 620 */
621static void igc_setup_mrqc(struct igc_adapter *adapter) 621static void igc_setup_mrqc(struct igc_adapter *adapter)
622{ 622{
623 struct igc_hw *hw = &adapter->hw;
624 u32 j, num_rx_queues;
625 u32 mrqc, rxcsum;
626 u32 rss_key[10];
627
628 netdev_rss_key_fill(rss_key, sizeof(rss_key));
629 for (j = 0; j < 10; j++)
630 wr32(IGC_RSSRK(j), rss_key[j]);
631
632 num_rx_queues = adapter->rss_queues;
633
634 if (adapter->rss_indir_tbl_init != num_rx_queues) {
635 for (j = 0; j < IGC_RETA_SIZE; j++)
636 adapter->rss_indir_tbl[j] =
637 (j * num_rx_queues) / IGC_RETA_SIZE;
638 adapter->rss_indir_tbl_init = num_rx_queues;
639 }
640 igc_write_rss_indir_tbl(adapter);
641
642 /* Disable raw packet checksumming so that RSS hash is placed in
643 * descriptor on writeback. No need to enable TCP/UDP/IP checksum
644 * offloads as they are enabled by default
645 */
646 rxcsum = rd32(IGC_RXCSUM);
647 rxcsum |= IGC_RXCSUM_PCSD;
648
649 /* Enable Receive Checksum Offload for SCTP */
650 rxcsum |= IGC_RXCSUM_CRCOFL;
651
652 /* Don't need to set TUOFL or IPOFL, they default to 1 */
653 wr32(IGC_RXCSUM, rxcsum);
654
655 /* Generate RSS hash based on packet types, TCP/UDP
656 * port numbers and/or IPv4/v6 src and dst addresses
657 */
658 mrqc = IGC_MRQC_RSS_FIELD_IPV4 |
659 IGC_MRQC_RSS_FIELD_IPV4_TCP |
660 IGC_MRQC_RSS_FIELD_IPV6 |
661 IGC_MRQC_RSS_FIELD_IPV6_TCP |
662 IGC_MRQC_RSS_FIELD_IPV6_TCP_EX;
663
664 if (adapter->flags & IGC_FLAG_RSS_FIELD_IPV4_UDP)
665 mrqc |= IGC_MRQC_RSS_FIELD_IPV4_UDP;
666 if (adapter->flags & IGC_FLAG_RSS_FIELD_IPV6_UDP)
667 mrqc |= IGC_MRQC_RSS_FIELD_IPV6_UDP;
668
669 mrqc |= IGC_MRQC_ENABLE_RSS_MQ;
670
671 wr32(IGC_MRQC, mrqc);
623} 672}
624 673
625/** 674/**
diff --git a/drivers/net/ethernet/intel/igc/igc_regs.h b/drivers/net/ethernet/intel/igc/igc_regs.h
index 5afe7a8d3faf..325109cb20cc 100644
--- a/drivers/net/ethernet/intel/igc/igc_regs.h
+++ b/drivers/net/ethernet/intel/igc/igc_regs.h
@@ -80,8 +80,13 @@
80/* MSI-X Table Register Descriptions */ 80/* MSI-X Table Register Descriptions */
81#define IGC_PBACL 0x05B68 /* MSIx PBA Clear - R/W 1 to clear */ 81#define IGC_PBACL 0x05B68 /* MSIx PBA Clear - R/W 1 to clear */
82 82
83/* RSS registers */
84#define IGC_MRQC 0x05818 /* Multiple Receive Control - RW */
85
83/* Redirection Table - RW Array */ 86/* Redirection Table - RW Array */
84#define IGC_RETA(_i) (0x05C00 + ((_i) * 4)) 87#define IGC_RETA(_i) (0x05C00 + ((_i) * 4))
88/* RSS Random Key - RW Array */
89#define IGC_RSSRK(_i) (0x05C80 + ((_i) * 4))
85 90
86/* Receive Register Descriptions */ 91/* Receive Register Descriptions */
87#define IGC_RCTL 0x00100 /* Rx Control - RW */ 92#define IGC_RCTL 0x00100 /* Rx Control - RW */