Merge branch 'for-jeff' of git://electric-eye.fr.zoreil.com/home/romieu/linux-2.6
[pandora-kernel.git] / drivers / s390 / block / dasd_eer.c
1 /*
2  *      character device driver for extended error reporting
3  *
4  *
5  *      Copyright (C) 2005 IBM Corporation
6  *      extended error reporting for DASD ECKD devices
7  *      Author(s): Stefan Weinhuber <wein@de.ibm.com>
8  *
9  */
10
11 #include <linux/init.h>
12 #include <linux/fs.h>
13 #include <linux/kernel.h>
14 #include <linux/miscdevice.h>
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/device.h>
18 #include <linux/workqueue.h>
19 #include <linux/poll.h>
20 #include <linux/notifier.h>
21
22 #include <asm/uaccess.h>
23 #include <asm/semaphore.h>
24 #include <asm/atomic.h>
25 #include <asm/ebcdic.h>
26
27 #include "dasd_int.h"
28 #include "dasd_eckd.h"
29
30
31 MODULE_LICENSE("GPL");
32
33 MODULE_AUTHOR("Stefan Weinhuber <wein@de.ibm.com>");
34 MODULE_DESCRIPTION("DASD extended error reporting module");
35
36
37 #ifdef PRINTK_HEADER
38 #undef PRINTK_HEADER
39 #endif                          /* PRINTK_HEADER */
40 #define PRINTK_HEADER "dasd(eer):"
41
42
43
44
45
46 /*****************************************************************************/
47 /*      the internal buffer                                                  */
48 /*****************************************************************************/
49
50 /*
51  * The internal buffer is meant to store obaque blobs of data, so it doesn't
52  * know of higher level concepts like triggers.
53  * It consists of a number of pages that are used as a ringbuffer. Each data
54  * blob is stored in a simple record that consists of an integer, which
55  * contains the size of the following data, and the data bytes themselfes.
56  *
57  * To allow for multiple independent readers we create one internal buffer
58  * each time the device is opened and destroy the buffer when the file is
59  * closed again.
60  *
61  * One record can be written to a buffer by using the functions
62  * - dasd_eer_start_record (one time per record to write the size to the buffer
63  *                          and reserve the space for the data)
64  * - dasd_eer_write_buffer (one or more times per record to write the data)
65  * The data can be written in several steps but you will have to compute
66  * the total size up front for the invocation of dasd_eer_start_record.
67  * If the ringbuffer is full, dasd_eer_start_record will remove the required
68  * number of old records.
69  *
70  * A record is typically read in two steps, first read the integer that
71  * specifies the size of the following data, then read the data.
72  * Both can be done by
73  * - dasd_eer_read_buffer
74  *
75  * For all mentioned functions you need to get the bufferlock first and keep it
76  * until a complete record is written or read.
77  */
78
79
80 /*
81  * Alle information necessary to keep track of an internal buffer is kept in
82  * a struct eerbuffer. The buffer specific to a file pointer is strored in
83  * the private_data field of that file. To be able to write data to all
84  * existing buffers, each buffer is also added to the bufferlist.
85  * If the user doesn't want to read a complete record in one go, we have to
86  * keep track of the rest of the record. residual stores the number of bytes
87  * that are still to deliver. If the rest of the record is invalidated between
88  * two reads then residual will be set to -1 so that the next read will fail.
89  * All entries in the eerbuffer structure are protected with the bufferlock.
90  * To avoid races between writing to a buffer on the one side and creating
91  * and destroying buffers on the other side, the bufferlock must also be used
92  * to protect the bufferlist.
93  */
94
95 struct eerbuffer {
96         struct list_head list;
97         char **buffer;
98         int buffersize;
99         int buffer_page_count;
100         int head;
101         int tail;
102         int residual;
103 };
104
105 LIST_HEAD(bufferlist);
106
107 static spinlock_t bufferlock = SPIN_LOCK_UNLOCKED;
108
109 DECLARE_WAIT_QUEUE_HEAD(dasd_eer_read_wait_queue);
110
111 /*
112  * How many free bytes are available on the buffer.
113  * needs to be called with bufferlock held
114  */
115 static int
116 dasd_eer_get_free_bytes(struct eerbuffer *eerb)
117 {
118         if (eerb->head < eerb->tail) {
119                 return eerb->tail - eerb->head - 1;
120         } else
121                 return eerb->buffersize - eerb->head + eerb->tail -1;
122 }
123
124 /*
125  * How many bytes of buffer space are used.
126  * needs to be called with bufferlock held
127  */
128 static int
129 dasd_eer_get_filled_bytes(struct eerbuffer *eerb)
130 {
131
132         if (eerb->head >= eerb->tail) {
133                 return eerb->head - eerb->tail;
134         } else
135                 return eerb->buffersize - eerb->tail + eerb->head;
136 }
137
138 /*
139  * The dasd_eer_write_buffer function just copies count bytes of data
140  * to the buffer. Make sure to call dasd_eer_start_record first, to
141  * make sure that enough free space is available.
142  * needs to be called with bufferlock held
143  */
144 static void
145 dasd_eer_write_buffer(struct eerbuffer *eerb, int count, char *data)
146 {
147
148         unsigned long headindex,localhead;
149         unsigned long rest, len;
150         char *nextdata;
151
152         nextdata = data;
153         rest = count;
154         while (rest > 0) {
155                 headindex = eerb->head / PAGE_SIZE;
156                 localhead = eerb->head % PAGE_SIZE;
157                 len = min(rest, (PAGE_SIZE - localhead));
158                 memcpy(eerb->buffer[headindex]+localhead, nextdata, len);
159                 nextdata += len;
160                 rest -= len;
161                 eerb->head += len;
162                 if ( eerb->head == eerb->buffersize )
163                         eerb->head = 0; /* wrap around */
164                 if (eerb->head > eerb->buffersize) {
165                         MESSAGE(KERN_ERR, "%s", "runaway buffer head.");
166                         BUG();
167                 }
168         }
169 }
170
171 /*
172  * needs to be called with bufferlock held
173  */
174 static int
175 dasd_eer_read_buffer(struct eerbuffer *eerb, int count, char *data)
176 {
177
178         unsigned long tailindex,localtail;
179         unsigned long rest, len, finalcount;
180         char *nextdata;
181
182         finalcount = min(count, dasd_eer_get_filled_bytes(eerb));
183         nextdata = data;
184         rest = finalcount;
185         while (rest > 0) {
186                 tailindex = eerb->tail / PAGE_SIZE;
187                 localtail = eerb->tail % PAGE_SIZE;
188                 len = min(rest, (PAGE_SIZE - localtail));
189                 memcpy(nextdata, eerb->buffer[tailindex]+localtail, len);
190                 nextdata += len;
191                 rest -= len;
192                 eerb->tail += len;
193                 if ( eerb->tail == eerb->buffersize )
194                         eerb->tail = 0; /* wrap around */
195                 if (eerb->tail > eerb->buffersize) {
196                         MESSAGE(KERN_ERR, "%s", "runaway buffer tail.");
197                         BUG();
198                 }
199         }
200         return finalcount;
201 }
202
203 /*
204  * Whenever you want to write a blob of data to the internal buffer you
205  * have to start by using this function first. It will write the number
206  * of bytes that will be written to the buffer. If necessary it will remove
207  * old records to make room for the new one.
208  * needs to be called with bufferlock held
209  */
210 static int
211 dasd_eer_start_record(struct eerbuffer *eerb, int count)
212 {
213         int tailcount;
214         if (count + sizeof(count) > eerb->buffersize)
215                 return -ENOMEM;
216         while (dasd_eer_get_free_bytes(eerb) < count + sizeof(count)) {
217                 if (eerb->residual > 0) {
218                         eerb->tail += eerb->residual;
219                         if (eerb->tail >= eerb->buffersize)
220                                 eerb->tail -= eerb->buffersize;
221                         eerb->residual = -1;
222                 }
223                 dasd_eer_read_buffer(eerb, sizeof(tailcount),
224                                      (char*)(&tailcount));
225                 eerb->tail += tailcount;
226                 if (eerb->tail >= eerb->buffersize)
227                         eerb->tail -= eerb->buffersize;
228         }
229         dasd_eer_write_buffer(eerb, sizeof(count), (char*)(&count));
230
231         return 0;
232 };
233
234 /*
235  * release pages that are not used anymore
236  */
237 static void
238 dasd_eer_free_buffer_pages(char **buf, int no_pages)
239 {
240         int i;
241
242         for (i = 0; i < no_pages; ++i) {
243                 free_page((unsigned long)buf[i]);
244         }
245 }
246
247 /*
248  * allocate a new set of memory pages
249  */
250 static int
251 dasd_eer_allocate_buffer_pages(char **buf, int no_pages)
252 {
253         int i;
254
255         for (i = 0; i < no_pages; ++i) {
256                 buf[i] = (char *) get_zeroed_page(GFP_KERNEL);
257                 if (!buf[i]) {
258                         dasd_eer_free_buffer_pages(buf, i);
259                         return -ENOMEM;
260                 }
261         }
262         return 0;
263 }
264
265 /*
266  * empty the buffer by resetting head and tail
267  * In case there is a half read data blob in the buffer, we set residual
268  * to -1 to indicate that the remainder of the blob is lost.
269  */
270 static void
271 dasd_eer_purge_buffer(struct eerbuffer *eerb)
272 {
273         unsigned long flags;
274
275         spin_lock_irqsave(&bufferlock, flags);
276         if (eerb->residual > 0)
277                 eerb->residual = -1;
278         eerb->tail=0;
279         eerb->head=0;
280         spin_unlock_irqrestore(&bufferlock, flags);
281 }
282
283 /*
284  * set the size of the buffer, newsize is the new number of pages to be used
285  * we don't try to copy any data back an forth, so any resize will also purge
286  * the buffer
287  */
288 static int
289 dasd_eer_resize_buffer(struct eerbuffer *eerb, int newsize)
290 {
291         int i, oldcount, reuse;
292         char **new;
293         char **old;
294         unsigned long flags;
295
296         if (newsize < 1)
297                 return -EINVAL;
298         if (eerb->buffer_page_count == newsize) {
299                 /* documented behaviour is that any successfull invocation
300                  * will purge all records */
301                 dasd_eer_purge_buffer(eerb);
302                 return 0;
303         }
304         new = kmalloc(newsize*sizeof(char*), GFP_KERNEL);
305         if (!new)
306                 return -ENOMEM;
307
308         reuse=min(eerb->buffer_page_count, newsize);
309         for (i = 0; i < reuse; ++i) {
310                 new[i] = eerb->buffer[i];
311         }
312         if (eerb->buffer_page_count < newsize) {
313                 if (dasd_eer_allocate_buffer_pages(
314                             &new[eerb->buffer_page_count],
315                             newsize - eerb->buffer_page_count)) {
316                         kfree(new);
317                         return -ENOMEM;
318                 }
319         }
320
321         spin_lock_irqsave(&bufferlock, flags);
322         old = eerb->buffer;
323         eerb->buffer = new;
324         if (eerb->residual > 0)
325                 eerb->residual = -1;
326         eerb->tail = 0;
327         eerb->head = 0;
328         oldcount = eerb->buffer_page_count;
329         eerb->buffer_page_count = newsize;
330         spin_unlock_irqrestore(&bufferlock, flags);
331
332         if (oldcount > newsize) {
333                 for (i = newsize; i < oldcount; ++i) {
334                         free_page((unsigned long)old[i]);
335                 }
336         }
337         kfree(old);
338
339         return 0;
340 }
341
342
343 /*****************************************************************************/
344 /*      The extended error reporting functionality                           */
345 /*****************************************************************************/
346
347 /*
348  * When a DASD device driver wants to report an error, it calls the
349  * function dasd_eer_write_trigger (via a notifier mechanism) and gives the
350  * respective trigger ID as parameter.
351  * Currently there are four kinds of triggers:
352  *
353  * DASD_EER_FATALERROR:  all kinds of unrecoverable I/O problems
354  * DASD_EER_PPRCSUSPEND: PPRC was suspended
355  * DASD_EER_NOPATH:      There is no path to the device left.
356  * DASD_EER_STATECHANGE: The state of the device has changed.
357  *
358  * For the first three triggers all required information can be supplied by
359  * the caller. For these triggers a record is written by the function
360  * dasd_eer_write_standard_trigger.
361  *
362  * When dasd_eer_write_trigger is called to write a DASD_EER_STATECHANGE
363  * trigger, we have to gather the necessary sense data first. We cannot queue
364  * the necessary SNSS (sense subsystem status) request immediatly, since we
365  * are likely to run in a deadlock situation. Instead, we schedule a
366  * work_struct that calls the function dasd_eer_sense_subsystem_status to
367  * create and start an SNSS  request asynchronously.
368  *
369  * To avoid memory allocations at runtime, the necessary memory is allocated
370  * when the extended error reporting is enabled for a device (by
371  * dasd_eer_probe). There is one private eer data structure for each eer
372  * enabled DASD device. It contains memory for the work_struct, one SNSS cqr
373  * and a flags field that is used to coordinate the use of the cqr. The call
374  * to write a state change trigger can come in at any time, so we have one flag
375  * CQR_IN_USE that protects the cqr itself. When this flag indicates that the
376  * cqr is currently in use, dasd_eer_sense_subsystem_status cannot start a
377  * second request but sets the SNSS_REQUESTED flag instead.
378  *
379  * When the request is finished, the callback function dasd_eer_SNSS_cb
380  * is called. This function will invoke the function
381  * dasd_eer_write_SNSS_trigger to finally write the trigger. It will also
382  * check the SNSS_REQUESTED flag and if it is set it will call
383  * dasd_eer_sense_subsystem_status again.
384  *
385  * To avoid race conditions during the handling of the lock, the flags must
386  * be protected by the snsslock.
387  */
388
389 struct dasd_eer_private {
390         struct dasd_ccw_req *cqr;
391         unsigned long flags;
392         struct work_struct worker;
393 };
394
395 static void dasd_eer_destroy(struct dasd_device *device,
396                              struct dasd_eer_private *eer);
397 static int
398 dasd_eer_write_trigger(struct dasd_eer_trigger *trigger);
399 static void dasd_eer_sense_subsystem_status(void *data);
400 static int dasd_eer_notify(struct notifier_block *self,
401                            unsigned long action, void *data);
402
403 struct workqueue_struct *dasd_eer_workqueue;
404
405 #define SNSS_DATA_SIZE 44
406 static spinlock_t snsslock = SPIN_LOCK_UNLOCKED;
407
408 #define DASD_EER_BUSID_SIZE 10
409 struct dasd_eer_header {
410         __u32 total_size;
411         __u32 trigger;
412         __u64 tv_sec;
413         __u64 tv_usec;
414         char busid[DASD_EER_BUSID_SIZE];
415 } __attribute__ ((packed));
416
417 static struct notifier_block dasd_eer_nb = {
418         .notifier_call = dasd_eer_notify,
419 };
420
421 /*
422  * flags for use with dasd_eer_private
423  */
424 #define CQR_IN_USE     0
425 #define SNSS_REQUESTED 1
426
427 /*
428  * This function checks if extended error reporting is available for a given
429  * dasd_device. If yes, then it creates and returns a struct dasd_eer,
430  * otherwise it returns an -EPERM error pointer.
431  */
432 struct dasd_eer_private *
433 dasd_eer_probe(struct dasd_device *device)
434 {
435         struct dasd_eer_private *private;
436
437         if (!(device && device->discipline
438               && !strcmp(device->discipline->name, "ECKD"))) {
439                 return ERR_PTR(-EPERM);
440         }
441         /* allocate the private data structure */
442         private = (struct dasd_eer_private *)kmalloc(
443                 sizeof(struct dasd_eer_private), GFP_KERNEL);
444         if (!private) {
445                 return ERR_PTR(-ENOMEM);
446         }
447         INIT_WORK(&private->worker, dasd_eer_sense_subsystem_status,
448                   (void *)device);
449         private->cqr = dasd_kmalloc_request("ECKD",
450                                             1 /* SNSS */ ,
451                                             SNSS_DATA_SIZE ,
452                                             device);
453         if (!private->cqr) {
454                 kfree(private);
455                 return ERR_PTR(-ENOMEM);
456         }
457         private->flags = 0;
458         return private;
459 };
460
461 /*
462  * If our private SNSS request is queued, remove it from the
463  * dasd ccw queue so we can free the requests memory.
464  */
465 static void
466 dasd_eer_dequeue_SNSS_request(struct dasd_device *device,
467                               struct dasd_eer_private *eer)
468 {
469         struct list_head *lst, *nxt;
470         struct dasd_ccw_req *cqr, *erpcqr;
471         dasd_erp_fn_t erp_fn;
472
473         spin_lock_irq(get_ccwdev_lock(device->cdev));
474         list_for_each_safe(lst, nxt, &device->ccw_queue) {
475                 cqr = list_entry(lst, struct dasd_ccw_req, list);
476                 /* we are looking for two kinds or requests */
477                 /* first kind: our SNSS request: */
478                 if (cqr == eer->cqr) {
479                         if (cqr->status == DASD_CQR_IN_IO)
480                                 device->discipline->term_IO(cqr);
481                         list_del(&cqr->list);
482                         break;
483                 }
484                 /* second kind: ERP requests for our SNSS request */
485                 if (cqr->refers) {
486                         /* If this erp request chain ends in our cqr, then */
487                         /* cal the erp_postaction to clean it up  */
488                         erpcqr = cqr;
489                         while (erpcqr->refers) {
490                                 erpcqr = erpcqr->refers;
491                         }
492                         if (erpcqr == eer->cqr) {
493                                 erp_fn = device->discipline->erp_postaction(
494                                          cqr);
495                                 erp_fn(cqr);
496                         }
497                         continue;
498                 }
499         }
500         spin_unlock_irq(get_ccwdev_lock(device->cdev));
501 }
502
503 /*
504  * This function dismantles a struct dasd_eer that was created by
505  * dasd_eer_probe. Since we want to free our private data structure,
506  * we must make sure that the memory is not in use anymore.
507  * We have to flush the work queue and remove a possible SNSS request
508  * from the dasd queue.
509  */
510 static void
511 dasd_eer_destroy(struct dasd_device *device, struct dasd_eer_private *eer)
512 {
513         flush_workqueue(dasd_eer_workqueue);
514         dasd_eer_dequeue_SNSS_request(device, eer);
515         dasd_kfree_request(eer->cqr, device);
516         kfree(eer);
517 };
518
519 /*
520  * enable the extended error reporting for a particular device
521  */
522 static int
523 dasd_eer_enable_on_device(struct dasd_device *device)
524 {
525         void *eer;
526         if (!device)
527                 return -ENODEV;
528         if (device->eer)
529                 return 0;
530         if (!try_module_get(THIS_MODULE)) {
531                 return -EINVAL;
532         }
533         eer = (void *)dasd_eer_probe(device);
534         if (IS_ERR(eer)) {
535                 module_put(THIS_MODULE);
536                 return PTR_ERR(eer);
537         }
538         device->eer = eer;
539         return 0;
540 }
541
542 /*
543  * enable the extended error reporting for a particular device
544  */
545 static int
546 dasd_eer_disable_on_device(struct dasd_device *device)
547 {
548         struct dasd_eer_private *eer = device->eer;
549
550         if (!device)
551                 return -ENODEV;
552         if (!device->eer)
553                 return 0;
554         device->eer = NULL;
555         dasd_eer_destroy(device,eer);
556         module_put(THIS_MODULE);
557
558         return 0;
559 }
560
561 /*
562  * Set extended error reporting (eer)
563  * Note: This will be registered as a DASD ioctl, to be called on DASD devices.
564  */
565 static int
566 dasd_ioctl_set_eer(struct block_device *bdev, int no, long args)
567 {
568         struct dasd_device *device;
569         int intval;
570
571         if (!capable(CAP_SYS_ADMIN))
572                 return -EACCES;
573         if (bdev != bdev->bd_contains)
574                 /* Error-reporting is not allowed for partitions */
575                 return -EINVAL;
576         if (get_user(intval, (int __user *) args))
577                 return -EFAULT;
578         device =  bdev->bd_disk->private_data;
579         if (device == NULL)
580                 return -ENODEV;
581
582         intval = (intval != 0);
583         DEV_MESSAGE (KERN_DEBUG, device,
584                      "set eer on device to %d", intval);
585         if (intval)
586                 return dasd_eer_enable_on_device(device);
587         else
588                 return dasd_eer_disable_on_device(device);
589 }
590
591 /*
592  * Get value of extended error reporting.
593  * Note: This will be registered as a DASD ioctl, to be called on DASD devices.
594  */
595 static int
596 dasd_ioctl_get_eer(struct block_device *bdev, int no, long args)
597 {
598         struct dasd_device *device;
599
600         device =  bdev->bd_disk->private_data;
601         if (device == NULL)
602                 return -ENODEV;
603         return put_user((device->eer != NULL), (int __user *) args);
604 }
605
606 /*
607  * The following function can be used for those triggers that have
608  * all necessary data available when the function is called.
609  * If the parameter cqr is not NULL, the chain of requests will be searched
610  * for valid sense data, and all valid sense data sets will be added to
611  * the triggers data.
612  */
613 static int
614 dasd_eer_write_standard_trigger(int trigger, struct dasd_device *device,
615                                 struct dasd_ccw_req *cqr)
616 {
617         struct dasd_ccw_req *temp_cqr;
618         int data_size;
619         struct timeval tv;
620         struct dasd_eer_header header;
621         unsigned long flags;
622         struct eerbuffer *eerb;
623
624         /* go through cqr chain and count the valid sense data sets */
625         temp_cqr = cqr;
626         data_size = 0;
627         while (temp_cqr) {
628                 if (temp_cqr->irb.esw.esw0.erw.cons)
629                         data_size += 32;
630                 temp_cqr = temp_cqr->refers;
631         }
632
633         header.total_size = sizeof(header) + data_size + 4; /* "EOR" */
634         header.trigger = trigger;
635         do_gettimeofday(&tv);
636         header.tv_sec = tv.tv_sec;
637         header.tv_usec = tv.tv_usec;
638         strncpy(header.busid, device->cdev->dev.bus_id, DASD_EER_BUSID_SIZE);
639
640         spin_lock_irqsave(&bufferlock, flags);
641         list_for_each_entry(eerb, &bufferlist, list) {
642                 dasd_eer_start_record(eerb, header.total_size);
643                 dasd_eer_write_buffer(eerb, sizeof(header), (char*)(&header));
644                 temp_cqr = cqr;
645                 while (temp_cqr) {
646                         if (temp_cqr->irb.esw.esw0.erw.cons)
647                                 dasd_eer_write_buffer(eerb, 32, cqr->irb.ecw);
648                         temp_cqr = temp_cqr->refers;
649                 }
650                 dasd_eer_write_buffer(eerb, 4,"EOR");
651         }
652         spin_unlock_irqrestore(&bufferlock, flags);
653
654         wake_up_interruptible(&dasd_eer_read_wait_queue);
655
656         return 0;
657 }
658
659 /*
660  * This function writes a DASD_EER_STATECHANGE trigger.
661  */
662 static void
663 dasd_eer_write_SNSS_trigger(struct dasd_device *device,
664                             struct dasd_ccw_req *cqr)
665 {
666         int data_size;
667         int snss_rc;
668         struct timeval tv;
669         struct dasd_eer_header header;
670         unsigned long flags;
671         struct eerbuffer *eerb;
672
673         snss_rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0;
674         if (snss_rc)
675                 data_size = 0;
676         else
677                 data_size = SNSS_DATA_SIZE;
678
679         header.total_size = sizeof(header) + data_size + 4; /* "EOR" */
680         header.trigger = DASD_EER_STATECHANGE;
681         do_gettimeofday(&tv);
682         header.tv_sec = tv.tv_sec;
683         header.tv_usec = tv.tv_usec;
684         strncpy(header.busid, device->cdev->dev.bus_id, DASD_EER_BUSID_SIZE);
685
686         spin_lock_irqsave(&bufferlock, flags);
687         list_for_each_entry(eerb, &bufferlist, list) {
688                 dasd_eer_start_record(eerb, header.total_size);
689                 dasd_eer_write_buffer(eerb, sizeof(header),(char*)(&header));
690                 if (!snss_rc)
691                         dasd_eer_write_buffer(eerb, SNSS_DATA_SIZE, cqr->data);
692                 dasd_eer_write_buffer(eerb, 4,"EOR");
693         }
694         spin_unlock_irqrestore(&bufferlock, flags);
695
696         wake_up_interruptible(&dasd_eer_read_wait_queue);
697 }
698
699 /*
700  * callback function for use with SNSS request
701  */
702 static void
703 dasd_eer_SNSS_cb(struct dasd_ccw_req *cqr, void *data)
704 {
705         struct dasd_device *device;
706         struct dasd_eer_private *private;
707         unsigned long irqflags;
708
709         device = (struct dasd_device *)data;
710         private = (struct dasd_eer_private *)device->eer;
711         dasd_eer_write_SNSS_trigger(device, cqr);
712         spin_lock_irqsave(&snsslock, irqflags);
713         if(!test_and_clear_bit(SNSS_REQUESTED, &private->flags)) {
714                 clear_bit(CQR_IN_USE, &private->flags);
715                 spin_unlock_irqrestore(&snsslock, irqflags);
716                 return;
717         };
718         clear_bit(CQR_IN_USE, &private->flags);
719         spin_unlock_irqrestore(&snsslock, irqflags);
720         dasd_eer_sense_subsystem_status(device);
721         return;
722 }
723
724 /*
725  * clean a used cqr before using it again
726  */
727 static void
728 dasd_eer_clean_SNSS_request(struct dasd_ccw_req *cqr)
729 {
730         struct ccw1 *cpaddr = cqr->cpaddr;
731         void *data = cqr->data;
732
733         memset(cqr, 0, sizeof(struct dasd_ccw_req));
734         memset(cpaddr, 0, sizeof(struct ccw1));
735         memset(data, 0, SNSS_DATA_SIZE);
736         cqr->cpaddr = cpaddr;
737         cqr->data = data;
738         strncpy((char *) &cqr->magic, "ECKD", 4);
739         ASCEBC((char *) &cqr->magic, 4);
740         set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
741 }
742
743 /*
744  * build and start an SNSS request
745  * This function is called from a work queue so we have to
746  * pass the dasd_device pointer as a void pointer.
747  */
748 static void
749 dasd_eer_sense_subsystem_status(void *data)
750 {
751         struct dasd_device *device;
752         struct dasd_eer_private *private;
753         struct dasd_ccw_req *cqr;
754         struct ccw1 *ccw;
755         unsigned long irqflags;
756
757         device = (struct dasd_device *)data;
758         private = (struct dasd_eer_private *)device->eer;
759         if (!private) /* device not eer enabled any more */
760                 return;
761         cqr = private->cqr;
762         spin_lock_irqsave(&snsslock, irqflags);
763         if(test_and_set_bit(CQR_IN_USE, &private->flags)) {
764                 set_bit(SNSS_REQUESTED, &private->flags);
765                 spin_unlock_irqrestore(&snsslock, irqflags);
766                 return;
767         };
768         spin_unlock_irqrestore(&snsslock, irqflags);
769         dasd_eer_clean_SNSS_request(cqr);
770         cqr->device = device;
771         cqr->retries = 255;
772         cqr->expires = 10 * HZ;
773
774         ccw = cqr->cpaddr;
775         ccw->cmd_code = DASD_ECKD_CCW_SNSS;
776         ccw->count = SNSS_DATA_SIZE;
777         ccw->flags = 0;
778         ccw->cda = (__u32)(addr_t)cqr->data;
779
780         cqr->buildclk = get_clock();
781         cqr->status = DASD_CQR_FILLED;
782         cqr->callback = dasd_eer_SNSS_cb;
783         cqr->callback_data = (void *)device;
784         dasd_add_request_head(cqr);
785
786         return;
787 }
788
789 /*
790  * This function is called for all triggers. It calls the appropriate
791  * function that writes the actual trigger records.
792  */
793 static int
794 dasd_eer_write_trigger(struct dasd_eer_trigger *trigger)
795 {
796         int rc;
797         struct dasd_eer_private *private = trigger->device->eer;
798
799         switch (trigger->id) {
800         case DASD_EER_FATALERROR:
801         case DASD_EER_PPRCSUSPEND:
802                 rc = dasd_eer_write_standard_trigger(
803                         trigger->id, trigger->device, trigger->cqr);
804                 break;
805         case DASD_EER_NOPATH:
806                 rc = dasd_eer_write_standard_trigger(
807                         trigger->id, trigger->device, NULL);
808                 break;
809         case DASD_EER_STATECHANGE:
810                 if (queue_work(dasd_eer_workqueue, &private->worker)) {
811                         rc=0;
812                 } else {
813                         /* If the work_struct was already queued, it can't
814                          * be queued again. But this is OK since we don't
815                          * need to have it queued twice.
816                          */
817                         rc = -EBUSY;
818                 }
819                 break;
820         default: /* unknown trigger, so we write it without any sense data */
821                 rc = dasd_eer_write_standard_trigger(
822                         trigger->id, trigger->device, NULL);
823                 break;
824         }
825         return rc;
826 }
827
828 /*
829  * This function is registered with the dasd device driver and gets called
830  * for all dasd eer notifications.
831  */
832 static int dasd_eer_notify(struct notifier_block *self,
833                             unsigned long action, void *data)
834 {
835         switch (action) {
836         case DASD_EER_DISABLE:
837                 dasd_eer_disable_on_device((struct dasd_device *)data);
838                 break;
839         case DASD_EER_TRIGGER:
840                 dasd_eer_write_trigger((struct dasd_eer_trigger *)data);
841                 break;
842         }
843         return NOTIFY_OK;
844 }
845
846
847 /*****************************************************************************/
848 /*      the device operations                                                */
849 /*****************************************************************************/
850
851 /*
852  * On the one side we need a lock to access our internal buffer, on the
853  * other side a copy_to_user can sleep. So we need to copy the data we have
854  * to transfer in a readbuffer, which is protected by the readbuffer_mutex.
855  */
856 static char readbuffer[PAGE_SIZE];
857 DECLARE_MUTEX(readbuffer_mutex);
858
859
860 static int
861 dasd_eer_open(struct inode *inp, struct file *filp)
862 {
863         struct eerbuffer *eerb;
864         unsigned long flags;
865
866         eerb = kmalloc(sizeof(struct eerbuffer), GFP_KERNEL);
867         eerb->head = 0;
868         eerb->tail = 0;
869         eerb->residual = 0;
870         eerb->buffer_page_count = 1;
871         eerb->buffersize = eerb->buffer_page_count * PAGE_SIZE;
872         eerb->buffer = kmalloc(eerb->buffer_page_count*sizeof(char*),
873                                GFP_KERNEL);
874         if (!eerb->buffer)
875                 return -ENOMEM;
876         if (dasd_eer_allocate_buffer_pages(eerb->buffer,
877                                            eerb->buffer_page_count)) {
878                 kfree(eerb->buffer);
879                 return -ENOMEM;
880         }
881         filp->private_data = eerb;
882         spin_lock_irqsave(&bufferlock, flags);
883         list_add(&eerb->list, &bufferlist);
884         spin_unlock_irqrestore(&bufferlock, flags);
885
886         return nonseekable_open(inp,filp);
887 }
888
889 static int
890 dasd_eer_close(struct inode *inp, struct file *filp)
891 {
892         struct eerbuffer *eerb;
893         unsigned long flags;
894
895         eerb = (struct eerbuffer *)filp->private_data;
896         spin_lock_irqsave(&bufferlock, flags);
897         list_del(&eerb->list);
898         spin_unlock_irqrestore(&bufferlock, flags);
899         dasd_eer_free_buffer_pages(eerb->buffer, eerb->buffer_page_count);
900         kfree(eerb->buffer);
901         kfree(eerb);
902
903         return 0;
904 }
905
906 static long
907 dasd_eer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
908 {
909         int intval;
910         struct eerbuffer *eerb;
911
912         eerb = (struct eerbuffer *)filp->private_data;
913         switch (cmd) {
914         case DASD_EER_PURGE:
915                 dasd_eer_purge_buffer(eerb);
916                 return 0;
917         case DASD_EER_SETBUFSIZE:
918                 if (get_user(intval, (int __user *)arg))
919                         return -EFAULT;
920                 return dasd_eer_resize_buffer(eerb, intval);
921         default:
922                 return -ENOIOCTLCMD;
923         }
924 }
925
926 static ssize_t
927 dasd_eer_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
928 {
929         int tc,rc;
930         int tailcount,effective_count;
931         unsigned long flags;
932         struct eerbuffer *eerb;
933
934         eerb = (struct eerbuffer *)filp->private_data;
935         if(down_interruptible(&readbuffer_mutex))
936                 return -ERESTARTSYS;
937
938         spin_lock_irqsave(&bufferlock, flags);
939
940         if (eerb->residual < 0) { /* the remainder of this record */
941                                   /* has been deleted             */
942                 eerb->residual = 0;
943                 spin_unlock_irqrestore(&bufferlock, flags);
944                 up(&readbuffer_mutex);
945                 return -EIO;
946         } else if (eerb->residual > 0) {
947                 /* OK we still have a second half of a record to deliver */
948                 effective_count = min(eerb->residual, (int)count);
949                 eerb->residual -= effective_count;
950         } else {
951                 tc = 0;
952                 while (!tc) {
953                         tc = dasd_eer_read_buffer(eerb,
954                                 sizeof(tailcount), (char*)(&tailcount));
955                         if (!tc) {
956                                 /* no data available */
957                                 spin_unlock_irqrestore(&bufferlock, flags);
958                                 up(&readbuffer_mutex);
959                                 if (filp->f_flags & O_NONBLOCK)
960                                         return -EAGAIN;
961                                 rc = wait_event_interruptible(
962                                         dasd_eer_read_wait_queue,
963                                         eerb->head != eerb->tail);
964                                 if (rc) {
965                                         return rc;
966                                 }
967                                 if(down_interruptible(&readbuffer_mutex))
968                                         return -ERESTARTSYS;
969                                 spin_lock_irqsave(&bufferlock, flags);
970                         }
971                 }
972                 WARN_ON(tc != sizeof(tailcount));
973                 effective_count = min(tailcount,(int)count);
974                 eerb->residual = tailcount - effective_count;
975         }
976
977         tc = dasd_eer_read_buffer(eerb, effective_count, readbuffer);
978         WARN_ON(tc != effective_count);
979
980         spin_unlock_irqrestore(&bufferlock, flags);
981
982         if (copy_to_user(buf, readbuffer, effective_count)) {
983                 up(&readbuffer_mutex);
984                 return -EFAULT;
985         }
986
987         up(&readbuffer_mutex);
988         return effective_count;
989 }
990
991 static unsigned int
992 dasd_eer_poll (struct file *filp, poll_table *ptable)
993 {
994         unsigned int mask;
995         unsigned long flags;
996         struct eerbuffer *eerb;
997
998         eerb = (struct eerbuffer *)filp->private_data;
999         poll_wait(filp, &dasd_eer_read_wait_queue, ptable);
1000         spin_lock_irqsave(&bufferlock, flags);
1001         if (eerb->head != eerb->tail)
1002                 mask = POLLIN | POLLRDNORM ;
1003         else
1004                 mask = 0;
1005         spin_unlock_irqrestore(&bufferlock, flags);
1006         return mask;
1007 }
1008
1009 static struct file_operations dasd_eer_fops = {
1010         .open           = &dasd_eer_open,
1011         .release        = &dasd_eer_close,
1012         .unlocked_ioctl = &dasd_eer_ioctl,
1013         .compat_ioctl   = &dasd_eer_ioctl,
1014         .read           = &dasd_eer_read,
1015         .poll           = &dasd_eer_poll,
1016         .owner          = THIS_MODULE,
1017 };
1018
1019 static struct miscdevice dasd_eer_dev = {
1020         .minor      = MISC_DYNAMIC_MINOR,
1021         .name       = "dasd_eer",
1022         .fops       = &dasd_eer_fops,
1023 };
1024
1025
1026 /*****************************************************************************/
1027 /*      Init and exit                                                        */
1028 /*****************************************************************************/
1029
1030 static int
1031 __init dasd_eer_init(void)
1032 {
1033         int rc;
1034
1035         dasd_eer_workqueue = create_singlethread_workqueue("dasd_eer");
1036         if (!dasd_eer_workqueue) {
1037                 MESSAGE(KERN_ERR , "%s", "dasd_eer_init could not "
1038                        "create workqueue \n");
1039                 rc = -ENOMEM;
1040                 goto out;
1041         }
1042
1043         rc = dasd_register_eer_notifier(&dasd_eer_nb);
1044         if (rc) {
1045                 MESSAGE(KERN_ERR, "%s", "dasd_eer_init could not "
1046                        "register error reporting");
1047                 goto queue;
1048         }
1049
1050         dasd_ioctl_no_register(THIS_MODULE, BIODASDEERSET, dasd_ioctl_set_eer);
1051         dasd_ioctl_no_register(THIS_MODULE, BIODASDEERGET, dasd_ioctl_get_eer);
1052
1053         /* we don't need our own character device,
1054          * so we just register as misc device */
1055         rc = misc_register(&dasd_eer_dev);
1056         if (rc) {
1057                 MESSAGE(KERN_ERR, "%s", "dasd_eer_init could not "
1058                        "register misc device");
1059                 goto unregister;
1060         }
1061
1062         return 0;
1063
1064 unregister:
1065         dasd_unregister_eer_notifier(&dasd_eer_nb);
1066         dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERSET,
1067                                  dasd_ioctl_set_eer);
1068         dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERGET,
1069                                  dasd_ioctl_get_eer);
1070 queue:
1071         destroy_workqueue(dasd_eer_workqueue);
1072 out:
1073         return rc;
1074
1075 }
1076 module_init(dasd_eer_init);
1077
1078 static void
1079 __exit dasd_eer_exit(void)
1080 {
1081         dasd_unregister_eer_notifier(&dasd_eer_nb);
1082         dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERSET,
1083                                  dasd_ioctl_set_eer);
1084         dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERGET,
1085                                  dasd_ioctl_get_eer);
1086         destroy_workqueue(dasd_eer_workqueue);
1087
1088         WARN_ON(misc_deregister(&dasd_eer_dev) != 0);
1089 }
1090 module_exit(dasd_eer_exit);