Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee4db742 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'sfc-8000'



Bert Kenward says:

====================
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.

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

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 02fff96a dd248f1b
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -180,13 +180,6 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
	nic_data->tx_dpcpu_fw_id =
		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,
@@ -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);

+6 −0
Original line number Diff line number Diff line
@@ -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 */
};

+2 −0
Original line number Diff line number Diff line
@@ -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;
+6 −2
Original line number Diff line number Diff line
@@ -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;