]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/s390/cio/device_pgid.c
Merge branch 'master' into csb1725
[mv-sheeva.git] / drivers / s390 / cio / device_pgid.c
index 82a5ad0d63f67e368736ab273e10714428d1d523..07a4fd29f0968f5e7bb485761a1b340525a9eeac 100644 (file)
@@ -213,6 +213,17 @@ static void spid_start(struct ccw_device *cdev)
        spid_do(cdev);
 }
 
+static int pgid_is_reset(struct pgid *p)
+{
+       char *c;
+
+       for (c = (char *)p + 1; c < (char *)(p + 1); c++) {
+               if (*c != 0)
+                       return 0;
+       }
+       return 1;
+}
+
 static int pgid_cmp(struct pgid *p1, struct pgid *p2)
 {
        return memcmp((char *) p1 + 1, (char *) p2 + 1,
@@ -223,7 +234,7 @@ static int pgid_cmp(struct pgid *p1, struct pgid *p2)
  * Determine pathgroup state from PGID data.
  */
 static void pgid_analyze(struct ccw_device *cdev, struct pgid **p,
-                        int *mismatch, int *reserved, int *reset)
+                        int *mismatch, int *reserved, u8 *reset)
 {
        struct pgid *pgid = &cdev->private->pgid[0];
        struct pgid *first = NULL;
@@ -238,9 +249,8 @@ static void pgid_analyze(struct ccw_device *cdev, struct pgid **p,
                        continue;
                if (pgid->inf.ps.state2 == SNID_STATE2_RESVD_ELSE)
                        *reserved = 1;
-               if (pgid->inf.ps.state1 == SNID_STATE1_RESET) {
-                       /* A PGID was reset. */
-                       *reset = 1;
+               if (pgid_is_reset(pgid)) {
+                       *reset |= lpm;
                        continue;
                }
                if (!first) {
@@ -307,7 +317,7 @@ static void snid_done(struct ccw_device *cdev, int rc)
        struct pgid *pgid;
        int mismatch = 0;
        int reserved = 0;
-       int reset = 0;
+       u8 reset = 0;
        u8 donepm;
 
        if (rc)
@@ -321,11 +331,12 @@ static void snid_done(struct ccw_device *cdev, int rc)
                donepm = pgid_to_donepm(cdev);
                sch->vpm = donepm & sch->opm;
                cdev->private->pgid_todo_mask &= ~donepm;
+               cdev->private->pgid_reset_mask |= reset;
                pgid_fill(cdev, pgid);
        }
 out:
        CIO_MSG_EVENT(2, "snid: device 0.%x.%04x: rc=%d pvm=%02x vpm=%02x "
-                     "todo=%02x mism=%d rsvd=%d reset=%d\n", id->ssid,
+                     "todo=%02x mism=%d rsvd=%d reset=%02x\n", id->ssid,
                      id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm,
                      cdev->private->pgid_todo_mask, mismatch, reserved, reset);
        switch (rc) {