1. 19 3月, 2013 1 次提交
  2. 15 2月, 2013 1 次提交
  3. 31 1月, 2013 3 次提交
  4. 23 1月, 2013 1 次提交
    • H
      rt2x00: Improve TX status handling for BlockAckReq frames · 84e9e8eb
      Helmut Schaa 提交于
      Since rt2800 hardware isn't capable of reporting the TX status of
      BlockAckReq frames implement the TX status handling of BARs in
      rt2x00lib. We keep track of all BARs that are send out and try to
      match incoming BAs to the appropriate BARs. This allows us to report a
      more or less accurate TX status for BAR frames which in turn improves
      BA session stability.
      
      This is loosley based on Christian Lamparter's patch for carl9170
      "carl9170: fix HT peer BA session corruption".
      
      We have to walk the list of pending BARs for every rx'red BA even
      though most BAs don't belong to any of these BARs as they are just
      acknowledging an AMPDU. To keep that overhead low use RCU which allows
      us to walk the list of pending BARs without the need to acquire a lock.
      This however requires us to _copy_ relevant information from the BAR
      (RA, TA, control field, start sequence number) into our BAR list entry.
      Signed-off-by: NHelmut Schaa <helmut.schaa@googlemail.com>
      Tested-by: NAndreas Hartmann <andihartmann@01019freenet.de>
      Acked-by: NGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      84e9e8eb
  5. 26 9月, 2012 2 次提交
  6. 12 9月, 2012 1 次提交
  7. 31 7月, 2012 1 次提交
  8. 21 6月, 2012 1 次提交
  9. 05 6月, 2012 1 次提交
    • S
      rt2x00: use atomic variable for seqno · e5851dac
      Stanislaw Gruszka 提交于
      Remove spinlock as atomic_t can be used instead. Note we use only 16
      lower bits, upper bits are changed but we impilcilty cast to u16.
      
      This fix possible deadlock on IBSS mode reproted by lockdep:
      
      =================================
      [ INFO: inconsistent lock state ]
      3.4.0-wl+ #4 Not tainted
      ---------------------------------
      inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
      kworker/u:2/30374 [HC0[0]:SC0[0]:HE1:SE1] takes:
       (&(&intf->seqlock)->rlock){+.?...}, at: [<f9979a20>] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
      {IN-SOFTIRQ-W} state was registered at:
        [<c04978ab>] __lock_acquire+0x47b/0x1050
        [<c0498504>] lock_acquire+0x84/0xf0
        [<c0835733>] _raw_spin_lock+0x33/0x40
        [<f9979a20>] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
        [<f9979f2a>] rt2x00queue_write_tx_frame+0x1a/0x300 [rt2x00lib]
        [<f997834f>] rt2x00mac_tx+0x7f/0x380 [rt2x00lib]
        [<f98fe363>] __ieee80211_tx+0x1b3/0x300 [mac80211]
        [<f98ffdf5>] ieee80211_tx+0x105/0x130 [mac80211]
        [<f99000dd>] ieee80211_xmit+0xad/0x100 [mac80211]
        [<f9900519>] ieee80211_subif_start_xmit+0x2d9/0x930 [mac80211]
        [<c0782e87>] dev_hard_start_xmit+0x307/0x660
        [<c079bb71>] sch_direct_xmit+0xa1/0x1e0
        [<c0784bb3>] dev_queue_xmit+0x183/0x730
        [<c078c27a>] neigh_resolve_output+0xfa/0x1e0
        [<c07b436a>] ip_finish_output+0x24a/0x460
        [<c07b4897>] ip_output+0xb7/0x100
        [<c07b2d60>] ip_local_out+0x20/0x60
        [<c07e01ff>] igmpv3_sendpack+0x4f/0x60
        [<c07e108f>] igmp_ifc_timer_expire+0x29f/0x330
        [<c04520fc>] run_timer_softirq+0x15c/0x2f0
        [<c0449e3e>] __do_softirq+0xae/0x1e0
      irq event stamp: 18380437
      hardirqs last  enabled at (18380437): [<c0526027>] __slab_alloc.clone.3+0x67/0x5f0
      hardirqs last disabled at (18380436): [<c0525ff3>] __slab_alloc.clone.3+0x33/0x5f0
      softirqs last  enabled at (18377616): [<c0449eb3>] __do_softirq+0x123/0x1e0
      softirqs last disabled at (18377611): [<c041278d>] do_softirq+0x9d/0xe0
      
      other info that might help us debug this:
       Possible unsafe locking scenario:
      
             CPU0
             ----
        lock(&(&intf->seqlock)->rlock);
        <Interrupt>
          lock(&(&intf->seqlock)->rlock);
      
       *** DEADLOCK ***
      
      4 locks held by kworker/u:2/30374:
       #0:  (wiphy_name(local->hw.wiphy)){++++.+}, at: [<c045cf99>] process_one_work+0x109/0x3f0
       #1:  ((&sdata->work)){+.+.+.}, at: [<c045cf99>] process_one_work+0x109/0x3f0
       #2:  (&ifibss->mtx){+.+.+.}, at: [<f98f005b>] ieee80211_ibss_work+0x1b/0x470 [mac80211]
       #3:  (&intf->beacon_skb_mutex){+.+...}, at: [<f997a644>] rt2x00queue_update_beacon+0x24/0x50 [rt2x00lib]
      
      stack backtrace:
      Pid: 30374, comm: kworker/u:2 Not tainted 3.4.0-wl+ #4
      Call Trace:
       [<c04962a6>] print_usage_bug+0x1f6/0x220
       [<c0496a12>] mark_lock+0x2c2/0x300
       [<c0495ff0>] ? check_usage_forwards+0xc0/0xc0
       [<c04978ec>] __lock_acquire+0x4bc/0x1050
       [<c0527890>] ? __kmalloc_track_caller+0x1c0/0x1d0
       [<c0777fb6>] ? copy_skb_header+0x26/0x90
       [<c0498504>] lock_acquire+0x84/0xf0
       [<f9979a20>] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
       [<c0835733>] _raw_spin_lock+0x33/0x40
       [<f9979a20>] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
       [<f9979a20>] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
       [<f997a5cf>] rt2x00queue_update_beacon_locked+0x5f/0xb0 [rt2x00lib]
       [<f997a64d>] rt2x00queue_update_beacon+0x2d/0x50 [rt2x00lib]
       [<f9977e3a>] rt2x00mac_bss_info_changed+0x1ca/0x200 [rt2x00lib]
       [<f9977c70>] ? rt2x00mac_remove_interface+0x70/0x70 [rt2x00lib]
       [<f98e4dd0>] ieee80211_bss_info_change_notify+0xe0/0x1d0 [mac80211]
       [<f98ef7b8>] __ieee80211_sta_join_ibss+0x3b8/0x610 [mac80211]
       [<c0496ab4>] ? mark_held_locks+0x64/0xc0
       [<c0440012>] ? virt_efi_query_capsule_caps+0x12/0x50
       [<f98efb09>] ieee80211_sta_join_ibss+0xf9/0x140 [mac80211]
       [<f98f0456>] ieee80211_ibss_work+0x416/0x470 [mac80211]
       [<c0496d8b>] ? trace_hardirqs_on+0xb/0x10
       [<c077683b>] ? skb_dequeue+0x4b/0x70
       [<f98f207f>] ieee80211_iface_work+0x13f/0x230 [mac80211]
       [<c045cf99>] ? process_one_work+0x109/0x3f0
       [<c045d015>] process_one_work+0x185/0x3f0
       [<c045cf99>] ? process_one_work+0x109/0x3f0
       [<f98f1f40>] ? ieee80211_teardown_sdata+0xa0/0xa0 [mac80211]
       [<c045ed86>] worker_thread+0x116/0x270
       [<c045ec70>] ? manage_workers+0x1e0/0x1e0
       [<c0462f64>] kthread+0x84/0x90
       [<c0462ee0>] ? __init_kthread_worker+0x60/0x60
       [<c083d382>] kernel_thread_helper+0x6/0x10
      
      Cc: stable@vger.kernel.org
      Signed-off-by: NStanislaw Gruszka <sgruszka@redhat.com>
      Acked-by: NHelmut Schaa <helmut.schaa@googlemail.com>
      Acked-by: NGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      e5851dac
  10. 24 4月, 2012 1 次提交
  11. 12 4月, 2012 2 次提交
  12. 16 3月, 2012 1 次提交
    • S
      rt2x00: rt2800usb: rework txstatus code · f421111b
      Stanislaw Gruszka 提交于
      Currently we read tx status register after each urb data transfer. As
      callback procedure also trigger reading, that causing we have many
      "threads" of reading status. To prevent that introduce TX_STATUS_READING
      flags, and check if we are already in process of sequential reading
      TX_STA_FIFO, before requesting new reads.
      
      Change timer to hrtimer, that make TX_STA_FIFO overruns less possible.
      Use 200 us for initial timeout, and then reschedule in 100 us period,
      this values probably have to be tuned.
      
      Make changes on txdone work. Schedule it from
      rt2800usb_tx_sta_fifo_read_completed() callback when first valid status
      show up. Check in callback if tx status timeout happens, and schedule
      work on that condition too. That make possible to remove tx status
      timeout from generic watchdog. I moved that to rt2800usb.
      
      Loop in txdone work, that should prevent situation when we queue work,
      which is already processed, and after finish work is not rescheduled
      again.
      Signed-off-by: NStanislaw Gruszka <sgruszka@redhat.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      f421111b
  13. 28 2月, 2012 2 次提交
  14. 09 2月, 2012 3 次提交
  15. 05 1月, 2012 2 次提交
  16. 15 11月, 2011 1 次提交
  17. 04 10月, 2011 1 次提交
    • E
      mac80211: pass vif param to conf_tx() callback · 8a3a3c85
      Eliad Peller 提交于
      tx params should be configured per interface.
      add ieee80211_vif param to the conf_tx callback,
      and change all the drivers that use this callback.
      
      The following spatch was used:
      @rule1@
      struct ieee80211_ops ops;
      identifier conf_tx_op;
      @@
      	ops.conf_tx = conf_tx_op;
      
      @rule2@
      identifier rule1.conf_tx_op;
      identifier hw, queue, params;
      @@
      	conf_tx_op (
      -		struct ieee80211_hw *hw,
      +		struct ieee80211_hw *hw, struct ieee80211_vif *vif,
      		u16 queue,
      		const struct ieee80211_tx_queue_params *params) {...}
      Signed-off-by: NEliad Peller <eliad@wizery.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      8a3a3c85
  18. 15 9月, 2011 3 次提交
  19. 08 7月, 2011 1 次提交
  20. 07 6月, 2011 1 次提交
  21. 03 5月, 2011 2 次提交
  22. 20 4月, 2011 6 次提交
    • I
      rt2x00: Implement get_antenna and set_antenna callback functions · 0ed7b3c0
      Ivo van Doorn 提交于
      Implement the get_antenna and set_antenna callback functions, which will
      allow clients to control the antenna for all non-11n hardware (Antenna handling
      in rt2800 is still a bit magical, so we can't use the set_antenna for those drivers
      yet).
      
      To best support the set_antenna callback some modifications are needed in the
      diversity handling. We should never look at the default antenna settings to determine
      if software diversity is enabled. Instead we should set the diversity flag when
      possible, which will allow the link_tuner to automatically pick up the tuning.
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Acked-by: NGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      0ed7b3c0
    • I
      rt2x00: Implement get_ringparam callback function · e7dee444
      Ivo van Doorn 提交于
      With the get_ringparam callback function we can export ring parameters
      to ethtool through the mac80211 interface.
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Acked-by: NGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      e7dee444
    • I
      rt2x00: Decrease association time for USB devices · 152a5992
      Ivo van Doorn 提交于
      When powersaving is enabled, assocaition times are very high
      (for WPA2 networks, the time can easily be around the 3 seconds).
      
      This is caused, because the flushing of the queues takes
      too much time. Without the flushing callback mac80211 assumes
      a timeout of 100ms while scanning. Limit all flush waiting
      loops to the same maximum.
      
      We can apply this maximum by passing the drop status to the
      driver, which makes sure the driver performs extra actions
      during the waiting for the queue to become empty.
      
      After these changes, association times fall within the
      healthy range of ~0.6 seconds with powersaving enabled.
      The difference between association time between powersaving
      enabled and disabled is now only ~0.1 second (which can also
      be due to the measuring method).
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Acked-by: NGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      152a5992
    • J
      rt2800usb: add timer to handle TX_STA_FIFO · f0187a19
      Johannes Stezenbach 提交于
      TX status is reported by the hardware when a packet has been
      sent (or after TX failed after possible retries), which is some
      time after the DMA completion.  Since the rt2800usb hardware can
      not signal interrupts we have to use a timer, otherwise the
      TX status would only be read by the next packet's TX DMA
      completion, or by the watchdog thread.
      Signed-off-by: NJohannes Stezenbach <js@sig21.net>
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      f0187a19
    • J
      rt2800usb: read TX_STA_FIFO asynchronously · 0e0d39e5
      Johannes Stezenbach 提交于
      Trying to fix the "TX status report missed" warnings
      by reading the TX_STA_FIFO entries as quickly as possible.
      The TX_STA_FIFO is too small in hardware, thus reading
      it only from the workqueue is too slow and entries get lost.
      
      Start an asynchronous read of the TX_STA_FIFO directly from
      the TX URB completion callback (atomic context, thus it cannot
      use the blocking rt2800_register_read()). If the async
      read returns a valid FIFO entry, it is pushed into a larger
      FIFO inside struct rt2x00_dev, until rt2800_txdone() picks
      it up.
      
      A .tx_dma_done callback is added to struct rt2x00lib_ops
      to trigger the async read from the URB completion callback.
      Signed-off-by: NJohannes Stezenbach <js@sig21.net>
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      0e0d39e5
    • I
      rt2x00: Split rt2x00dev->flags · 7dab73b3
      Ivo van Doorn 提交于
      The number of flags defined for the rt2x00dev->flags field,
      has been growing over the years. Currently we are approaching
      the maximum number of bits which are available in the field.
      
      A secondary problem, is that one part of the field are initialized only
      during boot, because the driver requirements are initialized or device
      requirements are loaded from the EEPROM. In both cases, the flags are
      fixed and will not change during device operation. The other flags are
      the device state, and will change frequently. So far this resulted in the fact
      that for some flags, the atomic bit accessors are used, while for the others
      the non-atomic variants are used.
      
      By splitting the flags up into a "flags" and "cap_flags" we can put all flags
      which are fixed inside "cap_flags". This field can then be read non-atomically.
      In the "flags" field we keep the device state, which is going to be read atomically.
      
      This adds more room for more flags in the future, and sanitizes the field access methods.
      Signed-off-by: NIvo van Doorn <IvDoorn@gmail.com>
      Acked-by: NHelmut Schaa <helmut.schaa@googlemail.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      7dab73b3
  23. 05 4月, 2011 2 次提交