/** * free_ctxt_rcv_groups - free expected receive groups * @rcd - the context to free * * The routine dismantles the expect receive linked * list and clears any tids associated with the receive * context. * * This should only be called for kernel contexts and the * a base user context. */ void hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) { kfree(rcd->groups); rcd->groups = NULL; hfi1_exp_tid_group_init(rcd); hfi1_clear_tids(rcd); }
static void deallocate_vnic_ctxt(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt) { unsigned long flags; dd_dev_dbg(dd, "closing vnic context %d\n", uctxt->ctxt); flush_wc(); if (dd->num_msix_entries) hfi1_reset_vnic_msix_info(uctxt); spin_lock_irqsave(&dd->uctxt_lock, flags); /* * Disable receive context and interrupt available, reset all * RcvCtxtCtrl bits to default values. */ hfi1_rcvctrl(dd, HFI1_RCVCTRL_CTXT_DIS | HFI1_RCVCTRL_TIDFLOW_DIS | HFI1_RCVCTRL_INTRAVAIL_DIS | HFI1_RCVCTRL_ONE_PKT_EGR_DIS | HFI1_RCVCTRL_NO_RHQ_DROP_DIS | HFI1_RCVCTRL_NO_EGR_DROP_DIS, uctxt->ctxt); /* * VNIC contexts are allocated from user context pool. * Release them back to user context pool. * * Reset context integrity checks to default. * (writes to CSRs probably belong in chip.c) */ write_kctxt_csr(dd, uctxt->sc->hw_context, SEND_CTXT_CHECK_ENABLE, hfi1_pkt_default_send_ctxt_mask(dd, SC_USER)); sc_disable(uctxt->sc); dd->send_contexts[uctxt->sc->sw_index].type = SC_USER; spin_unlock_irqrestore(&dd->uctxt_lock, flags); dd->rcd[uctxt->ctxt] = NULL; uctxt->event_flags = 0; hfi1_clear_tids(uctxt); hfi1_clear_ctxt_pkey(dd, uctxt); hfi1_stats.sps_ctxts--; hfi1_free_ctxtdata(dd, uctxt); }