Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / s390 / cio / device_status.c
1 /*
2  *    Copyright IBM Corp. 2002
3  *    Author(s): Cornelia Huck (cornelia.huck@de.ibm.com)
4  *               Martin Schwidefsky (schwidefsky@de.ibm.com)
5  *
6  * Status accumulation and basic sense functions.
7  */
8
9 #include <linux/module.h>
10 #include <linux/init.h>
11
12 #include <asm/ccwdev.h>
13 #include <asm/cio.h>
14
15 #include "cio.h"
16 #include "cio_debug.h"
17 #include "css.h"
18 #include "device.h"
19 #include "ioasm.h"
20 #include "io_sch.h"
21
22 /*
23  * Check for any kind of channel or interface control check but don't
24  * issue the message for the console device
25  */
26 static void
27 ccw_device_msg_control_check(struct ccw_device *cdev, struct irb *irb)
28 {
29         char dbf_text[15];
30
31         if (!scsw_is_valid_cstat(&irb->scsw) ||
32             !(scsw_cstat(&irb->scsw) & (SCHN_STAT_CHN_DATA_CHK |
33               SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK)))
34                 return;
35         CIO_MSG_EVENT(0, "Channel-Check or Interface-Control-Check "
36                       "received"
37                       " ... device %04x on subchannel 0.%x.%04x, dev_stat "
38                       ": %02X sch_stat : %02X\n",
39                       cdev->private->dev_id.devno, cdev->private->schid.ssid,
40                       cdev->private->schid.sch_no,
41                       scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw));
42         sprintf(dbf_text, "chk%x", cdev->private->schid.sch_no);
43         CIO_TRACE_EVENT(0, dbf_text);
44         CIO_HEX_EVENT(0, irb, sizeof(struct irb));
45 }
46
47 /*
48  * Some paths became not operational (pno bit in scsw is set).
49  */
50 static void
51 ccw_device_path_notoper(struct ccw_device *cdev)
52 {
53         struct subchannel *sch;
54
55         sch = to_subchannel(cdev->dev.parent);
56         if (cio_update_schib(sch))
57                 goto doverify;
58
59         CIO_MSG_EVENT(0, "%s(0.%x.%04x) - path(s) %02x are "
60                       "not operational \n", __func__,
61                       sch->schid.ssid, sch->schid.sch_no,
62                       sch->schib.pmcw.pnom);
63
64         sch->lpm &= ~sch->schib.pmcw.pnom;
65 doverify:
66         cdev->private->flags.doverify = 1;
67 }
68
69 /*
70  * Copy valid bits from the extended control word to device irb.
71  */
72 static void
73 ccw_device_accumulate_ecw(struct ccw_device *cdev, struct irb *irb)
74 {
75         /*
76          * Copy extended control bit if it is valid... yes there
77          * are condition that have to be met for the extended control
78          * bit to have meaning. Sick.
79          */
80         cdev->private->irb.scsw.cmd.ectl = 0;
81         if ((irb->scsw.cmd.stctl & SCSW_STCTL_ALERT_STATUS) &&
82             !(irb->scsw.cmd.stctl & SCSW_STCTL_INTER_STATUS))
83                 cdev->private->irb.scsw.cmd.ectl = irb->scsw.cmd.ectl;
84         /* Check if extended control word is valid. */
85         if (!cdev->private->irb.scsw.cmd.ectl)
86                 return;
87         /* Copy concurrent sense / model dependent information. */
88         memcpy (&cdev->private->irb.ecw, irb->ecw, sizeof (irb->ecw));
89 }
90
91 /*
92  * Check if extended status word is valid.
93  */
94 static int
95 ccw_device_accumulate_esw_valid(struct irb *irb)
96 {
97         if (!irb->scsw.cmd.eswf &&
98             (irb->scsw.cmd.stctl == SCSW_STCTL_STATUS_PEND))
99                 return 0;
100         if (irb->scsw.cmd.stctl ==
101                         (SCSW_STCTL_INTER_STATUS|SCSW_STCTL_STATUS_PEND) &&
102             !(irb->scsw.cmd.actl & SCSW_ACTL_SUSPENDED))
103                 return 0;
104         return 1;
105 }
106
107 /*
108  * Copy valid bits from the extended status word to device irb.
109  */
110 static void
111 ccw_device_accumulate_esw(struct ccw_device *cdev, struct irb *irb)
112 {
113         struct irb *cdev_irb;
114         struct sublog *cdev_sublog, *sublog;
115
116         if (!ccw_device_accumulate_esw_valid(irb))
117                 return;
118
119         cdev_irb = &cdev->private->irb;
120
121         /* Copy last path used mask. */
122         cdev_irb->esw.esw1.lpum = irb->esw.esw1.lpum;
123
124         /* Copy subchannel logout information if esw is of format 0. */
125         if (irb->scsw.cmd.eswf) {
126                 cdev_sublog = &cdev_irb->esw.esw0.sublog;
127                 sublog = &irb->esw.esw0.sublog;
128                 /* Copy extended status flags. */
129                 cdev_sublog->esf = sublog->esf;
130                 /*
131                  * Copy fields that have a meaning for channel data check
132                  * channel control check and interface control check.
133                  */
134                 if (irb->scsw.cmd.cstat & (SCHN_STAT_CHN_DATA_CHK |
135                                        SCHN_STAT_CHN_CTRL_CHK |
136                                        SCHN_STAT_INTF_CTRL_CHK)) {
137                         /* Copy ancillary report bit. */
138                         cdev_sublog->arep = sublog->arep;
139                         /* Copy field-validity-flags. */
140                         cdev_sublog->fvf = sublog->fvf;
141                         /* Copy storage access code. */
142                         cdev_sublog->sacc = sublog->sacc;
143                         /* Copy termination code. */
144                         cdev_sublog->termc = sublog->termc;
145                         /* Copy sequence code. */
146                         cdev_sublog->seqc = sublog->seqc;
147                 }
148                 /* Copy device status check. */
149                 cdev_sublog->devsc = sublog->devsc;
150                 /* Copy secondary error. */
151                 cdev_sublog->serr = sublog->serr;
152                 /* Copy i/o-error alert. */
153                 cdev_sublog->ioerr = sublog->ioerr;
154                 /* Copy channel path timeout bit. */
155                 if (irb->scsw.cmd.cstat & SCHN_STAT_INTF_CTRL_CHK)
156                         cdev_irb->esw.esw0.erw.cpt = irb->esw.esw0.erw.cpt;
157                 /* Copy failing storage address validity flag. */
158                 cdev_irb->esw.esw0.erw.fsavf = irb->esw.esw0.erw.fsavf;
159                 if (cdev_irb->esw.esw0.erw.fsavf) {
160                         /* ... and copy the failing storage address. */
161                         memcpy(cdev_irb->esw.esw0.faddr, irb->esw.esw0.faddr,
162                                sizeof (irb->esw.esw0.faddr));
163                         /* ... and copy the failing storage address format. */
164                         cdev_irb->esw.esw0.erw.fsaf = irb->esw.esw0.erw.fsaf;
165                 }
166                 /* Copy secondary ccw address validity bit. */
167                 cdev_irb->esw.esw0.erw.scavf = irb->esw.esw0.erw.scavf;
168                 if (irb->esw.esw0.erw.scavf)
169                         /* ... and copy the secondary ccw address. */
170                         cdev_irb->esw.esw0.saddr = irb->esw.esw0.saddr;
171                 
172         }
173         /* FIXME: DCTI for format 2? */
174
175         /* Copy authorization bit. */
176         cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth;
177         /* Copy path verification required flag. */
178         cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf;
179         if (irb->esw.esw0.erw.pvrf)
180                 cdev->private->flags.doverify = 1;
181         /* Copy concurrent sense bit. */
182         cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons;
183         if (irb->esw.esw0.erw.cons)
184                 cdev_irb->esw.esw0.erw.scnt = irb->esw.esw0.erw.scnt;
185 }
186
187 /*
188  * Accumulate status from irb to devstat.
189  */
190 void
191 ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
192 {
193         struct irb *cdev_irb;
194
195         /*
196          * Check if the status pending bit is set in stctl.
197          * If not, the remaining bit have no meaning and we must ignore them.
198          * The esw is not meaningful as well...
199          */
200         if (!(scsw_stctl(&irb->scsw) & SCSW_STCTL_STATUS_PEND))
201                 return;
202
203         /* Check for channel checks and interface control checks. */
204         ccw_device_msg_control_check(cdev, irb);
205
206         /* Check for path not operational. */
207         if (scsw_is_valid_pno(&irb->scsw) && scsw_pno(&irb->scsw))
208                 ccw_device_path_notoper(cdev);
209         /* No irb accumulation for transport mode irbs. */
210         if (scsw_is_tm(&irb->scsw)) {
211                 memcpy(&cdev->private->irb, irb, sizeof(struct irb));
212                 return;
213         }
214         /*
215          * Don't accumulate unsolicited interrupts.
216          */
217         if (!scsw_is_solicited(&irb->scsw))
218                 return;
219
220         cdev_irb = &cdev->private->irb;
221
222         /*
223          * If the clear function had been performed, all formerly pending
224          * status at the subchannel has been cleared and we must not pass
225          * intermediate accumulated status to the device driver.
226          */
227         if (irb->scsw.cmd.fctl & SCSW_FCTL_CLEAR_FUNC)
228                 memset(&cdev->private->irb, 0, sizeof(struct irb));
229
230         /* Copy bits which are valid only for the start function. */
231         if (irb->scsw.cmd.fctl & SCSW_FCTL_START_FUNC) {
232                 /* Copy key. */
233                 cdev_irb->scsw.cmd.key = irb->scsw.cmd.key;
234                 /* Copy suspend control bit. */
235                 cdev_irb->scsw.cmd.sctl = irb->scsw.cmd.sctl;
236                 /* Accumulate deferred condition code. */
237                 cdev_irb->scsw.cmd.cc |= irb->scsw.cmd.cc;
238                 /* Copy ccw format bit. */
239                 cdev_irb->scsw.cmd.fmt = irb->scsw.cmd.fmt;
240                 /* Copy prefetch bit. */
241                 cdev_irb->scsw.cmd.pfch = irb->scsw.cmd.pfch;
242                 /* Copy initial-status-interruption-control. */
243                 cdev_irb->scsw.cmd.isic = irb->scsw.cmd.isic;
244                 /* Copy address limit checking control. */
245                 cdev_irb->scsw.cmd.alcc = irb->scsw.cmd.alcc;
246                 /* Copy suppress suspend bit. */
247                 cdev_irb->scsw.cmd.ssi = irb->scsw.cmd.ssi;
248         }
249
250         /* Take care of the extended control bit and extended control word. */
251         ccw_device_accumulate_ecw(cdev, irb);
252             
253         /* Accumulate function control. */
254         cdev_irb->scsw.cmd.fctl |= irb->scsw.cmd.fctl;
255         /* Copy activity control. */
256         cdev_irb->scsw.cmd.actl = irb->scsw.cmd.actl;
257         /* Accumulate status control. */
258         cdev_irb->scsw.cmd.stctl |= irb->scsw.cmd.stctl;
259         /*
260          * Copy ccw address if it is valid. This is a bit simplified
261          * but should be close enough for all practical purposes.
262          */
263         if ((irb->scsw.cmd.stctl & SCSW_STCTL_PRIM_STATUS) ||
264             ((irb->scsw.cmd.stctl ==
265               (SCSW_STCTL_INTER_STATUS|SCSW_STCTL_STATUS_PEND)) &&
266              (irb->scsw.cmd.actl & SCSW_ACTL_DEVACT) &&
267              (irb->scsw.cmd.actl & SCSW_ACTL_SCHACT)) ||
268             (irb->scsw.cmd.actl & SCSW_ACTL_SUSPENDED))
269                 cdev_irb->scsw.cmd.cpa = irb->scsw.cmd.cpa;
270         /* Accumulate device status, but not the device busy flag. */
271         cdev_irb->scsw.cmd.dstat &= ~DEV_STAT_BUSY;
272         /* dstat is not always valid. */
273         if (irb->scsw.cmd.stctl &
274             (SCSW_STCTL_PRIM_STATUS | SCSW_STCTL_SEC_STATUS
275              | SCSW_STCTL_INTER_STATUS | SCSW_STCTL_ALERT_STATUS))
276                 cdev_irb->scsw.cmd.dstat |= irb->scsw.cmd.dstat;
277         /* Accumulate subchannel status. */
278         cdev_irb->scsw.cmd.cstat |= irb->scsw.cmd.cstat;
279         /* Copy residual count if it is valid. */
280         if ((irb->scsw.cmd.stctl & SCSW_STCTL_PRIM_STATUS) &&
281             (irb->scsw.cmd.cstat & ~(SCHN_STAT_PCI | SCHN_STAT_INCORR_LEN))
282              == 0)
283                 cdev_irb->scsw.cmd.count = irb->scsw.cmd.count;
284
285         /* Take care of bits in the extended status word. */
286         ccw_device_accumulate_esw(cdev, irb);
287
288         /*
289          * Check whether we must issue a SENSE CCW ourselves if there is no
290          * concurrent sense facility installed for the subchannel.
291          * No sense is required if no delayed sense is pending
292          * and we did not get a unit check without sense information.
293          *
294          * Note: We should check for ioinfo[irq]->flags.consns but VM
295          *       violates the ESA/390 architecture and doesn't present an
296          *       operand exception for virtual devices without concurrent
297          *       sense facility available/supported when enabling the
298          *       concurrent sense facility.
299          */
300         if ((cdev_irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) &&
301             !(cdev_irb->esw.esw0.erw.cons))
302                 cdev->private->flags.dosense = 1;
303 }
304
305 /*
306  * Do a basic sense.
307  */
308 int
309 ccw_device_do_sense(struct ccw_device *cdev, struct irb *irb)
310 {
311         struct subchannel *sch;
312         struct ccw1 *sense_ccw;
313         int rc;
314
315         sch = to_subchannel(cdev->dev.parent);
316
317         /* A sense is required, can we do it now ? */
318         if (scsw_actl(&irb->scsw) & (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT))
319                 /*
320                  * we received an Unit Check but we have no final
321                  *  status yet, therefore we must delay the SENSE
322                  *  processing. We must not report this intermediate
323                  *  status to the device interrupt handler.
324                  */
325                 return -EBUSY;
326
327         /*
328          * We have ending status but no sense information. Do a basic sense.
329          */
330         sense_ccw = &to_io_private(sch)->sense_ccw;
331         sense_ccw->cmd_code = CCW_CMD_BASIC_SENSE;
332         sense_ccw->cda = (__u32) __pa(cdev->private->irb.ecw);
333         sense_ccw->count = SENSE_MAX_COUNT;
334         sense_ccw->flags = CCW_FLAG_SLI;
335
336         rc = cio_start(sch, sense_ccw, 0xff);
337         if (rc == -ENODEV || rc == -EACCES)
338                 dev_fsm_event(cdev, DEV_EVENT_VERIFY);
339         return rc;
340 }
341
342 /*
343  * Add information from basic sense to devstat.
344  */
345 void
346 ccw_device_accumulate_basic_sense(struct ccw_device *cdev, struct irb *irb)
347 {
348         /*
349          * Check if the status pending bit is set in stctl.
350          * If not, the remaining bit have no meaning and we must ignore them.
351          * The esw is not meaningful as well...
352          */
353         if (!(scsw_stctl(&irb->scsw) & SCSW_STCTL_STATUS_PEND))
354                 return;
355
356         /* Check for channel checks and interface control checks. */
357         ccw_device_msg_control_check(cdev, irb);
358
359         /* Check for path not operational. */
360         if (scsw_is_valid_pno(&irb->scsw) && scsw_pno(&irb->scsw))
361                 ccw_device_path_notoper(cdev);
362
363         if (!(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) &&
364             (irb->scsw.cmd.dstat & DEV_STAT_CHN_END)) {
365                 cdev->private->irb.esw.esw0.erw.cons = 1;
366                 cdev->private->flags.dosense = 0;
367         }
368         /* Check if path verification is required. */
369         if (ccw_device_accumulate_esw_valid(irb) &&
370             irb->esw.esw0.erw.pvrf)
371                 cdev->private->flags.doverify = 1;
372 }
373
374 /*
375  * This function accumulates the status into the private devstat and
376  * starts a basic sense if one is needed.
377  */
378 int
379 ccw_device_accumulate_and_sense(struct ccw_device *cdev, struct irb *irb)
380 {
381         ccw_device_accumulate_irb(cdev, irb);
382         if ((irb->scsw.cmd.actl  & (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) != 0)
383                 return -EBUSY;
384         /* Check for basic sense. */
385         if (cdev->private->flags.dosense &&
386             !(irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)) {
387                 cdev->private->irb.esw.esw0.erw.cons = 1;
388                 cdev->private->flags.dosense = 0;
389                 return 0;
390         }
391         if (cdev->private->flags.dosense) {
392                 ccw_device_do_sense(cdev, irb);
393                 return -EBUSY;
394         }
395         return 0;
396 }
397