15 Jun, 2010

15 commits

  • There's a corner case where we receive a fragmented
    frame during a blockack session, in which case we
    will terminate that session. To simplify future work
    in this area that will culminate in allowing the
    driver callbacks for aggregation to sleep, move the
    processing of this case out of the RX path into the
    interface work.

    This will simplify future work because the new place
    for this code doesn't require that the function will
    always be atomic, which the RX path needs.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • To prepare for making the ampdu_action callback
    sleep, make mac80211 always process blockack
    action frames from the skb queue. This gets rid
    of the current special case for managed mode
    interfaces as well.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • Some code is duplicated between ibss, mesh and
    managed mode regarding the queueing of management
    frames. Since all modes now use a common skb
    queue and a common work function, we can pull
    the queueing code into the rx handler directly
    and remove the duplicated length checks etc.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • All the management processing functions free the
    skb after they are done, so this can be done in
    the new common code instead.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • Even with the previous patch, IBSS, managed
    and mesh modes all attach their own work
    function to the shared work struct, which
    means some duplicated code. Change that to
    only have a frame processing function and a
    further work function for each of them and
    share some common code.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • IBSS, managed and mesh modes all have their
    own work struct, and in the future we want
    to also use it in other modes to process
    frames from the now common skb queue.

    This also makes the skb queue and work safe
    to use from other interface types.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • IBSS, managed and mesh modes all have an
    skb queue, and in the future we want to
    also use it in other modes, so make them
    all use a common skb queue already.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • A number of places use RCU locking for accessing
    the station list, even though they do not need
    to. Use mutex locking instead to prepare for the
    locking changes I want to make. The mlme code is
    also using a WLAN_STA_DISASSOC flag that has the
    same meaning as WLAN_STA_BLOCK_BA, so use that.

    While doing so, combine places where we loop
    over stations twice, and optimise away some of
    the loops by checking if the hardware supports
    aggregation at all first.

    Also fix a more theoretical race condition: right
    now we could resume, set up an aggregation session,
    and right after tear it down again due to the code
    that is needed for hardware reconfiguration here.
    Also mark add a comment to that code marking it as
    a workaround.

    Finally, remove a pointless aggregation disabling
    loop when an interface is stopped, directly after
    that we remove all stations from it which will also
    disable all aggregation sessions that may still be
    active, and does so in a race-free way unlike the
    current loop that doesn't block new sessions.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • When in IBSS mode, currently action frame TX and RX
    cannot be used. Allow using it to talk to any peer,
    or for public action frames. Also, while at it,
    restructure the code in mac80211 to make it easier
    to add this for other interface types in the future.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • When we detect that not all antennas are
    properly connected, we simply disable the
    associated chains, but never notify the
    user at all. Print out a warning so it is
    obvious that happened and we know where
    to start looking for related issues.

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg
     
  • iwl4965_rx_mpdu_res_start is not 4695 specific, so rename it to more
    general name iwl_rx_mpdu_res_start.

    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Reinette Chatre

    Emmanuel Grumbach
     
  • Rename rxq->dma_addr to rxq->bd_dma to better emphasize that the
    physical address stands for the receive buffer descriptor's address.

    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Reinette Chatre

    Emmanuel Grumbach
     
  • Cancel scheduled run time calibration work when interface is going
    down.

    Signed-off-by: Wey-Yi Guy
    Signed-off-by: Reinette Chatre

    Wey-Yi Guy
     
  • Test for null pointer prior to access.
    Print "Not Allocated" if null pointer.

    Signed-off-by: Dor Shaish
    Signed-off-by: Emmanuel Grumbach
    Signed-off-by: Reinette Chatre

    Dor Shaish
     
  • The length contained in the status word doesn't
    include the status word's length itself, so we
    need to account for that for tracing.

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg
     

08 Jun, 2010

17 commits

  • Reading the ELP_CTRL register with sdio_readb causes problems because
    hardware seems to be performing a write using stuff bits in the request
    (those bits contain write data in write request). This indicates that it
    actually expects RAW (read after write) type of request, so perform that
    when reading ELP_CTRL instead. Also cache last written value so we know
    what to write when doing RAW request.

    Because of the above it was not possible to wake the chip from ELP power
    saving mode, PM had to be disabled to have the driver usable in SDIO
    mode. After this patch PM is functional.

    For backporting to 2.6.34 or earlier, this patch depends on
    6c1f716e8154ee9315534782b9b1eedea0559a24, which adds the
    required SDIO funcion.

    Signed-off-by: Grazvydas Ignotas
    Acked-by: Kalle Valo
    Signed-off-by: John W. Linville

    Grazvydas Ignotas
     
  • Fix a whole bunch of kernel-doc warnings
    and errors that crop up when running it on
    mac80211 and cfg80211; the latter isn't
    normally done so lots of bit-rot happened.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     
  • There's a window for ieee80211_ifa_changed() to get called whilst the
    managed mode mutex has not been initialized when opening and stopping the
    interface. Currently this causes a kernel BUG like the following:

    [ 132.460013] kernel BUG at /home/wifi/iwlwifi-2.6/net/mac80211/main.c:380!
    [ 132.460013] invalid opcode: 0000 [#1] SMP

    The mutex is initialized during open(), hence once netif_running() is true,
    the mutex should be valid. Fix by adding a netif_running() check to the
    function.

    Reported-by: Reinette Chatre
    Signed-off-by: Juuso Oikarinen
    Tested-by: Reinette Chatre
    Signed-off-by: John W. Linville

    Juuso Oikarinen
     
  • Signed-off-by: Bruno Randolf
    Signed-off-by: John W. Linville

    Bruno Randolf
     
  • Since ath5k_hw_set_antenna_mode() always writes the default antenna register
    and is called at the end of reset, there is no need to separately save and
    restore the default antenna.

    Signed-off-by: Bruno Randolf
    Signed-off-by: John W. Linville

    Bruno Randolf
     
  • Collect all pieces concering the antenna switch table into one function.
    Previously it was split up between ath5k_hw_reset() and
    ath5k_hw_commit_eeprom_settings().

    Also we need to set the antenna switch table when ath5k_hw_set_antenna_mode()
    is called manually (by "iw phy0 antenna set", for example).

    I'm not sure if we need to set the switchtable at the same place in
    ath5k_hw_reset() as it was before - it is set later thru
    ath5k_hw_set_antenna_mode() anyways - but i leave it there to avoid
    problems(?).

    Plus print switchtable registers in the debugfs file.

    Signed-off-by: Bruno Randolf
    Signed-off-by: John W. Linville

    Bruno Randolf
     
  • #define AR5K_PHY_RESTART_DIV_GC 0x001c0000
    is 3 bit wide.

    The previous values of 0xc and 0x8 are 4bit wide and bigger than the mask.

    Writing 0 and 1 to AR5K_PHY_RESTART_DIV_GC is consistent with the comments and
    initvals we have in the HAL.

    Signed-off-by: Bruno Randolf
    Signed-off-by: John W. Linville

    Bruno Randolf
     
  • This patch fixes the libertas driver incorrectly reporting that Wake-on-LAN
    is not supported if Wake-on-LAN is currently disabled.

    Signed-off-by: Sascha Silbe
    Acked-by: Dan Williams
    Signed-off-by: John W. Linville

    Sascha Silbe
     
  • Fixes 'make -j24 CONFIG_DEBUG_SECTION_MISMATCH=y' warning:

    drivers/net/wireless/ath/ath9k/eeprom_4k.c: In function ‘ath9k_hw_get_4k_gain_boundaries_pdadcs.clone.1’:
    drivers/net/wireless/ath/ath9k/eeprom_4k.c:311: error: ‘minPwrT4’ may be used uninitialized in this function
    drivers/net/wireless/ath/ath9k/eeprom_9287.c: In function ‘ath9k_hw_get_AR9287_gain_boundaries_pdadcs’:
    drivers/net/wireless/ath/ath9k/eeprom_9287.c:302: error: ‘minPwrT4’ may be used uninitialized in this function
    drivers/net/wireless/ath/ath9k/eeprom_def.c: In function ‘ath9k_hw_get_def_gain_boundaries_pdadcs.clone.0’:
    drivers/net/wireless/ath/ath9k/eeprom_def.c:679: error: ‘minPwrT4’ may be used uninitialized in this function

    Signed-off-by: Prarit Bhargava
    Signed-off-by: John W. Linville

    Prarit Bhargava
     
  • Conflicts:
    drivers/net/wireless/iwlwifi/iwl-core.h

    John W. Linville
     
  • "mac80211: make ARP filtering depend on CONFIG_INET" introduced this
    potential locking leak.

    Reported-by: Juuso Oikarinen
    Signed-off-by: John W. Linville

    John W. Linville
     
  • In the revert of "iwlwifi: move _agn statistics related structure", I
    need to use CONFIG_IWLWIFI_DEBUGFS instead of CONFIG_IWLWIFI_DEBUG in
    the private structure definition. Without this patch, it is possible
    to get this:

    drivers/net/wireless/iwlwifi/iwl-rx.c: In function 'iwl_accumulative_statistics':
    drivers/net/wireless/iwlwifi/iwl-rx.c:304: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:305: error: 'struct iwl_priv' has no member named 'delta_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:306: error: 'struct iwl_priv' has no member named 'max_delta'
    drivers/net/wireless/iwlwifi/iwl-rx.c:321: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:323: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:325: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:327: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:329: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:331: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c: In function 'iwl_reply_statistics':
    drivers/net/wireless/iwlwifi/iwl-rx.c:484: error: 'struct iwl_priv' has no member named 'accum_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:486: error: 'struct iwl_priv' has no member named 'delta_statistics'
    drivers/net/wireless/iwlwifi/iwl-rx.c:488: error: 'struct iwl_priv' has no member named 'max_delta'

    Reported-by: Randy Dunlap
    Signed-off-by: John W. Linville

    John W. Linville
     
  • This makes "iw wlan0 dump survey" work again with
    mac80211-based drivers that support it, e.g. ath5k.

    Signed-off-by: Holger Schurig
    Signed-off-by: John W. Linville

    Holger Schurig
     
  • Remove my name from the MAINTAINERS file.

    Signed-off-by: Zhu Yi
    Signed-off-by: John W. Linville

    Zhu Yi
     
  • If the channel is not set yet and we configure the antennas just store the
    setting. It will be activated during the next reset, when the channel is set.

    Signed-off-by: Bruno Randolf
    Signed-off-by: John W. Linville

    Bruno Randolf
     
  • Add Dell WLA3310 USB wireless card, which has a Z-Com XG-705A chipset, to the
    USB Ids in p54usb.

    Signed-off-by: Jason Dravet
    Tested-by: Richard Gregory Tillmore
    Signed-off-by: Larry Finger
    Acked-by: Christian Lamparter
    Cc:
    Signed-off-by: John W. Linville

    Jason Dravet
     
  • wl1251_sdio_probe() error path is missing wl1251_free_hw, add it.

    Signed-off-by: Grazvydas Ignotas
    Acked-by: Kalle Valo
    Cc: stable@kernel.org
    Signed-off-by: John W. Linville

    Grazvydas Ignotas
     

06 Jun, 2010

8 commits

  • Fairly complex code in iwlagn_tx_status_reply_tx handle the status reports for
    aggregated packet batches sent by the NIC. This code aims to handle the case
    where the NIC retransmits failed packets from a previous batch; the status
    information for these packets can sometimes be inserted in the middle of a
    batch and are actually not in order by sequence number! (I verified this can
    happen with printk's in the function.)

    The code in question adaptively identifies the "first" frame of the batch,
    taking into account that it may not be the one corresponding to the first agg
    status report, and also handles the case when the set of sent packets wraps the
    256-character entry buffer. It generates the agg->bitmap field of sent packets
    which is later compared to the BlockAck response from the receiver to see which
    frames of those sent in this batch were ACKed. A small logic error (wrapping by
    0xff==255 instead of 0x100==256) was causing the agg->bitmap to be set
    incorrectly.

    Fix this wrapping code, and add extensive comments to clarify what is going on.

    Signed-off-by: Daniel Halperin
    Signed-off-by: Reinette Chatre

    Daniel Halperin
     
  • Compressed BlockAck frames store the ACKs/NACKs in a 64-bit bitmap that starts
    at the sequence number of the first frame sent in the aggregated batch. Note
    that this is a selective ACKnowledgement following selective retransmission;
    e.g., if frames 1,4-5 in a batch are ACKed then the next transmission will
    include frames 2-3,6-10 (7 frames). In this latter case, the Compressed
    BlockAck will not have all meaningful information in the low order bits -- the
    semantically meaningful bits of the BA will be 0x1f3 (where the low-order frame
    is seq 2).

    The driver code originally just looked at the lower (in this case, 7) bits of
    the BlockAck. In this case, the lower 7 bits of 0x1f3 => only 5 packets,
    maximum, could ever be ACKed. In reality it should be looking at all of the
    bits, filtered by those corresponding to packets that were actually sent. This
    flaw meant that the number of correctly ACked packets could be significantly
    underreported and might result in asynchronous state between TX and RX sides as
    well as driver and uCode.

    Fix this and also add a shortcut that doesn't require the code to loop through
    all 64 bits of the bitmap but rather stops when no higher packets are ACKed.

    In my experiments this fix greatly reduces throughput swing, making throughput
    stable and high. It is also likely related to some of the stalls observed in
    aggregation mode and maybe some of the buffer underruns observed, e.g.,

    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=1968
    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2098
    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2018

    Signed-off-by: Daniel Halperin
    Signed-off-by: Reinette Chatre

    Daniel Halperin
     
  • framecnt_to_us is not used, remove it

    Signed-off-by: Wey-Yi Guy
    Signed-off-by: Reinette Chatre

    Wey-Yi Guy
     
  • The internal scanning created a problem where
    when userspace tries to scan, the scan gets
    rejected. Instead of doing that, queue up the
    user-initiated scan when doing an internal
    scan.

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg
     
  • In "iwlwifi: make scan antenna forcing more generic"
    I introduced generic scan RX antenna forcing, which
    here I rename to make it more evident. Also add scan
    TX antenna forcing, since I will need that as well.

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg
     
  • Channel switch host command do not need to allocate huge command buffer
    since its size is already included in the iwl_device_cmd structure.

    Signed-off-by: Wey-Yi Guy
    Signed-off-by: Reinette Chatre

    Wey-Yi Guy
     
  • Currently, the driver allocates up to 19 skb pointers
    for each TFD, of which we have 256 per queue. This
    means that for each TX queue, we allocate 19k/38k
    (an order 4 or 5 allocation on 32/64 bit respectively)
    just for each queue's "txb" array, which contains only
    the SKB pointers.

    However, due to the way we use these pointers only the
    first one can ever be assigned. When the driver was
    initially written, the idea was that it could be
    passed multiple SKBs for each TFD and attach all
    those to implement gather DMA. However, due to
    constraints in the userspace API and lack of TCP/IP
    level checksumming in the device, this is in fact not
    possible. And even if it were, the SKBs would be
    chained, and we wouldn't need to keep pointers to
    each anyway.

    Change this to only keep track of one SKB per TFD,
    and thereby reduce memory consumption to just one
    pointer per TFD, which is an order 0 allocation per
    transmit queue.

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg
     
  • When we allocate queues, we currently don't
    use kzalloc() right now. When we then free
    those queues again without having used all
    entries, we may end up trying to free random
    pointers found in the txb array since it was
    never initialised. This fixes it simply by
    using kzalloc().

    Signed-off-by: Johannes Berg
    Signed-off-by: Reinette Chatre

    Johannes Berg