Skip to contentSkip to conversation

Basic support for Solarflare 8000 series NICs

PATCH Superseded Bert Kenward 2 participants 8 messages Nov 25, 2015 – Dec 1, 2015 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore
#3 lore raw

PATCH 2/2 sfc: Add PCI ID for Solarflare 8000 series 10/40G NIC.

In reply to Bert Kenward

Also add support for 7000 series 40G NIC VF.

---
 drivers/net/ethernet/sfc/efx.c | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/net/ethernet/sfc/efx.c +6 -0
index 4e82bcf..b405349 100644
@@ -2784,6 +2784,12 @@ static const struct pci_device_id efx_pci_table[] = {
 	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
 	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0923),  /* SFC9140 PF */
 	 .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x1923),  /* SFC9140 VF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0a03),  /* SFC9220 PF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x1a03),  /* SFC9220 VF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
 	{0}			/* end of list */
 };
 
Signature · 1 line
2.4.3
#1 lore raw

PATCH 1/2 sfc: make TSO version a per-queue parameter

In reply to Bert Kenward

The Solarflare 8000 series NIC will use a new TSO scheme. The current driver refuses to load if the current TSO scheme is not found. Remove that check and instead make the TSO version a per-queue parameter.

---
 drivers/net/ethernet/sfc/ef10.c       | 13 ++++++-------
 drivers/net/ethernet/sfc/net_driver.h |  2 ++
 drivers/net/ethernet/sfc/tx.c         |  8 ++++++--
 3 files changed, 14 insertions(+), 9 deletions(-)
drivers/net/ethernet/sfc/ef10.c +6 -7
index bc6d21b..32bfe05 100644
@@ -181,13 +181,6 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
 		MCDI_WORD(outbuf, GET_CAPABILITIES_OUT_TX_DPCPU_FW_ID);
 
 	if (!(nic_data->datapath_caps &
-	      (1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN))) {
-		netif_err(efx, drv, efx->net_dev,
-			  "current firmware does not support TSO\n");
-		return -ENODEV;
-	}
-
-	if (!(nic_data->datapath_caps &
 	      (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN))) {
 		netif_err(efx, probe, efx->net_dev,
 			  "current firmware does not support an RX prefix\n");
@@ -1797,6 +1790,12 @@ static void efx_ef10_tx_init(struct efx_tx_queue *tx_queue)
 			     ESF_DZ_TX_OPTION_UDP_TCP_CSUM, csum_offload,
 			     ESF_DZ_TX_OPTION_IP_CSUM, csum_offload);
 	tx_queue->write_count = 1;
+
+	if (nic_data->datapath_caps &
+			(1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN)) {
+		tx_queue->tso_version = 1;
+	}
+
 	wmb();
 	efx_ef10_push_tx_desc(tx_queue, txd);
 
drivers/net/ethernet/sfc/net_driver.h +2 -0
index a8ddd12..5c0d0ba 100644
@@ -182,6 +182,7 @@ struct efx_tx_buffer {
  *
  * @efx: The associated Efx NIC
  * @queue: DMA queue number
+ * @tso_version: Version of TSO in use for this queue.
  * @channel: The associated channel
  * @core_txq: The networking core TX queue structure
  * @buffer: The software buffer ring
@@ -228,6 +229,7 @@ struct efx_tx_queue {
 	/* Members which don't change on the fast path */
 	struct efx_nic *efx ____cacheline_aligned_in_smp;
 	unsigned queue;
+	unsigned int tso_version;
 	struct efx_channel *channel;
 	struct netdev_queue *core_txq;
 	struct efx_tx_buffer *buffer;
drivers/net/ethernet/sfc/tx.c +6 -2
index 67f6afa..f7a0ec1 100644
@@ -1010,13 +1010,17 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue,
 
 /* Parse the SKB header and initialise state. */
 static int tso_start(struct tso_state *st, struct efx_nic *efx,
+		     struct efx_tx_queue *tx_queue,
 		     const struct sk_buff *skb)
 {
-	bool use_opt_desc = efx_nic_rev(efx) >= EFX_REV_HUNT_A0;
 	struct device *dma_dev = &efx->pci_dev->dev;
 	unsigned int header_len, in_len;
+	bool use_opt_desc = false;
 	dma_addr_t dma_addr;
 
+	if (tx_queue->tso_version == 1)
+		use_opt_desc = true;
+
 	st->ip_off = skb_network_header(skb) - skb->data;
 	st->tcp_off = skb_transport_header(skb) - skb->data;
 	header_len = st->tcp_off + (tcp_hdr(skb)->doff << 2u);
@@ -1271,7 +1275,7 @@ static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue,
 	/* Find the packet protocol and sanity-check it */
 	state.protocol = efx_tso_check_protocol(skb);
 
-	rc = tso_start(&state, efx, skb);
+	rc = tso_start(&state, efx, tx_queue, skb);
 	if (rc)
 		goto mem_err;
 
Signature · 1 line
2.4.3
#0 lore raw

cover Basic support for Solarflare 8000 series NICs

The upcoming Solarflare 8000 series 10G/40G network card supports a similar interface to the current 7000 series cards. This patch series provides basic support for these cards, making no use of any new functionality.

Bert Kenward (2):
sfc: make TSO version a per-queue parameter
sfc: Add PCI ID for Solarflare 8000 series 10/40G NIC.

 drivers/net/ethernet/sfc/ef10.c       | 13 ++++++-------
 drivers/net/ethernet/sfc/efx.c        |  6 ++++++
 drivers/net/ethernet/sfc/net_driver.h |  2 ++
 drivers/net/ethernet/sfc/tx.c         |  8 ++++++--
 4 files changed, 20 insertions(+), 9 deletions(-)
Signature · 1 line
2.4.3
maintainer
#2 lore raw

Re: [PATCH 1/2] sfc: make TSO version a per-queue parameter

In reply to Bert Kenward

From: Bert Kenward <[email protected]>
Date: Wed, 25 Nov 2015 16:06:14 +0000

drivers/net/ethernet/sfc/ef10.c static int efx_ef10_init_datapath_caps(struct efx_nic *efx) · line 185

Quoted 3 lines
drivers/net/ethernet/sfc/ef10.c +0 -2
 	if (!(nic_data->datapath_caps &
-	      (1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN))) {
-		netif_err(efx, drv, efx->net_dev,

Can you please keep code properly indented...

drivers/net/ethernet/sfc/ef10.c static void efx_ef10_tx_init(struct efx_tx_queue *tx_queue) · line 1795

Quoted 3 lines
drivers/net/ethernet/sfc/ef10.c +3 -0
+
+	if (nic_data->datapath_caps &
+			(1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN)) {

when all you are doing is moving it from one place to another?

That first parenthesis on the second line must start exactly at the first column after the openning parenthesis of the enclosing if () statement.

#4 lore raw

v2 cover Basic support for Solarflare 8000 series NICs

In reply to Bert Kenward

The upcoming Solarflare 8000 series 10G/40G network card supports a similar interface to the current 7000 series cards. This patch series provides basic support for these cards, making no use of any new functionality.

v2: fix indenting in ef10.c in patch 1/2.

Bert Kenward (2):
sfc: make TSO version a per-queue parameter
sfc: Add PCI ID for Solarflare 8000 series 10/40G NIC

 drivers/net/ethernet/sfc/ef10.c       | 13 ++++++-------
 drivers/net/ethernet/sfc/efx.c        |  6 ++++++
 drivers/net/ethernet/sfc/net_driver.h |  2 ++
 drivers/net/ethernet/sfc/tx.c         |  8 ++++++--
 4 files changed, 20 insertions(+), 9 deletions(-)
Signature · 1 line
2.4.3
#7 lore raw

PATCH v2 1/2 sfc: make TSO version a per-queue parameter

In reply to a message not in the archive

The Solarflare 8000 series NIC will use a new TSO scheme. The current driver refuses to load if the current TSO scheme is not found. Remove that check and instead make the TSO version a per-queue parameter.

---
 drivers/net/ethernet/sfc/ef10.c       | 13 ++++++-------
 drivers/net/ethernet/sfc/net_driver.h |  2 ++
 drivers/net/ethernet/sfc/tx.c         |  8 ++++++--
 3 files changed, 14 insertions(+), 9 deletions(-)
drivers/net/ethernet/sfc/ef10.c +6 -7
index bc6d21b..425df3d 100644
@@ -181,13 +181,6 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
 		MCDI_WORD(outbuf, GET_CAPABILITIES_OUT_TX_DPCPU_FW_ID);
 
 	if (!(nic_data->datapath_caps &
-	      (1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN))) {
-		netif_err(efx, drv, efx->net_dev,
-			  "current firmware does not support TSO\n");
-		return -ENODEV;
-	}
-
-	if (!(nic_data->datapath_caps &
 	      (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN))) {
 		netif_err(efx, probe, efx->net_dev,
 			  "current firmware does not support an RX prefix\n");
@@ -1797,6 +1790,12 @@ static void efx_ef10_tx_init(struct efx_tx_queue *tx_queue)
 			     ESF_DZ_TX_OPTION_UDP_TCP_CSUM, csum_offload,
 			     ESF_DZ_TX_OPTION_IP_CSUM, csum_offload);
 	tx_queue->write_count = 1;
+
+	if (nic_data->datapath_caps &
+	    (1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN)) {
+		tx_queue->tso_version = 1;
+	}
+
 	wmb();
 	efx_ef10_push_tx_desc(tx_queue, txd);
 
drivers/net/ethernet/sfc/net_driver.h +2 -0
index a8ddd12..5c0d0ba 100644
@@ -182,6 +182,7 @@ struct efx_tx_buffer {
  *
  * @efx: The associated Efx NIC
  * @queue: DMA queue number
+ * @tso_version: Version of TSO in use for this queue.
  * @channel: The associated channel
  * @core_txq: The networking core TX queue structure
  * @buffer: The software buffer ring
@@ -228,6 +229,7 @@ struct efx_tx_queue {
 	/* Members which don't change on the fast path */
 	struct efx_nic *efx ____cacheline_aligned_in_smp;
 	unsigned queue;
+	unsigned int tso_version;
 	struct efx_channel *channel;
 	struct netdev_queue *core_txq;
 	struct efx_tx_buffer *buffer;
drivers/net/ethernet/sfc/tx.c +6 -2
index 67f6afa..f7a0ec1 100644
@@ -1010,13 +1010,17 @@ static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue,
 
 /* Parse the SKB header and initialise state. */
 static int tso_start(struct tso_state *st, struct efx_nic *efx,
+		     struct efx_tx_queue *tx_queue,
 		     const struct sk_buff *skb)
 {
-	bool use_opt_desc = efx_nic_rev(efx) >= EFX_REV_HUNT_A0;
 	struct device *dma_dev = &efx->pci_dev->dev;
 	unsigned int header_len, in_len;
+	bool use_opt_desc = false;
 	dma_addr_t dma_addr;
 
+	if (tx_queue->tso_version == 1)
+		use_opt_desc = true;
+
 	st->ip_off = skb_network_header(skb) - skb->data;
 	st->tcp_off = skb_transport_header(skb) - skb->data;
 	header_len = st->tcp_off + (tcp_hdr(skb)->doff << 2u);
@@ -1271,7 +1275,7 @@ static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue,
 	/* Find the packet protocol and sanity-check it */
 	state.protocol = efx_tso_check_protocol(skb);
 
-	rc = tso_start(&state, efx, skb);
+	rc = tso_start(&state, efx, tx_queue, skb);
 	if (rc)
 		goto mem_err;
 
Signature · 1 line
2.4.3
#8 lore raw

PATCH v2 2/2 sfc: Add PCI ID for Solarflare 8000 series 10/40G NIC

In reply to a message not in the archive

Also add support for 7000 series 40G NIC VF.

---
 drivers/net/ethernet/sfc/efx.c | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/net/ethernet/sfc/efx.c +6 -0
index 4e82bcf..b405349 100644
@@ -2784,6 +2784,12 @@ static const struct pci_device_id efx_pci_table[] = {
 	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
 	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0923),  /* SFC9140 PF */
 	 .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x1923),  /* SFC9140 VF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0a03),  /* SFC9220 PF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
+	{PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x1a03),  /* SFC9220 VF */
+	 .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
 	{0}			/* end of list */
 };
 
Signature · 1 line
2.4.3
maintainer
#5 lore raw
In reply to Bert Kenward

From: Bert Kenward <[email protected]>
Date: Mon, 30 Nov 2015 09:05:33 +0000

Quoted 6 lines

The upcoming Solarflare 8000 series 10G/40G network card supports a similar interface to the current 7000 series cards. This patch series provides basic support for these cards, making no use of any new functionality.

v2: fix indenting in ef10.c in patch 1/2.

Series applied, thanks.