diff -druN linux-libre-3.7.3-gnu/arch/arm64/include/asm/pgtable.h linux-libre-3.7.4-gnu/arch/arm64/include/asm/pgtable.h
--- linux-libre-3.7.3-gnu/arch/arm64/include/asm/pgtable.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/arm64/include/asm/pgtable.h	2013-01-21 14:45:40.000000000 -0500
@@ -132,9 +132,8 @@
 #define pte_write(pte)		(!(pte_val(pte) & PTE_RDONLY))
 #define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN))
 
-#define pte_present_exec_user(pte) \
-	((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \
-	 (PTE_VALID | PTE_USER))
+#define pte_present_user(pte) \
+	((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
 
 #define PTE_BIT_FUNC(fn,op) \
 static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
@@ -157,10 +156,13 @@
 static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
 			      pte_t *ptep, pte_t pte)
 {
-	if (pte_present_exec_user(pte))
-		__sync_icache_dcache(pte, addr);
-	if (!pte_dirty(pte))
-		pte = pte_wrprotect(pte);
+	if (pte_present_user(pte)) {
+		if (pte_exec(pte))
+			__sync_icache_dcache(pte, addr);
+		if (!pte_dirty(pte))
+			pte = pte_wrprotect(pte);
+	}
+
 	set_pte(ptep, pte);
 }
 
diff -druN linux-libre-3.7.3-gnu/arch/s390/include/asm/timex.h linux-libre-3.7.4-gnu/arch/s390/include/asm/timex.h
--- linux-libre-3.7.3-gnu/arch/s390/include/asm/timex.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/s390/include/asm/timex.h	2013-01-21 14:45:40.000000000 -0500
@@ -128,4 +128,32 @@
 	return get_clock_xt() - sched_clock_base_cc;
 }
 
+/**
+ * tod_to_ns - convert a TOD format value to nanoseconds
+ * @todval: to be converted TOD format value
+ * Returns: number of nanoseconds that correspond to the TOD format value
+ *
+ * Converting a 64 Bit TOD format value to nanoseconds means that the value
+ * must be divided by 4.096. In order to achieve that we multiply with 125
+ * and divide by 512:
+ *
+ *    ns = (todval * 125) >> 9;
+ *
+ * In order to avoid an overflow with the multiplication we can rewrite this.
+ * With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits)
+ * we end up with
+ *
+ *    ns = ((2^32 * th + tl) * 125 ) >> 9;
+ * -> ns = (2^23 * th * 125) + ((tl * 125) >> 9);
+ *
+ */
+static inline unsigned long long tod_to_ns(unsigned long long todval)
+{
+	unsigned long long ns;
+
+	ns = ((todval >> 32) << 23) * 125;
+	ns += ((todval & 0xffffffff) * 125) >> 9;
+	return ns;
+}
+
 #endif
diff -druN linux-libre-3.7.3-gnu/arch/s390/kernel/time.c linux-libre-3.7.4-gnu/arch/s390/kernel/time.c
--- linux-libre-3.7.3-gnu/arch/s390/kernel/time.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/s390/kernel/time.c	2013-01-21 14:45:40.000000000 -0500
@@ -63,7 +63,7 @@
  */
 unsigned long long notrace __kprobes sched_clock(void)
 {
-	return (get_clock_monotonic() * 125) >> 9;
+	return tod_to_ns(get_clock_monotonic());
 }
 
 /*
diff -druN linux-libre-3.7.3-gnu/arch/s390/kvm/interrupt.c linux-libre-3.7.4-gnu/arch/s390/kvm/interrupt.c
--- linux-libre-3.7.3-gnu/arch/s390/kvm/interrupt.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/s390/kvm/interrupt.c	2013-01-21 14:45:40.000000000 -0500
@@ -408,7 +408,7 @@
 		return 0;
 	}
 
-	sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9;
+	sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);
 
 	hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);
 	VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime);
diff -druN linux-libre-3.7.3-gnu/arch/sh/include/asm/elf.h linux-libre-3.7.4-gnu/arch/sh/include/asm/elf.h
--- linux-libre-3.7.3-gnu/arch/sh/include/asm/elf.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/sh/include/asm/elf.h	2013-01-21 14:45:40.000000000 -0500
@@ -203,9 +203,9 @@
 	if (vdso_enabled)					\
 		NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);	\
 	else							\
-		NEW_AUX_ENT(AT_IGNORE, 0);
+		NEW_AUX_ENT(AT_IGNORE, 0)
 #else
-#define VSYSCALL_AUX_ENT
+#define VSYSCALL_AUX_ENT	NEW_AUX_ENT(AT_IGNORE, 0)
 #endif /* CONFIG_VSYSCALL */
 
 #ifdef CONFIG_SH_FPU
diff -druN linux-libre-3.7.3-gnu/arch/x86/kernel/entry_32.S linux-libre-3.7.4-gnu/arch/x86/kernel/entry_32.S
--- linux-libre-3.7.3-gnu/arch/x86/kernel/entry_32.S	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/x86/kernel/entry_32.S	2013-01-21 14:45:40.000000000 -0500
@@ -1084,7 +1084,6 @@
 	lea 16(%esp),%esp
 	CFI_ADJUST_CFA_OFFSET -16
 	jz 5f
-	addl $16,%esp
 	jmp iret_exc
 5:	pushl_cfi $-1 /* orig_ax = -1 => not a system call */
 	SAVE_ALL
diff -druN linux-libre-3.7.3-gnu/arch/x86/kernel/setup.c linux-libre-3.7.4-gnu/arch/x86/kernel/setup.c
--- linux-libre-3.7.3-gnu/arch/x86/kernel/setup.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/arch/x86/kernel/setup.c	2013-01-21 14:45:40.000000000 -0500
@@ -614,6 +614,81 @@
 
 static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
 
+static bool __init snb_gfx_workaround_needed(void)
+{
+	int i;
+	u16 vendor, devid;
+	static const u16 snb_ids[] = {
+		0x0102,
+		0x0112,
+		0x0122,
+		0x0106,
+		0x0116,
+		0x0126,
+		0x010a,
+	};
+
+	/* Assume no if something weird is going on with PCI */
+	if (!early_pci_allowed())
+		return false;
+
+	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID);
+	if (vendor != 0x8086)
+		return false;
+
+	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID);
+	for (i = 0; i < ARRAY_SIZE(snb_ids); i++)
+		if (devid == snb_ids[i])
+			return true;
+
+	return false;
+}
+
+/*
+ * Sandy Bridge graphics has trouble with certain ranges, exclude
+ * them from allocation.
+ */
+static void __init trim_snb_memory(void)
+{
+	static const unsigned long bad_pages[] = {
+		0x20050000,
+		0x20110000,
+		0x20130000,
+		0x20138000,
+		0x40004000,
+	};
+	int i;
+
+	if (!snb_gfx_workaround_needed())
+		return;
+
+	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n");
+
+	/*
+	 * Reserve all memory below the 1 MB mark that has not
+	 * already been reserved.
+	 */
+	memblock_reserve(0, 1<<20);
+
+	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) {
+		if (memblock_reserve(bad_pages[i], PAGE_SIZE))
+			printk(KERN_WARNING "failed to reserve 0x%08lx\n",
+			       bad_pages[i]);
+	}
+}
+
+/*
+ * Here we put platform-specific memory range workarounds, i.e.
+ * memory known to be corrupt or otherwise in need to be reserved on
+ * specific platforms.
+ *
+ * If this gets used more widely it could use a real dispatch mechanism.
+ */
+static void __init trim_platform_memory_ranges(void)
+{
+	trim_snb_memory();
+}
+
 static void __init trim_bios_range(void)
 {
 	/*
@@ -634,6 +709,7 @@
 	 * take them out.
 	 */
 	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1);
+
 	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 }
 
@@ -912,6 +988,8 @@
 
 	setup_real_mode();
 
+	trim_platform_memory_ranges();
+
 	init_gbpages();
 
 	/* max_pfn_mapped is updated here */
diff -druN linux-libre-3.7.3-gnu/drivers/base/firmware_class.c linux-libre-3.7.4-gnu/drivers/base/firmware_class.c
--- linux-libre-3.7.3-gnu/drivers/base/firmware_class.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/base/firmware_class.c	2013-01-21 14:45:40.000000000 -0500
@@ -295,7 +295,7 @@
 	char *buf;
 
 	size = fw_file_size(file);
-	if (size < 0)
+	if (size <= 0)
 		return false;
 	buf = vmalloc(size);
 	if (!buf)
diff -druN linux-libre-3.7.3-gnu/drivers/gpu/drm/radeon/r600_cs.c linux-libre-3.7.4-gnu/drivers/gpu/drm/radeon/r600_cs.c
--- linux-libre-3.7.3-gnu/drivers/gpu/drm/radeon/r600_cs.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/gpu/drm/radeon/r600_cs.c	2013-01-21 14:45:40.000000000 -0500
@@ -2429,8 +2429,10 @@
 	kfree(parser->relocs);
 	for (i = 0; i < parser->nchunks; i++) {
 		kfree(parser->chunks[i].kdata);
-		kfree(parser->chunks[i].kpage[0]);
-		kfree(parser->chunks[i].kpage[1]);
+		if (parser->rdev && (parser->rdev->flags & RADEON_IS_AGP)) {
+			kfree(parser->chunks[i].kpage[0]);
+			kfree(parser->chunks[i].kpage[1]);
+		}
 	}
 	kfree(parser->chunks);
 	kfree(parser->chunks_array);
diff -druN linux-libre-3.7.3-gnu/drivers/gpu/drm/radeon/radeon_cs.c linux-libre-3.7.4-gnu/drivers/gpu/drm/radeon/radeon_cs.c
--- linux-libre-3.7.3-gnu/drivers/gpu/drm/radeon/radeon_cs.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/gpu/drm/radeon/radeon_cs.c	2013-01-21 14:45:40.000000000 -0500
@@ -266,7 +266,7 @@
 				  p->chunks[p->chunk_ib_idx].length_dw);
 			return -EINVAL;
 		}
-		if ((p->rdev->flags & RADEON_IS_AGP)) {
+		if (p->rdev && (p->rdev->flags & RADEON_IS_AGP)) {
 			p->chunks[p->chunk_ib_idx].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL);
 			p->chunks[p->chunk_ib_idx].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL);
 			if (p->chunks[p->chunk_ib_idx].kpage[0] == NULL ||
@@ -570,7 +570,8 @@
 	struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx];
 	int i;
 	int size = PAGE_SIZE;
-	bool copy1 = (p->rdev->flags & RADEON_IS_AGP) ? false : true;
+	bool copy1 = (p->rdev && (p->rdev->flags & RADEON_IS_AGP)) ?
+		false : true;
 
 	for (i = ibc->last_copied_page + 1; i < pg_idx; i++) {
 		if (DRM_COPY_FROM_USER(p->ib.ptr + (i * (PAGE_SIZE/4)),
diff -druN linux-libre-3.7.3-gnu/drivers/iommu/intel-iommu.c linux-libre-3.7.4-gnu/drivers/iommu/intel-iommu.c
--- linux-libre-3.7.3-gnu/drivers/iommu/intel-iommu.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/iommu/intel-iommu.c	2013-01-21 14:45:40.000000000 -0500
@@ -2327,8 +2327,39 @@
 	return 0;
 }
 
+static bool device_has_rmrr(struct pci_dev *dev)
+{
+	struct dmar_rmrr_unit *rmrr;
+	int i;
+
+	for_each_rmrr_units(rmrr) {
+		for (i = 0; i < rmrr->devices_cnt; i++) {
+			/*
+			 * Return TRUE if this RMRR contains the device that
+			 * is passed in.
+			 */
+			if (rmrr->devices[i] == dev)
+				return true;
+		}
+	}
+	return false;
+}
+
 static int iommu_should_identity_map(struct pci_dev *pdev, int startup)
 {
+
+	/*
+	 * We want to prevent any device associated with an RMRR from
+	 * getting placed into the SI Domain. This is done because
+	 * problems exist when devices are moved in and out of domains
+	 * and their respective RMRR info is lost. We exempt USB devices
+	 * from this process due to their usage of RMRRs that are known
+	 * to not be needed after BIOS hand-off to OS.
+	 */
+	if (device_has_rmrr(pdev) &&
+	    (pdev->class >> 8) != PCI_CLASS_SERIAL_USB)
+		return 0;
+
 	if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev))
 		return 1;
 
diff -druN linux-libre-3.7.3-gnu/drivers/net/ethernet/intel/igb/igb_main.c linux-libre-3.7.4-gnu/drivers/net/ethernet/intel/igb/igb_main.c
--- linux-libre-3.7.3-gnu/drivers/net/ethernet/intel/igb/igb_main.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/net/ethernet/intel/igb/igb_main.c	2013-01-21 14:45:40.000000000 -0500
@@ -909,17 +909,18 @@
 {
 	struct net_device *netdev = adapter->netdev;
 	struct e1000_hw *hw = &adapter->hw;
-	int i, err = 0, vector = 0;
+	int i, err = 0, vector = 0, free_vector = 0;
 
 	err = request_irq(adapter->msix_entries[vector].vector,
 	                  igb_msix_other, 0, netdev->name, adapter);
 	if (err)
-		goto out;
-	vector++;
+		goto err_out;
 
 	for (i = 0; i < adapter->num_q_vectors; i++) {
 		struct igb_q_vector *q_vector = adapter->q_vector[i];
 
+		vector++;
+
 		q_vector->itr_register = hw->hw_addr + E1000_EITR(vector);
 
 		if (q_vector->rx.ring && q_vector->tx.ring)
@@ -938,13 +939,22 @@
 		                  igb_msix_ring, 0, q_vector->name,
 		                  q_vector);
 		if (err)
-			goto out;
-		vector++;
+			goto err_free;
 	}
 
 	igb_configure_msix(adapter);
 	return 0;
-out:
+
+err_free:
+	/* free already assigned IRQs */
+	free_irq(adapter->msix_entries[free_vector++].vector, adapter);
+
+	vector--;
+	for (i = 0; i < vector; i++) {
+		free_irq(adapter->msix_entries[free_vector++].vector,
+			 adapter->q_vector[i]);
+	}
+err_out:
 	return err;
 }
 
diff -druN linux-libre-3.7.3-gnu/drivers/staging/vt6656/bssdb.h linux-libre-3.7.4-gnu/drivers/staging/vt6656/bssdb.h
--- linux-libre-3.7.3-gnu/drivers/staging/vt6656/bssdb.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/staging/vt6656/bssdb.h	2013-01-21 14:45:40.000000000 -0500
@@ -90,7 +90,6 @@
 } SRSNCapObject, *PSRSNCapObject;
 
 // BSS info(AP)
-#pragma pack(1)
 typedef struct tagKnownBSS {
     // BSS info
     BOOL            bActive;
diff -druN linux-libre-3.7.3-gnu/drivers/staging/vt6656/int.h linux-libre-3.7.4-gnu/drivers/staging/vt6656/int.h
--- linux-libre-3.7.3-gnu/drivers/staging/vt6656/int.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/staging/vt6656/int.h	2013-01-21 14:45:40.000000000 -0500
@@ -34,7 +34,6 @@
 #include "device.h"
 
 /*---------------------  Export Definitions -------------------------*/
-#pragma pack(1)
 typedef struct tagSINTData {
 	BYTE byTSR0;
 	BYTE byPkt0;
diff -druN linux-libre-3.7.3-gnu/drivers/staging/vt6656/iocmd.h linux-libre-3.7.4-gnu/drivers/staging/vt6656/iocmd.h
--- linux-libre-3.7.3-gnu/drivers/staging/vt6656/iocmd.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/staging/vt6656/iocmd.h	2013-01-21 14:45:40.000000000 -0500
@@ -95,13 +95,12 @@
 // Ioctl interface structure
 // Command structure
 //
-#pragma pack(1)
 typedef struct tagSCmdRequest {
 	u8 name[16];
 	void	*data;
 	u16	    wResult;
 	u16     wCmdCode;
-} SCmdRequest, *PSCmdRequest;
+} __packed SCmdRequest, *PSCmdRequest;
 
 //
 // Scan
@@ -111,7 +110,7 @@
 
     u8	    ssid[SSID_MAXLEN + 2];
 
-} SCmdScan, *PSCmdScan;
+} __packed SCmdScan, *PSCmdScan;
 
 //
 // BSS Join
@@ -126,7 +125,7 @@
     BOOL    bPSEnable;
     BOOL    bShareKeyAuth;
 
-} SCmdBSSJoin, *PSCmdBSSJoin;
+} __packed SCmdBSSJoin, *PSCmdBSSJoin;
 
 //
 // Zonetype Setting
@@ -137,7 +136,7 @@
  BOOL       bWrite;
  WZONETYPE  ZoneType;
 
-} SCmdZoneTypeSet, *PSCmdZoneTypeSet;
+} __packed SCmdZoneTypeSet, *PSCmdZoneTypeSet;
 
 typedef struct tagSWPAResult {
          char	ifname[100];
@@ -145,7 +144,7 @@
 	u8 key_mgmt;
 	u8 eap_type;
          BOOL authenticated;
-} SWPAResult, *PSWPAResult;
+} __packed SWPAResult, *PSWPAResult;
 
 typedef struct tagSCmdStartAP {
 
@@ -157,7 +156,7 @@
     BOOL    bShareKeyAuth;
     u8      byBasicRate;
 
-} SCmdStartAP, *PSCmdStartAP;
+} __packed SCmdStartAP, *PSCmdStartAP;
 
 typedef struct tagSCmdSetWEP {
 
@@ -167,7 +166,7 @@
     BOOL    bWepKeyAvailable[WEP_NKEYS];
     u32     auWepKeyLength[WEP_NKEYS];
 
-} SCmdSetWEP, *PSCmdSetWEP;
+} __packed SCmdSetWEP, *PSCmdSetWEP;
 
 typedef struct tagSBSSIDItem {
 
@@ -180,14 +179,14 @@
     BOOL    bWEPOn;
     u32     uRSSI;
 
-} SBSSIDItem;
+} __packed SBSSIDItem;
 
 
 typedef struct tagSBSSIDList {
 
 	u32		    uItem;
 	SBSSIDItem	sBSSIDList[0];
-} SBSSIDList, *PSBSSIDList;
+} __packed SBSSIDList, *PSBSSIDList;
 
 
 typedef struct tagSNodeItem {
@@ -208,7 +207,7 @@
     u32            uTxAttempts;
     u16            wFailureRatio;
 
-} SNodeItem;
+} __packed SNodeItem;
 
 
 typedef struct tagSNodeList {
@@ -216,7 +215,7 @@
 	u32		    uItem;
 	SNodeItem	sNodeList[0];
 
-} SNodeList, *PSNodeList;
+} __packed SNodeList, *PSNodeList;
 
 
 typedef struct tagSCmdLinkStatus {
@@ -229,7 +228,7 @@
     u32     uChannel;
     u32     uLinkRate;
 
-} SCmdLinkStatus, *PSCmdLinkStatus;
+} __packed SCmdLinkStatus, *PSCmdLinkStatus;
 
 //
 // 802.11 counter
@@ -247,7 +246,7 @@
     u32 ReceivedFragmentCount;
     u32 MulticastReceivedFrameCount;
     u32 FCSErrorCount;
-} SDot11MIBCount, *PSDot11MIBCount;
+} __packed SDot11MIBCount, *PSDot11MIBCount;
 
 
 
@@ -355,13 +354,13 @@
     u32   ullTxBroadcastBytes[2];
     u32   ullTxMulticastBytes[2];
     u32   ullTxDirectedBytes[2];
-} SStatMIBCount, *PSStatMIBCount;
+} __packed SStatMIBCount, *PSStatMIBCount;
 
 typedef struct tagSCmdValue {
 
     u32     dwValue;
 
-} SCmdValue,  *PSCmdValue;
+} __packed SCmdValue,  *PSCmdValue;
 
 //
 // hostapd & viawget ioctl related
@@ -431,7 +430,7 @@
 			u8 ssid[32];
 		} scan_req;
 	} u;
-};
+} __packed;
 
 /*---------------------  Export Classes  ----------------------------*/
 
diff -druN linux-libre-3.7.3-gnu/drivers/staging/vt6656/iowpa.h linux-libre-3.7.4-gnu/drivers/staging/vt6656/iowpa.h
--- linux-libre-3.7.3-gnu/drivers/staging/vt6656/iowpa.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/staging/vt6656/iowpa.h	2013-01-21 14:45:40.000000000 -0500
@@ -67,12 +67,11 @@
 
 
 
-#pragma pack(1)
 typedef struct viawget_wpa_header {
 	u8 type;
 	u16 req_ie_len;
 	u16 resp_ie_len;
-} viawget_wpa_header;
+} __packed viawget_wpa_header;
 
 struct viawget_wpa_param {
 	u32 cmd;
@@ -113,9 +112,8 @@
 			u8 *buf;
 		} scan_results;
 	} u;
-};
+} __packed;
 
-#pragma pack(1)
 struct viawget_scan_result {
 	u8 bssid[6];
 	u8 ssid[32];
@@ -130,7 +128,7 @@
 	int noise;
 	int level;
 	int maxrate;
-};
+} __packed;
 
 /*---------------------  Export Classes  ----------------------------*/
 
diff -druN linux-libre-3.7.3-gnu/drivers/staging/wlan-ng/prism2mgmt.c linux-libre-3.7.4-gnu/drivers/staging/wlan-ng/prism2mgmt.c
--- linux-libre-3.7.3-gnu/drivers/staging/wlan-ng/prism2mgmt.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/staging/wlan-ng/prism2mgmt.c	2013-01-21 14:45:40.000000000 -0500
@@ -406,7 +406,7 @@
 	/* SSID */
 	req->ssid.status = P80211ENUM_msgitem_status_data_ok;
 	req->ssid.data.len = le16_to_cpu(item->ssid.len);
-	req->ssid.data.len = min_t(u16, req->ssid.data.len, WLAN_BSSID_LEN);
+	req->ssid.data.len = min_t(u16, req->ssid.data.len, WLAN_SSID_MAXLEN);
 	memcpy(req->ssid.data.data, item->ssid.data, req->ssid.data.len);
 
 	/* supported rates */
diff -druN linux-libre-3.7.3-gnu/drivers/target/target_core_device.c linux-libre-3.7.4-gnu/drivers/target/target_core_device.c
--- linux-libre-3.7.3-gnu/drivers/target/target_core_device.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/target/target_core_device.c	2013-01-21 14:45:40.000000000 -0500
@@ -1624,6 +1624,7 @@
 		ret = PTR_ERR(dev);
 		goto out;
 	}
+	dev->dev_link_magic = SE_DEV_LINK_MAGIC;
 	se_dev->se_dev_ptr = dev;
 	g_lun0_dev = dev;
 
diff -druN linux-libre-3.7.3-gnu/drivers/target/target_core_fabric_configfs.c linux-libre-3.7.4-gnu/drivers/target/target_core_fabric_configfs.c
--- linux-libre-3.7.3-gnu/drivers/target/target_core_fabric_configfs.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/target/target_core_fabric_configfs.c	2013-01-21 14:45:40.000000000 -0500
@@ -71,6 +71,12 @@
 	struct se_portal_group *se_tpg;
 	struct config_item *nacl_ci, *tpg_ci, *tpg_ci_s, *wwn_ci, *wwn_ci_s;
 	int ret = 0, lun_access;
+
+	if (lun->lun_link_magic != SE_LUN_LINK_MAGIC) {
+		pr_err("Bad lun->lun_link_magic, not a valid lun_ci pointer:"
+			" %p to struct lun: %p\n", lun_ci, lun);
+		return -EFAULT;
+	}
 	/*
 	 * Ensure that the source port exists
 	 */
@@ -745,6 +751,12 @@
 	struct target_fabric_configfs *tf;
 	int ret;
 
+	if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) {
+		pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:"
+			" %p to struct se_device: %p\n", se_dev_ci, dev);
+		return -EFAULT;
+	}
+
 	tpg_ci = &lun_ci->ci_parent->ci_group->cg_item;
 	se_tpg = container_of(to_config_group(tpg_ci),
 				struct se_portal_group, tpg_group);
diff -druN linux-libre-3.7.3-gnu/drivers/target/target_core_tpg.c linux-libre-3.7.4-gnu/drivers/target/target_core_tpg.c
--- linux-libre-3.7.3-gnu/drivers/target/target_core_tpg.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/target/target_core_tpg.c	2013-01-21 14:45:40.000000000 -0500
@@ -672,6 +672,7 @@
 	for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) {
 		lun = se_tpg->tpg_lun_list[i];
 		lun->unpacked_lun = i;
+		lun->lun_link_magic = SE_LUN_LINK_MAGIC;
 		lun->lun_status = TRANSPORT_LUN_STATUS_FREE;
 		atomic_set(&lun->lun_acl_count, 0);
 		init_completion(&lun->lun_shutdown_comp);
diff -druN linux-libre-3.7.3-gnu/drivers/target/target_core_transport.c linux-libre-3.7.4-gnu/drivers/target/target_core_transport.c
--- linux-libre-3.7.3-gnu/drivers/target/target_core_transport.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/target/target_core_transport.c	2013-01-21 14:45:40.000000000 -0500
@@ -545,9 +545,6 @@
 
 void transport_cmd_finish_abort(struct se_cmd *cmd, int remove)
 {
-	if (!(cmd->se_cmd_flags & SCF_SCSI_TMR_CDB))
-		transport_lun_remove_cmd(cmd);
-
 	if (transport_cmd_check_stop_to_fabric(cmd))
 		return;
 	if (remove)
@@ -1074,6 +1071,7 @@
 	dev->se_hba		= hba;
 	dev->se_sub_dev		= se_dev;
 	dev->transport		= transport;
+	dev->dev_link_magic	= SE_DEV_LINK_MAGIC;
 	INIT_LIST_HEAD(&dev->dev_list);
 	INIT_LIST_HEAD(&dev->dev_sep_list);
 	INIT_LIST_HEAD(&dev->dev_tmr_list);
@@ -1616,6 +1614,8 @@
 
 	se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST;
 	se_cmd->se_tfo->queue_tm_rsp(se_cmd);
+
+	transport_cmd_check_stop_to_fabric(se_cmd);
 }
 
 /**
@@ -1853,6 +1853,7 @@
 	}
 
 	cmd->t_state = TRANSPORT_PROCESSING;
+	cmd->transport_state |= CMD_T_ACTIVE;
 	spin_unlock_irq(&cmd->t_state_lock);
 
 	if (dev->dev_task_attr_type != SAM_TASK_ATTR_EMULATED)
@@ -3024,7 +3025,7 @@
 		/* ILLEGAL REQUEST */
 		buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST;
 		/* LOGICAL UNIT COMMUNICATION FAILURE */
-		buffer[SPC_ASC_KEY_OFFSET] = 0x80;
+		buffer[SPC_ASC_KEY_OFFSET] = 0x08;
 		break;
 	}
 	/*
@@ -3089,6 +3090,8 @@
 	}
 	cmd->scsi_status = SAM_STAT_TASK_ABORTED;
 
+	transport_lun_remove_cmd(cmd);
+
 	pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x,"
 		" ITT: 0x%08x\n", cmd->t_task_cdb[0],
 		cmd->se_tfo->get_task_tag(cmd));
diff -druN linux-libre-3.7.3-gnu/drivers/target/tcm_fc/tfc_sess.c linux-libre-3.7.4-gnu/drivers/target/tcm_fc/tfc_sess.c
--- linux-libre-3.7.3-gnu/drivers/target/tcm_fc/tfc_sess.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/target/tcm_fc/tfc_sess.c	2013-01-21 14:45:40.000000000 -0500
@@ -355,11 +355,11 @@
 
 	tport = ft_tport_create(rdata->local_port);
 	if (!tport)
-		return 0;	/* not a target for this local port */
+		goto not_target;	/* not a target for this local port */
 
 	acl = ft_acl_get(tport->tpg, rdata);
 	if (!acl)
-		return 0;
+		goto not_target;	/* no target for this remote */
 
 	if (!rspp)
 		goto fill;
@@ -396,12 +396,18 @@
 
 	/*
 	 * OR in our service parameters with other provider (initiator), if any.
-	 * TBD XXX - indicate RETRY capability?
 	 */
 fill:
 	fcp_parm = ntohl(spp->spp_params);
+	fcp_parm &= ~FCP_SPPF_RETRY;
 	spp->spp_params = htonl(fcp_parm | FCP_SPPF_TARG_FCN);
 	return FC_SPP_RESP_ACK;
+
+not_target:
+	fcp_parm = ntohl(spp->spp_params);
+	fcp_parm &= ~FCP_SPPF_TARG_FCN;
+	spp->spp_params = htonl(fcp_parm);
+	return 0;
 }
 
 /**
diff -druN linux-libre-3.7.3-gnu/drivers/tty/pty.c linux-libre-3.7.4-gnu/drivers/tty/pty.c
--- linux-libre-3.7.3-gnu/drivers/tty/pty.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/pty.c	2013-01-21 14:45:40.000000000 -0500
@@ -395,6 +395,8 @@
 		return pty_set_lock(tty, (int __user *) arg);
 	case TIOCSIG:    /* Send signal to other side of pty */
 		return pty_signal(tty, (int) arg);
+	case TIOCGPTN: /* TTY returns ENOTTY, but glibc expects EINVAL here */
+		return -EINVAL;
 	}
 	return -ENOIOCTLCMD;
 }
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250.c linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250.c	2013-01-21 14:45:40.000000000 -0500
@@ -290,6 +290,12 @@
 				  UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
 		.flags		= UART_CAP_FIFO,
 	},
+	[PORT_BRCM_TRUMANAGE] = {
+		.name		= "TruManage",
+		.fifo_size	= 1,
+		.tx_loadsz	= 1024,
+		.flags		= UART_CAP_HFIFO,
+	},
 	[PORT_8250_CIR] = {
 		.name		= "CIR port"
 	}
@@ -1441,6 +1447,11 @@
 		port->icount.tx++;
 		if (uart_circ_empty(xmit))
 			break;
+		if (up->capabilities & UART_CAP_HFIFO) {
+			if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY) !=
+			    BOTH_EMPTY)
+				break;
+		}
 	} while (--count > 0);
 
 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250_dw.c linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250_dw.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250_dw.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250_dw.c	2013-01-21 14:45:40.000000000 -0500
@@ -79,7 +79,7 @@
 	} else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
 		/* Clear the USR and write the LCR again. */
 		(void)p->serial_in(p, UART_USR);
-		p->serial_out(p, d->last_lcr, UART_LCR);
+		p->serial_out(p, UART_LCR, d->last_lcr);
 
 		return 1;
 	}
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250.h linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250.h
--- linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250.h	2013-01-21 14:45:40.000000000 -0500
@@ -40,6 +40,7 @@
 #define UART_CAP_AFE	(1 << 11)	/* MCR-based hw flow control */
 #define UART_CAP_UUE	(1 << 12)	/* UART needs IER bit 6 set (Xscale) */
 #define UART_CAP_RTOIE	(1 << 13)	/* UART needs IER bit 4 set (Xscale, Tegra) */
+#define UART_CAP_HFIFO	(1 << 14)	/* UART has a "hidden" FIFO */
 
 #define UART_BUG_QUOT	(1 << 0)	/* UART has buggy quot LSB */
 #define UART_BUG_TXEN	(1 << 1)	/* UART has buggy TX IIR status */
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250_pci.c linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250_pci.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/8250/8250_pci.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/8250/8250_pci.c	2013-01-21 14:45:40.000000000 -0500
@@ -1085,6 +1085,18 @@
 	return setup_port(priv, port, 2, idx * 8, 0);
 }
 
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+			 const struct pciserial_board *board,
+			 struct uart_8250_port *port, int idx)
+{
+	int ret = pci_default_setup(priv, board, port, idx);
+
+	port->port.type = PORT_BRCM_TRUMANAGE;
+	port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+	return ret;
+}
+
 static int skip_tx_en_setup(struct serial_private *priv,
 			const struct pciserial_board *board,
 			struct uart_8250_port *port, int idx)
@@ -1213,6 +1225,7 @@
 #define PCI_VENDOR_ID_AGESTAR		0x5372
 #define PCI_DEVICE_ID_AGESTAR_9375	0x6872
 #define PCI_VENDOR_ID_ASIX		0x9710
+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
 
 /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584	0x1584
@@ -1788,6 +1801,17 @@
 		.setup		= pci_asix_setup,
 	},
 	/*
+	 * Broadcom TruManage (NetXtreme)
+	 */
+	{
+		.vendor		= PCI_VENDOR_ID_BROADCOM,
+		.device		= PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_brcm_trumanage_setup,
+	},
+
+	/*
 	 * Default "match everything" terminator entry
 	 */
 	{
@@ -1975,6 +1999,7 @@
 	pbn_ce4100_1_115200,
 	pbn_omegapci,
 	pbn_NETMOS9900_2s_115200,
+	pbn_brcm_trumanage,
 };
 
 /*
@@ -2674,6 +2699,12 @@
 		.num_ports	= 2,
 		.base_baud	= 115200,
 	},
+	[pbn_brcm_trumanage] = {
+		.flags		= FL_BASE0,
+		.num_ports	= 1,
+		.reg_shift	= 2,
+		.base_baud	= 115200,
+	},
 };
 
 static const struct pci_device_id blacklist[] = {
@@ -4238,6 +4269,13 @@
 		pbn_omegapci },
 
 	/*
+	 * Broadcom TruManage
+	 */
+	{	PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+		pbn_brcm_trumanage },
+
+	/*
 	 * AgeStar as-prs2-009
 	 */
 	{	PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/ifx6x60.c linux-libre-3.7.4-gnu/drivers/tty/serial/ifx6x60.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/ifx6x60.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/ifx6x60.c	2013-01-21 14:45:40.000000000 -0500
@@ -552,6 +552,7 @@
 		container_of(port, struct ifx_spi_device, tty_port);
 
 	mrdy_set_low(ifx_dev);
+	del_timer(&ifx_dev->spi_timer);
 	clear_bit(IFX_SPI_STATE_TIMER_PENDING, &ifx_dev->flags);
 	tasklet_kill(&ifx_dev->io_work_tasklet);
 }
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/mxs-auart.c linux-libre-3.7.4-gnu/drivers/tty/serial/mxs-auart.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/mxs-auart.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/mxs-auart.c	2013-01-21 14:45:40.000000000 -0500
@@ -260,10 +260,12 @@
 
 	u32 ctrl = readl(u->membase + AUART_CTRL2);
 
-	ctrl &= ~AUART_CTRL2_RTSEN;
+	ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
 	if (mctrl & TIOCM_RTS) {
 		if (tty_port_cts_enabled(&u->state->port))
 			ctrl |= AUART_CTRL2_RTSEN;
+		else
+			ctrl |= AUART_CTRL2_RTS;
 	}
 
 	s->ctrl = mctrl;
diff -druN linux-libre-3.7.3-gnu/drivers/tty/serial/vt8500_serial.c linux-libre-3.7.4-gnu/drivers/tty/serial/vt8500_serial.c
--- linux-libre-3.7.3-gnu/drivers/tty/serial/vt8500_serial.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/tty/serial/vt8500_serial.c	2013-01-21 14:45:40.000000000 -0500
@@ -604,7 +604,7 @@
 	vt8500_port->uart.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
 
 	vt8500_port->clk = of_clk_get(pdev->dev.of_node, 0);
-	if (vt8500_port->clk) {
+	if (!IS_ERR(vt8500_port->clk)) {
 		vt8500_port->uart.uartclk = clk_get_rate(vt8500_port->clk);
 	} else {
 		/* use the default of 24Mhz if not specified and warn */
diff -druN linux-libre-3.7.3-gnu/drivers/usb/chipidea/host.c linux-libre-3.7.4-gnu/drivers/usb/chipidea/host.c
--- linux-libre-3.7.3-gnu/drivers/usb/chipidea/host.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/usb/chipidea/host.c	2013-01-21 14:45:40.000000000 -0500
@@ -129,6 +129,9 @@
 	else
 		ci->hcd = hcd;
 
+	if (ci->platdata->flags & CI13XXX_DISABLE_STREAMING)
+		hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
+
 	return ret;
 }
 
diff -druN linux-libre-3.7.3-gnu/drivers/usb/serial/io_ti.c linux-libre-3.7.4-gnu/drivers/usb/serial/io_ti.c
--- linux-libre-3.7.3-gnu/drivers/usb/serial/io_ti.c	2013-01-17 16:50:47.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/usb/serial/io_ti.c	2013-01-21 17:51:25.000000000 -0500
@@ -534,6 +534,9 @@
 	wait_queue_t wait;
 	unsigned long flags;
 
+	if (!tty)
+		return;
+
 	if (!timeout)
 		timeout = (HZ * EDGE_CLOSING_WAIT)/100;
 
diff -druN linux-libre-3.7.3-gnu/drivers/usb/serial/option.c linux-libre-3.7.4-gnu/drivers/usb/serial/option.c
--- linux-libre-3.7.3-gnu/drivers/usb/serial/option.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/usb/serial/option.c	2013-01-21 14:45:40.000000000 -0500
@@ -450,6 +450,10 @@
 #define PETATEL_VENDOR_ID			0x1ff4
 #define PETATEL_PRODUCT_NP10T			0x600e
 
+/* TP-LINK Incorporated products */
+#define TPLINK_VENDOR_ID			0x2357
+#define TPLINK_PRODUCT_MA180			0x0201
+
 /* some devices interfaces need special handling due to a number of reasons */
 enum option_blacklist_reason {
 		OPTION_BLACKLIST_NONE = 0,
@@ -931,7 +935,8 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0254, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */
 	  .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
-	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff), /* ONDA MT8205 */
+	  .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff), /* ZTE MF880 */
 	  .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) },
@@ -1312,6 +1317,8 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) },
 	{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) },
 	{ USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) },
+	{ USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180),
+	  .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
 	{ } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, option_ids);
diff -druN linux-libre-3.7.3-gnu/drivers/xen/grant-table.c linux-libre-3.7.4-gnu/drivers/xen/grant-table.c
--- linux-libre-3.7.3-gnu/drivers/xen/grant-table.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/drivers/xen/grant-table.c	2013-01-21 14:45:40.000000000 -0500
@@ -56,10 +56,6 @@
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GNTTAB_LIST_END 0xffffffff
-#define GREFS_PER_GRANT_FRAME \
-(grant_table_version == 1 ?                      \
-(PAGE_SIZE / sizeof(struct grant_entry_v1)) :   \
-(PAGE_SIZE / sizeof(union grant_entry_v2)))
 
 static grant_ref_t **gnttab_list;
 static unsigned int nr_grant_frames;
@@ -154,6 +150,7 @@
 static grant_status_t *grstatus;
 
 static int grant_table_version;
+static int grefs_per_grant_frame;
 
 static struct gnttab_free_callback *gnttab_free_callback_list;
 
@@ -767,12 +764,14 @@
 	unsigned int new_nr_grant_frames, extra_entries, i;
 	unsigned int nr_glist_frames, new_nr_glist_frames;
 
+	BUG_ON(grefs_per_grant_frame == 0);
+
 	new_nr_grant_frames = nr_grant_frames + more_frames;
-	extra_entries       = more_frames * GREFS_PER_GRANT_FRAME;
+	extra_entries       = more_frames * grefs_per_grant_frame;
 
-	nr_glist_frames = (nr_grant_frames * GREFS_PER_GRANT_FRAME + RPP - 1) / RPP;
+	nr_glist_frames = (nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
 	new_nr_glist_frames =
-		(new_nr_grant_frames * GREFS_PER_GRANT_FRAME + RPP - 1) / RPP;
+		(new_nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
 	for (i = nr_glist_frames; i < new_nr_glist_frames; i++) {
 		gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_ATOMIC);
 		if (!gnttab_list[i])
@@ -780,12 +779,12 @@
 	}
 
 
-	for (i = GREFS_PER_GRANT_FRAME * nr_grant_frames;
-	     i < GREFS_PER_GRANT_FRAME * new_nr_grant_frames - 1; i++)
+	for (i = grefs_per_grant_frame * nr_grant_frames;
+	     i < grefs_per_grant_frame * new_nr_grant_frames - 1; i++)
 		gnttab_entry(i) = i + 1;
 
 	gnttab_entry(i) = gnttab_free_head;
-	gnttab_free_head = GREFS_PER_GRANT_FRAME * nr_grant_frames;
+	gnttab_free_head = grefs_per_grant_frame * nr_grant_frames;
 	gnttab_free_count += extra_entries;
 
 	nr_grant_frames = new_nr_grant_frames;
@@ -957,7 +956,8 @@
 
 static unsigned nr_status_frames(unsigned nr_grant_frames)
 {
-	return (nr_grant_frames * GREFS_PER_GRANT_FRAME + SPP - 1) / SPP;
+	BUG_ON(grefs_per_grant_frame == 0);
+	return (nr_grant_frames * grefs_per_grant_frame + SPP - 1) / SPP;
 }
 
 static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
@@ -1115,6 +1115,7 @@
 	rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
 	if (rc == 0 && gsv.version == 2) {
 		grant_table_version = 2;
+		grefs_per_grant_frame = PAGE_SIZE / sizeof(union grant_entry_v2);
 		gnttab_interface = &gnttab_v2_ops;
 	} else if (grant_table_version == 2) {
 		/*
@@ -1127,17 +1128,17 @@
 		panic("we need grant tables version 2, but only version 1 is available");
 	} else {
 		grant_table_version = 1;
+		grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
 		gnttab_interface = &gnttab_v1_ops;
 	}
 	printk(KERN_INFO "Grant tables using version %d layout.\n",
 		grant_table_version);
 }
 
-int gnttab_resume(void)
+static int gnttab_setup(void)
 {
 	unsigned int max_nr_gframes;
 
-	gnttab_request_version();
 	max_nr_gframes = gnttab_max_grant_frames();
 	if (max_nr_gframes < nr_grant_frames)
 		return -ENOSYS;
@@ -1160,6 +1161,12 @@
 	return 0;
 }
 
+int gnttab_resume(void)
+{
+	gnttab_request_version();
+	return gnttab_setup();
+}
+
 int gnttab_suspend(void)
 {
 	gnttab_interface->unmap_frames();
@@ -1171,9 +1178,10 @@
 	int rc;
 	unsigned int cur, extra;
 
+	BUG_ON(grefs_per_grant_frame == 0);
 	cur = nr_grant_frames;
-	extra = ((req_entries + (GREFS_PER_GRANT_FRAME-1)) /
-		 GREFS_PER_GRANT_FRAME);
+	extra = ((req_entries + (grefs_per_grant_frame-1)) /
+		 grefs_per_grant_frame);
 	if (cur + extra > gnttab_max_grant_frames())
 		return -ENOSPC;
 
@@ -1191,21 +1199,23 @@
 	unsigned int nr_init_grefs;
 	int ret;
 
+	gnttab_request_version();
 	nr_grant_frames = 1;
 	boot_max_nr_grant_frames = __max_nr_grant_frames();
 
 	/* Determine the maximum number of frames required for the
 	 * grant reference free list on the current hypervisor.
 	 */
+	BUG_ON(grefs_per_grant_frame == 0);
 	max_nr_glist_frames = (boot_max_nr_grant_frames *
-			       GREFS_PER_GRANT_FRAME / RPP);
+			       grefs_per_grant_frame / RPP);
 
 	gnttab_list = kmalloc(max_nr_glist_frames * sizeof(grant_ref_t *),
 			      GFP_KERNEL);
 	if (gnttab_list == NULL)
 		return -ENOMEM;
 
-	nr_glist_frames = (nr_grant_frames * GREFS_PER_GRANT_FRAME + RPP - 1) / RPP;
+	nr_glist_frames = (nr_grant_frames * grefs_per_grant_frame + RPP - 1) / RPP;
 	for (i = 0; i < nr_glist_frames; i++) {
 		gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_KERNEL);
 		if (gnttab_list[i] == NULL) {
@@ -1214,12 +1224,12 @@
 		}
 	}
 
-	if (gnttab_resume() < 0) {
+	if (gnttab_setup() < 0) {
 		ret = -ENODEV;
 		goto ini_nomem;
 	}
 
-	nr_init_grefs = nr_grant_frames * GREFS_PER_GRANT_FRAME;
+	nr_init_grefs = nr_grant_frames * grefs_per_grant_frame;
 
 	for (i = NR_RESERVED_ENTRIES; i < nr_init_grefs - 1; i++)
 		gnttab_entry(i) = i + 1;
diff -druN linux-libre-3.7.3-gnu/fs/ext4/inode.c linux-libre-3.7.4-gnu/fs/ext4/inode.c
--- linux-libre-3.7.3-gnu/fs/ext4/inode.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/fs/ext4/inode.c	2013-01-21 14:45:40.000000000 -0500
@@ -1503,6 +1503,8 @@
 
 	index = mpd->first_page;
 	end   = mpd->next_page - 1;
+
+	pagevec_init(&pvec, 0);
 	while (index <= end) {
 		nr_pages = pagevec_lookup(&pvec, mapping, index, PAGEVEC_SIZE);
 		if (nr_pages == 0)
diff -druN linux-libre-3.7.3-gnu/include/target/target_core_base.h linux-libre-3.7.4-gnu/include/target/target_core_base.h
--- linux-libre-3.7.3-gnu/include/target/target_core_base.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/include/target/target_core_base.h	2013-01-21 14:45:40.000000000 -0500
@@ -734,6 +734,8 @@
 };
 
 struct se_device {
+#define SE_DEV_LINK_MAGIC			0xfeeddeef
+	u32			dev_link_magic;
 	/* RELATIVE TARGET PORT IDENTIFER Counter */
 	u16			dev_rpti_counter;
 	/* Used for SAM Task Attribute ordering */
@@ -820,6 +822,8 @@
 };
 
 struct se_lun {
+#define SE_LUN_LINK_MAGIC			0xffff7771
+	u32			lun_link_magic;
 	/* See transport_lun_status_table */
 	enum transport_lun_status_table lun_status;
 	u32			lun_access;
diff -druN linux-libre-3.7.3-gnu/include/uapi/linux/serial_core.h linux-libre-3.7.4-gnu/include/uapi/linux/serial_core.h
--- linux-libre-3.7.3-gnu/include/uapi/linux/serial_core.h	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/include/uapi/linux/serial_core.h	2013-01-21 14:45:40.000000000 -0500
@@ -49,7 +49,9 @@
 #define PORT_XR17D15X	21	/* Exar XR17D15x UART */
 #define PORT_LPC3220	22	/* NXP LPC32xx SoC "Standard" UART */
 #define PORT_8250_CIR	23	/* CIR infrared port, has its own driver */
-#define PORT_MAX_8250	23	/* max port ID */
+#define PORT_XR17V35X	24	/* Exar XR17V35x UARTs */
+#define PORT_BRCM_TRUMANAGE	24
+#define PORT_MAX_8250	25	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
diff -druN linux-libre-3.7.3-gnu/Makefile linux-libre-3.7.4-gnu/Makefile
--- linux-libre-3.7.3-gnu/Makefile	2013-01-17 16:24:35.000000000 -0500
+++ linux-libre-3.7.4-gnu/Makefile	2013-01-21 17:11:40.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 7
-SUBLEVEL = 3
+SUBLEVEL = 4
 EXTRAVERSION =-gnu
 NAME = Terrified Chipmunk
 
diff -druN linux-libre-3.7.3-gnu/sound/pci/hda/patch_hdmi.c linux-libre-3.7.4-gnu/sound/pci/hda/patch_hdmi.c
--- linux-libre-3.7.3-gnu/sound/pci/hda/patch_hdmi.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/sound/pci/hda/patch_hdmi.c	2013-01-21 14:45:40.000000000 -0500
@@ -1499,7 +1499,7 @@
 	ctl_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 	substream = snd_pcm_chmap_substream(info, ctl_idx);
 	if (!substream || !substream->runtime)
-		return -EBADFD;
+		return 0; /* just for avoiding error from alsactl restore */
 	switch (substream->runtime->status->state) {
 	case SNDRV_PCM_STATE_OPEN:
 	case SNDRV_PCM_STATE_SETUP:
diff -druN linux-libre-3.7.3-gnu/sound/usb/quirks.c linux-libre-3.7.4-gnu/sound/usb/quirks.c
--- linux-libre-3.7.3-gnu/sound/usb/quirks.c	2013-01-17 11:47:40.000000000 -0500
+++ linux-libre-3.7.4-gnu/sound/usb/quirks.c	2013-01-21 14:45:40.000000000 -0500
@@ -387,11 +387,13 @@
 		 * rules
 		 */
 		err = usb_driver_set_configuration(dev, 2);
-		if (err < 0) {
+		if (err < 0)
 			snd_printdd("error usb_driver_set_configuration: %d\n",
 				    err);
-			return -ENODEV;
-		}
+		/* Always return an error, so that we stop creating a device
+		   that will just be destroyed and recreated with a new
+		   configuration */
+		return -ENODEV;
 	} else
 		snd_printk(KERN_INFO "usb-audio: Fast Track Pro config OK\n");
 
