19 #include <linux/sched.h>
20 #include <linux/device.h>
21 #include <linux/poll.h>
22 #include <linux/module.h>
23 #include <linux/slab.h>
25 #include <asm/sn/io.h>
32 #define SYSCTL_BASENAME "snsc"
34 #define SCDRV_BUFSZ 2048
35 #define SCDRV_TIMEOUT 1000
39 scdrv_interrupt(
int irq,
void *subch_data)
54 ia64_sn_irtr_intr_disable
56 SAL_IROUTER_INTR_XMIT);
61 spin_unlock_irqrestore(&sd->
sd_rlock, flags);
84 printk(
"%s: couldn't allocate subchannel data\n",
95 printk(
"%s: couldn't allocate subchannel\n", __func__);
103 sema_init(&sd->
sd_rbs, 1);
104 sema_init(&sd->
sd_wbs, 1);
116 printk(
"%s: irq request failed (%d)\n", __func__, rv);
131 scdrv_release(
struct inode *inode,
struct file *file)
160 scdrv_read(
struct file *file,
char __user *
buf,
size_t count, loff_t *f_pos)
185 status = read_status_check(sd, &len);
192 spin_unlock_irqrestore(&sd->
sd_rlock, flags);
200 spin_unlock_irqrestore(&sd->
sd_rlock, flags);
212 status = read_status_check(sd, &len);
214 spin_unlock_irqrestore(&sd->
sd_rlock, flags);
221 pr_debug(
"%s: only accepting %d of %d bytes\n",
222 __func__, (
int) count, len);
224 len =
min((
int) count, len);
252 scdrv_write(
struct file *file,
const char __user *buf,
253 size_t count, loff_t *f_pos)
282 status = write_status_check(sd, count);
285 while (status <= 0) {
296 spin_unlock_irqrestore(&sd->
sd_wlock, flags);
308 status = write_status_check(sd, count);
310 spin_unlock_irqrestore(&sd->
sd_wlock, flags);
318 if ((status >= 0) && (status < count)) {
319 pr_debug(
"Didn't accept the full chunk; %d of %d\n",
320 status, (
int) count);
328 unsigned int mask = 0;
333 poll_wait(file, &sd->
sd_rq, wait);
334 poll_wait(file, &sd->
sd_wq, wait);
340 spin_unlock_irqrestore(&sd->
sd_rlock, flags);
357 .write = scdrv_write,
360 .release = scdrv_release,
364 static struct class *snsc_class;
387 event_nasid = ia64_sn_get_console_nasid();
391 printk(
"%s: failed to register SN system controller device\n",
397 for (cnode = 0; cnode <
num_cnodes; cnode++) {
402 devnamep = devname +
strlen(devname);
403 sprintf(devnamep,
"^%d#%d", geo_slot(geoid),
410 printk(
"%s: failed to allocate device info"
411 "for %s/%s\n", __func__,
419 printk(
"%s: failed to allocate driver buffer"
420 "(%s%s)\n", __func__,
426 if (ia64_sn_irtr_init(scd->
scd_nasid, salbuf,
429 (
"%s: failed to initialize SAL for"
430 " system controller communication"
431 " (%s/%s): outdated PROM?\n",
438 dev = first_dev + cnode;
441 printk(
"%s: failed to register system"
442 " controller device (%s%s)\n",