|
@@ -470,9 +470,6 @@ fail_req_map:
|
|
|
|
|
|
static void qla2x00_free_req_que(struct qla_hw_data *ha, struct req_que *req)
|
|
|
{
|
|
|
- if (!ha->req_q_map)
|
|
|
- return;
|
|
|
-
|
|
|
if (IS_QLAFX00(ha)) {
|
|
|
if (req && req->ring_fx00)
|
|
|
dma_free_coherent(&ha->pdev->dev,
|
|
@@ -483,17 +480,14 @@ static void qla2x00_free_req_que(struct qla_hw_data *ha, struct req_que *req)
|
|
|
(req->length + 1) * sizeof(request_t),
|
|
|
req->ring, req->dma);
|
|
|
|
|
|
- if (req) {
|
|
|
+ if (req)
|
|
|
kfree(req->outstanding_cmds);
|
|
|
- kfree(req);
|
|
|
- }
|
|
|
+
|
|
|
+ kfree(req);
|
|
|
}
|
|
|
|
|
|
static void qla2x00_free_rsp_que(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|
|
{
|
|
|
- if (!ha->rsp_q_map)
|
|
|
- return;
|
|
|
-
|
|
|
if (IS_QLAFX00(ha)) {
|
|
|
if (rsp && rsp->ring_fx00)
|
|
|
dma_free_coherent(&ha->pdev->dev,
|
|
@@ -504,8 +498,7 @@ static void qla2x00_free_rsp_que(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|
|
(rsp->length + 1) * sizeof(response_t),
|
|
|
rsp->ring, rsp->dma);
|
|
|
}
|
|
|
- if (rsp)
|
|
|
- kfree(rsp);
|
|
|
+ kfree(rsp);
|
|
|
}
|
|
|
|
|
|
static void qla2x00_free_queues(struct qla_hw_data *ha)
|
|
@@ -3106,7 +3099,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
goto probe_failed;
|
|
|
|
|
|
/* Alloc arrays of request and response ring ptrs */
|
|
|
- if (qla2x00_alloc_queues(ha, req, rsp)) {
|
|
|
+ ret = qla2x00_alloc_queues(ha, req, rsp);
|
|
|
+ if (ret) {
|
|
|
ql_log(ql_log_fatal, base_vha, 0x003d,
|
|
|
"Failed to allocate memory for queue pointers..."
|
|
|
"aborting.\n");
|
|
@@ -3407,8 +3401,15 @@ probe_failed:
|
|
|
}
|
|
|
|
|
|
qla2x00_free_device(base_vha);
|
|
|
-
|
|
|
scsi_host_put(base_vha->host);
|
|
|
+ /*
|
|
|
+ * Need to NULL out local req/rsp after
|
|
|
+ * qla2x00_free_device => qla2x00_free_queues frees
|
|
|
+ * what these are pointing to. Or else we'll
|
|
|
+ * fall over below in qla2x00_free_req/rsp_que.
|
|
|
+ */
|
|
|
+ req = NULL;
|
|
|
+ rsp = NULL;
|
|
|
|
|
|
probe_hw_failed:
|
|
|
qla2x00_mem_free(ha);
|
|
@@ -4114,6 +4115,7 @@ fail_npiv_info:
|
|
|
(*rsp)->dma = 0;
|
|
|
fail_rsp_ring:
|
|
|
kfree(*rsp);
|
|
|
+ *rsp = NULL;
|
|
|
fail_rsp:
|
|
|
dma_free_coherent(&ha->pdev->dev, ((*req)->length + 1) *
|
|
|
sizeof(request_t), (*req)->ring, (*req)->dma);
|
|
@@ -4121,6 +4123,7 @@ fail_rsp:
|
|
|
(*req)->dma = 0;
|
|
|
fail_req_ring:
|
|
|
kfree(*req);
|
|
|
+ *req = NULL;
|
|
|
fail_req:
|
|
|
dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt),
|
|
|
ha->ct_sns, ha->ct_sns_dma);
|
|
@@ -4508,16 +4511,11 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
|
|
dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
|
|
|
ha->init_cb, ha->init_cb_dma);
|
|
|
|
|
|
- if (ha->optrom_buffer)
|
|
|
- vfree(ha->optrom_buffer);
|
|
|
- if (ha->nvram)
|
|
|
- kfree(ha->nvram);
|
|
|
- if (ha->npiv_info)
|
|
|
- kfree(ha->npiv_info);
|
|
|
- if (ha->swl)
|
|
|
- kfree(ha->swl);
|
|
|
- if (ha->loop_id_map)
|
|
|
- kfree(ha->loop_id_map);
|
|
|
+ vfree(ha->optrom_buffer);
|
|
|
+ kfree(ha->nvram);
|
|
|
+ kfree(ha->npiv_info);
|
|
|
+ kfree(ha->swl);
|
|
|
+ kfree(ha->loop_id_map);
|
|
|
|
|
|
ha->srb_mempool = NULL;
|
|
|
ha->ctx_mempool = NULL;
|