Re: [PATCH v1 4/4] Bluetooth: hci_qca: Add HCI command timeout handling

From: kbuild test robot
Date: Thu Dec 26 2019 - 18:33:24 EST


Hi Rocky,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth-next/master]
[also build test WARNING on linux/master linus/master v5.5-rc3 next-20191220]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Rocky-Liao/Bluetooth-hci_qca-Add-QCA-Rome-power-off-support-to-the-qca_power_off/20191226-050217
base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
reproduce:
# apt-get install sparse
# sparse version: v0.6.1-129-g341daf20-dirty
make ARCH=x86_64 allmodconfig
make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)

drivers/bluetooth/hci_qca.c:1504:9: sparse: sparse: no member 'cmd_timeout_cnt' in struct qca_data
drivers/bluetooth/hci_qca.c:1506:16: sparse: sparse: no member 'cmd_timeout_cnt' in struct qca_data
>> drivers/bluetooth/hci_qca.c:1346:35: sparse: sparse: incorrect type in assignment (incompatible argument 1 (different base types))
>> drivers/bluetooth/hci_qca.c:1346:35: sparse: expected void ( *cmd_timeout )( ... )
>> drivers/bluetooth/hci_qca.c:1346:35: sparse: got void ( * )( ... )
drivers/bluetooth/hci_qca.c:1347:20: sparse: sparse: no member 'cmd_timeout_cnt' in struct qca_data

vim +1346 drivers/bluetooth/hci_qca.c

1264
1265 static int qca_setup(struct hci_uart *hu)
1266 {
1267 struct hci_dev *hdev = hu->hdev;
1268 struct qca_data *qca = hu->priv;
1269 struct qca_serdev *qcadev;
1270 unsigned int speed, qca_baudrate = QCA_BAUDRATE_115200;
1271 unsigned int init_retry_count = 0;
1272 enum qca_btsoc_type soc_type = qca_soc_type(hu);
1273 const char *firmware_name = qca_get_firmware_name(hu);
1274 int ret;
1275 int soc_ver = 0;
1276
1277 ret = qca_check_speeds(hu);
1278 if (ret)
1279 return ret;
1280
1281 /* Patch downloading has to be done without IBS mode */
1282 clear_bit(QCA_IBS_ENABLED, &qca->flags);
1283
1284 /* Enable controller to do both LE scan and BR/EDR inquiry
1285 * simultaneously.
1286 */
1287 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
1288
1289 retry:
1290 if (qca_is_wcn399x(soc_type)) {
1291 bt_dev_info(hdev, "setting up wcn3990");
1292
1293 /* Enable NON_PERSISTENT_SETUP QUIRK to ensure to execute
1294 * setup for every hci up.
1295 */
1296 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
1297 set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
1298 hu->hdev->shutdown = qca_power_off;
1299 ret = qca_wcn3990_init(hu);
1300 if (ret)
1301 return ret;
1302
1303 ret = qca_read_soc_version(hdev, &soc_ver, soc_type);
1304 if (ret)
1305 return ret;
1306 } else {
1307 bt_dev_info(hdev, "ROME setup");
1308 if (hu->serdev) {
1309 /* Enable NON_PERSISTENT_SETUP QUIRK to ensure to
1310 * execute setup for every hci up.
1311 */
1312 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
1313 hu->hdev->shutdown = qca_power_off;
1314 qcadev = serdev_device_get_drvdata(hu->serdev);
1315 gpiod_set_value_cansleep(qcadev->bt_en, 1);
1316 /* Controller needs time to bootup. */
1317 msleep(150);
1318 }
1319 qca_set_speed(hu, QCA_INIT_SPEED);
1320 }
1321
1322 /* Setup user speed if needed */
1323 speed = qca_get_speed(hu, QCA_OPER_SPEED);
1324 if (speed) {
1325 ret = qca_set_speed(hu, QCA_OPER_SPEED);
1326 if (ret)
1327 return ret;
1328
1329 qca_baudrate = qca_get_baudrate_value(speed);
1330 }
1331
1332 if (!qca_is_wcn399x(soc_type)) {
1333 /* Get QCA version information */
1334 ret = qca_read_soc_version(hdev, &soc_ver, soc_type);
1335 if (ret)
1336 return ret;
1337 }
1338
1339 bt_dev_info(hdev, "QCA controller version 0x%08x", soc_ver);
1340 /* Setup patch / NVM configurations */
1341 ret = qca_uart_setup(hdev, qca_baudrate, soc_type, soc_ver,
1342 firmware_name);
1343 if (!ret) {
1344 set_bit(QCA_IBS_ENABLED, &qca->flags);
1345 qca_debugfs_init(hdev);
> 1346 hdev->cmd_timeout = qca_cmd_timeout;
1347 qca->cmd_timeout_cnt = 0;
1348 } else if (ret == -ENOENT) {
1349 /* No patch/nvm-config found, run with original fw/config */
1350 ret = 0;
1351 } else if (ret == -EAGAIN) {
1352 /*
1353 * Userspace firmware loader will return -EAGAIN in case no
1354 * patch/nvm-config is found, so run with original fw/config.
1355 */
1356 ret = 0;
1357 } else {
1358 if (init_retry_count < QCA_MAX_INIT_RETRY_COUNT) {
1359 qca_power_off(hdev);
1360 if (hu->serdev) {
1361 serdev_device_close(hu->serdev);
1362 ret = serdev_device_open(hu->serdev);
1363 if (ret) {
1364 bt_dev_err(hu->hdev, "open port fail");
1365 return ret;
1366 }
1367 }
1368 init_retry_count++;
1369 goto retry;
1370 }
1371 }
1372
1373 /* Setup bdaddr */
1374 if (qca_is_wcn399x(soc_type))
1375 hu->hdev->set_bdaddr = qca_set_bdaddr;
1376 else
1377 hu->hdev->set_bdaddr = qca_set_bdaddr_rome;
1378
1379 return ret;
1380 }
1381
1382 static const struct hci_uart_proto qca_proto = {
1383 .id = HCI_UART_QCA,
1384 .name = "QCA",
1385 .manufacturer = 29,
1386 .init_speed = 115200,
1387 .oper_speed = 3000000,
1388 .open = qca_open,
1389 .close = qca_close,
1390 .flush = qca_flush,
1391 .setup = qca_setup,
1392 .recv = qca_recv,
1393 .enqueue = qca_enqueue,
1394 .dequeue = qca_dequeue,
1395 };
1396
1397 static const struct qca_vreg_data qca_soc_data_wcn3990 = {
1398 .soc_type = QCA_WCN3990,
1399 .vregs = (struct qca_vreg []) {
1400 { "vddio", 15000 },
1401 { "vddxo", 80000 },
1402 { "vddrf", 300000 },
1403 { "vddch0", 450000 },
1404 },
1405 .num_vregs = 4,
1406 };
1407
1408 static const struct qca_vreg_data qca_soc_data_wcn3991 = {
1409 .soc_type = QCA_WCN3991,
1410 .vregs = (struct qca_vreg []) {
1411 { "vddio", 15000 },
1412 { "vddxo", 80000 },
1413 { "vddrf", 300000 },
1414 { "vddch0", 450000 },
1415 },
1416 .num_vregs = 4,
1417 };
1418
1419 static const struct qca_vreg_data qca_soc_data_wcn3998 = {
1420 .soc_type = QCA_WCN3998,
1421 .vregs = (struct qca_vreg []) {
1422 { "vddio", 10000 },
1423 { "vddxo", 80000 },
1424 { "vddrf", 300000 },
1425 { "vddch0", 450000 },
1426 },
1427 .num_vregs = 4,
1428 };
1429
1430 static void qca_power_shutdown(struct hci_uart *hu)
1431 {
1432 struct qca_serdev *qcadev;
1433 struct qca_data *qca = hu->priv;
1434 unsigned long flags;
1435
1436 qcadev = serdev_device_get_drvdata(hu->serdev);
1437
1438 /* From this point we go into power off state. But serial port is
1439 * still open, stop queueing the IBS data and flush all the buffered
1440 * data in skb's.
1441 */
1442 spin_lock_irqsave(&qca->hci_ibs_lock, flags);
1443 clear_bit(QCA_IBS_ENABLED, &qca->flags);
1444 qca_flush(hu);
1445 spin_unlock_irqrestore(&qca->hci_ibs_lock, flags);
1446
1447 host_set_baudrate(hu, 2400);
1448 qca_send_power_pulse(hu, false);
1449 qca_regulator_disable(qcadev);
1450 }
1451
1452 static int qca_power_off(struct hci_dev *hdev)
1453 {
1454 struct hci_uart *hu = hci_get_drvdata(hdev);
1455 struct qca_serdev *qcadev;
1456 enum qca_btsoc_type soc_type = qca_soc_type(hu);
1457
1458 if (qca_is_wcn399x(soc_type)) {
1459 /* Perform pre shutdown command */
1460 qca_send_pre_shutdown_cmd(hdev);
1461
1462 usleep_range(8000, 10000);
1463
1464 qca_power_shutdown(hu);
1465 } else {
1466 if (hu->serdev) {
1467 qcadev = serdev_device_get_drvdata(hu->serdev);
1468
1469 gpiod_set_value_cansleep(qcadev->bt_en, 0);
1470
1471 usleep_range(8000, 10000);
1472 }
1473 }
1474
1475 return 0;
1476 }
1477
1478 static int qca_send_btsoc_dump_cmd(struct hci_uart *hu)
1479 {
1480 int err = 0;
1481 struct sk_buff *skb = NULL;
1482 struct qca_data *qca = hu->priv;
1483
1484 BT_DBG("hu %p sending btsoc dump command", hu);
1485
1486 skb = bt_skb_alloc(1, GFP_ATOMIC);
1487 if (!skb) {
1488 BT_ERR("Failed to allocate memory for qca dump command");
1489 return -ENOMEM;
1490 }
1491
1492 skb_put_u8(skb, QCA_BTSOC_DUMP_CMD);
1493
1494 skb_queue_tail(&qca->txq, skb);
1495
1496 return err;
1497 }
1498
1499
1500 static void qca_cmd_timeout(struct hci_uart *hu)
1501 {
1502 struct qca_data *qca = hu->priv;
1503
> 1504 BT_ERR("hu %p hci cmd timeout count=0x%x", hu, ++qca->cmd_timeout_cnt);
1505
1506 if (qca->cmd_timeout_cnt >= QCA_MAX_CMD_TIMEOUT_COUNT)
1507 qca_send_btsoc_dump_cmd(hu);
1508 }
1509

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