@ -28,6 +28,7 @@
# include <linux/dma-mapping.h>
# include <linux/platform_device.h>
# include <linux/usb/audio-v3.h>
# include <linux/ipc_logging.h>
# include "usbaudio.h"
# include "card.h"
@ -127,6 +128,7 @@ struct uaudio_qmi_svc {
bool client_connected ;
ktime_t t_request_recvd ;
ktime_t t_resp_sent ;
void * uaudio_ipc_log ;
} ;
static struct uaudio_qmi_svc * uaudio_svc ;
@ -170,6 +172,26 @@ enum usb_qmi_audio_format {
USB_QMI_PCM_FORMAT_U32_BE ,
} ;
# define uaudio_print(level, fmt, ...) do { \
ipc_log_string ( uaudio_svc - > uaudio_ipc_log , " %s%s: " fmt , " " , __func__ , \
# #__VA_ARGS__); \
printk ( " %s%s: " fmt , level , __func__ , # # __VA_ARGS__ ) ; \
} while ( 0 )
# ifdef CONFIG_DYNAMIC_DEBUG
# define uaudio_dbg(fmt, ...) do { \
ipc_log_string ( uaudio_svc - > uaudio_ipc_log , " %s: " fmt , __func__ , \
# #__VA_ARGS__); \
dynamic_pr_debug ( " %s: " fmt , __func__ , # # __VA_ARGS__ ) ; \
} while ( 0 )
# else
# define uaudio_dbg(fmt, ...) uaudio_print(KERN_DEBUG, fmt, ##__VA_ARGS__)
# endif
# define uaudio_err(fmt, ...) uaudio_print(KERN_ERR, fmt, ##__VA_ARGS__)
# define NUM_LOG_PAGES 10
static void uaudio_iommu_unmap ( enum mem_type mtype , unsigned long va ,
size_t iova_size , size_t mapped_iova_size ) ;
@ -188,7 +210,7 @@ get_speed_info(enum usb_device_speed udev_speed)
case USB_SPEED_SUPER_PLUS :
return USB_AUDIO_DEVICE_SPEED_SUPER_PLUS_V01 ;
default :
pr _err( " %s: udev speed %d\n " , __func__ , udev_speed ) ;
uaudio _err( " udev speed %d \n " , udev_speed ) ;
return USB_AUDIO_DEVICE_SPEED_INVALID_V01 ;
}
}
@ -203,18 +225,16 @@ static unsigned long uaudio_get_iova(unsigned long *curr_iova,
bool found = false ;
if ( size % PAGE_SIZE ) {
pr_err ( " %s: size %zu is not page size multiple \n " , __func__ ,
size ) ;
uaudio_err ( " size %zu is not page size multiple \n " , size ) ;
goto done ;
}
if ( size > * curr_iova_size ) {
pr_err ( " %s: size %zu > curr size %zu \n " , __func__ , size ,
* curr_iova_size ) ;
uaudio_err ( " size %zu > curr size %zu \n " , size , * curr_iova_size ) ;
goto done ;
}
if ( * curr_iova_size = = 0 ) {
pr _err( " %s: iova mapping is full\n " , __func__ ) ;
uaudio _err( " iova mapping is full \n " ) ;
goto done ;
}
@ -225,13 +245,12 @@ static unsigned long uaudio_get_iova(unsigned long *curr_iova,
va = info - > start_iova ;
* curr_iova_size - = size ;
found = true ;
pr_debu g( " %s: exact size :%zu found\n " , __func__ , size ) ;
uaudio_db g( " exact size :%zu found \n " , size ) ;
goto done ;
} else if ( ! info - > in_use & & tmp_size > = info - > size ) {
if ( ! new_info )
new_info = info ;
pr_debug ( " %s: partial size: %zu found \n " , __func__ ,
info - > size ) ;
uaudio_dbg ( " partial size: %zu found \n " , info - > size ) ;
tmp_size - = info - > size ;
if ( tmp_size )
continue ;
@ -270,10 +289,10 @@ static unsigned long uaudio_get_iova(unsigned long *curr_iova,
done :
if ( ! found )
pr _err( " %s: unable to find %zu size iova\n " , __func__ , size ) ;
uaudio _err( " unable to find %zu size iova \n " , size ) ;
else
pr_debu g( " %s: va:%lu curr_iova:%lu curr_iova_size:%zu\n " ,
__func__ , va , * curr_iova , * curr_iova_size ) ;
uaudio_db g( " va:%lu curr_iova:%lu curr_iova_size:%zu \n " , va ,
* curr_iova , * curr_iova_size ) ;
return va ;
}
@ -306,7 +325,7 @@ static unsigned long uaudio_iommu_map(enum mem_type mtype, phys_addr_t pa,
size ) ;
break ;
default :
pr _err( " %s: unknown mem type %d\n " , __func__ , mtype ) ;
uaudio _err( " unknown mem type %d \n " , mtype ) ;
}
if ( ! va | | ! map )
@ -322,36 +341,36 @@ static unsigned long uaudio_iommu_map(enum mem_type mtype, phys_addr_t pa,
ret = iommu_map ( uaudio_qdev - > domain , va_sg , pa_sg , sg_len ,
IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO ) ;
if ( ret ) {
pr _err( " %s: mapping failed ret%d\n " , __func__ , ret ) ;
pr _err( " memtype:%d, pa:%pK iova:%lu sg_len:%zu \n " ,
uaudio _err( " mapping failed ret%d \n " , ret ) ;
uaudio _err( " memtype:%d, pa:%pK iova:%lu sg_len:%zu \n " ,
mtype , & pa_sg , va_sg , sg_len ) ;
uaudio_iommu_unmap ( MEM_XFER_BUF , va , size , total_len ) ;
va = 0 ;
goto done ;
}
pr_debu g( " %s: memtype %d:map pa:%pK to iova:%lu len:%zu\n " ,
__func__ , mtype , & pa_sg , va_sg , sg_len ) ;
uaudio_db g( " memtype %d:map pa:%pK to iova:%lu len:%zu \n " , mtype ,
& pa_sg , va_sg , sg_len ) ;
va_sg + = sg_len ;
total_len + = sg_len ;
}
if ( size ! = total_len ) {
pr _err( " %s: iova size %zu != mapped iova size %zu\n " , __func__ ,
size , total_len ) ;
uaudio _err( " iova size %zu != mapped iova size %zu \n " , size ,
total_len ) ;
uaudio_iommu_unmap ( MEM_XFER_BUF , va , size , total_len ) ;
va = 0 ;
}
return va ;
skip_sgt_map :
pr_debu g( " %s: memtype:%d map pa:%pK to iova %lu size:%zu\n " , __func__ ,
mtype , & pa , va , size ) ;
uaudio_db g( " memtype:%d map pa:%pK to iova %lu size:%zu \n " , mtype , & pa ,
va , size ) ;
ret = iommu_map ( uaudio_qdev - > domain , va , pa , size ,
IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO ) ;
if ( ret )
pr _err( " %s: failed to map pa:%pK iova:%lu memtype:%d ret:%d\n " ,
__func__ , & pa , va , mtype , ret ) ;
uaudio _err( " failed to map pa:%pK iova:%lu memtype:%d ret:%d \n " ,
& pa , va , mtype , ret ) ;
done :
return va ;
}
@ -366,8 +385,7 @@ static void uaudio_put_iova(unsigned long va, size_t size, struct list_head
list_for_each_entry ( info , head , list ) {
if ( info - > start_iova = = va ) {
if ( ! info - > in_use ) {
pr_err ( " %s: va %lu is not in use \n " , __func__ ,
va ) ;
uaudio_err ( " va %lu is not in use \n " , va ) ;
return ;
}
found = true ;
@ -385,12 +403,12 @@ static void uaudio_put_iova(unsigned long va, size_t size, struct list_head
}
if ( ! found ) {
pr _err( " %s: unable to find the va %lu\n " , __func__ , va ) ;
uaudio _err( " unable to find the va %lu \n " , va ) ;
return ;
}
done :
* curr_iova_size + = size ;
pr_debu g( " %s: curr_iova_size %zu\n " , __func__ , * curr_iova_size ) ;
uaudio_db g( " curr_iova_size %zu \n " , * curr_iova_size ) ;
}
static void uaudio_iommu_unmap ( enum mem_type mtype , unsigned long va ,
@ -419,20 +437,20 @@ static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va,
& uaudio_qdev - > xfer_buf_iova_size ) ;
break ;
default :
pr _err( " %s: unknown mem type %d\n " , __func__ , mtype ) ;
uaudio _err( " unknown mem type %d \n " , mtype ) ;
unmap = false ;
}
if ( ! unmap | | ! mapped_iova_size )
return ;
pr_debu g( " %s: memtype %d: unmap iova %lu size %zu\n " , __func__ , mtype ,
va , mapped_iova_size ) ;
uaudio_db g( " memtype %d: unmap iova %lu size %zu \n " , mtype , va ,
mapped_iova_size ) ;
umap_size = iommu_unmap ( uaudio_qdev - > domain , va , mapped_iova_size ) ;
if ( umap_size ! = mapped_iova_size )
pr _err( " %s: unmapped size %zu for iova %lu of mapped size %zu\n " ,
__func__ , umap_size , va , mapped_iova_size ) ;
uaudio _err( " unmapped size %zu for iova %lu of mapped size %zu \n " ,
umap_size , va , mapped_iova_size ) ;
}
static int prepare_qmi_response ( struct snd_usb_substream * subs ,
@ -460,8 +478,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
iface = usb_ifnum_to_if ( subs - > dev , subs - > interface ) ;
if ( ! iface ) {
pr_err ( " %s: interface # %d does not exist \n " , __func__ ,
subs - > interface ) ;
uaudio_err ( " interface # %d does not exist \n " , subs - > interface ) ;
ret = - ENODEV ;
goto err ;
}
@ -479,15 +496,15 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
fmt = snd_usb_find_csint_desc ( alts - > extra , alts - > extralen , NULL ,
UAC_FORMAT_TYPE ) ;
if ( ! fmt ) {
pr _err( " %s: %u:%d : no UAC_FORMAT_TYPE desc\n " ,
__func__ , subs - > interface , subs - > altset_idx ) ;
uaudio _err( " %u:%d : no UAC_FORMAT_TYPE desc \n " ,
subs - > interface , subs - > altset_idx ) ;
ret = - ENODEV ;
goto err ;
}
}
if ( ! uadev [ card_num ] . ctrl_intf ) {
pr _err( " %s: audio ctrl intf info not cached\n " , __func__ ) ;
uaudio _err( " audio ctrl intf info not cached \n " ) ;
ret = - ENODEV ;
goto err ;
}
@ -498,7 +515,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
uadev [ card_num ] . ctrl_intf - > extralen ,
NULL , UAC_HEADER ) ;
if ( ! hdr_ptr ) {
pr _err( " %s: no UAC_HEADER desc\n " , __func__ ) ;
uaudio _err( " no UAC_HEADER desc \n " ) ;
ret = - ENODEV ;
goto err ;
}
@ -508,8 +525,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
as = snd_usb_find_csint_desc ( alts - > extra , alts - > extralen , NULL ,
UAC_AS_GENERAL ) ;
if ( ! as ) {
pr _err( " %s: % u:%d : no UAC_AS_GENERAL desc \n " , __func__ ,
subs - > interface , subs - > altset_idx ) ;
uaudio _err( " %u:%d : no UAC_AS_GENERAL desc \n " ,
subs - > interface , subs - > altset_idx ) ;
ret = - ENODEV ;
goto err ;
}
@ -549,14 +566,14 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
}
default :
pr _err( " %d: %u: Invalid wMaxPacketSize \n " ,
uaudio _err( " %d: %u: Invalid wMaxPacketSize \n " ,
subs - > interface , subs - > altset_idx ) ;
ret = - EINVAL ;
goto err ;
}
resp - > usb_audio_subslot_size_valid = 1 ;
} else {
pr _err( " %s: unknown protocol version %x\n " , __func__ , protocol ) ;
uaudio _err( " unknown protocol version %x \n " , protocol ) ;
ret = - ENODEV ;
goto err ;
}
@ -569,8 +586,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
ep = usb_pipe_endpoint ( subs - > dev , subs - > data_endpoint - > pipe ) ;
if ( ! ep ) {
pr _err( " %s: data ep # %d context is null\n " , __func__ ,
subs - > data_endpoint - > ep_num ) ;
uaudio _err( " data ep # %d context is null \n " ,
subs - > data_endpoint - > ep_num ) ;
ret = - ENODEV ;
goto err ;
}
@ -580,7 +597,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
tr_data_pa = usb_get_xfer_ring_phys_addr ( subs - > dev , ep , & dma ) ;
if ( ! tr_data_pa ) {
pr _err( " %s: failed to get data ep ring dma address\n " , __func__ ) ;
uaudio _err( " failed to get data ep ring dma address \n " ) ;
ret = - ENODEV ;
goto err ;
}
@ -590,7 +607,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
if ( subs - > sync_endpoint ) {
ep = usb_pipe_endpoint ( subs - > dev , subs - > sync_endpoint - > pipe ) ;
if ( ! ep ) {
pr_debu g( " %s: implicit fb on data ep\n " , __func__ ) ;
uaudio_db g( " implicit fb on data ep \n " ) ;
goto skip_sync_ep ;
}
sync_ep_pipe = subs - > sync_endpoint - > pipe ;
@ -599,8 +616,7 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
tr_sync_pa = usb_get_xfer_ring_phys_addr ( subs - > dev , ep , & dma ) ;
if ( ! tr_sync_pa ) {
pr_err ( " %s:failed to get sync ep ring dma address \n " ,
__func__ ) ;
uaudio_err ( " failed to get sync ep ring dma address \n " ) ;
ret = - ENODEV ;
goto err ;
}
@ -623,16 +639,14 @@ skip_sync_ep:
/* event ring */
ret = usb_sec_event_ring_setup ( subs - > dev , resp - > interrupter_num ) ;
if ( ret ) {
pr_err ( " %s: failed to setup sec event ring ret %d \n " , __func__ ,
ret ) ;
uaudio_err ( " failed to setup sec event ring ret %d \n " , ret ) ;
goto err ;
}
xhci_pa = usb_get_sec_event_ring_phys_addr ( subs - > dev ,
resp - > interrupter_num , & dma ) ;
if ( ! xhci_pa ) {
pr_err ( " %s: failed to get sec event ring dma address \n " ,
__func__ ) ;
uaudio_err ( " failed to get sec event ring dma address \n " ) ;
ret = - ENODEV ;
goto err ;
}
@ -696,8 +710,8 @@ skip_sync:
len + = remainder ? PAGE_SIZE : 0 ;
if ( len > MAX_XFER_BUFF_LEN ) {
pr _err( " %s: req buf len %d > max buf len %lu, setting %lu\n " ,
__func__ , len , MAX_XFER_BUFF_LEN , MAX_XFER_BUFF_LEN ) ;
uaudio _err( " req buf len %d > max buf len %lu, setting %lu \n " ,
len , MAX_XFER_BUFF_LEN , MAX_XFER_BUFF_LEN ) ;
len = MAX_XFER_BUFF_LEN ;
}
@ -813,8 +827,8 @@ static void uaudio_dev_cleanup(struct uaudio_dev *dev)
if ( ! dev - > info [ if_idx ] . in_use )
continue ;
uaudio_dev_intf_cleanup ( dev - > udev , & dev - > info [ if_idx ] ) ;
pr_debu g( " %s: release resources: intf# %d card# %d\n " , __func__ ,
dev - > info [ if_idx ] . intf_num , dev - > card_num ) ;
uaudio_db g( " release resources: intf# %d card# %d \n " ,
dev - > info [ if_idx ] . intf_num , dev - > card_num ) ;
}
dev - > num_intf = 0 ;
@ -830,7 +844,7 @@ static void uaudio_dev_cleanup(struct uaudio_dev *dev)
uaudio_iommu_unmap ( MEM_EVENT_RING , IOVA_BASE , PAGE_SIZE ,
PAGE_SIZE ) ;
usb_sec_event_ring_cleanup ( dev - > udev , uaudio_qdev - > intr_num ) ;
pr_debu g( " %s: all audio devices disconnected\n " , __func__ ) ;
uaudio_db g( " all audio devices disconnected \n " ) ;
}
dev - > udev = NULL ;
@ -844,10 +858,10 @@ static void uaudio_disconnect_cb(struct snd_usb_audio *chip)
struct uaudio_qmi_svc * svc = uaudio_svc ;
struct qmi_uaudio_stream_ind_msg_v01 disconnect_ind = { 0 } ;
pr_debu g( " %s: for card# %d\n " , __func__ , card_num ) ;
uaudio_db g( " for card# %d \n " , card_num ) ;
if ( card_num > = SNDRV_CARDS ) {
pr _err( " %s: invalid card number\n " , __func__ ) ;
uaudio _err( " invalid card number \n " ) ;
return ;
}
@ -856,15 +870,15 @@ static void uaudio_disconnect_cb(struct snd_usb_audio *chip)
/* clean up */
if ( ! dev - > udev ) {
pr_debu g( " %s: no clean up required\n " , __func__ ) ;
uaudio_db g( " no clean up required \n " ) ;
goto done ;
}
if ( atomic_read ( & dev - > in_use ) ) {
mutex_unlock ( & chip - > dev_lock ) ;
pr_debu g( " %s: sending qmi indication disconnect\n " , __func__ ) ;
pr_debu g( " %s: sq->sq_family:%x sq->sq_node:%x sq->sq_port:%x\n " ,
__func__ , svc - > client_sq . sq_family ,
uaudio_db g( " sending qmi indication disconnect \n " ) ;
uaudio_db g( " sq->sq_family:%x sq->sq_node:%x sq->sq_port:%x \n " ,
svc - > client_sq . sq_family ,
svc - > client_sq . sq_node , svc - > client_sq . sq_port ) ;
disconnect_ind . dev_event = USB_AUDIO_DEV_DISCONNECT_V01 ;
disconnect_ind . slot_id = dev - > udev - > slot_id ;
@ -876,15 +890,14 @@ static void uaudio_disconnect_cb(struct snd_usb_audio *chip)
qmi_uaudio_stream_ind_msg_v01_ei ,
& disconnect_ind ) ;
if ( ret < 0 ) {
pr_err ( " %s: qmi send failed wiht err: %d \n " ,
__func__ , ret ) ;
uaudio_err ( " qmi send failed wiht err: %d \n " , ret ) ;
return ;
}
ret = wait_event_interruptible ( dev - > disconnect_wq ,
! atomic_read ( & dev - > in_use ) ) ;
if ( ret < 0 ) {
pr_debu g( " %s: failed with ret %d\n " , __func__ , ret ) ;
uaudio_db g( " failed with ret %d \n " , ret ) ;
return ;
}
mutex_lock ( & chip - > dev_lock ) ;
@ -899,7 +912,7 @@ static void uaudio_dev_release(struct kref *kref)
{
struct uaudio_dev * dev = container_of ( kref , struct uaudio_dev , kref ) ;
pr_debu g( " %s for dev %pK\n " , __func__ , dev ) ;
uaudio_db g( " for dev %pK \n " , dev ) ;
atomic_set ( & dev - > in_use , 0 ) ;
@ -910,7 +923,7 @@ static void uaudio_dev_release(struct kref *kref)
usb_sec_event_ring_cleanup ( dev - > udev , uaudio_qdev - > intr_num ) ;
uaudio_iommu_unmap ( MEM_EVENT_RING , IOVA_BASE , PAGE_SIZE ,
PAGE_SIZE ) ;
pr_debu g( " %s: all audio devices disconnected\n " , __func__ ) ;
uaudio_db g( " all audio devices disconnected \n " ) ;
}
wake_up ( & dev - > disconnect_wq ) ;
@ -1027,8 +1040,8 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
svc - > t_request_recvd = ktime_get ( ) ;
pr_debu g( " %s: sq_node:%x sq_port:%x sq_family:%x\n " ,
__func__ , sq - > sq_node , sq - > sq_port , sq - > sq_family ) ;
uaudio_db g( " sq_node:%x sq_port:%x sq_family:%x \n " , sq - > sq_node ,
sq - > sq_port , sq - > sq_family ) ;
if ( ! svc - > client_connected ) {
svc - > client_sq = * sq ;
svc - > client_connected = true ;
@ -1037,7 +1050,7 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
req_msg = ( struct qmi_uaudio_stream_req_msg_v01 * ) decoded_msg ;
if ( ! req_msg - > audio_format_valid | | ! req_msg - > bit_rate_valid | |
! req_msg - > number_of_ch_valid | | ! req_msg - > xfer_buff_size_valid ) {
pr _err( " %s: invalid request msg\n " , __func__ ) ;
uaudio _err( " invalid request msg \n " ) ;
ret = - EINVAL ;
goto response ;
}
@ -1046,21 +1059,21 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
pcm_dev_num = ( req_msg - > usb_token & SND_PCM_DEV_NUM_MASK ) > > 8 ;
pcm_card_num = ( req_msg - > usb_token & SND_PCM_CARD_NUM_MASK ) > > 16 ;
pr_debu g( " %s: card#:%d dev#:%d dir:%d en:%d fmt:%d rate:%d #ch:%d\n " ,
__func__ , pcm_card_num , pcm_dev_num , direction , req_msg - > enable ,
req_msg - > audio_format , req_msg - > bit_rate ,
req_msg - > number_of_ch ) ;
uaudio_db g( " card#:%d dev#:%d dir:%d en:%d fmt:%d rate:%d #ch:%d \n " ,
pcm_card_num , pcm_dev_num , direction , req_msg - > enable ,
req_msg - > audio_format , req_msg - > bit_rate ,
req_msg - > number_of_ch ) ;
if ( pcm_card_num > = SNDRV_CARDS ) {
pr _err( " %s: invalid card # %u" , __func__ , pcm_card_num ) ;
uaudio _err( " invalid card # %u " , pcm_card_num ) ;
ret = - EINVAL ;
goto response ;
}
pcm_format = map_pcm_format ( req_msg - > audio_format ) ;
if ( pcm_format = = - EINVAL ) {
pr _err( " %s: unsupported pcm format received %d\n " ,
__func__ , req_msg - > audio_format ) ;
uaudio _err( " unsupported pcm format received %d \n " ,
req_msg - > audio_format ) ;
ret = - EINVAL ;
goto response ;
}
@ -1068,8 +1081,8 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
subs = find_snd_usb_substream ( pcm_card_num , pcm_dev_num , direction ,
& chip , uaudio_disconnect_cb ) ;
if ( ! subs | | ! chip | | atomic_read ( & chip - > shutdown ) ) {
pr _err( " %s: can't find substream for card# %u, dev# %u dir%u\n " ,
__func__ , pcm_card_num , pcm_dev_num , direction ) ;
uaudio _err( " can't find substream for card# %u, dev# %u dir%u \n " ,
pcm_card_num , pcm_dev_num , direction ) ;
ret = - ENODEV ;
goto response ;
}
@ -1086,8 +1099,8 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
if ( req_msg - > enable ) {
if ( info_idx < 0 ) {
pr _err( " %s interface# %d already in use card# %d\n " ,
__func__ , subs - > interface , pcm_card_num ) ;
uaudio _err( " interface# %d already in use card# %d \n " ,
subs - > interface , pcm_card_num ) ;
ret = - EBUSY ;
mutex_unlock ( & chip - > dev_lock ) ;
goto response ;
@ -1101,14 +1114,14 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
ret = get_data_interval_from_si ( subs ,
req_msg - > service_interval ) ;
if ( ret = = - EINVAL ) {
pr _err( " %s: invalid service interval %u\n " , __func__ ,
uaudio _err( " invalid service interval %u \n " ,
req_msg - > service_interval ) ;
mutex_unlock ( & chip - > dev_lock ) ;
goto response ;
}
datainterval = ret ;
pr_debu g( " %s: data interval %u\n " , __func__ , ret ) ;
uaudio_db g( " data interval %u \n " , ret ) ;
}
uadev [ pcm_card_num ] . ctrl_intf = chip - > ctrl_intf ;
@ -1119,7 +1132,7 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
ep = usb_pipe_endpoint ( uadev [ pcm_card_num ] . udev ,
info - > data_ep_pipe ) ;
if ( ! ep )
pr_debu g( " %s: no data ep\n " , __func__ ) ;
uaudio_db g( " no data ep \n " ) ;
else
usb_stop_endpoint ( uadev [ pcm_card_num ] . udev , ep ) ;
info - > data_ep_pipe = 0 ;
@ -1129,7 +1142,7 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle,
ep = usb_pipe_endpoint ( uadev [ pcm_card_num ] . udev ,
info - > sync_ep_pipe ) ;
if ( ! ep )
pr_debu g( " %s: no sync ep\n " , __func__ ) ;
uaudio_db g( " no sync ep \n " ) ;
else
usb_stop_endpoint ( uadev [ pcm_card_num ] . udev , ep ) ;
info - > sync_ep_pipe = 0 ;
@ -1149,8 +1162,8 @@ response:
mutex_lock ( & chip - > dev_lock ) ;
info = & uadev [ pcm_card_num ] . info [ info_idx ] ;
uaudio_dev_intf_cleanup ( uadev [ pcm_card_num ] . udev , info ) ;
pr_debu g( " %s: release resources: intf# %d card# %d\n " ,
__func__ , subs - > interface , pcm_card_num ) ;
uaudio_db g( " release resources: intf# %d card# %d \n " ,
subs - > interface , pcm_card_num ) ;
mutex_unlock ( & chip - > dev_lock ) ;
}
if ( atomic_read ( & uadev [ pcm_card_num ] . in_use ) )
@ -1171,7 +1184,7 @@ response:
svc - > t_resp_sent = ktime_get ( ) ;
pr_debu g( " %s: t_resp sent - t_req recvd (in ms) %lld\n " , __func__ ,
uaudio_db g( " t_resp sent - t_req recvd (in ms) %lld \n " ,
ktime_to_ms ( ktime_sub ( svc - > t_resp_sent , svc - > t_request_recvd ) ) ) ;
}
@ -1197,10 +1210,10 @@ static void uaudio_qmi_disconnect_work(struct work_struct *w)
& chip ,
uaudio_disconnect_cb ) ;
if ( ! subs | | ! chip | | atomic_read ( & chip - > shutdown ) ) {
pr_debu g( " %s: no subs for c#%u, dev#%u dir%u\n " ,
__func__ , info - > pcm_card_num ,
info - > pcm_dev_num ,
info - > direction ) ;
uaudio_db g( " no subs for c#%u, dev#%u dir%u \n " ,
info - > pcm_card_num ,
info - > pcm_dev_num ,
info - > direction ) ;
continue ;
}
snd_usb_enable_audio_stream ( subs , - EINVAL , 0 ) ;
@ -1216,9 +1229,9 @@ static void uaudio_qmi_bye_cb(struct qmi_handle *handle, unsigned int node)
{
struct uaudio_qmi_svc * svc = uaudio_svc ;
pr_debu g( " %s: node:\n " , __func__ , node ) ;
uaudio_db g( " node: \n " , node ) ;
if ( svc - > uaudio_svc_hdl ! = handle ) {
pr _err( " %s: handle mismatch\n " , __func__ ) ;
uaudio _err( " handle mismatch \n " ) ;
return ;
}
@ -1236,9 +1249,9 @@ static void uaudio_qmi_svc_disconnect_cb(struct qmi_handle *handle,
{
struct uaudio_qmi_svc * svc = uaudio_svc ;
pr_debu g( " %s: client node:%x port:%x\n " , __func__ , node , port ) ;
uaudio_db g( " client node:%x port:%x \n " , node , port ) ;
if ( svc - > uaudio_svc_hdl ! = handle ) {
pr _err( " %s: handle mismatch\n " , __func__ ) ;
uaudio _err( " handle mismatch \n " ) ;
return ;
}
@ -1382,6 +1395,9 @@ static int uaudio_qmi_svc_init(void)
uaudio_svc = svc ;
svc - > uaudio_ipc_log = ipc_log_context_create ( NUM_LOG_PAGES , " usb_audio " ,
0 ) ;
return 0 ;
release_uaudio_svs_hdl :
@ -1403,6 +1419,7 @@ static void uaudio_qmi_svc_exit(void)
flush_workqueue ( svc - > uaudio_wq ) ;
destroy_workqueue ( svc - > uaudio_wq ) ;
kfree ( svc - > uaudio_svc_hdl ) ;
ipc_log_context_destroy ( svc - > uaudio_ipc_log ) ;
kfree ( svc ) ;
uaudio_svc = NULL ;
}