Linux Sound subsystem development
 help / color / mirror / Atom feed
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

             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