staging: dgap: Only read config file dgap.conf once
authorMark Hounschell <markh@compro.net>
Tue, 25 Mar 2014 20:38:14 +0000 (16:38 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Apr 2014 15:49:10 +0000 (08:49 -0700)
The config file is currently read for each board found.
It only needs to be read one time. The buffer it is read
into can now be freed immediately after it is parsed
instead of at driver unload time.

Signed-off-by: Mark Hounschell <markh@compro.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/dgap/dgap.c

index ea920e41dc0a781ef0a5db48e7c93d08dc11a473..07fcb8df6a60fd6c828b41da4405428e5855130f 100644 (file)
@@ -620,8 +620,6 @@ static void dgap_cleanup_module(void)
        class_destroy(dgap_class);
        unregister_chrdev(DIGI_DGAP_MAJOR, "dgap");
 
-       kfree(dgap_config_buf);
-
        for (i = 0; i < dgap_NumBoards; ++i) {
                dgap_remove_ports_sysfiles(dgap_Board[i]);
                dgap_tty_uninit(dgap_Board[i]);
@@ -828,7 +826,7 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
        dgap_get_vpd(brd);
        dgap_do_reset_board(brd);
 
-       if (fw_info[card_type].conf_name) {
+       if ((fw_info[card_type].conf_name) && !dgap_config_buf) {
                ret = request_firmware(&fw, fw_info[card_type].conf_name,
                                         &pdev->dev);
                if (ret) {
@@ -836,20 +834,22 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
                                fw_info[card_type].conf_name);
                        return ret;
                }
+
+               dgap_config_buf = kmalloc(fw->size + 1, GFP_KERNEL);
                if (!dgap_config_buf) {
-                       dgap_config_buf = kmalloc(fw->size + 1, GFP_ATOMIC);
-                       if (!dgap_config_buf) {
-                               release_firmware(fw);
-                               return -ENOMEM;
-                       }
+                       release_firmware(fw);
+                       return -ENOMEM;
                }
 
                memcpy(dgap_config_buf, fw->data, fw->size);
                release_firmware(fw);
                dgap_config_buf[fw->size + 1] = '\0';
 
-               if (dgap_parsefile(&dgap_config_buf, TRUE) != 0)
+               if (dgap_parsefile(&dgap_config_buf, TRUE) != 0) {
+                       kfree(dgap_config_buf);
                        return -EINVAL;
+               }
+               kfree(dgap_config_buf);
        }
 
        ret = dgap_after_config_loaded(brd->boardnum);