2002-09-30 13:58:27

by Martin Schwidefsky

[permalink] [raw]
Subject: [PATCH] 2.5.39 s390 (23/26): channel paths.

Check if defined chpids are available. Some code simplification.

diff -urN linux-2.5.39/drivers/s390/cio/chsc.c linux-2.5.39-s390/drivers/s390/cio/chsc.c
--- linux-2.5.39/drivers/s390/cio/chsc.c Fri Sep 27 23:48:35 2002
+++ linux-2.5.39-s390/drivers/s390/cio/chsc.c Mon Sep 30 13:33:41 2002
@@ -1,7 +1,7 @@
/*
* drivers/s390/cio/chsc.c
* S/390 common I/O routines -- channel subsystem call
- * $Revision: 1.9 $
+ * $Revision: 1.12 $
*
* Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
@@ -52,6 +52,49 @@
return test_bit (ioinfo[irq]->schib.pmcw.chpid[chp], &chpids_logical);
}

+static inline void
+chsc_clear_chpid(int irq, int chp)
+{
+ clear_bit(ioinfo[irq]->schib.pmcw.chpid[chp], &chpids);
+}
+
+void
+chsc_validate_chpids(int irq)
+{
+ int mask, chp;
+
+ if (ioinfo[irq]->opm) {
+ for (chp=0;chp<=7;chp++) {
+ mask = 0x80 >> chp;
+ if (ioinfo[irq]->opm & mask) {
+ if (!chsc_chpid_logical(irq,chp))
+ /* disable using this path */
+ ioinfo[irq]->opm &= ~mask;
+ } else {
+ /* This chpid is not
+ * available to us */
+ chsc_clear_chpid(irq,chp);
+ }
+ }
+
+ }
+
+}
+
+void
+switch_off_chpids(int irq, __u8 mask)
+{
+ int i;
+ pmcw_t *pmcw = &ioinfo[irq]->schib.pmcw;
+
+ for (i=0;i<8;i++)
+ if ((0x80>>i) & mask
+ & pmcw->pim
+ & pmcw->pam
+ & pmcw->pom)
+ clear_bit(pmcw->chpid[i], &chpids);
+}
+
/* FIXME: this is _always_ called for every subchannel. shouldn't we
* process more than one at a time?*/
static int
@@ -213,11 +256,9 @@
{
int irq;
int j;
- int mask;
char dbf_txt[15];
int ccode;
int was_oper;
- int chp = 0;
int mask2;

sprintf(dbf_txt, "chpr%x", chpid);
@@ -266,21 +307,7 @@
ioinfo[irq]->schib.pmcw.pam &
ioinfo[irq]->schib.pmcw.pom;

- if (ioinfo[irq]->opm) {
- for (chp=0;chp<=7;chp++) {
- mask2 = 0x80 >> chp;
- if (ioinfo[irq]->opm & mask2) {
- if (!test_bit
- (ioinfo[irq]->
- schib.pmcw.chpid[chp],
- &chpids_logical)) {
- /* disable using this path */
- ioinfo[irq]->opm
- &= ~mask2;
- }
- }
- }
- }
+ chsc_validate_chpids(irq);

if (!ioinfo[irq]->opm) {
/*
@@ -307,20 +334,7 @@
nopfunc(irq, DEVSTAT_DEVICE_GONE);
}

- } else if (ioinfo[irq]->ui.flags.ready) {
- /*
- * Re-do path verification for the chpid in question
- * FIXME: is this neccessary?
- */
- mask = 0x80 >> j;
-
- if (!s390_DevicePathVerification(irq,mask)) {
- CHSC_DEBUG (KERN_DEBUG, CRW, 2,
- "DevicePathVerification "
- "successful for Subchannel %x, "
- "chpid %x\n", irq, chpid);
- }
- }
+ }

s390irq_spin_unlock(irq);
break;
@@ -432,18 +446,7 @@
ioinfo[irq]->schib.pmcw.pam &
ioinfo[irq]->schib.pmcw.pom;

- if (ioinfo[irq]->opm) {
- for (chp=0;chp<=7;chp++) {
- mask = 0x80 >> chp;
- if ((ioinfo[irq]->opm & mask) &&
- !test_bit (ioinfo[irq]->schib.pmcw.chpid[chp],
- &chpids_logical)) {
-
- /* disable using this path */
- ioinfo[irq]->opm &= ~mask;
- }
- }
- }
+ chsc_validate_chpids(irq);

if ((ioinfo[irq]->ui.flags.ready) && (chpid & ioinfo[irq]->opm))
s390_DevicePathVerification(irq, chpid);
@@ -456,8 +459,7 @@
char dbf_txt[15];
int irq = 0;
int ccode;
- int chp;
- int mask, mask2;
+ int mask2;
int ret;
int j;

@@ -517,18 +519,7 @@
ioinfo[irq]->schib.pmcw.pam &
ioinfo[irq]->schib.pmcw.pom;

- if (ioinfo[irq]->opm) {
- for (chp=0;chp<=7;chp++) {
- mask = 0x80 >> chp;
- if ((ioinfo[irq]->opm & mask)
- && (!test_bit (ioinfo[irq]->
- schib.pmcw.chpid[chp],
- &chpids_logical))) {
- /* disable using this path */
- ioinfo[irq]->opm &= ~mask;
- }
- }
- }
+ chsc_validate_chpids(irq);

if (ioinfo[irq]->ui.flags.ready)
s390_DevicePathVerification(irq, chpid);
@@ -782,11 +773,20 @@
}

while (chp < NR_CHPIDS && len + entry_size < count) {
- if ((test_bit( chp, &chpids)) && test_bit(chp, &chpids_logical))
- len += sprintf(page+len, "0x%02X online\n", chp);
- else if (test_bit(chp, &chpids_known))
- len += sprintf(page+len, "0x%02X logically offline\n",
- chp);
+ if (test_bit(chp, &chpids_known)) {
+
+ if (!test_bit(chp, &chpids))
+ len += sprintf(page+len,
+ "0x%02X n/a\n", chp);
+
+ else if (test_bit(chp, &chpids_logical))
+ len += sprintf(page+len,
+ "0x%02X online\n", chp);
+ else
+ len += sprintf(page+len,
+ "0x%02X logically offline\n",
+ chp);
+ }
chp++;
}

diff -urN linux-2.5.39/drivers/s390/cio/chsc.h linux-2.5.39-s390/drivers/s390/cio/chsc.h
--- linux-2.5.39/drivers/s390/cio/chsc.h Fri Sep 27 23:50:28 2002
+++ linux-2.5.39-s390/drivers/s390/cio/chsc.h Mon Sep 30 13:33:41 2002
@@ -3,4 +3,6 @@

extern void s390_process_css( void );
extern int chsc_chpid_logical (int irq, int chp);
+extern void chsc_validate_chpids(int irq);
+extern void switch_off_chpids(int irq, __u8 mask);
#endif
diff -urN linux-2.5.39/drivers/s390/cio/cio.c linux-2.5.39-s390/drivers/s390/cio/cio.c
--- linux-2.5.39/drivers/s390/cio/cio.c Mon Sep 30 13:33:41 2002
+++ linux-2.5.39-s390/drivers/s390/cio/cio.c Mon Sep 30 13:33:41 2002
@@ -1,7 +1,7 @@
/*
* drivers/s390/cio/cio.c
* S/390 common I/O routines -- low level i/o calls
- * $Revision: 1.25 $
+ * $Revision: 1.26 $
*
* Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
* IBM Corporation
@@ -342,6 +342,7 @@

if (valid_lpm) {
ioinfo[irq]->opm &= ~lpm;
+ switch_off_chpids(irq, lpm);
} else {
ioinfo[irq]->opm = 0;

@@ -1386,7 +1387,7 @@

ioinfo[irq]->devstat.intparm = 0;

- if (!ioinfo[irq]->ui.flags.s_pend)
+ if (!(ioinfo[irq]->ui.flags.s_pend || ioinfo[irq]->ui.flags.repnone))
ioinfo[irq]->irq_desc.handler (irq, udp, NULL);

return 1;
diff -urN linux-2.5.39/drivers/s390/cio/s390io.c linux-2.5.39-s390/drivers/s390/cio/s390io.c
--- linux-2.5.39/drivers/s390/cio/s390io.c Mon Sep 30 13:33:09 2002
+++ linux-2.5.39-s390/drivers/s390/cio/s390io.c Mon Sep 30 13:33:41 2002
@@ -991,9 +991,6 @@
int ccode2; /* condition code for other I/O routines */
schib_t *p_schib;
int ret;
- int chp = 0;
- int mask;
-
char dbf_txt[15];

sprintf (dbf_txt, "valsch%x", irq);
@@ -1115,17 +1112,7 @@
ioinfo[irq]->opm = ioinfo[irq]->schib.pmcw.pim
& ioinfo[irq]->schib.pmcw.pam & ioinfo[irq]->schib.pmcw.pom;

- if (ioinfo[irq]->opm) {
- for (chp=0;chp<=7;chp++) {
- mask = 0x80 >> chp;
- if (ioinfo[irq]->opm & mask) {
- if (!chsc_chpid_logical (irq, chp)) {
- /* disable using this path */
- ioinfo[irq]->opm &= ~mask;
- }
- }
- }
- }
+ chsc_validate_chpids(irq);

CIO_DEBUG_IFMSG(KERN_INFO, 0,
"Detected device %04X "
@@ -1690,8 +1677,6 @@
int ccode;
__u8 pathmask;
__u8 domask;
- int chp;
- int mask;
int old_opm = 0;

int ret = 0;
@@ -1772,18 +1757,8 @@
ioinfo[irq]->opm = ioinfo[irq]->schib.pmcw.pim
& ioinfo[irq]->schib.pmcw.pam & ioinfo[irq]->schib.pmcw.pom;

- if (ioinfo[irq]->opm) {
- for (chp=0;chp<=7;chp++) {
- mask = 0x80 >> chp;
- if (ioinfo[irq]->opm & mask) {
- if (!chsc_chpid_logical (irq, chp)) {
- /* disable using this path */
- ioinfo[irq]->opm &= ~mask;
- }
- }
- }
- }
-
+ chsc_validate_chpids(irq);
+
if ((ioinfo[irq]->opm == 0) && (old_opm)) {
not_oper_handler_func_t nopfunc=ioinfo[irq]->nopfunc;
int was_oper = ioinfo[irq]->ui.flags.ready;
@@ -1815,7 +1790,7 @@
}

if ( ioinfo[irq]->ui.flags.pgid_supp == 0 )
- return( 0); /* just exit ... */
+ return 0; /* just exit ... */

if (usermask) {
dev_path = usermask;
@@ -2229,8 +2204,8 @@
* Sense Path Group ID command
* further retries wouldn't help ...
*/
- if (pdevstat->ii.sense.
- data[0] & SNS0_CMD_REJECT) {
+ if (pdevstat->ii.sense.data[0] &
+ (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ)) {
retry = 0;
irq_ret = -EOPNOTSUPP;
} else {