From: Dan Carpenter <dan.carpenter@linaro.org>
To: Wesley Cheng <quic_wcheng@quicinc.com>
Cc: linux-sound@vger.kernel.org
Subject: [bug report] ALSA: usb-audio: qcom: Introduce QC USB SND offloading support
Date: Tue, 15 Apr 2025 13:27:52 +0300 [thread overview]
Message-ID: <Z_40qL4JnyjR4j0O@stanley.mountain> (raw)
Hello Wesley Cheng,
Commit 326bbc348298 ("ALSA: usb-audio: qcom: Introduce QC USB SND
offloading support") from Apr 9, 2025 (linux-next), leads to the
following Smatch static checker warning:
sound/usb/qcom/qc_audio_offload.c:1364 prepare_qmi_response()
warn: missing error code here? 'snd_soc_usb_find_priv_data()' failed. 'ret' = '0'
sound/usb/qcom/qc_audio_offload.c
1335 static int prepare_qmi_response(struct snd_usb_substream *subs,
1336 struct qmi_uaudio_stream_req_msg_v01 *req_msg,
1337 struct qmi_uaudio_stream_resp_msg_v01 *resp,
1338 int info_idx)
1339 {
1340 struct q6usb_offload *data;
1341 int pcm_dev_num;
1342 int card_num;
1343 u8 *xfer_buf = NULL;
1344 int ret;
1345
1346 pcm_dev_num = (req_msg->usb_token & QMI_STREAM_REQ_DEV_NUM_MASK) >> 8;
1347 card_num = (req_msg->usb_token & QMI_STREAM_REQ_CARD_NUM_MASK) >> 16;
1348
1349 if (!uadev[card_num].ctrl_intf) {
1350 dev_err(&subs->dev->dev, "audio ctrl intf info not cached\n");
1351 ret = -ENODEV;
1352 goto err;
1353 }
1354
1355 ret = uaudio_populate_uac_desc(subs, resp);
1356 if (ret < 0)
1357 goto err;
1358
1359 resp->slot_id = subs->dev->slot_id;
1360 resp->slot_id_valid = 1;
1361
1362 data = snd_soc_usb_find_priv_data(uaudio_qdev->auxdev->dev.parent);
1363 if (!data)
--> 1364 goto err;
error code? It's probably better to return directly because it often
helps avoid "forgot set the error code" bugs. Also it's more readable.
1365
1366 uaudio_qdev->data = data;
1367
1368 resp->std_as_opr_intf_desc_valid = 1;
1369 ret = uaudio_endpoint_setup(subs, subs->data_endpoint, card_num,
1370 &resp->xhci_mem_info.tr_data,
1371 &resp->std_as_data_ep_desc);
1372 if (ret < 0)
1373 goto err;
1374
1375 resp->std_as_data_ep_desc_valid = 1;
1376
1377 if (subs->sync_endpoint) {
1378 ret = uaudio_endpoint_setup(subs, subs->sync_endpoint, card_num,
1379 &resp->xhci_mem_info.tr_sync,
1380 &resp->std_as_sync_ep_desc);
1381 if (ret < 0)
1382 goto drop_data_ep;
1383
1384 resp->std_as_sync_ep_desc_valid = 1;
1385 }
1386
1387 resp->interrupter_num_valid = 1;
1388 resp->controller_num_valid = 0;
1389 ret = usb_get_controller_id(subs->dev);
1390 if (ret >= 0) {
1391 resp->controller_num = ret;
1392 resp->controller_num_valid = 1;
1393 }
1394
1395 /* event ring */
1396 ret = uaudio_event_ring_setup(subs, card_num,
1397 &resp->xhci_mem_info.evt_ring);
1398 if (ret < 0)
1399 goto drop_sync_ep;
1400
1401 uaudio_qdev->er_mapped = true;
1402 resp->interrupter_num = xhci_sideband_interrupter_id(uadev[card_num].sb);
1403
1404 resp->speed_info = get_speed_info(subs->dev->speed);
1405 if (resp->speed_info == USB_QMI_DEVICE_SPEED_INVALID_V01) {
1406 ret = -ENODEV;
1407 goto free_sec_ring;
1408 }
1409
1410 resp->speed_info_valid = 1;
1411
1412 ret = uaudio_transfer_buffer_setup(subs, xfer_buf, req_msg->xfer_buff_size,
1413 &resp->xhci_mem_info.xfer_buff);
1414 if (ret < 0) {
1415 ret = -ENOMEM;
1416 goto free_sec_ring;
1417 }
1418
1419 resp->xhci_mem_info_valid = 1;
1420
1421 if (!atomic_read(&uadev[card_num].in_use)) {
1422 kref_init(&uadev[card_num].kref);
1423 init_waitqueue_head(&uadev[card_num].disconnect_wq);
1424 uadev[card_num].num_intf =
1425 subs->dev->config->desc.bNumInterfaces;
1426 uadev[card_num].info = kcalloc(uadev[card_num].num_intf,
1427 sizeof(struct intf_info),
1428 GFP_KERNEL);
1429 if (!uadev[card_num].info) {
1430 ret = -ENOMEM;
1431 goto unmap_er;
1432 }
1433 uadev[card_num].udev = subs->dev;
1434 atomic_set(&uadev[card_num].in_use, 1);
1435 } else {
1436 kref_get(&uadev[card_num].kref);
1437 }
1438
1439 uadev[card_num].usb_core_id = resp->controller_num;
1440
1441 /* cache intf specific info to use it for unmap and free xfer buf */
1442 uadev[card_num].info[info_idx].data_xfer_ring_va =
1443 IOVA_MASK(resp->xhci_mem_info.tr_data.va);
1444 uadev[card_num].info[info_idx].data_xfer_ring_size = PAGE_SIZE;
1445 uadev[card_num].info[info_idx].sync_xfer_ring_va =
1446 IOVA_MASK(resp->xhci_mem_info.tr_sync.va);
1447 uadev[card_num].info[info_idx].sync_xfer_ring_size = PAGE_SIZE;
1448 uadev[card_num].info[info_idx].xfer_buf_va =
1449 IOVA_MASK(resp->xhci_mem_info.xfer_buff.va);
1450 uadev[card_num].info[info_idx].xfer_buf_pa =
1451 resp->xhci_mem_info.xfer_buff.pa;
1452 uadev[card_num].info[info_idx].xfer_buf_size =
1453 resp->xhci_mem_info.xfer_buff.size;
1454 uadev[card_num].info[info_idx].data_ep_pipe = subs->data_endpoint ?
1455 subs->data_endpoint->pipe : 0;
1456 uadev[card_num].info[info_idx].sync_ep_pipe = subs->sync_endpoint ?
1457 subs->sync_endpoint->pipe : 0;
1458 uadev[card_num].info[info_idx].data_ep_idx = subs->data_endpoint ?
1459 subs->data_endpoint->ep_num : 0;
1460 uadev[card_num].info[info_idx].sync_ep_idx = subs->sync_endpoint ?
1461 subs->sync_endpoint->ep_num : 0;
1462 uadev[card_num].info[info_idx].xfer_buf = xfer_buf;
1463 uadev[card_num].info[info_idx].pcm_card_num = card_num;
1464 uadev[card_num].info[info_idx].pcm_dev_num = pcm_dev_num;
1465 uadev[card_num].info[info_idx].direction = subs->direction;
1466 uadev[card_num].info[info_idx].intf_num = subs->cur_audiofmt->iface;
1467 uadev[card_num].info[info_idx].in_use = true;
1468
1469 set_bit(card_num, &uaudio_qdev->card_slot);
1470
1471 return 0;
1472
1473 unmap_er:
1474 uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE, PAGE_SIZE);
1475 free_sec_ring:
1476 xhci_sideband_remove_interrupter(uadev[card_num].sb);
1477 drop_sync_ep:
1478 if (subs->sync_endpoint) {
1479 uaudio_iommu_unmap(MEM_XFER_RING,
1480 IOVA_MASK(resp->xhci_mem_info.tr_sync.va),
1481 PAGE_SIZE, PAGE_SIZE);
1482 xhci_sideband_remove_endpoint(uadev[card_num].sb,
1483 usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe));
1484 }
1485 drop_data_ep:
1486 uaudio_iommu_unmap(MEM_XFER_RING, IOVA_MASK(resp->xhci_mem_info.tr_data.va),
1487 PAGE_SIZE, PAGE_SIZE);
1488 xhci_sideband_remove_endpoint(uadev[card_num].sb,
1489 usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe));
1490
1491 err:
1492 return ret;
1493 }
regards,
dan carpenter
next reply other threads:[~2025-04-15 10:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-15 10:27 Dan Carpenter [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-04-15 10:45 [bug report] ALSA: usb-audio: qcom: Introduce QC USB SND offloading support Dan Carpenter
2025-04-15 10:46 Dan Carpenter
2025-04-15 10:46 Dan Carpenter
2025-04-15 10:47 Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z_40qL4JnyjR4j0O@stanley.mountain \
--to=dan.carpenter@linaro.org \
--cc=linux-sound@vger.kernel.org \
--cc=quic_wcheng@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox