From 1bb2648cde916ac27d3dd75d7b64a4ddc89787b7 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 10 Feb 2013 01:12:52 -0800 Subject: Sun Feb 10 01:12:35 PST 2013 --- libre/linux-libre/.directory | 6 -- libre/linux-libre/3.4.2-rpc_pipefs.patch | 33 ---------- .../3.4.4-fix-backlight-regression.patch | 38 ----------- .../3.4.4-fix-gtx560ti-nouveau-regression.patch | 20 ------ libre/linux-libre/alsa-powersave-3.5.x.patch | 29 -------- ...z-only-few-bytes-are-transfered-on-a-conn.patch | 48 -------------- libre/linux-libre/i915-fix-ghost-tv-output.patch | 26 -------- libre/linux-libre/i915-i2c-crash-3.5.x.patch | 47 ------------- libre/linux-libre/irq_cfg_pointer-3.6.6.patch | 16 ----- libre/linux-libre/module-init-wait-3.6.patch | 77 ---------------------- libre/linux-libre/module-symbol-waiting-3.6.patch | 66 ------------------- libre/linux-libre/watchdog-3.5.x.patch | 60 ----------------- 12 files changed, 466 deletions(-) delete mode 100644 libre/linux-libre/.directory delete mode 100644 libre/linux-libre/3.4.2-rpc_pipefs.patch delete mode 100644 libre/linux-libre/3.4.4-fix-backlight-regression.patch delete mode 100644 libre/linux-libre/3.4.4-fix-gtx560ti-nouveau-regression.patch delete mode 100644 libre/linux-libre/alsa-powersave-3.5.x.patch delete mode 100644 libre/linux-libre/avmfritz-only-few-bytes-are-transfered-on-a-conn.patch delete mode 100644 libre/linux-libre/i915-fix-ghost-tv-output.patch delete mode 100644 libre/linux-libre/i915-i2c-crash-3.5.x.patch delete mode 100644 libre/linux-libre/irq_cfg_pointer-3.6.6.patch delete mode 100644 libre/linux-libre/module-init-wait-3.6.patch delete mode 100644 libre/linux-libre/module-symbol-waiting-3.6.patch delete mode 100644 libre/linux-libre/watchdog-3.5.x.patch (limited to 'libre/linux-libre') diff --git a/libre/linux-libre/.directory b/libre/linux-libre/.directory deleted file mode 100644 index e6f3e33d1..000000000 --- a/libre/linux-libre/.directory +++ /dev/null @@ -1,6 +0,0 @@ -[Dolphin] -Timestamp=2012,8,9,22,54,19 -Version=3 - -[Settings] -HiddenFilesShown=true diff --git a/libre/linux-libre/3.4.2-rpc_pipefs.patch b/libre/linux-libre/3.4.2-rpc_pipefs.patch deleted file mode 100644 index db53b3813..000000000 --- a/libre/linux-libre/3.4.2-rpc_pipefs.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c -index 0404047..21fde99 100644 ---- a/net/sunrpc/rpc_pipe.c -+++ b/net/sunrpc/rpc_pipe.c -@@ -71,7 +71,9 @@ static void rpc_purge_list(wait_queue_head_t *waitq, struct list_head *head, - msg->errno = err; - destroy_msg(msg); - } while (!list_empty(head)); -- wake_up(waitq); -+ -+ if (waitq) -+ wake_up(waitq); - } - - static void -@@ -91,11 +93,9 @@ rpc_timeout_upcall_queue(struct work_struct *work) - } - dentry = dget(pipe->dentry); - spin_unlock(&pipe->lock); -- if (dentry) { -- rpc_purge_list(&RPC_I(dentry->d_inode)->waitq, -- &free_list, destroy_msg, -ETIMEDOUT); -- dput(dentry); -- } -+ rpc_purge_list(dentry ? &RPC_I(dentry->d_inode)->waitq : NULL, -+ &free_list, destroy_msg, -ETIMEDOUT); -+ dput(dentry); - } - - ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg, --- -1.7.7.6 - diff --git a/libre/linux-libre/3.4.4-fix-backlight-regression.patch b/libre/linux-libre/3.4.4-fix-backlight-regression.patch deleted file mode 100644 index a0cf0b1db..000000000 --- a/libre/linux-libre/3.4.4-fix-backlight-regression.patch +++ /dev/null @@ -1,38 +0,0 @@ -Subject: Still use ACPI backlight control if _DOS doesn't exist - -This is a regression introduced by commit -ea9f8856bd6d4ed45885b06a338f7362cd6c60e5 - -https://bugzilla.kernel.org/show_bug.cgi?id=43168 - -Some platforms don't have _DOS control method, but the ACPI -backlight still works. -We do not want to lose the backlight control ability on these platforms. - -CC : Igor Murzov -Signed-off-by: Zhang Rui ---- - drivers/acpi/video.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -Index: rtd3/drivers/acpi/video.c -=================================================================== ---- rtd3.orig/drivers/acpi/video.c -+++ rtd3/drivers/acpi/video.c -@@ -565,8 +565,14 @@ acpi_video_bus_DOS(struct acpi_video_bus - video->dos_setting = arg0.integer.value; - status = acpi_evaluate_object(video->device->handle, "_DOS", - &args, NULL); -- if (ACPI_FAILURE(status)) -- return -EIO; -+ if (ACPI_FAILURE(status)) { -+ /* -+ * some platforms don't have _DOS, but the ACPI -+ * backlight control still works -+ */ -+ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No _DOS\n")); -+ return 0; -+ } - - return 0; - } diff --git a/libre/linux-libre/3.4.4-fix-gtx560ti-nouveau-regression.patch b/libre/linux-libre/3.4.4-fix-gtx560ti-nouveau-regression.patch deleted file mode 100644 index 1b70e918c..000000000 --- a/libre/linux-libre/3.4.4-fix-gtx560ti-nouveau-regression.patch +++ /dev/null @@ -1,20 +0,0 @@ -Revert change to include/drm/drm_fb_helper.h made in commit 4f988d132d2668b4f3b42bfc70daa531115ccca1 - - include/drm/drm_fb_helper.h | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h -index 55e10d6..5120b01 100644 ---- a/include/drm/drm_fb_helper.h -+++ b/include/drm/drm_fb_helper.h -@@ -35,6 +35,7 @@ struct drm_fb_helper; - #include - - struct drm_fb_helper_crtc { -+ uint32_t crtc_id; - struct drm_mode_set mode_set; - struct drm_display_mode *desired_mode; - }; --- -1.7.6.5 - diff --git a/libre/linux-libre/alsa-powersave-3.5.x.patch b/libre/linux-libre/alsa-powersave-3.5.x.patch deleted file mode 100644 index 189fd1ceb..000000000 --- a/libre/linux-libre/alsa-powersave-3.5.x.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Takashi Iwai -Date: Mon, 20 Aug 2012 19:25:22 +0000 (+0200) -Subject: ALSA: hda - Fix leftover codec->power_transition -X-Git-Tag: v3.6-rc3~14^2~1 -X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux.git;a=commitdiff_plain;h=535b6c51fe8293c88ce919cdfc4390c67a1cb6d1 - -ALSA: hda - Fix leftover codec->power_transition - -When the codec turn-on operation is canceled by the immediate -power-on, the driver left the power_transition flag as is. -This caused the persistent avoidance of power-save behavior. - -Cc: [v3.5+] -Signed-off-by: Takashi Iwai ---- - -diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c -index c3077d5..f560051 100644 ---- a/sound/pci/hda/hda_codec.c -+++ b/sound/pci/hda/hda_codec.c -@@ -4454,6 +4454,8 @@ static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down) - * then there is no need to go through power up here. - */ - if (codec->power_on) { -+ if (codec->power_transition < 0) -+ codec->power_transition = 0; - spin_unlock(&codec->power_lock); - return; - } diff --git a/libre/linux-libre/avmfritz-only-few-bytes-are-transfered-on-a-conn.patch b/libre/linux-libre/avmfritz-only-few-bytes-are-transfered-on-a-conn.patch deleted file mode 100644 index f8bb193c6..000000000 --- a/libre/linux-libre/avmfritz-only-few-bytes-are-transfered-on-a-conn.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 285c08154eede7dc4387bfc925967c884594dcc9 Mon Sep 17 00:00:00 2001 -From: Karsten Keil -Date: Sat, 28 Jul 2012 20:10:04 +0200 -Subject: [PATCH] mISDN: Bugfix only few bytes are transfered on a connection - -The test for the fillempty condition was wrong in one place. -Changed the variable to the right boolean type. - -Signed-off-by: Karsten Keil ---- - drivers/isdn/hardware/mISDN/avmfritz.c | 7 ++++--- - 1 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c -index c08fc60..fa6ca47 100644 ---- a/drivers/isdn/hardware/mISDN/avmfritz.c -+++ b/drivers/isdn/hardware/mISDN/avmfritz.c -@@ -449,7 +449,8 @@ hdlc_fill_fifo(struct bchannel *bch) - { - struct fritzcard *fc = bch->hw; - struct hdlc_hw *hdlc; -- int count, fs, cnt = 0, idx, fillempty = 0; -+ int count, fs, cnt = 0, idx; -+ bool fillempty = false; - u8 *p; - u32 *ptr, val, addr; - -@@ -462,7 +463,7 @@ hdlc_fill_fifo(struct bchannel *bch) - return; - count = fs; - p = bch->fill; -- fillempty = 1; -+ fillempty = true; - } else { - count = bch->tx_skb->len - bch->tx_idx; - if (count <= 0) -@@ -477,7 +478,7 @@ hdlc_fill_fifo(struct bchannel *bch) - hdlc->ctrl.sr.cmd |= HDLC_CMD_XME; - } - ptr = (u32 *)p; -- if (fillempty) { -+ if (!fillempty) { - pr_debug("%s.B%d: %d/%d/%d", fc->name, bch->nr, count, - bch->tx_idx, bch->tx_skb->len); - bch->tx_idx += count; --- -1.7.7 - diff --git a/libre/linux-libre/i915-fix-ghost-tv-output.patch b/libre/linux-libre/i915-fix-ghost-tv-output.patch deleted file mode 100644 index 3b631361a..000000000 --- a/libre/linux-libre/i915-fix-ghost-tv-output.patch +++ /dev/null @@ -1,26 +0,0 @@ -Signed-off-by: Zhao Yakui -Tested-by: Santi ---- - drivers/gpu/drm/i915/intel_tv.c | 9 +++++++++ - 1 files changed, 9 insertions(+), 0 deletions(-) - -diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c -index dc83b7a..c8f67bf 100644 ---- a/drivers/gpu/drm/i915/intel_tv.c -+++ b/drivers/gpu/drm/i915/intel_tv.c -@@ -1267,6 +1267,15 @@ - DAC_B_0_7_V | - DAC_C_0_7_V); - -+ /* -+ * The TV sense state should be cleared to zero on cantiga platform. Otherwise -+ * the TV is misdetected. This is hardware requirement. -+ */ -+ if (IS_GM45(dev)) -+ tv_dac &= ~(TVDAC_STATE_CHG_EN | TVDAC_A_SENSE_CTL | -+ TVDAC_B_SENSE_CTL | TVDAC_C_SENSE_CTL); -+ -+ - I915_WRITE(TV_CTL, tv_ctl); - I915_WRITE(TV_DAC, tv_dac); - POSTING_READ(TV_DAC); diff --git a/libre/linux-libre/i915-i2c-crash-3.5.x.patch b/libre/linux-libre/i915-i2c-crash-3.5.x.patch deleted file mode 100644 index d202b531c..000000000 --- a/libre/linux-libre/i915-i2c-crash-3.5.x.patch +++ /dev/null @@ -1,47 +0,0 @@ -From cee25168e9c4ef7f9417632af2dc78b8521dfda7 Mon Sep 17 00:00:00 2001 -From: Jani Nikula -Date: Mon, 13 Aug 2012 17:33:02 +0300 -Subject: [PATCH] drm/i915: ensure i2c adapter is all set before adding it - -i2c_add_adapter() may do i2c transfers on the bus to detect supported -devices. Therefore the adapter needs to be all set before adding it. This -was not the case for the bit-banging fallback, resulting in an oops if the -device detection GMBUS transfers timed out. Fix the issue by calling -i2c_add_adapter() only after intel_gpio_setup(). - -LKML-Reference: <5021F00B.7000503@ionic.de> -Tested-by: Mihai Moldovan -Signed-off-by: Jani Nikula -Signed-off-by: Daniel Vetter ---- - drivers/gpu/drm/i915/intel_i2c.c | 7 ++++--- - 1 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c -index d79500b..b9755f6 100644 ---- a/drivers/gpu/drm/i915/intel_i2c.c -+++ b/drivers/gpu/drm/i915/intel_i2c.c -@@ -486,9 +486,6 @@ int intel_setup_gmbus(struct drm_device *dev) - bus->dev_priv = dev_priv; - - bus->adapter.algo = &gmbus_algorithm; -- ret = i2c_add_adapter(&bus->adapter); -- if (ret) -- goto err; - - /* By default use a conservative clock rate */ - bus->reg0 = port | GMBUS_RATE_100KHZ; -@@ -498,6 +495,10 @@ int intel_setup_gmbus(struct drm_device *dev) - bus->force_bit = true; - - intel_gpio_setup(bus, port); -+ -+ ret = i2c_add_adapter(&bus->adapter); -+ if (ret) -+ goto err; - } - - intel_i2c_reset(dev_priv->dev); --- -1.7.7.6 - diff --git a/libre/linux-libre/irq_cfg_pointer-3.6.6.patch b/libre/linux-libre/irq_cfg_pointer-3.6.6.patch deleted file mode 100644 index 32583c0ac..000000000 --- a/libre/linux-libre/irq_cfg_pointer-3.6.6.patch +++ /dev/null @@ -1,16 +0,0 @@ -X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux.git;a=blobdiff_plain;f=arch%2Fx86%2Fkernel%2Fapic%2Fio_apic.c;h=1817fa911024f07151d3edf91bd350722c9f79f8;hp=c265593ec2cdc3df35fda1586aaf91514fab62fa;hb=94777fc51b3ad85ff9f705ddf7cdd0eb3bbad5a6;hpb=3e8fa263a97079c74880675c451587bb6899e661 - -diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c -index c265593..1817fa9 100644 ---- a/arch/x86/kernel/apic/io_apic.c -+++ b/arch/x86/kernel/apic/io_apic.c -@@ -2257,6 +2257,9 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void) - continue; - - cfg = irq_cfg(irq); -+ if (!cfg) -+ continue; -+ - raw_spin_lock(&desc->lock); - - /* diff --git a/libre/linux-libre/module-init-wait-3.6.patch b/libre/linux-libre/module-init-wait-3.6.patch deleted file mode 100644 index 1bcfd2491..000000000 --- a/libre/linux-libre/module-init-wait-3.6.patch +++ /dev/null @@ -1,77 +0,0 @@ -From: Rusty Russell -Date: Fri, 28 Sep 2012 05:01:03 +0000 (+0930) -Subject: module: wait when loading a module which is currently initializing. -X-Git-Tag: v3.7-rc1~2^2~32 -X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9bb9c3be568346538 - -module: wait when loading a module which is currently initializing. - -The original module-init-tools module loader used a fnctl lock on the -.ko file to avoid attempts to simultaneously load a module. -Unfortunately, you can't get an exclusive fcntl lock on a read-only -fd, making this not work for read-only mounted filesystems. -module-init-tools has a hacky sleep-and-loop for this now. - -It's not that hard to wait in the kernel, and only return -EEXIST once -the first module has finished loading (or continue loading the module -if the first one failed to initialize for some reason). It's also -consistent with what we do for dependent modules which are still loading. - -Suggested-by: Lucas De Marchi -Signed-off-by: Rusty Russell ---- - -diff --git a/kernel/module.c b/kernel/module.c -index 63cf6e7..74bc195 100644 ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -2845,6 +2845,20 @@ static int post_relocation(struct module *mod, const struct load_info *info) - return module_finalize(info->hdr, info->sechdrs, mod); - } - -+/* Is this module of this name done loading? No locks held. */ -+static bool finished_loading(const char *name) -+{ -+ struct module *mod; -+ bool ret; -+ -+ mutex_lock(&module_mutex); -+ mod = find_module(name); -+ ret = !mod || mod->state != MODULE_STATE_COMING; -+ mutex_unlock(&module_mutex); -+ -+ return ret; -+} -+ - /* Allocate and load the module: note that size of section 0 is always - zero, and we rely on this for optional sections. */ - static struct module *load_module(void __user *umod, -@@ -2852,7 +2866,7 @@ static struct module *load_module(void __user *umod, - const char __user *uargs) - { - struct load_info info = { NULL, }; -- struct module *mod; -+ struct module *mod, *old; - long err; - - pr_debug("load_module: umod=%p, len=%lu, uargs=%p\n", -@@ -2918,8 +2932,18 @@ static struct module *load_module(void __user *umod, - * function to insert in a way safe to concurrent readers. - * The mutex protects against concurrent writers. - */ -+again: - mutex_lock(&module_mutex); -- if (find_module(mod->name)) { -+ if ((old = find_module(mod->name)) != NULL) { -+ if (old->state == MODULE_STATE_COMING) { -+ /* Wait in case it fails to load. */ -+ mutex_unlock(&module_mutex); -+ err = wait_event_interruptible(module_wq, -+ finished_loading(mod->name)); -+ if (err) -+ goto free_arch_cleanup; -+ goto again; -+ } - err = -EEXIST; - goto unlock; - } diff --git a/libre/linux-libre/module-symbol-waiting-3.6.patch b/libre/linux-libre/module-symbol-waiting-3.6.patch deleted file mode 100644 index b87a38ff5..000000000 --- a/libre/linux-libre/module-symbol-waiting-3.6.patch +++ /dev/null @@ -1,66 +0,0 @@ -From: Rusty Russell -Date: Fri, 28 Sep 2012 05:01:03 +0000 (+0930) -Subject: module: fix symbol waiting when module fails before init -X-Git-Tag: v3.7-rc1~2^2~33 -X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=6f13909f4fe9652f1 - -module: fix symbol waiting when module fails before init - -We use resolve_symbol_wait(), which blocks if the module containing -the symbol is still loading. However: - -1) The module_wq we use is only woken after calling the modules' init - function, but there are other failure paths after the module is - placed in the linked list where we need to do the same thing. - -2) wake_up() only wakes one waiter, and our waitqueue is shared by all - modules, so we need to wake them all. - -3) wake_up_all() doesn't imply a memory barrier: I feel happier calling - it after we've grabbed and dropped the module_mutex, not just after - the state assignment. - -Signed-off-by: Rusty Russell ---- - -diff --git a/kernel/module.c b/kernel/module.c -index 7f2ee45f..63cf6e7 100644 ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -2959,7 +2959,7 @@ static struct module *load_module(void __user *umod, - /* Unlink carefully: kallsyms could be walking list. */ - list_del_rcu(&mod->list); - module_bug_cleanup(mod); -- -+ wake_up_all(&module_wq); - ddebug: - dynamic_debug_remove(info.debug); - unlock: -@@ -3034,7 +3034,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod, - blocking_notifier_call_chain(&module_notify_list, - MODULE_STATE_GOING, mod); - free_module(mod); -- wake_up(&module_wq); -+ wake_up_all(&module_wq); - return ret; - } - if (ret > 0) { -@@ -3046,9 +3046,8 @@ SYSCALL_DEFINE3(init_module, void __user *, umod, - dump_stack(); - } - -- /* Now it's a first class citizen! Wake up anyone waiting for it. */ -+ /* Now it's a first class citizen! */ - mod->state = MODULE_STATE_LIVE; -- wake_up(&module_wq); - blocking_notifier_call_chain(&module_notify_list, - MODULE_STATE_LIVE, mod); - -@@ -3071,6 +3070,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod, - mod->init_ro_size = 0; - mod->init_text_size = 0; - mutex_unlock(&module_mutex); -+ wake_up_all(&module_wq); - - return 0; - } diff --git a/libre/linux-libre/watchdog-3.5.x.patch b/libre/linux-libre/watchdog-3.5.x.patch deleted file mode 100644 index 7ac1e6732..000000000 --- a/libre/linux-libre/watchdog-3.5.x.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c -index 027cc8f..a05fdfc 100644 ---- a/drivers/mfd/lpc_ich.c -+++ b/drivers/mfd/lpc_ich.c -@@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, - u32 base_addr_cfg; - u32 base_addr; - int ret; -- bool acpi_conflict = false; - struct resource *res; - - /* Setup power management base register */ -@@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, - res = wdt_io_res(ICH_RES_IO_TCO); - res->start = base_addr + ACPIBASE_TCO_OFF; - res->end = base_addr + ACPIBASE_TCO_END; -- ret = acpi_check_resource_conflict(res); -- if (ret) { -- acpi_conflict = true; -- goto wdt_done; -- } - - res = wdt_io_res(ICH_RES_IO_SMI); - res->start = base_addr + ACPIBASE_SMI_OFF; - res->end = base_addr + ACPIBASE_SMI_END; -- ret = acpi_check_resource_conflict(res); -- if (ret) { -- acpi_conflict = true; -- goto wdt_done; -- } -+ - lpc_ich_enable_acpi_space(dev); - - /* -@@ -813,11 +803,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, - res = wdt_mem_res(ICH_RES_MEM_GCS); - res->start = base_addr + ACPIBASE_GCS_OFF; - res->end = base_addr + ACPIBASE_GCS_END; -- ret = acpi_check_resource_conflict(res); -- if (ret) { -- acpi_conflict = true; -- goto wdt_done; -- } - } - - lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id); -@@ -825,9 +810,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, - 1, NULL, 0); - - wdt_done: -- if (acpi_conflict) -- pr_warn("Resource conflict(s) found affecting %s\n", -- lpc_ich_cells[LPC_WDT].name); - return ret; - } - --- -1.7.1 - - \ No newline at end of file -- cgit v1.2.3-54-g00ecf