Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *  drivers/s390/char/sclp_config.c
  3  *
  4  *    Copyright IBM Corp. 2007
  5  *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
  6  */
  7 
  8 #define KMSG_COMPONENT "sclp_config"
  9 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 10 
 11 #include <linux/init.h>
 12 #include <linux/errno.h>
 13 #include <linux/cpu.h>
 14 #include <linux/sysdev.h>
 15 #include <linux/workqueue.h>
 16 #include <asm/smp.h>
 17 
 18 #include "sclp.h"
 19 
 20 struct conf_mgm_data {
 21         u8 reserved;
 22         u8 ev_qualifier;
 23 } __attribute__((packed));
 24 
 25 #define EV_QUAL_CPU_CHANGE      1
 26 #define EV_QUAL_CAP_CHANGE      3
 27 
 28 static struct work_struct sclp_cpu_capability_work;
 29 static struct work_struct sclp_cpu_change_work;
 30 
 31 static void sclp_cpu_capability_notify(struct work_struct *work)
 32 {
 33         int cpu;
 34         struct sys_device *sysdev;
 35 
 36         pr_warning("cpu capability changed.\n");
 37         get_online_cpus();
 38         for_each_online_cpu(cpu) {
 39                 sysdev = get_cpu_sysdev(cpu);
 40                 kobject_uevent(&sysdev->kobj, KOBJ_CHANGE);
 41         }
 42         put_online_cpus();
 43 }
 44 
 45 static void __ref sclp_cpu_change_notify(struct work_struct *work)
 46 {
 47         smp_rescan_cpus();
 48 }
 49 
 50 static void sclp_conf_receiver_fn(struct evbuf_header *evbuf)
 51 {
 52         struct conf_mgm_data *cdata;
 53 
 54         cdata = (struct conf_mgm_data *)(evbuf + 1);
 55         switch (cdata->ev_qualifier) {
 56         case EV_QUAL_CPU_CHANGE:
 57                 schedule_work(&sclp_cpu_change_work);
 58                 break;
 59         case EV_QUAL_CAP_CHANGE:
 60                 schedule_work(&sclp_cpu_capability_work);
 61                 break;
 62         }
 63 }
 64 
 65 static struct sclp_register sclp_conf_register =
 66 {
 67         .receive_mask = EVTYP_CONFMGMDATA_MASK,
 68         .receiver_fn  = sclp_conf_receiver_fn,
 69 };
 70 
 71 static int __init sclp_conf_init(void)
 72 {
 73         int rc;
 74 
 75         INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify);
 76         INIT_WORK(&sclp_cpu_change_work, sclp_cpu_change_notify);
 77 
 78         rc = sclp_register(&sclp_conf_register);
 79         if (rc)
 80                 return rc;
 81 
 82         if (!(sclp_conf_register.sclp_send_mask & EVTYP_CONFMGMDATA_MASK)) {
 83                 pr_warning("no configuration management.\n");
 84                 sclp_unregister(&sclp_conf_register);
 85                 rc = -ENOSYS;
 86         }
 87         return rc;
 88 }
 89 
 90 __initcall(sclp_conf_init);
 91 
  This page was automatically generated by the LXR engine.