Home | History | Annotate | Line # | Download | only in ixgbe
      1  1.18   msaitoh /* $NetBSD: if_sriov.c,v 1.18 2023/10/06 14:37:04 msaitoh Exp $ */
      2   1.1   msaitoh /******************************************************************************
      3   1.1   msaitoh 
      4   1.1   msaitoh   Copyright (c) 2001-2017, Intel Corporation
      5   1.1   msaitoh   All rights reserved.
      6   1.1   msaitoh 
      7   1.1   msaitoh   Redistribution and use in source and binary forms, with or without
      8   1.1   msaitoh   modification, are permitted provided that the following conditions are met:
      9   1.1   msaitoh 
     10   1.1   msaitoh    1. Redistributions of source code must retain the above copyright notice,
     11   1.1   msaitoh       this list of conditions and the following disclaimer.
     12   1.1   msaitoh 
     13   1.1   msaitoh    2. Redistributions in binary form must reproduce the above copyright
     14   1.1   msaitoh       notice, this list of conditions and the following disclaimer in the
     15   1.1   msaitoh       documentation and/or other materials provided with the distribution.
     16   1.1   msaitoh 
     17   1.1   msaitoh    3. Neither the name of the Intel Corporation nor the names of its
     18   1.1   msaitoh       contributors may be used to endorse or promote products derived from
     19   1.1   msaitoh       this software without specific prior written permission.
     20   1.1   msaitoh 
     21   1.1   msaitoh   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     22   1.1   msaitoh   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23   1.1   msaitoh   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24   1.1   msaitoh   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     25   1.1   msaitoh   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26   1.1   msaitoh   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27   1.1   msaitoh   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28   1.1   msaitoh   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29   1.1   msaitoh   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30   1.1   msaitoh   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31   1.1   msaitoh   POSSIBILITY OF SUCH DAMAGE.
     32   1.1   msaitoh 
     33   1.1   msaitoh ******************************************************************************/
     34   1.3   msaitoh /*$FreeBSD: head/sys/dev/ixgbe/if_sriov.c 327031 2017-12-20 18:15:06Z erj $*/
     35   1.1   msaitoh 
     36  1.11   msaitoh #include <sys/cdefs.h>
     37  1.18   msaitoh __KERNEL_RCSID(0, "$NetBSD: if_sriov.c,v 1.18 2023/10/06 14:37:04 msaitoh Exp $");
     38  1.11   msaitoh 
     39   1.1   msaitoh #include "ixgbe.h"
     40   1.2   msaitoh #include "ixgbe_sriov.h"
     41   1.1   msaitoh 
     42   1.1   msaitoh #ifdef PCI_IOV
     43   1.1   msaitoh 
     44   1.1   msaitoh MALLOC_DEFINE(M_IXGBE_SRIOV, "ix_sriov", "ix SR-IOV allocations");
     45   1.1   msaitoh 
     46   1.1   msaitoh /************************************************************************
     47   1.1   msaitoh  * ixgbe_pci_iov_detach
     48   1.1   msaitoh  ************************************************************************/
     49   1.1   msaitoh int
     50   1.1   msaitoh ixgbe_pci_iov_detach(device_t dev)
     51   1.1   msaitoh {
     52   1.1   msaitoh 	return pci_iov_detach(dev);
     53   1.1   msaitoh }
     54   1.1   msaitoh 
     55   1.1   msaitoh /************************************************************************
     56   1.1   msaitoh  * ixgbe_define_iov_schemas
     57   1.1   msaitoh  ************************************************************************/
     58   1.1   msaitoh void
     59   1.1   msaitoh ixgbe_define_iov_schemas(device_t dev, int *error)
     60   1.1   msaitoh {
     61   1.1   msaitoh 	nvlist_t *pf_schema, *vf_schema;
     62   1.1   msaitoh 
     63   1.1   msaitoh 	pf_schema = pci_iov_schema_alloc_node();
     64   1.1   msaitoh 	vf_schema = pci_iov_schema_alloc_node();
     65   1.1   msaitoh 	pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
     66   1.1   msaitoh 	pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
     67   1.1   msaitoh 	    IOV_SCHEMA_HASDEFAULT, TRUE);
     68   1.1   msaitoh 	pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
     69   1.1   msaitoh 	    IOV_SCHEMA_HASDEFAULT, FALSE);
     70   1.1   msaitoh 	pci_iov_schema_add_bool(vf_schema, "allow-promisc",
     71   1.1   msaitoh 	    IOV_SCHEMA_HASDEFAULT, FALSE);
     72   1.1   msaitoh 	*error = pci_iov_attach(dev, pf_schema, vf_schema);
     73   1.1   msaitoh 	if (*error != 0) {
     74   1.1   msaitoh 		device_printf(dev,
     75   1.1   msaitoh 		    "Error %d setting up SR-IOV\n", *error);
     76   1.1   msaitoh 	}
     77   1.1   msaitoh } /* ixgbe_define_iov_schemas */
     78   1.1   msaitoh 
     79   1.1   msaitoh /************************************************************************
     80   1.1   msaitoh  * ixgbe_align_all_queue_indices
     81   1.1   msaitoh  ************************************************************************/
     82   1.1   msaitoh inline void
     83  1.18   msaitoh ixgbe_align_all_queue_indices(struct ixgbe_softc *sc)
     84   1.1   msaitoh {
     85   1.1   msaitoh 	int i;
     86   1.1   msaitoh 	int index;
     87   1.1   msaitoh 
     88  1.18   msaitoh 	for (i = 0; i < sc->num_queues; i++) {
     89  1.18   msaitoh 		index = ixgbe_vf_que_index(sc->iov_mode, sc->pool, i);
     90  1.18   msaitoh 		sc->rx_rings[i].me = index;
     91  1.18   msaitoh 		sc->tx_rings[i].me = index;
     92   1.1   msaitoh 	}
     93   1.1   msaitoh }
     94   1.1   msaitoh 
     95   1.1   msaitoh /* Support functions for SR-IOV/VF management */
     96   1.1   msaitoh static inline void
     97  1.16   msaitoh ixgbe_send_vf_msg(struct ixgbe_hw *hw, struct ixgbe_vf *vf, u32 msg)
     98   1.1   msaitoh {
     99   1.1   msaitoh 	if (vf->flags & IXGBE_VF_CTS)
    100   1.1   msaitoh 		msg |= IXGBE_VT_MSGTYPE_CTS;
    101   1.1   msaitoh 
    102  1.17   msaitoh 	hw->mbx.ops[vf->pool].write(hw, &msg, 1, vf->pool);
    103   1.1   msaitoh }
    104   1.1   msaitoh 
    105   1.1   msaitoh static inline void
    106  1.18   msaitoh ixgbe_send_vf_ack(struct ixgbe_softc *sc, struct ixgbe_vf *vf, u32 msg)
    107   1.1   msaitoh {
    108   1.1   msaitoh 	msg &= IXGBE_VT_MSG_MASK;
    109  1.18   msaitoh 	ixgbe_send_vf_msg(&sc->hw, vf, msg | IXGBE_VT_MSGTYPE_SUCCESS);
    110   1.1   msaitoh }
    111   1.1   msaitoh 
    112   1.1   msaitoh static inline void
    113  1.18   msaitoh ixgbe_send_vf_nack(struct ixgbe_softc *sc, struct ixgbe_vf *vf, u32 msg)
    114   1.1   msaitoh {
    115   1.1   msaitoh 	msg &= IXGBE_VT_MSG_MASK;
    116  1.18   msaitoh 	ixgbe_send_vf_msg(&sc->hw, vf, msg | IXGBE_VT_MSGTYPE_FAILURE);
    117   1.1   msaitoh }
    118   1.1   msaitoh 
    119   1.1   msaitoh static inline void
    120  1.18   msaitoh ixgbe_process_vf_ack(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    121   1.1   msaitoh {
    122   1.1   msaitoh 	if (!(vf->flags & IXGBE_VF_CTS))
    123  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, 0);
    124   1.1   msaitoh }
    125   1.1   msaitoh 
    126   1.9       mrg static inline bool
    127   1.1   msaitoh ixgbe_vf_mac_changed(struct ixgbe_vf *vf, const uint8_t *mac)
    128   1.1   msaitoh {
    129   1.1   msaitoh 	return (bcmp(mac, vf->ether_addr, ETHER_ADDR_LEN) != 0);
    130   1.1   msaitoh }
    131   1.1   msaitoh 
    132   1.1   msaitoh static inline int
    133   1.1   msaitoh ixgbe_vf_queues(int mode)
    134   1.1   msaitoh {
    135   1.1   msaitoh 	switch (mode) {
    136   1.1   msaitoh 	case IXGBE_64_VM:
    137   1.1   msaitoh 		return (2);
    138   1.1   msaitoh 	case IXGBE_32_VM:
    139   1.1   msaitoh 		return (4);
    140   1.1   msaitoh 	case IXGBE_NO_VM:
    141   1.1   msaitoh 	default:
    142   1.1   msaitoh 		return (0);
    143   1.1   msaitoh 	}
    144   1.1   msaitoh }
    145   1.1   msaitoh 
    146   1.1   msaitoh inline int
    147   1.1   msaitoh ixgbe_vf_que_index(int mode, int vfnum, int num)
    148   1.1   msaitoh {
    149   1.1   msaitoh 	return ((vfnum * ixgbe_vf_queues(mode)) + num);
    150   1.1   msaitoh }
    151   1.1   msaitoh 
    152   1.1   msaitoh static inline void
    153  1.18   msaitoh ixgbe_update_max_frame(struct ixgbe_softc * sc, int max_frame)
    154   1.1   msaitoh {
    155  1.18   msaitoh 	if (sc->max_frame_size < max_frame)
    156  1.18   msaitoh 		sc->max_frame_size = max_frame;
    157   1.1   msaitoh }
    158   1.1   msaitoh 
    159   1.1   msaitoh inline u32
    160   1.1   msaitoh ixgbe_get_mrqc(int iov_mode)
    161   1.1   msaitoh {
    162   1.1   msaitoh 	u32 mrqc;
    163   1.1   msaitoh 
    164   1.1   msaitoh 	switch (iov_mode) {
    165   1.1   msaitoh 	case IXGBE_64_VM:
    166   1.1   msaitoh 		mrqc = IXGBE_MRQC_VMDQRSS64EN;
    167   1.1   msaitoh 		break;
    168   1.1   msaitoh 	case IXGBE_32_VM:
    169   1.1   msaitoh 		mrqc = IXGBE_MRQC_VMDQRSS32EN;
    170   1.1   msaitoh 		break;
    171   1.1   msaitoh 	case IXGBE_NO_VM:
    172   1.1   msaitoh 		mrqc = 0;
    173   1.1   msaitoh 		break;
    174   1.1   msaitoh 	default:
    175   1.1   msaitoh 		panic("Unexpected SR-IOV mode %d", iov_mode);
    176   1.1   msaitoh 	}
    177   1.1   msaitoh 
    178   1.1   msaitoh 	return mrqc;
    179   1.1   msaitoh }
    180   1.1   msaitoh 
    181   1.1   msaitoh 
    182   1.1   msaitoh inline u32
    183   1.1   msaitoh ixgbe_get_mtqc(int iov_mode)
    184   1.1   msaitoh {
    185   1.1   msaitoh 	uint32_t mtqc;
    186   1.1   msaitoh 
    187   1.1   msaitoh 	switch (iov_mode) {
    188   1.1   msaitoh 	case IXGBE_64_VM:
    189   1.1   msaitoh 		mtqc = IXGBE_MTQC_64VF | IXGBE_MTQC_VT_ENA;
    190   1.1   msaitoh 		break;
    191   1.1   msaitoh 	case IXGBE_32_VM:
    192   1.1   msaitoh 		mtqc = IXGBE_MTQC_32VF | IXGBE_MTQC_VT_ENA;
    193   1.1   msaitoh 		break;
    194   1.1   msaitoh 	case IXGBE_NO_VM:
    195   1.1   msaitoh 		mtqc = IXGBE_MTQC_64Q_1PB;
    196   1.1   msaitoh 		break;
    197   1.1   msaitoh 	default:
    198   1.1   msaitoh 		panic("Unexpected SR-IOV mode %d", iov_mode);
    199   1.1   msaitoh 	}
    200   1.1   msaitoh 
    201   1.1   msaitoh 	return mtqc;
    202   1.1   msaitoh }
    203   1.1   msaitoh 
    204   1.1   msaitoh void
    205  1.18   msaitoh ixgbe_ping_all_vfs(struct ixgbe_softc *sc)
    206   1.1   msaitoh {
    207   1.1   msaitoh 	struct ixgbe_vf *vf;
    208   1.1   msaitoh 
    209  1.18   msaitoh 	for (int i = 0; i < sc->num_vfs; i++) {
    210  1.18   msaitoh 		vf = &sc->vfs[i];
    211   1.1   msaitoh 		if (vf->flags & IXGBE_VF_ACTIVE)
    212  1.18   msaitoh 			ixgbe_send_vf_msg(&sc->hw, vf, IXGBE_PF_CONTROL_MSG);
    213   1.1   msaitoh 	}
    214   1.1   msaitoh } /* ixgbe_ping_all_vfs */
    215   1.1   msaitoh 
    216   1.1   msaitoh 
    217   1.1   msaitoh static void
    218  1.18   msaitoh ixgbe_vf_set_default_vlan(struct ixgbe_softc *sc, struct ixgbe_vf *vf,
    219   1.1   msaitoh                           uint16_t tag)
    220   1.1   msaitoh {
    221   1.1   msaitoh 	struct ixgbe_hw *hw;
    222   1.1   msaitoh 	uint32_t vmolr, vmvir;
    223   1.1   msaitoh 
    224  1.18   msaitoh 	hw = &sc->hw;
    225   1.1   msaitoh 
    226   1.1   msaitoh 	vf->vlan_tag = tag;
    227   1.1   msaitoh 
    228   1.1   msaitoh 	vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf->pool));
    229   1.1   msaitoh 
    230   1.1   msaitoh 	/* Do not receive packets that pass inexact filters. */
    231   1.1   msaitoh 	vmolr &= ~(IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_ROPE);
    232   1.1   msaitoh 
    233   1.1   msaitoh 	/* Disable Multicast Promicuous Mode. */
    234   1.1   msaitoh 	vmolr &= ~IXGBE_VMOLR_MPE;
    235   1.1   msaitoh 
    236   1.1   msaitoh 	/* Accept broadcasts. */
    237   1.1   msaitoh 	vmolr |= IXGBE_VMOLR_BAM;
    238   1.1   msaitoh 
    239   1.1   msaitoh 	if (tag == 0) {
    240   1.1   msaitoh 		/* Accept non-vlan tagged traffic. */
    241   1.2   msaitoh 		vmolr |= IXGBE_VMOLR_AUPE;
    242   1.1   msaitoh 
    243   1.1   msaitoh 		/* Allow VM to tag outgoing traffic; no default tag. */
    244   1.1   msaitoh 		vmvir = 0;
    245   1.1   msaitoh 	} else {
    246   1.1   msaitoh 		/* Require vlan-tagged traffic. */
    247   1.1   msaitoh 		vmolr &= ~IXGBE_VMOLR_AUPE;
    248   1.1   msaitoh 
    249   1.1   msaitoh 		/* Tag all traffic with provided vlan tag. */
    250   1.1   msaitoh 		vmvir = (tag | IXGBE_VMVIR_VLANA_DEFAULT);
    251   1.1   msaitoh 	}
    252   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf->pool), vmolr);
    253   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf->pool), vmvir);
    254   1.1   msaitoh } /* ixgbe_vf_set_default_vlan */
    255   1.1   msaitoh 
    256   1.1   msaitoh 
    257   1.5   msaitoh static void
    258  1.18   msaitoh ixgbe_clear_vfmbmem(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    259   1.5   msaitoh {
    260  1.18   msaitoh 	struct ixgbe_hw *hw = &sc->hw;
    261   1.5   msaitoh 	uint32_t vf_index = IXGBE_VF_INDEX(vf->pool);
    262   1.5   msaitoh 	uint16_t mbx_size = hw->mbx.size;
    263   1.5   msaitoh 	uint16_t i;
    264   1.5   msaitoh 
    265  1.18   msaitoh 	IXGBE_CORE_LOCK_ASSERT(sc);
    266   1.5   msaitoh 
    267   1.5   msaitoh 	for (i = 0; i < mbx_size; ++i)
    268   1.5   msaitoh 		IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_index), i, 0x0);
    269   1.5   msaitoh } /* ixgbe_clear_vfmbmem */
    270   1.5   msaitoh 
    271   1.5   msaitoh 
    272   1.9       mrg static bool
    273  1.18   msaitoh ixgbe_vf_frame_size_compatible(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    274   1.1   msaitoh {
    275   1.1   msaitoh 
    276   1.1   msaitoh 	/*
    277   1.1   msaitoh 	 * Frame size compatibility between PF and VF is only a problem on
    278   1.1   msaitoh 	 * 82599-based cards.  X540 and later support any combination of jumbo
    279   1.1   msaitoh 	 * frames on PFs and VFs.
    280   1.1   msaitoh 	 */
    281  1.18   msaitoh 	if (sc->hw.mac.type != ixgbe_mac_82599EB)
    282   1.1   msaitoh 		return (TRUE);
    283   1.1   msaitoh 
    284   1.1   msaitoh 	switch (vf->api_ver) {
    285   1.1   msaitoh 	case IXGBE_API_VER_1_0:
    286   1.1   msaitoh 	case IXGBE_API_VER_UNKNOWN:
    287   1.1   msaitoh 		/*
    288   1.1   msaitoh 		 * On legacy (1.0 and older) VF versions, we don't support jumbo
    289   1.1   msaitoh 		 * frames on either the PF or the VF.
    290   1.1   msaitoh 		 */
    291  1.18   msaitoh 		if (sc->max_frame_size > ETHER_MAX_LEN ||
    292   1.1   msaitoh 		    vf->max_frame_size > ETHER_MAX_LEN)
    293   1.1   msaitoh 			return (FALSE);
    294   1.1   msaitoh 
    295   1.1   msaitoh 		return (TRUE);
    296   1.1   msaitoh 
    297   1.1   msaitoh 		break;
    298   1.1   msaitoh 	case IXGBE_API_VER_1_1:
    299   1.1   msaitoh 	default:
    300   1.1   msaitoh 		/*
    301   1.1   msaitoh 		 * 1.1 or later VF versions always work if they aren't using
    302   1.1   msaitoh 		 * jumbo frames.
    303   1.1   msaitoh 		 */
    304   1.1   msaitoh 		if (vf->max_frame_size <= ETHER_MAX_LEN)
    305   1.1   msaitoh 			return (TRUE);
    306   1.1   msaitoh 
    307   1.1   msaitoh 		/*
    308   1.1   msaitoh 		 * Jumbo frames only work with VFs if the PF is also using jumbo
    309   1.1   msaitoh 		 * frames.
    310   1.1   msaitoh 		 */
    311  1.18   msaitoh 		if (sc->max_frame_size <= ETHER_MAX_LEN)
    312   1.1   msaitoh 			return (TRUE);
    313   1.1   msaitoh 
    314   1.1   msaitoh 		return (FALSE);
    315   1.1   msaitoh 	}
    316   1.1   msaitoh } /* ixgbe_vf_frame_size_compatible */
    317   1.1   msaitoh 
    318   1.1   msaitoh 
    319   1.1   msaitoh static void
    320  1.18   msaitoh ixgbe_process_vf_reset(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    321   1.1   msaitoh {
    322  1.18   msaitoh 	ixgbe_vf_set_default_vlan(sc, vf, vf->default_vlan);
    323   1.1   msaitoh 
    324   1.1   msaitoh 	// XXX clear multicast addresses
    325   1.1   msaitoh 
    326  1.18   msaitoh 	ixgbe_clear_rar(&sc->hw, vf->rar_index);
    327  1.18   msaitoh 	ixgbe_clear_vfmbmem(sc, vf);
    328  1.18   msaitoh 	ixgbe_toggle_txdctl(&sc->hw, IXGBE_VF_INDEX(vf->pool));
    329   1.1   msaitoh 
    330   1.1   msaitoh 	vf->api_ver = IXGBE_API_VER_UNKNOWN;
    331   1.1   msaitoh } /* ixgbe_process_vf_reset */
    332   1.1   msaitoh 
    333   1.1   msaitoh 
    334   1.1   msaitoh static void
    335  1.18   msaitoh ixgbe_vf_enable_transmit(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    336   1.1   msaitoh {
    337   1.1   msaitoh 	struct ixgbe_hw *hw;
    338   1.1   msaitoh 	uint32_t vf_index, vfte;
    339   1.1   msaitoh 
    340  1.18   msaitoh 	hw = &sc->hw;
    341   1.1   msaitoh 
    342   1.1   msaitoh 	vf_index = IXGBE_VF_INDEX(vf->pool);
    343   1.1   msaitoh 	vfte = IXGBE_READ_REG(hw, IXGBE_VFTE(vf_index));
    344   1.1   msaitoh 	vfte |= IXGBE_VF_BIT(vf->pool);
    345   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_index), vfte);
    346   1.1   msaitoh } /* ixgbe_vf_enable_transmit */
    347   1.1   msaitoh 
    348   1.1   msaitoh 
    349   1.1   msaitoh static void
    350  1.18   msaitoh ixgbe_vf_enable_receive(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    351   1.1   msaitoh {
    352   1.1   msaitoh 	struct ixgbe_hw *hw;
    353   1.1   msaitoh 	uint32_t vf_index, vfre;
    354   1.1   msaitoh 
    355  1.18   msaitoh 	hw = &sc->hw;
    356   1.1   msaitoh 
    357   1.1   msaitoh 	vf_index = IXGBE_VF_INDEX(vf->pool);
    358   1.1   msaitoh 	vfre = IXGBE_READ_REG(hw, IXGBE_VFRE(vf_index));
    359  1.18   msaitoh 	if (ixgbe_vf_frame_size_compatible(sc, vf))
    360   1.1   msaitoh 		vfre |= IXGBE_VF_BIT(vf->pool);
    361   1.1   msaitoh 	else
    362   1.1   msaitoh 		vfre &= ~IXGBE_VF_BIT(vf->pool);
    363   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_index), vfre);
    364   1.1   msaitoh } /* ixgbe_vf_enable_receive */
    365   1.1   msaitoh 
    366   1.1   msaitoh 
    367   1.1   msaitoh static void
    368  1.18   msaitoh ixgbe_vf_reset_msg(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg)
    369   1.1   msaitoh {
    370   1.1   msaitoh 	struct ixgbe_hw *hw;
    371   1.1   msaitoh 	uint32_t ack;
    372   1.1   msaitoh 	uint32_t resp[IXGBE_VF_PERMADDR_MSG_LEN];
    373   1.1   msaitoh 
    374  1.18   msaitoh 	hw = &sc->hw;
    375   1.1   msaitoh 
    376  1.18   msaitoh 	ixgbe_process_vf_reset(sc, vf);
    377   1.1   msaitoh 
    378   1.1   msaitoh 	if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
    379  1.18   msaitoh 		ixgbe_set_rar(&sc->hw, vf->rar_index, vf->ether_addr,
    380   1.1   msaitoh 		    vf->pool, TRUE);
    381  1.15   msaitoh 		ack = IXGBE_VT_MSGTYPE_SUCCESS;
    382   1.1   msaitoh 	} else
    383  1.15   msaitoh 		ack = IXGBE_VT_MSGTYPE_FAILURE;
    384   1.1   msaitoh 
    385  1.18   msaitoh 	ixgbe_vf_enable_transmit(sc, vf);
    386  1.18   msaitoh 	ixgbe_vf_enable_receive(sc, vf);
    387   1.1   msaitoh 
    388   1.1   msaitoh 	vf->flags |= IXGBE_VF_CTS;
    389   1.1   msaitoh 
    390   1.2   msaitoh 	resp[0] = IXGBE_VF_RESET | ack;
    391   1.1   msaitoh 	bcopy(vf->ether_addr, &resp[1], ETHER_ADDR_LEN);
    392   1.1   msaitoh 	resp[3] = hw->mac.mc_filter_type;
    393   1.1   msaitoh 	hw->mbx.ops.write(hw, resp, IXGBE_VF_PERMADDR_MSG_LEN, vf->pool);
    394   1.1   msaitoh } /* ixgbe_vf_reset_msg */
    395   1.1   msaitoh 
    396   1.1   msaitoh 
    397   1.1   msaitoh static void
    398  1.18   msaitoh ixgbe_vf_set_mac(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg)
    399   1.1   msaitoh {
    400   1.1   msaitoh 	uint8_t *mac;
    401   1.1   msaitoh 
    402   1.1   msaitoh 	mac = (uint8_t*)&msg[1];
    403   1.1   msaitoh 
    404   1.1   msaitoh 	/* Check that the VF has permission to change the MAC address. */
    405   1.1   msaitoh 	if (!(vf->flags & IXGBE_VF_CAP_MAC) && ixgbe_vf_mac_changed(vf, mac)) {
    406  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    407   1.1   msaitoh 		return;
    408   1.1   msaitoh 	}
    409   1.1   msaitoh 
    410   1.1   msaitoh 	if (ixgbe_validate_mac_addr(mac) != 0) {
    411  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    412   1.1   msaitoh 		return;
    413   1.1   msaitoh 	}
    414   1.1   msaitoh 
    415   1.1   msaitoh 	bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
    416   1.1   msaitoh 
    417  1.18   msaitoh 	ixgbe_set_rar(&sc->hw, vf->rar_index, vf->ether_addr, vf->pool,
    418   1.1   msaitoh 	    TRUE);
    419   1.1   msaitoh 
    420  1.18   msaitoh 	ixgbe_send_vf_ack(sc, vf, msg[0]);
    421   1.1   msaitoh } /* ixgbe_vf_set_mac */
    422   1.1   msaitoh 
    423   1.1   msaitoh 
    424   1.1   msaitoh /*
    425   1.1   msaitoh  * VF multicast addresses are set by using the appropriate bit in
    426   1.1   msaitoh  * 1 of 128 32 bit addresses (4096 possible).
    427   1.1   msaitoh  */
    428   1.1   msaitoh static void
    429  1.18   msaitoh ixgbe_vf_set_mc_addr(struct ixgbe_softc *sc, struct ixgbe_vf *vf, u32 *msg)
    430   1.1   msaitoh {
    431   1.1   msaitoh 	u16	*list = (u16*)&msg[1];
    432   1.1   msaitoh 	int	entries;
    433   1.1   msaitoh 	u32	vmolr, vec_bit, vec_reg, mta_reg;
    434   1.1   msaitoh 
    435   1.1   msaitoh 	entries = (msg[0] & IXGBE_VT_MSGINFO_MASK) >> IXGBE_VT_MSGINFO_SHIFT;
    436   1.4  riastrad 	entries = uimin(entries, IXGBE_MAX_VF_MC);
    437   1.1   msaitoh 
    438  1.18   msaitoh 	vmolr = IXGBE_READ_REG(&sc->hw, IXGBE_VMOLR(vf->pool));
    439   1.1   msaitoh 
    440   1.1   msaitoh 	vf->num_mc_hashes = entries;
    441   1.1   msaitoh 
    442   1.1   msaitoh 	/* Set the appropriate MTA bit */
    443   1.1   msaitoh 	for (int i = 0; i < entries; i++) {
    444   1.1   msaitoh 		vf->mc_hash[i] = list[i];
    445   1.1   msaitoh 		vec_reg = (vf->mc_hash[i] >> 5) & 0x7F;
    446   1.1   msaitoh 		vec_bit = vf->mc_hash[i] & 0x1F;
    447  1.18   msaitoh 		mta_reg = IXGBE_READ_REG(&sc->hw, IXGBE_MTA(vec_reg));
    448   1.1   msaitoh 		mta_reg |= (1 << vec_bit);
    449  1.18   msaitoh 		IXGBE_WRITE_REG(&sc->hw, IXGBE_MTA(vec_reg), mta_reg);
    450   1.1   msaitoh 	}
    451   1.1   msaitoh 
    452   1.1   msaitoh 	vmolr |= IXGBE_VMOLR_ROMPE;
    453  1.18   msaitoh 	IXGBE_WRITE_REG(&sc->hw, IXGBE_VMOLR(vf->pool), vmolr);
    454  1.18   msaitoh 	ixgbe_send_vf_ack(sc, vf, msg[0]);
    455   1.1   msaitoh } /* ixgbe_vf_set_mc_addr */
    456   1.1   msaitoh 
    457   1.1   msaitoh 
    458   1.1   msaitoh static void
    459  1.18   msaitoh ixgbe_vf_set_vlan(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg)
    460   1.1   msaitoh {
    461   1.1   msaitoh 	struct ixgbe_hw *hw;
    462   1.1   msaitoh 	int enable;
    463   1.1   msaitoh 	uint16_t tag;
    464   1.1   msaitoh 
    465  1.18   msaitoh 	hw = &sc->hw;
    466   1.1   msaitoh 	enable = IXGBE_VT_MSGINFO(msg[0]);
    467   1.1   msaitoh 	tag = msg[1] & IXGBE_VLVF_VLANID_MASK;
    468   1.1   msaitoh 
    469   1.1   msaitoh 	if (!(vf->flags & IXGBE_VF_CAP_VLAN)) {
    470  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    471   1.1   msaitoh 		return;
    472   1.1   msaitoh 	}
    473   1.1   msaitoh 
    474   1.1   msaitoh 	/* It is illegal to enable vlan tag 0. */
    475   1.2   msaitoh 	if (tag == 0 && enable != 0) {
    476  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    477   1.1   msaitoh 		return;
    478   1.1   msaitoh 	}
    479   1.1   msaitoh 
    480   1.1   msaitoh 	ixgbe_set_vfta(hw, tag, vf->pool, enable, false);
    481  1.18   msaitoh 	ixgbe_send_vf_ack(sc, vf, msg[0]);
    482   1.1   msaitoh } /* ixgbe_vf_set_vlan */
    483   1.1   msaitoh 
    484   1.1   msaitoh 
    485   1.1   msaitoh static void
    486  1.18   msaitoh ixgbe_vf_set_lpe(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg)
    487   1.1   msaitoh {
    488   1.1   msaitoh 	struct ixgbe_hw *hw;
    489   1.1   msaitoh 	uint32_t vf_max_size, pf_max_size, mhadd;
    490   1.1   msaitoh 
    491  1.18   msaitoh 	hw = &sc->hw;
    492   1.1   msaitoh 	vf_max_size = msg[1];
    493   1.1   msaitoh 
    494   1.1   msaitoh 	if (vf_max_size < ETHER_CRC_LEN) {
    495   1.1   msaitoh 		/* We intentionally ACK invalid LPE requests. */
    496  1.18   msaitoh 		ixgbe_send_vf_ack(sc, vf, msg[0]);
    497   1.1   msaitoh 		return;
    498   1.1   msaitoh 	}
    499   1.1   msaitoh 
    500   1.1   msaitoh 	vf_max_size -= ETHER_CRC_LEN;
    501   1.1   msaitoh 
    502   1.1   msaitoh 	if (vf_max_size > IXGBE_MAX_FRAME_SIZE) {
    503   1.1   msaitoh 		/* We intentionally ACK invalid LPE requests. */
    504  1.18   msaitoh 		ixgbe_send_vf_ack(sc, vf, msg[0]);
    505   1.1   msaitoh 		return;
    506   1.1   msaitoh 	}
    507   1.1   msaitoh 
    508   1.1   msaitoh 	vf->max_frame_size = vf_max_size;
    509  1.18   msaitoh 	ixgbe_update_max_frame(sc, vf->max_frame_size);
    510   1.1   msaitoh 
    511   1.1   msaitoh 	/*
    512   1.1   msaitoh 	 * We might have to disable reception to this VF if the frame size is
    513   1.1   msaitoh 	 * not compatible with the config on the PF.
    514   1.1   msaitoh 	 */
    515  1.18   msaitoh 	ixgbe_vf_enable_receive(sc, vf);
    516   1.1   msaitoh 
    517   1.1   msaitoh 	mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
    518   1.1   msaitoh 	pf_max_size = (mhadd & IXGBE_MHADD_MFS_MASK) >> IXGBE_MHADD_MFS_SHIFT;
    519   1.1   msaitoh 
    520  1.18   msaitoh 	if (pf_max_size < sc->max_frame_size) {
    521   1.1   msaitoh 		mhadd &= ~IXGBE_MHADD_MFS_MASK;
    522  1.18   msaitoh 		mhadd |= sc->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
    523   1.1   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
    524   1.1   msaitoh 	}
    525   1.1   msaitoh 
    526  1.18   msaitoh 	ixgbe_send_vf_ack(sc, vf, msg[0]);
    527   1.1   msaitoh } /* ixgbe_vf_set_lpe */
    528   1.1   msaitoh 
    529   1.1   msaitoh 
    530   1.1   msaitoh static void
    531  1.18   msaitoh ixgbe_vf_set_macvlan(struct ixgbe_softc *sc, struct ixgbe_vf *vf,
    532   1.1   msaitoh                      uint32_t *msg)
    533   1.1   msaitoh {
    534   1.1   msaitoh 	//XXX implement this
    535  1.18   msaitoh 	ixgbe_send_vf_nack(sc, vf, msg[0]);
    536   1.1   msaitoh } /* ixgbe_vf_set_macvlan */
    537   1.1   msaitoh 
    538   1.1   msaitoh 
    539   1.1   msaitoh static void
    540  1.18   msaitoh ixgbe_vf_api_negotiate(struct ixgbe_softc *sc, struct ixgbe_vf *vf,
    541   1.1   msaitoh     uint32_t *msg)
    542   1.1   msaitoh {
    543   1.1   msaitoh 
    544   1.1   msaitoh 	switch (msg[1]) {
    545   1.1   msaitoh 	case IXGBE_API_VER_1_0:
    546   1.1   msaitoh 	case IXGBE_API_VER_1_1:
    547   1.1   msaitoh 		vf->api_ver = msg[1];
    548  1.18   msaitoh 		ixgbe_send_vf_ack(sc, vf, msg[0]);
    549   1.1   msaitoh 		break;
    550   1.1   msaitoh 	default:
    551   1.1   msaitoh 		vf->api_ver = IXGBE_API_VER_UNKNOWN;
    552  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    553   1.1   msaitoh 		break;
    554   1.1   msaitoh 	}
    555   1.1   msaitoh } /* ixgbe_vf_api_negotiate */
    556   1.1   msaitoh 
    557   1.1   msaitoh 
    558   1.1   msaitoh static void
    559  1.18   msaitoh ixgbe_vf_get_queues(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg)
    560   1.1   msaitoh {
    561   1.1   msaitoh 	struct ixgbe_hw *hw;
    562   1.1   msaitoh 	uint32_t resp[IXGBE_VF_GET_QUEUES_RESP_LEN];
    563   1.1   msaitoh 	int num_queues;
    564   1.1   msaitoh 
    565  1.18   msaitoh 	hw = &sc->hw;
    566   1.1   msaitoh 
    567   1.1   msaitoh 	/* GET_QUEUES is not supported on pre-1.1 APIs. */
    568   1.1   msaitoh 	switch (msg[0]) {
    569   1.1   msaitoh 	case IXGBE_API_VER_1_0:
    570   1.1   msaitoh 	case IXGBE_API_VER_UNKNOWN:
    571  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    572   1.1   msaitoh 		return;
    573   1.1   msaitoh 	}
    574   1.1   msaitoh 
    575  1.15   msaitoh 	resp[0] = IXGBE_VF_GET_QUEUES | IXGBE_VT_MSGTYPE_SUCCESS |
    576   1.1   msaitoh 	    IXGBE_VT_MSGTYPE_CTS;
    577   1.1   msaitoh 
    578  1.18   msaitoh 	num_queues = ixgbe_vf_queues(sc->iov_mode);
    579   1.1   msaitoh 	resp[IXGBE_VF_TX_QUEUES] = num_queues;
    580   1.1   msaitoh 	resp[IXGBE_VF_RX_QUEUES] = num_queues;
    581   1.1   msaitoh 	resp[IXGBE_VF_TRANS_VLAN] = (vf->default_vlan != 0);
    582   1.1   msaitoh 	resp[IXGBE_VF_DEF_QUEUE] = 0;
    583   1.1   msaitoh 
    584   1.1   msaitoh 	hw->mbx.ops.write(hw, resp, IXGBE_VF_GET_QUEUES_RESP_LEN, vf->pool);
    585   1.1   msaitoh } /* ixgbe_vf_get_queues */
    586   1.1   msaitoh 
    587   1.1   msaitoh 
    588   1.1   msaitoh static void
    589  1.18   msaitoh ixgbe_process_vf_msg(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    590   1.1   msaitoh {
    591   1.1   msaitoh 	struct ixgbe_hw *hw;
    592   1.1   msaitoh 	uint32_t msg[IXGBE_VFMAILBOX_SIZE];
    593   1.1   msaitoh 	int error;
    594   1.1   msaitoh 
    595  1.18   msaitoh 	hw = &sc->hw;
    596   1.1   msaitoh 
    597  1.17   msaitoh 	error = hw->mbx.ops[vf->pool].read(hw, msg, IXGBE_VFMAILBOX_SIZE,
    598  1.17   msaitoh 	    vf->pool);
    599   1.1   msaitoh 
    600   1.1   msaitoh 	if (error != 0)
    601   1.1   msaitoh 		return;
    602   1.1   msaitoh 
    603  1.18   msaitoh 	CTR3(KTR_MALLOC, "%s: received msg %x from %d",
    604  1.18   msaitoh 	    sc->ifp->if_xname, msg[0], vf->pool);
    605   1.1   msaitoh 	if (msg[0] == IXGBE_VF_RESET) {
    606  1.18   msaitoh 		ixgbe_vf_reset_msg(sc, vf, msg);
    607   1.1   msaitoh 		return;
    608   1.1   msaitoh 	}
    609   1.1   msaitoh 
    610   1.1   msaitoh 	if (!(vf->flags & IXGBE_VF_CTS)) {
    611  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    612   1.1   msaitoh 		return;
    613   1.1   msaitoh 	}
    614   1.1   msaitoh 
    615   1.1   msaitoh 	switch (msg[0] & IXGBE_VT_MSG_MASK) {
    616   1.1   msaitoh 	case IXGBE_VF_SET_MAC_ADDR:
    617  1.18   msaitoh 		ixgbe_vf_set_mac(sc, vf, msg);
    618   1.1   msaitoh 		break;
    619   1.1   msaitoh 	case IXGBE_VF_SET_MULTICAST:
    620  1.18   msaitoh 		ixgbe_vf_set_mc_addr(sc, vf, msg);
    621   1.1   msaitoh 		break;
    622   1.1   msaitoh 	case IXGBE_VF_SET_VLAN:
    623  1.18   msaitoh 		ixgbe_vf_set_vlan(sc, vf, msg);
    624   1.1   msaitoh 		break;
    625   1.1   msaitoh 	case IXGBE_VF_SET_LPE:
    626  1.18   msaitoh 		ixgbe_vf_set_lpe(sc, vf, msg);
    627   1.1   msaitoh 		break;
    628   1.1   msaitoh 	case IXGBE_VF_SET_MACVLAN:
    629  1.18   msaitoh 		ixgbe_vf_set_macvlan(sc, vf, msg);
    630   1.1   msaitoh 		break;
    631   1.1   msaitoh 	case IXGBE_VF_API_NEGOTIATE:
    632  1.18   msaitoh 		ixgbe_vf_api_negotiate(sc, vf, msg);
    633   1.1   msaitoh 		break;
    634   1.1   msaitoh 	case IXGBE_VF_GET_QUEUES:
    635  1.18   msaitoh 		ixgbe_vf_get_queues(sc, vf, msg);
    636   1.1   msaitoh 		break;
    637   1.1   msaitoh 	default:
    638  1.18   msaitoh 		ixgbe_send_vf_nack(sc, vf, msg[0]);
    639   1.1   msaitoh 	}
    640   1.1   msaitoh } /* ixgbe_process_vf_msg */
    641   1.1   msaitoh 
    642   1.1   msaitoh 
    643   1.1   msaitoh /* Tasklet for handling VF -> PF mailbox messages */
    644   1.1   msaitoh void
    645  1.12   msaitoh ixgbe_handle_mbx(void *context)
    646   1.1   msaitoh {
    647  1.18   msaitoh 	struct ixgbe_softc *sc = context;
    648   1.1   msaitoh 	struct ixgbe_hw *hw;
    649   1.1   msaitoh 	struct ixgbe_vf *vf;
    650   1.1   msaitoh 	int i;
    651   1.1   msaitoh 
    652  1.18   msaitoh 	KASSERT(mutex_owned(&sc->core_mtx));
    653   1.8   msaitoh 
    654  1.18   msaitoh 	hw = &sc->hw;
    655   1.1   msaitoh 
    656  1.18   msaitoh 	for (i = 0; i < sc->num_vfs; i++) {
    657  1.18   msaitoh 		vf = &sc->vfs[i];
    658   1.1   msaitoh 
    659  1.17   msaitoh 		if ((vf->flags & IXGBE_VF_ACTIVE) == 0)
    660  1.17   msaitoh 			continue;
    661  1.17   msaitoh 
    662  1.17   msaitoh 		if (hw->mbx.ops[vf->pool].check_for_rst(hw, vf->pool) == 0)
    663  1.18   msaitoh 			ixgbe_process_vf_reset(sc, vf);
    664  1.17   msaitoh 
    665  1.17   msaitoh 		if (hw->mbx.ops[vf->pool].check_for_msg(hw, vf->pool) == 0)
    666  1.18   msaitoh 			ixgbe_process_vf_msg(sc, vf);
    667  1.17   msaitoh 
    668  1.17   msaitoh 		if (hw->mbx.ops[vf->pool].check_for_ack(hw, vf->pool) == 0)
    669  1.18   msaitoh 			ixgbe_process_vf_ack(sc, vf);
    670   1.1   msaitoh 	}
    671   1.1   msaitoh } /* ixgbe_handle_mbx */
    672   1.1   msaitoh 
    673   1.1   msaitoh int
    674   1.1   msaitoh ixgbe_init_iov(device_t dev, u16 num_vfs, const nvlist_t *config)
    675   1.1   msaitoh {
    676  1.18   msaitoh 	struct ixgbe_softc *sc;
    677   1.1   msaitoh 	int retval = 0;
    678   1.1   msaitoh 
    679  1.18   msaitoh 	sc = device_get_softc(dev);
    680  1.18   msaitoh 	sc->iov_mode = IXGBE_NO_VM;
    681   1.1   msaitoh 
    682   1.1   msaitoh 	if (num_vfs == 0) {
    683   1.1   msaitoh 		/* Would we ever get num_vfs = 0? */
    684   1.1   msaitoh 		retval = EINVAL;
    685   1.1   msaitoh 		goto err_init_iov;
    686   1.1   msaitoh 	}
    687   1.1   msaitoh 
    688   1.1   msaitoh 	/*
    689   1.1   msaitoh 	 * We've got to reserve a VM's worth of queues for the PF,
    690   1.1   msaitoh 	 * thus we go into "64 VF mode" if 32+ VFs are requested.
    691   1.1   msaitoh 	 * With 64 VFs, you can only have two queues per VF.
    692   1.1   msaitoh 	 * With 32 VFs, you can have up to four queues per VF.
    693   1.1   msaitoh 	 */
    694   1.1   msaitoh 	if (num_vfs >= IXGBE_32_VM)
    695  1.18   msaitoh 		sc->iov_mode = IXGBE_64_VM;
    696   1.1   msaitoh 	else
    697  1.18   msaitoh 		sc->iov_mode = IXGBE_32_VM;
    698   1.1   msaitoh 
    699   1.1   msaitoh 	/* Again, reserving 1 VM's worth of queues for the PF */
    700  1.18   msaitoh 	sc->pool = sc->iov_mode - 1;
    701   1.1   msaitoh 
    702  1.18   msaitoh 	if ((num_vfs > sc->pool) || (num_vfs >= IXGBE_64_VM)) {
    703   1.1   msaitoh 		retval = ENOSPC;
    704   1.1   msaitoh 		goto err_init_iov;
    705   1.1   msaitoh 	}
    706   1.1   msaitoh 
    707  1.18   msaitoh 	IXGBE_CORE_LOCK(sc);
    708   1.1   msaitoh 
    709  1.18   msaitoh 	sc->vfs = malloc(sizeof(*sc->vfs) * num_vfs, M_IXGBE_SRIOV,
    710   1.1   msaitoh 	    M_NOWAIT | M_ZERO);
    711   1.1   msaitoh 
    712  1.18   msaitoh 	if (sc->vfs == NULL) {
    713   1.1   msaitoh 		retval = ENOMEM;
    714  1.18   msaitoh 		IXGBE_CORE_UNLOCK(sc);
    715   1.1   msaitoh 		goto err_init_iov;
    716   1.1   msaitoh 	}
    717   1.1   msaitoh 
    718  1.18   msaitoh 	sc->num_vfs = num_vfs;
    719  1.18   msaitoh 	ixgbe_init_mbx_params_pf(&sc->hw);
    720   1.2   msaitoh 
    721   1.2   msaitoh 	/* set the SRIOV flag now as it's needed
    722   1.2   msaitoh 	 * by ixgbe_init_locked() */
    723  1.18   msaitoh 	sc->feat_en |= IXGBE_FEATURE_SRIOV;
    724  1.18   msaitoh 	sc->init_locked(sc);
    725   1.1   msaitoh 
    726  1.18   msaitoh 	IXGBE_CORE_UNLOCK(sc);
    727   1.1   msaitoh 
    728  1.18   msaitoh 	return retval;
    729   1.1   msaitoh 
    730   1.1   msaitoh err_init_iov:
    731  1.18   msaitoh 	sc->num_vfs = 0;
    732  1.18   msaitoh 	sc->pool = 0;
    733  1.18   msaitoh 	sc->iov_mode = IXGBE_NO_VM;
    734   1.1   msaitoh 
    735  1.18   msaitoh 	return retval;
    736   1.1   msaitoh } /* ixgbe_init_iov */
    737   1.1   msaitoh 
    738   1.1   msaitoh void
    739   1.1   msaitoh ixgbe_uninit_iov(device_t dev)
    740   1.1   msaitoh {
    741   1.1   msaitoh 	struct ixgbe_hw *hw;
    742  1.18   msaitoh 	struct ixgbe_softc *sc;
    743   1.1   msaitoh 	uint32_t pf_reg, vf_reg;
    744   1.1   msaitoh 
    745  1.18   msaitoh 	sc = device_get_softc(dev);
    746  1.18   msaitoh 	hw = &sc->hw;
    747   1.1   msaitoh 
    748  1.18   msaitoh 	IXGBE_CORE_LOCK(sc);
    749   1.1   msaitoh 
    750   1.1   msaitoh 	/* Enable rx/tx for the PF and disable it for all VFs. */
    751  1.18   msaitoh 	pf_reg = IXGBE_VF_INDEX(sc->pool);
    752  1.18   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFRE(pf_reg), IXGBE_VF_BIT(sc->pool));
    753  1.18   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFTE(pf_reg), IXGBE_VF_BIT(sc->pool));
    754   1.1   msaitoh 
    755   1.1   msaitoh 	if (pf_reg == 0)
    756   1.1   msaitoh 		vf_reg = 1;
    757   1.1   msaitoh 	else
    758   1.1   msaitoh 		vf_reg = 0;
    759   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), 0);
    760   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), 0);
    761   1.1   msaitoh 
    762   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
    763   1.1   msaitoh 
    764  1.18   msaitoh 	free(sc->vfs, M_IXGBE_SRIOV);
    765  1.18   msaitoh 	sc->vfs = NULL;
    766  1.18   msaitoh 	sc->num_vfs = 0;
    767  1.18   msaitoh 	sc->feat_en &= ~IXGBE_FEATURE_SRIOV;
    768   1.1   msaitoh 
    769  1.18   msaitoh 	IXGBE_CORE_UNLOCK(sc);
    770   1.1   msaitoh } /* ixgbe_uninit_iov */
    771   1.1   msaitoh 
    772   1.1   msaitoh static void
    773  1.18   msaitoh ixgbe_init_vf(struct ixgbe_softc *sc, struct ixgbe_vf *vf)
    774   1.1   msaitoh {
    775   1.1   msaitoh 	struct ixgbe_hw *hw;
    776   1.1   msaitoh 	uint32_t vf_index, pfmbimr;
    777   1.1   msaitoh 
    778  1.18   msaitoh 	IXGBE_CORE_LOCK_ASSERT(sc);
    779   1.1   msaitoh 
    780  1.18   msaitoh 	hw = &sc->hw;
    781   1.1   msaitoh 
    782   1.1   msaitoh 	if (!(vf->flags & IXGBE_VF_ACTIVE))
    783   1.1   msaitoh 		return;
    784   1.1   msaitoh 
    785   1.1   msaitoh 	vf_index = IXGBE_VF_INDEX(vf->pool);
    786   1.1   msaitoh 	pfmbimr = IXGBE_READ_REG(hw, IXGBE_PFMBIMR(vf_index));
    787   1.1   msaitoh 	pfmbimr |= IXGBE_VF_BIT(vf->pool);
    788   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_PFMBIMR(vf_index), pfmbimr);
    789   1.1   msaitoh 
    790  1.18   msaitoh 	ixgbe_vf_set_default_vlan(sc, vf, vf->vlan_tag);
    791   1.1   msaitoh 
    792   1.1   msaitoh 	// XXX multicast addresses
    793   1.1   msaitoh 
    794   1.1   msaitoh 	if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
    795  1.18   msaitoh 		ixgbe_set_rar(&sc->hw, vf->rar_index,
    796   1.1   msaitoh 		    vf->ether_addr, vf->pool, TRUE);
    797   1.1   msaitoh 	}
    798   1.1   msaitoh 
    799  1.18   msaitoh 	ixgbe_vf_enable_transmit(sc, vf);
    800  1.18   msaitoh 	ixgbe_vf_enable_receive(sc, vf);
    801   1.1   msaitoh 
    802  1.18   msaitoh 	ixgbe_send_vf_msg(&sc->hw, vf, IXGBE_PF_CONTROL_MSG);
    803   1.1   msaitoh } /* ixgbe_init_vf */
    804   1.1   msaitoh 
    805   1.1   msaitoh void
    806  1.18   msaitoh ixgbe_initialize_iov(struct ixgbe_softc *sc)
    807   1.1   msaitoh {
    808  1.18   msaitoh 	struct ixgbe_hw *hw = &sc->hw;
    809   1.1   msaitoh 	uint32_t mrqc, mtqc, vt_ctl, vf_reg, gcr_ext, gpie;
    810   1.1   msaitoh 	int i;
    811   1.1   msaitoh 
    812  1.18   msaitoh 	if (sc->iov_mode == IXGBE_NO_VM)
    813   1.1   msaitoh 		return;
    814   1.1   msaitoh 
    815  1.18   msaitoh 	IXGBE_CORE_LOCK_ASSERT(sc);
    816   1.1   msaitoh 
    817   1.1   msaitoh 	/* RMW appropriate registers based on IOV mode */
    818   1.1   msaitoh 	/* Read... */
    819   1.1   msaitoh 	mrqc    = IXGBE_READ_REG(hw, IXGBE_MRQC);
    820   1.1   msaitoh 	gcr_ext = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
    821   1.1   msaitoh 	gpie    = IXGBE_READ_REG(hw, IXGBE_GPIE);
    822   1.1   msaitoh 	/* Modify... */
    823   1.1   msaitoh 	mrqc    &= ~IXGBE_MRQC_MRQE_MASK;
    824   1.1   msaitoh 	mtqc     =  IXGBE_MTQC_VT_ENA;      /* No initial MTQC read needed */
    825   1.1   msaitoh 	gcr_ext |=  IXGBE_GCR_EXT_MSIX_EN;
    826   1.1   msaitoh 	gcr_ext &= ~IXGBE_GCR_EXT_VT_MODE_MASK;
    827   1.1   msaitoh 	gpie    &= ~IXGBE_GPIE_VTMODE_MASK;
    828  1.18   msaitoh 	switch (sc->iov_mode) {
    829   1.1   msaitoh 	case IXGBE_64_VM:
    830   1.1   msaitoh 		mrqc    |= IXGBE_MRQC_VMDQRSS64EN;
    831   1.1   msaitoh 		mtqc    |= IXGBE_MTQC_64VF;
    832   1.1   msaitoh 		gcr_ext |= IXGBE_GCR_EXT_VT_MODE_64;
    833   1.1   msaitoh 		gpie    |= IXGBE_GPIE_VTMODE_64;
    834   1.1   msaitoh 		break;
    835   1.1   msaitoh 	case IXGBE_32_VM:
    836   1.1   msaitoh 		mrqc    |= IXGBE_MRQC_VMDQRSS32EN;
    837   1.1   msaitoh 		mtqc    |= IXGBE_MTQC_32VF;
    838   1.1   msaitoh 		gcr_ext |= IXGBE_GCR_EXT_VT_MODE_32;
    839   1.1   msaitoh 		gpie    |= IXGBE_GPIE_VTMODE_32;
    840   1.1   msaitoh 		break;
    841   1.1   msaitoh 	default:
    842  1.18   msaitoh 		panic("Unexpected SR-IOV mode %d", sc->iov_mode);
    843   1.1   msaitoh 	}
    844   1.1   msaitoh 	/* Write... */
    845   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
    846   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
    847   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext);
    848   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
    849   1.1   msaitoh 
    850   1.1   msaitoh 	/* Enable rx/tx for the PF. */
    851  1.18   msaitoh 	vf_reg = IXGBE_VF_INDEX(sc->pool);
    852  1.18   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), IXGBE_VF_BIT(sc->pool));
    853  1.18   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), IXGBE_VF_BIT(sc->pool));
    854   1.1   msaitoh 
    855   1.1   msaitoh 	/* Allow VM-to-VM communication. */
    856   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
    857   1.1   msaitoh 
    858   1.1   msaitoh 	vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
    859  1.18   msaitoh 	vt_ctl |= (sc->pool << IXGBE_VT_CTL_POOL_SHIFT);
    860   1.1   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
    861   1.1   msaitoh 
    862  1.18   msaitoh 	for (i = 0; i < sc->num_vfs; i++)
    863  1.18   msaitoh 		ixgbe_init_vf(sc, &sc->vfs[i]);
    864   1.1   msaitoh } /* ixgbe_initialize_iov */
    865   1.1   msaitoh 
    866   1.1   msaitoh 
    867   1.1   msaitoh /* Check the max frame setting of all active VF's */
    868   1.1   msaitoh void
    869  1.18   msaitoh ixgbe_recalculate_max_frame(struct ixgbe_softc *sc)
    870   1.1   msaitoh {
    871   1.1   msaitoh 	struct ixgbe_vf *vf;
    872   1.1   msaitoh 
    873  1.18   msaitoh 	IXGBE_CORE_LOCK_ASSERT(sc);
    874   1.1   msaitoh 
    875  1.18   msaitoh 	for (int i = 0; i < sc->num_vfs; i++) {
    876  1.18   msaitoh 		vf = &sc->vfs[i];
    877   1.1   msaitoh 		if (vf->flags & IXGBE_VF_ACTIVE)
    878  1.18   msaitoh 			ixgbe_update_max_frame(sc, vf->max_frame_size);
    879   1.1   msaitoh 	}
    880   1.1   msaitoh } /* ixgbe_recalculate_max_frame */
    881   1.1   msaitoh 
    882   1.1   msaitoh int
    883   1.1   msaitoh ixgbe_add_vf(device_t dev, u16 vfnum, const nvlist_t *config)
    884   1.1   msaitoh {
    885  1.18   msaitoh 	struct ixgbe_softc *sc;
    886   1.1   msaitoh 	struct ixgbe_vf *vf;
    887   1.1   msaitoh 	const void *mac;
    888   1.1   msaitoh 
    889  1.18   msaitoh 	sc = device_get_softc(dev);
    890   1.1   msaitoh 
    891  1.18   msaitoh 	KASSERT(vfnum < sc->num_vfs, ("VF index %d is out of range %d",
    892  1.18   msaitoh 	    vfnum, sc->num_vfs));
    893   1.1   msaitoh 
    894  1.18   msaitoh 	IXGBE_CORE_LOCK(sc);
    895  1.18   msaitoh 	vf = &sc->vfs[vfnum];
    896   1.1   msaitoh 	vf->pool= vfnum;
    897   1.1   msaitoh 
    898   1.1   msaitoh 	/* RAR[0] is used by the PF so use vfnum + 1 for VF RAR. */
    899   1.1   msaitoh 	vf->rar_index = vfnum + 1;
    900   1.1   msaitoh 	vf->default_vlan = 0;
    901   1.1   msaitoh 	vf->max_frame_size = ETHER_MAX_LEN;
    902  1.18   msaitoh 	ixgbe_update_max_frame(sc, vf->max_frame_size);
    903   1.1   msaitoh 
    904   1.1   msaitoh 	if (nvlist_exists_binary(config, "mac-addr")) {
    905   1.1   msaitoh 		mac = nvlist_get_binary(config, "mac-addr", NULL);
    906   1.1   msaitoh 		bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
    907   1.1   msaitoh 		if (nvlist_get_bool(config, "allow-set-mac"))
    908   1.1   msaitoh 			vf->flags |= IXGBE_VF_CAP_MAC;
    909   1.1   msaitoh 	} else
    910   1.1   msaitoh 		/*
    911   1.1   msaitoh 		 * If the administrator has not specified a MAC address then
    912   1.1   msaitoh 		 * we must allow the VF to choose one.
    913   1.1   msaitoh 		 */
    914   1.1   msaitoh 		vf->flags |= IXGBE_VF_CAP_MAC;
    915   1.1   msaitoh 
    916   1.1   msaitoh 	vf->flags |= IXGBE_VF_ACTIVE;
    917   1.1   msaitoh 
    918  1.18   msaitoh 	ixgbe_init_vf(sc, vf);
    919  1.18   msaitoh 	IXGBE_CORE_UNLOCK(sc);
    920   1.1   msaitoh 
    921   1.1   msaitoh 	return (0);
    922   1.1   msaitoh } /* ixgbe_add_vf */
    923   1.1   msaitoh 
    924   1.1   msaitoh #else
    925   1.1   msaitoh 
    926   1.1   msaitoh void
    927  1.12   msaitoh ixgbe_handle_mbx(void *context)
    928   1.1   msaitoh {
    929  1.12   msaitoh 	UNREFERENCED_1PARAMETER(context);
    930   1.1   msaitoh } /* ixgbe_handle_mbx */
    931   1.1   msaitoh 
    932   1.1   msaitoh inline int
    933   1.1   msaitoh ixgbe_vf_que_index(int mode, int vfnum, int num)
    934   1.1   msaitoh {
    935   1.1   msaitoh 	UNREFERENCED_2PARAMETER(mode, vfnum);
    936   1.1   msaitoh 
    937   1.1   msaitoh 	return num;
    938   1.1   msaitoh } /* ixgbe_vf_que_index */
    939   1.1   msaitoh 
    940   1.1   msaitoh #endif
    941