debug.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. #include <linux/delay.h>
  2. #include <linux/device.h>
  3. #include <linux/dmapool.h>
  4. #include <linux/dma-mapping.h>
  5. #include <linux/init.h>
  6. #include <linux/platform_device.h>
  7. #include <linux/module.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/io.h>
  10. #include <linux/irq.h>
  11. #include <linux/kernel.h>
  12. #include <linux/slab.h>
  13. #include <linux/pm_runtime.h>
  14. #include <linux/usb/ch9.h>
  15. #include <linux/usb/gadget.h>
  16. #include <linux/usb/otg.h>
  17. #include <linux/usb/chipidea.h>
  18. #include "ci.h"
  19. #include "udc.h"
  20. #include "bits.h"
  21. #include "debug.h"
  22. /* Interrupt statistics */
  23. #define ISR_MASK 0x1F
  24. static struct isr_statistics {
  25. u32 test;
  26. u32 ui;
  27. u32 uei;
  28. u32 pci;
  29. u32 uri;
  30. u32 sli;
  31. u32 none;
  32. struct {
  33. u32 cnt;
  34. u32 buf[ISR_MASK+1];
  35. u32 idx;
  36. } hndl;
  37. } isr_statistics;
  38. void dbg_interrupt(u32 intmask)
  39. {
  40. if (!intmask) {
  41. isr_statistics.none++;
  42. return;
  43. }
  44. isr_statistics.hndl.buf[isr_statistics.hndl.idx++] = intmask;
  45. isr_statistics.hndl.idx &= ISR_MASK;
  46. isr_statistics.hndl.cnt++;
  47. if (USBi_URI & intmask)
  48. isr_statistics.uri++;
  49. if (USBi_PCI & intmask)
  50. isr_statistics.pci++;
  51. if (USBi_UEI & intmask)
  52. isr_statistics.uei++;
  53. if (USBi_UI & intmask)
  54. isr_statistics.ui++;
  55. if (USBi_SLI & intmask)
  56. isr_statistics.sli++;
  57. }
  58. /**
  59. * hw_register_read: reads all device registers (execute without interruption)
  60. * @buf: destination buffer
  61. * @size: buffer size
  62. *
  63. * This function returns number of registers read
  64. */
  65. static size_t hw_register_read(struct ci13xxx *ci, u32 *buf, size_t size)
  66. {
  67. unsigned i;
  68. if (size > ci->hw_bank.size)
  69. size = ci->hw_bank.size;
  70. for (i = 0; i < size; i++)
  71. buf[i] = hw_read(ci, i * sizeof(u32), ~0);
  72. return size;
  73. }
  74. /**
  75. * hw_register_write: writes to register
  76. * @addr: register address
  77. * @data: register value
  78. *
  79. * This function returns an error code
  80. */
  81. static int hw_register_write(struct ci13xxx *ci, u16 addr, u32 data)
  82. {
  83. /* align */
  84. addr /= sizeof(u32);
  85. if (addr >= ci->hw_bank.size)
  86. return -EINVAL;
  87. /* align */
  88. addr *= sizeof(u32);
  89. hw_write(ci, addr, ~0, data);
  90. return 0;
  91. }
  92. /**
  93. * hw_intr_clear: disables interrupt & clears interrupt status (execute without
  94. * interruption)
  95. * @n: interrupt bit
  96. *
  97. * This function returns an error code
  98. */
  99. static int hw_intr_clear(struct ci13xxx *ci, int n)
  100. {
  101. if (n >= REG_BITS)
  102. return -EINVAL;
  103. hw_write(ci, OP_USBINTR, BIT(n), 0);
  104. hw_write(ci, OP_USBSTS, BIT(n), BIT(n));
  105. return 0;
  106. }
  107. /**
  108. * hw_intr_force: enables interrupt & forces interrupt status (execute without
  109. * interruption)
  110. * @n: interrupt bit
  111. *
  112. * This function returns an error code
  113. */
  114. static int hw_intr_force(struct ci13xxx *ci, int n)
  115. {
  116. if (n >= REG_BITS)
  117. return -EINVAL;
  118. hw_write(ci, CAP_TESTMODE, TESTMODE_FORCE, TESTMODE_FORCE);
  119. hw_write(ci, OP_USBINTR, BIT(n), BIT(n));
  120. hw_write(ci, OP_USBSTS, BIT(n), BIT(n));
  121. hw_write(ci, CAP_TESTMODE, TESTMODE_FORCE, 0);
  122. return 0;
  123. }
  124. /**
  125. * show_device: prints information about device capabilities and status
  126. *
  127. * Check "device.h" for details
  128. */
  129. static ssize_t show_device(struct device *dev, struct device_attribute *attr,
  130. char *buf)
  131. {
  132. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  133. struct usb_gadget *gadget = &ci->gadget;
  134. int n = 0;
  135. if (attr == NULL || buf == NULL) {
  136. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  137. return 0;
  138. }
  139. n += scnprintf(buf + n, PAGE_SIZE - n, "speed = %d\n",
  140. gadget->speed);
  141. n += scnprintf(buf + n, PAGE_SIZE - n, "max_speed = %d\n",
  142. gadget->max_speed);
  143. /* TODO: Scheduled for removal in 3.8. */
  144. n += scnprintf(buf + n, PAGE_SIZE - n, "is_dualspeed = %d\n",
  145. gadget_is_dualspeed(gadget));
  146. n += scnprintf(buf + n, PAGE_SIZE - n, "is_otg = %d\n",
  147. gadget->is_otg);
  148. n += scnprintf(buf + n, PAGE_SIZE - n, "is_a_peripheral = %d\n",
  149. gadget->is_a_peripheral);
  150. n += scnprintf(buf + n, PAGE_SIZE - n, "b_hnp_enable = %d\n",
  151. gadget->b_hnp_enable);
  152. n += scnprintf(buf + n, PAGE_SIZE - n, "a_hnp_support = %d\n",
  153. gadget->a_hnp_support);
  154. n += scnprintf(buf + n, PAGE_SIZE - n, "a_alt_hnp_support = %d\n",
  155. gadget->a_alt_hnp_support);
  156. n += scnprintf(buf + n, PAGE_SIZE - n, "name = %s\n",
  157. (gadget->name ? gadget->name : ""));
  158. return n;
  159. }
  160. static DEVICE_ATTR(device, S_IRUSR, show_device, NULL);
  161. /**
  162. * show_driver: prints information about attached gadget (if any)
  163. *
  164. * Check "device.h" for details
  165. */
  166. static ssize_t show_driver(struct device *dev, struct device_attribute *attr,
  167. char *buf)
  168. {
  169. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  170. struct usb_gadget_driver *driver = ci->driver;
  171. int n = 0;
  172. if (attr == NULL || buf == NULL) {
  173. dev_err(dev, "[%s] EINVAL\n", __func__);
  174. return 0;
  175. }
  176. if (driver == NULL)
  177. return scnprintf(buf, PAGE_SIZE,
  178. "There is no gadget attached!\n");
  179. n += scnprintf(buf + n, PAGE_SIZE - n, "function = %s\n",
  180. (driver->function ? driver->function : ""));
  181. n += scnprintf(buf + n, PAGE_SIZE - n, "max speed = %d\n",
  182. driver->max_speed);
  183. return n;
  184. }
  185. static DEVICE_ATTR(driver, S_IRUSR, show_driver, NULL);
  186. /* Maximum event message length */
  187. #define DBG_DATA_MSG 64UL
  188. /* Maximum event messages */
  189. #define DBG_DATA_MAX 128UL
  190. /* Event buffer descriptor */
  191. static struct {
  192. char (buf[DBG_DATA_MAX])[DBG_DATA_MSG]; /* buffer */
  193. unsigned idx; /* index */
  194. unsigned tty; /* print to console? */
  195. rwlock_t lck; /* lock */
  196. } dbg_data = {
  197. .idx = 0,
  198. .tty = 0,
  199. .lck = __RW_LOCK_UNLOCKED(lck)
  200. };
  201. /**
  202. * dbg_dec: decrements debug event index
  203. * @idx: buffer index
  204. */
  205. static void dbg_dec(unsigned *idx)
  206. {
  207. *idx = (*idx - 1) & (DBG_DATA_MAX-1);
  208. }
  209. /**
  210. * dbg_inc: increments debug event index
  211. * @idx: buffer index
  212. */
  213. static void dbg_inc(unsigned *idx)
  214. {
  215. *idx = (*idx + 1) & (DBG_DATA_MAX-1);
  216. }
  217. /**
  218. * dbg_print: prints the common part of the event
  219. * @addr: endpoint address
  220. * @name: event name
  221. * @status: status
  222. * @extra: extra information
  223. */
  224. static void dbg_print(u8 addr, const char *name, int status, const char *extra)
  225. {
  226. struct timeval tval;
  227. unsigned int stamp;
  228. unsigned long flags;
  229. write_lock_irqsave(&dbg_data.lck, flags);
  230. do_gettimeofday(&tval);
  231. stamp = tval.tv_sec & 0xFFFF; /* 2^32 = 4294967296. Limit to 4096s */
  232. stamp = stamp * 1000000 + tval.tv_usec;
  233. scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG,
  234. "%04X\t? %02X %-7.7s %4i ?\t%s\n",
  235. stamp, addr, name, status, extra);
  236. dbg_inc(&dbg_data.idx);
  237. write_unlock_irqrestore(&dbg_data.lck, flags);
  238. if (dbg_data.tty != 0)
  239. pr_notice("%04X\t? %02X %-7.7s %4i ?\t%s\n",
  240. stamp, addr, name, status, extra);
  241. }
  242. /**
  243. * dbg_done: prints a DONE event
  244. * @addr: endpoint address
  245. * @td: transfer descriptor
  246. * @status: status
  247. */
  248. void dbg_done(u8 addr, const u32 token, int status)
  249. {
  250. char msg[DBG_DATA_MSG];
  251. scnprintf(msg, sizeof(msg), "%d %02X",
  252. (int)(token & TD_TOTAL_BYTES) >> ffs_nr(TD_TOTAL_BYTES),
  253. (int)(token & TD_STATUS) >> ffs_nr(TD_STATUS));
  254. dbg_print(addr, "DONE", status, msg);
  255. }
  256. /**
  257. * dbg_event: prints a generic event
  258. * @addr: endpoint address
  259. * @name: event name
  260. * @status: status
  261. */
  262. void dbg_event(u8 addr, const char *name, int status)
  263. {
  264. if (name != NULL)
  265. dbg_print(addr, name, status, "");
  266. }
  267. /*
  268. * dbg_queue: prints a QUEUE event
  269. * @addr: endpoint address
  270. * @req: USB request
  271. * @status: status
  272. */
  273. void dbg_queue(u8 addr, const struct usb_request *req, int status)
  274. {
  275. char msg[DBG_DATA_MSG];
  276. if (req != NULL) {
  277. scnprintf(msg, sizeof(msg),
  278. "%d %d", !req->no_interrupt, req->length);
  279. dbg_print(addr, "QUEUE", status, msg);
  280. }
  281. }
  282. /**
  283. * dbg_setup: prints a SETUP event
  284. * @addr: endpoint address
  285. * @req: setup request
  286. */
  287. void dbg_setup(u8 addr, const struct usb_ctrlrequest *req)
  288. {
  289. char msg[DBG_DATA_MSG];
  290. if (req != NULL) {
  291. scnprintf(msg, sizeof(msg),
  292. "%02X %02X %04X %04X %d", req->bRequestType,
  293. req->bRequest, le16_to_cpu(req->wValue),
  294. le16_to_cpu(req->wIndex), le16_to_cpu(req->wLength));
  295. dbg_print(addr, "SETUP", 0, msg);
  296. }
  297. }
  298. /**
  299. * show_events: displays the event buffer
  300. *
  301. * Check "device.h" for details
  302. */
  303. static ssize_t show_events(struct device *dev, struct device_attribute *attr,
  304. char *buf)
  305. {
  306. unsigned long flags;
  307. unsigned i, j, n = 0;
  308. if (attr == NULL || buf == NULL) {
  309. dev_err(dev->parent, "[%s] EINVAL\n", __func__);
  310. return 0;
  311. }
  312. read_lock_irqsave(&dbg_data.lck, flags);
  313. i = dbg_data.idx;
  314. for (dbg_dec(&i); i != dbg_data.idx; dbg_dec(&i)) {
  315. n += strlen(dbg_data.buf[i]);
  316. if (n >= PAGE_SIZE) {
  317. n -= strlen(dbg_data.buf[i]);
  318. break;
  319. }
  320. }
  321. for (j = 0, dbg_inc(&i); j < n; dbg_inc(&i))
  322. j += scnprintf(buf + j, PAGE_SIZE - j,
  323. "%s", dbg_data.buf[i]);
  324. read_unlock_irqrestore(&dbg_data.lck, flags);
  325. return n;
  326. }
  327. /**
  328. * store_events: configure if events are going to be also printed to console
  329. *
  330. * Check "device.h" for details
  331. */
  332. static ssize_t store_events(struct device *dev, struct device_attribute *attr,
  333. const char *buf, size_t count)
  334. {
  335. unsigned tty;
  336. if (attr == NULL || buf == NULL) {
  337. dev_err(dev, "[%s] EINVAL\n", __func__);
  338. goto done;
  339. }
  340. if (sscanf(buf, "%u", &tty) != 1 || tty > 1) {
  341. dev_err(dev, "<1|0>: enable|disable console log\n");
  342. goto done;
  343. }
  344. dbg_data.tty = tty;
  345. dev_info(dev, "tty = %u", dbg_data.tty);
  346. done:
  347. return count;
  348. }
  349. static DEVICE_ATTR(events, S_IRUSR | S_IWUSR, show_events, store_events);
  350. /**
  351. * show_inters: interrupt status, enable status and historic
  352. *
  353. * Check "device.h" for details
  354. */
  355. static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
  356. char *buf)
  357. {
  358. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  359. unsigned long flags;
  360. u32 intr;
  361. unsigned i, j, n = 0;
  362. if (attr == NULL || buf == NULL) {
  363. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  364. return 0;
  365. }
  366. spin_lock_irqsave(&ci->lock, flags);
  367. /*n += scnprintf(buf + n, PAGE_SIZE - n,
  368. "status = %08x\n", hw_read_intr_status(ci));
  369. n += scnprintf(buf + n, PAGE_SIZE - n,
  370. "enable = %08x\n", hw_read_intr_enable(ci));*/
  371. n += scnprintf(buf + n, PAGE_SIZE - n, "*test = %d\n",
  372. isr_statistics.test);
  373. n += scnprintf(buf + n, PAGE_SIZE - n, "? ui = %d\n",
  374. isr_statistics.ui);
  375. n += scnprintf(buf + n, PAGE_SIZE - n, "? uei = %d\n",
  376. isr_statistics.uei);
  377. n += scnprintf(buf + n, PAGE_SIZE - n, "? pci = %d\n",
  378. isr_statistics.pci);
  379. n += scnprintf(buf + n, PAGE_SIZE - n, "? uri = %d\n",
  380. isr_statistics.uri);
  381. n += scnprintf(buf + n, PAGE_SIZE - n, "? sli = %d\n",
  382. isr_statistics.sli);
  383. n += scnprintf(buf + n, PAGE_SIZE - n, "*none = %d\n",
  384. isr_statistics.none);
  385. n += scnprintf(buf + n, PAGE_SIZE - n, "*hndl = %d\n",
  386. isr_statistics.hndl.cnt);
  387. for (i = isr_statistics.hndl.idx, j = 0; j <= ISR_MASK; j++, i++) {
  388. i &= ISR_MASK;
  389. intr = isr_statistics.hndl.buf[i];
  390. if (USBi_UI & intr)
  391. n += scnprintf(buf + n, PAGE_SIZE - n, "ui ");
  392. intr &= ~USBi_UI;
  393. if (USBi_UEI & intr)
  394. n += scnprintf(buf + n, PAGE_SIZE - n, "uei ");
  395. intr &= ~USBi_UEI;
  396. if (USBi_PCI & intr)
  397. n += scnprintf(buf + n, PAGE_SIZE - n, "pci ");
  398. intr &= ~USBi_PCI;
  399. if (USBi_URI & intr)
  400. n += scnprintf(buf + n, PAGE_SIZE - n, "uri ");
  401. intr &= ~USBi_URI;
  402. if (USBi_SLI & intr)
  403. n += scnprintf(buf + n, PAGE_SIZE - n, "sli ");
  404. intr &= ~USBi_SLI;
  405. if (intr)
  406. n += scnprintf(buf + n, PAGE_SIZE - n, "??? ");
  407. if (isr_statistics.hndl.buf[i])
  408. n += scnprintf(buf + n, PAGE_SIZE - n, "\n");
  409. }
  410. spin_unlock_irqrestore(&ci->lock, flags);
  411. return n;
  412. }
  413. /**
  414. * store_inters: enable & force or disable an individual interrutps
  415. * (to be used for test purposes only)
  416. *
  417. * Check "device.h" for details
  418. */
  419. static ssize_t store_inters(struct device *dev, struct device_attribute *attr,
  420. const char *buf, size_t count)
  421. {
  422. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  423. unsigned long flags;
  424. unsigned en, bit;
  425. if (attr == NULL || buf == NULL) {
  426. dev_err(ci->dev, "EINVAL\n");
  427. goto done;
  428. }
  429. if (sscanf(buf, "%u %u", &en, &bit) != 2 || en > 1) {
  430. dev_err(ci->dev, "<1|0> <bit>: enable|disable interrupt\n");
  431. goto done;
  432. }
  433. spin_lock_irqsave(&ci->lock, flags);
  434. if (en) {
  435. if (hw_intr_force(ci, bit))
  436. dev_err(dev, "invalid bit number\n");
  437. else
  438. isr_statistics.test++;
  439. } else {
  440. if (hw_intr_clear(ci, bit))
  441. dev_err(dev, "invalid bit number\n");
  442. }
  443. spin_unlock_irqrestore(&ci->lock, flags);
  444. done:
  445. return count;
  446. }
  447. static DEVICE_ATTR(inters, S_IRUSR | S_IWUSR, show_inters, store_inters);
  448. /**
  449. * show_port_test: reads port test mode
  450. *
  451. * Check "device.h" for details
  452. */
  453. static ssize_t show_port_test(struct device *dev,
  454. struct device_attribute *attr, char *buf)
  455. {
  456. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  457. unsigned long flags;
  458. unsigned mode;
  459. if (attr == NULL || buf == NULL) {
  460. dev_err(ci->dev, "EINVAL\n");
  461. return 0;
  462. }
  463. spin_lock_irqsave(&ci->lock, flags);
  464. mode = hw_port_test_get(ci);
  465. spin_unlock_irqrestore(&ci->lock, flags);
  466. return scnprintf(buf, PAGE_SIZE, "mode = %u\n", mode);
  467. }
  468. /**
  469. * store_port_test: writes port test mode
  470. *
  471. * Check "device.h" for details
  472. */
  473. static ssize_t store_port_test(struct device *dev,
  474. struct device_attribute *attr,
  475. const char *buf, size_t count)
  476. {
  477. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  478. unsigned long flags;
  479. unsigned mode;
  480. if (attr == NULL || buf == NULL) {
  481. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  482. goto done;
  483. }
  484. if (sscanf(buf, "%u", &mode) != 1) {
  485. dev_err(ci->dev, "<mode>: set port test mode");
  486. goto done;
  487. }
  488. spin_lock_irqsave(&ci->lock, flags);
  489. if (hw_port_test_set(ci, mode))
  490. dev_err(ci->dev, "invalid mode\n");
  491. spin_unlock_irqrestore(&ci->lock, flags);
  492. done:
  493. return count;
  494. }
  495. static DEVICE_ATTR(port_test, S_IRUSR | S_IWUSR,
  496. show_port_test, store_port_test);
  497. /**
  498. * show_qheads: DMA contents of all queue heads
  499. *
  500. * Check "device.h" for details
  501. */
  502. static ssize_t show_qheads(struct device *dev, struct device_attribute *attr,
  503. char *buf)
  504. {
  505. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  506. unsigned long flags;
  507. unsigned i, j, n = 0;
  508. if (attr == NULL || buf == NULL) {
  509. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  510. return 0;
  511. }
  512. spin_lock_irqsave(&ci->lock, flags);
  513. for (i = 0; i < ci->hw_ep_max/2; i++) {
  514. struct ci13xxx_ep *mEpRx = &ci->ci13xxx_ep[i];
  515. struct ci13xxx_ep *mEpTx =
  516. &ci->ci13xxx_ep[i + ci->hw_ep_max/2];
  517. n += scnprintf(buf + n, PAGE_SIZE - n,
  518. "EP=%02i: RX=%08X TX=%08X\n",
  519. i, (u32)mEpRx->qh.dma, (u32)mEpTx->qh.dma);
  520. for (j = 0; j < (sizeof(struct ci13xxx_qh)/sizeof(u32)); j++) {
  521. n += scnprintf(buf + n, PAGE_SIZE - n,
  522. " %04X: %08X %08X\n", j,
  523. *((u32 *)mEpRx->qh.ptr + j),
  524. *((u32 *)mEpTx->qh.ptr + j));
  525. }
  526. }
  527. spin_unlock_irqrestore(&ci->lock, flags);
  528. return n;
  529. }
  530. static DEVICE_ATTR(qheads, S_IRUSR, show_qheads, NULL);
  531. /**
  532. * show_registers: dumps all registers
  533. *
  534. * Check "device.h" for details
  535. */
  536. #define DUMP_ENTRIES 512
  537. static ssize_t show_registers(struct device *dev,
  538. struct device_attribute *attr, char *buf)
  539. {
  540. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  541. unsigned long flags;
  542. u32 *dump;
  543. unsigned i, k, n = 0;
  544. if (attr == NULL || buf == NULL) {
  545. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  546. return 0;
  547. }
  548. dump = kmalloc(sizeof(u32) * DUMP_ENTRIES, GFP_KERNEL);
  549. if (!dump) {
  550. dev_err(ci->dev, "%s: out of memory\n", __func__);
  551. return 0;
  552. }
  553. spin_lock_irqsave(&ci->lock, flags);
  554. k = hw_register_read(ci, dump, DUMP_ENTRIES);
  555. spin_unlock_irqrestore(&ci->lock, flags);
  556. for (i = 0; i < k; i++) {
  557. n += scnprintf(buf + n, PAGE_SIZE - n,
  558. "reg[0x%04X] = 0x%08X\n",
  559. i * (unsigned)sizeof(u32), dump[i]);
  560. }
  561. kfree(dump);
  562. return n;
  563. }
  564. /**
  565. * store_registers: writes value to register address
  566. *
  567. * Check "device.h" for details
  568. */
  569. static ssize_t store_registers(struct device *dev,
  570. struct device_attribute *attr,
  571. const char *buf, size_t count)
  572. {
  573. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  574. unsigned long addr, data, flags;
  575. if (attr == NULL || buf == NULL) {
  576. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  577. goto done;
  578. }
  579. if (sscanf(buf, "%li %li", &addr, &data) != 2) {
  580. dev_err(ci->dev,
  581. "<addr> <data>: write data to register address\n");
  582. goto done;
  583. }
  584. spin_lock_irqsave(&ci->lock, flags);
  585. if (hw_register_write(ci, addr, data))
  586. dev_err(ci->dev, "invalid address range\n");
  587. spin_unlock_irqrestore(&ci->lock, flags);
  588. done:
  589. return count;
  590. }
  591. static DEVICE_ATTR(registers, S_IRUSR | S_IWUSR,
  592. show_registers, store_registers);
  593. /**
  594. * show_requests: DMA contents of all requests currently queued (all endpts)
  595. *
  596. * Check "device.h" for details
  597. */
  598. static ssize_t show_requests(struct device *dev, struct device_attribute *attr,
  599. char *buf)
  600. {
  601. struct ci13xxx *ci = container_of(dev, struct ci13xxx, gadget.dev);
  602. unsigned long flags;
  603. struct list_head *ptr = NULL;
  604. struct ci13xxx_req *req = NULL;
  605. unsigned i, j, n = 0, qSize = sizeof(struct ci13xxx_td)/sizeof(u32);
  606. if (attr == NULL || buf == NULL) {
  607. dev_err(ci->dev, "[%s] EINVAL\n", __func__);
  608. return 0;
  609. }
  610. spin_lock_irqsave(&ci->lock, flags);
  611. for (i = 0; i < ci->hw_ep_max; i++)
  612. list_for_each(ptr, &ci->ci13xxx_ep[i].qh.queue)
  613. {
  614. req = list_entry(ptr, struct ci13xxx_req, queue);
  615. n += scnprintf(buf + n, PAGE_SIZE - n,
  616. "EP=%02i: TD=%08X %s\n",
  617. i % ci->hw_ep_max/2, (u32)req->dma,
  618. ((i < ci->hw_ep_max/2) ? "RX" : "TX"));
  619. for (j = 0; j < qSize; j++)
  620. n += scnprintf(buf + n, PAGE_SIZE - n,
  621. " %04X: %08X\n", j,
  622. *((u32 *)req->ptr + j));
  623. }
  624. spin_unlock_irqrestore(&ci->lock, flags);
  625. return n;
  626. }
  627. static DEVICE_ATTR(requests, S_IRUSR, show_requests, NULL);
  628. /**
  629. * dbg_create_files: initializes the attribute interface
  630. * @dev: device
  631. *
  632. * This function returns an error code
  633. */
  634. int dbg_create_files(struct device *dev)
  635. {
  636. int retval = 0;
  637. if (dev == NULL)
  638. return -EINVAL;
  639. retval = device_create_file(dev, &dev_attr_device);
  640. if (retval)
  641. goto done;
  642. retval = device_create_file(dev, &dev_attr_driver);
  643. if (retval)
  644. goto rm_device;
  645. retval = device_create_file(dev, &dev_attr_events);
  646. if (retval)
  647. goto rm_driver;
  648. retval = device_create_file(dev, &dev_attr_inters);
  649. if (retval)
  650. goto rm_events;
  651. retval = device_create_file(dev, &dev_attr_port_test);
  652. if (retval)
  653. goto rm_inters;
  654. retval = device_create_file(dev, &dev_attr_qheads);
  655. if (retval)
  656. goto rm_port_test;
  657. retval = device_create_file(dev, &dev_attr_registers);
  658. if (retval)
  659. goto rm_qheads;
  660. retval = device_create_file(dev, &dev_attr_requests);
  661. if (retval)
  662. goto rm_registers;
  663. return 0;
  664. rm_registers:
  665. device_remove_file(dev, &dev_attr_registers);
  666. rm_qheads:
  667. device_remove_file(dev, &dev_attr_qheads);
  668. rm_port_test:
  669. device_remove_file(dev, &dev_attr_port_test);
  670. rm_inters:
  671. device_remove_file(dev, &dev_attr_inters);
  672. rm_events:
  673. device_remove_file(dev, &dev_attr_events);
  674. rm_driver:
  675. device_remove_file(dev, &dev_attr_driver);
  676. rm_device:
  677. device_remove_file(dev, &dev_attr_device);
  678. done:
  679. return retval;
  680. }
  681. /**
  682. * dbg_remove_files: destroys the attribute interface
  683. * @dev: device
  684. *
  685. * This function returns an error code
  686. */
  687. int dbg_remove_files(struct device *dev)
  688. {
  689. if (dev == NULL)
  690. return -EINVAL;
  691. device_remove_file(dev, &dev_attr_requests);
  692. device_remove_file(dev, &dev_attr_registers);
  693. device_remove_file(dev, &dev_attr_qheads);
  694. device_remove_file(dev, &dev_attr_port_test);
  695. device_remove_file(dev, &dev_attr_inters);
  696. device_remove_file(dev, &dev_attr_events);
  697. device_remove_file(dev, &dev_attr_driver);
  698. device_remove_file(dev, &dev_attr_device);
  699. return 0;
  700. }