1/*
2 * Author(s)......: Horst  Hummel    <Horst.Hummel@de.ibm.com>
3 *		    Holger Smolinski <Holger.Smolinski@de.ibm.com>
4 * Bugreports.to..: <Linux390@de.ibm.com>
5 * Copyright IBM Corp. 2000, 2001
6 *
7 */
8
9#define KMSG_COMPONENT "dasd-eckd"
10
11#include <linux/timer.h>
12#include <asm/idals.h>
13
14#define PRINTK_HEADER "dasd_erp(3990): "
15
16#include "dasd_int.h"
17#include "dasd_eckd.h"
18
19
20struct DCTL_data {
21	unsigned char subcommand;  /* e.g Inhibit Write, Enable Write,... */
22	unsigned char modifier;	   /* Subcommand modifier */
23	unsigned short res;	   /* reserved */
24} __attribute__ ((packed));
25
26/*
27 *****************************************************************************
28 * SECTION ERP HANDLING
29 *****************************************************************************
30 */
31/*
32 *****************************************************************************
33 * 24 and 32 byte sense ERP functions
34 *****************************************************************************
35 */
36
37/*
38 * DASD_3990_ERP_CLEANUP
39 *
40 * DESCRIPTION
41 *   Removes the already build but not necessary ERP request and sets
42 *   the status of the original cqr / erp to the given (final) status
43 *
44 *  PARAMETER
45 *   erp		request to be blocked
46 *   final_status	either DASD_CQR_DONE or DASD_CQR_FAILED
47 *
48 * RETURN VALUES
49 *   cqr		original cqr
50 */
51static struct dasd_ccw_req *
52dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status)
53{
54	struct dasd_ccw_req *cqr = erp->refers;
55
56	dasd_free_erp_request(erp, erp->memdev);
57	cqr->status = final_status;
58	return cqr;
59
60}				/* end dasd_3990_erp_cleanup */
61
62/*
63 * DASD_3990_ERP_BLOCK_QUEUE
64 *
65 * DESCRIPTION
66 *   Block the given device request queue to prevent from further
67 *   processing until the started timer has expired or an related
68 *   interrupt was received.
69 */
70static void dasd_3990_erp_block_queue(struct dasd_ccw_req *erp, int expires)
71{
72
73	struct dasd_device *device = erp->startdev;
74	unsigned long flags;
75
76	DBF_DEV_EVENT(DBF_INFO, device,
77		    "blocking request queue for %is", expires/HZ);
78
79	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
80	dasd_device_set_stop_bits(device, DASD_STOPPED_PENDING);
81	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
82	erp->status = DASD_CQR_FILLED;
83	if (erp->block)
84		dasd_block_set_timer(erp->block, expires);
85	else
86		dasd_device_set_timer(device, expires);
87}
88
89/*
90 * DASD_3990_ERP_INT_REQ
91 *
92 * DESCRIPTION
93 *   Handles 'Intervention Required' error.
94 *   This means either device offline or not installed.
95 *
96 * PARAMETER
97 *   erp		current erp
98 * RETURN VALUES
99 *   erp		modified erp
100 */
101static struct dasd_ccw_req *
102dasd_3990_erp_int_req(struct dasd_ccw_req * erp)
103{
104
105	struct dasd_device *device = erp->startdev;
106
107	/* first time set initial retry counter and erp_function */
108	/* and retry once without blocking queue		 */
109	/* (this enables easier enqueing of the cqr)		 */
110	if (erp->function != dasd_3990_erp_int_req) {
111
112		erp->retries = 256;
113		erp->function = dasd_3990_erp_int_req;
114
115	} else {
116
117		/* issue a message and wait for 'device ready' interrupt */
118		dev_err(&device->cdev->dev,
119			    "is offline or not installed - "
120			    "INTERVENTION REQUIRED!!\n");
121
122		dasd_3990_erp_block_queue(erp, 60*HZ);
123	}
124
125	return erp;
126
127}				/* end dasd_3990_erp_int_req */
128
129/*
130 * DASD_3990_ERP_ALTERNATE_PATH
131 *
132 * DESCRIPTION
133 *   Repeat the operation on a different channel path.
134 *   If all alternate paths have been tried, the request is posted with a
135 *   permanent error.
136 *
137 *  PARAMETER
138 *   erp		pointer to the current ERP
139 *
140 * RETURN VALUES
141 *   erp		modified pointer to the ERP
142 */
143static void
144dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp)
145{
146	struct dasd_device *device = erp->startdev;
147	__u8 opm;
148	unsigned long flags;
149
150	/* try alternate valid path */
151	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
152	opm = ccw_device_get_path_mask(device->cdev);
153	spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
154	if (erp->lpm == 0)
155		erp->lpm = device->path_data.opm &
156			~(erp->irb.esw.esw0.sublog.lpum);
157	else
158		erp->lpm &= ~(erp->irb.esw.esw0.sublog.lpum);
159
160	if ((erp->lpm & opm) != 0x00) {
161
162		DBF_DEV_EVENT(DBF_WARNING, device,
163			    "try alternate lpm=%x (lpum=%x / opm=%x)",
164			    erp->lpm, erp->irb.esw.esw0.sublog.lpum, opm);
165
166		/* reset status to submit the request again... */
167		erp->status = DASD_CQR_FILLED;
168		erp->retries = 10;
169	} else {
170		dev_err(&device->cdev->dev,
171			"The DASD cannot be reached on any path (lpum=%x"
172			"/opm=%x)\n", erp->irb.esw.esw0.sublog.lpum, opm);
173
174		/* post request with permanent error */
175		erp->status = DASD_CQR_FAILED;
176	}
177}				/* end dasd_3990_erp_alternate_path */
178
179/*
180 * DASD_3990_ERP_DCTL
181 *
182 * DESCRIPTION
183 *   Setup cqr to do the Diagnostic Control (DCTL) command with an
184 *   Inhibit Write subcommand (0x20) and the given modifier.
185 *
186 *  PARAMETER
187 *   erp		pointer to the current (failed) ERP
188 *   modifier		subcommand modifier
189 *
190 * RETURN VALUES
191 *   dctl_cqr		pointer to NEW dctl_cqr
192 *
193 */
194static struct dasd_ccw_req *
195dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier)
196{
197
198	struct dasd_device *device = erp->startdev;
199	struct DCTL_data *DCTL_data;
200	struct ccw1 *ccw;
201	struct dasd_ccw_req *dctl_cqr;
202
203	dctl_cqr = dasd_alloc_erp_request((char *) &erp->magic, 1,
204					  sizeof(struct DCTL_data),
205					  device);
206	if (IS_ERR(dctl_cqr)) {
207		dev_err(&device->cdev->dev,
208			    "Unable to allocate DCTL-CQR\n");
209		erp->status = DASD_CQR_FAILED;
210		return erp;
211	}
212
213	DCTL_data = dctl_cqr->data;
214
215	DCTL_data->subcommand = 0x02;	/* Inhibit Write */
216	DCTL_data->modifier = modifier;
217
218	ccw = dctl_cqr->cpaddr;
219	memset(ccw, 0, sizeof(struct ccw1));
220	ccw->cmd_code = CCW_CMD_DCTL;
221	ccw->count = 4;
222	ccw->cda = (__u32)(addr_t) DCTL_data;
223	dctl_cqr->flags = erp->flags;
224	dctl_cqr->function = dasd_3990_erp_DCTL;
225	dctl_cqr->refers = erp;
226	dctl_cqr->startdev = device;
227	dctl_cqr->memdev = device;
228	dctl_cqr->magic = erp->magic;
229	dctl_cqr->expires = 5 * 60 * HZ;
230	dctl_cqr->retries = 2;
231
232	dctl_cqr->buildclk = get_tod_clock();
233
234	dctl_cqr->status = DASD_CQR_FILLED;
235
236	return dctl_cqr;
237
238}				/* end dasd_3990_erp_DCTL */
239
240/*
241 * DASD_3990_ERP_ACTION_1
242 *
243 * DESCRIPTION
244 *   Setup ERP to do the ERP action 1 (see Reference manual).
245 *   Repeat the operation on a different channel path.
246 *   As deviation from the recommended recovery action, we reset the path mask
247 *   after we have tried each path and go through all paths a second time.
248 *   This will cover situations where only one path at a time is actually down,
249 *   but all paths fail and recover just with the same sequence and timing as
250 *   we try to use them (flapping links).
251 *   If all alternate paths have been tried twice, the request is posted with
252 *   a permanent error.
253 *
254 *  PARAMETER
255 *   erp		pointer to the current ERP
256 *
257 * RETURN VALUES
258 *   erp		pointer to the ERP
259 *
260 */
261static struct dasd_ccw_req *dasd_3990_erp_action_1_sec(struct dasd_ccw_req *erp)
262{
263	erp->function = dasd_3990_erp_action_1_sec;
264	dasd_3990_erp_alternate_path(erp);
265	return erp;
266}
267
268static struct dasd_ccw_req *dasd_3990_erp_action_1(struct dasd_ccw_req *erp)
269{
270	erp->function = dasd_3990_erp_action_1;
271	dasd_3990_erp_alternate_path(erp);
272	if (erp->status == DASD_CQR_FAILED &&
273	    !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
274		erp->status = DASD_CQR_FILLED;
275		erp->retries = 10;
276		erp->lpm = erp->startdev->path_data.opm;
277		erp->function = dasd_3990_erp_action_1_sec;
278	}
279	return erp;
280}				/* end dasd_3990_erp_action_1(b) */
281
282/*
283 * DASD_3990_ERP_ACTION_4
284 *
285 * DESCRIPTION
286 *   Setup ERP to do the ERP action 4 (see Reference manual).
287 *   Set the current request to PENDING to block the CQR queue for that device
288 *   until the state change interrupt appears.
289 *   Use a timer (20 seconds) to retry the cqr if the interrupt is still
290 *   missing.
291 *
292 *  PARAMETER
293 *   sense		sense data of the actual error
294 *   erp		pointer to the current ERP
295 *
296 * RETURN VALUES
297 *   erp		pointer to the ERP
298 *
299 */
300static struct dasd_ccw_req *
301dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense)
302{
303
304	struct dasd_device *device = erp->startdev;
305
306	/* first time set initial retry counter and erp_function    */
307	/* and retry once without waiting for state change pending  */
308	/* interrupt (this enables easier enqueing of the cqr)	    */
309	if (erp->function != dasd_3990_erp_action_4) {
310
311		DBF_DEV_EVENT(DBF_INFO, device, "%s",
312			    "dasd_3990_erp_action_4: first time retry");
313
314		erp->retries = 256;
315		erp->function = dasd_3990_erp_action_4;
316
317	} else {
318		if (sense && (sense[25] == 0x1D)) { /* state change pending */
319
320			DBF_DEV_EVENT(DBF_INFO, device,
321				    "waiting for state change pending "
322				    "interrupt, %d retries left",
323				    erp->retries);
324
325			dasd_3990_erp_block_queue(erp, 30*HZ);
326
327		} else if (sense && (sense[25] == 0x1E)) {	/* busy */
328			DBF_DEV_EVENT(DBF_INFO, device,
329				    "busy - redriving request later, "
330				    "%d retries left",
331				    erp->retries);
332                        dasd_3990_erp_block_queue(erp, HZ);
333		} else {
334			/* no state change pending - retry */
335			DBF_DEV_EVENT(DBF_INFO, device,
336				     "redriving request immediately, "
337				     "%d retries left",
338				     erp->retries);
339			erp->status = DASD_CQR_FILLED;
340		}
341	}
342
343	return erp;
344
345}				/* end dasd_3990_erp_action_4 */
346
347/*
348 *****************************************************************************
349 * 24 byte sense ERP functions (only)
350 *****************************************************************************
351 */
352
353/*
354 * DASD_3990_ERP_ACTION_5
355 *
356 * DESCRIPTION
357 *   Setup ERP to do the ERP action 5 (see Reference manual).
358 *   NOTE: Further handling is done in xxx_further_erp after the retries.
359 *
360 *  PARAMETER
361 *   erp		pointer to the current ERP
362 *
363 * RETURN VALUES
364 *   erp		pointer to the ERP
365 *
366 */
367static struct dasd_ccw_req *
368dasd_3990_erp_action_5(struct dasd_ccw_req * erp)
369{
370
371	/* first of all retry */
372	erp->retries = 10;
373	erp->function = dasd_3990_erp_action_5;
374
375	return erp;
376
377}				/* end dasd_3990_erp_action_5 */
378
379/*
380 * DASD_3990_HANDLE_ENV_DATA
381 *
382 * DESCRIPTION
383 *   Handles 24 byte 'Environmental data present'.
384 *   Does a analysis of the sense data (message Format)
385 *   and prints the error messages.
386 *
387 * PARAMETER
388 *   sense		current sense data
389 *
390 * RETURN VALUES
391 *   void
392 */
393static void
394dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense)
395{
396
397	struct dasd_device *device = erp->startdev;
398	char msg_format = (sense[7] & 0xF0);
399	char msg_no = (sense[7] & 0x0F);
400	char errorstring[ERRORLENGTH];
401
402	switch (msg_format) {
403	case 0x00:		/* Format 0 - Program or System Checks */
404
405		if (sense[1] & 0x10) {	/* check message to operator bit */
406
407			switch (msg_no) {
408			case 0x00:	/* No Message */
409				break;
410			case 0x01:
411				dev_warn(&device->cdev->dev,
412					    "FORMAT 0 - Invalid Command\n");
413				break;
414			case 0x02:
415				dev_warn(&device->cdev->dev,
416					    "FORMAT 0 - Invalid Command "
417					    "Sequence\n");
418				break;
419			case 0x03:
420				dev_warn(&device->cdev->dev,
421					    "FORMAT 0 - CCW Count less than "
422					    "required\n");
423				break;
424			case 0x04:
425				dev_warn(&device->cdev->dev,
426					    "FORMAT 0 - Invalid Parameter\n");
427				break;
428			case 0x05:
429				dev_warn(&device->cdev->dev,
430					    "FORMAT 0 - Diagnostic of Special"
431					    " Command Violates File Mask\n");
432				break;
433			case 0x07:
434				dev_warn(&device->cdev->dev,
435					    "FORMAT 0 - Channel Returned with "
436					    "Incorrect retry CCW\n");
437				break;
438			case 0x08:
439				dev_warn(&device->cdev->dev,
440					    "FORMAT 0 - Reset Notification\n");
441				break;
442			case 0x09:
443				dev_warn(&device->cdev->dev,
444					 "FORMAT 0 - Storage Path Restart\n");
445				break;
446			case 0x0A:
447				dev_warn(&device->cdev->dev,
448					    "FORMAT 0 - Channel requested "
449					    "... %02x\n", sense[8]);
450				break;
451			case 0x0B:
452				dev_warn(&device->cdev->dev,
453					    "FORMAT 0 - Invalid Defective/"
454					    "Alternate Track Pointer\n");
455				break;
456			case 0x0C:
457				dev_warn(&device->cdev->dev,
458					    "FORMAT 0 - DPS Installation "
459					    "Check\n");
460				break;
461			case 0x0E:
462				dev_warn(&device->cdev->dev,
463					    "FORMAT 0 - Command Invalid on "
464					    "Secondary Address\n");
465				break;
466			case 0x0F:
467				dev_warn(&device->cdev->dev,
468					    "FORMAT 0 - Status Not As "
469					    "Required: reason %02x\n",
470					 sense[8]);
471				break;
472			default:
473				dev_warn(&device->cdev->dev,
474					    "FORMAT 0 - Reserved\n");
475			}
476		} else {
477			switch (msg_no) {
478			case 0x00:	/* No Message */
479				break;
480			case 0x01:
481				dev_warn(&device->cdev->dev,
482					 "FORMAT 0 - Device Error "
483					 "Source\n");
484				break;
485			case 0x02:
486				dev_warn(&device->cdev->dev,
487					    "FORMAT 0 - Reserved\n");
488				break;
489			case 0x03:
490				dev_warn(&device->cdev->dev,
491					    "FORMAT 0 - Device Fenced - "
492					    "device = %02x\n", sense[4]);
493				break;
494			case 0x04:
495				dev_warn(&device->cdev->dev,
496					    "FORMAT 0 - Data Pinned for "
497					    "Device\n");
498				break;
499			default:
500				dev_warn(&device->cdev->dev,
501					    "FORMAT 0 - Reserved\n");
502			}
503		}
504		break;
505
506	case 0x10:		/* Format 1 - Device Equipment Checks */
507		switch (msg_no) {
508		case 0x00:	/* No Message */
509			break;
510		case 0x01:
511			dev_warn(&device->cdev->dev,
512				    "FORMAT 1 - Device Status 1 not as "
513				    "expected\n");
514			break;
515		case 0x03:
516			dev_warn(&device->cdev->dev,
517				    "FORMAT 1 - Index missing\n");
518			break;
519		case 0x04:
520			dev_warn(&device->cdev->dev,
521				 "FORMAT 1 - Interruption cannot be "
522				 "reset\n");
523			break;
524		case 0x05:
525			dev_warn(&device->cdev->dev,
526				    "FORMAT 1 - Device did not respond to "
527				    "selection\n");
528			break;
529		case 0x06:
530			dev_warn(&device->cdev->dev,
531				    "FORMAT 1 - Device check-2 error or Set "
532				    "Sector is not complete\n");
533			break;
534		case 0x07:
535			dev_warn(&device->cdev->dev,
536				    "FORMAT 1 - Head address does not "
537				    "compare\n");
538			break;
539		case 0x08:
540			dev_warn(&device->cdev->dev,
541				    "FORMAT 1 - Device status 1 not valid\n");
542			break;
543		case 0x09:
544			dev_warn(&device->cdev->dev,
545				    "FORMAT 1 - Device not ready\n");
546			break;
547		case 0x0A:
548			dev_warn(&device->cdev->dev,
549				    "FORMAT 1 - Track physical address did "
550				    "not compare\n");
551			break;
552		case 0x0B:
553			dev_warn(&device->cdev->dev,
554				    "FORMAT 1 - Missing device address bit\n");
555			break;
556		case 0x0C:
557			dev_warn(&device->cdev->dev,
558				    "FORMAT 1 - Drive motor switch is off\n");
559			break;
560		case 0x0D:
561			dev_warn(&device->cdev->dev,
562				    "FORMAT 1 - Seek incomplete\n");
563			break;
564		case 0x0E:
565			dev_warn(&device->cdev->dev,
566				    "FORMAT 1 - Cylinder address did not "
567				    "compare\n");
568			break;
569		case 0x0F:
570			dev_warn(&device->cdev->dev,
571				    "FORMAT 1 - Offset active cannot be "
572				    "reset\n");
573			break;
574		default:
575			dev_warn(&device->cdev->dev,
576				    "FORMAT 1 - Reserved\n");
577		}
578		break;
579
580	case 0x20:		/* Format 2 - 3990 Equipment Checks */
581		switch (msg_no) {
582		case 0x08:
583			dev_warn(&device->cdev->dev,
584				    "FORMAT 2 - 3990 check-2 error\n");
585			break;
586		case 0x0E:
587			dev_warn(&device->cdev->dev,
588				    "FORMAT 2 - Support facility errors\n");
589			break;
590		case 0x0F:
591			dev_warn(&device->cdev->dev,
592				 "FORMAT 2 - Microcode detected error "
593				 "%02x\n",
594				 sense[8]);
595			break;
596		default:
597			dev_warn(&device->cdev->dev,
598				    "FORMAT 2 - Reserved\n");
599		}
600		break;
601
602	case 0x30:		/* Format 3 - 3990 Control Checks */
603		switch (msg_no) {
604		case 0x0F:
605			dev_warn(&device->cdev->dev,
606				    "FORMAT 3 - Allegiance terminated\n");
607			break;
608		default:
609			dev_warn(&device->cdev->dev,
610				    "FORMAT 3 - Reserved\n");
611		}
612		break;
613
614	case 0x40:		/* Format 4 - Data Checks */
615		switch (msg_no) {
616		case 0x00:
617			dev_warn(&device->cdev->dev,
618				    "FORMAT 4 - Home address area error\n");
619			break;
620		case 0x01:
621			dev_warn(&device->cdev->dev,
622				    "FORMAT 4 - Count area error\n");
623			break;
624		case 0x02:
625			dev_warn(&device->cdev->dev,
626				    "FORMAT 4 - Key area error\n");
627			break;
628		case 0x03:
629			dev_warn(&device->cdev->dev,
630				    "FORMAT 4 - Data area error\n");
631			break;
632		case 0x04:
633			dev_warn(&device->cdev->dev,
634				    "FORMAT 4 - No sync byte in home address "
635				    "area\n");
636			break;
637		case 0x05:
638			dev_warn(&device->cdev->dev,
639				    "FORMAT 4 - No sync byte in count address "
640				    "area\n");
641			break;
642		case 0x06:
643			dev_warn(&device->cdev->dev,
644				    "FORMAT 4 - No sync byte in key area\n");
645			break;
646		case 0x07:
647			dev_warn(&device->cdev->dev,
648				    "FORMAT 4 - No sync byte in data area\n");
649			break;
650		case 0x08:
651			dev_warn(&device->cdev->dev,
652				    "FORMAT 4 - Home address area error; "
653				    "offset active\n");
654			break;
655		case 0x09:
656			dev_warn(&device->cdev->dev,
657				    "FORMAT 4 - Count area error; offset "
658				    "active\n");
659			break;
660		case 0x0A:
661			dev_warn(&device->cdev->dev,
662				    "FORMAT 4 - Key area error; offset "
663				    "active\n");
664			break;
665		case 0x0B:
666			dev_warn(&device->cdev->dev,
667				    "FORMAT 4 - Data area error; "
668				    "offset active\n");
669			break;
670		case 0x0C:
671			dev_warn(&device->cdev->dev,
672				    "FORMAT 4 - No sync byte in home "
673				    "address area; offset active\n");
674			break;
675		case 0x0D:
676			dev_warn(&device->cdev->dev,
677				    "FORMAT 4 - No syn byte in count "
678				    "address area; offset active\n");
679			break;
680		case 0x0E:
681			dev_warn(&device->cdev->dev,
682				    "FORMAT 4 - No sync byte in key area; "
683				    "offset active\n");
684			break;
685		case 0x0F:
686			dev_warn(&device->cdev->dev,
687				    "FORMAT 4 - No syn byte in data area; "
688				    "offset active\n");
689			break;
690		default:
691			dev_warn(&device->cdev->dev,
692				    "FORMAT 4 - Reserved\n");
693		}
694		break;
695
696	case 0x50:  /* Format 5 - Data Check with displacement information */
697		switch (msg_no) {
698		case 0x00:
699			dev_warn(&device->cdev->dev,
700				    "FORMAT 5 - Data Check in the "
701				    "home address area\n");
702			break;
703		case 0x01:
704			dev_warn(&device->cdev->dev,
705				 "FORMAT 5 - Data Check in the count "
706				 "area\n");
707			break;
708		case 0x02:
709			dev_warn(&device->cdev->dev,
710				    "FORMAT 5 - Data Check in the key area\n");
711			break;
712		case 0x03:
713			dev_warn(&device->cdev->dev,
714				 "FORMAT 5 - Data Check in the data "
715				 "area\n");
716			break;
717		case 0x08:
718			dev_warn(&device->cdev->dev,
719				    "FORMAT 5 - Data Check in the "
720				    "home address area; offset active\n");
721			break;
722		case 0x09:
723			dev_warn(&device->cdev->dev,
724				    "FORMAT 5 - Data Check in the count area; "
725				    "offset active\n");
726			break;
727		case 0x0A:
728			dev_warn(&device->cdev->dev,
729				    "FORMAT 5 - Data Check in the key area; "
730				    "offset active\n");
731			break;
732		case 0x0B:
733			dev_warn(&device->cdev->dev,
734				    "FORMAT 5 - Data Check in the data area; "
735				    "offset active\n");
736			break;
737		default:
738			dev_warn(&device->cdev->dev,
739				    "FORMAT 5 - Reserved\n");
740		}
741		break;
742
743	case 0x60:  /* Format 6 - Usage Statistics/Overrun Errors */
744		switch (msg_no) {
745		case 0x00:
746			dev_warn(&device->cdev->dev,
747				    "FORMAT 6 - Overrun on channel A\n");
748			break;
749		case 0x01:
750			dev_warn(&device->cdev->dev,
751				    "FORMAT 6 - Overrun on channel B\n");
752			break;
753		case 0x02:
754			dev_warn(&device->cdev->dev,
755				    "FORMAT 6 - Overrun on channel C\n");
756			break;
757		case 0x03:
758			dev_warn(&device->cdev->dev,
759				    "FORMAT 6 - Overrun on channel D\n");
760			break;
761		case 0x04:
762			dev_warn(&device->cdev->dev,
763				    "FORMAT 6 - Overrun on channel E\n");
764			break;
765		case 0x05:
766			dev_warn(&device->cdev->dev,
767				    "FORMAT 6 - Overrun on channel F\n");
768			break;
769		case 0x06:
770			dev_warn(&device->cdev->dev,
771				    "FORMAT 6 - Overrun on channel G\n");
772			break;
773		case 0x07:
774			dev_warn(&device->cdev->dev,
775				    "FORMAT 6 - Overrun on channel H\n");
776			break;
777		default:
778			dev_warn(&device->cdev->dev,
779				    "FORMAT 6 - Reserved\n");
780		}
781		break;
782
783	case 0x70:  /* Format 7 - Device Connection Control Checks */
784		switch (msg_no) {
785		case 0x00:
786			dev_warn(&device->cdev->dev,
787				    "FORMAT 7 - RCC initiated by a connection "
788				    "check alert\n");
789			break;
790		case 0x01:
791			dev_warn(&device->cdev->dev,
792				    "FORMAT 7 - RCC 1 sequence not "
793				    "successful\n");
794			break;
795		case 0x02:
796			dev_warn(&device->cdev->dev,
797				    "FORMAT 7 - RCC 1 and RCC 2 sequences not "
798				    "successful\n");
799			break;
800		case 0x03:
801			dev_warn(&device->cdev->dev,
802				    "FORMAT 7 - Invalid tag-in during "
803				    "selection sequence\n");
804			break;
805		case 0x04:
806			dev_warn(&device->cdev->dev,
807				    "FORMAT 7 - extra RCC required\n");
808			break;
809		case 0x05:
810			dev_warn(&device->cdev->dev,
811				    "FORMAT 7 - Invalid DCC selection "
812				    "response or timeout\n");
813			break;
814		case 0x06:
815			dev_warn(&device->cdev->dev,
816				    "FORMAT 7 - Missing end operation; device "
817				    "transfer complete\n");
818			break;
819		case 0x07:
820			dev_warn(&device->cdev->dev,
821				    "FORMAT 7 - Missing end operation; device "
822				    "transfer incomplete\n");
823			break;
824		case 0x08:
825			dev_warn(&device->cdev->dev,
826				    "FORMAT 7 - Invalid tag-in for an "
827				    "immediate command sequence\n");
828			break;
829		case 0x09:
830			dev_warn(&device->cdev->dev,
831				    "FORMAT 7 - Invalid tag-in for an "
832				    "extended command sequence\n");
833			break;
834		case 0x0A:
835			dev_warn(&device->cdev->dev,
836				    "FORMAT 7 - 3990 microcode time out when "
837				    "stopping selection\n");
838			break;
839		case 0x0B:
840			dev_warn(&device->cdev->dev,
841				    "FORMAT 7 - No response to selection "
842				    "after a poll interruption\n");
843			break;
844		case 0x0C:
845			dev_warn(&device->cdev->dev,
846				    "FORMAT 7 - Permanent path error (DASD "
847				    "controller not available)\n");
848			break;
849		case 0x0D:
850			dev_warn(&device->cdev->dev,
851				    "FORMAT 7 - DASD controller not available"
852				    " on disconnected command chain\n");
853			break;
854		default:
855			dev_warn(&device->cdev->dev,
856				    "FORMAT 7 - Reserved\n");
857		}
858		break;
859
860	case 0x80:  /* Format 8 - Additional Device Equipment Checks */
861		switch (msg_no) {
862		case 0x00:	/* No Message */
863		case 0x01:
864			dev_warn(&device->cdev->dev,
865				    "FORMAT 8 - Error correction code "
866				    "hardware fault\n");
867			break;
868		case 0x03:
869			dev_warn(&device->cdev->dev,
870				    "FORMAT 8 - Unexpected end operation "
871				    "response code\n");
872			break;
873		case 0x04:
874			dev_warn(&device->cdev->dev,
875				    "FORMAT 8 - End operation with transfer "
876				    "count not zero\n");
877			break;
878		case 0x05:
879			dev_warn(&device->cdev->dev,
880				    "FORMAT 8 - End operation with transfer "
881				    "count zero\n");
882			break;
883		case 0x06:
884			dev_warn(&device->cdev->dev,
885				    "FORMAT 8 - DPS checks after a system "
886				    "reset or selective reset\n");
887			break;
888		case 0x07:
889			dev_warn(&device->cdev->dev,
890				    "FORMAT 8 - DPS cannot be filled\n");
891			break;
892		case 0x08:
893			dev_warn(&device->cdev->dev,
894				    "FORMAT 8 - Short busy time-out during "
895				    "device selection\n");
896			break;
897		case 0x09:
898			dev_warn(&device->cdev->dev,
899				    "FORMAT 8 - DASD controller failed to "
900				    "set or reset the long busy latch\n");
901			break;
902		case 0x0A:
903			dev_warn(&device->cdev->dev,
904				    "FORMAT 8 - No interruption from device "
905				    "during a command chain\n");
906			break;
907		default:
908			dev_warn(&device->cdev->dev,
909				    "FORMAT 8 - Reserved\n");
910		}
911		break;
912
913	case 0x90:  /* Format 9 - Device Read, Write, and Seek Checks */
914		switch (msg_no) {
915		case 0x00:
916			break;	/* No Message */
917		case 0x06:
918			dev_warn(&device->cdev->dev,
919				    "FORMAT 9 - Device check-2 error\n");
920			break;
921		case 0x07:
922			dev_warn(&device->cdev->dev,
923				 "FORMAT 9 - Head address did not "
924				 "compare\n");
925			break;
926		case 0x0A:
927			dev_warn(&device->cdev->dev,
928				    "FORMAT 9 - Track physical address did "
929				    "not compare while oriented\n");
930			break;
931		case 0x0E:
932			dev_warn(&device->cdev->dev,
933				    "FORMAT 9 - Cylinder address did not "
934				    "compare\n");
935			break;
936		default:
937			dev_warn(&device->cdev->dev,
938				    "FORMAT 9 - Reserved\n");
939		}
940		break;
941
942	case 0xF0:		/* Format F - Cache Storage Checks */
943		switch (msg_no) {
944		case 0x00:
945			dev_warn(&device->cdev->dev,
946				    "FORMAT F - Operation Terminated\n");
947			break;
948		case 0x01:
949			dev_warn(&device->cdev->dev,
950				    "FORMAT F - Subsystem Processing Error\n");
951			break;
952		case 0x02:
953			dev_warn(&device->cdev->dev,
954				    "FORMAT F - Cache or nonvolatile storage "
955				    "equipment failure\n");
956			break;
957		case 0x04:
958			dev_warn(&device->cdev->dev,
959				    "FORMAT F - Caching terminated\n");
960			break;
961		case 0x06:
962			dev_warn(&device->cdev->dev,
963				    "FORMAT F - Cache fast write access not "
964				    "authorized\n");
965			break;
966		case 0x07:
967			dev_warn(&device->cdev->dev,
968				    "FORMAT F - Track format incorrect\n");
969			break;
970		case 0x09:
971			dev_warn(&device->cdev->dev,
972				    "FORMAT F - Caching reinitiated\n");
973			break;
974		case 0x0A:
975			dev_warn(&device->cdev->dev,
976				    "FORMAT F - Nonvolatile storage "
977				    "terminated\n");
978			break;
979		case 0x0B:
980			dev_warn(&device->cdev->dev,
981				    "FORMAT F - Volume is suspended duplex\n");
982			/* call extended error reporting (EER) */
983			dasd_eer_write(device, erp->refers,
984				       DASD_EER_PPRCSUSPEND);
985			break;
986		case 0x0C:
987			dev_warn(&device->cdev->dev,
988				    "FORMAT F - Subsystem status cannot be "
989				    "determined\n");
990			break;
991		case 0x0D:
992			dev_warn(&device->cdev->dev,
993				    "FORMAT F - Caching status reset to "
994				    "default\n");
995			break;
996		case 0x0E:
997			dev_warn(&device->cdev->dev,
998				    "FORMAT F - DASD Fast Write inhibited\n");
999			break;
1000		default:
1001			dev_warn(&device->cdev->dev,
1002				    "FORMAT D - Reserved\n");
1003		}
1004		break;
1005
1006	default:	/* unknown message format - should not happen
1007			   internal error 03 - unknown message format */
1008		snprintf(errorstring, ERRORLENGTH, "03 %x02", msg_format);
1009		dev_err(&device->cdev->dev,
1010			 "An error occurred in the DASD device driver, "
1011			 "reason=%s\n", errorstring);
1012		break;
1013	}			/* end switch message format */
1014
1015}				/* end dasd_3990_handle_env_data */
1016
1017/*
1018 * DASD_3990_ERP_COM_REJ
1019 *
1020 * DESCRIPTION
1021 *   Handles 24 byte 'Command Reject' error.
1022 *
1023 * PARAMETER
1024 *   erp		current erp_head
1025 *   sense		current sense data
1026 *
1027 * RETURN VALUES
1028 *   erp		'new' erp_head - pointer to new ERP
1029 */
1030static struct dasd_ccw_req *
1031dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense)
1032{
1033
1034	struct dasd_device *device = erp->startdev;
1035
1036	erp->function = dasd_3990_erp_com_rej;
1037
1038	/* env data present (ACTION 10 - retry should work) */
1039	if (sense[2] & SNS2_ENV_DATA_PRESENT) {
1040
1041		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1042			    "Command Reject - environmental data present");
1043
1044		dasd_3990_handle_env_data(erp, sense);
1045
1046		erp->retries = 5;
1047
1048	} else if (sense[1] & SNS1_WRITE_INHIBITED) {
1049		dev_err(&device->cdev->dev, "An I/O request was rejected"
1050			" because writing is inhibited\n");
1051		erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1052	} else {
1053		/* fatal error -  set status to FAILED
1054		   internal error 09 - Command Reject */
1055		dev_err(&device->cdev->dev, "An error occurred in the DASD "
1056			"device driver, reason=%s\n", "09");
1057
1058		erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1059	}
1060
1061	return erp;
1062
1063}				/* end dasd_3990_erp_com_rej */
1064
1065/*
1066 * DASD_3990_ERP_BUS_OUT
1067 *
1068 * DESCRIPTION
1069 *   Handles 24 byte 'Bus Out Parity Check' error.
1070 *
1071 * PARAMETER
1072 *   erp		current erp_head
1073 * RETURN VALUES
1074 *   erp		new erp_head - pointer to new ERP
1075 */
1076static struct dasd_ccw_req *
1077dasd_3990_erp_bus_out(struct dasd_ccw_req * erp)
1078{
1079
1080	struct dasd_device *device = erp->startdev;
1081
1082	/* first time set initial retry counter and erp_function */
1083	/* and retry once without blocking queue		 */
1084	/* (this enables easier enqueing of the cqr)		 */
1085	if (erp->function != dasd_3990_erp_bus_out) {
1086		erp->retries = 256;
1087		erp->function = dasd_3990_erp_bus_out;
1088
1089	} else {
1090
1091		/* issue a message and wait for 'device ready' interrupt */
1092		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1093			    "bus out parity error or BOPC requested by "
1094			    "channel");
1095
1096		dasd_3990_erp_block_queue(erp, 60*HZ);
1097
1098	}
1099
1100	return erp;
1101
1102}				/* end dasd_3990_erp_bus_out */
1103
1104/*
1105 * DASD_3990_ERP_EQUIP_CHECK
1106 *
1107 * DESCRIPTION
1108 *   Handles 24 byte 'Equipment Check' error.
1109 *
1110 * PARAMETER
1111 *   erp		current erp_head
1112 * RETURN VALUES
1113 *   erp		new erp_head - pointer to new ERP
1114 */
1115static struct dasd_ccw_req *
1116dasd_3990_erp_equip_check(struct dasd_ccw_req * erp, char *sense)
1117{
1118
1119	struct dasd_device *device = erp->startdev;
1120
1121	erp->function = dasd_3990_erp_equip_check;
1122
1123	if (sense[1] & SNS1_WRITE_INHIBITED) {
1124		dev_info(&device->cdev->dev,
1125			    "Write inhibited path encountered\n");
1126
1127		/* vary path offline
1128		   internal error 04 - Path should be varied off-line.*/
1129		dev_err(&device->cdev->dev, "An error occurred in the DASD "
1130			"device driver, reason=%s\n", "04");
1131
1132		erp = dasd_3990_erp_action_1(erp);
1133
1134	} else if (sense[2] & SNS2_ENV_DATA_PRESENT) {
1135
1136		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1137			    "Equipment Check - " "environmental data present");
1138
1139		dasd_3990_handle_env_data(erp, sense);
1140
1141		erp = dasd_3990_erp_action_4(erp, sense);
1142
1143	} else if (sense[1] & SNS1_PERM_ERR) {
1144
1145		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1146			    "Equipment Check - retry exhausted or "
1147			    "undesirable");
1148
1149		erp = dasd_3990_erp_action_1(erp);
1150
1151	} else {
1152		/* all other equipment checks - Action 5 */
1153		/* rest is done when retries == 0 */
1154		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1155			    "Equipment check or processing error");
1156
1157		erp = dasd_3990_erp_action_5(erp);
1158	}
1159	return erp;
1160
1161}				/* end dasd_3990_erp_equip_check */
1162
1163/*
1164 * DASD_3990_ERP_DATA_CHECK
1165 *
1166 * DESCRIPTION
1167 *   Handles 24 byte 'Data Check' error.
1168 *
1169 * PARAMETER
1170 *   erp		current erp_head
1171 * RETURN VALUES
1172 *   erp		new erp_head - pointer to new ERP
1173 */
1174static struct dasd_ccw_req *
1175dasd_3990_erp_data_check(struct dasd_ccw_req * erp, char *sense)
1176{
1177
1178	struct dasd_device *device = erp->startdev;
1179
1180	erp->function = dasd_3990_erp_data_check;
1181
1182	if (sense[2] & SNS2_CORRECTABLE) {	/* correctable data check */
1183
1184		/* issue message that the data has been corrected */
1185		dev_emerg(&device->cdev->dev,
1186			    "Data recovered during retry with PCI "
1187			    "fetch mode active\n");
1188
1189		/* not possible to handle this situation in Linux */
1190		panic("No way to inform application about the possibly "
1191		      "incorrect data");
1192
1193	} else if (sense[2] & SNS2_ENV_DATA_PRESENT) {
1194
1195		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1196			    "Uncorrectable data check recovered secondary "
1197			    "addr of duplex pair");
1198
1199		erp = dasd_3990_erp_action_4(erp, sense);
1200
1201	} else if (sense[1] & SNS1_PERM_ERR) {
1202
1203		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1204			    "Uncorrectable data check with internal "
1205			    "retry exhausted");
1206
1207		erp = dasd_3990_erp_action_1(erp);
1208
1209	} else {
1210		/* all other data checks */
1211		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1212			    "Uncorrectable data check with retry count "
1213			    "exhausted...");
1214
1215		erp = dasd_3990_erp_action_5(erp);
1216	}
1217
1218	return erp;
1219
1220}				/* end dasd_3990_erp_data_check */
1221
1222/*
1223 * DASD_3990_ERP_OVERRUN
1224 *
1225 * DESCRIPTION
1226 *   Handles 24 byte 'Overrun' error.
1227 *
1228 * PARAMETER
1229 *   erp		current erp_head
1230 * RETURN VALUES
1231 *   erp		new erp_head - pointer to new ERP
1232 */
1233static struct dasd_ccw_req *
1234dasd_3990_erp_overrun(struct dasd_ccw_req * erp, char *sense)
1235{
1236
1237	struct dasd_device *device = erp->startdev;
1238
1239	erp->function = dasd_3990_erp_overrun;
1240
1241	DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1242		    "Overrun - service overrun or overrun"
1243		    " error requested by channel");
1244
1245	erp = dasd_3990_erp_action_5(erp);
1246
1247	return erp;
1248
1249}				/* end dasd_3990_erp_overrun */
1250
1251/*
1252 * DASD_3990_ERP_INV_FORMAT
1253 *
1254 * DESCRIPTION
1255 *   Handles 24 byte 'Invalid Track Format' error.
1256 *
1257 * PARAMETER
1258 *   erp		current erp_head
1259 * RETURN VALUES
1260 *   erp		new erp_head - pointer to new ERP
1261 */
1262static struct dasd_ccw_req *
1263dasd_3990_erp_inv_format(struct dasd_ccw_req * erp, char *sense)
1264{
1265
1266	struct dasd_device *device = erp->startdev;
1267
1268	erp->function = dasd_3990_erp_inv_format;
1269
1270	if (sense[2] & SNS2_ENV_DATA_PRESENT) {
1271
1272		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1273			    "Track format error when destaging or "
1274			    "staging data");
1275
1276		dasd_3990_handle_env_data(erp, sense);
1277
1278		erp = dasd_3990_erp_action_4(erp, sense);
1279
1280	} else {
1281		/* internal error 06 - The track format is not valid*/
1282		dev_err(&device->cdev->dev,
1283			"An error occurred in the DASD device driver, "
1284			"reason=%s\n", "06");
1285
1286		erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1287	}
1288
1289	return erp;
1290
1291}				/* end dasd_3990_erp_inv_format */
1292
1293/*
1294 * DASD_3990_ERP_EOC
1295 *
1296 * DESCRIPTION
1297 *   Handles 24 byte 'End-of-Cylinder' error.
1298 *
1299 * PARAMETER
1300 *   erp		already added default erp
1301 * RETURN VALUES
1302 *   erp		pointer to original (failed) cqr.
1303 */
1304static struct dasd_ccw_req *
1305dasd_3990_erp_EOC(struct dasd_ccw_req * default_erp, char *sense)
1306{
1307
1308	struct dasd_device *device = default_erp->startdev;
1309
1310	dev_err(&device->cdev->dev,
1311		"The cylinder data for accessing the DASD is inconsistent\n");
1312
1313	/* implement action 7 - BUG */
1314	return dasd_3990_erp_cleanup(default_erp, DASD_CQR_FAILED);
1315
1316}				/* end dasd_3990_erp_EOC */
1317
1318/*
1319 * DASD_3990_ERP_ENV_DATA
1320 *
1321 * DESCRIPTION
1322 *   Handles 24 byte 'Environmental-Data Present' error.
1323 *
1324 * PARAMETER
1325 *   erp		current erp_head
1326 * RETURN VALUES
1327 *   erp		new erp_head - pointer to new ERP
1328 */
1329static struct dasd_ccw_req *
1330dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense)
1331{
1332
1333	struct dasd_device *device = erp->startdev;
1334
1335	erp->function = dasd_3990_erp_env_data;
1336
1337	DBF_DEV_EVENT(DBF_WARNING, device, "%s", "Environmental data present");
1338
1339	dasd_3990_handle_env_data(erp, sense);
1340
1341	/* don't retry on disabled interface */
1342	if (sense[7] != 0x0F) {
1343		erp = dasd_3990_erp_action_4(erp, sense);
1344	} else {
1345		erp->status = DASD_CQR_FILLED;
1346	}
1347
1348	return erp;
1349
1350}				/* end dasd_3990_erp_env_data */
1351
1352/*
1353 * DASD_3990_ERP_NO_REC
1354 *
1355 * DESCRIPTION
1356 *   Handles 24 byte 'No Record Found' error.
1357 *
1358 * PARAMETER
1359 *   erp		already added default ERP
1360 *
1361 * RETURN VALUES
1362 *   erp		new erp_head - pointer to new ERP
1363 */
1364static struct dasd_ccw_req *
1365dasd_3990_erp_no_rec(struct dasd_ccw_req * default_erp, char *sense)
1366{
1367
1368	struct dasd_device *device = default_erp->startdev;
1369
1370	dev_err(&device->cdev->dev,
1371		    "The specified record was not found\n");
1372
1373	return dasd_3990_erp_cleanup(default_erp, DASD_CQR_FAILED);
1374
1375}				/* end dasd_3990_erp_no_rec */
1376
1377/*
1378 * DASD_3990_ERP_FILE_PROT
1379 *
1380 * DESCRIPTION
1381 *   Handles 24 byte 'File Protected' error.
1382 *   Note: Seek related recovery is not implemented because
1383 *	   wee don't use the seek command yet.
1384 *
1385 * PARAMETER
1386 *   erp		current erp_head
1387 * RETURN VALUES
1388 *   erp		new erp_head - pointer to new ERP
1389 */
1390static struct dasd_ccw_req *
1391dasd_3990_erp_file_prot(struct dasd_ccw_req * erp)
1392{
1393
1394	struct dasd_device *device = erp->startdev;
1395
1396	dev_err(&device->cdev->dev, "Accessing the DASD failed because of "
1397		"a hardware error\n");
1398
1399	return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1400
1401}				/* end dasd_3990_erp_file_prot */
1402
1403/*
1404 * DASD_3990_ERP_INSPECT_ALIAS
1405 *
1406 * DESCRIPTION
1407 *   Checks if the original request was started on an alias device.
1408 *   If yes, it modifies the original and the erp request so that
1409 *   the erp request can be started on a base device.
1410 *
1411 * PARAMETER
1412 *   erp		pointer to the currently created default ERP
1413 *
1414 * RETURN VALUES
1415 *   erp		pointer to the modified ERP, or NULL
1416 */
1417
1418static struct dasd_ccw_req *dasd_3990_erp_inspect_alias(
1419						struct dasd_ccw_req *erp)
1420{
1421	struct dasd_ccw_req *cqr = erp->refers;
1422	char *sense;
1423
1424	if (cqr->block &&
1425	    (cqr->block->base != cqr->startdev)) {
1426
1427		sense = dasd_get_sense(&erp->refers->irb);
1428		/*
1429		 * dynamic pav may have changed base alias mapping
1430		 */
1431		if (!test_bit(DASD_FLAG_OFFLINE, &cqr->startdev->flags) && sense
1432		    && (sense[0] == 0x10) && (sense[7] == 0x0F)
1433		    && (sense[8] == 0x67)) {
1434			/*
1435			 * remove device from alias handling to prevent new
1436			 * requests from being scheduled on the
1437			 * wrong alias device
1438			 */
1439			dasd_alias_remove_device(cqr->startdev);
1440
1441			/* schedule worker to reload device */
1442			dasd_reload_device(cqr->startdev);
1443		}
1444
1445		if (cqr->startdev->features & DASD_FEATURE_ERPLOG) {
1446			DBF_DEV_EVENT(DBF_ERR, cqr->startdev,
1447				    "ERP on alias device for request %p,"
1448				    " recover on base device %s", cqr,
1449				    dev_name(&cqr->block->base->cdev->dev));
1450		}
1451		dasd_eckd_reset_ccw_to_base_io(cqr);
1452		erp->startdev = cqr->block->base;
1453		erp->function = dasd_3990_erp_inspect_alias;
1454		return erp;
1455	} else
1456		return NULL;
1457}
1458
1459
1460/*
1461 * DASD_3990_ERP_INSPECT_24
1462 *
1463 * DESCRIPTION
1464 *   Does a detailed inspection of the 24 byte sense data
1465 *   and sets up a related error recovery action.
1466 *
1467 * PARAMETER
1468 *   sense		sense data of the actual error
1469 *   erp		pointer to the currently created default ERP
1470 *
1471 * RETURN VALUES
1472 *   erp		pointer to the (addtitional) ERP
1473 */
1474static struct dasd_ccw_req *
1475dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
1476{
1477
1478	struct dasd_ccw_req *erp_filled = NULL;
1479
1480	/* Check sense for ....	   */
1481	/* 'Command Reject'	   */
1482	if ((erp_filled == NULL) && (sense[0] & SNS0_CMD_REJECT)) {
1483		erp_filled = dasd_3990_erp_com_rej(erp, sense);
1484	}
1485	/* 'Intervention Required' */
1486	if ((erp_filled == NULL) && (sense[0] & SNS0_INTERVENTION_REQ)) {
1487		erp_filled = dasd_3990_erp_int_req(erp);
1488	}
1489	/* 'Bus Out Parity Check'  */
1490	if ((erp_filled == NULL) && (sense[0] & SNS0_BUS_OUT_CHECK)) {
1491		erp_filled = dasd_3990_erp_bus_out(erp);
1492	}
1493	/* 'Equipment Check'	   */
1494	if ((erp_filled == NULL) && (sense[0] & SNS0_EQUIPMENT_CHECK)) {
1495		erp_filled = dasd_3990_erp_equip_check(erp, sense);
1496	}
1497	/* 'Data Check'		   */
1498	if ((erp_filled == NULL) && (sense[0] & SNS0_DATA_CHECK)) {
1499		erp_filled = dasd_3990_erp_data_check(erp, sense);
1500	}
1501	/* 'Overrun'		   */
1502	if ((erp_filled == NULL) && (sense[0] & SNS0_OVERRUN)) {
1503		erp_filled = dasd_3990_erp_overrun(erp, sense);
1504	}
1505	/* 'Invalid Track Format'  */
1506	if ((erp_filled == NULL) && (sense[1] & SNS1_INV_TRACK_FORMAT)) {
1507		erp_filled = dasd_3990_erp_inv_format(erp, sense);
1508	}
1509	/* 'End-of-Cylinder'	   */
1510	if ((erp_filled == NULL) && (sense[1] & SNS1_EOC)) {
1511		erp_filled = dasd_3990_erp_EOC(erp, sense);
1512	}
1513	/* 'Environmental Data'	   */
1514	if ((erp_filled == NULL) && (sense[2] & SNS2_ENV_DATA_PRESENT)) {
1515		erp_filled = dasd_3990_erp_env_data(erp, sense);
1516	}
1517	/* 'No Record Found'	   */
1518	if ((erp_filled == NULL) && (sense[1] & SNS1_NO_REC_FOUND)) {
1519		erp_filled = dasd_3990_erp_no_rec(erp, sense);
1520	}
1521	/* 'File Protected'	   */
1522	if ((erp_filled == NULL) && (sense[1] & SNS1_FILE_PROTECTED)) {
1523		erp_filled = dasd_3990_erp_file_prot(erp);
1524	}
1525	/* other (unknown) error - do default ERP */
1526	if (erp_filled == NULL) {
1527
1528		erp_filled = erp;
1529	}
1530
1531	return erp_filled;
1532
1533}				/* END dasd_3990_erp_inspect_24 */
1534
1535/*
1536 *****************************************************************************
1537 * 32 byte sense ERP functions (only)
1538 *****************************************************************************
1539 */
1540
1541/*
1542 * DASD_3990_ERPACTION_10_32
1543 *
1544 * DESCRIPTION
1545 *   Handles 32 byte 'Action 10' of Single Program Action Codes.
1546 *   Just retry and if retry doesn't work, return with error.
1547 *
1548 * PARAMETER
1549 *   erp		current erp_head
1550 *   sense		current sense data
1551 * RETURN VALUES
1552 *   erp		modified erp_head
1553 */
1554static struct dasd_ccw_req *
1555dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
1556{
1557
1558	struct dasd_device *device = erp->startdev;
1559
1560	erp->retries = 256;
1561	erp->function = dasd_3990_erp_action_10_32;
1562
1563	DBF_DEV_EVENT(DBF_WARNING, device, "%s", "Perform logging requested");
1564
1565	return erp;
1566
1567}				/* end dasd_3990_erp_action_10_32 */
1568
1569/*
1570 * DASD_3990_ERP_ACTION_1B_32
1571 *
1572 * DESCRIPTION
1573 *   Handles 32 byte 'Action 1B' of Single Program Action Codes.
1574 *   A write operation could not be finished because of an unexpected
1575 *   condition.
1576 *   The already created 'default erp' is used to get the link to
1577 *   the erp chain, but it can not be used for this recovery
1578 *   action because it contains no DE/LO data space.
1579 *
1580 * PARAMETER
1581 *   default_erp	already added default erp.
1582 *   sense		current sense data
1583 *
1584 * RETURN VALUES
1585 *   erp		new erp or
1586 *			default_erp in case of imprecise ending or error
1587 */
1588static struct dasd_ccw_req *
1589dasd_3990_erp_action_1B_32(struct dasd_ccw_req * default_erp, char *sense)
1590{
1591
1592	struct dasd_device *device = default_erp->startdev;
1593	__u32 cpa = 0;
1594	struct dasd_ccw_req *cqr;
1595	struct dasd_ccw_req *erp;
1596	struct DE_eckd_data *DE_data;
1597	struct PFX_eckd_data *PFX_data;
1598	char *LO_data;		/* LO_eckd_data_t */
1599	struct ccw1 *ccw, *oldccw;
1600
1601	DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1602		    "Write not finished because of unexpected condition");
1603
1604	default_erp->function = dasd_3990_erp_action_1B_32;
1605
1606	/* determine the original cqr */
1607	cqr = default_erp;
1608
1609	while (cqr->refers != NULL) {
1610		cqr = cqr->refers;
1611	}
1612
1613	if (scsw_is_tm(&cqr->irb.scsw)) {
1614		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1615			      "32 bit sense, action 1B is not defined"
1616			      " in transport mode - just retry");
1617		return default_erp;
1618	}
1619
1620	/* for imprecise ending just do default erp */
1621	if (sense[1] & 0x01) {
1622		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1623			    "Imprecise ending is set - just retry");
1624
1625		return default_erp;
1626	}
1627
1628	/* determine the address of the CCW to be restarted */
1629	/* Imprecise ending is not set -> addr from IRB-SCSW */
1630	cpa = default_erp->refers->irb.scsw.cmd.cpa;
1631
1632	if (cpa == 0) {
1633		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1634			    "Unable to determine address of the CCW "
1635			    "to be restarted");
1636
1637		return dasd_3990_erp_cleanup(default_erp, DASD_CQR_FAILED);
1638	}
1639
1640	/* Build new ERP request including DE/LO */
1641	erp = dasd_alloc_erp_request((char *) &cqr->magic,
1642				     2 + 1,/* DE/LO + TIC */
1643				     sizeof(struct DE_eckd_data) +
1644				     sizeof(struct LO_eckd_data), device);
1645
1646	if (IS_ERR(erp)) {
1647		/* internal error 01 - Unable to allocate ERP */
1648		dev_err(&device->cdev->dev, "An error occurred in the DASD "
1649			"device driver, reason=%s\n", "01");
1650		return dasd_3990_erp_cleanup(default_erp, DASD_CQR_FAILED);
1651	}
1652
1653	/* use original DE */
1654	DE_data = erp->data;
1655	oldccw = cqr->cpaddr;
1656	if (oldccw->cmd_code == DASD_ECKD_CCW_PFX) {
1657		PFX_data = cqr->data;
1658		memcpy(DE_data, &PFX_data->define_extent,
1659		       sizeof(struct DE_eckd_data));
1660	} else
1661		memcpy(DE_data, cqr->data, sizeof(struct DE_eckd_data));
1662
1663	/* create LO */
1664	LO_data = erp->data + sizeof(struct DE_eckd_data);
1665
1666	if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) {
1667		/* should not */
1668		return dasd_3990_erp_cleanup(default_erp, DASD_CQR_FAILED);
1669	}
1670
1671	if ((sense[7] & 0x3F) == 0x01) {
1672		/* operation code is WRITE DATA -> data area orientation */
1673		LO_data[0] = 0x81;
1674
1675	} else if ((sense[7] & 0x3F) == 0x03) {
1676		/* operation code is FORMAT WRITE -> index orientation */
1677		LO_data[0] = 0xC3;
1678
1679	} else {
1680		LO_data[0] = sense[7];	/* operation */
1681	}
1682
1683	LO_data[1] = sense[8];	/* auxiliary */
1684	LO_data[2] = sense[9];
1685	LO_data[3] = sense[3];	/* count */
1686	LO_data[4] = sense[29];	/* seek_addr.cyl */
1687	LO_data[5] = sense[30];	/* seek_addr.cyl 2nd byte */
1688	LO_data[7] = sense[31];	/* seek_addr.head 2nd byte */
1689
1690	memcpy(&(LO_data[8]), &(sense[11]), 8);
1691
1692	/* create DE ccw */
1693	ccw = erp->cpaddr;
1694	memset(ccw, 0, sizeof(struct ccw1));
1695	ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT;
1696	ccw->flags = CCW_FLAG_CC;
1697	ccw->count = 16;
1698	ccw->cda = (__u32)(addr_t) DE_data;
1699
1700	/* create LO ccw */
1701	ccw++;
1702	memset(ccw, 0, sizeof(struct ccw1));
1703	ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD;
1704	ccw->flags = CCW_FLAG_CC;
1705	ccw->count = 16;
1706	ccw->cda = (__u32)(addr_t) LO_data;
1707
1708	/* TIC to the failed ccw */
1709	ccw++;
1710	ccw->cmd_code = CCW_CMD_TIC;
1711	ccw->cda = cpa;
1712
1713	/* fill erp related fields */
1714	erp->flags = default_erp->flags;
1715	erp->function = dasd_3990_erp_action_1B_32;
1716	erp->refers = default_erp->refers;
1717	erp->startdev = device;
1718	erp->memdev = device;
1719	erp->magic = default_erp->magic;
1720	erp->expires = default_erp->expires;
1721	erp->retries = 256;
1722	erp->buildclk = get_tod_clock();
1723	erp->status = DASD_CQR_FILLED;
1724
1725	/* remove the default erp */
1726	dasd_free_erp_request(default_erp, device);
1727
1728	return erp;
1729
1730}				/* end dasd_3990_erp_action_1B_32 */
1731
1732/*
1733 * DASD_3990_UPDATE_1B
1734 *
1735 * DESCRIPTION
1736 *   Handles the update to the 32 byte 'Action 1B' of Single Program
1737 *   Action Codes in case the first action was not successful.
1738 *   The already created 'previous_erp' is the currently not successful
1739 *   ERP.
1740 *
1741 * PARAMETER
1742 *   previous_erp	already created previous erp.
1743 *   sense		current sense data
1744 * RETURN VALUES
1745 *   erp		modified erp
1746 */
1747static struct dasd_ccw_req *
1748dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense)
1749{
1750
1751	struct dasd_device *device = previous_erp->startdev;
1752	__u32 cpa = 0;
1753	struct dasd_ccw_req *cqr;
1754	struct dasd_ccw_req *erp;
1755	char *LO_data;		/* struct LO_eckd_data */
1756	struct ccw1 *ccw;
1757
1758	DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1759		    "Write not finished because of unexpected condition"
1760		    " - follow on");
1761
1762	/* determine the original cqr */
1763	cqr = previous_erp;
1764
1765	while (cqr->refers != NULL) {
1766		cqr = cqr->refers;
1767	}
1768
1769	if (scsw_is_tm(&cqr->irb.scsw)) {
1770		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1771			      "32 bit sense, action 1B, update,"
1772			      " in transport mode - just retry");
1773		return previous_erp;
1774	}
1775
1776	/* for imprecise ending just do default erp */
1777	if (sense[1] & 0x01) {
1778		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
1779			    "Imprecise ending is set - just retry");
1780
1781		previous_erp->status = DASD_CQR_FILLED;
1782
1783		return previous_erp;
1784	}
1785
1786	/* determine the address of the CCW to be restarted */
1787	/* Imprecise ending is not set -> addr from IRB-SCSW */
1788	cpa = previous_erp->irb.scsw.cmd.cpa;
1789
1790	if (cpa == 0) {
1791		/* internal error 02 -
1792		   Unable to determine address of the CCW to be restarted */
1793		dev_err(&device->cdev->dev, "An error occurred in the DASD "
1794			"device driver, reason=%s\n", "02");
1795
1796		previous_erp->status = DASD_CQR_FAILED;
1797
1798		return previous_erp;
1799	}
1800
1801	erp = previous_erp;
1802
1803	/* update the LO with the new returned sense data  */
1804	LO_data = erp->data + sizeof(struct DE_eckd_data);
1805
1806	if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) {
1807		/* should not happen */
1808		previous_erp->status = DASD_CQR_FAILED;
1809
1810		return previous_erp;
1811	}
1812
1813	if ((sense[7] & 0x3F) == 0x01) {
1814		/* operation code is WRITE DATA -> data area orientation */
1815		LO_data[0] = 0x81;
1816
1817	} else if ((sense[7] & 0x3F) == 0x03) {
1818		/* operation code is FORMAT WRITE -> index orientation */
1819		LO_data[0] = 0xC3;
1820
1821	} else {
1822		LO_data[0] = sense[7];	/* operation */
1823	}
1824
1825	LO_data[1] = sense[8];	/* auxiliary */
1826	LO_data[2] = sense[9];
1827	LO_data[3] = sense[3];	/* count */
1828	LO_data[4] = sense[29];	/* seek_addr.cyl */
1829	LO_data[5] = sense[30];	/* seek_addr.cyl 2nd byte */
1830	LO_data[7] = sense[31];	/* seek_addr.head 2nd byte */
1831
1832	memcpy(&(LO_data[8]), &(sense[11]), 8);
1833
1834	/* TIC to the failed ccw */
1835	ccw = erp->cpaddr;	/* addr of DE ccw */
1836	ccw++;			/* addr of LE ccw */
1837	ccw++;			/* addr of TIC ccw */
1838	ccw->cda = cpa;
1839
1840	erp->status = DASD_CQR_FILLED;
1841
1842	return erp;
1843
1844}				/* end dasd_3990_update_1B */
1845
1846/*
1847 * DASD_3990_ERP_COMPOUND_RETRY
1848 *
1849 * DESCRIPTION
1850 *   Handles the compound ERP action retry code.
1851 *   NOTE: At least one retry is done even if zero is specified
1852 *	   by the sense data. This makes enqueueing of the request
1853 *	   easier.
1854 *
1855 * PARAMETER
1856 *   sense		sense data of the actual error
1857 *   erp		pointer to the currently created ERP
1858 *
1859 * RETURN VALUES
1860 *   erp		modified ERP pointer
1861 *
1862 */
1863static void
1864dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
1865{
1866
1867	switch (sense[25] & 0x03) {
1868	case 0x00:		/* no not retry */
1869		erp->retries = 1;
1870		break;
1871
1872	case 0x01:		/* retry 2 times */
1873		erp->retries = 2;
1874		break;
1875
1876	case 0x02:		/* retry 10 times */
1877		erp->retries = 10;
1878		break;
1879
1880	case 0x03:		/* retry 256 times */
1881		erp->retries = 256;
1882		break;
1883
1884	default:
1885		BUG();
1886	}
1887
1888	erp->function = dasd_3990_erp_compound_retry;
1889
1890}				/* end dasd_3990_erp_compound_retry */
1891
1892/*
1893 * DASD_3990_ERP_COMPOUND_PATH
1894 *
1895 * DESCRIPTION
1896 *   Handles the compound ERP action for retry on alternate
1897 *   channel path.
1898 *
1899 * PARAMETER
1900 *   sense		sense data of the actual error
1901 *   erp		pointer to the currently created ERP
1902 *
1903 * RETURN VALUES
1904 *   erp		modified ERP pointer
1905 *
1906 */
1907static void
1908dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
1909{
1910	if (sense[25] & DASD_SENSE_BIT_3) {
1911		dasd_3990_erp_alternate_path(erp);
1912
1913		if (erp->status == DASD_CQR_FAILED &&
1914		    !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
1915			/* reset the lpm and the status to be able to
1916			 * try further actions. */
1917			erp->lpm = erp->startdev->path_data.opm;
1918			erp->status = DASD_CQR_NEED_ERP;
1919		}
1920	}
1921
1922	erp->function = dasd_3990_erp_compound_path;
1923
1924}				/* end dasd_3990_erp_compound_path */
1925
1926/*
1927 * DASD_3990_ERP_COMPOUND_CODE
1928 *
1929 * DESCRIPTION
1930 *   Handles the compound ERP action for retry code.
1931 *
1932 * PARAMETER
1933 *   sense		sense data of the actual error
1934 *   erp		pointer to the currently created ERP
1935 *
1936 * RETURN VALUES
1937 *   erp		NEW ERP pointer
1938 *
1939 */
1940static struct dasd_ccw_req *
1941dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
1942{
1943
1944	if (sense[25] & DASD_SENSE_BIT_2) {
1945
1946		switch (sense[28]) {
1947		case 0x17:
1948			/* issue a Diagnostic Control command with an
1949			 * Inhibit Write subcommand and controller modifier */
1950			erp = dasd_3990_erp_DCTL(erp, 0x20);
1951			break;
1952
1953		case 0x25:
1954			/* wait for 5 seconds and retry again */
1955			erp->retries = 1;
1956
1957			dasd_3990_erp_block_queue (erp, 5*HZ);
1958			break;
1959
1960		default:
1961			/* should not happen - continue */
1962			break;
1963		}
1964	}
1965
1966	erp->function = dasd_3990_erp_compound_code;
1967
1968	return erp;
1969
1970}				/* end dasd_3990_erp_compound_code */
1971
1972/*
1973 * DASD_3990_ERP_COMPOUND_CONFIG
1974 *
1975 * DESCRIPTION
1976 *   Handles the compound ERP action for configruation
1977 *   dependent error.
1978 *   Note: duplex handling is not implemented (yet).
1979 *
1980 * PARAMETER
1981 *   sense		sense data of the actual error
1982 *   erp		pointer to the currently created ERP
1983 *
1984 * RETURN VALUES
1985 *   erp		modified ERP pointer
1986 *
1987 */
1988static void
1989dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
1990{
1991
1992	if ((sense[25] & DASD_SENSE_BIT_1) && (sense[26] & DASD_SENSE_BIT_2)) {
1993
1994		/* set to suspended duplex state then restart
1995		   internal error 05 - Set device to suspended duplex state
1996		   should be done */
1997		struct dasd_device *device = erp->startdev;
1998		dev_err(&device->cdev->dev,
1999			"An error occurred in the DASD device driver, "
2000			"reason=%s\n", "05");
2001
2002	}
2003
2004	erp->function = dasd_3990_erp_compound_config;
2005
2006}				/* end dasd_3990_erp_compound_config */
2007
2008/*
2009 * DASD_3990_ERP_COMPOUND
2010 *
2011 * DESCRIPTION
2012 *   Does the further compound program action if
2013 *   compound retry was not successful.
2014 *
2015 * PARAMETER
2016 *   sense		sense data of the actual error
2017 *   erp		pointer to the current (failed) ERP
2018 *
2019 * RETURN VALUES
2020 *   erp		(additional) ERP pointer
2021 *
2022 */
2023static struct dasd_ccw_req *
2024dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
2025{
2026
2027	if ((erp->function == dasd_3990_erp_compound_retry) &&
2028	    (erp->status == DASD_CQR_NEED_ERP)) {
2029
2030		dasd_3990_erp_compound_path(erp, sense);
2031	}
2032
2033	if ((erp->function == dasd_3990_erp_compound_path) &&
2034	    (erp->status == DASD_CQR_NEED_ERP)) {
2035
2036		erp = dasd_3990_erp_compound_code(erp, sense);
2037	}
2038
2039	if ((erp->function == dasd_3990_erp_compound_code) &&
2040	    (erp->status == DASD_CQR_NEED_ERP)) {
2041
2042		dasd_3990_erp_compound_config(erp, sense);
2043	}
2044
2045	/* if no compound action ERP specified, the request failed */
2046	if (erp->status == DASD_CQR_NEED_ERP)
2047		erp->status = DASD_CQR_FAILED;
2048
2049	return erp;
2050
2051}				/* end dasd_3990_erp_compound */
2052
2053/*
2054 *DASD_3990_ERP_HANDLE_SIM
2055 *
2056 *DESCRIPTION
2057 *  inspects the SIM SENSE data and starts an appropriate action
2058 *
2059 * PARAMETER
2060 *   sense	   sense data of the actual error
2061 *
2062 * RETURN VALUES
2063 *   none
2064 */
2065void
2066dasd_3990_erp_handle_sim(struct dasd_device *device, char *sense)
2067{
2068	/* print message according to log or message to operator mode */
2069	if ((sense[24] & DASD_SIM_MSG_TO_OP) || (sense[1] & 0x10)) {
2070		/* print SIM SRC from RefCode */
2071		dev_err(&device->cdev->dev, "SIM - SRC: "
2072			    "%02x%02x%02x%02x\n", sense[22],
2073			    sense[23], sense[11], sense[12]);
2074	} else if (sense[24] & DASD_SIM_LOG) {
2075		/* print SIM SRC Refcode */
2076		dev_warn(&device->cdev->dev, "log SIM - SRC: "
2077			    "%02x%02x%02x%02x\n", sense[22],
2078			    sense[23], sense[11], sense[12]);
2079	}
2080}
2081
2082/*
2083 * DASD_3990_ERP_INSPECT_32
2084 *
2085 * DESCRIPTION
2086 *   Does a detailed inspection of the 32 byte sense data
2087 *   and sets up a related error recovery action.
2088 *
2089 * PARAMETER
2090 *   sense		sense data of the actual error
2091 *   erp		pointer to the currently created default ERP
2092 *
2093 * RETURN VALUES
2094 *   erp_filled		pointer to the ERP
2095 *
2096 */
2097static struct dasd_ccw_req *
2098dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
2099{
2100
2101	struct dasd_device *device = erp->startdev;
2102
2103	erp->function = dasd_3990_erp_inspect_32;
2104
2105	/* check for SIM sense data */
2106	if ((sense[6] & DASD_SIM_SENSE) == DASD_SIM_SENSE)
2107		dasd_3990_erp_handle_sim(device, sense);
2108
2109	if (sense[25] & DASD_SENSE_BIT_0) {
2110
2111		/* compound program action codes (byte25 bit 0 == '1') */
2112		dasd_3990_erp_compound_retry(erp, sense);
2113
2114	} else {
2115
2116		/* single program action codes (byte25 bit 0 == '0') */
2117		switch (sense[25]) {
2118
2119		case 0x00:	/* success - use default ERP for retries */
2120			DBF_DEV_EVENT(DBF_DEBUG, device, "%s",
2121				    "ERP called for successful request"
2122				    " - just retry");
2123			break;
2124
2125		case 0x01:	/* fatal error */
2126			dev_err(&device->cdev->dev,
2127				    "ERP failed for the DASD\n");
2128
2129			erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2130			break;
2131
2132		case 0x02:	/* intervention required */
2133		case 0x03:	/* intervention required during dual copy */
2134			erp = dasd_3990_erp_int_req(erp);
2135			break;
2136
2137		case 0x0F:  /* length mismatch during update write command
2138			       internal error 08 - update write command error*/
2139			dev_err(&device->cdev->dev, "An error occurred in the "
2140				"DASD device driver, reason=%s\n", "08");
2141
2142			erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2143			break;
2144
2145		case 0x10:  /* logging required for other channel program */
2146			erp = dasd_3990_erp_action_10_32(erp, sense);
2147			break;
2148
2149		case 0x15:	/* next track outside defined extend
2150				   internal error 07 - The next track is not
2151				   within the defined storage extent */
2152			dev_err(&device->cdev->dev,
2153				"An error occurred in the DASD device driver, "
2154				"reason=%s\n", "07");
2155
2156			erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2157			break;
2158
2159		case 0x1B:	/* unexpected condition during write */
2160
2161			erp = dasd_3990_erp_action_1B_32(erp, sense);
2162			break;
2163
2164		case 0x1C:	/* invalid data */
2165			dev_emerg(&device->cdev->dev,
2166				    "Data recovered during retry with PCI "
2167				    "fetch mode active\n");
2168
2169			/* not possible to handle this situation in Linux */
2170			panic
2171			    ("Invalid data - No way to inform application "
2172			     "about the possibly incorrect data");
2173			break;
2174
2175		case 0x1D:	/* state-change pending */
2176			DBF_DEV_EVENT(DBF_WARNING, device, "%s",
2177				    "A State change pending condition exists "
2178				    "for the subsystem or device");
2179
2180			erp = dasd_3990_erp_action_4(erp, sense);
2181			break;
2182
2183		case 0x1E:	/* busy */
2184			DBF_DEV_EVENT(DBF_WARNING, device, "%s",
2185				    "Busy condition exists "
2186				    "for the subsystem or device");
2187                        erp = dasd_3990_erp_action_4(erp, sense);
2188			break;
2189
2190		default:	/* all others errors - default erp  */
2191			break;
2192		}
2193	}
2194
2195	return erp;
2196
2197}				/* end dasd_3990_erp_inspect_32 */
2198
2199/*
2200 *****************************************************************************
2201 * main ERP control functions (24 and 32 byte sense)
2202 *****************************************************************************
2203 */
2204
2205/*
2206 * DASD_3990_ERP_CONTROL_CHECK
2207 *
2208 * DESCRIPTION
2209 *   Does a generic inspection if a control check occurred and sets up
2210 *   the related error recovery procedure
2211 *
2212 * PARAMETER
2213 *   erp		pointer to the currently created default ERP
2214 *
2215 * RETURN VALUES
2216 *   erp_filled		pointer to the erp
2217 */
2218
2219static struct dasd_ccw_req *
2220dasd_3990_erp_control_check(struct dasd_ccw_req *erp)
2221{
2222	struct dasd_device *device = erp->startdev;
2223
2224	if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK
2225					   | SCHN_STAT_CHN_CTRL_CHK)) {
2226		DBF_DEV_EVENT(DBF_WARNING, device, "%s",
2227			    "channel or interface control check");
2228		erp = dasd_3990_erp_action_4(erp, NULL);
2229	}
2230	return erp;
2231}
2232
2233/*
2234 * DASD_3990_ERP_INSPECT
2235 *
2236 * DESCRIPTION
2237 *   Does a detailed inspection for sense data by calling either
2238 *   the 24-byte or the 32-byte inspection routine.
2239 *
2240 * PARAMETER
2241 *   erp		pointer to the currently created default ERP
2242 * RETURN VALUES
2243 *   erp_new		contens was possibly modified
2244 */
2245static struct dasd_ccw_req *
2246dasd_3990_erp_inspect(struct dasd_ccw_req *erp)
2247{
2248
2249	struct dasd_ccw_req *erp_new = NULL;
2250	char *sense;
2251
2252	/* if this problem occurred on an alias retry on base */
2253	erp_new = dasd_3990_erp_inspect_alias(erp);
2254	if (erp_new)
2255		return erp_new;
2256
2257	/* sense data are located in the refers record of the
2258	 * already set up new ERP !
2259	 * check if concurrent sens is available
2260	 */
2261	sense = dasd_get_sense(&erp->refers->irb);
2262	if (!sense)
2263		erp_new = dasd_3990_erp_control_check(erp);
2264	/* distinguish between 24 and 32 byte sense data */
2265	else if (sense[27] & DASD_SENSE_BIT_0) {
2266
2267		/* inspect the 24 byte sense data */
2268		erp_new = dasd_3990_erp_inspect_24(erp, sense);
2269
2270	} else {
2271
2272		/* inspect the 32 byte sense data */
2273		erp_new = dasd_3990_erp_inspect_32(erp, sense);
2274
2275	}	/* end distinguish between 24 and 32 byte sense data */
2276
2277	return erp_new;
2278}
2279
2280/*
2281 * DASD_3990_ERP_ADD_ERP
2282 *
2283 * DESCRIPTION
2284 *   This function adds an additional request block (ERP) to the head of
2285 *   the given cqr (or erp).
2286 *   For a command mode cqr the erp is initialized as an default erp
2287 *   (retry TIC).
2288 *   For transport mode we make a copy of the original TCW (points to
2289 *   the original TCCB, TIDALs, etc.) but give it a fresh
2290 *   TSB so the original sense data will not be changed.
2291 *
2292 * PARAMETER
2293 *   cqr		head of the current ERP-chain (or single cqr if
2294 *			first error)
2295 * RETURN VALUES
2296 *   erp		pointer to new ERP-chain head
2297 */
2298static struct dasd_ccw_req *dasd_3990_erp_add_erp(struct dasd_ccw_req *cqr)
2299{
2300
2301	struct dasd_device *device = cqr->startdev;
2302	struct ccw1 *ccw;
2303	struct dasd_ccw_req *erp;
2304	int cplength, datasize;
2305	struct tcw *tcw;
2306	struct tsb *tsb;
2307
2308	if (cqr->cpmode == 1) {
2309		cplength = 0;
2310		/* TCW needs to be 64 byte aligned, so leave enough room */
2311		datasize = 64 + sizeof(struct tcw) + sizeof(struct tsb);
2312	} else {
2313		cplength = 2;
2314		datasize = 0;
2315	}
2316
2317	/* allocate additional request block */
2318	erp = dasd_alloc_erp_request((char *) &cqr->magic,
2319				     cplength, datasize, device);
2320	if (IS_ERR(erp)) {
2321                if (cqr->retries <= 0) {
2322			DBF_DEV_EVENT(DBF_ERR, device, "%s",
2323				    "Unable to allocate ERP request");
2324			cqr->status = DASD_CQR_FAILED;
2325			cqr->stopclk = get_tod_clock();
2326		} else {
2327			DBF_DEV_EVENT(DBF_ERR, device,
2328                                     "Unable to allocate ERP request "
2329				     "(%i retries left)",
2330                                     cqr->retries);
2331			dasd_block_set_timer(device->block, (HZ << 3));
2332                }
2333		return erp;
2334	}
2335
2336	ccw = cqr->cpaddr;
2337	if (cqr->cpmode == 1) {
2338		/* make a shallow copy of the original tcw but set new tsb */
2339		erp->cpmode = 1;
2340		erp->cpaddr = PTR_ALIGN(erp->data, 64);
2341		tcw = erp->cpaddr;
2342		tsb = (struct tsb *) &tcw[1];
2343		*tcw = *((struct tcw *)cqr->cpaddr);
2344		tcw->tsb = (long)tsb;
2345	} else if (ccw->cmd_code == DASD_ECKD_CCW_PSF) {
2346		/* PSF cannot be chained from NOOP/TIC */
2347		erp->cpaddr = cqr->cpaddr;
2348	} else {
2349		/* initialize request with default TIC to current ERP/CQR */
2350		ccw = erp->cpaddr;
2351		ccw->cmd_code = CCW_CMD_NOOP;
2352		ccw->flags = CCW_FLAG_CC;
2353		ccw++;
2354		ccw->cmd_code = CCW_CMD_TIC;
2355		ccw->cda      = (long)(cqr->cpaddr);
2356	}
2357
2358	erp->flags = cqr->flags;
2359	erp->function = dasd_3990_erp_add_erp;
2360	erp->refers   = cqr;
2361	erp->startdev = device;
2362	erp->memdev   = device;
2363	erp->block    = cqr->block;
2364	erp->magic    = cqr->magic;
2365	erp->expires  = cqr->expires;
2366	erp->retries  = 256;
2367	erp->buildclk = get_tod_clock();
2368	erp->status = DASD_CQR_FILLED;
2369
2370	return erp;
2371}
2372
2373/*
2374 * DASD_3990_ERP_ADDITIONAL_ERP
2375 *
2376 * DESCRIPTION
2377 *   An additional ERP is needed to handle the current error.
2378 *   Add ERP to the head of the ERP-chain containing the ERP processing
2379 *   determined based on the sense data.
2380 *
2381 * PARAMETER
2382 *   cqr		head of the current ERP-chain (or single cqr if
2383 *			first error)
2384 *
2385 * RETURN VALUES
2386 *   erp		pointer to new ERP-chain head
2387 */
2388static struct dasd_ccw_req *
2389dasd_3990_erp_additional_erp(struct dasd_ccw_req * cqr)
2390{
2391
2392	struct dasd_ccw_req *erp = NULL;
2393
2394	/* add erp and initialize with default TIC */
2395	erp = dasd_3990_erp_add_erp(cqr);
2396
2397	if (IS_ERR(erp))
2398		return erp;
2399
2400	/* inspect sense, determine specific ERP if possible */
2401	if (erp != cqr) {
2402
2403		erp = dasd_3990_erp_inspect(erp);
2404	}
2405
2406	return erp;
2407
2408}				/* end dasd_3990_erp_additional_erp */
2409
2410/*
2411 * DASD_3990_ERP_ERROR_MATCH
2412 *
2413 * DESCRIPTION
2414 *   Check if the device status of the given cqr is the same.
2415 *   This means that the failed CCW and the relevant sense data
2416 *   must match.
2417 *   I don't distinguish between 24 and 32 byte sense because in case of
2418 *   24 byte sense byte 25 and 27 is set as well.
2419 *
2420 * PARAMETER
2421 *   cqr1		first cqr, which will be compared with the
2422 *   cqr2		second cqr.
2423 *
2424 * RETURN VALUES
2425 *   match		'boolean' for match found
2426 *			returns 1 if match found, otherwise 0.
2427 */
2428static int dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1,
2429				     struct dasd_ccw_req *cqr2)
2430{
2431	char *sense1, *sense2;
2432
2433	if (cqr1->startdev != cqr2->startdev)
2434		return 0;
2435
2436	sense1 = dasd_get_sense(&cqr1->irb);
2437	sense2 = dasd_get_sense(&cqr2->irb);
2438
2439	/* one request has sense data, the other not -> no match, return 0 */
2440	if (!sense1 != !sense2)
2441		return 0;
2442	/* no sense data in both cases -> check cstat for IFCC */
2443	if (!sense1 && !sense2)	{
2444		if ((scsw_cstat(&cqr1->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK |
2445						    SCHN_STAT_CHN_CTRL_CHK)) ==
2446		    (scsw_cstat(&cqr2->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK |
2447						    SCHN_STAT_CHN_CTRL_CHK)))
2448			return 1; /* match with ifcc*/
2449	}
2450	/* check sense data; byte 0-2,25,27 */
2451	if (!(sense1 && sense2 &&
2452	      (memcmp(sense1, sense2, 3) == 0) &&
2453	      (sense1[27] == sense2[27]) &&
2454	      (sense1[25] == sense2[25]))) {
2455
2456		return 0;	/* sense doesn't match */
2457	}
2458
2459	return 1;		/* match */
2460
2461}				/* end dasd_3990_erp_error_match */
2462
2463/*
2464 * DASD_3990_ERP_IN_ERP
2465 *
2466 * DESCRIPTION
2467 *   check if the current error already happened before.
2468 *   quick exit if current cqr is not an ERP (cqr->refers=NULL)
2469 *
2470 * PARAMETER
2471 *   cqr		failed cqr (either original cqr or already an erp)
2472 *
2473 * RETURN VALUES
2474 *   erp		erp-pointer to the already defined error
2475 *			recovery procedure OR
2476 *			NULL if a 'new' error occurred.
2477 */
2478static struct dasd_ccw_req *
2479dasd_3990_erp_in_erp(struct dasd_ccw_req *cqr)
2480{
2481
2482	struct dasd_ccw_req *erp_head = cqr,	/* save erp chain head */
2483	*erp_match = NULL;	/* save erp chain head */
2484	int match = 0;		/* 'boolean' for matching error found */
2485
2486	if (cqr->refers == NULL) {	/* return if not in erp */
2487		return NULL;
2488	}
2489
2490	/* check the erp/cqr chain for current error */
2491	do {
2492		match = dasd_3990_erp_error_match(erp_head, cqr->refers);
2493		erp_match = cqr;	/* save possible matching erp  */
2494		cqr = cqr->refers;	/* check next erp/cqr in queue */
2495
2496	} while ((cqr->refers != NULL) && (!match));
2497
2498	if (!match) {
2499		return NULL;	/* no match was found */
2500	}
2501
2502	return erp_match;	/* return address of matching erp */
2503
2504}				/* END dasd_3990_erp_in_erp */
2505
2506/*
2507 * DASD_3990_ERP_FURTHER_ERP (24 & 32 byte sense)
2508 *
2509 * DESCRIPTION
2510 *   No retry is left for the current ERP. Check what has to be done
2511 *   with the ERP.
2512 *     - do further defined ERP action or
2513 *     - wait for interrupt or
2514 *     - exit with permanent error
2515 *
2516 * PARAMETER
2517 *   erp		ERP which is in progress with no retry left
2518 *
2519 * RETURN VALUES
2520 *   erp		modified/additional ERP
2521 */
2522static struct dasd_ccw_req *
2523dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
2524{
2525
2526	struct dasd_device *device = erp->startdev;
2527	char *sense = dasd_get_sense(&erp->irb);
2528
2529	/* check for 24 byte sense ERP */
2530	if ((erp->function == dasd_3990_erp_bus_out) ||
2531	    (erp->function == dasd_3990_erp_action_1) ||
2532	    (erp->function == dasd_3990_erp_action_4)) {
2533
2534		erp = dasd_3990_erp_action_1(erp);
2535
2536	} else if (erp->function == dasd_3990_erp_action_1_sec) {
2537		erp = dasd_3990_erp_action_1_sec(erp);
2538	} else if (erp->function == dasd_3990_erp_action_5) {
2539
2540		/* retries have not been successful */
2541		/* prepare erp for retry on different channel path */
2542		erp = dasd_3990_erp_action_1(erp);
2543
2544		if (sense && !(sense[2] & DASD_SENSE_BIT_0)) {
2545
2546			/* issue a Diagnostic Control command with an
2547			 * Inhibit Write subcommand */
2548
2549			switch (sense[25]) {
2550			case 0x17:
2551			case 0x57:{	/* controller */
2552					erp = dasd_3990_erp_DCTL(erp, 0x20);
2553					break;
2554				}
2555			case 0x18:
2556			case 0x58:{	/* channel path */
2557					erp = dasd_3990_erp_DCTL(erp, 0x40);
2558					break;
2559				}
2560			case 0x19:
2561			case 0x59:{	/* storage director */
2562					erp = dasd_3990_erp_DCTL(erp, 0x80);
2563					break;
2564				}
2565			default:
2566				DBF_DEV_EVENT(DBF_WARNING, device,
2567					    "invalid subcommand modifier 0x%x "
2568					    "for Diagnostic Control Command",
2569					    sense[25]);
2570			}
2571		}
2572
2573		/* check for 32 byte sense ERP */
2574	} else if (sense &&
2575		   ((erp->function == dasd_3990_erp_compound_retry) ||
2576		    (erp->function == dasd_3990_erp_compound_path) ||
2577		    (erp->function == dasd_3990_erp_compound_code) ||
2578		    (erp->function == dasd_3990_erp_compound_config))) {
2579
2580		erp = dasd_3990_erp_compound(erp, sense);
2581
2582	} else {
2583		/*
2584		 * No retry left and no additional special handling
2585		 * necessary
2586		 */
2587		dev_err(&device->cdev->dev,
2588			"ERP %p has run out of retries and failed\n", erp);
2589
2590		erp->status = DASD_CQR_FAILED;
2591	}
2592
2593	return erp;
2594
2595}				/* end dasd_3990_erp_further_erp */
2596
2597/*
2598 * DASD_3990_ERP_HANDLE_MATCH_ERP
2599 *
2600 * DESCRIPTION
2601 *   An error occurred again and an ERP has been detected which is already
2602 *   used to handle this error (e.g. retries).
2603 *   All prior ERP's are asumed to be successful and therefore removed
2604 *   from queue.
2605 *   If retry counter of matching erp is already 0, it is checked if further
2606 *   action is needed (besides retry) or if the ERP has failed.
2607 *
2608 * PARAMETER
2609 *   erp_head		first ERP in ERP-chain
2610 *   erp		ERP that handles the actual error.
2611 *			(matching erp)
2612 *
2613 * RETURN VALUES
2614 *   erp		modified/additional ERP
2615 */
2616static struct dasd_ccw_req *
2617dasd_3990_erp_handle_match_erp(struct dasd_ccw_req *erp_head,
2618			       struct dasd_ccw_req *erp)
2619{
2620
2621	struct dasd_device *device = erp_head->startdev;
2622	struct dasd_ccw_req *erp_done = erp_head;	/* finished req */
2623	struct dasd_ccw_req *erp_free = NULL;	/* req to be freed */
2624
2625	/* loop over successful ERPs and remove them from chanq */
2626	while (erp_done != erp) {
2627
2628		if (erp_done == NULL)	/* end of chain reached */
2629			panic(PRINTK_HEADER "Programming error in ERP! The "
2630			      "original request was lost\n");
2631
2632		/* remove the request from the device queue */
2633		list_del(&erp_done->blocklist);
2634
2635		erp_free = erp_done;
2636		erp_done = erp_done->refers;
2637
2638		/* free the finished erp request */
2639		dasd_free_erp_request(erp_free, erp_free->memdev);
2640
2641	}			/* end while */
2642
2643	if (erp->retries > 0) {
2644
2645		char *sense = dasd_get_sense(&erp->refers->irb);
2646
2647		/* check for special retries */
2648		if (sense && erp->function == dasd_3990_erp_action_4) {
2649
2650			erp = dasd_3990_erp_action_4(erp, sense);
2651
2652		} else if (sense &&
2653			   erp->function == dasd_3990_erp_action_1B_32) {
2654
2655			erp = dasd_3990_update_1B(erp, sense);
2656
2657		} else if (sense && erp->function == dasd_3990_erp_int_req) {
2658
2659			erp = dasd_3990_erp_int_req(erp);
2660
2661		} else {
2662			/* simple retry	  */
2663			DBF_DEV_EVENT(DBF_DEBUG, device,
2664				    "%i retries left for erp %p",
2665				    erp->retries, erp);
2666
2667			/* handle the request again... */
2668			erp->status = DASD_CQR_FILLED;
2669		}
2670
2671	} else {
2672		/* no retry left - check for further necessary action	 */
2673		/* if no further actions, handle rest as permanent error */
2674		erp = dasd_3990_erp_further_erp(erp);
2675	}
2676
2677	return erp;
2678
2679}				/* end dasd_3990_erp_handle_match_erp */
2680
2681/*
2682 * DASD_3990_ERP_ACTION
2683 *
2684 * DESCRIPTION
2685 *   control routine for 3990 erp actions.
2686 *   Has to be called with the queue lock (namely the s390_irq_lock) acquired.
2687 *
2688 * PARAMETER
2689 *   cqr		failed cqr (either original cqr or already an erp)
2690 *
2691 * RETURN VALUES
2692 *   erp		erp-pointer to the head of the ERP action chain.
2693 *			This means:
2694 *			 - either a ptr to an additional ERP cqr or
2695 *			 - the original given cqr (which's status might
2696 *			   be modified)
2697 */
2698struct dasd_ccw_req *
2699dasd_3990_erp_action(struct dasd_ccw_req * cqr)
2700{
2701	struct dasd_ccw_req *erp = NULL;
2702	struct dasd_device *device = cqr->startdev;
2703	struct dasd_ccw_req *temp_erp = NULL;
2704
2705	if (device->features & DASD_FEATURE_ERPLOG) {
2706		/* print current erp_chain */
2707		dev_err(&device->cdev->dev,
2708			    "ERP chain at BEGINNING of ERP-ACTION\n");
2709		for (temp_erp = cqr;
2710		     temp_erp != NULL; temp_erp = temp_erp->refers) {
2711
2712			dev_err(&device->cdev->dev,
2713				    "ERP %p (%02x) refers to %p\n",
2714				    temp_erp, temp_erp->status,
2715				    temp_erp->refers);
2716		}
2717	}
2718
2719	/* double-check if current erp/cqr was successful */
2720	if ((scsw_cstat(&cqr->irb.scsw) == 0x00) &&
2721	    (scsw_dstat(&cqr->irb.scsw) ==
2722	     (DEV_STAT_CHN_END | DEV_STAT_DEV_END))) {
2723
2724		DBF_DEV_EVENT(DBF_DEBUG, device,
2725			    "ERP called for successful request %p"
2726			    " - NO ERP necessary", cqr);
2727
2728		cqr->status = DASD_CQR_DONE;
2729
2730		return cqr;
2731	}
2732
2733	/* check if error happened before */
2734	erp = dasd_3990_erp_in_erp(cqr);
2735
2736	if (erp == NULL) {
2737		/* no matching erp found - set up erp */
2738		erp = dasd_3990_erp_additional_erp(cqr);
2739		if (IS_ERR(erp))
2740			return erp;
2741	} else {
2742		/* matching erp found - set all leading erp's to DONE */
2743		erp = dasd_3990_erp_handle_match_erp(cqr, erp);
2744	}
2745
2746	if (device->features & DASD_FEATURE_ERPLOG) {
2747		/* print current erp_chain */
2748		dev_err(&device->cdev->dev,
2749			    "ERP chain at END of ERP-ACTION\n");
2750		for (temp_erp = erp;
2751		     temp_erp != NULL; temp_erp = temp_erp->refers) {
2752
2753			dev_err(&device->cdev->dev,
2754				    "ERP %p (%02x) refers to %p\n",
2755				    temp_erp, temp_erp->status,
2756				    temp_erp->refers);
2757		}
2758	}
2759
2760	/* enqueue ERP request if it's a new one */
2761	if (list_empty(&erp->blocklist)) {
2762		cqr->status = DASD_CQR_IN_ERP;
2763		/* add erp request before the cqr */
2764		list_add_tail(&erp->blocklist, &cqr->blocklist);
2765	}
2766
2767
2768
2769	return erp;
2770
2771}				/* end dasd_3990_erp_action */
2772