diff options
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 7 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 82 |
2 files changed, 74 insertions, 15 deletions
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 77c68a789681..a7ad22bf77e0 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -1344,6 +1344,13 @@ cont_alloc: | |||
1344 | qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for " | 1344 | qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for " |
1345 | "firmware dump!!!\n", dump_size / 1024); | 1345 | "firmware dump!!!\n", dump_size / 1024); |
1346 | 1346 | ||
1347 | if (ha->fce) { | ||
1348 | dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, | ||
1349 | ha->fce_dma); | ||
1350 | ha->fce = NULL; | ||
1351 | ha->fce_dma = 0; | ||
1352 | } | ||
1353 | |||
1347 | if (ha->eft) { | 1354 | if (ha->eft) { |
1348 | dma_free_coherent(&ha->pdev->dev, eft_size, ha->eft, | 1355 | dma_free_coherent(&ha->pdev->dev, eft_size, ha->eft, |
1349 | ha->eft_dma); | 1356 | ha->eft_dma); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 941b4a66fc2b..05977e736f76 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -260,6 +260,7 @@ static void qla2x00_rst_aen(scsi_qla_host_t *); | |||
260 | 260 | ||
261 | static int qla2x00_mem_alloc(struct qla_hw_data *, uint16_t, uint16_t, | 261 | static int qla2x00_mem_alloc(struct qla_hw_data *, uint16_t, uint16_t, |
262 | struct req_que **, struct rsp_que **); | 262 | struct req_que **, struct rsp_que **); |
263 | static void qla2x00_free_fw_dump(struct qla_hw_data *); | ||
263 | static void qla2x00_mem_free(struct qla_hw_data *); | 264 | static void qla2x00_mem_free(struct qla_hw_data *); |
264 | static void qla2x00_sp_free_dma(srb_t *); | 265 | static void qla2x00_sp_free_dma(srb_t *); |
265 | 266 | ||
@@ -2342,6 +2343,42 @@ probe_out: | |||
2342 | } | 2343 | } |
2343 | 2344 | ||
2344 | static void | 2345 | static void |
2346 | qla2x00_shutdown(struct pci_dev *pdev) | ||
2347 | { | ||
2348 | scsi_qla_host_t *vha; | ||
2349 | struct qla_hw_data *ha; | ||
2350 | |||
2351 | vha = pci_get_drvdata(pdev); | ||
2352 | ha = vha->hw; | ||
2353 | |||
2354 | /* Turn-off FCE trace */ | ||
2355 | if (ha->flags.fce_enabled) { | ||
2356 | qla2x00_disable_fce_trace(vha, NULL, NULL); | ||
2357 | ha->flags.fce_enabled = 0; | ||
2358 | } | ||
2359 | |||
2360 | /* Turn-off EFT trace */ | ||
2361 | if (ha->eft) | ||
2362 | qla2x00_disable_eft_trace(vha); | ||
2363 | |||
2364 | /* Stop currently executing firmware. */ | ||
2365 | qla2x00_try_to_stop_firmware(vha); | ||
2366 | |||
2367 | /* Turn adapter off line */ | ||
2368 | vha->flags.online = 0; | ||
2369 | |||
2370 | /* turn-off interrupts on the card */ | ||
2371 | if (ha->interrupts_on) { | ||
2372 | vha->flags.init_done = 0; | ||
2373 | ha->isp_ops->disable_intrs(ha); | ||
2374 | } | ||
2375 | |||
2376 | qla2x00_free_irqs(vha); | ||
2377 | |||
2378 | qla2x00_free_fw_dump(ha); | ||
2379 | } | ||
2380 | |||
2381 | static void | ||
2345 | qla2x00_remove_one(struct pci_dev *pdev) | 2382 | qla2x00_remove_one(struct pci_dev *pdev) |
2346 | { | 2383 | { |
2347 | scsi_qla_host_t *base_vha, *vha; | 2384 | scsi_qla_host_t *base_vha, *vha; |
@@ -2830,28 +2867,48 @@ fail: | |||
2830 | } | 2867 | } |
2831 | 2868 | ||
2832 | /* | 2869 | /* |
2833 | * qla2x00_mem_free | 2870 | * qla2x00_free_fw_dump |
2834 | * Frees all adapter allocated memory. | 2871 | * Frees fw dump stuff. |
2835 | * | 2872 | * |
2836 | * Input: | 2873 | * Input: |
2837 | * ha = adapter block pointer. | 2874 | * ha = adapter block pointer. |
2838 | */ | 2875 | */ |
2839 | static void | 2876 | static void |
2840 | qla2x00_mem_free(struct qla_hw_data *ha) | 2877 | qla2x00_free_fw_dump(struct qla_hw_data *ha) |
2841 | { | 2878 | { |
2842 | if (ha->srb_mempool) | ||
2843 | mempool_destroy(ha->srb_mempool); | ||
2844 | |||
2845 | if (ha->fce) | 2879 | if (ha->fce) |
2846 | dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, | 2880 | dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, |
2847 | ha->fce_dma); | 2881 | ha->fce_dma); |
2848 | 2882 | ||
2849 | if (ha->fw_dump) { | 2883 | if (ha->fw_dump) { |
2850 | if (ha->eft) | 2884 | if (ha->eft) |
2851 | dma_free_coherent(&ha->pdev->dev, | 2885 | dma_free_coherent(&ha->pdev->dev, |
2852 | ntohl(ha->fw_dump->eft_size), ha->eft, ha->eft_dma); | 2886 | ntohl(ha->fw_dump->eft_size), ha->eft, ha->eft_dma); |
2853 | vfree(ha->fw_dump); | 2887 | vfree(ha->fw_dump); |
2854 | } | 2888 | } |
2889 | ha->fce = NULL; | ||
2890 | ha->fce_dma = 0; | ||
2891 | ha->eft = NULL; | ||
2892 | ha->eft_dma = 0; | ||
2893 | ha->fw_dump = NULL; | ||
2894 | ha->fw_dumped = 0; | ||
2895 | ha->fw_dump_reading = 0; | ||
2896 | } | ||
2897 | |||
2898 | /* | ||
2899 | * qla2x00_mem_free | ||
2900 | * Frees all adapter allocated memory. | ||
2901 | * | ||
2902 | * Input: | ||
2903 | * ha = adapter block pointer. | ||
2904 | */ | ||
2905 | static void | ||
2906 | qla2x00_mem_free(struct qla_hw_data *ha) | ||
2907 | { | ||
2908 | qla2x00_free_fw_dump(ha); | ||
2909 | |||
2910 | if (ha->srb_mempool) | ||
2911 | mempool_destroy(ha->srb_mempool); | ||
2855 | 2912 | ||
2856 | if (ha->dcbx_tlv) | 2913 | if (ha->dcbx_tlv) |
2857 | dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, | 2914 | dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, |
@@ -2925,8 +2982,6 @@ qla2x00_mem_free(struct qla_hw_data *ha) | |||
2925 | 2982 | ||
2926 | ha->srb_mempool = NULL; | 2983 | ha->srb_mempool = NULL; |
2927 | ha->ctx_mempool = NULL; | 2984 | ha->ctx_mempool = NULL; |
2928 | ha->eft = NULL; | ||
2929 | ha->eft_dma = 0; | ||
2930 | ha->sns_cmd = NULL; | 2985 | ha->sns_cmd = NULL; |
2931 | ha->sns_cmd_dma = 0; | 2986 | ha->sns_cmd_dma = 0; |
2932 | ha->ct_sns = NULL; | 2987 | ha->ct_sns = NULL; |
@@ -2946,10 +3001,6 @@ qla2x00_mem_free(struct qla_hw_data *ha) | |||
2946 | 3001 | ||
2947 | ha->gid_list = NULL; | 3002 | ha->gid_list = NULL; |
2948 | ha->gid_list_dma = 0; | 3003 | ha->gid_list_dma = 0; |
2949 | |||
2950 | ha->fw_dump = NULL; | ||
2951 | ha->fw_dumped = 0; | ||
2952 | ha->fw_dump_reading = 0; | ||
2953 | } | 3004 | } |
2954 | 3005 | ||
2955 | struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, | 3006 | struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, |
@@ -4049,6 +4100,7 @@ static struct pci_driver qla2xxx_pci_driver = { | |||
4049 | .id_table = qla2xxx_pci_tbl, | 4100 | .id_table = qla2xxx_pci_tbl, |
4050 | .probe = qla2x00_probe_one, | 4101 | .probe = qla2x00_probe_one, |
4051 | .remove = qla2x00_remove_one, | 4102 | .remove = qla2x00_remove_one, |
4103 | .shutdown = qla2x00_shutdown, | ||
4052 | .err_handler = &qla2xxx_err_handler, | 4104 | .err_handler = &qla2xxx_err_handler, |
4053 | }; | 4105 | }; |
4054 | 4106 | ||