On Thu, Oct 03 2013, Andrzej Pietrasiewicz wrote:
> Converting mass storage to the new function interface requires converting
> the USB mass storage's function code and its users.
> This patch converts the f_mass_storage.c to the new function interface.
> The file is now compiled into a separate usb_f_mass_storage.ko module.
> The old function interface is provided by means of a preprocessor conditional
> directives. After all users are converted, the old interface can be removed.
>
> Signed-off-by: Andrzej Pietrasiewicz <andrze...@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>

Acked-by: Michal Nazarewicz <min...@mina86.com>

> diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
> index d90a0b0..4a86b0c 100644
> --- a/drivers/usb/gadget/Makefile
> +++ b/drivers/usb/gadget/Makefile
> @@ -2627,11 +2628,17 @@ void fsg_common_get(struct fsg_common *common)
>  {
>       kref_get(&common->ref);
>  }
> +#ifndef USB_FMS_INCLUDED
> +EXPORT_SYMBOL(fsg_common_get);
> +#endif

Perhaps instead of checking it each time, define
a EXPORT_SYMBOL_GPL_IF_MODULE macro and when the macro is defined
provide a comment explaining why it is here?

>  
>  void fsg_common_put(struct fsg_common *common)
>  {
>       kref_put(&common->ref, fsg_common_release);
>  }
> +#ifndef USB_FMS_INCLUDED
> +EXPORT_SYMBOL(fsg_common_put);
> +#endif
>  
>  /* check if fsg_num_buffers is within a valid range */
>  static inline int fsg_num_buffers_validate(unsigned int fsg_num_buffers)
>  int fsg_common_set_nluns(struct fsg_common *common, int nluns)
>  {

> @@ -3146,6 +3186,21 @@ static int fsg_bind(struct usb_configuration *c, 
> struct usb_function *f)
>       unsigned                max_burst;
>       int                     ret;
>  
> +#ifndef USB_FMS_INCLUDED
> +     struct fsg_opts         *opts;
> +     opts = container_of(f->fi, struct fsg_opts, func_inst);
> +     if (!opts->no_configfs) {
> +             ret = fsg_common_set_cdev(fsg->common, c->cdev,
> +                                       fsg->common->can_stall);
> +             if (ret)
> +                     return ret;
> +             fsg_common_set_inquiry_string(fsg->common, 0, 0);
> +             ret = fsg_common_run_thread(fsg->common);
> +             if (ret)
> +                     return ret;
> +     }
> +#endif
> +
>       fsg->gadget = gadget;
>  
>       /* New interface */
> @@ -3197,7 +3252,27 @@ autoconf_fail:
>       return -ENOTSUPP;
>  }
>  
> -/****************************** ADD FUNCTION ******************************/
> +/****************************** ALLOCATE FUNCTION *************************/
> +
> +#ifdef USB_FMS_INCLUDED
> +
> +static void old_fsg_unbind(struct usb_configuration *c, struct usb_function 
> *f)

Perhaps __deprecated?  Also, why name change?

> +{
> +     struct fsg_dev          *fsg = fsg_from_func(f);
> +     struct fsg_common       *common = fsg->common;
> +
> +     DBG(fsg, "unbind\n");
> +     if (fsg->common->fsg == fsg) {
> +             fsg->common->new_fsg = NULL;
> +             raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
> +             /* FIXME: make interruptible or killable somehow? */
> +             wait_event(common->fsg_wait, common->fsg != fsg);
> +     }
> +
> +     fsg_common_put(common);
> +     usb_free_all_descriptors(&fsg->function);
> +     kfree(fsg);
> +}
>  
>  static int fsg_bind_config(struct usb_composite_dev *cdev,
>                          struct usb_configuration *c,

> @@ -3234,6 +3309,111 @@ static int fsg_bind_config(struct usb_composite_dev 
> *cdev,
>       return rc;
>  }
>  
> +#else
> +
> +static void fsg_free_inst(struct usb_function_instance *fi)
> +{
> +     struct fsg_opts *opts;
> +
> +     opts = container_of(fi, struct fsg_opts, func_inst);
> +     fsg_common_put(opts->common);
> +     kfree(opts);
> +}
> +
> +static struct usb_function_instance *fsg_alloc_inst(void)
> +{
> +     struct fsg_opts *opts;
> +     int ret;

Perhaps call it “rc”, since technically it's not return value from the
function.

> +
> +     opts = kzalloc(sizeof(*opts), GFP_KERNEL);
> +     if (!opts)
> +             return ERR_PTR(-ENOMEM);
> +     opts->func_inst.free_func_inst = fsg_free_inst;
> +     opts->common = fsg_common_setup(opts->common, false);
> +     if (IS_ERR(opts->common)) {
> +             ret = PTR_ERR(opts->common);
> +             goto release_opts;
> +     }
> +     ret = fsg_common_set_nluns(opts->common, FSG_MAX_LUNS);
> +     if (ret)
> +             goto release_opts;
> +
> +     ret = fsg_common_set_num_buffers(opts->common,
> +                                      CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS);
> +     if (ret)
> +             goto release_luns;
> +
> +     pr_info(FSG_DRIVER_DESC ", version: " FSG_DRIVER_VERSION "\n");
> +
> +     return &opts->func_inst;
> +
> +release_luns:
> +     kfree(opts->common->luns);
> +release_opts:
> +     kfree(opts);
> +     return ERR_PTR(ret);
> +}


> +static void fsg_unbind(struct usb_configuration *c, struct usb_function *f)
> +{
> +     struct fsg_dev          *fsg = fsg_from_func(f);
> +     struct fsg_common       *common = fsg->common;
> +
> +     DBG(fsg, "unbind\n");
> +     if (fsg->common->fsg == fsg) {
> +             fsg->common->new_fsg = NULL;
> +             raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
> +             /* FIXME: make interruptible or killable somehow? */
> +             wait_event(common->fsg_wait, common->fsg != fsg);
> +     }
> +
> +     usb_free_all_descriptors(&fsg->function);
> +}

This looks almost identical to old_fsg_unbind().  Why not #ifdef just
the last part of the function?

> +
> +static struct usb_function *fsg_alloc(struct usb_function_instance *fi)
> +{
> +     struct fsg_opts *opts = container_of(fi, struct fsg_opts, func_inst);
> +     struct fsg_common *common = opts->common;
> +     struct fsg_dev *fsg;
> +
> +     fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
> +     if (unlikely(!fsg))
> +             return ERR_PTR(-ENOMEM);
> +
> +     fsg->function.name        = FSG_DRIVER_DESC;
> +     fsg->function.bind        = fsg_bind;
> +     fsg->function.unbind      = fsg_unbind;
> +     fsg->function.setup       = fsg_setup;
> +     fsg->function.set_alt     = fsg_set_alt;
> +     fsg->function.disable     = fsg_disable;
> +     fsg->function.free_func   = fsg_free;

Tab character after “free_func”.  Use either spaces or tabs
consistently.

> +
> +     fsg->common               = common;
> +     /*
> +      * Our caller holds a reference to common structure so we
> +      * don't have to be worry about it being freed until we return
> +      * from this function.  So instead of incrementing counter now
> +      * and decrement in error recovery we increment it only when
> +      * call to usb_add_function() was successful.
> +      */
> +
> +     return &fsg->function;
> +}
> +
> +DECLARE_USB_FUNCTION_INIT(mass_storage, fsg_alloc_inst, fsg_alloc);
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Michal Nazarewicz");
> +
> +#endif
>  
>  /************************* Module parameters *************************/
>  

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +--<m...@google.com>--<xmpp:min...@jabber.org>--ooO--(_)--Ooo--

Attachment: signature.asc
Description: PGP signature

Reply via email to