summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* sonypi: fix ids member of struct acpi_driverEugene Teo2007-08-031-1/+6
| | | | | | | | | ids member of struct acpi_driver is of type struct acpi_device_id, not a character array. Signed-off-by: Eugene Teo <eugeneteo@kernel.sg> Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
* sony-laptop: sony_nc_ids[] can become static.Adrian Bunk2007-08-031-1/+1
| | | | | | Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
* sony-laptop: restore the last user requested brightness level on resume.Mattia Dongili2007-08-031-0/+5
| | | | | Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Len Brown <len.brown@intel.com>
* Merge git://git.infradead.org/~dwmw2/mtd-2.6.23Linus Torvalds2007-08-029-18/+45
|\ | | | | | | | | | | | | | | | | | | | | | | | | * git://git.infradead.org/~dwmw2/mtd-2.6.23: [MTD] [NAND] nand_base.c: fix type of eccpos pointer [MTD] [NAND] at91_nand rdy_pin fix [MTD] [NAND] fix race in nand_base.c [MTD] [NAND] Fix refactoring of EDB7312 hwcontrol function. [MTD] Fix potential leak in rfd_ftl_add_mtd [JFFS2] Print correct node offset when complaining about broken data CRC [JFFS2] Fix suspend failure with JFFS2 GC thread. [JFFS2] Deletion dirents should be REF_NORMAL, not REF_PRISTINE. [JFFS2] Prevent oops after 'node added in wrong place' debug check
| * [MTD] [NAND] nand_base.c: fix type of eccpos pointerBen Dooks2007-08-021-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | The nand_base.c driver implicitly casts the uint32_t eccpos array to 'int *', which is not only not guaranteed to be the same sign as the source, but is not guaranteed to be the same size. Fix by changing nand_base.c to use uint32_t referencing the eccpos fields. Signed-off-by: Ben Dooks <ben-linux@fluff.org> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [MTD] [NAND] at91_nand rdy_pin fixIvan Kuten2007-08-021-1/+4
| | | | | | | | | | | | | | | | | | The patch below fixes nand driver for AT91 boards which do not have NAND R/B signal connected to gpio (rdy_pin is not connected). Signed-off-by: Ivan Kuten <ivan.kuten@promwad.com> Acked-by: Andrew Victor <andrew@sanpeople.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [MTD] [NAND] fix race in nand_base.cArtem Bityutskiy2007-08-021-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | When we mark block bad we have to get chip because this involves writing to the page's OOB. We hit this bug in UBI - we observed random obscure crashes when it marks block bad from the background thread and there is some parallel task which utilizes flash. This patch also adds a TODO note about BBT table protection which it seems does not exist. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [MTD] [NAND] Fix refactoring of EDB7312 hwcontrol function.Roland Stigge2007-08-021-5/+5
| | | | | | | | | | | | | | | | | | The patch ensures that the current code (kernel 2.6.22) uses the bits like the code prior to the refactoring. The variable "bits" is employed in a useful way now. Signed-off-by: Roland Stigge <stigge@antcom.de> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [MTD] Fix potential leak in rfd_ftl_add_mtdFlorin Malita2007-08-021-0/+1
| | | | | | | | | | | | | | This fixes a leak in the !mtd->erasesize error path (Coverity 1765). Signed-off-by: Florin Malita <fmalita@gmail.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [JFFS2] Print correct node offset when complaining about broken data CRCDavid Woodhouse2007-08-021-1/+1
| | | | | | | | | | | | | | Debugging the hardware problems in OLPC trac #1905 would be a whole lot easier if the correct node offsets were printed for the offending nodes. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [JFFS2] Fix suspend failure with JFFS2 GC thread.David Woodhouse2007-08-021-4/+4
| | | | | | | | | | | | | | | | The try_to_freeze() call was in the wrong place; we need it in the signal-pending loop now that a pending freeze also makes signal_pending() return true. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [JFFS2] Deletion dirents should be REF_NORMAL, not REF_PRISTINE.David Woodhouse2007-08-024-3/+10
| | | | | | | | | | | | | | Otherwise they'll never actually get garbage-collected. Noted by Jonathan Larmour. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
| * [JFFS2] Prevent oops after 'node added in wrong place' debug checkJoakim Tjernlund2007-08-021-0/+12
| | | | | | | | | | | | | | | | | | | | jffs2_add_physical_node_ref() should never really return error -- it's an internal debugging check which triggered. We really need to work out why and stop it happening. But in the meantime, let's make the failure mode a little less nasty. Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* | Merge branch 'for-linus' of ↵Linus Torvalds2007-08-023-2/+3
|\ \ | |/ |/| | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup: [x86 setup] Document grub < 0.93 as broken [x86 setup] EDD: add missing =m constraint [x86 setup] video setup: Fix VBE DDC reading
| * [x86 setup] Document grub < 0.93 as brokenH. Peter Anvin2007-08-021-0/+1
| | | | | | | | | | | | | | | | Grub older than 0.93 are broken when the kernel setup is bigger than 8K. This was fixed in 2002, and 0.93 was the first grub version which fixed this bug. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
| * [x86 setup] EDD: add missing =m constraintH. Peter Anvin2007-08-021-1/+1
| | | | | | | | | | | | | | Add a missing =m constraint to the EDD-probing code, that could have caused improper dead-code elimination. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
| * [x86 setup] video setup: Fix VBE DDC readingAntonino A. Daplas2007-08-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | Add memory operand constraint and write-only modifier to the inline assembly to effect the writing of the EDID block to boot_params.edid_info. Without this, gcc would think the EDID query was dead code and would eliminate it. Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-schedLinus Torvalds2007-08-027-143/+134
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux-2.6-sched: [PATCH] sched: reduce task_struct size [PATCH] sched: reduce debug code [PATCH] sched: use schedstat_set() API [PATCH] sched: add schedstat_set() API [PATCH] sched: move load-calculation functions [PATCH] sched: ->task_new cleanup [PATCH] sched: uninline inc/dec_nr_running() [PATCH] sched: uninline calc_delta_mine() [PATCH] sched: calc_delta_mine(): use fixed limit [PATCH] sched: tidy up left over smpnice code [PATCH] sched: remove cache_hot_time
| * | [PATCH] sched: reduce task_struct sizeIngo Molnar2007-08-021-8/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | more task_struct size reduction, by moving the debugging/instrumentation fields to under CONFIG_SCHEDSTATS: (i386, nodebug): size ---- pre-CFS 1328 CFS 1472 CFS+patch 1376 Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: reduce debug codeIngo Molnar2007-08-024-20/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | move the rest of the debugging/instrumentation code to under CONFIG_SCHEDSTATS too. This reduces code size and speeds code up: text data bss dec hex filename 33044 4122 28 37194 914a sched.o.before 32708 4122 28 36858 8ffa sched.o.after Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: use schedstat_set() APIIngo Molnar2007-08-021-11/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | make use of the new schedstat_set() API to eliminate two #ifdef sections. No functional changes: text data bss dec hex filename 29009 4122 28 33159 8187 sched.o.before 29009 4122 28 33159 8187 sched.o.after Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: add schedstat_set() APIIngo Molnar2007-08-021-0/+2
| | | | | | | | | | | | | | | | | | | | | add the schedstat_set() API, to allow the reduction of CONFIG_SCHEDSTAT related #ifdefs. No code changed. Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: move load-calculation functionsIngo Molnar2007-08-021-66/+66
| | | | | | | | | | | | | | | | | | | | | move load-calculation functions so that they can use the per-policy declarations and methods. Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: ->task_new cleanupIngo Molnar2007-08-024-17/+10
| | | | | | | | | | | | | | | | | | | | | make sched_class.task_new == NULL a 'default method', this allows the removal of task_rt_new. Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: uninline inc/dec_nr_running()Ingo Molnar2007-08-021-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | uninline inc_nr_running() and dec_nr_running(): text data bss dec hex filename 29039 4162 24 33225 81c9 sched.o.before 29027 4162 24 33213 81bd sched.o.after Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: uninline calc_delta_mine()Ingo Molnar2007-08-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | uninline calc_delta_mine(): text data bss dec hex filename 29162 4162 24 33348 8244 sched.o.before 29039 4162 24 33225 81c9 sched.o.after Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: calc_delta_mine(): use fixed limitIngo Molnar2007-08-021-1/+1
| | | | | | | | | | | | | | | | | | use fixed limit in calc_delta_mine() - this saves an instruction :) Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: tidy up left over smpnice codePeter Williams2007-08-021-15/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. The only place that RTPRIO_TO_LOAD_WEIGHT() is used is in the call to move_tasks() in the function active_load_balance() and its purpose here is just to make sure that the load to be moved is big enough to ensure that exactly one task is moved (if there's one available). This can be accomplished by using ULONG_MAX instead and this allows RTPRIO_TO_LOAD_WEIGHT() to be deleted. 2. This, in turn, allows PRIO_TO_LOAD_WEIGHT() to be deleted. 3. This allows load_weight() to be deleted which allows TIME_SLICE_NICE_ZERO to be deleted along with the comment above it. Signed-off-by: Peter Williams <pwil3058@bigpond.net.au> Signed-off-by: Ingo Molnar <mingo@elte.hu>
| * | [PATCH] sched: remove cache_hot_timeIngo Molnar2007-08-023-4/+0
| |/ | | | | | | | | | | remove the last unused remains of cache_hot_time. Signed-off-by: Ingo Molnar <mingo@elte.hu>
* | Merge branch 'for-linus' of ↵Linus Torvalds2007-08-025-9/+21
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/selinux-2.6 * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/selinux-2.6: Net/Security: fix memory leaks from security_secid_to_secctx() SELinux: remove redundant pointer checks before calling kfree() SELinux: restore proper NetLabel caching behavior
| * | Net/Security: fix memory leaks from security_secid_to_secctx()Paul Moore2007-08-022-3/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The security_secid_to_secctx() function returns memory that must be freed by a call to security_release_secctx() which was not always happening. This patch fixes two of these problems (all that I could find in the kernel source at present). Signed-off-by: Paul Moore <paul.moore@hp.com> Acked-by: Stephen Smalley <sds@tycho.nsa.gov> Signed-off-by: James Morris <jmorris@namei.org>
| * | SELinux: remove redundant pointer checks before calling kfree()Paul Moore2007-08-021-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | We don't need to check for NULL pointers before calling kfree(). Signed-off-by: Paul Moore <paul.moore@hp.com> Acked-by: Stephen Smalley <sds@tycho.nsa.gov> Signed-off-by: James Morris <jmorris@namei.org>
| * | SELinux: restore proper NetLabel caching behaviorPaul Moore2007-08-022-4/+14
| |/ | | | | | | | | | | | | | | | | | | A small fix to the SELinux/NetLabel glue code to ensure that the NetLabel cache is utilized when possible. This was broken when the SELinux/NetLabel glue code was reorganized in the last kernel release. Signed-off-by: Paul Moore <paul.moore@hp.com> Acked-by: Stephen Smalley <sds@tycho.nsa.gov> Signed-off-by: James Morris <jmorris@namei.org>
* | HID: Never call hid_free_buffers() when usbhid_device has been freedJiri Kosina2007-08-021-2/+2
| | | | | | | | | | | | | | We can't call hid_free_buffers() when the underlying usbhid_device has already been freed. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | USB HID: fix memory leak of usbhid_deviceJiri Kosina2007-08-021-0/+2
| | | | | | | | | | | | Add forgotten freeing of usbhid_device structure. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | USB HID: fix a possible NULL pointer dereference when we fail to allocate memoryJesper Juhl2007-08-021-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If, in usb_hid_configure(), we fail to allocate storage for 'usbhid', "if (!(usbhid = kzalloc(sizeof(struct usbhid_device), GFP_KERNEL)))", then we'll jump to the 'fail:' label where we have this code: usb_free_urb(usbhid->urbin); usb_free_urb(usbhid->urbout); usb_free_urb(usbhid->urbctrl); Since we got here because we couldn't allocate storage for 'usbhid', what we have here is a NULL pointer dereference - ouch... This patch solves that little problem by adding a new 'fail_no_usbhid:' label after the problematic calls to usb_free_urb() and jumps to that one instead, in the problem case. Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | USB HID: add ASUS LCM to the blacklistChristian Lamparter2007-08-021-0/+4
| | | | | | | | | | | | | | | | | | Some of ASUS' notebooks (e.g G Series) include a tiny oled display, which is attached to an internal USB bus. Unfortunatly the device reports a wrong DeviceDescriptor and is therefore identified as a HID device... Signed-off-by: Christian Lamparter <chunkeey@web.de> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | USB HID: Add all Logitech Harmonies to blacklistPhil Dibowitz2007-08-021-0/+132
| | | | | | | | | | | | | | | | | | | | This patch adds the entire range of Logitech's ProductIDs that are reserved for their Harmony remotes. The in-kernel HID driver can't do anything with these, and now there is a GPL user-space application that can handle them: http://www.sf.net/projects/harmonycontrol Signed-off-by: Phil Dibowitz <phil@ipom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | USB HID: update description of USBHID in MAINTAINERSJiri Kosina2007-08-021-1/+1
| | | | | | | | | | | | | | Make it more clear to users what kinds of hardware USBHID handles, so that they can send reports and queries properly. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* | HID: remove the Applie IR sensor from the hid_blacklistTino Keitel2007-08-021-2/+0
|/ | | | | | | | | | The IR sensor in some newer Apple computers has no other driver in the kernel, yet. However, the macmini driver in lirc requires a HID device for the IR sensor. Cc: Soeren Sonnenburg <kernel@nn7.de> Signed-off-by: Tino Keitel <tino.keitel@tikei.de> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
* Merge branch 'release' of ↵Linus Torvalds2007-08-0210-39/+50
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: [IA64] ITC: Reduce rating for ITC clock if ITCs are drifty [IA64] SN2: Fix up sn2_rtc clock [IA64] Fix wrong access to irq_desc[] in iosapic_register_intr(). [IA64] Fix possible race in destroy_and_reserve_irq() [IA64] Fix registered interrupt check [IA64] Remove a few duplicate includes [IA64] Allow smp_call_function_single() to current cpu [IA64] fix a few section mismatch warnings
| * [IA64] ITC: Reduce rating for ITC clock if ITCs are driftyChristoph Lameter2007-08-011-1/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make sure to reduce the rating of the ITC clock if ITCs are drifty. If they are drifting then we have not synchronized the ITC values, nor are we doing the jitter compensation (useless since drift may increase the differentials arbitrarily). Without this patch it is possible that the ITC clock becomes selected as the system clock on systems with drifty ITCs which will result in nanosleep hanging. One can still select the itc clock manually on such systems via clocksource=itc (Produces nice hangs on SGI Altix.) Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] SN2: Fix up sn2_rtc clockChristoph Lameter2007-08-011-5/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the sn2_rtc clock is present then it is a must have since sn2_rtc provides a synchronized time source on Altix systems. So elevate the priority to 450. Otherwise the ITC would take precendence. Altix systems currently do not boot because the ITC clocksource is broken. It seems to assume that ITCs are synchronized and as a result nanosleep hangs (may be fixed in a different patch). While we are at it: Remove the sn2_mc definition. The sn2_rtc has a fixed address. No point in reading the address from memory. Removing it avoids touching one cacheline. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] Fix wrong access to irq_desc[] in iosapic_register_intr().Kenji Kaneshige2007-08-011-2/+3
| | | | | | | | | | | | | | | | In error path we must unlock irq_desc[irq].lock before we change 'irq'. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] Fix possible race in destroy_and_reserve_irq()Kenji Kaneshige2007-07-311-11/+6
| | | | | | | | | | | | | | | | | | | | Currently, destroy_and_reserve_irq() sets irq_status[irq] UNUSED using clear_irq_vector() and sets irq_status[irq] RSVD using reserve_irq(). But there is a race window because vector_lock is once released between them. This patch fixes this race window. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] Fix registered interrupt checkKenji Kaneshige2007-07-311-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix the problem that interrupts are not initialized correctly at PCI hotplug or driver reloading time. By vector domain change, the iosapic_rte_info structure was changed to be on the iosapic_intr_info[irq].rtes list even after the interrupts are unregistered. So iosapic_intr_info[irq].rtes list must not be checked to see if there are registered interrupts (RTEs) on the irq. We must check iosapic_intr_info[irq].count counter instead. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] Remove a few duplicate includesJesper Juhl2007-07-313-3/+0
| | | | | | | | | | | | | | | | This patch removes a few duplicate includes from arch/ia64/ Acked-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] Allow smp_call_function_single() to current cpuAvi Kivity2007-07-311-3/+5
| | | | | | | | | | | | | | | | This removes the requirement for callers to get_cpu() to check in simple cases. i386 and x86_64 already received a similar treatment. Signed-off-by: Avi Kivity <avi@qumranet.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
| * [IA64] fix a few section mismatch warningsSam Ravnborg2007-07-313-8/+13
| | | | | | | | | | | | | | | | | | | | | | Fix the following section mismatch warnings: WARNING: vmlinux.o(.text+0x41902): Section mismatch: reference to .init.text:__alloc_bootmem (between 'ia64_mca_cpu_init' and 'ia64_do_tlb_purge') WARNING: vmlinux.o(.text+0x49222): Section mismatch: reference to .init.text:__alloc_bootmem (between 'register_intr' and 'iosapic_register_intr') WARNING: vmlinux.o(.text+0x62beb2): Section mismatch: reference to .init.text:__alloc_bootmem_node (between 'hubdev_init_node' and 'cnodeid_get_geoid') Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Tony Luck <tony.luck@intel.com>
* | Merge master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6Linus Torvalds2007-08-0213-128/+85
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6: scc_pata: PIO fixes piix/slc90e66: fix PIO1 handling in ->speedproc method (take 2) jmicron: PIO fixes it8213: PIO fixes (take 2) cs5535: PIO fixes cs5520: fix PIO auto-tuning in ->ide_dma_check method drivers/scsi/ide-scsi.c: kmalloc + memset conversion to kzalloc drivers/ide/arm/icside.c: kmalloc + memset conversion to kzalloc ide: eliminate warnings in ide-tape.c ide: fix runtogether printk's in cmd64x IDE driver sis5513: Add FSC Amilo A1630 PCI subvendor/dev to laptops alim15x3: Correct HP detect ide: Fix an overrun found in the CS5535 IDE driver