Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efba91bd authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  netfilter: ip6t_{hbh,dst}: Rejects not-strict mode on rule insertion
  ath9k: disable MIB interrupts to fix interrupt storm
  [Bluetooth] Fix USB disconnect handling of btusb driver
  [Bluetooth] Fix wrong URB handling of btusb driver
  [Bluetooth] Fix I/O errors on MacBooks with Broadcom chips
parents 26591188 8c658594
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -104,6 +104,9 @@ static struct usb_device_id blacklist_table[] = {
	/* Broadcom BCM2046 */
	{ USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET },

	/* Apple MacBook Pro with Broadcom chip */
	{ USB_DEVICE(0x05ac, 0x820f), .driver_info = BTUSB_RESET },

	/* IBM/Lenovo ThinkPad with Broadcom chip */
	{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
	{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
@@ -169,6 +172,7 @@ static struct usb_device_id blacklist_table[] = {
struct btusb_data {
	struct hci_dev       *hdev;
	struct usb_device    *udev;
	struct usb_interface *intf;
	struct usb_interface *isoc;

	spinlock_t lock;
@@ -516,7 +520,7 @@ static int btusb_open(struct hci_dev *hdev)

	err = btusb_submit_intr_urb(hdev);
	if (err < 0) {
		clear_bit(BTUSB_INTR_RUNNING, &hdev->flags);
		clear_bit(BTUSB_INTR_RUNNING, &data->flags);
		clear_bit(HCI_RUNNING, &hdev->flags);
	}

@@ -532,8 +536,10 @@ static int btusb_close(struct hci_dev *hdev)
	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
		return 0;

	cancel_work_sync(&data->work);

	clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
	usb_kill_anchored_urbs(&data->intr_anchor);
	usb_kill_anchored_urbs(&data->isoc_anchor);

	clear_bit(BTUSB_BULK_RUNNING, &data->flags);
	usb_kill_anchored_urbs(&data->bulk_anchor);
@@ -821,6 +827,7 @@ static int btusb_probe(struct usb_interface *intf,
	}

	data->udev = interface_to_usbdev(intf);
	data->intf = intf;

	spin_lock_init(&data->lock);

@@ -889,7 +896,7 @@ static int btusb_probe(struct usb_interface *intf,

	if (data->isoc) {
		err = usb_driver_claim_interface(&btusb_driver,
							data->isoc, NULL);
							data->isoc, data);
		if (err < 0) {
			hci_free_dev(hdev);
			kfree(data);
@@ -921,13 +928,22 @@ static void btusb_disconnect(struct usb_interface *intf)

	hdev = data->hdev;

	if (data->isoc)
		usb_driver_release_interface(&btusb_driver, data->isoc);
	__hci_dev_hold(hdev);

	usb_set_intfdata(data->intf, NULL);

	usb_set_intfdata(intf, NULL);
	if (data->isoc)
		usb_set_intfdata(data->isoc, NULL);

	hci_unregister_dev(hdev);

	if (intf == data->isoc)
		usb_driver_release_interface(&btusb_driver, data->intf);
	else if (data->isoc)
		usb_driver_release_interface(&btusb_driver, data->isoc);

	__hci_dev_put(hdev);

	hci_free_dev(hdev);
}

+7 −0
Original line number Diff line number Diff line
@@ -795,6 +795,12 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan)
	if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT)
		sc->sc_imask |= ATH9K_INT_CST;

	/* Note: We disable MIB interrupts for now as we don't yet
	 * handle processing ANI, otherwise you will get an interrupt
	 * storm after about 7 hours of usage making the system unusable
	 * with huge latency. Once we do have ANI processing included
	 * we can re-enable this interrupt. */
#if 0
	/*
	 * Enable MIB interrupts when there are hardware phy counters.
	 * Note we only do this (at the moment) for station mode.
@@ -802,6 +808,7 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan)
	if (ath9k_hw_phycounters(ah) &&
	    ((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS)))
		sc->sc_imask |= ATH9K_INT_MIB;
#endif
	/*
	 * Some hardware processes the TIM IE and fires an
	 * interrupt when the TIM bit is set.  For hardware
+6 −2
Original line number Diff line number Diff line
@@ -97,8 +97,6 @@ hbh_mt6(const struct sk_buff *skb, const struct net_device *in,
	hdrlen -= 2;
	if (!(optinfo->flags & IP6T_OPTS_OPTS)) {
		return ret;
	} else if (optinfo->flags & IP6T_OPTS_NSTRICT) {
		pr_debug("Not strict - not implemented");
	} else {
		pr_debug("Strict ");
		pr_debug("#%d ", optinfo->optsnr);
@@ -177,6 +175,12 @@ hbh_mt6_check(const char *tablename, const void *entry,
		pr_debug("ip6t_opts: unknown flags %X\n", optsinfo->invflags);
		return false;
	}

	if (optsinfo->flags & IP6T_OPTS_NSTRICT) {
		pr_debug("ip6t_opts: Not strict - not implemented");
		return false;
	}

	return true;
}