Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/pci/ixgbe Update ixg(4) and ixv(4) up to FreeBSD r28...



details:   https://anonhg.NetBSD.org/src/rev/6fb92c2557b6
branches:  trunk
changeset: 349251:6fb92c2557b6
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Fri Dec 02 10:21:43 2016 +0000

description:
Update ixg(4) and ixv(4) up to FreeBSD r283881:
- SRIOV support (not enabled because NetBSD doesn't support it).

diffstat:

 sys/dev/pci/ixgbe/ix_txrx.c   |    37 +-
 sys/dev/pci/ixgbe/ixgbe.c     |  1134 +++++++++++++++++++++++++++++++++++-----
 sys/dev/pci/ixgbe/ixgbe.h     |   219 +++++++-
 sys/dev/pci/ixgbe/ixgbe_mbx.h |    31 +-
 sys/dev/pci/ixgbe/ixgbe_vf.c  |    61 ++-
 sys/dev/pci/ixgbe/ixv.c       |    85 +-
 6 files changed, 1372 insertions(+), 195 deletions(-)

diffs (truncated from 2366 to 300 lines):

diff -r a30d3d5b2fe0 -r 6fb92c2557b6 sys/dev/pci/ixgbe/ix_txrx.c
--- a/sys/dev/pci/ixgbe/ix_txrx.c       Fri Dec 02 06:49:00 2016 +0000
+++ b/sys/dev/pci/ixgbe/ix_txrx.c       Fri Dec 02 10:21:43 2016 +0000
@@ -58,8 +58,8 @@
  * 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/ix_txrx.c 282289 2015-04-30 22:53:27Z erj $*/
-/*$NetBSD: ix_txrx.c,v 1.4 2016/12/01 06:56:28 msaitoh Exp $*/
+/*$FreeBSD: head/sys/dev/ixgbe/ix_txrx.c 283881 2015-06-01 17:15:25Z jfv $*/
+/*$NetBSD: ix_txrx.c,v 1.5 2016/12/02 10:21:43 msaitoh Exp $*/
 
 #include "ixgbe.h"
 
@@ -614,7 +614,6 @@
 {
        struct adapter *adapter = txr->adapter;
        struct ixgbe_tx_buf *txbuf;
-       int i;
 #ifdef DEV_NETMAP
        struct netmap_adapter *na = NA(adapter->ifp);
        struct netmap_slot *slot;
@@ -637,7 +636,7 @@
 
        /* Free any existing tx buffers. */
         txbuf = txr->tx_buffers;
-       for (i = 0; i < txr->num_desc; i++, txbuf++) {
+       for (int i = 0; i < txr->num_desc; i++, txbuf++) {
                if (txbuf->m_head != NULL) {
                        bus_dmamap_sync(txr->txtag->dt_dmat, txbuf->map,
                            0, txbuf->m_head->m_pkthdr.len,
@@ -659,7 +658,8 @@
                 */
                if (slot) {
                        int si = netmap_idx_n2k(&na->tx_rings[txr->me], i);
-                       netmap_load_map(na, txr->txtag, txbuf->map, NMB(na, slot + si));
+                       netmap_load_map(na, txr->txtag,
+                           txbuf->map, NMB(na, slot + si));
                }
 #endif /* DEV_NETMAP */
                /* Clear the EOP descriptor pointer */
@@ -812,8 +812,7 @@
        if ((mtag = VLAN_OUTPUT_TAG(ec, mp)) != NULL) {
                vtag = htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
                vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
-       }
-       else if (!IXGBE_IS_X550VF(adapter) && (offload == FALSE))
+       } else if (!IXGBE_IS_X550VF(adapter) && (offload == FALSE))
                return (0);
 
        /*
@@ -1415,7 +1414,7 @@
        struct  adapter         *adapter = rxr->adapter;
        device_t                dev = adapter->dev;
        struct ixgbe_rx_buf     *rxbuf;
-       int                     i, bsize, error;
+       int                     bsize, error;
 
        bsize = sizeof(struct ixgbe_rx_buf) * rxr->num_desc;
        if (!(rxr->rx_buffers =
@@ -1437,7 +1436,7 @@
                goto fail;
        }
 
-       for (i = 0; i < rxr->num_desc; i++, rxbuf++) {
+       for (int i = 0; i < rxr->num_desc; i++, rxbuf++) {
                rxbuf = &rxr->rx_buffers[i];
                error = ixgbe_dmamap_create(rxr->ptag, 0, &rxbuf->pmap);
                if (error) {
@@ -1459,9 +1458,8 @@
 ixgbe_free_receive_ring(struct rx_ring *rxr)
 { 
        struct ixgbe_rx_buf       *rxbuf;
-       int i;
 
-       for (i = 0; i < rxr->num_desc; i++) {
+       for (int i = 0; i < rxr->num_desc; i++) {
                rxbuf = &rxr->rx_buffers[i];
                if (rxbuf->buf != NULL) {
                        bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
@@ -2231,6 +2229,9 @@
        struct rx_ring  *rxr;
        int rsize, tsize, error = IXGBE_SUCCESS;
        int txconf = 0, rxconf = 0;
+#ifdef PCI_IOV
+       enum ixgbe_iov_mode iov_mode;
+#endif
 
         /* First allocate the top level queue structs */
         if (!(adapter->queues =
@@ -2263,6 +2264,12 @@
        tsize = roundup2(adapter->num_tx_desc *
            sizeof(union ixgbe_adv_tx_desc), DBA_ALIGN);
 
+#ifdef PCI_IOV
+       iov_mode = ixgbe_get_iov_mode(adapter);
+       adapter->pool = ixgbe_max_vfs(iov_mode);
+#else
+       adapter->pool = 0;
+#endif
        /*
         * Now set up the TX queues, txconf is needed to handle the
         * possibility that things fail midcourse and we need to
@@ -2272,7 +2279,11 @@
                /* Set up some basics */
                txr = &adapter->tx_rings[i];
                txr->adapter = adapter;
+#ifdef PCI_IOV
+               txr->me = ixgbe_pf_que_index(iov_mode, i);
+#else
                txr->me = i;
+#endif
                txr->num_desc = adapter->num_tx_desc;
 
                /* Initialize the TX side lock */
@@ -2319,7 +2330,11 @@
                rxr = &adapter->rx_rings[i];
                /* Set up some basics */
                rxr->adapter = adapter;
+#ifdef PCI_IOV
+               rxr->me = ixgbe_pf_que_index(iov_mode, i);
+#else
                rxr->me = i;
+#endif
                rxr->num_desc = adapter->num_rx_desc;
 
                /* Initialize the RX side lock */
diff -r a30d3d5b2fe0 -r 6fb92c2557b6 sys/dev/pci/ixgbe/ixgbe.c
--- a/sys/dev/pci/ixgbe/ixgbe.c Fri Dec 02 06:49:00 2016 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe.c Fri Dec 02 10:21:43 2016 +0000
@@ -58,8 +58,8 @@
  * 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/if_ix.c 282299 2015-05-01 12:10:36Z bz $*/
-/*$NetBSD: ixgbe.c,v 1.44 2016/12/01 06:56:28 msaitoh Exp $*/
+/*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 283881 2015-06-01 17:15:25Z jfv $*/
+/*$NetBSD: ixgbe.c,v 1.45 2016/12/02 10:21:43 msaitoh Exp $*/
 
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -77,7 +77,7 @@
 /*********************************************************************
  *  Driver version
  *********************************************************************/
-char ixgbe_driver_version[] = "2.8.3";
+char ixgbe_driver_version[] = "3.1.0";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -164,6 +164,7 @@
 static void    ixgbe_free_pci_resources(struct adapter *);
 static void    ixgbe_local_timer(void *);
 static int     ixgbe_setup_interface(device_t, struct adapter *);
+static void    ixgbe_config_gpie(struct adapter *);
 static void    ixgbe_config_dmac(struct adapter *);
 static void    ixgbe_config_delay_values(struct adapter *);
 static void    ixgbe_config_link(struct adapter *);
@@ -235,6 +236,18 @@
 static void    ixgbe_reinit_fdir(void *, int);
 #endif
 
+#ifdef PCI_IOV
+static void    ixgbe_ping_all_vfs(struct adapter *);
+static void    ixgbe_handle_mbx(void *, int);
+static int     ixgbe_init_iov(device_t, u16, const nvlist_t *);
+static void    ixgbe_uninit_iov(device_t);
+static int     ixgbe_add_vf(device_t, u16, const nvlist_t *);
+static void    ixgbe_initialize_iov(struct adapter *);
+static void    ixgbe_recalculate_max_frame(struct adapter *);
+static void    ixgbe_init_vf(struct adapter *, struct ixgbe_vf *);
+#endif /* PCI_IOV */
+
+
 /*********************************************************************
  *  FreeBSD Device Interface Entry Points
  *********************************************************************/
@@ -486,7 +499,7 @@
        }
 
        /* Allocate multicast array memory. */
-       adapter->mta = malloc(sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
+       adapter->mta = malloc(sizeof(*adapter->mta) *
            MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
        if (adapter->mta == NULL) {
                aprint_error_dev(dev, "Cannot allocate multicast setup array\n");
@@ -568,6 +581,28 @@
        /* Set an initial default flow control value */
        adapter->fc = ixgbe_fc_full;
 
+#ifdef PCI_IOV
+       if ((hw->mac.type != ixgbe_mac_82598EB) && (adapter->msix > 1)) {
+               nvlist_t *pf_schema, *vf_schema;
+
+               hw->mbx.ops.init_params(hw);
+               pf_schema = pci_iov_schema_alloc_node();
+               vf_schema = pci_iov_schema_alloc_node();
+               pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
+               pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
+                   IOV_SCHEMA_HASDEFAULT, TRUE);
+               pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
+                   IOV_SCHEMA_HASDEFAULT, FALSE);
+               pci_iov_schema_add_bool(vf_schema, "allow-promisc",
+                   IOV_SCHEMA_HASDEFAULT, FALSE);
+               error = pci_iov_attach(dev, pf_schema, vf_schema);
+               if (error != 0) {
+                       device_printf(dev,
+                           "Error %d setting up SR-IOV\n", error);
+               }
+       }
+#endif /* PCI_IOV */
+
        /* Check for certain supported features */
        ixgbe_check_wol_support(adapter);
        ixgbe_check_eee_support(adapter);
@@ -642,6 +677,13 @@
        }
 #endif
 
+#ifdef PCI_IOV
+       if (pci_iov_detach(dev) != 0) {
+               device_printf(dev, "SR-IOV in use; detach first.\n");
+               return (EBUSY);
+       }
+#endif /* PCI_IOV */
+
        /* Stop the adapter */
        IXGBE_CORE_LOCK(adapter);
        ixgbe_setup_low_power_mode(adapter);
@@ -658,6 +700,9 @@
        softint_disestablish(adapter->link_si);
        softint_disestablish(adapter->mod_si);
        softint_disestablish(adapter->msf_si);
+#ifdef PCI_IOV
+       softint_disestablish(adapter->mbx_si);
+#endif
        softint_disestablish(adapter->phy_si);
 #ifdef IXGBE_FDIR
        softint_disestablish(adapter->fdir_si);
@@ -991,6 +1036,9 @@
                else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
                        IXGBE_CORE_LOCK(adapter);
                        ixgbe_init_locked(adapter);
+#ifdef PCI_IOV
+                       ixgbe_recalculate_max_frame(adapter);
+#endif
                        IXGBE_CORE_UNLOCK(adapter);
                } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
                        /*
@@ -1027,13 +1075,19 @@
        struct ifnet   *ifp = adapter->ifp;
        device_t        dev = adapter->dev;
        struct ixgbe_hw *hw = &adapter->hw;
-       u32             k, txdctl, mhadd, gpie;
+       struct tx_ring  *txr;
+       struct rx_ring  *rxr;
+       u32             txdctl, mhadd;
        u32             rxdctl, rxctrl;
+#ifdef PCI_IOV
+       enum ixgbe_iov_mode mode;
+#endif
 
        /* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
 
        KASSERT(mutex_owned(&adapter->core_mtx));
        INIT_DEBUGOUT("ixgbe_init_locked: begin");
+
        hw->adapter_stopped = FALSE;
        ixgbe_stop_adapter(hw);
         callout_stop(&adapter->timer);
@@ -1042,13 +1096,22 @@
        adapter->max_frame_size =
                ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
 
+#ifdef PCI_IOV
+       mode = ixgbe_get_iov_mode(adapter);
+       adapter->pool = ixgbe_max_vfs(mode);
+       /* Queue indices may change with IOV mode */
+       for (int i = 0; i < adapter->num_queues; i++) {
+               adapter->rx_rings[i].me = ixgbe_pf_que_index(mode, i);
+               adapter->tx_rings[i].me = ixgbe_pf_que_index(mode, i);
+       }
+#endif
         /* reprogram the RAR[0] in case user changed it. */
-        ixgbe_set_rar(hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
+       ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
 
        /* Get the latest mac address, User can use a LAA */
-       memcpy(hw->mac.addr, CLLADDR(adapter->ifp->if_sadl),
+       memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
            IXGBE_ETH_LENGTH_OF_ADDRESS);
-       ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1);
+       ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
        hw->addr_ctrl.rar_used_count = 1;
 
        /* Prepare transmit descriptors and buffers */
@@ -1059,6 +1122,9 @@
        }
 
        ixgbe_init_hw(hw);



Home | Main Index | Thread Index | Old Index