]>
Commit | Line | Data |
---|---|---|
8cb6e8c1 MK |
1 | |
2 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_dma.c | |
3 | =================================================================== | |
4 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_dma.c | |
5 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_dma.c | |
6 | @@ -145,16 +145,14 @@ dma_addr_t map_descbuffer(struct bcm43xx | |
7 | int tx) | |
8 | { | |
9 | dma_addr_t dmaaddr; | |
10 | + int direction = PCI_DMA_FROMDEVICE; | |
11 | ||
12 | - if (tx) { | |
13 | - dmaaddr = dma_map_single(&ring->bcm->pci_dev->dev, | |
14 | - buf, len, | |
15 | - DMA_TO_DEVICE); | |
16 | - } else { | |
17 | - dmaaddr = dma_map_single(&ring->bcm->pci_dev->dev, | |
18 | + if (tx) | |
19 | + direction = PCI_DMA_TODEVICE; | |
20 | + | |
21 | + dmaaddr = pci_map_single(ring->bcm->pci_dev, | |
22 | buf, len, | |
23 | - DMA_FROM_DEVICE); | |
24 | - } | |
25 | + direction); | |
26 | ||
27 | return dmaaddr; | |
28 | } | |
29 | @@ -166,13 +164,13 @@ void unmap_descbuffer(struct bcm43xx_dma | |
30 | int tx) | |
31 | { | |
32 | if (tx) { | |
33 | - dma_unmap_single(&ring->bcm->pci_dev->dev, | |
34 | + pci_unmap_single(ring->bcm->pci_dev, | |
35 | addr, len, | |
36 | - DMA_TO_DEVICE); | |
37 | + PCI_DMA_TODEVICE); | |
38 | } else { | |
39 | - dma_unmap_single(&ring->bcm->pci_dev->dev, | |
40 | + pci_unmap_single(ring->bcm->pci_dev, | |
41 | addr, len, | |
42 | - DMA_FROM_DEVICE); | |
43 | + PCI_DMA_FROMDEVICE); | |
44 | } | |
45 | } | |
46 | ||
47 | @@ -183,8 +181,8 @@ void sync_descbuffer_for_cpu(struct bcm4 | |
48 | { | |
49 | assert(!ring->tx); | |
50 | ||
51 | - dma_sync_single_for_cpu(&ring->bcm->pci_dev->dev, | |
52 | - addr, len, DMA_FROM_DEVICE); | |
53 | + pci_dma_sync_single_for_cpu(ring->bcm->pci_dev, | |
54 | + addr, len, PCI_DMA_FROMDEVICE); | |
55 | } | |
56 | ||
57 | static inline | |
58 | @@ -194,8 +192,8 @@ void sync_descbuffer_for_device(struct b | |
59 | { | |
60 | assert(!ring->tx); | |
61 | ||
62 | - dma_sync_single_for_device(&ring->bcm->pci_dev->dev, | |
63 | - addr, len, DMA_FROM_DEVICE); | |
64 | + pci_dma_sync_single_for_cpu(ring->bcm->pci_dev, | |
65 | + addr, len, PCI_DMA_TODEVICE); | |
66 | } | |
67 | ||
68 | /* Unmap and free a descriptor buffer. */ | |
69 | @@ -214,17 +212,53 @@ void free_descriptor_buffer(struct bcm43 | |
70 | ||
71 | static int alloc_ringmemory(struct bcm43xx_dmaring *ring) | |
72 | { | |
73 | - struct device *dev = &(ring->bcm->pci_dev->dev); | |
74 | - | |
75 | - ring->descbase = dma_alloc_coherent(dev, BCM43xx_DMA_RINGMEMSIZE, | |
76 | - &(ring->dmabase), GFP_KERNEL); | |
77 | + ring->descbase = pci_alloc_consistent(ring->bcm->pci_dev, BCM43xx_DMA_RINGMEMSIZE, | |
78 | + &(ring->dmabase)); | |
79 | if (!ring->descbase) { | |
80 | - printk(KERN_ERR PFX "DMA ringmemory allocation failed\n"); | |
81 | - return -ENOMEM; | |
82 | + /* Allocation may have failed due to pci_alloc_consistent | |
83 | + insisting on use of GFP_DMA, which is more restrictive | |
84 | + than necessary... */ | |
85 | + struct dma_desc *rx_ring; | |
86 | + dma_addr_t rx_ring_dma; | |
87 | + | |
88 | + rx_ring = kzalloc(BCM43xx_DMA_RINGMEMSIZE, GFP_KERNEL); | |
89 | + if (!rx_ring) | |
90 | + goto out_err; | |
91 | + | |
92 | + rx_ring_dma = pci_map_single(ring->bcm->pci_dev, rx_ring, | |
93 | + BCM43xx_DMA_RINGMEMSIZE, | |
94 | + PCI_DMA_BIDIRECTIONAL); | |
95 | + | |
96 | + if (pci_dma_mapping_error(rx_ring_dma) || | |
97 | + rx_ring_dma + BCM43xx_DMA_RINGMEMSIZE > ring->bcm->dma_mask) { | |
98 | + /* Sigh... */ | |
99 | + if (!pci_dma_mapping_error(rx_ring_dma)) | |
100 | + pci_unmap_single(ring->bcm->pci_dev, | |
101 | + rx_ring_dma, BCM43xx_DMA_RINGMEMSIZE, | |
102 | + PCI_DMA_BIDIRECTIONAL); | |
103 | + rx_ring_dma = pci_map_single(ring->bcm->pci_dev, | |
104 | + rx_ring, BCM43xx_DMA_RINGMEMSIZE, | |
105 | + PCI_DMA_BIDIRECTIONAL); | |
106 | + if (pci_dma_mapping_error(rx_ring_dma) || | |
107 | + rx_ring_dma + BCM43xx_DMA_RINGMEMSIZE > ring->bcm->dma_mask) { | |
108 | + assert(0); | |
109 | + if (!pci_dma_mapping_error(rx_ring_dma)) | |
110 | + pci_unmap_single(ring->bcm->pci_dev, | |
111 | + rx_ring_dma, BCM43xx_DMA_RINGMEMSIZE, | |
112 | + PCI_DMA_BIDIRECTIONAL); | |
113 | + goto out_err; | |
114 | + } | |
115 | + } | |
116 | + | |
117 | + ring->descbase = rx_ring; | |
118 | + ring->dmabase = rx_ring_dma; | |
119 | } | |
120 | memset(ring->descbase, 0, BCM43xx_DMA_RINGMEMSIZE); | |
121 | ||
122 | return 0; | |
123 | +out_err: | |
124 | + printk(KERN_ERR PFX "DMA ringmemory allocation failed\n"); | |
125 | + return -ENOMEM; | |
126 | } | |
127 | ||
128 | static void free_ringmemory(struct bcm43xx_dmaring *ring) | |
129 | @@ -407,6 +441,29 @@ static int setup_rx_descbuffer(struct bc | |
130 | if (unlikely(!skb)) | |
131 | return -ENOMEM; | |
132 | dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0); | |
133 | + /* This hardware bug work-around adapted from the b44 driver. | |
134 | + The chip may be unable to do PCI DMA to/from anything above 1GB */ | |
135 | + if (pci_dma_mapping_error(dmaaddr) || | |
136 | + dmaaddr + ring->rx_buffersize > ring->bcm->dma_mask) { | |
137 | + /* This one has 30-bit addressing... */ | |
138 | + if (!pci_dma_mapping_error(dmaaddr)) | |
139 | + pci_unmap_single(ring->bcm->pci_dev, | |
140 | + dmaaddr, ring->rx_buffersize, | |
141 | + PCI_DMA_FROMDEVICE); | |
142 | + dev_kfree_skb_any(skb); | |
143 | + skb = __dev_alloc_skb(ring->rx_buffersize,GFP_DMA); | |
144 | + if (skb == NULL) | |
145 | + return -ENOMEM; | |
146 | + dmaaddr = pci_map_single(ring->bcm->pci_dev, | |
147 | + skb->data, ring->rx_buffersize, | |
148 | + PCI_DMA_FROMDEVICE); | |
149 | + if (pci_dma_mapping_error(dmaaddr) || | |
150 | + dmaaddr + ring->rx_buffersize > ring->bcm->dma_mask) { | |
151 | + assert(0); | |
152 | + dev_kfree_skb_any(skb); | |
153 | + return -ENOMEM; | |
154 | + } | |
155 | + } | |
156 | meta->skb = skb; | |
157 | meta->dmaaddr = dmaaddr; | |
158 | skb->dev = ring->bcm->net_dev; | |
159 | @@ -636,8 +693,10 @@ struct bcm43xx_dmaring * bcm43xx_setup_d | |
160 | err = dmacontroller_setup(ring); | |
161 | if (err) | |
162 | goto err_free_ringmemory; | |
163 | + return ring; | |
164 | ||
165 | out: | |
166 | + printk(KERN_ERR PFX "Error in bcm43xx_setup_dmaring\n"); | |
167 | return ring; | |
168 | ||
169 | err_free_ringmemory: | |
170 | @@ -705,30 +764,16 @@ int bcm43xx_dma_init(struct bcm43xx_priv | |
171 | struct bcm43xx_dmaring *ring; | |
172 | int err = -ENOMEM; | |
173 | int dma64 = 0; | |
174 | - u64 mask = bcm43xx_get_supported_dma_mask(bcm); | |
175 | - int nobits; | |
176 | ||
177 | - if (mask == DMA_64BIT_MASK) { | |
178 | + bcm->dma_mask = bcm43xx_get_supported_dma_mask(bcm); | |
179 | + if (bcm->dma_mask == DMA_64BIT_MASK) | |
180 | dma64 = 1; | |
181 | - nobits = 64; | |
182 | - } else if (mask == DMA_32BIT_MASK) | |
183 | - nobits = 32; | |
184 | - else | |
185 | - nobits = 30; | |
186 | - err = pci_set_dma_mask(bcm->pci_dev, mask); | |
187 | - err |= pci_set_consistent_dma_mask(bcm->pci_dev, mask); | |
188 | - if (err) { | |
189 | -#ifdef CONFIG_BCM43XX_PIO | |
190 | - printk(KERN_WARNING PFX "DMA not supported on this device." | |
191 | - " Falling back to PIO.\n"); | |
192 | - bcm->__using_pio = 1; | |
193 | - return -ENOSYS; | |
194 | -#else | |
195 | - printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. " | |
196 | - "Please recompile the driver with PIO support.\n"); | |
197 | - return -ENODEV; | |
198 | -#endif /* CONFIG_BCM43XX_PIO */ | |
199 | - } | |
200 | + err = pci_set_dma_mask(bcm->pci_dev, bcm->dma_mask); | |
201 | + if (err) | |
202 | + goto no_dma; | |
203 | + err = pci_set_consistent_dma_mask(bcm->pci_dev, bcm->dma_mask); | |
204 | + if (err) | |
205 | + goto no_dma; | |
206 | ||
207 | /* setup TX DMA channels. */ | |
208 | ring = bcm43xx_setup_dmaring(bcm, 0, 1, dma64); | |
209 | @@ -774,9 +819,12 @@ int bcm43xx_dma_init(struct bcm43xx_priv | |
210 | dma->rx_ring3 = ring; | |
211 | } | |
212 | ||
213 | - dprintk(KERN_INFO PFX "%d-bit DMA initialized\n", nobits); | |
214 | + dprintk(KERN_INFO PFX "%d-bit DMA initialized\n", | |
215 | + (bcm->dma_mask == DMA_64BIT_MASK) ? 64 : | |
216 | + (bcm->dma_mask == DMA_32BIT_MASK) ? 32 : 30); | |
217 | err = 0; | |
218 | out: | |
219 | + if(err)BUG(); | |
220 | return err; | |
221 | ||
222 | err_destroy_rx0: | |
223 | @@ -800,7 +848,18 @@ err_destroy_tx1: | |
224 | err_destroy_tx0: | |
225 | bcm43xx_destroy_dmaring(dma->tx_ring0); | |
226 | dma->tx_ring0 = NULL; | |
227 | - goto out; | |
228 | +no_dma: | |
229 | +#ifdef CONFIG_BCM43XX_PIO | |
230 | + printk(KERN_WARNING PFX "DMA not supported on this device." | |
231 | + " Falling back to PIO.\n"); | |
232 | + bcm->__using_pio = 1; | |
233 | + BUG(); | |
234 | + return -ENOSYS; | |
235 | +#else | |
236 | + printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. " | |
237 | + "Please recompile the driver with PIO support.\n"); | |
238 | + return -ENODEV; | |
239 | +#endif /* CONFIG_BCM43XX_PIO */ | |
240 | } | |
241 | ||
242 | /* Generate a cookie for the TX header. */ | |
243 | @@ -905,6 +964,7 @@ static void dma_tx_fragment(struct bcm43 | |
244 | struct bcm43xx_dmadesc_generic *desc; | |
245 | struct bcm43xx_dmadesc_meta *meta; | |
246 | dma_addr_t dmaaddr; | |
247 | + struct sk_buff *bounce_skb; | |
248 | ||
249 | assert(skb_shinfo(skb)->nr_frags == 0); | |
250 | ||
251 | @@ -924,9 +984,28 @@ static void dma_tx_fragment(struct bcm43 | |
252 | skb->len - sizeof(struct bcm43xx_txhdr), | |
253 | (cur_frag == 0), | |
254 | generate_cookie(ring, slot)); | |
255 | + dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | |
256 | + if (dma_mapping_error(dmaaddr) || dmaaddr + skb->len > ring->bcm->dma_mask) { | |
257 | + /* chip cannot handle DMA to/from > 1GB, use bounce buffer (copied from b44 driver) */ | |
258 | + if (!dma_mapping_error(dmaaddr)) | |
259 | + unmap_descbuffer(ring, dmaaddr, skb->len, 1); | |
260 | + bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC|GFP_DMA); | |
261 | + if (!bounce_skb) | |
262 | + return; | |
263 | + dmaaddr = map_descbuffer(ring, bounce_skb->data, bounce_skb->len, 1); | |
264 | + if (dma_mapping_error(dmaaddr) || dmaaddr + skb->len > ring->bcm->dma_mask) { | |
265 | + if (!dma_mapping_error(dmaaddr)) | |
266 | + unmap_descbuffer(ring, dmaaddr, skb->len, 1); | |
267 | + dev_kfree_skb_any(bounce_skb); | |
268 | + assert(0); | |
269 | + return; | |
270 | + } | |
271 | + memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); | |
272 | + dev_kfree_skb_any(skb); | |
273 | + skb = bounce_skb; | |
274 | + } | |
275 | ||
276 | meta->skb = skb; | |
277 | - dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | |
278 | meta->dmaaddr = dmaaddr; | |
279 | ||
280 | fill_descriptor(ring, desc, dmaaddr, | |
281 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h | |
282 | =================================================================== | |
283 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx.h | |
284 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h | |
285 | @@ -21,7 +21,7 @@ | |
286 | #define PFX KBUILD_MODNAME ": " | |
287 | ||
288 | #define BCM43xx_SWITCH_CORE_MAX_RETRIES 50 | |
289 | -#define BCM43xx_IRQWAIT_MAX_RETRIES 50 | |
290 | +#define BCM43xx_IRQWAIT_MAX_RETRIES 100 | |
291 | ||
292 | #define BCM43xx_IO_SIZE 8192 | |
293 | ||
294 | @@ -352,6 +352,10 @@ | |
295 | #define BCM43xx_UCODEFLAG_UNKPACTRL 0x0040 | |
296 | #define BCM43xx_UCODEFLAG_JAPAN 0x0080 | |
297 | ||
298 | +/* Hardware Radio Enable masks */ | |
299 | +#define BCM43xx_MMIO_RADIO_HWENABLED_HI_MASK (1 << 16) | |
300 | +#define BCM43xx_MMIO_RADIO_HWENABLED_LO_MASK (1 << 4) | |
301 | + | |
302 | /* Generic-Interrupt reasons. */ | |
303 | #define BCM43xx_IRQ_READY (1 << 0) | |
304 | #define BCM43xx_IRQ_BEACON (1 << 1) | |
305 | @@ -758,7 +762,8 @@ struct bcm43xx_private { | |
306 | bad_frames_preempt:1, /* Use "Bad Frames Preemption" (default off) */ | |
307 | reg124_set_0x4:1, /* Some variable to keep track of IRQ stuff. */ | |
308 | short_preamble:1, /* TRUE, if short preamble is enabled. */ | |
309 | - firmware_norelease:1; /* Do not release the firmware. Used on suspend. */ | |
310 | + firmware_norelease:1, /* Do not release the firmware. Used on suspend. */ | |
311 | + radio_hw_enable:1; /* TRUE if radio is hardware enabled */ | |
312 | ||
313 | struct bcm43xx_stats stats; | |
314 | ||
315 | @@ -766,6 +771,7 @@ struct bcm43xx_private { | |
316 | * This is currently always BCM43xx_BUSTYPE_PCI | |
317 | */ | |
318 | u8 bustype; | |
319 | + u64 dma_mask; | |
320 | ||
321 | u16 board_vendor; | |
322 | u16 board_type; | |
323 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |
324 | =================================================================== | |
325 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |
326 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |
327 | @@ -2441,6 +2441,9 @@ static int bcm43xx_chip_init(struct bcm4 | |
328 | if (err) | |
329 | goto err_gpio_cleanup; | |
330 | bcm43xx_radio_turn_on(bcm); | |
331 | + bcm->radio_hw_enable = bcm43xx_is_hw_radio_enabled(bcm); | |
332 | + dprintk(KERN_INFO PFX "Radio %s by hardware\n", | |
333 | + (bcm->radio_hw_enable == 0) ? "disabled" : "enabled"); | |
334 | ||
335 | bcm43xx_write16(bcm, 0x03E6, 0x0000); | |
336 | err = bcm43xx_phy_init(bcm); | |
337 | @@ -3175,9 +3178,24 @@ static void bcm43xx_periodic_every30sec( | |
338 | ||
339 | static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm) | |
340 | { | |
341 | + bcm43xx_phy_xmitpower(bcm); //FIXME: unless scanning? | |
342 | + //TODO for APHY (temperature?) | |
343 | +} | |
344 | + | |
345 | +static void bcm43xx_periodic_every1sec(struct bcm43xx_private *bcm) | |
346 | +{ | |
347 | struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); | |
348 | struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); | |
349 | + int radio_hw_enable; | |
350 | ||
351 | + /* check if radio hardware enabled status changed */ | |
352 | + radio_hw_enable = bcm43xx_is_hw_radio_enabled(bcm); | |
353 | + if (unlikely(bcm->radio_hw_enable != radio_hw_enable)) { | |
354 | + bcm->radio_hw_enable = radio_hw_enable; | |
355 | + dprintk(KERN_INFO PFX "Radio hardware status changed to %s\n", | |
356 | + (radio_hw_enable == 0) ? "disabled" : "enabled"); | |
357 | + bcm43xx_leds_update(bcm, 0); | |
358 | + } | |
359 | if (phy->type == BCM43xx_PHYTYPE_G) { | |
360 | //TODO: update_aci_moving_average | |
361 | if (radio->aci_enable && radio->aci_wlan_automatic) { | |
362 | @@ -3201,21 +3219,21 @@ static void bcm43xx_periodic_every15sec( | |
363 | //TODO: implement rev1 workaround | |
364 | } | |
365 | } | |
366 | - bcm43xx_phy_xmitpower(bcm); //FIXME: unless scanning? | |
367 | - //TODO for APHY (temperature?) | |
368 | } | |
369 | ||
370 | static void do_periodic_work(struct bcm43xx_private *bcm) | |
371 | { | |
372 | - if (bcm->periodic_state % 8 == 0) | |
373 | + if (bcm->periodic_state % 120 == 0) | |
374 | bcm43xx_periodic_every120sec(bcm); | |
375 | - if (bcm->periodic_state % 4 == 0) | |
376 | + if (bcm->periodic_state % 60 == 0) | |
377 | bcm43xx_periodic_every60sec(bcm); | |
378 | - if (bcm->periodic_state % 2 == 0) | |
379 | + if (bcm->periodic_state % 30 == 0) | |
380 | bcm43xx_periodic_every30sec(bcm); | |
381 | - bcm43xx_periodic_every15sec(bcm); | |
382 | + if (bcm->periodic_state % 15 == 0) | |
383 | + bcm43xx_periodic_every15sec(bcm); | |
384 | + bcm43xx_periodic_every1sec(bcm); | |
385 | ||
386 | - schedule_delayed_work(&bcm->periodic_work, HZ * 15); | |
387 | + schedule_delayed_work(&bcm->periodic_work, HZ); | |
388 | } | |
389 | ||
390 | static void bcm43xx_periodic_work_handler(struct work_struct *work) | |
391 | @@ -3228,7 +3246,7 @@ static void bcm43xx_periodic_work_handle | |
392 | unsigned long orig_trans_start = 0; | |
393 | ||
394 | mutex_lock(&bcm->mutex); | |
395 | - if (unlikely(bcm->periodic_state % 4 == 0)) { | |
396 | + if (unlikely(bcm->periodic_state % 60 == 0)) { | |
397 | /* Periodic work will take a long time, so we want it to | |
398 | * be preemtible. | |
399 | */ | |
400 | @@ -3260,7 +3278,7 @@ static void bcm43xx_periodic_work_handle | |
401 | ||
402 | do_periodic_work(bcm); | |
403 | ||
404 | - if (unlikely(bcm->periodic_state % 4 == 0)) { | |
405 | + if (unlikely(bcm->periodic_state % 60 == 0)) { | |
406 | spin_lock_irqsave(&bcm->irq_lock, flags); | |
407 | tasklet_enable(&bcm->isr_tasklet); | |
408 | bcm43xx_interrupt_enable(bcm, savedirqs); | |
409 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.h | |
410 | =================================================================== | |
411 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_radio.h | |
412 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.h | |
413 | @@ -65,6 +65,22 @@ void bcm43xx_radio_init2060(struct bcm43 | |
414 | void bcm43xx_radio_turn_on(struct bcm43xx_private *bcm); | |
415 | void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm); | |
416 | ||
417 | +static inline | |
418 | +int bcm43xx_is_hw_radio_enabled(struct bcm43xx_private *bcm) | |
419 | +{ | |
420 | + /* function to return state of hardware enable of radio | |
421 | + * returns 0 if radio disabled, 1 if radio enabled | |
422 | + */ | |
423 | + if (likely(bcm->current_core->rev >= 3)) | |
424 | + return ((bcm43xx_read32(bcm, BCM43xx_MMIO_RADIO_HWENABLED_HI) | |
425 | + & BCM43xx_MMIO_RADIO_HWENABLED_HI_MASK) | |
426 | + == 0) ? 1 : 0; | |
427 | + else | |
428 | + return ((bcm43xx_read16(bcm, BCM43xx_MMIO_RADIO_HWENABLED_LO) | |
429 | + & BCM43xx_MMIO_RADIO_HWENABLED_LO_MASK) | |
430 | + == 0) ? 0 : 1; | |
431 | +} | |
432 | + | |
433 | int bcm43xx_radio_selectchannel(struct bcm43xx_private *bcm, u8 channel, | |
434 | int synthetic_pu_workaround); | |
435 | ||
436 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |
437 | =================================================================== | |
438 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |
439 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_leds.c | |
440 | @@ -26,6 +26,7 @@ | |
441 | */ | |
442 | ||
443 | #include "bcm43xx_leds.h" | |
444 | +#include "bcm43xx_radio.h" | |
445 | #include "bcm43xx.h" | |
446 | ||
447 | #include <asm/bitops.h> | |
448 | @@ -108,6 +109,7 @@ static void bcm43xx_led_init_hardcoded(s | |
449 | switch (led_index) { | |
450 | case 0: | |
451 | led->behaviour = BCM43xx_LED_ACTIVITY; | |
452 | + led->activelow = 1; | |
453 | if (bcm->board_vendor == PCI_VENDOR_ID_COMPAQ) | |
454 | led->behaviour = BCM43xx_LED_RADIO_ALL; | |
455 | break; | |
456 | @@ -199,20 +201,21 @@ void bcm43xx_leds_update(struct bcm43xx_ | |
457 | turn_on = activity; | |
458 | break; | |
459 | case BCM43xx_LED_RADIO_ALL: | |
460 | - turn_on = radio->enabled; | |
461 | + turn_on = radio->enabled && bcm43xx_is_hw_radio_enabled(bcm); | |
462 | break; | |
463 | case BCM43xx_LED_RADIO_A: | |
464 | case BCM43xx_LED_BCM4303_2: | |
465 | - turn_on = (radio->enabled && phy->type == BCM43xx_PHYTYPE_A); | |
466 | + turn_on = (radio->enabled && bcm43xx_is_hw_radio_enabled(bcm) && | |
467 | + phy->type == BCM43xx_PHYTYPE_A); | |
468 | break; | |
469 | case BCM43xx_LED_RADIO_B: | |
470 | case BCM43xx_LED_BCM4303_1: | |
471 | - turn_on = (radio->enabled && | |
472 | + turn_on = (radio->enabled && bcm43xx_is_hw_radio_enabled(bcm) && | |
473 | (phy->type == BCM43xx_PHYTYPE_B || | |
474 | phy->type == BCM43xx_PHYTYPE_G)); | |
475 | break; | |
476 | case BCM43xx_LED_MODE_BG: | |
477 | - if (phy->type == BCM43xx_PHYTYPE_G && | |
478 | + if (phy->type == BCM43xx_PHYTYPE_G && bcm43xx_is_hw_radio_enabled(bcm) && | |
479 | 1/*FIXME: using G rates.*/) | |
480 | turn_on = 1; | |
481 | break; | |
482 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c | |
483 | =================================================================== | |
484 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_radio.c | |
485 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c | |
486 | @@ -1981,6 +1981,7 @@ void bcm43xx_radio_turn_on(struct bcm43x | |
487 | } | |
488 | radio->enabled = 1; | |
489 | dprintk(KERN_INFO PFX "Radio turned on\n"); | |
490 | + bcm43xx_leds_update(bcm, 0); | |
491 | } | |
492 | ||
493 | void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm) | |
494 | @@ -2001,6 +2002,7 @@ void bcm43xx_radio_turn_off(struct bcm43 | |
495 | bcm43xx_phy_write(bcm, 0x0015, 0xAA00); | |
496 | radio->enabled = 0; | |
497 | dprintk(KERN_INFO PFX "Radio turned off\n"); | |
498 | + bcm43xx_leds_update(bcm, 0); | |
499 | } | |
500 | ||
501 | void bcm43xx_radio_clear_tssi(struct bcm43xx_private *bcm) | |
502 | Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |
503 | =================================================================== | |
504 | --- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |
505 | +++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |
506 | @@ -261,22 +261,22 @@ static int bcm43xx_wx_get_rangeparams(st | |
507 | if (phy->type == BCM43xx_PHYTYPE_A || | |
508 | phy->type == BCM43xx_PHYTYPE_G) { | |
509 | range->num_bitrates = 8; | |
510 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB; | |
511 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB; | |
512 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_12MB; | |
513 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_18MB; | |
514 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_24MB; | |
515 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_36MB; | |
516 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB; | |
517 | - range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB; | |
518 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB * 500000; | |
519 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB * 500000; | |
520 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_12MB * 500000; | |
521 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_18MB * 500000; | |
522 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_24MB * 500000; | |
523 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_36MB * 500000; | |
524 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB * 500000; | |
525 | + range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB * 500000; | |
526 | } | |
527 | if (phy->type == BCM43xx_PHYTYPE_B || | |
528 | phy->type == BCM43xx_PHYTYPE_G) { | |
529 | range->num_bitrates += 4; | |
530 | - range->bitrate[i++] = IEEE80211_CCK_RATE_1MB; | |
531 | - range->bitrate[i++] = IEEE80211_CCK_RATE_2MB; | |
532 | - range->bitrate[i++] = IEEE80211_CCK_RATE_5MB; | |
533 | - range->bitrate[i++] = IEEE80211_CCK_RATE_11MB; | |
534 | + range->bitrate[i++] = IEEE80211_CCK_RATE_1MB * 500000; | |
535 | + range->bitrate[i++] = IEEE80211_CCK_RATE_2MB * 500000; | |
536 | + range->bitrate[i++] = IEEE80211_CCK_RATE_5MB * 500000; | |
537 | + range->bitrate[i++] = IEEE80211_CCK_RATE_11MB * 500000; | |
538 | } | |
539 | ||
540 | geo = ieee80211_get_geo(bcm->ieee); | |
541 | @@ -286,7 +286,7 @@ static int bcm43xx_wx_get_rangeparams(st | |
542 | if (j == IW_MAX_FREQUENCIES) | |
543 | break; | |
544 | range->freq[j].i = j + 1; | |
545 | - range->freq[j].m = geo->a[i].freq;//FIXME? | |
546 | + range->freq[j].m = geo->a[i].freq * 100000; | |
547 | range->freq[j].e = 1; | |
548 | j++; | |
549 | } | |
550 | @@ -294,7 +294,7 @@ static int bcm43xx_wx_get_rangeparams(st | |
551 | if (j == IW_MAX_FREQUENCIES) | |
552 | break; | |
553 | range->freq[j].i = j + 1; | |
554 | - range->freq[j].m = geo->bg[i].freq;//FIXME? | |
555 | + range->freq[j].m = geo->bg[i].freq * 100000; | |
556 | range->freq[j].e = 1; | |
557 | j++; | |
558 | } |