From dd070ef8dbc5549ae6c495c36dfa7bc35f31b9e5 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 14 Jun 2012 10:42:33 -0700 Subject: [PATCH] 3.4-stable patches added patches: alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch can-c_can-fix-race-condition-in-c_can_open.patch cfg80211-fix-interface-combinations-check.patch net-sierra_net-device-ids-for-aircard-320u.patch rt2x00-use-atomic-variable-for-seqno.patch wireless-rt2x00-rt2800usb-add-more-devices-ids.patch wireless-rt2x00-rt2800usb-more-devices-were-identified.patch --- ...-pin-fixup-for-zotac-z68-motherboard.patch | 54 ++++++ ...-workaround-for-bcm4331-and-bcm43431.patch | 58 ++++++ ...rrupt-thrash-issue-with-c_can-driver.patch | 68 +++++++ ...echo_skb-is-occupied-during-transmit.patch | 67 +++++++ ...can-fix-race-condition-in-c_can_open.patch | 45 +++++ ...211-fix-interface-combinations-check.patch | 79 ++++++++ ...erra_net-device-ids-for-aircard-320u.patch | 68 +++++++ ...rt2x00-use-atomic-variable-for-seqno.patch | 168 ++++++++++++++++++ queue-3.4/series | 10 ++ ...t2x00-rt2800usb-add-more-devices-ids.patch | 95 ++++++++++ ...2800usb-more-devices-were-identified.patch | 76 ++++++++ 11 files changed, 788 insertions(+) create mode 100644 queue-3.4/alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch create mode 100644 queue-3.4/bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch create mode 100644 queue-3.4/can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch create mode 100644 queue-3.4/can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch create mode 100644 queue-3.4/can-c_can-fix-race-condition-in-c_can_open.patch create mode 100644 queue-3.4/cfg80211-fix-interface-combinations-check.patch create mode 100644 queue-3.4/net-sierra_net-device-ids-for-aircard-320u.patch create mode 100644 queue-3.4/rt2x00-use-atomic-variable-for-seqno.patch create mode 100644 queue-3.4/wireless-rt2x00-rt2800usb-add-more-devices-ids.patch create mode 100644 queue-3.4/wireless-rt2x00-rt2800usb-more-devices-were-identified.patch diff --git a/queue-3.4/alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch b/queue-3.4/alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch new file mode 100644 index 00000000000..8a1b9d85d81 --- /dev/null +++ b/queue-3.4/alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch @@ -0,0 +1,54 @@ +From edfe3bfc1b779ddda9bcff523eb022dda37b93c8 Mon Sep 17 00:00:00 2001 +From: David Henningsson +Date: Tue, 12 Jun 2012 13:15:12 +0200 +Subject: ALSA: HDA: Pin fixup for Zotac Z68 motherboard + +From: David Henningsson + +commit edfe3bfc1b779ddda9bcff523eb022dda37b93c8 upstream. + +Pin 0x1b was connected to the front panel connector, which according to +the HDA standard should contain a mic and a headphone. In this case, +the headphone was listed as "line out" by BIOS. + +BugLink: https://bugs.launchpad.net/bugs/993162 +Signed-off-by: David Henningsson +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -6606,6 +6606,7 @@ enum { + ALC662_FIXUP_ASUS_MODE7, + ALC662_FIXUP_ASUS_MODE8, + ALC662_FIXUP_NO_JACK_DETECT, ++ ALC662_FIXUP_ZOTAC_Z68, + }; + + static const struct alc_fixup alc662_fixups[] = { +@@ -6755,6 +6756,13 @@ static const struct alc_fixup alc662_fix + .type = ALC_FIXUP_FUNC, + .v.func = alc_fixup_no_jack_detect, + }, ++ [ALC662_FIXUP_ZOTAC_Z68] = { ++ .type = ALC_FIXUP_PINS, ++ .v.pins = (const struct alc_pincfg[]) { ++ { 0x1b, 0x02214020 }, /* Front HP */ ++ { } ++ } ++ }, + }; + + static const struct snd_pci_quirk alc662_fixup_tbl[] = { +@@ -6768,6 +6776,7 @@ static const struct snd_pci_quirk alc662 + SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), ++ SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68), + SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T), + + #if 0 diff --git a/queue-3.4/bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch b/queue-3.4/bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch new file mode 100644 index 00000000000..4c0ac0dd4fd --- /dev/null +++ b/queue-3.4/bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch @@ -0,0 +1,58 @@ +From 69aaedd3cfd23b2c732e3cf1227370a35f5c89d4 Mon Sep 17 00:00:00 2001 +From: Seth Forshee +Date: Fri, 1 Jun 2012 09:13:17 -0500 +Subject: bcma: add ext PA workaround for BCM4331 and BCM43431 + +From: Seth Forshee + +commit 69aaedd3cfd23b2c732e3cf1227370a35f5c89d4 upstream. + +MacBook Pro models with BCM4331 wireless have been found to have the ext +PA lines disabled after resuming from S3 without external power attach. +This causes them to be unable to transmit. Add a workaround to ensure +that the ext PA lines are enabled on BCM4331. Also extend all handling +of ext PA line muxing to BCM43431 as is done in the Broadcom SDK. + +BugLink: http://bugs.launchpad.net/bugs/925577 +Cc: Arend van Spriel +Cc: Hauke Mehrtens +Signed-off-by: Seth Forshee +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/bcma/driver_chipcommon_pmu.c | 4 +++- + drivers/bcma/sprom.c | 4 ++-- + 2 files changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/bcma/driver_chipcommon_pmu.c ++++ b/drivers/bcma/driver_chipcommon_pmu.c +@@ -139,7 +139,9 @@ void bcma_pmu_workarounds(struct bcma_dr + bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7); + break; + case 0x4331: +- /* BCM4331 workaround is SPROM-related, we put it in sprom.c */ ++ case 43431: ++ /* Ext PA lines must be enabled for tx on BCM4331 */ ++ bcma_chipco_bcm4331_ext_pa_lines_ctl(cc, true); + break; + case 43224: + if (bus->chipinfo.rev == 0) { +--- a/drivers/bcma/sprom.c ++++ b/drivers/bcma/sprom.c +@@ -432,13 +432,13 @@ int bcma_sprom_get(struct bcma_bus *bus) + if (!sprom) + return -ENOMEM; + +- if (bus->chipinfo.id == 0x4331) ++ if (bus->chipinfo.id == 0x4331 || bus->chipinfo.id == 43431) + bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false); + + pr_debug("SPROM offset 0x%x\n", offset); + bcma_sprom_read(bus, offset, sprom); + +- if (bus->chipinfo.id == 0x4331) ++ if (bus->chipinfo.id == 0x4331 || bus->chipinfo.id == 43431) + bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true); + + err = bcma_sprom_valid(sprom); diff --git a/queue-3.4/can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch b/queue-3.4/can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch new file mode 100644 index 00000000000..1c94968552f --- /dev/null +++ b/queue-3.4/can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch @@ -0,0 +1,68 @@ +From 148c87c89e1a8863d3d965179f3ab1a06490569e Mon Sep 17 00:00:00 2001 +From: AnilKumar Ch +Date: Wed, 23 May 2012 17:45:10 +0530 +Subject: can: c_can: fix an interrupt thrash issue with c_can driver + +From: AnilKumar Ch + +commit 148c87c89e1a8863d3d965179f3ab1a06490569e upstream. + +This patch fixes an interrupt thrash issue with c_can driver. + +In c_can_isr() function interrupts are disabled and enabled only in +c_can_poll() function. c_can_isr() & c_can_poll() both read the +irqstatus flag. However, irqstatus is always read as 0 in c_can_poll() +because all C_CAN interrupts are disabled in c_can_isr(). This causes +all interrupts to be re-enabled in c_can_poll() which in turn causes +another interrupt since the event is not really handled. This keeps +happening causing a flood of interrupts. + +To fix this, read the irqstatus register in isr and use the same cached +value in the poll function. + +Signed-off-by: AnilKumar Ch +Acked-by: Wolfgang Grandegger +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/c_can/c_can.c | 7 +++---- + drivers/net/can/c_can/c_can.h | 1 + + 2 files changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/can/c_can/c_can.c ++++ b/drivers/net/can/c_can/c_can.c +@@ -952,7 +952,7 @@ static int c_can_poll(struct napi_struct + struct net_device *dev = napi->dev; + struct c_can_priv *priv = netdev_priv(dev); + +- irqstatus = priv->read_reg(priv, &priv->regs->interrupt); ++ irqstatus = priv->irqstatus; + if (!irqstatus) + goto end; + +@@ -1030,12 +1030,11 @@ end: + + static irqreturn_t c_can_isr(int irq, void *dev_id) + { +- u16 irqstatus; + struct net_device *dev = (struct net_device *)dev_id; + struct c_can_priv *priv = netdev_priv(dev); + +- irqstatus = priv->read_reg(priv, &priv->regs->interrupt); +- if (!irqstatus) ++ priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt); ++ if (!priv->irqstatus) + return IRQ_NONE; + + /* disable all interrupts and schedule the NAPI */ +--- a/drivers/net/can/c_can/c_can.h ++++ b/drivers/net/can/c_can/c_can.h +@@ -76,6 +76,7 @@ struct c_can_priv { + unsigned int tx_next; + unsigned int tx_echo; + void *priv; /* for board-specific data */ ++ u16 irqstatus; + }; + + struct net_device *alloc_c_can_dev(void); diff --git a/queue-3.4/can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch b/queue-3.4/can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch new file mode 100644 index 00000000000..6e5a60462f8 --- /dev/null +++ b/queue-3.4/can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch @@ -0,0 +1,67 @@ +From 617caccebe451716df21c069b079d5936ed7b0f3 Mon Sep 17 00:00:00 2001 +From: AnilKumar Ch +Date: Wed, 23 May 2012 17:45:09 +0530 +Subject: can: c_can: fix "BUG! echo_skb is occupied!" during transmit + +From: AnilKumar Ch + +commit 617caccebe451716df21c069b079d5936ed7b0f3 upstream. + +This patch fixes an issue with transmit routine, which causes +"can_put_echo_skb: BUG! echo_skb is occupied!" message when +using "cansequence -p" on D_CAN controller. + +In c_can driver, while transmitting packets tx_echo flag holds +the no of can frames put for transmission into the hardware. + +As the comment above c_can_do_tx() indicates, if we find any packet +which is not transmitted then we should stop looking for more. +In the current implementation this is not taken care of causing the +said message. + +Also, fix the condition used to find if the packet is transmitted +or not. Current code skips the first tx message object and ends up +checking one extra invalid object. + +While at it, fix the comment on top of c_can_do_tx() to use the +terminology "packet" instead of "package" since it is more +standard. + +Signed-off-by: AnilKumar Ch +Acked-by: Wolfgang Grandegger +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/c_can/c_can.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/can/c_can/c_can.c ++++ b/drivers/net/can/c_can/c_can.c +@@ -686,7 +686,7 @@ static int c_can_get_berr_counter(const + * + * We iterate from priv->tx_echo to priv->tx_next and check if the + * packet has been transmitted, echo it back to the CAN framework. +- * If we discover a not yet transmitted package, stop looking for more. ++ * If we discover a not yet transmitted packet, stop looking for more. + */ + static void c_can_do_tx(struct net_device *dev) + { +@@ -698,7 +698,7 @@ static void c_can_do_tx(struct net_devic + for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) { + msg_obj_no = get_tx_echo_msg_obj(priv); + val = c_can_read_reg32(priv, &priv->regs->txrqst1); +- if (!(val & (1 << msg_obj_no))) { ++ if (!(val & (1 << (msg_obj_no - 1)))) { + can_get_echo_skb(dev, + msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST); + stats->tx_bytes += priv->read_reg(priv, +@@ -706,6 +706,8 @@ static void c_can_do_tx(struct net_devic + & IF_MCONT_DLC_MASK; + stats->tx_packets++; + c_can_inval_msg_object(dev, 0, msg_obj_no); ++ } else { ++ break; + } + } + diff --git a/queue-3.4/can-c_can-fix-race-condition-in-c_can_open.patch b/queue-3.4/can-c_can-fix-race-condition-in-c_can_open.patch new file mode 100644 index 00000000000..7a8d6bbe8ac --- /dev/null +++ b/queue-3.4/can-c_can-fix-race-condition-in-c_can_open.patch @@ -0,0 +1,45 @@ +From f461f27a4436dbe691908fe08b867ef888848cc3 Mon Sep 17 00:00:00 2001 +From: AnilKumar Ch +Date: Wed, 23 May 2012 17:45:11 +0530 +Subject: can: c_can: fix race condition in c_can_open() + +From: AnilKumar Ch + +commit f461f27a4436dbe691908fe08b867ef888848cc3 upstream. + +Fix the issue of C_CAN interrupts getting disabled forever when canconfig +utility is used multiple times. According to NAPI usage we disable all +the hardware interrupts in ISR and re-enable them in poll(). Current +implementation calls napi_enable() after hardware interrupts are enabled. +If we get any interrupts between these two steps then we do not process +those interrupts because napi is not enabled. Mostly these interrupts +come because of STATUS is not 0x7 or ERROR interrupts. If napi_enable() +happens before HW interrupts enabled then c_can_poll() function will be +called eventual re-enabling. + +This patch moves the napi_enable() call before interrupts enabled. + +Signed-off-by: AnilKumar Ch +Acked-by: Wolfgang Grandegger +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/c_can/c_can.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/net/can/c_can/c_can.c ++++ b/drivers/net/can/c_can/c_can.c +@@ -1064,10 +1064,11 @@ static int c_can_open(struct net_device + goto exit_irq_fail; + } + ++ napi_enable(&priv->napi); ++ + /* start the c_can controller */ + c_can_start(dev); + +- napi_enable(&priv->napi); + netif_start_queue(dev); + + return 0; diff --git a/queue-3.4/cfg80211-fix-interface-combinations-check.patch b/queue-3.4/cfg80211-fix-interface-combinations-check.patch new file mode 100644 index 00000000000..2dae3181f14 --- /dev/null +++ b/queue-3.4/cfg80211-fix-interface-combinations-check.patch @@ -0,0 +1,79 @@ +From 463454b5dbd8dbab6e2fc6c557329e5b811b9c32 Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Tue, 5 Jun 2012 12:16:50 +0200 +Subject: cfg80211: fix interface combinations check + +From: Johannes Berg + +commit 463454b5dbd8dbab6e2fc6c557329e5b811b9c32 upstream. + +If a given interface combination doesn't contain +a required interface type then we missed checking +that and erroneously allowed it even though iface +type wasn't there at all. Add a check that makes +sure that all interface types are accounted for. + +Reported-by: Mohammed Shafi Shajakhan +Signed-off-by: Johannes Berg +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + net/wireless/util.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -936,6 +936,7 @@ int cfg80211_can_change_interface(struct + enum nl80211_iftype iftype) + { + struct wireless_dev *wdev_iter; ++ u32 used_iftypes = BIT(iftype); + int num[NUM_NL80211_IFTYPES]; + int total = 1; + int i, j; +@@ -969,12 +970,14 @@ int cfg80211_can_change_interface(struct + + num[wdev_iter->iftype]++; + total++; ++ used_iftypes |= BIT(wdev_iter->iftype); + } + mutex_unlock(&rdev->devlist_mtx); + + for (i = 0; i < rdev->wiphy.n_iface_combinations; i++) { + const struct ieee80211_iface_combination *c; + struct ieee80211_iface_limit *limits; ++ u32 all_iftypes = 0; + + c = &rdev->wiphy.iface_combinations[i]; + +@@ -989,6 +992,7 @@ int cfg80211_can_change_interface(struct + if (rdev->wiphy.software_iftypes & BIT(iftype)) + continue; + for (j = 0; j < c->n_limits; j++) { ++ all_iftypes |= limits[j].types; + if (!(limits[j].types & BIT(iftype))) + continue; + if (limits[j].max < num[iftype]) +@@ -996,7 +1000,20 @@ int cfg80211_can_change_interface(struct + limits[j].max -= num[iftype]; + } + } +- /* yay, it fits */ ++ ++ /* ++ * Finally check that all iftypes that we're currently ++ * using are actually part of this combination. If they ++ * aren't then we can't use this combination and have ++ * to continue to the next. ++ */ ++ if ((all_iftypes & used_iftypes) != used_iftypes) ++ goto cont; ++ ++ /* ++ * This combination covered all interface types and ++ * supported the requested numbers, so we're good. ++ */ + kfree(limits); + return 0; + cont: diff --git a/queue-3.4/net-sierra_net-device-ids-for-aircard-320u.patch b/queue-3.4/net-sierra_net-device-ids-for-aircard-320u.patch new file mode 100644 index 00000000000..c8cdd01ddb3 --- /dev/null +++ b/queue-3.4/net-sierra_net-device-ids-for-aircard-320u.patch @@ -0,0 +1,68 @@ +From dd03cff23d694cfb0fdae80cb618e7ced05ea696 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Tue, 5 Jun 2012 21:18:10 +0000 +Subject: net: sierra_net: device IDs for Aircard 320U++ +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Bjørn Mork + +commit dd03cff23d694cfb0fdae80cb618e7ced05ea696 upstream. + +Adding device IDs for Aircard 320U and two other devices +found in the out-of-tree version of this driver. + +Cc: linux@sierrawireless.com +Cc: Autif Khan +Cc: Tom Cassidy +Signed-off-by: Bjørn Mork +Acked-by: Greg Kroah-Hartman +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/usb/sierra_net.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +--- a/drivers/net/usb/sierra_net.c ++++ b/drivers/net/usb/sierra_net.c +@@ -946,7 +946,7 @@ struct sk_buff *sierra_net_tx_fixup(stru + } + + static const u8 sierra_net_ifnum_list[] = { 7, 10, 11 }; +-static const struct sierra_net_info_data sierra_net_info_data_68A3 = { ++static const struct sierra_net_info_data sierra_net_info_data_direct_ip = { + .rx_urb_size = 8 * 1024, + .whitelist = { + .infolen = ARRAY_SIZE(sierra_net_ifnum_list), +@@ -954,7 +954,7 @@ static const struct sierra_net_info_data + } + }; + +-static const struct driver_info sierra_net_info_68A3 = { ++static const struct driver_info sierra_net_info_direct_ip = { + .description = "Sierra Wireless USB-to-WWAN Modem", + .flags = FLAG_WWAN | FLAG_SEND_ZLP, + .bind = sierra_net_bind, +@@ -962,12 +962,18 @@ static const struct driver_info sierra_n + .status = sierra_net_status, + .rx_fixup = sierra_net_rx_fixup, + .tx_fixup = sierra_net_tx_fixup, +- .data = (unsigned long)&sierra_net_info_data_68A3, ++ .data = (unsigned long)&sierra_net_info_data_direct_ip, + }; + + static const struct usb_device_id products[] = { + {USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless USB-to-WWAN modem */ +- .driver_info = (unsigned long) &sierra_net_info_68A3}, ++ .driver_info = (unsigned long) &sierra_net_info_direct_ip}, ++ {USB_DEVICE(0x0F3D, 0x68A3), /* AT&T Direct IP modem */ ++ .driver_info = (unsigned long) &sierra_net_info_direct_ip}, ++ {USB_DEVICE(0x1199, 0x68AA), /* Sierra Wireless Direct IP LTE modem */ ++ .driver_info = (unsigned long) &sierra_net_info_direct_ip}, ++ {USB_DEVICE(0x0F3D, 0x68AA), /* AT&T Direct IP LTE modem */ ++ .driver_info = (unsigned long) &sierra_net_info_direct_ip}, + + {}, /* last item */ + }; diff --git a/queue-3.4/rt2x00-use-atomic-variable-for-seqno.patch b/queue-3.4/rt2x00-use-atomic-variable-for-seqno.patch new file mode 100644 index 00000000000..531cb70c611 --- /dev/null +++ b/queue-3.4/rt2x00-use-atomic-variable-for-seqno.patch @@ -0,0 +1,168 @@ +From e5851dac2c95af7159716832300b9f50c62c648e Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Fri, 1 Jun 2012 11:29:40 +0200 +Subject: rt2x00: use atomic variable for seqno + +From: Stanislaw Gruszka + +commit e5851dac2c95af7159716832300b9f50c62c648e upstream. + +Remove spinlock as atomic_t can be used instead. Note we use only 16 +lower bits, upper bits are changed but we impilcilty cast to u16. + +This fix possible deadlock on IBSS mode reproted by lockdep: + +================================= +[ INFO: inconsistent lock state ] +3.4.0-wl+ #4 Not tainted +--------------------------------- +inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage. +kworker/u:2/30374 [HC0[0]:SC0[0]:HE1:SE1] takes: + (&(&intf->seqlock)->rlock){+.?...}, at: [] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib] +{IN-SOFTIRQ-W} state was registered at: + [] __lock_acquire+0x47b/0x1050 + [] lock_acquire+0x84/0xf0 + [] _raw_spin_lock+0x33/0x40 + [] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib] + [] rt2x00queue_write_tx_frame+0x1a/0x300 [rt2x00lib] + [] rt2x00mac_tx+0x7f/0x380 [rt2x00lib] + [] __ieee80211_tx+0x1b3/0x300 [mac80211] + [] ieee80211_tx+0x105/0x130 [mac80211] + [] ieee80211_xmit+0xad/0x100 [mac80211] + [] ieee80211_subif_start_xmit+0x2d9/0x930 [mac80211] + [] dev_hard_start_xmit+0x307/0x660 + [] sch_direct_xmit+0xa1/0x1e0 + [] dev_queue_xmit+0x183/0x730 + [] neigh_resolve_output+0xfa/0x1e0 + [] ip_finish_output+0x24a/0x460 + [] ip_output+0xb7/0x100 + [] ip_local_out+0x20/0x60 + [] igmpv3_sendpack+0x4f/0x60 + [] igmp_ifc_timer_expire+0x29f/0x330 + [] run_timer_softirq+0x15c/0x2f0 + [] __do_softirq+0xae/0x1e0 +irq event stamp: 18380437 +hardirqs last enabled at (18380437): [] __slab_alloc.clone.3+0x67/0x5f0 +hardirqs last disabled at (18380436): [] __slab_alloc.clone.3+0x33/0x5f0 +softirqs last enabled at (18377616): [] __do_softirq+0x123/0x1e0 +softirqs last disabled at (18377611): [] do_softirq+0x9d/0xe0 + +other info that might help us debug this: + Possible unsafe locking scenario: + + CPU0 + ---- + lock(&(&intf->seqlock)->rlock); + + lock(&(&intf->seqlock)->rlock); + + *** DEADLOCK *** + +4 locks held by kworker/u:2/30374: + #0: (wiphy_name(local->hw.wiphy)){++++.+}, at: [] process_one_work+0x109/0x3f0 + #1: ((&sdata->work)){+.+.+.}, at: [] process_one_work+0x109/0x3f0 + #2: (&ifibss->mtx){+.+.+.}, at: [] ieee80211_ibss_work+0x1b/0x470 [mac80211] + #3: (&intf->beacon_skb_mutex){+.+...}, at: [] rt2x00queue_update_beacon+0x24/0x50 [rt2x00lib] + +stack backtrace: +Pid: 30374, comm: kworker/u:2 Not tainted 3.4.0-wl+ #4 +Call Trace: + [] print_usage_bug+0x1f6/0x220 + [] mark_lock+0x2c2/0x300 + [] ? check_usage_forwards+0xc0/0xc0 + [] __lock_acquire+0x4bc/0x1050 + [] ? __kmalloc_track_caller+0x1c0/0x1d0 + [] ? copy_skb_header+0x26/0x90 + [] lock_acquire+0x84/0xf0 + [] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib] + [] _raw_spin_lock+0x33/0x40 + [] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib] + [] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib] + [] rt2x00queue_update_beacon_locked+0x5f/0xb0 [rt2x00lib] + [] rt2x00queue_update_beacon+0x2d/0x50 [rt2x00lib] + [] rt2x00mac_bss_info_changed+0x1ca/0x200 [rt2x00lib] + [] ? rt2x00mac_remove_interface+0x70/0x70 [rt2x00lib] + [] ieee80211_bss_info_change_notify+0xe0/0x1d0 [mac80211] + [] __ieee80211_sta_join_ibss+0x3b8/0x610 [mac80211] + [] ? mark_held_locks+0x64/0xc0 + [] ? virt_efi_query_capsule_caps+0x12/0x50 + [] ieee80211_sta_join_ibss+0xf9/0x140 [mac80211] + [] ieee80211_ibss_work+0x416/0x470 [mac80211] + [] ? trace_hardirqs_on+0xb/0x10 + [] ? skb_dequeue+0x4b/0x70 + [] ieee80211_iface_work+0x13f/0x230 [mac80211] + [] ? process_one_work+0x109/0x3f0 + [] process_one_work+0x185/0x3f0 + [] ? process_one_work+0x109/0x3f0 + [] ? ieee80211_teardown_sdata+0xa0/0xa0 [mac80211] + [] worker_thread+0x116/0x270 + [] ? manage_workers+0x1e0/0x1e0 + [] kthread+0x84/0x90 + [] ? __init_kthread_worker+0x60/0x60 + [] kernel_thread_helper+0x6/0x10 + +Signed-off-by: Stanislaw Gruszka +Acked-by: Helmut Schaa +Acked-by: Gertjan van Wingerde +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/rt2x00/rt2x00.h | 3 +-- + drivers/net/wireless/rt2x00/rt2x00mac.c | 1 - + drivers/net/wireless/rt2x00/rt2x00queue.c | 13 ++++++------- + 3 files changed, 7 insertions(+), 10 deletions(-) + +--- a/drivers/net/wireless/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/rt2x00/rt2x00.h +@@ -396,8 +396,7 @@ struct rt2x00_intf { + * for hardware which doesn't support hardware + * sequence counting. + */ +- spinlock_t seqlock; +- u16 seqno; ++ atomic_t seqno; + }; + + static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) +--- a/drivers/net/wireless/rt2x00/rt2x00mac.c ++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c +@@ -277,7 +277,6 @@ int rt2x00mac_add_interface(struct ieee8 + else + rt2x00dev->intf_sta_count++; + +- spin_lock_init(&intf->seqlock); + mutex_init(&intf->beacon_skb_mutex); + intf->beacon = entry; + +--- a/drivers/net/wireless/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c +@@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descri + struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif); ++ u16 seqno; + + if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)) + return; +@@ -227,15 +228,13 @@ static void rt2x00queue_create_tx_descri + * sequence counting per-frame, since those will override the + * sequence counter given by mac80211. + */ +- spin_lock(&intf->seqlock); +- + if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) +- intf->seqno += 0x10; +- hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); +- hdr->seq_ctrl |= cpu_to_le16(intf->seqno); +- +- spin_unlock(&intf->seqlock); ++ seqno = atomic_add_return(0x10, &intf->seqno); ++ else ++ seqno = atomic_read(&intf->seqno); + ++ hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); ++ hdr->seq_ctrl |= cpu_to_le16(seqno); + } + + static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev, diff --git a/queue-3.4/series b/queue-3.4/series index 18532d40ddc..1c6054ac5ab 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -23,3 +23,13 @@ mac80211-clean-up-remain-on-channel-on-interface-stop.patch mac80211-fix-non-rcu-safe-sta_list-manipulation.patch asoc-wm8994-ensure-all-aifnclk-events-are-run-from-the-_late-variants.patch asoc-wm8994-apply-volume-updates-with-clocks-enabled.patch +bcma-add-ext-pa-workaround-for-bcm4331-and-bcm43431.patch +alsa-hda-pin-fixup-for-zotac-z68-motherboard.patch +cfg80211-fix-interface-combinations-check.patch +rt2x00-use-atomic-variable-for-seqno.patch +wireless-rt2x00-rt2800usb-add-more-devices-ids.patch +wireless-rt2x00-rt2800usb-more-devices-were-identified.patch +net-sierra_net-device-ids-for-aircard-320u.patch +can-c_can-fix-bug-echo_skb-is-occupied-during-transmit.patch +can-c_can-fix-an-interrupt-thrash-issue-with-c_can-driver.patch +can-c_can-fix-race-condition-in-c_can_open.patch diff --git a/queue-3.4/wireless-rt2x00-rt2800usb-add-more-devices-ids.patch b/queue-3.4/wireless-rt2x00-rt2800usb-add-more-devices-ids.patch new file mode 100644 index 00000000000..11997c12c2e --- /dev/null +++ b/queue-3.4/wireless-rt2x00-rt2800usb-add-more-devices-ids.patch @@ -0,0 +1,95 @@ +From 63b376411173c343bbcb450f95539da91f079e0c Mon Sep 17 00:00:00 2001 +From: Xose Vazquez Perez +Date: Tue, 17 Apr 2012 01:50:32 +0200 +Subject: wireless: rt2x00: rt2800usb add more devices ids + +From: Xose Vazquez Perez + +commit 63b376411173c343bbcb450f95539da91f079e0c upstream. + +They were taken from ralink drivers: +2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO +2012_03_22_RT5572_Linux_STA_v2.6.0.0_DPO + +0x1eda,0x2210 RT3070 Airties + +0x083a,0xb511 RT3370 Panasonic +0x0471,0x20dd RT3370 Philips + +0x1690,0x0764 RT35xx Askey +0x0df6,0x0065 RT35xx Sitecom +0x0df6,0x0066 RT35xx Sitecom +0x0df6,0x0068 RT35xx Sitecom + +0x2001,0x3c1c RT5370 DLink +0x2001,0x3c1d RT5370 DLink + +2001 is D-Link not Alpha + +Signed-off-by: Xose Vazquez Perez +Acked-by: Gertjan van Wingerde +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/rt2x00/rt2800usb.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/rt2x00/rt2800usb.c ++++ b/drivers/net/wireless/rt2x00/rt2800usb.c +@@ -922,6 +922,7 @@ static struct usb_device_id rt2800usb_de + { USB_DEVICE(0x1482, 0x3c09) }, + /* AirTies */ + { USB_DEVICE(0x1eda, 0x2012) }, ++ { USB_DEVICE(0x1eda, 0x2210) }, + { USB_DEVICE(0x1eda, 0x2310) }, + /* Allwin */ + { USB_DEVICE(0x8516, 0x2070) }, +@@ -1134,6 +1135,10 @@ static struct usb_device_id rt2800usb_de + #ifdef CONFIG_RT2800USB_RT33XX + /* Belkin */ + { USB_DEVICE(0x050d, 0x945b) }, ++ /* Panasonic */ ++ { USB_DEVICE(0x083a, 0xb511) }, ++ /* Philips */ ++ { USB_DEVICE(0x0471, 0x20dd) }, + /* Ralink */ + { USB_DEVICE(0x148f, 0x3370) }, + { USB_DEVICE(0x148f, 0x8070) }, +@@ -1145,6 +1150,7 @@ static struct usb_device_id rt2800usb_de + { USB_DEVICE(0x8516, 0x3572) }, + /* Askey */ + { USB_DEVICE(0x1690, 0x0744) }, ++ { USB_DEVICE(0x1690, 0x0764) }, + /* Cisco */ + { USB_DEVICE(0x167b, 0x4001) }, + /* EnGenius */ +@@ -1159,20 +1165,25 @@ static struct usb_device_id rt2800usb_de + /* Sitecom */ + { USB_DEVICE(0x0df6, 0x0041) }, + { USB_DEVICE(0x0df6, 0x0062) }, ++ { USB_DEVICE(0x0df6, 0x0065) }, ++ { USB_DEVICE(0x0df6, 0x0066) }, ++ { USB_DEVICE(0x0df6, 0x0068) }, + /* Toshiba */ + { USB_DEVICE(0x0930, 0x0a07) }, + /* Zinwell */ + { USB_DEVICE(0x5a57, 0x0284) }, + #endif + #ifdef CONFIG_RT2800USB_RT53XX +- /* Alpha */ +- { USB_DEVICE(0x2001, 0x3c15) }, +- { USB_DEVICE(0x2001, 0x3c19) }, + /* Arcadyan */ + { USB_DEVICE(0x043e, 0x7a12) }, + /* Azurewave */ + { USB_DEVICE(0x13d3, 0x3329) }, + { USB_DEVICE(0x13d3, 0x3365) }, ++ /* D-Link */ ++ { USB_DEVICE(0x2001, 0x3c15) }, ++ { USB_DEVICE(0x2001, 0x3c19) }, ++ { USB_DEVICE(0x2001, 0x3c1c) }, ++ { USB_DEVICE(0x2001, 0x3c1d) }, + /* LG innotek */ + { USB_DEVICE(0x043e, 0x7a22) }, + /* Panasonic */ diff --git a/queue-3.4/wireless-rt2x00-rt2800usb-more-devices-were-identified.patch b/queue-3.4/wireless-rt2x00-rt2800usb-more-devices-were-identified.patch new file mode 100644 index 00000000000..02a7524d747 --- /dev/null +++ b/queue-3.4/wireless-rt2x00-rt2800usb-more-devices-were-identified.patch @@ -0,0 +1,76 @@ +From e828b9fb4f6c3513950759d5fb902db5bd054048 Mon Sep 17 00:00:00 2001 +From: Xose Vazquez Perez +Date: Tue, 17 Apr 2012 16:28:05 +0200 +Subject: wireless: rt2x00: rt2800usb more devices were identified + +From: Xose Vazquez Perez + +commit e828b9fb4f6c3513950759d5fb902db5bd054048 upstream. + +found in 2012_03_22_RT5572_Linux_STA_v2.6.0.0_DPO + +RT3070: +(0x2019,0x5201) Planex Communications, Inc. RT8070 +(0x7392,0x4085) 2L Central Europe BV 8070 +7392 is Edimax + +RT35xx: +(0x1690,0x0761) Askey +was Fujitsu Stylistic 550, but 1690 is Askey + +Signed-off-by: Xose Vazquez Perez +Acked-by: Gertjan van Wingerde +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/rt2x00/rt2800usb.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +--- a/drivers/net/wireless/rt2x00/rt2800usb.c ++++ b/drivers/net/wireless/rt2x00/rt2800usb.c +@@ -992,6 +992,7 @@ static struct usb_device_id rt2800usb_de + /* DVICO */ + { USB_DEVICE(0x0fe9, 0xb307) }, + /* Edimax */ ++ { USB_DEVICE(0x7392, 0x4085) }, + { USB_DEVICE(0x7392, 0x7711) }, + { USB_DEVICE(0x7392, 0x7717) }, + { USB_DEVICE(0x7392, 0x7718) }, +@@ -1067,6 +1068,7 @@ static struct usb_device_id rt2800usb_de + /* Philips */ + { USB_DEVICE(0x0471, 0x200f) }, + /* Planex */ ++ { USB_DEVICE(0x2019, 0x5201) }, + { USB_DEVICE(0x2019, 0xab25) }, + { USB_DEVICE(0x2019, 0xed06) }, + /* Quanta */ +@@ -1150,6 +1152,7 @@ static struct usb_device_id rt2800usb_de + { USB_DEVICE(0x8516, 0x3572) }, + /* Askey */ + { USB_DEVICE(0x1690, 0x0744) }, ++ { USB_DEVICE(0x1690, 0x0761) }, + { USB_DEVICE(0x1690, 0x0764) }, + /* Cisco */ + { USB_DEVICE(0x167b, 0x4001) }, +@@ -1235,12 +1238,8 @@ static struct usb_device_id rt2800usb_de + { USB_DEVICE(0x07d1, 0x3c0b) }, + { USB_DEVICE(0x07d1, 0x3c17) }, + { USB_DEVICE(0x2001, 0x3c17) }, +- /* Edimax */ +- { USB_DEVICE(0x7392, 0x4085) }, + /* Encore */ + { USB_DEVICE(0x203d, 0x14a1) }, +- /* Fujitsu Stylistic 550 */ +- { USB_DEVICE(0x1690, 0x0761) }, + /* Gemtek */ + { USB_DEVICE(0x15a9, 0x0010) }, + /* Gigabyte */ +@@ -1261,7 +1260,6 @@ static struct usb_device_id rt2800usb_de + { USB_DEVICE(0x05a6, 0x0101) }, + { USB_DEVICE(0x1d4d, 0x0010) }, + /* Planex */ +- { USB_DEVICE(0x2019, 0x5201) }, + { USB_DEVICE(0x2019, 0xab24) }, + /* Qcom */ + { USB_DEVICE(0x18e8, 0x6259) }, -- 2.47.3