ozurbparanoia.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /* -----------------------------------------------------------------------------
  2. * Copyright (c) 2011 Ozmo Inc
  3. * Released under the GNU General Public License Version 2 (GPLv2).
  4. * -----------------------------------------------------------------------------
  5. */
  6. #include <linux/usb.h>
  7. #include "ozdbg.h"
  8. #ifdef WANT_URB_PARANOIA
  9. #include "ozurbparanoia.h"
  10. #define OZ_MAX_URBS 1000
  11. struct urb *g_urb_memory[OZ_MAX_URBS];
  12. int g_nb_urbs;
  13. DEFINE_SPINLOCK(g_urb_mem_lock);
  14. void oz_remember_urb(struct urb *urb)
  15. {
  16. unsigned long irq_state;
  17. spin_lock_irqsave(&g_urb_mem_lock, irq_state);
  18. if (g_nb_urbs < OZ_MAX_URBS) {
  19. g_urb_memory[g_nb_urbs++] = urb;
  20. oz_dbg(ON, "urb up = %d %p\n", g_nb_urbs, urb);
  21. } else {
  22. oz_dbg(ON, "ERROR urb buffer full\n");
  23. }
  24. spin_unlock_irqrestore(&g_urb_mem_lock, irq_state);
  25. }
  26. /*
  27. */
  28. int oz_forget_urb(struct urb *urb)
  29. {
  30. unsigned long irq_state;
  31. int i;
  32. int rc = -1;
  33. spin_lock_irqsave(&g_urb_mem_lock, irq_state);
  34. for (i = 0; i < g_nb_urbs; i++) {
  35. if (g_urb_memory[i] == urb) {
  36. rc = 0;
  37. if (--g_nb_urbs > i)
  38. memcpy(&g_urb_memory[i], &g_urb_memory[i+1],
  39. (g_nb_urbs - i) * sizeof(struct urb *));
  40. oz_dbg(ON, "urb down = %d %p\n", g_nb_urbs, urb);
  41. }
  42. }
  43. spin_unlock_irqrestore(&g_urb_mem_lock, irq_state);
  44. return rc;
  45. }
  46. #endif /* #ifdef WANT_URB_PARANOIA */