]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linvil...
authorJeff Garzik <jeff@garzik.org>
Mon, 6 Nov 2006 07:58:09 +0000 (02:58 -0500)
committerJeff Garzik <jeff@garzik.org>
Mon, 6 Nov 2006 07:58:09 +0000 (02:58 -0500)
drivers/net/wireless/bcm43xx/bcm43xx_leds.c
drivers/net/wireless/bcm43xx/bcm43xx_leds.h
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/hostap/hostap_plx.c
net/ieee80211/ieee80211_rx.c

index 2ddbec6bf15b878449e1e15b0d06e3e18d36dbbc..7d383a27b9274d71027fb92c4f5d207f40833aa8 100644 (file)
@@ -189,20 +189,24 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity)
                case BCM43xx_LED_INACTIVE:
                        continue;
                case BCM43xx_LED_OFF:
+               case BCM43xx_LED_BCM4303_3:
                        break;
                case BCM43xx_LED_ON:
                        turn_on = 1;
                        break;
                case BCM43xx_LED_ACTIVITY:
+               case BCM43xx_LED_BCM4303_0:
                        turn_on = activity;
                        break;
                case BCM43xx_LED_RADIO_ALL:
                        turn_on = radio->enabled;
                        break;
                case BCM43xx_LED_RADIO_A:
+               case BCM43xx_LED_BCM4303_2:
                        turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A);
                        break;
                case BCM43xx_LED_RADIO_B:
+               case BCM43xx_LED_BCM4303_1:
                        turn_on = (radio->enabled &&
                                   (phy->type == BCM43xx_PHYTYPE_B ||
                                    phy->type == BCM43xx_PHYTYPE_G));
@@ -257,7 +261,8 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity)
                        continue;
 #endif /* CONFIG_BCM43XX_DEBUG */
                default:
-                       assert(0);
+                       dprintkl(KERN_INFO PFX "Bad value in leds_update,"
+                               " led->behaviour: 0x%x\n", led->behaviour);
                };
 
                if (led->activelow)
index d3716cf3aebce51dc9c90368d0e3bd74a047e9fa..811e14a81198f13f521af60872566e734ffef9d4 100644 (file)
@@ -46,6 +46,12 @@ enum { /* LED behaviour values */
        BCM43xx_LED_TEST_BLINKSLOW,
        BCM43xx_LED_TEST_BLINKMEDIUM,
        BCM43xx_LED_TEST_BLINKFAST,
+
+       /* Misc values for BCM4303 */
+       BCM43xx_LED_BCM4303_0 = 0x2B,
+       BCM43xx_LED_BCM4303_1 = 0x78,
+       BCM43xx_LED_BCM4303_2 = 0x2E,
+       BCM43xx_LED_BCM4303_3 = 0x19,
 };
 
 int bcm43xx_leds_init(struct bcm43xx_private *bcm);
index a94c6d8826f874e7c4606fa6884491da897a45cf..65edb56107fd0608fc1bee728a86b20c9212827a 100644 (file)
@@ -3163,9 +3163,11 @@ static int estimate_periodic_work_badness(unsigned int state)
 static void bcm43xx_periodic_work_handler(void *d)
 {
        struct bcm43xx_private *bcm = d;
+       struct net_device *net_dev = bcm->net_dev;
        unsigned long flags;
        u32 savedirqs = 0;
        int badness;
+       unsigned long orig_trans_start = 0;
 
        mutex_lock(&bcm->mutex);
        badness = estimate_periodic_work_badness(bcm->periodic_state);
@@ -3173,7 +3175,18 @@ static void bcm43xx_periodic_work_handler(void *d)
                /* Periodic work will take a long time, so we want it to
                 * be preemtible.
                 */
-               netif_tx_disable(bcm->net_dev);
+
+               netif_tx_lock_bh(net_dev);
+               /* We must fake a started transmission here, as we are going to
+                * disable TX. If we wouldn't fake a TX, it would be possible to
+                * trigger the netdev watchdog, if the last real TX is already
+                * some time on the past (slightly less than 5secs)
+                */
+               orig_trans_start = net_dev->trans_start;
+               net_dev->trans_start = jiffies;
+               netif_stop_queue(net_dev);
+               netif_tx_unlock_bh(net_dev);
+
                spin_lock_irqsave(&bcm->irq_lock, flags);
                bcm43xx_mac_suspend(bcm);
                if (bcm43xx_using_pio(bcm))
@@ -3198,6 +3211,7 @@ static void bcm43xx_periodic_work_handler(void *d)
                        bcm43xx_pio_thaw_txqueues(bcm);
                bcm43xx_mac_enable(bcm);
                netif_wake_queue(bcm->net_dev);
+               net_dev->trans_start = orig_trans_start;
        }
        mmiowb();
        spin_unlock_irqrestore(&bcm->irq_lock, flags);
index 6dfa041be66db9ee4725270e7184601f98aba4c5..bc81b13a5a2a95a5bce76816c5ca31f0e8373092 100644 (file)
@@ -364,7 +364,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len,
 
        pos = 0;
        while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) {
-               if (pos + cis[pos + 1] >= CIS_MAX_LEN)
+               if (pos + 2 + cis[pos + 1] > CIS_MAX_LEN)
                        goto cis_error;
 
                switch (cis[pos]) {
@@ -391,7 +391,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len,
                        break;
 
                case CISTPL_MANFID:
-                       if (cis[pos + 1] < 5)
+                       if (cis[pos + 1] < 4)
                                goto cis_error;
                        manfid1 = cis[pos + 2] + (cis[pos + 3] << 8);
                        manfid2 = cis[pos + 4] + (cis[pos + 5] << 8);
index 770704183a1bd0f21f27d9bc8683618bab67230f..2759312a42043812ee576b108f7505714cbb6018 100644 (file)
@@ -1078,12 +1078,12 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element
 
        while (length >= sizeof(*info_element)) {
                if (sizeof(*info_element) + info_element->len > length) {
-                       IEEE80211_ERROR("Info elem: parse failed: "
-                                       "info_element->len + 2 > left : "
-                                       "info_element->len+2=%zd left=%d, id=%d.\n",
-                                       info_element->len +
-                                       sizeof(*info_element),
-                                       length, info_element->id);
+                       IEEE80211_DEBUG_MGMT("Info elem: parse failed: "
+                                            "info_element->len + 2 > left : "
+                                            "info_element->len+2=%zd left=%d, id=%d.\n",
+                                            info_element->len +
+                                            sizeof(*info_element),
+                                            length, info_element->id);
                        /* We stop processing but don't return an error here
                         * because some misbehaviour APs break this rule. ie.
                         * Orinoco AP1000. */