The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/iwm/if_iwm_phy_ctxt.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $OpenBSD: if_iwm.c,v 1.39 2015/03/23 00:35:19 jsg Exp $ */
    2 
    3 /*
    4  * Copyright (c) 2014 genua mbh <info@genua.de>
    5  * Copyright (c) 2014 Fixup Software Ltd.
    6  *
    7  * Permission to use, copy, modify, and distribute this software for any
    8  * purpose with or without fee is hereby granted, provided that the above
    9  * copyright notice and this permission notice appear in all copies.
   10  *
   11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   18  */
   19 
   20 /*-
   21  * Based on BSD-licensed source modules in the Linux iwlwifi driver,
   22  * which were used as the reference documentation for this implementation.
   23  *
   24  * Driver version we are currently based off of is
   25  * Linux 3.14.3 (tag id a2df521e42b1d9a23f620ac79dbfe8655a8391dd)
   26  *
   27  ***********************************************************************
   28  *
   29  * This file is provided under a dual BSD/GPLv2 license.  When using or
   30  * redistributing this file, you may do so under either license.
   31  *
   32  * GPL LICENSE SUMMARY
   33  *
   34  * Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
   35  *
   36  * This program is free software; you can redistribute it and/or modify
   37  * it under the terms of version 2 of the GNU General Public License as
   38  * published by the Free Software Foundation.
   39  *
   40  * This program is distributed in the hope that it will be useful, but
   41  * WITHOUT ANY WARRANTY; without even the implied warranty of
   42  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   43  * General Public License for more details.
   44  *
   45  * You should have received a copy of the GNU General Public License
   46  * along with this program; if not, write to the Free Software
   47  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
   48  * USA
   49  *
   50  * The full GNU General Public License is included in this distribution
   51  * in the file called COPYING.
   52  *
   53  * Contact Information:
   54  *  Intel Linux Wireless <ilw@linux.intel.com>
   55  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
   56  *
   57  *
   58  * BSD LICENSE
   59  *
   60  * Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
   61  * All rights reserved.
   62  *
   63  * Redistribution and use in source and binary forms, with or without
   64  * modification, are permitted provided that the following conditions
   65  * are met:
   66  *
   67  *  * Redistributions of source code must retain the above copyright
   68  *    notice, this list of conditions and the following disclaimer.
   69  *  * Redistributions in binary form must reproduce the above copyright
   70  *    notice, this list of conditions and the following disclaimer in
   71  *    the documentation and/or other materials provided with the
   72  *    distribution.
   73  *  * Neither the name Intel Corporation nor the names of its
   74  *    contributors may be used to endorse or promote products derived
   75  *    from this software without specific prior written permission.
   76  *
   77  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   78  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   79  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   80  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   81  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   82  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   83  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   84  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   85  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   86  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   87  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   88  */
   89 
   90 /*-
   91  * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
   92  *
   93  * Permission to use, copy, modify, and distribute this software for any
   94  * purpose with or without fee is hereby granted, provided that the above
   95  * copyright notice and this permission notice appear in all copies.
   96  *
   97  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   98  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   99  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  100  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  101  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  102  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  103  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  104  */
  105 #include <sys/cdefs.h>
  106 __FBSDID("$FreeBSD$");
  107 
  108 #include "opt_wlan.h"
  109 #include "opt_iwm.h"
  110 
  111 #include <sys/param.h>
  112 #include <sys/bus.h>
  113 #include <sys/conf.h>
  114 #include <sys/endian.h>
  115 #include <sys/firmware.h>
  116 #include <sys/kernel.h>
  117 #include <sys/malloc.h>
  118 #include <sys/mbuf.h>
  119 #include <sys/mutex.h>
  120 #include <sys/module.h>
  121 #include <sys/proc.h>
  122 #include <sys/rman.h>
  123 #include <sys/socket.h>
  124 #include <sys/sockio.h>
  125 #include <sys/sysctl.h>
  126 #include <sys/linker.h>
  127 
  128 #include <machine/bus.h>
  129 #include <machine/endian.h>
  130 #include <machine/resource.h>
  131 
  132 #include <dev/pci/pcivar.h>
  133 #include <dev/pci/pcireg.h>
  134 
  135 #include <net/bpf.h>
  136 
  137 #include <net/if.h>
  138 #include <net/if_var.h>
  139 #include <net/if_arp.h>
  140 #include <net/if_dl.h>
  141 #include <net/if_media.h>
  142 #include <net/if_types.h>
  143 
  144 #include <netinet/in.h>
  145 #include <netinet/in_systm.h>
  146 #include <netinet/if_ether.h>
  147 #include <netinet/ip.h>
  148 
  149 #include <net80211/ieee80211_var.h>
  150 #include <net80211/ieee80211_regdomain.h>
  151 #include <net80211/ieee80211_ratectl.h>
  152 #include <net80211/ieee80211_radiotap.h>
  153 
  154 #include <dev/iwm/if_iwmreg.h>
  155 #include <dev/iwm/if_iwmvar.h>
  156 #include <dev/iwm/if_iwm_debug.h>
  157 #include <dev/iwm/if_iwm_util.h>
  158 #include <dev/iwm/if_iwm_phy_ctxt.h>
  159 
  160 /*
  161  * BEGIN iwlwifi/mvm/phy-ctxt.c
  162  */
  163 
  164 /*
  165  * Construct the generic fields of the PHY context command
  166  */
  167 static void
  168 iwm_phy_ctxt_cmd_hdr(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
  169         struct iwm_phy_context_cmd *cmd, uint32_t action, uint32_t apply_time)
  170 {
  171         memset(cmd, 0, sizeof(struct iwm_phy_context_cmd));
  172 
  173         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_CMD,
  174             "%s: id=%d, colour=%d, action=%d, apply_time=%d\n",
  175             __func__,
  176             ctxt->id,
  177             ctxt->color,
  178             action,
  179             apply_time);
  180 
  181         cmd->id_and_color = htole32(IWM_FW_CMD_ID_AND_COLOR(ctxt->id,
  182             ctxt->color));
  183         cmd->action = htole32(action);
  184         cmd->apply_time = htole32(apply_time);
  185 }
  186 
  187 /*
  188  * Add the phy configuration to the PHY context command
  189  */
  190 static void
  191 iwm_phy_ctxt_cmd_data(struct iwm_softc *sc,
  192         struct iwm_phy_context_cmd *cmd, struct ieee80211_channel *chan,
  193         uint8_t chains_static, uint8_t chains_dynamic)
  194 {
  195         struct ieee80211com *ic = &sc->sc_ic;
  196         uint8_t active_cnt, idle_cnt;
  197 
  198         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_CMD,
  199             "%s: 2ghz=%d, channel=%d, chains static=0x%x, dynamic=0x%x, "
  200             "rx_ant=0x%x, tx_ant=0x%x\n",
  201             __func__,
  202             !! IEEE80211_IS_CHAN_2GHZ(chan),
  203             ieee80211_chan2ieee(ic, chan),
  204             chains_static,
  205             chains_dynamic,
  206             iwm_get_valid_rx_ant(sc),
  207             iwm_get_valid_tx_ant(sc));
  208 
  209 
  210         cmd->ci.band = IEEE80211_IS_CHAN_2GHZ(chan) ?
  211             IWM_PHY_BAND_24 : IWM_PHY_BAND_5;
  212 
  213         cmd->ci.channel = ieee80211_chan2ieee(ic, chan);
  214         cmd->ci.width = IWM_PHY_VHT_CHANNEL_MODE20;
  215         cmd->ci.ctrl_pos = IWM_PHY_VHT_CTRL_POS_1_BELOW;
  216 
  217         /* Set rx the chains */
  218         idle_cnt = chains_static;
  219         active_cnt = chains_dynamic;
  220 
  221         /* In scenarios where we only ever use a single-stream rates,
  222          * i.e. legacy 11b/g/a associations, single-stream APs or even
  223          * static SMPS, enable both chains to get diversity, improving
  224          * the case where we're far enough from the AP that attenuation
  225          * between the two antennas is sufficiently different to impact
  226          * performance.
  227          */
  228         if (active_cnt == 1 && iwm_rx_diversity_allowed(sc)) {
  229                 idle_cnt = 2;
  230                 active_cnt = 2;
  231         }
  232 
  233         cmd->rxchain_info = htole32(iwm_get_valid_rx_ant(sc) <<
  234                                         IWM_PHY_RX_CHAIN_VALID_POS);
  235         cmd->rxchain_info |= htole32(idle_cnt << IWM_PHY_RX_CHAIN_CNT_POS);
  236         cmd->rxchain_info |= htole32(active_cnt <<
  237             IWM_PHY_RX_CHAIN_MIMO_CNT_POS);
  238 
  239         cmd->txchain_info = htole32(iwm_get_valid_tx_ant(sc));
  240 }
  241 
  242 /*
  243  * Send a command
  244  * only if something in the configuration changed: in case that this is the
  245  * first time that the phy configuration is applied or in case that the phy
  246  * configuration changed from the previous apply.
  247  */
  248 static int
  249 iwm_phy_ctxt_apply(struct iwm_softc *sc,
  250         struct iwm_phy_ctxt *ctxt,
  251         uint8_t chains_static, uint8_t chains_dynamic,
  252         uint32_t action, uint32_t apply_time)
  253 {
  254         struct iwm_phy_context_cmd cmd;
  255         int ret;
  256 
  257         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_CMD,
  258             "%s: called; channel=%p\n",
  259             __func__,
  260             ctxt->channel);
  261 
  262         /* Set the command header fields */
  263         iwm_phy_ctxt_cmd_hdr(sc, ctxt, &cmd, action, apply_time);
  264 
  265         /* Set the command data */
  266         iwm_phy_ctxt_cmd_data(sc, &cmd, ctxt->channel,
  267             chains_static, chains_dynamic);
  268 
  269         ret = iwm_send_cmd_pdu(sc, IWM_PHY_CONTEXT_CMD, IWM_CMD_SYNC,
  270             sizeof(struct iwm_phy_context_cmd), &cmd);
  271         if (ret) {
  272                 device_printf(sc->sc_dev,
  273                     "PHY ctxt cmd error. ret=%d\n", ret);
  274         }
  275         return ret;
  276 }
  277 
  278 /*
  279  * Send a command to add a PHY context based on the current HW configuration.
  280  */
  281 int
  282 iwm_phy_ctxt_add(struct iwm_softc *sc, struct iwm_phy_ctxt *ctxt,
  283         struct ieee80211_channel *chan,
  284         uint8_t chains_static, uint8_t chains_dynamic)
  285 {
  286         ctxt->channel = chan;
  287 
  288         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_CMD,
  289             "%s: called; channel=%d\n",
  290             __func__,
  291             ieee80211_chan2ieee(&sc->sc_ic, chan));
  292 
  293         return iwm_phy_ctxt_apply(sc, ctxt,
  294             chains_static, chains_dynamic, IWM_FW_CTXT_ACTION_ADD, 0);
  295 }
  296 
  297 /*
  298  * Send a command to modify the PHY context based on the current HW
  299  * configuration. Note that the function does not check that the configuration
  300  * changed.
  301  */
  302 int
  303 iwm_phy_ctxt_changed(struct iwm_softc *sc,
  304         struct iwm_phy_ctxt *ctxt, struct ieee80211_channel *chan,
  305         uint8_t chains_static, uint8_t chains_dynamic)
  306 {
  307         ctxt->channel = chan;
  308 
  309         IWM_DPRINTF(sc, IWM_DEBUG_RESET | IWM_DEBUG_CMD,
  310             "%s: called; channel=%d\n",
  311             __func__,
  312             ieee80211_chan2ieee(&sc->sc_ic, chan));
  313 
  314         return iwm_phy_ctxt_apply(sc, ctxt,
  315             chains_static, chains_dynamic, IWM_FW_CTXT_ACTION_MODIFY, 0);
  316 }
  317 
  318 /*
  319  * END iwlwifi/mvm/phy-ctxt.c
  320  */

Cache object: 85858bc9cd42c79186a43acf7a8f3412


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.