Index: sys/dev/ixl/ixl_pf.h =================================================================== --- sys/dev/ixl/ixl_pf.h +++ sys/dev/ixl/ixl_pf.h @@ -336,7 +336,8 @@ void ixl_del_filter(struct ixl_vsi *, const u8 *, s16 vlan); void ixl_reconfigure_filters(struct ixl_vsi *vsi); -int ixl_disable_rings(struct ixl_vsi *); +int ixl_disable_rings(struct ixl_pf *, struct ixl_vsi *, + struct ixl_pf_qtag *); int ixl_disable_tx_ring(struct ixl_pf *, struct ixl_pf_qtag *, u16); int ixl_disable_rx_ring(struct ixl_pf *, struct ixl_pf_qtag *, u16); int ixl_disable_ring(struct ixl_pf *pf, struct ixl_pf_qtag *, u16); Index: sys/dev/ixl/ixl_pf_iov.c =================================================================== --- sys/dev/ixl/ixl_pf_iov.c +++ sys/dev/ixl/ixl_pf_iov.c @@ -411,7 +411,7 @@ wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig); if (vf->vsi.seid != 0) - ixl_disable_rings(&vf->vsi); + ixl_disable_rings(pf, &vf->vsi, &vf->qtag); ixl_vf_release_resources(pf, vf); ixl_vf_setup_vsi(pf, vf); Index: sys/dev/ixl/ixl_pf_main.c =================================================================== --- sys/dev/ixl/ixl_pf_main.c +++ sys/dev/ixl/ixl_pf_main.c @@ -309,17 +309,19 @@ * by user before bringing interface up */ ixl_set_promisc(vsi); - /* And now turn on interrupts */ - ixl_enable_intr(vsi); - /* Get link info */ hw->phy.get_link_info = TRUE; i40e_get_link_status(hw, &pf->link_up); ixl_update_link_status(pf); - /* Now inform the stack we're ready */ + /* Inform the stack we're ready */ ifp->if_drv_flags |= IFF_DRV_RUNNING; + /* Turn on interrupts after setting the running flag + * to avoid missing those asserted immediately after + * enabling them */ + ixl_enable_intr(vsi); + #ifdef IXL_IW if (ixl_enable_iwarp && pf->iw_enabled) { int ret = ixl_iw_pf_init(pf); @@ -1162,7 +1164,7 @@ #endif ixl_disable_rings_intr(vsi); - ixl_disable_rings(vsi); + ixl_disable_rings(pf, vsi, &pf->qtag); } void @@ -3561,18 +3563,13 @@ return (error); } -/* For PF VSI only */ int -ixl_disable_rings(struct ixl_vsi *vsi) +ixl_disable_rings(struct ixl_pf *pf, struct ixl_vsi *vsi, struct ixl_pf_qtag *qtag) { - struct ixl_pf *pf = vsi->back; - int error = 0; + int error = 0; - for (int i = 0; i < vsi->num_queues; i++) { - error = ixl_disable_ring(pf, &pf->qtag, i); - if (error) - return (error); - } + for (int i = 0; i < vsi->num_queues; i++) + error = ixl_disable_ring(pf, qtag, i); return (error); } Index: sys/dev/ixl/ixl_txrx.c =================================================================== --- sys/dev/ixl/ixl_txrx.c +++ sys/dev/ixl/ixl_txrx.c @@ -1504,6 +1504,10 @@ /* ** Now set up the LRO interface: */ + if (lro->ifp != NULL) { + tcp_lro_free(lro); + lro->ifp = NULL; + } if (ifp->if_capenable & IFCAP_LRO) { int err = tcp_lro_init(lro); if (err) { @@ -1559,6 +1563,11 @@ bus_dma_tag_destroy(rxr->ptag); rxr->ptag = NULL; } + + if (rxr->lro.ifp != NULL) { + tcp_lro_free(&rxr->lro); + rxr->lro.ifp = NULL; + } } static inline void