Hello Greg Kroah-Hartman:
in drivers/usb/renesas_usbhs/mod_host.c, in function usbhsh_queue_done:
get ureq from pkt, by using the macro usbhsh_pkt_to_ureq (at line 637)
pkt is the sub-object of ureq (line 73..76, line 157..158)
free ureq, by calling function usbhsh_ureq_free (at line 655)
use kfree to free ureq in function usbhsh_ureq_free (line 184..191)
originally ureq is call kzalloc in function usbhsh_ureq_alloc (line
171..179)
so pkt also free, too.
still use pkt, by calling function usbhsh_endpoint_sequence_save (at line
657)
use pkt->zero in funcion usbhsh_endpoint_sequence_save (at line 243)
I find it through code review, please help to check this suggestion whether
valid.
if it was valid:
I prefer the relative member to provide relative patch.
if can not find relative member, I should try (although it seems not a good
idea)
Regards
gchen.
73 struct usbhsh_request {
74 struct urb *urb;
75 struct usbhs_pkt pkt;
76 };
77
...
157 #define usbhsh_pkt_to_ureq(p) \
158 container_of((void *)p, struct usbhsh_request, pkt)
...
163 static struct usbhsh_request *usbhsh_ureq_alloc(struct usbhsh_hpriv *hpriv,
164 struct urb *urb,
165 gfp_t mem_flags)
166 {
167 struct usbhsh_request *ureq;
168 struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv);
169 struct device *dev = usbhs_priv_to_dev(priv);
170
171 ureq = kzalloc(sizeof(struct usbhsh_request), mem_flags);
172 if (!ureq) {
173 dev_err(dev, "ureq alloc fail\n");
174 return NULL;
175 }
176
177 usbhs_pkt_init(&ureq->pkt);
178 ureq->urb = urb;
179 usbhsh_urb_to_ureq(urb) = ureq;
180
181 return ureq;
182 }
183
184 static void usbhsh_ureq_free(struct usbhsh_hpriv *hpriv,
185 struct usbhsh_request *ureq)
186 {
187 usbhsh_urb_to_ureq(ureq->urb) = NULL;
188 ureq->urb = NULL;
189
190 kfree(ureq);
191 }
...
211 static void usbhsh_endpoint_sequence_save(struct usbhsh_hpriv *hpriv,
212 struct urb *urb,
213 struct usbhs_pkt *pkt)
214 {
215 int len = urb->actual_length;
216 int maxp = usb_endpoint_maxp(&urb->ep->desc);
217 int t = 0;
218
219 /* DCP is out of sequence control */
220 if (usb_pipecontrol(urb->pipe))
221 return;
222
223 /*
224 * renesas_usbhs pipe has a limitation in a number.
225 * So, driver should re-use the limited pipe for each
device/endpoint.
226 * DATA0/1 sequence should be saved for it.
227 * see [image of mod_host]
228 * [HARDWARE LIMITATION]
229 */
230
231 /*
232 * next sequence depends on actual_length
233 *
234 * ex) actual_length = 1147, maxp = 512
235 * data0 : 512
236 * data1 : 512
237 * data0 : 123
238 * data1 is the next sequence
239 */
240 t = len / maxp;
241 if (len % maxp)
242 t++;
243 if (pkt->zero)
244 t++;
245 t %= 2;
246
247 if (t)
248 usb_dotoggle(urb->dev,
249 usb_pipeendpoint(urb->pipe),
250 usb_pipeout(urb->pipe));
251 }
...
635 static void usbhsh_queue_done(struct usbhs_priv *priv, struct usbhs_pkt
*pkt)
636 {
637 struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt);
638 struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv);
639 struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv);
640 struct urb *urb = ureq->urb;
641 struct device *dev = usbhs_priv_to_dev(priv);
642 int status = 0;
643
644 dev_dbg(dev, "%s\n", __func__);
645
646 if (!urb) {
647 dev_warn(dev, "pkt doesn't have urb\n");
648 return;
649 }
650
651 if (!usbhsh_is_running(hpriv))
652 status = -ESHUTDOWN;
653
654 urb->actual_length = pkt->actual;
655 usbhsh_ureq_free(hpriv, ureq);
656
657 usbhsh_endpoint_sequence_save(hpriv, urb, pkt);
658 usbhsh_pipe_detach(hpriv, usbhsh_ep_to_uep(urb->ep));
659
660 usb_hcd_unlink_urb_from_ep(hcd, urb);
661 usb_hcd_giveback_urb(hcd, urb, status);
662 }
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html