blob: cf6278a198a8b52ac22ae3cd0d940ccdd70cb36b [file] [log] [blame]
Chris Kelly066b2222012-02-20 21:12:35 +00001/* -----------------------------------------------------------------------------
2 * Copyright (c) 2011 Ozmo Inc
3 * Released under the GNU General Public License Version 2 (GPLv2).
4 * -----------------------------------------------------------------------------
5 */
6#include <linux/usb.h>
Joe Perchesf724b582013-07-23 13:45:00 +01007#include "ozdbg.h"
Joe Perches05f608f2013-07-23 13:45:01 +01008
Chris Kelly066b2222012-02-20 21:12:35 +00009#ifdef WANT_URB_PARANOIA
Joe Perches05f608f2013-07-23 13:45:01 +010010
Chris Kelly066b2222012-02-20 21:12:35 +000011#include "ozurbparanoia.h"
Joe Perches05f608f2013-07-23 13:45:01 +010012
Chris Kelly066b2222012-02-20 21:12:35 +000013#define OZ_MAX_URBS 1000
14struct urb *g_urb_memory[OZ_MAX_URBS];
15int g_nb_urbs;
16DEFINE_SPINLOCK(g_urb_mem_lock);
Rupesh Gujare6e244a82013-08-13 18:24:22 +010017
Chris Kelly066b2222012-02-20 21:12:35 +000018void oz_remember_urb(struct urb *urb)
19{
20 unsigned long irq_state;
Rupesh Gujare18f81912013-08-13 18:24:21 +010021
Chris Kelly066b2222012-02-20 21:12:35 +000022 spin_lock_irqsave(&g_urb_mem_lock, irq_state);
23 if (g_nb_urbs < OZ_MAX_URBS) {
24 g_urb_memory[g_nb_urbs++] = urb;
Rupesh Gujare8fd07002013-07-30 13:31:50 +010025 oz_dbg(ON, "urb up = %d %p\n", g_nb_urbs, urb);
Chris Kelly066b2222012-02-20 21:12:35 +000026 } else {
Joe Perchesf724b582013-07-23 13:45:00 +010027 oz_dbg(ON, "ERROR urb buffer full\n");
Chris Kelly066b2222012-02-20 21:12:35 +000028 }
29 spin_unlock_irqrestore(&g_urb_mem_lock, irq_state);
30}
Rupesh Gujare6e244a82013-08-13 18:24:22 +010031
Rupesh Gujare4e7fb822013-08-23 16:11:02 +010032/*
Chris Kelly066b2222012-02-20 21:12:35 +000033 */
34int oz_forget_urb(struct urb *urb)
35{
36 unsigned long irq_state;
37 int i;
38 int rc = -1;
Rupesh Gujare18f81912013-08-13 18:24:21 +010039
Chris Kelly066b2222012-02-20 21:12:35 +000040 spin_lock_irqsave(&g_urb_mem_lock, irq_state);
41 for (i = 0; i < g_nb_urbs; i++) {
42 if (g_urb_memory[i] == urb) {
43 rc = 0;
44 if (--g_nb_urbs > i)
45 memcpy(&g_urb_memory[i], &g_urb_memory[i+1],
46 (g_nb_urbs - i) * sizeof(struct urb *));
Rupesh Gujare8fd07002013-07-30 13:31:50 +010047 oz_dbg(ON, "urb down = %d %p\n", g_nb_urbs, urb);
Chris Kelly066b2222012-02-20 21:12:35 +000048 }
49 }
50 spin_unlock_irqrestore(&g_urb_mem_lock, irq_state);
51 return rc;
52}
53#endif /* #ifdef WANT_URB_PARANOIA */
54