edac: i5000: improve handling of pci_enable_device() return value
[firefly-linux-kernel-4.4.55.git] / drivers / edac / edac_mc_sysfs.c
index c200c2fd43ea48d7d6e1e466a0150fe9e443885e..8aad94d10c0cced51d10746f22b5086068c48d74 100644 (file)
@@ -124,19 +124,6 @@ static const char *edac_caps[] = {
        [EDAC_S16ECD16ED] = "S16ECD16ED"
 };
 
-
-
-static ssize_t memctrl_int_store(void *ptr, const char *buffer, size_t count)
-{
-       int *value = (int *)ptr;
-
-       if (isdigit(*buffer))
-               *value = simple_strtoul(buffer, NULL, 0);
-
-       return count;
-}
-
-
 /* EDAC sysfs CSROW data structures and methods
  */
 
@@ -450,53 +437,54 @@ static ssize_t mci_reset_counters_store(struct mem_ctl_info *mci,
 
 /* memory scrubbing */
 static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci,
-                                       const char *data, size_t count)
+                                         const char *data, size_t count)
 {
-       u32 bandwidth = -1;
+       unsigned long bandwidth = 0;
+       int err;
 
-       if (mci->set_sdram_scrub_rate) {
+       if (!mci->set_sdram_scrub_rate) {
+               edac_printk(KERN_WARNING, EDAC_MC,
+                           "Memory scrub rate setting not implemented!\n");
+               return -EINVAL;
+       }
 
-               memctrl_int_store(&bandwidth, data, count);
+       if (strict_strtoul(data, 10, &bandwidth) < 0)
+               return -EINVAL;
 
-               if (!(*mci->set_sdram_scrub_rate) (mci, &bandwidth)) {
-                       edac_printk(KERN_DEBUG, EDAC_MC,
-                               "Scrub rate set successfully, applied: %d\n",
-                               bandwidth);
-               } else {
-                       /* FIXME: error codes maybe? */
-                       edac_printk(KERN_DEBUG, EDAC_MC,
-                               "Scrub rate set FAILED, could not apply: %d\n",
-                               bandwidth);
-               }
-       } else {
-               /* FIXME: produce "not implemented" ERROR for user-side. */
-               edac_printk(KERN_WARNING, EDAC_MC,
-                       "Memory scrubbing 'set'control is not implemented!\n");
+       err = mci->set_sdram_scrub_rate(mci, (u32)bandwidth);
+       if (err) {
+               edac_printk(KERN_DEBUG, EDAC_MC,
+                           "Failed setting scrub rate to %lu\n", bandwidth);
+               return -EINVAL;
+       }
+       else {
+               edac_printk(KERN_DEBUG, EDAC_MC,
+                           "Scrub rate set to: %lu\n", bandwidth);
+               return count;
        }
-       return count;
 }
 
 static ssize_t mci_sdram_scrub_rate_show(struct mem_ctl_info *mci, char *data)
 {
-       u32 bandwidth = -1;
-
-       if (mci->get_sdram_scrub_rate) {
-               if (!(*mci->get_sdram_scrub_rate) (mci, &bandwidth)) {
-                       edac_printk(KERN_DEBUG, EDAC_MC,
-                               "Scrub rate successfully, fetched: %d\n",
-                               bandwidth);
-               } else {
-                       /* FIXME: error codes maybe? */
-                       edac_printk(KERN_DEBUG, EDAC_MC,
-                               "Scrub rate fetch FAILED, got: %d\n",
-                               bandwidth);
-               }
-       } else {
-               /* FIXME: produce "not implemented" ERROR for user-side.  */
+       u32 bandwidth = 0;
+       int err;
+
+       if (!mci->get_sdram_scrub_rate) {
                edac_printk(KERN_WARNING, EDAC_MC,
-                       "Memory scrubbing 'get' control is not implemented\n");
+                           "Memory scrub rate reading not implemented\n");
+               return -EINVAL;
+       }
+
+       err = mci->get_sdram_scrub_rate(mci, &bandwidth);
+       if (err) {
+               edac_printk(KERN_DEBUG, EDAC_MC, "Error reading scrub rate\n");
+               return err;
+       }
+       else {
+               edac_printk(KERN_DEBUG, EDAC_MC,
+                           "Read scrub rate: %d\n", bandwidth);
+               return sprintf(data, "%d\n", bandwidth);
        }
-       return sprintf(data, "%d\n", bandwidth);
 }
 
 /* default attribute files for the MCI object */