]> git.hungrycats.org Git - linux/commitdiff
[PATCH] SCSI tape sysfs and module parameter additions
authorKai Mäkisara <kai.makisara@kolumbus.fi>
Mon, 14 Apr 2003 03:33:44 +0000 (20:33 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Mon, 14 Apr 2003 03:33:44 +0000 (20:33 -0700)
This contains the following changes:
 - export some driver parameters in sysfs
 - use new module parameter definitions

Documentation/scsi/st.txt
drivers/scsi/st.c

index 39f0380b4582705e45c211e754c674101464e466..d5a0ac9153bc2575d388b85c979f6934dd0485e9 100644 (file)
@@ -2,7 +2,7 @@ This file contains brief information about the SCSI tape driver.
 The driver is currently maintained by Kai Mäkisara (email
 Kai.Makisara@kolumbus.fi)
 
-Last modified: Sun Apr  6 22:44:13 2003 by makisara
+Last modified: Sat Apr 12 20:26:37 2003 by makisara
 
 
 BASICS
@@ -201,11 +201,17 @@ BOOT TIME CONFIGURATION
 
 If the driver is compiled into the kernel, the same parameters can be
 also set using, e.g., the LILO command line. The preferred syntax is
-to use the same keywords as when loading the driver as module. If
-several parameters are set, the keyword-value pairs are separated with
-a comma (no spaces allowed). A colon can be used instead of the equal
-mark. The definition is prepended by the string st=. Here is an
-example:
+is to use the same keyword used when loading as module but prepended
+with 'st.'. For instance, to set the maximum number of scatter/gather
+segments, the parameter 'st.max_sg_segs=xx' should be used (xx is the
+number of scatter/gather segments).
+
+For compatibility, the old syntax from early 2.5 and 2.4 kernel
+versions is supported. The same keywords can be used as when loading
+the driver as module. If several parameters are set, the keyword-value
+pairs are separated with a comma (no spaces allowed). A colon can be
+used instead of the equal mark. The definition is prepended by the
+string st=. Here is an example:
 
        st=buffer_kbs:64,write_threhold_kbs:60
 
index 00f5fb6bea0a9aff5a4472e332ccbb422a5d9e50..3977535e7ce29f02bf02ece001a2919993e07649 100644 (file)
    Copyright 1992 - 2003 Kai Makisara
    email Kai.Makisara@kolumbus.fi
 
-   Last modified: Sat Apr 12 20:20:39 2003 by makisara
+   Last modified: Sun Apr 13 10:17:18 2003 by makisara
    Some small formal changes - aeb, 950809
 
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static char *verstr = "20030412";
+static char *verstr = "20030413";
 
 #include <linux/module.h>
 
@@ -34,6 +34,7 @@ static char *verstr = "20030412";
 #include <linux/fcntl.h>
 #include <linux/spinlock.h>
 #include <linux/blk.h>
+#include <linux/moduleparam.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
 #include <asm/system.h>
@@ -77,17 +78,21 @@ MODULE_AUTHOR("Kai Makisara");
 MODULE_DESCRIPTION("SCSI Tape Driver");
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(buffer_kbs, "i");
+/* Set 'perm' (4th argument) to 0 to disable module_param's definition
+ * of sysfs parameters (which module_param doesn't yet support).
+ * Sysfs parameters defined explicitly later.
+ */
+module_param_named(buffer_kbs, buffer_kbs, int, 0);
 MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size for fixed block mode (KB; 32)");
-MODULE_PARM(max_sg_segs, "i");
+module_param_named(max_sg_segs, max_sg_segs, int, 0);
 MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");
-MODULE_PARM(try_direct_io, "i");
+module_param_named(try_direct_io, try_direct_io, int, 0);
 MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)");
 
 /* Extra parameters for testing */
-MODULE_PARM(try_rdio, "i");
+module_param_named(try_rdio, try_rdio, int, 0);
 MODULE_PARM_DESC(try_rdio, "Try direct read i/o when possible");
-MODULE_PARM(try_wdio, "i");
+module_param_named(try_wdio, try_wdio, int, 0);
 MODULE_PARM_DESC(try_wdio, "Try direct write i/o when possible");
 
 #ifndef MODULE
@@ -166,6 +171,10 @@ static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int);
 static int st_attach(Scsi_Device *);
 static void st_detach(Scsi_Device *);
 
+static void do_create_driverfs_files(void);
+static void do_remove_driverfs_files(void);
+
+
 static struct Scsi_Device_Template st_template = {
        .module =       THIS_MODULE,
        .list =         LIST_HEAD_INIT(st_template.list),
@@ -3972,8 +3981,10 @@ static int __init init_st(void)
                verstr, st_fixed_buffer_size, st_max_sg_segs);
 
        if (register_chrdev(SCSI_TAPE_MAJOR, "st", &st_fops) >= 0) {
-               if (scsi_register_device(&st_template) == 0)
+               if (scsi_register_device(&st_template) == 0) {
+                       do_create_driverfs_files();
                        return 0;
+               }
                unregister_chrdev(SCSI_TAPE_MAJOR, "st");
        }
 
@@ -3985,6 +3996,7 @@ static void __exit exit_st(void)
 {
        int i;
 
+       do_remove_driverfs_files();
        scsi_unregister_device(&st_template);
        unregister_chrdev(SCSI_TAPE_MAJOR, "st");
        if (scsi_tapes != NULL) {
@@ -4003,6 +4015,52 @@ module_init(init_st);
 module_exit(exit_st);
 
 
+/* The sysfs interface. Read-only at the moment */
+static ssize_t st_try_direct_io_show(struct device_driver *ddp, char *buf)
+{
+       return snprintf(buf, PAGE_SIZE, "%d\n", try_direct_io);
+}
+static DRIVER_ATTR(try_direct_io, S_IRUGO, st_try_direct_io_show, NULL);
+
+static ssize_t st_fixed_buffer_size_show(struct device_driver *ddp, char *buf)
+{
+       return snprintf(buf, PAGE_SIZE, "%d\n", st_fixed_buffer_size);
+}
+static DRIVER_ATTR(fixed_buffer_size, S_IRUGO, st_fixed_buffer_size_show, NULL);
+
+static ssize_t st_max_sg_segs_show(struct device_driver *ddp, char *buf)
+{
+       return snprintf(buf, PAGE_SIZE, "%d\n", st_max_sg_segs);
+}
+static DRIVER_ATTR(max_sg_segs, S_IRUGO, st_max_sg_segs_show, NULL);
+
+static ssize_t st_version_show(struct device_driver *ddd, char *buf)
+{
+       return snprintf(buf, PAGE_SIZE, "[%s]\n", verstr);
+}
+static DRIVER_ATTR(version, S_IRUGO, st_version_show, NULL);
+
+static void do_create_driverfs_files(void)
+{
+       struct device_driver *driverfs = &st_template.scsi_driverfs_driver;
+
+       driver_create_file(driverfs, &driver_attr_try_direct_io);
+       driver_create_file(driverfs, &driver_attr_fixed_buffer_size);
+       driver_create_file(driverfs, &driver_attr_max_sg_segs);
+       driver_create_file(driverfs, &driver_attr_version);
+}
+
+static void do_remove_driverfs_files(void)
+{
+       struct device_driver *driverfs = &st_template.scsi_driverfs_driver;
+
+       driver_remove_file(driverfs, &driver_attr_version);
+       driver_remove_file(driverfs, &driver_attr_max_sg_segs);
+       driver_remove_file(driverfs, &driver_attr_fixed_buffer_size);
+       driver_remove_file(driverfs, &driver_attr_try_direct_io);
+}
+
+
 /* Pin down user pages and put them into a scatter gather list. Returns <= 0 if
    - mapping of all pages not successful
    - any page is above max_pfn