diff --git a/Documentation/cgroups/cpuacct.txt b/Documentation/cgroups/cpuacct.txt index e21a932059f..9d73cc0cadb 100644 --- a/Documentation/cgroups/cpuacct.txt +++ b/Documentation/cgroups/cpuacct.txt @@ -39,13 +39,6 @@ system: Time spent by tasks of the cgroup in kernel mode. user and system are in USER_HZ unit. -cpuacct.cpufreq file gives CPU time (in nanoseconds) spent at each CPU -frequency. Platform hooks must be implemented inorder to properly track -time at each CPU frequency. - -cpuacct.power file gives CPU power consumed (in milliWatt seconds). Platform -must provide and implement power callback functions. - cpuacct controller uses percpu_counter interface to collect user and system times. This has two side effects: diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 6839263497a..17a44b37e38 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1830,13 +1830,6 @@ config HW_PERF_EVENTS Enable hardware performance counter support for perf events. If disabled, perf events will use software events only. -config VMALLOC_RESERVE - hex "Reserved vmalloc space" - default 0x08000000 - depends on MMU - help - Reserved vmalloc space if not specified on the kernel commandline. - source "mm/Kconfig" config ARCH_MEMORY_PROBE diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index dfcdb9f7c12..c355aebdf2d 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c @@ -110,6 +110,7 @@ void machine_kexec(struct kimage *image) unsigned long reboot_code_buffer_phys; void *reboot_code_buffer; + arch_kexec(); page_list = image->head & PAGE_MASK; diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c index c8bdb5de760..48abd356eeb 100644 --- a/arch/arm/mach-msm/board-8064.c +++ b/arch/arm/mach-msm/board-8064.c @@ -2388,12 +2388,6 @@ static void __init mpq8064_pcie_init(void) } } -static void __init fsm8064_ep_pcie_init(void) -{ - msm_device_pcie.dev.platform_data = &ep_pcie_platform_data; - platform_device_register(&msm_device_pcie); -} - static struct platform_device mpq8064_device_ext_3p3v_vreg = { .name = "reg-fixed-voltage", .dev = { @@ -2401,6 +2395,12 @@ static struct platform_device mpq8064_device_ext_3p3v_vreg = { }, }; +static void __init fsm8064_ep_pcie_init(void) +{ + msm_device_pcie.dev.platform_data = &ep_pcie_platform_data; + platform_device_register(&msm_device_pcie); +} + static struct platform_device apq8064_device_ext_5v_vreg __devinitdata = { .name = GPIO_REGULATOR_DEV_NAME, .id = PM8921_MPP_PM_TO_SYS(7), diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 2ec87b8332b..892b007ba34 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -425,9 +425,9 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) writel_relaxed(1, l2x0_base + L2X0_CTRL); } - outer_cache.inv_range = l2x0_inv_range; - outer_cache.clean_range = l2x0_clean_range; - outer_cache.flush_range = l2x0_flush_range; + outer_cache.inv_range = l2x0_inv_range; + outer_cache.clean_range = l2x0_clean_range; + outer_cache.flush_range = l2x0_flush_range; outer_cache.sync = l2x0_cache_sync; outer_cache.flush_all = l2x0_flush_all; outer_cache.inv_all = l2x0_inv_all; diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile index c113cf1a603..f5ca5b6105b 100644 --- a/drivers/char/tpm/Makefile +++ b/drivers/char/tpm/Makefile @@ -1,6 +1,7 @@ # # Makefile for the kernel tpm device drivers. # + obj-$(CONFIG_TCG_TPM) += tpm.o ifdef CONFIG_ACPI obj-$(CONFIG_TCG_TPM) += tpm_bios.o diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c deleted file mode 100644 index 94bb4403ef9..00000000000 --- a/drivers/char/tty_io.c +++ /dev/null @@ -1,3154 +0,0 @@ -/* - * linux/drivers/char/tty_io.c - * - * Copyright (C) 1991, 1992 Linus Torvalds - */ - -/* - * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles - * or rs-channels. It also implements echoing, cooked mode etc. - * - * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0. - * - * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the - * tty_struct and tty_queue structures. Previously there was an array - * of 256 tty_struct's which was statically allocated, and the - * tty_queue structures were allocated at boot time. Both are now - * dynamically allocated only when the tty is open. - * - * Also restructured routines so that there is more of a separation - * between the high-level tty routines (tty_io.c and tty_ioctl.c) and - * the low-level tty routines (serial.c, pty.c, console.c). This - * makes for cleaner and more compact code. -TYT, 9/17/92 - * - * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines - * which can be dynamically activated and de-activated by the line - * discipline handling modules (like SLIP). - * - * NOTE: pay no attention to the line discipline code (yet); its - * interface is still subject to change in this version... - * -- TYT, 1/31/92 - * - * Added functionality to the OPOST tty handling. No delays, but all - * other bits should be there. - * -- Nick Holloway , 27th May 1993. - * - * Rewrote canonical mode and added more termios flags. - * -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94 - * - * Reorganized FASYNC support so mouse code can share it. - * -- ctm@ardi.com, 9Sep95 - * - * New TIOCLINUX variants added. - * -- mj@k332.feld.cvut.cz, 19-Nov-95 - * - * Restrict vt switching via ioctl() - * -- grif@cs.ucr.edu, 5-Dec-95 - * - * Move console and virtual terminal code to more appropriate files, - * implement CONFIG_VT and generalize console device interface. - * -- Marko Kohtala , March 97 - * - * Rewrote tty_init_dev and tty_release_dev to eliminate races. - * -- Bill Hawes , June 97 - * - * Added devfs support. - * -- C. Scott Ananian , 13-Jan-1998 - * - * Added support for a Unix98-style ptmx device. - * -- C. Scott Ananian , 14-Jan-1998 - * - * Reduced memory usage for older ARM systems - * -- Russell King - * - * Move do_SAK() into process context. Less stack use in devfs functions. - * alloc_tty_struct() always uses kmalloc() - * -- Andrew Morton 17Mar01 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include - -#undef TTY_DEBUG_HANGUP - -#define TTY_PARANOIA_CHECK 1 -#define CHECK_TTY_COUNT 1 - -struct ktermios tty_std_termios = { /* for the benefit of tty drivers */ - .c_iflag = ICRNL | IXON, - .c_oflag = OPOST | ONLCR, - .c_cflag = B38400 | CS8 | CREAD | HUPCL, - .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK | - ECHOCTL | ECHOKE | IEXTEN, - .c_cc = INIT_C_CC, - .c_ispeed = 38400, - .c_ospeed = 38400 -}; - -EXPORT_SYMBOL(tty_std_termios); - -/* This list gets poked at by procfs and various bits of boot up code. This - could do with some rationalisation such as pulling the tty proc function - into this file */ - -LIST_HEAD(tty_drivers); /* linked list of tty drivers */ - -/* Mutex to protect creating and releasing a tty. This is shared with - vt.c for deeply disgusting hack reasons */ -DEFINE_MUTEX(tty_mutex); -EXPORT_SYMBOL(tty_mutex); - -static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *); -static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *); -ssize_t redirected_tty_write(struct file *, const char __user *, - size_t, loff_t *); -static unsigned int tty_poll(struct file *, poll_table *); -static int tty_open(struct inode *, struct file *); -long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg); -#ifdef CONFIG_COMPAT -static long tty_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg); -#else -#define tty_compat_ioctl NULL -#endif -static int tty_fasync(int fd, struct file *filp, int on); -static void release_tty(struct tty_struct *tty, int idx); -static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); -static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty); - -/** - * alloc_tty_struct - allocate a tty object - * - * Return a new empty tty structure. The data fields have not - * been initialized in any way but has been zeroed - * - * Locking: none - */ - -struct tty_struct *alloc_tty_struct(void) -{ - return kzalloc(sizeof(struct tty_struct), GFP_KERNEL); -} - -/** - * free_tty_struct - free a disused tty - * @tty: tty struct to free - * - * Free the write buffers, tty queue and tty memory itself. - * - * Locking: none. Must be called after tty is definitely unused - */ - -void free_tty_struct(struct tty_struct *tty) -{ - kfree(tty->write_buf); - tty_buffer_free_all(tty); - kfree(tty); -} - -#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base) - -/** - * tty_name - return tty naming - * @tty: tty structure - * @buf: buffer for output - * - * Convert a tty structure into a name. The name reflects the kernel - * naming policy and if udev is in use may not reflect user space - * - * Locking: none - */ - -char *tty_name(struct tty_struct *tty, char *buf) -{ - if (!tty) /* Hmm. NULL pointer. That's fun. */ - strcpy(buf, "NULL tty"); - else - strcpy(buf, tty->name); - return buf; -} - -EXPORT_SYMBOL(tty_name); - -int tty_paranoia_check(struct tty_struct *tty, struct inode *inode, - const char *routine) -{ -#ifdef TTY_PARANOIA_CHECK - if (!tty) { - printk(KERN_WARNING - "null TTY for (%d:%d) in %s\n", - imajor(inode), iminor(inode), routine); - return 1; - } - if (tty->magic != TTY_MAGIC) { - printk(KERN_WARNING - "bad magic number for tty struct (%d:%d) in %s\n", - imajor(inode), iminor(inode), routine); - return 1; - } -#endif - return 0; -} - -static int check_tty_count(struct tty_struct *tty, const char *routine) -{ -#ifdef CHECK_TTY_COUNT - struct list_head *p; - int count = 0; - - file_list_lock(); - list_for_each(p, &tty->tty_files) { - count++; - } - file_list_unlock(); - if (tty->driver->type == TTY_DRIVER_TYPE_PTY && - tty->driver->subtype == PTY_TYPE_SLAVE && - tty->link && tty->link->count) - count++; - if (tty->count != count) { - printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) " - "!= #fd's(%d) in %s\n", - tty->name, tty->count, count, routine); - return count; - } -#endif - return 0; -} - -/** - * get_tty_driver - find device of a tty - * @dev_t: device identifier - * @index: returns the index of the tty - * - * This routine returns a tty driver structure, given a device number - * and also passes back the index number. - * - * Locking: caller must hold tty_mutex - */ - -static struct tty_driver *get_tty_driver(dev_t device, int *index) -{ - struct tty_driver *p; - - list_for_each_entry(p, &tty_drivers, tty_drivers) { - dev_t base = MKDEV(p->major, p->minor_start); - if (device < base || device >= base + p->num) - continue; - *index = device - base; - return tty_driver_kref_get(p); - } - return NULL; -} - -#ifdef CONFIG_CONSOLE_POLL - -/** - * tty_find_polling_driver - find device of a polled tty - * @name: name string to match - * @line: pointer to resulting tty line nr - * - * This routine returns a tty driver structure, given a name - * and the condition that the tty driver is capable of polled - * operation. - */ -struct tty_driver *tty_find_polling_driver(char *name, int *line) -{ - struct tty_driver *p, *res = NULL; - int tty_line = 0; - int len; - char *str, *stp; - - for (str = name; *str; str++) - if ((*str >= '0' && *str <= '9') || *str == ',') - break; - if (!*str) - return NULL; - - len = str - name; - tty_line = simple_strtoul(str, &str, 10); - - mutex_lock(&tty_mutex); - /* Search through the tty devices to look for a match */ - list_for_each_entry(p, &tty_drivers, tty_drivers) { - if (strncmp(name, p->name, len) != 0) - continue; - stp = str; - if (*stp == ',') - stp++; - if (*stp == '\0') - stp = NULL; - - if (tty_line >= 0 && tty_line <= p->num && p->ops && - p->ops->poll_init && !p->ops->poll_init(p, tty_line, stp)) { - res = tty_driver_kref_get(p); - *line = tty_line; - break; - } - } - mutex_unlock(&tty_mutex); - - return res; -} -EXPORT_SYMBOL_GPL(tty_find_polling_driver); -#endif - -/** - * tty_check_change - check for POSIX terminal changes - * @tty: tty to check - * - * If we try to write to, or set the state of, a terminal and we're - * not in the foreground, send a SIGTTOU. If the signal is blocked or - * ignored, go ahead and perform the operation. (POSIX 7.2) - * - * Locking: ctrl_lock - */ - -int tty_check_change(struct tty_struct *tty) -{ - unsigned long flags; - int ret = 0; - - if (current->signal->tty != tty) - return 0; - - spin_lock_irqsave(&tty->ctrl_lock, flags); - - if (!tty->pgrp) { - printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n"); - goto out_unlock; - } - if (task_pgrp(current) == tty->pgrp) - goto out_unlock; - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - if (is_ignored(SIGTTOU)) - goto out; - if (is_current_pgrp_orphaned()) { - ret = -EIO; - goto out; - } - kill_pgrp(task_pgrp(current), SIGTTOU, 1); - set_thread_flag(TIF_SIGPENDING); - ret = -ERESTARTSYS; -out: - return ret; -out_unlock: - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - return ret; -} - -EXPORT_SYMBOL(tty_check_change); - -static ssize_t hung_up_tty_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - return 0; -} - -static ssize_t hung_up_tty_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - return -EIO; -} - -/* No kernel lock held - none needed ;) */ -static unsigned int hung_up_tty_poll(struct file *filp, poll_table *wait) -{ - return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM; -} - -static long hung_up_tty_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - return cmd == TIOCSPGRP ? -ENOTTY : -EIO; -} - -static long hung_up_tty_compat_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) -{ - return cmd == TIOCSPGRP ? -ENOTTY : -EIO; -} - -static const struct file_operations tty_fops = { - .llseek = no_llseek, - .read = tty_read, - .write = tty_write, - .poll = tty_poll, - .unlocked_ioctl = tty_ioctl, - .compat_ioctl = tty_compat_ioctl, - .open = tty_open, - .release = tty_release, - .fasync = tty_fasync, -}; - -static const struct file_operations console_fops = { - .llseek = no_llseek, - .read = tty_read, - .write = redirected_tty_write, - .poll = tty_poll, - .unlocked_ioctl = tty_ioctl, - .compat_ioctl = tty_compat_ioctl, - .open = tty_open, - .release = tty_release, - .fasync = tty_fasync, -}; - -static const struct file_operations hung_up_tty_fops = { - .llseek = no_llseek, - .read = hung_up_tty_read, - .write = hung_up_tty_write, - .poll = hung_up_tty_poll, - .unlocked_ioctl = hung_up_tty_ioctl, - .compat_ioctl = hung_up_tty_compat_ioctl, - .release = tty_release, -}; - -static DEFINE_SPINLOCK(redirect_lock); -static struct file *redirect; - -/** - * tty_wakeup - request more data - * @tty: terminal - * - * Internal and external helper for wakeups of tty. This function - * informs the line discipline if present that the driver is ready - * to receive more output data. - */ - -void tty_wakeup(struct tty_struct *tty) -{ - struct tty_ldisc *ld; - - if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) { - ld = tty_ldisc_ref(tty); - if (ld) { - if (ld->ops->write_wakeup) - ld->ops->write_wakeup(tty); - tty_ldisc_deref(ld); - } - } - wake_up_interruptible_poll(&tty->write_wait, POLLOUT); -} - -EXPORT_SYMBOL_GPL(tty_wakeup); - -/** - * do_tty_hangup - actual handler for hangup events - * @work: tty device - * - * This can be called by the "eventd" kernel thread. That is process - * synchronous but doesn't hold any locks, so we need to make sure we - * have the appropriate locks for what we're doing. - * - * The hangup event clears any pending redirections onto the hung up - * device. It ensures future writes will error and it does the needed - * line discipline hangup and signal delivery. The tty object itself - * remains intact. - * - * Locking: - * BKL - * redirect lock for undoing redirection - * file list lock for manipulating list of ttys - * tty_ldisc_lock from called functions - * termios_mutex resetting termios data - * tasklist_lock to walk task list for hangup event - * ->siglock to protect ->signal/->sighand - */ -static void do_tty_hangup(struct work_struct *work) -{ - struct tty_struct *tty = - container_of(work, struct tty_struct, hangup_work); - struct file *cons_filp = NULL; - struct file *filp, *f = NULL; - struct task_struct *p; - int closecount = 0, n; - unsigned long flags; - int refs = 0; - - if (!tty) - return; - - - spin_lock(&redirect_lock); - if (redirect && redirect->private_data == tty) { - f = redirect; - redirect = NULL; - } - spin_unlock(&redirect_lock); - - /* inuse_filps is protected by the single kernel lock */ - lock_kernel(); - check_tty_count(tty, "do_tty_hangup"); - - file_list_lock(); - /* This breaks for file handles being sent over AF_UNIX sockets ? */ - list_for_each_entry(filp, &tty->tty_files, f_u.fu_list) { - if (filp->f_op->write == redirected_tty_write) - cons_filp = filp; - if (filp->f_op->write != tty_write) - continue; - closecount++; - tty_fasync(-1, filp, 0); /* can't block */ - filp->f_op = &hung_up_tty_fops; - } - file_list_unlock(); - - tty_ldisc_hangup(tty); - - read_lock(&tasklist_lock); - if (tty->session) { - do_each_pid_task(tty->session, PIDTYPE_SID, p) { - spin_lock_irq(&p->sighand->siglock); - if (p->signal->tty == tty) { - p->signal->tty = NULL; - /* We defer the dereferences outside fo - the tasklist lock */ - refs++; - } - if (!p->signal->leader) { - spin_unlock_irq(&p->sighand->siglock); - continue; - } - __group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p); - __group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p); - put_pid(p->signal->tty_old_pgrp); /* A noop */ - spin_lock_irqsave(&tty->ctrl_lock, flags); - if (tty->pgrp) - p->signal->tty_old_pgrp = get_pid(tty->pgrp); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - spin_unlock_irq(&p->sighand->siglock); - } while_each_pid_task(tty->session, PIDTYPE_SID, p); - } - read_unlock(&tasklist_lock); - - spin_lock_irqsave(&tty->ctrl_lock, flags); - clear_bit(TTY_THROTTLED, &tty->flags); - clear_bit(TTY_PUSH, &tty->flags); - clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); - put_pid(tty->session); - put_pid(tty->pgrp); - tty->session = NULL; - tty->pgrp = NULL; - tty->ctrl_status = 0; - set_bit(TTY_HUPPED, &tty->flags); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - - /* Account for the p->signal references we killed */ - while (refs--) - tty_kref_put(tty); - - /* - * If one of the devices matches a console pointer, we - * cannot just call hangup() because that will cause - * tty->count and state->count to go out of sync. - * So we just call close() the right number of times. - */ - if (cons_filp) { - if (tty->ops->close) - for (n = 0; n < closecount; n++) - tty->ops->close(tty, cons_filp); - } else if (tty->ops->hangup) - (tty->ops->hangup)(tty); - /* - * We don't want to have driver/ldisc interactions beyond - * the ones we did here. The driver layer expects no - * calls after ->hangup() from the ldisc side. However we - * can't yet guarantee all that. - */ - set_bit(TTY_HUPPED, &tty->flags); - tty_ldisc_enable(tty); - unlock_kernel(); - if (f) - fput(f); -} - -/** - * tty_hangup - trigger a hangup event - * @tty: tty to hangup - * - * A carrier loss (virtual or otherwise) has occurred on this like - * schedule a hangup sequence to run after this event. - */ - -void tty_hangup(struct tty_struct *tty) -{ -#ifdef TTY_DEBUG_HANGUP - char buf[64]; - printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf)); -#endif - schedule_work(&tty->hangup_work); -} - -EXPORT_SYMBOL(tty_hangup); - -/** - * tty_vhangup - process vhangup - * @tty: tty to hangup - * - * The user has asked via system call for the terminal to be hung up. - * We do this synchronously so that when the syscall returns the process - * is complete. That guarantee is necessary for security reasons. - */ - -void tty_vhangup(struct tty_struct *tty) -{ -#ifdef TTY_DEBUG_HANGUP - char buf[64]; - - printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf)); -#endif - do_tty_hangup(&tty->hangup_work); -} - -EXPORT_SYMBOL(tty_vhangup); - -/** - * tty_vhangup_self - process vhangup for own ctty - * - * Perform a vhangup on the current controlling tty - */ - -void tty_vhangup_self(void) -{ - struct tty_struct *tty; - - tty = get_current_tty(); - if (tty) { - tty_vhangup(tty); - tty_kref_put(tty); - } -} - -/** - * tty_hung_up_p - was tty hung up - * @filp: file pointer of tty - * - * Return true if the tty has been subject to a vhangup or a carrier - * loss - */ - -int tty_hung_up_p(struct file *filp) -{ - return (filp->f_op == &hung_up_tty_fops); -} - -EXPORT_SYMBOL(tty_hung_up_p); - -static void session_clear_tty(struct pid *session) -{ - struct task_struct *p; - do_each_pid_task(session, PIDTYPE_SID, p) { - proc_clear_tty(p); - } while_each_pid_task(session, PIDTYPE_SID, p); -} - -/** - * disassociate_ctty - disconnect controlling tty - * @on_exit: true if exiting so need to "hang up" the session - * - * This function is typically called only by the session leader, when - * it wants to disassociate itself from its controlling tty. - * - * It performs the following functions: - * (1) Sends a SIGHUP and SIGCONT to the foreground process group - * (2) Clears the tty from being controlling the session - * (3) Clears the controlling tty for all processes in the - * session group. - * - * The argument on_exit is set to 1 if called when a process is - * exiting; it is 0 if called by the ioctl TIOCNOTTY. - * - * Locking: - * BKL is taken for hysterical raisins - * tty_mutex is taken to protect tty - * ->siglock is taken to protect ->signal/->sighand - * tasklist_lock is taken to walk process list for sessions - * ->siglock is taken to protect ->signal/->sighand - */ - -void disassociate_ctty(int on_exit) -{ - struct tty_struct *tty; - struct pid *tty_pgrp = NULL; - - if (!current->signal->leader) - return; - - tty = get_current_tty(); - if (tty) { - tty_pgrp = get_pid(tty->pgrp); - lock_kernel(); - if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY) - tty_vhangup(tty); - unlock_kernel(); - tty_kref_put(tty); - } else if (on_exit) { - struct pid *old_pgrp; - spin_lock_irq(¤t->sighand->siglock); - old_pgrp = current->signal->tty_old_pgrp; - current->signal->tty_old_pgrp = NULL; - spin_unlock_irq(¤t->sighand->siglock); - if (old_pgrp) { - kill_pgrp(old_pgrp, SIGHUP, on_exit); - kill_pgrp(old_pgrp, SIGCONT, on_exit); - put_pid(old_pgrp); - } - return; - } - if (tty_pgrp) { - kill_pgrp(tty_pgrp, SIGHUP, on_exit); - if (!on_exit) - kill_pgrp(tty_pgrp, SIGCONT, on_exit); - put_pid(tty_pgrp); - } - - spin_lock_irq(¤t->sighand->siglock); - put_pid(current->signal->tty_old_pgrp); - current->signal->tty_old_pgrp = NULL; - spin_unlock_irq(¤t->sighand->siglock); - - tty = get_current_tty(); - if (tty) { - unsigned long flags; - spin_lock_irqsave(&tty->ctrl_lock, flags); - put_pid(tty->session); - put_pid(tty->pgrp); - tty->session = NULL; - tty->pgrp = NULL; - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - tty_kref_put(tty); - } else { -#ifdef TTY_DEBUG_HANGUP - printk(KERN_DEBUG "error attempted to write to tty [0x%p]" - " = NULL", tty); -#endif - } - - /* Now clear signal->tty under the lock */ - read_lock(&tasklist_lock); - session_clear_tty(task_session(current)); - read_unlock(&tasklist_lock); -} - -/** - * - * no_tty - Ensure the current process does not have a controlling tty - */ -void no_tty(void) -{ - struct task_struct *tsk = current; - lock_kernel(); - disassociate_ctty(0); - unlock_kernel(); - proc_clear_tty(tsk); -} - - -/** - * stop_tty - propagate flow control - * @tty: tty to stop - * - * Perform flow control to the driver. For PTY/TTY pairs we - * must also propagate the TIOCKPKT status. May be called - * on an already stopped device and will not re-call the driver - * method. - * - * This functionality is used by both the line disciplines for - * halting incoming flow and by the driver. It may therefore be - * called from any context, may be under the tty atomic_write_lock - * but not always. - * - * Locking: - * Uses the tty control lock internally - */ - -void stop_tty(struct tty_struct *tty) -{ - unsigned long flags; - spin_lock_irqsave(&tty->ctrl_lock, flags); - if (tty->stopped) { - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - return; - } - tty->stopped = 1; - if (tty->link && tty->link->packet) { - tty->ctrl_status &= ~TIOCPKT_START; - tty->ctrl_status |= TIOCPKT_STOP; - wake_up_interruptible_poll(&tty->link->read_wait, POLLIN); - } - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - if (tty->ops->stop) - (tty->ops->stop)(tty); -} - -EXPORT_SYMBOL(stop_tty); - -/** - * start_tty - propagate flow control - * @tty: tty to start - * - * Start a tty that has been stopped if at all possible. Perform - * any necessary wakeups and propagate the TIOCPKT status. If this - * is the tty was previous stopped and is being started then the - * driver start method is invoked and the line discipline woken. - * - * Locking: - * ctrl_lock - */ - -void start_tty(struct tty_struct *tty) -{ - unsigned long flags; - spin_lock_irqsave(&tty->ctrl_lock, flags); - if (!tty->stopped || tty->flow_stopped) { - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - return; - } - tty->stopped = 0; - if (tty->link && tty->link->packet) { - tty->ctrl_status &= ~TIOCPKT_STOP; - tty->ctrl_status |= TIOCPKT_START; - wake_up_interruptible_poll(&tty->link->read_wait, POLLIN); - } - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - if (tty->ops->start) - (tty->ops->start)(tty); - /* If we have a running line discipline it may need kicking */ - tty_wakeup(tty); -} - -EXPORT_SYMBOL(start_tty); - -/** - * tty_read - read method for tty device files - * @file: pointer to tty file - * @buf: user buffer - * @count: size of user buffer - * @ppos: unused - * - * Perform the read system call function on this terminal device. Checks - * for hung up devices before calling the line discipline method. - * - * Locking: - * Locks the line discipline internally while needed. Multiple - * read calls may be outstanding in parallel. - */ - -static ssize_t tty_read(struct file *file, char __user *buf, size_t count, - loff_t *ppos) -{ - int i; - struct tty_struct *tty; - struct inode *inode; - struct tty_ldisc *ld; - - tty = (struct tty_struct *)file->private_data; - inode = file->f_path.dentry->d_inode; - if (tty_paranoia_check(tty, inode, "tty_read")) - return -EIO; - if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags))) - return -EIO; - - /* We want to wait for the line discipline to sort out in this - situation */ - ld = tty_ldisc_ref_wait(tty); - if (ld->ops->read) - i = (ld->ops->read)(tty, file, buf, count); - else - i = -EIO; - tty_ldisc_deref(ld); - if (i > 0) - inode->i_atime = current_fs_time(inode->i_sb); - return i; -} - -void tty_write_unlock(struct tty_struct *tty) -{ - mutex_unlock(&tty->atomic_write_lock); - wake_up_interruptible_poll(&tty->write_wait, POLLOUT); -} - -int tty_write_lock(struct tty_struct *tty, int ndelay) -{ - if (!mutex_trylock(&tty->atomic_write_lock)) { - if (ndelay) - return -EAGAIN; - if (mutex_lock_interruptible(&tty->atomic_write_lock)) - return -ERESTARTSYS; - } - return 0; -} - -/* - * Split writes up in sane blocksizes to avoid - * denial-of-service type attacks - */ -static inline ssize_t do_tty_write( - ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t), - struct tty_struct *tty, - struct file *file, - const char __user *buf, - size_t count) -{ - ssize_t ret, written = 0; - unsigned int chunk; - - ret = tty_write_lock(tty, file->f_flags & O_NDELAY); - if (ret < 0) - return ret; - - /* - * We chunk up writes into a temporary buffer. This - * simplifies low-level drivers immensely, since they - * don't have locking issues and user mode accesses. - * - * But if TTY_NO_WRITE_SPLIT is set, we should use a - * big chunk-size.. - * - * The default chunk-size is 2kB, because the NTTY - * layer has problems with bigger chunks. It will - * claim to be able to handle more characters than - * it actually does. - * - * FIXME: This can probably go away now except that 64K chunks - * are too likely to fail unless switched to vmalloc... - */ - chunk = 2048; - if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags)) - chunk = 65536; - if (count < chunk) - chunk = count; - - /* write_buf/write_cnt is protected by the atomic_write_lock mutex */ - if (tty->write_cnt < chunk) { - unsigned char *buf_chunk; - - if (chunk < 1024) - chunk = 1024; - - buf_chunk = kmalloc(chunk, GFP_KERNEL); - if (!buf_chunk) { - ret = -ENOMEM; - goto out; - } - kfree(tty->write_buf); - tty->write_cnt = chunk; - tty->write_buf = buf_chunk; - } - - /* Do the write .. */ - for (;;) { - size_t size = count; - if (size > chunk) - size = chunk; - ret = -EFAULT; - if (copy_from_user(tty->write_buf, buf, size)) - break; - ret = write(tty, file, tty->write_buf, size); - if (ret <= 0) - break; - written += ret; - buf += ret; - count -= ret; - if (!count) - break; - ret = -ERESTARTSYS; - if (signal_pending(current)) - break; - cond_resched(); - } - if (written) { - struct inode *inode = file->f_path.dentry->d_inode; - inode->i_mtime = current_fs_time(inode->i_sb); - ret = written; - } -out: - tty_write_unlock(tty); - return ret; -} - -/** - * tty_write_message - write a message to a certain tty, not just the console. - * @tty: the destination tty_struct - * @msg: the message to write - * - * This is used for messages that need to be redirected to a specific tty. - * We don't put it into the syslog queue right now maybe in the future if - * really needed. - * - * We must still hold the BKL and test the CLOSING flag for the moment. - */ - -void tty_write_message(struct tty_struct *tty, char *msg) -{ - if (tty) { - mutex_lock(&tty->atomic_write_lock); - lock_kernel(); - if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags)) { - unlock_kernel(); - tty->ops->write(tty, msg, strlen(msg)); - } else - unlock_kernel(); - tty_write_unlock(tty); - } - return; -} - - -/** - * tty_write - write method for tty device file - * @file: tty file pointer - * @buf: user data to write - * @count: bytes to write - * @ppos: unused - * - * Write data to a tty device via the line discipline. - * - * Locking: - * Locks the line discipline as required - * Writes to the tty driver are serialized by the atomic_write_lock - * and are then processed in chunks to the device. The line discipline - * write method will not be invoked in parallel for each device. - */ - -static ssize_t tty_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - struct tty_struct *tty; - struct inode *inode = file->f_path.dentry->d_inode; - ssize_t ret; - struct tty_ldisc *ld; - - tty = (struct tty_struct *)file->private_data; - if (tty_paranoia_check(tty, inode, "tty_write")) - return -EIO; - if (!tty || !tty->ops->write || - (test_bit(TTY_IO_ERROR, &tty->flags))) - return -EIO; - /* Short term debug to catch buggy drivers */ - if (tty->ops->write_room == NULL) - printk(KERN_ERR "tty driver %s lacks a write_room method.\n", - tty->driver->name); - ld = tty_ldisc_ref_wait(tty); - if (!ld->ops->write) - ret = -EIO; - else - ret = do_tty_write(ld->ops->write, tty, file, buf, count); - tty_ldisc_deref(ld); - return ret; -} - -ssize_t redirected_tty_write(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - struct file *p = NULL; - - spin_lock(&redirect_lock); - if (redirect) { - get_file(redirect); - p = redirect; - } - spin_unlock(&redirect_lock); - - if (p) { - ssize_t res; - res = vfs_write(p, buf, count, &p->f_pos); - fput(p); - return res; - } - return tty_write(file, buf, count, ppos); -} - -static char ptychar[] = "pqrstuvwxyzabcde"; - -/** - * pty_line_name - generate name for a pty - * @driver: the tty driver in use - * @index: the minor number - * @p: output buffer of at least 6 bytes - * - * Generate a name from a driver reference and write it to the output - * buffer. - * - * Locking: None - */ -static void pty_line_name(struct tty_driver *driver, int index, char *p) -{ - int i = index + driver->name_base; - /* ->name is initialized to "ttyp", but "tty" is expected */ - sprintf(p, "%s%c%x", - driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name, - ptychar[i >> 4 & 0xf], i & 0xf); -} - -/** - * tty_line_name - generate name for a tty - * @driver: the tty driver in use - * @index: the minor number - * @p: output buffer of at least 7 bytes - * - * Generate a name from a driver reference and write it to the output - * buffer. - * - * Locking: None - */ -static void tty_line_name(struct tty_driver *driver, int index, char *p) -{ - sprintf(p, "%s%d", driver->name, index + driver->name_base); -} - -/** - * tty_driver_lookup_tty() - find an existing tty, if any - * @driver: the driver for the tty - * @idx: the minor number - * - * Return the tty, if found or ERR_PTR() otherwise. - * - * Locking: tty_mutex must be held. If tty is found, the mutex must - * be held until the 'fast-open' is also done. Will change once we - * have refcounting in the driver and per driver locking - */ -static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver, - struct inode *inode, int idx) -{ - struct tty_struct *tty; - - if (driver->ops->lookup) - return driver->ops->lookup(driver, inode, idx); - - tty = driver->ttys[idx]; - return tty; -} - -/** - * tty_init_termios - helper for termios setup - * @tty: the tty to set up - * - * Initialise the termios structures for this tty. Thus runs under - * the tty_mutex currently so we can be relaxed about ordering. - */ - -int tty_init_termios(struct tty_struct *tty) -{ - struct ktermios *tp; - int idx = tty->index; - - tp = tty->driver->termios[idx]; - if (tp == NULL) { - tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL); - if (tp == NULL) - return -ENOMEM; - memcpy(tp, &tty->driver->init_termios, - sizeof(struct ktermios)); - tty->driver->termios[idx] = tp; - } - tty->termios = tp; - tty->termios_locked = tp + 1; - - /* Compatibility until drivers always set this */ - tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); - tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); - return 0; -} -EXPORT_SYMBOL_GPL(tty_init_termios); - -/** - * tty_driver_install_tty() - install a tty entry in the driver - * @driver: the driver for the tty - * @tty: the tty - * - * Install a tty object into the driver tables. The tty->index field - * will be set by the time this is called. This method is responsible - * for ensuring any need additional structures are allocated and - * configured. - * - * Locking: tty_mutex for now - */ -static int tty_driver_install_tty(struct tty_driver *driver, - struct tty_struct *tty) -{ - int idx = tty->index; - int ret; - - if (driver->ops->install) { - lock_kernel(); - ret = driver->ops->install(driver, tty); - unlock_kernel(); - return ret; - } - - if (tty_init_termios(tty) == 0) { - lock_kernel(); - tty_driver_kref_get(driver); - tty->count++; - driver->ttys[idx] = tty; - unlock_kernel(); - return 0; - } - return -ENOMEM; -} - -/** - * tty_driver_remove_tty() - remove a tty from the driver tables - * @driver: the driver for the tty - * @idx: the minor number - * - * Remvoe a tty object from the driver tables. The tty->index field - * will be set by the time this is called. - * - * Locking: tty_mutex for now - */ -static void tty_driver_remove_tty(struct tty_driver *driver, - struct tty_struct *tty) -{ - if (driver->ops->remove) - driver->ops->remove(driver, tty); - else - driver->ttys[tty->index] = NULL; -} - -/* - * tty_reopen() - fast re-open of an open tty - * @tty - the tty to open - * - * Return 0 on success, -errno on error. - * - * Locking: tty_mutex must be held from the time the tty was found - * till this open completes. - */ -static int tty_reopen(struct tty_struct *tty) -{ - struct tty_driver *driver = tty->driver; - - if (test_bit(TTY_CLOSING, &tty->flags)) - return -EIO; - - if (driver->type == TTY_DRIVER_TYPE_PTY && - driver->subtype == PTY_TYPE_MASTER) { - /* - * special case for PTY masters: only one open permitted, - * and the slave side open count is incremented as well. - */ - if (tty->count) - return -EIO; - - tty->link->count++; - } - tty->count++; - tty->driver = driver; /* N.B. why do this every time?? */ - - mutex_lock(&tty->ldisc_mutex); - WARN_ON(!test_bit(TTY_LDISC, &tty->flags)); - mutex_unlock(&tty->ldisc_mutex); - - return 0; -} - -/** - * tty_init_dev - initialise a tty device - * @driver: tty driver we are opening a device on - * @idx: device index - * @ret_tty: returned tty structure - * @first_ok: ok to open a new device (used by ptmx) - * - * Prepare a tty device. This may not be a "new" clean device but - * could also be an active device. The pty drivers require special - * handling because of this. - * - * Locking: - * The function is called under the tty_mutex, which - * protects us from the tty struct or driver itself going away. - * - * On exit the tty device has the line discipline attached and - * a reference count of 1. If a pair was created for pty/tty use - * and the other was a pty master then it too has a reference count of 1. - * - * WSH 06/09/97: Rewritten to remove races and properly clean up after a - * failed open. The new code protects the open with a mutex, so it's - * really quite straightforward. The mutex locking can probably be - * relaxed for the (most common) case of reopening a tty. - */ - -struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx, - int first_ok) -{ - struct tty_struct *tty; - int retval; - - lock_kernel(); - /* Check if pty master is being opened multiple times */ - if (driver->subtype == PTY_TYPE_MASTER && - (driver->flags & TTY_DRIVER_DEVPTS_MEM) && !first_ok) { - unlock_kernel(); - return ERR_PTR(-EIO); - } - unlock_kernel(); - - /* - * First time open is complex, especially for PTY devices. - * This code guarantees that either everything succeeds and the - * TTY is ready for operation, or else the table slots are vacated - * and the allocated memory released. (Except that the termios - * and locked termios may be retained.) - */ - - if (!try_module_get(driver->owner)) - return ERR_PTR(-ENODEV); - - tty = alloc_tty_struct(); - if (!tty) - goto fail_no_mem; - initialize_tty_struct(tty, driver, idx); - - retval = tty_driver_install_tty(driver, tty); - if (retval < 0) { - free_tty_struct(tty); - module_put(driver->owner); - return ERR_PTR(retval); - } - - /* - * Structures all installed ... call the ldisc open routines. - * If we fail here just call release_tty to clean up. No need - * to decrement the use counts, as release_tty doesn't care. - */ - retval = tty_ldisc_setup(tty, tty->link); - if (retval) - goto release_mem_out; - return tty; - -fail_no_mem: - module_put(driver->owner); - return ERR_PTR(-ENOMEM); - - /* call the tty release_tty routine to clean out this slot */ -release_mem_out: - if (printk_ratelimit()) - printk(KERN_INFO "tty_init_dev: ldisc open failed, " - "clearing slot %d\n", idx); - lock_kernel(); - release_tty(tty, idx); - unlock_kernel(); - return ERR_PTR(retval); -} - -void tty_free_termios(struct tty_struct *tty) -{ - struct ktermios *tp; - int idx = tty->index; - /* Kill this flag and push into drivers for locking etc */ - if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { - /* FIXME: Locking on ->termios array */ - tp = tty->termios; - tty->driver->termios[idx] = NULL; - kfree(tp); - } -} -EXPORT_SYMBOL(tty_free_termios); - -void tty_shutdown(struct tty_struct *tty) -{ - tty_driver_remove_tty(tty->driver, tty); - tty_free_termios(tty); -} -EXPORT_SYMBOL(tty_shutdown); - -/** - * release_one_tty - release tty structure memory - * @kref: kref of tty we are obliterating - * - * Releases memory associated with a tty structure, and clears out the - * driver table slots. This function is called when a device is no longer - * in use. It also gets called when setup of a device fails. - * - * Locking: - * tty_mutex - sometimes only - * takes the file list lock internally when working on the list - * of ttys that the driver keeps. - * - * This method gets called from a work queue so that the driver private - * cleanup ops can sleep (needed for USB at least) - */ -static void release_one_tty(struct work_struct *work) -{ - struct tty_struct *tty = - container_of(work, struct tty_struct, hangup_work); - struct tty_driver *driver = tty->driver; - - if (tty->ops->cleanup) - tty->ops->cleanup(tty); - - tty->magic = 0; - tty_driver_kref_put(driver); - module_put(driver->owner); - - file_list_lock(); - list_del_init(&tty->tty_files); - file_list_unlock(); - - put_pid(tty->pgrp); - put_pid(tty->session); - free_tty_struct(tty); -} - -static void queue_release_one_tty(struct kref *kref) -{ - struct tty_struct *tty = container_of(kref, struct tty_struct, kref); - - if (tty->ops->shutdown) - tty->ops->shutdown(tty); - else - tty_shutdown(tty); - - /* The hangup queue is now free so we can reuse it rather than - waste a chunk of memory for each port */ - INIT_WORK(&tty->hangup_work, release_one_tty); - schedule_work(&tty->hangup_work); -} - -/** - * tty_kref_put - release a tty kref - * @tty: tty device - * - * Release a reference to a tty device and if need be let the kref - * layer destruct the object for us - */ - -void tty_kref_put(struct tty_struct *tty) -{ - if (tty) - kref_put(&tty->kref, queue_release_one_tty); -} -EXPORT_SYMBOL(tty_kref_put); - -/** - * release_tty - release tty structure memory - * - * Release both @tty and a possible linked partner (think pty pair), - * and decrement the refcount of the backing module. - * - * Locking: - * tty_mutex - sometimes only - * takes the file list lock internally when working on the list - * of ttys that the driver keeps. - * FIXME: should we require tty_mutex is held here ?? - * - */ -static void release_tty(struct tty_struct *tty, int idx) -{ - /* This should always be true but check for the moment */ - WARN_ON(tty->index != idx); - - if (tty->link) - tty_kref_put(tty->link); - tty_kref_put(tty); -} - -/** - * tty_release - vfs callback for close - * @inode: inode of tty - * @filp: file pointer for handle to tty - * - * Called the last time each file handle is closed that references - * this tty. There may however be several such references. - * - * Locking: - * Takes bkl. See tty_release_dev - * - * Even releasing the tty structures is a tricky business.. We have - * to be very careful that the structures are all released at the - * same time, as interrupts might otherwise get the wrong pointers. - * - * WSH 09/09/97: rewritten to avoid some nasty race conditions that could - * lead to double frees or releasing memory still in use. - */ - -int tty_release(struct inode *inode, struct file *filp) -{ - struct tty_struct *tty, *o_tty; - int pty_master, tty_closing, o_tty_closing, do_sleep; - int devpts; - int idx; - char buf[64]; - - tty = (struct tty_struct *)filp->private_data; - if (tty_paranoia_check(tty, inode, "tty_release_dev")) - return 0; - - lock_kernel(); - check_tty_count(tty, "tty_release_dev"); - - tty_fasync(-1, filp, 0); - - idx = tty->index; - pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY && - tty->driver->subtype == PTY_TYPE_MASTER); - devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0; - o_tty = tty->link; - -#ifdef TTY_PARANOIA_CHECK - if (idx < 0 || idx >= tty->driver->num) { - printk(KERN_DEBUG "tty_release_dev: bad idx when trying to " - "free (%s)\n", tty->name); - unlock_kernel(); - return 0; - } - if (!devpts) { - if (tty != tty->driver->ttys[idx]) { - unlock_kernel(); - printk(KERN_DEBUG "tty_release_dev: driver.table[%d] not tty " - "for (%s)\n", idx, tty->name); - return 0; - } - if (tty->termios != tty->driver->termios[idx]) { - unlock_kernel(); - printk(KERN_DEBUG "tty_release_dev: driver.termios[%d] not termios " - "for (%s)\n", - idx, tty->name); - return 0; - } - } -#endif - -#ifdef TTY_DEBUG_HANGUP - printk(KERN_DEBUG "tty_release_dev of %s (tty count=%d)...", - tty_name(tty, buf), tty->count); -#endif - -#ifdef TTY_PARANOIA_CHECK - if (tty->driver->other && - !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) { - if (o_tty != tty->driver->other->ttys[idx]) { - unlock_kernel(); - printk(KERN_DEBUG "tty_release_dev: other->table[%d] " - "not o_tty for (%s)\n", - idx, tty->name); - return 0 ; - } - if (o_tty->termios != tty->driver->other->termios[idx]) { - unlock_kernel(); - printk(KERN_DEBUG "tty_release_dev: other->termios[%d] " - "not o_termios for (%s)\n", - idx, tty->name); - return 0; - } - if (o_tty->link != tty) { - unlock_kernel(); - printk(KERN_DEBUG "tty_release_dev: bad pty pointers\n"); - return 0; - } - } -#endif - if (tty->ops->close) - tty->ops->close(tty, filp); - - unlock_kernel(); - /* - * Sanity check: if tty->count is going to zero, there shouldn't be - * any waiters on tty->read_wait or tty->write_wait. We test the - * wait queues and kick everyone out _before_ actually starting to - * close. This ensures that we won't block while releasing the tty - * structure. - * - * The test for the o_tty closing is necessary, since the master and - * slave sides may close in any order. If the slave side closes out - * first, its count will be one, since the master side holds an open. - * Thus this test wouldn't be triggered at the time the slave closes, - * so we do it now. - * - * Note that it's possible for the tty to be opened again while we're - * flushing out waiters. By recalculating the closing flags before - * each iteration we avoid any problems. - */ - while (1) { - /* Guard against races with tty->count changes elsewhere and - opens on /dev/tty */ - - mutex_lock(&tty_mutex); - lock_kernel(); - tty_closing = tty->count <= 1; - o_tty_closing = o_tty && - (o_tty->count <= (pty_master ? 1 : 0)); - do_sleep = 0; - - if (tty_closing) { - if (waitqueue_active(&tty->read_wait)) { - wake_up_poll(&tty->read_wait, POLLIN); - do_sleep++; - } - if (waitqueue_active(&tty->write_wait)) { - wake_up_poll(&tty->write_wait, POLLOUT); - do_sleep++; - } - } - if (o_tty_closing) { - if (waitqueue_active(&o_tty->read_wait)) { - wake_up_poll(&o_tty->read_wait, POLLIN); - do_sleep++; - } - if (waitqueue_active(&o_tty->write_wait)) { - wake_up_poll(&o_tty->write_wait, POLLOUT); - do_sleep++; - } - } - if (!do_sleep) - break; - - printk(KERN_WARNING "tty_release_dev: %s: read/write wait queue " - "active!\n", tty_name(tty, buf)); - unlock_kernel(); - mutex_unlock(&tty_mutex); - schedule(); - } - - /* - * The closing flags are now consistent with the open counts on - * both sides, and we've completed the last operation that could - * block, so it's safe to proceed with closing. - */ - if (pty_master) { - if (--o_tty->count < 0) { - printk(KERN_WARNING "tty_release_dev: bad pty slave count " - "(%d) for %s\n", - o_tty->count, tty_name(o_tty, buf)); - o_tty->count = 0; - } - } - if (--tty->count < 0) { - printk(KERN_WARNING "tty_release_dev: bad tty->count (%d) for %s\n", - tty->count, tty_name(tty, buf)); - tty->count = 0; - } - - /* - * We've decremented tty->count, so we need to remove this file - * descriptor off the tty->tty_files list; this serves two - * purposes: - * - check_tty_count sees the correct number of file descriptors - * associated with this tty. - * - do_tty_hangup no longer sees this file descriptor as - * something that needs to be handled for hangups. - */ - file_kill(filp); - filp->private_data = NULL; - - /* - * Perform some housekeeping before deciding whether to return. - * - * Set the TTY_CLOSING flag if this was the last open. In the - * case of a pty we may have to wait around for the other side - * to close, and TTY_CLOSING makes sure we can't be reopened. - */ - if (tty_closing) - set_bit(TTY_CLOSING, &tty->flags); - if (o_tty_closing) - set_bit(TTY_CLOSING, &o_tty->flags); - - /* - * If _either_ side is closing, make sure there aren't any - * processes that still think tty or o_tty is their controlling - * tty. - */ - if (tty_closing || o_tty_closing) { - read_lock(&tasklist_lock); - session_clear_tty(tty->session); - if (o_tty) - session_clear_tty(o_tty->session); - read_unlock(&tasklist_lock); - } - - mutex_unlock(&tty_mutex); - - /* check whether both sides are closing ... */ - if (!tty_closing || (o_tty && !o_tty_closing)) { - unlock_kernel(); - return 0; - } - -#ifdef TTY_DEBUG_HANGUP - printk(KERN_DEBUG "freeing tty structure..."); -#endif - /* - * Ask the line discipline code to release its structures - */ - tty_ldisc_release(tty, o_tty); - /* - * The release_tty function takes care of the details of clearing - * the slots and preserving the termios structure. - */ - release_tty(tty, idx); - - /* Make this pty number available for reallocation */ - if (devpts) - devpts_kill_index(inode, idx); - unlock_kernel(); - return 0; -} - -/** - * tty_open - open a tty device - * @inode: inode of device file - * @filp: file pointer to tty - * - * tty_open and tty_release keep up the tty count that contains the - * number of opens done on a tty. We cannot use the inode-count, as - * different inodes might point to the same tty. - * - * Open-counting is needed for pty masters, as well as for keeping - * track of serial lines: DTR is dropped when the last close happens. - * (This is not done solely through tty->count, now. - Ted 1/27/92) - * - * The termios state of a pty is reset on first open so that - * settings don't persist across reuse. - * - * Locking: tty_mutex protects tty, get_tty_driver and tty_init_dev work. - * tty->count should protect the rest. - * ->siglock protects ->signal/->sighand - */ - -static int tty_open(struct inode *inode, struct file *filp) -{ - struct tty_struct *tty = NULL; - int noctty, retval; - struct tty_driver *driver; - int index; - dev_t device = inode->i_rdev; - unsigned saved_flags = filp->f_flags; - - nonseekable_open(inode, filp); - -retry_open: - noctty = filp->f_flags & O_NOCTTY; - index = -1; - retval = 0; - - mutex_lock(&tty_mutex); - lock_kernel(); - - if (device == MKDEV(TTYAUX_MAJOR, 0)) { - tty = get_current_tty(); - if (!tty) { - unlock_kernel(); - mutex_unlock(&tty_mutex); - return -ENXIO; - } - driver = tty_driver_kref_get(tty->driver); - index = tty->index; - filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */ - /* noctty = 1; */ - /* FIXME: Should we take a driver reference ? */ - tty_kref_put(tty); - goto got_driver; - } -#ifdef CONFIG_VT - if (device == MKDEV(TTY_MAJOR, 0)) { - extern struct tty_driver *console_driver; - driver = tty_driver_kref_get(console_driver); - index = fg_console; - noctty = 1; - goto got_driver; - } -#endif - if (device == MKDEV(TTYAUX_MAJOR, 1)) { - struct tty_driver *console_driver = console_device(&index); - if (console_driver) { - driver = tty_driver_kref_get(console_driver); - if (driver) { - /* Don't let /dev/console block */ - filp->f_flags |= O_NONBLOCK; - noctty = 1; - goto got_driver; - } - } - unlock_kernel(); - mutex_unlock(&tty_mutex); - return -ENODEV; - } - - driver = get_tty_driver(device, &index); - if (!driver) { - unlock_kernel(); - mutex_unlock(&tty_mutex); - return -ENODEV; - } -got_driver: - if (!tty) { - /* check whether we're reopening an existing tty */ - tty = tty_driver_lookup_tty(driver, inode, index); - - if (IS_ERR(tty)) { - unlock_kernel(); - mutex_unlock(&tty_mutex); - return PTR_ERR(tty); - } - } - - if (tty) { - retval = tty_reopen(tty); - if (retval) - tty = ERR_PTR(retval); - } else - tty = tty_init_dev(driver, index, 0); - - mutex_unlock(&tty_mutex); - tty_driver_kref_put(driver); - if (IS_ERR(tty)) { - unlock_kernel(); - return PTR_ERR(tty); - } - - filp->private_data = tty; - file_move(filp, &tty->tty_files); - check_tty_count(tty, "tty_open"); - if (tty->driver->type == TTY_DRIVER_TYPE_PTY && - tty->driver->subtype == PTY_TYPE_MASTER) - noctty = 1; -#ifdef TTY_DEBUG_HANGUP - printk(KERN_DEBUG "opening %s...", tty->name); -#endif - if (!retval) { - if (tty->ops->open) - retval = tty->ops->open(tty, filp); - else - retval = -ENODEV; - } - filp->f_flags = saved_flags; - - if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && - !capable(CAP_SYS_ADMIN)) - retval = -EBUSY; - - if (retval) { -#ifdef TTY_DEBUG_HANGUP - printk(KERN_DEBUG "error %d in opening %s...", retval, - tty->name); -#endif - tty_release(inode, filp); - if (retval != -ERESTARTSYS) { - unlock_kernel(); - return retval; - } - if (signal_pending(current)) { - unlock_kernel(); - return retval; - } - schedule(); - /* - * Need to reset f_op in case a hangup happened. - */ - if (filp->f_op == &hung_up_tty_fops) - filp->f_op = &tty_fops; - unlock_kernel(); - goto retry_open; - } - unlock_kernel(); - - - mutex_lock(&tty_mutex); - lock_kernel(); - spin_lock_irq(¤t->sighand->siglock); - if (!noctty && - current->signal->leader && - !current->signal->tty && - tty->session == NULL) - __proc_set_tty(current, tty); - spin_unlock_irq(¤t->sighand->siglock); - unlock_kernel(); - mutex_unlock(&tty_mutex); - return 0; -} - - - -/** - * tty_poll - check tty status - * @filp: file being polled - * @wait: poll wait structures to update - * - * Call the line discipline polling method to obtain the poll - * status of the device. - * - * Locking: locks called line discipline but ldisc poll method - * may be re-entered freely by other callers. - */ - -static unsigned int tty_poll(struct file *filp, poll_table *wait) -{ - struct tty_struct *tty; - struct tty_ldisc *ld; - int ret = 0; - - tty = (struct tty_struct *)filp->private_data; - if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_poll")) - return 0; - - ld = tty_ldisc_ref_wait(tty); - if (ld->ops->poll) - ret = (ld->ops->poll)(tty, filp, wait); - tty_ldisc_deref(ld); - return ret; -} - -static int tty_fasync(int fd, struct file *filp, int on) -{ - struct tty_struct *tty; - unsigned long flags; - int retval = 0; - - lock_kernel(); - tty = (struct tty_struct *)filp->private_data; - if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_fasync")) - goto out; - - retval = fasync_helper(fd, filp, on, &tty->fasync); - if (retval <= 0) - goto out; - - if (on) { - enum pid_type type; - struct pid *pid; - if (!waitqueue_active(&tty->read_wait)) - tty->minimum_to_wake = 1; - spin_lock_irqsave(&tty->ctrl_lock, flags); - if (tty->pgrp) { - pid = tty->pgrp; - type = PIDTYPE_PGID; - } else { - pid = task_pid(current); - type = PIDTYPE_PID; - } - get_pid(pid); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - retval = __f_setown(filp, pid, type, 0); - put_pid(pid); - if (retval) - goto out; - } else { - if (!tty->fasync && !waitqueue_active(&tty->read_wait)) - tty->minimum_to_wake = N_TTY_BUF_SIZE; - } - retval = 0; -out: - unlock_kernel(); - return retval; -} - -/** - * tiocsti - fake input character - * @tty: tty to fake input into - * @p: pointer to character - * - * Fake input to a tty device. Does the necessary locking and - * input management. - * - * FIXME: does not honour flow control ?? - * - * Locking: - * Called functions take tty_ldisc_lock - * current->signal->tty check is safe without locks - * - * FIXME: may race normal receive processing - */ - -static int tiocsti(struct tty_struct *tty, char __user *p) -{ - char ch, mbz = 0; - struct tty_ldisc *ld; - - if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN)) - return -EPERM; - if (get_user(ch, p)) - return -EFAULT; - tty_audit_tiocsti(tty, ch); - ld = tty_ldisc_ref_wait(tty); - ld->ops->receive_buf(tty, &ch, &mbz, 1); - tty_ldisc_deref(ld); - return 0; -} - -/** - * tiocgwinsz - implement window query ioctl - * @tty; tty - * @arg: user buffer for result - * - * Copies the kernel idea of the window size into the user buffer. - * - * Locking: tty->termios_mutex is taken to ensure the winsize data - * is consistent. - */ - -static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg) -{ - int err; - - mutex_lock(&tty->termios_mutex); - err = copy_to_user(arg, &tty->winsize, sizeof(*arg)); - mutex_unlock(&tty->termios_mutex); - - return err ? -EFAULT: 0; -} - -/** - * tty_do_resize - resize event - * @tty: tty being resized - * @rows: rows (character) - * @cols: cols (character) - * - * Update the termios variables and send the necessary signals to - * peform a terminal resize correctly - */ - -int tty_do_resize(struct tty_struct *tty, struct winsize *ws) -{ - struct pid *pgrp; - unsigned long flags; - - /* Lock the tty */ - mutex_lock(&tty->termios_mutex); - if (!memcmp(ws, &tty->winsize, sizeof(*ws))) - goto done; - /* Get the PID values and reference them so we can - avoid holding the tty ctrl lock while sending signals */ - spin_lock_irqsave(&tty->ctrl_lock, flags); - pgrp = get_pid(tty->pgrp); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - - if (pgrp) - kill_pgrp(pgrp, SIGWINCH, 1); - put_pid(pgrp); - - tty->winsize = *ws; -done: - mutex_unlock(&tty->termios_mutex); - return 0; -} - -/** - * tiocswinsz - implement window size set ioctl - * @tty; tty side of tty - * @arg: user buffer for result - * - * Copies the user idea of the window size to the kernel. Traditionally - * this is just advisory information but for the Linux console it - * actually has driver level meaning and triggers a VC resize. - * - * Locking: - * Driver dependant. The default do_resize method takes the - * tty termios mutex and ctrl_lock. The console takes its own lock - * then calls into the default method. - */ - -static int tiocswinsz(struct tty_struct *tty, struct winsize __user *arg) -{ - struct winsize tmp_ws; - if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) - return -EFAULT; - - if (tty->ops->resize) - return tty->ops->resize(tty, &tmp_ws); - else - return tty_do_resize(tty, &tmp_ws); -} - -/** - * tioccons - allow admin to move logical console - * @file: the file to become console - * - * Allow the adminstrator to move the redirected console device - * - * Locking: uses redirect_lock to guard the redirect information - */ - -static int tioccons(struct file *file) -{ - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - if (file->f_op->write == redirected_tty_write) { - struct file *f; - spin_lock(&redirect_lock); - f = redirect; - redirect = NULL; - spin_unlock(&redirect_lock); - if (f) - fput(f); - return 0; - } - spin_lock(&redirect_lock); - if (redirect) { - spin_unlock(&redirect_lock); - return -EBUSY; - } - get_file(file); - redirect = file; - spin_unlock(&redirect_lock); - return 0; -} - -/** - * fionbio - non blocking ioctl - * @file: file to set blocking value - * @p: user parameter - * - * Historical tty interfaces had a blocking control ioctl before - * the generic functionality existed. This piece of history is preserved - * in the expected tty API of posix OS's. - * - * Locking: none, the open file handle ensures it won't go away. - */ - -static int fionbio(struct file *file, int __user *p) -{ - int nonblock; - - if (get_user(nonblock, p)) - return -EFAULT; - - spin_lock(&file->f_lock); - if (nonblock) - file->f_flags |= O_NONBLOCK; - else - file->f_flags &= ~O_NONBLOCK; - spin_unlock(&file->f_lock); - return 0; -} - -/** - * tiocsctty - set controlling tty - * @tty: tty structure - * @arg: user argument - * - * This ioctl is used to manage job control. It permits a session - * leader to set this tty as the controlling tty for the session. - * - * Locking: - * Takes tty_mutex() to protect tty instance - * Takes tasklist_lock internally to walk sessions - * Takes ->siglock() when updating signal->tty - */ - -static int tiocsctty(struct tty_struct *tty, int arg) -{ - int ret = 0; - if (current->signal->leader && (task_session(current) == tty->session)) - return ret; - - mutex_lock(&tty_mutex); - /* - * The process must be a session leader and - * not have a controlling tty already. - */ - if (!current->signal->leader || current->signal->tty) { - ret = -EPERM; - goto unlock; - } - - if (tty->session) { - /* - * This tty is already the controlling - * tty for another session group! - */ - if (arg == 1 && capable(CAP_SYS_ADMIN)) { - /* - * Steal it away - */ - read_lock(&tasklist_lock); - session_clear_tty(tty->session); - read_unlock(&tasklist_lock); - } else { - ret = -EPERM; - goto unlock; - } - } - proc_set_tty(current, tty); -unlock: - mutex_unlock(&tty_mutex); - return ret; -} - -/** - * tty_get_pgrp - return a ref counted pgrp pid - * @tty: tty to read - * - * Returns a refcounted instance of the pid struct for the process - * group controlling the tty. - */ - -struct pid *tty_get_pgrp(struct tty_struct *tty) -{ - unsigned long flags; - struct pid *pgrp; - - spin_lock_irqsave(&tty->ctrl_lock, flags); - pgrp = get_pid(tty->pgrp); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - - return pgrp; -} -EXPORT_SYMBOL_GPL(tty_get_pgrp); - -/** - * tiocgpgrp - get process group - * @tty: tty passed by user - * @real_tty: tty side of the tty pased by the user if a pty else the tty - * @p: returned pid - * - * Obtain the process group of the tty. If there is no process group - * return an error. - * - * Locking: none. Reference to current->signal->tty is safe. - */ - -static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) -{ - struct pid *pid; - int ret; - /* - * (tty == real_tty) is a cheap way of - * testing if the tty is NOT a master pty. - */ - if (tty == real_tty && current->signal->tty != real_tty) - return -ENOTTY; - pid = tty_get_pgrp(real_tty); - ret = put_user(pid_vnr(pid), p); - put_pid(pid); - return ret; -} - -/** - * tiocspgrp - attempt to set process group - * @tty: tty passed by user - * @real_tty: tty side device matching tty passed by user - * @p: pid pointer - * - * Set the process group of the tty to the session passed. Only - * permitted where the tty session is our session. - * - * Locking: RCU, ctrl lock - */ - -static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) -{ - struct pid *pgrp; - pid_t pgrp_nr; - int retval = tty_check_change(real_tty); - unsigned long flags; - - if (retval == -EIO) - return -ENOTTY; - if (retval) - return retval; - if (!current->signal->tty || - (current->signal->tty != real_tty) || - (real_tty->session != task_session(current))) - return -ENOTTY; - if (get_user(pgrp_nr, p)) - return -EFAULT; - if (pgrp_nr < 0) - return -EINVAL; - rcu_read_lock(); - pgrp = find_vpid(pgrp_nr); - retval = -ESRCH; - if (!pgrp) - goto out_unlock; - retval = -EPERM; - if (session_of_pgrp(pgrp) != task_session(current)) - goto out_unlock; - retval = 0; - spin_lock_irqsave(&tty->ctrl_lock, flags); - put_pid(real_tty->pgrp); - real_tty->pgrp = get_pid(pgrp); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); -out_unlock: - rcu_read_unlock(); - return retval; -} - -/** - * tiocgsid - get session id - * @tty: tty passed by user - * @real_tty: tty side of the tty pased by the user if a pty else the tty - * @p: pointer to returned session id - * - * Obtain the session id of the tty. If there is no session - * return an error. - * - * Locking: none. Reference to current->signal->tty is safe. - */ - -static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) -{ - /* - * (tty == real_tty) is a cheap way of - * testing if the tty is NOT a master pty. - */ - if (tty == real_tty && current->signal->tty != real_tty) - return -ENOTTY; - if (!real_tty->session) - return -ENOTTY; - return put_user(pid_vnr(real_tty->session), p); -} - -/** - * tiocsetd - set line discipline - * @tty: tty device - * @p: pointer to user data - * - * Set the line discipline according to user request. - * - * Locking: see tty_set_ldisc, this function is just a helper - */ - -static int tiocsetd(struct tty_struct *tty, int __user *p) -{ - int ldisc; - int ret; - - if (get_user(ldisc, p)) - return -EFAULT; - - ret = tty_set_ldisc(tty, ldisc); - - return ret; -} - -/** - * send_break - performed time break - * @tty: device to break on - * @duration: timeout in mS - * - * Perform a timed break on hardware that lacks its own driver level - * timed break functionality. - * - * Locking: - * atomic_write_lock serializes - * - */ - -static int send_break(struct tty_struct *tty, unsigned int duration) -{ - int retval; - - if (tty->ops->break_ctl == NULL) - return 0; - - if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK) - retval = tty->ops->break_ctl(tty, duration); - else { - /* Do the work ourselves */ - if (tty_write_lock(tty, 0) < 0) - return -EINTR; - retval = tty->ops->break_ctl(tty, -1); - if (retval) - goto out; - if (!signal_pending(current)) - msleep_interruptible(duration); - retval = tty->ops->break_ctl(tty, 0); -out: - tty_write_unlock(tty); - if (signal_pending(current)) - retval = -EINTR; - } - return retval; -} - -/** - * tty_tiocmget - get modem status - * @tty: tty device - * @file: user file pointer - * @p: pointer to result - * - * Obtain the modem status bits from the tty driver if the feature - * is supported. Return -EINVAL if it is not available. - * - * Locking: none (up to the driver) - */ - -static int tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p) -{ - int retval = -EINVAL; - - if (tty->ops->tiocmget) { - retval = tty->ops->tiocmget(tty, file); - - if (retval >= 0) - retval = put_user(retval, p); - } - return retval; -} - -/** - * tty_tiocmset - set modem status - * @tty: tty device - * @file: user file pointer - * @cmd: command - clear bits, set bits or set all - * @p: pointer to desired bits - * - * Set the modem status bits from the tty driver if the feature - * is supported. Return -EINVAL if it is not available. - * - * Locking: none (up to the driver) - */ - -static int tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd, - unsigned __user *p) -{ - int retval; - unsigned int set, clear, val; - - if (tty->ops->tiocmset == NULL) - return -EINVAL; - - retval = get_user(val, p); - if (retval) - return retval; - set = clear = 0; - switch (cmd) { - case TIOCMBIS: - set = val; - break; - case TIOCMBIC: - clear = val; - break; - case TIOCMSET: - set = val; - clear = ~val; - break; - } - set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP|TIOCM_CD| - TIOCM_RI|TIOCM_DSR|TIOCM_CTS; - clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP|TIOCM_CD| - TIOCM_RI|TIOCM_DSR|TIOCM_CTS; - return tty->ops->tiocmset(tty, file, set, clear); -} - -struct tty_struct *tty_pair_get_tty(struct tty_struct *tty) -{ - if (tty->driver->type == TTY_DRIVER_TYPE_PTY && - tty->driver->subtype == PTY_TYPE_MASTER) - tty = tty->link; - return tty; -} -EXPORT_SYMBOL(tty_pair_get_tty); - -struct tty_struct *tty_pair_get_pty(struct tty_struct *tty) -{ - if (tty->driver->type == TTY_DRIVER_TYPE_PTY && - tty->driver->subtype == PTY_TYPE_MASTER) - return tty; - return tty->link; -} -EXPORT_SYMBOL(tty_pair_get_pty); - -/* - * Split this up, as gcc can choke on it otherwise.. - */ -long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - struct tty_struct *tty, *real_tty; - void __user *p = (void __user *)arg; - int retval; - struct tty_ldisc *ld; - struct inode *inode = file->f_dentry->d_inode; - - tty = (struct tty_struct *)file->private_data; - if (tty_paranoia_check(tty, inode, "tty_ioctl")) - return -EINVAL; - - real_tty = tty_pair_get_tty(tty); - - /* - * Factor out some common prep work - */ - switch (cmd) { - case TIOCSETD: - case TIOCSBRK: - case TIOCCBRK: - case TCSBRK: - case TCSBRKP: - retval = tty_check_change(tty); - if (retval) - return retval; - if (cmd != TIOCCBRK) { - tty_wait_until_sent(tty, 0); - if (signal_pending(current)) - return -EINTR; - } - break; - } - - /* - * Now do the stuff. - */ - switch (cmd) { - case TIOCSTI: - return tiocsti(tty, p); - case TIOCGWINSZ: - return tiocgwinsz(real_tty, p); - case TIOCSWINSZ: - return tiocswinsz(real_tty, p); - case TIOCCONS: - return real_tty != tty ? -EINVAL : tioccons(file); - case FIONBIO: - return fionbio(file, p); - case TIOCEXCL: - set_bit(TTY_EXCLUSIVE, &tty->flags); - return 0; - case TIOCNXCL: - clear_bit(TTY_EXCLUSIVE, &tty->flags); - return 0; - case TIOCNOTTY: - if (current->signal->tty != tty) - return -ENOTTY; - no_tty(); - return 0; - case TIOCSCTTY: - return tiocsctty(tty, arg); - case TIOCGPGRP: - return tiocgpgrp(tty, real_tty, p); - case TIOCSPGRP: - return tiocspgrp(tty, real_tty, p); - case TIOCGSID: - return tiocgsid(tty, real_tty, p); - case TIOCGETD: - return put_user(tty->ldisc->ops->num, (int __user *)p); - case TIOCSETD: - return tiocsetd(tty, p); - /* - * Break handling - */ - case TIOCSBRK: /* Turn break on, unconditionally */ - if (tty->ops->break_ctl) - return tty->ops->break_ctl(tty, -1); - return 0; - case TIOCCBRK: /* Turn break off, unconditionally */ - if (tty->ops->break_ctl) - return tty->ops->break_ctl(tty, 0); - return 0; - case TCSBRK: /* SVID version: non-zero arg --> no break */ - /* non-zero arg means wait for all output data - * to be sent (performed above) but don't send break. - * This is used by the tcdrain() termios function. - */ - if (!arg) - return send_break(tty, 250); - return 0; - case TCSBRKP: /* support for POSIX tcsendbreak() */ - return send_break(tty, arg ? arg*100 : 250); - - case TIOCMGET: - return tty_tiocmget(tty, file, p); - case TIOCMSET: - case TIOCMBIC: - case TIOCMBIS: - return tty_tiocmset(tty, file, cmd, p); - case TCFLSH: - switch (arg) { - case TCIFLUSH: - case TCIOFLUSH: - /* flush tty buffer and allow ldisc to process ioctl */ - tty_buffer_flush(tty); - break; - } - break; - } - if (tty->ops->ioctl) { - retval = (tty->ops->ioctl)(tty, file, cmd, arg); - if (retval != -ENOIOCTLCMD) - return retval; - } - ld = tty_ldisc_ref_wait(tty); - retval = -EINVAL; - if (ld->ops->ioctl) { - retval = ld->ops->ioctl(tty, file, cmd, arg); - if (retval == -ENOIOCTLCMD) - retval = -EINVAL; - } - tty_ldisc_deref(ld); - return retval; -} - -#ifdef CONFIG_COMPAT -static long tty_compat_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct inode *inode = file->f_dentry->d_inode; - struct tty_struct *tty = file->private_data; - struct tty_ldisc *ld; - int retval = -ENOIOCTLCMD; - - if (tty_paranoia_check(tty, inode, "tty_ioctl")) - return -EINVAL; - - if (tty->ops->compat_ioctl) { - retval = (tty->ops->compat_ioctl)(tty, file, cmd, arg); - if (retval != -ENOIOCTLCMD) - return retval; - } - - ld = tty_ldisc_ref_wait(tty); - if (ld->ops->compat_ioctl) - retval = ld->ops->compat_ioctl(tty, file, cmd, arg); - tty_ldisc_deref(ld); - - return retval; -} -#endif - -/* - * This implements the "Secure Attention Key" --- the idea is to - * prevent trojan horses by killing all processes associated with this - * tty when the user hits the "Secure Attention Key". Required for - * super-paranoid applications --- see the Orange Book for more details. - * - * This code could be nicer; ideally it should send a HUP, wait a few - * seconds, then send a INT, and then a KILL signal. But you then - * have to coordinate with the init process, since all processes associated - * with the current tty must be dead before the new getty is allowed - * to spawn. - * - * Now, if it would be correct ;-/ The current code has a nasty hole - - * it doesn't catch files in flight. We may send the descriptor to ourselves - * via AF_UNIX socket, close it and later fetch from socket. FIXME. - * - * Nasty bug: do_SAK is being called in interrupt context. This can - * deadlock. We punt it up to process context. AKPM - 16Mar2001 - */ -void __do_SAK(struct tty_struct *tty) -{ -#ifdef TTY_SOFT_SAK - tty_hangup(tty); -#else - struct task_struct *g, *p; - struct pid *session; - int i; - struct file *filp; - struct fdtable *fdt; - - if (!tty) - return; - session = tty->session; - - tty_ldisc_flush(tty); - - tty_driver_flush_buffer(tty); - - read_lock(&tasklist_lock); - /* Kill the entire session */ - do_each_pid_task(session, PIDTYPE_SID, p) { - printk(KERN_NOTICE "SAK: killed process %d" - " (%s): task_session(p)==tty->session\n", - task_pid_nr(p), p->comm); - send_sig(SIGKILL, p, 1); - } while_each_pid_task(session, PIDTYPE_SID, p); - /* Now kill any processes that happen to have the - * tty open. - */ - do_each_thread(g, p) { - if (p->signal->tty == tty) { - printk(KERN_NOTICE "SAK: killed process %d" - " (%s): task_session(p)==tty->session\n", - task_pid_nr(p), p->comm); - send_sig(SIGKILL, p, 1); - continue; - } - task_lock(p); - if (p->files) { - /* - * We don't take a ref to the file, so we must - * hold ->file_lock instead. - */ - spin_lock(&p->files->file_lock); - fdt = files_fdtable(p->files); - for (i = 0; i < fdt->max_fds; i++) { - filp = fcheck_files(p->files, i); - if (!filp) - continue; - if (filp->f_op->read == tty_read && - filp->private_data == tty) { - printk(KERN_NOTICE "SAK: killed process %d" - " (%s): fd#%d opened to the tty\n", - task_pid_nr(p), p->comm, i); - force_sig(SIGKILL, p); - break; - } - } - spin_unlock(&p->files->file_lock); - } - task_unlock(p); - } while_each_thread(g, p); - read_unlock(&tasklist_lock); -#endif -} - -static void do_SAK_work(struct work_struct *work) -{ - struct tty_struct *tty = - container_of(work, struct tty_struct, SAK_work); - __do_SAK(tty); -} - -/* - * The tq handling here is a little racy - tty->SAK_work may already be queued. - * Fortunately we don't need to worry, because if ->SAK_work is already queued, - * the values which we write to it will be identical to the values which it - * already has. --akpm - */ -void do_SAK(struct tty_struct *tty) -{ - if (!tty) - return; - schedule_work(&tty->SAK_work); -} - -EXPORT_SYMBOL(do_SAK); - -/** - * initialize_tty_struct - * @tty: tty to initialize - * - * This subroutine initializes a tty structure that has been newly - * allocated. - * - * Locking: none - tty in question must not be exposed at this point - */ - -void initialize_tty_struct(struct tty_struct *tty, - struct tty_driver *driver, int idx) -{ - memset(tty, 0, sizeof(struct tty_struct)); - kref_init(&tty->kref); - tty->magic = TTY_MAGIC; - tty_ldisc_init(tty); - tty->session = NULL; - tty->pgrp = NULL; - tty->overrun_time = jiffies; - tty->buf.head = tty->buf.tail = NULL; - tty_buffer_init(tty); - mutex_init(&tty->termios_mutex); - mutex_init(&tty->ldisc_mutex); - init_waitqueue_head(&tty->write_wait); - init_waitqueue_head(&tty->read_wait); - INIT_WORK(&tty->hangup_work, do_tty_hangup); - mutex_init(&tty->atomic_read_lock); - mutex_init(&tty->atomic_write_lock); - mutex_init(&tty->output_lock); - mutex_init(&tty->echo_lock); - spin_lock_init(&tty->read_lock); - spin_lock_init(&tty->ctrl_lock); - INIT_LIST_HEAD(&tty->tty_files); - INIT_WORK(&tty->SAK_work, do_SAK_work); - - tty->driver = driver; - tty->ops = driver->ops; - tty->index = idx; - tty_line_name(driver, idx, tty->name); -} - -/** - * tty_put_char - write one character to a tty - * @tty: tty - * @ch: character - * - * Write one byte to the tty using the provided put_char method - * if present. Returns the number of characters successfully output. - * - * Note: the specific put_char operation in the driver layer may go - * away soon. Don't call it directly, use this method - */ - -int tty_put_char(struct tty_struct *tty, unsigned char ch) -{ - if (tty->ops->put_char) - return tty->ops->put_char(tty, ch); - return tty->ops->write(tty, &ch, 1); -} -EXPORT_SYMBOL_GPL(tty_put_char); - -struct class *tty_class; - -/** - * tty_register_device - register a tty device - * @driver: the tty driver that describes the tty device - * @index: the index in the tty driver for this tty device - * @device: a struct device that is associated with this tty device. - * This field is optional, if there is no known struct device - * for this tty device it can be set to NULL safely. - * - * Returns a pointer to the struct device for this tty device - * (or ERR_PTR(-EFOO) on error). - * - * This call is required to be made to register an individual tty device - * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If - * that bit is not set, this function should not be called by a tty - * driver. - * - * Locking: ?? - */ - -struct device *tty_register_device(struct tty_driver *driver, unsigned index, - struct device *device) -{ - char name[64]; - dev_t dev = MKDEV(driver->major, driver->minor_start) + index; - - if (index >= driver->num) { - printk(KERN_ERR "Attempt to register invalid tty line number " - " (%d).\n", index); - return ERR_PTR(-EINVAL); - } - - if (driver->type == TTY_DRIVER_TYPE_PTY) - pty_line_name(driver, index, name); - else - tty_line_name(driver, index, name); - - return device_create(tty_class, device, dev, NULL, name); -} -EXPORT_SYMBOL(tty_register_device); - -/** - * tty_unregister_device - unregister a tty device - * @driver: the tty driver that describes the tty device - * @index: the index in the tty driver for this tty device - * - * If a tty device is registered with a call to tty_register_device() then - * this function must be called when the tty device is gone. - * - * Locking: ?? - */ - -void tty_unregister_device(struct tty_driver *driver, unsigned index) -{ - device_destroy(tty_class, - MKDEV(driver->major, driver->minor_start) + index); -} -EXPORT_SYMBOL(tty_unregister_device); - -struct tty_driver *alloc_tty_driver(int lines) -{ - struct tty_driver *driver; - - driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL); - if (driver) { - kref_init(&driver->kref); - driver->magic = TTY_DRIVER_MAGIC; - driver->num = lines; - /* later we'll move allocation of tables here */ - } - return driver; -} -EXPORT_SYMBOL(alloc_tty_driver); - -static void destruct_tty_driver(struct kref *kref) -{ - struct tty_driver *driver = container_of(kref, struct tty_driver, kref); - int i; - struct ktermios *tp; - void *p; - - if (driver->flags & TTY_DRIVER_INSTALLED) { - /* - * Free the termios and termios_locked structures because - * we don't want to get memory leaks when modular tty - * drivers are removed from the kernel. - */ - for (i = 0; i < driver->num; i++) { - tp = driver->termios[i]; - if (tp) { - driver->termios[i] = NULL; - kfree(tp); - } - if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) - tty_unregister_device(driver, i); - } - p = driver->ttys; - proc_tty_unregister_driver(driver); - driver->ttys = NULL; - driver->termios = NULL; - kfree(p); - cdev_del(&driver->cdev); - } - kfree(driver); -} - -void tty_driver_kref_put(struct tty_driver *driver) -{ - kref_put(&driver->kref, destruct_tty_driver); -} -EXPORT_SYMBOL(tty_driver_kref_put); - -void tty_set_operations(struct tty_driver *driver, - const struct tty_operations *op) -{ - driver->ops = op; -}; -EXPORT_SYMBOL(tty_set_operations); - -void put_tty_driver(struct tty_driver *d) -{ - tty_driver_kref_put(d); -} -EXPORT_SYMBOL(put_tty_driver); - -/* - * Called by a tty driver to register itself. - */ -int tty_register_driver(struct tty_driver *driver) -{ - int error; - int i; - dev_t dev; - void **p = NULL; - - if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) { - p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL); - if (!p) - return -ENOMEM; - } - - if (!driver->major) { - error = alloc_chrdev_region(&dev, driver->minor_start, - driver->num, driver->name); - if (!error) { - driver->major = MAJOR(dev); - driver->minor_start = MINOR(dev); - } - } else { - dev = MKDEV(driver->major, driver->minor_start); - error = register_chrdev_region(dev, driver->num, driver->name); - } - if (error < 0) { - kfree(p); - return error; - } - - if (p) { - driver->ttys = (struct tty_struct **)p; - driver->termios = (struct ktermios **)(p + driver->num); - } else { - driver->ttys = NULL; - driver->termios = NULL; - } - - cdev_init(&driver->cdev, &tty_fops); - driver->cdev.owner = driver->owner; - error = cdev_add(&driver->cdev, dev, driver->num); - if (error) { - unregister_chrdev_region(dev, driver->num); - driver->ttys = NULL; - driver->termios = NULL; - kfree(p); - return error; - } - - mutex_lock(&tty_mutex); - list_add(&driver->tty_drivers, &tty_drivers); - mutex_unlock(&tty_mutex); - - if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) { - for (i = 0; i < driver->num; i++) - tty_register_device(driver, i, NULL); - } - proc_tty_register_driver(driver); - driver->flags |= TTY_DRIVER_INSTALLED; - return 0; -} - -EXPORT_SYMBOL(tty_register_driver); - -/* - * Called by a tty driver to unregister itself. - */ -int tty_unregister_driver(struct tty_driver *driver) -{ -#if 0 - /* FIXME */ - if (driver->refcount) - return -EBUSY; -#endif - unregister_chrdev_region(MKDEV(driver->major, driver->minor_start), - driver->num); - mutex_lock(&tty_mutex); - list_del(&driver->tty_drivers); - mutex_unlock(&tty_mutex); - return 0; -} - -EXPORT_SYMBOL(tty_unregister_driver); - -dev_t tty_devnum(struct tty_struct *tty) -{ - return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index; -} -EXPORT_SYMBOL(tty_devnum); - -void proc_clear_tty(struct task_struct *p) -{ - unsigned long flags; - struct tty_struct *tty; - spin_lock_irqsave(&p->sighand->siglock, flags); - tty = p->signal->tty; - p->signal->tty = NULL; - spin_unlock_irqrestore(&p->sighand->siglock, flags); - tty_kref_put(tty); -} - -/* Called under the sighand lock */ - -static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) -{ - if (tty) { - unsigned long flags; - /* We should not have a session or pgrp to put here but.... */ - spin_lock_irqsave(&tty->ctrl_lock, flags); - put_pid(tty->session); - put_pid(tty->pgrp); - tty->pgrp = get_pid(task_pgrp(tsk)); - spin_unlock_irqrestore(&tty->ctrl_lock, flags); - tty->session = get_pid(task_session(tsk)); - if (tsk->signal->tty) { - printk(KERN_DEBUG "tty not NULL!!\n"); - tty_kref_put(tsk->signal->tty); - } - } - put_pid(tsk->signal->tty_old_pgrp); - tsk->signal->tty = tty_kref_get(tty); - tsk->signal->tty_old_pgrp = NULL; -} - -static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) -{ - spin_lock_irq(&tsk->sighand->siglock); - __proc_set_tty(tsk, tty); - spin_unlock_irq(&tsk->sighand->siglock); -} - -struct tty_struct *get_current_tty(void) -{ - struct tty_struct *tty; - unsigned long flags; - - spin_lock_irqsave(¤t->sighand->siglock, flags); - tty = tty_kref_get(current->signal->tty); - spin_unlock_irqrestore(¤t->sighand->siglock, flags); - return tty; -} -EXPORT_SYMBOL_GPL(get_current_tty); - -void tty_default_fops(struct file_operations *fops) -{ - *fops = tty_fops; -} - -/* - * Initialize the console device. This is called *early*, so - * we can't necessarily depend on lots of kernel help here. - * Just do some early initializations, and do the complex setup - * later. - */ -void __init console_init(void) -{ - initcall_t *call; - - /* Setup the default TTY line discipline. */ - tty_ldisc_begin(); - - /* - * set up the console device so that later boot sequences can - * inform about problems etc.. - */ - call = __con_initcall_start; - while (call < __con_initcall_end) { - (*call)(); - call++; - } -} - -static char *tty_devnode(struct device *dev, mode_t *mode) -{ - if (!mode) - return NULL; - if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) || - dev->devt == MKDEV(TTYAUX_MAJOR, 2)) - *mode = 0666; - return NULL; -} - -static int __init tty_class_init(void) -{ - tty_class = class_create(THIS_MODULE, "tty"); - if (IS_ERR(tty_class)) - return PTR_ERR(tty_class); - tty_class->devnode = tty_devnode; - return 0; -} - -postcore_initcall(tty_class_init); - -/* 3/2004 jmc: why do these devices exist? */ - -static struct cdev tty_cdev, console_cdev; - -/* - * Ok, now we can initialize the rest of the tty devices and can count - * on memory allocations, interrupts etc.. - */ -int __init tty_init(void) -{ - cdev_init(&tty_cdev, &tty_fops); - if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) || - register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0) - panic("Couldn't register /dev/tty driver\n"); - device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, - "tty"); - - cdev_init(&console_cdev, &console_fops); - if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) || - register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0) - panic("Couldn't register /dev/console driver\n"); - device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL, - "console"); - -#ifdef CONFIG_VT - vty_init(&console_fops); -#endif - return 0; -} - diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 3157a865c78..ec38843f4d5 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c @@ -163,15 +163,6 @@ static inline int performance_multiplier(void) { int mult = 1; - /* for higher loadavg, we are more reluctant */ - - /* - * this doesn't work as intended - it is almost always 0, but can - * sometimes, depending on workload, spike very high into the hundreds - * even when the average cpu load is under 10%. - */ - /* mult += 2 * get_loadavg(); */ - /* for IO wait tasks (per cpu!) we add 5x each */ mult += 10 * nr_iowait_cpu(smp_processor_id()); diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 4c72b65e45d..bfa48de6f81 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -411,13 +411,6 @@ config KEYBOARD_OPENCORES To compile this driver as a module, choose M here; the module will be called opencores-kbd. -config KEYBOARD_PM8058 - bool "Qualcomm PM8058 Matrix Keypad support" - depends on PM8058 - help - Say Y here to enable the driver for the keypad matrix interface - on the Qualcomm PM8058 power management I/C device. - config KEYBOARD_PXA27x tristate "PXA27x/PXA3xx keypad support" depends on PXA27x || PXA3xx || ARCH_MMP @@ -623,5 +616,3 @@ config KEYBOARD_W90P910 module will be called w90p910_keypad. endif - - diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 833904a8671..85f1d865648 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -54,4 +54,3 @@ obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o obj-$(CONFIG_KEYBOARD_QCIKBD) += qci_kbd.o obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o -obj-$(CONFIG_KEYBOARD_PMIC8058) += pmic8058-keypad.o diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index ad43bbffc22..1f309d88388 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -17,7 +17,6 @@ obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o -obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o obj-$(CONFIG_TOUCHSCREEN_CYPRESS_TMG) += cy8c_tmg_ts.o obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o @@ -29,7 +28,6 @@ obj-$(CONFIG_TOUCHSCREEN_DYNAPRO) += dynapro.o obj-$(CONFIG_TOUCHSCREEN_HAMPSHIRE) += hampshire.o obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o obj-$(CONFIG_TOUCHSCREEN_EETI) += eeti_ts.o -obj-$(CONFIG_TOUCHSCREEN_ELAN_I2C_8232) += elan8232_i2c.o obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 26e84961fd7..f13e55a724e 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -195,23 +195,6 @@ config LEDS_MSM_TRICOLOR To compile this driver as a module, choose M here: the module will be called leds-msm-tricolor. -config LEDS_GPIO_PLATFORM - bool "Platform device bindings for GPIO LEDs" - depends on LEDS_GPIO - default y - help - Let the leds-gpio driver drive LEDs which have been defined as - platform devices. If you don't know what this means, say yes. - -config LEDS_GPIO_OF - bool "OpenFirmware platform device bindings for GPIO LEDs" - depends on LEDS_GPIO && OF_DEVICE - default y - help - Let the leds-gpio driver drive LEDs which have been defined as - of_platform devices. For instance, LEDs which are listed in a "dts" - file. - config LEDS_LP3944 tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip" depends on LEDS_CLASS diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index ce65e3f2ff4..c99bed13843 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -58,11 +58,8 @@ obj-$(CONFIG_TPS65023) += tps65023.o obj-$(CONFIG_TIMPANI_CODEC) += timpani-codec.o -ifdef CONFIG_TIMPANI_CODEC obj-$(CONFIG_TIMPANI_CODEC) += msm-adie-codec.o -else ifdef CONFIG_MARIMBA_CODEC obj-$(CONFIG_MARIMBA_CODEC) += msm-adie-codec.o -endif obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o obj-$(CONFIG_TWL6040_CORE) += twl6040-core.o twl6040-irq.o @@ -127,6 +124,10 @@ obj-$(CONFIG_MFD_VX855) += vx855.o obj-$(CONFIG_MFD_WL1273_CORE) += wl1273-core.o obj-$(CONFIG_MFD_CS5535) += cs5535-mfd.o obj-$(CONFIG_MFD_OMAP_USB_HOST) += omap-usb-host.o +obj-$(CONFIG_MFD_PM8921_CORE) += pm8921-core.o +obj-$(CONFIG_MFD_PM8821_CORE) += pm8821-core.o +obj-$(CONFIG_MFD_PM8018_CORE) += pm8018-core.o +obj-$(CONFIG_MFD_PM8XXX_IRQ) += pm8xxx-irq.o obj-$(CONFIG_TPS65911_COMPARATOR) += tps65911-comparator.o obj-$(CONFIG_MFD_TPS65090) += tps65090.o obj-$(CONFIG_MFD_AAT2870_CORE) += aat2870-core.o @@ -135,11 +136,7 @@ obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o obj-$(CONFIG_MFD_S5M_CORE) += s5m-core.o s5m-irq.o obj-$(CONFIG_PMIC8058) += pmic8058.o obj-$(CONFIG_PMIC8901) += pmic8901.o -obj-$(CONFIG_MFD_PM8921_CORE) += pm8921-core.o -obj-$(CONFIG_MFD_PM8821_CORE) += pm8821-core.o -obj-$(CONFIG_MFD_PM8018_CORE) += pm8018-core.o obj-$(CONFIG_MFD_PM8038_CORE) += pm8038-core.o -obj-$(CONFIG_MFD_PM8XXX_IRQ) += pm8xxx-irq.o obj-$(CONFIG_MFD_PM8821_IRQ) += pm8821-irq.o obj-$(CONFIG_MFD_PM8XXX_DEBUG) += pm8xxx-debug.o obj-$(CONFIG_MFD_PM8XXX_PWM) += pm8xxx-pwm.o diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index b0222ec807e..f80f3f2e4e3 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -54,8 +54,6 @@ obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ obj-$(CONFIG_MAX8997_MUIC) += max8997-muic.o obj-$(CONFIG_WL127X_RFKILL) += wl127x-rfkill.o obj-$(CONFIG_SENSORS_AK8975) += akm8975.o -obj-$(CONFIG_WL127X_RFKILL) += wl127x-rfkill.o -obj-$(CONFIG_SENSORS_AK8975) += akm8975.o obj-$(CONFIG_TSIF) += msm_tsif.o msm_tsif-objs := tsif.o obj-$(CONFIG_TSIF_CHRDEV) += tsif_chrdev.o diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 07702b4c6fb..bea84284388 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1023,7 +1023,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, if (host->areq) mmc_post_req(host, host->areq->mrq, 0); - /* Cancel a prepared request if it was not started. */ + /* Cancel a prepared request if it was not started. */ if ((err || start_err) && areq) mmc_post_req(host, areq->mrq, -EINVAL); diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index fca32742c8b..3d8ceb4084d 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -215,14 +215,14 @@ static void sdio_single_irq_set(struct mmc_card *card) card->sdio_single_irq = NULL; if ((card->host->caps & MMC_CAP_SDIO_IRQ) && - card->host->sdio_irqs == 1) + card->host->sdio_irqs == 1) for (i = 0; i < card->sdio_funcs; i++) { - func = card->sdio_func[i]; - if (func && func->irq_handler) { - card->sdio_single_irq = func; - break; - } - } + func = card->sdio_func[i]; + if (func && func->irq_handler) { + card->sdio_single_irq = func; + break; + } + } } /** diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 315efbb3c2a..47b19c0bb07 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -3219,44 +3219,6 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips, } EXPORT_SYMBOL(nand_scan_ident); -static void nand_panic_wait(struct mtd_info *mtd) -{ - struct nand_chip *chip = mtd->priv; - int i; - - if (chip->state != FL_READY) - for (i = 0; i < 40; i++) { - if (chip->dev_ready(mtd)) - break; - mdelay(10); - } - chip->state = FL_READY; -} - -static int nand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) -{ - struct nand_chip *chip = mtd->priv; - int ret; - - /* Do not allow reads past end of device */ - if ((to + len) > mtd->size) - return -EINVAL; - if (!len) - return 0; - - nand_panic_wait(mtd); - - chip->ops.len = len; - chip->ops.datbuf = (uint8_t *)buf; - chip->ops.oobbuf = NULL; - - ret = nand_do_write_ops(mtd, to, &chip->ops); - - *retlen = chip->ops.retlen; - return ret; -} - /** * nand_scan_tail - [NAND Interface] Scan for the NAND device diff --git a/drivers/net/pppolac.c b/drivers/net/pppolac.c deleted file mode 100644 index a5d3d634fd9..00000000000 --- a/drivers/net/pppolac.c +++ /dev/null @@ -1,449 +0,0 @@ -/* drivers/net/pppolac.c - * - * Driver for PPP on L2TP Access Concentrator / PPPoLAC Socket (RFC 2661) - * - * Copyright (C) 2009 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* This driver handles L2TP data packets between a UDP socket and a PPP channel. - * The socket must keep connected, and only one session per socket is permitted. - * Sequencing of outgoing packets is controlled by LNS. Incoming packets with - * sequences are reordered within a sliding window of one second. Currently - * reordering only happens when a packet is received. It is done for simplicity - * since no additional locks or threads are required. This driver only works on - * IPv4 due to the lack of UDP encapsulation support in IPv6. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define L2TP_CONTROL_BIT 0x80 -#define L2TP_LENGTH_BIT 0x40 -#define L2TP_SEQUENCE_BIT 0x08 -#define L2TP_OFFSET_BIT 0x02 -#define L2TP_VERSION 0x02 -#define L2TP_VERSION_MASK 0x0F - -#define PPP_ADDR 0xFF -#define PPP_CTRL 0x03 - -union unaligned { - __u32 u32; -} __attribute__((packed)); - -static inline union unaligned *unaligned(void *ptr) -{ - return (union unaligned *)ptr; -} - -struct meta { - __u32 sequence; - __u32 timestamp; -}; - -static inline struct meta *skb_meta(struct sk_buff *skb) -{ - return (struct meta *)skb->cb; -} - -/******************************************************************************/ - -static int pppolac_recv_core(struct sock *sk_udp, struct sk_buff *skb) -{ - struct sock *sk = (struct sock *)sk_udp->sk_user_data; - struct pppolac_opt *opt = &pppox_sk(sk)->proto.lac; - struct meta *meta = skb_meta(skb); - __u32 now = jiffies; - __u8 bits; - __u8 *ptr; - - /* Drop the packet if L2TP header is missing. */ - if (skb->len < sizeof(struct udphdr) + 6) - goto drop; - - /* Put it back if it is a control packet. */ - if (skb->data[sizeof(struct udphdr)] & L2TP_CONTROL_BIT) - return opt->backlog_rcv(sk_udp, skb); - - /* Skip UDP header. */ - skb_pull(skb, sizeof(struct udphdr)); - - /* Check the version. */ - if ((skb->data[1] & L2TP_VERSION_MASK) != L2TP_VERSION) - goto drop; - bits = skb->data[0]; - ptr = &skb->data[2]; - - /* Check the length if it is present. */ - if (bits & L2TP_LENGTH_BIT) { - if ((ptr[0] << 8 | ptr[1]) != skb->len) - goto drop; - ptr += 2; - } - - /* Skip all fields including optional ones. */ - if (!skb_pull(skb, 6 + (bits & L2TP_SEQUENCE_BIT ? 4 : 0) + - (bits & L2TP_LENGTH_BIT ? 2 : 0) + - (bits & L2TP_OFFSET_BIT ? 2 : 0))) - goto drop; - - /* Skip the offset padding if it is present. */ - if (bits & L2TP_OFFSET_BIT && - !skb_pull(skb, skb->data[-2] << 8 | skb->data[-1])) - goto drop; - - /* Check the tunnel and the session. */ - if (unaligned(ptr)->u32 != opt->local) - goto drop; - - /* Check the sequence if it is present. */ - if (bits & L2TP_SEQUENCE_BIT) { - meta->sequence = ptr[4] << 8 | ptr[5]; - if ((__s16)(meta->sequence - opt->recv_sequence) < 0) - goto drop; - } - - /* Skip PPP address and control if they are present. */ - if (skb->len >= 2 && skb->data[0] == PPP_ADDR && - skb->data[1] == PPP_CTRL) - skb_pull(skb, 2); - - /* Fix PPP protocol if it is compressed. */ - if (skb->len >= 1 && skb->data[0] & 1) - skb_push(skb, 1)[0] = 0; - - /* Drop the packet if PPP protocol is missing. */ - if (skb->len < 2) - goto drop; - - /* Perform reordering if sequencing is enabled. */ - atomic_set(&opt->sequencing, bits & L2TP_SEQUENCE_BIT); - if (bits & L2TP_SEQUENCE_BIT) { - struct sk_buff *skb1; - - /* Insert the packet into receive queue in order. */ - skb_set_owner_r(skb, sk); - skb_queue_walk(&sk->sk_receive_queue, skb1) { - struct meta *meta1 = skb_meta(skb1); - __s16 order = meta->sequence - meta1->sequence; - if (order == 0) - goto drop; - if (order < 0) { - meta->timestamp = meta1->timestamp; - skb_insert(skb1, skb, &sk->sk_receive_queue); - skb = NULL; - break; - } - } - if (skb) { - meta->timestamp = now; - skb_queue_tail(&sk->sk_receive_queue, skb); - } - - /* Remove packets from receive queue as long as - * 1. the receive buffer is full, - * 2. they are queued longer than one second, or - * 3. there are no missing packets before them. */ - skb_queue_walk_safe(&sk->sk_receive_queue, skb, skb1) { - meta = skb_meta(skb); - if (atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf && - now - meta->timestamp < HZ && - meta->sequence != opt->recv_sequence) - break; - skb_unlink(skb, &sk->sk_receive_queue); - opt->recv_sequence = (__u16)(meta->sequence + 1); - skb_orphan(skb); - ppp_input(&pppox_sk(sk)->chan, skb); - } - return NET_RX_SUCCESS; - } - - /* Flush receive queue if sequencing is disabled. */ - skb_queue_purge(&sk->sk_receive_queue); - skb_orphan(skb); - ppp_input(&pppox_sk(sk)->chan, skb); - return NET_RX_SUCCESS; -drop: - kfree_skb(skb); - return NET_RX_DROP; -} - -static int pppolac_recv(struct sock *sk_udp, struct sk_buff *skb) -{ - sock_hold(sk_udp); - sk_receive_skb(sk_udp, skb, 0); - return 0; -} - -static struct sk_buff_head delivery_queue; - -static void pppolac_xmit_core(struct work_struct *delivery_work) -{ - mm_segment_t old_fs = get_fs(); - struct sk_buff *skb; - - set_fs(KERNEL_DS); - while ((skb = skb_dequeue(&delivery_queue))) { - struct sock *sk_udp = skb->sk; - struct kvec iov = {.iov_base = skb->data, .iov_len = skb->len}; - struct msghdr msg = { - .msg_iov = (struct iovec *)&iov, - .msg_iovlen = 1, - .msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT, - }; - sk_udp->sk_prot->sendmsg(NULL, sk_udp, &msg, skb->len); - kfree_skb(skb); - } - set_fs(old_fs); -} - -static DECLARE_WORK(delivery_work, pppolac_xmit_core); - -static int pppolac_xmit(struct ppp_channel *chan, struct sk_buff *skb) -{ - struct sock *sk_udp = (struct sock *)chan->private; - struct pppolac_opt *opt = &pppox_sk(sk_udp->sk_user_data)->proto.lac; - - /* Install PPP address and control. */ - skb_push(skb, 2); - skb->data[0] = PPP_ADDR; - skb->data[1] = PPP_CTRL; - - /* Install L2TP header. */ - if (atomic_read(&opt->sequencing)) { - skb_push(skb, 10); - skb->data[0] = L2TP_SEQUENCE_BIT; - skb->data[6] = opt->xmit_sequence >> 8; - skb->data[7] = opt->xmit_sequence; - skb->data[8] = 0; - skb->data[9] = 0; - opt->xmit_sequence++; - } else { - skb_push(skb, 6); - skb->data[0] = 0; - } - skb->data[1] = L2TP_VERSION; - unaligned(&skb->data[2])->u32 = opt->remote; - - /* Now send the packet via the delivery queue. */ - skb_set_owner_w(skb, sk_udp); - skb_queue_tail(&delivery_queue, skb); - schedule_work(&delivery_work); - return 1; -} - -/******************************************************************************/ - -static struct ppp_channel_ops pppolac_channel_ops = { - .start_xmit = pppolac_xmit, -}; - -static int pppolac_connect(struct socket *sock, struct sockaddr *useraddr, - int addrlen, int flags) -{ - struct sock *sk = sock->sk; - struct pppox_sock *po = pppox_sk(sk); - struct sockaddr_pppolac *addr = (struct sockaddr_pppolac *)useraddr; - struct socket *sock_udp = NULL; - struct sock *sk_udp; - int error; - - if (addrlen != sizeof(struct sockaddr_pppolac) || - !addr->local.tunnel || !addr->local.session || - !addr->remote.tunnel || !addr->remote.session) { - return -EINVAL; - } - - lock_sock(sk); - error = -EALREADY; - if (sk->sk_state != PPPOX_NONE) - goto out; - - sock_udp = sockfd_lookup(addr->udp_socket, &error); - if (!sock_udp) - goto out; - sk_udp = sock_udp->sk; - lock_sock(sk_udp); - - /* Remove this check when IPv6 supports UDP encapsulation. */ - error = -EAFNOSUPPORT; - if (sk_udp->sk_family != AF_INET) - goto out; - error = -EPROTONOSUPPORT; - if (sk_udp->sk_protocol != IPPROTO_UDP) - goto out; - error = -EDESTADDRREQ; - if (sk_udp->sk_state != TCP_ESTABLISHED) - goto out; - error = -EBUSY; - if (udp_sk(sk_udp)->encap_type || sk_udp->sk_user_data) - goto out; - if (!sk_udp->sk_bound_dev_if) { - struct dst_entry *dst = sk_dst_get(sk_udp); - error = -ENODEV; - if (!dst) - goto out; - sk_udp->sk_bound_dev_if = dst->dev->ifindex; - dst_release(dst); - } - - po->chan.hdrlen = 12; - po->chan.private = sk_udp; - po->chan.ops = &pppolac_channel_ops; - po->chan.mtu = PPP_MRU - 80; - po->proto.lac.local = unaligned(&addr->local)->u32; - po->proto.lac.remote = unaligned(&addr->remote)->u32; - atomic_set(&po->proto.lac.sequencing, 1); - po->proto.lac.backlog_rcv = sk_udp->sk_backlog_rcv; - - error = ppp_register_channel(&po->chan); - if (error) - goto out; - - sk->sk_state = PPPOX_CONNECTED; - udp_sk(sk_udp)->encap_type = UDP_ENCAP_L2TPINUDP; - udp_sk(sk_udp)->encap_rcv = pppolac_recv; - sk_udp->sk_backlog_rcv = pppolac_recv_core; - sk_udp->sk_user_data = sk; -out: - if (sock_udp) { - release_sock(sk_udp); - if (error) - sockfd_put(sock_udp); - } - release_sock(sk); - return error; -} - -static int pppolac_release(struct socket *sock) -{ - struct sock *sk = sock->sk; - - if (!sk) - return 0; - - lock_sock(sk); - if (sock_flag(sk, SOCK_DEAD)) { - release_sock(sk); - return -EBADF; - } - - if (sk->sk_state != PPPOX_NONE) { - struct sock *sk_udp = (struct sock *)pppox_sk(sk)->chan.private; - lock_sock(sk_udp); - skb_queue_purge(&sk->sk_receive_queue); - pppox_unbind_sock(sk); - udp_sk(sk_udp)->encap_type = 0; - udp_sk(sk_udp)->encap_rcv = NULL; - sk_udp->sk_backlog_rcv = pppox_sk(sk)->proto.lac.backlog_rcv; - sk_udp->sk_user_data = NULL; - release_sock(sk_udp); - sockfd_put(sk_udp->sk_socket); - } - - sock_orphan(sk); - sock->sk = NULL; - release_sock(sk); - sock_put(sk); - return 0; -} - -/******************************************************************************/ - -static struct proto pppolac_proto = { - .name = "PPPOLAC", - .owner = THIS_MODULE, - .obj_size = sizeof(struct pppox_sock), -}; - -static struct proto_ops pppolac_proto_ops = { - .family = PF_PPPOX, - .owner = THIS_MODULE, - .release = pppolac_release, - .bind = sock_no_bind, - .connect = pppolac_connect, - .socketpair = sock_no_socketpair, - .accept = sock_no_accept, - .getname = sock_no_getname, - .poll = sock_no_poll, - .ioctl = pppox_ioctl, - .listen = sock_no_listen, - .shutdown = sock_no_shutdown, - .setsockopt = sock_no_setsockopt, - .getsockopt = sock_no_getsockopt, - .sendmsg = sock_no_sendmsg, - .recvmsg = sock_no_recvmsg, - .mmap = sock_no_mmap, -}; - -static int pppolac_create(struct net *net, struct socket *sock) -{ - struct sock *sk; - - sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppolac_proto); - if (!sk) - return -ENOMEM; - - sock_init_data(sock, sk); - sock->state = SS_UNCONNECTED; - sock->ops = &pppolac_proto_ops; - sk->sk_protocol = PX_PROTO_OLAC; - sk->sk_state = PPPOX_NONE; - return 0; -} - -/******************************************************************************/ - -static struct pppox_proto pppolac_pppox_proto = { - .create = pppolac_create, - .owner = THIS_MODULE, -}; - -static int __init pppolac_init(void) -{ - int error; - - error = proto_register(&pppolac_proto, 0); - if (error) - return error; - - error = register_pppox_proto(PX_PROTO_OLAC, &pppolac_pppox_proto); - if (error) - proto_unregister(&pppolac_proto); - else - skb_queue_head_init(&delivery_queue); - return error; -} - -static void __exit pppolac_exit(void) -{ - unregister_pppox_proto(PX_PROTO_OLAC); - proto_unregister(&pppolac_proto); -} - -module_init(pppolac_init); -module_exit(pppolac_exit); - -MODULE_DESCRIPTION("PPP on L2TP Access Concentrator (PPPoLAC)"); -MODULE_AUTHOR("Chia-chi Yeh "); -MODULE_LICENSE("GPL"); diff --git a/drivers/net/pppopns.c b/drivers/net/pppopns.c deleted file mode 100644 index 6016d29c066..00000000000 --- a/drivers/net/pppopns.c +++ /dev/null @@ -1,428 +0,0 @@ -/* drivers/net/pppopns.c - * - * Driver for PPP on PPTP Network Server / PPPoPNS Socket (RFC 2637) - * - * Copyright (C) 2009 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* This driver handles PPTP data packets between a RAW socket and a PPP channel. - * The socket is created in the kernel space and connected to the same address - * of the control socket. Outgoing packets are always sent with sequences but - * without acknowledgements. Incoming packets with sequences are reordered - * within a sliding window of one second. Currently reordering only happens when - * a packet is received. It is done for simplicity since no additional locks or - * threads are required. This driver should work on both IPv4 and IPv6. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define GRE_HEADER_SIZE 8 - -#define PPTP_GRE_BITS htons(0x2001) -#define PPTP_GRE_BITS_MASK htons(0xEF7F) -#define PPTP_GRE_SEQ_BIT htons(0x1000) -#define PPTP_GRE_ACK_BIT htons(0x0080) -#define PPTP_GRE_TYPE htons(0x880B) - -#define PPP_ADDR 0xFF -#define PPP_CTRL 0x03 - -struct header { - __u16 bits; - __u16 type; - __u16 length; - __u16 call; - __u32 sequence; -} __attribute__((packed)); - -struct meta { - __u32 sequence; - __u32 timestamp; -}; - -static inline struct meta *skb_meta(struct sk_buff *skb) -{ - return (struct meta *)skb->cb; -} - -/******************************************************************************/ - -static int pppopns_recv_core(struct sock *sk_raw, struct sk_buff *skb) -{ - struct sock *sk = (struct sock *)sk_raw->sk_user_data; - struct pppopns_opt *opt = &pppox_sk(sk)->proto.pns; - struct meta *meta = skb_meta(skb); - __u32 now = jiffies; - struct header *hdr; - - /* Skip transport header */ - skb_pull(skb, skb_transport_header(skb) - skb->data); - - /* Drop the packet if GRE header is missing. */ - if (skb->len < GRE_HEADER_SIZE) - goto drop; - hdr = (struct header *)skb->data; - - /* Check the header. */ - if (hdr->type != PPTP_GRE_TYPE || hdr->call != opt->local || - (hdr->bits & PPTP_GRE_BITS_MASK) != PPTP_GRE_BITS) - goto drop; - - /* Skip all fields including optional ones. */ - if (!skb_pull(skb, GRE_HEADER_SIZE + - (hdr->bits & PPTP_GRE_SEQ_BIT ? 4 : 0) + - (hdr->bits & PPTP_GRE_ACK_BIT ? 4 : 0))) - goto drop; - - /* Check the length. */ - if (skb->len != ntohs(hdr->length)) - goto drop; - - /* Check the sequence if it is present. */ - if (hdr->bits & PPTP_GRE_SEQ_BIT) { - meta->sequence = ntohl(hdr->sequence); - if ((__s32)(meta->sequence - opt->recv_sequence) < 0) - goto drop; - } - - /* Skip PPP address and control if they are present. */ - if (skb->len >= 2 && skb->data[0] == PPP_ADDR && - skb->data[1] == PPP_CTRL) - skb_pull(skb, 2); - - /* Fix PPP protocol if it is compressed. */ - if (skb->len >= 1 && skb->data[0] & 1) - skb_push(skb, 1)[0] = 0; - - /* Drop the packet if PPP protocol is missing. */ - if (skb->len < 2) - goto drop; - - /* Perform reordering if sequencing is enabled. */ - if (hdr->bits & PPTP_GRE_SEQ_BIT) { - struct sk_buff *skb1; - - /* Insert the packet into receive queue in order. */ - skb_set_owner_r(skb, sk); - skb_queue_walk(&sk->sk_receive_queue, skb1) { - struct meta *meta1 = skb_meta(skb1); - __s32 order = meta->sequence - meta1->sequence; - if (order == 0) - goto drop; - if (order < 0) { - meta->timestamp = meta1->timestamp; - skb_insert(skb1, skb, &sk->sk_receive_queue); - skb = NULL; - break; - } - } - if (skb) { - meta->timestamp = now; - skb_queue_tail(&sk->sk_receive_queue, skb); - } - - /* Remove packets from receive queue as long as - * 1. the receive buffer is full, - * 2. they are queued longer than one second, or - * 3. there are no missing packets before them. */ - skb_queue_walk_safe(&sk->sk_receive_queue, skb, skb1) { - meta = skb_meta(skb); - if (atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf && - now - meta->timestamp < HZ && - meta->sequence != opt->recv_sequence) - break; - skb_unlink(skb, &sk->sk_receive_queue); - opt->recv_sequence = meta->sequence + 1; - skb_orphan(skb); - ppp_input(&pppox_sk(sk)->chan, skb); - } - return NET_RX_SUCCESS; - } - - /* Flush receive queue if sequencing is disabled. */ - skb_queue_purge(&sk->sk_receive_queue); - skb_orphan(skb); - ppp_input(&pppox_sk(sk)->chan, skb); - return NET_RX_SUCCESS; -drop: - kfree_skb(skb); - return NET_RX_DROP; -} - -static void pppopns_recv(struct sock *sk_raw, int length) -{ - struct sk_buff *skb; - while ((skb = skb_dequeue(&sk_raw->sk_receive_queue))) { - sock_hold(sk_raw); - sk_receive_skb(sk_raw, skb, 0); - } -} - -static struct sk_buff_head delivery_queue; - -static void pppopns_xmit_core(struct work_struct *delivery_work) -{ - mm_segment_t old_fs = get_fs(); - struct sk_buff *skb; - - set_fs(KERNEL_DS); - while ((skb = skb_dequeue(&delivery_queue))) { - struct sock *sk_raw = skb->sk; - struct kvec iov = {.iov_base = skb->data, .iov_len = skb->len}; - struct msghdr msg = { - .msg_iov = (struct iovec *)&iov, - .msg_iovlen = 1, - .msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT, - }; - sk_raw->sk_prot->sendmsg(NULL, sk_raw, &msg, skb->len); - kfree_skb(skb); - } - set_fs(old_fs); -} - -static DECLARE_WORK(delivery_work, pppopns_xmit_core); - -static int pppopns_xmit(struct ppp_channel *chan, struct sk_buff *skb) -{ - struct sock *sk_raw = (struct sock *)chan->private; - struct pppopns_opt *opt = &pppox_sk(sk_raw->sk_user_data)->proto.pns; - struct header *hdr; - __u16 length; - - /* Install PPP address and control. */ - skb_push(skb, 2); - skb->data[0] = PPP_ADDR; - skb->data[1] = PPP_CTRL; - length = skb->len; - - /* Install PPTP GRE header. */ - hdr = (struct header *)skb_push(skb, 12); - hdr->bits = PPTP_GRE_BITS | PPTP_GRE_SEQ_BIT; - hdr->type = PPTP_GRE_TYPE; - hdr->length = htons(length); - hdr->call = opt->remote; - hdr->sequence = htonl(opt->xmit_sequence); - opt->xmit_sequence++; - - /* Now send the packet via the delivery queue. */ - skb_set_owner_w(skb, sk_raw); - skb_queue_tail(&delivery_queue, skb); - schedule_work(&delivery_work); - return 1; -} - -/******************************************************************************/ - -static struct ppp_channel_ops pppopns_channel_ops = { - .start_xmit = pppopns_xmit, -}; - -static int pppopns_connect(struct socket *sock, struct sockaddr *useraddr, - int addrlen, int flags) -{ - struct sock *sk = sock->sk; - struct pppox_sock *po = pppox_sk(sk); - struct sockaddr_pppopns *addr = (struct sockaddr_pppopns *)useraddr; - struct sockaddr_storage ss; - struct socket *sock_tcp = NULL; - struct socket *sock_raw = NULL; - struct sock *sk_tcp; - struct sock *sk_raw; - int error; - - if (addrlen != sizeof(struct sockaddr_pppopns)) - return -EINVAL; - - lock_sock(sk); - error = -EALREADY; - if (sk->sk_state != PPPOX_NONE) - goto out; - - sock_tcp = sockfd_lookup(addr->tcp_socket, &error); - if (!sock_tcp) - goto out; - sk_tcp = sock_tcp->sk; - error = -EPROTONOSUPPORT; - if (sk_tcp->sk_protocol != IPPROTO_TCP) - goto out; - addrlen = sizeof(struct sockaddr_storage); - error = kernel_getpeername(sock_tcp, (struct sockaddr *)&ss, &addrlen); - if (error) - goto out; - if (!sk_tcp->sk_bound_dev_if) { - struct dst_entry *dst = sk_dst_get(sk_tcp); - error = -ENODEV; - if (!dst) - goto out; - sk_tcp->sk_bound_dev_if = dst->dev->ifindex; - dst_release(dst); - } - - error = sock_create(ss.ss_family, SOCK_RAW, IPPROTO_GRE, &sock_raw); - if (error) - goto out; - sk_raw = sock_raw->sk; - sk_raw->sk_bound_dev_if = sk_tcp->sk_bound_dev_if; - error = kernel_connect(sock_raw, (struct sockaddr *)&ss, addrlen, 0); - if (error) - goto out; - - po->chan.hdrlen = 14; - po->chan.private = sk_raw; - po->chan.ops = &pppopns_channel_ops; - po->chan.mtu = PPP_MRU - 80; - po->proto.pns.local = addr->local; - po->proto.pns.remote = addr->remote; - po->proto.pns.data_ready = sk_raw->sk_data_ready; - po->proto.pns.backlog_rcv = sk_raw->sk_backlog_rcv; - - error = ppp_register_channel(&po->chan); - if (error) - goto out; - - sk->sk_state = PPPOX_CONNECTED; - lock_sock(sk_raw); - sk_raw->sk_data_ready = pppopns_recv; - sk_raw->sk_backlog_rcv = pppopns_recv_core; - sk_raw->sk_user_data = sk; - release_sock(sk_raw); -out: - if (sock_tcp) - sockfd_put(sock_tcp); - if (error && sock_raw) - sock_release(sock_raw); - release_sock(sk); - return error; -} - -static int pppopns_release(struct socket *sock) -{ - struct sock *sk = sock->sk; - - if (!sk) - return 0; - - lock_sock(sk); - if (sock_flag(sk, SOCK_DEAD)) { - release_sock(sk); - return -EBADF; - } - - if (sk->sk_state != PPPOX_NONE) { - struct sock *sk_raw = (struct sock *)pppox_sk(sk)->chan.private; - lock_sock(sk_raw); - skb_queue_purge(&sk->sk_receive_queue); - pppox_unbind_sock(sk); - sk_raw->sk_data_ready = pppox_sk(sk)->proto.pns.data_ready; - sk_raw->sk_backlog_rcv = pppox_sk(sk)->proto.pns.backlog_rcv; - sk_raw->sk_user_data = NULL; - release_sock(sk_raw); - sock_release(sk_raw->sk_socket); - } - - sock_orphan(sk); - sock->sk = NULL; - release_sock(sk); - sock_put(sk); - return 0; -} - -/******************************************************************************/ - -static struct proto pppopns_proto = { - .name = "PPPOPNS", - .owner = THIS_MODULE, - .obj_size = sizeof(struct pppox_sock), -}; - -static struct proto_ops pppopns_proto_ops = { - .family = PF_PPPOX, - .owner = THIS_MODULE, - .release = pppopns_release, - .bind = sock_no_bind, - .connect = pppopns_connect, - .socketpair = sock_no_socketpair, - .accept = sock_no_accept, - .getname = sock_no_getname, - .poll = sock_no_poll, - .ioctl = pppox_ioctl, - .listen = sock_no_listen, - .shutdown = sock_no_shutdown, - .setsockopt = sock_no_setsockopt, - .getsockopt = sock_no_getsockopt, - .sendmsg = sock_no_sendmsg, - .recvmsg = sock_no_recvmsg, - .mmap = sock_no_mmap, -}; - -static int pppopns_create(struct net *net, struct socket *sock) -{ - struct sock *sk; - - sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppopns_proto); - if (!sk) - return -ENOMEM; - - sock_init_data(sock, sk); - sock->state = SS_UNCONNECTED; - sock->ops = &pppopns_proto_ops; - sk->sk_protocol = PX_PROTO_OPNS; - sk->sk_state = PPPOX_NONE; - return 0; -} - -/******************************************************************************/ - -static struct pppox_proto pppopns_pppox_proto = { - .create = pppopns_create, - .owner = THIS_MODULE, -}; - -static int __init pppopns_init(void) -{ - int error; - - error = proto_register(&pppopns_proto, 0); - if (error) - return error; - - error = register_pppox_proto(PX_PROTO_OPNS, &pppopns_pppox_proto); - if (error) - proto_unregister(&pppopns_proto); - else - skb_queue_head_init(&delivery_queue); - return error; -} - -static void __exit pppopns_exit(void) -{ - unregister_pppox_proto(PX_PROTO_OPNS); - proto_unregister(&pppopns_proto); -} - -module_init(pppopns_init); -module_exit(pppopns_exit); - -MODULE_DESCRIPTION("PPP on PPTP Network Server (PPPoPNS)"); -MODULE_AUTHOR("Chia-chi Yeh "); -MODULE_LICENSE("GPL"); diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 0d161b7f124..e42337f75e3 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -294,6 +294,13 @@ config BATTERY_MSM help Say Y to enable support for the battery in Qualcomm MSM. +config BATTERY_MSM_FAKE + tristate "Fake MSM battery" + depends on ARCH_MSM && BATTERY_MSM + default n + help + Say Y to bypass actual battery queries. + config BATTERY_MSM8X60 tristate "MSM8X60 battery" select PMIC8XXX_BATTALARM @@ -365,13 +372,6 @@ config SMB350_CHARGER The driver reports the charger status via the power supply framework. A charger status change triggers an IRQ via the device STAT pin. -config BATTERY_MSM_FAKE - tristate "Fake MSM battery" - depends on ARCH_MSM && BATTERY_MSM - default n - help - Say Y to bypass actual battery queries. - config PM8058_FIX_USB tristate "pmic8058 software workaround for usb removal" depends on PMIC8058 @@ -396,13 +396,6 @@ config BATTERY_BQ27520 help Say Y here to enable support for batteries with BQ27520 (I2C) chips. -config BATTERY_BQ27541 - tristate "BQ27541 battery driver" - depends on I2C - default n - help - Say Y here to enable support for batteries with BQ27541 (I2C) chips. - config BQ27520_TEST_ENABLE bool "Enable BQ27520 Fuel Gauge Chip Test" depends on BATTERY_BQ27520 @@ -410,6 +403,13 @@ config BQ27520_TEST_ENABLE help Say Y here to enable Test sysfs Interface for BQ27520 Drivers. +config BATTERY_BQ27541 + tristate "BQ27541 battery driver" + depends on I2C + default n + help + Say Y here to enable support for batteries with BQ27541 (I2C) chips. + config BATTERY_BQ28400 tristate "BQ28400 battery driver" depends on I2C diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 8f924d6e663..fe5af3a5db3 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -436,4 +436,6 @@ config REGULATOR_QPNP comply with QPNP. QPNP is a SPMI based PMIC implementation. These chips provide several different varieties of LDO and switching regulators. They also provide voltage switches and boost regulators. + endif + diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 054ce42e538..eb07c974067 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -45,7 +45,6 @@ obj-$(CONFIG_REGULATOR_TPS65217) += tps65217-regulator.o obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o -obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o obj-$(CONFIG_REGULATOR_PMIC8058) += pmic8058-regulator.o obj-$(CONFIG_REGULATOR_PMIC8901) += pmic8901-regulator.o obj-$(CONFIG_REGULATOR_MSM_GPIO) += msm-gpio-regulator.o diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 184911854c7..7a559a658ea 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -123,24 +123,6 @@ config RTC_INTF_DEV_UIE_EMUL clock several times per second, please enable this option only if you know that you really need it. -config RTC_INTF_ALARM - bool "Android alarm driver" - depends on RTC_CLASS - default y - help - Provides non-wakeup and rtc backed wakeup alarms based on rtc or - elapsed realtime, and a non-wakeup alarm on the monotonic clock. - Also provides an interface to set the wall time which must be used - for elapsed realtime to work. - -config RTC_INTF_ALARM_DEV - bool "Android alarm device" - depends on RTC_INTF_ALARM - default y - help - Exports the alarm interface to user-space. - - config RTC_DRV_TEST tristate "Test driver/device" help @@ -804,13 +786,6 @@ config RTC_DRV_DAVINCI This driver can also be built as a module. If so, the module will be called rtc-davinci. -config RTC_DRV_MSM7X00A - tristate "MSM7X00A" - depends on ARCH_MSM - default y - help - RTC driver for Qualcomm MSM7K chipsets - config RTC_DRV_OMAP tristate "TI OMAP1" depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX @@ -1150,15 +1125,6 @@ config RTC_DRV_PUV3 This drive can also be built as a module. If so, the module will be called rtc-puv3. -config RTC_DRV_PM8XXX - tristate "Qualcomm PMIC8XXX RTC" - depends on MFD_PM8XXX - help - Say Y here if you want to support the Qualcomm PMIC8XXX RTC. - - To compile this driver as a module, choose M here: the - module will be called rtc-pm8xxx. - config RTC_DRV_LOONGSON1 tristate "loongson1 RTC support" depends on MACH_LOONGSON1 diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 295f927a875..c6a0362ad20 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -81,7 +81,6 @@ obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_PCF2123) += rtc-pcf2123.o obj-$(CONFIG_RTC_DRV_PCF50633) += rtc-pcf50633.o -obj-$(CONFIG_RTC_DRV_PM8XXX) += rtc-pm8xxx.o obj-$(CONFIG_RTC_DRV_PL030) += rtc-pl030.o obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o obj-$(CONFIG_RTC_DRV_PM8XXX) += rtc-pm8xxx.o diff --git a/drivers/staging/ath6kl/os/linux/include/athendpack_linux.h b/drivers/staging/ath6kl/os/linux/include/athendpack_linux.h deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/drivers/staging/ath6kl/os/linux/include/athstartpack_linux.h b/drivers/staging/ath6kl/os/linux/include/athstartpack_linux.h deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/drivers/staging/dream/Kconfig b/drivers/staging/dream/Kconfig deleted file mode 100644 index 0c30b19a5a7..00000000000 --- a/drivers/staging/dream/Kconfig +++ /dev/null @@ -1,13 +0,0 @@ -config DREAM - tristate "HTC Dream support" - depends on MACH_TROUT - -if DREAM - -source "drivers/staging/dream/camera/Kconfig" - -config INPUT_GPIO - tristate "GPIO driver support" - help - Say Y here if you want to support gpio based keys, wheels etc... -endif diff --git a/drivers/staging/dream/Makefile b/drivers/staging/dream/Makefile deleted file mode 100644 index fbea0abcc86..00000000000 --- a/drivers/staging/dream/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -EXTRA_CFLAGS=-Idrivers/staging/dream/include -obj-$(CONFIG_MSM_ADSP) += qdsp5/ -obj-$(CONFIG_MSM_CAMERA) += camera/ -obj-$(CONFIG_INPUT_GPIO) += gpio_axis.o gpio_event.o gpio_input.o gpio_matrix.o gpio_output.o - diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 9274c175c8f..5c8645a84ef 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -988,14 +988,6 @@ config SERIAL_MSM_HS Choose M here to compile it as a module. The module will be called msm_serial_hs. -config SERIAL_MSM_CLOCK_CONTROL - bool "Allow tty clients to make clock requests to msm uarts." - depends on SERIAL_MSM=y - default y - help - Provides an interface for tty clients to request the msm uart clock - to be turned on or off for power savings. - config SERIAL_MSM_RX_WAKEUP bool "Wakeup the msm uart clock on GPIO activity." depends on SERIAL_MSM_CLOCK_CONTROL diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 3e15ea7cb3e..fddb4fe708b 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -134,6 +134,8 @@ source "drivers/usb/host/Kconfig" source "drivers/usb/musb/Kconfig" +source "drivers/usb/renesas_usbhs/Kconfig" + source "drivers/usb/class/Kconfig" source "drivers/usb/storage/Kconfig" diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index 87a00781fdc..5b971487cf6 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -2093,6 +2093,7 @@ static ssize_t enable_store(struct device *pdev, struct device_attribute *attr, bool audio_enabled = false; static DEFINE_RATELIMIT_STATE(rl, 10*HZ, 1); + if (!cdev) return -ENODEV; diff --git a/drivers/usb/gadget/ci13xxx_msm.c b/drivers/usb/gadget/ci13xxx_msm.c index ccede0c3389..569f2005c50 100644 --- a/drivers/usb/gadget/ci13xxx_msm.c +++ b/drivers/usb/gadget/ci13xxx_msm.c @@ -3,12 +3,6 @@ * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * */ #include diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 81fc1cc3f5c..e0255ce7aa4 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -3280,6 +3280,7 @@ static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_active) static int ci13xxx_start(struct usb_gadget_driver *driver, int (*bind)(struct usb_gadget *)); static int ci13xxx_stop(struct usb_gadget_driver *driver); + /** * Device operations part of the API to the USB controller hardware, * which don't involve endpoints (or i/o) diff --git a/drivers/usb/gadget/ci13xxx_udc.h b/drivers/usb/gadget/ci13xxx_udc.h index 76028b243d9..3145418be2c 100644 --- a/drivers/usb/gadget/ci13xxx_udc.h +++ b/drivers/usb/gadget/ci13xxx_udc.h @@ -137,10 +137,10 @@ struct ci13xxx_udc_driver { #define CI13XXX_CONTROLLER_RESET_EVENT 0 #define CI13XXX_CONTROLLER_CONNECT_EVENT 1 #define CI13XXX_CONTROLLER_SUSPEND_EVENT 2 -#define CI13XXX_CONTROLLER_REMOTE_WAKEUP_EVENT 3 -#define CI13XXX_CONTROLLER_RESUME_EVENT 4 -#define CI13XXX_CONTROLLER_DISCONNECT_EVENT 5 -#define CI13XXX_CONTROLLER_UDC_STARTED_EVENT 6 +#define CI13XXX_CONTROLLER_REMOTE_WAKEUP_EVENT 3 +#define CI13XXX_CONTROLLER_RESUME_EVENT 4 +#define CI13XXX_CONTROLLER_DISCONNECT_EVENT 5 +#define CI13XXX_CONTROLLER_UDC_STARTED_EVENT 6 void (*notify_event) (struct ci13xxx *udc, unsigned event); }; diff --git a/drivers/usb/gadget/qcom_maemo.c b/drivers/usb/gadget/qcom_maemo.c deleted file mode 100644 index 2fb8be05fd1..00000000000 --- a/drivers/usb/gadget/qcom_maemo.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Qualcomm Maemo Composite driver - * - * Copyright (C) 2008 David Brownell - * Copyright (C) 2008 Nokia Corporation - * Copyright (C) 2009 Samsung Electronics - * Copyright (c) 2010, The Linux Foundation. All rights reserved. - * - * This program from The Linux Foundation is free software; you can - * redistribute it and/or modify it under the GNU General Public License - * version 2 and only version 2 as published by the Free Software Foundation. - * The original work available from [git.kernel.org ] is subject to the - * notice below. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include - - -#define DRIVER_DESC "Qcom Maemo Composite Gadget" -#define VENDOR_ID 0x05c6 -#define PRODUCT_ID 0x902E - -/* - * kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module. So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ - -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - -#define USB_ETH - -#define USB_ETH_RNDIS -#ifdef USB_ETH_RNDIS -# include "f_rndis.c" -# include "rndis.c" -#endif - - -#include "u_serial.c" -#include "f_serial.c" - -#include "u_ether.c" - -#undef DBG /* u_ether.c has broken idea about macros */ -#undef VDBG /* so clean up after it */ -#undef ERROR -#undef INFO - -#include "f_mass_storage.c" -#include "f_diag.c" -#include "f_rmnet.c" - -/*-------------------------------------------------------------------------*/ -/* string IDs are assigned dynamically */ - -#define STRING_MANUFACTURER_IDX 0 -#define STRING_PRODUCT_IDX 1 -#define STRING_SERIAL_IDX 2 - -/* String Table */ -static struct usb_string strings_dev[] = { - /* These dummy values should be overridden by platform data */ - [STRING_MANUFACTURER_IDX].s = "Qualcomm Incorporated", - [STRING_PRODUCT_IDX].s = "Usb composition", - [STRING_SERIAL_IDX].s = "0123456789ABCDEF", - { } /* end of list */ -}; - -static struct usb_gadget_strings stringtab_dev = { - .language = 0x0409, /* en-us */ - .strings = strings_dev, -}; - -static struct usb_gadget_strings *dev_strings[] = { - &stringtab_dev, - NULL, -}; - -static struct usb_device_descriptor device_desc = { - .bLength = sizeof(device_desc), - .bDescriptorType = USB_DT_DEVICE, - .bcdUSB = __constant_cpu_to_le16(0x0200), - .bDeviceClass = USB_CLASS_PER_INTERFACE, - .bDeviceSubClass = 0, - .bDeviceProtocol = 0, - .idVendor = __constant_cpu_to_le16(VENDOR_ID), - .idProduct = __constant_cpu_to_le16(PRODUCT_ID), - .bcdDevice = __constant_cpu_to_le16(0xffff), - .bNumConfigurations = 1, -}; - -static u8 hostaddr[ETH_ALEN]; -static struct usb_diag_ch *diag_ch; -static struct usb_diag_platform_data usb_diag_pdata = { - .ch_name = DIAG_LEGACY, -}; - -/****************************** Configurations ******************************/ -static struct fsg_module_parameters mod_data = { - .stall = 0 -}; -FSG_MODULE_PARAMETERS(/* no prefix */, mod_data); - -static struct fsg_common *fsg_common; -static int maemo_setup_config(struct usb_configuration *c, - const struct usb_ctrlrequest *ctrl); - -static int maemo_do_config(struct usb_configuration *c) -{ - int ret; - - ret = rndis_bind_config(c, hostaddr); - if (ret < 0) - return ret; - - ret = diag_function_add(c); - if (ret < 0) - return ret; - - ret = gser_bind_config(c, 0); - if (ret < 0) - return ret; - - ret = gser_bind_config(c, 1); - if (ret < 0) - return ret; - - ret = rmnet_function_add(c); - if (ret < 0) - return ret; - - ret = fsg_add(c->cdev, c, fsg_common); - if (ret < 0) - return ret; - - return 0; -} - -static struct usb_configuration maemo_config_driver = { - .label = "Qcom Maemo Gadget", - .bind = maemo_do_config, - .setup = maemo_setup_config, - .bConfigurationValue = 1, - .bMaxPower = 0xFA, -}; -static int maemo_setup_config(struct usb_configuration *c, - const struct usb_ctrlrequest *ctrl) -{ - int i; - int ret = -EOPNOTSUPP; - - for (i = 0; i < maemo_config_driver.next_interface_id; i++) { - if (maemo_config_driver.interface[i]->setup) { - ret = maemo_config_driver.interface[i]->setup( - maemo_config_driver.interface[i], ctrl); - if (ret >= 0) - return ret; - } - } - - return ret; -} - -static int maemo_bind(struct usb_composite_dev *cdev) -{ - struct usb_gadget *gadget = cdev->gadget; - int status, gcnum; - - /* set up diag channel */ - diag_ch = diag_setup(&usb_diag_pdata); - if (IS_ERR(diag_ch)) - return PTR_ERR(diag_ch); - - /* set up network link layer */ - status = gether_setup(cdev->gadget, hostaddr); - if (status < 0) - goto diag_clean; - - /* set up serial link layer */ - status = gserial_setup(cdev->gadget, 2); - if (status < 0) - goto fail0; - - /* set up mass storage function */ - fsg_common = fsg_common_from_params(0, cdev, &mod_data); - if (IS_ERR(fsg_common)) { - status = PTR_ERR(fsg_common); - goto fail1; - } - - gcnum = usb_gadget_controller_number(gadget); - if (gcnum >= 0) - device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum); - else { - /* gadget zero is so simple (for now, no altsettings) that - * it SHOULD NOT have problems with bulk-capable hardware. - * so just warn about unrcognized controllers -- don't panic. - * - * things like configuration and altsetting numbering - * can need hardware-specific attention though. - */ - WARNING(cdev, "controller '%s' not recognized\n", - gadget->name); - device_desc.bcdDevice = __constant_cpu_to_le16(0x9999); - } - - /* Allocate string descriptor numbers ... note that string - * contents can be overridden by the composite_dev glue. - */ - - status = usb_string_id(cdev); - if (status < 0) - goto fail2; - strings_dev[STRING_MANUFACTURER_IDX].id = status; - device_desc.iManufacturer = status; - - status = usb_string_id(cdev); - if (status < 0) - goto fail2; - strings_dev[STRING_PRODUCT_IDX].id = status; - device_desc.iProduct = status; - - if (!usb_gadget_set_selfpowered(gadget)) - maemo_config_driver.bmAttributes |= USB_CONFIG_ATT_SELFPOWER; - - if (gadget->ops->wakeup) - maemo_config_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; - - /* register our first configuration */ - status = usb_add_config(cdev, &maemo_config_driver); - if (status < 0) - goto fail2; - - usb_gadget_set_selfpowered(gadget); - dev_info(&gadget->dev, DRIVER_DESC "\n"); - fsg_common_put(fsg_common); - return 0; - -fail2: - fsg_common_put(fsg_common); -fail1: - gserial_cleanup(); -fail0: - gether_cleanup(); -diag_clean: - diag_cleanup(diag_ch); - - return status; -} - -static int __exit maemo_unbind(struct usb_composite_dev *cdev) -{ - gserial_cleanup(); - gether_cleanup(); - diag_cleanup(diag_ch); - return 0; -} - -static struct usb_composite_driver qcom_maemo_driver = { - .name = "Qcom Maemo Gadget", - .dev = &device_desc, - .strings = dev_strings, - .bind = maemo_bind, - .unbind = __exit_p(maemo_unbind), -}; - -static int __init qcom_maemo_usb_init(void) -{ - return usb_composite_register(&qcom_maemo_driver); -} -module_init(qcom_maemo_usb_init); - -static void __exit qcom_maemo_usb_cleanup(void) -{ - usb_composite_unregister(&qcom_maemo_driver); -} -module_exit(qcom_maemo_usb_cleanup); - -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL v2"); -MODULE_VERSION("1.0"); diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index cd17421c765..edf2a73f5f9 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -754,23 +754,6 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x) #endif -/* - * Writing to dma coherent memory on ARM may be delayed via L2 - * writing buffer, so introduce the helper which can flush L2 writing - * buffer into memory immediately, especially used to flush ehci - * descriptor to memory. - * */ -#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE -static inline void ehci_sync_mem(void) -{ - mb(); -} -#else -static inline void ehci_sync_mem(void) -{ -} -#endif - /*-------------------------------------------------------------------------*/ #ifdef CONFIG_PCI diff --git a/drivers/usb/otg/otg_id.c b/drivers/usb/otg/otg_id.c deleted file mode 100644 index 7c38390ffe9..00000000000 --- a/drivers/usb/otg/otg_id.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * - * Author: - * Colin Cross - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include - -static DEFINE_MUTEX(otg_id_lock); -static struct plist_head otg_id_plist = - PLIST_HEAD_INIT(otg_id_plist); -static struct otg_id_notifier_block *otg_id_active; -static bool otg_id_cancelling; -static bool otg_id_inited; -static int otg_id_suspended; -static bool otg_id_pending; - -static void otg_id_cancel(void) -{ - if (otg_id_active) { - otg_id_cancelling = true; - mutex_unlock(&otg_id_lock); - - otg_id_active->cancel(otg_id_active); - - mutex_lock(&otg_id_lock); - otg_id_cancelling = false; - } -} - -static void __otg_id_notify(void) -{ - int ret = 0; - struct otg_id_notifier_block *otg_id_nb; - bool proxy_wait = false; - if (plist_head_empty(&otg_id_plist)) - return; - - plist_for_each_entry(otg_id_nb, &otg_id_plist, p) { - if (proxy_wait) { - if (otg_id_nb->proxy_wait) - ret = otg_id_nb->proxy_wait(otg_id_nb); - } else { - ret = otg_id_nb->detect(otg_id_nb); - } - if (ret == OTG_ID_HANDLED) { - otg_id_active = otg_id_nb; - return; - } - if (ret == OTG_ID_PROXY_WAIT) - proxy_wait = true; - - } - - WARN(1, "otg id event not handled"); - otg_id_active = NULL; -} - -int otg_id_init(void) -{ - mutex_lock(&otg_id_lock); - - otg_id_inited = true; - __otg_id_notify(); - - mutex_unlock(&otg_id_lock); - return 0; -} -late_initcall(otg_id_init); - -/** - * otg_id_register_notifier - * @otg_id_nb: notifier block containing priority and callback function - * - * Register a notifier that will be called on any USB cable state change. - * The priority determines the order the callback will be called in, a higher - * number will be called first. A callback function needs to determine the - * type of USB cable that is connected. If it can determine the type, it - * should notify the appropriate drivers (for example, call an otg notifier - * with USB_EVENT_VBUS), and return OTG_ID_HANDLED. Once a callback has - * returned OTG_ID_HANDLED, it is responsible for calling otg_id_notify() when - * the detected USB cable is disconnected. - */ -int otg_id_register_notifier(struct otg_id_notifier_block *otg_id_nb) -{ - plist_node_init(&otg_id_nb->p, otg_id_nb->priority); - - mutex_lock(&otg_id_lock); - plist_add(&otg_id_nb->p, &otg_id_plist); - - if (otg_id_inited) { - otg_id_cancel(); - __otg_id_notify(); - } - - mutex_unlock(&otg_id_lock); - - return 0; -} - -void otg_id_unregister_notifier(struct otg_id_notifier_block *otg_id_nb) -{ - mutex_lock(&otg_id_lock); - - plist_del(&otg_id_nb->p, &otg_id_plist); - - if (otg_id_inited && (otg_id_active == otg_id_nb)) { - otg_id_cancel(); - __otg_id_notify(); - } - - mutex_unlock(&otg_id_lock); -} - -/** - * otg_id_notify - * - * Notify listeners on any USB cable state change. - * - * A driver may only call otg_id_notify if it returned OTG_ID_HANDLED the last - * time it's notifier was called, and it's cancel function has not been called. - */ -void otg_id_notify(void) -{ - mutex_lock(&otg_id_lock); - - if (otg_id_cancelling) - goto out; - - if (otg_id_suspended != 0) { - otg_id_pending = true; - goto out; - } - - __otg_id_notify(); -out: - mutex_unlock(&otg_id_lock); -} - -/** - * otg_id_suspend - * - * Mark the otg_id subsystem as going into suspend. From here on out, - * any notifications will be deferred until the last otg_id client resumes. - * If there is a pending notification when calling this function, it will - * return a negative errno and expects that the caller will abort suspend. - * Returs 0 on success. - */ -int otg_id_suspend(void) -{ - int ret = 0; - - mutex_lock(&otg_id_lock); - - /* - * if there's a pending notification, tell the caller to abort suspend - */ - if (otg_id_suspended != 0 && otg_id_pending) { - pr_info("otg_id: pending notification, should abort suspend\n"); - ret = -EBUSY; - goto out; - } - - otg_id_suspended++; -out: - mutex_unlock(&otg_id_lock); - return ret; -} - -/** - * otg_id_resume - * - * Inform the otg_id subsystem that a client is resuming. If this is the - * last client to be resumed and there's a pending notification, - * otg_id_notify() is called. - */ -void otg_id_resume(void) -{ - mutex_lock(&otg_id_lock); - if (WARN(!otg_id_suspended, "unbalanced otg_id_resume\n")) - goto out; - if (--otg_id_suspended == 0) { - if (otg_id_pending) { - pr_info("otg_id: had pending notification\n"); - otg_id_pending = false; - __otg_id_notify(); - } - } -out: - mutex_unlock(&otg_id_lock); -} diff --git a/fs/fat/Makefile b/fs/fat/Makefile index 3f3e5354f8e..e06190322c1 100644 --- a/fs/fat/Makefile +++ b/fs/fat/Makefile @@ -2,7 +2,6 @@ # Makefile for the Linux fat filesystem support. # - obj-$(CONFIG_FAT_FS) += fat.o obj-$(CONFIG_VFAT_FS) += vfat.o obj-$(CONFIG_MSDOS_FS) += msdos.o diff --git a/include/linux/cpuacct.h b/include/linux/cpuacct.h deleted file mode 100644 index 8f68e733fe1..00000000000 --- a/include/linux/cpuacct.h +++ /dev/null @@ -1,43 +0,0 @@ -/* include/linux/cpuacct.h - * - * Copyright (C) 2010 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _CPUACCT_H_ -#define _CPUACCT_H_ - -#include - -#ifdef CONFIG_CGROUP_CPUACCT - -/* - * Platform specific CPU frequency hooks for cpuacct. These functions are - * called from the scheduler. - */ -struct cpuacct_charge_calls { - /* - * Platforms can take advantage of this data and use - * per-cpu allocations if necessary. - */ - void (*init) (void **cpuacct_data); - void (*charge) (void *cpuacct_data, u64 cputime, unsigned int cpu); - void (*cpufreq_show) (void *cpuacct_data, struct cgroup_map_cb *cb); - /* Returns power consumed in milliWatt seconds */ - u64 (*power_usage) (void *cpuacct_data); -}; - -int cpuacct_charge_register(struct cpuacct_charge_calls *fn); - -#endif /* CONFIG_CGROUP_CPUACCT */ - -#endif // _CPUACCT_H_ diff --git a/include/linux/fs.h b/include/linux/fs.h index 03fc44b3c04..093f0b8878c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -17,8 +17,8 @@ * nr_file rlimit, so it's safe to set up a ridiculously high absolute * upper limit on files-per-process. * - * Some programs (notably those using select()) may have to be - * recompiled to take full advantage of the new limits.. + * Some programs (notably those using select()) may have to be + * recompiled to take full advantage of the new limits.. */ /* Fixed constants first: */ @@ -178,7 +178,7 @@ struct inodes_stat_t { #define SEL_EX 4 /* public flags for file_system_type */ -#define FS_REQUIRES_DEV 1 +#define FS_REQUIRES_DEV 1 #define FS_BINARY_MOUNTDATA 2 #define FS_HAS_SUBTYPE 4 #define FS_REVAL_DOT 16384 /* Check the paths ".", ".." for staleness */ @@ -490,7 +490,7 @@ struct iattr { */ #include -/** +/** * enum positive_aop_returns - aop return codes with specific semantics * * @AOP_WRITEPAGE_ACTIVATE: Informs the caller that page writeback has @@ -500,7 +500,7 @@ struct iattr { * be a candidate for writeback again in the near * future. Other callers must be careful to unlock * the page if they get this return. Returned by - * writepage(); + * writepage(); * * @AOP_TRUNCATED_PAGE: The AOP method that was handed a locked page has * unlocked it and the page might have been truncated. @@ -1078,10 +1078,10 @@ static inline int file_check_writeable(struct file *filp) #define MAX_NON_LFS ((1UL<<31) - 1) -/* Page cache limit. The filesystems should put that into their s_maxbytes - limits, otherwise bad things can happen in VM. */ +/* Page cache limit. The filesystems should put that into their s_maxbytes + limits, otherwise bad things can happen in VM. */ #if BITS_PER_LONG==32 -#define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) +#define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) #elif BITS_PER_LONG==64 #define MAX_LFS_FILESIZE 0x7fffffffffffffffUL #endif @@ -2282,7 +2282,7 @@ extern void free_write_pipe(struct file *); extern int kernel_read(struct file *, loff_t, char *, unsigned long); extern struct file * open_exec(const char *); - + /* fs/dcache.c -- generic fs support functions */ extern int is_subdir(struct dentry *, struct dentry *); extern int path_is_under(struct path *, struct path *); diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 37b1fdc0ff4..fb0c7af76e5 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -710,7 +710,4 @@ extern char *mach_panic_string; #endif /* __KERNEL__ */ -/* To identify board information in panic logs, set this */ -extern char *mach_panic_string; - #endif diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index fc7d1a45dff..4473d699c5e 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -243,10 +243,6 @@ extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms) extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pnum); -extern void reserve_hotplug_pages(unsigned long start_pfn, - unsigned long nr_pages); -extern void unreserve_hotplug_pages(unsigned long start_pfn, - unsigned long nr_pages); #endif /* __LINUX_MEMORY_HOTPLUG_H */ extern int physical_remove_memory(u64 start, u64 size); extern int arch_physical_remove_memory(u64 start, u64 size); diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 6e126949cb8..ca7a586f05c 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -529,12 +529,6 @@ static inline int zone_is_oom_locked(const struct zone *zone) return test_bit(ZONE_OOM_LOCKED, &zone->flags); } -#ifdef CONFIG_SMP -unsigned long zone_nr_free_pages(struct zone *zone); -#else -#define zone_nr_free_pages(zone) zone_page_state(zone, NR_FREE_PAGES) -#endif /* CONFIG_SMP */ - /* * The "priority" of VM scanning is how much of the queues we will scan in one * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 6e4b7a61101..ce5ddf33069 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h @@ -1135,55 +1135,6 @@ enum nl80211_commands { * %NL80211_CMD_SET_BEACON to provide extra IEs (e.g., WPS/P2P IE) into * (Re)Association Response frames when the driver (or firmware) replies to * (Re)Association Request frames. - * @NL80211_ATTR_STA_WME: Nested attribute containing the wme configuration - * of the station, see &enum nl80211_sta_wme_attr. - * @NL80211_ATTR_SUPPORT_AP_UAPSD: the device supports uapsd when working - * as AP. - * - * @NL80211_ATTR_ROAM_SUPPORT: Indicates whether the firmware is capable of - * roaming to another AP in the same ESS if the signal lever is low. - * - * @NL80211_ATTR_PMKSA_CANDIDATE: Nested attribute containing the PMKSA caching - * candidate information, see &enum nl80211_pmksa_candidate_attr. - * - * @NL80211_ATTR_TX_NO_CCK_RATE: Indicates whether to use CCK rate or not - * for management frames transmission. In order to avoid p2p probe/action - * frames are being transmitted at CCK rate in 2GHz band, the user space - * applications use this attribute. - * This attribute is used with %NL80211_CMD_TRIGGER_SCAN and - * %NL80211_CMD_FRAME commands. - * - * @NL80211_ATTR_TDLS_ACTION: Low level TDLS action code (e.g. link setup - * request, link setup confirm, link teardown, etc.). Values are - * described in the TDLS (802.11z) specification. - * @NL80211_ATTR_TDLS_DIALOG_TOKEN: Non-zero token for uniquely identifying a - * TDLS conversation between two devices. - * @NL80211_ATTR_TDLS_OPERATION: High level TDLS operation; see - * &enum nl80211_tdls_operation, represented as a u8. - * @NL80211_ATTR_TDLS_SUPPORT: A flag indicating the device can operate - * as a TDLS peer sta. - * @NL80211_ATTR_TDLS_EXTERNAL_SETUP: The TDLS discovery/setup and teardown - * procedures should be performed by sending TDLS packets via - * %NL80211_CMD_TDLS_MGMT. Otherwise %NL80211_CMD_TDLS_OPER should be - * used for asking the driver to perform a TDLS operation. - * - * @NL80211_ATTR_DEVICE_AP_SME: This u32 attribute may be listed for devices - * that have AP support to indicate that they have the AP SME integrated - * with support for the features listed in this attribute, see - * &enum nl80211_ap_sme_features. - * - * @NL80211_ATTR_DONT_WAIT_FOR_ACK: Used with %NL80211_CMD_FRAME, this tells - * the driver to not wait for an acknowledgement. Note that due to this, - * it will also not give a status callback nor return a cookie. This is - * mostly useful for probe responses to save airtime. - * - * @NL80211_ATTR_FEATURE_FLAGS: This u32 attribute contains flags from - * &enum nl80211_feature_flags and is advertised in wiphy information. - * @NL80211_ATTR_PROBE_RESP_OFFLOAD: Indicates that the HW responds to probe - * - * requests while operating in AP-mode. - * This attribute holds a bitmap of the supported protocols for - * offloading (see &enum nl80211_probe_resp_offload_support_attr). * * @NL80211_ATTR_STA_WME: Nested attribute containing the wme configuration * of the station, see &enum nl80211_sta_wme_attr. diff --git a/include/linux/platform_data/ram_console.h b/include/linux/platform_data/ram_console.h deleted file mode 100644 index 9f1125c1106..00000000000 --- a/include/linux/platform_data/ram_console.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2010 Google, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef _INCLUDE_LINUX_PLATFORM_DATA_RAM_CONSOLE_H_ -#define _INCLUDE_LINUX_PLATFORM_DATA_RAM_CONSOLE_H_ - -struct ram_console_platform_data { - const char *bootinfo; -}; - -#endif /* _INCLUDE_LINUX_PLATFORM_DATA_RAM_CONSOLE_H_ */ diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index f9547f4cb42..3b5e910d14c 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h @@ -27,8 +27,6 @@ struct cpu_stop_work { struct cpu_stop_done *done; }; -extern struct mutex stop_cpus_mutex; - int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg); void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, struct cpu_stop_work *work_buf); diff --git a/include/linux/usb/otg_id.h b/include/linux/usb/otg_id.h deleted file mode 100644 index f9f5189a73b..00000000000 --- a/include/linux/usb/otg_id.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2011 Google, Inc. - * - * Author: - * Colin Cross - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#ifndef __LINUX_USB_OTG_ID_H -#define __LINUX_USB_OTG_ID_H - -#include -#include - -/** - * otg_id_notifier_block - * - * @priority: Order the notifications will be called in. Higher numbers - * get called first. - * @detect: Called during otg_id_notify. Return OTG_ID_HANDLED if the USB cable - * has been identified - * @proxy_wait: Called during otg_id_notify if a previous handler returns - * OTG_ID_PROXY_WAIT. This should wait on ID change then call otg_id_notify. - * This is used when a handler knows what's connected but can't detect - * the change itself. - * @cancel: Called after detect has returned OTG_ID_HANDLED to ask it to - * release detection resources to allow a new identification to occur. - */ - -struct otg_id_notifier_block { - int priority; - int (*detect)(struct otg_id_notifier_block *otg_id_nb); - int (*proxy_wait)(struct otg_id_notifier_block *otg_id_nb); - void (*cancel)(struct otg_id_notifier_block *otg_id_nb); - struct plist_node p; -}; - -#define OTG_ID_PROXY_WAIT 2 -#define OTG_ID_HANDLED 1 -#define OTG_ID_UNHANDLED 0 - -int otg_id_register_notifier(struct otg_id_notifier_block *otg_id_nb); -void otg_id_unregister_notifier(struct otg_id_notifier_block *otg_id_nb); - -void otg_id_notify(void); -int otg_id_suspend(void); -void otg_id_resume(void); - -#endif /* __LINUX_USB_OTG_ID_H */ diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 2972dc039fe..a1d0445138e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -1491,6 +1491,7 @@ enum v4l2_mpeg_video_header_mode { V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE = 0, V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME = 1, V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_I_FRAME = 2, + }; #define V4L2_CID_MPEG_VIDEO_MAX_REF_PIC (V4L2_CID_MPEG_BASE+217) #define V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE (V4L2_CID_MPEG_BASE+218) @@ -1602,7 +1603,6 @@ enum v4l2_mpeg_video_h264_vui_sar_idc { #define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP (V4L2_CID_MPEG_BASE+403) #define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP (V4L2_CID_MPEG_BASE+404) #define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL (V4L2_CID_MPEG_BASE+405) - enum v4l2_mpeg_video_mpeg4_level { V4L2_MPEG_VIDEO_MPEG4_LEVEL_0 = 0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B = 1, diff --git a/include/media/rc-map.h b/include/media/rc-map.h index a51f84c7b73..5b4ad6d60bd 100644 --- a/include/media/rc-map.h +++ b/include/media/rc-map.h @@ -152,8 +152,8 @@ void rc_map_init(void); #define RC_MAP_TREKSTOR "rc-trekstor" #define RC_MAP_TT_1500 "rc-tt-1500" #define RC_MAP_TWINHAN_VP1027_DVBS "rc-twinhan1027" -#define RC_MAP_VIDEOMATE_K100 "rc-videomate-k100" #define RC_MAP_UE_RF4CE "rc-ue-rf4ce" +#define RC_MAP_VIDEOMATE_K100 "rc-videomate-k100" #define RC_MAP_VIDEOMATE_S350 "rc-videomate-s350" #define RC_MAP_VIDEOMATE_TV_PVR "rc-videomate-tv-pvr" #define RC_MAP_WINFAST "rc-winfast" diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 3a7edf38ccb..16456088e24 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -669,7 +669,9 @@ struct station_info { const u8 *assoc_req_ies; size_t assoc_req_ies_len; + u32 beacon_loss_count; + /* * Note: Add a new enum station_info_flags value for each new field and * use it to check which fields are initialized. diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index 6f1470fadd0..498433dd067 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h @@ -14,8 +14,6 @@ extern struct proto tcpv6_prot; struct flowi6; -extern void initialize_hashidentrnd(void); - /* extension headers */ extern int ipv6_exthdrs_init(void); extern void ipv6_exthdrs_exit(void); diff --git a/init/Kconfig b/init/Kconfig index b2126bc7dbd..e4b67a1dddf 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1132,15 +1132,6 @@ config SHMEM option replaces shmem and tmpfs with the much simpler ramfs code, which may be appropriate on small systems without swap. -config ASHMEM - bool "Enable the Anonymous Shared Memory Subsystem" - default n - depends on SHMEM || TINY_SHMEM - help - The ashmem subsystem is a new shared memory allocator, similar to - POSIX SHM but with different behavior and sporting a simpler - file-based API. - config AIO bool "Enable AIO support" if EXPERT default y diff --git a/kernel/power/main.c b/kernel/power/main.c index b54da024c20..7aac5f6a371 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -666,7 +666,6 @@ static int __init pm_init(void) tc_ev_timer.function = &tc_ev_stop; tc_ev_processed = 1; - power_kobj = kobject_create_and_add("power", NULL); if (!power_kobj) return -ENOMEM; diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index b0f118e32cc..2f194e96571 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c @@ -133,8 +133,8 @@ void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, cpu_stop_queue_work(&per_cpu(cpu_stopper, cpu), work_buf); } -DEFINE_MUTEX(stop_cpus_mutex); /* static data for stop_cpus */ +static DEFINE_MUTEX(stop_cpus_mutex); static DEFINE_PER_CPU(struct cpu_stop_work, stop_cpus_work); static void queue_stop_cpus_work(const struct cpumask *cpumask, diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index d778ae3fd9d..83087d10a5a 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -201,7 +201,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al l2cap_pi(sk)->mode, sk->sk_state); if (!addr || alen < sizeof(addr->sa_family) || - addr->sa_family != AF_BLUETOOTH) + addr->sa_family != AF_BLUETOOTH) return -EINVAL; memset(&la, 0, sizeof(la)); diff --git a/net/ipv4/netfilter/Makefile b/net/ipv4/netfilter/Makefile index 291934b83df..a00a904bf11 100644 --- a/net/ipv4/netfilter/Makefile +++ b/net/ipv4/netfilter/Makefile @@ -69,3 +69,4 @@ obj-$(CONFIG_IP_NF_ARP_MANGLE) += arpt_mangle.o obj-$(CONFIG_IP_NF_ARPFILTER) += arptable_filter.o obj-$(CONFIG_IP_NF_QUEUE) += ip_queue.o + diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index ab7bd2c0c5c..0cb86ceb652 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1991,49 +1991,6 @@ void tcp_v4_destroy_sock(struct sock *sk) } EXPORT_SYMBOL(tcp_v4_destroy_sock); -/* - * tcp_v4_nuke_addr - destroy all sockets on the given local address - */ -void tcp_v4_nuke_addr(__u32 saddr) -{ - unsigned int bucket; - - for (bucket = 0; bucket < tcp_hashinfo.ehash_mask; bucket++) { - struct hlist_nulls_node *node; - struct sock *sk; - spinlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, bucket); - -restart: - spin_lock_bh(lock); - sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[bucket].chain) { - struct inet_sock *inet = inet_sk(sk); - - if (inet->inet_rcv_saddr != saddr) - continue; - if (sysctl_ip_dynaddr && sk->sk_state == TCP_SYN_SENT) - continue; - if (sock_flag(sk, SOCK_DEAD)) - continue; - - sock_hold(sk); - spin_unlock_bh(lock); - - local_bh_disable(); - bh_lock_sock(sk); - sk->sk_err = ETIMEDOUT; - sk->sk_error_report(sk); - - tcp_done(sk); - bh_unlock_sock(sk); - local_bh_enable(); - sock_put(sk); - - goto restart; - } - spin_unlock_bh(lock); - } -} - #ifdef CONFIG_PROC_FS /* Proc filesystem TCP sock list dumping. */ diff --git a/net/wireless/util.c b/net/wireless/util.c index a448b80f70e..017d4fc58d5 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -1038,6 +1038,7 @@ int ieee80211_get_ratemask(struct ieee80211_supported_band *sband, if (!found) return -EINVAL; } + /* * mask must have at least one bit set here since we * didn't accept a 0-length rates array nor allowed