func: static int ffs_func_bind(struct usb_configuration struct usb_function *f) struct f_fs_opts * ffs_opts = ffs_do_functionfs_bind ( f , c ) ; static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function struct usb_configuration *c) struct ffs_function * func = ffs_func_from_usb ( f ) ; struct f_fs_opts * ffs_opts container_of ( f -> fi , struct f_fs_opts , func_inst ) int ret ; ret = ffs_opts -> dev -> desc_ready ? 0 : - ENODEV; func -> ffs = ffs_opts -> dev -> ffs_data; if ( ret )  return ERR_PTR ( ret ) ; func -> conf = c; func -> gadget = c -> cdev -> gadget; if ( ! ffs_opts -> refcnt )  ret = functionfs_bind ( func -> ffs , c -> cdev ); static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) int first_id ; if ( WARN_ON ( ffs -> state != FFS_ACTIVE || test_and_set_bit ( FFS_FL_BOUND , & ffs -> flags ) ) )  return - EBADFD ; first_id = usb_string_ids_n ( cdev , ffs -> strings_count ); if ( unlikely ( first_id < 0 ) )  return first_id ; ffs -> ep0req = usb_ep_alloc_request ( cdev -> gadget -> ep0 , GFP_KERNEL ); if ( unlikely ( ! ffs -> ep0req ) )  return - ENOMEM ; return 0 ; if ( ret )  return ERR_PTR ( ret ) ; ffs_opts -> refcnt ++; return ffs_opts ; if ( IS_ERR ( ffs_opts ) )  return _ffs_func_bind ( c , f ) ; static int _ffs_func_bind(struct usb_configuration struct usb_function *f) struct ffs_function * func = ffs_func_from_usb ( f ) ; struct ffs_data * ffs = func -> ffs ; const int full = ! ! func -> ffs -> fs_descs_count ; const int high = gadget_is_dualspeed ( func -> gadget ) && func -> ffs -> hs_descs_count ; const int super = gadget_is_superspeed ( func -> gadget ) && func -> ffs -> ss_descs_count ; char * vlabuf ; if ( unlikely ( ! ( full | high | super ) ) )  vlabuf = kzalloc ( vla_group_size ( d ) , GFP_KERNEL ); if ( unlikely ( ! vlabuf ) )  ffs -> ms_os_descs_ext_prop_avail = vla_ptr ( vlabuf , d , ext_prop ); ffs -> ms_os_descs_ext_prop_name_avail = vla_ptr ( vlabuf , d , ext_prop_name ); ffs -> ms_os_descs_ext_prop_data_avail = vla_ptr ( vlabuf , d , ext_prop_data ); memcpy ( vla_ptr ( vlabuf , d , raw_descs ) , ffs -> raw_descs , ffs -> raw_descs_length ); memset ( vla_ptr ( vlabuf , d , inums ) , 0xff , d_inums__sz ); 