Skip to content
Snippets Groups Projects
  1. Aug 14, 2009
  2. Aug 04, 2009
    • Pavel Roskin's avatar
      d8cc8926
    • Luis R. Rodriguez's avatar
      mac80211: redefine usage of the mac80211 workqueue · 42935eca
      Luis R. Rodriguez authored
      
      The mac80211 workqueue exists to enable mac80211 and drivers
      to queue their own work on a single threaded workqueue. mac80211
      takes care to flush the workqueue during suspend but we never
      really had requirements on drivers for how they should use
      the workqueue in consideration for suspend.
      
      We extend mac80211 to document how the mac80211 workqueue should
      be used, how it should not be used and finally move raw access to
      the workqueue to mac80211 only. Drivers and mac80211 use helpers
      to queue work onto the mac80211 workqueue:
      
        * ieee80211_queue_work()
        * ieee80211_queue_delayed_work()
      
      These helpers will now warn if mac80211 already completed its
      suspend cycle and someone is trying to queue work. mac80211
      flushes the mac80211 workqueue prior to suspend a few times,
      but we haven't taken the care to ensure drivers won't add more
      work after suspend. To help with this we add a warning when
      someone tries to add work and mac80211 already completed the
      suspend cycle.
      
      Drivers should ensure they cancel any work or delayed work
      in the mac80211 stop() callback.
      
      Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      42935eca
  3. Jul 24, 2009
  4. Jul 10, 2009
  5. May 20, 2009
  6. May 06, 2009
  7. Apr 16, 2009
    • Herton Ronaldo Krzesinski's avatar
      rt2x00: prevent double kfree when failing to register hardware · f05faa31
      Herton Ronaldo Krzesinski authored
      
      In a scenario where there isn't any firmware available, we will have a
      double kfree of rt2x00dev->spec.channels_info when ieee80211_register_hw
      returns an error status inside rt2x00lib_probe_hw.
      
      The problem is that if ieee80211_register_hw fails, we call
      rt2x00lib_remove_hw twice:
      * first inside rt2x00lib_probe_hw upon failure of ieee80211_register_hw
      * error status is returned to rt2x00lib_probe_dev, which then sees it and
        calls in this case rt2x00lib_remove_dev that will again run
        rt2x00lib_remove_hw
      
      Prevent this avoiding calling rt2x00lib_remove_hw inside
      rt2x00lib_probe_hw
      
      Problem was detected with CONFIG_DEBUG_PAGEALLOC=y, CONFIG_SLUB_DEBUG=y,
      CONFIG_SLUB_DEBUG_ON=y, that dumps this with no firmware available:
      
      rt61pci 0000:00:07.0: PCI INT A -> GSI 19 (level, low) -> IRQ 19
      wmaster0 (rt61pci): not using net_device_ops yet
      phy0: Selected rate control algorithm 'pid'
      phy0: Failed to initialize wep: -2
      phy0 -> rt2x00lib_probe_dev: Error - Failed to initialize hw.
      =============================================================================
      BUG kmalloc-128: Object already free
      -----------------------------------------------------------------------------
      
      INFO: Allocated in rt61pci_probe_hw+0x3e5/0x6e0 [rt61pci] age=340 cpu=0 pid=21
      INFO: Freed in rt2x00lib_remove_hw+0x59/0x70 [rt2x00lib] age=0 cpu=0 pid=21
      INFO: Slab 0xc13ac3e0 objects=23 used=10 fp=0xdd59f6e0 flags=0x400000c3
      INFO: Object 0xdd59f6e0 @offset=1760 fp=0xdd59f790
      
      Bytes b4 0xdd59f6d0:  15 00 00 00 b2 8a fb ff 5a 5a 5a 5a 5a 5a 5a 5a ....².ûÿZZZZZZZZ
        Object 0xdd59f6e0:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f6f0:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f700:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f710:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f720:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f730:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f740:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
        Object 0xdd59f750:  6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5 kkkkkkkkkkkkkkk¥
       Redzone 0xdd59f760:  bb bb bb bb                                     »»»»
       Padding 0xdd59f788:  5a 5a 5a 5a 5a 5a 5a 5a                         ZZZZZZZZ
      Pid: 21, comm: stage1 Not tainted 2.6.29.1-desktop-1.1mnb #1
      Call Trace:
       [<c01abbb3>] print_trailer+0xd3/0x120
       [<c01abd37>] object_err+0x37/0x50
       [<c01acf57>] __slab_free+0xe7/0x2f0
       [<c01ad1de>] kfree+0x7e/0xd0
       [<e0e4a239>] ? rt2x00lib_remove_hw+0x59/0x70 [rt2x00lib]
       [<e0e4a239>] ? rt2x00lib_remove_hw+0x59/0x70 [rt2x00lib]
       [<e0e4a239>] rt2x00lib_remove_hw+0x59/0x70 [rt2x00lib]
       [<e0e4acc7>] rt2x00lib_remove_dev+0x37/0x50 [rt2x00lib]
       [<e0e4b087>] rt2x00lib_probe_dev+0x1a7/0x3b0 [rt2x00lib]
       [<e0eb288f>] rt2x00pci_probe+0xdf/0x1ee [rt2x00pci]
       [<c026b9ee>] local_pci_probe+0xe/0x10
       [<c026c750>] pci_device_probe+0x60/0x80
       [<c02d5c2a>] driver_probe_device+0x9a/0x2e0
       [<c02d5ef9>] __driver_attach+0x89/0x90
       [<c02d541b>] bus_for_each_dev+0x4b/0x70
       [<c026c690>] ? pci_device_remove+0x0/0x40
       [<c02d59d9>] driver_attach+0x19/0x20
       [<c02d5e70>] ? __driver_attach+0x0/0x90
       [<c02d4cef>] bus_add_driver+0x1cf/0x2a0
       [<c026c690>] ? pci_device_remove+0x0/0x40
       [<c02d60c9>] driver_register+0x69/0x140
       [<c026c9b0>] __pci_register_driver+0x40/0x80
       [<e0ecc000>] ? rt61pci_init+0x0/0x19 [rt61pci]
       [<e0ecc017>] rt61pci_init+0x17/0x19 [rt61pci]
       [<c0101116>] do_one_initcall+0x26/0x1c0
       [<c01ab90c>] ? slab_pad_check+0x3c/0x120
       [<c01ab90c>] ? slab_pad_check+0x3c/0x120
       [<c01ac8da>] ? check_object+0xda/0x210
       [<c01b0026>] ? percpu_free+0x46/0x50
       [<c01ad09e>] ? __slab_free+0x22e/0x2f0
       [<c01b0026>] ? percpu_free+0x46/0x50
       [<c01b0026>] ? percpu_free+0x46/0x50
       [<c01b0026>] ? percpu_free+0x46/0x50
       [<c01687ec>] ? stop_machine_destroy+0x3c/0x40
       [<c015e515>] ? load_module+0xa5/0x1c50
       [<e0ec5000>] ? rt61pci_eepromregister_read+0x0/0x40 [rt61pci]
       [<e0eb2000>] ? rt2x00pci_write_tx_data+0x0/0x90 [rt2x00pci]
       [<c03ac2fb>] ? mutex_lock+0xb/0x20
       [<c03ac2fb>] ? mutex_lock+0xb/0x20
       [<c017ad16>] ? tracepoint_update_probe_range+0x76/0xa0
       [<c017ad6f>] ? tracepoint_module_notify+0x2f/0x40
       [<c03b02ed>] ? notifier_call_chain+0x2d/0x70
       [<c014f0ed>] ? __blocking_notifier_call_chain+0x4d/0x60
       [<c014f11a>] ? blocking_notifier_call_chain+0x1a/0x20
       [<c0160156>] sys_init_module+0x96/0x1d0
       [<c019dad6>] ? sys_munmap+0x46/0x60
       [<c0105546>] syscall_call+0x7/0xb
      FIX kmalloc-128: Object at 0xdd59f6e0 not freed
      rt61pci 0000:00:07.0: PCI INT A disabled
      rt61pci: probe of 0000:00:07.0 failed with error -2
      
      Signed-off-by: default avatarHerton Ronaldo Krzesinski <herton@mandriva.com.br>
      Acked-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      f05faa31
  8. Feb 09, 2009
  9. Jan 29, 2009
  10. Jan 12, 2009
  11. Dec 05, 2008
  12. Nov 21, 2008
    • Ivo van Doorn's avatar
      rt2x00: Fix race condition when using inderect registers · 8ff48a8b
      Ivo van Doorn authored
      
      Indirect registers require multiple calls to the CSR
      register in order to access the indirect registers.
      This must be protected under a lock to prevent race
      conditions which could cause invalid data to
      be returned when reading from the indirect register or silent
      failures when writing data to the indirect register.
      
      USB drivers where already protected under a mutex,
      so rename the mutex and make PCI drivers use the mutex
      as well.
      This now means that BBP and RF registers are no longer
      accessible in interrupt context. That is not a bad
      situation since the slow behavior of accessing
      those registers means we don't _want_ to access them
      in interrupt context either.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      8ff48a8b
    • Ivo van Doorn's avatar
      rt2x00: Cleanup TX/RX entry handling · 798b7adb
      Ivo van Doorn authored
      
      Merge the callback functions init_txentry() and
      init_rxentry(). This makes life in rt2x00lib a
      lot simpler and we can cleanup several functions.
      
      rt2x00pci contained "fake" FIELD definitions for
      descriptor words. This is not flexible since it
      assumes the driver will always have the same field
      to indicate if a driver is available or not.
      This should be dependent on the driver, and we
      should add a callback function for this.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      798b7adb
    • Ivo van Doorn's avatar
      rt2x00: Fix BUG_ON() with antenna handling · 6d64360a
      Ivo van Doorn authored
      
      With the new configuration handling, and more specifically
      splitting the configuration of the antenna from the normal
      configuration steps allowed a BUG_ON() to be triggered
      in the driver because the SW_DIVERSITY was send to the
      driver. This fixes that by catching the value early in
      rt2x00config.c and replacing it with a sensible value.
      
      This also fixes a problem where the antenna is not being
      initialized at all when the radio is enabled. Since it
      no longer is part of the mac80211 configuration the
      only place where rt2x00 configured it was the SW diversity
      handler. Obviously this is broken for all non-diversity
      hardware and breaks SW diversity due to a broken initialization.
      
      When the radio is enabled the antenna will be configured
      once as soon as the config() callback function is called.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      6d64360a
    • Ivo van Doorn's avatar
      rt2x00: Remove RATE_BASIC flag · 3d8606a6
      Ivo van Doorn authored
      
      mac80211 is in charge of determining the basic rates,
      so we are not using the RATE_BASIC flag anymore.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      3d8606a6
  13. Nov 10, 2008
  14. Oct 31, 2008
  15. Sep 15, 2008
  16. Sep 05, 2008
  17. Aug 29, 2008
    • Ivo van Doorn's avatar
      rt2x00: Add Signal type flag · 6c6aa3c0
      Ivo van Doorn authored
      
      Instead of using the PLCP flag to indicate if the
      signal value is plcp or the bitrate we should add
      a new flag to mark the bitrate type explicitely.
      This is usefull when new types are added later for
      rt2800.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      6c6aa3c0
    • Mattias Nissler's avatar
      rt2x00: Only configure hardware when radio is enabled · 2575c11d
      Mattias Nissler authored
      
      Some hardware configuration registers such as antenna and channel configuration
      can only be written when the radio is enabled. Previously, we didn't consider
      this, so some configuration items could be set inconsistently after reenabling
      the radio. This patch changes the config() handler to only reprogram the
      hardware when the radio is enabled. Configuration changes that are made while
      the radio is off are postponed until the radio is switched back on. We also
      leave the radio turned off during initialization and only enable it when
      requested by mac80211. This allows us to get rid of the DIRTY_CONFIG flag,
      because the device is now guaranteed to be completely initialized when brought
      up by mac80211.
      
      Signed-off-by: default avatarMattias Nissler <mattias.nissler@gmx.de>
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      2575c11d
    • Ivo van Doorn's avatar
      rt2x00: Fix race conditions in flag handling · 0262ab0d
      Ivo van Doorn authored
      
      Some of the flags should be accessed atomically to
      prevent race conditions. The flags that are most important
      are those that can change often and indicate the actual
      state of the device, queue or queue entry.
      
      The big flag rename was done to move all state flags to
      the same naming type as the other rt2x00dev flags and
      made sure all places where the flags were used were changed. ;)
      
      Thanks to Stephen for most of the queue flags updates,
      which fixes some of the most obvious consequences of the
      race conditions. Among those the notorious:
      
      rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
      rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
      rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 0.
      
      Signed-off-by: default avatarStephen Blackheath <tramp.enshrine.stephen@blacksapphire.com>
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      0262ab0d
  18. Aug 22, 2008
  19. Jul 29, 2008
    • Ivo van Doorn's avatar
      rt2x00: Force full register config after start() · 74c0ee9b
      Ivo van Doorn authored
      
      rt2x00 will only perform configuration changes from
      mac80211 when the configuration option has changed.
      This means it keeps track of the current active configuration
      and will check these values when the config() callback function
      is used.
      
      However this causes breakage when the interface has been
      brought down and up again, since all stored active values
      aren't reset while the registers might have.
      This is for example the case with rt61pci antenna registers which
      will jump to invalid values when the interface has been started.
      
      To make sure a full configuration takes place after the start()
      callback function, a new flag is added which will be checked
      during config() and skips the "what's changed" phase.
      
      Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      74c0ee9b
  20. Jul 14, 2008
Loading