|
@@ -589,22 +589,37 @@ void t4_uld_mem_free(struct adapter *adap)
|
|
|
kfree(adap->uld);
|
|
|
}
|
|
|
|
|
|
+/* This function should be called with uld_mutex taken. */
|
|
|
+static void cxgb4_shutdown_uld_adapter(struct adapter *adap, enum cxgb4_uld type)
|
|
|
+{
|
|
|
+ if (adap->uld[type].handle) {
|
|
|
+ adap->uld[type].handle = NULL;
|
|
|
+ adap->uld[type].add = NULL;
|
|
|
+ release_sge_txq_uld(adap, type);
|
|
|
+
|
|
|
+ if (adap->flags & FULL_INIT_DONE)
|
|
|
+ quiesce_rx_uld(adap, type);
|
|
|
+
|
|
|
+ if (adap->flags & USING_MSIX)
|
|
|
+ free_msix_queue_irqs_uld(adap, type);
|
|
|
+
|
|
|
+ free_sge_queues_uld(adap, type);
|
|
|
+ free_queues_uld(adap, type);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void t4_uld_clean_up(struct adapter *adap)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
|
|
|
- if (!adap->uld)
|
|
|
- return;
|
|
|
+ mutex_lock(&uld_mutex);
|
|
|
for (i = 0; i < CXGB4_ULD_MAX; i++) {
|
|
|
if (!adap->uld[i].handle)
|
|
|
continue;
|
|
|
- if (adap->flags & FULL_INIT_DONE)
|
|
|
- quiesce_rx_uld(adap, i);
|
|
|
- if (adap->flags & USING_MSIX)
|
|
|
- free_msix_queue_irqs_uld(adap, i);
|
|
|
- free_sge_queues_uld(adap, i);
|
|
|
- free_queues_uld(adap, i);
|
|
|
+
|
|
|
+ cxgb4_shutdown_uld_adapter(adap, i);
|
|
|
}
|
|
|
+ mutex_unlock(&uld_mutex);
|
|
|
}
|
|
|
|
|
|
static void uld_init(struct adapter *adap, struct cxgb4_lld_info *lld)
|
|
@@ -783,15 +798,8 @@ int cxgb4_unregister_uld(enum cxgb4_uld type)
|
|
|
continue;
|
|
|
if (type == CXGB4_ULD_ISCSIT && is_t4(adap->params.chip))
|
|
|
continue;
|
|
|
- adap->uld[type].handle = NULL;
|
|
|
- adap->uld[type].add = NULL;
|
|
|
- release_sge_txq_uld(adap, type);
|
|
|
- if (adap->flags & FULL_INIT_DONE)
|
|
|
- quiesce_rx_uld(adap, type);
|
|
|
- if (adap->flags & USING_MSIX)
|
|
|
- free_msix_queue_irqs_uld(adap, type);
|
|
|
- free_sge_queues_uld(adap, type);
|
|
|
- free_queues_uld(adap, type);
|
|
|
+
|
|
|
+ cxgb4_shutdown_uld_adapter(adap, type);
|
|
|
}
|
|
|
mutex_unlock(&uld_mutex);
|
|
|
|