static int kenvctrld(void *__unused) { int poll_interval; int whichcpu; char tempbuf[10]; struct i2c_child_t *cputemp; if (NULL == (cputemp = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) { printk(KERN_ERR "envctrl: kenvctrld unable to monitor CPU temp-- exiting\n"); return -ENODEV; } poll_interval = 5 * HZ; /* TODO env_mon_interval */ daemonize(); strcpy(current->comm, "kenvctrld"); kenvctrld_task = current; printk(KERN_INFO "envctrl: %s starting...\n", current->comm); for (;;) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(poll_interval); current->state = TASK_RUNNING; if(signal_pending(current)) break; for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) { if (0 < envctrl_read_cpu_info(whichcpu, cputemp, ENVCTRL_CPUTEMP_MON, tempbuf)) { if (tempbuf[0] >= shutdown_temperature) { printk(KERN_CRIT "%s: WARNING: CPU%i temperature %i C meets or exceeds "\ "shutdown threshold %i C\n", current->comm, whichcpu, tempbuf[0], shutdown_temperature); envctrl_do_shutdown(); } } } } printk(KERN_INFO "envctrl: %s exiting...\n", current->comm); return 0; }
static int kenvctrld(void *__unused) { int poll_interval; int whichcpu; char tempbuf[10]; struct i2c_child_t *cputemp; if (NULL == (cputemp = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) { printk(KERN_ERR "envctrl: kenvctrld unable to monitor CPU temp-- exiting\n"); return -ENODEV; } poll_interval = 5000; /* TODO env_mon_interval */ printk(KERN_INFO "envctrl: %s starting...\n", current->comm); for (;;) { msleep_interruptible(poll_interval); if (kthread_should_stop()) break; for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) { if (0 < envctrl_read_cpu_info(whichcpu, cputemp, ENVCTRL_CPUTEMP_MON, tempbuf)) { if (tempbuf[0] >= shutdown_temperature) { printk(KERN_CRIT "%s: WARNING: CPU%i temperature %i C meets or exceeds "\ "shutdown threshold %i C\n", current->comm, whichcpu, tempbuf[0], shutdown_temperature); envctrl_do_shutdown(); } } } } printk(KERN_INFO "envctrl: %s exiting...\n", current->comm); return 0; }
static int kenvctrld(void *__unused) { int poll_interval; int whichcpu; char tempbuf[10]; struct i2c_child_t *cputemp; if (NULL == (cputemp = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) { // printk(KERN_ERR PFX ; return -ENODEV; } poll_interval = 5000; /* TODO env_mon_interval */ ; for (;;) { msleep_interruptible(poll_interval); if (kthread_should_stop()) break; for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) { if (0 < envctrl_read_cpu_info(whichcpu, cputemp, ENVCTRL_CPUTEMP_MON, tempbuf)) { if (tempbuf[0] >= shutdown_temperature) { // printk(KERN_CRIT // "%s: WARNING: CPU%i temperature %i C meets or exceeds "\ // "shutdown threshold %i C\n", // current->comm, whichcpu, ; envctrl_do_shutdown(); } } } } ; return 0; }
/* Function Description: Read a byte from /dev/envctrl. Mapped to user read(). * Return: Number of read bytes. 0 for error. */ static ssize_t envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos) { struct i2c_child_t *pchild; unsigned char data[10]; int ret = 0; /* Get the type of read as decided in ioctl() call. * Find the appropriate i2c child. * Get the data and put back to the user buffer. */ switch ((int)(long)file->private_data) { case ENVCTRL_RD_WARNING_TEMPERATURE: if (warning_temperature == 0) return 0; data[0] = (unsigned char)(warning_temperature); ret = 1; copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_SHUTDOWN_TEMPERATURE: if (shutdown_temperature == 0) return 0; data[0] = (unsigned char)(shutdown_temperature); ret = 1; copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_MTHRBD_TEMPERATURE: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON))) return 0; ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data); copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_CPU_TEMPERATURE: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) return 0; ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUTEMP_MON, data); /* Reset cpu to the default cpu0. */ copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_CPU_VOLTAGE: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUVOLTAGE_MON))) return 0; ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUVOLTAGE_MON, data); /* Reset cpu to the default cpu0. */ copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_SCSI_TEMPERATURE: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON))) return 0; ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data); copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_ETHERNET_TEMPERATURE: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON))) return 0; ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data); copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_FAN_STATUS: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_FANSTAT_MON))) return 0; data[0] = envctrl_i2c_read_8574(pchild->addr); ret = envctrl_i2c_fan_status(pchild,data[0], data); copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_GLOBALADDRESS: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON))) return 0; data[0] = envctrl_i2c_read_8574(pchild->addr); ret = envctrl_i2c_globaladdr(pchild, data[0], data); copy_to_user((unsigned char *)buf, data, ret); break; case ENVCTRL_RD_VOLTAGE_STATUS: if (!(pchild = envctrl_get_i2c_child(ENVCTRL_VOLTAGESTAT_MON))) /* If voltage monitor not present, check for CPCI equivalent */ if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON))) return 0; data[0] = envctrl_i2c_read_8574(pchild->addr); ret = envctrl_i2c_voltage_status(pchild, data[0], data); copy_to_user((unsigned char *)buf, data, ret); break; default: break; }; return ret; }