[S390] cio: introduce fcx enabled scsw format
Extend the scsw data structure to the format required by fcx. Also provide helper functions for easier access to fields which are present in both the traditional as well as the modified format. Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
committed by
Heiko Carstens
parent
4f2bd92e3b
commit
23d805b647
@@ -703,7 +703,8 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
if (!cdev->dev.driver_data) {
|
||||
printk(KERN_WARNING "claw: unsolicited interrupt for device:"
|
||||
"%s received c-%02x d-%02x\n",
|
||||
cdev->dev.bus_id,irb->scsw.cstat, irb->scsw.dstat);
|
||||
cdev->dev.bus_id, irb->scsw.cmd.cstat,
|
||||
irb->scsw.cmd.dstat);
|
||||
#ifdef FUNCTRACE
|
||||
printk(KERN_INFO "claw: %s() "
|
||||
"exit on line %d\n",__func__,__LINE__);
|
||||
@@ -732,22 +733,23 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
#ifdef IOTRACE
|
||||
printk(KERN_INFO "%s: interrupt for device: %04x "
|
||||
"received c-%02x d-%02x state-%02x\n",
|
||||
dev->name, p_ch->devno, irb->scsw.cstat,
|
||||
irb->scsw.dstat, p_ch->claw_state);
|
||||
dev->name, p_ch->devno, irb->scsw.cmd.cstat,
|
||||
irb->scsw.cmd.dstat, p_ch->claw_state);
|
||||
#endif
|
||||
|
||||
/* Copy interruption response block. */
|
||||
memcpy(p_ch->irb, irb, sizeof(struct irb));
|
||||
|
||||
/* Check for good subchannel return code, otherwise error message */
|
||||
if (irb->scsw.cstat && !(irb->scsw.cstat & SCHN_STAT_PCI)) {
|
||||
if (irb->scsw.cmd.cstat && !(irb->scsw.cmd.cstat & SCHN_STAT_PCI)) {
|
||||
printk(KERN_INFO "%s: subchannel check for device: %04x -"
|
||||
" Sch Stat %02x Dev Stat %02x CPA - %04x\n",
|
||||
dev->name, p_ch->devno,
|
||||
irb->scsw.cstat, irb->scsw.dstat,irb->scsw.cpa);
|
||||
irb->scsw.cmd.cstat, irb->scsw.cmd.dstat,
|
||||
irb->scsw.cmd.cpa);
|
||||
#ifdef IOTRACE
|
||||
dumpit((char *)irb,sizeof(struct irb));
|
||||
dumpit((char *)(unsigned long)irb->scsw.cpa,
|
||||
dumpit((char *)(unsigned long)irb->scsw.cmd.cpa,
|
||||
sizeof(struct ccw1));
|
||||
#endif
|
||||
#ifdef FUNCTRACE
|
||||
@@ -759,22 +761,24 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
}
|
||||
|
||||
/* Check the reason-code of a unit check */
|
||||
if (irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
|
||||
if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)
|
||||
ccw_check_unit_check(p_ch, irb->ecw[0]);
|
||||
}
|
||||
|
||||
/* State machine to bring the connection up, down and to restart */
|
||||
p_ch->last_dstat = irb->scsw.dstat;
|
||||
p_ch->last_dstat = irb->scsw.cmd.dstat;
|
||||
|
||||
switch (p_ch->claw_state) {
|
||||
case CLAW_STOP:/* HALT_IO by claw_release (halt sequence) */
|
||||
#ifdef DEBUGMSG
|
||||
printk(KERN_INFO "%s: CLAW_STOP enter\n", dev->name);
|
||||
#endif
|
||||
if (!((p_ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
|
||||
if (!((p_ch->irb->scsw.cmd.stctl &
|
||||
SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS |
|
||||
SCSW_STCTL_STATUS_PEND)))) {
|
||||
#ifdef FUNCTRACE
|
||||
printk(KERN_INFO "%s:%s Exit on line %d\n",
|
||||
dev->name,__func__,__LINE__);
|
||||
@@ -798,10 +802,13 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
printk(KERN_INFO "%s: process CLAW_STAT_HALT_IO\n",
|
||||
dev->name);
|
||||
#endif
|
||||
if (!((p_ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
|
||||
if (!((p_ch->irb->scsw.cmd.stctl &
|
||||
SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS |
|
||||
SCSW_STCTL_STATUS_PEND)))) {
|
||||
#ifdef FUNCTRACE
|
||||
printk(KERN_INFO "%s:%s Exit on line %d\n",
|
||||
dev->name,__func__,__LINE__);
|
||||
@@ -828,8 +835,8 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
"interrupt for device:"
|
||||
"%s received c-%02x d-%02x\n",
|
||||
cdev->dev.bus_id,
|
||||
irb->scsw.cstat,
|
||||
irb->scsw.dstat);
|
||||
irb->scsw.cmd.cstat,
|
||||
irb->scsw.cmd.dstat);
|
||||
return;
|
||||
}
|
||||
#ifdef DEBUGMSG
|
||||
@@ -844,7 +851,7 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
return;
|
||||
case CLAW_START_READ:
|
||||
CLAW_DBF_TEXT(4,trace,"ReadIRQ");
|
||||
if (p_ch->irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
|
||||
if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
|
||||
clear_bit(0, (void *)&p_ch->IO_active);
|
||||
if ((p_ch->irb->ecw[0] & 0x41) == 0x41 ||
|
||||
(p_ch->irb->ecw[0] & 0x40) == 0x40 ||
|
||||
@@ -863,8 +870,8 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
CLAW_DBF_TEXT(4,trace,"notrdy");
|
||||
return;
|
||||
}
|
||||
if ((p_ch->irb->scsw.cstat & SCHN_STAT_PCI) &&
|
||||
(p_ch->irb->scsw.dstat==0)) {
|
||||
if ((p_ch->irb->scsw.cmd.cstat & SCHN_STAT_PCI) &&
|
||||
(p_ch->irb->scsw.cmd.dstat == 0)) {
|
||||
if (test_and_set_bit(CLAW_BH_ACTIVE,
|
||||
(void *)&p_ch->flag_a) == 0) {
|
||||
tasklet_schedule(&p_ch->tasklet);
|
||||
@@ -879,10 +886,13 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
CLAW_DBF_TEXT(4,trace,"PCI_read");
|
||||
return;
|
||||
}
|
||||
if(!((p_ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
|
||||
if (!((p_ch->irb->scsw.cmd.stctl &
|
||||
SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS |
|
||||
SCSW_STCTL_STATUS_PEND)))) {
|
||||
#ifdef FUNCTRACE
|
||||
printk(KERN_INFO "%s:%s Exit on line %d\n",
|
||||
dev->name,__func__,__LINE__);
|
||||
@@ -911,7 +921,7 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
CLAW_DBF_TEXT(4,trace,"RdIRQXit");
|
||||
return;
|
||||
case CLAW_START_WRITE:
|
||||
if (p_ch->irb->scsw.dstat & DEV_STAT_UNIT_CHECK) {
|
||||
if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
|
||||
printk(KERN_INFO "%s: Unit Check Occured in "
|
||||
"write channel\n",dev->name);
|
||||
clear_bit(0, (void *)&p_ch->IO_active);
|
||||
@@ -934,16 +944,19 @@ claw_irq_handler(struct ccw_device *cdev,
|
||||
CLAW_DBF_TEXT(4,trace,"rstrtwrt");
|
||||
return;
|
||||
}
|
||||
if (p_ch->irb->scsw.dstat & DEV_STAT_UNIT_EXCEP) {
|
||||
if (p_ch->irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) {
|
||||
clear_bit(0, (void *)&p_ch->IO_active);
|
||||
printk(KERN_INFO "%s: Unit Exception "
|
||||
"Occured in write channel\n",
|
||||
dev->name);
|
||||
}
|
||||
if(!((p_ch->irb->scsw.stctl & SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.stctl == SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)))) {
|
||||
if (!((p_ch->irb->scsw.cmd.stctl &
|
||||
SCSW_STCTL_SEC_STATUS) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
SCSW_STCTL_STATUS_PEND) ||
|
||||
(p_ch->irb->scsw.cmd.stctl ==
|
||||
(SCSW_STCTL_ALERT_STATUS |
|
||||
SCSW_STCTL_STATUS_PEND)))) {
|
||||
#ifdef FUNCTRACE
|
||||
printk(KERN_INFO "%s:%s Exit on line %d\n",
|
||||
dev->name,__func__,__LINE__);
|
||||
|
Reference in New Issue
Block a user