Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci FreeBSD r280182 made new file ix_txrx.c and move...



details:   https://anonhg.NetBSD.org/src/rev/92ae8535584c
branches:  trunk
changeset: 349185:92ae8535584c
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Mon Nov 28 02:23:33 2016 +0000

description:
FreeBSD r280182 made new file ix_txrx.c and moved ixgbe.c and ixv's common
code into it. Before sync with whole of them, just move ixgbe.c and ixv.c's
common code into ix_txrx.c from ixgbe.c. In this commit, only ixgbe.c is split
into the device dependent part and the common part. ixv.c isn't change to make
this commit no functional change. To use ixv.c with ix_txrx.c, it's required
to modify the common part's API and functions themselves.

 This commit is done to make the next change easy to understand.

diffstat:

 sys/dev/pci/files.pci       |     6 +-
 sys/dev/pci/ixgbe/ix_txrx.c |  2290 +++++++++++++++++++++++++++++++++++++++++++
 sys/dev/pci/ixgbe/ixgbe.c   |  2248 +------------------------------------------
 sys/dev/pci/ixgbe/ixgbe.h   |    25 +-
 4 files changed, 2321 insertions(+), 2248 deletions(-)

diffs (truncated from 4708 to 300 lines):

diff -r 26604b5a250a -r 92ae8535584c sys/dev/pci/files.pci
--- a/sys/dev/pci/files.pci     Mon Nov 28 00:39:03 2016 +0000
+++ b/sys/dev/pci/files.pci     Mon Nov 28 02:23:33 2016 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.pci,v 1.382 2016/11/21 16:34:34 macallan Exp $
+#      $NetBSD: files.pci,v 1.383 2016/11/28 02:23:33 msaitoh Exp $
 #
 # Config file and device description for machine-independent PCI code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -665,8 +665,10 @@
 file   dev/pci/if_stge.c               stge
 
 # Intel i82598 & i82599 10-Gigabit Ethernet
+define ixgbe_common
+file   dev/pci/ixgbe/ix_txrx.c ixgbe_common
 device ixg: ether, ifnet, arp
-attach ixg at pci
+attach ixg at pci:     ixgbe_common
 file   dev/pci/ixgbe/ixgbe.c           ixg
 file   dev/pci/ixgbe/ixgbe_netbsd.c    ixg
 file   dev/pci/ixgbe/ixgbe_82598.c     ixg
diff -r 26604b5a250a -r 92ae8535584c sys/dev/pci/ixgbe/ix_txrx.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/pci/ixgbe/ix_txrx.c       Mon Nov 28 02:23:33 2016 +0000
@@ -0,0 +1,2290 @@
+/******************************************************************************
+
+  Copyright (c) 2001-2013, Intel Corporation 
+  All rights reserved.
+  
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are met:
+  
+   1. Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+  
+   2. Redistributions in binary form must reproduce the above copyright 
+      notice, this list of conditions and the following disclaimer in the 
+      documentation and/or other materials provided with the distribution.
+  
+   3. Neither the name of the Intel Corporation nor the names of its 
+      contributors may be used to endorse or promote products derived from 
+      this software without specific prior written permission.
+  
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+  POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************************/
+/*
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Coyote Point Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe.c 279805 2015-03-09 10:29:15Z araujo $*/
+/*$NetBSD: ix_txrx.c,v 1.1 2016/11/28 02:23:33 msaitoh Exp $*/
+
+#include "ixgbe.h"
+
+/*
+** HW RSC control: 
+**  this feature only works with
+**  IPv4, and only on 82599 and later.
+**  Also this will cause IP forwarding to
+**  fail and that can't be controlled by
+**  the stack as LRO can. For all these
+**  reasons I've deemed it best to leave
+**  this off and not bother with a tuneable
+**  interface, this would need to be compiled
+**  to enable.
+*/
+static bool ixgbe_rsc_enable = FALSE;
+
+static void    ixgbe_setup_transmit_ring(struct tx_ring *);
+static void     ixgbe_free_transmit_buffers(struct tx_ring *);
+static int     ixgbe_setup_receive_ring(struct rx_ring *);
+static void     ixgbe_free_receive_buffers(struct rx_ring *);
+
+static void    ixgbe_rx_checksum(u32, struct mbuf *, u32,
+                   struct ixgbe_hw_stats *);
+static void    ixgbe_refresh_mbufs(struct rx_ring *, int);
+static int      ixgbe_xmit(struct tx_ring *, struct mbuf *);
+static int     ixgbe_tx_ctx_setup(struct tx_ring *,
+                   struct mbuf *, u32 *, u32 *);
+static int     ixgbe_tso_setup(struct tx_ring *,
+                   struct mbuf *, u32 *, u32 *);
+#ifdef IXGBE_FDIR
+static void    ixgbe_atr(struct tx_ring *, struct mbuf *);
+#endif
+static __inline void ixgbe_rx_discard(struct rx_ring *, int);
+static __inline void ixgbe_rx_input(struct rx_ring *, struct ifnet *,
+                   struct mbuf *, u32);
+
+static void     ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
+static void    ixgbe_setup_hw_rsc(struct rx_ring *);
+
+#ifdef IXGBE_LEGACY_TX
+/*********************************************************************
+ *  Transmit entry point
+ *
+ *  ixgbe_start is called by the stack to initiate a transmit.
+ *  The driver will remain in this routine as long as there are
+ *  packets to transmit and transmit resources are available.
+ *  In case resources are not available stack is notified and
+ *  the packet is requeued.
+ **********************************************************************/
+
+void
+ixgbe_start_locked(struct tx_ring *txr, struct ifnet * ifp)
+{
+       int rc;
+       struct mbuf    *m_head;
+       struct adapter *adapter = txr->adapter;
+
+       IXGBE_TX_LOCK_ASSERT(txr);
+
+       if ((ifp->if_flags & IFF_RUNNING) == 0)
+               return;
+       if (!adapter->link_active)
+               return;
+
+       while (!IFQ_IS_EMPTY(&ifp->if_snd)) {
+               if (txr->tx_avail <= IXGBE_QUEUE_MIN_FREE)
+                       break;
+
+               IFQ_POLL(&ifp->if_snd, m_head);
+               if (m_head == NULL)
+                       break;
+
+               if ((rc = ixgbe_xmit(txr, m_head)) == EAGAIN) {
+                       break;
+               }
+               IFQ_DEQUEUE(&ifp->if_snd, m_head);
+               if (rc == EFBIG) {
+                       struct mbuf *mtmp;
+
+                       if ((mtmp = m_defrag(m_head, M_NOWAIT)) != NULL) {
+                               m_head = mtmp;
+                               rc = ixgbe_xmit(txr, m_head);
+                               if (rc != 0)
+                                       adapter->efbig2_tx_dma_setup.ev_count++;
+                       } else
+                               adapter->m_defrag_failed.ev_count++;
+               }
+               if (rc != 0) {
+                       m_freem(m_head);
+                       continue;
+               }
+
+               /* Send a copy of the frame to the BPF listener */
+               bpf_mtap(ifp, m_head);
+
+               /* Set watchdog on */
+               getmicrotime(&txr->watchdog_time);
+               txr->queue_status = IXGBE_QUEUE_WORKING;
+
+       }
+       return;
+}
+
+/*
+ * Legacy TX start - called by the stack, this
+ * always uses the first tx ring, and should
+ * not be used with multiqueue tx enabled.
+ */
+void
+ixgbe_start(struct ifnet *ifp)
+{
+       struct adapter *adapter = ifp->if_softc;
+       struct tx_ring  *txr = adapter->tx_rings;
+
+       if (ifp->if_flags & IFF_RUNNING) {
+               IXGBE_TX_LOCK(txr);
+               ixgbe_start_locked(txr, ifp);
+               IXGBE_TX_UNLOCK(txr);
+       }
+       return;
+}
+
+#else /* ! IXGBE_LEGACY_TX */
+
+/*
+** Multiqueue Transmit driver
+**
+*/
+int
+ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
+{
+       struct adapter  *adapter = ifp->if_softc;
+       struct ix_queue *que;
+       struct tx_ring  *txr;
+       int             i, err = 0;
+#ifdef RSS
+       uint32_t bucket_id;
+#endif
+
+       /* Which queue to use */
+       /*
+        * When doing RSS, map it to the same outbound queue
+        * as the incoming flow would be mapped to.
+        *
+        * If everything is setup correctly, it should be the
+        * same bucket that the current CPU we're on is.
+        */
+       if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
+#ifdef RSS
+               if (rss_hash2bucket(m->m_pkthdr.flowid,
+                   M_HASHTYPE_GET(m), &bucket_id) == 0) {
+                       /* XXX TODO: spit out something if bucket_id > num_queues? */
+                       i = bucket_id % adapter->num_queues;
+               } else {
+#endif
+                       i = m->m_pkthdr.flowid % adapter->num_queues;
+#ifdef RSS
+               }
+#endif
+       } else {
+               i = curcpu % adapter->num_queues;
+       }
+
+       txr = &adapter->tx_rings[i];
+       que = &adapter->queues[i];
+
+       err = drbr_enqueue(ifp, txr->br, m);
+       if (err)
+               return (err);
+       if (IXGBE_TX_TRYLOCK(txr)) {
+               ixgbe_mq_start_locked(ifp, txr);
+               IXGBE_TX_UNLOCK(txr);
+       } else
+               softint_schedule(txr->txq_si);
+
+       return (0);
+}
+
+int
+ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
+{
+       struct adapter  *adapter = txr->adapter;
+       struct mbuf     *next;
+       int             enqueued = 0, err = 0;
+
+       if (((ifp->if_flags & IFF_RUNNING) == 0) ||
+           adapter->link_active == 0)
+               return (ENETDOWN);
+
+       /* Process the queue */
+#if __FreeBSD_version < 901504
+       next = drbr_dequeue(ifp, txr->br);
+       while (next != NULL) {
+               if ((err = ixgbe_xmit(txr, &next)) != 0) {
+                       if (next != NULL)
+                               err = drbr_enqueue(ifp, txr->br, next);
+#else
+       while ((next = drbr_peek(ifp, txr->br)) != NULL) {
+               if ((err = ixgbe_xmit(txr, &next)) != 0) {
+                       if (next == NULL) {
+                               drbr_advance(ifp, txr->br);
+                       } else {
+                               drbr_putback(ifp, txr->br, next);
+                       }
+#endif
+                       break;
+               }
+#if __FreeBSD_version >= 901504
+               drbr_advance(ifp, txr->br);
+#endif
+               enqueued++;
+               /* Send a copy of the frame to the BPF listener */



Home | Main Index | Thread Index | Old Index