diff options
Diffstat (limited to 'drivers/net/wireless')
| -rw-r--r-- | drivers/net/wireless/bcm43xx/bcm43xx_leds.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/bcm43xx/bcm43xx_leds.h | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/bcm43xx/bcm43xx_main.c | 16 | ||||
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_plx.c | 4 |
4 files changed, 29 insertions, 4 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c index 2ddbec6bf15b..7d383a27b927 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |||
| @@ -189,20 +189,24 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
| 189 | case BCM43xx_LED_INACTIVE: | 189 | case BCM43xx_LED_INACTIVE: |
| 190 | continue; | 190 | continue; |
| 191 | case BCM43xx_LED_OFF: | 191 | case BCM43xx_LED_OFF: |
| 192 | case BCM43xx_LED_BCM4303_3: | ||
| 192 | break; | 193 | break; |
| 193 | case BCM43xx_LED_ON: | 194 | case BCM43xx_LED_ON: |
| 194 | turn_on = 1; | 195 | turn_on = 1; |
| 195 | break; | 196 | break; |
| 196 | case BCM43xx_LED_ACTIVITY: | 197 | case BCM43xx_LED_ACTIVITY: |
| 198 | case BCM43xx_LED_BCM4303_0: | ||
| 197 | turn_on = activity; | 199 | turn_on = activity; |
| 198 | break; | 200 | break; |
| 199 | case BCM43xx_LED_RADIO_ALL: | 201 | case BCM43xx_LED_RADIO_ALL: |
| 200 | turn_on = radio->enabled; | 202 | turn_on = radio->enabled; |
| 201 | break; | 203 | break; |
| 202 | case BCM43xx_LED_RADIO_A: | 204 | case BCM43xx_LED_RADIO_A: |
| 205 | case BCM43xx_LED_BCM4303_2: | ||
| 203 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); | 206 | turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); |
| 204 | break; | 207 | break; |
| 205 | case BCM43xx_LED_RADIO_B: | 208 | case BCM43xx_LED_RADIO_B: |
| 209 | case BCM43xx_LED_BCM4303_1: | ||
| 206 | turn_on = (radio->enabled && | 210 | turn_on = (radio->enabled && |
| 207 | (phy->type == BCM43xx_PHYTYPE_B || | 211 | (phy->type == BCM43xx_PHYTYPE_B || |
| 208 | phy->type == BCM43xx_PHYTYPE_G)); | 212 | phy->type == BCM43xx_PHYTYPE_G)); |
| @@ -257,7 +261,8 @@ void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity) | |||
| 257 | continue; | 261 | continue; |
| 258 | #endif /* CONFIG_BCM43XX_DEBUG */ | 262 | #endif /* CONFIG_BCM43XX_DEBUG */ |
| 259 | default: | 263 | default: |
| 260 | assert(0); | 264 | dprintkl(KERN_INFO PFX "Bad value in leds_update," |
| 265 | " led->behaviour: 0x%x\n", led->behaviour); | ||
| 261 | }; | 266 | }; |
| 262 | 267 | ||
| 263 | if (led->activelow) | 268 | if (led->activelow) |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h index d3716cf3aebc..811e14a81198 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_leds.h +++ b/drivers/net/wireless/bcm43xx/bcm43xx_leds.h | |||
| @@ -46,6 +46,12 @@ enum { /* LED behaviour values */ | |||
| 46 | BCM43xx_LED_TEST_BLINKSLOW, | 46 | BCM43xx_LED_TEST_BLINKSLOW, |
| 47 | BCM43xx_LED_TEST_BLINKMEDIUM, | 47 | BCM43xx_LED_TEST_BLINKMEDIUM, |
| 48 | BCM43xx_LED_TEST_BLINKFAST, | 48 | BCM43xx_LED_TEST_BLINKFAST, |
| 49 | |||
| 50 | /* Misc values for BCM4303 */ | ||
| 51 | BCM43xx_LED_BCM4303_0 = 0x2B, | ||
| 52 | BCM43xx_LED_BCM4303_1 = 0x78, | ||
| 53 | BCM43xx_LED_BCM4303_2 = 0x2E, | ||
| 54 | BCM43xx_LED_BCM4303_3 = 0x19, | ||
| 49 | }; | 55 | }; |
| 50 | 56 | ||
| 51 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); | 57 | int bcm43xx_leds_init(struct bcm43xx_private *bcm); |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index a94c6d8826f8..65edb56107fd 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |||
| @@ -3163,9 +3163,11 @@ static int estimate_periodic_work_badness(unsigned int state) | |||
| 3163 | static void bcm43xx_periodic_work_handler(void *d) | 3163 | static void bcm43xx_periodic_work_handler(void *d) |
| 3164 | { | 3164 | { |
| 3165 | struct bcm43xx_private *bcm = d; | 3165 | struct bcm43xx_private *bcm = d; |
| 3166 | struct net_device *net_dev = bcm->net_dev; | ||
| 3166 | unsigned long flags; | 3167 | unsigned long flags; |
| 3167 | u32 savedirqs = 0; | 3168 | u32 savedirqs = 0; |
| 3168 | int badness; | 3169 | int badness; |
| 3170 | unsigned long orig_trans_start = 0; | ||
| 3169 | 3171 | ||
| 3170 | mutex_lock(&bcm->mutex); | 3172 | mutex_lock(&bcm->mutex); |
| 3171 | badness = estimate_periodic_work_badness(bcm->periodic_state); | 3173 | badness = estimate_periodic_work_badness(bcm->periodic_state); |
| @@ -3173,7 +3175,18 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
| 3173 | /* Periodic work will take a long time, so we want it to | 3175 | /* Periodic work will take a long time, so we want it to |
| 3174 | * be preemtible. | 3176 | * be preemtible. |
| 3175 | */ | 3177 | */ |
| 3176 | netif_tx_disable(bcm->net_dev); | 3178 | |
| 3179 | netif_tx_lock_bh(net_dev); | ||
| 3180 | /* We must fake a started transmission here, as we are going to | ||
| 3181 | * disable TX. If we wouldn't fake a TX, it would be possible to | ||
| 3182 | * trigger the netdev watchdog, if the last real TX is already | ||
| 3183 | * some time on the past (slightly less than 5secs) | ||
| 3184 | */ | ||
| 3185 | orig_trans_start = net_dev->trans_start; | ||
| 3186 | net_dev->trans_start = jiffies; | ||
| 3187 | netif_stop_queue(net_dev); | ||
| 3188 | netif_tx_unlock_bh(net_dev); | ||
| 3189 | |||
| 3177 | spin_lock_irqsave(&bcm->irq_lock, flags); | 3190 | spin_lock_irqsave(&bcm->irq_lock, flags); |
| 3178 | bcm43xx_mac_suspend(bcm); | 3191 | bcm43xx_mac_suspend(bcm); |
| 3179 | if (bcm43xx_using_pio(bcm)) | 3192 | if (bcm43xx_using_pio(bcm)) |
| @@ -3198,6 +3211,7 @@ static void bcm43xx_periodic_work_handler(void *d) | |||
| 3198 | bcm43xx_pio_thaw_txqueues(bcm); | 3211 | bcm43xx_pio_thaw_txqueues(bcm); |
| 3199 | bcm43xx_mac_enable(bcm); | 3212 | bcm43xx_mac_enable(bcm); |
| 3200 | netif_wake_queue(bcm->net_dev); | 3213 | netif_wake_queue(bcm->net_dev); |
| 3214 | net_dev->trans_start = orig_trans_start; | ||
| 3201 | } | 3215 | } |
| 3202 | mmiowb(); | 3216 | mmiowb(); |
| 3203 | spin_unlock_irqrestore(&bcm->irq_lock, flags); | 3217 | spin_unlock_irqrestore(&bcm->irq_lock, flags); |
diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index 6dfa041be66d..bc81b13a5a2a 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c | |||
| @@ -364,7 +364,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
| 364 | 364 | ||
| 365 | pos = 0; | 365 | pos = 0; |
| 366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { | 366 | while (pos < CIS_MAX_LEN - 1 && cis[pos] != CISTPL_END) { |
| 367 | if (pos + cis[pos + 1] >= CIS_MAX_LEN) | 367 | if (pos + 2 + cis[pos + 1] > CIS_MAX_LEN) |
| 368 | goto cis_error; | 368 | goto cis_error; |
| 369 | 369 | ||
| 370 | switch (cis[pos]) { | 370 | switch (cis[pos]) { |
| @@ -391,7 +391,7 @@ static int prism2_plx_check_cis(void __iomem *attr_mem, int attr_len, | |||
| 391 | break; | 391 | break; |
| 392 | 392 | ||
| 393 | case CISTPL_MANFID: | 393 | case CISTPL_MANFID: |
| 394 | if (cis[pos + 1] < 5) | 394 | if (cis[pos + 1] < 4) |
| 395 | goto cis_error; | 395 | goto cis_error; |
| 396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); | 396 | manfid1 = cis[pos + 2] + (cis[pos + 3] << 8); |
| 397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); | 397 | manfid2 = cis[pos + 4] + (cis[pos + 5] << 8); |
