xref: /openbmc/linux/drivers/s390/char/tape_core.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1 /*
2  *  drivers/s390/char/tape_core.c
3  *    basic function of the tape device driver
4  *
5  *  S390 and zSeries version
6  *    Copyright (C) 2001,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
7  *    Author(s): Carsten Otte <cotte@de.ibm.com>
8  *		 Michael Holzheu <holzheu@de.ibm.com>
9  *		 Tuan Ngo-Anh <ngoanh@de.ibm.com>
10  *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
11  */
12 
13 #include <linux/config.h>
14 #include <linux/module.h>
15 #include <linux/init.h>	     // for kernel parameters
16 #include <linux/kmod.h>	     // for requesting modules
17 #include <linux/spinlock.h>  // for locks
18 #include <linux/vmalloc.h>
19 #include <linux/list.h>
20 
21 #include <asm/types.h>	     // for variable types
22 
23 #define TAPE_DBF_AREA	tape_core_dbf
24 
25 #include "tape.h"
26 #include "tape_std.h"
27 
28 #define PRINTK_HEADER "TAPE_CORE: "
29 
30 static void __tape_do_irq (struct ccw_device *, unsigned long, struct irb *);
31 static void __tape_remove_request(struct tape_device *, struct tape_request *);
32 
33 /*
34  * One list to contain all tape devices of all disciplines, so
35  * we can assign the devices to minor numbers of the same major
36  * The list is protected by the rwlock
37  */
38 static struct list_head tape_device_list = LIST_HEAD_INIT(tape_device_list);
39 static DEFINE_RWLOCK(tape_device_lock);
40 
41 /*
42  * Pointer to debug area.
43  */
44 debug_info_t *TAPE_DBF_AREA = NULL;
45 EXPORT_SYMBOL(TAPE_DBF_AREA);
46 
47 /*
48  * Printable strings for tape enumerations.
49  */
50 const char *tape_state_verbose[TS_SIZE] =
51 {
52 	[TS_UNUSED]   = "UNUSED",
53 	[TS_IN_USE]   = "IN_USE",
54 	[TS_BLKUSE]   = "BLKUSE",
55 	[TS_INIT]     = "INIT  ",
56 	[TS_NOT_OPER] = "NOT_OP"
57 };
58 
59 const char *tape_op_verbose[TO_SIZE] =
60 {
61 	[TO_BLOCK] = "BLK",	[TO_BSB] = "BSB",
62 	[TO_BSF] = "BSF",	[TO_DSE] = "DSE",
63 	[TO_FSB] = "FSB",	[TO_FSF] = "FSF",
64 	[TO_LBL] = "LBL",	[TO_NOP] = "NOP",
65 	[TO_RBA] = "RBA",	[TO_RBI] = "RBI",
66 	[TO_RFO] = "RFO",	[TO_REW] = "REW",
67 	[TO_RUN] = "RUN",	[TO_WRI] = "WRI",
68 	[TO_WTM] = "WTM",	[TO_MSEN] = "MSN",
69 	[TO_LOAD] = "LOA",	[TO_READ_CONFIG] = "RCF",
70 	[TO_READ_ATTMSG] = "RAT",
71 	[TO_DIS] = "DIS",	[TO_ASSIGN] = "ASS",
72 	[TO_UNASSIGN] = "UAS"
73 };
74 
75 static inline int
76 busid_to_int(char *bus_id)
77 {
78 	int	dec;
79 	int	d;
80 	char *	s;
81 
82 	for(s = bus_id, d = 0; *s != '\0' && *s != '.'; s++)
83 		d = (d * 10) + (*s - '0');
84 	dec = d;
85 	for(s++, d = 0; *s != '\0' && *s != '.'; s++)
86 		d = (d * 10) + (*s - '0');
87 	dec = (dec << 8) + d;
88 
89 	for(s++; *s != '\0'; s++) {
90 		if (*s >= '0' && *s <= '9') {
91 			d = *s - '0';
92 		} else if (*s >= 'a' && *s <= 'f') {
93 			d = *s - 'a' + 10;
94 		} else {
95 			d = *s - 'A' + 10;
96 		}
97 		dec = (dec << 4) + d;
98 	}
99 
100 	return dec;
101 }
102 
103 /*
104  * Some channel attached tape specific attributes.
105  *
106  * FIXME: In the future the first_minor and blocksize attribute should be
107  *        replaced by a link to the cdev tree.
108  */
109 static ssize_t
110 tape_medium_state_show(struct device *dev, char *buf)
111 {
112 	struct tape_device *tdev;
113 
114 	tdev = (struct tape_device *) dev->driver_data;
115 	return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->medium_state);
116 }
117 
118 static
119 DEVICE_ATTR(medium_state, 0444, tape_medium_state_show, NULL);
120 
121 static ssize_t
122 tape_first_minor_show(struct device *dev, char *buf)
123 {
124 	struct tape_device *tdev;
125 
126 	tdev = (struct tape_device *) dev->driver_data;
127 	return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->first_minor);
128 }
129 
130 static
131 DEVICE_ATTR(first_minor, 0444, tape_first_minor_show, NULL);
132 
133 static ssize_t
134 tape_state_show(struct device *dev, char *buf)
135 {
136 	struct tape_device *tdev;
137 
138 	tdev = (struct tape_device *) dev->driver_data;
139 	return scnprintf(buf, PAGE_SIZE, "%s\n", (tdev->first_minor < 0) ?
140 		"OFFLINE" : tape_state_verbose[tdev->tape_state]);
141 }
142 
143 static
144 DEVICE_ATTR(state, 0444, tape_state_show, NULL);
145 
146 static ssize_t
147 tape_operation_show(struct device *dev, char *buf)
148 {
149 	struct tape_device *tdev;
150 	ssize_t rc;
151 
152 	tdev = (struct tape_device *) dev->driver_data;
153 	if (tdev->first_minor < 0)
154 		return scnprintf(buf, PAGE_SIZE, "N/A\n");
155 
156 	spin_lock_irq(get_ccwdev_lock(tdev->cdev));
157 	if (list_empty(&tdev->req_queue))
158 		rc = scnprintf(buf, PAGE_SIZE, "---\n");
159 	else {
160 		struct tape_request *req;
161 
162 		req = list_entry(tdev->req_queue.next, struct tape_request,
163 			list);
164 		rc = scnprintf(buf,PAGE_SIZE, "%s\n", tape_op_verbose[req->op]);
165 	}
166 	spin_unlock_irq(get_ccwdev_lock(tdev->cdev));
167 	return rc;
168 }
169 
170 static
171 DEVICE_ATTR(operation, 0444, tape_operation_show, NULL);
172 
173 static ssize_t
174 tape_blocksize_show(struct device *dev, char *buf)
175 {
176 	struct tape_device *tdev;
177 
178 	tdev = (struct tape_device *) dev->driver_data;
179 
180 	return scnprintf(buf, PAGE_SIZE, "%i\n", tdev->char_data.block_size);
181 }
182 
183 static
184 DEVICE_ATTR(blocksize, 0444, tape_blocksize_show, NULL);
185 
186 static struct attribute *tape_attrs[] = {
187 	&dev_attr_medium_state.attr,
188 	&dev_attr_first_minor.attr,
189 	&dev_attr_state.attr,
190 	&dev_attr_operation.attr,
191 	&dev_attr_blocksize.attr,
192 	NULL
193 };
194 
195 static struct attribute_group tape_attr_group = {
196 	.attrs = tape_attrs,
197 };
198 
199 /*
200  * Tape state functions
201  */
202 void
203 tape_state_set(struct tape_device *device, enum tape_state newstate)
204 {
205 	const char *str;
206 
207 	if (device->tape_state == TS_NOT_OPER) {
208 		DBF_EVENT(3, "ts_set err: not oper\n");
209 		return;
210 	}
211 	DBF_EVENT(4, "ts. dev:	%x\n", device->first_minor);
212 	if (device->tape_state < TO_SIZE && device->tape_state >= 0)
213 		str = tape_state_verbose[device->tape_state];
214 	else
215 		str = "UNKNOWN TS";
216 	DBF_EVENT(4, "old ts:	%s\n", str);
217 	if (device->tape_state < TO_SIZE && device->tape_state >=0 )
218 		str = tape_state_verbose[device->tape_state];
219 	else
220 		str = "UNKNOWN TS";
221 	DBF_EVENT(4, "%s\n", str);
222 	DBF_EVENT(4, "new ts:\t\n");
223 	if (newstate < TO_SIZE && newstate >= 0)
224 		str = tape_state_verbose[newstate];
225 	else
226 		str = "UNKNOWN TS";
227 	DBF_EVENT(4, "%s\n", str);
228 	device->tape_state = newstate;
229 	wake_up(&device->state_change_wq);
230 }
231 
232 void
233 tape_med_state_set(struct tape_device *device, enum tape_medium_state newstate)
234 {
235 	if (device->medium_state == newstate)
236 		return;
237 	switch(newstate){
238 	case MS_UNLOADED:
239 		device->tape_generic_status |= GMT_DR_OPEN(~0);
240 		PRINT_INFO("(%s): Tape is unloaded\n",
241 			   device->cdev->dev.bus_id);
242 		break;
243 	case MS_LOADED:
244 		device->tape_generic_status &= ~GMT_DR_OPEN(~0);
245 		PRINT_INFO("(%s): Tape has been mounted\n",
246 			   device->cdev->dev.bus_id);
247 		break;
248 	default:
249 		// print nothing
250 		break;
251 	}
252 	device->medium_state = newstate;
253 	wake_up(&device->state_change_wq);
254 }
255 
256 /*
257  * Stop running ccw. Has to be called with the device lock held.
258  */
259 static inline int
260 __tape_halt_io(struct tape_device *device, struct tape_request *request)
261 {
262 	int retries;
263 	int rc;
264 
265 	/* Check if interrupt has already been processed */
266 	if (request->callback == NULL)
267 		return 0;
268 
269 	rc = 0;
270 	for (retries = 0; retries < 5; retries++) {
271 		rc = ccw_device_clear(device->cdev, (long) request);
272 
273 		if (rc == 0) {                     /* Termination successful */
274 			request->rc     = -EIO;
275 			request->status = TAPE_REQUEST_DONE;
276 			return 0;
277 		}
278 
279 		if (rc == -ENODEV)
280 			DBF_EXCEPTION(2, "device gone, retry\n");
281 		else if (rc == -EIO)
282 			DBF_EXCEPTION(2, "I/O error, retry\n");
283 		else if (rc == -EBUSY)
284 			DBF_EXCEPTION(2, "device busy, retry late\n");
285 		else
286 			BUG();
287 	}
288 
289 	return rc;
290 }
291 
292 /*
293  * Add device into the sorted list, giving it the first
294  * available minor number.
295  */
296 static int
297 tape_assign_minor(struct tape_device *device)
298 {
299 	struct tape_device *tmp;
300 	int minor;
301 
302 	minor = 0;
303 	write_lock(&tape_device_lock);
304 	list_for_each_entry(tmp, &tape_device_list, node) {
305 		if (minor < tmp->first_minor)
306 			break;
307 		minor += TAPE_MINORS_PER_DEV;
308 	}
309 	if (minor >= 256) {
310 		write_unlock(&tape_device_lock);
311 		return -ENODEV;
312 	}
313 	device->first_minor = minor;
314 	list_add_tail(&device->node, &tmp->node);
315 	write_unlock(&tape_device_lock);
316 	return 0;
317 }
318 
319 /* remove device from the list */
320 static void
321 tape_remove_minor(struct tape_device *device)
322 {
323 	write_lock(&tape_device_lock);
324 	list_del_init(&device->node);
325 	device->first_minor = -1;
326 	write_unlock(&tape_device_lock);
327 }
328 
329 /*
330  * Set a device online.
331  *
332  * This function is called by the common I/O layer to move a device from the
333  * detected but offline into the online state.
334  * If we return an error (RC < 0) the device remains in the offline state. This
335  * can happen if the device is assigned somewhere else, for example.
336  */
337 int
338 tape_generic_online(struct tape_device *device,
339 		   struct tape_discipline *discipline)
340 {
341 	int rc;
342 
343 	DBF_LH(6, "tape_enable_device(%p, %p)\n", device, discipline);
344 
345 	if (device->tape_state != TS_INIT) {
346 		DBF_LH(3, "Tapestate not INIT (%d)\n", device->tape_state);
347 		return -EINVAL;
348 	}
349 
350 	/* Let the discipline have a go at the device. */
351 	device->discipline = discipline;
352 	if (!try_module_get(discipline->owner)) {
353 		PRINT_ERR("Cannot get module. Module gone.\n");
354 		return -EINVAL;
355 	}
356 
357 	rc = discipline->setup_device(device);
358 	if (rc)
359 		goto out;
360 	rc = tape_assign_minor(device);
361 	if (rc)
362 		goto out_discipline;
363 
364 	rc = tapechar_setup_device(device);
365 	if (rc)
366 		goto out_minor;
367 	rc = tapeblock_setup_device(device);
368 	if (rc)
369 		goto out_char;
370 
371 	tape_state_set(device, TS_UNUSED);
372 
373 	DBF_LH(3, "(%08x): Drive set online\n", device->cdev_id);
374 
375 	return 0;
376 
377 out_char:
378 	tapechar_cleanup_device(device);
379 out_discipline:
380 	device->discipline->cleanup_device(device);
381 	device->discipline = NULL;
382 out_minor:
383 	tape_remove_minor(device);
384 out:
385 	module_put(discipline->owner);
386 	return rc;
387 }
388 
389 static inline void
390 tape_cleanup_device(struct tape_device *device)
391 {
392 	tapeblock_cleanup_device(device);
393 	tapechar_cleanup_device(device);
394 	device->discipline->cleanup_device(device);
395 	module_put(device->discipline->owner);
396 	tape_remove_minor(device);
397 	tape_med_state_set(device, MS_UNKNOWN);
398 }
399 
400 /*
401  * Set device offline.
402  *
403  * Called by the common I/O layer if the drive should set offline on user
404  * request. We may prevent this by returning an error.
405  * Manual offline is only allowed while the drive is not in use.
406  */
407 int
408 tape_generic_offline(struct tape_device *device)
409 {
410 	if (!device) {
411 		PRINT_ERR("tape_generic_offline: no such device\n");
412 		return -ENODEV;
413 	}
414 
415 	DBF_LH(3, "(%08x): tape_generic_offline(%p)\n",
416 		device->cdev_id, device);
417 
418 	spin_lock_irq(get_ccwdev_lock(device->cdev));
419 	switch (device->tape_state) {
420 		case TS_INIT:
421 		case TS_NOT_OPER:
422 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
423 			break;
424 		case TS_UNUSED:
425 			tape_state_set(device, TS_INIT);
426 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
427 			tape_cleanup_device(device);
428 			break;
429 		default:
430 			DBF_EVENT(3, "(%08x): Set offline failed "
431 				"- drive in use.\n",
432 				device->cdev_id);
433 			PRINT_WARN("(%s): Set offline failed "
434 				"- drive in use.\n",
435 				device->cdev->dev.bus_id);
436 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
437 			return -EBUSY;
438 	}
439 
440 	DBF_LH(3, "(%08x): Drive set offline.\n", device->cdev_id);
441 	return 0;
442 }
443 
444 /*
445  * Allocate memory for a new device structure.
446  */
447 static struct tape_device *
448 tape_alloc_device(void)
449 {
450 	struct tape_device *device;
451 
452 	device = (struct tape_device *)
453 		kmalloc(sizeof(struct tape_device), GFP_KERNEL);
454 	if (device == NULL) {
455 		DBF_EXCEPTION(2, "ti:no mem\n");
456 		PRINT_INFO ("can't allocate memory for "
457 			    "tape info structure\n");
458 		return ERR_PTR(-ENOMEM);
459 	}
460 	memset(device, 0, sizeof(struct tape_device));
461 	device->modeset_byte = (char *) kmalloc(1, GFP_KERNEL | GFP_DMA);
462 	if (device->modeset_byte == NULL) {
463 		DBF_EXCEPTION(2, "ti:no mem\n");
464 		PRINT_INFO("can't allocate memory for modeset byte\n");
465 		kfree(device);
466 		return ERR_PTR(-ENOMEM);
467 	}
468 	INIT_LIST_HEAD(&device->req_queue);
469 	INIT_LIST_HEAD(&device->node);
470 	init_waitqueue_head(&device->state_change_wq);
471 	device->tape_state = TS_INIT;
472 	device->medium_state = MS_UNKNOWN;
473 	*device->modeset_byte = 0;
474 	device->first_minor = -1;
475 	atomic_set(&device->ref_count, 1);
476 
477 	return device;
478 }
479 
480 /*
481  * Get a reference to an existing device structure. This will automatically
482  * increment the reference count.
483  */
484 struct tape_device *
485 tape_get_device_reference(struct tape_device *device)
486 {
487 	DBF_EVENT(4, "tape_get_device_reference(%p) = %i\n", device,
488 		atomic_inc_return(&device->ref_count));
489 
490 	return device;
491 }
492 
493 /*
494  * Decrease the reference counter of a devices structure. If the
495  * reference counter reaches zero free the device structure.
496  * The function returns a NULL pointer to be used by the caller
497  * for clearing reference pointers.
498  */
499 struct tape_device *
500 tape_put_device(struct tape_device *device)
501 {
502 	int remain;
503 
504 	remain = atomic_dec_return(&device->ref_count);
505 	if (remain > 0) {
506 		DBF_EVENT(4, "tape_put_device(%p) -> %i\n", device, remain);
507 	} else {
508 		if (remain < 0) {
509 			DBF_EVENT(4, "put device without reference\n");
510 			PRINT_ERR("put device without reference\n");
511 		} else {
512 			DBF_EVENT(4, "tape_free_device(%p)\n", device);
513 			kfree(device->modeset_byte);
514 			kfree(device);
515 		}
516 	}
517 
518 	return NULL;
519 }
520 
521 /*
522  * Find tape device by a device index.
523  */
524 struct tape_device *
525 tape_get_device(int devindex)
526 {
527 	struct tape_device *device, *tmp;
528 
529 	device = ERR_PTR(-ENODEV);
530 	read_lock(&tape_device_lock);
531 	list_for_each_entry(tmp, &tape_device_list, node) {
532 		if (tmp->first_minor / TAPE_MINORS_PER_DEV == devindex) {
533 			device = tape_get_device_reference(tmp);
534 			break;
535 		}
536 	}
537 	read_unlock(&tape_device_lock);
538 	return device;
539 }
540 
541 /*
542  * Driverfs tape probe function.
543  */
544 int
545 tape_generic_probe(struct ccw_device *cdev)
546 {
547 	struct tape_device *device;
548 
549 	device = tape_alloc_device();
550 	if (IS_ERR(device))
551 		return -ENODEV;
552 	PRINT_INFO("tape device %s found\n", cdev->dev.bus_id);
553 	cdev->dev.driver_data = device;
554 	device->cdev = cdev;
555 	device->cdev_id = busid_to_int(cdev->dev.bus_id);
556 	cdev->handler = __tape_do_irq;
557 
558 	ccw_device_set_options(cdev, CCWDEV_DO_PATHGROUP);
559 	sysfs_create_group(&cdev->dev.kobj, &tape_attr_group);
560 
561 	return 0;
562 }
563 
564 static inline void
565 __tape_discard_requests(struct tape_device *device)
566 {
567 	struct tape_request *	request;
568 	struct list_head *	l, *n;
569 
570 	list_for_each_safe(l, n, &device->req_queue) {
571 		request = list_entry(l, struct tape_request, list);
572 		if (request->status == TAPE_REQUEST_IN_IO)
573 			request->status = TAPE_REQUEST_DONE;
574 		list_del(&request->list);
575 
576 		/* Decrease ref_count for removed request. */
577 		request->device = tape_put_device(device);
578 		request->rc = -EIO;
579 		if (request->callback != NULL)
580 			request->callback(request, request->callback_data);
581 	}
582 }
583 
584 /*
585  * Driverfs tape remove function.
586  *
587  * This function is called whenever the common I/O layer detects the device
588  * gone. This can happen at any time and we cannot refuse.
589  */
590 void
591 tape_generic_remove(struct ccw_device *cdev)
592 {
593 	struct tape_device *	device;
594 
595 	device = cdev->dev.driver_data;
596 	if (!device) {
597 		PRINT_ERR("No device pointer in tape_generic_remove!\n");
598 		return;
599 	}
600 	DBF_LH(3, "(%08x): tape_generic_remove(%p)\n", device->cdev_id, cdev);
601 
602 	spin_lock_irq(get_ccwdev_lock(device->cdev));
603 	switch (device->tape_state) {
604 		case TS_INIT:
605 			tape_state_set(device, TS_NOT_OPER);
606 		case TS_NOT_OPER:
607 			/*
608 			 * Nothing to do.
609 			 */
610 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
611 			break;
612 		case TS_UNUSED:
613 			/*
614 			 * Need only to release the device.
615 			 */
616 			tape_state_set(device, TS_NOT_OPER);
617 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
618 			tape_cleanup_device(device);
619 			break;
620 		default:
621 			/*
622 			 * There may be requests on the queue. We will not get
623 			 * an interrupt for a request that was running. So we
624 			 * just post them all as I/O errors.
625 			 */
626 			DBF_EVENT(3, "(%08x): Drive in use vanished!\n",
627 				device->cdev_id);
628 			PRINT_WARN("(%s): Drive in use vanished - "
629 				"expect trouble!\n",
630 				device->cdev->dev.bus_id);
631 			PRINT_WARN("State was %i\n", device->tape_state);
632 			tape_state_set(device, TS_NOT_OPER);
633 			__tape_discard_requests(device);
634 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
635 			tape_cleanup_device(device);
636 	}
637 
638 	if (cdev->dev.driver_data != NULL) {
639 		sysfs_remove_group(&cdev->dev.kobj, &tape_attr_group);
640 		cdev->dev.driver_data = tape_put_device(cdev->dev.driver_data);
641 	}
642 }
643 
644 /*
645  * Allocate a new tape ccw request
646  */
647 struct tape_request *
648 tape_alloc_request(int cplength, int datasize)
649 {
650 	struct tape_request *request;
651 
652 	if (datasize > PAGE_SIZE || (cplength*sizeof(struct ccw1)) > PAGE_SIZE)
653 		BUG();
654 
655 	DBF_LH(6, "tape_alloc_request(%d, %d)\n", cplength, datasize);
656 
657 	request = (struct tape_request *) kmalloc(sizeof(struct tape_request),
658 						  GFP_KERNEL);
659 	if (request == NULL) {
660 		DBF_EXCEPTION(1, "cqra nomem\n");
661 		return ERR_PTR(-ENOMEM);
662 	}
663 	memset(request, 0, sizeof(struct tape_request));
664 	/* allocate channel program */
665 	if (cplength > 0) {
666 		request->cpaddr = kmalloc(cplength*sizeof(struct ccw1),
667 					  GFP_ATOMIC | GFP_DMA);
668 		if (request->cpaddr == NULL) {
669 			DBF_EXCEPTION(1, "cqra nomem\n");
670 			kfree(request);
671 			return ERR_PTR(-ENOMEM);
672 		}
673 		memset(request->cpaddr, 0, cplength*sizeof(struct ccw1));
674 	}
675 	/* alloc small kernel buffer */
676 	if (datasize > 0) {
677 		request->cpdata = kmalloc(datasize, GFP_KERNEL | GFP_DMA);
678 		if (request->cpdata == NULL) {
679 			DBF_EXCEPTION(1, "cqra nomem\n");
680 			if (request->cpaddr != NULL)
681 				kfree(request->cpaddr);
682 			kfree(request);
683 			return ERR_PTR(-ENOMEM);
684 		}
685 		memset(request->cpdata, 0, datasize);
686 	}
687 	DBF_LH(6, "New request %p(%p/%p)\n", request, request->cpaddr,
688 		request->cpdata);
689 
690 	return request;
691 }
692 
693 /*
694  * Free tape ccw request
695  */
696 void
697 tape_free_request (struct tape_request * request)
698 {
699 	DBF_LH(6, "Free request %p\n", request);
700 
701 	if (request->device != NULL) {
702 		request->device = tape_put_device(request->device);
703 	}
704 	if (request->cpdata != NULL)
705 		kfree(request->cpdata);
706 	if (request->cpaddr != NULL)
707 		kfree(request->cpaddr);
708 	kfree(request);
709 }
710 
711 static inline void
712 __tape_do_io_list(struct tape_device *device)
713 {
714 	struct list_head *l, *n;
715 	struct tape_request *request;
716 	int rc;
717 
718 	DBF_LH(6, "__tape_do_io_list(%p)\n", device);
719 	/*
720 	 * Try to start each request on request queue until one is
721 	 * started successful.
722 	 */
723 	list_for_each_safe(l, n, &device->req_queue) {
724 		request = list_entry(l, struct tape_request, list);
725 #ifdef CONFIG_S390_TAPE_BLOCK
726 		if (request->op == TO_BLOCK)
727 			device->discipline->check_locate(device, request);
728 #endif
729 		rc = ccw_device_start(device->cdev, request->cpaddr,
730 				      (unsigned long) request, 0x00,
731 				      request->options);
732 		if (rc == 0) {
733 			request->status = TAPE_REQUEST_IN_IO;
734 			break;
735 		}
736 		/* Start failed. Remove request and indicate failure. */
737 		DBF_EVENT(1, "tape: DOIO failed with er = %i\n", rc);
738 
739 		/* Set ending status and do callback. */
740 		request->rc = rc;
741 		request->status = TAPE_REQUEST_DONE;
742 		__tape_remove_request(device, request);
743 	}
744 }
745 
746 static void
747 __tape_remove_request(struct tape_device *device, struct tape_request *request)
748 {
749 	/* Remove from request queue. */
750 	list_del(&request->list);
751 
752 	/* Do callback. */
753 	if (request->callback != NULL)
754 		request->callback(request, request->callback_data);
755 
756 	/* Start next request. */
757 	if (!list_empty(&device->req_queue))
758 		__tape_do_io_list(device);
759 }
760 
761 /*
762  * Write sense data to console/dbf
763  */
764 void
765 tape_dump_sense(struct tape_device* device, struct tape_request *request,
766 		struct irb *irb)
767 {
768 	unsigned int *sptr;
769 
770 	PRINT_INFO("-------------------------------------------------\n");
771 	PRINT_INFO("DSTAT : %02x  CSTAT: %02x	CPA: %04x\n",
772 		   irb->scsw.dstat, irb->scsw.cstat, irb->scsw.cpa);
773 	PRINT_INFO("DEVICE: %s\n", device->cdev->dev.bus_id);
774 	if (request != NULL)
775 		PRINT_INFO("OP	  : %s\n", tape_op_verbose[request->op]);
776 
777 	sptr = (unsigned int *) irb->ecw;
778 	PRINT_INFO("Sense data: %08X %08X %08X %08X \n",
779 		   sptr[0], sptr[1], sptr[2], sptr[3]);
780 	PRINT_INFO("Sense data: %08X %08X %08X %08X \n",
781 		   sptr[4], sptr[5], sptr[6], sptr[7]);
782 	PRINT_INFO("--------------------------------------------------\n");
783 }
784 
785 /*
786  * Write sense data to dbf
787  */
788 void
789 tape_dump_sense_dbf(struct tape_device *device, struct tape_request *request,
790 		    struct irb *irb)
791 {
792 	unsigned int *sptr;
793 	const char* op;
794 
795 	if (request != NULL)
796 		op = tape_op_verbose[request->op];
797 	else
798 		op = "---";
799 	DBF_EVENT(3, "DSTAT : %02x   CSTAT: %02x\n",
800 		  irb->scsw.dstat,irb->scsw.cstat);
801 	DBF_EVENT(3, "DEVICE: %08x OP\t: %s\n", device->cdev_id, op);
802 	sptr = (unsigned int *) irb->ecw;
803 	DBF_EVENT(3, "%08x %08x\n", sptr[0], sptr[1]);
804 	DBF_EVENT(3, "%08x %08x\n", sptr[2], sptr[3]);
805 	DBF_EVENT(3, "%08x %08x\n", sptr[4], sptr[5]);
806 	DBF_EVENT(3, "%08x %08x\n", sptr[6], sptr[7]);
807 }
808 
809 /*
810  * I/O helper function. Adds the request to the request queue
811  * and starts it if the tape is idle. Has to be called with
812  * the device lock held.
813  */
814 static inline int
815 __tape_do_io(struct tape_device *device, struct tape_request *request)
816 {
817 	int rc;
818 
819 	switch (request->op) {
820 		case TO_MSEN:
821 		case TO_ASSIGN:
822 		case TO_UNASSIGN:
823 		case TO_READ_ATTMSG:
824 			if (device->tape_state == TS_INIT)
825 				break;
826 			if (device->tape_state == TS_UNUSED)
827 				break;
828 		default:
829 			if (device->tape_state == TS_BLKUSE)
830 				break;
831 			if (device->tape_state != TS_IN_USE)
832 				return -ENODEV;
833 	}
834 
835 	/* Increase use count of device for the added request. */
836 	request->device = tape_get_device_reference(device);
837 
838 	if (list_empty(&device->req_queue)) {
839 		/* No other requests are on the queue. Start this one. */
840 #ifdef CONFIG_S390_TAPE_BLOCK
841 		if (request->op == TO_BLOCK)
842 			device->discipline->check_locate(device, request);
843 #endif
844 		rc = ccw_device_start(device->cdev, request->cpaddr,
845 				      (unsigned long) request, 0x00,
846 				      request->options);
847 		if (rc) {
848 			DBF_EVENT(1, "tape: DOIO failed with rc = %i\n", rc);
849 			return rc;
850 		}
851 		DBF_LH(5, "Request %p added for execution.\n", request);
852 		list_add(&request->list, &device->req_queue);
853 		request->status = TAPE_REQUEST_IN_IO;
854 	} else {
855 		DBF_LH(5, "Request %p add to queue.\n", request);
856 		list_add_tail(&request->list, &device->req_queue);
857 		request->status = TAPE_REQUEST_QUEUED;
858 	}
859 	return 0;
860 }
861 
862 /*
863  * Add the request to the request queue, try to start it if the
864  * tape is idle. Return without waiting for end of i/o.
865  */
866 int
867 tape_do_io_async(struct tape_device *device, struct tape_request *request)
868 {
869 	int rc;
870 
871 	DBF_LH(6, "tape_do_io_async(%p, %p)\n", device, request);
872 
873 	spin_lock_irq(get_ccwdev_lock(device->cdev));
874 	/* Add request to request queue and try to start it. */
875 	rc = __tape_do_io(device, request);
876 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
877 	return rc;
878 }
879 
880 /*
881  * tape_do_io/__tape_wake_up
882  * Add the request to the request queue, try to start it if the
883  * tape is idle and wait uninterruptible for its completion.
884  */
885 static void
886 __tape_wake_up(struct tape_request *request, void *data)
887 {
888 	request->callback = NULL;
889 	wake_up((wait_queue_head_t *) data);
890 }
891 
892 int
893 tape_do_io(struct tape_device *device, struct tape_request *request)
894 {
895 	wait_queue_head_t wq;
896 	int rc;
897 
898 	init_waitqueue_head(&wq);
899 	spin_lock_irq(get_ccwdev_lock(device->cdev));
900 	/* Setup callback */
901 	request->callback = __tape_wake_up;
902 	request->callback_data = &wq;
903 	/* Add request to request queue and try to start it. */
904 	rc = __tape_do_io(device, request);
905 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
906 	if (rc)
907 		return rc;
908 	/* Request added to the queue. Wait for its completion. */
909 	wait_event(wq, (request->callback == NULL));
910 	/* Get rc from request */
911 	return request->rc;
912 }
913 
914 /*
915  * tape_do_io_interruptible/__tape_wake_up_interruptible
916  * Add the request to the request queue, try to start it if the
917  * tape is idle and wait uninterruptible for its completion.
918  */
919 static void
920 __tape_wake_up_interruptible(struct tape_request *request, void *data)
921 {
922 	request->callback = NULL;
923 	wake_up_interruptible((wait_queue_head_t *) data);
924 }
925 
926 int
927 tape_do_io_interruptible(struct tape_device *device,
928 			 struct tape_request *request)
929 {
930 	wait_queue_head_t wq;
931 	int rc;
932 
933 	init_waitqueue_head(&wq);
934 	spin_lock_irq(get_ccwdev_lock(device->cdev));
935 	/* Setup callback */
936 	request->callback = __tape_wake_up_interruptible;
937 	request->callback_data = &wq;
938 	rc = __tape_do_io(device, request);
939 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
940 	if (rc)
941 		return rc;
942 	/* Request added to the queue. Wait for its completion. */
943 	rc = wait_event_interruptible(wq, (request->callback == NULL));
944 	if (rc != -ERESTARTSYS)
945 		/* Request finished normally. */
946 		return request->rc;
947 	/* Interrupted by a signal. We have to stop the current request. */
948 	spin_lock_irq(get_ccwdev_lock(device->cdev));
949 	rc = __tape_halt_io(device, request);
950 	if (rc == 0) {
951 		DBF_EVENT(3, "IO stopped on %08x\n", device->cdev_id);
952 		rc = -ERESTARTSYS;
953 	}
954 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
955 	return rc;
956 }
957 
958 /*
959  * Handle requests that return an i/o error in the irb.
960  */
961 static inline void
962 tape_handle_killed_request(
963 	struct tape_device *device,
964 	struct tape_request *request)
965 {
966 	if(request != NULL) {
967 		/* Set ending status. FIXME: Should the request be retried? */
968 		request->rc = -EIO;
969 		request->status = TAPE_REQUEST_DONE;
970 		__tape_remove_request(device, request);
971 	} else {
972 		__tape_do_io_list(device);
973 	}
974 }
975 
976 /*
977  * Tape interrupt routine, called from the ccw_device layer
978  */
979 static void
980 __tape_do_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
981 {
982 	struct tape_device *device;
983 	struct tape_request *request;
984 	int final;
985 	int rc;
986 
987 	device = (struct tape_device *) cdev->dev.driver_data;
988 	if (device == NULL) {
989 		PRINT_ERR("could not get device structure for %s "
990 			  "in interrupt\n", cdev->dev.bus_id);
991 		return;
992 	}
993 	request = (struct tape_request *) intparm;
994 
995 	DBF_LH(6, "__tape_do_irq(device=%p, request=%p)\n", device, request);
996 
997 	/* On special conditions irb is an error pointer */
998 	if (IS_ERR(irb)) {
999 		switch (PTR_ERR(irb)) {
1000 			case -ETIMEDOUT:
1001 				PRINT_WARN("(%s): Request timed out\n",
1002 					cdev->dev.bus_id);
1003 			case -EIO:
1004 				tape_handle_killed_request(device, request);
1005 				break;
1006 			default:
1007 				PRINT_ERR("(%s): Unexpected i/o error %li\n",
1008 					cdev->dev.bus_id,
1009 					PTR_ERR(irb));
1010 		}
1011 		return;
1012 	}
1013 
1014 	/* May be an unsolicited irq */
1015 	if(request != NULL)
1016 		request->rescnt = irb->scsw.count;
1017 
1018 	if (irb->scsw.dstat != 0x0c) {
1019 		/* Set the 'ONLINE' flag depending on sense byte 1 */
1020 		if(*(((__u8 *) irb->ecw) + 1) & SENSE_DRIVE_ONLINE)
1021 			device->tape_generic_status |= GMT_ONLINE(~0);
1022 		else
1023 			device->tape_generic_status &= ~GMT_ONLINE(~0);
1024 
1025 		/*
1026 		 * Any request that does not come back with channel end
1027 		 * and device end is unusual. Log the sense data.
1028 		 */
1029 		DBF_EVENT(3,"-- Tape Interrupthandler --\n");
1030 		tape_dump_sense_dbf(device, request, irb);
1031 	} else {
1032 		/* Upon normal completion the device _is_ online */
1033 		device->tape_generic_status |= GMT_ONLINE(~0);
1034 	}
1035 	if (device->tape_state == TS_NOT_OPER) {
1036 		DBF_EVENT(6, "tape:device is not operational\n");
1037 		return;
1038 	}
1039 
1040 	/*
1041 	 * Request that were canceled still come back with an interrupt.
1042 	 * To detect these request the state will be set to TAPE_REQUEST_DONE.
1043 	 */
1044 	if(request != NULL && request->status == TAPE_REQUEST_DONE) {
1045 		__tape_remove_request(device, request);
1046 		return;
1047 	}
1048 
1049 	rc = device->discipline->irq(device, request, irb);
1050 	/*
1051 	 * rc < 0 : request finished unsuccessfully.
1052 	 * rc == TAPE_IO_SUCCESS: request finished successfully.
1053 	 * rc == TAPE_IO_PENDING: request is still running. Ignore rc.
1054 	 * rc == TAPE_IO_RETRY: request finished but needs another go.
1055 	 * rc == TAPE_IO_STOP: request needs to get terminated.
1056 	 */
1057 	final = 0;
1058 	switch (rc) {
1059 	case TAPE_IO_SUCCESS:
1060 		/* Upon normal completion the device _is_ online */
1061 		device->tape_generic_status |= GMT_ONLINE(~0);
1062 		final = 1;
1063 		break;
1064 	case TAPE_IO_PENDING:
1065 		break;
1066 	case TAPE_IO_RETRY:
1067 #ifdef CONFIG_S390_TAPE_BLOCK
1068 		if (request->op == TO_BLOCK)
1069 			device->discipline->check_locate(device, request);
1070 #endif
1071 		rc = ccw_device_start(cdev, request->cpaddr,
1072 				      (unsigned long) request, 0x00,
1073 				      request->options);
1074 		if (rc) {
1075 			DBF_EVENT(1, "tape: DOIO failed with er = %i\n", rc);
1076 			final = 1;
1077 		}
1078 		break;
1079 	case TAPE_IO_STOP:
1080 		__tape_halt_io(device, request);
1081 		break;
1082 	default:
1083 		if (rc > 0) {
1084 			DBF_EVENT(6, "xunknownrc\n");
1085 			PRINT_ERR("Invalid return code from discipline "
1086 				  "interrupt function.\n");
1087 			rc = -EIO;
1088 		}
1089 		final = 1;
1090 		break;
1091 	}
1092 	if (final) {
1093 		/* May be an unsolicited irq */
1094 		if(request != NULL) {
1095 			/* Set ending status. */
1096 			request->rc = rc;
1097 			request->status = TAPE_REQUEST_DONE;
1098 			__tape_remove_request(device, request);
1099 		} else {
1100 			__tape_do_io_list(device);
1101 		}
1102 	}
1103 }
1104 
1105 /*
1106  * Tape device open function used by tape_char & tape_block frontends.
1107  */
1108 int
1109 tape_open(struct tape_device *device)
1110 {
1111 	int rc;
1112 
1113 	spin_lock(get_ccwdev_lock(device->cdev));
1114 	if (device->tape_state == TS_NOT_OPER) {
1115 		DBF_EVENT(6, "TAPE:nodev\n");
1116 		rc = -ENODEV;
1117 	} else if (device->tape_state == TS_IN_USE) {
1118 		DBF_EVENT(6, "TAPE:dbusy\n");
1119 		rc = -EBUSY;
1120 	} else if (device->tape_state == TS_BLKUSE) {
1121 		DBF_EVENT(6, "TAPE:dbusy\n");
1122 		rc = -EBUSY;
1123 	} else if (device->discipline != NULL &&
1124 		   !try_module_get(device->discipline->owner)) {
1125 		DBF_EVENT(6, "TAPE:nodisc\n");
1126 		rc = -ENODEV;
1127 	} else {
1128 		tape_state_set(device, TS_IN_USE);
1129 		rc = 0;
1130 	}
1131 	spin_unlock(get_ccwdev_lock(device->cdev));
1132 	return rc;
1133 }
1134 
1135 /*
1136  * Tape device release function used by tape_char & tape_block frontends.
1137  */
1138 int
1139 tape_release(struct tape_device *device)
1140 {
1141 	spin_lock(get_ccwdev_lock(device->cdev));
1142 	if (device->tape_state == TS_IN_USE)
1143 		tape_state_set(device, TS_UNUSED);
1144 	module_put(device->discipline->owner);
1145 	spin_unlock(get_ccwdev_lock(device->cdev));
1146 	return 0;
1147 }
1148 
1149 /*
1150  * Execute a magnetic tape command a number of times.
1151  */
1152 int
1153 tape_mtop(struct tape_device *device, int mt_op, int mt_count)
1154 {
1155 	tape_mtop_fn fn;
1156 	int rc;
1157 
1158 	DBF_EVENT(6, "TAPE:mtio\n");
1159 	DBF_EVENT(6, "TAPE:ioop: %x\n", mt_op);
1160 	DBF_EVENT(6, "TAPE:arg:	 %x\n", mt_count);
1161 
1162 	if (mt_op < 0 || mt_op >= TAPE_NR_MTOPS)
1163 		return -EINVAL;
1164 	fn = device->discipline->mtop_array[mt_op];
1165 	if (fn == NULL)
1166 		return -EINVAL;
1167 
1168 	/* We assume that the backends can handle count up to 500. */
1169 	if (mt_op == MTBSR  || mt_op == MTFSR  || mt_op == MTFSF  ||
1170 	    mt_op == MTBSF  || mt_op == MTFSFM || mt_op == MTBSFM) {
1171 		rc = 0;
1172 		for (; mt_count > 500; mt_count -= 500)
1173 			if ((rc = fn(device, 500)) != 0)
1174 				break;
1175 		if (rc == 0)
1176 			rc = fn(device, mt_count);
1177 	} else
1178 		rc = fn(device, mt_count);
1179 	return rc;
1180 
1181 }
1182 
1183 /*
1184  * Tape init function.
1185  */
1186 static int
1187 tape_init (void)
1188 {
1189 	TAPE_DBF_AREA = debug_register ( "tape", 1, 2, 4*sizeof(long));
1190 	debug_register_view(TAPE_DBF_AREA, &debug_sprintf_view);
1191 #ifdef DBF_LIKE_HELL
1192 	debug_set_level(TAPE_DBF_AREA, 6);
1193 #endif
1194 	DBF_EVENT(3, "tape init: ($Revision: 1.51 $)\n");
1195 	tape_proc_init();
1196 	tapechar_init ();
1197 	tapeblock_init ();
1198 	return 0;
1199 }
1200 
1201 /*
1202  * Tape exit function.
1203  */
1204 static void
1205 tape_exit(void)
1206 {
1207 	DBF_EVENT(6, "tape exit\n");
1208 
1209 	/* Get rid of the frontends */
1210 	tapechar_exit();
1211 	tapeblock_exit();
1212 	tape_proc_cleanup();
1213 	debug_unregister (TAPE_DBF_AREA);
1214 }
1215 
1216 MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and "
1217 	      "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)");
1218 MODULE_DESCRIPTION("Linux on zSeries channel attached "
1219 		   "tape device driver ($Revision: 1.51 $)");
1220 MODULE_LICENSE("GPL");
1221 
1222 module_init(tape_init);
1223 module_exit(tape_exit);
1224 
1225 EXPORT_SYMBOL(tape_generic_remove);
1226 EXPORT_SYMBOL(tape_generic_probe);
1227 EXPORT_SYMBOL(tape_generic_online);
1228 EXPORT_SYMBOL(tape_generic_offline);
1229 EXPORT_SYMBOL(tape_put_device);
1230 EXPORT_SYMBOL(tape_get_device_reference);
1231 EXPORT_SYMBOL(tape_state_verbose);
1232 EXPORT_SYMBOL(tape_op_verbose);
1233 EXPORT_SYMBOL(tape_state_set);
1234 EXPORT_SYMBOL(tape_med_state_set);
1235 EXPORT_SYMBOL(tape_alloc_request);
1236 EXPORT_SYMBOL(tape_free_request);
1237 EXPORT_SYMBOL(tape_dump_sense);
1238 EXPORT_SYMBOL(tape_dump_sense_dbf);
1239 EXPORT_SYMBOL(tape_do_io);
1240 EXPORT_SYMBOL(tape_do_io_async);
1241 EXPORT_SYMBOL(tape_do_io_interruptible);
1242 EXPORT_SYMBOL(tape_mtop);
1243