]> err.no Git - linux-2.6/blobdiff - drivers/edac/e752x_edac.c
[PATCH] EDAC: kobject_init/kobject_put fixes
[linux-2.6] / drivers / edac / e752x_edac.c
index 48373fdc634319efcdcc56dcd43985c37a069890..24446542d8d61970a87463574aa1f7a1ed2e85f9 100644 (file)
@@ -181,6 +181,7 @@ struct e752x_pvt {
 
 struct e752x_dev_info {
        u16 err_dev;
+       u16 ctl_dev;
        const char *ctl_name;
 };
 
@@ -207,12 +208,15 @@ struct e752x_error_info {
 static const struct e752x_dev_info e752x_devs[] = {
        [E7520] = {
                   .err_dev = PCI_DEVICE_ID_INTEL_7520_1_ERR,
+                  .ctl_dev = PCI_DEVICE_ID_INTEL_7520_0,
                   .ctl_name = "E7520"},
        [E7525] = {
                   .err_dev = PCI_DEVICE_ID_INTEL_7525_1_ERR,
+                  .ctl_dev = PCI_DEVICE_ID_INTEL_7525_0,
                   .ctl_name = "E7525"},
        [E7320] = {
                   .err_dev = PCI_DEVICE_ID_INTEL_7320_1_ERR,
+                  .ctl_dev = PCI_DEVICE_ID_INTEL_7320_0,
                   .ctl_name = "E7320"},
 };
 
@@ -742,9 +746,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
 {
        int rc = -ENODEV;
        int index;
-       u16 pci_data, stat;
-       u32 stat32;
-       u16 stat16;
+       u16 pci_data;
        u8 stat8;
        struct mem_ctl_info *mci = NULL;
        struct e752x_pvt *pvt = NULL;
@@ -755,8 +757,8 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
        int drc_ddim;           /* DRAM Data Integrity Mode 0=none,2=edac */
        u32 dra;
        unsigned long last_cumul_size;
-       struct pci_dev *pres_dev;
        struct pci_dev *dev = NULL;
+       struct e752x_error_info discard;
 
        debugf0("%s(): mci\n", __func__);
        debugf0("Starting Probe1\n");
@@ -920,33 +922,9 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
                goto fail;
        }
 
-       /* Walk through the PCI table and clear errors */
-       switch (dev_idx) {
-       case E7520:
-               dev = pci_get_device(PCI_VENDOR_ID_INTEL,
-                                     PCI_DEVICE_ID_INTEL_7520_0, NULL);
-               break;
-       case E7525:
-               dev = pci_get_device(PCI_VENDOR_ID_INTEL,
-                                     PCI_DEVICE_ID_INTEL_7525_0, NULL);
-               break;
-       case E7320:
-               dev = pci_get_device(PCI_VENDOR_ID_INTEL,
-                                     PCI_DEVICE_ID_INTEL_7320_0, NULL);
-               break;
-       }
-
-
+       dev = pci_get_device(PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].ctl_dev,
+                            NULL);
        pvt->dev_d0f0 = dev;
-       for (pres_dev = dev;
-            ((struct pci_dev *) pres_dev->global_list.next != dev);
-            pres_dev = (struct pci_dev *) pres_dev->global_list.next) {
-               pci_read_config_dword(pres_dev, PCI_COMMAND, &stat32);
-               stat = (u16) (stat32 >> 16);
-               /* clear any error bits */
-               if (stat32 & ((1 << 6) + (1 << 8)))
-                       pci_write_config_word(pres_dev, PCI_STATUS, stat);
-       }
        /* find the error reporting device and clear errors */
        dev = pvt->dev_d0f1 = pci_dev_get(pvt->bridge_ck);
        /* Turn off error disable & SMI in case the BIOS turned it on */
@@ -959,24 +937,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
        pci_write_config_byte(dev, E752X_DRAM_ERRMASK, 0x00);
        pci_write_config_byte(dev, E752X_DRAM_SMICMD, 0x00);
        /* clear other MCH errors */
-       pci_read_config_dword(dev, E752X_FERR_GLOBAL, &stat32);
-       pci_write_config_dword(dev, E752X_FERR_GLOBAL, stat32);
-       pci_read_config_dword(dev, E752X_NERR_GLOBAL, &stat32);
-       pci_write_config_dword(dev, E752X_NERR_GLOBAL, stat32);
-       pci_read_config_byte(dev, E752X_HI_FERR, &stat8);
-       pci_write_config_byte(dev, E752X_HI_FERR, stat8);
-       pci_read_config_byte(dev, E752X_HI_NERR, &stat8);
-       pci_write_config_byte(dev, E752X_HI_NERR, stat8);
-       pci_read_config_dword(dev, E752X_SYSBUS_FERR, &stat32);
-       pci_write_config_dword(dev, E752X_SYSBUS_FERR, stat32);
-       pci_read_config_byte(dev, E752X_BUF_FERR, &stat8);
-       pci_write_config_byte(dev, E752X_BUF_FERR, stat8);
-       pci_read_config_byte(dev, E752X_BUF_NERR, &stat8);
-       pci_write_config_byte(dev, E752X_BUF_NERR, stat8);
-       pci_read_config_word(dev, E752X_DRAM_FERR, &stat16);
-       pci_write_config_word(dev, E752X_DRAM_FERR, stat16);
-       pci_read_config_word(dev, E752X_DRAM_NERR, &stat16);
-       pci_write_config_word(dev, E752X_DRAM_NERR, stat16);
+       e752x_get_error_info(mci, &discard);
 
        /* get this far and it's successful */
        debugf3("%s(): success\n", __func__);