usb: gadget: u_audio: remove struct uac_req
authorJerome Brunet <jbrunet@baylibre.com>
Mon, 18 Jan 2021 08:46:41 +0000 (09:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 18 Jan 2021 17:43:09 +0000 (18:43 +0100)
'struct uac_req' purpose is to link 'struct usb_request' to the
corresponding 'struct uac_rtd_params'. However member req is never
used. Using the context of the usb request, we can keep track of the
corresponding 'struct uac_rtd_params' just as well, without allocating
extra memory.

Acked-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20210118084642.322510-4-jbrunet@baylibre.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/u_audio.c

index 27f941f..a1a1f4c 100644 (file)
 #define PRD_SIZE_MAX   PAGE_SIZE
 #define MIN_PERIODS    4
 
-struct uac_req {
-       struct uac_rtd_params *pp; /* parent param */
-       struct usb_request *req;
-};
-
 /* Runtime data params for one stream */
 struct uac_rtd_params {
        struct snd_uac_chip *uac; /* parent chip */
@@ -41,7 +36,7 @@ struct uac_rtd_params {
        void *rbuf;
 
        unsigned int max_psize; /* MaxPacketSize of endpoint */
-       struct uac_req *ureq;
+       struct usb_request **reqs;
 
        spinlock_t lock;
 };
@@ -82,10 +77,9 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
        unsigned long flags, flags2;
        unsigned int hw_ptr;
        int status = req->status;
-       struct uac_req *ur = req->context;
        struct snd_pcm_substream *substream;
        struct snd_pcm_runtime *runtime;
-       struct uac_rtd_params *prm = ur->pp;
+       struct uac_rtd_params *prm = req->context;
        struct snd_uac_chip *uac = prm->uac;
 
        /* i/f shutting down */
@@ -339,16 +333,16 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
        params = &audio_dev->params;
 
        for (i = 0; i < params->req_number; i++) {
-               if (prm->ureq[i].req) {
-                       if (usb_ep_dequeue(ep, prm->ureq[i].req))
-                               usb_ep_free_request(ep, prm->ureq[i].req);
+               if (prm->reqs[i]) {
+                       if (usb_ep_dequeue(ep, prm->reqs[i]))
+                               usb_ep_free_request(ep, prm->reqs[i]);
                        /*
                         * If usb_ep_dequeue() cannot successfully dequeue the
                         * request, the request will be freed by the completion
                         * callback.
                         */
 
-                       prm->ureq[i].req = NULL;
+                       prm->reqs[i] = NULL;
                }
        }
 
@@ -377,22 +371,21 @@ int u_audio_start_capture(struct g_audio *audio_dev)
        usb_ep_enable(ep);
 
        for (i = 0; i < params->req_number; i++) {
-               if (!prm->ureq[i].req) {
+               if (!prm->reqs[i]) {
                        req = usb_ep_alloc_request(ep, GFP_ATOMIC);
                        if (req == NULL)
                                return -ENOMEM;
 
-                       prm->ureq[i].req = req;
-                       prm->ureq[i].pp = prm;
+                       prm->reqs[i] = req;
 
                        req->zero = 0;
-                       req->context = &prm->ureq[i];
+                       req->context = prm;
                        req->length = req_len;
                        req->complete = u_audio_iso_complete;
                        req->buf = prm->rbuf + i * ep->maxpacket;
                }
 
-               if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
+               if (usb_ep_queue(ep, prm->reqs[i], GFP_ATOMIC))
                        dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
        }
 
@@ -455,22 +448,21 @@ int u_audio_start_playback(struct g_audio *audio_dev)
        usb_ep_enable(ep);
 
        for (i = 0; i < params->req_number; i++) {
-               if (!prm->ureq[i].req) {
+               if (!prm->reqs[i]) {
                        req = usb_ep_alloc_request(ep, GFP_ATOMIC);
                        if (req == NULL)
                                return -ENOMEM;
 
-                       prm->ureq[i].req = req;
-                       prm->ureq[i].pp = prm;
+                       prm->reqs[i] = req;
 
                        req->zero = 0;
-                       req->context = &prm->ureq[i];
+                       req->context = prm;
                        req->length = req_len;
                        req->complete = u_audio_iso_complete;
                        req->buf = prm->rbuf + i * ep->maxpacket;
                }
 
-               if (usb_ep_queue(ep, prm->ureq[i].req, GFP_ATOMIC))
+               if (usb_ep_queue(ep, prm->reqs[i], GFP_ATOMIC))
                        dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
        }
 
@@ -515,9 +507,10 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
                uac->c_prm.uac = uac;
                prm->max_psize = g_audio->out_ep_maxpsize;
 
-               prm->ureq = kcalloc(params->req_number, sizeof(struct uac_req),
-                               GFP_KERNEL);
-               if (!prm->ureq) {
+               prm->reqs = kcalloc(params->req_number,
+                                   sizeof(struct usb_request *),
+                                   GFP_KERNEL);
+               if (!prm->reqs) {
                        err = -ENOMEM;
                        goto fail;
                }
@@ -537,9 +530,10 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
                uac->p_prm.uac = uac;
                prm->max_psize = g_audio->in_ep_maxpsize;
 
-               prm->ureq = kcalloc(params->req_number, sizeof(struct uac_req),
-                               GFP_KERNEL);
-               if (!prm->ureq) {
+               prm->reqs = kcalloc(params->req_number,
+                                   sizeof(struct usb_request *),
+                                   GFP_KERNEL);
+               if (!prm->reqs) {
                        err = -ENOMEM;
                        goto fail;
                }
@@ -592,8 +586,8 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
 snd_fail:
        snd_card_free(card);
 fail:
-       kfree(uac->p_prm.ureq);
-       kfree(uac->c_prm.ureq);
+       kfree(uac->p_prm.reqs);
+       kfree(uac->c_prm.reqs);
        kfree(uac->p_prm.rbuf);
        kfree(uac->c_prm.rbuf);
        kfree(uac);
@@ -615,8 +609,8 @@ void g_audio_cleanup(struct g_audio *g_audio)
        if (card)
                snd_card_free(card);
 
-       kfree(uac->p_prm.ureq);
-       kfree(uac->c_prm.ureq);
+       kfree(uac->p_prm.reqs);
+       kfree(uac->c_prm.reqs);
        kfree(uac->p_prm.rbuf);
        kfree(uac->c_prm.rbuf);
        kfree(uac);