Search Linux Wireless

[bug report] wcn36xx: Transition driver to SMD client

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Bjorn Andersson,

Commit f303a9311065 ("wcn36xx: Transition driver to SMD client") from
Jan 11, 2017 (linux-next), leads to the following Smatch static
checker warning:

drivers/net/wireless/ath/wcn36xx/main.c:1616 wcn36xx_probe() warn: 'wcn->smd_channel' is not an error pointer
drivers/bluetooth/btqcomsmd.c:155 btqcomsmd_probe() warn: 'btq->acl_channel' is not an error pointer
drivers/bluetooth/btqcomsmd.c:160 btqcomsmd_probe() warn: 'btq->cmd_channel' is not an error pointer

drivers/net/wireless/ath/wcn36xx/main.c
    1557 static int wcn36xx_probe(struct platform_device *pdev)
    1558 {
    1559         struct ieee80211_hw *hw;
    1560         struct wcn36xx *wcn;
    1561         void *wcnss;
    1562         int ret;
    1563         const u8 *addr;
    1564         int n_channels;
    1565 
    1566         wcn36xx_dbg(WCN36XX_DBG_MAC, "platform probe\n");
    1567 
    1568         wcnss = dev_get_drvdata(pdev->dev.parent);
    1569 
    1570         hw = ieee80211_alloc_hw(sizeof(struct wcn36xx), &wcn36xx_ops);
    1571         if (!hw) {
    1572                 wcn36xx_err("failed to alloc hw\n");
    1573                 ret = -ENOMEM;
    1574                 goto out_err;
    1575         }
    1576         platform_set_drvdata(pdev, hw);
    1577         wcn = hw->priv;
    1578         wcn->hw = hw;
    1579         wcn->dev = &pdev->dev;
    1580         wcn->first_boot = true;
    1581         mutex_init(&wcn->conf_mutex);
    1582         mutex_init(&wcn->hal_mutex);
    1583         mutex_init(&wcn->scan_lock);
    1584         __skb_queue_head_init(&wcn->amsdu);
    1585 
    1586         wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
    1587         if (!wcn->hal_buf) {
    1588                 ret = -ENOMEM;
    1589                 goto out_wq;
    1590         }
    1591 
    1592         n_channels = wcn_band_2ghz.n_channels + wcn_band_5ghz.n_channels;
    1593         wcn->chan_survey = devm_kcalloc(wcn->dev,
    1594                                         n_channels,
    1595                                         sizeof(struct wcn36xx_chan_survey),
    1596                                         GFP_KERNEL);
    1597         if (!wcn->chan_survey) {
    1598                 ret = -ENOMEM;
    1599                 goto out_wq;
    1600         }
    1601 
    1602         ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32));
    1603         if (ret < 0) {
    1604                 wcn36xx_err("failed to set DMA mask: %d\n", ret);
    1605                 goto out_wq;
    1606         }
    1607 
    1608         wcn->nv_file = WLAN_NV_FILE;
    1609         ret = of_property_read_string(wcn->dev->parent->of_node, "firmware-name", &wcn->nv_file);
    1610         if (ret < 0 && ret != -EINVAL) {
    1611                 wcn36xx_err("failed to read \"firmware-name\" property: %d\n", ret);
    1612                 goto out_wq;
    1613         }
    1614 
    1615         wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw);
--> 1616         if (IS_ERR(wcn->smd_channel)) {

qcom_wcnss_open_channel() only returns error pointers if
CONFIG_QCOM_WCNSS_CTRL is disabled.  I guess this is a COMPILE_TEST
thing?  Normally it would be the reverse way where functions return
error pointers on error for real errors and NULL for COMPILE_TEST of
if the feature is optional.

    1617                 wcn36xx_err("failed to open WLAN_CTRL channel\n");
    1618                 ret = PTR_ERR(wcn->smd_channel);
    1619                 goto out_wq;
    1620         }
    1621 
    1622         addr = of_get_property(pdev->dev.of_node, "local-mac-address", &ret);
    1623         if (addr && ret != ETH_ALEN) {
    1624                 wcn36xx_err("invalid local-mac-address\n");
    1625                 ret = -EINVAL;
    1626                 goto out_destroy_ept;
    1627         } else if (addr) {
    1628                 wcn36xx_info("mac address: %pM\n", addr);
    1629                 SET_IEEE80211_PERM_ADDR(wcn->hw, addr);
    1630         }
    1631 
    1632         ret = wcn36xx_platform_get_resources(wcn, pdev);
    1633         if (ret)
    1634                 goto out_destroy_ept;
    1635 
    1636         wcn36xx_init_ieee80211(wcn);
    1637         ret = ieee80211_register_hw(wcn->hw);
    1638         if (ret)
    1639                 goto out_unmap;
    1640 
    1641         return 0;
    1642 
    1643 out_unmap:
    1644         iounmap(wcn->ccu_base);
    1645         iounmap(wcn->dxe_base);
    1646 out_destroy_ept:
    1647         rpmsg_destroy_ept(wcn->smd_channel);
    1648 out_wq:
    1649         ieee80211_free_hw(hw);
    1650 out_err:
    1651         return ret;
    1652 }

regards,
dan carpenter




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux