Author: matkor                       Date: Mon Feb  5 17:18:52 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- bcm43xx fixes which did not make for 2.6.20 added. Work for me. Scheduled to 
2.6.20.1/2.6.21.

---- Files affected:
SOURCES:
   kernel-bcm43xx-2.6.20_combined.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/kernel-bcm43xx-2.6.20_combined.patch
diff -u /dev/null SOURCES/kernel-bcm43xx-2.6.20_combined.patch:1.1
--- /dev/null   Mon Feb  5 18:18:52 2007
+++ SOURCES/kernel-bcm43xx-2.6.20_combined.patch        Mon Feb  5 18:18:47 2007
@@ -0,0 +1,558 @@
+
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_dma.c
+@@ -145,16 +145,14 @@ dma_addr_t map_descbuffer(struct bcm43xx
+                         int tx)
+ {
+       dma_addr_t dmaaddr;
++      int direction = PCI_DMA_FROMDEVICE;
+ 
+-      if (tx) {
+-              dmaaddr = dma_map_single(&ring->bcm->pci_dev->dev,
+-                                       buf, len,
+-                                       DMA_TO_DEVICE);
+-      } else {
+-              dmaaddr = dma_map_single(&ring->bcm->pci_dev->dev,
++      if (tx)
++              direction = PCI_DMA_TODEVICE;
++
++      dmaaddr = pci_map_single(ring->bcm->pci_dev,
+                                        buf, len,
+-                                       DMA_FROM_DEVICE);
+-      }
++                                       direction);
+ 
+       return dmaaddr;
+ }
+@@ -166,13 +164,13 @@ void unmap_descbuffer(struct bcm43xx_dma
+                     int tx)
+ {
+       if (tx) {
+-              dma_unmap_single(&ring->bcm->pci_dev->dev,
++              pci_unmap_single(ring->bcm->pci_dev,
+                                addr, len,
+-                               DMA_TO_DEVICE);
++                               PCI_DMA_TODEVICE);
+       } else {
+-              dma_unmap_single(&ring->bcm->pci_dev->dev,
++              pci_unmap_single(ring->bcm->pci_dev,
+                                addr, len,
+-                               DMA_FROM_DEVICE);
++                               PCI_DMA_FROMDEVICE);
+       }
+ }
+ 
+@@ -183,8 +181,8 @@ void sync_descbuffer_for_cpu(struct bcm4
+ {
+       assert(!ring->tx);
+ 
+-      dma_sync_single_for_cpu(&ring->bcm->pci_dev->dev,
+-                              addr, len, DMA_FROM_DEVICE);
++      pci_dma_sync_single_for_cpu(ring->bcm->pci_dev,
++                                  addr, len, PCI_DMA_FROMDEVICE);
+ }
+ 
+ static inline
+@@ -194,8 +192,8 @@ void sync_descbuffer_for_device(struct b
+ {
+       assert(!ring->tx);
+ 
+-      dma_sync_single_for_device(&ring->bcm->pci_dev->dev,
+-                                 addr, len, DMA_FROM_DEVICE);
++      pci_dma_sync_single_for_cpu(ring->bcm->pci_dev,
++                                  addr, len, PCI_DMA_TODEVICE);
+ }
+ 
+ /* Unmap and free a descriptor buffer. */
+@@ -214,17 +212,53 @@ void free_descriptor_buffer(struct bcm43
+ 
+ static int alloc_ringmemory(struct bcm43xx_dmaring *ring)
+ {
+-      struct device *dev = &(ring->bcm->pci_dev->dev);
+-
+-      ring->descbase = dma_alloc_coherent(dev, BCM43xx_DMA_RINGMEMSIZE,
+-                                          &(ring->dmabase), GFP_KERNEL);
++      ring->descbase = pci_alloc_consistent(ring->bcm->pci_dev, 
BCM43xx_DMA_RINGMEMSIZE,
++                                          &(ring->dmabase));
+       if (!ring->descbase) {
+-              printk(KERN_ERR PFX "DMA ringmemory allocation failed\n");
+-              return -ENOMEM;
++              /* Allocation may have failed due to pci_alloc_consistent
++                 insisting on use of GFP_DMA, which is more restrictive
++                 than necessary...  */
++              struct dma_desc *rx_ring;
++              dma_addr_t rx_ring_dma;
++
++              rx_ring = kzalloc(BCM43xx_DMA_RINGMEMSIZE, GFP_KERNEL);
++              if (!rx_ring)
++                      goto out_err;
++
++              rx_ring_dma = pci_map_single(ring->bcm->pci_dev, rx_ring,
++                                           BCM43xx_DMA_RINGMEMSIZE,
++                                           PCI_DMA_BIDIRECTIONAL);
++
++              if (pci_dma_mapping_error(rx_ring_dma) ||
++                  rx_ring_dma + BCM43xx_DMA_RINGMEMSIZE > 
ring->bcm->dma_mask) {
++                      /* Sigh... */
++                      if (!pci_dma_mapping_error(rx_ring_dma))
++                              pci_unmap_single(ring->bcm->pci_dev,
++                                               rx_ring_dma, 
BCM43xx_DMA_RINGMEMSIZE,
++                                               PCI_DMA_BIDIRECTIONAL);
++                      rx_ring_dma = pci_map_single(ring->bcm->pci_dev,
++                                               rx_ring, 
BCM43xx_DMA_RINGMEMSIZE,
++                                               PCI_DMA_BIDIRECTIONAL);
++                      if (pci_dma_mapping_error(rx_ring_dma) ||
++                          rx_ring_dma + BCM43xx_DMA_RINGMEMSIZE > 
ring->bcm->dma_mask) {
++                              assert(0);
++                              if (!pci_dma_mapping_error(rx_ring_dma))
++                                      pci_unmap_single(ring->bcm->pci_dev,
++                                                       rx_ring_dma, 
BCM43xx_DMA_RINGMEMSIZE,
++                                                       PCI_DMA_BIDIRECTIONAL);
++                              goto out_err;
++                      }
++                }
++
++                ring->descbase = rx_ring;
++                ring->dmabase = rx_ring_dma;
+       }
+       memset(ring->descbase, 0, BCM43xx_DMA_RINGMEMSIZE);
+ 
+       return 0;
++out_err:
++      printk(KERN_ERR PFX "DMA ringmemory allocation failed\n");
++      return -ENOMEM;
+ }
+ 
+ static void free_ringmemory(struct bcm43xx_dmaring *ring)
+@@ -407,6 +441,29 @@ static int setup_rx_descbuffer(struct bc
+       if (unlikely(!skb))
+               return -ENOMEM;
+       dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
++      /* This hardware bug work-around adapted from the b44 driver.
++         The chip may be unable to do PCI DMA to/from anything above 1GB */
++      if (pci_dma_mapping_error(dmaaddr) ||
++          dmaaddr + ring->rx_buffersize > ring->bcm->dma_mask) {
++              /* This one has 30-bit addressing... */
++              if (!pci_dma_mapping_error(dmaaddr))
++                      pci_unmap_single(ring->bcm->pci_dev,
++                                       dmaaddr, ring->rx_buffersize,
++                                       PCI_DMA_FROMDEVICE);
++              dev_kfree_skb_any(skb);
++              skb = __dev_alloc_skb(ring->rx_buffersize,GFP_DMA);
++              if (skb == NULL)
++                      return -ENOMEM;
++              dmaaddr = pci_map_single(ring->bcm->pci_dev,
++                                       skb->data, ring->rx_buffersize,
++                                       PCI_DMA_FROMDEVICE);
++              if (pci_dma_mapping_error(dmaaddr) ||
++                  dmaaddr + ring->rx_buffersize > ring->bcm->dma_mask) {
++                      assert(0);
++                      dev_kfree_skb_any(skb);
++                      return -ENOMEM;
++              }
++      }
+       meta->skb = skb;
+       meta->dmaaddr = dmaaddr;
+       skb->dev = ring->bcm->net_dev;
+@@ -636,8 +693,10 @@ struct bcm43xx_dmaring * bcm43xx_setup_d
+       err = dmacontroller_setup(ring);
+       if (err)
+               goto err_free_ringmemory;
++      return ring;
+ 
+ out:
++      printk(KERN_ERR PFX "Error in bcm43xx_setup_dmaring\n");
+       return ring;
+ 
+ err_free_ringmemory:
+@@ -705,30 +764,16 @@ int bcm43xx_dma_init(struct bcm43xx_priv
+       struct bcm43xx_dmaring *ring;
+       int err = -ENOMEM;
+       int dma64 = 0;
+-      u64 mask = bcm43xx_get_supported_dma_mask(bcm);
+-      int nobits;
+ 
+-      if (mask == DMA_64BIT_MASK) {
++      bcm->dma_mask = bcm43xx_get_supported_dma_mask(bcm);
++      if (bcm->dma_mask == DMA_64BIT_MASK)
+               dma64 = 1;
+-              nobits = 64;
+-      } else if (mask == DMA_32BIT_MASK)
+-              nobits = 32;
+-      else
+-              nobits = 30;
+-      err = pci_set_dma_mask(bcm->pci_dev, mask);
+-      err |= pci_set_consistent_dma_mask(bcm->pci_dev, mask);
+-      if (err) {
+-#ifdef CONFIG_BCM43XX_PIO
+-              printk(KERN_WARNING PFX "DMA not supported on this device."
+-                                      " Falling back to PIO.\n");
+-              bcm->__using_pio = 1;
+-              return -ENOSYS;
+-#else
+-              printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not 
configured. "
+-                                  "Please recompile the driver with PIO 
support.\n");
+-              return -ENODEV;
+-#endif /* CONFIG_BCM43XX_PIO */
+-      }
++      err = pci_set_dma_mask(bcm->pci_dev, bcm->dma_mask);
++      if (err)
++              goto no_dma;
++      err = pci_set_consistent_dma_mask(bcm->pci_dev, bcm->dma_mask);
++      if (err)
++              goto no_dma;
+ 
+       /* setup TX DMA channels. */
+       ring = bcm43xx_setup_dmaring(bcm, 0, 1, dma64);
+@@ -774,9 +819,12 @@ int bcm43xx_dma_init(struct bcm43xx_priv
+               dma->rx_ring3 = ring;
+       }
+ 
+-      dprintk(KERN_INFO PFX "%d-bit DMA initialized\n", nobits);
++      dprintk(KERN_INFO PFX "%d-bit DMA initialized\n",
++              (bcm->dma_mask == DMA_64BIT_MASK) ? 64 :
++              (bcm->dma_mask == DMA_32BIT_MASK) ? 32 : 30);
+       err = 0;
+ out:
++      if(err)BUG();
+       return err;
+ 
+ err_destroy_rx0:
+@@ -800,7 +848,18 @@ err_destroy_tx1:
+ err_destroy_tx0:
+       bcm43xx_destroy_dmaring(dma->tx_ring0);
+       dma->tx_ring0 = NULL;
+-      goto out;
++no_dma:
++#ifdef CONFIG_BCM43XX_PIO
++      printk(KERN_WARNING PFX "DMA not supported on this device."
++                              " Falling back to PIO.\n");
++      bcm->__using_pio = 1;
++      BUG();
++      return -ENOSYS;
++#else
++      printk(KERN_ERR PFX "FATAL: DMA not supported and PIO not configured. "
++                          "Please recompile the driver with PIO support.\n");
++      return -ENODEV;
++#endif /* CONFIG_BCM43XX_PIO */
+ }
+ 
+ /* Generate a cookie for the TX header. */
+@@ -905,6 +964,7 @@ static void dma_tx_fragment(struct bcm43
+       struct bcm43xx_dmadesc_generic *desc;
+       struct bcm43xx_dmadesc_meta *meta;
+       dma_addr_t dmaaddr;
++      struct sk_buff *bounce_skb;
+ 
+       assert(skb_shinfo(skb)->nr_frags == 0);
+ 
+@@ -924,9 +984,28 @@ static void dma_tx_fragment(struct bcm43
+                              skb->len - sizeof(struct bcm43xx_txhdr),
+                              (cur_frag == 0),
+                              generate_cookie(ring, slot));
++      dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
++      if (dma_mapping_error(dmaaddr) || dmaaddr + skb->len > 
ring->bcm->dma_mask) {
++              /* chip cannot handle DMA to/from > 1GB, use bounce buffer 
(copied from b44 driver) */
++              if (!dma_mapping_error(dmaaddr))
++                      unmap_descbuffer(ring, dmaaddr, skb->len, 1);
++              bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC|GFP_DMA);
++              if (!bounce_skb)
++                      return;
++              dmaaddr = map_descbuffer(ring, bounce_skb->data, 
bounce_skb->len, 1);
++              if (dma_mapping_error(dmaaddr) || dmaaddr + skb->len > 
ring->bcm->dma_mask) {
++                      if (!dma_mapping_error(dmaaddr))
++                              unmap_descbuffer(ring, dmaaddr, skb->len, 1);
++                      dev_kfree_skb_any(bounce_skb);
++                      assert(0);
++                      return;
++              }
++              memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
++              dev_kfree_skb_any(skb);
++              skb = bounce_skb;
++      }
+ 
+       meta->skb = skb;
+-      dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
+       meta->dmaaddr = dmaaddr;
+ 
+       fill_descriptor(ring, desc, dmaaddr,
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx.h
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
+@@ -21,7 +21,7 @@
+ #define PFX                           KBUILD_MODNAME ": "
+ 
+ #define BCM43xx_SWITCH_CORE_MAX_RETRIES       50
+-#define BCM43xx_IRQWAIT_MAX_RETRIES   50
++#define BCM43xx_IRQWAIT_MAX_RETRIES   100
+ 
+ #define BCM43xx_IO_SIZE                       8192
+ 
+@@ -352,6 +352,10 @@
+ #define BCM43xx_UCODEFLAG_UNKPACTRL   0x0040
+ #define BCM43xx_UCODEFLAG_JAPAN               0x0080
+ 
++/* Hardware Radio Enable masks */
++#define BCM43xx_MMIO_RADIO_HWENABLED_HI_MASK (1 << 16)
++#define BCM43xx_MMIO_RADIO_HWENABLED_LO_MASK (1 << 4)
++
+ /* Generic-Interrupt reasons. */
+ #define BCM43xx_IRQ_READY             (1 << 0)
+ #define BCM43xx_IRQ_BEACON            (1 << 1)
+@@ -758,7 +762,8 @@ struct bcm43xx_private {
+           bad_frames_preempt:1,       /* Use "Bad Frames Preemption" (default 
off) */
+           reg124_set_0x4:1,           /* Some variable to keep track of IRQ 
stuff. */
+           short_preamble:1,           /* TRUE, if short preamble is enabled. 
*/
+-          firmware_norelease:1;       /* Do not release the firmware. Used on 
suspend. */
++          firmware_norelease:1,       /* Do not release the firmware. Used on 
suspend. */
++          radio_hw_enable:1;          /* TRUE if radio is hardware enabled */
+ 
+       struct bcm43xx_stats stats;
+ 
+@@ -766,6 +771,7 @@ struct bcm43xx_private {
+        * This is currently always BCM43xx_BUSTYPE_PCI
+        */
+       u8 bustype;
++      u64 dma_mask;
+ 
+       u16 board_vendor;
+       u16 board_type;
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+@@ -2441,6 +2441,9 @@ static int bcm43xx_chip_init(struct bcm4
+       if (err)
+               goto err_gpio_cleanup;
+       bcm43xx_radio_turn_on(bcm);
++      bcm->radio_hw_enable = bcm43xx_is_hw_radio_enabled(bcm);
++      dprintk(KERN_INFO PFX "Radio %s by hardware\n",
++              (bcm->radio_hw_enable == 0) ? "disabled" : "enabled");
+ 
+       bcm43xx_write16(bcm, 0x03E6, 0x0000);
+       err = bcm43xx_phy_init(bcm);
+@@ -3175,9 +3178,24 @@ static void bcm43xx_periodic_every30sec(
+ 
+ static void bcm43xx_periodic_every15sec(struct bcm43xx_private *bcm)
+ {
++      bcm43xx_phy_xmitpower(bcm); //FIXME: unless scanning?
++      //TODO for APHY (temperature?)
++}
++
++static void bcm43xx_periodic_every1sec(struct bcm43xx_private *bcm)
++{
+       struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
+       struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
++      int radio_hw_enable;
+ 
++      /* check if radio hardware enabled status changed */
++      radio_hw_enable = bcm43xx_is_hw_radio_enabled(bcm);
++      if (unlikely(bcm->radio_hw_enable != radio_hw_enable)) {
++              bcm->radio_hw_enable = radio_hw_enable;
++              dprintk(KERN_INFO PFX "Radio hardware status changed to %s\n",
++                     (radio_hw_enable == 0) ? "disabled" : "enabled");
++              bcm43xx_leds_update(bcm, 0);
++      }
+       if (phy->type == BCM43xx_PHYTYPE_G) {
+               //TODO: update_aci_moving_average
+               if (radio->aci_enable && radio->aci_wlan_automatic) {
+@@ -3201,21 +3219,21 @@ static void bcm43xx_periodic_every15sec(
+                       //TODO: implement rev1 workaround
+               }
+       }
+-      bcm43xx_phy_xmitpower(bcm); //FIXME: unless scanning?
+-      //TODO for APHY (temperature?)
+ }
+ 
+ static void do_periodic_work(struct bcm43xx_private *bcm)
+ {
+-      if (bcm->periodic_state % 8 == 0)
++      if (bcm->periodic_state % 120 == 0)
+               bcm43xx_periodic_every120sec(bcm);
+-      if (bcm->periodic_state % 4 == 0)
++      if (bcm->periodic_state % 60 == 0)
+               bcm43xx_periodic_every60sec(bcm);
+-      if (bcm->periodic_state % 2 == 0)
++      if (bcm->periodic_state % 30 == 0)
+               bcm43xx_periodic_every30sec(bcm);
+-      bcm43xx_periodic_every15sec(bcm);
++      if (bcm->periodic_state % 15 == 0)
++              bcm43xx_periodic_every15sec(bcm);
++      bcm43xx_periodic_every1sec(bcm);
+ 
+-      schedule_delayed_work(&bcm->periodic_work, HZ * 15);
++      schedule_delayed_work(&bcm->periodic_work, HZ);
+ }
+ 
+ static void bcm43xx_periodic_work_handler(struct work_struct *work)
+@@ -3228,7 +3246,7 @@ static void bcm43xx_periodic_work_handle
+       unsigned long orig_trans_start = 0;
+ 
+       mutex_lock(&bcm->mutex);
+-      if (unlikely(bcm->periodic_state % 4 == 0)) {
++      if (unlikely(bcm->periodic_state % 60 == 0)) {
+               /* Periodic work will take a long time, so we want it to
+                * be preemtible.
+                */
+@@ -3260,7 +3278,7 @@ static void bcm43xx_periodic_work_handle
+ 
+       do_periodic_work(bcm);
+ 
+-      if (unlikely(bcm->periodic_state % 4 == 0)) {
++      if (unlikely(bcm->periodic_state % 60 == 0)) {
+               spin_lock_irqsave(&bcm->irq_lock, flags);
+               tasklet_enable(&bcm->isr_tasklet);
+               bcm43xx_interrupt_enable(bcm, savedirqs);
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.h
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_radio.h
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.h
+@@ -65,6 +65,22 @@ void bcm43xx_radio_init2060(struct bcm43
+ void bcm43xx_radio_turn_on(struct bcm43xx_private *bcm);
+ void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm);
+ 
++static inline
++int bcm43xx_is_hw_radio_enabled(struct bcm43xx_private *bcm)
++{
++      /* function to return state of hardware enable of radio
++       * returns 0 if radio disabled, 1 if radio enabled
++       */
++      if (likely(bcm->current_core->rev >= 3))
++              return ((bcm43xx_read32(bcm, BCM43xx_MMIO_RADIO_HWENABLED_HI)
++                                      & BCM43xx_MMIO_RADIO_HWENABLED_HI_MASK)
++                                      == 0) ? 1 : 0;
++      else
++              return ((bcm43xx_read16(bcm, BCM43xx_MMIO_RADIO_HWENABLED_LO)
++                                      & BCM43xx_MMIO_RADIO_HWENABLED_LO_MASK)
++                                      == 0) ? 0 : 1;
++}
++
+ int bcm43xx_radio_selectchannel(struct bcm43xx_private *bcm, u8 channel,
+                               int synthetic_pu_workaround);
+ 
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_leds.c
+@@ -26,6 +26,7 @@
+ */
+ 
+ #include "bcm43xx_leds.h"
++#include "bcm43xx_radio.h"
+ #include "bcm43xx.h"
+ 
+ #include <asm/bitops.h>
+@@ -108,6 +109,7 @@ static void bcm43xx_led_init_hardcoded(s
+       switch (led_index) {
+       case 0:
+               led->behaviour = BCM43xx_LED_ACTIVITY;
++              led->activelow = 1;
+               if (bcm->board_vendor == PCI_VENDOR_ID_COMPAQ)
+                       led->behaviour = BCM43xx_LED_RADIO_ALL;
+               break;
+@@ -199,20 +201,21 @@ void bcm43xx_leds_update(struct bcm43xx_
+                       turn_on = activity;
+                       break;
+               case BCM43xx_LED_RADIO_ALL:
+-                      turn_on = radio->enabled;
++                      turn_on = radio->enabled && 
bcm43xx_is_hw_radio_enabled(bcm);
+                       break;
+               case BCM43xx_LED_RADIO_A:
+               case BCM43xx_LED_BCM4303_2:
+-                      turn_on = (radio->enabled && phy->type == 
BCM43xx_PHYTYPE_A);
++                      turn_on = (radio->enabled && 
bcm43xx_is_hw_radio_enabled(bcm) &&
++                                 phy->type == BCM43xx_PHYTYPE_A);
+                       break;
+               case BCM43xx_LED_RADIO_B:
+               case BCM43xx_LED_BCM4303_1:
+-                      turn_on = (radio->enabled &&
++                      turn_on = (radio->enabled && 
bcm43xx_is_hw_radio_enabled(bcm) &&
+                                  (phy->type == BCM43xx_PHYTYPE_B ||
+                                   phy->type == BCM43xx_PHYTYPE_G));
+                       break;
+               case BCM43xx_LED_MODE_BG:
+-                      if (phy->type == BCM43xx_PHYTYPE_G &&
++                      if (phy->type == BCM43xx_PHYTYPE_G && 
bcm43xx_is_hw_radio_enabled(bcm) &&
+                           1/*FIXME: using G rates.*/)
+                               turn_on = 1;
+                       break;
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_radio.c
+@@ -1981,6 +1981,7 @@ void bcm43xx_radio_turn_on(struct bcm43x
+       }
+       radio->enabled = 1;
+       dprintk(KERN_INFO PFX "Radio turned on\n");
++      bcm43xx_leds_update(bcm, 0);
+ }
+       
+ void bcm43xx_radio_turn_off(struct bcm43xx_private *bcm)
+@@ -2001,6 +2002,7 @@ void bcm43xx_radio_turn_off(struct bcm43
+               bcm43xx_phy_write(bcm, 0x0015, 0xAA00);
+       radio->enabled = 0;
+       dprintk(KERN_INFO PFX "Radio turned off\n");
++      bcm43xx_leds_update(bcm, 0);
+ }
+ 
+ void bcm43xx_radio_clear_tssi(struct bcm43xx_private *bcm)
+Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+===================================================================
+--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
++++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+@@ -261,22 +261,22 @@ static int bcm43xx_wx_get_rangeparams(st
+       if (phy->type == BCM43xx_PHYTYPE_A ||
+           phy->type == BCM43xx_PHYTYPE_G) {
+               range->num_bitrates = 8;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_12MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_18MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_24MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_36MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB;
+-              range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_6MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_9MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_12MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_18MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_24MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_36MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_48MB * 500000;
++              range->bitrate[i++] = IEEE80211_OFDM_RATE_54MB * 500000;
+       }
+       if (phy->type == BCM43xx_PHYTYPE_B ||
+           phy->type == BCM43xx_PHYTYPE_G) {
+               range->num_bitrates += 4;
+-              range->bitrate[i++] = IEEE80211_CCK_RATE_1MB;
+-              range->bitrate[i++] = IEEE80211_CCK_RATE_2MB;
+-              range->bitrate[i++] = IEEE80211_CCK_RATE_5MB;
+-              range->bitrate[i++] = IEEE80211_CCK_RATE_11MB;
++              range->bitrate[i++] = IEEE80211_CCK_RATE_1MB * 500000;
++              range->bitrate[i++] = IEEE80211_CCK_RATE_2MB * 500000;
++              range->bitrate[i++] = IEEE80211_CCK_RATE_5MB * 500000;
++              range->bitrate[i++] = IEEE80211_CCK_RATE_11MB * 500000;
+       }
+ 
+       geo = ieee80211_get_geo(bcm->ieee);
+@@ -286,7 +286,7 @@ static int bcm43xx_wx_get_rangeparams(st
+               if (j == IW_MAX_FREQUENCIES)
+                       break;
+               range->freq[j].i = j + 1;
+-              range->freq[j].m = geo->a[i].freq;//FIXME?
++              range->freq[j].m = geo->a[i].freq * 100000;
+               range->freq[j].e = 1;
+               j++;
+       }
+@@ -294,7 +294,7 @@ static int bcm43xx_wx_get_rangeparams(st
+               if (j == IW_MAX_FREQUENCIES)
+                       break;
+               range->freq[j].i = j + 1;
+-              range->freq[j].m = geo->bg[i].freq;//FIXME?
++              range->freq[j].m = geo->bg[i].freq * 100000;
+               range->freq[j].e = 1;
+               j++;
+       }
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to