|
@@ -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) {
|