diff -druN linux-3.0.2-libre/Documentation/virtual/lguest/lguest.c linux-3.0.3-libre/Documentation/virtual/lguest/lguest.c
--- linux-3.0.2-libre/Documentation/virtual/lguest/lguest.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/Documentation/virtual/lguest/lguest.c	2011-08-17 13:57:16.000000000 -0400
@@ -2008,6 +2008,9 @@
 	/* We use a simple helper to copy the arguments separated by spaces. */
 	concat((char *)(boot + 1), argv+optind+2);
 
+	/* Set kernel alignment to 16M (CONFIG_PHYSICAL_ALIGN) */
+	boot->hdr.kernel_alignment = 0x1000000;
+
 	/* Boot protocol version: 2.07 supports the fields for lguest. */
 	boot->hdr.version = 0x207;
 
diff -druN linux-3.0.2-libre/drivers/gpu/drm/radeon/atombios_dp.c linux-3.0.3-libre/drivers/gpu/drm/radeon/atombios_dp.c
--- linux-3.0.2-libre/drivers/gpu/drm/radeon/atombios_dp.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/gpu/drm/radeon/atombios_dp.c	2011-08-17 13:57:16.000000000 -0400
@@ -613,6 +613,18 @@
 	return true;
 }
 
+bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector)
+{
+	u8 link_status[DP_LINK_STATUS_SIZE];
+	struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
+
+	if (!radeon_dp_get_link_status(radeon_connector, link_status))
+		return false;
+	if (dp_channel_eq_ok(link_status, dig->dp_lane_count))
+		return false;
+	return true;
+}
+
 struct radeon_dp_link_train_info {
 	struct radeon_device *rdev;
 	struct drm_encoder *encoder;
diff -druN linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_connectors.c linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_connectors.c
--- linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_connectors.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_connectors.c	2011-08-17 13:57:16.000000000 -0400
@@ -60,18 +60,20 @@
 
 	radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
 
-	/* powering up/down the eDP panel generates hpd events which
-	 * can interfere with modesetting.
-	 */
-	if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
+	/* if the connector is already off, don't turn it back on */
+	if (connector->dpms != DRM_MODE_DPMS_ON)
 		return;
 
-	/* pre-r600 did not always have the hpd pins mapped accurately to connectors */
-	if (rdev->family >= CHIP_R600) {
-		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
+	/* just deal with DP (not eDP) here. */
+	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
+		int saved_dpms = connector->dpms;
+
+		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) &&
+		    radeon_dp_needs_link_train(radeon_connector))
 			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
 		else
 			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
+		connector->dpms = saved_dpms;
 	}
 }
 
diff -druN linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_encoders.c linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_encoders.c
--- linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_encoders.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_encoders.c	2011-08-17 13:57:16.000000000 -0400
@@ -2323,6 +2323,9 @@
 	default:
 		encoder->possible_crtcs = 0x3;
 		break;
+	case 4:
+		encoder->possible_crtcs = 0xf;
+		break;
 	case 6:
 		encoder->possible_crtcs = 0x3f;
 		break;
diff -druN linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_mode.h linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_mode.h
--- linux-3.0.2-libre/drivers/gpu/drm/radeon/radeon_mode.h	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/gpu/drm/radeon/radeon_mode.h	2011-08-17 13:57:16.000000000 -0400
@@ -479,6 +479,7 @@
 				      struct drm_display_mode *mode);
 extern void radeon_dp_link_train(struct drm_encoder *encoder,
 				 struct drm_connector *connector);
+extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector);
 extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector);
 extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector);
 extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode);
diff -druN linux-3.0.2-libre/drivers/hwmon/ibmaem.c linux-3.0.3-libre/drivers/hwmon/ibmaem.c
--- linux-3.0.2-libre/drivers/hwmon/ibmaem.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/hwmon/ibmaem.c	2011-08-17 13:57:16.000000000 -0400
@@ -432,13 +432,15 @@
 	aem_send_message(ipmi);
 
 	res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
-	if (!res)
-		return -ETIMEDOUT;
+	if (!res) {
+		res = -ETIMEDOUT;
+		goto out;
+	}
 
 	if (ipmi->rx_result || ipmi->rx_msg_len != rs_size ||
 	    memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) {
-		kfree(rs_resp);
-		return -ENOENT;
+		res = -ENOENT;
+		goto out;
 	}
 
 	switch (size) {
@@ -463,8 +465,11 @@
 		break;
 	}
 	}
+	res = 0;
 
-	return 0;
+out:
+	kfree(rs_resp);
+	return res;
 }
 
 /* Update AEM energy registers */
diff -druN linux-3.0.2-libre/drivers/net/wireless/ath/ath5k/base.c linux-3.0.3-libre/drivers/net/wireless/ath/ath5k/base.c
--- linux-3.0.2-libre/drivers/net/wireless/ath/ath5k/base.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/net/wireless/ath/ath5k/base.c	2011-08-17 13:57:16.000000000 -0400
@@ -1748,6 +1748,8 @@
 
 	if (dma_mapping_error(sc->dev, bf->skbaddr)) {
 		ATH5K_ERR(sc, "beacon DMA mapping failed\n");
+		dev_kfree_skb_any(skb);
+		bf->skb = NULL;
 		return -EIO;
 	}
 
@@ -1832,8 +1834,6 @@
 	ath5k_txbuf_free_skb(sc, avf->bbuf);
 	avf->bbuf->skb = skb;
 	ret = ath5k_beacon_setup(sc, avf->bbuf);
-	if (ret)
-		avf->bbuf->skb = NULL;
 out:
 	return ret;
 }
@@ -1854,6 +1854,7 @@
 	struct ath5k_vif *avf;
 	struct ath5k_buf *bf;
 	struct sk_buff *skb;
+	int err;
 
 	ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON, "in beacon_send\n");
 
@@ -1902,11 +1903,6 @@
 
 	avf = (void *)vif->drv_priv;
 	bf = avf->bbuf;
-	if (unlikely(bf->skb == NULL || sc->opmode == NL80211_IFTYPE_STATION ||
-			sc->opmode == NL80211_IFTYPE_MONITOR)) {
-		ATH5K_WARN(sc, "bf=%p bf_skb=%p\n", bf, bf ? bf->skb : NULL);
-		return;
-	}
 
 	/*
 	 * Stop any current dma and put the new frame on the queue.
@@ -1920,8 +1916,17 @@
 
 	/* refresh the beacon for AP or MESH mode */
 	if (sc->opmode == NL80211_IFTYPE_AP ||
-			sc->opmode == NL80211_IFTYPE_MESH_POINT)
-		ath5k_beacon_update(sc->hw, vif);
+			sc->opmode == NL80211_IFTYPE_MESH_POINT) {
+		err = ath5k_beacon_update(sc->hw, vif);
+		if (err)
+			return;
+	}
+
+	if (unlikely(bf->skb == NULL || sc->opmode == NL80211_IFTYPE_STATION ||
+			sc->opmode == NL80211_IFTYPE_MONITOR)) {
+		ATH5K_WARN(sc, "bf=%p bf_skb=%p\n", bf, bf->skb);
+		return;
+	}
 
 	trace_ath5k_tx(sc, bf->skb, &sc->txqs[sc->bhalq]);
 
diff -druN linux-3.0.2-libre/drivers/staging/rtl8192u/r819xU_firmware.c linux-3.0.3-libre/drivers/staging/rtl8192u/r819xU_firmware.c
--- linux-3.0.2-libre/drivers/staging/rtl8192u/r819xU_firmware.c	2011-08-17 03:11:19.000000000 -0400
+++ linux-3.0.3-libre/drivers/staging/rtl8192u/r819xU_firmware.c	2011-08-17 15:59:22.000000000 -0400
@@ -399,10 +399,5 @@
 
 }
 
-
-
-
-
-
-
+/*(DEBLOBBED)*/
 
diff -druN linux-3.0.2-libre/drivers/usb/class/usbtmc.c linux-3.0.3-libre/drivers/usb/class/usbtmc.c
--- linux-3.0.2-libre/drivers/usb/class/usbtmc.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/class/usbtmc.c	2011-08-17 13:57:16.000000000 -0400
@@ -268,7 +268,7 @@
 				dev_err(dev, "usb_bulk_msg returned %d\n", rv);
 				goto exit;
 			}
-		} while ((actual = max_size) &&
+		} while ((actual == max_size) &&
 			 (n < USBTMC_MAX_READS_TO_CLEAR_BULK_IN));
 
 	if (actual == max_size) {
diff -druN linux-3.0.2-libre/drivers/usb/core/config.c linux-3.0.3-libre/drivers/usb/core/config.c
--- linux-3.0.2-libre/drivers/usb/core/config.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/core/config.c	2011-08-17 13:57:16.000000000 -0400
@@ -123,10 +123,11 @@
 	}
 
 	if (usb_endpoint_xfer_isoc(&ep->desc))
-		max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1) *
-			(desc->bmAttributes + 1);
+		max_tx = (desc->bMaxBurst + 1) * (desc->bmAttributes + 1) *
+			le16_to_cpu(ep->desc.wMaxPacketSize);
 	else if (usb_endpoint_xfer_int(&ep->desc))
-		max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1);
+		max_tx = le16_to_cpu(ep->desc.wMaxPacketSize) *
+			(desc->bMaxBurst + 1);
 	else
 		max_tx = 999999;
 	if (le16_to_cpu(desc->wBytesPerInterval) > max_tx) {
@@ -134,10 +135,10 @@
 				"config %d interface %d altsetting %d ep %d: "
 				"setting to %d\n",
 				usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
-				desc->wBytesPerInterval,
+				le16_to_cpu(desc->wBytesPerInterval),
 				cfgno, inum, asnum, ep->desc.bEndpointAddress,
 				max_tx);
-		ep->ss_ep_comp.wBytesPerInterval = max_tx;
+		ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
 	}
 }
 
diff -druN linux-3.0.2-libre/drivers/usb/host/pci-quirks.c linux-3.0.3-libre/drivers/usb/host/pci-quirks.c
--- linux-3.0.2-libre/drivers/usb/host/pci-quirks.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/host/pci-quirks.c	2011-08-17 13:57:16.000000000 -0400
@@ -803,7 +803,7 @@
 
 	/* If the BIOS owns the HC, signal that the OS wants it, and wait */
 	if (val & XHCI_HC_BIOS_OWNED) {
-		writel(val & XHCI_HC_OS_OWNED, base + ext_cap_offset);
+		writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset);
 
 		/* Wait for 5 seconds with 10 microsecond polling interval */
 		timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED,
diff -druN linux-3.0.2-libre/drivers/usb/host/xhci.c linux-3.0.3-libre/drivers/usb/host/xhci.c
--- linux-3.0.2-libre/drivers/usb/host/xhci.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/host/xhci.c	2011-08-17 13:57:16.000000000 -0400
@@ -345,7 +345,8 @@
 	spin_lock_irqsave(&xhci->lock, flags);
 	temp = xhci_readl(xhci, &xhci->op_regs->status);
 	xhci_dbg(xhci, "op reg status = 0x%x\n", temp);
-	if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) {
+	if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) ||
+			(xhci->xhc_state & XHCI_STATE_HALTED)) {
 		xhci_dbg(xhci, "HW died, polling stopped.\n");
 		spin_unlock_irqrestore(&xhci->lock, flags);
 		return;
@@ -939,8 +940,11 @@
 		return 0;
 	}
 
+	xhci = hcd_to_xhci(hcd);
+	if (xhci->xhc_state & XHCI_STATE_HALTED)
+		return -ENODEV;
+
 	if (check_virt_dev) {
-		xhci = hcd_to_xhci(hcd);
 		if (!udev->slot_id || !xhci->devs
 			|| !xhci->devs[udev->slot_id]) {
 			printk(KERN_DEBUG "xHCI %s called with unaddressed "
@@ -1242,7 +1246,8 @@
 		xhci_urb_free_priv(xhci, urb_priv);
 		return ret;
 	}
-	if (xhci->xhc_state & XHCI_STATE_DYING) {
+	if ((xhci->xhc_state & XHCI_STATE_DYING) ||
+			(xhci->xhc_state & XHCI_STATE_HALTED)) {
 		xhci_dbg(xhci, "Ep 0x%x: URB %p to be canceled on "
 				"non-responsive xHCI host.\n",
 				urb->ep->desc.bEndpointAddress, urb);
@@ -2667,7 +2672,10 @@
 	int i, ret;
 
 	ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__);
-	if (ret <= 0)
+	/* If the host is halted due to driver unload, we still need to free the
+	 * device.
+	 */
+	if (ret <= 0 && ret != -ENODEV)
 		return;
 
 	virt_dev = xhci->devs[udev->slot_id];
@@ -2681,7 +2689,8 @@
 	spin_lock_irqsave(&xhci->lock, flags);
 	/* Don't disable the slot if the host controller is dead. */
 	state = xhci_readl(xhci, &xhci->op_regs->status);
-	if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) {
+	if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) ||
+			(xhci->xhc_state & XHCI_STATE_HALTED)) {
 		xhci_free_virt_device(xhci, udev->slot_id);
 		spin_unlock_irqrestore(&xhci->lock, flags);
 		return;
diff -druN linux-3.0.2-libre/drivers/usb/musb/musb_gadget.c linux-3.0.3-libre/drivers/usb/musb/musb_gadget.c
--- linux-3.0.2-libre/drivers/usb/musb/musb_gadget.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/musb/musb_gadget.c	2011-08-17 13:57:16.000000000 -0400
@@ -1698,6 +1698,8 @@
 
 	is_on = !!is_on;
 
+	pm_runtime_get_sync(musb->controller);
+
 	/* NOTE: this assumes we are sensing vbus; we'd rather
 	 * not pullup unless the B-session is active.
 	 */
@@ -1707,6 +1709,9 @@
 		musb_pullup(musb, is_on);
 	}
 	spin_unlock_irqrestore(&musb->lock, flags);
+
+	pm_runtime_put(musb->controller);
+
 	return 0;
 }
 
diff -druN linux-3.0.2-libre/drivers/usb/serial/ftdi_sio.c linux-3.0.3-libre/drivers/usb/serial/ftdi_sio.c
--- linux-3.0.2-libre/drivers/usb/serial/ftdi_sio.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/serial/ftdi_sio.c	2011-08-17 13:57:16.000000000 -0400
@@ -1171,7 +1171,7 @@
 	case FT2232H: /* FT2232H chip */
 	case FT4232H: /* FT4232H chip */
 	case FT232H:  /* FT232H chip */
-		if ((baud <= 12000000) & (baud >= 1200)) {
+		if ((baud <= 12000000) && (baud >= 1200)) {
 			div_value = ftdi_2232h_baud_to_divisor(baud);
 		} else if (baud < 1200) {
 			div_value = ftdi_232bm_baud_to_divisor(baud);
diff -druN linux-3.0.2-libre/drivers/usb/serial/option.c linux-3.0.3-libre/drivers/usb/serial/option.c
--- linux-3.0.2-libre/drivers/usb/serial/option.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/serial/option.c	2011-08-17 13:57:16.000000000 -0400
@@ -148,6 +148,10 @@
 #define HUAWEI_PRODUCT_K4505			0x1464
 #define HUAWEI_PRODUCT_K3765			0x1465
 #define HUAWEI_PRODUCT_E14AC			0x14AC
+#define HUAWEI_PRODUCT_K3770			0x14C9
+#define HUAWEI_PRODUCT_K3771			0x14CA
+#define HUAWEI_PRODUCT_K4510			0x14CB
+#define HUAWEI_PRODUCT_K4511			0x14CC
 #define HUAWEI_PRODUCT_ETS1220			0x1803
 #define HUAWEI_PRODUCT_E353			0x1506
 
@@ -547,6 +551,14 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x32) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x31) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x32) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) },
 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) },
 	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) },
diff -druN linux-3.0.2-libre/drivers/usb/serial/qcserial.c linux-3.0.3-libre/drivers/usb/serial/qcserial.c
--- linux-3.0.2-libre/drivers/usb/serial/qcserial.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/serial/qcserial.c	2011-08-17 13:57:16.000000000 -0400
@@ -45,6 +45,7 @@
 	{USB_DEVICE(0x05c6, 0x9203)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9222)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9008)},	/* Generic Gobi QDL device */
+	{USB_DEVICE(0x05c6, 0x9009)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9201)},	/* Generic Gobi QDL device */
 	{USB_DEVICE(0x05c6, 0x9221)},	/* Generic Gobi QDL device */
 	{USB_DEVICE(0x05c6, 0x9231)},	/* Generic Gobi QDL device */
diff -druN linux-3.0.2-libre/drivers/usb/storage/unusual_devs.h linux-3.0.3-libre/drivers/usb/storage/unusual_devs.h
--- linux-3.0.2-libre/drivers/usb/storage/unusual_devs.h	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/drivers/usb/storage/unusual_devs.h	2011-08-17 13:57:16.000000000 -0400
@@ -1988,6 +1988,16 @@
 		"Micro Mini 1GB",
 		USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
 
+/*
+ * Nick Bowler <nbowler@elliptictech.com>
+ * SCSI stack spams (otherwise harmless) error messages.
+ */
+UNUSUAL_DEV(  0xc251, 0x4003, 0x0100, 0x0100,
+		"Keil Software, Inc.",
+		"V2M MotherBoard",
+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+		US_FL_NOT_LOCKABLE),
+
 /* Reported by Andrew Simmons <andrew.simmons@gmail.com> */
 UNUSUAL_DEV(  0xed06, 0x4500, 0x0001, 0x0001,
 		"DataStor",
diff -druN linux-3.0.2-libre/Makefile linux-3.0.3-libre/Makefile
--- linux-3.0.2-libre/Makefile	2011-08-17 02:34:24.000000000 -0400
+++ linux-3.0.3-libre/Makefile	2011-08-17 15:47:26.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 0
-SUBLEVEL = 2
+SUBLEVEL = 3
 EXTRAVERSION =-libre
 NAME = Sneaky Weasel
 
diff -druN linux-3.0.2-libre/mm/vmalloc.c linux-3.0.3-libre/mm/vmalloc.c
--- linux-3.0.2-libre/mm/vmalloc.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/mm/vmalloc.c	2011-08-17 13:57:16.000000000 -0400
@@ -732,9 +732,10 @@
 #define VMAP_BBMAP_BITS_MIN	(VMAP_MAX_ALLOC*2)
 #define VMAP_MIN(x, y)		((x) < (y) ? (x) : (y)) /* can't use min() */
 #define VMAP_MAX(x, y)		((x) > (y) ? (x) : (y)) /* can't use max() */
-#define VMAP_BBMAP_BITS		VMAP_MIN(VMAP_BBMAP_BITS_MAX,		\
-					VMAP_MAX(VMAP_BBMAP_BITS_MIN,	\
-						VMALLOC_PAGES / NR_CPUS / 16))
+#define VMAP_BBMAP_BITS		\
+		VMAP_MIN(VMAP_BBMAP_BITS_MAX,	\
+		VMAP_MAX(VMAP_BBMAP_BITS_MIN,	\
+			VMALLOC_PAGES / roundup_pow_of_two(NR_CPUS) / 16))
 
 #define VMAP_BLOCK_SIZE		(VMAP_BBMAP_BITS * PAGE_SIZE)
 
diff -druN linux-3.0.2-libre/net/atm/br2684.c linux-3.0.3-libre/net/atm/br2684.c
--- linux-3.0.2-libre/net/atm/br2684.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/net/atm/br2684.c	2011-08-17 13:57:16.000000000 -0400
@@ -242,8 +242,6 @@
 		if (brdev->payload == p_bridged) {
 			skb_push(skb, 2);
 			memset(skb->data, 0, 2);
-		} else { /* p_routed */
-			skb_pull(skb, ETH_HLEN);
 		}
 	}
 	skb_debug(skb);
diff -druN linux-3.0.2-libre/sound/soc/samsung/jive_wm8750.c linux-3.0.3-libre/sound/soc/samsung/jive_wm8750.c
--- linux-3.0.2-libre/sound/soc/samsung/jive_wm8750.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/sound/soc/samsung/jive_wm8750.c	2011-08-17 13:57:16.000000000 -0400
@@ -131,7 +131,7 @@
 	.cpu_dai_name	= "s3c2412-i2s",
 	.codec_dai_name = "wm8750-hifi",
 	.platform_name	= "samsung-audio",
-	.codec_name	= "wm8750-codec.0-0x1a",
+	.codec_name	= "wm8750-codec.0-001a",
 	.init		= jive_wm8750_init,
 	.ops		= &jive_ops,
 };
diff -druN linux-3.0.2-libre/sound/soc/tegra/tegra_pcm.c linux-3.0.3-libre/sound/soc/tegra/tegra_pcm.c
--- linux-3.0.2-libre/sound/soc/tegra/tegra_pcm.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/sound/soc/tegra/tegra_pcm.c	2011-08-17 13:57:16.000000000 -0400
@@ -309,9 +309,14 @@
 
 static void tegra_pcm_deallocate_dma_buffer(struct snd_pcm *pcm, int stream)
 {
-	struct snd_pcm_substream *substream = pcm->streams[stream].substream;
-	struct snd_dma_buffer *buf = &substream->dma_buffer;
+	struct snd_pcm_substream *substream;
+	struct snd_dma_buffer *buf;
 
+	substream = pcm->streams[stream].substream;
+	if (!substream)
+		return;
+
+	buf = &substream->dma_buffer;
 	if (!buf->area)
 		return;
 
diff -druN linux-3.0.2-libre/sound/soc/tegra/tegra_wm8903.c linux-3.0.3-libre/sound/soc/tegra/tegra_wm8903.c
--- linux-3.0.2-libre/sound/soc/tegra/tegra_wm8903.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/sound/soc/tegra/tegra_wm8903.c	2011-08-17 13:57:16.000000000 -0400
@@ -56,6 +56,7 @@
 #define GPIO_HP_MUTE    BIT(1)
 #define GPIO_INT_MIC_EN BIT(2)
 #define GPIO_EXT_MIC_EN BIT(3)
+#define GPIO_HP_DET     BIT(4)
 
 struct tegra_wm8903 {
 	struct tegra_asoc_utils_data util_data;
@@ -304,6 +305,7 @@
 		snd_soc_jack_add_gpios(&tegra_wm8903_hp_jack,
 					1,
 					&tegra_wm8903_hp_jack_gpio);
+		machine->gpio_requested |= GPIO_HP_DET;
 	}
 
 	snd_soc_jack_new(codec, "Mic Jack", SND_JACK_MICROPHONE,
@@ -429,10 +431,10 @@
 	struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
 	struct tegra_wm8903_platform_data *pdata = machine->pdata;
 
-	snd_soc_unregister_card(card);
-
-	tegra_asoc_utils_fini(&machine->util_data);
-
+	if (machine->gpio_requested & GPIO_HP_DET)
+		snd_soc_jack_free_gpios(&tegra_wm8903_hp_jack,
+					1,
+					&tegra_wm8903_hp_jack_gpio);
 	if (machine->gpio_requested & GPIO_EXT_MIC_EN)
 		gpio_free(pdata->gpio_ext_mic_en);
 	if (machine->gpio_requested & GPIO_INT_MIC_EN)
@@ -441,6 +443,11 @@
 		gpio_free(pdata->gpio_hp_mute);
 	if (machine->gpio_requested & GPIO_SPKR_EN)
 		gpio_free(pdata->gpio_spkr_en);
+	machine->gpio_requested = 0;
+
+	snd_soc_unregister_card(card);
+
+	tegra_asoc_utils_fini(&machine->util_data);
 
 	kfree(machine);
 
diff -druN linux-3.0.2-libre/sound/usb/caiaq/audio.c linux-3.0.3-libre/sound/usb/caiaq/audio.c
--- linux-3.0.2-libre/sound/usb/caiaq/audio.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/sound/usb/caiaq/audio.c	2011-08-17 13:57:16.000000000 -0400
@@ -614,6 +614,7 @@
 	struct snd_usb_caiaqdev *dev;
 	struct urb *out;
 	int frame, len, send_it = 0, outframe = 0;
+	size_t offset = 0;
 
 	if (urb->status || !info)
 		return;
@@ -634,7 +635,8 @@
 		len = urb->iso_frame_desc[outframe].actual_length;
 		out->iso_frame_desc[outframe].length = len;
 		out->iso_frame_desc[outframe].actual_length = 0;
-		out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame;
+		out->iso_frame_desc[outframe].offset = offset;
+		offset += len;
 
 		if (len > 0) {
 			spin_lock(&dev->spinlock);
@@ -650,7 +652,7 @@
 	}
 
 	if (send_it) {
-		out->number_of_packets = FRAMES_PER_URB;
+		out->number_of_packets = outframe;
 		out->transfer_flags = URB_ISO_ASAP;
 		usb_submit_urb(out, GFP_ATOMIC);
 	}
diff -druN linux-3.0.2-libre/tools/perf/util/config.c linux-3.0.3-libre/tools/perf/util/config.c
--- linux-3.0.2-libre/tools/perf/util/config.c	2011-08-15 21:31:55.000000000 -0400
+++ linux-3.0.3-libre/tools/perf/util/config.c	2011-08-17 13:57:16.000000000 -0400
@@ -399,7 +399,6 @@
 int perf_config(config_fn_t fn, void *data)
 {
 	int ret = 0, found = 0;
-	char *repo_config = NULL;
 	const char *home = NULL;
 
 	/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
@@ -421,12 +420,6 @@
 		free(user_config);
 	}
 
-	repo_config = perf_pathdup("config");
-	if (!access(repo_config, R_OK)) {
-		ret += perf_config_from_file(fn, repo_config, data);
-		found += 1;
-	}
-	free(repo_config);
 	if (found == 0)
 		return -1;
 	return ret;
