mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* 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
This commit is contained in:
commit
efba91bd90
|
@ -104,6 +104,9 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
/* Broadcom BCM2046 */
|
/* Broadcom BCM2046 */
|
||||||
{ USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET },
|
{ 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 */
|
/* IBM/Lenovo ThinkPad with Broadcom chip */
|
||||||
{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||||
{ USB_DEVICE(0x0a5c, 0x2110), .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 btusb_data {
|
||||||
struct hci_dev *hdev;
|
struct hci_dev *hdev;
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
|
struct usb_interface *intf;
|
||||||
struct usb_interface *isoc;
|
struct usb_interface *isoc;
|
||||||
|
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
@ -516,7 +520,7 @@ static int btusb_open(struct hci_dev *hdev)
|
||||||
|
|
||||||
err = btusb_submit_intr_urb(hdev);
|
err = btusb_submit_intr_urb(hdev);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
clear_bit(BTUSB_INTR_RUNNING, &hdev->flags);
|
clear_bit(BTUSB_INTR_RUNNING, &data->flags);
|
||||||
clear_bit(HCI_RUNNING, &hdev->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))
|
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
cancel_work_sync(&data->work);
|
||||||
|
|
||||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
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);
|
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||||
usb_kill_anchored_urbs(&data->bulk_anchor);
|
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->udev = interface_to_usbdev(intf);
|
||||||
|
data->intf = intf;
|
||||||
|
|
||||||
spin_lock_init(&data->lock);
|
spin_lock_init(&data->lock);
|
||||||
|
|
||||||
|
@ -889,7 +896,7 @@ static int btusb_probe(struct usb_interface *intf,
|
||||||
|
|
||||||
if (data->isoc) {
|
if (data->isoc) {
|
||||||
err = usb_driver_claim_interface(&btusb_driver,
|
err = usb_driver_claim_interface(&btusb_driver,
|
||||||
data->isoc, NULL);
|
data->isoc, data);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
hci_free_dev(hdev);
|
hci_free_dev(hdev);
|
||||||
kfree(data);
|
kfree(data);
|
||||||
|
@ -921,13 +928,22 @@ static void btusb_disconnect(struct usb_interface *intf)
|
||||||
|
|
||||||
hdev = data->hdev;
|
hdev = data->hdev;
|
||||||
|
|
||||||
if (data->isoc)
|
__hci_dev_hold(hdev);
|
||||||
usb_driver_release_interface(&btusb_driver, data->isoc);
|
|
||||||
|
|
||||||
usb_set_intfdata(intf, NULL);
|
usb_set_intfdata(data->intf, NULL);
|
||||||
|
|
||||||
|
if (data->isoc)
|
||||||
|
usb_set_intfdata(data->isoc, NULL);
|
||||||
|
|
||||||
hci_unregister_dev(hdev);
|
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);
|
hci_free_dev(hdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT)
|
||||||
sc->sc_imask |= ATH9K_INT_CST;
|
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.
|
* Enable MIB interrupts when there are hardware phy counters.
|
||||||
* Note we only do this (at the moment) for station mode.
|
* 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) &&
|
if (ath9k_hw_phycounters(ah) &&
|
||||||
((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS)))
|
((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS)))
|
||||||
sc->sc_imask |= ATH9K_INT_MIB;
|
sc->sc_imask |= ATH9K_INT_MIB;
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* Some hardware processes the TIM IE and fires an
|
* Some hardware processes the TIM IE and fires an
|
||||||
* interrupt when the TIM bit is set. For hardware
|
* interrupt when the TIM bit is set. For hardware
|
||||||
|
|
|
@ -97,8 +97,6 @@ hbh_mt6(const struct sk_buff *skb, const struct net_device *in,
|
||||||
hdrlen -= 2;
|
hdrlen -= 2;
|
||||||
if (!(optinfo->flags & IP6T_OPTS_OPTS)) {
|
if (!(optinfo->flags & IP6T_OPTS_OPTS)) {
|
||||||
return ret;
|
return ret;
|
||||||
} else if (optinfo->flags & IP6T_OPTS_NSTRICT) {
|
|
||||||
pr_debug("Not strict - not implemented");
|
|
||||||
} else {
|
} else {
|
||||||
pr_debug("Strict ");
|
pr_debug("Strict ");
|
||||||
pr_debug("#%d ", optinfo->optsnr);
|
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);
|
pr_debug("ip6t_opts: unknown flags %X\n", optsinfo->invflags);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (optsinfo->flags & IP6T_OPTS_NSTRICT) {
|
||||||
|
pr_debug("ip6t_opts: Not strict - not implemented");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue