diff -druN linux-libre-3.0.60-gnu/arch/x86/include/asm/traps.h linux-libre-3.0.61-gnu/arch/x86/include/asm/traps.h
--- linux-libre-3.0.60-gnu/arch/x86/include/asm/traps.h	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/arch/x86/include/asm/traps.h	2013-01-27 23:52:34.000000000 -0500
@@ -1,6 +1,7 @@
 #ifndef _ASM_X86_TRAPS_H
 #define _ASM_X86_TRAPS_H
 
+#include <linux/kprobes.h>
 #include <asm/debugreg.h>
 #include <asm/siginfo.h>			/* TRAP_TRACE, ... */
 
@@ -87,4 +88,29 @@
 asmlinkage void mce_threshold_interrupt(void);
 #endif
 
+/* Interrupts/Exceptions */
+enum {
+	X86_TRAP_DE = 0,	/*  0, Divide-by-zero */
+	X86_TRAP_DB,		/*  1, Debug */
+	X86_TRAP_NMI,		/*  2, Non-maskable Interrupt */
+	X86_TRAP_BP,		/*  3, Breakpoint */
+	X86_TRAP_OF,		/*  4, Overflow */
+	X86_TRAP_BR,		/*  5, Bound Range Exceeded */
+	X86_TRAP_UD,		/*  6, Invalid Opcode */
+	X86_TRAP_NM,		/*  7, Device Not Available */
+	X86_TRAP_DF,		/*  8, Double Fault */
+	X86_TRAP_OLD_MF,	/*  9, Coprocessor Segment Overrun */
+	X86_TRAP_TS,		/* 10, Invalid TSS */
+	X86_TRAP_NP,		/* 11, Segment Not Present */
+	X86_TRAP_SS,		/* 12, Stack Segment Fault */
+	X86_TRAP_GP,		/* 13, General Protection Fault */
+	X86_TRAP_PF,		/* 14, Page Fault */
+	X86_TRAP_SPURIOUS,	/* 15, Spurious Interrupt */
+	X86_TRAP_MF,		/* 16, x87 Floating-Point Exception */
+	X86_TRAP_AC,		/* 17, Alignment Check */
+	X86_TRAP_MC,		/* 18, Machine Check */
+	X86_TRAP_XF,		/* 19, SIMD Floating-Point Exception */
+	X86_TRAP_IRET = 32,	/* 32, IRET Exception */
+};
+
 #endif /* _ASM_X86_TRAPS_H */
diff -druN linux-libre-3.0.60-gnu/drivers/acpi/processor_idle.c linux-libre-3.0.61-gnu/drivers/acpi/processor_idle.c
--- linux-libre-3.0.60-gnu/drivers/acpi/processor_idle.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/acpi/processor_idle.c	2013-01-27 23:52:34.000000000 -0500
@@ -991,6 +991,9 @@
 		return -EINVAL;
 	}
 
+	if (!dev)
+		return -EINVAL;
+
 	dev->cpu = pr->id;
 	for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
 		dev->states[i].name[0] = '\0';
diff -druN linux-libre-3.0.60-gnu/drivers/ata/ahci.c linux-libre-3.0.61-gnu/drivers/ata/ahci.c
--- linux-libre-3.0.60-gnu/drivers/ata/ahci.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/ata/ahci.c	2013-01-27 23:52:34.000000000 -0500
@@ -402,6 +402,12 @@
 	/* Promise */
 	{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },	/* PDC42819 */
 
+	/* Asmedia */
+	{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci },	/* ASM1060 */
+	{ PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci },	/* ASM1060 */
+	{ PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci },	/* ASM1061 */
+	{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },	/* ASM1062 */
+
 	/* Generic, PCI class code for AHCI */
 	{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
 	  PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
diff -druN linux-libre-3.0.60-gnu/drivers/dma/ioat/dma_v3.c linux-libre-3.0.61-gnu/drivers/dma/ioat/dma_v3.c
--- linux-libre-3.0.60-gnu/drivers/dma/ioat/dma_v3.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/dma/ioat/dma_v3.c	2013-01-27 23:52:34.000000000 -0500
@@ -949,7 +949,7 @@
 			goto free_resources;
 		}
 	}
-	dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_TO_DEVICE);
+	dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE);
 
 	/* skip validate if the capability is not present */
 	if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask))
diff -druN linux-libre-3.0.60-gnu/drivers/firmware/dmi_scan.c linux-libre-3.0.61-gnu/drivers/firmware/dmi_scan.c
--- linux-libre-3.0.60-gnu/drivers/firmware/dmi_scan.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/firmware/dmi_scan.c	2013-01-27 23:52:34.000000000 -0500
@@ -16,6 +16,7 @@
  */
 static char dmi_empty_string[] = "        ";
 
+static u16 __initdata dmi_ver;
 /*
  * Catch too early calls to dmi_check_system():
  */
@@ -118,12 +119,12 @@
 	return 0;
 }
 
-static int __init dmi_checksum(const u8 *buf)
+static int __init dmi_checksum(const u8 *buf, u8 len)
 {
 	u8 sum = 0;
 	int a;
 
-	for (a = 0; a < 15; a++)
+	for (a = 0; a < len; a++)
 		sum += buf[a];
 
 	return sum == 0;
@@ -161,8 +162,10 @@
 		return;
 
 	for (i = 0; i < 16 && (is_ff || is_00); i++) {
-		if(d[i] != 0x00) is_ff = 0;
-		if(d[i] != 0xFF) is_00 = 0;
+		if (d[i] != 0x00)
+			is_00 = 0;
+		if (d[i] != 0xFF)
+			is_ff = 0;
 	}
 
 	if (is_ff || is_00)
@@ -172,7 +175,15 @@
 	if (!s)
 		return;
 
-	sprintf(s, "%pUB", d);
+	/*
+	 * As of version 2.6 of the SMBIOS specification, the first 3 fields of
+	 * the UUID are supposed to be little-endian encoded.  The specification
+	 * says that this is the defacto standard.
+	 */
+	if (dmi_ver >= 0x0206)
+		sprintf(s, "%pUL", d);
+	else
+		sprintf(s, "%pUB", d);
 
         dmi_ident[slot] = s;
 }
@@ -404,29 +415,57 @@
 	u8 buf[15];
 
 	memcpy_fromio(buf, p, 15);
-	if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) {
+	if (dmi_checksum(buf, 15)) {
 		dmi_num = (buf[13] << 8) | buf[12];
 		dmi_len = (buf[7] << 8) | buf[6];
 		dmi_base = (buf[11] << 24) | (buf[10] << 16) |
 			(buf[9] << 8) | buf[8];
 
-		/*
-		 * DMI version 0.0 means that the real version is taken from
-		 * the SMBIOS version, which we don't know at this point.
-		 */
-		if (buf[14] != 0)
-			printk(KERN_INFO "DMI %d.%d present.\n",
-			       buf[14] >> 4, buf[14] & 0xF);
-		else
-			printk(KERN_INFO "DMI present.\n");
 		if (dmi_walk_early(dmi_decode) == 0) {
+			if (dmi_ver)
+				pr_info("SMBIOS %d.%d present.\n",
+				       dmi_ver >> 8, dmi_ver & 0xFF);
+			else {
+				dmi_ver = (buf[14] & 0xF0) << 4 |
+					   (buf[14] & 0x0F);
+				pr_info("Legacy DMI %d.%d present.\n",
+				       dmi_ver >> 8, dmi_ver & 0xFF);
+			}
 			dmi_dump_ids();
 			return 0;
 		}
 	}
+	dmi_ver = 0;
 	return 1;
 }
 
+static int __init smbios_present(const char __iomem *p)
+{
+	u8 buf[32];
+	int offset = 0;
+
+	memcpy_fromio(buf, p, 32);
+	if ((buf[5] < 32) && dmi_checksum(buf, buf[5])) {
+		dmi_ver = (buf[6] << 8) + buf[7];
+
+		/* Some BIOS report weird SMBIOS version, fix that up */
+		switch (dmi_ver) {
+		case 0x021F:
+		case 0x0221:
+			pr_debug("SMBIOS version fixup(2.%d->2.%d)\n",
+			       dmi_ver & 0xFF, 3);
+			dmi_ver = 0x0203;
+			break;
+		case 0x0233:
+			pr_debug("SMBIOS version fixup(2.%d->2.%d)\n", 51, 6);
+			dmi_ver = 0x0206;
+			break;
+		}
+		offset = 16;
+	}
+	return dmi_present(buf + offset);
+}
+
 void __init dmi_scan_machine(void)
 {
 	char __iomem *p, *q;
@@ -444,7 +483,7 @@
 		if (p == NULL)
 			goto error;
 
-		rc = dmi_present(p + 0x10); /* offset of _DMI_ string */
+		rc = smbios_present(p);
 		dmi_iounmap(p, 32);
 		if (!rc) {
 			dmi_available = 1;
@@ -462,7 +501,12 @@
 			goto error;
 
 		for (q = p; q < p + 0x10000; q += 16) {
-			rc = dmi_present(q);
+			if (memcmp(q, "_SM_", 4) == 0 && q - p <= 0xFFE0)
+				rc = smbios_present(q);
+			else if (memcmp(q, "_DMI_", 5) == 0)
+				rc = dmi_present(q);
+			else
+				continue;
 			if (!rc) {
 				dmi_available = 1;
 				dmi_iounmap(p, 0x10000);
diff -druN linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/i915_gem_execbuffer.c linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/i915_gem_execbuffer.c
--- linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/i915_gem_execbuffer.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/i915_gem_execbuffer.c	2013-01-27 23:52:34.000000000 -0500
@@ -655,6 +655,8 @@
 	total = 0;
 	for (i = 0; i < count; i++) {
 		struct drm_i915_gem_relocation_entry __user *user_relocs;
+		u64 invalid_offset = (u64)-1;
+		int j;
 
 		user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr;
 
@@ -665,6 +667,25 @@
 			goto err;
 		}
 
+		/* As we do not update the known relocation offsets after
+		 * relocating (due to the complexities in lock handling),
+		 * we need to mark them as invalid now so that we force the
+		 * relocation processing next time. Just in case the target
+		 * object is evicted and then rebound into its old
+		 * presumed_offset before the next execbuffer - if that
+		 * happened we would make the mistake of assuming that the
+		 * relocations were valid.
+		 */
+		for (j = 0; j < exec[i].relocation_count; j++) {
+			if (copy_to_user(&user_relocs[j].presumed_offset,
+					 &invalid_offset,
+					 sizeof(invalid_offset))) {
+				ret = -EFAULT;
+				mutex_lock(&dev->struct_mutex);
+				goto err;
+			}
+		}
+
 		reloc_offset[i] = total;
 		total += exec[i].relocation_count;
 	}
diff -druN linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/i915_reg.h linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/i915_reg.h
--- linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/i915_reg.h	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/i915_reg.h	2013-01-27 23:52:34.000000000 -0500
@@ -27,6 +27,8 @@
 
 #define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a)))
 
+#define _MASKED_BIT_ENABLE(a) (((a) << 16) | (a))
+
 /*
  * The Bridge device's PCI config space has information about the
  * fb aperture size and the amount of pre-reserved memory.
@@ -354,6 +356,7 @@
  * the enables for writing to the corresponding low bit.
  */
 #define _3D_CHICKEN	0x02084
+#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB	(1 << 10)
 #define _3D_CHICKEN2	0x0208c
 /* Disables pipelining of read flushes past the SF-WIZ interface.
  * Required on all Ironlake steppings according to the B-Spec, but the
diff -druN linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/intel_display.c linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/intel_display.c
--- linux-libre-3.0.60-gnu/drivers/gpu/drm/i915/intel_display.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/gpu/drm/i915/intel_display.c	2013-01-27 23:52:34.000000000 -0500
@@ -7412,6 +7412,10 @@
 		   I915_READ(ILK_DISPLAY_CHICKEN2) |
 		   ILK_ELPIN_409_SELECT);
 
+	/* WaDisableHiZPlanesWhenMSAAEnabled */
+	I915_WRITE(_3D_CHICKEN,
+		   _MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB));
+
 	I915_WRITE(WM3_LP_ILK, 0);
 	I915_WRITE(WM2_LP_ILK, 0);
 	I915_WRITE(WM1_LP_ILK, 0);
diff -druN linux-libre-3.0.60-gnu/drivers/misc/sgi-xp/xpc_main.c linux-libre-3.0.61-gnu/drivers/misc/sgi-xp/xpc_main.c
--- linux-libre-3.0.60-gnu/drivers/misc/sgi-xp/xpc_main.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/misc/sgi-xp/xpc_main.c	2013-01-27 23:52:34.000000000 -0500
@@ -53,6 +53,10 @@
 #include <linux/kthread.h>
 #include "xpc.h"
 
+#ifdef CONFIG_X86_64
+#include <asm/traps.h>
+#endif
+
 /* define two XPC debug device structures to be used with dev_dbg() et al */
 
 struct device_driver xpc_dbg_name = {
@@ -1079,6 +1083,9 @@
 	return NOTIFY_DONE;
 }
 
+/* Used to only allow one cpu to complete disconnect */
+static unsigned int xpc_die_disconnecting;
+
 /*
  * Notify other partitions to deactivate from us by first disengaging from all
  * references to our memory.
@@ -1092,6 +1099,9 @@
 	long keep_waiting;
 	long wait_to_print;
 
+	if (cmpxchg(&xpc_die_disconnecting, 0, 1))
+		return;
+
 	/* keep xpc_hb_checker thread from doing anything (just in case) */
 	xpc_exiting = 1;
 
@@ -1159,7 +1169,7 @@
  * about the lack of a heartbeat.
  */
 static int
-xpc_system_die(struct notifier_block *nb, unsigned long event, void *unused)
+xpc_system_die(struct notifier_block *nb, unsigned long event, void *_die_args)
 {
 #ifdef CONFIG_IA64		/* !!! temporary kludge */
 	switch (event) {
@@ -1191,7 +1201,27 @@
 		break;
 	}
 #else
-	xpc_die_deactivate();
+	struct die_args *die_args = _die_args;
+
+	switch (event) {
+	case DIE_TRAP:
+		if (die_args->trapnr == X86_TRAP_DF)
+			xpc_die_deactivate();
+
+		if (((die_args->trapnr == X86_TRAP_MF) ||
+		     (die_args->trapnr == X86_TRAP_XF)) &&
+		    !user_mode_vm(die_args->regs))
+			xpc_die_deactivate();
+
+		break;
+	case DIE_INT3:
+	case DIE_DEBUG:
+		break;
+	case DIE_OOPS:
+	case DIE_GPF:
+	default:
+		xpc_die_deactivate();
+	}
 #endif
 
 	return NOTIFY_DONE;
diff -druN linux-libre-3.0.60-gnu/drivers/pci/pcie/aspm.c linux-libre-3.0.61-gnu/drivers/pci/pcie/aspm.c
--- linux-libre-3.0.60-gnu/drivers/pci/pcie/aspm.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/pci/pcie/aspm.c	2013-01-27 23:52:34.000000000 -0500
@@ -790,6 +790,9 @@
 {
 	struct pci_dev *child;
 
+	if (aspm_force)
+		return;
+
 	/*
 	 * Clear any ASPM setup that the firmware has carried out on this bus
 	 */
diff -druN linux-libre-3.0.60-gnu/drivers/scsi/sd.c linux-libre-3.0.61-gnu/drivers/scsi/sd.c
--- linux-libre-3.0.60-gnu/drivers/scsi/sd.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/scsi/sd.c	2013-01-27 23:52:34.000000000 -0500
@@ -2826,10 +2826,6 @@
 	if (err)
 		goto err_out;
 
-	err = scsi_register_driver(&sd_template.gendrv);
-	if (err)
-		goto err_out_class;
-
 	sd_cdb_cache = kmem_cache_create("sd_ext_cdb", SD_EXT_CDB_SIZE,
 					 0, 0, NULL);
 	if (!sd_cdb_cache) {
@@ -2843,8 +2839,15 @@
 		goto err_out_cache;
 	}
 
+	err = scsi_register_driver(&sd_template.gendrv);
+	if (err)
+		goto err_out_driver;
+
 	return 0;
 
+err_out_driver:
+	mempool_destroy(sd_cdb_pool);
+
 err_out_cache:
 	kmem_cache_destroy(sd_cdb_cache);
 
@@ -2867,10 +2870,10 @@
 
 	SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
 
+	scsi_unregister_driver(&sd_template.gendrv);
 	mempool_destroy(sd_cdb_pool);
 	kmem_cache_destroy(sd_cdb_cache);
 
-	scsi_unregister_driver(&sd_template.gendrv);
 	class_unregister(&sd_disk_class);
 
 	for (i = 0; i < SD_MAJORS; i++)
diff -druN linux-libre-3.0.60-gnu/drivers/staging/usbip/usbip_common.c linux-libre-3.0.61-gnu/drivers/staging/usbip/usbip_common.c
--- linux-libre-3.0.60-gnu/drivers/staging/usbip/usbip_common.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/staging/usbip/usbip_common.c	2013-01-27 23:52:34.000000000 -0500
@@ -761,26 +761,25 @@
  * buffer and iso packets need to be stored and be in propeper endian in urb
  * before calling this function
  */
-int usbip_pad_iso(struct usbip_device *ud, struct urb *urb)
+void usbip_pad_iso(struct usbip_device *ud, struct urb *urb)
 {
 	int np = urb->number_of_packets;
 	int i;
-	int ret;
 	int actualoffset = urb->actual_length;
 
 	if (!usb_pipeisoc(urb->pipe))
-		return 0;
+		return;
 
 	/* if no packets or length of data is 0, then nothing to unpack */
 	if (np == 0 || urb->actual_length == 0)
-		return 0;
+		return;
 
 	/*
 	 * if actual_length is transfer_buffer_length then no padding is
 	 * present.
 	*/
 	if (urb->actual_length == urb->transfer_buffer_length)
-		return 0;
+		return;
 
 	/*
 	 * loop over all packets from last to first (to prevent overwritting
@@ -792,8 +791,6 @@
 			urb->transfer_buffer + actualoffset,
 			urb->iso_frame_desc[i].actual_length);
 	}
-
-	return ret;
 }
 EXPORT_SYMBOL_GPL(usbip_pad_iso);
 
diff -druN linux-libre-3.0.60-gnu/drivers/staging/usbip/usbip_common.h linux-libre-3.0.61-gnu/drivers/staging/usbip/usbip_common.h
--- linux-libre-3.0.60-gnu/drivers/staging/usbip/usbip_common.h	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/staging/usbip/usbip_common.h	2013-01-27 23:52:34.000000000 -0500
@@ -327,7 +327,7 @@
 /* some members of urb must be substituted before. */
 int usbip_recv_iso(struct usbip_device *ud, struct urb *urb);
 /* some members of urb must be substituted before. */
-int usbip_pad_iso(struct usbip_device *ud, struct urb *urb);
+void usbip_pad_iso(struct usbip_device *ud, struct urb *urb);
 void *usbip_alloc_iso_desc_pdu(struct urb *urb, ssize_t *bufflen);
 
 /* usbip_event.c */
diff -druN linux-libre-3.0.60-gnu/drivers/staging/usbip/vhci_rx.c linux-libre-3.0.61-gnu/drivers/staging/usbip/vhci_rx.c
--- linux-libre-3.0.60-gnu/drivers/staging/usbip/vhci_rx.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/staging/usbip/vhci_rx.c	2013-01-27 23:52:34.000000000 -0500
@@ -94,8 +94,7 @@
 		return;
 
 	/* restore the padding in iso packets */
-	if (usbip_pad_iso(ud, urb) < 0)
-		return;
+	usbip_pad_iso(ud, urb);
 
 	if (usbip_dbg_flag_vhci_rx)
 		usbip_dump_urb(urb);
diff -druN linux-libre-3.0.60-gnu/drivers/tty/serial/8250.c linux-libre-3.0.61-gnu/drivers/tty/serial/8250.c
--- linux-libre-3.0.60-gnu/drivers/tty/serial/8250.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/tty/serial/8250.c	2013-01-27 23:52:34.000000000 -0500
@@ -81,7 +81,7 @@
 #define DEBUG_INTR(fmt...)	do { } while (0)
 #endif
 
-#define PASS_LIMIT	256
+#define PASS_LIMIT	512
 
 #define BOTH_EMPTY 	(UART_LSR_TEMT | UART_LSR_THRE)
 
diff -druN linux-libre-3.0.60-gnu/drivers/usb/host/uhci-hcd.c linux-libre-3.0.61-gnu/drivers/usb/host/uhci-hcd.c
--- linux-libre-3.0.60-gnu/drivers/usb/host/uhci-hcd.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/drivers/usb/host/uhci-hcd.c	2013-01-27 23:52:34.000000000 -0500
@@ -446,6 +446,10 @@
 		return IRQ_NONE;
 	uhci_writew(uhci, status, USBSTS);		/* Clear it */
 
+	spin_lock(&uhci->lock);
+	if (unlikely(!uhci->is_initialized))	/* not yet configured */
+		goto done;
+
 	if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) {
 		if (status & USBSTS_HSE)
 			dev_err(uhci_dev(uhci), "host system error, "
@@ -454,7 +458,6 @@
 			dev_err(uhci_dev(uhci), "host controller process "
 					"error, something bad happened!\n");
 		if (status & USBSTS_HCH) {
-			spin_lock(&uhci->lock);
 			if (uhci->rh_state >= UHCI_RH_RUNNING) {
 				dev_err(uhci_dev(uhci),
 					"host controller halted, "
@@ -472,15 +475,15 @@
 				 * pending unlinks */
 				mod_timer(&hcd->rh_timer, jiffies);
 			}
-			spin_unlock(&uhci->lock);
 		}
 	}
 
-	if (status & USBSTS_RD)
+	if (status & USBSTS_RD) {
+		spin_unlock(&uhci->lock);
 		usb_hcd_poll_rh_status(hcd);
-	else {
-		spin_lock(&uhci->lock);
+	} else {
 		uhci_scan_schedule(uhci);
+ done:
 		spin_unlock(&uhci->lock);
 	}
 
@@ -658,9 +661,9 @@
 	 */
 	mb();
 
+	spin_lock_irq(&uhci->lock);
 	configure_hc(uhci);
 	uhci->is_initialized = 1;
-	spin_lock_irq(&uhci->lock);
 	start_rh(uhci);
 	spin_unlock_irq(&uhci->lock);
 	return 0;
diff -druN linux-libre-3.0.60-gnu/include/linux/pci_ids.h linux-libre-3.0.61-gnu/include/linux/pci_ids.h
--- linux-libre-3.0.60-gnu/include/linux/pci_ids.h	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/include/linux/pci_ids.h	2013-01-27 23:52:34.000000000 -0500
@@ -2390,6 +2390,8 @@
 
 #define PCI_VENDOR_ID_AZWAVE		0x1a3b
 
+#define PCI_VENDOR_ID_ASMEDIA		0x1b21
+
 #define PCI_VENDOR_ID_TEKRAM		0x1de1
 #define PCI_DEVICE_ID_TEKRAM_DC290	0xdc29
 
diff -druN linux-libre-3.0.60-gnu/kernel/trace/ftrace.c linux-libre-3.0.61-gnu/kernel/trace/ftrace.c
--- linux-libre-3.0.60-gnu/kernel/trace/ftrace.c	2013-01-21 14:48:40.000000000 -0500
+++ linux-libre-3.0.61-gnu/kernel/trace/ftrace.c	2013-01-27 23:52:34.000000000 -0500
@@ -3460,7 +3460,7 @@
 
 struct notifier_block ftrace_module_nb = {
 	.notifier_call = ftrace_module_notify,
-	.priority = 0,
+	.priority = INT_MAX,	/* Run before anything that can use kprobes */
 };
 
 extern unsigned long __start_mcount_loc[];
diff -druN linux-libre-3.0.60-gnu/Makefile linux-libre-3.0.61-gnu/Makefile
--- linux-libre-3.0.60-gnu/Makefile	2013-01-22 04:35:47.000000000 -0500
+++ linux-libre-3.0.61-gnu/Makefile	2013-01-31 15:35:08.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 0
-SUBLEVEL = 60
+SUBLEVEL = 61
 EXTRAVERSION =-gnu
 NAME = Sneaky Weasel
 
