Hi Rafał,

I love your patch! Perhaps something to improve:

[auto build test WARNING on wireless-drivers-next/master]
[also build test WARNING on v4.17-rc6 next-20180517]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Rafa-Mi-ecki/brcmfmac-allow-specifying-features-per-firmware-version/20180523-160546
base:   
https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git 
master
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c:304:30: sparse: 
expression using sizeof(void)
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c:417:34: sparse: 
>> incorrect type in assignment (different base types) @@    expected 
>> restricted __le16 [usertype] it_len @@    got 6 [usertype] it_len @@
   drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c:417:34:    expected 
restricted __le16 [usertype] it_len
   drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c:417:34:    got 
unsigned long

vim +417 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c

   264  
   265  static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
   266                                             struct net_device *ndev)
   267  {
   268          int ret;
   269          struct brcmf_if *ifp = netdev_priv(ndev);
   270          struct brcmf_pub *drvr = ifp->drvr;
   271          struct ethhdr *eh;
   272          int head_delta;
   273  
   274          brcmf_dbg(DATA, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
   275  
   276          /* Can the device send data? */
   277          if (drvr->bus_if->state != BRCMF_BUS_UP) {
   278                  brcmf_err("xmit rejected state=%d\n", 
drvr->bus_if->state);
   279                  netif_stop_queue(ndev);
   280                  dev_kfree_skb(skb);
   281                  ret = -ENODEV;
   282                  goto done;
   283          }
   284  
   285          /* Some recent Broadcom's firmwares disassociate STA when they 
receive
   286           * an 802.11f ADD frame. This behavior can lead to a local DoS 
security
   287           * issue. Attacker may trigger disassociation of any STA by 
sending a
   288           * proper Ethernet frame to the wireless interface.
   289           *
   290           * Moreover this feature may break AP interfaces in some 
specific
   291           * setups. This applies e.g. to the bridge with hairpin mode 
enabled and
   292           * IFLA_BRPORT_MCAST_TO_UCAST set. IAPP packet generated by a 
firmware
   293           * will get passed back to the wireless interface and cause 
immediate
   294           * disassociation of a just-connected STA.
   295           */
   296          if (!drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
   297                  dev_kfree_skb(skb);
   298                  ret = -EINVAL;
   299                  goto done;
   300          }
   301  
   302          /* Make sure there's enough writeable headroom */
   303          if (skb_headroom(skb) < drvr->hdrlen || skb_header_cloned(skb)) 
{
 > 304                  head_delta = max_t(int, drvr->hdrlen - 
 > skb_headroom(skb), 0);
   305  
   306                  brcmf_dbg(INFO, "%s: insufficient headroom (%d)\n",
   307                            brcmf_ifname(ifp), head_delta);
   308                  atomic_inc(&drvr->bus_if->stats.pktcowed);
   309                  ret = pskb_expand_head(skb, ALIGN(head_delta, 
NET_SKB_PAD), 0,
   310                                         GFP_ATOMIC);
   311                  if (ret < 0) {
   312                          brcmf_err("%s: failed to expand headroom\n",
   313                                    brcmf_ifname(ifp));
   314                          atomic_inc(&drvr->bus_if->stats.pktcow_failed);
   315                          goto done;
   316                  }
   317          }
   318  
   319          /* validate length for ether packet */
   320          if (skb->len < sizeof(*eh)) {
   321                  ret = -EINVAL;
   322                  dev_kfree_skb(skb);
   323                  goto done;
   324          }
   325  
   326          eh = (struct ethhdr *)(skb->data);
   327  
   328          if (eh->h_proto == htons(ETH_P_PAE))
   329                  atomic_inc(&ifp->pend_8021x_cnt);
   330  
   331          /* determine the priority */
   332          if ((skb->priority == 0) || (skb->priority > 7))
   333                  skb->priority = cfg80211_classify8021d(skb, NULL);
   334  
   335          ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
   336          if (ret < 0)
   337                  brcmf_txfinalize(ifp, skb, false);
   338  
   339  done:
   340          if (ret) {
   341                  ndev->stats.tx_dropped++;
   342          } else {
   343                  ndev->stats.tx_packets++;
   344                  ndev->stats.tx_bytes += skb->len;
   345          }
   346  
   347          /* Return ok: we always eat the packet */
   348          return NETDEV_TX_OK;
   349  }
   350  
   351  void brcmf_txflowblock_if(struct brcmf_if *ifp,
   352                            enum brcmf_netif_stop_reason reason, bool 
state)
   353  {
   354          unsigned long flags;
   355  
   356          if (!ifp || !ifp->ndev)
   357                  return;
   358  
   359          brcmf_dbg(TRACE, "enter: bsscfgidx=%d stop=0x%X reason=%d 
state=%d\n",
   360                    ifp->bsscfgidx, ifp->netif_stop, reason, state);
   361  
   362          spin_lock_irqsave(&ifp->netif_stop_lock, flags);
   363          if (state) {
   364                  if (!ifp->netif_stop)
   365                          netif_stop_queue(ifp->ndev);
   366                  ifp->netif_stop |= reason;
   367          } else {
   368                  ifp->netif_stop &= ~reason;
   369                  if (!ifp->netif_stop)
   370                          netif_wake_queue(ifp->ndev);
   371          }
   372          spin_unlock_irqrestore(&ifp->netif_stop_lock, flags);
   373  }
   374  
   375  void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
   376  {
   377          /* Most of Broadcom's firmwares send 802.11f ADD frame every 
time a new
   378           * STA connects to the AP interface. This is an obsoleted 
standard most
   379           * users don't use, so don't pass these frames up unless 
requested.
   380           */
   381          if (!ifp->drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
   382                  brcmu_pkt_buf_free_skb(skb);
   383                  return;
   384          }
   385  
   386          if (skb->pkt_type == PACKET_MULTICAST)
   387                  ifp->ndev->stats.multicast++;
   388  
   389          if (!(ifp->ndev->flags & IFF_UP)) {
   390                  brcmu_pkt_buf_free_skb(skb);
   391                  return;
   392          }
   393  
   394          ifp->ndev->stats.rx_bytes += skb->len;
   395          ifp->ndev->stats.rx_packets++;
   396  
   397          brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol));
   398          if (in_interrupt())
   399                  netif_rx(skb);
   400          else
   401                  /* If the receive is not processed inside an ISR,
   402                   * the softirqd must be woken explicitly to service
   403                   * the NET_RX_SOFTIRQ.  This is handled by 
netif_rx_ni().
   404                   */
   405                  netif_rx_ni(skb);
   406  }
   407  
   408  void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)
   409  {
   410          if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MON_FMT_RADIOTAP)) {
   411                  /* Do nothing */
   412          } else {
   413                  struct ieee80211_radiotap_header *radiotap;
   414  
   415                  radiotap = skb_push(skb, sizeof(*radiotap));
   416                  memset(radiotap, 0, sizeof(*radiotap));
 > 417                  radiotap->it_len = sizeof(*radiotap);
   418  
   419                  /* TODO: what are these extra 4 bytes? */
   420                  skb->len -= 4;
   421          }
   422  
   423          skb->dev = ifp->ndev;
   424          skb_reset_mac_header(skb);
   425          skb->pkt_type = PACKET_OTHERHOST;
   426          skb->protocol = htons(ETH_P_802_2);
   427  
   428          brcmf_netif_rx(ifp, skb);
   429  }
   430  

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

Reply via email to