[alsa-devel] [PATCH] ALSA: line6: Always setup isochronous transfer properties
Andrej Kruták
dev at andree.sk
Mon Feb 6 22:54:59 CET 2017
On Mon, Feb 6, 2017 at 10:19 PM, Takashi Iwai <tiwai at suse.de> wrote:
> On Mon, 06 Feb 2017 20:34:58 +0100,
> Andrej Krutak wrote:
>>
>> While not all line6 devices currently support PCM, it causes no
>> harm to 'have it prepared'.
>>
>> This also fixes toneport, which only has PCM - in which case
>> we previously skipped the USB transfer properties detection completely.
>>
>> Signed-off-by: Andrej Krutak <dev at andree.sk>
>
> Well, this looks too complex and vague as a regression fix. If it
> were 4.10-rc1, I could take it. But now it's already rc7 and the next
> might be final, so I prefer a shorter and easier solution.
>
In the end, the patch is just "careful", so that the endpoint
structures are not read if the devices is not "marked" as having them.
> That said, we can revert the commit as a clear fix at first for 4.10
> (with Cc to stable), then take this on top as an enhancement for
> 4.11.
>
> Still it's important to know whether this works on Igor's system, so
> Igor, please give this one try.
>
Thanks to zero-init of toneport_properties_table, the proposed simple
revert should be enough for toneport, and shouldn't break other
devices (perhaps HD300-HD500 may start showing the dev_err from
line6_get_interval()).
So do as you like - e.g. simple revert for 4.10 and apply this patch
for 4.11. But I don't mind if you won't.... :-)
--
Andrej
>
>> ---
>> sound/usb/line6/driver.c | 49 ++++++++++++++++++++++++++----------------------
>> 1 file changed, 27 insertions(+), 22 deletions(-)
>>
>> diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
>> index 90009c0..0ff5a7d 100644
>> --- a/sound/usb/line6/driver.c
>> +++ b/sound/usb/line6/driver.c
>> @@ -492,42 +492,46 @@ static void line6_destruct(struct snd_card *card)
>> usb_put_dev(usbdev);
>> }
>>
>> -/* get data from endpoint descriptor (see usb_maxpacket): */
>> -static void line6_get_interval(struct usb_line6 *line6)
>> +static void line6_get_usb_properties(struct usb_line6 *line6)
>> {
>> struct usb_device *usbdev = line6->usbdev;
>> const struct line6_properties *properties = line6->properties;
>> int pipe;
>> - struct usb_host_endpoint *ep;
>> + struct usb_host_endpoint *ep = NULL;
>>
>> - if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
>> - pipe =
>> - usb_rcvintpipe(line6->usbdev, line6->properties->ep_ctrl_r);
>> - } else {
>> - pipe =
>> - usb_rcvbulkpipe(line6->usbdev, line6->properties->ep_ctrl_r);
>> + if (properties->capabilities & LINE6_CAP_CONTROL) {
>> + if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
>> + pipe = usb_rcvintpipe(line6->usbdev,
>> + line6->properties->ep_ctrl_r);
>> + } else {
>> + pipe = usb_rcvbulkpipe(line6->usbdev,
>> + line6->properties->ep_ctrl_r);
>> + }
>> + ep = usbdev->ep_in[usb_pipeendpoint(pipe)];
>> }
>> - ep = usbdev->ep_in[usb_pipeendpoint(pipe)];
>>
>> + /* Control data transfer properties */
>> if (ep) {
>> line6->interval = ep->desc.bInterval;
>> - if (usbdev->speed == USB_SPEED_LOW) {
>> - line6->intervals_per_second = USB_LOW_INTERVALS_PER_SECOND;
>> - line6->iso_buffers = USB_LOW_ISO_BUFFERS;
>> - } else {
>> - line6->intervals_per_second = USB_HIGH_INTERVALS_PER_SECOND;
>> - line6->iso_buffers = USB_HIGH_ISO_BUFFERS;
>> - }
>> -
>> line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
>> } else {
>> - dev_err(line6->ifcdev,
>> - "endpoint not available, using fallback values");
>> + if (properties->capabilities & LINE6_CAP_CONTROL) {
>> + dev_err(line6->ifcdev,
>> + "endpoint not available, using fallback values");
>> + }
>> line6->interval = LINE6_FALLBACK_INTERVAL;
>> line6->max_packet_size = LINE6_FALLBACK_MAXPACKETSIZE;
>> }
>> -}
>>
>> + /* Isochronous transfer properties */
>> + if (usbdev->speed == USB_SPEED_LOW) {
>> + line6->intervals_per_second = USB_LOW_INTERVALS_PER_SECOND;
>> + line6->iso_buffers = USB_LOW_ISO_BUFFERS;
>> + } else {
>> + line6->intervals_per_second = USB_HIGH_INTERVALS_PER_SECOND;
>> + line6->iso_buffers = USB_HIGH_ISO_BUFFERS;
>> + }
>> +}
>>
>> /* Enable buffering of incoming messages, flush the buffer */
>> static int line6_hwdep_open(struct snd_hwdep *hw, struct file *file)
>> @@ -754,8 +758,9 @@ int line6_probe(struct usb_interface *interface,
>> goto error;
>> }
>>
>> + line6_get_usb_properties(line6);
>> +
>> if (properties->capabilities & LINE6_CAP_CONTROL) {
>> - line6_get_interval(line6);
>> ret = line6_init_cap_control(line6);
>> if (ret < 0)
>> goto error;
>> --
>> 2.7.4
>>
More information about the Alsa-devel
mailing list