diff --git a/packages/linux/patches/close_debug_info_of_rt2860.diff b/packages/linux/patches/close_debug_info_of_rt2860.diff new file mode 100644 index 0000000000..e1bc13cf07 --- /dev/null +++ b/packages/linux/patches/close_debug_info_of_rt2860.diff @@ -0,0 +1,36 @@ +diff --git a/drivers/staging/rt2860/rt_linux.c b/drivers/staging/rt2860/rt_linux.c +index 9357fb2..7e0b6c0 100644 +--- a/drivers/staging/rt2860/rt_linux.c ++++ b/drivers/staging/rt2860/rt_linux.c +@@ -28,7 +28,7 @@ + #include + #include "rt_config.h" + +-unsigned long RTDebugLevel = RT_DEBUG_ERROR; ++unsigned long RTDebugLevel = RT_DEBUG_OFF; + + /* for wireless system event message */ + char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { +diff --git a/drivers/staging/rt2860/rt_linux.h b/drivers/staging/rt2860/rt_linux.h +index f85508d..92ce551 100644 +--- a/drivers/staging/rt2860/rt_linux.h ++++ b/drivers/staging/rt2860/rt_linux.h +@@ -425,16 +425,9 @@ do{ \ + + #define DBGPRINT(Level, Fmt) DBGPRINT_RAW(Level, Fmt) + +-#define DBGPRINT_ERR(Fmt) \ +-{ \ +- printk("ERROR! "); \ +- printk Fmt; \ +-} ++#define DBGPRINT_ERR(Fmt) + +-#define DBGPRINT_S(Status, Fmt) \ +-{ \ +- printk Fmt; \ +-} ++#define DBGPRINT_S(Status, Fmt) + + #else + #define DBGPRINT(Level, Fmt) diff --git a/packages/linux/patches/die-floppy-die.diff b/packages/linux/patches/die-floppy-die.diff new file mode 100644 index 0000000000..26beabfc7a --- /dev/null +++ b/packages/linux/patches/die-floppy-die.diff @@ -0,0 +1,18 @@ +Kill the floppy.ko pnp modalias. We were surviving just fine without +autoloading floppy drivers, tyvm. + +Please feel free to register all complaints in the wastepaper bin. + +diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c +index 91b7530..2ea84a6 100644 +--- a/drivers/block/floppy.c ++++ b/drivers/block/floppy.c +@@ -4631,7 +4631,7 @@ static const struct pnp_device_id floppy_pnpids[] = { + { "PNP0700", 0 }, + { } + }; +-MODULE_DEVICE_TABLE(pnp, floppy_pnpids); ++/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */ + + #else + diff --git a/packages/linux/patches/hda_intel-prealloc-4mb-dmabuffer.diff b/packages/linux/patches/hda_intel-prealloc-4mb-dmabuffer.diff new file mode 100644 index 0000000000..c80f11d9da --- /dev/null +++ b/packages/linux/patches/hda_intel-prealloc-4mb-dmabuffer.diff @@ -0,0 +1,35 @@ +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index c8d9178..7d3bb15 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -1774,6 +1774,7 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec, + struct azx_pcm *apcm; + int pcm_dev = cpcm->device; + int s, err; ++ size_t prealloc_min = 64*1024; /* 64KB */ + + if (pcm_dev >= AZX_MAX_PCMS) { + snd_printk(KERN_ERR SFX "Invalid PCM device number %d\n", +@@ -1807,10 +1808,21 @@ azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec, + if (cpcm->stream[s].substreams) + snd_pcm_set_ops(pcm, s, &azx_pcm_ops); + } ++ + /* buffer pre-allocation */ ++ ++ /* subtle, don't allocate a big buffer for modems... ++ * also, don't just test 32BIT_MASK, since azx supports ++ * 64-bit DMA in some cases. ++ */ ++ /* lennart wants a 2.2MB buffer for 2sec of 48khz */ ++ if (pcm->dev_class == SNDRV_PCM_CLASS_GENERIC && ++ chip->pci->dma_mask >= DMA_32BIT_MASK) ++ prealloc_min = 4 * 1024 * 1024; /* 4MB */ ++ + snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, + snd_dma_pci_data(chip->pci), +- 1024 * 64, 32 * 1024 * 1024); ++ prealloc_min, 32 * 1024 * 1024); + return 0; + } + diff --git a/packages/linux/patches/linux-2.6-driver-level-usb-autosuspend.diff b/packages/linux/patches/linux-2.6-driver-level-usb-autosuspend.diff new file mode 100644 index 0000000000..fc0fd7e4a5 --- /dev/null +++ b/packages/linux/patches/linux-2.6-driver-level-usb-autosuspend.diff @@ -0,0 +1,60 @@ +commit 0f592e33934bf6108e33e34f00b425f98ee833ef +Author: Matthew Garrett +Date: Wed Jul 8 19:04:23 2009 +0100 + + usb: Allow drivers to enable USB autosuspend on a per-device basis + + USB autosuspend is currently only enabled by default for hubs. On other + hardware the decision is made by userspace. This is unnecessary in cases + where we know that the hardware supports autosuspend, so this patch adds + a function to allow drivers to enable it at probe time. + + Signed-off-by: Matthew Garrett + +diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c +index 60a45f1..06d24df 100644 +--- a/drivers/usb/core/driver.c ++++ b/drivers/usb/core/driver.c +@@ -1648,6 +1648,20 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) + EXPORT_SYMBOL_GPL(usb_autopm_put_interface_async); + + /** ++ * usb_device_autosuspend_enable - enable autosuspend on a device ++ * @udev: the usb_device to be autosuspended ++ * ++ * This routine should be called by an interface driver when it knows that ++ * the device in question supports USB autosuspend. ++ * ++ */ ++void usb_device_autosuspend_enable(struct usb_device *udev) ++{ ++ udev->autosuspend_disabled = 0; ++} ++EXPORT_SYMBOL_GPL(usb_device_autosuspend_enable); ++ ++/** + * usb_autopm_get_interface - increment a USB interface's PM-usage counter + * @intf: the usb_interface whose counter should be incremented + * +diff --git a/include/linux/usb.h b/include/linux/usb.h +index e101a2d..dd47590 100644 +--- a/include/linux/usb.h ++++ b/include/linux/usb.h +@@ -540,6 +540,7 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); + + /* USB autosuspend and autoresume */ + #ifdef CONFIG_USB_SUSPEND ++extern void usb_device_autosuspend_enable(struct usb_device *udev); + extern int usb_autopm_get_interface(struct usb_interface *intf); + extern void usb_autopm_put_interface(struct usb_interface *intf); + extern int usb_autopm_get_interface_async(struct usb_interface *intf); +@@ -563,6 +564,9 @@ static inline void usb_mark_last_busy(struct usb_device *udev) + + #else + ++static inline void usb_device_autosuspend_enable(struct usb_device *udev) ++{ } ++ + static inline int usb_autopm_get_interface(struct usb_interface *intf) + { return 0; } + static inline int usb_autopm_get_interface_async(struct usb_interface *intf) diff --git a/packages/linux/patches/linux-2.6-usb-uvc-autosuspend.diff b/packages/linux/patches/linux-2.6-usb-uvc-autosuspend.diff new file mode 100644 index 0000000000..b7c7f6e0f4 --- /dev/null +++ b/packages/linux/patches/linux-2.6-usb-uvc-autosuspend.diff @@ -0,0 +1,19 @@ +commit 9d4c919bcfa794c054cc33155c7e3c53ac2c5684 +Author: Matthew Garrett +Date: Sun Jul 19 02:24:49 2009 +0100 + + Enable autosuspend on UVC by default + +diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c +index 89927b7..8de516b 100644 +--- a/drivers/media/video/uvc/uvc_driver.c ++++ b/drivers/media/video/uvc/uvc_driver.c +@@ -1647,6 +1647,8 @@ static int uvc_probe(struct usb_interface *intf, + "supported.\n", ret); + } + ++ usb_device_autosuspend_enable(udev); ++ + uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n"); + return 0; + diff --git a/packages/linux/patches/linux-2.6.29-kms-dont-blank-display.diff b/packages/linux/patches/linux-2.6.29-kms-dont-blank-display.diff new file mode 100644 index 0000000000..a5e7cb1c67 --- /dev/null +++ b/packages/linux/patches/linux-2.6.29-kms-dont-blank-display.diff @@ -0,0 +1,22 @@ +--- vanilla-2.6.31-rc4/drivers/gpu/drm/i915/intel_lvds.c~ 2009-07-31 11:23:05.000000000 -0700 ++++ vanilla-2.6.31-rc4/drivers/gpu/drm/i915/intel_lvds.c 2009-07-31 11:23:05.000000000 -0700 +@@ -111,19 +111,12 @@ static void intel_lvds_set_power(struct + if (on) { + I915_WRITE(ctl_reg, I915_READ(ctl_reg) | + POWER_TARGET_ON); +- do { +- pp_status = I915_READ(status_reg); +- } while ((pp_status & PP_ON) == 0); +- + intel_lvds_set_backlight(dev, dev_priv->backlight_duty_cycle); + } else { + intel_lvds_set_backlight(dev, 0); + + I915_WRITE(ctl_reg, I915_READ(ctl_reg) & + ~POWER_TARGET_ON); +- do { +- pp_status = I915_READ(status_reg); +- } while (pp_status & PP_ON); + } + } + diff --git a/packages/linux/patches/linux-2.6.29-kms-edid-cache.diff b/packages/linux/patches/linux-2.6.29-kms-edid-cache.diff new file mode 100644 index 0000000000..1fda401e58 --- /dev/null +++ b/packages/linux/patches/linux-2.6.29-kms-edid-cache.diff @@ -0,0 +1,58 @@ +diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h +index a51573d..3dcf5cc 100644 +--- a/drivers/gpu/drm/i915/intel_drv.h ++++ b/drivers/gpu/drm/i915/intel_drv.h +@@ -102,6 +102,7 @@ struct intel_output { + int type; + struct i2c_adapter *i2c_bus; + struct i2c_adapter *ddc_bus; ++ struct edid *edid; + bool load_detect_temp; + bool needs_tv_clock; + void *dev_priv; +diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c +index 3118ce2..fa0299e 100644 +--- a/drivers/gpu/drm/i915/intel_lvds.c ++++ b/drivers/gpu/drm/i915/intel_lvds.c +@@ -716,6 +716,7 @@ static void intel_lvds_destroy(struct drm_connector *connector) + acpi_lid_notifier_unregister(&dev_priv->lid_notifier); + drm_sysfs_connector_remove(connector); + drm_connector_cleanup(connector); ++ kfree(intel_output->edid); + kfree(connector); + } + +@@ -1189,5 +1190,6 @@ failed: + intel_i2c_destroy(intel_output->ddc_bus); + drm_connector_cleanup(connector); + drm_encoder_cleanup(encoder); ++ kfree(intel_output->edid); + kfree(intel_output); + } +diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c +index 67e2f46..5ac537f 100644 +--- a/drivers/gpu/drm/i915/intel_modes.c ++++ b/drivers/gpu/drm/i915/intel_modes.c +@@ -74,6 +74,10 @@ int intel_ddc_get_modes(struct intel_output *intel_output) + int ret = 0; + + intel_i2c_quirk_set(intel_output->base.dev, true); ++ if (intel_output->edid && intel_output->type == INTEL_OUTPUT_LVDS) { ++ printk(KERN_INFO "Skipping EDID probe due to cached edid\n"); ++ return ret; ++ } + edid = drm_get_edid(&intel_output->base, intel_output->ddc_bus); + intel_i2c_quirk_set(intel_output->base.dev, false); + if (edid) { +@@ -81,7 +85,10 @@ int intel_ddc_get_modes(struct intel_output *intel_output) + edid); + ret = drm_add_edid_modes(&intel_output->base, edid); + intel_output->base.display_info.raw_edid = NULL; +- kfree(edid); ++ if (intel_output->type == INTEL_OUTPUT_LVDS) ++ intel_output->edid = edid; ++ else ++ kfree(edid); + } + + return ret; diff --git a/packages/linux/patches/linux-2.6.29-kms-run-async.diff b/packages/linux/patches/linux-2.6.29-kms-run-async.diff new file mode 100644 index 0000000000..eaef8eb6ce --- /dev/null +++ b/packages/linux/patches/linux-2.6.29-kms-run-async.diff @@ -0,0 +1,118 @@ +Index: b/drivers/gpu/drm/drm_crtc_helper.c +=================================================================== +--- a/drivers/gpu/drm/drm_crtc_helper.c ++++ b/drivers/gpu/drm/drm_crtc_helper.c +@@ -29,6 +29,8 @@ + * Jesse Barnes + */ + ++#include ++ + #include "drmP.h" + #include "drm_crtc.h" + #include "drm_crtc_helper.h" +@@ -62,6 +64,8 @@ static void drm_mode_validate_flag(struc + return; + } + ++LIST_HEAD(drm_async_list); ++ + /** + * drm_helper_probe_connector_modes - get complete set of display modes + * @dev: DRM device +@@ -916,6 +920,7 @@ bool drm_helper_plugged_event(struct drm + /* FIXME: send hotplug event */ + return true; + } ++ + /** + * drm_initial_config - setup a sane initial connector configuration + * @dev: DRM device +@@ -953,13 +958,26 @@ bool drm_helper_initial_config(struct dr + + drm_setup_crtcs(dev); + +- /* alert the driver fb layer */ + dev->mode_config.funcs->fb_changed(dev); +- + return 0; + } + EXPORT_SYMBOL(drm_helper_initial_config); + ++static void drm_helper_initial_config_helper(void *ptr, async_cookie_t cookie) ++{ ++ struct drm_device *dev = ptr; ++ drm_helper_initial_config(dev); ++} ++ ++void drm_helper_initial_config_async(struct drm_device *dev) ++{ ++ async_schedule_domain(drm_helper_initial_config_helper, ++ dev, &drm_async_list); ++} ++EXPORT_SYMBOL(drm_helper_initial_config_async); ++ ++ ++ + static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder) + { + int dpms = DRM_MODE_DPMS_OFF; +Index: b/drivers/gpu/drm/drm_drv.c +=================================================================== +--- a/drivers/gpu/drm/drm_drv.c ++++ b/drivers/gpu/drm/drm_drv.c +@@ -49,6 +49,7 @@ + #include + #include "drmP.h" + #include "drm_core.h" ++#include + + + static int drm_version(struct drm_device *dev, void *data, +@@ -290,6 +291,9 @@ void drm_exit(struct drm_driver *driver) + struct drm_device *dev, *tmp; + DRM_DEBUG("\n"); + ++ /* make sure all async DRM operations are finished */ ++ async_synchronize_full_domain(&drm_async_list); ++ + if (driver->driver_features & DRIVER_MODESET) { + pci_unregister_driver(&driver->pci_driver); + } else { +Index: b/include/drm/drmP.h +=================================================================== +--- a/include/drm/drmP.h ++++ b/include/drm/drmP.h +@@ -328,6 +328,7 @@ struct drm_vma_entry { + pid_t pid; + }; + ++extern struct list_head drm_async_list; + /** + * DMA buffer. + */ +Index: b/include/drm/drm_crtc_helper.h +=================================================================== +--- a/include/drm/drm_crtc_helper.h ++++ b/include/drm/drm_crtc_helper.h +@@ -92,6 +92,7 @@ extern int drm_helper_probe_single_conne + extern void drm_helper_disable_unused_functions(struct drm_device *dev); + extern int drm_helper_hotplug_stage_two(struct drm_device *dev); + extern bool drm_helper_initial_config(struct drm_device *dev); ++extern void drm_helper_initial_config_async(struct drm_device *dev); + extern int drm_crtc_helper_set_config(struct drm_mode_set *set); + extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, + struct drm_display_mode *mode, +Index: b/drivers/gpu/drm/i915/i915_dma.c +=================================================================== +--- a/drivers/gpu/drm/i915/i915_dma.c ++++ b/drivers/gpu/drm/i915/i915_dma.c +@@ -1045,7 +1045,7 @@ static int i915_load_modeset_init(struct + + intel_modeset_init(dev); + +- drm_helper_initial_config(dev); ++ drm_helper_initial_config_async(dev); + + return 0; + diff --git a/packages/linux/patches/linux-2.6.29-silence-acer-message.diff b/packages/linux/patches/linux-2.6.29-silence-acer-message.diff new file mode 100644 index 0000000000..ff76f09de0 --- /dev/null +++ b/packages/linux/patches/linux-2.6.29-silence-acer-message.diff @@ -0,0 +1,22 @@ +From: Arjan van de Ven +Date: Fri, 23 Jan 2009 + +Small fix changing error msg to info msg in acer wmi driver +--- +--- + drivers/platform/x86/acer-wmi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: linux-2.6.29/drivers/platform/x86/acer-wmi.c +=================================================================== +--- linux-2.6.29.orig/drivers/platform/x86/acer-wmi.c ++++ linux-2.6.29/drivers/platform/x86/acer-wmi.c +@@ -1290,7 +1290,7 @@ static int __init acer_wmi_init(void) + AMW0_find_mailled(); + + if (!interface) { +- printk(ACER_ERR "No or unsupported WMI interface, unable to " ++ printk(ACER_INFO "No or unsupported WMI interface, unable to " + "load\n"); + return -ENODEV; + } diff --git a/packages/linux/patches/linux-2.6.29-sreadahead.diff b/packages/linux/patches/linux-2.6.29-sreadahead.diff new file mode 100644 index 0000000000..a6764a23db --- /dev/null +++ b/packages/linux/patches/linux-2.6.29-sreadahead.diff @@ -0,0 +1,96 @@ +From 4d690855d6bdc15b753ac3c21bf507ad94d46aac Mon Sep 17 00:00:00 2001 +From: Arjan van de Ven +Date: Sun, 21 Sep 2008 11:58:27 -0700 +Subject: [PATCH] superreadahead patch + +--- + fs/ext3/ioctl.c | 3 +++ + fs/ext3/super.c | 1 + + include/linux/ext3_fs.h | 1 + + include/linux/fs.h | 2 ++ + 4 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c +index 8897481..08f4854 100644 +--- a/fs/ext3/ioctl.c ++++ b/fs/ext3/ioctl.c +@@ -276,6 +276,9 @@ group_add_out: + mnt_drop_write(filp->f_path.mnt); + return err; + } ++ case EXT3_IOC_INODE_JIFFIES: { ++ return inode->created_when; ++ } + + + default: +diff --git a/fs/ext3/super.c b/fs/ext3/super.c +index 524b349..e6e8514 100644 +--- a/fs/ext3/super.c ++++ b/fs/ext3/super.c +@@ -466,6 +466,7 @@ static struct inode *ext3_alloc_inode(struct super_block *sb) + return NULL; + ei->i_block_alloc_info = NULL; + ei->vfs_inode.i_version = 1; ++ ei->vfs_inode.created_when = jiffies; + atomic_set(&ei->i_datasync_tid, 0); + atomic_set(&ei->i_sync_tid, 0); + return &ei->vfs_inode; +diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h +index 634a5e5..84d5394 100644 +--- a/include/linux/ext3_fs.h ++++ b/include/linux/ext3_fs.h +@@ -250,6 +250,7 @@ struct ext3_new_group_data { + #endif + #define EXT3_IOC_GETRSVSZ _IOR('f', 5, long) + #define EXT3_IOC_SETRSVSZ _IOW('f', 6, long) ++#define EXT3_IOC_INODE_JIFFIES _IOR('f', 19, long) + + /* + * ioctl commands in 32 bit emulation +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 0872372..078e3fd 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -781,6 +781,8 @@ struct inode { + struct posix_acl *i_default_acl; + #endif + void *i_private; /* fs or device private pointer */ ++ ++ unsigned long created_when; /* jiffies of creation time */ + }; + + /* +-- +1.6.0.6 + +--- vanilla-2.6.32-rc7/fs/btrfs/inode.c~ 2009-11-13 11:15:48.000000000 -0800 ++++ vanilla-2.6.32-rc7/fs/btrfs/inode.c 2009-11-13 11:15:48.000000000 -0800 +@@ -5181,6 +5181,7 @@ + ei->outstanding_extents = 0; + ei->reserved_extents = 0; + ei->root = NULL; ++ ei->vfs_inode.created_when = jiffies; + spin_lock_init(&ei->accounting_lock); + btrfs_ordered_inode_tree_init(&ei->ordered_tree); + INIT_LIST_HEAD(&ei->i_orphan); +--- vanilla-2.6.32-rc7/fs/btrfs/ioctl.c~ 2009-11-13 11:16:58.000000000 -0800 ++++ vanilla-2.6.32-rc7/fs/btrfs/ioctl.c 2009-11-13 11:16:58.000000000 -0800 +@@ -1298,6 +1298,8 @@ + return 0; + } + ++#define EXT3_IOC_INODE_JIFFIES _IOR('f', 19, long) ++ + long btrfs_ioctl(struct file *file, unsigned int + cmd, unsigned long arg) + { +@@ -1337,6 +1338,8 @@ + case BTRFS_IOC_SYNC: + btrfs_sync_fs(file->f_dentry->d_sb, 1); + return 0; ++ case EXT3_IOC_INODE_JIFFIES: ++ return fdentry(file)->d_inode->created_when; + } + + return -ENOTTY; diff --git a/packages/linux/patches/linux-2.6.30-no-pcspkr-modalias.diff b/packages/linux/patches/linux-2.6.30-no-pcspkr-modalias.diff new file mode 100644 index 0000000000..c703b88443 --- /dev/null +++ b/packages/linux/patches/linux-2.6.30-no-pcspkr-modalias.diff @@ -0,0 +1,11 @@ +diff -up linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx linux-2.6.30.noarch/drivers/input/misc/pcspkr.c +--- linux-2.6.30.noarch/drivers/input/misc/pcspkr.c.jx 2009-07-28 16:54:44.000000000 -0400 ++++ linux-2.6.30.noarch/drivers/input/misc/pcspkr.c 2009-07-28 16:59:36.000000000 -0400 +@@ -23,7 +23,6 @@ + MODULE_AUTHOR("Vojtech Pavlik "); + MODULE_DESCRIPTION("PC Speaker beeper driver"); + MODULE_LICENSE("GPL"); +-MODULE_ALIAS("platform:pcspkr"); + + #if defined(CONFIG_MIPS) || defined(CONFIG_X86) + /* Use the global PIT lock ! */ diff --git a/packages/linux/patches/linux-2.6.31-silence-wacom.diff b/packages/linux/patches/linux-2.6.31-silence-wacom.diff new file mode 100644 index 0000000000..635709ea91 --- /dev/null +++ b/packages/linux/patches/linux-2.6.31-silence-wacom.diff @@ -0,0 +1,14 @@ +KERN_ERR is not appropriate for a printk level of a successful operation + + +--- linux-2.6.30/drivers/hid/hid-wacom.c~ 2009-09-04 10:37:20.000000000 -0700 ++++ linux-2.6.30/drivers/hid/hid-wacom.c 2009-09-04 10:37:20.000000000 -0700 +@@ -244,7 +244,7 @@ + ret = hid_register_driver(&wacom_driver); + if (ret) + printk(KERN_ERR "can't register wacom driver\n"); +- printk(KERN_ERR "wacom driver registered\n"); ++ printk(KERN_INFO "wacom driver registered\n"); + return ret; + } + diff --git a/packages/linux/patches/linux-2.6.33-ahci-alpm-accounting.diff b/packages/linux/patches/linux-2.6.33-ahci-alpm-accounting.diff new file mode 100644 index 0000000000..90ee7ad95b --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-ahci-alpm-accounting.diff @@ -0,0 +1,280 @@ +From f62ff8c98080b4a9e66f82f793145b863b4e183a Mon Sep 17 00:00:00 2001 +From: Arjan van de Ven +Date: Fri, 13 Nov 2009 16:54:37 -0800 +Subject: [PATCH] libata: Add ALPM power state accounting to the AHCI driver + +PowerTOP wants to be able to show the user how effective the ALPM link +power management is for the user. ALPM is worth around 0.5W on a quiet +link; PowerTOP wants to be able to find cases where the "quiet link" isn't +actually quiet. + +This patch adds state accounting functionality to the AHCI driver for +PowerTOP to use. +The parts of the patch are +1) the sysfs logic of exposing the stats for each state in sysfs +2) the basic accounting logic that gets update on link change interrupts + (or when the user accesses the info from sysfs) +3) a "accounting enable" flag; in order to get the accounting to work, + the driver needs to get phyrdy interrupts on link status changes. + Normally and currently this is disabled by the driver when ALPM is + on (to reduce overhead); when PowerTOP is running this will need + to be on to get usable statistics... hence the sysfs tunable. + +The PowerTOP output currently looks like this: + +Recent SATA AHCI link activity statistics +Active Partial Slumber Device name + 0.5% 99.5% 0.0% host0 + +(work to resolve "host0" to a more human readable name is in progress) + +Signed-off-by: Arjan van de Ven +--- + drivers/ata/ahci.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 files changed, 173 insertions(+), 2 deletions(-) + +diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c +index a3241a1..448d684 100644 +--- a/drivers/ata/ahci.c ++++ b/drivers/ata/ahci.c +@@ -72,6 +72,21 @@ MODULE_PARM_DESC(ignore_sss, "Ignore staggered spinup flag (0=don't ignore, 1=ig + static int ahci_enable_alpm(struct ata_port *ap, + enum link_pm policy); + static void ahci_disable_alpm(struct ata_port *ap); ++ ++static ssize_t ahci_alpm_show_active(struct device *dev, ++ struct device_attribute *attr, char *buf); ++static ssize_t ahci_alpm_show_slumber(struct device *dev, ++ struct device_attribute *attr, char *buf); ++static ssize_t ahci_alpm_show_partial(struct device *dev, ++ struct device_attribute *attr, char *buf); ++ ++static ssize_t ahci_alpm_show_accounting(struct device *dev, ++ struct device_attribute *attr, char *buf); ++ ++static ssize_t ahci_alpm_set_accounting(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count); ++ + static ssize_t ahci_led_show(struct ata_port *ap, char *buf); + static ssize_t ahci_led_store(struct ata_port *ap, const char *buf, + size_t size); +@@ -289,6 +304,13 @@ struct ahci_host_priv { + u32 em_loc; /* enclosure management location */ + }; + ++enum ahci_port_states { ++ AHCI_PORT_NOLINK = 0, ++ AHCI_PORT_ACTIVE = 1, ++ AHCI_PORT_PARTIAL = 2, ++ AHCI_PORT_SLUMBER = 3 ++}; ++ + struct ahci_port_priv { + struct ata_link *active_link; + struct ahci_cmd_hdr *cmd_slot; +@@ -304,6 +326,14 @@ struct ahci_port_priv { + u32 intr_mask; /* interrupts to enable */ + /* enclosure management info per PM slot */ + struct ahci_em_priv em_priv[EM_MAX_SLOTS]; ++ ++ /* ALPM accounting state and stats */ ++ unsigned int accounting_active:1; ++ u64 active_jiffies; ++ u64 partial_jiffies; ++ u64 slumber_jiffies; ++ int previous_state; ++ int previous_jiffies; + }; + + static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); +@@ -359,6 +389,12 @@ DEVICE_ATTR(ahci_host_cap2, S_IRUGO, ahci_show_host_cap2, NULL); + DEVICE_ATTR(ahci_host_version, S_IRUGO, ahci_show_host_version, NULL); + DEVICE_ATTR(ahci_port_cmd, S_IRUGO, ahci_show_port_cmd, NULL); + ++DEVICE_ATTR(ahci_alpm_active, S_IRUGO, ahci_alpm_show_active, NULL); ++DEVICE_ATTR(ahci_alpm_partial, S_IRUGO, ahci_alpm_show_partial, NULL); ++DEVICE_ATTR(ahci_alpm_slumber, S_IRUGO, ahci_alpm_show_slumber, NULL); ++DEVICE_ATTR(ahci_alpm_accounting, S_IRUGO | S_IWUSR, ++ ahci_alpm_show_accounting, ahci_alpm_set_accounting); ++ + static struct device_attribute *ahci_shost_attrs[] = { + &dev_attr_link_power_management_policy, + &dev_attr_em_message_type, +@@ -367,6 +403,10 @@ static struct device_attribute *ahci_shost_attrs[] = { + &dev_attr_ahci_host_cap2, + &dev_attr_ahci_host_version, + &dev_attr_ahci_port_cmd, ++ &dev_attr_ahci_alpm_active, ++ &dev_attr_ahci_alpm_partial, ++ &dev_attr_ahci_alpm_slumber, ++ &dev_attr_ahci_alpm_accounting, + NULL + }; + +@@ -1165,9 +1205,14 @@ static int ahci_enable_alpm(struct ata_port *ap, + * getting woken up due to spurious phy ready interrupts + * TBD - Hot plug should be done via polling now, is + * that even supported? ++ * ++ * However, when accounting_active is set, we do want ++ * the interrupts for accounting purposes. + */ +- pp->intr_mask &= ~PORT_IRQ_PHYRDY; +- writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); ++ if (!pp->accounting_active) { ++ pp->intr_mask &= ~PORT_IRQ_PHYRDY; ++ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); ++ } + + /* + * Set a flag to indicate that we should ignore all PhyRdy +@@ -2157,6 +2202,137 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) + ata_port_abort(ap); + } + ++static int get_current_alpm_state(struct ata_port *ap) ++{ ++ u32 status = 0; ++ ++ ahci_scr_read(&ap->link, SCR_STATUS, &status); ++ ++ /* link status is in bits 11-8 */ ++ status = status >> 8; ++ status = status & 0x7; ++ ++ if (status == 6) ++ return AHCI_PORT_SLUMBER; ++ if (status == 2) ++ return AHCI_PORT_PARTIAL; ++ if (status == 1) ++ return AHCI_PORT_ACTIVE; ++ return AHCI_PORT_NOLINK; ++} ++ ++static void account_alpm_stats(struct ata_port *ap) ++{ ++ struct ahci_port_priv *pp; ++ ++ int new_state; ++ u64 new_jiffies, jiffies_delta; ++ ++ if (ap == NULL) ++ return; ++ pp = ap->private_data; ++ ++ new_state = get_current_alpm_state(ap); ++ new_jiffies = jiffies; ++ ++ jiffies_delta = new_jiffies - pp->previous_jiffies; ++ ++ switch (pp->previous_state) { ++ case AHCI_PORT_NOLINK: ++ pp->active_jiffies = 0; ++ pp->partial_jiffies = 0; ++ pp->slumber_jiffies = 0; ++ break; ++ case AHCI_PORT_ACTIVE: ++ pp->active_jiffies += jiffies_delta; ++ break; ++ case AHCI_PORT_PARTIAL: ++ pp->partial_jiffies += jiffies_delta; ++ break; ++ case AHCI_PORT_SLUMBER: ++ pp->slumber_jiffies += jiffies_delta; ++ break; ++ default: ++ break; ++ } ++ pp->previous_state = new_state; ++ pp->previous_jiffies = new_jiffies; ++} ++ ++static ssize_t ahci_alpm_show_active(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ struct ahci_port_priv *pp = ap->private_data; ++ ++ account_alpm_stats(ap); ++ ++ return sprintf(buf, "%u\n", jiffies_to_msecs(pp->active_jiffies)); ++} ++ ++static ssize_t ahci_alpm_show_partial(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ struct ahci_port_priv *pp = ap->private_data; ++ ++ account_alpm_stats(ap); ++ ++ return sprintf(buf, "%u\n", jiffies_to_msecs(pp->partial_jiffies)); ++} ++ ++static ssize_t ahci_alpm_show_slumber(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ struct ahci_port_priv *pp = ap->private_data; ++ ++ account_alpm_stats(ap); ++ ++ return sprintf(buf, "%u\n", jiffies_to_msecs(pp->slumber_jiffies)); ++} ++ ++ ++static ssize_t ahci_alpm_show_accounting(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ struct ahci_port_priv *pp = ap->private_data; ++ ++ return sprintf(buf, "%u\n", pp->accounting_active); ++} ++ ++static ssize_t ahci_alpm_set_accounting(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ unsigned long flags; ++ struct Scsi_Host *shost = class_to_shost(dev); ++ struct ata_port *ap = ata_shost_to_port(shost); ++ struct ahci_port_priv *pp = ap->private_data; ++ void __iomem *port_mmio = ahci_port_base(ap); ++ ++ if (!pp) ++ return 1; ++ if (buf[0] == '0') ++ pp->accounting_active = 0; ++ if (buf[0] == '1') ++ pp->accounting_active = 1; ++ ++ /* we need to enable the PHYRDY interrupt when we want accounting */ ++ if (pp->accounting_active) { ++ spin_lock_irqsave(ap->lock, flags); ++ pp->intr_mask |= PORT_IRQ_PHYRDY; ++ writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); ++ spin_unlock_irqrestore(ap->lock, flags); ++ } ++ return count; ++} ++ + static void ahci_port_intr(struct ata_port *ap) + { + void __iomem *port_mmio = ahci_port_base(ap); +@@ -2182,6 +2352,7 @@ static void ahci_port_intr(struct ata_port *ap) + if ((hpriv->flags & AHCI_HFLAG_NO_HOTPLUG) && + (status & PORT_IRQ_PHYRDY)) { + status &= ~PORT_IRQ_PHYRDY; ++ account_alpm_stats(ap); + ahci_scr_write(&ap->link, SCR_ERROR, ((1 << 16) | (1 << 18))); + } + +-- +1.6.0.6 + diff --git a/packages/linux/patches/linux-2.6.33-drm-i915-enable-memory-self-refresh-on-9xx.diff b/packages/linux/patches/linux-2.6.33-drm-i915-enable-memory-self-refresh-on-9xx.diff new file mode 100644 index 0000000000..05ec7fce93 --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-drm-i915-enable-memory-self-refresh-on-9xx.diff @@ -0,0 +1,93 @@ +From 7373cc1452c551f7c3ef7523483d76d2dd16373e Mon Sep 17 00:00:00 2001 +From: Li Peng +Date: Tue, 19 Jan 2010 02:13:00 -0500 +Subject: drm/i915: enable memory self refresh on 9xx + +Enabling memory self refresh (SR) on 9xx needs to set additional +register bits. On 945, we need bit 31 of FW_BLC_SELF to enable the +write to self refresh bit and bit 16 to enable the write of self +refresh watermark. On 915, bit 12 of INSTPM is used to enable SR. + +SR will take effect when CPU enters C3+ state and its entry/exit +should be automatically controlled by H/W, driver only needs to set +SR enable bits in wm update. But this isn't safe in my test on 945 +because GPU is hung. So this patch explicitly enables SR when GPU +is idle, and disables SR when it is busy. In my test on a netbook of +945GSE chipset, it saves about 0.8W idle power. + +Signed-off-by: Li Peng +--- + drivers/gpu/drm/i915/i915_reg.h | 5 ++++- + drivers/gpu/drm/i915/intel_display.c | 22 +++++++++++++++++++++- + 2 files changed, 25 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +index 847006c..3921e5a 100644 +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -306,11 +306,14 @@ + #define I915_ERROR_MEMORY_REFRESH (1<<1) + #define I915_ERROR_INSTRUCTION (1<<0) + #define INSTPM 0x020c0 ++#define INSTPM_SELF_EN (1<<12) /* 915GM only */ + #define ACTHD 0x020c8 + #define FW_BLC 0x020d8 + #define FW_BLC2 0x020dc + #define FW_BLC_SELF 0x020e0 /* 915+ only */ +-#define FW_BLC_SELF_EN (1<<15) ++#define FW_BLC_SELF_EN_MASK (1<<31) ++#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */ ++#define FW_BLC_SELF_EN (1<<15) /* 945 only */ + #define MM_BURST_LENGTH 0x00700000 + #define MM_FIFO_WATERMARK 0x0001F000 + #define LM_BURST_LENGTH 0x00000700 +diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c +index 45da78e..d042955 100644 +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -2629,7 +2629,13 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, + srwm = total_size - sr_entries; + if (srwm < 0) + srwm = 1; +- I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f)); ++ if (IS_I945G(dev) || IS_I945GM(dev)) ++ I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); ++ else if (IS_I915GM(dev)) { ++ /* 915M has a smaller SRWM field */ ++ I915_WRITE(FW_BLC_SELF, srwm & 0x3f); ++ I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN); ++ } + } + + DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", +@@ -3879,6 +3885,11 @@ static void intel_idle_update(struct work_struct *work) + + mutex_lock(&dev->struct_mutex); + ++ if (IS_I945G(dev) || IS_I945GM(dev)) { ++ DRM_DEBUG_DRIVER("enable memory self refresh on 945\n"); ++ I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); ++ } ++ + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + /* Skip inactive CRTCs */ + if (!crtc->fb) +@@ -3912,6 +3923,15 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj) + if (!drm_core_check_feature(dev, DRIVER_MODESET)) + return; + ++ if (IS_I945G(dev) || IS_I945GM(dev)) { ++ u32 fw_blc_self; ++ ++ DRM_DEBUG_DRIVER("disable memory self refresh on 945\n"); ++ fw_blc_self = I915_READ(FW_BLC_SELF); ++ fw_blc_self &= ~FW_BLC_SELF_EN; ++ I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK); ++ } ++ + if (!dev_priv->busy) + dev_priv->busy = true; + else +-- +1.6.1.3 + diff --git a/packages/linux/patches/linux-2.6.33-drm-i915-enable-vblank-for-ironlake.diff b/packages/linux/patches/linux-2.6.33-drm-i915-enable-vblank-for-ironlake.diff new file mode 100644 index 0000000000..9a70822343 --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-drm-i915-enable-vblank-for-ironlake.diff @@ -0,0 +1,95 @@ +From d9bd8741f35be8bdb11e4ff8ac513375188dcc2c Mon Sep 17 00:00:00 2001 +From: Li Peng +Date: Fri, 22 Jan 2010 20:59:59 +0800 +Subject: drm/i915: enable vblank interrupt on ironlake + +so far vblank interrupt on ironlake is disabled, this would cause +bad gfx performance if userspace calls drm_wait_vblank. This patch +enables vblank interrupt on ironlake and follows vblank get/put +model. + +Signed-off-by: Li Peng +--- + drivers/gpu/drm/i915/i915_irq.c | 30 +++++++++++++++++++----------- + drivers/gpu/drm/i915/intel_display.c | 1 + + 2 files changed, 20 insertions(+), 11 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index 89a071a..e7472d8 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -309,6 +309,12 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev) + if (de_iir & DE_GSE) + ironlake_opregion_gse_intr(dev); + ++ if (de_iir & DE_PIPEA_VBLANK) ++ drm_handle_vblank(dev, 0); ++ ++ if (de_iir & DE_PIPEB_VBLANK) ++ drm_handle_vblank(dev, 1); ++ + /* check event from PCH */ + if ((de_iir & DE_PCH_EVENT) && + (pch_iir & SDE_HOTPLUG_MASK)) { +@@ -844,11 +850,11 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) + if (!(pipeconf & PIPEACONF_ENABLE)) + return -EINVAL; + +- if (IS_IRONLAKE(dev)) +- return 0; +- + spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); +- if (IS_I965G(dev)) ++ if (IS_IRONLAKE(dev)) ++ ironlake_enable_display_irq(dev_priv, (pipe == 0) ? ++ DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); ++ else if (IS_I965G(dev)) + i915_enable_pipestat(dev_priv, pipe, + PIPE_START_VBLANK_INTERRUPT_ENABLE); + else +@@ -866,13 +872,14 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + unsigned long irqflags; + +- if (IS_IRONLAKE(dev)) +- return; +- + spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); +- i915_disable_pipestat(dev_priv, pipe, +- PIPE_VBLANK_INTERRUPT_ENABLE | +- PIPE_START_VBLANK_INTERRUPT_ENABLE); ++ if (IS_IRONLAKE(dev)) ++ ironlake_disable_display_irq(dev_priv, (pipe == 0) ? ++ DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); ++ else ++ i915_disable_pipestat(dev_priv, pipe, ++ PIPE_VBLANK_INTERRUPT_ENABLE | ++ PIPE_START_VBLANK_INTERRUPT_ENABLE); + spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); + } + +@@ -1015,7 +1022,8 @@ static int ironlake_irq_postinstall(struct drm_device *dev) + { + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + /* enable kind of interrupts always enabled */ +- u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT; ++ u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | ++ DE_PIPEA_VBLANK | DE_PIPEB_VBLANK; + u32 render_mask = GT_USER_INTERRUPT; + u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | + SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; +diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c +index 45da78e..2cc489b 100644 +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -1638,6 +1638,7 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) + case DRM_MODE_DPMS_OFF: + DRM_DEBUG_KMS("crtc %d dpms off\n", pipe); + ++ drm_vblank_off(dev, pipe); + /* Disable display plane */ + temp = I915_READ(dspcntr_reg); + if ((temp & DISPLAY_PLANE_ENABLE) != 0) { +-- +1.6.6 + diff --git a/packages/linux/patches/linux-2.6.33-drm-i915-pineview-deviceinfo-fix.diff b/packages/linux/patches/linux-2.6.33-drm-i915-pineview-deviceinfo-fix.diff new file mode 100644 index 0000000000..5885a61aec --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-drm-i915-pineview-deviceinfo-fix.diff @@ -0,0 +1,29 @@ +From 349ff4274278d4fd4abd47c638e048f679ea1ca4 Mon Sep 17 00:00:00 2001 +From: Li Peng +Date: Thu, 21 Jan 2010 18:09:13 +0800 +Subject: drm/i915: Fix the device info of Pineview + +Pineview doesn't has CXSR and need GTT-based hardware status page. +It fixes a X boot hung issue on Pinview since commit cfdf1f + +Signed-off-by: Li Peng +--- + drivers/gpu/drm/i915/i915_drv.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c +index 46d8896..ecac882 100644 +--- a/drivers/gpu/drm/i915/i915_drv.c ++++ b/drivers/gpu/drm/i915/i915_drv.c +@@ -120,7 +120,7 @@ const static struct intel_device_info intel_gm45_info = { + + const static struct intel_device_info intel_pineview_info = { + .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, +- .has_pipe_cxsr = 1, ++ .need_gfx_hws = 1, + .has_hotplug = 1, + }; + +-- +1.6.6 + diff --git a/packages/linux/patches/linux-2.6.33-rt2860-1-2.diff b/packages/linux/patches/linux-2.6.33-rt2860-1-2.diff new file mode 100644 index 0000000000..e67a826520 --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-rt2860-1-2.diff @@ -0,0 +1,48 @@ + +We should only send SIOCGIWAP event to notify wpa_supplicant about a lost +link, not to tell it about our disassociation being done. If we send such +event in both cases, this driver will drag wpa_supplicant into an infinite +loop. + +Signed-off-by: Samuel Ortiz +--- + drivers/staging/rt2860/sta/assoc.c | 6 ++++-- + drivers/staging/rt2860/sta_ioctl.c | 6 ++++++ + 2 files changed, 10 insertions(+), 2 deletions(-) + +-- +Index: b/drivers/staging/rt2860/sta/assoc.c +=================================================================== +--- a/drivers/staging/rt2860/sta/assoc.c 2010-01-05 11:25:22.000000000 +0100 ++++ b/drivers/staging/rt2860/sta/assoc.c 2010-01-05 18:09:34.000000000 +0100 +@@ -818,10 +818,11 @@ void MlmeDisassocReqAction(struct rt_rtm + COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr); + + RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */ +- pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP; + +- RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); ++ pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP; + ++ if (INFRA_ON(pAd) || ADHOC_ON(pAd)) ++ RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); + } + + /* +Index: b/drivers/staging/rt2860/sta_ioctl.c +=================================================================== +--- a/drivers/staging/rt2860/sta_ioctl.c 2010-01-05 11:25:22.000000000 +0100 ++++ b/drivers/staging/rt2860/sta_ioctl.c 2010-01-05 12:55:16.000000000 +0100 +@@ -602,6 +602,12 @@ int rt_ioctl_siwap(struct net_device *de + DBGPRINT(RT_DEBUG_TRACE, + ("MLME busy, reset MLME state machine!\n")); + } ++ ++ /* No need to set our BSSID if it's not changing */ ++ if (!memcmp(pAdapter->CommonCfg.Bssid, ap_addr->sa_data, ETH_ALEN) || ++ !memcmp(pAdapter->MlmeAux.Bssid, ap_addr->sa_data, ETH_ALEN)) ++ return 0; ++ + /* tell CNTL state machine to call NdisMSetInformationComplete() after completing */ + /* this request, because this request is initiated by NDIS. */ + pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE; diff --git a/packages/linux/patches/linux-2.6.33-rt2860-2-2.diff b/packages/linux/patches/linux-2.6.33-rt2860-2-2.diff new file mode 100644 index 0000000000..20402b87cb --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-rt2860-2-2.diff @@ -0,0 +1,24 @@ + +When no SSID is set, the reconnect decision should entirely be left to +userspace. The driver should not decide which AP to associate with based on +arbitrary policies. + +Signed-off-by: Samuel Ortiz +--- + drivers/staging/rt2860/common/mlme.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: b/drivers/staging/rt2860/common/mlme.c +=================================================================== +--- a/drivers/staging/rt2860/common/mlme.c 2010-01-05 11:25:22.000000000 +0100 ++++ b/drivers/staging/rt2860/common/mlme.c 2010-01-05 13:10:32.000000000 +0100 +@@ -1554,7 +1554,8 @@ void MlmeAutoReconnectLastSSID(struct rt + else if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) && + (MlmeValidateSSID + (pAd->MlmeAux.AutoReconnectSsid, +- pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) { ++ pAd->MlmeAux.AutoReconnectSsidLen) == TRUE) && ++ (pAd->MlmeAux.AutoReconnectSsidLen != 0)) { + struct rt_ndis_802_11_ssid OidSsid; + OidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen; + NdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid, diff --git a/packages/linux/patches/linux-2.6.33-vfs-tracepoints.diff b/packages/linux/patches/linux-2.6.33-vfs-tracepoints.diff new file mode 100644 index 0000000000..7bf425a798 --- /dev/null +++ b/packages/linux/patches/linux-2.6.33-vfs-tracepoints.diff @@ -0,0 +1,120 @@ +From f56c995174cf42d84fdad06beebacd56e700b05d Mon Sep 17 00:00:00 2001 +From: Arjan van de Ven +Date: Sun, 25 Oct 2009 15:37:04 -0700 +Subject: [PATCH] vfs: Add a trace point in the mark_inode_dirty function + +PowerTOP would like to be able to show who is keeping the disk +busy by dirtying data. The most logical spot for this is in the vfs +in the mark_inode_dirty() function, doing this on the block level +is not possible because by the time the IO hits the block layer the +guilty party can no longer be found ("kjournald" and "pdflush" are not +useful answers to "who caused this file to be dirty). + +The trace point follows the same logic/style as the block_dump code +and pretty much dumps the same data, just not to dmesg (and thus to +/var/log/messages) but via the trace events streams. + +Signed-of-by: Arjan van de Ven +--- + fs/fs-writeback.c | 4 +++ + fs/inode.c | 4 +++ + include/trace/events/vfs.h | 53 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 61 insertions(+), 0 deletions(-) + create mode 100644 include/trace/events/vfs.h + +diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c +index 9d5360c..af31caf 100644 +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include "internal.h" + + #define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) +@@ -1061,6 +1062,9 @@ void __mark_inode_dirty(struct inode *inode, int flags) + sb->s_op->dirty_inode(inode); + } + ++ if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)) ++ trace_dirty_inode(inode, current); ++ + /* + * make sure that changes are seen by all cpus before we test i_state + * -- mikulas +diff --git a/fs/inode.c b/fs/inode.c +index 4d8e3be..a61e8ba 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -1624,3 +1624,7 @@ void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev) + inode->i_ino); + } + EXPORT_SYMBOL(init_special_inode); ++ ++#define CREATE_TRACE_POINTS ++#include ++ +diff --git a/include/trace/events/vfs.h b/include/trace/events/vfs.h +new file mode 100644 +index 0000000..21cf9fb +--- /dev/null ++++ b/include/trace/events/vfs.h +@@ -0,0 +1,53 @@ ++#undef TRACE_SYSTEM ++#define TRACE_SYSTEM vfs ++ ++#if !defined(_TRACE_VFS_H) || defined(TRACE_HEADER_MULTI_READ) ++#define _TRACE_VFS_H ++ ++/* ++ * Tracepoint for dirtying an inode: ++ */ ++TRACE_EVENT(dirty_inode, ++ ++ TP_PROTO(struct inode *inode, struct task_struct *task), ++ ++ TP_ARGS(inode, task), ++ ++ TP_STRUCT__entry( ++ __array( char, comm, TASK_COMM_LEN ) ++ __field( pid_t, pid ) ++ __array( char, dev, 16 ) ++ __array( char, file, 32 ) ++ ), ++ ++ TP_fast_assign( ++ if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) { ++ struct dentry *dentry; ++ const char *name = "?"; ++ ++ dentry = d_find_alias(inode); ++ if (dentry) { ++ spin_lock(&dentry->d_lock); ++ name = (const char *) dentry->d_name.name; ++ } ++ ++ memcpy(__entry->comm, task->comm, TASK_COMM_LEN); ++ __entry->pid = task->pid; ++ strlcpy(__entry->file, name, 32); ++ strlcpy(__entry->dev, inode->i_sb->s_id, 16); ++ ++ if (dentry) { ++ spin_unlock(&dentry->d_lock); ++ dput(dentry); ++ } ++ } ++ ), ++ ++ TP_printk("task=%i (%s) file=%s dev=%s", ++ __entry->pid, __entry->comm, __entry->file, __entry->dev) ++); ++ ++#endif /* _TRACE_VFS_H */ ++ ++/* This part must be outside protection */ ++#include +-- +1.6.0.6 + diff --git a/packages/linux/patches/rtl8192_carrier_off.diff b/packages/linux/patches/rtl8192_carrier_off.diff new file mode 100644 index 0000000000..9148056467 --- /dev/null +++ b/packages/linux/patches/rtl8192_carrier_off.diff @@ -0,0 +1,52 @@ +Toggling the link carrier is a non sense and is the grossest locking I can +think of. Moreover, it's giving a completely inaccurate status to userspace +who could for example decide to turn the interface down on carrier off +detection. + +Signed-off-by: Samuel Ortiz +--- + drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c | 2 -- + drivers/staging/rtl8192e/r8192E_core.c | 1 - + 2 files changed, 3 deletions(-) + +Index: b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c +=================================================================== +--- a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c 2010-01-15 19:31:39.000000000 +0100 ++++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c 2010-01-15 19:32:07.000000000 +0100 +@@ -326,7 +326,6 @@ void ieee80211_wx_sync_scan_wq(struct ie + int b40M = 0; + static int count = 0; + chan = ieee->current_network.channel; +- netif_carrier_off(ieee->dev); + + if (ieee->data_hard_stop) + ieee->data_hard_stop(ieee->dev); +@@ -372,7 +371,6 @@ void ieee80211_wx_sync_scan_wq(struct ie + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) + ieee80211_start_send_beacons(ieee); + +- netif_carrier_on(ieee->dev); + count = 0; + up(&ieee->wx_sem); + +Index: b/drivers/staging/rtl8192e/r8192E_core.c +=================================================================== +--- a/drivers/staging/rtl8192e/r8192E_core.c 2010-01-15 20:03:06.000000000 +0100 ++++ b/drivers/staging/rtl8192e/r8192E_core.c 2010-01-15 20:03:11.000000000 +0100 +@@ -4046,7 +4046,6 @@ RESET_START: + del_timer_sync(&ieee->associate_timer); + cancel_delayed_work(&ieee->associate_retry_wq); + ieee80211_stop_scan(ieee); +- netif_carrier_off(dev); + up(&ieee->wx_sem); + } + else{ + +-- +Intel Open Source Technology Centre +http://oss.intel.com/ +_______________________________________________ +Moblin-kernel mailing list +Moblin-kernel@linux.intel.com +http://linux.intel.com/mailman/listinfo/moblin-kernel + diff --git a/packages/linux/patches/rtl8192_no_WAP_unassoc.diff b/packages/linux/patches/rtl8192_no_WAP_unassoc.diff new file mode 100644 index 0000000000..436945b30f --- /dev/null +++ b/packages/linux/patches/rtl8192_no_WAP_unassoc.diff @@ -0,0 +1,40 @@ +If we're not associated, we should not send wireless events to let userspace +know that we just left an ESSID, simply because we havent yet joined it. +If we keep on doing that, wpa_supplicant could receive such events while +actually trying to join an ESSID, and thus decide to stop trying. This leads +to a lot of connection failures as this driver seems to be sending GIWAP +events quite a lot. + +Signed-off-by: Samuel Ortiz +--- + drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +Index: b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c +=================================================================== +--- a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c 2010-01-15 16:57:48.000000000 +0100 ++++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c 2010-01-15 19:31:56.000000000 +0100 +@@ -2726,11 +2726,12 @@ void ieee80211_disassociate(struct ieee8 + if(IS_DOT11D_ENABLE(ieee)) + Dot11d_Reset(ieee); + #endif +- ieee->state = IEEE80211_NOLINK; + ieee->is_set_key = false; + ieee->link_change(ieee->dev); + //HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT); +- notify_wx_assoc_event(ieee); ++ if (ieee->state == IEEE80211_LINKED) ++ notify_wx_assoc_event(ieee); ++ ieee->state = IEEE80211_NOLINK; + + } + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + +-- +Intel Open Source Technology Centre +http://oss.intel.com/ +_______________________________________________ +Moblin-kernel mailing list +Moblin-kernel@linux.intel.com +http://linux.intel.com/mailman/listinfo/moblin-kernel + diff --git a/packages/linux/patches/rtl8192_no_autoconnect.diff b/packages/linux/patches/rtl8192_no_autoconnect.diff new file mode 100644 index 0000000000..9119535202 --- /dev/null +++ b/packages/linux/patches/rtl8192_no_autoconnect.diff @@ -0,0 +1,41 @@ +Getting a probe response after sending a probe request to a specific SSID +doesnt mean we're trying to associate with this SSID. +wpa_supplicant should be the only one deciding when to join an SSID, not the +kernel. + +Signed-off-by: Samuel Ortiz +--- + drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c | 4 ---- + 1 file changed, 4 deletions(-) + +Index: b/drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c +=================================================================== +--- a/drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c 2010-01-15 16:56:47.000000000 +0100 ++++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c 2010-01-15 16:57:03.000000000 +0100 +@@ -2716,8 +2716,6 @@ static inline void ieee80211_process_pro + #endif + memcpy(target, &network, sizeof(*target)); + list_add_tail(&target->list, &ieee->network_list); +- if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) +- ieee80211_softmac_new_net(ieee,&network); + } else { + IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", + escape_essid(target->ssid, +@@ -2744,8 +2742,6 @@ static inline void ieee80211_process_pro + //YJ,add,080819,for hidden ap,end + + update_network(target, &network); +- if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) +- ieee80211_softmac_new_net(ieee,&network); + } + + spin_unlock_irqrestore(&ieee->lock, flags); + +-- +Intel Open Source Technology Centre +http://oss.intel.com/ +_______________________________________________ +Moblin-kernel mailing list +Moblin-kernel@linux.intel.com +http://linux.intel.com/mailman/listinfo/moblin-kernel +