1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: cio: number of internal I/O retries
3 References: bnc#533267,LTC#55492
5 Symptom: A device is untruly considered nonfunctional.
6 Problem: If a device has n paths and the device is not path-
7 grouped and an internal I/O command fails, then the
8 control unit presents the error sense n times on each
9 different path. cio does only 5 retries, i.e. devices
10 with 5 or more paths run out of retries before their
11 functional status can actually be determined.
12 Solution: Increase the number of retries to 10.
14 Acked-by: John Jolly <jjolly@suse.de>
16 Index: linux-sles11/drivers/s390/cio/device_id.c
17 ===================================================================
18 --- linux-sles11.orig/drivers/s390/cio/device_id.c 2009-08-17 14:49:43.000000000 +0200
19 +++ linux-sles11/drivers/s390/cio/device_id.c 2009-08-17 14:52:00.000000000 +0200
23 cdev->private->imask >>= 1;
24 - cdev->private->iretry = 5;
25 + cdev->private->iretry = 10;
31 memset (&cdev->private->senseid, 0, sizeof (struct senseid));
32 cdev->private->imask = 0x80;
33 - cdev->private->iretry = 5;
34 + cdev->private->iretry = 10;
35 ret = __ccw_device_sense_id_start(cdev);
36 if (ret && ret != -EBUSY)
37 ccw_device_sense_id_done(cdev, ret);
39 case -EACCES: /* channel is not operational. */
40 sch->lpm &= ~cdev->private->imask;
41 cdev->private->imask >>= 1;
42 - cdev->private->iretry = 5;
43 + cdev->private->iretry = 10;
45 case -EAGAIN: /* try again. */
46 ret = __ccw_device_sense_id_start(cdev);
47 Index: linux-sles11/drivers/s390/cio/device_pgid.c
48 ===================================================================
49 --- linux-sles11.orig/drivers/s390/cio/device_pgid.c 2009-08-17 14:49:43.000000000 +0200
50 +++ linux-sles11/drivers/s390/cio/device_pgid.c 2009-08-17 14:52:00.000000000 +0200
54 cdev->private->imask >>= 1;
55 - cdev->private->iretry = 5;
56 + cdev->private->iretry = 10;
62 cdev->private->state = DEV_STATE_SENSE_PGID;
63 cdev->private->imask = 0x80;
64 - cdev->private->iretry = 5;
65 + cdev->private->iretry = 10;
66 memset (&cdev->private->pgid, 0, sizeof (cdev->private->pgid));
67 ret = __ccw_device_sense_pgid_start(cdev);
68 if (ret && ret != -EBUSY)
71 case 0: /* Sense Path Group ID successful. */
72 cdev->private->imask >>= 1;
73 - cdev->private->iretry = 5;
74 + cdev->private->iretry = 10;
76 case -EAGAIN: /* Try again. */
77 ret = __ccw_device_sense_pgid_start(cdev);
79 sch = to_subchannel(cdev->dev.parent);
80 /* Repeat for all paths. */
81 for (; cdev->private->imask; cdev->private->imask >>= 1,
82 - cdev->private->iretry = 5) {
83 + cdev->private->iretry = 10) {
84 if ((cdev->private->imask & sch->schib.pmcw.pam) == 0)
85 /* Path not available, try next. */
88 sch->vpm |= sch->opm & cdev->private->imask;
89 /* Go on with next path. */
90 cdev->private->imask >>= 1;
91 - cdev->private->iretry = 5;
92 + cdev->private->iretry = 10;
93 __ccw_device_verify_start(cdev);
99 cdev->private->imask = 0x80;
100 - cdev->private->iretry = 5;
101 + cdev->private->iretry = 10;
103 case -EAGAIN: /* Try again. */
104 __ccw_device_verify_start(cdev);
107 case -EACCES: /* channel is not operational. */
108 cdev->private->imask >>= 1;
109 - cdev->private->iretry = 5;
110 + cdev->private->iretry = 10;
111 __ccw_device_verify_start(cdev);
116 cdev->private->flags.pgid_single = 0;
117 cdev->private->imask = 0x80;
118 - cdev->private->iretry = 5;
119 + cdev->private->iretry = 10;
121 /* Start with empty vpm. */
127 - cdev->private->iretry = 5;
128 + cdev->private->iretry = 10;
129 cdev->private->imask >>= 1;
131 ccw_device_disband_done(cdev, (sch->lpm != 0) ? 0 : -ENODEV);
134 case -EACCES: /* channel is not operational. */
135 cdev->private->imask >>= 1;
136 - cdev->private->iretry = 5;
137 + cdev->private->iretry = 10;
138 __ccw_device_disband_start(cdev);
142 ccw_device_set_timeout(cdev, 60*HZ);
144 cdev->private->flags.pgid_single = 0;
145 - cdev->private->iretry = 5;
146 + cdev->private->iretry = 10;
147 cdev->private->imask = 0x80;
148 __ccw_device_disband_start(cdev);