diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-09-24 19:45:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-09-24 19:45:07 -0400 |
commit | efba91bd9066890ae93270eb3d0e55de43368f0b (patch) | |
tree | 6c39afc6cd3529e20da0c544078717fca8a4d1d6 | |
parent | 26591188d69192d5babeadde129dcfb6cbf9e6b7 (diff) | |
parent | 8c65859473baee85e806ec8ebc0ff5e3a181969e (diff) |
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
-rw-r--r-- | drivers/bluetooth/btusb.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/core.c | 7 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6t_hbh.c | 8 |
3 files changed, 35 insertions, 8 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 6a010681ecf3..29ae99817c60 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -104,6 +104,9 @@ static struct usb_device_id blacklist_table[] = { | |||
104 | /* Broadcom BCM2046 */ | 104 | /* Broadcom BCM2046 */ |
105 | { USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET }, | 105 | { USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET }, |
106 | 106 | ||
107 | /* Apple MacBook Pro with Broadcom chip */ | ||
108 | { USB_DEVICE(0x05ac, 0x820f), .driver_info = BTUSB_RESET }, | ||
109 | |||
107 | /* IBM/Lenovo ThinkPad with Broadcom chip */ | 110 | /* IBM/Lenovo ThinkPad with Broadcom chip */ |
108 | { USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, | 111 | { USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, |
109 | { USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, | 112 | { USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU }, |
@@ -169,6 +172,7 @@ static struct usb_device_id blacklist_table[] = { | |||
169 | struct btusb_data { | 172 | struct btusb_data { |
170 | struct hci_dev *hdev; | 173 | struct hci_dev *hdev; |
171 | struct usb_device *udev; | 174 | struct usb_device *udev; |
175 | struct usb_interface *intf; | ||
172 | struct usb_interface *isoc; | 176 | struct usb_interface *isoc; |
173 | 177 | ||
174 | spinlock_t lock; | 178 | spinlock_t lock; |
@@ -516,7 +520,7 @@ static int btusb_open(struct hci_dev *hdev) | |||
516 | 520 | ||
517 | err = btusb_submit_intr_urb(hdev); | 521 | err = btusb_submit_intr_urb(hdev); |
518 | if (err < 0) { | 522 | if (err < 0) { |
519 | clear_bit(BTUSB_INTR_RUNNING, &hdev->flags); | 523 | clear_bit(BTUSB_INTR_RUNNING, &data->flags); |
520 | clear_bit(HCI_RUNNING, &hdev->flags); | 524 | clear_bit(HCI_RUNNING, &hdev->flags); |
521 | } | 525 | } |
522 | 526 | ||
@@ -532,8 +536,10 @@ static int btusb_close(struct hci_dev *hdev) | |||
532 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) | 536 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) |
533 | return 0; | 537 | return 0; |
534 | 538 | ||
539 | cancel_work_sync(&data->work); | ||
540 | |||
535 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | 541 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); |
536 | usb_kill_anchored_urbs(&data->intr_anchor); | 542 | usb_kill_anchored_urbs(&data->isoc_anchor); |
537 | 543 | ||
538 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); | 544 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); |
539 | usb_kill_anchored_urbs(&data->bulk_anchor); | 545 | usb_kill_anchored_urbs(&data->bulk_anchor); |
@@ -821,6 +827,7 @@ static int btusb_probe(struct usb_interface *intf, | |||
821 | } | 827 | } |
822 | 828 | ||
823 | data->udev = interface_to_usbdev(intf); | 829 | data->udev = interface_to_usbdev(intf); |
830 | data->intf = intf; | ||
824 | 831 | ||
825 | spin_lock_init(&data->lock); | 832 | spin_lock_init(&data->lock); |
826 | 833 | ||
@@ -889,7 +896,7 @@ static int btusb_probe(struct usb_interface *intf, | |||
889 | 896 | ||
890 | if (data->isoc) { | 897 | if (data->isoc) { |
891 | err = usb_driver_claim_interface(&btusb_driver, | 898 | err = usb_driver_claim_interface(&btusb_driver, |
892 | data->isoc, NULL); | 899 | data->isoc, data); |
893 | if (err < 0) { | 900 | if (err < 0) { |
894 | hci_free_dev(hdev); | 901 | hci_free_dev(hdev); |
895 | kfree(data); | 902 | kfree(data); |
@@ -921,13 +928,22 @@ static void btusb_disconnect(struct usb_interface *intf) | |||
921 | 928 | ||
922 | hdev = data->hdev; | 929 | hdev = data->hdev; |
923 | 930 | ||
924 | if (data->isoc) | 931 | __hci_dev_hold(hdev); |
925 | usb_driver_release_interface(&btusb_driver, data->isoc); | ||
926 | 932 | ||
927 | usb_set_intfdata(intf, NULL); | 933 | usb_set_intfdata(data->intf, NULL); |
934 | |||
935 | if (data->isoc) | ||
936 | usb_set_intfdata(data->isoc, NULL); | ||
928 | 937 | ||
929 | hci_unregister_dev(hdev); | 938 | hci_unregister_dev(hdev); |
930 | 939 | ||
940 | if (intf == data->isoc) | ||
941 | usb_driver_release_interface(&btusb_driver, data->intf); | ||
942 | else if (data->isoc) | ||
943 | usb_driver_release_interface(&btusb_driver, data->isoc); | ||
944 | |||
945 | __hci_dev_put(hdev); | ||
946 | |||
931 | hci_free_dev(hdev); | 947 | hci_free_dev(hdev); |
932 | } | 948 | } |
933 | 949 | ||
diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c index c04959357bda..87e37bc39145 100644 --- a/drivers/net/wireless/ath9k/core.c +++ b/drivers/net/wireless/ath9k/core.c | |||
@@ -795,6 +795,12 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan) | |||
795 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) | 795 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) |
796 | sc->sc_imask |= ATH9K_INT_CST; | 796 | sc->sc_imask |= ATH9K_INT_CST; |
797 | 797 | ||
798 | /* Note: We disable MIB interrupts for now as we don't yet | ||
799 | * handle processing ANI, otherwise you will get an interrupt | ||
800 | * storm after about 7 hours of usage making the system unusable | ||
801 | * with huge latency. Once we do have ANI processing included | ||
802 | * we can re-enable this interrupt. */ | ||
803 | #if 0 | ||
798 | /* | 804 | /* |
799 | * Enable MIB interrupts when there are hardware phy counters. | 805 | * Enable MIB interrupts when there are hardware phy counters. |
800 | * Note we only do this (at the moment) for station mode. | 806 | * 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) | |||
802 | if (ath9k_hw_phycounters(ah) && | 808 | if (ath9k_hw_phycounters(ah) && |
803 | ((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS))) | 809 | ((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS))) |
804 | sc->sc_imask |= ATH9K_INT_MIB; | 810 | sc->sc_imask |= ATH9K_INT_MIB; |
811 | #endif | ||
805 | /* | 812 | /* |
806 | * Some hardware processes the TIM IE and fires an | 813 | * Some hardware processes the TIM IE and fires an |
807 | * interrupt when the TIM bit is set. For hardware | 814 | * interrupt when the TIM bit is set. For hardware |
diff --git a/net/ipv6/netfilter/ip6t_hbh.c b/net/ipv6/netfilter/ip6t_hbh.c index 62e39ace0588..26654b26d7fa 100644 --- a/net/ipv6/netfilter/ip6t_hbh.c +++ b/net/ipv6/netfilter/ip6t_hbh.c | |||
@@ -97,8 +97,6 @@ hbh_mt6(const struct sk_buff *skb, const struct net_device *in, | |||
97 | hdrlen -= 2; | 97 | hdrlen -= 2; |
98 | if (!(optinfo->flags & IP6T_OPTS_OPTS)) { | 98 | if (!(optinfo->flags & IP6T_OPTS_OPTS)) { |
99 | return ret; | 99 | return ret; |
100 | } else if (optinfo->flags & IP6T_OPTS_NSTRICT) { | ||
101 | pr_debug("Not strict - not implemented"); | ||
102 | } else { | 100 | } else { |
103 | pr_debug("Strict "); | 101 | pr_debug("Strict "); |
104 | pr_debug("#%d ", optinfo->optsnr); | 102 | pr_debug("#%d ", optinfo->optsnr); |
@@ -177,6 +175,12 @@ hbh_mt6_check(const char *tablename, const void *entry, | |||
177 | pr_debug("ip6t_opts: unknown flags %X\n", optsinfo->invflags); | 175 | pr_debug("ip6t_opts: unknown flags %X\n", optsinfo->invflags); |
178 | return false; | 176 | return false; |
179 | } | 177 | } |
178 | |||
179 | if (optsinfo->flags & IP6T_OPTS_NSTRICT) { | ||
180 | pr_debug("ip6t_opts: Not strict - not implemented"); | ||
181 | return false; | ||
182 | } | ||
183 | |||
180 | return true; | 184 | return true; |
181 | } | 185 | } |
182 | 186 | ||