git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
s390
/
cio
/
device_status.c
diff --git
a/drivers/s390/cio/device_status.c
b/drivers/s390/cio/device_status.c
index
c345e69
..
bdcf930
100644
(file)
--- a/
drivers/s390/cio/device_status.c
+++ b/
drivers/s390/cio/device_status.c
@@
-3,13
+3,12
@@
*
* Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
*
* Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
- * Author(s): Cornelia Huck
(co
huck@de.ibm.com)
+ * Author(s): Cornelia Huck
(cornelia.
huck@de.ibm.com)
* Martin Schwidefsky (schwidefsky@de.ibm.com)
*
* Status accumulation and basic sense functions.
*/
* Martin Schwidefsky (schwidefsky@de.ibm.com)
*
* Status accumulation and basic sense functions.
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/init.h>
@@
-33,21
+32,20
@@
ccw_device_msg_control_check(struct ccw_device *cdev, struct irb *irb)
SCHN_STAT_CHN_CTRL_CHK |
SCHN_STAT_INTF_CTRL_CHK)))
return;
SCHN_STAT_CHN_CTRL_CHK |
SCHN_STAT_INTF_CTRL_CHK)))
return;
-
CIO_MSG_EVENT(0, "Channel-Check or Interface-Control-Check "
CIO_MSG_EVENT(0, "Channel-Check or Interface-Control-Check "
- "received
\n
"
- " ... device %04
X on subchannel %04X
, dev_stat "
+ "received"
+ " ... device %04
x on subchannel 0.%x.%04x
, dev_stat "
": %02X sch_stat : %02X\n",
": %02X sch_stat : %02X\n",
- cdev->private->dev
no, cdev->private->irq
,
- cdev->private->
irb.scsw.dstat
,
-
cdev->private->irb.
scsw.cstat);
+ cdev->private->dev
_id.devno, cdev->private->schid.ssid
,
+ cdev->private->
schid.sch_no
,
+
irb->scsw.dstat, irb->
scsw.cstat);
if (irb->scsw.cc != 3) {
char dbf_text[15];
if (irb->scsw.cc != 3) {
char dbf_text[15];
- sprintf(dbf_text, "chk%x", cdev->private->
irq
);
+ sprintf(dbf_text, "chk%x", cdev->private->
schid.sch_no
);
CIO_TRACE_EVENT(0, dbf_text);
CIO_TRACE_EVENT(0, dbf_text);
- CIO_HEX_EVENT(0,
&cdev->private->
irb, sizeof (struct irb));
+ CIO_HEX_EVENT(0, irb, sizeof (struct irb));
}
}
}
}
@@
-60,15
+58,15
@@
ccw_device_path_notoper(struct ccw_device *cdev)
struct subchannel *sch;
sch = to_subchannel(cdev->dev.parent);
struct subchannel *sch;
sch = to_subchannel(cdev->dev.parent);
- stsch (sch->
irq
, &sch->schib);
+ stsch (sch->
schid
, &sch->schib);
- CIO_MSG_EVENT(0, "%s(%04x) - path(s) %02x are "
- "not operational \n", __FUNCTION__, sch->irq,
+ CIO_MSG_EVENT(0, "%s(0.%x.%04x) - path(s) %02x are "
+ "not operational \n", __FUNCTION__,
+ sch->schid.ssid, sch->schid.sch_no,
sch->schib.pmcw.pnom);
sch->lpm &= ~sch->schib.pmcw.pnom;
sch->schib.pmcw.pnom);
sch->lpm &= ~sch->schib.pmcw.pnom;
- if (cdev->private->options.pgroup)
- cdev->private->flags.doverify = 1;
+ cdev->private->flags.doverify = 1;
}
/*
}
/*
@@
-180,7
+178,7
@@
ccw_device_accumulate_esw(struct ccw_device *cdev, struct irb *irb)
cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth;
/* Copy path verification required flag. */
cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf;
cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth;
/* Copy path verification required flag. */
cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf;
- if (irb->esw.esw0.erw.pvrf
&& cdev->private->options.pgroup
)
+ if (irb->esw.esw0.erw.pvrf)
cdev->private->flags.doverify = 1;
/* Copy concurrent sense bit. */
cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons;
cdev->private->flags.doverify = 1;
/* Copy concurrent sense bit. */
cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons;
@@
-216,8
+214,9
@@
ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
/*
* Don't accumulate unsolicited interrupts.
*/
/*
* Don't accumulate unsolicited interrupts.
*/
- if (irb->scsw.stctl ==
- (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS))
+ if ((irb->scsw.stctl ==
+ (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) &&
+ (!irb->scsw.cc))
return;
cdev_irb = &cdev->private->irb;
return;
cdev_irb = &cdev->private->irb;
@@
-315,12
+314,14
@@
ccw_device_do_sense(struct ccw_device *cdev, struct irb *irb)
/*
* We have ending status but no sense information. Do a basic sense.
*/
/*
* We have ending status but no sense information. Do a basic sense.
*/
- sch = to_subchannel(cdev->dev.parent);
sch->sense_ccw.cmd_code = CCW_CMD_BASIC_SENSE;
sch->sense_ccw.cda = (__u32) __pa(cdev->private->irb.ecw);
sch->sense_ccw.count = SENSE_MAX_COUNT;
sch->sense_ccw.flags = CCW_FLAG_SLI;
sch->sense_ccw.cmd_code = CCW_CMD_BASIC_SENSE;
sch->sense_ccw.cda = (__u32) __pa(cdev->private->irb.ecw);
sch->sense_ccw.count = SENSE_MAX_COUNT;
sch->sense_ccw.flags = CCW_FLAG_SLI;
+ /* Reset internal retry indication. */
+ cdev->private->flags.intretry = 0;
+
return cio_start (sch, &sch->sense_ccw, 0xff);
}
return cio_start (sch, &sch->sense_ccw, 0xff);
}
@@
-347,13
+348,14
@@
ccw_device_accumulate_basic_sense(struct ccw_device *cdev, struct irb *irb)
(irb->scsw.actl & SCSW_ACTL_SUSPENDED)))
ccw_device_path_notoper(cdev);
(irb->scsw.actl & SCSW_ACTL_SUSPENDED)))
ccw_device_path_notoper(cdev);
- if (!(irb->scsw.dstat & DEV_STAT_UNIT_CHECK)) {
+ if (!(irb->scsw.dstat & DEV_STAT_UNIT_CHECK) &&
+ (irb->scsw.dstat & DEV_STAT_CHN_END)) {
cdev->private->irb.esw.esw0.erw.cons = 1;
cdev->private->flags.dosense = 0;
}
/* Check if path verification is required. */
if (ccw_device_accumulate_esw_valid(irb) &&
cdev->private->irb.esw.esw0.erw.cons = 1;
cdev->private->flags.dosense = 0;
}
/* Check if path verification is required. */
if (ccw_device_accumulate_esw_valid(irb) &&
- irb->esw.esw0.erw.pvrf
&& cdev->private->options.pgroup)
+ irb->esw.esw0.erw.pvrf
)
cdev->private->flags.doverify = 1;
}
cdev->private->flags.doverify = 1;
}