[bug report] Bluetooth: hci_qca: Retry btsoc initialize when it fails

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

 



Hello Rocky Liao,

The patch bb2500ab0270: "Bluetooth: hci_qca: Retry btsoc initialize
when it fails" from Jan 15, 2020, leads to the following static
checker warning:

	drivers/bluetooth/hci_qca.c:1624 qca_setup()
	warn: variable dereferenced before check 'hu->serdev' (see line 1623)

	drivers/bluetooth/hci_qca.c:1718 qca_power_shutdown()
	warn: variable dereferenced before check 'hu->serdev' (see line 1701)

drivers/bluetooth/hci_qca.c
  1615                  ret = 0;
  1616          } else {
  1617                  if (retries < MAX_INIT_RETRIES) {
  1618                          qca_power_shutdown(hu);
                                ^^^^^^^^^^^^^^^^^^^^^^
Dereferenced inside function

  1619                          if (hu->serdev) {
                                    ^^^^^^^^^^
Too late.

  1620                                  serdev_device_close(hu->serdev);
  1621                                  ret = serdev_device_open(hu->serdev);
  1622                                  if (ret) {
  1623                                          bt_dev_err(hdev, "failed to open port");
  1624                                          return ret;
  1625                                  }
  1626                          }
  1627                          retries++;
  1628                          goto retry;
  1629                  }
  1630          }

[ snip ]

  1689  static void qca_power_shutdown(struct hci_uart *hu)
  1690  {
  1691          struct qca_serdev *qcadev;
  1692          struct qca_data *qca = hu->priv;
  1693          unsigned long flags;
  1694          enum qca_btsoc_type soc_type = qca_soc_type(hu);
  1695  
  1696          qcadev = serdev_device_get_drvdata(hu->serdev);
                                                   ^^^^^^^^^^
Deref.

  1697  
  1698          /* From this point we go into power off state. But serial port is
  1699           * still open, stop queueing the IBS data and flush all the buffered
  1700           * data in skb's.
  1701           */
  1702          spin_lock_irqsave(&qca->hci_ibs_lock, flags);
  1703          clear_bit(QCA_IBS_ENABLED, &qca->flags);
  1704          qca_flush(hu);
  1705          spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
  1706  
  1707          hu->hdev->hw_error = NULL;
  1708          hu->hdev->cmd_timeout = NULL;
  1709  
  1710          /* Non-serdev device usually is powered by external power
  1711           * and don't need additional action in driver for power down
  1712           */
  1713          if (!hu->serdev)
                     ^^^^^^^^^^
Too late.

  1714                  return;
  1715  
  1716          if (qca_is_wcn399x(soc_type)) {
  1717                  host_set_baudrate(hu, 2400);
  1718                  qca_send_power_pulse(hu, false);
  1719                  qca_regulator_disable(qcadev);
  1720          } else {
  1721                  gpiod_set_value_cansleep(qcadev->bt_en, 0);
  1722          }
  1723  }

regards,
dan carpenter



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux