From 201513a34588346ac5588aa7f6e115ef3985b3dd Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Mon, 10 Jan 2011 21:56:08 +0100 Subject: [PATCH] --- yaml --- r: 232489 b: refs/heads/master c: 021cb59ae3869fb18ebc9fceb959f379c5ca835c h: refs/heads/master i: 232487: 063c9d8f1a8b223e365311ac51fd86862077a824 v: v3 --- [refs] | 2 +- .../ABI/testing/sysfs-platform-at91 | 25 - trunk/Documentation/networking/bonding.txt | 83 +- trunk/MAINTAINERS | 1 + trunk/arch/arm/mach-omap2/pm24xx.c | 4 +- trunk/arch/arm/mach-omap2/pm34xx.c | 4 +- trunk/arch/arm/mach-omap2/serial.c | 4 +- trunk/arch/arm/mach-tegra/include/mach/kbc.h | 61 -- trunk/arch/avr32/include/asm/pgalloc.h | 1 - trunk/arch/parisc/kernel/pdc_cons.c | 4 +- trunk/arch/x86/include/asm/paravirt.h | 5 +- trunk/drivers/atm/idt77105.c | 2 +- trunk/drivers/base/power/runtime.c | 9 +- trunk/drivers/bluetooth/ath3k.c | 75 +- trunk/drivers/char/bfin_jtag_comm.c | 8 +- trunk/drivers/clocksource/tcb_clksrc.c | 4 +- trunk/drivers/gpio/langwell_gpio.c | 9 +- trunk/drivers/gpu/drm/nouveau/nouveau_drv.c | 8 +- trunk/drivers/gpu/drm/radeon/radeon_device.c | 10 +- trunk/drivers/hwmon/applesmc.c | 1 - trunk/drivers/hwmon/asus_atk0110.c | 23 +- trunk/drivers/hwmon/lis3lv02d.c | 2 +- trunk/drivers/input/keyboard/Kconfig | 10 - trunk/drivers/input/keyboard/Makefile | 1 - trunk/drivers/input/keyboard/gpio_keys.c | 6 +- trunk/drivers/input/keyboard/tegra-kbc.c | 727 -------------- .../drivers/input/keyboard/tnetv107x-keypad.c | 5 +- trunk/drivers/input/serio/ct82c710.c | 8 +- trunk/drivers/input/serio/serport.c | 24 +- trunk/drivers/input/sparse-keymap.c | 1 - trunk/drivers/input/tablet/wacom_wac.c | 27 +- trunk/drivers/input/touchscreen/bu21013_ts.c | 39 +- .../drivers/input/touchscreen/tnetv107x-ts.c | 5 +- trunk/drivers/leds/leds-pwm.c | 1 - trunk/drivers/mmc/host/ushc.c | 1 - trunk/drivers/net/bnx2.c | 21 +- trunk/drivers/net/bnx2.h | 1 - trunk/drivers/net/bonding/bond_3ad.c | 4 - trunk/drivers/net/bonding/bond_alb.c | 4 - trunk/drivers/net/bonding/bond_main.c | 4 - trunk/drivers/net/can/Kconfig | 2 - trunk/drivers/net/can/Makefile | 1 - trunk/drivers/net/can/at91_can.c | 138 +-- trunk/drivers/net/can/softing/Kconfig | 30 - trunk/drivers/net/can/softing/Makefile | 6 - trunk/drivers/net/can/softing/softing.h | 167 ---- trunk/drivers/net/can/softing/softing_cs.c | 359 ------- trunk/drivers/net/can/softing/softing_fw.c | 691 -------------- trunk/drivers/net/can/softing/softing_main.c | 893 ------------------ .../net/can/softing/softing_platform.h | 40 - trunk/drivers/net/cnic.c | 12 +- trunk/drivers/net/cxgb4/cxgb4_main.c | 3 +- trunk/drivers/net/pch_gbe/pch_gbe_main.c | 2 +- trunk/drivers/net/tg3.c | 95 +- trunk/drivers/net/tg3.h | 3 + trunk/drivers/net/usb/kaweth.c | 1 - trunk/drivers/net/wireless/ath/ath9k/hw.c | 6 +- trunk/drivers/net/wireless/ath/ath9k/hw.h | 1 - trunk/drivers/net/wireless/ath/ath9k/main.c | 8 +- trunk/drivers/net/wireless/ath/ath9k/xmit.c | 2 + trunk/drivers/net/wireless/iwlwifi/iwl-4965.c | 1 - .../net/wireless/iwlwifi/iwl-agn-eeprom.c | 11 +- trunk/drivers/net/wireless/rt2x00/rt73usb.c | 1 - trunk/drivers/net/wireless/rtlwifi/pci.c | 11 +- trunk/drivers/parport/share.c | 4 +- trunk/drivers/pps/clients/pps-ktimer.c | 2 + trunk/drivers/pps/clients/pps_parport.c | 2 +- .../drivers/pps/generators/pps_gen_parport.c | 2 +- trunk/drivers/staging/msm/msm_fb.c | 8 +- trunk/drivers/staging/olpc_dcon/olpc_dcon.c | 10 +- trunk/drivers/staging/sm7xx/smtcfb.c | 8 +- trunk/drivers/tty/serial/sb1250-duart.c | 2 +- trunk/drivers/tty/sysrq.c | 2 +- trunk/drivers/tty/tty_io.c | 4 +- trunk/drivers/tty/vt/selection.c | 4 +- trunk/drivers/tty/vt/vc_screen.c | 16 +- trunk/drivers/tty/vt/vt.c | 124 +-- trunk/drivers/tty/vt/vt_ioctl.c | 60 +- trunk/drivers/video/arkfb.c | 12 +- trunk/drivers/video/aty/aty128fb.c | 12 +- trunk/drivers/video/aty/atyfb_base.c | 10 +- trunk/drivers/video/aty/radeon_pm.c | 10 +- trunk/drivers/video/chipsfb.c | 8 +- trunk/drivers/video/console/fbcon.c | 42 +- trunk/drivers/video/da8xx-fb.c | 8 +- trunk/drivers/video/fbmem.c | 12 +- trunk/drivers/video/fbsysfs.c | 20 +- trunk/drivers/video/geode/gxfb_core.c | 8 +- trunk/drivers/video/geode/lxfb_core.c | 8 +- trunk/drivers/video/i810/i810_main.c | 8 +- trunk/drivers/video/jz4740_fb.c | 8 +- trunk/drivers/video/mx3fb.c | 8 +- trunk/drivers/video/nvidia/nvidia.c | 8 +- trunk/drivers/video/ps3fb.c | 16 +- trunk/drivers/video/s3fb.c | 16 +- trunk/drivers/video/savage/savagefb_driver.c | 8 +- trunk/drivers/video/sh_mobile_hdmi.c | 8 +- trunk/drivers/video/sh_mobile_lcdcfb.c | 4 +- trunk/drivers/video/sm501fb.c | 8 +- trunk/drivers/video/tmiofb.c | 10 +- trunk/drivers/video/via/viafbdev.c | 8 +- trunk/drivers/video/vt8623fb.c | 12 +- trunk/drivers/video/xen-fbfront.c | 4 +- trunk/fs/proc/consoles.c | 4 +- trunk/fs/squashfs/block.c | 8 - trunk/fs/squashfs/xz_wrapper.c | 6 + trunk/fs/squashfs/zlib_wrapper.c | 6 + trunk/include/linux/console.h | 6 +- trunk/include/linux/input/bu21013.h | 4 + trunk/include/linux/sysrq.h | 3 - trunk/include/net/bluetooth/hci_core.h | 1 - trunk/include/net/sch_generic.h | 8 +- trunk/kernel/printk.c | 100 +- trunk/kernel/sysctl.c | 3 +- trunk/lib/radix-tree.c | 7 +- trunk/lib/textsearch.c | 10 +- trunk/mm/Kconfig | 2 +- trunk/mm/memcontrol.c | 31 +- trunk/mm/migrate.c | 2 +- trunk/mm/page_alloc.c | 18 +- trunk/mm/pgtable-generic.c | 1 - trunk/mm/vmscan.c | 3 +- trunk/net/bluetooth/hci_conn.c | 16 +- trunk/net/bluetooth/hci_core.c | 4 - trunk/net/bluetooth/hci_event.c | 9 +- trunk/net/bluetooth/l2cap.c | 84 +- trunk/net/bluetooth/rfcomm/core.c | 3 +- trunk/net/core/dev.c | 3 +- trunk/net/core/ethtool.c | 2 +- trunk/net/core/skbuff.c | 8 +- trunk/net/dcb/dcbnl.c | 13 +- trunk/net/ipv4/arp.c | 11 +- trunk/net/ipv4/inetpeer.c | 2 +- trunk/net/ipv4/tcp_input.c | 2 +- trunk/net/ipv4/tcp_ipv4.c | 1 + trunk/net/ipv6/addrconf.c | 81 +- trunk/net/ipv6/route.c | 9 +- trunk/net/ipv6/xfrm6_policy.c | 6 - trunk/net/mac80211/tx.c | 3 - trunk/net/sched/sch_cbq.c | 3 +- trunk/net/sched/sch_drr.c | 2 +- trunk/net/sched/sch_dsmark.c | 2 +- trunk/net/sched/sch_fifo.c | 5 +- trunk/net/sched/sch_hfsc.c | 2 +- trunk/net/sched/sch_htb.c | 12 +- trunk/net/sched/sch_multiq.c | 2 +- trunk/net/sched/sch_netem.c | 3 +- trunk/net/sched/sch_prio.c | 2 +- trunk/net/sched/sch_red.c | 11 +- trunk/net/sched/sch_sfq.c | 5 +- trunk/net/sched/sch_tbf.c | 2 +- trunk/net/sched/sch_teql.c | 3 +- 152 files changed, 787 insertions(+), 3989 deletions(-) delete mode 100644 trunk/Documentation/ABI/testing/sysfs-platform-at91 delete mode 100644 trunk/arch/arm/mach-tegra/include/mach/kbc.h delete mode 100644 trunk/drivers/input/keyboard/tegra-kbc.c delete mode 100644 trunk/drivers/net/can/softing/Kconfig delete mode 100644 trunk/drivers/net/can/softing/Makefile delete mode 100644 trunk/drivers/net/can/softing/softing.h delete mode 100644 trunk/drivers/net/can/softing/softing_cs.c delete mode 100644 trunk/drivers/net/can/softing/softing_fw.c delete mode 100644 trunk/drivers/net/can/softing/softing_main.c delete mode 100644 trunk/drivers/net/can/softing/softing_platform.h diff --git a/[refs] b/[refs] index 956afad21628..9085d46f1640 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7205649778ca4a110d6098f8defd7312f0bb7289 +refs/heads/master: 021cb59ae3869fb18ebc9fceb959f379c5ca835c diff --git a/trunk/Documentation/ABI/testing/sysfs-platform-at91 b/trunk/Documentation/ABI/testing/sysfs-platform-at91 deleted file mode 100644 index 4cc6a865ae66..000000000000 --- a/trunk/Documentation/ABI/testing/sysfs-platform-at91 +++ /dev/null @@ -1,25 +0,0 @@ -What: /sys/devices/platform/at91_can/net//mb0_id -Date: January 2011 -KernelVersion: 2.6.38 -Contact: Marc Kleine-Budde -Description: - Value representing the can_id of mailbox 0. - - Default: 0x7ff (standard frame) - - Due to a chip bug (errata 50.2.6.3 & 50.3.5.3 in - "AT91SAM9263 Preliminary 6249H-ATARM-27-Jul-09") the - contents of mailbox 0 may be send under certain - conditions (even if disabled or in rx mode). - - The workaround in the errata suggests not to use the - mailbox and load it with an unused identifier. - - In order to use an extended can_id add the - CAN_EFF_FLAG (0x80000000U) to the can_id. Example: - - - standard id 0x7ff: - echo 0x7ff > /sys/class/net/can0/mb0_id - - - extended id 0x1fffffff: - echo 0x9fffffff > /sys/class/net/can0/mb0_id diff --git a/trunk/Documentation/networking/bonding.txt b/trunk/Documentation/networking/bonding.txt index 25d2f4141d27..5dc638791d97 100644 --- a/trunk/Documentation/networking/bonding.txt +++ b/trunk/Documentation/networking/bonding.txt @@ -49,8 +49,7 @@ Table of Contents 3.3 Configuring Bonding Manually with Ifenslave 3.3.1 Configuring Multiple Bonds Manually 3.4 Configuring Bonding Manually via Sysfs -3.5 Configuration with Interfaces Support -3.6 Overriding Configuration for Special Cases +3.5 Overriding Configuration for Special Cases 4. Querying Bonding Configuration 4.1 Bonding Configuration @@ -162,8 +161,8 @@ onwards) do not have /usr/include/linux symbolically linked to the default kernel source include directory. SECOND IMPORTANT NOTE: - If you plan to configure bonding using sysfs or using the -/etc/network/interfaces file, you do not need to use ifenslave. + If you plan to configure bonding using sysfs, you do not need +to use ifenslave. 2. Bonding Driver Options ========================= @@ -780,26 +779,22 @@ resend_igmp You can configure bonding using either your distro's network initialization scripts, or manually using either ifenslave or the -sysfs interface. Distros generally use one of three packages for the -network initialization scripts: initscripts, sysconfig or interfaces. -Recent versions of these packages have support for bonding, while older +sysfs interface. Distros generally use one of two packages for the +network initialization scripts: initscripts or sysconfig. Recent +versions of these packages have support for bonding, while older versions do not. We will first describe the options for configuring bonding for -distros using versions of initscripts, sysconfig and interfaces with full -or partial support for bonding, then provide information on enabling +distros using versions of initscripts and sysconfig with full or +partial support for bonding, then provide information on enabling bonding without support from the network initialization scripts (i.e., older versions of initscripts or sysconfig). - If you're unsure whether your distro uses sysconfig, -initscripts or interfaces, or don't know if it's new enough, have no fear. + If you're unsure whether your distro uses sysconfig or +initscripts, or don't know if it's new enough, have no fear. Determining this is fairly straightforward. - First, look for a file called interfaces in /etc/network directory. -If this file is present in your system, then your system use interfaces. See -Configuration with Interfaces Support. - - Else, issue the command: + First, issue the command: $ rpm -qf /sbin/ifup @@ -1332,62 +1327,8 @@ echo 2000 > /sys/class/net/bond1/bonding/arp_interval echo +eth2 > /sys/class/net/bond1/bonding/slaves echo +eth3 > /sys/class/net/bond1/bonding/slaves -3.5 Configuration with Interfaces Support ------------------------------------------ - - This section applies to distros which use /etc/network/interfaces file -to describe network interface configuration, most notably Debian and it's -derivatives. - - The ifup and ifdown commands on Debian don't support bonding out of -the box. The ifenslave-2.6 package should be installed to provide bonding -support. Once installed, this package will provide bond-* options to be used -into /etc/network/interfaces. - - Note that ifenslave-2.6 package will load the bonding module and use -the ifenslave command when appropriate. - -Example Configurations ----------------------- - -In /etc/network/interfaces, the following stanza will configure bond0, in -active-backup mode, with eth0 and eth1 as slaves. - -auto bond0 -iface bond0 inet dhcp - bond-slaves eth0 eth1 - bond-mode active-backup - bond-miimon 100 - bond-primary eth0 eth1 - -If the above configuration doesn't work, you might have a system using -upstart for system startup. This is most notably true for recent -Ubuntu versions. The following stanza in /etc/network/interfaces will -produce the same result on those systems. - -auto bond0 -iface bond0 inet dhcp - bond-slaves none - bond-mode active-backup - bond-miimon 100 - -auto eth0 -iface eth0 inet manual - bond-master bond0 - bond-primary eth0 eth1 - -auto eth1 -iface eth1 inet manual - bond-master bond0 - bond-primary eth0 eth1 - -For a full list of bond-* supported options in /etc/network/interfaces and some -more advanced examples tailored to you particular distros, see the files in -/usr/share/doc/ifenslave-2.6. - -3.6 Overriding Configuration for Special Cases +3.5 Overriding Configuration for Special Cases ---------------------------------------------- - When using the bonding driver, the physical port which transmits a frame is typically selected by the bonding driver, and is not relevant to the user or system administrator. The output port is simply selected using the policies of diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index 9d12977b6baf..cf0f3a5c09cc 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -3327,6 +3327,7 @@ F: drivers/net/wimax/i2400m/ F: include/linux/wimax/i2400m.h INTEL WIRELESS WIFI LINK (iwlwifi) +M: Reinette Chatre M: Wey-Yi Guy M: Intel Linux Wireless L: linux-wireless@vger.kernel.org diff --git a/trunk/arch/arm/mach-omap2/pm24xx.c b/trunk/arch/arm/mach-omap2/pm24xx.c index 97feb3ab6a69..9e5dc8ed51e9 100644 --- a/trunk/arch/arm/mach-omap2/pm24xx.c +++ b/trunk/arch/arm/mach-omap2/pm24xx.c @@ -134,7 +134,7 @@ static void omap2_enter_full_retention(void) /* Block console output in case it is on one of the OMAP UARTs */ if (!is_suspending()) - if (!console_trylock()) + if (try_acquire_console_sem()) goto no_sleep; omap_uart_prepare_idle(0); @@ -151,7 +151,7 @@ static void omap2_enter_full_retention(void) omap_uart_resume_idle(0); if (!is_suspending()) - console_unlock(); + release_console_sem(); no_sleep: if (omap2_pm_debug) { diff --git a/trunk/arch/arm/mach-omap2/pm34xx.c b/trunk/arch/arm/mach-omap2/pm34xx.c index a4aa1920a75c..8cbbeade4b8a 100644 --- a/trunk/arch/arm/mach-omap2/pm34xx.c +++ b/trunk/arch/arm/mach-omap2/pm34xx.c @@ -398,7 +398,7 @@ void omap_sram_idle(void) if (!is_suspending()) if (per_next_state < PWRDM_POWER_ON || core_next_state < PWRDM_POWER_ON) - if (!console_trylock()) + if (try_acquire_console_sem()) goto console_still_active; /* PER */ @@ -481,7 +481,7 @@ void omap_sram_idle(void) } if (!is_suspending()) - console_unlock(); + release_console_sem(); console_still_active: /* Disable IO-PAD and IO-CHAIN wakeup */ diff --git a/trunk/arch/arm/mach-omap2/serial.c b/trunk/arch/arm/mach-omap2/serial.c index 32e91a9c8b6b..302da7403a10 100644 --- a/trunk/arch/arm/mach-omap2/serial.c +++ b/trunk/arch/arm/mach-omap2/serial.c @@ -812,7 +812,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata) oh->dev_attr = uart; - console_lock(); /* in case the earlycon is on the UART */ + acquire_console_sem(); /* in case the earlycon is on the UART */ /* * Because of early UART probing, UART did not get idled @@ -838,7 +838,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata) omap_uart_block_sleep(uart); uart->timeout = DEFAULT_TIMEOUT; - console_unlock(); + release_console_sem(); if ((cpu_is_omap34xx() && uart->padconf) || (uart->wk_en && uart->wk_mask)) { diff --git a/trunk/arch/arm/mach-tegra/include/mach/kbc.h b/trunk/arch/arm/mach-tegra/include/mach/kbc.h deleted file mode 100644 index 66ad2760c621..000000000000 --- a/trunk/arch/arm/mach-tegra/include/mach/kbc.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Platform definitions for tegra-kbc keyboard input driver - * - * Copyright (c) 2010-2011, NVIDIA Corporation. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ASMARM_ARCH_TEGRA_KBC_H -#define ASMARM_ARCH_TEGRA_KBC_H - -#include -#include - -#ifdef CONFIG_ARCH_TEGRA_2x_SOC -#define KBC_MAX_GPIO 24 -#define KBC_MAX_KPENT 8 -#else -#define KBC_MAX_GPIO 20 -#define KBC_MAX_KPENT 7 -#endif - -#define KBC_MAX_ROW 16 -#define KBC_MAX_COL 8 -#define KBC_MAX_KEY (KBC_MAX_ROW * KBC_MAX_COL) - -struct tegra_kbc_pin_cfg { - bool is_row; - unsigned char num; -}; - -struct tegra_kbc_wake_key { - u8 row:4; - u8 col:4; -}; - -struct tegra_kbc_platform_data { - unsigned int debounce_cnt; - unsigned int repeat_cnt; - - unsigned int wake_cnt; /* 0:wake on any key >1:wake on wake_cfg */ - const struct tegra_kbc_wake_key *wake_cfg; - - struct tegra_kbc_pin_cfg pin_cfg[KBC_MAX_GPIO]; - const struct matrix_keymap_data *keymap_data; - - bool wakeup; -}; -#endif diff --git a/trunk/arch/avr32/include/asm/pgalloc.h b/trunk/arch/avr32/include/asm/pgalloc.h index bc7e8ae479ee..92ecd8446ef8 100644 --- a/trunk/arch/avr32/include/asm/pgalloc.h +++ b/trunk/arch/avr32/include/asm/pgalloc.h @@ -8,7 +8,6 @@ #ifndef __ASM_AVR32_PGALLOC_H #define __ASM_AVR32_PGALLOC_H -#include #include #include #include diff --git a/trunk/arch/parisc/kernel/pdc_cons.c b/trunk/arch/parisc/kernel/pdc_cons.c index fc770be465ff..11bdd68e5762 100644 --- a/trunk/arch/parisc/kernel/pdc_cons.c +++ b/trunk/arch/parisc/kernel/pdc_cons.c @@ -169,11 +169,11 @@ static int __init pdc_console_tty_driver_init(void) struct console *tmp; - console_lock(); + acquire_console_sem(); for_each_console(tmp) if (tmp == &pdc_cons) break; - console_unlock(); + release_console_sem(); if (!tmp) { printk(KERN_INFO "PDC console driver not registered anymore, not creating %s\n", pdc_cons.name); diff --git a/trunk/arch/x86/include/asm/paravirt.h b/trunk/arch/x86/include/asm/paravirt.h index ebbc4d8ab170..2071a8b2b32f 100644 --- a/trunk/arch/x86/include/asm/paravirt.h +++ b/trunk/arch/x86/include/asm/paravirt.h @@ -558,12 +558,13 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp, pmd_t pmd) { +#if PAGETABLE_LEVELS >= 3 if (sizeof(pmdval_t) > sizeof(long)) /* 5 arg words */ pv_mmu_ops.set_pmd_at(mm, addr, pmdp, pmd); else - PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp, - native_pmd_val(pmd)); + PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp, pmd.pmd); +#endif } #endif diff --git a/trunk/drivers/atm/idt77105.c b/trunk/drivers/atm/idt77105.c index 487a54739854..bca9cb89a118 100644 --- a/trunk/drivers/atm/idt77105.c +++ b/trunk/drivers/atm/idt77105.c @@ -151,7 +151,7 @@ static int fetch_stats(struct atm_dev *dev,struct idt77105_stats __user *arg,int spin_unlock_irqrestore(&idt77105_priv_lock, flags); if (arg == NULL) return 0; - return copy_to_user(arg, &stats, + return copy_to_user(arg, &PRIV(dev)->stats, sizeof(struct idt77105_stats)) ? -EFAULT : 0; } diff --git a/trunk/drivers/base/power/runtime.c b/trunk/drivers/base/power/runtime.c index 42615b419dfb..656493a5e073 100644 --- a/trunk/drivers/base/power/runtime.c +++ b/trunk/drivers/base/power/runtime.c @@ -407,15 +407,12 @@ static int rpm_suspend(struct device *dev, int rpmflags) goto out; } - /* Maybe the parent is now able to suspend. */ if (parent && !parent->power.ignore_children && !dev->power.irq_safe) { - spin_unlock(&dev->power.lock); + spin_unlock_irq(&dev->power.lock); - spin_lock(&parent->power.lock); - rpm_idle(parent, RPM_ASYNC); - spin_unlock(&parent->power.lock); + pm_request_idle(parent); - spin_lock(&dev->power.lock); + spin_lock_irq(&dev->power.lock); } out: diff --git a/trunk/drivers/bluetooth/ath3k.c b/trunk/drivers/bluetooth/ath3k.c index a126e614601f..949ed09c6361 100644 --- a/trunk/drivers/bluetooth/ath3k.c +++ b/trunk/drivers/bluetooth/ath3k.c @@ -47,40 +47,46 @@ MODULE_DEVICE_TABLE(usb, ath3k_table); #define USB_REQ_DFU_DNLOAD 1 #define BULK_SIZE 4096 -static int ath3k_load_firmware(struct usb_device *udev, - const struct firmware *firmware) +struct ath3k_data { + struct usb_device *udev; + u8 *fw_data; + u32 fw_size; + u32 fw_sent; +}; + +static int ath3k_load_firmware(struct ath3k_data *data, + unsigned char *firmware, + int count) { u8 *send_buf; int err, pipe, len, size, sent = 0; - int count = firmware->size; - BT_DBG("udev %p", udev); + BT_DBG("ath3k %p udev %p", data, data->udev); - pipe = usb_sndctrlpipe(udev, 0); + pipe = usb_sndctrlpipe(data->udev, 0); - send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC); - if (!send_buf) { - BT_ERR("Can't allocate memory chunk for firmware"); - return -ENOMEM; - } - - memcpy(send_buf, firmware->data, 20); - if ((err = usb_control_msg(udev, pipe, + if ((usb_control_msg(data->udev, pipe, USB_REQ_DFU_DNLOAD, USB_TYPE_VENDOR, 0, 0, - send_buf, 20, USB_CTRL_SET_TIMEOUT)) < 0) { + firmware, 20, USB_CTRL_SET_TIMEOUT)) < 0) { BT_ERR("Can't change to loading configuration err"); - goto error; + return -EBUSY; } sent += 20; count -= 20; + send_buf = kmalloc(BULK_SIZE, GFP_ATOMIC); + if (!send_buf) { + BT_ERR("Can't allocate memory chunk for firmware"); + return -ENOMEM; + } + while (count) { size = min_t(uint, count, BULK_SIZE); - pipe = usb_sndbulkpipe(udev, 0x02); - memcpy(send_buf, firmware->data + sent, size); + pipe = usb_sndbulkpipe(data->udev, 0x02); + memcpy(send_buf, firmware + sent, size); - err = usb_bulk_msg(udev, pipe, send_buf, size, + err = usb_bulk_msg(data->udev, pipe, send_buf, size, &len, 3000); if (err || (len != size)) { @@ -106,28 +112,57 @@ static int ath3k_probe(struct usb_interface *intf, { const struct firmware *firmware; struct usb_device *udev = interface_to_usbdev(intf); + struct ath3k_data *data; + int size; BT_DBG("intf %p id %p", intf, id); if (intf->cur_altsetting->desc.bInterfaceNumber != 0) return -ENODEV; + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->udev = udev; + if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) { + kfree(data); return -EIO; } - if (ath3k_load_firmware(udev, firmware)) { + size = max_t(uint, firmware->size, 4096); + data->fw_data = kmalloc(size, GFP_KERNEL); + if (!data->fw_data) { release_firmware(firmware); - return -EIO; + kfree(data); + return -ENOMEM; } + + memcpy(data->fw_data, firmware->data, firmware->size); + data->fw_size = firmware->size; + data->fw_sent = 0; release_firmware(firmware); + usb_set_intfdata(intf, data); + if (ath3k_load_firmware(data, data->fw_data, data->fw_size)) { + usb_set_intfdata(intf, NULL); + kfree(data->fw_data); + kfree(data); + return -EIO; + } + return 0; } static void ath3k_disconnect(struct usb_interface *intf) { + struct ath3k_data *data = usb_get_intfdata(intf); + BT_DBG("ath3k_disconnect intf %p", intf); + + kfree(data->fw_data); + kfree(data); } static struct usb_driver ath3k_driver = { diff --git a/trunk/drivers/char/bfin_jtag_comm.c b/trunk/drivers/char/bfin_jtag_comm.c index 16402445f2b2..e397df3ad98e 100644 --- a/trunk/drivers/char/bfin_jtag_comm.c +++ b/trunk/drivers/char/bfin_jtag_comm.c @@ -183,16 +183,16 @@ bfin_jc_circ_write(const unsigned char *buf, int count) } #ifndef CONFIG_BFIN_JTAG_COMM_CONSOLE -# define console_lock() -# define console_unlock() +# define acquire_console_sem() +# define release_console_sem() #endif static int bfin_jc_write(struct tty_struct *tty, const unsigned char *buf, int count) { int i; - console_lock(); + acquire_console_sem(); i = bfin_jc_circ_write(buf, count); - console_unlock(); + release_console_sem(); wake_up_process(bfin_jc_kthread); return i; } diff --git a/trunk/drivers/clocksource/tcb_clksrc.c b/trunk/drivers/clocksource/tcb_clksrc.c index 79c47e88d5d1..01b886e68822 100644 --- a/trunk/drivers/clocksource/tcb_clksrc.c +++ b/trunk/drivers/clocksource/tcb_clksrc.c @@ -196,9 +196,9 @@ static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) clkevt.clkevt.min_delta_ns = clockevent_delta2ns(1, &clkevt.clkevt) + 1; clkevt.clkevt.cpumask = cpumask_of(0); - clockevents_register_device(&clkevt.clkevt); - setup_irq(irq, &tc_irqaction); + + clockevents_register_device(&clkevt.clkevt); } #else /* !CONFIG_GENERIC_CLOCKEVENTS */ diff --git a/trunk/drivers/gpio/langwell_gpio.c b/trunk/drivers/gpio/langwell_gpio.c index 54d70a47afc1..d81cc748e77f 100644 --- a/trunk/drivers/gpio/langwell_gpio.c +++ b/trunk/drivers/gpio/langwell_gpio.c @@ -187,7 +187,7 @@ MODULE_DEVICE_TABLE(pci, lnw_gpio_ids); static void lnw_irq_handler(unsigned irq, struct irq_desc *desc) { - struct lnw_gpio *lnw = get_irq_data(irq); + struct lnw_gpio *lnw = (struct lnw_gpio *)get_irq_data(irq); u32 base, gpio; void __iomem *gedr; u32 gedr_v; @@ -206,12 +206,7 @@ static void lnw_irq_handler(unsigned irq, struct irq_desc *desc) /* clear the edge detect status bit */ writel(gedr_v, gedr); } - - if (desc->chip->irq_eoi) - desc->chip->irq_eoi(irq_get_irq_data(irq)); - else - dev_warn(lnw->chip.dev, "missing EOI handler for irq %d\n", irq); - + desc->chip->eoi(irq); } static int __devinit lnw_gpio_probe(struct pci_dev *pdev, diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c b/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c index f658a04eecf9..13bb672a16f4 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c @@ -234,9 +234,9 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state) pci_set_power_state(pdev, PCI_D3hot); } - console_lock(); + acquire_console_sem(); nouveau_fbcon_set_suspend(dev, 1); - console_unlock(); + release_console_sem(); nouveau_fbcon_restore_accel(dev); return 0; @@ -359,9 +359,9 @@ nouveau_pci_resume(struct pci_dev *pdev) nv_crtc->lut.depth = 0; } - console_lock(); + acquire_console_sem(); nouveau_fbcon_set_suspend(dev, 0); - console_unlock(); + release_console_sem(); nouveau_fbcon_zfill_all(dev); diff --git a/trunk/drivers/gpu/drm/radeon/radeon_device.c b/trunk/drivers/gpu/drm/radeon/radeon_device.c index 0d478932b1a9..26091d602b84 100644 --- a/trunk/drivers/gpu/drm/radeon/radeon_device.c +++ b/trunk/drivers/gpu/drm/radeon/radeon_device.c @@ -891,9 +891,9 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) pci_disable_device(dev->pdev); pci_set_power_state(dev->pdev, PCI_D3hot); } - console_lock(); + acquire_console_sem(); radeon_fbdev_set_suspend(rdev, 1); - console_unlock(); + release_console_sem(); return 0; } @@ -905,11 +905,11 @@ int radeon_resume_kms(struct drm_device *dev) if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) return 0; - console_lock(); + acquire_console_sem(); pci_set_power_state(dev->pdev, PCI_D0); pci_restore_state(dev->pdev); if (pci_enable_device(dev->pdev)) { - console_unlock(); + release_console_sem(); return -1; } pci_set_master(dev->pdev); @@ -920,7 +920,7 @@ int radeon_resume_kms(struct drm_device *dev) radeon_restore_bios_scratch_regs(rdev); radeon_fbdev_set_suspend(rdev, 0); - console_unlock(); + release_console_sem(); /* reset hpd state */ radeon_hpd_init(rdev); diff --git a/trunk/drivers/hwmon/applesmc.c b/trunk/drivers/hwmon/applesmc.c index 4c0743660e9c..ce0372f0615e 100644 --- a/trunk/drivers/hwmon/applesmc.c +++ b/trunk/drivers/hwmon/applesmc.c @@ -1072,7 +1072,6 @@ static int applesmc_create_nodes(struct applesmc_node_group *groups, int num) node->sda.dev_attr.show = grp->show; node->sda.dev_attr.store = grp->store; attr = &node->sda.dev_attr.attr; - sysfs_attr_init(attr); attr->name = node->name; attr->mode = S_IRUGO | (grp->store ? S_IWUSR : 0); ret = sysfs_create_file(&pdev->dev.kobj, attr); diff --git a/trunk/drivers/hwmon/asus_atk0110.c b/trunk/drivers/hwmon/asus_atk0110.c index b5e892017e0c..2d68cf3c223b 100644 --- a/trunk/drivers/hwmon/asus_atk0110.c +++ b/trunk/drivers/hwmon/asus_atk0110.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -23,21 +22,6 @@ #define ATK_HID "ATK0110" -static bool new_if; -module_param(new_if, bool, 0); -MODULE_PARM_DESC(new_if, "Override detection heuristic and force the use of the new ATK0110 interface"); - -static const struct dmi_system_id __initconst atk_force_new_if[] = { - { - /* Old interface has broken MCH temp monitoring */ - .ident = "Asus Sabertooth X58", - .matches = { - DMI_MATCH(DMI_BOARD_NAME, "SABERTOOTH X58") - } - }, - { } -}; - /* Minimum time between readings, enforced in order to avoid * hogging the CPU. */ @@ -1318,9 +1302,7 @@ static int atk_probe_if(struct atk_data *data) * analysis of multiple DSDTs indicates that when both interfaces * are present the new one (GGRP/GITM) is not functional. */ - if (new_if) - dev_info(dev, "Overriding interface detection\n"); - if (data->rtmp_handle && data->rvlt_handle && data->rfan_handle && !new_if) + if (data->rtmp_handle && data->rvlt_handle && data->rfan_handle) data->old_interface = true; else if (data->enumerate_handle && data->read_handle && data->write_handle) @@ -1438,9 +1420,6 @@ static int __init atk0110_init(void) return -EBUSY; } - if (dmi_check_system(atk_force_new_if)) - new_if = true; - ret = acpi_bus_register_driver(&atk_driver); if (ret) pr_info("acpi_bus_register_driver failed: %d\n", ret); diff --git a/trunk/drivers/hwmon/lis3lv02d.c b/trunk/drivers/hwmon/lis3lv02d.c index d805e8e57967..1b674b7d4584 100644 --- a/trunk/drivers/hwmon/lis3lv02d.c +++ b/trunk/drivers/hwmon/lis3lv02d.c @@ -957,7 +957,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) /* bail if we did not get an IRQ from the bus layer */ if (!dev->irq) { - pr_debug("No IRQ. Disabling /dev/freefall\n"); + pr_err("No IRQ. Disabling /dev/freefall\n"); goto out; } diff --git a/trunk/drivers/input/keyboard/Kconfig b/trunk/drivers/input/keyboard/Kconfig index c7a92028f450..417507348bab 100644 --- a/trunk/drivers/input/keyboard/Kconfig +++ b/trunk/drivers/input/keyboard/Kconfig @@ -343,16 +343,6 @@ config KEYBOARD_NOMADIK To compile this driver as a module, choose M here: the module will be called nmk-ske-keypad. -config KEYBOARD_TEGRA - tristate "NVIDIA Tegra internal matrix keyboard controller support" - depends on ARCH_TEGRA - help - Say Y here if you want to use a matrix keyboard connected directly - to the internal keyboard controller on Tegra SoCs. - - To compile this driver as a module, choose M here: the - module will be called tegra-kbc. - config KEYBOARD_OPENCORES tristate "OpenCores Keyboard Controller" help diff --git a/trunk/drivers/input/keyboard/Makefile b/trunk/drivers/input/keyboard/Makefile index 468c627a2844..4e5571b72cda 100644 --- a/trunk/drivers/input/keyboard/Makefile +++ b/trunk/drivers/input/keyboard/Makefile @@ -42,7 +42,6 @@ obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o -obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o diff --git a/trunk/drivers/input/keyboard/gpio_keys.c b/trunk/drivers/input/keyboard/gpio_keys.c index eb3006361ee4..6069abe31e42 100644 --- a/trunk/drivers/input/keyboard/gpio_keys.c +++ b/trunk/drivers/input/keyboard/gpio_keys.c @@ -322,7 +322,7 @@ static void gpio_keys_report_event(struct gpio_button_data *bdata) struct gpio_keys_button *button = bdata->button; struct input_dev *input = bdata->input; unsigned int type = button->type ?: EV_KEY; - int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low; + int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low; input_event(input, type, button->code, !!state); input_sync(input); @@ -410,8 +410,8 @@ static int __devinit gpio_keys_setup_key(struct platform_device *pdev, if (!button->can_disable) irqflags |= IRQF_SHARED; - error = request_any_context_irq(irq, gpio_keys_isr, irqflags, desc, bdata); - if (error < 0) { + error = request_irq(irq, gpio_keys_isr, irqflags, desc, bdata); + if (error) { dev_err(dev, "Unable to claim irq %d; error %d\n", irq, error); goto fail3; diff --git a/trunk/drivers/input/keyboard/tegra-kbc.c b/trunk/drivers/input/keyboard/tegra-kbc.c deleted file mode 100644 index 939476659ad6..000000000000 --- a/trunk/drivers/input/keyboard/tegra-kbc.c +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Keyboard class input driver for the NVIDIA Tegra SoC internal matrix - * keyboard controller - * - * Copyright (c) 2009-2011, NVIDIA Corporation. - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define KBC_MAX_DEBOUNCE_CNT 0x3ffu - -/* KBC row scan time and delay for beginning the row scan. */ -#define KBC_ROW_SCAN_TIME 16 -#define KBC_ROW_SCAN_DLY 5 - -/* KBC uses a 32KHz clock so a cycle = 1/32Khz */ -#define KBC_CYCLE_USEC 32 - -/* KBC Registers */ - -/* KBC Control Register */ -#define KBC_CONTROL_0 0x0 -#define KBC_FIFO_TH_CNT_SHIFT(cnt) (cnt << 14) -#define KBC_DEBOUNCE_CNT_SHIFT(cnt) (cnt << 4) -#define KBC_CONTROL_FIFO_CNT_INT_EN (1 << 3) -#define KBC_CONTROL_KBC_EN (1 << 0) - -/* KBC Interrupt Register */ -#define KBC_INT_0 0x4 -#define KBC_INT_FIFO_CNT_INT_STATUS (1 << 2) - -#define KBC_ROW_CFG0_0 0x8 -#define KBC_COL_CFG0_0 0x18 -#define KBC_INIT_DLY_0 0x28 -#define KBC_RPT_DLY_0 0x2c -#define KBC_KP_ENT0_0 0x30 -#define KBC_KP_ENT1_0 0x34 -#define KBC_ROW0_MASK_0 0x38 - -#define KBC_ROW_SHIFT 3 - -struct tegra_kbc { - void __iomem *mmio; - struct input_dev *idev; - unsigned int irq; - unsigned int wake_enable_rows; - unsigned int wake_enable_cols; - spinlock_t lock; - unsigned int repoll_dly; - unsigned long cp_dly_jiffies; - const struct tegra_kbc_platform_data *pdata; - unsigned short keycode[KBC_MAX_KEY]; - unsigned short current_keys[KBC_MAX_KPENT]; - unsigned int num_pressed_keys; - struct timer_list timer; - struct clk *clk; -}; - -static const u32 tegra_kbc_default_keymap[] = { - KEY(0, 2, KEY_W), - KEY(0, 3, KEY_S), - KEY(0, 4, KEY_A), - KEY(0, 5, KEY_Z), - KEY(0, 7, KEY_FN), - - KEY(1, 7, KEY_MENU), - - KEY(2, 6, KEY_RIGHTALT), - KEY(2, 7, KEY_LEFTALT), - - KEY(3, 0, KEY_5), - KEY(3, 1, KEY_4), - KEY(3, 2, KEY_R), - KEY(3, 3, KEY_E), - KEY(3, 4, KEY_F), - KEY(3, 5, KEY_D), - KEY(3, 6, KEY_X), - - KEY(4, 0, KEY_7), - KEY(4, 1, KEY_6), - KEY(4, 2, KEY_T), - KEY(4, 3, KEY_H), - KEY(4, 4, KEY_G), - KEY(4, 5, KEY_V), - KEY(4, 6, KEY_C), - KEY(4, 7, KEY_SPACE), - - KEY(5, 0, KEY_9), - KEY(5, 1, KEY_8), - KEY(5, 2, KEY_U), - KEY(5, 3, KEY_Y), - KEY(5, 4, KEY_J), - KEY(5, 5, KEY_N), - KEY(5, 6, KEY_B), - KEY(5, 7, KEY_BACKSLASH), - - KEY(6, 0, KEY_MINUS), - KEY(6, 1, KEY_0), - KEY(6, 2, KEY_O), - KEY(6, 3, KEY_I), - KEY(6, 4, KEY_L), - KEY(6, 5, KEY_K), - KEY(6, 6, KEY_COMMA), - KEY(6, 7, KEY_M), - - KEY(7, 1, KEY_EQUAL), - KEY(7, 2, KEY_RIGHTBRACE), - KEY(7, 3, KEY_ENTER), - KEY(7, 7, KEY_MENU), - - KEY(8, 4, KEY_RIGHTSHIFT), - KEY(8, 5, KEY_LEFTSHIFT), - - KEY(9, 5, KEY_RIGHTCTRL), - KEY(9, 7, KEY_LEFTCTRL), - - KEY(11, 0, KEY_LEFTBRACE), - KEY(11, 1, KEY_P), - KEY(11, 2, KEY_APOSTROPHE), - KEY(11, 3, KEY_SEMICOLON), - KEY(11, 4, KEY_SLASH), - KEY(11, 5, KEY_DOT), - - KEY(12, 0, KEY_F10), - KEY(12, 1, KEY_F9), - KEY(12, 2, KEY_BACKSPACE), - KEY(12, 3, KEY_3), - KEY(12, 4, KEY_2), - KEY(12, 5, KEY_UP), - KEY(12, 6, KEY_PRINT), - KEY(12, 7, KEY_PAUSE), - - KEY(13, 0, KEY_INSERT), - KEY(13, 1, KEY_DELETE), - KEY(13, 3, KEY_PAGEUP), - KEY(13, 4, KEY_PAGEDOWN), - KEY(13, 5, KEY_RIGHT), - KEY(13, 6, KEY_DOWN), - KEY(13, 7, KEY_LEFT), - - KEY(14, 0, KEY_F11), - KEY(14, 1, KEY_F12), - KEY(14, 2, KEY_F8), - KEY(14, 3, KEY_Q), - KEY(14, 4, KEY_F4), - KEY(14, 5, KEY_F3), - KEY(14, 6, KEY_1), - KEY(14, 7, KEY_F7), - - KEY(15, 0, KEY_ESC), - KEY(15, 1, KEY_GRAVE), - KEY(15, 2, KEY_F5), - KEY(15, 3, KEY_TAB), - KEY(15, 4, KEY_F1), - KEY(15, 5, KEY_F2), - KEY(15, 6, KEY_CAPSLOCK), - KEY(15, 7, KEY_F6), -}; - -static const struct matrix_keymap_data tegra_kbc_default_keymap_data = { - .keymap = tegra_kbc_default_keymap, - .keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap), -}; - -static void tegra_kbc_report_released_keys(struct input_dev *input, - unsigned short old_keycodes[], - unsigned int old_num_keys, - unsigned short new_keycodes[], - unsigned int new_num_keys) -{ - unsigned int i, j; - - for (i = 0; i < old_num_keys; i++) { - for (j = 0; j < new_num_keys; j++) - if (old_keycodes[i] == new_keycodes[j]) - break; - - if (j == new_num_keys) - input_report_key(input, old_keycodes[i], 0); - } -} - -static void tegra_kbc_report_pressed_keys(struct input_dev *input, - unsigned char scancodes[], - unsigned short keycodes[], - unsigned int num_pressed_keys) -{ - unsigned int i; - - for (i = 0; i < num_pressed_keys; i++) { - input_event(input, EV_MSC, MSC_SCAN, scancodes[i]); - input_report_key(input, keycodes[i], 1); - } -} - -static void tegra_kbc_report_keys(struct tegra_kbc *kbc) -{ - unsigned char scancodes[KBC_MAX_KPENT]; - unsigned short keycodes[KBC_MAX_KPENT]; - u32 val = 0; - unsigned int i; - unsigned int num_down = 0; - unsigned long flags; - - spin_lock_irqsave(&kbc->lock, flags); - for (i = 0; i < KBC_MAX_KPENT; i++) { - if ((i % 4) == 0) - val = readl(kbc->mmio + KBC_KP_ENT0_0 + i); - - if (val & 0x80) { - unsigned int col = val & 0x07; - unsigned int row = (val >> 3) & 0x0f; - unsigned char scancode = - MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT); - - scancodes[num_down] = scancode; - keycodes[num_down++] = kbc->keycode[scancode]; - } - - val >>= 8; - } - spin_unlock_irqrestore(&kbc->lock, flags); - - tegra_kbc_report_released_keys(kbc->idev, - kbc->current_keys, kbc->num_pressed_keys, - keycodes, num_down); - tegra_kbc_report_pressed_keys(kbc->idev, scancodes, keycodes, num_down); - input_sync(kbc->idev); - - memcpy(kbc->current_keys, keycodes, sizeof(kbc->current_keys)); - kbc->num_pressed_keys = num_down; -} - -static void tegra_kbc_keypress_timer(unsigned long data) -{ - struct tegra_kbc *kbc = (struct tegra_kbc *)data; - unsigned long flags; - u32 val; - unsigned int i; - - val = (readl(kbc->mmio + KBC_INT_0) >> 4) & 0xf; - if (val) { - unsigned long dly; - - tegra_kbc_report_keys(kbc); - - /* - * If more than one keys are pressed we need not wait - * for the repoll delay. - */ - dly = (val == 1) ? kbc->repoll_dly : 1; - mod_timer(&kbc->timer, jiffies + msecs_to_jiffies(dly)); - } else { - /* Release any pressed keys and exit the polling loop */ - for (i = 0; i < kbc->num_pressed_keys; i++) - input_report_key(kbc->idev, kbc->current_keys[i], 0); - input_sync(kbc->idev); - - kbc->num_pressed_keys = 0; - - /* All keys are released so enable the keypress interrupt */ - spin_lock_irqsave(&kbc->lock, flags); - val = readl(kbc->mmio + KBC_CONTROL_0); - val |= KBC_CONTROL_FIFO_CNT_INT_EN; - writel(val, kbc->mmio + KBC_CONTROL_0); - spin_unlock_irqrestore(&kbc->lock, flags); - } -} - -static irqreturn_t tegra_kbc_isr(int irq, void *args) -{ - struct tegra_kbc *kbc = args; - u32 val, ctl; - - /* - * Until all keys are released, defer further processing to - * the polling loop in tegra_kbc_keypress_timer - */ - ctl = readl(kbc->mmio + KBC_CONTROL_0); - ctl &= ~KBC_CONTROL_FIFO_CNT_INT_EN; - writel(ctl, kbc->mmio + KBC_CONTROL_0); - - /* - * Quickly bail out & reenable interrupts if the fifo threshold - * count interrupt wasn't the interrupt source - */ - val = readl(kbc->mmio + KBC_INT_0); - writel(val, kbc->mmio + KBC_INT_0); - - if (val & KBC_INT_FIFO_CNT_INT_STATUS) { - /* - * Schedule timer to run when hardware is in continuous - * polling mode. - */ - mod_timer(&kbc->timer, jiffies + kbc->cp_dly_jiffies); - } else { - ctl |= KBC_CONTROL_FIFO_CNT_INT_EN; - writel(ctl, kbc->mmio + KBC_CONTROL_0); - } - - return IRQ_HANDLED; -} - -static void tegra_kbc_setup_wakekeys(struct tegra_kbc *kbc, bool filter) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - int i; - unsigned int rst_val; - - BUG_ON(pdata->wake_cnt > KBC_MAX_KEY); - rst_val = (filter && pdata->wake_cnt) ? ~0 : 0; - - for (i = 0; i < KBC_MAX_ROW; i++) - writel(rst_val, kbc->mmio + KBC_ROW0_MASK_0 + i * 4); - - if (filter) { - for (i = 0; i < pdata->wake_cnt; i++) { - u32 val, addr; - addr = pdata->wake_cfg[i].row * 4 + KBC_ROW0_MASK_0; - val = readl(kbc->mmio + addr); - val &= ~(1 << pdata->wake_cfg[i].col); - writel(val, kbc->mmio + addr); - } - } -} - -static void tegra_kbc_config_pins(struct tegra_kbc *kbc) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - int i; - - for (i = 0; i < KBC_MAX_GPIO; i++) { - u32 r_shft = 5 * (i % 6); - u32 c_shft = 4 * (i % 8); - u32 r_mask = 0x1f << r_shift; - u32 c_mask = 0x0f << c_shift; - u32 r_offs = (i / 6) * 4 + KBC_ROW_CFG0_0; - u32 c_offs = (i / 8) * 4 + KBC_COL_CFG0_0; - u32 row_cfg = readl(kbc->mmio + r_offs); - u32 col_cfg = readl(kbc->mmio + c_offs); - - row_cfg &= ~r_mask; - col_cfg &= ~c_mask; - - if (pdata->pin_cfg[i].is_row) - row_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << r_shft; - else - col_cfg |= ((pdata->pin_cfg[i].num << 1) | 1) << c_shft; - - writel(row_cfg, kbc->mmio + r_offs); - writel(col_cfg, kbc->mmio + c_offs); - } -} - -static int tegra_kbc_start(struct tegra_kbc *kbc) -{ - const struct tegra_kbc_platform_data *pdata = kbc->pdata; - unsigned long flags; - unsigned int debounce_cnt; - u32 val = 0; - - clk_enable(kbc->clk); - - /* Reset the KBC controller to clear all previous status.*/ - tegra_periph_reset_assert(kbc->clk); - udelay(100); - tegra_periph_reset_deassert(kbc->clk); - udelay(100); - - tegra_kbc_config_pins(kbc); - tegra_kbc_setup_wakekeys(kbc, false); - - writel(pdata->repeat_cnt, kbc->mmio + KBC_RPT_DLY_0); - - /* Keyboard debounce count is maximum of 12 bits. */ - debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); - val = KBC_DEBOUNCE_CNT_SHIFT(debounce_cnt); - val |= KBC_FIFO_TH_CNT_SHIFT(1); /* set fifo interrupt threshold to 1 */ - val |= KBC_CONTROL_FIFO_CNT_INT_EN; /* interrupt on FIFO threshold */ - val |= KBC_CONTROL_KBC_EN; /* enable */ - writel(val, kbc->mmio + KBC_CONTROL_0); - - /* - * Compute the delay(ns) from interrupt mode to continuous polling - * mode so the timer routine is scheduled appropriately. - */ - val = readl(kbc->mmio + KBC_INIT_DLY_0); - kbc->cp_dly_jiffies = usecs_to_jiffies((val & 0xfffff) * 32); - - kbc->num_pressed_keys = 0; - - /* - * Atomically clear out any remaining entries in the key FIFO - * and enable keyboard interrupts. - */ - spin_lock_irqsave(&kbc->lock, flags); - while (1) { - val = readl(kbc->mmio + KBC_INT_0); - val >>= 4; - if (!val) - break; - - val = readl(kbc->mmio + KBC_KP_ENT0_0); - val = readl(kbc->mmio + KBC_KP_ENT1_0); - } - writel(0x7, kbc->mmio + KBC_INT_0); - spin_unlock_irqrestore(&kbc->lock, flags); - - enable_irq(kbc->irq); - - return 0; -} - -static void tegra_kbc_stop(struct tegra_kbc *kbc) -{ - unsigned long flags; - u32 val; - - spin_lock_irqsave(&kbc->lock, flags); - val = readl(kbc->mmio + KBC_CONTROL_0); - val &= ~1; - writel(val, kbc->mmio + KBC_CONTROL_0); - spin_unlock_irqrestore(&kbc->lock, flags); - - disable_irq(kbc->irq); - del_timer_sync(&kbc->timer); - - clk_disable(kbc->clk); -} - -static int tegra_kbc_open(struct input_dev *dev) -{ - struct tegra_kbc *kbc = input_get_drvdata(dev); - - return tegra_kbc_start(kbc); -} - -static void tegra_kbc_close(struct input_dev *dev) -{ - struct tegra_kbc *kbc = input_get_drvdata(dev); - - return tegra_kbc_stop(kbc); -} - -static bool __devinit -tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, - struct device *dev, unsigned int *num_rows) -{ - int i; - - *num_rows = 0; - - for (i = 0; i < KBC_MAX_GPIO; i++) { - const struct tegra_kbc_pin_cfg *pin_cfg = &pdata->pin_cfg[i]; - - if (pin_cfg->is_row) { - if (pin_cfg->num >= KBC_MAX_ROW) { - dev_err(dev, - "pin_cfg[%d]: invalid row number %d\n", - i, pin_cfg->num); - return false; - } - (*num_rows)++; - } else { - if (pin_cfg->num >= KBC_MAX_COL) { - dev_err(dev, - "pin_cfg[%d]: invalid column number %d\n", - i, pin_cfg->num); - return false; - } - } - } - - return true; -} - -static int __devinit tegra_kbc_probe(struct platform_device *pdev) -{ - const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data; - const struct matrix_keymap_data *keymap_data; - struct tegra_kbc *kbc; - struct input_dev *input_dev; - struct resource *res; - int irq; - int err; - int i; - int num_rows = 0; - unsigned int debounce_cnt; - unsigned int scan_time_rows; - - if (!pdata) - return -EINVAL; - - if (!tegra_kbc_check_pin_cfg(pdata, &pdev->dev, &num_rows)) - return -EINVAL; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "failed to get I/O memory\n"); - return -ENXIO; - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_err(&pdev->dev, "failed to get keyboard IRQ\n"); - return -ENXIO; - } - - kbc = kzalloc(sizeof(*kbc), GFP_KERNEL); - input_dev = input_allocate_device(); - if (!kbc || !input_dev) { - err = -ENOMEM; - goto err_free_mem; - } - - kbc->pdata = pdata; - kbc->idev = input_dev; - kbc->irq = irq; - spin_lock_init(&kbc->lock); - setup_timer(&kbc->timer, tegra_kbc_keypress_timer, (unsigned long)kbc); - - res = request_mem_region(res->start, resource_size(res), pdev->name); - if (!res) { - dev_err(&pdev->dev, "failed to request I/O memory\n"); - err = -EBUSY; - goto err_free_mem; - } - - kbc->mmio = ioremap(res->start, resource_size(res)); - if (!kbc->mmio) { - dev_err(&pdev->dev, "failed to remap I/O memory\n"); - err = -ENXIO; - goto err_free_mem_region; - } - - kbc->clk = clk_get(&pdev->dev, NULL); - if (IS_ERR(kbc->clk)) { - dev_err(&pdev->dev, "failed to get keyboard clock\n"); - err = PTR_ERR(kbc->clk); - goto err_iounmap; - } - - kbc->wake_enable_rows = 0; - kbc->wake_enable_cols = 0; - for (i = 0; i < pdata->wake_cnt; i++) { - kbc->wake_enable_rows |= (1 << pdata->wake_cfg[i].row); - kbc->wake_enable_cols |= (1 << pdata->wake_cfg[i].col); - } - - /* - * The time delay between two consecutive reads of the FIFO is - * the sum of the repeat time and the time taken for scanning - * the rows. There is an additional delay before the row scanning - * starts. The repoll delay is computed in milliseconds. - */ - debounce_cnt = min(pdata->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); - scan_time_rows = (KBC_ROW_SCAN_TIME + debounce_cnt) * num_rows; - kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt; - kbc->repoll_dly = ((kbc->repoll_dly * KBC_CYCLE_USEC) + 999) / 1000; - - input_dev->name = pdev->name; - input_dev->id.bustype = BUS_HOST; - input_dev->dev.parent = &pdev->dev; - input_dev->open = tegra_kbc_open; - input_dev->close = tegra_kbc_close; - - input_set_drvdata(input_dev, kbc); - - input_dev->evbit[0] = BIT_MASK(EV_KEY); - input_set_capability(input_dev, EV_MSC, MSC_SCAN); - - input_dev->keycode = kbc->keycode; - input_dev->keycodesize = sizeof(kbc->keycode[0]); - input_dev->keycodemax = ARRAY_SIZE(kbc->keycode); - - keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data; - matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT, - input_dev->keycode, input_dev->keybit); - - err = request_irq(kbc->irq, tegra_kbc_isr, IRQF_TRIGGER_HIGH, - pdev->name, kbc); - if (err) { - dev_err(&pdev->dev, "failed to request keyboard IRQ\n"); - goto err_put_clk; - } - - disable_irq(kbc->irq); - - err = input_register_device(kbc->idev); - if (err) { - dev_err(&pdev->dev, "failed to register input device\n"); - goto err_free_irq; - } - - platform_set_drvdata(pdev, kbc); - device_init_wakeup(&pdev->dev, pdata->wakeup); - - return 0; - -err_free_irq: - free_irq(kbc->irq, pdev); -err_put_clk: - clk_put(kbc->clk); -err_iounmap: - iounmap(kbc->mmio); -err_free_mem_region: - release_mem_region(res->start, resource_size(res)); -err_free_mem: - input_free_device(kbc->idev); - kfree(kbc); - - return err; -} - -static int __devexit tegra_kbc_remove(struct platform_device *pdev) -{ - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - struct resource *res; - - free_irq(kbc->irq, pdev); - clk_put(kbc->clk); - - input_unregister_device(kbc->idev); - iounmap(kbc->mmio); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - kfree(kbc); - - platform_set_drvdata(pdev, NULL); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int tegra_kbc_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - - if (device_may_wakeup(&pdev->dev)) { - tegra_kbc_setup_wakekeys(kbc, true); - enable_irq_wake(kbc->irq); - /* Forcefully clear the interrupt status */ - writel(0x7, kbc->mmio + KBC_INT_0); - msleep(30); - } else { - mutex_lock(&kbc->idev->mutex); - if (kbc->idev->users) - tegra_kbc_stop(kbc); - mutex_unlock(&kbc->idev->mutex); - } - - return 0; -} - -static int tegra_kbc_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct tegra_kbc *kbc = platform_get_drvdata(pdev); - int err = 0; - - if (device_may_wakeup(&pdev->dev)) { - disable_irq_wake(kbc->irq); - tegra_kbc_setup_wakekeys(kbc, false); - } else { - mutex_lock(&kbc->idev->mutex); - if (kbc->idev->users) - err = tegra_kbc_start(kbc); - mutex_unlock(&kbc->idev->mutex); - } - - return err; -} -#endif - -static SIMPLE_DEV_PM_OPS(tegra_kbc_pm_ops, tegra_kbc_suspend, tegra_kbc_resume); - -static struct platform_driver tegra_kbc_driver = { - .probe = tegra_kbc_probe, - .remove = __devexit_p(tegra_kbc_remove), - .driver = { - .name = "tegra-kbc", - .owner = THIS_MODULE, - .pm = &tegra_kbc_pm_ops, - }, -}; - -static void __exit tegra_kbc_exit(void) -{ - platform_driver_unregister(&tegra_kbc_driver); -} -module_exit(tegra_kbc_exit); - -static int __init tegra_kbc_init(void) -{ - return platform_driver_register(&tegra_kbc_driver); -} -module_init(tegra_kbc_init); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Rakesh Iyer "); -MODULE_DESCRIPTION("Tegra matrix keyboard controller driver"); -MODULE_ALIAS("platform:tegra-kbc"); diff --git a/trunk/drivers/input/keyboard/tnetv107x-keypad.c b/trunk/drivers/input/keyboard/tnetv107x-keypad.c index c8f097a15d89..b4a81ebfab92 100644 --- a/trunk/drivers/input/keyboard/tnetv107x-keypad.c +++ b/trunk/drivers/input/keyboard/tnetv107x-keypad.c @@ -14,7 +14,6 @@ */ #include -#include #include #include #include @@ -220,9 +219,9 @@ static int __devinit keypad_probe(struct platform_device *pdev) } kp->clk = clk_get(dev, NULL); - if (IS_ERR(kp->clk)) { + if (!kp->clk) { dev_err(dev, "cannot claim device clock\n"); - error = PTR_ERR(kp->clk); + error = -EINVAL; goto error_clk; } diff --git a/trunk/drivers/input/serio/ct82c710.c b/trunk/drivers/input/serio/ct82c710.c index 852816567241..448c7724beb9 100644 --- a/trunk/drivers/input/serio/ct82c710.c +++ b/trunk/drivers/input/serio/ct82c710.c @@ -111,11 +111,9 @@ static void ct82c710_close(struct serio *serio) static int ct82c710_open(struct serio *serio) { unsigned char status; - int err; - err = request_irq(CT82C710_IRQ, ct82c710_interrupt, 0, "ct82c710", NULL); - if (err) - return err; + if (request_irq(CT82C710_IRQ, ct82c710_interrupt, 0, "ct82c710", NULL)) + return -1; status = inb_p(CT82C710_STATUS); @@ -133,7 +131,7 @@ static int ct82c710_open(struct serio *serio) status &= ~(CT82C710_ENABLE | CT82C710_INTS_ON); outb_p(status, CT82C710_STATUS); free_irq(CT82C710_IRQ, NULL); - return -EBUSY; + return -1; } return 0; diff --git a/trunk/drivers/input/serio/serport.c b/trunk/drivers/input/serio/serport.c index 8755f5f3ad37..6e362de3f412 100644 --- a/trunk/drivers/input/serio/serport.c +++ b/trunk/drivers/input/serio/serport.c @@ -116,15 +116,14 @@ static void serport_ldisc_close(struct tty_struct *tty) /* * serport_ldisc_receive() is called by the low level tty driver when characters - * are ready for us. We forward the characters and flags, one by one to the - * 'interrupt' routine. + * are ready for us. We forward the characters, one by one to the 'interrupt' + * routine. */ static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { struct serport *serport = (struct serport*) tty->disc_data; unsigned long flags; - unsigned int ch_flags; int i; spin_lock_irqsave(&serport->lock, flags); @@ -132,23 +131,8 @@ static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *c if (!test_bit(SERPORT_ACTIVE, &serport->flags)) goto out; - for (i = 0; i < count; i++) { - switch (fp[i]) { - case TTY_FRAME: - ch_flags = SERIO_FRAME; - break; - - case TTY_PARITY: - ch_flags = SERIO_PARITY; - break; - - default: - ch_flags = 0; - break; - } - - serio_interrupt(serport->serio, cp[i], ch_flags); - } + for (i = 0; i < count; i++) + serio_interrupt(serport->serio, cp[i], 0); out: spin_unlock_irqrestore(&serport->lock, flags); diff --git a/trunk/drivers/input/sparse-keymap.c b/trunk/drivers/input/sparse-keymap.c index 7729e547ba65..a29a7812bd46 100644 --- a/trunk/drivers/input/sparse-keymap.c +++ b/trunk/drivers/input/sparse-keymap.c @@ -201,7 +201,6 @@ int sparse_keymap_setup(struct input_dev *dev, break; case KE_SW: - case KE_VSW: __set_bit(EV_SW, dev->evbit); __set_bit(entry->sw.code, dev->swbit); break; diff --git a/trunk/drivers/input/tablet/wacom_wac.c b/trunk/drivers/input/tablet/wacom_wac.c index 367fa82a607e..518782999fea 100644 --- a/trunk/drivers/input/tablet/wacom_wac.c +++ b/trunk/drivers/input/tablet/wacom_wac.c @@ -1101,13 +1101,6 @@ void wacom_setup_device_quirks(struct wacom_features *features) } } -static unsigned int wacom_calculate_touch_res(unsigned int logical_max, - unsigned int physical_max) -{ - /* Touch physical dimensions are in 100th of mm */ - return (logical_max * 100) / physical_max; -} - void wacom_setup_input_capabilities(struct input_dev *input_dev, struct wacom_wac *wacom_wac) { @@ -1235,12 +1228,8 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, case TABLETPC: if (features->device_type == BTN_TOOL_DOUBLETAP || features->device_type == BTN_TOOL_TRIPLETAP) { - input_abs_set_res(input_dev, ABS_X, - wacom_calculate_touch_res(features->x_max, - features->x_phy)); - input_abs_set_res(input_dev, ABS_Y, - wacom_calculate_touch_res(features->y_max, - features->y_phy)); + input_set_abs_params(input_dev, ABS_RX, 0, features->x_phy, 0, 0); + input_set_abs_params(input_dev, ABS_RY, 0, features->y_phy, 0, 0); __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); } @@ -1283,12 +1272,6 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, features->pressure_max, features->pressure_fuzz, 0); - input_abs_set_res(input_dev, ABS_X, - wacom_calculate_touch_res(features->x_max, - features->x_phy)); - input_abs_set_res(input_dev, ABS_Y, - wacom_calculate_touch_res(features->y_max, - features->y_phy)); } else if (features->device_type == BTN_TOOL_PEN) { __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); __set_bit(BTN_TOOL_PEN, input_dev->keybit); @@ -1443,10 +1426,6 @@ static struct wacom_features wacom_features_0xD3 = { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static const struct wacom_features wacom_features_0xD4 = { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 255, 63, BAMBOO_PT }; -static struct wacom_features wacom_features_0xD6 = - { "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; -static struct wacom_features wacom_features_0xD7 = - { "Wacom BambooPT 2FG Small", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xD8 = { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xDA = @@ -1528,8 +1507,6 @@ const struct usb_device_id wacom_ids[] = { { USB_DEVICE_WACOM(0xD2) }, { USB_DEVICE_WACOM(0xD3) }, { USB_DEVICE_WACOM(0xD4) }, - { USB_DEVICE_WACOM(0xD6) }, - { USB_DEVICE_WACOM(0xD7) }, { USB_DEVICE_WACOM(0xD8) }, { USB_DEVICE_WACOM(0xDA) }, { USB_DEVICE_WACOM(0xDB) }, diff --git a/trunk/drivers/input/touchscreen/bu21013_ts.c b/trunk/drivers/input/touchscreen/bu21013_ts.c index 1507ce108d5b..f7fa9ef4cd65 100644 --- a/trunk/drivers/input/touchscreen/bu21013_ts.c +++ b/trunk/drivers/input/touchscreen/bu21013_ts.c @@ -12,7 +12,6 @@ #include #include #include -#include #define PEN_DOWN_INTR 0 #define MAX_FINGERS 2 @@ -140,7 +139,6 @@ * @chip: pointer to the touch panel controller * @in_dev: pointer to the input device structure * @intr_pin: interrupt pin value - * @regulator: pointer to the Regulator used for touch screen * * Touch panel device data structure */ @@ -151,7 +149,6 @@ struct bu21013_ts_data { const struct bu21013_platform_device *chip; struct input_dev *in_dev; unsigned int intr_pin; - struct regulator *regulator; }; /** @@ -459,20 +456,6 @@ static int __devinit bu21013_probe(struct i2c_client *client, bu21013_data->in_dev = in_dev; bu21013_data->chip = pdata; bu21013_data->client = client; - - bu21013_data->regulator = regulator_get(&client->dev, "V-TOUCH"); - if (IS_ERR(bu21013_data->regulator)) { - dev_err(&client->dev, "regulator_get failed\n"); - error = PTR_ERR(bu21013_data->regulator); - goto err_free_mem; - } - - error = regulator_enable(bu21013_data->regulator); - if (error < 0) { - dev_err(&client->dev, "regulator enable failed\n"); - goto err_put_regulator; - } - bu21013_data->touch_stopped = false; init_waitqueue_head(&bu21013_data->wait); @@ -481,7 +464,7 @@ static int __devinit bu21013_probe(struct i2c_client *client, error = pdata->cs_en(pdata->cs_pin); if (error < 0) { dev_err(&client->dev, "chip init failed\n"); - goto err_disable_regulator; + goto err_free_mem; } } @@ -502,9 +485,9 @@ static int __devinit bu21013_probe(struct i2c_client *client, __set_bit(EV_ABS, in_dev->evbit); input_set_abs_params(in_dev, ABS_MT_POSITION_X, 0, - pdata->touch_x_max, 0, 0); + pdata->x_max_res, 0, 0); input_set_abs_params(in_dev, ABS_MT_POSITION_Y, 0, - pdata->touch_y_max, 0, 0); + pdata->y_max_res, 0, 0); input_set_drvdata(in_dev, bu21013_data); error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq, @@ -530,10 +513,6 @@ static int __devinit bu21013_probe(struct i2c_client *client, bu21013_free_irq(bu21013_data); err_cs_disable: pdata->cs_dis(pdata->cs_pin); -err_disable_regulator: - regulator_disable(bu21013_data->regulator); -err_put_regulator: - regulator_put(bu21013_data->regulator); err_free_mem: input_free_device(in_dev); kfree(bu21013_data); @@ -556,10 +535,6 @@ static int __devexit bu21013_remove(struct i2c_client *client) bu21013_data->chip->cs_dis(bu21013_data->chip->cs_pin); input_unregister_device(bu21013_data->in_dev); - - regulator_disable(bu21013_data->regulator); - regulator_put(bu21013_data->regulator); - kfree(bu21013_data); device_init_wakeup(&client->dev, false); @@ -586,8 +561,6 @@ static int bu21013_suspend(struct device *dev) else disable_irq(bu21013_data->chip->irq); - regulator_disable(bu21013_data->regulator); - return 0; } @@ -604,12 +577,6 @@ static int bu21013_resume(struct device *dev) struct i2c_client *client = bu21013_data->client; int retval; - retval = regulator_enable(bu21013_data->regulator); - if (retval < 0) { - dev_err(&client->dev, "bu21013 regulator enable failed\n"); - return retval; - } - retval = bu21013_init_chip(bu21013_data); if (retval < 0) { dev_err(&client->dev, "bu21013 controller config failed\n"); diff --git a/trunk/drivers/input/touchscreen/tnetv107x-ts.c b/trunk/drivers/input/touchscreen/tnetv107x-ts.c index 22a3411e93c5..cf1dba2e267c 100644 --- a/trunk/drivers/input/touchscreen/tnetv107x-ts.c +++ b/trunk/drivers/input/touchscreen/tnetv107x-ts.c @@ -14,7 +14,6 @@ */ #include -#include #include #include #include @@ -290,9 +289,9 @@ static int __devinit tsc_probe(struct platform_device *pdev) } ts->clk = clk_get(dev, NULL); - if (IS_ERR(ts->clk)) { + if (!ts->clk) { dev_err(dev, "cannot claim device clock\n"); - error = PTR_ERR(ts->clk); + error = -EINVAL; goto error_clk; } diff --git a/trunk/drivers/leds/leds-pwm.c b/trunk/drivers/leds/leds-pwm.c index 666daf77872e..da3fa8dcdf5b 100644 --- a/trunk/drivers/leds/leds-pwm.c +++ b/trunk/drivers/leds/leds-pwm.c @@ -69,7 +69,6 @@ static int led_pwm_probe(struct platform_device *pdev) led_dat->pwm = pwm_request(cur_led->pwm_id, cur_led->name); if (IS_ERR(led_dat->pwm)) { - ret = PTR_ERR(led_dat->pwm); dev_err(&pdev->dev, "unable to request PWM %d\n", cur_led->pwm_id); goto err; diff --git a/trunk/drivers/mmc/host/ushc.c b/trunk/drivers/mmc/host/ushc.c index f8f65df9b017..f08f944ac53c 100644 --- a/trunk/drivers/mmc/host/ushc.c +++ b/trunk/drivers/mmc/host/ushc.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include diff --git a/trunk/drivers/net/bnx2.c b/trunk/drivers/net/bnx2.c index 0ba59d5aeb7f..df99edf3464a 100644 --- a/trunk/drivers/net/bnx2.c +++ b/trunk/drivers/net/bnx2.c @@ -7553,10 +7553,6 @@ bnx2_set_flags(struct net_device *dev, u32 data) !(data & ETH_FLAG_RXVLAN)) return -EINVAL; - /* TSO with VLAN tag won't work with current firmware */ - if (!(data & ETH_FLAG_TXVLAN)) - return -EINVAL; - rc = ethtool_op_set_flags(dev, data, ETH_FLAG_RXHASH | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN); if (rc) @@ -7966,8 +7962,11 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) /* AER (Advanced Error Reporting) hooks */ err = pci_enable_pcie_error_reporting(pdev); - if (!err) - bp->flags |= BNX2_FLAG_AER_ENABLED; + if (err) { + dev_err(&pdev->dev, "pci_enable_pcie_error_reporting " + "failed 0x%x\n", err); + /* non-fatal, continue */ + } } else { bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); @@ -8230,10 +8229,8 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) return 0; err_out_unmap: - if (bp->flags & BNX2_FLAG_AER_ENABLED) { + if (bp->flags & BNX2_FLAG_PCIE) pci_disable_pcie_error_reporting(pdev); - bp->flags &= ~BNX2_FLAG_AER_ENABLED; - } if (bp->regview) { iounmap(bp->regview); @@ -8421,10 +8418,8 @@ bnx2_remove_one(struct pci_dev *pdev) kfree(bp->temp_stats_blk); - if (bp->flags & BNX2_FLAG_AER_ENABLED) { + if (bp->flags & BNX2_FLAG_PCIE) pci_disable_pcie_error_reporting(pdev); - bp->flags &= ~BNX2_FLAG_AER_ENABLED; - } free_netdev(dev); @@ -8540,7 +8535,7 @@ static pci_ers_result_t bnx2_io_slot_reset(struct pci_dev *pdev) } rtnl_unlock(); - if (!(bp->flags & BNX2_FLAG_AER_ENABLED)) + if (!(bp->flags & BNX2_FLAG_PCIE)) return result; err = pci_cleanup_aer_uncorrect_error_status(pdev); diff --git a/trunk/drivers/net/bnx2.h b/trunk/drivers/net/bnx2.h index f459fb2f9add..5488a2e82fe9 100644 --- a/trunk/drivers/net/bnx2.h +++ b/trunk/drivers/net/bnx2.h @@ -6741,7 +6741,6 @@ struct bnx2 { #define BNX2_FLAG_JUMBO_BROKEN 0x00000800 #define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000 #define BNX2_FLAG_BROKEN_STATS 0x00002000 -#define BNX2_FLAG_AER_ENABLED 0x00004000 struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; diff --git a/trunk/drivers/net/bonding/bond_3ad.c b/trunk/drivers/net/bonding/bond_3ad.c index 1024ae158227..171782e2bb39 100644 --- a/trunk/drivers/net/bonding/bond_3ad.c +++ b/trunk/drivers/net/bonding/bond_3ad.c @@ -2470,10 +2470,6 @@ int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct pac if (!(dev->flags & IFF_MASTER)) goto out; - skb = skb_share_check(skb, GFP_ATOMIC); - if (!skb) - goto out; - if (!pskb_may_pull(skb, sizeof(struct lacpdu))) goto out; diff --git a/trunk/drivers/net/bonding/bond_alb.c b/trunk/drivers/net/bonding/bond_alb.c index 5c6fba802f2b..f4e638c65129 100644 --- a/trunk/drivers/net/bonding/bond_alb.c +++ b/trunk/drivers/net/bonding/bond_alb.c @@ -326,10 +326,6 @@ static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct goto out; } - skb = skb_share_check(skb, GFP_ATOMIC); - if (!skb) - goto out; - if (!pskb_may_pull(skb, arp_hdr_len(bond_dev))) goto out; diff --git a/trunk/drivers/net/bonding/bond_main.c b/trunk/drivers/net/bonding/bond_main.c index 163e0b06eaa5..b1025b85acf1 100644 --- a/trunk/drivers/net/bonding/bond_main.c +++ b/trunk/drivers/net/bonding/bond_main.c @@ -2733,10 +2733,6 @@ static int bond_arp_rcv(struct sk_buff *skb, struct net_device *dev, struct pack if (!slave || !slave_do_arp_validate(bond, slave)) goto out_unlock; - skb = skb_share_check(skb, GFP_ATOMIC); - if (!skb) - goto out_unlock; - if (!pskb_may_pull(skb, arp_hdr_len(dev))) goto out_unlock; diff --git a/trunk/drivers/net/can/Kconfig b/trunk/drivers/net/can/Kconfig index 986195eaa57c..d5a9db60ade9 100644 --- a/trunk/drivers/net/can/Kconfig +++ b/trunk/drivers/net/can/Kconfig @@ -117,8 +117,6 @@ source "drivers/net/can/sja1000/Kconfig" source "drivers/net/can/usb/Kconfig" -source "drivers/net/can/softing/Kconfig" - config CAN_DEBUG_DEVICES bool "CAN devices debugging messages" depends on CAN diff --git a/trunk/drivers/net/can/Makefile b/trunk/drivers/net/can/Makefile index 53c82a71778e..07ca159ba3f9 100644 --- a/trunk/drivers/net/can/Makefile +++ b/trunk/drivers/net/can/Makefile @@ -9,7 +9,6 @@ obj-$(CONFIG_CAN_DEV) += can-dev.o can-dev-y := dev.o obj-y += usb/ -obj-y += softing/ obj-$(CONFIG_CAN_SJA1000) += sja1000/ obj-$(CONFIG_CAN_MSCAN) += mscan/ diff --git a/trunk/drivers/net/can/at91_can.c b/trunk/drivers/net/can/at91_can.c index 2532b9631538..7ef83d06f7ed 100644 --- a/trunk/drivers/net/can/at91_can.c +++ b/trunk/drivers/net/can/at91_can.c @@ -2,7 +2,7 @@ * at91_can.c - CAN network driver for AT91 SoC CAN controller * * (C) 2007 by Hans J. Koch - * (C) 2008, 2009, 2010, 2011 by Marc Kleine-Budde + * (C) 2008, 2009, 2010 by Marc Kleine-Budde * * This software may be distributed under the terms of the GNU General * Public License ("GPL") version 2 as distributed in the 'COPYING' @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -41,23 +40,22 @@ #include -#define AT91_NAPI_WEIGHT 11 +#define AT91_NAPI_WEIGHT 12 /* * RX/TX Mailbox split * don't dare to touch */ -#define AT91_MB_RX_NUM 11 +#define AT91_MB_RX_NUM 12 #define AT91_MB_TX_SHIFT 2 -#define AT91_MB_RX_FIRST 1 +#define AT91_MB_RX_FIRST 0 #define AT91_MB_RX_LAST (AT91_MB_RX_FIRST + AT91_MB_RX_NUM - 1) #define AT91_MB_RX_MASK(i) ((1 << (i)) - 1) #define AT91_MB_RX_SPLIT 8 #define AT91_MB_RX_LOW_LAST (AT91_MB_RX_SPLIT - 1) -#define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT) & \ - ~AT91_MB_RX_MASK(AT91_MB_RX_FIRST)) +#define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT)) #define AT91_MB_TX_NUM (1 << AT91_MB_TX_SHIFT) #define AT91_MB_TX_FIRST (AT91_MB_RX_LAST + 1) @@ -170,8 +168,6 @@ struct at91_priv { struct clk *clk; struct at91_can_data *pdata; - - canid_t mb0_id; }; static struct can_bittiming_const at91_bittiming_const = { @@ -224,18 +220,6 @@ static inline void set_mb_mode(const struct at91_priv *priv, unsigned int mb, set_mb_mode_prio(priv, mb, mode, 0); } -static inline u32 at91_can_id_to_reg_mid(canid_t can_id) -{ - u32 reg_mid; - - if (can_id & CAN_EFF_FLAG) - reg_mid = (can_id & CAN_EFF_MASK) | AT91_MID_MIDE; - else - reg_mid = (can_id & CAN_SFF_MASK) << 18; - - return reg_mid; -} - /* * Swtich transceiver on or off */ @@ -249,22 +233,12 @@ static void at91_setup_mailboxes(struct net_device *dev) { struct at91_priv *priv = netdev_priv(dev); unsigned int i; - u32 reg_mid; /* - * Due to a chip bug (errata 50.2.6.3 & 50.3.5.3) the first - * mailbox is disabled. The next 11 mailboxes are used as a - * reception FIFO. The last mailbox is configured with - * overwrite option. The overwrite flag indicates a FIFO - * overflow. + * The first 12 mailboxes are used as a reception FIFO. The + * last mailbox is configured with overwrite option. The + * overwrite flag indicates a FIFO overflow. */ - reg_mid = at91_can_id_to_reg_mid(priv->mb0_id); - for (i = 0; i < AT91_MB_RX_FIRST; i++) { - set_mb_mode(priv, i, AT91_MB_MODE_DISABLED); - at91_write(priv, AT91_MID(i), reg_mid); - at91_write(priv, AT91_MCR(i), 0x0); /* clear dlc */ - } - for (i = AT91_MB_RX_FIRST; i < AT91_MB_RX_LAST; i++) set_mb_mode(priv, i, AT91_MB_MODE_RX); set_mb_mode(priv, AT91_MB_RX_LAST, AT91_MB_MODE_RX_OVRWR); @@ -280,8 +254,7 @@ static void at91_setup_mailboxes(struct net_device *dev) set_mb_mode_prio(priv, i, AT91_MB_MODE_TX, 0); /* Reset tx and rx helper pointers */ - priv->tx_next = priv->tx_echo = 0; - priv->rx_next = AT91_MB_RX_FIRST; + priv->tx_next = priv->tx_echo = priv->rx_next = 0; } static int at91_set_bittiming(struct net_device *dev) @@ -399,7 +372,12 @@ static netdev_tx_t at91_start_xmit(struct sk_buff *skb, struct net_device *dev) netdev_err(dev, "BUG! TX buffer full when queue awake!\n"); return NETDEV_TX_BUSY; } - reg_mid = at91_can_id_to_reg_mid(cf->can_id); + + if (cf->can_id & CAN_EFF_FLAG) + reg_mid = (cf->can_id & CAN_EFF_MASK) | AT91_MID_MIDE; + else + reg_mid = (cf->can_id & CAN_SFF_MASK) << 18; + reg_mcr = ((cf->can_id & CAN_RTR_FLAG) ? AT91_MCR_MRTR : 0) | (cf->can_dlc << 16) | AT91_MCR_MTCR; @@ -561,31 +539,27 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb) * * Theory of Operation: * - * 11 of the 16 mailboxes on the chip are reserved for RX. we split - * them into 2 groups. The lower group holds 7 and upper 4 mailboxes. + * 12 of the 16 mailboxes on the chip are reserved for RX. we split + * them into 2 groups. The lower group holds 8 and upper 4 mailboxes. * * Like it or not, but the chip always saves a received CAN message * into the first free mailbox it finds (starting with the * lowest). This makes it very difficult to read the messages in the * right order from the chip. This is how we work around that problem: * - * The first message goes into mb nr. 1 and issues an interrupt. All + * The first message goes into mb nr. 0 and issues an interrupt. All * rx ints are disabled in the interrupt handler and a napi poll is * scheduled. We read the mailbox, but do _not_ reenable the mb (to * receive another message). * * lower mbxs upper - * ____^______ __^__ - * / \ / \ + * ______^______ __^__ + * / \ / \ * +-+-+-+-+-+-+-+-++-+-+-+-+ - * | |x|x|x|x|x|x|x|| | | | | + * |x|x|x|x|x|x|x|x|| | | | | * +-+-+-+-+-+-+-+-++-+-+-+-+ * 0 0 0 0 0 0 0 0 0 0 1 1 \ mail * 0 1 2 3 4 5 6 7 8 9 0 1 / box - * ^ - * | - * \ - * unused, due to chip bug * * The variable priv->rx_next points to the next mailbox to read a * message from. As long we're in the lower mailboxes we just read the @@ -616,10 +590,10 @@ static int at91_poll_rx(struct net_device *dev, int quota) "order of incoming frames cannot be guaranteed\n"); again: - for (mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, priv->rx_next); - mb < AT91_MB_RX_LAST + 1 && quota > 0; + for (mb = find_next_bit(addr, AT91_MB_RX_NUM, priv->rx_next); + mb < AT91_MB_RX_NUM && quota > 0; reg_sr = at91_read(priv, AT91_SR), - mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, ++priv->rx_next)) { + mb = find_next_bit(addr, AT91_MB_RX_NUM, ++priv->rx_next)) { at91_read_msg(dev, mb); /* reactivate mailboxes */ @@ -636,8 +610,8 @@ static int at91_poll_rx(struct net_device *dev, int quota) /* upper group completed, look again in lower */ if (priv->rx_next > AT91_MB_RX_LOW_LAST && - quota > 0 && mb > AT91_MB_RX_LAST) { - priv->rx_next = AT91_MB_RX_FIRST; + quota > 0 && mb >= AT91_MB_RX_NUM) { + priv->rx_next = 0; goto again; } @@ -1063,64 +1037,6 @@ static const struct net_device_ops at91_netdev_ops = { .ndo_start_xmit = at91_start_xmit, }; -static ssize_t at91_sysfs_show_mb0_id(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct at91_priv *priv = netdev_priv(to_net_dev(dev)); - - if (priv->mb0_id & CAN_EFF_FLAG) - return snprintf(buf, PAGE_SIZE, "0x%08x\n", priv->mb0_id); - else - return snprintf(buf, PAGE_SIZE, "0x%03x\n", priv->mb0_id); -} - -static ssize_t at91_sysfs_set_mb0_id(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct net_device *ndev = to_net_dev(dev); - struct at91_priv *priv = netdev_priv(ndev); - unsigned long can_id; - ssize_t ret; - int err; - - rtnl_lock(); - - if (ndev->flags & IFF_UP) { - ret = -EBUSY; - goto out; - } - - err = strict_strtoul(buf, 0, &can_id); - if (err) { - ret = err; - goto out; - } - - if (can_id & CAN_EFF_FLAG) - can_id &= CAN_EFF_MASK | CAN_EFF_FLAG; - else - can_id &= CAN_SFF_MASK; - - priv->mb0_id = can_id; - ret = count; - - out: - rtnl_unlock(); - return ret; -} - -static DEVICE_ATTR(mb0_id, S_IWUGO | S_IRUGO, - at91_sysfs_show_mb0_id, at91_sysfs_set_mb0_id); - -static struct attribute *at91_sysfs_attrs[] = { - &dev_attr_mb0_id.attr, - NULL, -}; - -static struct attribute_group at91_sysfs_attr_group = { - .attrs = at91_sysfs_attrs, -}; - static int __devinit at91_can_probe(struct platform_device *pdev) { struct net_device *dev; @@ -1166,7 +1082,6 @@ static int __devinit at91_can_probe(struct platform_device *pdev) dev->netdev_ops = &at91_netdev_ops; dev->irq = irq; dev->flags |= IFF_ECHO; - dev->sysfs_groups[0] = &at91_sysfs_attr_group; priv = netdev_priv(dev); priv->can.clock.freq = clk_get_rate(clk); @@ -1178,7 +1093,6 @@ static int __devinit at91_can_probe(struct platform_device *pdev) priv->dev = dev; priv->clk = clk; priv->pdata = pdev->dev.platform_data; - priv->mb0_id = 0x7ff; netif_napi_add(dev, &priv->napi, at91_poll, AT91_NAPI_WEIGHT); diff --git a/trunk/drivers/net/can/softing/Kconfig b/trunk/drivers/net/can/softing/Kconfig deleted file mode 100644 index 92bd6bdde5e3..000000000000 --- a/trunk/drivers/net/can/softing/Kconfig +++ /dev/null @@ -1,30 +0,0 @@ -config CAN_SOFTING - tristate "Softing Gmbh CAN generic support" - depends on CAN_DEV - ---help--- - Support for CAN cards from Softing Gmbh & some cards - from Vector Gmbh. - Softing Gmbh CAN cards come with 1 or 2 physical busses. - Those cards typically use Dual Port RAM to communicate - with the host CPU. The interface is then identical for PCI - and PCMCIA cards. This driver operates on a platform device, - which has been created by softing_cs or softing_pci driver. - Warning: - The API of the card does not allow fine control per bus, but - controls the 2 busses on the card together. - As such, some actions (start/stop/busoff recovery) on 1 bus - must bring down the other bus too temporarily. - -config CAN_SOFTING_CS - tristate "Softing Gmbh CAN pcmcia cards" - depends on PCMCIA - select CAN_SOFTING - ---help--- - Support for PCMCIA cards from Softing Gmbh & some cards - from Vector Gmbh. - You need firmware for these, which you can get at - http://developer.berlios.de/projects/socketcan/ - This version of the driver is written against - firmware version 4.6 (softing-fw-4.6-binaries.tar.gz) - In order to use the card as CAN device, you need the Softing generic - support too. diff --git a/trunk/drivers/net/can/softing/Makefile b/trunk/drivers/net/can/softing/Makefile deleted file mode 100644 index c5e5016c742e..000000000000 --- a/trunk/drivers/net/can/softing/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -softing-y := softing_main.o softing_fw.o -obj-$(CONFIG_CAN_SOFTING) += softing.o -obj-$(CONFIG_CAN_SOFTING_CS) += softing_cs.o - -ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG diff --git a/trunk/drivers/net/can/softing/softing.h b/trunk/drivers/net/can/softing/softing.h deleted file mode 100644 index 7ec9f4db3d52..000000000000 --- a/trunk/drivers/net/can/softing/softing.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * softing common interfaces - * - * by Kurt Van Dijck, 2008-2010 - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "softing_platform.h" - -struct softing; - -struct softing_priv { - struct can_priv can; /* must be the first member! */ - struct net_device *netdev; - struct softing *card; - struct { - int pending; - /* variables wich hold the circular buffer */ - int echo_put; - int echo_get; - } tx; - struct can_bittiming_const btr_const; - int index; - uint8_t output; - uint16_t chip; -}; -#define netdev2softing(netdev) ((struct softing_priv *)netdev_priv(netdev)) - -struct softing { - const struct softing_platform_data *pdat; - struct platform_device *pdev; - struct net_device *net[2]; - spinlock_t spin; /* protect this structure & DPRAM access */ - ktime_t ts_ref; - ktime_t ts_overflow; /* timestamp overflow value, in ktime */ - - struct { - /* indication of firmware status */ - int up; - /* protection of the 'up' variable */ - struct mutex lock; - } fw; - struct { - int nr; - int requested; - int svc_count; - unsigned int dpram_position; - } irq; - struct { - int pending; - int last_bus; - /* - * keep the bus that last tx'd a message, - * in order to let every netdev queue resume - */ - } tx; - __iomem uint8_t *dpram; - unsigned long dpram_phys; - unsigned long dpram_size; - struct { - uint16_t fw_version, hw_version, license, serial; - uint16_t chip[2]; - unsigned int freq; /* remote cpu's operating frequency */ - } id; -}; - -extern int softing_default_output(struct net_device *netdev); - -extern ktime_t softing_raw2ktime(struct softing *card, u32 raw); - -extern int softing_chip_poweron(struct softing *card); - -extern int softing_bootloader_command(struct softing *card, int16_t cmd, - const char *msg); - -/* Load firmware after reset */ -extern int softing_load_fw(const char *file, struct softing *card, - __iomem uint8_t *virt, unsigned int size, int offset); - -/* Load final application firmware after bootloader */ -extern int softing_load_app_fw(const char *file, struct softing *card); - -/* - * enable or disable irq - * only called with fw.lock locked - */ -extern int softing_enable_irq(struct softing *card, int enable); - -/* start/stop 1 bus on card */ -extern int softing_startstop(struct net_device *netdev, int up); - -/* netif_rx() */ -extern int softing_netdev_rx(struct net_device *netdev, - const struct can_frame *msg, ktime_t ktime); - -/* SOFTING DPRAM mappings */ -#define DPRAM_RX 0x0000 - #define DPRAM_RX_SIZE 32 - #define DPRAM_RX_CNT 16 -#define DPRAM_RX_RD 0x0201 /* uint8_t */ -#define DPRAM_RX_WR 0x0205 /* uint8_t */ -#define DPRAM_RX_LOST 0x0207 /* uint8_t */ - -#define DPRAM_FCT_PARAM 0x0300 /* int16_t [20] */ -#define DPRAM_FCT_RESULT 0x0328 /* int16_t */ -#define DPRAM_FCT_HOST 0x032b /* uint16_t */ - -#define DPRAM_INFO_BUSSTATE 0x0331 /* uint16_t */ -#define DPRAM_INFO_BUSSTATE2 0x0335 /* uint16_t */ -#define DPRAM_INFO_ERRSTATE 0x0339 /* uint16_t */ -#define DPRAM_INFO_ERRSTATE2 0x033d /* uint16_t */ -#define DPRAM_RESET 0x0341 /* uint16_t */ -#define DPRAM_CLR_RECV_FIFO 0x0345 /* uint16_t */ -#define DPRAM_RESET_TIME 0x034d /* uint16_t */ -#define DPRAM_TIME 0x0350 /* uint64_t */ -#define DPRAM_WR_START 0x0358 /* uint8_t */ -#define DPRAM_WR_END 0x0359 /* uint8_t */ -#define DPRAM_RESET_RX_FIFO 0x0361 /* uint16_t */ -#define DPRAM_RESET_TX_FIFO 0x0364 /* uint8_t */ -#define DPRAM_READ_FIFO_LEVEL 0x0365 /* uint8_t */ -#define DPRAM_RX_FIFO_LEVEL 0x0366 /* uint16_t */ -#define DPRAM_TX_FIFO_LEVEL 0x0366 /* uint16_t */ - -#define DPRAM_TX 0x0400 /* uint16_t */ - #define DPRAM_TX_SIZE 16 - #define DPRAM_TX_CNT 32 -#define DPRAM_TX_RD 0x0601 /* uint8_t */ -#define DPRAM_TX_WR 0x0605 /* uint8_t */ - -#define DPRAM_COMMAND 0x07e0 /* uint16_t */ -#define DPRAM_RECEIPT 0x07f0 /* uint16_t */ -#define DPRAM_IRQ_TOHOST 0x07fe /* uint8_t */ -#define DPRAM_IRQ_TOCARD 0x07ff /* uint8_t */ - -#define DPRAM_V2_RESET 0x0e00 /* uint8_t */ -#define DPRAM_V2_IRQ_TOHOST 0x0e02 /* uint8_t */ - -#define TXMAX (DPRAM_TX_CNT - 1) - -/* DPRAM return codes */ -#define RES_NONE 0 -#define RES_OK 1 -#define RES_NOK 2 -#define RES_UNKNOWN 3 -/* DPRAM flags */ -#define CMD_TX 0x01 -#define CMD_ACK 0x02 -#define CMD_XTD 0x04 -#define CMD_RTR 0x08 -#define CMD_ERR 0x10 -#define CMD_BUS2 0x80 - -/* returned fifo entry bus state masks */ -#define SF_MASK_BUSOFF 0x80 -#define SF_MASK_EPASSIVE 0x60 - -/* bus states */ -#define STATE_BUSOFF 2 -#define STATE_EPASSIVE 1 -#define STATE_EACTIVE 0 diff --git a/trunk/drivers/net/can/softing/softing_cs.c b/trunk/drivers/net/can/softing/softing_cs.c deleted file mode 100644 index 300fe75dd1a7..000000000000 --- a/trunk/drivers/net/can/softing/softing_cs.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2008-2010 - * - * - Kurt Van Dijck, EIA Electronics - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the version 2 of the GNU General Public License - * 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. - * - * 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 - -#include "softing_platform.h" - -static int softingcs_index; -static spinlock_t softingcs_index_lock; - -static int softingcs_reset(struct platform_device *pdev, int v); -static int softingcs_enable_irq(struct platform_device *pdev, int v); - -/* - * platform_data descriptions - */ -#define MHZ (1000*1000) -static const struct softing_platform_data softingcs_platform_data[] = { -{ - .name = "CANcard", - .manf = 0x0168, .prod = 0x001, - .generation = 1, - .nbus = 2, - .freq = 16 * MHZ, .max_brp = 32, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "CANcard-NEC", - .manf = 0x0168, .prod = 0x002, - .generation = 1, - .nbus = 2, - .freq = 16 * MHZ, .max_brp = 32, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "CANcard-SJA", - .manf = 0x0168, .prod = 0x004, - .generation = 1, - .nbus = 2, - .freq = 20 * MHZ, .max_brp = 32, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cansja.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "CANcard-2", - .manf = 0x0168, .prod = 0x005, - .generation = 2, - .nbus = 2, - .freq = 24 * MHZ, .max_brp = 64, .max_sjw = 4, - .dpram_size = 0x1000, - .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",}, - .reset = softingcs_reset, - .enable_irq = NULL, -}, { - .name = "Vector-CANcard", - .manf = 0x0168, .prod = 0x081, - .generation = 1, - .nbus = 2, - .freq = 16 * MHZ, .max_brp = 64, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "Vector-CANcard-SJA", - .manf = 0x0168, .prod = 0x084, - .generation = 1, - .nbus = 2, - .freq = 20 * MHZ, .max_brp = 32, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cansja.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "Vector-CANcard-2", - .manf = 0x0168, .prod = 0x085, - .generation = 2, - .nbus = 2, - .freq = 24 * MHZ, .max_brp = 64, .max_sjw = 4, - .dpram_size = 0x1000, - .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",}, - .reset = softingcs_reset, - .enable_irq = NULL, -}, { - .name = "EDICcard-NEC", - .manf = 0x0168, .prod = 0x102, - .generation = 1, - .nbus = 2, - .freq = 16 * MHZ, .max_brp = 64, .max_sjw = 4, - .dpram_size = 0x0800, - .boot = {0x0000, 0x000000, fw_dir "bcard.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancard.bin",}, - .reset = softingcs_reset, - .enable_irq = softingcs_enable_irq, -}, { - .name = "EDICcard-2", - .manf = 0x0168, .prod = 0x105, - .generation = 2, - .nbus = 2, - .freq = 24 * MHZ, .max_brp = 64, .max_sjw = 4, - .dpram_size = 0x1000, - .boot = {0x0000, 0x000000, fw_dir "bcard2.bin",}, - .load = {0x0120, 0x00f600, fw_dir "ldcard2.bin",}, - .app = {0x0010, 0x0d0000, fw_dir "cancrd2.bin",}, - .reset = softingcs_reset, - .enable_irq = NULL, -}, { - 0, 0, -}, -}; - -MODULE_FIRMWARE(fw_dir "bcard.bin"); -MODULE_FIRMWARE(fw_dir "ldcard.bin"); -MODULE_FIRMWARE(fw_dir "cancard.bin"); -MODULE_FIRMWARE(fw_dir "cansja.bin"); - -MODULE_FIRMWARE(fw_dir "bcard2.bin"); -MODULE_FIRMWARE(fw_dir "ldcard2.bin"); -MODULE_FIRMWARE(fw_dir "cancrd2.bin"); - -static __devinit const struct softing_platform_data -*softingcs_find_platform_data(unsigned int manf, unsigned int prod) -{ - const struct softing_platform_data *lp; - - for (lp = softingcs_platform_data; lp->manf; ++lp) { - if ((lp->manf == manf) && (lp->prod == prod)) - return lp; - } - return NULL; -} - -/* - * platformdata callbacks - */ -static int softingcs_reset(struct platform_device *pdev, int v) -{ - struct pcmcia_device *pcmcia = to_pcmcia_dev(pdev->dev.parent); - - dev_dbg(&pdev->dev, "pcmcia config [2] %02x\n", v ? 0 : 0x20); - return pcmcia_write_config_byte(pcmcia, 2, v ? 0 : 0x20); -} - -static int softingcs_enable_irq(struct platform_device *pdev, int v) -{ - struct pcmcia_device *pcmcia = to_pcmcia_dev(pdev->dev.parent); - - dev_dbg(&pdev->dev, "pcmcia config [0] %02x\n", v ? 0x60 : 0); - return pcmcia_write_config_byte(pcmcia, 0, v ? 0x60 : 0); -} - -/* - * pcmcia check - */ -static __devinit int softingcs_probe_config(struct pcmcia_device *pcmcia, - void *priv_data) -{ - struct softing_platform_data *pdat = priv_data; - struct resource *pres; - int memspeed = 0; - - WARN_ON(!pdat); - pres = pcmcia->resource[PCMCIA_IOMEM_0]; - if (resource_size(pres) < 0x1000) - return -ERANGE; - - pres->flags |= WIN_MEMORY_TYPE_CM | WIN_ENABLE; - if (pdat->generation < 2) { - pres->flags |= WIN_USE_WAIT | WIN_DATA_WIDTH_8; - memspeed = 3; - } else { - pres->flags |= WIN_DATA_WIDTH_16; - } - return pcmcia_request_window(pcmcia, pres, memspeed); -} - -static __devexit void softingcs_remove(struct pcmcia_device *pcmcia) -{ - struct platform_device *pdev = pcmcia->priv; - - /* free bits */ - platform_device_unregister(pdev); - /* release pcmcia stuff */ - pcmcia_disable_device(pcmcia); -} - -/* - * platform_device wrapper - * pdev->resource has 2 entries: io & irq - */ -static void softingcs_pdev_release(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - kfree(pdev); -} - -static __devinit int softingcs_probe(struct pcmcia_device *pcmcia) -{ - int ret; - struct platform_device *pdev; - const struct softing_platform_data *pdat; - struct resource *pres; - struct dev { - struct platform_device pdev; - struct resource res[2]; - } *dev; - - /* find matching platform_data */ - pdat = softingcs_find_platform_data(pcmcia->manf_id, pcmcia->card_id); - if (!pdat) - return -ENOTTY; - - /* setup pcmcia device */ - pcmcia->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IOMEM | - CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC; - ret = pcmcia_loop_config(pcmcia, softingcs_probe_config, (void *)pdat); - if (ret) - goto pcmcia_failed; - - ret = pcmcia_enable_device(pcmcia); - if (ret < 0) - goto pcmcia_failed; - - pres = pcmcia->resource[PCMCIA_IOMEM_0]; - if (!pres) { - ret = -EBADF; - goto pcmcia_bad; - } - - /* create softing platform device */ - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (!dev) { - ret = -ENOMEM; - goto mem_failed; - } - dev->pdev.resource = dev->res; - dev->pdev.num_resources = ARRAY_SIZE(dev->res); - dev->pdev.dev.release = softingcs_pdev_release; - - pdev = &dev->pdev; - pdev->dev.platform_data = (void *)pdat; - pdev->dev.parent = &pcmcia->dev; - pcmcia->priv = pdev; - - /* platform device resources */ - pdev->resource[0].flags = IORESOURCE_MEM; - pdev->resource[0].start = pres->start; - pdev->resource[0].end = pres->end; - - pdev->resource[1].flags = IORESOURCE_IRQ; - pdev->resource[1].start = pcmcia->irq; - pdev->resource[1].end = pdev->resource[1].start; - - /* platform device setup */ - spin_lock(&softingcs_index_lock); - pdev->id = softingcs_index++; - spin_unlock(&softingcs_index_lock); - pdev->name = "softing"; - dev_set_name(&pdev->dev, "softingcs.%i", pdev->id); - ret = platform_device_register(pdev); - if (ret < 0) - goto platform_failed; - - dev_info(&pcmcia->dev, "created %s\n", dev_name(&pdev->dev)); - return 0; - -platform_failed: - kfree(dev); -mem_failed: -pcmcia_bad: -pcmcia_failed: - pcmcia_disable_device(pcmcia); - pcmcia->priv = NULL; - return ret ?: -ENODEV; -} - -static /*const*/ struct pcmcia_device_id softingcs_ids[] = { - /* softing */ - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0004), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0005), - /* vector, manufacturer? */ - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0081), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0084), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0085), - /* EDIC */ - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0102), - PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0105), - PCMCIA_DEVICE_NULL, -}; - -MODULE_DEVICE_TABLE(pcmcia, softingcs_ids); - -static struct pcmcia_driver softingcs_driver = { - .owner = THIS_MODULE, - .name = "softingcs", - .id_table = softingcs_ids, - .probe = softingcs_probe, - .remove = __devexit_p(softingcs_remove), -}; - -static int __init softingcs_start(void) -{ - spin_lock_init(&softingcs_index_lock); - return pcmcia_register_driver(&softingcs_driver); -} - -static void __exit softingcs_stop(void) -{ - pcmcia_unregister_driver(&softingcs_driver); -} - -module_init(softingcs_start); -module_exit(softingcs_stop); - -MODULE_DESCRIPTION("softing CANcard driver" - ", links PCMCIA card to softing driver"); -MODULE_LICENSE("GPL v2"); diff --git a/trunk/drivers/net/can/softing/softing_fw.c b/trunk/drivers/net/can/softing/softing_fw.c deleted file mode 100644 index b520784fb197..000000000000 --- a/trunk/drivers/net/can/softing/softing_fw.c +++ /dev/null @@ -1,691 +0,0 @@ -/* - * Copyright (C) 2008-2010 - * - * - Kurt Van Dijck, EIA Electronics - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the version 2 of the GNU General Public License - * 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. - * - * 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 "softing.h" - -/* - * low level DPRAM command. - * Make sure that card->dpram[DPRAM_FCT_HOST] is preset - */ -static int _softing_fct_cmd(struct softing *card, int16_t cmd, uint16_t vector, - const char *msg) -{ - int ret; - unsigned long stamp; - - iowrite16(cmd, &card->dpram[DPRAM_FCT_PARAM]); - iowrite8(vector >> 8, &card->dpram[DPRAM_FCT_HOST + 1]); - iowrite8(vector, &card->dpram[DPRAM_FCT_HOST]); - /* be sure to flush this to the card */ - wmb(); - stamp = jiffies + 1 * HZ; - /* wait for card */ - do { - /* DPRAM_FCT_HOST is _not_ aligned */ - ret = ioread8(&card->dpram[DPRAM_FCT_HOST]) + - (ioread8(&card->dpram[DPRAM_FCT_HOST + 1]) << 8); - /* don't have any cached variables */ - rmb(); - if (ret == RES_OK) - /* read return-value now */ - return ioread16(&card->dpram[DPRAM_FCT_RESULT]); - - if ((ret != vector) || time_after(jiffies, stamp)) - break; - /* process context => relax */ - usleep_range(500, 10000); - } while (1); - - ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED; - dev_alert(&card->pdev->dev, "firmware %s failed (%i)\n", msg, ret); - return ret; -} - -static int softing_fct_cmd(struct softing *card, int16_t cmd, const char *msg) -{ - int ret; - - ret = _softing_fct_cmd(card, cmd, 0, msg); - if (ret > 0) { - dev_alert(&card->pdev->dev, "%s returned %u\n", msg, ret); - ret = -EIO; - } - return ret; -} - -int softing_bootloader_command(struct softing *card, int16_t cmd, - const char *msg) -{ - int ret; - unsigned long stamp; - - iowrite16(RES_NONE, &card->dpram[DPRAM_RECEIPT]); - iowrite16(cmd, &card->dpram[DPRAM_COMMAND]); - /* be sure to flush this to the card */ - wmb(); - stamp = jiffies + 3 * HZ; - /* wait for card */ - do { - ret = ioread16(&card->dpram[DPRAM_RECEIPT]); - /* don't have any cached variables */ - rmb(); - if (ret == RES_OK) - return 0; - if (time_after(jiffies, stamp)) - break; - /* process context => relax */ - usleep_range(500, 10000); - } while (!signal_pending(current)); - - ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED; - dev_alert(&card->pdev->dev, "bootloader %s failed (%i)\n", msg, ret); - return ret; -} - -static int fw_parse(const uint8_t **pmem, uint16_t *ptype, uint32_t *paddr, - uint16_t *plen, const uint8_t **pdat) -{ - uint16_t checksum[2]; - const uint8_t *mem; - const uint8_t *end; - - /* - * firmware records are a binary, unaligned stream composed of: - * uint16_t type; - * uint32_t addr; - * uint16_t len; - * uint8_t dat[len]; - * uint16_t checksum; - * all values in little endian. - * We could define a struct for this, with __attribute__((packed)), - * but would that solve the alignment in _all_ cases (cfr. the - * struct itself may be an odd address)? - * - * I chose to use leXX_to_cpup() since this solves both - * endianness & alignment. - */ - mem = *pmem; - *ptype = le16_to_cpup((void *)&mem[0]); - *paddr = le32_to_cpup((void *)&mem[2]); - *plen = le16_to_cpup((void *)&mem[6]); - *pdat = &mem[8]; - /* verify checksum */ - end = &mem[8 + *plen]; - checksum[0] = le16_to_cpup((void *)end); - for (checksum[1] = 0; mem < end; ++mem) - checksum[1] += *mem; - if (checksum[0] != checksum[1]) - return -EINVAL; - /* increment */ - *pmem += 10 + *plen; - return 0; -} - -int softing_load_fw(const char *file, struct softing *card, - __iomem uint8_t *dpram, unsigned int size, int offset) -{ - const struct firmware *fw; - int ret; - const uint8_t *mem, *end, *dat; - uint16_t type, len; - uint32_t addr; - uint8_t *buf = NULL; - int buflen = 0; - int8_t type_end = 0; - - ret = request_firmware(&fw, file, &card->pdev->dev); - if (ret < 0) - return ret; - dev_dbg(&card->pdev->dev, "%s, firmware(%s) got %u bytes" - ", offset %c0x%04x\n", - card->pdat->name, file, (unsigned int)fw->size, - (offset >= 0) ? '+' : '-', (unsigned int)abs(offset)); - /* parse the firmware */ - mem = fw->data; - end = &mem[fw->size]; - /* look for header record */ - ret = fw_parse(&mem, &type, &addr, &len, &dat); - if (ret < 0) - goto failed; - if (type != 0xffff) - goto failed; - if (strncmp("Structured Binary Format, Softing GmbH" , dat, len)) { - ret = -EINVAL; - goto failed; - } - /* ok, we had a header */ - while (mem < end) { - ret = fw_parse(&mem, &type, &addr, &len, &dat); - if (ret < 0) - goto failed; - if (type == 3) { - /* start address, not used here */ - continue; - } else if (type == 1) { - /* eof */ - type_end = 1; - break; - } else if (type != 0) { - ret = -EINVAL; - goto failed; - } - - if ((addr + len + offset) > size) - goto failed; - memcpy_toio(&dpram[addr + offset], dat, len); - /* be sure to flush caches from IO space */ - mb(); - if (len > buflen) { - /* align buflen */ - buflen = (len + (1024-1)) & ~(1024-1); - buf = krealloc(buf, buflen, GFP_KERNEL); - if (!buf) { - ret = -ENOMEM; - goto failed; - } - } - /* verify record data */ - memcpy_fromio(buf, &dpram[addr + offset], len); - if (memcmp(buf, dat, len)) { - /* is not ok */ - dev_alert(&card->pdev->dev, "DPRAM readback failed\n"); - ret = -EIO; - goto failed; - } - } - if (!type_end) - /* no end record seen */ - goto failed; - ret = 0; -failed: - kfree(buf); - release_firmware(fw); - if (ret < 0) - dev_info(&card->pdev->dev, "firmware %s failed\n", file); - return ret; -} - -int softing_load_app_fw(const char *file, struct softing *card) -{ - const struct firmware *fw; - const uint8_t *mem, *end, *dat; - int ret, j; - uint16_t type, len; - uint32_t addr, start_addr = 0; - unsigned int sum, rx_sum; - int8_t type_end = 0, type_entrypoint = 0; - - ret = request_firmware(&fw, file, &card->pdev->dev); - if (ret) { - dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n", - file, ret); - return ret; - } - dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n", - file, (unsigned long)fw->size); - /* parse the firmware */ - mem = fw->data; - end = &mem[fw->size]; - /* look for header record */ - ret = fw_parse(&mem, &type, &addr, &len, &dat); - if (ret) - goto failed; - ret = -EINVAL; - if (type != 0xffff) { - dev_alert(&card->pdev->dev, "firmware starts with type 0x%x\n", - type); - goto failed; - } - if (strncmp("Structured Binary Format, Softing GmbH", dat, len)) { - dev_alert(&card->pdev->dev, "firmware string '%.*s' fault\n", - len, dat); - goto failed; - } - /* ok, we had a header */ - while (mem < end) { - ret = fw_parse(&mem, &type, &addr, &len, &dat); - if (ret) - goto failed; - - if (type == 3) { - /* start address */ - start_addr = addr; - type_entrypoint = 1; - continue; - } else if (type == 1) { - /* eof */ - type_end = 1; - break; - } else if (type != 0) { - dev_alert(&card->pdev->dev, - "unknown record type 0x%04x\n", type); - ret = -EINVAL; - goto failed; - } - - /* regualar data */ - for (sum = 0, j = 0; j < len; ++j) - sum += dat[j]; - /* work in 16bit (target) */ - sum &= 0xffff; - - memcpy_toio(&card->dpram[card->pdat->app.offs], dat, len); - iowrite32(card->pdat->app.offs + card->pdat->app.addr, - &card->dpram[DPRAM_COMMAND + 2]); - iowrite32(addr, &card->dpram[DPRAM_COMMAND + 6]); - iowrite16(len, &card->dpram[DPRAM_COMMAND + 10]); - iowrite8(1, &card->dpram[DPRAM_COMMAND + 12]); - ret = softing_bootloader_command(card, 1, "loading app."); - if (ret < 0) - goto failed; - /* verify checksum */ - rx_sum = ioread16(&card->dpram[DPRAM_RECEIPT + 2]); - if (rx_sum != sum) { - dev_alert(&card->pdev->dev, "SRAM seems to be damaged" - ", wanted 0x%04x, got 0x%04x\n", sum, rx_sum); - ret = -EIO; - goto failed; - } - } - if (!type_end || !type_entrypoint) - goto failed; - /* start application in card */ - iowrite32(start_addr, &card->dpram[DPRAM_COMMAND + 2]); - iowrite8(1, &card->dpram[DPRAM_COMMAND + 6]); - ret = softing_bootloader_command(card, 3, "start app."); - if (ret < 0) - goto failed; - ret = 0; -failed: - release_firmware(fw); - if (ret < 0) - dev_info(&card->pdev->dev, "firmware %s failed\n", file); - return ret; -} - -static int softing_reset_chip(struct softing *card) -{ - int ret; - - do { - /* reset chip */ - iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO]); - iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO+1]); - iowrite8(1, &card->dpram[DPRAM_RESET]); - iowrite8(0, &card->dpram[DPRAM_RESET+1]); - - ret = softing_fct_cmd(card, 0, "reset_can"); - if (!ret) - break; - if (signal_pending(current)) - /* don't wait any longer */ - break; - } while (1); - card->tx.pending = 0; - return ret; -} - -int softing_chip_poweron(struct softing *card) -{ - int ret; - /* sync */ - ret = _softing_fct_cmd(card, 99, 0x55, "sync-a"); - if (ret < 0) - goto failed; - - ret = _softing_fct_cmd(card, 99, 0xaa, "sync-b"); - if (ret < 0) - goto failed; - - ret = softing_reset_chip(card); - if (ret < 0) - goto failed; - /* get_serial */ - ret = softing_fct_cmd(card, 43, "get_serial_number"); - if (ret < 0) - goto failed; - card->id.serial = ioread32(&card->dpram[DPRAM_FCT_PARAM]); - /* get_version */ - ret = softing_fct_cmd(card, 12, "get_version"); - if (ret < 0) - goto failed; - card->id.fw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 2]); - card->id.hw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 4]); - card->id.license = ioread16(&card->dpram[DPRAM_FCT_PARAM + 6]); - card->id.chip[0] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 8]); - card->id.chip[1] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 10]); - return 0; -failed: - return ret; -} - -static void softing_initialize_timestamp(struct softing *card) -{ - uint64_t ovf; - - card->ts_ref = ktime_get(); - - /* 16MHz is the reference */ - ovf = 0x100000000ULL * 16; - do_div(ovf, card->pdat->freq ?: 16); - - card->ts_overflow = ktime_add_us(ktime_set(0, 0), ovf); -} - -ktime_t softing_raw2ktime(struct softing *card, u32 raw) -{ - uint64_t rawl; - ktime_t now, real_offset; - ktime_t target; - ktime_t tmp; - - now = ktime_get(); - real_offset = ktime_sub(ktime_get_real(), now); - - /* find nsec from card */ - rawl = raw * 16; - do_div(rawl, card->pdat->freq ?: 16); - target = ktime_add_us(card->ts_ref, rawl); - /* test for overflows */ - tmp = ktime_add(target, card->ts_overflow); - while (unlikely(ktime_to_ns(tmp) > ktime_to_ns(now))) { - card->ts_ref = ktime_add(card->ts_ref, card->ts_overflow); - target = tmp; - tmp = ktime_add(target, card->ts_overflow); - } - return ktime_add(target, real_offset); -} - -static inline int softing_error_reporting(struct net_device *netdev) -{ - struct softing_priv *priv = netdev_priv(netdev); - - return (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) - ? 1 : 0; -} - -int softing_startstop(struct net_device *dev, int up) -{ - int ret; - struct softing *card; - struct softing_priv *priv; - struct net_device *netdev; - int bus_bitmask_start; - int j, error_reporting; - struct can_frame msg; - const struct can_bittiming *bt; - - priv = netdev_priv(dev); - card = priv->card; - - if (!card->fw.up) - return -EIO; - - ret = mutex_lock_interruptible(&card->fw.lock); - if (ret) - return ret; - - bus_bitmask_start = 0; - if (dev && up) - /* prepare to start this bus as well */ - bus_bitmask_start |= (1 << priv->index); - /* bring netdevs down */ - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - netdev = card->net[j]; - if (!netdev) - continue; - priv = netdev_priv(netdev); - - if (dev != netdev) - netif_stop_queue(netdev); - - if (netif_running(netdev)) { - if (dev != netdev) - bus_bitmask_start |= (1 << j); - priv->tx.pending = 0; - priv->tx.echo_put = 0; - priv->tx.echo_get = 0; - /* - * this bus' may just have called open_candev() - * which is rather stupid to call close_candev() - * already - * but we may come here from busoff recovery too - * in which case the echo_skb _needs_ flushing too. - * just be sure to call open_candev() again - */ - close_candev(netdev); - } - priv->can.state = CAN_STATE_STOPPED; - } - card->tx.pending = 0; - - softing_enable_irq(card, 0); - ret = softing_reset_chip(card); - if (ret) - goto failed; - if (!bus_bitmask_start) - /* no busses to be brought up */ - goto card_done; - - if ((bus_bitmask_start & 1) && (bus_bitmask_start & 2) - && (softing_error_reporting(card->net[0]) - != softing_error_reporting(card->net[1]))) { - dev_alert(&card->pdev->dev, - "err_reporting flag differs for busses\n"); - goto invalid; - } - error_reporting = 0; - if (bus_bitmask_start & 1) { - netdev = card->net[0]; - priv = netdev_priv(netdev); - error_reporting += softing_error_reporting(netdev); - /* init chip 1 */ - bt = &priv->can.bittiming; - iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]); - iowrite16(bt->phase_seg1 + bt->prop_seg, - &card->dpram[DPRAM_FCT_PARAM + 6]); - iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]); - iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0, - &card->dpram[DPRAM_FCT_PARAM + 10]); - ret = softing_fct_cmd(card, 1, "initialize_chip[0]"); - if (ret < 0) - goto failed; - /* set mode */ - iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]); - ret = softing_fct_cmd(card, 3, "set_mode[0]"); - if (ret < 0) - goto failed; - /* set filter */ - /* 11bit id & mask */ - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]); - /* 29bit id.lo & mask.lo & id.hi & mask.hi */ - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]); - iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]); - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]); - iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]); - ret = softing_fct_cmd(card, 7, "set_filter[0]"); - if (ret < 0) - goto failed; - /* set output control */ - iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]); - ret = softing_fct_cmd(card, 5, "set_output[0]"); - if (ret < 0) - goto failed; - } - if (bus_bitmask_start & 2) { - netdev = card->net[1]; - priv = netdev_priv(netdev); - error_reporting += softing_error_reporting(netdev); - /* init chip2 */ - bt = &priv->can.bittiming; - iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]); - iowrite16(bt->phase_seg1 + bt->prop_seg, - &card->dpram[DPRAM_FCT_PARAM + 6]); - iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]); - iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0, - &card->dpram[DPRAM_FCT_PARAM + 10]); - ret = softing_fct_cmd(card, 2, "initialize_chip[1]"); - if (ret < 0) - goto failed; - /* set mode2 */ - iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]); - ret = softing_fct_cmd(card, 4, "set_mode[1]"); - if (ret < 0) - goto failed; - /* set filter2 */ - /* 11bit id & mask */ - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]); - /* 29bit id.lo & mask.lo & id.hi & mask.hi */ - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]); - iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]); - iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]); - iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]); - ret = softing_fct_cmd(card, 8, "set_filter[1]"); - if (ret < 0) - goto failed; - /* set output control2 */ - iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]); - ret = softing_fct_cmd(card, 6, "set_output[1]"); - if (ret < 0) - goto failed; - } - /* enable_error_frame */ - /* - * Error reporting is switched off at the moment since - * the receiving of them is not yet 100% verified - * This should be enabled sooner or later - * - if (error_reporting) { - ret = softing_fct_cmd(card, 51, "enable_error_frame"); - if (ret < 0) - goto failed; - } - */ - /* initialize interface */ - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 2]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 4]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 6]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 8]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 10]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 12]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 14]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 16]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 18]); - iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 20]); - ret = softing_fct_cmd(card, 17, "initialize_interface"); - if (ret < 0) - goto failed; - /* enable_fifo */ - ret = softing_fct_cmd(card, 36, "enable_fifo"); - if (ret < 0) - goto failed; - /* enable fifo tx ack */ - ret = softing_fct_cmd(card, 13, "fifo_tx_ack[0]"); - if (ret < 0) - goto failed; - /* enable fifo tx ack2 */ - ret = softing_fct_cmd(card, 14, "fifo_tx_ack[1]"); - if (ret < 0) - goto failed; - /* start_chip */ - ret = softing_fct_cmd(card, 11, "start_chip"); - if (ret < 0) - goto failed; - iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE]); - iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE2]); - if (card->pdat->generation < 2) { - iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]); - /* flush the DPRAM caches */ - wmb(); - } - - softing_initialize_timestamp(card); - - /* - * do socketcan notifications/status changes - * from here, no errors should occur, or the failed: part - * must be reviewed - */ - memset(&msg, 0, sizeof(msg)); - msg.can_id = CAN_ERR_FLAG | CAN_ERR_RESTARTED; - msg.can_dlc = CAN_ERR_DLC; - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - if (!(bus_bitmask_start & (1 << j))) - continue; - netdev = card->net[j]; - if (!netdev) - continue; - priv = netdev_priv(netdev); - priv->can.state = CAN_STATE_ERROR_ACTIVE; - open_candev(netdev); - if (dev != netdev) { - /* notify other busses on the restart */ - softing_netdev_rx(netdev, &msg, ktime_set(0, 0)); - ++priv->can.can_stats.restarts; - } - netif_wake_queue(netdev); - } - - /* enable interrupts */ - ret = softing_enable_irq(card, 1); - if (ret) - goto failed; -card_done: - mutex_unlock(&card->fw.lock); - return 0; -invalid: - ret = -EINVAL; -failed: - softing_enable_irq(card, 0); - softing_reset_chip(card); - mutex_unlock(&card->fw.lock); - /* bring all other interfaces down */ - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - netdev = card->net[j]; - if (!netdev) - continue; - dev_close(netdev); - } - return ret; -} - -int softing_default_output(struct net_device *netdev) -{ - struct softing_priv *priv = netdev_priv(netdev); - struct softing *card = priv->card; - - switch (priv->chip) { - case 1000: - return (card->pdat->generation < 2) ? 0xfb : 0xfa; - case 5: - return 0x60; - default: - return 0x40; - } -} diff --git a/trunk/drivers/net/can/softing/softing_main.c b/trunk/drivers/net/can/softing/softing_main.c deleted file mode 100644 index 5157e15e96eb..000000000000 --- a/trunk/drivers/net/can/softing/softing_main.c +++ /dev/null @@ -1,893 +0,0 @@ -/* - * Copyright (C) 2008-2010 - * - * - Kurt Van Dijck, EIA Electronics - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the version 2 of the GNU General Public License - * 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. - * - * 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 - -#include "softing.h" - -#define TX_ECHO_SKB_MAX (((TXMAX+1)/2)-1) - -/* - * test is a specific CAN netdev - * is online (ie. up 'n running, not sleeping, not busoff - */ -static inline int canif_is_active(struct net_device *netdev) -{ - struct can_priv *can = netdev_priv(netdev); - - if (!netif_running(netdev)) - return 0; - return (can->state <= CAN_STATE_ERROR_PASSIVE); -} - -/* reset DPRAM */ -static inline void softing_set_reset_dpram(struct softing *card) -{ - if (card->pdat->generation >= 2) { - spin_lock_bh(&card->spin); - iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) & ~1, - &card->dpram[DPRAM_V2_RESET]); - spin_unlock_bh(&card->spin); - } -} - -static inline void softing_clr_reset_dpram(struct softing *card) -{ - if (card->pdat->generation >= 2) { - spin_lock_bh(&card->spin); - iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) | 1, - &card->dpram[DPRAM_V2_RESET]); - spin_unlock_bh(&card->spin); - } -} - -/* trigger the tx queue-ing */ -static netdev_tx_t softing_netdev_start_xmit(struct sk_buff *skb, - struct net_device *dev) -{ - struct softing_priv *priv = netdev_priv(dev); - struct softing *card = priv->card; - int ret; - uint8_t *ptr; - uint8_t fifo_wr, fifo_rd; - struct can_frame *cf = (struct can_frame *)skb->data; - uint8_t buf[DPRAM_TX_SIZE]; - - if (can_dropped_invalid_skb(dev, skb)) - return NETDEV_TX_OK; - - spin_lock(&card->spin); - - ret = NETDEV_TX_BUSY; - if (!card->fw.up || - (card->tx.pending >= TXMAX) || - (priv->tx.pending >= TX_ECHO_SKB_MAX)) - goto xmit_done; - fifo_wr = ioread8(&card->dpram[DPRAM_TX_WR]); - fifo_rd = ioread8(&card->dpram[DPRAM_TX_RD]); - if (fifo_wr == fifo_rd) - /* fifo full */ - goto xmit_done; - memset(buf, 0, sizeof(buf)); - ptr = buf; - *ptr = CMD_TX; - if (cf->can_id & CAN_RTR_FLAG) - *ptr |= CMD_RTR; - if (cf->can_id & CAN_EFF_FLAG) - *ptr |= CMD_XTD; - if (priv->index) - *ptr |= CMD_BUS2; - ++ptr; - *ptr++ = cf->can_dlc; - *ptr++ = (cf->can_id >> 0); - *ptr++ = (cf->can_id >> 8); - if (cf->can_id & CAN_EFF_FLAG) { - *ptr++ = (cf->can_id >> 16); - *ptr++ = (cf->can_id >> 24); - } else { - /* increment 1, not 2 as you might think */ - ptr += 1; - } - if (!(cf->can_id & CAN_RTR_FLAG)) - memcpy(ptr, &cf->data[0], cf->can_dlc); - memcpy_toio(&card->dpram[DPRAM_TX + DPRAM_TX_SIZE * fifo_wr], - buf, DPRAM_TX_SIZE); - if (++fifo_wr >= DPRAM_TX_CNT) - fifo_wr = 0; - iowrite8(fifo_wr, &card->dpram[DPRAM_TX_WR]); - card->tx.last_bus = priv->index; - ++card->tx.pending; - ++priv->tx.pending; - can_put_echo_skb(skb, dev, priv->tx.echo_put); - ++priv->tx.echo_put; - if (priv->tx.echo_put >= TX_ECHO_SKB_MAX) - priv->tx.echo_put = 0; - /* can_put_echo_skb() saves the skb, safe to return TX_OK */ - ret = NETDEV_TX_OK; -xmit_done: - spin_unlock(&card->spin); - if (card->tx.pending >= TXMAX) { - int j; - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - if (card->net[j]) - netif_stop_queue(card->net[j]); - } - } - if (ret != NETDEV_TX_OK) - netif_stop_queue(dev); - - return ret; -} - -/* - * shortcut for skb delivery - */ -int softing_netdev_rx(struct net_device *netdev, const struct can_frame *msg, - ktime_t ktime) -{ - struct sk_buff *skb; - struct can_frame *cf; - - skb = alloc_can_skb(netdev, &cf); - if (!skb) - return -ENOMEM; - memcpy(cf, msg, sizeof(*msg)); - skb->tstamp = ktime; - return netif_rx(skb); -} - -/* - * softing_handle_1 - * pop 1 entry from the DPRAM queue, and process - */ -static int softing_handle_1(struct softing *card) -{ - struct net_device *netdev; - struct softing_priv *priv; - ktime_t ktime; - struct can_frame msg; - int cnt = 0, lost_msg; - uint8_t fifo_rd, fifo_wr, cmd; - uint8_t *ptr; - uint32_t tmp_u32; - uint8_t buf[DPRAM_RX_SIZE]; - - memset(&msg, 0, sizeof(msg)); - /* test for lost msgs */ - lost_msg = ioread8(&card->dpram[DPRAM_RX_LOST]); - if (lost_msg) { - int j; - /* reset condition */ - iowrite8(0, &card->dpram[DPRAM_RX_LOST]); - /* prepare msg */ - msg.can_id = CAN_ERR_FLAG | CAN_ERR_CRTL; - msg.can_dlc = CAN_ERR_DLC; - msg.data[1] = CAN_ERR_CRTL_RX_OVERFLOW; - /* - * service to all busses, we don't know which it was applicable - * but only service busses that are online - */ - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - netdev = card->net[j]; - if (!netdev) - continue; - if (!canif_is_active(netdev)) - /* a dead bus has no overflows */ - continue; - ++netdev->stats.rx_over_errors; - softing_netdev_rx(netdev, &msg, ktime_set(0, 0)); - } - /* prepare for other use */ - memset(&msg, 0, sizeof(msg)); - ++cnt; - } - - fifo_rd = ioread8(&card->dpram[DPRAM_RX_RD]); - fifo_wr = ioread8(&card->dpram[DPRAM_RX_WR]); - - if (++fifo_rd >= DPRAM_RX_CNT) - fifo_rd = 0; - if (fifo_wr == fifo_rd) - return cnt; - - memcpy_fromio(buf, &card->dpram[DPRAM_RX + DPRAM_RX_SIZE*fifo_rd], - DPRAM_RX_SIZE); - mb(); - /* trigger dual port RAM */ - iowrite8(fifo_rd, &card->dpram[DPRAM_RX_RD]); - - ptr = buf; - cmd = *ptr++; - if (cmd == 0xff) - /* not quite usefull, probably the card has got out */ - return 0; - netdev = card->net[0]; - if (cmd & CMD_BUS2) - netdev = card->net[1]; - priv = netdev_priv(netdev); - - if (cmd & CMD_ERR) { - uint8_t can_state, state; - - state = *ptr++; - - msg.can_id = CAN_ERR_FLAG; - msg.can_dlc = CAN_ERR_DLC; - - if (state & SF_MASK_BUSOFF) { - can_state = CAN_STATE_BUS_OFF; - msg.can_id |= CAN_ERR_BUSOFF; - state = STATE_BUSOFF; - } else if (state & SF_MASK_EPASSIVE) { - can_state = CAN_STATE_ERROR_PASSIVE; - msg.can_id |= CAN_ERR_CRTL; - msg.data[1] = CAN_ERR_CRTL_TX_PASSIVE; - state = STATE_EPASSIVE; - } else { - can_state = CAN_STATE_ERROR_ACTIVE; - msg.can_id |= CAN_ERR_CRTL; - state = STATE_EACTIVE; - } - /* update DPRAM */ - iowrite8(state, &card->dpram[priv->index ? - DPRAM_INFO_BUSSTATE2 : DPRAM_INFO_BUSSTATE]); - /* timestamp */ - tmp_u32 = le32_to_cpup((void *)ptr); - ptr += 4; - ktime = softing_raw2ktime(card, tmp_u32); - - ++netdev->stats.rx_errors; - /* update internal status */ - if (can_state != priv->can.state) { - priv->can.state = can_state; - if (can_state == CAN_STATE_ERROR_PASSIVE) - ++priv->can.can_stats.error_passive; - else if (can_state == CAN_STATE_BUS_OFF) { - /* this calls can_close_cleanup() */ - can_bus_off(netdev); - netif_stop_queue(netdev); - } - /* trigger socketcan */ - softing_netdev_rx(netdev, &msg, ktime); - } - - } else { - if (cmd & CMD_RTR) - msg.can_id |= CAN_RTR_FLAG; - msg.can_dlc = get_can_dlc(*ptr++); - if (cmd & CMD_XTD) { - msg.can_id |= CAN_EFF_FLAG; - msg.can_id |= le32_to_cpup((void *)ptr); - ptr += 4; - } else { - msg.can_id |= le16_to_cpup((void *)ptr); - ptr += 2; - } - /* timestamp */ - tmp_u32 = le32_to_cpup((void *)ptr); - ptr += 4; - ktime = softing_raw2ktime(card, tmp_u32); - if (!(msg.can_id & CAN_RTR_FLAG)) - memcpy(&msg.data[0], ptr, 8); - ptr += 8; - /* update socket */ - if (cmd & CMD_ACK) { - /* acknowledge, was tx msg */ - struct sk_buff *skb; - skb = priv->can.echo_skb[priv->tx.echo_get]; - if (skb) - skb->tstamp = ktime; - can_get_echo_skb(netdev, priv->tx.echo_get); - ++priv->tx.echo_get; - if (priv->tx.echo_get >= TX_ECHO_SKB_MAX) - priv->tx.echo_get = 0; - if (priv->tx.pending) - --priv->tx.pending; - if (card->tx.pending) - --card->tx.pending; - ++netdev->stats.tx_packets; - if (!(msg.can_id & CAN_RTR_FLAG)) - netdev->stats.tx_bytes += msg.can_dlc; - } else { - int ret; - - ret = softing_netdev_rx(netdev, &msg, ktime); - if (ret == NET_RX_SUCCESS) { - ++netdev->stats.rx_packets; - if (!(msg.can_id & CAN_RTR_FLAG)) - netdev->stats.rx_bytes += msg.can_dlc; - } else { - ++netdev->stats.rx_dropped; - } - } - } - ++cnt; - return cnt; -} - -/* - * real interrupt handler - */ -static irqreturn_t softing_irq_thread(int irq, void *dev_id) -{ - struct softing *card = (struct softing *)dev_id; - struct net_device *netdev; - struct softing_priv *priv; - int j, offset, work_done; - - work_done = 0; - spin_lock_bh(&card->spin); - while (softing_handle_1(card) > 0) { - ++card->irq.svc_count; - ++work_done; - } - spin_unlock_bh(&card->spin); - /* resume tx queue's */ - offset = card->tx.last_bus; - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - if (card->tx.pending >= TXMAX) - break; - netdev = card->net[(j + offset + 1) % card->pdat->nbus]; - if (!netdev) - continue; - priv = netdev_priv(netdev); - if (!canif_is_active(netdev)) - /* it makes no sense to wake dead busses */ - continue; - if (priv->tx.pending >= TX_ECHO_SKB_MAX) - continue; - ++work_done; - netif_wake_queue(netdev); - } - return work_done ? IRQ_HANDLED : IRQ_NONE; -} - -/* - * interrupt routines: - * schedule the 'real interrupt handler' - */ -static irqreturn_t softing_irq_v2(int irq, void *dev_id) -{ - struct softing *card = (struct softing *)dev_id; - uint8_t ir; - - ir = ioread8(&card->dpram[DPRAM_V2_IRQ_TOHOST]); - iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]); - return (1 == ir) ? IRQ_WAKE_THREAD : IRQ_NONE; -} - -static irqreturn_t softing_irq_v1(int irq, void *dev_id) -{ - struct softing *card = (struct softing *)dev_id; - uint8_t ir; - - ir = ioread8(&card->dpram[DPRAM_IRQ_TOHOST]); - iowrite8(0, &card->dpram[DPRAM_IRQ_TOHOST]); - return ir ? IRQ_WAKE_THREAD : IRQ_NONE; -} - -/* - * netdev/candev inter-operability - */ -static int softing_netdev_open(struct net_device *ndev) -{ - int ret; - - /* check or determine and set bittime */ - ret = open_candev(ndev); - if (!ret) - ret = softing_startstop(ndev, 1); - return ret; -} - -static int softing_netdev_stop(struct net_device *ndev) -{ - int ret; - - netif_stop_queue(ndev); - - /* softing cycle does close_candev() */ - ret = softing_startstop(ndev, 0); - return ret; -} - -static int softing_candev_set_mode(struct net_device *ndev, enum can_mode mode) -{ - int ret; - - switch (mode) { - case CAN_MODE_START: - /* softing_startstop does close_candev() */ - ret = softing_startstop(ndev, 1); - return ret; - case CAN_MODE_STOP: - case CAN_MODE_SLEEP: - return -EOPNOTSUPP; - } - return 0; -} - -/* - * Softing device management helpers - */ -int softing_enable_irq(struct softing *card, int enable) -{ - int ret; - - if (!card->irq.nr) { - return 0; - } else if (card->irq.requested && !enable) { - free_irq(card->irq.nr, card); - card->irq.requested = 0; - } else if (!card->irq.requested && enable) { - ret = request_threaded_irq(card->irq.nr, - (card->pdat->generation >= 2) ? - softing_irq_v2 : softing_irq_v1, - softing_irq_thread, IRQF_SHARED, - dev_name(&card->pdev->dev), card); - if (ret) { - dev_alert(&card->pdev->dev, - "request_threaded_irq(%u) failed\n", - card->irq.nr); - return ret; - } - card->irq.requested = 1; - } - return 0; -} - -static void softing_card_shutdown(struct softing *card) -{ - int fw_up = 0; - - if (mutex_lock_interruptible(&card->fw.lock)) - /* return -ERESTARTSYS */; - fw_up = card->fw.up; - card->fw.up = 0; - - if (card->irq.requested && card->irq.nr) { - free_irq(card->irq.nr, card); - card->irq.requested = 0; - } - if (fw_up) { - if (card->pdat->enable_irq) - card->pdat->enable_irq(card->pdev, 0); - softing_set_reset_dpram(card); - if (card->pdat->reset) - card->pdat->reset(card->pdev, 1); - } - mutex_unlock(&card->fw.lock); -} - -static __devinit int softing_card_boot(struct softing *card) -{ - int ret, j; - static const uint8_t stream[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, }; - unsigned char back[sizeof(stream)]; - - if (mutex_lock_interruptible(&card->fw.lock)) - return -ERESTARTSYS; - if (card->fw.up) { - mutex_unlock(&card->fw.lock); - return 0; - } - /* reset board */ - if (card->pdat->enable_irq) - card->pdat->enable_irq(card->pdev, 1); - /* boot card */ - softing_set_reset_dpram(card); - if (card->pdat->reset) - card->pdat->reset(card->pdev, 1); - for (j = 0; (j + sizeof(stream)) < card->dpram_size; - j += sizeof(stream)) { - - memcpy_toio(&card->dpram[j], stream, sizeof(stream)); - /* flush IO cache */ - mb(); - memcpy_fromio(back, &card->dpram[j], sizeof(stream)); - - if (!memcmp(back, stream, sizeof(stream))) - continue; - /* memory is not equal */ - dev_alert(&card->pdev->dev, "dpram failed at 0x%04x\n", j); - ret = -EIO; - goto failed; - } - wmb(); - /* load boot firmware */ - ret = softing_load_fw(card->pdat->boot.fw, card, card->dpram, - card->dpram_size, - card->pdat->boot.offs - card->pdat->boot.addr); - if (ret < 0) - goto failed; - /* load loader firmware */ - ret = softing_load_fw(card->pdat->load.fw, card, card->dpram, - card->dpram_size, - card->pdat->load.offs - card->pdat->load.addr); - if (ret < 0) - goto failed; - - if (card->pdat->reset) - card->pdat->reset(card->pdev, 0); - softing_clr_reset_dpram(card); - ret = softing_bootloader_command(card, 0, "card boot"); - if (ret < 0) - goto failed; - ret = softing_load_app_fw(card->pdat->app.fw, card); - if (ret < 0) - goto failed; - - ret = softing_chip_poweron(card); - if (ret < 0) - goto failed; - - card->fw.up = 1; - mutex_unlock(&card->fw.lock); - return 0; -failed: - card->fw.up = 0; - if (card->pdat->enable_irq) - card->pdat->enable_irq(card->pdev, 0); - softing_set_reset_dpram(card); - if (card->pdat->reset) - card->pdat->reset(card->pdev, 1); - mutex_unlock(&card->fw.lock); - return ret; -} - -/* - * netdev sysfs - */ -static ssize_t show_channel(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct net_device *ndev = to_net_dev(dev); - struct softing_priv *priv = netdev2softing(ndev); - - return sprintf(buf, "%i\n", priv->index); -} - -static ssize_t show_chip(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct net_device *ndev = to_net_dev(dev); - struct softing_priv *priv = netdev2softing(ndev); - - return sprintf(buf, "%i\n", priv->chip); -} - -static ssize_t show_output(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct net_device *ndev = to_net_dev(dev); - struct softing_priv *priv = netdev2softing(ndev); - - return sprintf(buf, "0x%02x\n", priv->output); -} - -static ssize_t store_output(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - struct net_device *ndev = to_net_dev(dev); - struct softing_priv *priv = netdev2softing(ndev); - struct softing *card = priv->card; - unsigned long val; - int ret; - - ret = strict_strtoul(buf, 0, &val); - if (ret < 0) - return ret; - val &= 0xFF; - - ret = mutex_lock_interruptible(&card->fw.lock); - if (ret) - return -ERESTARTSYS; - if (netif_running(ndev)) { - mutex_unlock(&card->fw.lock); - return -EBUSY; - } - priv->output = val; - mutex_unlock(&card->fw.lock); - return count; -} - -static const DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL); -static const DEVICE_ATTR(chip, S_IRUGO, show_chip, NULL); -static const DEVICE_ATTR(output, S_IRUGO | S_IWUSR, show_output, store_output); - -static const struct attribute *const netdev_sysfs_attrs[] = { - &dev_attr_channel.attr, - &dev_attr_chip.attr, - &dev_attr_output.attr, - NULL, -}; -static const struct attribute_group netdev_sysfs_group = { - .name = NULL, - .attrs = (struct attribute **)netdev_sysfs_attrs, -}; - -static const struct net_device_ops softing_netdev_ops = { - .ndo_open = softing_netdev_open, - .ndo_stop = softing_netdev_stop, - .ndo_start_xmit = softing_netdev_start_xmit, -}; - -static const struct can_bittiming_const softing_btr_const = { - .tseg1_min = 1, - .tseg1_max = 16, - .tseg2_min = 1, - .tseg2_max = 8, - .sjw_max = 4, /* overruled */ - .brp_min = 1, - .brp_max = 32, /* overruled */ - .brp_inc = 1, -}; - - -static __devinit struct net_device *softing_netdev_create(struct softing *card, - uint16_t chip_id) -{ - struct net_device *netdev; - struct softing_priv *priv; - - netdev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX); - if (!netdev) { - dev_alert(&card->pdev->dev, "alloc_candev failed\n"); - return NULL; - } - priv = netdev_priv(netdev); - priv->netdev = netdev; - priv->card = card; - memcpy(&priv->btr_const, &softing_btr_const, sizeof(priv->btr_const)); - priv->btr_const.brp_max = card->pdat->max_brp; - priv->btr_const.sjw_max = card->pdat->max_sjw; - priv->can.bittiming_const = &priv->btr_const; - priv->can.clock.freq = 8000000; - priv->chip = chip_id; - priv->output = softing_default_output(netdev); - SET_NETDEV_DEV(netdev, &card->pdev->dev); - - netdev->flags |= IFF_ECHO; - netdev->netdev_ops = &softing_netdev_ops; - priv->can.do_set_mode = softing_candev_set_mode; - priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; - - return netdev; -} - -static __devinit int softing_netdev_register(struct net_device *netdev) -{ - int ret; - - netdev->sysfs_groups[0] = &netdev_sysfs_group; - ret = register_candev(netdev); - if (ret) { - dev_alert(&netdev->dev, "register failed\n"); - return ret; - } - return 0; -} - -static void softing_netdev_cleanup(struct net_device *netdev) -{ - unregister_candev(netdev); - free_candev(netdev); -} - -/* - * sysfs for Platform device - */ -#define DEV_ATTR_RO(name, member) \ -static ssize_t show_##name(struct device *dev, \ - struct device_attribute *attr, char *buf) \ -{ \ - struct softing *card = platform_get_drvdata(to_platform_device(dev)); \ - return sprintf(buf, "%u\n", card->member); \ -} \ -static DEVICE_ATTR(name, 0444, show_##name, NULL) - -#define DEV_ATTR_RO_STR(name, member) \ -static ssize_t show_##name(struct device *dev, \ - struct device_attribute *attr, char *buf) \ -{ \ - struct softing *card = platform_get_drvdata(to_platform_device(dev)); \ - return sprintf(buf, "%s\n", card->member); \ -} \ -static DEVICE_ATTR(name, 0444, show_##name, NULL) - -DEV_ATTR_RO(serial, id.serial); -DEV_ATTR_RO_STR(firmware, pdat->app.fw); -DEV_ATTR_RO(firmware_version, id.fw_version); -DEV_ATTR_RO_STR(hardware, pdat->name); -DEV_ATTR_RO(hardware_version, id.hw_version); -DEV_ATTR_RO(license, id.license); -DEV_ATTR_RO(frequency, id.freq); -DEV_ATTR_RO(txpending, tx.pending); - -static struct attribute *softing_pdev_attrs[] = { - &dev_attr_serial.attr, - &dev_attr_firmware.attr, - &dev_attr_firmware_version.attr, - &dev_attr_hardware.attr, - &dev_attr_hardware_version.attr, - &dev_attr_license.attr, - &dev_attr_frequency.attr, - &dev_attr_txpending.attr, - NULL, -}; - -static const struct attribute_group softing_pdev_group = { - .name = NULL, - .attrs = softing_pdev_attrs, -}; - -/* - * platform driver - */ -static __devexit int softing_pdev_remove(struct platform_device *pdev) -{ - struct softing *card = platform_get_drvdata(pdev); - int j; - - /* first, disable card*/ - softing_card_shutdown(card); - - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - if (!card->net[j]) - continue; - softing_netdev_cleanup(card->net[j]); - card->net[j] = NULL; - } - sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group); - - iounmap(card->dpram); - kfree(card); - return 0; -} - -static __devinit int softing_pdev_probe(struct platform_device *pdev) -{ - const struct softing_platform_data *pdat = pdev->dev.platform_data; - struct softing *card; - struct net_device *netdev; - struct softing_priv *priv; - struct resource *pres; - int ret; - int j; - - if (!pdat) { - dev_warn(&pdev->dev, "no platform data\n"); - return -EINVAL; - } - if (pdat->nbus > ARRAY_SIZE(card->net)) { - dev_warn(&pdev->dev, "%u nets??\n", pdat->nbus); - return -EINVAL; - } - - card = kzalloc(sizeof(*card), GFP_KERNEL); - if (!card) - return -ENOMEM; - card->pdat = pdat; - card->pdev = pdev; - platform_set_drvdata(pdev, card); - mutex_init(&card->fw.lock); - spin_lock_init(&card->spin); - - ret = -EINVAL; - pres = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!pres) - goto platform_resource_failed;; - card->dpram_phys = pres->start; - card->dpram_size = pres->end - pres->start + 1; - card->dpram = ioremap_nocache(card->dpram_phys, card->dpram_size); - if (!card->dpram) { - dev_alert(&card->pdev->dev, "dpram ioremap failed\n"); - goto ioremap_failed; - } - - pres = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (pres) - card->irq.nr = pres->start; - - /* reset card */ - ret = softing_card_boot(card); - if (ret < 0) { - dev_alert(&pdev->dev, "failed to boot\n"); - goto boot_failed; - } - - /* only now, the chip's are known */ - card->id.freq = card->pdat->freq; - - ret = sysfs_create_group(&pdev->dev.kobj, &softing_pdev_group); - if (ret < 0) { - dev_alert(&card->pdev->dev, "sysfs failed\n"); - goto sysfs_failed; - } - - ret = -ENOMEM; - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - card->net[j] = netdev = - softing_netdev_create(card, card->id.chip[j]); - if (!netdev) { - dev_alert(&pdev->dev, "failed to make can[%i]", j); - goto netdev_failed; - } - priv = netdev_priv(card->net[j]); - priv->index = j; - ret = softing_netdev_register(netdev); - if (ret) { - free_candev(netdev); - card->net[j] = NULL; - dev_alert(&card->pdev->dev, - "failed to register can[%i]\n", j); - goto netdev_failed; - } - } - dev_info(&card->pdev->dev, "%s ready.\n", card->pdat->name); - return 0; - -netdev_failed: - for (j = 0; j < ARRAY_SIZE(card->net); ++j) { - if (!card->net[j]) - continue; - softing_netdev_cleanup(card->net[j]); - } - sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group); -sysfs_failed: - softing_card_shutdown(card); -boot_failed: - iounmap(card->dpram); -ioremap_failed: -platform_resource_failed: - kfree(card); - return ret; -} - -static struct platform_driver softing_driver = { - .driver = { - .name = "softing", - .owner = THIS_MODULE, - }, - .probe = softing_pdev_probe, - .remove = __devexit_p(softing_pdev_remove), -}; - -MODULE_ALIAS("platform:softing"); - -static int __init softing_start(void) -{ - return platform_driver_register(&softing_driver); -} - -static void __exit softing_stop(void) -{ - platform_driver_unregister(&softing_driver); -} - -module_init(softing_start); -module_exit(softing_stop); - -MODULE_DESCRIPTION("Softing DPRAM CAN driver"); -MODULE_AUTHOR("Kurt Van Dijck "); -MODULE_LICENSE("GPL v2"); diff --git a/trunk/drivers/net/can/softing/softing_platform.h b/trunk/drivers/net/can/softing/softing_platform.h deleted file mode 100644 index ebbf69815623..000000000000 --- a/trunk/drivers/net/can/softing/softing_platform.h +++ /dev/null @@ -1,40 +0,0 @@ - -#include - -#ifndef _SOFTING_DEVICE_H_ -#define _SOFTING_DEVICE_H_ - -/* softing firmware directory prefix */ -#define fw_dir "softing-4.6/" - -struct softing_platform_data { - unsigned int manf; - unsigned int prod; - /* - * generation - * 1st with NEC or SJA1000 - * 8bit, exclusive interrupt, ... - * 2nd only SJA1000 - * 16bit, shared interrupt - */ - int generation; - int nbus; /* # busses on device */ - unsigned int freq; /* operating frequency in Hz */ - unsigned int max_brp; - unsigned int max_sjw; - unsigned long dpram_size; - const char *name; - struct { - unsigned long offs; - unsigned long addr; - const char *fw; - } boot, load, app; - /* - * reset() function - * bring pdev in or out of reset, depending on value - */ - int (*reset)(struct platform_device *pdev, int value); - int (*enable_irq)(struct platform_device *pdev, int value); -}; - -#endif diff --git a/trunk/drivers/net/cnic.c b/trunk/drivers/net/cnic.c index 7ff170cbc7dc..263a2944566f 100644 --- a/trunk/drivers/net/cnic.c +++ b/trunk/drivers/net/cnic.c @@ -699,13 +699,13 @@ static void cnic_free_dma(struct cnic_dev *dev, struct cnic_dma *dma) static void cnic_setup_page_tbl(struct cnic_dev *dev, struct cnic_dma *dma) { int i; - __le32 *page_table = (__le32 *) dma->pgtbl; + u32 *page_table = dma->pgtbl; for (i = 0; i < dma->num_pages; i++) { /* Each entry needs to be in big endian format. */ - *page_table = cpu_to_le32((u64) dma->pg_map_arr[i] >> 32); + *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); page_table++; - *page_table = cpu_to_le32(dma->pg_map_arr[i] & 0xffffffff); + *page_table = (u32) dma->pg_map_arr[i]; page_table++; } } @@ -713,13 +713,13 @@ static void cnic_setup_page_tbl(struct cnic_dev *dev, struct cnic_dma *dma) static void cnic_setup_page_tbl_le(struct cnic_dev *dev, struct cnic_dma *dma) { int i; - __le32 *page_table = (__le32 *) dma->pgtbl; + u32 *page_table = dma->pgtbl; for (i = 0; i < dma->num_pages; i++) { /* Each entry needs to be in little endian format. */ - *page_table = cpu_to_le32(dma->pg_map_arr[i] & 0xffffffff); + *page_table = dma->pg_map_arr[i] & 0xffffffff; page_table++; - *page_table = cpu_to_le32((u64) dma->pg_map_arr[i] >> 32); + *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); page_table++; } } diff --git a/trunk/drivers/net/cxgb4/cxgb4_main.c b/trunk/drivers/net/cxgb4/cxgb4_main.c index ec35d458102c..059c1eec8c3f 100644 --- a/trunk/drivers/net/cxgb4/cxgb4_main.c +++ b/trunk/drivers/net/cxgb4/cxgb4_main.c @@ -2710,8 +2710,6 @@ static int cxgb_open(struct net_device *dev) struct port_info *pi = netdev_priv(dev); struct adapter *adapter = pi->adapter; - netif_carrier_off(dev); - if (!(adapter->flags & FULL_INIT_DONE)) { err = cxgb_up(adapter); if (err < 0) @@ -3663,6 +3661,7 @@ static int __devinit init_one(struct pci_dev *pdev, pi->xact_addr_filt = -1; pi->rx_offload = RX_CSO; pi->port_id = i; + netif_carrier_off(netdev); netdev->irq = pdev->irq; netdev->features |= NETIF_F_SG | TSO_FLAGS; diff --git a/trunk/drivers/net/pch_gbe/pch_gbe_main.c b/trunk/drivers/net/pch_gbe/pch_gbe_main.c index 1bf12339441b..d7355306a738 100644 --- a/trunk/drivers/net/pch_gbe/pch_gbe_main.c +++ b/trunk/drivers/net/pch_gbe/pch_gbe_main.c @@ -2247,7 +2247,7 @@ static void pch_gbe_remove(struct pci_dev *pdev) struct net_device *netdev = pci_get_drvdata(pdev); struct pch_gbe_adapter *adapter = netdev_priv(netdev); - cancel_work_sync(&adapter->reset_task); + flush_scheduled_work(); unregister_netdev(netdev); pch_gbe_hal_phy_hw_reset(&adapter->hw); diff --git a/trunk/drivers/net/tg3.c b/trunk/drivers/net/tg3.c index 93b32d366611..7841a8f69998 100644 --- a/trunk/drivers/net/tg3.c +++ b/trunk/drivers/net/tg3.c @@ -60,6 +60,12 @@ #define BAR_0 0 #define BAR_2 2 +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +#define TG3_VLAN_TAG_USED 1 +#else +#define TG3_VLAN_TAG_USED 0 +#endif + #include "tg3.h" #define DRV_MODULE_NAME "tg3" @@ -128,6 +134,9 @@ TG3_TX_RING_SIZE) #define NEXT_TX(N) (((N) + 1) & (TG3_TX_RING_SIZE - 1)) +#define TG3_RX_DMA_ALIGN 16 +#define TG3_RX_HEADROOM ALIGN(VLAN_HLEN, TG3_RX_DMA_ALIGN) + #define TG3_DMA_BYTE_ENAB 64 #define TG3_RX_STD_DMA_SZ 1536 @@ -4713,6 +4722,8 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) struct sk_buff *skb; dma_addr_t dma_addr; u32 opaque_key, desc_idx, *post_ptr; + bool hw_vlan __maybe_unused = false; + u16 vtag __maybe_unused = 0; desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK; opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK; @@ -4771,12 +4782,12 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) tg3_recycle_rx(tnapi, tpr, opaque_key, desc_idx, *post_ptr); - copy_skb = netdev_alloc_skb(tp->dev, len + + copy_skb = netdev_alloc_skb(tp->dev, len + VLAN_HLEN + TG3_RAW_IP_ALIGN); if (copy_skb == NULL) goto drop_it_no_recycle; - skb_reserve(copy_skb, TG3_RAW_IP_ALIGN); + skb_reserve(copy_skb, TG3_RAW_IP_ALIGN + VLAN_HLEN); skb_put(copy_skb, len); pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE); skb_copy_from_linear_data(skb, copy_skb->data, len); @@ -4803,11 +4814,30 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) } if (desc->type_flags & RXD_FLAG_VLAN && - !(tp->rx_mode & RX_MODE_KEEP_VLAN_TAG)) - __vlan_hwaccel_put_tag(skb, - desc->err_vlan & RXD_VLAN_MASK); + !(tp->rx_mode & RX_MODE_KEEP_VLAN_TAG)) { + vtag = desc->err_vlan & RXD_VLAN_MASK; +#if TG3_VLAN_TAG_USED + if (tp->vlgrp) + hw_vlan = true; + else +#endif + { + struct vlan_ethhdr *ve = (struct vlan_ethhdr *) + __skb_push(skb, VLAN_HLEN); + + memmove(ve, skb->data + VLAN_HLEN, + ETH_ALEN * 2); + ve->h_vlan_proto = htons(ETH_P_8021Q); + ve->h_vlan_TCI = htons(vtag); + } + } - napi_gro_receive(&tnapi->napi, skb); +#if TG3_VLAN_TAG_USED + if (hw_vlan) + vlan_gro_receive(&tnapi->napi, tp->vlgrp, vtag, skb); + else +#endif + napi_gro_receive(&tnapi->napi, skb); received++; budget--; @@ -5710,9 +5740,11 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, base_flags |= TXD_FLAG_TCPUDP_CSUM; } +#if TG3_VLAN_TAG_USED if (vlan_tx_tag_present(skb)) base_flags |= (TXD_FLAG_VLAN | (vlan_tx_tag_get(skb) << 16)); +#endif len = skb_headlen(skb); @@ -5954,10 +5986,11 @@ static netdev_tx_t tg3_start_xmit_dma_bug(struct sk_buff *skb, } } } - +#if TG3_VLAN_TAG_USED if (vlan_tx_tag_present(skb)) base_flags |= (TXD_FLAG_VLAN | (vlan_tx_tag_get(skb) << 16)); +#endif if ((tp->tg3_flags3 & TG3_FLG3_USE_JUMBO_BDFLAG) && !mss && skb->len > VLAN_ETH_FRAME_LEN) @@ -9499,10 +9532,17 @@ static void __tg3_set_rx_mode(struct net_device *dev) rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC | RX_MODE_KEEP_VLAN_TAG); -#if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE) /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG * flag clear. */ +#if TG3_VLAN_TAG_USED + if (!tp->vlgrp && + !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) + rx_mode |= RX_MODE_KEEP_VLAN_TAG; +#else + /* By definition, VLAN is disabled always in this + * case. + */ if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) rx_mode |= RX_MODE_KEEP_VLAN_TAG; #endif @@ -11190,6 +11230,31 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return -EOPNOTSUPP; } +#if TG3_VLAN_TAG_USED +static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) +{ + struct tg3 *tp = netdev_priv(dev); + + if (!netif_running(dev)) { + tp->vlgrp = grp; + return; + } + + tg3_netif_stop(tp); + + tg3_full_lock(tp, 0); + + tp->vlgrp = grp; + + /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */ + __tg3_set_rx_mode(dev); + + tg3_netif_start(tp); + + tg3_full_unlock(tp); +} +#endif + static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) { struct tg3 *tp = netdev_priv(dev); @@ -13001,7 +13066,9 @@ static struct pci_dev * __devinit tg3_find_peer(struct tg3 *); static void inline vlan_features_add(struct net_device *dev, unsigned long flags) { +#if TG3_VLAN_TAG_USED dev->vlan_features |= flags; +#endif } static inline u32 tg3_rx_ret_ring_size(struct tg3 *tp) @@ -13794,11 +13861,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) else tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES; - tp->rx_offset = NET_IP_ALIGN; + tp->rx_offset = NET_IP_ALIGN + TG3_RX_HEADROOM; tp->rx_copy_thresh = TG3_RX_COPY_THRESHOLD; if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 && (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) { - tp->rx_offset = 0; + tp->rx_offset -= NET_IP_ALIGN; #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS tp->rx_copy_thresh = ~(u16)0; #endif @@ -14562,6 +14629,9 @@ static const struct net_device_ops tg3_netdev_ops = { .ndo_do_ioctl = tg3_ioctl, .ndo_tx_timeout = tg3_tx_timeout, .ndo_change_mtu = tg3_change_mtu, +#if TG3_VLAN_TAG_USED + .ndo_vlan_rx_register = tg3_vlan_rx_register, +#endif #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = tg3_poll_controller, #endif @@ -14578,6 +14648,9 @@ static const struct net_device_ops tg3_netdev_ops_dma_bug = { .ndo_do_ioctl = tg3_ioctl, .ndo_tx_timeout = tg3_tx_timeout, .ndo_change_mtu = tg3_change_mtu, +#if TG3_VLAN_TAG_USED + .ndo_vlan_rx_register = tg3_vlan_rx_register, +#endif #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = tg3_poll_controller, #endif @@ -14627,7 +14700,9 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, SET_NETDEV_DEV(dev, &pdev->dev); +#if TG3_VLAN_TAG_USED dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; +#endif tp = netdev_priv(dev); tp->pdev = pdev; diff --git a/trunk/drivers/net/tg3.h b/trunk/drivers/net/tg3.h index f528243e1a4f..d62c8d937c82 100644 --- a/trunk/drivers/net/tg3.h +++ b/trunk/drivers/net/tg3.h @@ -2808,6 +2808,9 @@ struct tg3 { u32 rx_std_max_post; u32 rx_offset; u32 rx_pkt_map_sz; +#if TG3_VLAN_TAG_USED + struct vlan_group *vlgrp; +#endif /* begin "everything else" cacheline(s) section */ diff --git a/trunk/drivers/net/usb/kaweth.c b/trunk/drivers/net/usb/kaweth.c index 7dc84971f26f..5e98643a4a21 100644 --- a/trunk/drivers/net/usb/kaweth.c +++ b/trunk/drivers/net/usb/kaweth.c @@ -406,7 +406,6 @@ static int kaweth_download_firmware(struct kaweth_device *kaweth, if (fw->size > KAWETH_FIRMWARE_BUF_SIZE) { err("Firmware too big: %zu", fw->size); - release_firmware(fw); return -ENOSPC; } data_len = fw->size; diff --git a/trunk/drivers/net/wireless/ath/ath9k/hw.c b/trunk/drivers/net/wireless/ath/ath9k/hw.c index 9f01e50d5cda..1afb8bb85756 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/hw.c +++ b/trunk/drivers/net/wireless/ath/ath9k/hw.c @@ -369,9 +369,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) else ah->config.ht_enable = 0; - /* PAPRD needs some more work to be enabled */ - ah->config.paprd_disable = 1; - ah->config.rx_intr_mitigation = true; ah->config.pcieSerDesWrite = true; @@ -1936,8 +1933,7 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) pCap->rx_status_len = sizeof(struct ar9003_rxs); pCap->tx_desc_len = sizeof(struct ar9003_txc); pCap->txs_len = sizeof(struct ar9003_txs); - if (!ah->config.paprd_disable && - ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) + if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) pCap->hw_caps |= ATH9K_HW_CAP_PAPRD; } else { pCap->tx_desc_len = sizeof(struct ath_desc); diff --git a/trunk/drivers/net/wireless/ath/ath9k/hw.h b/trunk/drivers/net/wireless/ath/ath9k/hw.h index ea9fde670646..5a3dfec45e96 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/hw.h +++ b/trunk/drivers/net/wireless/ath/ath9k/hw.h @@ -225,7 +225,6 @@ struct ath9k_ops_config { u32 pcie_waen; u8 analog_shiftreg; u8 ht_enable; - u8 paprd_disable; u32 ofdm_trig_low; u32 ofdm_trig_high; u32 cck_trig_high; diff --git a/trunk/drivers/net/wireless/ath/ath9k/main.c b/trunk/drivers/net/wireless/ath/ath9k/main.c index c79c97be6cd4..f90a6ca94a76 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/main.c +++ b/trunk/drivers/net/wireless/ath/ath9k/main.c @@ -592,12 +592,14 @@ void ath9k_tasklet(unsigned long data) u32 status = sc->intrstatus; u32 rxmask; + ath9k_ps_wakeup(sc); + if (status & ATH9K_INT_FATAL) { ath_reset(sc, true); + ath9k_ps_restore(sc); return; } - ath9k_ps_wakeup(sc); spin_lock(&sc->sc_pcu_lock); if (!ath9k_hw_check_alive(ah)) @@ -967,7 +969,6 @@ int ath_reset(struct ath_softc *sc, bool retry_tx) /* Stop ANI */ del_timer_sync(&common->ani.timer); - ath9k_ps_wakeup(sc); spin_lock_bh(&sc->sc_pcu_lock); ieee80211_stop_queues(hw); @@ -1014,7 +1015,6 @@ int ath_reset(struct ath_softc *sc, bool retry_tx) /* Start ANI */ ath_start_ani(common); - ath9k_ps_restore(sc); return r; } @@ -1701,9 +1701,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) skip_chan_change: if (changed & IEEE80211_CONF_CHANGE_POWER) { sc->config.txpowlimit = 2 * conf->power_level; - ath9k_ps_wakeup(sc); ath_update_txpow(sc); - ath9k_ps_restore(sc); } spin_lock_bh(&sc->wiphy_lock); diff --git a/trunk/drivers/net/wireless/ath/ath9k/xmit.c b/trunk/drivers/net/wireless/ath/ath9k/xmit.c index 33a37edbaf79..332d1feb5c18 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/xmit.c +++ b/trunk/drivers/net/wireless/ath/ath9k/xmit.c @@ -2113,7 +2113,9 @@ static void ath_tx_complete_poll_work(struct work_struct *work) if (needreset) { ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET, "tx hung, resetting the chip\n"); + ath9k_ps_wakeup(sc); ath_reset(sc, true); + ath9k_ps_restore(sc); } ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-4965.c b/trunk/drivers/net/wireless/iwlwifi/iwl-4965.c index 91a9f5253469..3f1e5f1bf847 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-4965.c @@ -2624,7 +2624,6 @@ struct iwl_cfg iwl4965_agn_cfg = { .fw_name_pre = IWL4965_FW_PRE, .ucode_api_max = IWL4965_UCODE_API_MAX, .ucode_api_min = IWL4965_UCODE_API_MIN, - .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, .valid_tx_ant = ANT_AB, .valid_rx_ant = ANT_ABC, .eeprom_ver = EEPROM_4965_EEPROM_VERSION, diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c b/trunk/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c index 27b5a3eec9dc..14ceb4df72f6 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c @@ -152,14 +152,11 @@ int iwl_eeprom_check_sku(struct iwl_priv *priv) eeprom_sku = iwl_eeprom_query16(priv, EEPROM_SKU_CAP); - if (!priv->cfg->sku) { - /* not using sku overwrite */ - priv->cfg->sku = - ((eeprom_sku & EEPROM_SKU_CAP_BAND_SELECTION) >> + priv->cfg->sku = ((eeprom_sku & EEPROM_SKU_CAP_BAND_SELECTION) >> EEPROM_SKU_CAP_BAND_POS); - if (eeprom_sku & EEPROM_SKU_CAP_11N_ENABLE) - priv->cfg->sku |= IWL_SKU_N; - } + if (eeprom_sku & EEPROM_SKU_CAP_11N_ENABLE) + priv->cfg->sku |= IWL_SKU_N; + if (!priv->cfg->sku) { IWL_ERR(priv, "Invalid device sku\n"); return -EINVAL; diff --git a/trunk/drivers/net/wireless/rt2x00/rt73usb.c b/trunk/drivers/net/wireless/rt2x00/rt73usb.c index 029be3c6c030..0b4e8590cbb7 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt73usb.c +++ b/trunk/drivers/net/wireless/rt2x00/rt73usb.c @@ -2446,7 +2446,6 @@ static struct usb_device_id rt73usb_device_table[] = { { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) }, - { USB_DEVICE(0x0812, 0x3101), USB_DEVICE_DATA(&rt73usb_ops) }, /* Qcom */ { USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) }, diff --git a/trunk/drivers/net/wireless/rtlwifi/pci.c b/trunk/drivers/net/wireless/rtlwifi/pci.c index 1758d4463247..0fa36aa6701a 100644 --- a/trunk/drivers/net/wireless/rtlwifi/pci.c +++ b/trunk/drivers/net/wireless/rtlwifi/pci.c @@ -619,13 +619,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) struct sk_buff *uskb = NULL; u8 *pdata; uskb = dev_alloc_skb(skb->len + 128); - if (!uskb) { - RT_TRACE(rtlpriv, - (COMP_INTR | COMP_RECV), - DBG_EMERG, - ("can't alloc rx skb\n")); - goto done; - } memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status)); @@ -648,7 +641,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) new_skb = dev_alloc_skb(rtlpci->rxbuffersize); if (unlikely(!new_skb)) { RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), - DBG_EMERG, + DBG_DMESG, ("can't alloc skb for rx\n")); goto done; } @@ -1073,9 +1066,9 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw) struct sk_buff *skb = dev_alloc_skb(rtlpci->rxbuffersize); u32 bufferaddress; + entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; if (!skb) return 0; - entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; /*skb->dev = dev; */ diff --git a/trunk/drivers/parport/share.c b/trunk/drivers/parport/share.c index a848e02e6be3..a2d9d1e59260 100644 --- a/trunk/drivers/parport/share.c +++ b/trunk/drivers/parport/share.c @@ -678,7 +678,7 @@ void parport_unregister_device(struct pardevice *dev) /* Make sure we haven't left any pointers around in the wait * list. */ - spin_lock_irq(&port->waitlist_lock); + spin_lock (&port->waitlist_lock); if (dev->waitprev || dev->waitnext || port->waithead == dev) { if (dev->waitprev) dev->waitprev->waitnext = dev->waitnext; @@ -689,7 +689,7 @@ void parport_unregister_device(struct pardevice *dev) else port->waittail = dev->waitprev; } - spin_unlock_irq(&port->waitlist_lock); + spin_unlock (&port->waitlist_lock); kfree(dev->state); kfree(dev); diff --git a/trunk/drivers/pps/clients/pps-ktimer.c b/trunk/drivers/pps/clients/pps-ktimer.c index 82583b0ff82d..2728469d3884 100644 --- a/trunk/drivers/pps/clients/pps-ktimer.c +++ b/trunk/drivers/pps/clients/pps-ktimer.c @@ -46,6 +46,8 @@ static void pps_ktimer_event(unsigned long ptr) /* First of all we get the time stamp... */ pps_get_ts(&ts); + dev_info(pps->dev, "PPS event at %lu\n", jiffies); + pps_event(pps, &ts, PPS_CAPTUREASSERT, NULL); mod_timer(&ktimer, jiffies + HZ); diff --git a/trunk/drivers/pps/clients/pps_parport.c b/trunk/drivers/pps/clients/pps_parport.c index c571d6dd8f61..32221efd9ca9 100644 --- a/trunk/drivers/pps/clients/pps_parport.c +++ b/trunk/drivers/pps/clients/pps_parport.c @@ -163,7 +163,7 @@ static void parport_attach(struct parport *port) } device->pardev = parport_register_device(port, KBUILD_MODNAME, - NULL, NULL, parport_irq, PARPORT_FLAG_EXCL, device); + NULL, NULL, parport_irq, 0, device); if (!device->pardev) { pr_err("couldn't register with %s\n", port->name); goto err_free; diff --git a/trunk/drivers/pps/generators/pps_gen_parport.c b/trunk/drivers/pps/generators/pps_gen_parport.c index b93af3ebb5ba..5c32f8dacf56 100644 --- a/trunk/drivers/pps/generators/pps_gen_parport.c +++ b/trunk/drivers/pps/generators/pps_gen_parport.c @@ -198,7 +198,7 @@ static void parport_attach(struct parport *port) } device.pardev = parport_register_device(port, KBUILD_MODNAME, - NULL, NULL, NULL, PARPORT_FLAG_EXCL, &device); + NULL, NULL, NULL, 0, &device); if (!device.pardev) { pr_err("couldn't register with %s\n", port->name); return; diff --git a/trunk/drivers/staging/msm/msm_fb.c b/trunk/drivers/staging/msm/msm_fb.c index a2f29d464051..23fa049b51f2 100644 --- a/trunk/drivers/staging/msm/msm_fb.c +++ b/trunk/drivers/staging/msm/msm_fb.c @@ -347,7 +347,7 @@ static int msm_fb_suspend(struct platform_device *pdev, pm_message_t state) if ((!mfd) || (mfd->key != MFD_KEY)) return 0; - console_lock(); + acquire_console_sem(); fb_set_suspend(mfd->fbi, 1); ret = msm_fb_suspend_sub(mfd); @@ -358,7 +358,7 @@ static int msm_fb_suspend(struct platform_device *pdev, pm_message_t state) pdev->dev.power.power_state = state; } - console_unlock(); + release_console_sem(); return ret; } #else @@ -431,11 +431,11 @@ static int msm_fb_resume(struct platform_device *pdev) if ((!mfd) || (mfd->key != MFD_KEY)) return 0; - console_lock(); + acquire_console_sem(); ret = msm_fb_resume_sub(mfd); pdev->dev.power.power_state = PMSG_ON; fb_set_suspend(mfd->fbi, 1); - console_unlock(); + release_console_sem(); return ret; } diff --git a/trunk/drivers/staging/olpc_dcon/olpc_dcon.c b/trunk/drivers/staging/olpc_dcon/olpc_dcon.c index 56a283d1a74d..9f26dc9408bb 100644 --- a/trunk/drivers/staging/olpc_dcon/olpc_dcon.c +++ b/trunk/drivers/staging/olpc_dcon/olpc_dcon.c @@ -373,17 +373,17 @@ static void dcon_source_switch(struct work_struct *work) * * For now, we just hope.. */ - console_lock(); + acquire_console_sem(); ignore_fb_events = 1; if (fb_blank(fbinfo, FB_BLANK_UNBLANK)) { ignore_fb_events = 0; - console_unlock(); + release_console_sem(); printk(KERN_ERR "olpc-dcon: Failed to enter CPU mode\n"); dcon_pending = DCON_SOURCE_DCON; return; } ignore_fb_events = 0; - console_unlock(); + release_console_sem(); /* And turn off the DCON */ pdata->set_dconload(1); @@ -435,12 +435,12 @@ static void dcon_source_switch(struct work_struct *work) } } - console_lock(); + acquire_console_sem(); ignore_fb_events = 1; if (fb_blank(fbinfo, FB_BLANK_POWERDOWN)) printk(KERN_ERR "olpc-dcon: couldn't blank fb!\n"); ignore_fb_events = 0; - console_unlock(); + release_console_sem(); printk(KERN_INFO "olpc-dcon: The DCON has control\n"); break; diff --git a/trunk/drivers/staging/sm7xx/smtcfb.c b/trunk/drivers/staging/sm7xx/smtcfb.c index d007e4a12c14..0bc113c44d39 100644 --- a/trunk/drivers/staging/sm7xx/smtcfb.c +++ b/trunk/drivers/staging/sm7xx/smtcfb.c @@ -1044,9 +1044,9 @@ static int __maybe_unused smtcfb_suspend(struct pci_dev *pdev, pm_message_t msg) /* when doing suspend, call fb apis and pci apis */ if (msg.event == PM_EVENT_SUSPEND) { - console_lock(); + acquire_console_sem(); fb_set_suspend(&sfb->fb, 1); - console_unlock(); + release_console_sem(); retv = pci_save_state(pdev); pci_disable_device(pdev); retv = pci_choose_state(pdev, msg); @@ -1105,9 +1105,9 @@ static int __maybe_unused smtcfb_resume(struct pci_dev *pdev) smtcfb_setmode(sfb); - console_lock(); + acquire_console_sem(); fb_set_suspend(&sfb->fb, 0); - console_unlock(); + release_console_sem(); return 0; } diff --git a/trunk/drivers/tty/serial/sb1250-duart.c b/trunk/drivers/tty/serial/sb1250-duart.c index 602d9845c52f..a2f2b3254499 100644 --- a/trunk/drivers/tty/serial/sb1250-duart.c +++ b/trunk/drivers/tty/serial/sb1250-duart.c @@ -829,7 +829,7 @@ static void __init sbd_probe_duarts(void) #ifdef CONFIG_SERIAL_SB1250_DUART_CONSOLE /* * Serial console stuff. Very basic, polling driver for doing serial - * console output. The console_lock is held by the caller, so we + * console output. The console_sem is held by the caller, so we * shouldn't be interrupted for more console activity. */ static void sbd_console_putchar(struct uart_port *uport, int ch) diff --git a/trunk/drivers/tty/sysrq.c b/trunk/drivers/tty/sysrq.c index 8e0dd254eb11..c556ed9db13d 100644 --- a/trunk/drivers/tty/sysrq.c +++ b/trunk/drivers/tty/sysrq.c @@ -46,7 +46,7 @@ #include /* Whether we react on sysrq keys or just ignore them */ -static int __read_mostly sysrq_enabled = SYSRQ_DEFAULT_ENABLE; +static int __read_mostly sysrq_enabled = 1; static bool __read_mostly sysrq_always_enabled; static bool sysrq_on(void) diff --git a/trunk/drivers/tty/tty_io.c b/trunk/drivers/tty/tty_io.c index 6158eae0f64a..464d09d97873 100644 --- a/trunk/drivers/tty/tty_io.c +++ b/trunk/drivers/tty/tty_io.c @@ -3256,7 +3256,7 @@ static ssize_t show_cons_active(struct device *dev, struct console *c; ssize_t count = 0; - console_lock(); + acquire_console_sem(); for (c = console_drivers; c; c = c->next) { if (!c->device) continue; @@ -3271,7 +3271,7 @@ static ssize_t show_cons_active(struct device *dev, while (i--) count += sprintf(buf + count, "%s%d%c", cs[i]->name, cs[i]->index, i ? ' ':'\n'); - console_unlock(); + release_console_sem(); return count; } diff --git a/trunk/drivers/tty/vt/selection.c b/trunk/drivers/tty/vt/selection.c index c956ed6c83a3..ebae344ce910 100644 --- a/trunk/drivers/tty/vt/selection.c +++ b/trunk/drivers/tty/vt/selection.c @@ -316,9 +316,9 @@ int paste_selection(struct tty_struct *tty) /* always called with BTM from vt_ioctl */ WARN_ON(!tty_locked()); - console_lock(); + acquire_console_sem(); poke_blanked_console(); - console_unlock(); + release_console_sem(); ld = tty_ldisc_ref(tty); if (!ld) { diff --git a/trunk/drivers/tty/vt/vc_screen.c b/trunk/drivers/tty/vt/vc_screen.c index a672ed192d33..eab3a1ff99e4 100644 --- a/trunk/drivers/tty/vt/vc_screen.c +++ b/trunk/drivers/tty/vt/vc_screen.c @@ -202,7 +202,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) /* Select the proper current console and verify * sanity of the situation under the console lock. */ - console_lock(); + acquire_console_sem(); attr = (currcons & 128); currcons = (currcons & 127); @@ -336,9 +336,9 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) * the pagefault handling code may want to call printk(). */ - console_unlock(); + release_console_sem(); ret = copy_to_user(buf, con_buf_start, orig_count); - console_lock(); + acquire_console_sem(); if (ret) { read += (orig_count - ret); @@ -354,7 +354,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) if (read) ret = read; unlock_out: - console_unlock(); + release_console_sem(); mutex_unlock(&con_buf_mtx); return ret; } @@ -379,7 +379,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) /* Select the proper current console and verify * sanity of the situation under the console lock. */ - console_lock(); + acquire_console_sem(); attr = (currcons & 128); currcons = (currcons & 127); @@ -414,9 +414,9 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) /* Temporarily drop the console lock so that we can read * in the write data from userspace safely. */ - console_unlock(); + release_console_sem(); ret = copy_from_user(con_buf, buf, this_round); - console_lock(); + acquire_console_sem(); if (ret) { this_round -= ret; @@ -542,7 +542,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) vcs_scr_updated(vc); unlock_out: - console_unlock(); + release_console_sem(); mutex_unlock(&con_buf_mtx); diff --git a/trunk/drivers/tty/vt/vt.c b/trunk/drivers/tty/vt/vt.c index b230bd3f056f..76407eca9ab0 100644 --- a/trunk/drivers/tty/vt/vt.c +++ b/trunk/drivers/tty/vt/vt.c @@ -1003,9 +1003,9 @@ static int vt_resize(struct tty_struct *tty, struct winsize *ws) struct vc_data *vc = tty->driver_data; int ret; - console_lock(); + acquire_console_sem(); ret = vc_do_resize(tty, vc, ws->ws_col, ws->ws_row); - console_unlock(); + release_console_sem(); return ret; } @@ -1271,7 +1271,7 @@ static void default_attr(struct vc_data *vc) vc->vc_color = vc->vc_def_color; } -/* console_lock is held */ +/* console_sem is held */ static void csi_m(struct vc_data *vc) { int i; @@ -1415,7 +1415,7 @@ int mouse_reporting(void) return vc_cons[fg_console].d->vc_report_mouse; } -/* console_lock is held */ +/* console_sem is held */ static void set_mode(struct vc_data *vc, int on_off) { int i; @@ -1485,7 +1485,7 @@ static void set_mode(struct vc_data *vc, int on_off) } } -/* console_lock is held */ +/* console_sem is held */ static void setterm_command(struct vc_data *vc) { switch(vc->vc_par[0]) { @@ -1545,7 +1545,7 @@ static void setterm_command(struct vc_data *vc) } } -/* console_lock is held */ +/* console_sem is held */ static void csi_at(struct vc_data *vc, unsigned int nr) { if (nr > vc->vc_cols - vc->vc_x) @@ -1555,7 +1555,7 @@ static void csi_at(struct vc_data *vc, unsigned int nr) insert_char(vc, nr); } -/* console_lock is held */ +/* console_sem is held */ static void csi_L(struct vc_data *vc, unsigned int nr) { if (nr > vc->vc_rows - vc->vc_y) @@ -1566,7 +1566,7 @@ static void csi_L(struct vc_data *vc, unsigned int nr) vc->vc_need_wrap = 0; } -/* console_lock is held */ +/* console_sem is held */ static void csi_P(struct vc_data *vc, unsigned int nr) { if (nr > vc->vc_cols - vc->vc_x) @@ -1576,7 +1576,7 @@ static void csi_P(struct vc_data *vc, unsigned int nr) delete_char(vc, nr); } -/* console_lock is held */ +/* console_sem is held */ static void csi_M(struct vc_data *vc, unsigned int nr) { if (nr > vc->vc_rows - vc->vc_y) @@ -1587,7 +1587,7 @@ static void csi_M(struct vc_data *vc, unsigned int nr) vc->vc_need_wrap = 0; } -/* console_lock is held (except via vc_init->reset_terminal */ +/* console_sem is held (except via vc_init->reset_terminal */ static void save_cur(struct vc_data *vc) { vc->vc_saved_x = vc->vc_x; @@ -1603,7 +1603,7 @@ static void save_cur(struct vc_data *vc) vc->vc_saved_G1 = vc->vc_G1_charset; } -/* console_lock is held */ +/* console_sem is held */ static void restore_cur(struct vc_data *vc) { gotoxy(vc, vc->vc_saved_x, vc->vc_saved_y); @@ -1625,7 +1625,7 @@ enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd, ESpalette }; -/* console_lock is held (except via vc_init()) */ +/* console_sem is held (except via vc_init()) */ static void reset_terminal(struct vc_data *vc, int do_clear) { vc->vc_top = 0; @@ -1685,7 +1685,7 @@ static void reset_terminal(struct vc_data *vc, int do_clear) csi_J(vc, 2); } -/* console_lock is held */ +/* console_sem is held */ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) { /* @@ -2119,7 +2119,7 @@ static int is_double_width(uint32_t ucs) return bisearch(ucs, double_width, ARRAY_SIZE(double_width) - 1); } -/* acquires console_lock */ +/* acquires console_sem */ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int count) { #ifdef VT_BUF_VRAM_ONLY @@ -2147,11 +2147,11 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co might_sleep(); - console_lock(); + acquire_console_sem(); vc = tty->driver_data; if (vc == NULL) { printk(KERN_ERR "vt: argh, driver_data is NULL !\n"); - console_unlock(); + release_console_sem(); return 0; } @@ -2159,7 +2159,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co if (!vc_cons_allocated(currcons)) { /* could this happen? */ printk_once("con_write: tty %d not allocated\n", currcons+1); - console_unlock(); + release_console_sem(); return 0; } @@ -2375,7 +2375,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co } FLUSH console_conditional_schedule(); - console_unlock(); + release_console_sem(); notify_update(vc); return n; #undef FLUSH @@ -2388,11 +2388,11 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co * us to do the switches asynchronously (needed when we want * to switch due to a keyboard interrupt). Synchronization * with other console code and prevention of re-entrancy is - * ensured with console_lock. + * ensured with console_sem. */ static void console_callback(struct work_struct *ignored) { - console_lock(); + acquire_console_sem(); if (want_console >= 0) { if (want_console != fg_console && @@ -2422,7 +2422,7 @@ static void console_callback(struct work_struct *ignored) } notify_update(vc_cons[fg_console].d); - console_unlock(); + release_console_sem(); } int set_console(int nr) @@ -2603,7 +2603,7 @@ static struct console vt_console_driver = { */ /* - * Generally a bit racy with respect to console_lock();. + * Generally a bit racy with respect to console_sem(). * * There are some functions which don't need it. * @@ -2629,17 +2629,17 @@ int tioclinux(struct tty_struct *tty, unsigned long arg) switch (type) { case TIOCL_SETSEL: - console_lock(); + acquire_console_sem(); ret = set_selection((struct tiocl_selection __user *)(p+1), tty); - console_unlock(); + release_console_sem(); break; case TIOCL_PASTESEL: ret = paste_selection(tty); break; case TIOCL_UNBLANKSCREEN: - console_lock(); + acquire_console_sem(); unblank_screen(); - console_unlock(); + release_console_sem(); break; case TIOCL_SELLOADLUT: ret = sel_loadlut(p); @@ -2688,10 +2688,10 @@ int tioclinux(struct tty_struct *tty, unsigned long arg) } break; case TIOCL_BLANKSCREEN: /* until explicitly unblanked, not only poked */ - console_lock(); + acquire_console_sem(); ignore_poke = 1; do_blank_screen(0); - console_unlock(); + release_console_sem(); break; case TIOCL_BLANKEDSCREEN: ret = console_blanked; @@ -2790,11 +2790,11 @@ static void con_flush_chars(struct tty_struct *tty) return; /* if we race with con_close(), vt may be null */ - console_lock(); + acquire_console_sem(); vc = tty->driver_data; if (vc) set_cursor(vc); - console_unlock(); + release_console_sem(); } /* @@ -2805,7 +2805,7 @@ static int con_open(struct tty_struct *tty, struct file *filp) unsigned int currcons = tty->index; int ret = 0; - console_lock(); + acquire_console_sem(); if (tty->driver_data == NULL) { ret = vc_allocate(currcons); if (ret == 0) { @@ -2813,7 +2813,7 @@ static int con_open(struct tty_struct *tty, struct file *filp) /* Still being freed */ if (vc->port.tty) { - console_unlock(); + release_console_sem(); return -ERESTARTSYS; } tty->driver_data = vc; @@ -2827,11 +2827,11 @@ static int con_open(struct tty_struct *tty, struct file *filp) tty->termios->c_iflag |= IUTF8; else tty->termios->c_iflag &= ~IUTF8; - console_unlock(); + release_console_sem(); return ret; } } - console_unlock(); + release_console_sem(); return ret; } @@ -2844,9 +2844,9 @@ static void con_shutdown(struct tty_struct *tty) { struct vc_data *vc = tty->driver_data; BUG_ON(vc == NULL); - console_lock(); + acquire_console_sem(); vc->port.tty = NULL; - console_unlock(); + release_console_sem(); tty_shutdown(tty); } @@ -2893,13 +2893,13 @@ static int __init con_init(void) struct vc_data *vc; unsigned int currcons = 0, i; - console_lock(); + acquire_console_sem(); if (conswitchp) display_desc = conswitchp->con_startup(); if (!display_desc) { fg_console = 0; - console_unlock(); + release_console_sem(); return 0; } @@ -2946,7 +2946,7 @@ static int __init con_init(void) printable = 1; printk("\n"); - console_unlock(); + release_console_sem(); #ifdef CONFIG_VT_CONSOLE register_console(&vt_console_driver); @@ -3037,7 +3037,7 @@ static int bind_con_driver(const struct consw *csw, int first, int last, if (!try_module_get(owner)) return -ENODEV; - console_lock(); + acquire_console_sem(); /* check if driver is registered */ for (i = 0; i < MAX_NR_CON_DRIVER; i++) { @@ -3122,7 +3122,7 @@ static int bind_con_driver(const struct consw *csw, int first, int last, retval = 0; err: - console_unlock(); + release_console_sem(); module_put(owner); return retval; }; @@ -3171,7 +3171,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt) if (!try_module_get(owner)) return -ENODEV; - console_lock(); + acquire_console_sem(); /* check if driver is registered and if it is unbindable */ for (i = 0; i < MAX_NR_CON_DRIVER; i++) { @@ -3185,7 +3185,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt) } if (retval) { - console_unlock(); + release_console_sem(); goto err; } @@ -3204,12 +3204,12 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt) } if (retval) { - console_unlock(); + release_console_sem(); goto err; } if (!con_is_bound(csw)) { - console_unlock(); + release_console_sem(); goto err; } @@ -3238,7 +3238,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt) if (!con_is_bound(csw)) con_driver->flag &= ~CON_DRIVER_FLAG_INIT; - console_unlock(); + release_console_sem(); /* ignore return value, binding should not fail */ bind_con_driver(defcsw, first, last, deflt); err: @@ -3538,7 +3538,7 @@ int register_con_driver(const struct consw *csw, int first, int last) if (!try_module_get(owner)) return -ENODEV; - console_lock(); + acquire_console_sem(); for (i = 0; i < MAX_NR_CON_DRIVER; i++) { con_driver = ®istered_con_driver[i]; @@ -3592,7 +3592,7 @@ int register_con_driver(const struct consw *csw, int first, int last) } err: - console_unlock(); + release_console_sem(); module_put(owner); return retval; } @@ -3613,7 +3613,7 @@ int unregister_con_driver(const struct consw *csw) { int i, retval = -ENODEV; - console_lock(); + acquire_console_sem(); /* cannot unregister a bound driver */ if (con_is_bound(csw)) @@ -3639,7 +3639,7 @@ int unregister_con_driver(const struct consw *csw) } } err: - console_unlock(); + release_console_sem(); return retval; } EXPORT_SYMBOL(unregister_con_driver); @@ -3934,9 +3934,9 @@ int con_set_cmap(unsigned char __user *arg) { int rc; - console_lock(); + acquire_console_sem(); rc = set_get_cmap (arg,1); - console_unlock(); + release_console_sem(); return rc; } @@ -3945,9 +3945,9 @@ int con_get_cmap(unsigned char __user *arg) { int rc; - console_lock(); + acquire_console_sem(); rc = set_get_cmap (arg,0); - console_unlock(); + release_console_sem(); return rc; } @@ -3994,12 +3994,12 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op) } else font.data = NULL; - console_lock(); + acquire_console_sem(); if (vc->vc_sw->con_font_get) rc = vc->vc_sw->con_font_get(vc, &font); else rc = -ENOSYS; - console_unlock(); + release_console_sem(); if (rc) goto out; @@ -4076,12 +4076,12 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op) font.data = memdup_user(op->data, size); if (IS_ERR(font.data)) return PTR_ERR(font.data); - console_lock(); + acquire_console_sem(); if (vc->vc_sw->con_font_set) rc = vc->vc_sw->con_font_set(vc, &font, op->flags); else rc = -ENOSYS; - console_unlock(); + release_console_sem(); kfree(font.data); return rc; } @@ -4103,12 +4103,12 @@ static int con_font_default(struct vc_data *vc, struct console_font_op *op) else name[MAX_FONT_NAME - 1] = 0; - console_lock(); + acquire_console_sem(); if (vc->vc_sw->con_font_default) rc = vc->vc_sw->con_font_default(vc, &font, s); else rc = -ENOSYS; - console_unlock(); + release_console_sem(); if (!rc) { op->width = font.width; op->height = font.height; @@ -4124,7 +4124,7 @@ static int con_font_copy(struct vc_data *vc, struct console_font_op *op) if (vc->vc_mode != KD_TEXT) return -EINVAL; - console_lock(); + acquire_console_sem(); if (!vc->vc_sw->con_font_copy) rc = -ENOSYS; else if (con < 0 || !vc_cons_allocated(con)) @@ -4133,7 +4133,7 @@ static int con_font_copy(struct vc_data *vc, struct console_font_op *op) rc = 0; else rc = vc->vc_sw->con_font_copy(vc, con); - console_unlock(); + release_console_sem(); return rc; } diff --git a/trunk/drivers/tty/vt/vt_ioctl.c b/trunk/drivers/tty/vt/vt_ioctl.c index 1235ebda6e1c..6b68a0fb4611 100644 --- a/trunk/drivers/tty/vt/vt_ioctl.c +++ b/trunk/drivers/tty/vt/vt_ioctl.c @@ -649,12 +649,12 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, /* * explicitly blank/unblank the screen if switching modes */ - console_lock(); + acquire_console_sem(); if (arg == KD_TEXT) do_unblank_screen(1); else do_blank_screen(1); - console_unlock(); + release_console_sem(); break; case KDGETMODE: @@ -893,7 +893,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ret = -EINVAL; goto out; } - console_lock(); + acquire_console_sem(); vc->vt_mode = tmp; /* the frsig is ignored, so we set it to 0 */ vc->vt_mode.frsig = 0; @@ -901,7 +901,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, vc->vt_pid = get_pid(task_pid(current)); /* no switch is required -- saw@shade.msu.ru */ vc->vt_newvt = -1; - console_unlock(); + release_console_sem(); break; } @@ -910,9 +910,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, struct vt_mode tmp; int rc; - console_lock(); + acquire_console_sem(); memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); - console_unlock(); + release_console_sem(); rc = copy_to_user(up, &tmp, sizeof(struct vt_mode)); if (rc) @@ -965,9 +965,9 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ret = -ENXIO; else { arg--; - console_lock(); + acquire_console_sem(); ret = vc_allocate(arg); - console_unlock(); + release_console_sem(); if (ret) break; set_console(arg); @@ -990,7 +990,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ret = -ENXIO; else { vsa.console--; - console_lock(); + acquire_console_sem(); ret = vc_allocate(vsa.console); if (ret == 0) { struct vc_data *nvc; @@ -1003,7 +1003,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, put_pid(nvc->vt_pid); nvc->vt_pid = get_pid(task_pid(current)); } - console_unlock(); + release_console_sem(); if (ret) break; /* Commence switch and lock */ @@ -1044,7 +1044,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, /* * Switching-from response */ - console_lock(); + acquire_console_sem(); if (vc->vt_newvt >= 0) { if (arg == 0) /* @@ -1063,7 +1063,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, vc->vt_newvt = -1; ret = vc_allocate(newvt); if (ret) { - console_unlock(); + release_console_sem(); break; } /* @@ -1083,7 +1083,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, if (arg != VT_ACKACQ) ret = -EINVAL; } - console_unlock(); + release_console_sem(); break; /* @@ -1096,20 +1096,20 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, } if (arg == 0) { /* deallocate all unused consoles, but leave 0 */ - console_lock(); + acquire_console_sem(); for (i=1; iv_cols)) ret = -EFAULT; else { - console_lock(); + acquire_console_sem(); for (i = 0; i < MAX_NR_CONSOLES; i++) { vc = vc_cons[i].d; @@ -1135,7 +1135,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, vc_resize(vc_cons[i].d, cc, ll); } } - console_unlock(); + release_console_sem(); } break; } @@ -1187,14 +1187,14 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, for (i = 0; i < MAX_NR_CONSOLES; i++) { if (!vc_cons[i].d) continue; - console_lock(); + acquire_console_sem(); if (vlin) vc_cons[i].d->vc_scan_lines = vlin; if (clin) vc_cons[i].d->vc_font.height = clin; vc_cons[i].d->vc_resize_user = 1; vc_resize(vc_cons[i].d, cc, ll); - console_unlock(); + release_console_sem(); } break; } @@ -1367,7 +1367,7 @@ void vc_SAK(struct work_struct *work) struct vc_data *vc; struct tty_struct *tty; - console_lock(); + acquire_console_sem(); vc = vc_con->d; if (vc) { tty = vc->port.tty; @@ -1379,7 +1379,7 @@ void vc_SAK(struct work_struct *work) __do_SAK(tty); reset_vc(vc); } - console_unlock(); + release_console_sem(); } #ifdef CONFIG_COMPAT @@ -1737,10 +1737,10 @@ int vt_move_to_console(unsigned int vt, int alloc) { int prev; - console_lock(); + acquire_console_sem(); /* Graphics mode - up to X */ if (disable_vt_switch) { - console_unlock(); + release_console_sem(); return 0; } prev = fg_console; @@ -1748,7 +1748,7 @@ int vt_move_to_console(unsigned int vt, int alloc) if (alloc && vc_allocate(vt)) { /* we can't have a free VC for now. Too bad, * we don't want to mess the screen for now. */ - console_unlock(); + release_console_sem(); return -ENOSPC; } @@ -1758,10 +1758,10 @@ int vt_move_to_console(unsigned int vt, int alloc) * Let the calling function know so it can decide * what to do. */ - console_unlock(); + release_console_sem(); return -EIO; } - console_unlock(); + release_console_sem(); tty_lock(); if (vt_waitactive(vt + 1)) { pr_debug("Suspend: Can't switch VCs."); @@ -1781,8 +1781,8 @@ int vt_move_to_console(unsigned int vt, int alloc) */ void pm_set_vt_switch(int do_switch) { - console_lock(); + acquire_console_sem(); disable_vt_switch = !do_switch; - console_unlock(); + release_console_sem(); } EXPORT_SYMBOL(pm_set_vt_switch); diff --git a/trunk/drivers/video/arkfb.c b/trunk/drivers/video/arkfb.c index 391ac939f011..d583bea608fd 100644 --- a/trunk/drivers/video/arkfb.c +++ b/trunk/drivers/video/arkfb.c @@ -23,7 +23,7 @@ #include #include #include -#include /* Why should fb driver call console functions? because console_lock() */ +#include /* Why should fb driver call console functions? because acquire_console_sem() */ #include