[PATCH] 2.5.40 s390 (23/27): channel paths.

From: Martin Schwidefsky (schwidefsky@de.ibm.com)
Date: Fri Oct 04 2002 - 09:34:36 EST


Check if defined chpids are available. Some code simplification.

diff -urN linux-2.5.40/drivers/s390/cio/chsc.c linux-2.5.40-s390/drivers/s390/cio/chsc.c
--- linux-2.5.40/drivers/s390/cio/chsc.c Tue Oct 1 09:05:47 2002
+++ linux-2.5.40-s390/drivers/s390/cio/chsc.c Fri Oct 4 16:16:40 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.40/drivers/s390/cio/chsc.h linux-2.5.40-s390/drivers/s390/cio/chsc.h
--- linux-2.5.40/drivers/s390/cio/chsc.h Tue Oct 1 09:07:35 2002
+++ linux-2.5.40-s390/drivers/s390/cio/chsc.h Fri Oct 4 16:16:40 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.40/drivers/s390/cio/cio.c linux-2.5.40-s390/drivers/s390/cio/cio.c
--- linux-2.5.40/drivers/s390/cio/cio.c Fri Oct 4 16:16:40 2002
+++ linux-2.5.40-s390/drivers/s390/cio/cio.c Fri Oct 4 16:16:40 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.40/drivers/s390/cio/s390io.c linux-2.5.40-s390/drivers/s390/cio/s390io.c
--- linux-2.5.40/drivers/s390/cio/s390io.c Fri Oct 4 16:16:11 2002
+++ linux-2.5.40-s390/drivers/s390/cio/s390io.c Fri Oct 4 16:16:40 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 {

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Oct 07 2002 - 22:00:45 EST