s390/pci: improve state check when processing hotplug events
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 16 Apr 2014 14:09:23 +0000 (16:09 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 20 May 2014 06:58:48 +0000 (08:58 +0200)
Processing pci hotplug events can fail when a pci function is in an
unexpected state. This can happen when we already processed the
change associated with the hotplug event (especially when receiving
hotplug events during early boot).
Just ignore the event in this case.

Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/pci/pci_event.c

index 01e251b1da0cb82c6ecc263fcd5474c19c34d28d..6d7f5a3016ca170b134dd9c5e3e40be8d9f4b2bc 100644 (file)
@@ -76,7 +76,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
 
        switch (ccdf->pec) {
        case 0x0301: /* Standby -> Configured */
-               if (!zdev || zdev->state == ZPCI_FN_STATE_CONFIGURED)
+               if (!zdev || zdev->state != ZPCI_FN_STATE_STANDBY)
                        break;
                zdev->state = ZPCI_FN_STATE_CONFIGURED;
                zdev->fh = ccdf->fh;
@@ -86,7 +86,8 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                pci_rescan_bus(zdev->bus);
                break;
        case 0x0302: /* Reserved -> Standby */
-               clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
+               if (!zdev)
+                       clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
                break;
        case 0x0303: /* Deconfiguration requested */
                if (pdev)