Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4dd3cc5caf41d55cd5e55f32902c8a2ad3296e19
Commit:     4dd3cc5caf41d55cd5e55f32902c8a2ad3296e19
Parent:     0ec67667ab414b18a0518d5b11c842fd342e9cb1
Author:     Cornelia Huck <[EMAIL PROTECTED]>
AuthorDate: Mon Feb 12 15:47:18 2007 +0100
Committer:  Martin Schwidefsky <[EMAIL PROTECTED]>
CommitDate: Mon Feb 12 15:47:18 2007 +0100

    [S390] cio: Fixup interface for setting options on ccw devices.
    
    The current ccw_device_set_options() sets a specified mask of options
    and clears those not specified, but there is no way to find out which
    options have already been set.
    
    In order to fix this up, introduce the following interface changes:
    
    ccw_device_set_options() now only sets the specified bits, but does
    not clear those that are not specified.
    
    ccw_device_clear_options() clears the specified bits.
    
    ccw_device_set_options_mask() provides the old semantics (setting only
    the specified bits and clearing the others).
    
    Device drivers now work as expected. qdio has been adapted.
    
    Signed-off-by: Cornelia Huck <[EMAIL PROTECTED]>
    Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>
---
 drivers/s390/cio/device_ops.c |   32 ++++++++++++++++++++++++++++++--
 drivers/s390/cio/qdio.c       |    2 +-
 include/asm-s390/ccwdev.h     |    2 ++
 3 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c
index d7b25b8..7c7775a 100644
--- a/drivers/s390/cio/device_ops.c
+++ b/drivers/s390/cio/device_ops.c
@@ -23,8 +23,7 @@
 #include "chsc.h"
 #include "device.h"
 
-int
-ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)
+int ccw_device_set_options_mask(struct ccw_device *cdev, unsigned long flags)
 {
        /*
        * The flag usage is mutal exclusive ...
@@ -39,6 +38,33 @@ ccw_device_set_options(struct ccw_device *cdev, unsigned 
long flags)
        return 0;
 }
 
+int ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)
+{
+       /*
+       * The flag usage is mutal exclusive ...
+       */
+       if (((flags & CCWDEV_EARLY_NOTIFICATION) &&
+           (flags & CCWDEV_REPORT_ALL)) ||
+           ((flags & CCWDEV_EARLY_NOTIFICATION) &&
+            cdev->private->options.repall) ||
+           ((flags & CCWDEV_REPORT_ALL) &&
+            cdev->private->options.fast))
+               return -EINVAL;
+       cdev->private->options.fast |= (flags & CCWDEV_EARLY_NOTIFICATION) != 0;
+       cdev->private->options.repall |= (flags & CCWDEV_REPORT_ALL) != 0;
+       cdev->private->options.pgroup |= (flags & CCWDEV_DO_PATHGROUP) != 0;
+       cdev->private->options.force |= (flags & CCWDEV_ALLOW_FORCE) != 0;
+       return 0;
+}
+
+void ccw_device_clear_options(struct ccw_device *cdev, unsigned long flags)
+{
+       cdev->private->options.fast &= (flags & CCWDEV_EARLY_NOTIFICATION) == 0;
+       cdev->private->options.repall &= (flags & CCWDEV_REPORT_ALL) == 0;
+       cdev->private->options.pgroup &= (flags & CCWDEV_DO_PATHGROUP) == 0;
+       cdev->private->options.force &= (flags & CCWDEV_ALLOW_FORCE) == 0;
+}
+
 int
 ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
 {
@@ -601,7 +627,9 @@ _ccw_device_get_device_number(struct ccw_device *cdev)
 
 
 MODULE_LICENSE("GPL");
+EXPORT_SYMBOL(ccw_device_set_options_mask);
 EXPORT_SYMBOL(ccw_device_set_options);
+EXPORT_SYMBOL(ccw_device_clear_options);
 EXPORT_SYMBOL(ccw_device_clear);
 EXPORT_SYMBOL(ccw_device_halt);
 EXPORT_SYMBOL(ccw_device_resume);
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
index d726cd5..5b1e3ff 100644
--- a/drivers/s390/cio/qdio.c
+++ b/drivers/s390/cio/qdio.c
@@ -3194,7 +3194,7 @@ qdio_establish(struct qdio_initialize *init_data)
 
        spin_lock_irqsave(get_ccwdev_lock(cdev),saveflags);
 
-       ccw_device_set_options(cdev, 0);
+       ccw_device_set_options_mask(cdev, 0);
        result=ccw_device_start_timeout(cdev,&irq_ptr->ccw,
                                        QDIO_DOING_ESTABLISH,0, 0,
                                        QDIO_ESTABLISH_TIMEOUT);
diff --git a/include/asm-s390/ccwdev.h b/include/asm-s390/ccwdev.h
index 58c70ac..cfc8153 100644
--- a/include/asm-s390/ccwdev.h
+++ b/include/asm-s390/ccwdev.h
@@ -110,7 +110,9 @@ extern void ccw_driver_unregister (struct ccw_driver 
*driver);
 
 struct ccw1;
 
+extern int ccw_device_set_options_mask(struct ccw_device *, unsigned long);
 extern int ccw_device_set_options(struct ccw_device *, unsigned long);
+extern void ccw_device_clear_options(struct ccw_device *, unsigned long);
 
 /* Allow for i/o completion notification after primary interrupt status. */
 #define CCWDEV_EARLY_NOTIFICATION      0x0001
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to