tree:   https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git pending
head:   49e3503004be11aa2538b9a443ea8b22d9a22631
commit: acdda8888c3414a63d4dc634ded50cc14f7f0ec4 [34/39] ath10k_sdio: high 
latency fixes for beacon buffer
config: i386-randconfig-c0-10060606 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4
reproduce:
        git checkout acdda8888c3414a63d4dc634ded50cc14f7f0ec4
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   drivers/net/wireless/ath/ath10k/mac.c: In function 'ath10k_add_interface':
>> drivers/net/wireless/ath/ath10k/mac.c:5062:26: warning: cast from pointer to 
>> integer of different size [-Wpointer-to-int-cast]
       arvif->beacon_paddr = (dma_addr_t)arvif->beacon_buf;
                             ^
   In file included from include/asm-generic/bug.h:4:0,
                    from arch/x86/include/asm/bug.h:81,
                    from include/linux/bug.h:4,
                    from include/net/mac80211.h:18,
                    from drivers/net/wireless/ath/ath10k/mac.h:21,
                    from drivers/net/wireless/ath/ath10k/mac.c:18:
   drivers/net/wireless/ath/ath10k/mac.c: At top level:
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'strcpy' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:421:2: note: in expansion of macro 'if'
     if (p_size == (size_t)-1 && q_size == (size_t)-1)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'kmemdup' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:411:2: note: in expansion of macro 'if'
     if (p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'kmemdup' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:409:2: note: in expansion of macro 'if'
     if (__builtin_constant_p(size) && p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memchr_inv' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:400:2: note: in expansion of macro 'if'
     if (p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memchr_inv' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:398:2: note: in expansion of macro 'if'
     if (__builtin_constant_p(size) && p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memchr' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:389:2: note: in expansion of macro 'if'
     if (p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memchr' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:387:2: note: in expansion of macro 'if'
     if (__builtin_constant_p(size) && p_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memcmp' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:379:2: note: in expansion of macro 'if'
     if (p_size < size || q_size < size)
     ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memcmp' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:376:3: note: in expansion of macro 'if'
      if (q_size < size)
      ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memcmp' which is not static
       ______f = {     \
       ^
   include/linux/compiler.h:154:23: note: in expansion of macro '__trace_if'
    #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
                          ^
   include/linux/string.h:374:3: note: in expansion of macro 'if'
      if (p_size < size)
      ^
   include/linux/compiler.h:162:4: warning: '______f' is static but declared in 
inline function 'memcmp' which is not static

vim +5062 drivers/net/wireless/ath/ath10k/mac.c

  4925  
  4926  /*
  4927   * TODO:
  4928   * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
  4929   * because we will send mgmt frames without CCK. This requirement
  4930   * for P2P_FIND/GO_NEG should be handled by checking CCK flag
  4931   * in the TX packet.
  4932   */
  4933  static int ath10k_add_interface(struct ieee80211_hw *hw,
  4934                                  struct ieee80211_vif *vif)
  4935  {
  4936          struct ath10k *ar = hw->priv;
  4937          struct ath10k_vif *arvif = (void *)vif->drv_priv;
  4938          struct ath10k_peer *peer;
  4939          enum wmi_sta_powersave_param param;
  4940          int ret = 0;
  4941          u32 value;
  4942          int bit;
  4943          int i;
  4944          u32 vdev_param;
  4945  
  4946          vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
  4947  
  4948          mutex_lock(&ar->conf_mutex);
  4949  
  4950          memset(arvif, 0, sizeof(*arvif));
  4951          ath10k_mac_txq_init(vif->txq);
  4952  
  4953          arvif->ar = ar;
  4954          arvif->vif = vif;
  4955  
  4956          INIT_LIST_HEAD(&arvif->list);
  4957          INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
  4958          INIT_DELAYED_WORK(&arvif->connection_loss_work,
  4959                            ath10k_mac_vif_sta_connection_loss_work);
  4960  
  4961          for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
  4962                  arvif->bitrate_mask.control[i].legacy = 0xffffffff;
  4963                  memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
  4964                         sizeof(arvif->bitrate_mask.control[i].ht_mcs));
  4965                  memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
  4966                         sizeof(arvif->bitrate_mask.control[i].vht_mcs));
  4967          }
  4968  
  4969          if (ar->num_peers >= ar->max_num_peers) {
  4970                  ath10k_warn(ar, "refusing vdev creation due to 
insufficient peer entry resources in firmware\n");
  4971                  ret = -ENOBUFS;
  4972                  goto err;
  4973          }
  4974  
  4975          if (ar->free_vdev_map == 0) {
  4976                  ath10k_warn(ar, "Free vdev map is empty, no more 
interfaces allowed.\n");
  4977                  ret = -EBUSY;
  4978                  goto err;
  4979          }
  4980          bit = __ffs64(ar->free_vdev_map);
  4981  
  4982          ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
  4983                     bit, ar->free_vdev_map);
  4984  
  4985          arvif->vdev_id = bit;
  4986          arvif->vdev_subtype =
  4987                  ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
  4988  
  4989          switch (vif->type) {
  4990          case NL80211_IFTYPE_P2P_DEVICE:
  4991                  arvif->vdev_type = WMI_VDEV_TYPE_STA;
  4992                  arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
  4993                                          (ar, 
WMI_VDEV_SUBTYPE_P2P_DEVICE);
  4994                  break;
  4995          case NL80211_IFTYPE_UNSPECIFIED:
  4996          case NL80211_IFTYPE_STATION:
  4997                  arvif->vdev_type = WMI_VDEV_TYPE_STA;
  4998                  if (vif->p2p)
  4999                          arvif->vdev_subtype = 
ath10k_wmi_get_vdev_subtype
  5000                                          (ar, 
WMI_VDEV_SUBTYPE_P2P_CLIENT);
  5001                  break;
  5002          case NL80211_IFTYPE_ADHOC:
  5003                  arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
  5004                  break;
  5005          case NL80211_IFTYPE_MESH_POINT:
  5006                  if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
  5007                          arvif->vdev_subtype = 
ath10k_wmi_get_vdev_subtype
  5008                                                  (ar, 
WMI_VDEV_SUBTYPE_MESH_11S);
  5009                  } else if (!test_bit(ATH10K_FLAG_RAW_MODE, 
&ar->dev_flags)) {
  5010                          ret = -EINVAL;
  5011                          ath10k_warn(ar, "must load driver with 
rawmode=1 to add mesh interfaces\n");
  5012                          goto err;
  5013                  }
  5014                  arvif->vdev_type = WMI_VDEV_TYPE_AP;
  5015                  break;
  5016          case NL80211_IFTYPE_AP:
  5017                  arvif->vdev_type = WMI_VDEV_TYPE_AP;
  5018  
  5019                  if (vif->p2p)
  5020                          arvif->vdev_subtype = 
ath10k_wmi_get_vdev_subtype
  5021                                                  (ar, 
WMI_VDEV_SUBTYPE_P2P_GO);
  5022                  break;
  5023          case NL80211_IFTYPE_MONITOR:
  5024                  arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
  5025                  break;
  5026          default:
  5027                  WARN_ON(1);
  5028                  break;
  5029          }
  5030  
  5031          /* Using vdev_id as queue number will make it very easy to do 
per-vif
  5032           * tx queue locking. This shouldn't wrap due to interface 
combinations
  5033           * but do a modulo for correctness sake and prevent using 
offchannel tx
  5034           * queues for regular vif tx.
  5035           */
  5036          vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
  5037          for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
  5038                  vif->hw_queue[i] = arvif->vdev_id % 
(IEEE80211_MAX_QUEUES - 1);
  5039  
  5040          /* Some firmware revisions don't wait for beacon tx completion 
before
  5041           * sending another SWBA event. This could lead to hardware 
using old
  5042           * (freed) beacon data in some cases, e.g. tx credit starvation
  5043           * combined with missed TBTT. This is very very rare.
  5044           *
  5045           * On non-IOMMU-enabled hosts this could be a possible security 
issue
  5046           * because hw could beacon some random data on the air.  On
  5047           * IOMMU-enabled hosts DMAR faults would occur in most cases 
and target
  5048           * device would crash.
  5049           *
  5050           * Since there are no beacon tx completions (implicit nor 
explicit)
  5051           * propagated to host the only workaround for this is to 
allocate a
  5052           * DMA-coherent buffer for a lifetime of a vif and use it for 
all
  5053           * beacon tx commands. Worst case for this approach is some 
beacons may
  5054           * become corrupted, e.g. have garbled IEs or out-of-date TIM 
bitmap.
  5055           */
  5056          if (vif->type == NL80211_IFTYPE_ADHOC ||
  5057              vif->type == NL80211_IFTYPE_MESH_POINT ||
  5058              vif->type == NL80211_IFTYPE_AP) {
  5059                  if (ar->is_high_latency) {
  5060                          arvif->beacon_buf = 
kmalloc(IEEE80211_MAX_FRAME_LEN,
  5061                                                      GFP_KERNEL);
> 5062                          arvif->beacon_paddr = 
> (dma_addr_t)arvif->beacon_buf;
  5063                  } else {
  5064                          arvif->beacon_buf =
  5065                                  dma_zalloc_coherent(ar->dev,
  5066                                                      
IEEE80211_MAX_FRAME_LEN,
  5067                                                      
&arvif->beacon_paddr,
  5068                                                      GFP_ATOMIC);
  5069                  }
  5070                  if (!arvif->beacon_buf) {
  5071                          ret = -ENOMEM;
  5072                          ath10k_warn(ar, "failed to allocate beacon 
buffer: %d\n",
  5073                                      ret);
  5074                          goto err;
  5075                  }
  5076          }
  5077          if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
  5078                  arvif->nohwcrypt = true;
  5079  
  5080          if (arvif->nohwcrypt &&
  5081              !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
  5082                  ath10k_warn(ar, "cryptmode module param needed for sw 
crypto\n");
  5083                  goto err;
  5084          }
  5085  
  5086          ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add 
interface) type %d subtype %d bcnmode %s\n",
  5087                     arvif->vdev_id, arvif->vdev_type, 
arvif->vdev_subtype,
  5088                     arvif->beacon_buf ? "single-buf" : "per-skb");
  5089  
  5090          ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, 
arvif->vdev_type,
  5091                                       arvif->vdev_subtype, vif->addr);
  5092          if (ret) {
  5093                  ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
  5094                              arvif->vdev_id, ret);
  5095                  goto err;
  5096          }
  5097  
  5098          ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
  5099          spin_lock_bh(&ar->data_lock);
  5100          list_add(&arvif->list, &ar->arvifs);
  5101          spin_unlock_bh(&ar->data_lock);
  5102  
  5103          /* It makes no sense to have firmware do keepalives. mac80211 
already
  5104           * takes care of this with idle connection polling.
  5105           */
  5106          ret = ath10k_mac_vif_disable_keepalive(arvif);
  5107          if (ret) {
  5108                  ath10k_warn(ar, "failed to disable keepalive on vdev 
%i: %d\n",
  5109                              arvif->vdev_id, ret);
  5110                  goto err_vdev_delete;
  5111          }
  5112  
  5113          arvif->def_wep_key_idx = -1;
  5114  
  5115          vdev_param = ar->wmi.vdev_param->tx_encap_type;
  5116          ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
  5117                                          ATH10K_HW_TXRX_NATIVE_WIFI);
  5118          /* 10.X firmware does not support this VDEV parameter. Do not 
warn */
  5119          if (ret && ret != -EOPNOTSUPP) {
  5120                  ath10k_warn(ar, "failed to set vdev %i TX 
encapsulation: %d\n",
  5121                              arvif->vdev_id, ret);
  5122                  goto err_vdev_delete;
  5123          }
  5124  
  5125          /* Configuring number of spatial stream for monitor interface 
is causing
  5126           * target assert in qca9888 and qca6174.
  5127           */
  5128          if (ar->cfg_tx_chainmask && (vif->type != 
NL80211_IFTYPE_MONITOR)) {
  5129                  u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
  5130  
  5131                  vdev_param = ar->wmi.vdev_param->nss;
  5132                  ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, 
vdev_param,
  5133                                                  nss);
  5134                  if (ret) {
  5135                          ath10k_warn(ar, "failed to set vdev %i 
chainmask 0x%x, nss %i: %d\n",
  5136                                      arvif->vdev_id, 
ar->cfg_tx_chainmask, nss,
  5137                                      ret);
  5138                          goto err_vdev_delete;
  5139                  }
  5140          }
  5141  
  5142          if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
  5143              arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
  5144                  ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
  5145                                           vif->addr, 
WMI_PEER_TYPE_DEFAULT);
  5146                  if (ret) {
  5147                          ath10k_warn(ar, "failed to create vdev %i peer 
for AP/IBSS: %d\n",
  5148                                      arvif->vdev_id, ret);
  5149                          goto err_vdev_delete;
  5150                  }
  5151  
  5152                  spin_lock_bh(&ar->data_lock);
  5153  
  5154                  peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
  5155                  if (!peer) {
  5156                          ath10k_warn(ar, "failed to lookup peer %pM on 
vdev %i\n",
  5157                                      vif->addr, arvif->vdev_id);
  5158                          spin_unlock_bh(&ar->data_lock);
  5159                          ret = -ENOENT;
  5160                          goto err_peer_delete;
  5161                  }
  5162  
  5163                  arvif->peer_id = find_first_bit(peer->peer_ids,
  5164                                                  
ATH10K_MAX_NUM_PEER_IDS);
  5165  
  5166                  spin_unlock_bh(&ar->data_lock);
  5167          } else {
  5168                  arvif->peer_id = HTT_INVALID_PEERID;
  5169          }
  5170  
  5171          if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
  5172                  ret = ath10k_mac_set_kickout(arvif);
  5173                  if (ret) {
  5174                          ath10k_warn(ar, "failed to set vdev %i kickout 
parameters: %d\n",
  5175                                      arvif->vdev_id, ret);
  5176                          goto err_peer_delete;
  5177                  }
  5178          }
  5179  
  5180          if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
  5181                  param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
  5182                  value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
  5183                  ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
  5184                                                    param, value);
  5185                  if (ret) {
  5186                          ath10k_warn(ar, "failed to set vdev %i RX wake 
policy: %d\n",
  5187                                      arvif->vdev_id, ret);
  5188                          goto err_peer_delete;
  5189                  }
  5190  
  5191                  ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
  5192                  if (ret) {
  5193                          ath10k_warn(ar, "failed to recalc ps wake 
threshold on vdev %i: %d\n",
  5194                                      arvif->vdev_id, ret);
  5195                          goto err_peer_delete;
  5196                  }
  5197  
  5198                  ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
  5199                  if (ret) {
  5200                          ath10k_warn(ar, "failed to recalc ps poll count 
on vdev %i: %d\n",
  5201                                      arvif->vdev_id, ret);
  5202                          goto err_peer_delete;
  5203                  }
  5204          }
  5205  
  5206          ret = ath10k_mac_set_txbf_conf(arvif);
  5207          if (ret) {
  5208                  ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
  5209                              arvif->vdev_id, ret);
  5210                  goto err_peer_delete;
  5211          }
  5212  
  5213          ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
  5214          if (ret) {
  5215                  ath10k_warn(ar, "failed to set rts threshold for vdev 
%d: %d\n",
  5216                              arvif->vdev_id, ret);
  5217                  goto err_peer_delete;
  5218          }
  5219  
  5220          arvif->txpower = vif->bss_conf.txpower;
  5221          ret = ath10k_mac_txpower_recalc(ar);
  5222          if (ret) {
  5223                  ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
  5224                  goto err_peer_delete;
  5225          }
  5226  
  5227          if (vif->type == NL80211_IFTYPE_MONITOR) {
  5228                  ar->monitor_arvif = arvif;
  5229                  ret = ath10k_monitor_recalc(ar);
  5230                  if (ret) {
  5231                          ath10k_warn(ar, "failed to recalc monitor: 
%d\n", ret);
  5232                          goto err_peer_delete;
  5233                  }
  5234          }
  5235  
  5236          spin_lock_bh(&ar->htt.tx_lock);
  5237          if (!ar->tx_paused)
  5238                  ieee80211_wake_queue(ar->hw, arvif->vdev_id);
  5239          spin_unlock_bh(&ar->htt.tx_lock);
  5240  
  5241          mutex_unlock(&ar->conf_mutex);
  5242          return 0;
  5243  
  5244  err_peer_delete:
  5245          if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
  5246              arvif->vdev_type == WMI_VDEV_TYPE_IBSS)
  5247                  ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
  5248  
  5249  err_vdev_delete:
  5250          ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
  5251          ar->free_vdev_map |= 1LL << arvif->vdev_id;
  5252          spin_lock_bh(&ar->data_lock);
  5253          list_del(&arvif->list);
  5254          spin_unlock_bh(&ar->data_lock);
  5255  
  5256  err:
  5257          if (arvif->beacon_buf) {
  5258                  if (ar->is_high_latency)
  5259                          kfree(arvif->beacon_buf);
  5260                  else
  5261                          dma_free_coherent(ar->dev, 
IEEE80211_MAX_FRAME_LEN,
  5262                                            arvif->beacon_buf,
  5263                                            arvif->beacon_paddr);
  5264                  arvif->beacon_buf = NULL;
  5265          }
  5266  
  5267          mutex_unlock(&ar->conf_mutex);
  5268  
  5269          return ret;
  5270  }
  5271  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

_______________________________________________
ath10k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath10k

Reply via email to