Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 129.46 KB | None | 0 0
  1.  
  2. c_can.o: file format elf32-littlearm
  3.  
  4.  
  5. Disassembly of section .text:
  6.  
  7. 00000000 <c_can_irq_control>:
  8. if (priv->raminit)
  9. priv->raminit(priv, enable);
  10. }
  11.  
  12. static void c_can_irq_control(struct c_can_priv *priv, bool enable)
  13. {
  14. 0: e1a0c00d mov ip, sp
  15. 4: e92dd830 push {r4, r5, fp, ip, lr, pc}
  16. 8: e24cb004 sub fp, ip, #4
  17. c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  18. 10: ebfffffe bl 0 <__gnu_mcount_nc>
  19. 14: e1a05001 mov r5, r1
  20. u32 ctrl = priv->read_reg(priv, C_CAN_CTRL_REG) & ~CONTROL_IRQMSK;
  21. 18: e3a01000 mov r1, #0
  22. 1c: e5903134 ldr r3, [r0, #308] ; 0x134
  23. if (priv->raminit)
  24. priv->raminit(priv, enable);
  25. }
  26.  
  27. static void c_can_irq_control(struct c_can_priv *priv, bool enable)
  28. {
  29. 20: e1a04000 mov r4, r0
  30. u32 ctrl = priv->read_reg(priv, C_CAN_CTRL_REG) & ~CONTROL_IRQMSK;
  31. 24: e12fff33 blx r3
  32.  
  33. if (enable)
  34. 28: e3550000 cmp r5, #0
  35. priv->raminit(priv, enable);
  36. }
  37.  
  38. static void c_can_irq_control(struct c_can_priv *priv, bool enable)
  39. {
  40. u32 ctrl = priv->read_reg(priv, C_CAN_CTRL_REG) & ~CONTROL_IRQMSK;
  41. 2c: e3c0200e bic r2, r0, #14
  42.  
  43. if (enable)
  44. ctrl |= CONTROL_IRQMSK;
  45. 30: 1382200e orrne r2, r2, #14
  46.  
  47. priv->write_reg(priv, C_CAN_CTRL_REG, ctrl);
  48. 34: e5943138 ldr r3, [r4, #312] ; 0x138
  49. 38: e6ff2072 uxth r2, r2
  50. 3c: e1a00004 mov r0, r4
  51. 40: e3a01000 mov r1, #0
  52. 44: e12fff33 blx r3
  53. 48: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  54.  
  55. 0000004c <c_can_stop>:
  56.  
  57. return 0;
  58. }
  59.  
  60. static void c_can_stop(struct net_device *dev)
  61. {
  62. 4c: e1a0c00d mov ip, sp
  63. 50: e92dd830 push {r4, r5, fp, ip, lr, pc}
  64. 54: e24cb004 sub fp, ip, #4
  65. 58: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  66. 5c: ebfffffe bl 0 <__gnu_mcount_nc>
  67. struct c_can_priv *priv = netdev_priv(dev);
  68. 60: e2805d13 add r5, r0, #1216 ; 0x4c0
  69.  
  70. return 0;
  71. }
  72.  
  73. static void c_can_stop(struct net_device *dev)
  74. {
  75. 64: e1a04000 mov r4, r0
  76. struct c_can_priv *priv = netdev_priv(dev);
  77.  
  78. c_can_irq_control(priv, false);
  79. 68: e3a01000 mov r1, #0
  80. 6c: e1a00005 mov r0, r5
  81. 70: ebffffe2 bl 0 <c_can_irq_control>
  82.  
  83. /* put ctrl to init on stop to end ongoing transmission */
  84. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_INIT);
  85. 74: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  86. 78: e1a00005 mov r0, r5
  87. 7c: e3a01000 mov r1, #0
  88. 80: e3a02001 mov r2, #1
  89. 84: e12fff33 blx r3
  90.  
  91. /* deactivate pins */
  92. pinctrl_pm_select_sleep_state(dev->dev.parent);
  93. priv->can.state = CAN_STATE_STOPPED;
  94. 88: e3a03004 mov r3, #4
  95. 8c: e5843524 str r3, [r4, #1316] ; 0x524
  96. 90: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  97.  
  98. 00000094 <alloc_c_can_dev>:
  99.  
  100. return 0;
  101. }
  102.  
  103. struct net_device *alloc_c_can_dev(void)
  104. {
  105. 94: e1a0c00d mov ip, sp
  106. 98: e92dd818 push {r3, r4, fp, ip, lr, pc}
  107. 9c: e24cb004 sub fp, ip, #4
  108. a0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  109. a4: ebfffffe bl 0 <__gnu_mcount_nc>
  110. struct net_device *dev;
  111. struct c_can_priv *priv;
  112.  
  113. dev = alloc_candev(sizeof(struct c_can_priv), C_CAN_MSG_OBJ_TX_NUM);
  114. a8: e3a00e1b mov r0, #432 ; 0x1b0
  115. ac: e3a01010 mov r1, #16
  116. b0: ebfffffe bl 0 <alloc_candev>
  117. if (!dev)
  118. b4: e2504000 subs r4, r0, #0
  119. b8: 0a000010 beq 100 <alloc_c_can_dev+0x6c>
  120. return NULL;
  121.  
  122. priv = netdev_priv(dev);
  123. netif_napi_add(dev, &priv->napi, c_can_poll, C_CAN_NAPI_WEIGHT);
  124. bc: e3002000 movw r2, #0
  125. c0: e2841e57 add r1, r4, #1392 ; 0x570
  126. c4: e3402000 movt r2, #0
  127. c8: e3a03010 mov r3, #16
  128. cc: ebfffffe bl 0 <netif_napi_add>
  129.  
  130. priv->dev = dev;
  131. priv->can.bittiming_const = &c_can_bittiming_const;
  132. d0: e3001000 movw r1, #0
  133. priv->can.do_set_mode = c_can_set_mode;
  134. d4: e3002000 movw r2, #0
  135. priv->can.do_get_berr_counter = c_can_get_berr_counter;
  136. d8: e3003000 movw r3, #0
  137.  
  138. priv = netdev_priv(dev);
  139. netif_napi_add(dev, &priv->napi, c_can_poll, C_CAN_NAPI_WEIGHT);
  140.  
  141. priv->dev = dev;
  142. priv->can.bittiming_const = &c_can_bittiming_const;
  143. dc: e3401000 movt r1, #0
  144. priv->can.do_set_mode = c_can_set_mode;
  145. e0: e3402000 movt r2, #0
  146. priv->can.do_get_berr_counter = c_can_get_berr_counter;
  147. e4: e3403000 movt r3, #0
  148. priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
  149. e8: e3a00013 mov r0, #19
  150. return NULL;
  151.  
  152. priv = netdev_priv(dev);
  153. netif_napi_add(dev, &priv->napi, c_can_poll, C_CAN_NAPI_WEIGHT);
  154.  
  155. priv->dev = dev;
  156. ec: e58445e0 str r4, [r4, #1504] ; 0x5e0
  157. priv->can.bittiming_const = &c_can_bittiming_const;
  158. f0: e5841518 str r1, [r4, #1304] ; 0x518
  159. priv->can.do_set_mode = c_can_set_mode;
  160. f4: e5842558 str r2, [r4, #1368] ; 0x558
  161. priv->can.do_get_berr_counter = c_can_get_berr_counter;
  162. f8: e5843560 str r3, [r4, #1376] ; 0x560
  163. priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
  164. fc: e584052c str r0, [r4, #1324] ; 0x52c
  165. CAN_CTRLMODE_LISTENONLY |
  166. CAN_CTRLMODE_BERR_REPORTING;
  167.  
  168. return dev;
  169. }
  170. 100: e1a00004 mov r0, r4
  171. 104: e89da818 ldm sp, {r3, r4, fp, sp, pc}
  172.  
  173. 00000108 <c_can_get_berr_counter>:
  174. return 0;
  175. }
  176.  
  177. static int c_can_get_berr_counter(const struct net_device *dev,
  178. struct can_berr_counter *bec)
  179. {
  180. 108: e1a0c00d mov ip, sp
  181. 10c: e92dd830 push {r4, r5, fp, ip, lr, pc}
  182. 110: e24cb004 sub fp, ip, #4
  183. 114: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  184. 118: ebfffffe bl 0 <__gnu_mcount_nc>
  185. 11c: e1a04000 mov r4, r0
  186. 120: e1a05001 mov r5, r1
  187. pm_runtime_disable(priv->device);
  188. }
  189.  
  190. static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
  191. {
  192. if (priv->device)
  193. 124: e59005e4 ldr r0, [r0, #1508] ; 0x5e4
  194. 128: e3500000 cmp r0, #0
  195. 12c: 0a000001 beq 138 <c_can_get_berr_counter+0x30>
  196. return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
  197. }
  198.  
  199. static inline int pm_runtime_get_sync(struct device *dev)
  200. {
  201. return __pm_runtime_resume(dev, RPM_GET_PUT);
  202. 130: e3a01004 mov r1, #4
  203. 134: ebfffffe bl 0 <__pm_runtime_resume>
  204. struct can_berr_counter *bec)
  205. {
  206. unsigned int reg_err_counter;
  207. struct c_can_priv *priv = netdev_priv(dev);
  208.  
  209. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  210. 138: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  211. 13c: e2840d13 add r0, r4, #1216 ; 0x4c0
  212. 140: e3a01003 mov r1, #3
  213. 144: e12fff33 blx r3
  214. bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
  215. ERR_CNT_REC_SHIFT;
  216. bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK;
  217. 148: e6ef3070 uxtb r3, r0
  218. {
  219. unsigned int reg_err_counter;
  220. struct c_can_priv *priv = netdev_priv(dev);
  221.  
  222. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  223. bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
  224. 14c: e7e60450 ubfx r0, r0, #8, #7
  225. 150: e1c500b2 strh r0, [r5, #2]
  226. ERR_CNT_REC_SHIFT;
  227. bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK;
  228. 154: e1c530b0 strh r3, [r5]
  229. pm_runtime_get_sync(priv->device);
  230. }
  231.  
  232. static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
  233. {
  234. if (priv->device)
  235. 158: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  236. 15c: e3500000 cmp r0, #0
  237. 160: 0a000001 beq 16c <c_can_get_berr_counter+0x64>
  238. RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
  239. }
  240.  
  241. static inline int pm_runtime_put_sync(struct device *dev)
  242. {
  243. return __pm_runtime_idle(dev, RPM_GET_PUT);
  244. 164: e3a01004 mov r1, #4
  245. 168: ebfffffe bl 0 <__pm_runtime_idle>
  246. c_can_pm_runtime_get_sync(priv);
  247. err = __c_can_get_berr_counter(dev, bec);
  248. c_can_pm_runtime_put_sync(priv);
  249.  
  250. return err;
  251. }
  252. 16c: e3a00000 mov r0, #0
  253. 170: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  254.  
  255. 00000174 <c_can_obj_update>:
  256.  
  257. priv->write_reg(priv, C_CAN_CTRL_REG, ctrl);
  258. }
  259.  
  260. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  261. {
  262. 174: e1a0c00d mov ip, sp
  263. 178: e92dd9f8 push {r3, r4, r5, r6, r7, r8, fp, ip, lr, pc}
  264. 17c: e24cb004 sub fp, ip, #4
  265. 180: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  266. 184: ebfffffe bl 0 <__gnu_mcount_nc>
  267. struct c_can_priv *priv = netdev_priv(dev);
  268. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  269. 188: e0818101 add r8, r1, r1, lsl #2
  270. priv->write_reg(priv, C_CAN_CTRL_REG, ctrl);
  271. }
  272.  
  273. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  274. {
  275. struct c_can_priv *priv = netdev_priv(dev);
  276. 18c: e2807d13 add r7, r0, #1216 ; 0x4c0
  277.  
  278. priv->write_reg(priv, C_CAN_CTRL_REG, ctrl);
  279. }
  280.  
  281. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  282. {
  283. 190: e1a05000 mov r5, r0
  284. struct c_can_priv *priv = netdev_priv(dev);
  285. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  286.  
  287. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  288. 194: e1832802 orr r2, r3, r2, lsl #16
  289. }
  290.  
  291. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  292. {
  293. struct c_can_priv *priv = netdev_priv(dev);
  294. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  295. 198: e0811088 add r1, r1, r8, lsl #1
  296. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  297.  
  298. for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
  299. if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
  300. return;
  301. udelay(1);
  302. 19c: e3006000 movw r6, #0
  303. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  304. {
  305. struct c_can_priv *priv = netdev_priv(dev);
  306. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  307.  
  308. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  309. 1a0: e5903600 ldr r3, [r0, #1536] ; 0x600
  310. 1a4: e1a00007 mov r0, r7
  311. }
  312.  
  313. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  314. {
  315. struct c_can_priv *priv = netdev_priv(dev);
  316. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  317. 1a8: e2818008 add r8, r1, #8
  318. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  319.  
  320. for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
  321. if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
  322. return;
  323. udelay(1);
  324. 1ac: e3406000 movt r6, #0
  325. static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj)
  326. {
  327. struct c_can_priv *priv = netdev_priv(dev);
  328. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  329.  
  330. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  331. 1b0: e1a01008 mov r1, r8
  332. 1b4: e3a04006 mov r4, #6
  333. 1b8: e12fff33 blx r3
  334.  
  335. for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
  336. if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
  337. 1bc: e59535f4 ldr r3, [r5, #1524] ; 0x5f4
  338. 1c0: e1a00007 mov r0, r7
  339. 1c4: e1a01008 mov r1, r8
  340. 1c8: e12fff33 blx r3
  341. 1cc: e3100902 tst r0, #32768 ; 0x8000
  342. return;
  343. udelay(1);
  344. 1d0: e30a036e movw r0, #41838 ; 0xa36e
  345. 1d4: e3400001 movt r0, #1
  346. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  347.  
  348. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  349.  
  350. for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
  351. if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
  352. 1d8: 089da9f8 ldmeq sp, {r3, r4, r5, r6, r7, r8, fp, sp, pc}
  353. return;
  354. udelay(1);
  355. 1dc: e5963004 ldr r3, [r6, #4]
  356. 1e0: e12fff33 blx r3
  357. struct c_can_priv *priv = netdev_priv(dev);
  358. int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
  359.  
  360. priv->write_reg32(priv, reg, (cmd << 16) | obj);
  361.  
  362. for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
  363. 1e4: e2544001 subs r4, r4, #1
  364. 1e8: 1afffff3 bne 1bc <c_can_obj_update+0x48>
  365. if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
  366. return;
  367. udelay(1);
  368. }
  369. netdev_err(dev, "Updating object timed out\n");
  370. 1ec: e3001000 movw r1, #0
  371. 1f0: e1a00005 mov r0, r5
  372. 1f4: e3401000 movt r1, #0
  373. 1f8: ebfffffe bl 0 <netdev_err>
  374. 1fc: e89da9f8 ldm sp, {r3, r4, r5, r6, r7, r8, fp, sp, pc}
  375.  
  376. 00000200 <c_can_inval_tx_object>:
  377. * Note: According to documentation clearing TXIE while MSGVAL is set
  378. * is not allowed, but works nicely on C/DCAN. And that lowers the I/O
  379. * load significantly.
  380. */
  381. static void c_can_inval_tx_object(struct net_device *dev, int iface, int obj)
  382. {
  383. 200: e1a0c00d mov ip, sp
  384. 204: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
  385. 208: e24cb004 sub fp, ip, #4
  386. 20c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  387. 210: ebfffffe bl 0 <__gnu_mcount_nc>
  388. 214: e1a04001 mov r4, r1
  389. struct c_can_priv *priv = netdev_priv(dev);
  390.  
  391. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  392. 218: e0811101 add r1, r1, r1, lsl #2
  393. 21c: e59035f8 ldr r3, [r0, #1528] ; 0x5f8
  394. * Note: According to documentation clearing TXIE while MSGVAL is set
  395. * is not allowed, but works nicely on C/DCAN. And that lowers the I/O
  396. * load significantly.
  397. */
  398. static void c_can_inval_tx_object(struct net_device *dev, int iface, int obj)
  399. {
  400. 220: e1a05000 mov r5, r0
  401. struct c_can_priv *priv = netdev_priv(dev);
  402.  
  403. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  404. 224: e0841081 add r1, r4, r1, lsl #1
  405. * Note: According to documentation clearing TXIE while MSGVAL is set
  406. * is not allowed, but works nicely on C/DCAN. And that lowers the I/O
  407. * load significantly.
  408. */
  409. static void c_can_inval_tx_object(struct net_device *dev, int iface, int obj)
  410. {
  411. 228: e1a06002 mov r6, r2
  412. struct c_can_priv *priv = netdev_priv(dev);
  413.  
  414. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  415. 22c: e2800d13 add r0, r0, #1216 ; 0x4c0
  416. 230: e3a02000 mov r2, #0
  417. 234: e281100e add r1, r1, #14
  418. 238: e12fff33 blx r3
  419. }
  420.  
  421. static inline void c_can_object_put(struct net_device *dev, int iface,
  422. u32 obj, u32 cmd)
  423. {
  424. c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj);
  425. 23c: e1a00005 mov r0, r5
  426. 240: e1a01004 mov r1, r4
  427. 244: e1a03006 mov r3, r6
  428. 248: e3a020b0 mov r2, #176 ; 0xb0
  429. 24c: ebffffc8 bl 174 <c_can_obj_update>
  430. 250: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc}
  431.  
  432. 00000254 <c_can_inval_msg_object>:
  433. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  434. c_can_object_put(dev, iface, obj, IF_COMM_INVAL);
  435. }
  436.  
  437. static void c_can_inval_msg_object(struct net_device *dev, int iface, int obj)
  438. {
  439. 254: e1a0c00d mov ip, sp
  440. 258: e92dd9f8 push {r3, r4, r5, r6, r7, r8, fp, ip, lr, pc}
  441. 25c: e24cb004 sub fp, ip, #4
  442. 260: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  443. 264: ebfffffe bl 0 <__gnu_mcount_nc>
  444. struct c_can_priv *priv = netdev_priv(dev);
  445.  
  446. priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0);
  447. 268: e0817101 add r7, r1, r1, lsl #2
  448. c_can_object_put(dev, iface, obj, IF_COMM_INVAL);
  449. }
  450.  
  451. static void c_can_inval_msg_object(struct net_device *dev, int iface, int obj)
  452. {
  453. struct c_can_priv *priv = netdev_priv(dev);
  454. 26c: e2806d13 add r6, r0, #1216 ; 0x4c0
  455. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  456. c_can_object_put(dev, iface, obj, IF_COMM_INVAL);
  457. }
  458.  
  459. static void c_can_inval_msg_object(struct net_device *dev, int iface, int obj)
  460. {
  461. 270: e1a05000 mov r5, r0
  462. struct c_can_priv *priv = netdev_priv(dev);
  463.  
  464. priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0);
  465. 274: e59035f8 ldr r3, [r0, #1528] ; 0x5f8
  466. 278: e0817087 add r7, r1, r7, lsl #1
  467. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), 0);
  468. c_can_object_put(dev, iface, obj, IF_COMM_INVAL);
  469. }
  470.  
  471. static void c_can_inval_msg_object(struct net_device *dev, int iface, int obj)
  472. {
  473. 27c: e1a04001 mov r4, r1
  474. 280: e1a08002 mov r8, r2
  475. struct c_can_priv *priv = netdev_priv(dev);
  476.  
  477. priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), 0);
  478. 284: e1a00006 mov r0, r6
  479. 288: e287100c add r1, r7, #12
  480. 28c: e3a02000 mov r2, #0
  481. 290: e12fff33 blx r3
  482. priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), 0);
  483. 294: e287100d add r1, r7, #13
  484. 298: e1a00006 mov r0, r6
  485. 29c: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  486. 2a0: e3a02000 mov r2, #0
  487. 2a4: e12fff33 blx r3
  488. c_can_inval_tx_object(dev, iface, obj);
  489. 2a8: e1a00005 mov r0, r5
  490. 2ac: e1a01004 mov r1, r4
  491. 2b0: e1a02008 mov r2, r8
  492. 2b4: ebffffd1 bl 200 <c_can_inval_tx_object>
  493. 2b8: e89da9f8 ldm sp, {r3, r4, r5, r6, r7, r8, fp, sp, pc}
  494.  
  495. 000002bc <c_can_wait_for_ctrl_init>:
  496. return NETDEV_TX_OK;
  497. }
  498.  
  499. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  500. struct c_can_priv *priv, u32 init)
  501. {
  502. 2bc: e1a0c00d mov ip, sp
  503. 2c0: e92dd9f8 push {r3, r4, r5, r6, r7, r8, fp, ip, lr, pc}
  504. 2c4: e24cb004 sub fp, ip, #4
  505. 2c8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  506. 2cc: ebfffffe bl 0 <__gnu_mcount_nc>
  507. int retry = 0;
  508.  
  509. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  510. udelay(10);
  511. 2d0: e3006000 movw r6, #0
  512. return NETDEV_TX_OK;
  513. }
  514.  
  515. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  516. struct c_can_priv *priv, u32 init)
  517. {
  518. 2d4: e1a08000 mov r8, r0
  519. 2d8: e1a05001 mov r5, r1
  520. 2dc: e1a07002 mov r7, r2
  521. int retry = 0;
  522.  
  523. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  524. udelay(10);
  525. 2e0: e3406000 movt r6, #0
  526. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  527. struct c_can_priv *priv, u32 init)
  528. {
  529. int retry = 0;
  530.  
  531. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  532. 2e4: e30043ea movw r4, #1002 ; 0x3ea
  533. 2e8: ea000003 b 2fc <c_can_wait_for_ctrl_init+0x40>
  534. udelay(10);
  535. 2ec: e5963004 ldr r3, [r6, #4]
  536. 2f0: e12fff33 blx r3
  537. if (retry++ > 1000) {
  538. 2f4: e2544001 subs r4, r4, #1
  539. 2f8: 0a00000a beq 328 <c_can_wait_for_ctrl_init+0x6c>
  540. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  541. struct c_can_priv *priv, u32 init)
  542. {
  543. int retry = 0;
  544.  
  545. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  546. 2fc: e5953134 ldr r3, [r5, #308] ; 0x134
  547. 300: e1a00005 mov r0, r5
  548. 304: e3a01000 mov r1, #0
  549. 308: e12fff33 blx r3
  550. 30c: e2003001 and r3, r0, #1
  551. udelay(10);
  552. 310: e306024c movw r0, #25164 ; 0x624c
  553. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  554. struct c_can_priv *priv, u32 init)
  555. {
  556. int retry = 0;
  557.  
  558. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  559. 314: e1530007 cmp r3, r7
  560. udelay(10);
  561. 318: e3400010 movt r0, #16
  562. static int c_can_wait_for_ctrl_init(struct net_device *dev,
  563. struct c_can_priv *priv, u32 init)
  564. {
  565. int retry = 0;
  566.  
  567. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  568. 31c: 1afffff2 bne 2ec <c_can_wait_for_ctrl_init+0x30>
  569. if (retry++ > 1000) {
  570. netdev_err(dev, "CCTRL: set CONTROL_INIT failed\n");
  571. return -EIO;
  572. }
  573. }
  574. return 0;
  575. 320: e3a00000 mov r0, #0
  576. }
  577. 324: e89da9f8 ldm sp, {r3, r4, r5, r6, r7, r8, fp, sp, pc}
  578. int retry = 0;
  579.  
  580. while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) {
  581. udelay(10);
  582. if (retry++ > 1000) {
  583. netdev_err(dev, "CCTRL: set CONTROL_INIT failed\n");
  584. 328: e3001000 movw r1, #0
  585. 32c: e1a00008 mov r0, r8
  586. 330: e3401000 movt r1, #0
  587. 334: ebfffffe bl 0 <netdev_err>
  588. return -EIO;
  589. 338: e3e00004 mvn r0, #4
  590. 33c: e89da9f8 ldm sp, {r3, r4, r5, r6, r7, r8, fp, sp, pc}
  591.  
  592. 00000340 <c_can_handle_state_change>:
  593. return pkts;
  594. }
  595.  
  596. static int c_can_handle_state_change(struct net_device *dev,
  597. enum c_can_bus_error_types error_type)
  598. {
  599. 340: e1a0c00d mov ip, sp
  600. 344: e92dd9f0 push {r4, r5, r6, r7, r8, fp, ip, lr, pc}
  601. 348: e24cb004 sub fp, ip, #4
  602. 34c: e24dd00c sub sp, sp, #12
  603. 350: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  604. 354: ebfffffe bl 0 <__gnu_mcount_nc>
  605. struct net_device_stats *stats = &dev->stats;
  606. struct can_frame *cf;
  607. struct sk_buff *skb;
  608. struct can_berr_counter bec;
  609.  
  610. switch (error_type) {
  611. 358: e3510002 cmp r1, #2
  612. return pkts;
  613. }
  614.  
  615. static int c_can_handle_state_change(struct net_device *dev,
  616. enum c_can_bus_error_types error_type)
  617. {
  618. 35c: e1a05001 mov r5, r1
  619. 360: e1a04000 mov r4, r0
  620. unsigned int reg_err_counter;
  621. unsigned int rx_err_passive;
  622. struct c_can_priv *priv = netdev_priv(dev);
  623. 364: e2807d13 add r7, r0, #1216 ; 0x4c0
  624. struct net_device_stats *stats = &dev->stats;
  625. struct can_frame *cf;
  626. struct sk_buff *skb;
  627. struct can_berr_counter bec;
  628.  
  629. switch (error_type) {
  630. 368: 0a00004b beq 49c <c_can_handle_state_change+0x15c>
  631. 36c: e3510003 cmp r1, #3
  632. 370: 0a000043 beq 484 <c_can_handle_state_change+0x144>
  633. 374: e3510001 cmp r1, #1
  634. 378: 0a00003b beq 46c <c_can_handle_state_change+0x12c>
  635. default:
  636. break;
  637. }
  638.  
  639. /* propagate the error condition to the CAN stack */
  640. skb = alloc_can_err_skb(dev, &cf);
  641. 37c: e1a00004 mov r0, r4
  642. 380: e24b1028 sub r1, fp, #40 ; 0x28
  643. 384: ebfffffe bl 0 <alloc_can_err_skb>
  644. if (unlikely(!skb))
  645. 388: e2506000 subs r6, r0, #0
  646. 38c: 0a000055 beq 4e8 <c_can_handle_state_change+0x1a8>
  647. struct can_berr_counter *bec)
  648. {
  649. unsigned int reg_err_counter;
  650. struct c_can_priv *priv = netdev_priv(dev);
  651.  
  652. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  653. 390: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  654. 394: e1a00007 mov r0, r7
  655. 398: e3a01003 mov r1, #3
  656. 39c: e12fff33 blx r3
  657. skb = alloc_can_err_skb(dev, &cf);
  658. if (unlikely(!skb))
  659. return 0;
  660.  
  661. __c_can_get_berr_counter(dev, &bec);
  662. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  663. 3a0: e59425f4 ldr r2, [r4, #1524] ; 0x5f4
  664. struct can_berr_counter *bec)
  665. {
  666. unsigned int reg_err_counter;
  667. struct c_can_priv *priv = netdev_priv(dev);
  668.  
  669. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  670. 3a4: e1a03000 mov r3, r0
  671. skb = alloc_can_err_skb(dev, &cf);
  672. if (unlikely(!skb))
  673. return 0;
  674.  
  675. __c_can_get_berr_counter(dev, &bec);
  676. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  677. 3a8: e3a01003 mov r1, #3
  678. 3ac: e1a00007 mov r0, r7
  679. struct c_can_priv *priv = netdev_priv(dev);
  680.  
  681. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  682. bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
  683. ERR_CNT_REC_SHIFT;
  684. bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK;
  685. 3b0: e6ef8073 uxtb r8, r3
  686. {
  687. unsigned int reg_err_counter;
  688. struct c_can_priv *priv = netdev_priv(dev);
  689.  
  690. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  691. bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
  692. 3b4: e7e67453 ubfx r7, r3, #8, #7
  693. skb = alloc_can_err_skb(dev, &cf);
  694. if (unlikely(!skb))
  695. return 0;
  696.  
  697. __c_can_get_berr_counter(dev, &bec);
  698. reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
  699. 3b8: e12fff32 blx r2
  700. rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >>
  701. ERR_CNT_RP_SHIFT;
  702.  
  703. switch (error_type) {
  704. 3bc: e3550002 cmp r5, #2
  705. 3c0: 0a00003b beq 4b4 <c_can_handle_state_change+0x174>
  706. 3c4: e3550003 cmp r5, #3
  707. 3c8: 0a000015 beq 424 <c_can_handle_state_change+0xe4>
  708. 3cc: e3550001 cmp r5, #1
  709. 3d0: 1a000005 bne 3ec <c_can_handle_state_change+0xac>
  710. cf->data[6] = bec.txerr;
  711. cf->data[7] = bec.rxerr;
  712. break;
  713. case C_CAN_BUS_OFF:
  714. /* bus-off state */
  715. cf->can_id |= CAN_ERR_BUSOFF;
  716. 3d4: e51b3028 ldr r3, [fp, #-40] ; 0x28
  717. can_bus_off(dev);
  718. 3d8: e1a00004 mov r0, r4
  719. cf->data[6] = bec.txerr;
  720. cf->data[7] = bec.rxerr;
  721. break;
  722. case C_CAN_BUS_OFF:
  723. /* bus-off state */
  724. cf->can_id |= CAN_ERR_BUSOFF;
  725. 3dc: e5932000 ldr r2, [r3]
  726. 3e0: e3822040 orr r2, r2, #64 ; 0x40
  727. 3e4: e5832000 str r2, [r3]
  728. can_bus_off(dev);
  729. 3e8: ebfffffe bl 0 <can_bus_off>
  730. 3ec: e51b2028 ldr r2, [fp, #-40] ; 0x28
  731. break;
  732. default:
  733. break;
  734. }
  735.  
  736. stats->rx_packets++;
  737. 3f0: e59430c0 ldr r3, [r4, #192] ; 0xc0
  738. int netif_rx(struct sk_buff *skb);
  739. int netif_rx_ni(struct sk_buff *skb);
  740. int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb);
  741. static inline int netif_receive_skb(struct sk_buff *skb)
  742. {
  743. return netif_receive_skb_sk(skb->sk, skb);
  744. 3f4: e1a01006 mov r1, r6
  745. stats->rx_bytes += cf->can_dlc;
  746. 3f8: e59400c8 ldr r0, [r4, #200] ; 0xc8
  747. break;
  748. default:
  749. break;
  750. }
  751.  
  752. stats->rx_packets++;
  753. 3fc: e2833001 add r3, r3, #1
  754. 400: e58430c0 str r3, [r4, #192] ; 0xc0
  755. stats->rx_bytes += cf->can_dlc;
  756. 404: e5d23004 ldrb r3, [r2, #4]
  757. 408: e0803003 add r3, r0, r3
  758. 40c: e58430c8 str r3, [r4, #200] ; 0xc8
  759. 410: e5960010 ldr r0, [r6, #16]
  760. 414: ebfffffe bl 0 <netif_receive_skb_sk>
  761. netif_receive_skb(skb);
  762.  
  763. return 1;
  764. 418: e3a00001 mov r0, #1
  765. }
  766. 41c: e24bd020 sub sp, fp, #32
  767. 420: e89da9f0 ldm sp, {r4, r5, r6, r7, r8, fp, sp, pc}
  768. cf->data[7] = bec.rxerr;
  769.  
  770. break;
  771. case C_CAN_ERROR_PASSIVE:
  772. /* error passive state */
  773. cf->can_id |= CAN_ERR_CRTL;
  774. 424: e51b3028 ldr r3, [fp, #-40] ; 0x28
  775. if (rx_err_passive)
  776. 428: e3100902 tst r0, #32768 ; 0x8000
  777. cf->data[7] = bec.rxerr;
  778.  
  779. break;
  780. case C_CAN_ERROR_PASSIVE:
  781. /* error passive state */
  782. cf->can_id |= CAN_ERR_CRTL;
  783. 42c: e5932000 ldr r2, [r3]
  784. 430: e3822004 orr r2, r2, #4
  785. 434: e5832000 str r2, [r3]
  786. if (rx_err_passive)
  787. cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
  788. 438: 151b3028 ldrne r3, [fp, #-40] ; 0x28
  789. 43c: 051b2028 ldreq r2, [fp, #-40] ; 0x28
  790. 440: 15d31009 ldrbne r1, [r3, #9]
  791. 444: 11a02003 movne r2, r3
  792. 448: 13811010 orrne r1, r1, #16
  793. 44c: 15c31009 strbne r1, [r3, #9]
  794. if (bec.txerr > 127)
  795. 450: e358007f cmp r8, #127 ; 0x7f
  796. cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE;
  797. 454: 85d23009 ldrbhi r3, [r2, #9]
  798.  
  799. cf->data[6] = bec.txerr;
  800. 458: e5c2800e strb r8, [r2, #14]
  801. cf->data[7] = bec.rxerr;
  802. 45c: e5c2700f strb r7, [r2, #15]
  803. /* error passive state */
  804. cf->can_id |= CAN_ERR_CRTL;
  805. if (rx_err_passive)
  806. cf->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
  807. if (bec.txerr > 127)
  808. cf->data[1] |= CAN_ERR_CRTL_TX_PASSIVE;
  809. 460: 83833020 orrhi r3, r3, #32
  810. 464: 85c23009 strbhi r3, [r2, #9]
  811.  
  812. cf->data[6] = bec.txerr;
  813. cf->data[7] = bec.rxerr;
  814. break;
  815. 468: eaffffe0 b 3f0 <c_can_handle_state_change+0xb0>
  816. priv->can.state = CAN_STATE_ERROR_PASSIVE;
  817. break;
  818. case C_CAN_BUS_OFF:
  819. /* bus-off state */
  820. priv->can.state = CAN_STATE_BUS_OFF;
  821. priv->can.can_stats.bus_off++;
  822. 46c: e59034cc ldr r3, [r0, #1228] ; 0x4cc
  823. priv->can.can_stats.error_passive++;
  824. priv->can.state = CAN_STATE_ERROR_PASSIVE;
  825. break;
  826. case C_CAN_BUS_OFF:
  827. /* bus-off state */
  828. priv->can.state = CAN_STATE_BUS_OFF;
  829. 470: e3a02003 mov r2, #3
  830. 474: e5802524 str r2, [r0, #1316] ; 0x524
  831. priv->can.can_stats.bus_off++;
  832. 478: e2833001 add r3, r3, #1
  833. 47c: e58034cc str r3, [r0, #1228] ; 0x4cc
  834. break;
  835. 480: eaffffbd b 37c <c_can_handle_state_change+0x3c>
  836. priv->can.can_stats.error_warning++;
  837. priv->can.state = CAN_STATE_ERROR_WARNING;
  838. break;
  839. case C_CAN_ERROR_PASSIVE:
  840. /* error passive state */
  841. priv->can.can_stats.error_passive++;
  842. 484: e59034c8 ldr r3, [r0, #1224] ; 0x4c8
  843. priv->can.state = CAN_STATE_ERROR_PASSIVE;
  844. 488: e3a02002 mov r2, #2
  845. 48c: e5802524 str r2, [r0, #1316] ; 0x524
  846. priv->can.can_stats.error_warning++;
  847. priv->can.state = CAN_STATE_ERROR_WARNING;
  848. break;
  849. case C_CAN_ERROR_PASSIVE:
  850. /* error passive state */
  851. priv->can.can_stats.error_passive++;
  852. 490: e2833001 add r3, r3, #1
  853. 494: e58034c8 str r3, [r0, #1224] ; 0x4c8
  854. priv->can.state = CAN_STATE_ERROR_PASSIVE;
  855. break;
  856. 498: eaffffb7 b 37c <c_can_handle_state_change+0x3c>
  857. struct can_berr_counter bec;
  858.  
  859. switch (error_type) {
  860. case C_CAN_ERROR_WARNING:
  861. /* error warning state */
  862. priv->can.can_stats.error_warning++;
  863. 49c: e59034c4 ldr r3, [r0, #1220] ; 0x4c4
  864. priv->can.state = CAN_STATE_ERROR_WARNING;
  865. 4a0: e3a02001 mov r2, #1
  866. 4a4: e5802524 str r2, [r0, #1316] ; 0x524
  867. struct can_berr_counter bec;
  868.  
  869. switch (error_type) {
  870. case C_CAN_ERROR_WARNING:
  871. /* error warning state */
  872. priv->can.can_stats.error_warning++;
  873. 4a8: e0833002 add r3, r3, r2
  874. 4ac: e58034c4 str r3, [r0, #1220] ; 0x4c4
  875. priv->can.state = CAN_STATE_ERROR_WARNING;
  876. break;
  877. 4b0: eaffffb1 b 37c <c_can_handle_state_change+0x3c>
  878. ERR_CNT_RP_SHIFT;
  879.  
  880. switch (error_type) {
  881. case C_CAN_ERROR_WARNING:
  882. /* error warning state */
  883. cf->can_id |= CAN_ERR_CRTL;
  884. 4b4: e51b3028 ldr r3, [fp, #-40] ; 0x28
  885. cf->data[1] = (bec.txerr > bec.rxerr) ?
  886. 4b8: e1570008 cmp r7, r8
  887. 4bc: 23a01004 movcs r1, #4
  888. 4c0: 33a01008 movcc r1, #8
  889. ERR_CNT_RP_SHIFT;
  890.  
  891. switch (error_type) {
  892. case C_CAN_ERROR_WARNING:
  893. /* error warning state */
  894. cf->can_id |= CAN_ERR_CRTL;
  895. 4c4: e5932000 ldr r2, [r3]
  896. 4c8: e3822004 orr r2, r2, #4
  897. 4cc: e5832000 str r2, [r3]
  898. cf->data[1] = (bec.txerr > bec.rxerr) ?
  899. 4d0: e51b3028 ldr r3, [fp, #-40] ; 0x28
  900. CAN_ERR_CRTL_TX_WARNING :
  901. CAN_ERR_CRTL_RX_WARNING;
  902. cf->data[6] = bec.txerr;
  903. 4d4: e5c3800e strb r8, [r3, #14]
  904. cf->data[7] = bec.rxerr;
  905.  
  906. break;
  907. 4d8: e1a02003 mov r2, r3
  908. cf->can_id |= CAN_ERR_CRTL;
  909. cf->data[1] = (bec.txerr > bec.rxerr) ?
  910. CAN_ERR_CRTL_TX_WARNING :
  911. CAN_ERR_CRTL_RX_WARNING;
  912. cf->data[6] = bec.txerr;
  913. cf->data[7] = bec.rxerr;
  914. 4dc: e5c3700f strb r7, [r3, #15]
  915.  
  916. switch (error_type) {
  917. case C_CAN_ERROR_WARNING:
  918. /* error warning state */
  919. cf->can_id |= CAN_ERR_CRTL;
  920. cf->data[1] = (bec.txerr > bec.rxerr) ?
  921. 4e0: e5c31009 strb r1, [r3, #9]
  922. CAN_ERR_CRTL_TX_WARNING :
  923. CAN_ERR_CRTL_RX_WARNING;
  924. cf->data[6] = bec.txerr;
  925. cf->data[7] = bec.rxerr;
  926.  
  927. break;
  928. 4e4: eaffffc1 b 3f0 <c_can_handle_state_change+0xb0>
  929. }
  930.  
  931. /* propagate the error condition to the CAN stack */
  932. skb = alloc_can_err_skb(dev, &cf);
  933. if (unlikely(!skb))
  934. return 0;
  935. 4e8: e1a00006 mov r0, r6
  936. 4ec: eaffffca b 41c <c_can_handle_state_change+0xdc>
  937.  
  938. 000004f0 <c_can_power_down>:
  939. }
  940. EXPORT_SYMBOL_GPL(alloc_c_can_dev);
  941.  
  942. #ifdef CONFIG_PM
  943. int c_can_power_down(struct net_device *dev)
  944. {
  945. 4f0: e1a0c00d mov ip, sp
  946. 4f4: e92dd8f0 push {r4, r5, r6, r7, fp, ip, lr, pc}
  947. 4f8: e24cb004 sub fp, ip, #4
  948. 4fc: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  949. 500: ebfffffe bl 0 <__gnu_mcount_nc>
  950. 504: e1a04000 mov r4, r0
  951. u32 val;
  952. unsigned long time_out;
  953. struct c_can_priv *priv = netdev_priv(dev);
  954.  
  955. if (!(dev->flags & IFF_UP))
  956. 508: e5903130 ldr r3, [r0, #304] ; 0x130
  957. 50c: e3130001 tst r3, #1
  958. 510: 0a00002d beq 5cc <c_can_power_down+0xdc>
  959. return 0;
  960.  
  961. WARN_ON(priv->type != BOSCH_D_CAN);
  962. 514: e5903610 ldr r3, [r0, #1552] ; 0x610
  963. 518: e3530002 cmp r3, #2
  964. 51c: 1a00002e bne 5dc <c_can_power_down+0xec>
  965. #ifdef CONFIG_PM
  966. int c_can_power_down(struct net_device *dev)
  967. {
  968. u32 val;
  969. unsigned long time_out;
  970. struct c_can_priv *priv = netdev_priv(dev);
  971. 520: e2846d13 add r6, r4, #1216 ; 0x4c0
  972. return 0;
  973.  
  974. WARN_ON(priv->type != BOSCH_D_CAN);
  975.  
  976. /* set PDR value so the device goes to power down mode */
  977. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  978. 524: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  979. 528: e3a01001 mov r1, #1
  980. 52c: e1a00006 mov r0, r6
  981. 530: e12fff33 blx r3
  982. val |= CONTROL_EX_PDR;
  983. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  984.  
  985. /* Wait for the PDA bit to get set */
  986. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  987. 534: e3005000 movw r5, #0
  988.  
  989. WARN_ON(priv->type != BOSCH_D_CAN);
  990.  
  991. /* set PDR value so the device goes to power down mode */
  992. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  993. val |= CONTROL_EX_PDR;
  994. 538: e3802c01 orr r2, r0, #256 ; 0x100
  995. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  996. 53c: e6ff2072 uxth r2, r2
  997. 540: e1a00006 mov r0, r6
  998. 544: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  999. 548: e3a01001 mov r1, #1
  1000.  
  1001. /* Wait for the PDA bit to get set */
  1002. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  1003. 54c: e3405000 movt r5, #0
  1004. WARN_ON(priv->type != BOSCH_D_CAN);
  1005.  
  1006. /* set PDR value so the device goes to power down mode */
  1007. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  1008. val |= CONTROL_EX_PDR;
  1009. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  1010. 550: e12fff33 blx r3
  1011.  
  1012. /* Wait for the PDA bit to get set */
  1013. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  1014. 554: e5957000 ldr r7, [r5]
  1015. 558: e2877064 add r7, r7, #100 ; 0x64
  1016. while (!(priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  1017. 55c: ea000003 b 570 <c_can_power_down+0x80>
  1018. time_after(time_out, jiffies))
  1019. 560: e5953000 ldr r3, [r5]
  1020. 564: e0673003 rsb r3, r7, r3
  1021. 568: e3530000 cmp r3, #0
  1022. 56c: aa000005 bge 588 <c_can_power_down+0x98>
  1023. val |= CONTROL_EX_PDR;
  1024. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  1025.  
  1026. /* Wait for the PDA bit to get set */
  1027. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  1028. while (!(priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  1029. 570: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  1030. 574: e1a00006 mov r0, r6
  1031. 578: e3a01002 mov r1, #2
  1032. 57c: e12fff33 blx r3
  1033. 580: e3100b01 tst r0, #1024 ; 0x400
  1034. 584: 0afffff5 beq 560 <c_can_power_down+0x70>
  1035. time_after(time_out, jiffies))
  1036. cpu_relax();
  1037.  
  1038. if (time_after(jiffies, time_out))
  1039. 588: e5953000 ldr r3, [r5]
  1040. 58c: e0637007 rsb r7, r3, r7
  1041. 590: e3570000 cmp r7, #0
  1042. 594: ba00000e blt 5d4 <c_can_power_down+0xe4>
  1043. return -ETIMEDOUT;
  1044.  
  1045. c_can_stop(dev);
  1046. 598: e1a00004 mov r0, r4
  1047. 59c: ebfffeaa bl 4c <c_can_stop>
  1048. pm_runtime_put_sync(priv->device);
  1049. }
  1050.  
  1051. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  1052. {
  1053. if (priv->raminit)
  1054. 5a0: e5943620 ldr r3, [r4, #1568] ; 0x620
  1055. 5a4: e3530000 cmp r3, #0
  1056. 5a8: 0a000002 beq 5b8 <c_can_power_down+0xc8>
  1057. priv->raminit(priv, enable);
  1058. 5ac: e1a00006 mov r0, r6
  1059. 5b0: e3a01000 mov r1, #0
  1060. 5b4: e12fff33 blx r3
  1061. pm_runtime_get_sync(priv->device);
  1062. }
  1063.  
  1064. static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
  1065. {
  1066. if (priv->device)
  1067. 5b8: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  1068. 5bc: e3500000 cmp r0, #0
  1069. 5c0: 0a000001 beq 5cc <c_can_power_down+0xdc>
  1070. 5c4: e3a01004 mov r1, #4
  1071. 5c8: ebfffffe bl 0 <__pm_runtime_idle>
  1072. c_can_stop(dev);
  1073.  
  1074. c_can_reset_ram(priv, false);
  1075. c_can_pm_runtime_put_sync(priv);
  1076.  
  1077. return 0;
  1078. 5cc: e3a00000 mov r0, #0
  1079. 5d0: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  1080. while (!(priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  1081. time_after(time_out, jiffies))
  1082. cpu_relax();
  1083.  
  1084. if (time_after(jiffies, time_out))
  1085. return -ETIMEDOUT;
  1086. 5d4: e3e0006d mvn r0, #109 ; 0x6d
  1087.  
  1088. c_can_reset_ram(priv, false);
  1089. c_can_pm_runtime_put_sync(priv);
  1090.  
  1091. return 0;
  1092. }
  1093. 5d8: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  1094. struct c_can_priv *priv = netdev_priv(dev);
  1095.  
  1096. if (!(dev->flags & IFF_UP))
  1097. return 0;
  1098.  
  1099. WARN_ON(priv->type != BOSCH_D_CAN);
  1100. 5dc: e3000000 movw r0, #0
  1101. 5e0: e3001497 movw r1, #1175 ; 0x497
  1102. 5e4: e3400000 movt r0, #0
  1103. 5e8: ebfffffe bl 0 <warn_slowpath_null>
  1104. 5ec: eaffffcb b 520 <c_can_power_down+0x30>
  1105.  
  1106. 000005f0 <free_c_can_dev>:
  1107. }
  1108. EXPORT_SYMBOL_GPL(c_can_power_up);
  1109. #endif
  1110.  
  1111. void free_c_can_dev(struct net_device *dev)
  1112. {
  1113. 5f0: e1a0c00d mov ip, sp
  1114. 5f4: e92dd818 push {r3, r4, fp, ip, lr, pc}
  1115. 5f8: e24cb004 sub fp, ip, #4
  1116. 5fc: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1117. 600: ebfffffe bl 0 <__gnu_mcount_nc>
  1118. 604: e1a04000 mov r4, r0
  1119. struct c_can_priv *priv = netdev_priv(dev);
  1120.  
  1121. netif_napi_del(&priv->napi);
  1122. 608: e2800e57 add r0, r0, #1392 ; 0x570
  1123. 60c: ebfffffe bl 0 <netif_napi_del>
  1124. free_candev(dev);
  1125. 610: e1a00004 mov r0, r4
  1126. 614: ebfffffe bl 0 <free_candev>
  1127. 618: e89da818 ldm sp, {r3, r4, fp, sp, pc}
  1128.  
  1129. 0000061c <c_can_close>:
  1130. c_can_pm_runtime_put_sync(priv);
  1131. return err;
  1132. }
  1133.  
  1134. static int c_can_close(struct net_device *dev)
  1135. {
  1136. 61c: e1a0c00d mov ip, sp
  1137. 620: e92dd830 push {r4, r5, fp, ip, lr, pc}
  1138. 624: e24cb004 sub fp, ip, #4
  1139. 628: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1140. 62c: ebfffffe bl 0 <__gnu_mcount_nc>
  1141. 630: e1a04000 mov r4, r0
  1142. }
  1143. }
  1144.  
  1145. static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
  1146. {
  1147. set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
  1148. 634: e3a00000 mov r0, #0
  1149. 638: e5941240 ldr r1, [r4, #576] ; 0x240
  1150. struct c_can_priv *priv = netdev_priv(dev);
  1151.  
  1152. netif_stop_queue(dev);
  1153. napi_disable(&priv->napi);
  1154. 63c: e2845d13 add r5, r4, #1216 ; 0x4c0
  1155. 640: e2811050 add r1, r1, #80 ; 0x50
  1156. 644: ebfffffe bl 0 <_set_bit>
  1157. 648: e2840e57 add r0, r4, #1392 ; 0x570
  1158. 64c: ebfffffe bl 0 <napi_disable>
  1159. c_can_stop(dev);
  1160. 650: e1a00004 mov r0, r4
  1161. 654: ebfffe7c bl 4c <c_can_stop>
  1162. free_irq(dev->irq, dev);
  1163. 658: e5940028 ldr r0, [r4, #40] ; 0x28
  1164. 65c: e1a01004 mov r1, r4
  1165. 660: ebfffffe bl 0 <free_irq>
  1166. close_candev(dev);
  1167. 664: e1a00004 mov r0, r4
  1168. 668: ebfffffe bl 0 <close_candev>
  1169. pm_runtime_put_sync(priv->device);
  1170. }
  1171.  
  1172. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  1173. {
  1174. if (priv->raminit)
  1175. 66c: e5943620 ldr r3, [r4, #1568] ; 0x620
  1176. 670: e3530000 cmp r3, #0
  1177. 674: 0a000002 beq 684 <c_can_close+0x68>
  1178. priv->raminit(priv, enable);
  1179. 678: e1a00005 mov r0, r5
  1180. 67c: e3a01000 mov r1, #0
  1181. 680: e12fff33 blx r3
  1182. pm_runtime_get_sync(priv->device);
  1183. }
  1184.  
  1185. static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
  1186. {
  1187. if (priv->device)
  1188. 684: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  1189. 688: e3500000 cmp r0, #0
  1190. 68c: 0a000001 beq 698 <c_can_close+0x7c>
  1191. 690: e3a01004 mov r1, #4
  1192. 694: ebfffffe bl 0 <__pm_runtime_idle>
  1193. c_can_pm_runtime_put_sync(priv);
  1194.  
  1195. can_led_event(dev, CAN_LED_EVENT_STOP);
  1196.  
  1197. return 0;
  1198. }
  1199. 698: e3a00000 mov r0, #0
  1200. 69c: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  1201.  
  1202. 000006a0 <c_can_isr>:
  1203.  
  1204. return work_done;
  1205. }
  1206.  
  1207. static irqreturn_t c_can_isr(int irq, void *dev_id)
  1208. {
  1209. 6a0: e1a0c00d mov ip, sp
  1210. 6a4: e92dd830 push {r4, r5, fp, ip, lr, pc}
  1211. 6a8: e24cb004 sub fp, ip, #4
  1212. 6ac: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1213. 6b0: ebfffffe bl 0 <__gnu_mcount_nc>
  1214. 6b4: e1a04001 mov r4, r1
  1215. struct net_device *dev = (struct net_device *)dev_id;
  1216. struct c_can_priv *priv = netdev_priv(dev);
  1217.  
  1218. if (!priv->read_reg(priv, C_CAN_INT_REG))
  1219. 6b8: e3a01005 mov r1, #5
  1220. }
  1221.  
  1222. static irqreturn_t c_can_isr(int irq, void *dev_id)
  1223. {
  1224. struct net_device *dev = (struct net_device *)dev_id;
  1225. struct c_can_priv *priv = netdev_priv(dev);
  1226. 6bc: e2845d13 add r5, r4, #1216 ; 0x4c0
  1227.  
  1228. if (!priv->read_reg(priv, C_CAN_INT_REG))
  1229. 6c0: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  1230. 6c4: e1a00005 mov r0, r5
  1231. 6c8: e12fff33 blx r3
  1232. 6cc: e3500000 cmp r0, #0
  1233. 6d0: 089da830 ldmeq sp, {r4, r5, fp, sp, pc}
  1234. return IRQ_NONE;
  1235.  
  1236. /* disable all interrupts and schedule the NAPI */
  1237. c_can_irq_control(priv, false);
  1238. 6d4: e1a00005 mov r0, r5
  1239. 6d8: e3a01000 mov r1, #0
  1240. 6dc: ebfffe47 bl 0 <c_can_irq_control>
  1241. * @nr: bit number to test
  1242. * @addr: Address to start counting from
  1243. */
  1244. static inline int test_bit(int nr, const volatile unsigned long *addr)
  1245. {
  1246. return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
  1247. 6e0: e5940578 ldr r0, [r4, #1400] ; 0x578
  1248. 6e4: e7e000d0 ubfx r0, r0, #1, #1
  1249. * insure only one NAPI poll instance runs. We also make
  1250. * sure there is no pending NAPI disable.
  1251. */
  1252. static inline bool napi_schedule_prep(struct napi_struct *n)
  1253. {
  1254. return !napi_disable_pending(n) &&
  1255. 6e8: e3500000 cmp r0, #0
  1256. 6ec: 0a000001 beq 6f8 <c_can_isr+0x58>
  1257. napi_schedule(&priv->napi);
  1258.  
  1259. return IRQ_HANDLED;
  1260. 6f0: e3a00001 mov r0, #1
  1261. }
  1262. 6f4: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  1263. !test_and_set_bit(NAPI_STATE_SCHED, &n->state);
  1264. 6f8: e2844e57 add r4, r4, #1392 ; 0x570
  1265. 6fc: e2841008 add r1, r4, #8
  1266. 700: ebfffffe bl 0 <_test_and_set_bit>
  1267. * insure only one NAPI poll instance runs. We also make
  1268. * sure there is no pending NAPI disable.
  1269. */
  1270. static inline bool napi_schedule_prep(struct napi_struct *n)
  1271. {
  1272. return !napi_disable_pending(n) &&
  1273. 704: e3500000 cmp r0, #0
  1274. 708: 1afffff8 bne 6f0 <c_can_isr+0x50>
  1275. * running.
  1276. */
  1277. static inline void napi_schedule(struct napi_struct *n)
  1278. {
  1279. if (napi_schedule_prep(n))
  1280. __napi_schedule(n);
  1281. 70c: e1a00004 mov r0, r4
  1282. 710: ebfffffe bl 0 <__napi_schedule>
  1283.  
  1284. /* disable all interrupts and schedule the NAPI */
  1285. c_can_irq_control(priv, false);
  1286. napi_schedule(&priv->napi);
  1287.  
  1288. return IRQ_HANDLED;
  1289. 714: e3a00001 mov r0, #1
  1290. 718: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  1291.  
  1292. 0000071c <unregister_c_can_dev>:
  1293. return err;
  1294. }
  1295. EXPORT_SYMBOL_GPL(register_c_can_dev);
  1296.  
  1297. void unregister_c_can_dev(struct net_device *dev)
  1298. {
  1299. 71c: e1a0c00d mov ip, sp
  1300. 720: e92dd818 push {r3, r4, fp, ip, lr, pc}
  1301. 724: e24cb004 sub fp, ip, #4
  1302. 728: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1303. 72c: ebfffffe bl 0 <__gnu_mcount_nc>
  1304. 730: e1a04000 mov r4, r0
  1305. struct c_can_priv *priv = netdev_priv(dev);
  1306.  
  1307. unregister_candev(dev);
  1308. 734: ebfffffe bl 0 <unregister_candev>
  1309. pm_runtime_enable(priv->device);
  1310. }
  1311.  
  1312. static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv)
  1313. {
  1314. if (priv->device)
  1315. 738: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  1316. 73c: e3500000 cmp r0, #0
  1317. 740: 089da818 ldmeq sp, {r3, r4, fp, sp, pc}
  1318. __pm_runtime_set_status(dev, RPM_SUSPENDED);
  1319. }
  1320.  
  1321. static inline void pm_runtime_disable(struct device *dev)
  1322. {
  1323. __pm_runtime_disable(dev, true);
  1324. 744: e3a01001 mov r1, #1
  1325. 748: ebfffffe bl 0 <__pm_runtime_disable>
  1326. 74c: e89da818 ldm sp, {r3, r4, fp, sp, pc}
  1327.  
  1328. 00000750 <register_c_can_dev>:
  1329. .ndo_start_xmit = c_can_start_xmit,
  1330. .ndo_change_mtu = can_change_mtu,
  1331. };
  1332.  
  1333. int register_c_can_dev(struct net_device *dev)
  1334. {
  1335. 750: e1a0c00d mov ip, sp
  1336. 754: e92dd830 push {r4, r5, fp, ip, lr, pc}
  1337. 758: e24cb004 sub fp, ip, #4
  1338. 75c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1339. 760: ebfffffe bl 0 <__gnu_mcount_nc>
  1340. 764: e1a04000 mov r4, r0
  1341. .brp_inc = 1,
  1342. };
  1343.  
  1344. static inline void c_can_pm_runtime_enable(const struct c_can_priv *priv)
  1345. {
  1346. if (priv->device)
  1347. 768: e59005e4 ldr r0, [r0, #1508] ; 0x5e4
  1348. 76c: e3500000 cmp r0, #0
  1349. 770: 0a000000 beq 778 <register_c_can_dev+0x28>
  1350. pm_runtime_enable(priv->device);
  1351. 774: ebfffffe bl 0 <pm_runtime_enable>
  1352. */
  1353. pinctrl_pm_select_sleep_state(dev->dev.parent);
  1354.  
  1355. c_can_pm_runtime_enable(priv);
  1356.  
  1357. dev->flags |= IFF_ECHO; /* we support local echo */
  1358. 778: e5942130 ldr r2, [r4, #304] ; 0x130
  1359. dev->netdev_ops = &c_can_netdev_ops;
  1360.  
  1361. err = register_candev(dev);
  1362. 77c: e1a00004 mov r0, r4
  1363. pinctrl_pm_select_sleep_state(dev->dev.parent);
  1364.  
  1365. c_can_pm_runtime_enable(priv);
  1366.  
  1367. dev->flags |= IFF_ECHO; /* we support local echo */
  1368. dev->netdev_ops = &c_can_netdev_ops;
  1369. 780: e59f3030 ldr r3, [pc, #48] ; 7b8 <register_c_can_dev+0x68>
  1370. */
  1371. pinctrl_pm_select_sleep_state(dev->dev.parent);
  1372.  
  1373. c_can_pm_runtime_enable(priv);
  1374.  
  1375. dev->flags |= IFF_ECHO; /* we support local echo */
  1376. 784: e3822701 orr r2, r2, #262144 ; 0x40000
  1377. 788: e5842130 str r2, [r4, #304] ; 0x130
  1378. dev->netdev_ops = &c_can_netdev_ops;
  1379. 78c: e5843124 str r3, [r4, #292] ; 0x124
  1380.  
  1381. err = register_candev(dev);
  1382. 790: ebfffffe bl 0 <register_candev>
  1383. if (err)
  1384. 794: e2505000 subs r5, r0, #0
  1385. 798: 0a000004 beq 7b0 <register_c_can_dev+0x60>
  1386. pm_runtime_enable(priv->device);
  1387. }
  1388.  
  1389. static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv)
  1390. {
  1391. if (priv->device)
  1392. 79c: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  1393. 7a0: e3500000 cmp r0, #0
  1394. 7a4: 0a000001 beq 7b0 <register_c_can_dev+0x60>
  1395. 7a8: e3a01001 mov r1, #1
  1396. 7ac: ebfffffe bl 0 <__pm_runtime_disable>
  1397. c_can_pm_runtime_disable(priv);
  1398. else
  1399. devm_can_led_init(dev);
  1400.  
  1401. return err;
  1402. }
  1403. 7b0: e1a00005 mov r0, r5
  1404. 7b4: e89da830 ldm sp, {r4, r5, fp, sp, pc}
  1405. 7b8: 00000030 .word 0x00000030
  1406.  
  1407. 000007bc <c_can_setup_receive_object.constprop.2>:
  1408.  
  1409. netif_receive_skb(skb);
  1410. return 0;
  1411. }
  1412.  
  1413. static void c_can_setup_receive_object(struct net_device *dev, int iface,
  1414. 7bc: e1a0c00d mov ip, sp
  1415. 7c0: e92dd8f0 push {r4, r5, r6, r7, fp, ip, lr, pc}
  1416. 7c4: e24cb004 sub fp, ip, #4
  1417. 7c8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1418. 7cc: ebfffffe bl 0 <__gnu_mcount_nc>
  1419. 7d0: e1a04000 mov r4, r0
  1420. u32 obj, u32 mask, u32 id, u32 mcont)
  1421. {
  1422. struct c_can_priv *priv = netdev_priv(dev);
  1423. 7d4: e2805d13 add r5, r0, #1216 ; 0x4c0
  1424.  
  1425. netif_receive_skb(skb);
  1426. return 0;
  1427. }
  1428.  
  1429. static void c_can_setup_receive_object(struct net_device *dev, int iface,
  1430. 7d8: e1a06001 mov r6, r1
  1431. 7dc: e1a07002 mov r7, r2
  1432. u32 obj, u32 mask, u32 id, u32 mcont)
  1433. {
  1434. struct c_can_priv *priv = netdev_priv(dev);
  1435.  
  1436. mask |= BIT(29);
  1437. priv->write_reg32(priv, C_CAN_IFACE(MASK1_REG, iface), mask);
  1438. 7e0: e1a00005 mov r0, r5
  1439. 7e4: e5943600 ldr r3, [r4, #1536] ; 0x600
  1440. 7e8: e3a0100a mov r1, #10
  1441. 7ec: e3a02202 mov r2, #536870912 ; 0x20000000
  1442. 7f0: e12fff33 blx r3
  1443.  
  1444. id |= IF_ARB_MSGVAL;
  1445. priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), id);
  1446. 7f4: e1a00005 mov r0, r5
  1447. 7f8: e5943600 ldr r3, [r4, #1536] ; 0x600
  1448. 7fc: e3a0100c mov r1, #12
  1449. 800: e3a02102 mov r2, #-2147483648 ; 0x80000000
  1450. 804: e12fff33 blx r3
  1451.  
  1452. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont);
  1453. 808: e1a00005 mov r0, r5
  1454. 80c: e6ff2077 uxth r2, r7
  1455. 810: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  1456. 814: e3a0100e mov r1, #14
  1457. 818: e12fff33 blx r3
  1458. }
  1459.  
  1460. static inline void c_can_object_put(struct net_device *dev, int iface,
  1461. u32 obj, u32 cmd)
  1462. {
  1463. c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj);
  1464. 81c: e1a00004 mov r0, r4
  1465. 820: e1a03006 mov r3, r6
  1466. 824: e3a01000 mov r1, #0
  1467. 828: e3a020f0 mov r2, #240 ; 0xf0
  1468. 82c: ebfffe50 bl 174 <c_can_obj_update>
  1469. 830: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  1470.  
  1471. 00000834 <c_can_start>:
  1472. /* set bittiming params */
  1473. return c_can_set_bittiming(dev);
  1474. }
  1475.  
  1476. static int c_can_start(struct net_device *dev)
  1477. {
  1478. 834: e1a0c00d mov ip, sp
  1479. 838: e92ddbf0 push {r4, r5, r6, r7, r8, r9, fp, ip, lr, pc}
  1480. 83c: e24cb004 sub fp, ip, #4
  1481. 840: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1482. 844: ebfffffe bl 0 <__gnu_mcount_nc>
  1483. static int c_can_chip_config(struct net_device *dev)
  1484. {
  1485. struct c_can_priv *priv = netdev_priv(dev);
  1486.  
  1487. /* enable automatic retransmission */
  1488. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
  1489. 848: e3a01000 mov r1, #0
  1490. * - set operating mode
  1491. * - configure message objects
  1492. */
  1493. static int c_can_chip_config(struct net_device *dev)
  1494. {
  1495. struct c_can_priv *priv = netdev_priv(dev);
  1496. 84c: e2806d13 add r6, r0, #1216 ; 0x4c0
  1497.  
  1498. /* enable automatic retransmission */
  1499. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
  1500. 850: e59035f8 ldr r3, [r0, #1528] ; 0x5f8
  1501. /* set bittiming params */
  1502. return c_can_set_bittiming(dev);
  1503. }
  1504.  
  1505. static int c_can_start(struct net_device *dev)
  1506. {
  1507. 854: e1a05000 mov r5, r0
  1508. static int c_can_chip_config(struct net_device *dev)
  1509. {
  1510. struct c_can_priv *priv = netdev_priv(dev);
  1511.  
  1512. /* enable automatic retransmission */
  1513. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
  1514. 858: e1a02001 mov r2, r1
  1515. 85c: e1a00006 mov r0, r6
  1516. 860: e12fff33 blx r3
  1517.  
  1518. if ((priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) &&
  1519. 864: e5953528 ldr r3, [r5, #1320] ; 0x528
  1520. 868: e2032003 and r2, r3, #3
  1521. 86c: e3520003 cmp r2, #3
  1522. 870: 0a00007c beq a68 <c_can_start+0x234>
  1523. (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)) {
  1524. /* loopback + silent mode : useful for hot self-test */
  1525. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1526. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK | TEST_SILENT);
  1527. } else if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
  1528. 874: e2131001 ands r1, r3, #1
  1529. 878: 1a00006f bne a3c <c_can_start+0x208>
  1530. /* loopback mode : useful for self-test function */
  1531. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1532. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK);
  1533. } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
  1534. 87c: e3130002 tst r3, #2
  1535. 880: 1a000046 bne 9a0 <c_can_start+0x16c>
  1536. /* set bittiming params */
  1537. return c_can_set_bittiming(dev);
  1538. }
  1539.  
  1540. static int c_can_start(struct net_device *dev)
  1541. {
  1542. 884: e3a04001 mov r4, #1
  1543. {
  1544. int i;
  1545.  
  1546. /* first invalidate all message objects */
  1547. for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_NO_OF_OBJECTS; i++)
  1548. c_can_inval_msg_object(dev, IF_RX, i);
  1549. 888: e1a02004 mov r2, r4
  1550. 88c: e1a00005 mov r0, r5
  1551. 890: e3a01000 mov r1, #0
  1552. static void c_can_configure_msg_objects(struct net_device *dev)
  1553. {
  1554. int i;
  1555.  
  1556. /* first invalidate all message objects */
  1557. for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_NO_OF_OBJECTS; i++)
  1558. 894: e2844001 add r4, r4, #1
  1559. c_can_inval_msg_object(dev, IF_RX, i);
  1560. 898: ebfffe6d bl 254 <c_can_inval_msg_object>
  1561. static void c_can_configure_msg_objects(struct net_device *dev)
  1562. {
  1563. int i;
  1564.  
  1565. /* first invalidate all message objects */
  1566. for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_NO_OF_OBJECTS; i++)
  1567. 89c: e3540021 cmp r4, #33 ; 0x21
  1568. 8a0: 1afffff8 bne 888 <c_can_start+0x54>
  1569. 8a4: e3a04001 mov r4, #1
  1570. c_can_inval_msg_object(dev, IF_RX, i);
  1571.  
  1572. /* setup receive message objects */
  1573. for (i = C_CAN_MSG_OBJ_RX_FIRST; i < C_CAN_MSG_OBJ_RX_LAST; i++)
  1574. c_can_setup_receive_object(dev, IF_RX, i, 0, 0, IF_MCONT_RCV);
  1575. 8a8: e1a01004 mov r1, r4
  1576. 8ac: e1a00005 mov r0, r5
  1577. 8b0: e3a02b05 mov r2, #5120 ; 0x1400
  1578. /* first invalidate all message objects */
  1579. for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_NO_OF_OBJECTS; i++)
  1580. c_can_inval_msg_object(dev, IF_RX, i);
  1581.  
  1582. /* setup receive message objects */
  1583. for (i = C_CAN_MSG_OBJ_RX_FIRST; i < C_CAN_MSG_OBJ_RX_LAST; i++)
  1584. 8b4: e2844001 add r4, r4, #1
  1585. c_can_setup_receive_object(dev, IF_RX, i, 0, 0, IF_MCONT_RCV);
  1586. 8b8: ebffffbf bl 7bc <c_can_setup_receive_object.constprop.2>
  1587. /* first invalidate all message objects */
  1588. for (i = C_CAN_MSG_OBJ_RX_FIRST; i <= C_CAN_NO_OF_OBJECTS; i++)
  1589. c_can_inval_msg_object(dev, IF_RX, i);
  1590.  
  1591. /* setup receive message objects */
  1592. for (i = C_CAN_MSG_OBJ_RX_FIRST; i < C_CAN_MSG_OBJ_RX_LAST; i++)
  1593. 8bc: e3540010 cmp r4, #16
  1594. 8c0: 1afffff8 bne 8a8 <c_can_start+0x74>
  1595. c_can_setup_receive_object(dev, IF_RX, i, 0, 0, IF_MCONT_RCV);
  1596.  
  1597. c_can_setup_receive_object(dev, IF_RX, C_CAN_MSG_OBJ_RX_LAST, 0, 0,
  1598. 8c4: e1a01004 mov r1, r4
  1599. 8c8: e1a00005 mov r0, r5
  1600. 8cc: e3a02d52 mov r2, #5248 ; 0x1480
  1601.  
  1602. /* set a `lec` value so that we can check for updates later */
  1603. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  1604.  
  1605. /* Clear all internal status */
  1606. atomic_set(&priv->tx_active, 0);
  1607. 8d0: e3a04000 mov r4, #0
  1608.  
  1609. /* setup receive message objects */
  1610. for (i = C_CAN_MSG_OBJ_RX_FIRST; i < C_CAN_MSG_OBJ_RX_LAST; i++)
  1611. c_can_setup_receive_object(dev, IF_RX, i, 0, 0, IF_MCONT_RCV);
  1612.  
  1613. c_can_setup_receive_object(dev, IF_RX, C_CAN_MSG_OBJ_RX_LAST, 0, 0,
  1614. 8d4: ebffffb8 bl 7bc <c_can_setup_receive_object.constprop.2>
  1615.  
  1616. /* configure message objects */
  1617. c_can_configure_msg_objects(dev);
  1618.  
  1619. /* set a `lec` value so that we can check for updates later */
  1620. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  1621. 8d8: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1622. 8dc: e1a00006 mov r0, r6
  1623. 8e0: e3a01002 mov r1, #2
  1624. 8e4: e3a02007 mov r2, #7
  1625. 8e8: e12fff33 blx r3
  1626. /* c_can provides a 6-bit brp and 4-bit brpe fields */
  1627. ten_bit_brp = bt->brp - 1;
  1628. brp = ten_bit_brp & BTR_BRP_MASK;
  1629. brpe = ten_bit_brp >> 6;
  1630.  
  1631. sjw = bt->sjw - 1;
  1632. 8ec: e59574f0 ldr r7, [r5, #1264] ; 0x4f0
  1633. tseg2 = bt->phase_seg2 - 1;
  1634. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1635. (tseg2 << BTR_TSEG2_SHIFT);
  1636. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1637.  
  1638. netdev_info(dev,
  1639. 8f0: e3001000 movw r1, #0
  1640. struct c_can_priv *priv = netdev_priv(dev);
  1641. const struct can_bittiming *bt = &priv->can.bittiming;
  1642. int res;
  1643.  
  1644. /* c_can provides a 6-bit brp and 4-bit brpe fields */
  1645. ten_bit_brp = bt->brp - 1;
  1646. 8f4: e59534f4 ldr r3, [r5, #1268] ; 0x4f4
  1647. tseg2 = bt->phase_seg2 - 1;
  1648. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1649. (tseg2 << BTR_TSEG2_SHIFT);
  1650. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1651.  
  1652. netdev_info(dev,
  1653. 8f8: e3401000 movt r1, #0
  1654. brp = ten_bit_brp & BTR_BRP_MASK;
  1655. brpe = ten_bit_brp >> 6;
  1656.  
  1657. sjw = bt->sjw - 1;
  1658. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1659. tseg2 = bt->phase_seg2 - 1;
  1660. 8fc: e59524ec ldr r2, [r5, #1260] ; 0x4ec
  1661. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1662. (tseg2 << BTR_TSEG2_SHIFT);
  1663. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1664.  
  1665. netdev_info(dev,
  1666. 900: e1a00005 mov r0, r5
  1667. ten_bit_brp = bt->brp - 1;
  1668. brp = ten_bit_brp & BTR_BRP_MASK;
  1669. brpe = ten_bit_brp >> 6;
  1670.  
  1671. sjw = bt->sjw - 1;
  1672. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1673. 904: e595e4e8 ldr lr, [r5, #1256] ; 0x4e8
  1674. /* c_can provides a 6-bit brp and 4-bit brpe fields */
  1675. ten_bit_brp = bt->brp - 1;
  1676. brp = ten_bit_brp & BTR_BRP_MASK;
  1677. brpe = ten_bit_brp >> 6;
  1678.  
  1679. sjw = bt->sjw - 1;
  1680. 908: e2477001 sub r7, r7, #1
  1681. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1682. 90c: e59584e4 ldr r8, [r5, #1252] ; 0x4e4
  1683. struct c_can_priv *priv = netdev_priv(dev);
  1684. const struct can_bittiming *bt = &priv->can.bittiming;
  1685. int res;
  1686.  
  1687. /* c_can provides a 6-bit brp and 4-bit brpe fields */
  1688. ten_bit_brp = bt->brp - 1;
  1689. 910: e2433001 sub r3, r3, #1
  1690. brpe = ten_bit_brp >> 6;
  1691.  
  1692. sjw = bt->sjw - 1;
  1693. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1694. tseg2 = bt->phase_seg2 - 1;
  1695. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1696. 914: e6ef7077 uxtb r7, r7
  1697. 918: e203c03f and ip, r3, #63 ; 0x3f
  1698. brp = ten_bit_brp & BTR_BRP_MASK;
  1699. brpe = ten_bit_brp >> 6;
  1700.  
  1701. sjw = bt->sjw - 1;
  1702. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1703. tseg2 = bt->phase_seg2 - 1;
  1704. 91c: e2422001 sub r2, r2, #1
  1705.  
  1706. /* set a `lec` value so that we can check for updates later */
  1707. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  1708.  
  1709. /* Clear all internal status */
  1710. atomic_set(&priv->tx_active, 0);
  1711. 920: e58545e8 str r4, [r5, #1512] ; 0x5e8
  1712. brpe = ten_bit_brp >> 6;
  1713.  
  1714. sjw = bt->sjw - 1;
  1715. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1716. tseg2 = bt->phase_seg2 - 1;
  1717. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1718. 924: e18cc307 orr ip, ip, r7, lsl #6
  1719. ten_bit_brp = bt->brp - 1;
  1720. brp = ten_bit_brp & BTR_BRP_MASK;
  1721. brpe = ten_bit_brp >> 6;
  1722.  
  1723. sjw = bt->sjw - 1;
  1724. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1725. 928: e088800e add r8, r8, lr
  1726. tseg2 = bt->phase_seg2 - 1;
  1727. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1728. (tseg2 << BTR_TSEG2_SHIFT);
  1729. 92c: e6ef2072 uxtb r2, r2
  1730. ten_bit_brp = bt->brp - 1;
  1731. brp = ten_bit_brp & BTR_BRP_MASK;
  1732. brpe = ten_bit_brp >> 6;
  1733.  
  1734. sjw = bt->sjw - 1;
  1735. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1736. 930: e2488001 sub r8, r8, #1
  1737. tseg2 = bt->phase_seg2 - 1;
  1738. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1739. 934: e6ef8078 uxtb r8, r8
  1740. (tseg2 << BTR_TSEG2_SHIFT);
  1741. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1742. 938: e7e37353 ubfx r7, r3, #6, #4
  1743. brpe = ten_bit_brp >> 6;
  1744.  
  1745. sjw = bt->sjw - 1;
  1746. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1747. tseg2 = bt->phase_seg2 - 1;
  1748. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1749. 93c: e18c2602 orr r2, ip, r2, lsl #12
  1750. /* set a `lec` value so that we can check for updates later */
  1751. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  1752.  
  1753. /* Clear all internal status */
  1754. atomic_set(&priv->tx_active, 0);
  1755. priv->rxmasked = 0;
  1756. 940: e5854628 str r4, [r5, #1576] ; 0x628
  1757. priv->tx_dir = 0;
  1758. 944: e58545ec str r4, [r5, #1516] ; 0x5ec
  1759. tseg2 = bt->phase_seg2 - 1;
  1760. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1761. (tseg2 << BTR_TSEG2_SHIFT);
  1762. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1763.  
  1764. netdev_info(dev,
  1765. 948: e1a03007 mov r3, r7
  1766. brpe = ten_bit_brp >> 6;
  1767.  
  1768. sjw = bt->sjw - 1;
  1769. tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
  1770. tseg2 = bt->phase_seg2 - 1;
  1771. reg_btr = brp | (sjw << BTR_SJW_SHIFT) | (tseg1 << BTR_TSEG1_SHIFT) |
  1772. 94c: e1828408 orr r8, r2, r8, lsl #8
  1773. (tseg2 << BTR_TSEG2_SHIFT);
  1774. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1775.  
  1776. netdev_info(dev,
  1777. 950: e1a02008 mov r2, r8
  1778. 954: ebfffffe bl 0 <netdev_info>
  1779. "setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe);
  1780.  
  1781. ctrl_save = priv->read_reg(priv, C_CAN_CTRL_REG);
  1782. 958: e1a01004 mov r1, r4
  1783. 95c: e59535f4 ldr r3, [r5, #1524] ; 0x5f4
  1784. 960: e1a00006 mov r0, r6
  1785. 964: e12fff33 blx r3
  1786. ctrl_save &= ~CONTROL_INIT;
  1787. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_CCE | CONTROL_INIT);
  1788. 968: e1a01004 mov r1, r4
  1789. 96c: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1790. 970: e3a02041 mov r2, #65 ; 0x41
  1791. reg_brpe = brpe & BRP_EXT_BRPE_MASK;
  1792.  
  1793. netdev_info(dev,
  1794. "setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe);
  1795.  
  1796. ctrl_save = priv->read_reg(priv, C_CAN_CTRL_REG);
  1797. 974: e1a09000 mov r9, r0
  1798. ctrl_save &= ~CONTROL_INIT;
  1799. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_CCE | CONTROL_INIT);
  1800. 978: e1a00006 mov r0, r6
  1801. 97c: e12fff33 blx r3
  1802. res = c_can_wait_for_ctrl_init(dev, priv, CONTROL_INIT);
  1803. 980: e1a00005 mov r0, r5
  1804. 984: e1a01006 mov r1, r6
  1805. 988: e3a02001 mov r2, #1
  1806. 98c: ebfffe4a bl 2bc <c_can_wait_for_ctrl_init>
  1807. if (res)
  1808. 990: e2504000 subs r4, r0, #0
  1809. 994: 0a00000b beq 9c8 <c_can_start+0x194>
  1810. 998: e1a00004 mov r0, r4
  1811. pinctrl_put(p);
  1812. else
  1813. pinctrl_pm_select_default_state(priv->device);
  1814.  
  1815. return 0;
  1816. }
  1817. 99c: e89dabf0 ldm sp, {r4, r5, r6, r7, r8, r9, fp, sp, pc}
  1818. /* loopback mode : useful for self-test function */
  1819. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1820. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK);
  1821. } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
  1822. /* silent mode : bus-monitoring mode */
  1823. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1824. 9a0: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1825. 9a4: e1a00006 mov r0, r6
  1826. 9a8: e3a02080 mov r2, #128 ; 0x80
  1827. 9ac: e12fff33 blx r3
  1828. priv->write_reg(priv, C_CAN_TEST_REG, TEST_SILENT);
  1829. 9b0: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1830. 9b4: e1a00006 mov r0, r6
  1831. 9b8: e3a01006 mov r1, #6
  1832. 9bc: e3a02008 mov r2, #8
  1833. 9c0: e12fff33 blx r3
  1834. 9c4: eaffffae b 884 <c_can_start+0x50>
  1835. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_CCE | CONTROL_INIT);
  1836. res = c_can_wait_for_ctrl_init(dev, priv, CONTROL_INIT);
  1837. if (res)
  1838. return res;
  1839.  
  1840. priv->write_reg(priv, C_CAN_BTR_REG, reg_btr);
  1841. 9c8: e6ff2078 uxth r2, r8
  1842. 9cc: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1843. 9d0: e1a00006 mov r0, r6
  1844. 9d4: e3a01004 mov r1, #4
  1845. 9d8: e12fff33 blx r3
  1846. priv->write_reg(priv, C_CAN_BRPEXT_REG, reg_brpe);
  1847. 9dc: e1a02007 mov r2, r7
  1848. 9e0: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1849. 9e4: e1a00006 mov r0, r6
  1850. 9e8: e3a01007 mov r1, #7
  1851. 9ec: e12fff33 blx r3
  1852. priv->write_reg(priv, C_CAN_CTRL_REG, ctrl_save);
  1853. 9f0: e30f2ffe movw r2, #65534 ; 0xfffe
  1854. 9f4: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1855. 9f8: e0022009 and r2, r2, r9
  1856. 9fc: e1a00006 mov r0, r6
  1857. a00: e1a01004 mov r1, r4
  1858. a04: e12fff33 blx r3
  1859.  
  1860. return c_can_wait_for_ctrl_init(dev, priv, 0);
  1861. a08: e1a00005 mov r0, r5
  1862. a0c: e1a01006 mov r1, r6
  1863. a10: e1a02004 mov r2, r4
  1864. a14: ebfffe28 bl 2bc <c_can_wait_for_ctrl_init>
  1865. int err;
  1866. struct pinctrl *p;
  1867.  
  1868. /* basic c_can configuration */
  1869. err = c_can_chip_config(dev);
  1870. if (err)
  1871. a18: e3500000 cmp r0, #0
  1872. a1c: 189dabf0 ldmne sp, {r4, r5, r6, r7, r8, r9, fp, sp, pc}
  1873. return err;
  1874.  
  1875. /* Setup the command for new messages */
  1876. priv->comm_rcv_high = priv->type != BOSCH_D_CAN ?
  1877. a20: e5953610 ldr r3, [r5, #1552] ; 0x610
  1878. IF_COMM_RCV_LOW : IF_COMM_RCV_HIGH;
  1879.  
  1880. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  1881. a24: e5850524 str r0, [r5, #1316] ; 0x524
  1882. err = c_can_chip_config(dev);
  1883. if (err)
  1884. return err;
  1885.  
  1886. /* Setup the command for new messages */
  1887. priv->comm_rcv_high = priv->type != BOSCH_D_CAN ?
  1888. a28: e3530002 cmp r3, #2
  1889. a2c: 03a0307f moveq r3, #127 ; 0x7f
  1890. a30: 13a0307b movne r3, #123 ; 0x7b
  1891. a34: e5853624 str r3, [r5, #1572] ; 0x624
  1892. a38: e89dabf0 ldm sp, {r4, r5, r6, r7, r8, r9, fp, sp, pc}
  1893. /* loopback + silent mode : useful for hot self-test */
  1894. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1895. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK | TEST_SILENT);
  1896. } else if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
  1897. /* loopback mode : useful for self-test function */
  1898. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1899. a3c: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1900. a40: e1a00006 mov r0, r6
  1901. a44: e3a01000 mov r1, #0
  1902. a48: e3a02080 mov r2, #128 ; 0x80
  1903. a4c: e12fff33 blx r3
  1904. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK);
  1905. a50: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1906. a54: e1a00006 mov r0, r6
  1907. a58: e3a01006 mov r1, #6
  1908. a5c: e3a02010 mov r2, #16
  1909. a60: e12fff33 blx r3
  1910. a64: eaffff86 b 884 <c_can_start+0x50>
  1911. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR);
  1912.  
  1913. if ((priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) &&
  1914. (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)) {
  1915. /* loopback + silent mode : useful for hot self-test */
  1916. priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_TEST);
  1917. a68: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1918. a6c: e1a00006 mov r0, r6
  1919. a70: e3a01000 mov r1, #0
  1920. a74: e3a02080 mov r2, #128 ; 0x80
  1921. a78: e12fff33 blx r3
  1922. priv->write_reg(priv, C_CAN_TEST_REG, TEST_LBACK | TEST_SILENT);
  1923. a7c: e59535f8 ldr r3, [r5, #1528] ; 0x5f8
  1924. a80: e1a00006 mov r0, r6
  1925. a84: e3a01006 mov r1, #6
  1926. a88: e3a02018 mov r2, #24
  1927. a8c: e12fff33 blx r3
  1928. a90: eaffff7b b 884 <c_can_start+0x50>
  1929.  
  1930. 00000a94 <c_can_set_mode>:
  1931. pinctrl_pm_select_sleep_state(dev->dev.parent);
  1932. priv->can.state = CAN_STATE_STOPPED;
  1933. }
  1934.  
  1935. static int c_can_set_mode(struct net_device *dev, enum can_mode mode)
  1936. {
  1937. a94: e1a0c00d mov ip, sp
  1938. a98: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
  1939. a9c: e24cb004 sub fp, ip, #4
  1940. aa0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  1941. aa4: ebfffffe bl 0 <__gnu_mcount_nc>
  1942. struct c_can_priv *priv = netdev_priv(dev);
  1943. int err;
  1944.  
  1945. switch (mode) {
  1946. aa8: e3510001 cmp r1, #1
  1947. pinctrl_pm_select_sleep_state(dev->dev.parent);
  1948. priv->can.state = CAN_STATE_STOPPED;
  1949. }
  1950.  
  1951. static int c_can_set_mode(struct net_device *dev, enum can_mode mode)
  1952. {
  1953. aac: e1a04001 mov r4, r1
  1954. ab0: e1a06000 mov r6, r0
  1955. struct c_can_priv *priv = netdev_priv(dev);
  1956. int err;
  1957.  
  1958. switch (mode) {
  1959. ab4: 1a00000b bne ae8 <c_can_set_mode+0x54>
  1960. case CAN_MODE_START:
  1961. err = c_can_start(dev);
  1962. ab8: ebffff5d bl 834 <c_can_start>
  1963. if (err)
  1964. abc: e2505000 subs r5, r0, #0
  1965. ac0: 0a000001 beq acc <c_can_set_mode+0x38>
  1966. ac4: e1a00005 mov r0, r5
  1967. default:
  1968. return -EOPNOTSUPP;
  1969. }
  1970.  
  1971. return 0;
  1972. }
  1973. ac8: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc}
  1974. * Allow upper layers to call the device hard_start_xmit routine.
  1975. * Used for flow control when transmit resources are available.
  1976. */
  1977. static inline void netif_wake_queue(struct net_device *dev)
  1978. {
  1979. netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
  1980. acc: e5960240 ldr r0, [r6, #576] ; 0x240
  1981. ad0: ebfffffe bl 0 <netif_tx_wake_queue>
  1982. case CAN_MODE_START:
  1983. err = c_can_start(dev);
  1984. if (err)
  1985. return err;
  1986. netif_wake_queue(dev);
  1987. c_can_irq_control(priv, true);
  1988. ad4: e2860d13 add r0, r6, #1216 ; 0x4c0
  1989. ad8: e1a01004 mov r1, r4
  1990. adc: ebfffd47 bl 0 <c_can_irq_control>
  1991. break;
  1992. default:
  1993. return -EOPNOTSUPP;
  1994. }
  1995.  
  1996. return 0;
  1997. ae0: e1a00005 mov r0, r5
  1998. ae4: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc}
  1999. return err;
  2000. netif_wake_queue(dev);
  2001. c_can_irq_control(priv, true);
  2002. break;
  2003. default:
  2004. return -EOPNOTSUPP;
  2005. ae8: e3e0005e mvn r0, #94 ; 0x5e
  2006. aec: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc}
  2007.  
  2008. 00000af0 <c_can_power_up>:
  2009. return 0;
  2010. }
  2011. EXPORT_SYMBOL_GPL(c_can_power_down);
  2012.  
  2013. int c_can_power_up(struct net_device *dev)
  2014. {
  2015. af0: e1a0c00d mov ip, sp
  2016. af4: e92dd8f0 push {r4, r5, r6, r7, fp, ip, lr, pc}
  2017. af8: e24cb004 sub fp, ip, #4
  2018. afc: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  2019. b00: ebfffffe bl 0 <__gnu_mcount_nc>
  2020. b04: e1a04000 mov r4, r0
  2021. u32 val;
  2022. unsigned long time_out;
  2023. struct c_can_priv *priv = netdev_priv(dev);
  2024. int ret;
  2025.  
  2026. if (!(dev->flags & IFF_UP))
  2027. b08: e5900130 ldr r0, [r0, #304] ; 0x130
  2028. b0c: e2100001 ands r0, r0, #1
  2029. b10: 089da8f0 ldmeq sp, {r4, r5, r6, r7, fp, sp, pc}
  2030. return 0;
  2031.  
  2032. WARN_ON(priv->type != BOSCH_D_CAN);
  2033. b14: e5943610 ldr r3, [r4, #1552] ; 0x610
  2034. b18: e3530002 cmp r3, #2
  2035. b1c: 1a00003f bne c20 <c_can_power_up+0x130>
  2036. pm_runtime_disable(priv->device);
  2037. }
  2038.  
  2039. static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
  2040. {
  2041. if (priv->device)
  2042. b20: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  2043. b24: e3500000 cmp r0, #0
  2044. b28: 0a000001 beq b34 <c_can_power_up+0x44>
  2045. return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
  2046. }
  2047.  
  2048. static inline int pm_runtime_get_sync(struct device *dev)
  2049. {
  2050. return __pm_runtime_resume(dev, RPM_GET_PUT);
  2051. b2c: e3a01004 mov r1, #4
  2052. b30: ebfffffe bl 0 <__pm_runtime_resume>
  2053. pm_runtime_put_sync(priv->device);
  2054. }
  2055.  
  2056. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  2057. {
  2058. if (priv->raminit)
  2059. b34: e5943620 ldr r3, [r4, #1568] ; 0x620
  2060.  
  2061. int c_can_power_up(struct net_device *dev)
  2062. {
  2063. u32 val;
  2064. unsigned long time_out;
  2065. struct c_can_priv *priv = netdev_priv(dev);
  2066. b38: e2845d13 add r5, r4, #1216 ; 0x4c0
  2067. pm_runtime_put_sync(priv->device);
  2068. }
  2069.  
  2070. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  2071. {
  2072. if (priv->raminit)
  2073. b3c: e3530000 cmp r3, #0
  2074. b40: 0a000002 beq b50 <c_can_power_up+0x60>
  2075. priv->raminit(priv, enable);
  2076. b44: e1a00005 mov r0, r5
  2077. b48: e3a01001 mov r1, #1
  2078. b4c: e12fff33 blx r3
  2079.  
  2080. c_can_pm_runtime_get_sync(priv);
  2081. c_can_reset_ram(priv, true);
  2082.  
  2083. /* Clear PDR and INIT bits */
  2084. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  2085. b50: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  2086. b54: e3a01001 mov r1, #1
  2087. b58: e1a00005 mov r0, r5
  2088. val = priv->read_reg(priv, C_CAN_CTRL_REG);
  2089. val &= ~CONTROL_INIT;
  2090. priv->write_reg(priv, C_CAN_CTRL_REG, val);
  2091.  
  2092. /* Wait for the PDA bit to get clear */
  2093. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  2094. b5c: e3006000 movw r6, #0
  2095.  
  2096. c_can_pm_runtime_get_sync(priv);
  2097. c_can_reset_ram(priv, true);
  2098.  
  2099. /* Clear PDR and INIT bits */
  2100. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  2101. b60: e12fff33 blx r3
  2102. val &= ~CONTROL_EX_PDR;
  2103. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  2104. b64: e30f2eff movw r2, #65279 ; 0xfeff
  2105. b68: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  2106. b6c: e0022000 and r2, r2, r0
  2107. b70: e3a01001 mov r1, #1
  2108. b74: e1a00005 mov r0, r5
  2109. val = priv->read_reg(priv, C_CAN_CTRL_REG);
  2110. val &= ~CONTROL_INIT;
  2111. priv->write_reg(priv, C_CAN_CTRL_REG, val);
  2112.  
  2113. /* Wait for the PDA bit to get clear */
  2114. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  2115. b78: e3406000 movt r6, #0
  2116. c_can_reset_ram(priv, true);
  2117.  
  2118. /* Clear PDR and INIT bits */
  2119. val = priv->read_reg(priv, C_CAN_CTRL_EX_REG);
  2120. val &= ~CONTROL_EX_PDR;
  2121. priv->write_reg(priv, C_CAN_CTRL_EX_REG, val);
  2122. b7c: e12fff33 blx r3
  2123. val = priv->read_reg(priv, C_CAN_CTRL_REG);
  2124. b80: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  2125. b84: e3a01000 mov r1, #0
  2126. b88: e1a00005 mov r0, r5
  2127. b8c: e12fff33 blx r3
  2128. val &= ~CONTROL_INIT;
  2129. priv->write_reg(priv, C_CAN_CTRL_REG, val);
  2130. b90: e30f2ffe movw r2, #65534 ; 0xfffe
  2131. b94: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  2132. b98: e0022000 and r2, r2, r0
  2133. b9c: e3a01000 mov r1, #0
  2134. ba0: e1a00005 mov r0, r5
  2135. ba4: e12fff33 blx r3
  2136.  
  2137. /* Wait for the PDA bit to get clear */
  2138. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  2139. ba8: e5967000 ldr r7, [r6]
  2140. bac: e2877064 add r7, r7, #100 ; 0x64
  2141. while ((priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  2142. bb0: ea000003 b bc4 <c_can_power_up+0xd4>
  2143. time_after(time_out, jiffies))
  2144. bb4: e5963000 ldr r3, [r6]
  2145. bb8: e0673003 rsb r3, r7, r3
  2146. bbc: e3530000 cmp r3, #0
  2147. bc0: aa000005 bge bdc <c_can_power_up+0xec>
  2148. val &= ~CONTROL_INIT;
  2149. priv->write_reg(priv, C_CAN_CTRL_REG, val);
  2150.  
  2151. /* Wait for the PDA bit to get clear */
  2152. time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS);
  2153. while ((priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  2154. bc4: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  2155. bc8: e1a00005 mov r0, r5
  2156. bcc: e3a01002 mov r1, #2
  2157. bd0: e12fff33 blx r3
  2158. bd4: e3100b01 tst r0, #1024 ; 0x400
  2159. bd8: 1afffff5 bne bb4 <c_can_power_up+0xc4>
  2160. time_after(time_out, jiffies))
  2161. cpu_relax();
  2162.  
  2163. if (time_after(jiffies, time_out))
  2164. bdc: e5963000 ldr r3, [r6]
  2165. be0: e0637007 rsb r7, r3, r7
  2166. be4: e3570000 cmp r7, #0
  2167. be8: ba00000a blt c18 <c_can_power_up+0x128>
  2168. return -ETIMEDOUT;
  2169.  
  2170. ret = c_can_start(dev);
  2171. bec: e1a00004 mov r0, r4
  2172. bf0: ebffff0f bl 834 <c_can_start>
  2173. if (!ret)
  2174. bf4: e2504000 subs r4, r0, #0
  2175. bf8: 0a000001 beq c04 <c_can_power_up+0x114>
  2176. bfc: e1a00004 mov r0, r4
  2177. c_can_irq_control(priv, true);
  2178.  
  2179. return ret;
  2180. }
  2181. c00: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  2182. if (time_after(jiffies, time_out))
  2183. return -ETIMEDOUT;
  2184.  
  2185. ret = c_can_start(dev);
  2186. if (!ret)
  2187. c_can_irq_control(priv, true);
  2188. c04: e1a00005 mov r0, r5
  2189. c08: e3a01001 mov r1, #1
  2190. c0c: ebfffcfb bl 0 <c_can_irq_control>
  2191. c10: e1a00004 mov r0, r4
  2192. c14: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  2193. while ((priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) &&
  2194. time_after(time_out, jiffies))
  2195. cpu_relax();
  2196.  
  2197. if (time_after(jiffies, time_out))
  2198. return -ETIMEDOUT;
  2199. c18: e3e0006d mvn r0, #109 ; 0x6d
  2200. c1c: e89da8f0 ldm sp, {r4, r5, r6, r7, fp, sp, pc}
  2201. int ret;
  2202.  
  2203. if (!(dev->flags & IFF_UP))
  2204. return 0;
  2205.  
  2206. WARN_ON(priv->type != BOSCH_D_CAN);
  2207. c20: e3000000 movw r0, #0
  2208. c24: e30014ba movw r1, #1210 ; 0x4ba
  2209. c28: e3400000 movt r0, #0
  2210. c2c: ebfffffe bl 0 <warn_slowpath_null>
  2211. c30: eaffffba b b20 <c_can_power_up+0x30>
  2212.  
  2213. 00000c34 <c_can_open>:
  2214.  
  2215. return IRQ_HANDLED;
  2216. }
  2217.  
  2218. static int c_can_open(struct net_device *dev)
  2219. {
  2220. c34: e1a0c00d mov ip, sp
  2221. c38: e92dd870 push {r4, r5, r6, fp, ip, lr, pc}
  2222. c3c: e24cb004 sub fp, ip, #4
  2223. c40: e24dd00c sub sp, sp, #12
  2224. c44: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  2225. c48: ebfffffe bl 0 <__gnu_mcount_nc>
  2226. c4c: e1a04000 mov r4, r0
  2227. pm_runtime_disable(priv->device);
  2228. }
  2229.  
  2230. static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
  2231. {
  2232. if (priv->device)
  2233. c50: e59005e4 ldr r0, [r0, #1508] ; 0x5e4
  2234. }
  2235.  
  2236. static int c_can_open(struct net_device *dev)
  2237. {
  2238. int err;
  2239. struct c_can_priv *priv = netdev_priv(dev);
  2240. c54: e2846d13 add r6, r4, #1216 ; 0x4c0
  2241. pm_runtime_disable(priv->device);
  2242. }
  2243.  
  2244. static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
  2245. {
  2246. if (priv->device)
  2247. c58: e3500000 cmp r0, #0
  2248. c5c: 0a000001 beq c68 <c_can_open+0x34>
  2249. c60: e3a01004 mov r1, #4
  2250. c64: ebfffffe bl 0 <__pm_runtime_resume>
  2251. pm_runtime_put_sync(priv->device);
  2252. }
  2253.  
  2254. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  2255. {
  2256. if (priv->raminit)
  2257. c68: e5943620 ldr r3, [r4, #1568] ; 0x620
  2258. c6c: e3530000 cmp r3, #0
  2259. c70: 0a000002 beq c80 <c_can_open+0x4c>
  2260. priv->raminit(priv, enable);
  2261. c74: e1a00006 mov r0, r6
  2262. c78: e3a01001 mov r1, #1
  2263. c7c: e12fff33 blx r3
  2264.  
  2265. c_can_pm_runtime_get_sync(priv);
  2266. c_can_reset_ram(priv, true);
  2267.  
  2268. /* open the can device */
  2269. err = open_candev(dev);
  2270. c80: e1a00004 mov r0, r4
  2271. c84: ebfffffe bl 0 <open_candev>
  2272. if (err) {
  2273. c88: e2505000 subs r5, r0, #0
  2274. c8c: 0a000012 beq cdc <c_can_open+0xa8>
  2275. netdev_err(dev, "failed to open can device\n");
  2276. c90: e3001000 movw r1, #0
  2277. c94: e1a00004 mov r0, r4
  2278. c98: e3401000 movt r1, #0
  2279. c9c: ebfffffe bl 0 <netdev_err>
  2280. pm_runtime_put_sync(priv->device);
  2281. }
  2282.  
  2283. static inline void c_can_reset_ram(const struct c_can_priv *priv, bool enable)
  2284. {
  2285. if (priv->raminit)
  2286. ca0: e5943620 ldr r3, [r4, #1568] ; 0x620
  2287. ca4: e3530000 cmp r3, #0
  2288. ca8: 0a000002 beq cb8 <c_can_open+0x84>
  2289. priv->raminit(priv, enable);
  2290. cac: e1a00006 mov r0, r6
  2291. cb0: e3a01000 mov r1, #0
  2292. cb4: e12fff33 blx r3
  2293. pm_runtime_get_sync(priv->device);
  2294. }
  2295.  
  2296. static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
  2297. {
  2298. if (priv->device)
  2299. cb8: e59405e4 ldr r0, [r4, #1508] ; 0x5e4
  2300. cbc: e3500000 cmp r0, #0
  2301. exit_irq_fail:
  2302. close_candev(dev);
  2303. exit_open_fail:
  2304. c_can_reset_ram(priv, false);
  2305. c_can_pm_runtime_put_sync(priv);
  2306. return err;
  2307. cc0: 01a00005 moveq r0, r5
  2308. pm_runtime_get_sync(priv->device);
  2309. }
  2310.  
  2311. static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv)
  2312. {
  2313. if (priv->device)
  2314. cc4: 0a000002 beq cd4 <c_can_open+0xa0>
  2315. RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
  2316. }
  2317.  
  2318. static inline int pm_runtime_put_sync(struct device *dev)
  2319. {
  2320. return __pm_runtime_idle(dev, RPM_GET_PUT);
  2321. cc8: e3a01004 mov r1, #4
  2322. ccc: ebfffffe bl 0 <__pm_runtime_idle>
  2323. exit_irq_fail:
  2324. close_candev(dev);
  2325. exit_open_fail:
  2326. c_can_reset_ram(priv, false);
  2327. c_can_pm_runtime_put_sync(priv);
  2328. return err;
  2329. cd0: e1a00005 mov r0, r5
  2330. }
  2331. cd4: e24bd018 sub sp, fp, #24
  2332. cd8: e89da870 ldm sp, {r4, r5, r6, fp, sp, pc}
  2333.  
  2334. static inline int __must_check
  2335. request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
  2336. const char *name, void *dev)
  2337. {
  2338. return request_threaded_irq(irq, handler, NULL, flags, name, dev);
  2339. cdc: e3001000 movw r1, #0
  2340. ce0: e5940028 ldr r0, [r4, #40] ; 0x28
  2341. ce4: e1a02005 mov r2, r5
  2342. ce8: e58d4000 str r4, [sp]
  2343. cec: e58d4004 str r4, [sp, #4]
  2344. cf0: e3401000 movt r1, #0
  2345. cf4: e3a03080 mov r3, #128 ; 0x80
  2346. cf8: ebfffffe bl 0 <request_threaded_irq>
  2347. }
  2348.  
  2349. /* register interrupt handler */
  2350. err = request_irq(dev->irq, &c_can_isr, IRQF_SHARED, dev->name,
  2351. dev);
  2352. if (err < 0) {
  2353. cfc: e2505000 subs r5, r0, #0
  2354. d00: ba000019 blt d6c <c_can_open+0x138>
  2355. netdev_err(dev, "failed to request interrupt\n");
  2356. goto exit_irq_fail;
  2357. }
  2358.  
  2359. /* start the c_can controller */
  2360. err = c_can_start(dev);
  2361. d04: e1a00004 mov r0, r4
  2362. d08: ebfffec9 bl 834 <c_can_start>
  2363. if (err)
  2364. d0c: e2505000 subs r5, r0, #0
  2365. d10: 1a00001c bne d88 <c_can_open+0x154>
  2366. d14: e5943578 ldr r3, [r4, #1400] ; 0x578
  2367. * Resume NAPI from being scheduled on this context.
  2368. * Must be paired with napi_disable.
  2369. */
  2370. static inline void napi_enable(struct napi_struct *n)
  2371. {
  2372. BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
  2373. d18: e3130001 tst r3, #1
  2374. d1c: 0a00001d beq d98 <c_can_open+0x164>
  2375. smp_mb__before_atomic();
  2376. d20: f57ff05b dmb ish
  2377. clear_bit(NAPI_STATE_SCHED, &n->state);
  2378. d24: e2845e57 add r5, r4, #1392 ; 0x570
  2379. d28: e3a00000 mov r0, #0
  2380. d2c: e2855008 add r5, r5, #8
  2381. d30: e1a01005 mov r1, r5
  2382. d34: ebfffffe bl 0 <_clear_bit>
  2383. clear_bit(NAPI_STATE_NPSVC, &n->state);
  2384. d38: e1a01005 mov r1, r5
  2385. d3c: e3a00002 mov r0, #2
  2386. d40: ebfffffe bl 0 <_clear_bit>
  2387.  
  2388. can_led_event(dev, CAN_LED_EVENT_OPEN);
  2389.  
  2390. napi_enable(&priv->napi);
  2391. /* enable status change, error and module interrupts */
  2392. c_can_irq_control(priv, true);
  2393. d44: e1a00006 mov r0, r6
  2394. d48: e3a01001 mov r1, #1
  2395. d4c: ebfffcab bl 0 <c_can_irq_control>
  2396. netif_schedule_queue(netdev_get_tx_queue(dev, i));
  2397. }
  2398.  
  2399. static inline void netif_tx_start_queue(struct netdev_queue *dev_queue)
  2400. {
  2401. clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
  2402. d50: e5941240 ldr r1, [r4, #576] ; 0x240
  2403. d54: e3a00000 mov r0, #0
  2404. d58: e2811050 add r1, r1, #80 ; 0x50
  2405. d5c: ebfffffe bl 0 <_clear_bit>
  2406. netif_start_queue(dev);
  2407.  
  2408. return 0;
  2409. d60: e3a00000 mov r0, #0
  2410. close_candev(dev);
  2411. exit_open_fail:
  2412. c_can_reset_ram(priv, false);
  2413. c_can_pm_runtime_put_sync(priv);
  2414. return err;
  2415. }
  2416. d64: e24bd018 sub sp, fp, #24
  2417. d68: e89da870 ldm sp, {r4, r5, r6, fp, sp, pc}
  2418.  
  2419. /* register interrupt handler */
  2420. err = request_irq(dev->irq, &c_can_isr, IRQF_SHARED, dev->name,
  2421. dev);
  2422. if (err < 0) {
  2423. netdev_err(dev, "failed to request interrupt\n");
  2424. d6c: e3001000 movw r1, #0
  2425. d70: e1a00004 mov r0, r4
  2426. d74: e3401000 movt r1, #0
  2427. d78: ebfffffe bl 0 <netdev_err>
  2428. return 0;
  2429.  
  2430. exit_start_fail:
  2431. free_irq(dev->irq, dev);
  2432. exit_irq_fail:
  2433. close_candev(dev);
  2434. d7c: e1a00004 mov r0, r4
  2435. d80: ebfffffe bl 0 <close_candev>
  2436. d84: eaffffc5 b ca0 <c_can_open+0x6c>
  2437. netif_start_queue(dev);
  2438.  
  2439. return 0;
  2440.  
  2441. exit_start_fail:
  2442. free_irq(dev->irq, dev);
  2443. d88: e5940028 ldr r0, [r4, #40] ; 0x28
  2444. d8c: e1a01004 mov r1, r4
  2445. d90: ebfffffe bl 0 <free_irq>
  2446. d94: eafffff8 b d7c <c_can_open+0x148>
  2447. d98: e7f001f2 .word 0xe7f001f2
  2448.  
  2449. 00000d9c <c_can_poll>:
  2450. netif_receive_skb(skb);
  2451. return 1;
  2452. }
  2453.  
  2454. static int c_can_poll(struct napi_struct *napi, int quota)
  2455. {
  2456. d9c: e1a0c00d mov ip, sp
  2457. da0: e92ddff0 push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
  2458. da4: e24cb004 sub fp, ip, #4
  2459. da8: e24dd034 sub sp, sp, #52 ; 0x34
  2460. dac: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  2461. db0: ebfffffe bl 0 <__gnu_mcount_nc>
  2462. struct net_device *dev = napi->dev;
  2463. db4: e5904018 ldr r4, [r0, #24]
  2464. netif_receive_skb(skb);
  2465. return 1;
  2466. }
  2467.  
  2468. static int c_can_poll(struct napi_struct *napi, int quota)
  2469. {
  2470. db8: e50b0058 str r0, [fp, #-88] ; 0x58
  2471. dbc: e50b1050 str r1, [fp, #-80] ; 0x50
  2472. struct net_device *dev = napi->dev;
  2473. struct c_can_priv *priv = netdev_priv(dev);
  2474. u16 curr, last = priv->last_status;
  2475. int work_done = 0;
  2476.  
  2477. priv->last_status = curr = priv->read_reg(priv, C_CAN_STS_REG);
  2478. dc0: e3a01002 mov r1, #2
  2479. }
  2480.  
  2481. static int c_can_poll(struct napi_struct *napi, int quota)
  2482. {
  2483. struct net_device *dev = napi->dev;
  2484. struct c_can_priv *priv = netdev_priv(dev);
  2485. dc4: e2848d13 add r8, r4, #1216 ; 0x4c0
  2486. u16 curr, last = priv->last_status;
  2487. int work_done = 0;
  2488.  
  2489. priv->last_status = curr = priv->read_reg(priv, C_CAN_STS_REG);
  2490. dc8: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  2491. dcc: e1a00008 mov r0, r8
  2492.  
  2493. static int c_can_poll(struct napi_struct *napi, int quota)
  2494. {
  2495. struct net_device *dev = napi->dev;
  2496. struct c_can_priv *priv = netdev_priv(dev);
  2497. u16 curr, last = priv->last_status;
  2498. dd0: e59475f0 ldr r7, [r4, #1520] ; 0x5f0
  2499. int work_done = 0;
  2500.  
  2501. priv->last_status = curr = priv->read_reg(priv, C_CAN_STS_REG);
  2502. dd4: e12fff33 blx r3
  2503. /* Ack status on C_CAN. D_CAN is self clearing */
  2504. if (priv->type != BOSCH_D_CAN)
  2505. dd8: e5943610 ldr r3, [r4, #1552] ; 0x610
  2506. struct net_device *dev = napi->dev;
  2507. struct c_can_priv *priv = netdev_priv(dev);
  2508. u16 curr, last = priv->last_status;
  2509. int work_done = 0;
  2510.  
  2511. priv->last_status = curr = priv->read_reg(priv, C_CAN_STS_REG);
  2512. ddc: e1a05000 mov r5, r0
  2513. de0: e58405f0 str r0, [r4, #1520] ; 0x5f0
  2514. /* Ack status on C_CAN. D_CAN is self clearing */
  2515. if (priv->type != BOSCH_D_CAN)
  2516. de4: e3530002 cmp r3, #2
  2517. de8: 0a000004 beq e00 <c_can_poll+0x64>
  2518. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  2519. dec: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  2520. df0: e1a00008 mov r0, r8
  2521. df4: e3a01002 mov r1, #2
  2522. df8: e3a02007 mov r2, #7
  2523. dfc: e12fff33 blx r3
  2524.  
  2525. /* handle state changes */
  2526. if ((curr & STATUS_EWARN) && (!(last & STATUS_EWARN))) {
  2527. e00: e205a040 and sl, r5, #64 ; 0x40
  2528. e04: e6ff7077 uxth r7, r7
  2529. e08: e6ffa07a uxth sl, sl
  2530. e0c: e35a0000 cmp sl, #0
  2531. e10: 0a000002 beq e20 <c_can_poll+0x84>
  2532. e14: e3170040 tst r7, #64 ; 0x40
  2533. static int c_can_poll(struct napi_struct *napi, int quota)
  2534. {
  2535. struct net_device *dev = napi->dev;
  2536. struct c_can_priv *priv = netdev_priv(dev);
  2537. u16 curr, last = priv->last_status;
  2538. int work_done = 0;
  2539. e18: 13a0a000 movne sl, #0
  2540. /* Ack status on C_CAN. D_CAN is self clearing */
  2541. if (priv->type != BOSCH_D_CAN)
  2542. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  2543.  
  2544. /* handle state changes */
  2545. if ((curr & STATUS_EWARN) && (!(last & STATUS_EWARN))) {
  2546. e1c: 0a000170 beq 13e4 <c_can_poll+0x648>
  2547. netdev_dbg(dev, "entered error warning state\n");
  2548. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_WARNING);
  2549. }
  2550.  
  2551. if ((curr & STATUS_EPASS) && (!(last & STATUS_EPASS))) {
  2552. e20: e2056020 and r6, r5, #32
  2553. e24: e6ff6076 uxth r6, r6
  2554. e28: e3560000 cmp r6, #0
  2555. e2c: 0a000001 beq e38 <c_can_poll+0x9c>
  2556. e30: e3170020 tst r7, #32
  2557. e34: 0a00015f beq 13b8 <c_can_poll+0x61c>
  2558. netdev_dbg(dev, "entered error passive state\n");
  2559. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_PASSIVE);
  2560. }
  2561.  
  2562. if ((curr & STATUS_BOFF) && (!(last & STATUS_BOFF))) {
  2563. e38: e2059080 and r9, r5, #128 ; 0x80
  2564. e3c: e6ff9079 uxth r9, r9
  2565. e40: e3590000 cmp r9, #0
  2566. e44: 1a000114 bne 129c <c_can_poll+0x500>
  2567. work_done += c_can_handle_state_change(dev, C_CAN_BUS_OFF);
  2568. goto end;
  2569. }
  2570.  
  2571. /* handle bus recovery events */
  2572. if ((!(curr & STATUS_BOFF)) && (last & STATUS_BOFF)) {
  2573. e48: e3170080 tst r7, #128 ; 0x80
  2574. e4c: 1a00016f bne 1410 <c_can_poll+0x674>
  2575. netdev_dbg(dev, "left bus off state\n");
  2576. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  2577. }
  2578. if ((!(curr & STATUS_EPASS)) && (last & STATUS_EPASS)) {
  2579. e50: e3560000 cmp r6, #0
  2580. e54: 0a00012d beq 1310 <c_can_poll+0x574>
  2581. /*
  2582. * early exit if no lec update or no error.
  2583. * no lec update means that no CAN bus event has been detected
  2584. * since CPU wrote 0x7 value to status reg.
  2585. */
  2586. if (lec_type == LEC_UNUSED || lec_type == LEC_NO_ERROR)
  2587. e58: e2155007 ands r5, r5, #7
  2588. e5c: 03a03001 moveq r3, #1
  2589. e60: 13a03000 movne r3, #0
  2590. e64: e3550007 cmp r5, #7
  2591. e68: 03833001 orreq r3, r3, #1
  2592. e6c: e3530000 cmp r3, #0
  2593. e70: 1a000002 bne e80 <c_can_poll+0xe4>
  2594. return 0;
  2595.  
  2596. if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
  2597. e74: e5943528 ldr r3, [r4, #1320] ; 0x528
  2598. e78: e3130010 tst r3, #16
  2599. e7c: 1a00012d bne 1338 <c_can_poll+0x59c>
  2600. * early exit if no lec update or no error.
  2601. * no lec update means that no CAN bus event has been detected
  2602. * since CPU wrote 0x7 value to status reg.
  2603. */
  2604. if (lec_type == LEC_UNUSED || lec_type == LEC_NO_ERROR)
  2605. return 0;
  2606. e80: e3a03000 mov r3, #0
  2607.  
  2608. /* handle lec errors on the bus */
  2609. work_done += c_can_handle_bus_err(dev, curr & LEC_MASK);
  2610.  
  2611. /* Handle Tx/Rx events. We do this unconditionally */
  2612. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  2613. e84: e51b0050 ldr r0, [fp, #-80] ; 0x50
  2614. netdev_dbg(dev, "left error passive state\n");
  2615. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  2616. }
  2617.  
  2618. /* handle lec errors on the bus */
  2619. work_done += c_can_handle_bus_err(dev, curr & LEC_MASK);
  2620. e88: e08a3003 add r3, sl, r3
  2621. e8c: e50b3054 str r3, [fp, #-84] ; 0x54
  2622.  
  2623. /* Handle Tx/Rx events. We do this unconditionally */
  2624. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  2625. e90: e0630000 rsb r0, r3, r0
  2626. * for a maximum number of 16 objects.
  2627. */
  2628. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  2629. "Implementation does not support more message objects than 16");
  2630.  
  2631. while (quota > 0) {
  2632. e94: e3500000 cmp r0, #0
  2633.  
  2634. /* handle lec errors on the bus */
  2635. work_done += c_can_handle_bus_err(dev, curr & LEC_MASK);
  2636.  
  2637. /* Handle Tx/Rx events. We do this unconditionally */
  2638. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  2639. e98: e50b0040 str r0, [fp, #-64] ; 0x40
  2640. * for a maximum number of 16 objects.
  2641. */
  2642. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  2643. "Implementation does not support more message objects than 16");
  2644.  
  2645. while (quota > 0) {
  2646. e9c: da000165 ble 1438 <c_can_poll+0x69c>
  2647.  
  2648. /*
  2649. * Find the first set bit after the gap. We walk backwards
  2650. * from the last set bit.
  2651. */
  2652. for (lasts--; pend & (1 << (lasts - 1)); lasts--);
  2653. ea0: e3a0a001 mov sl, #1
  2654. * This can result in packet reordering when the readout is slow.
  2655. */
  2656. static int c_can_do_rx_poll(struct net_device *dev, int quota)
  2657. {
  2658. struct c_can_priv *priv = netdev_priv(dev);
  2659. u32 pkts = 0, pend = 0, toread, n;
  2660. ea4: e3a02000 mov r2, #0
  2661. ea8: e50b204c str r2, [fp, #-76] ; 0x4c
  2662. eac: e50b2038 str r2, [fp, #-56] ; 0x38
  2663. */
  2664. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  2665. "Implementation does not support more message objects than 16");
  2666.  
  2667. while (quota > 0) {
  2668. if (!pend) {
  2669. eb0: e51b3038 ldr r3, [fp, #-56] ; 0x38
  2670. eb4: e3530000 cmp r3, #0
  2671. eb8: 0a000090 beq 1100 <c_can_poll+0x364>
  2672. ebc: e51b5038 ldr r5, [fp, #-56] ; 0x38
  2673. ec0: e1e03003 mvn r3, r3
  2674. toread = c_can_adjust_pending(pend);
  2675. } else {
  2676. toread = pend;
  2677. }
  2678. /* Remove the bits from pend */
  2679. pend &= ~toread;
  2680. ec4: e51b2038 ldr r2, [fp, #-56] ; 0x38
  2681. }
  2682.  
  2683. static int c_can_read_objects(struct net_device *dev, struct c_can_priv *priv,
  2684. u32 pend, int quota)
  2685. {
  2686. u32 pkts = 0, ctrl, obj;
  2687. ec8: e3a09000 mov r9, #0
  2688. toread = c_can_adjust_pending(pend);
  2689. } else {
  2690. toread = pend;
  2691. }
  2692. /* Remove the bits from pend */
  2693. pend &= ~toread;
  2694. ecc: e51b7040 ldr r7, [fp, #-64] ; 0x40
  2695. ed0: e0022003 and r2, r2, r3
  2696. ed4: e50b2038 str r2, [fp, #-56] ; 0x38
  2697. * ffs() returns zero if the input was zero, otherwise returns the bit
  2698. * position of the first set bit, where the LSB is 1 and MSB is 32.
  2699. */
  2700. static inline int ffs(int x)
  2701. {
  2702. return fls(x & -x);
  2703. ed8: e2653000 rsb r3, r5, #0
  2704. edc: e0033005 and r3, r3, r5
  2705. */
  2706. static inline unsigned int __clz(unsigned int x)
  2707. {
  2708. unsigned int ret;
  2709.  
  2710. asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
  2711. ee0: e16f3f13 clz r3, r3
  2712. static int c_can_read_objects(struct net_device *dev, struct c_can_priv *priv,
  2713. u32 pend, int quota)
  2714. {
  2715. u32 pkts = 0, ctrl, obj;
  2716.  
  2717. while ((obj = ffs(pend)) && quota > 0) {
  2718. ee4: e2736020 rsbs r6, r3, #32
  2719. ee8: 0a0000a2 beq 1178 <c_can_poll+0x3dc>
  2720. eec: e3570000 cmp r7, #0
  2721. ef0: 0a0000a0 beq 1178 <c_can_poll+0x3dc>
  2722. pend &= ~BIT(obj - 1);
  2723. ef4: e263c01f rsb ip, r3, #31
  2724. }
  2725.  
  2726. static inline void c_can_object_get(struct net_device *dev, int iface,
  2727. u32 obj, u32 cmd)
  2728. {
  2729. c_can_obj_update(dev, iface, cmd, obj);
  2730. ef8: e5942624 ldr r2, [r4, #1572] ; 0x624
  2731. efc: e1a00004 mov r0, r4
  2732. f00: e3a01000 mov r1, #0
  2733. f04: e1a03006 mov r3, r6
  2734. u32 pend, int quota)
  2735. {
  2736. u32 pkts = 0, ctrl, obj;
  2737.  
  2738. while ((obj = ffs(pend)) && quota > 0) {
  2739. pend &= ~BIT(obj - 1);
  2740. f08: e1c55c1a bic r5, r5, sl, lsl ip
  2741. }
  2742.  
  2743. static inline void c_can_object_get(struct net_device *dev, int iface,
  2744. u32 obj, u32 cmd)
  2745. {
  2746. c_can_obj_update(dev, iface, cmd, obj);
  2747. f0c: ebfffc98 bl 174 <c_can_obj_update>
  2748.  
  2749. while ((obj = ffs(pend)) && quota > 0) {
  2750. pend &= ~BIT(obj - 1);
  2751.  
  2752. c_can_rx_object_get(dev, priv, obj);
  2753. ctrl = priv->read_reg(priv, C_CAN_IFACE(MSGCTRL_REG, IF_RX));
  2754. f10: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  2755. f14: e1a00008 mov r0, r8
  2756. f18: e3a0100e mov r1, #14
  2757. f1c: e12fff33 blx r3
  2758.  
  2759. if (ctrl & IF_MCONT_MSGLST) {
  2760. f20: e3100901 tst r0, #16384 ; 0x4000
  2761.  
  2762. while ((obj = ffs(pend)) && quota > 0) {
  2763. pend &= ~BIT(obj - 1);
  2764.  
  2765. c_can_rx_object_get(dev, priv, obj);
  2766. ctrl = priv->read_reg(priv, C_CAN_IFACE(MSGCTRL_REG, IF_RX));
  2767. f24: e1a02000 mov r2, r0
  2768.  
  2769. if (ctrl & IF_MCONT_MSGLST) {
  2770. f28: 1a00004b bne 105c <c_can_poll+0x2c0>
  2771. /*
  2772. * This really should not happen, but this covers some
  2773. * odd HW behaviour. Do not remove that unless you
  2774. * want to brick your machine.
  2775. */
  2776. if (!(ctrl & IF_MCONT_NEWDAT))
  2777. f2c: e3100902 tst r0, #32768 ; 0x8000
  2778. f30: 0affffe8 beq ed8 <c_can_poll+0x13c>
  2779. struct c_can_priv *priv = netdev_priv(dev);
  2780. struct can_frame *frame;
  2781. struct sk_buff *skb;
  2782. u32 arb, data;
  2783.  
  2784. skb = alloc_can_skb(dev, &frame);
  2785. f34: e1a00004 mov r0, r4
  2786. f38: e24b1030 sub r1, fp, #48 ; 0x30
  2787. f3c: e50b205c str r2, [fp, #-92] ; 0x5c
  2788. f40: ebfffffe bl 0 <alloc_can_skb>
  2789. if (!skb) {
  2790. f44: e3500000 cmp r0, #0
  2791. f48: e51b205c ldr r2, [fp, #-92] ; 0x5c
  2792. f4c: e50b003c str r0, [fp, #-60] ; 0x3c
  2793. f50: 0a000111 beq 139c <c_can_poll+0x600>
  2794. stats->rx_dropped++;
  2795. return -ENOMEM;
  2796. }
  2797.  
  2798. frame->can_dlc = get_can_dlc(ctrl & 0x0F);
  2799. f54: e202200f and r2, r2, #15
  2800. f58: e51b3030 ldr r3, [fp, #-48] ; 0x30
  2801. f5c: e3520008 cmp r2, #8
  2802.  
  2803. arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
  2804. f60: e1a00008 mov r0, r8
  2805. if (!skb) {
  2806. stats->rx_dropped++;
  2807. return -ENOMEM;
  2808. }
  2809.  
  2810. frame->can_dlc = get_can_dlc(ctrl & 0x0F);
  2811. f64: 23a02008 movcs r2, #8
  2812.  
  2813. arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
  2814. f68: e3a0100c mov r1, #12
  2815. if (!skb) {
  2816. stats->rx_dropped++;
  2817. return -ENOMEM;
  2818. }
  2819.  
  2820. frame->can_dlc = get_can_dlc(ctrl & 0x0F);
  2821. f6c: e5c32004 strb r2, [r3, #4]
  2822.  
  2823. arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
  2824. f70: e59435fc ldr r3, [r4, #1532] ; 0x5fc
  2825. f74: e12fff33 blx r3
  2826.  
  2827. if (arb & IF_ARB_MSGXTD)
  2828. frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG;
  2829. f78: e51b3030 ldr r3, [fp, #-48] ; 0x30
  2830.  
  2831. frame->can_dlc = get_can_dlc(ctrl & 0x0F);
  2832.  
  2833. arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
  2834.  
  2835. if (arb & IF_ARB_MSGXTD)
  2836. f7c: e3100101 tst r0, #1073741824 ; 0x40000000
  2837. frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG;
  2838. f80: 13c0220e bicne r2, r0, #-536870912 ; 0xe0000000
  2839. else
  2840. frame->can_id = (arb >> 18) & CAN_SFF_MASK;
  2841. f84: 07ea2950 ubfxeq r2, r0, #18, #11
  2842. frame->can_dlc = get_can_dlc(ctrl & 0x0F);
  2843.  
  2844. arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
  2845.  
  2846. if (arb & IF_ARB_MSGXTD)
  2847. frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG;
  2848. f88: 13822102 orrne r2, r2, #-2147483648 ; 0x80000000
  2849. else
  2850. frame->can_id = (arb >> 18) & CAN_SFF_MASK;
  2851. f8c: e5832000 str r2, [r3]
  2852.  
  2853. if (arb & IF_ARB_TRANSMIT) {
  2854. f90: e2103202 ands r3, r0, #536870912 ; 0x20000000
  2855. f94: 1a000053 bne 10e8 <c_can_poll+0x34c>
  2856. frame->can_id |= CAN_RTR_FLAG;
  2857. } else {
  2858. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2859.  
  2860. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2861. f98: e51b0030 ldr r0, [fp, #-48] ; 0x30
  2862. f9c: e5d02004 ldrb r2, [r0, #4]
  2863. fa0: e3520000 cmp r2, #0
  2864. fa4: 0a000017 beq 1008 <c_can_poll+0x26c>
  2865. fa8: e3a0200f mov r2, #15
  2866. fac: e50b5044 str r5, [fp, #-68] ; 0x44
  2867. fb0: e50b6048 str r6, [fp, #-72] ; 0x48
  2868. fb4: e1a05004 mov r5, r4
  2869. fb8: e1a06002 mov r6, r2
  2870. fbc: e1a04003 mov r4, r3
  2871. data = priv->read_reg(priv, dreg);
  2872. fc0: e1a01006 mov r1, r6
  2873. fc4: e595c5f4 ldr ip, [r5, #1524] ; 0x5f4
  2874. fc8: e1a00008 mov r0, r8
  2875. if (arb & IF_ARB_TRANSMIT) {
  2876. frame->can_id |= CAN_RTR_FLAG;
  2877. } else {
  2878. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2879.  
  2880. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2881. fcc: e2866001 add r6, r6, #1
  2882. data = priv->read_reg(priv, dreg);
  2883. fd0: e12fff3c blx ip
  2884. frame->data[i] = data;
  2885. fd4: e51b1030 ldr r1, [fp, #-48] ; 0x30
  2886. frame->data[i + 1] = data >> 8;
  2887. fd8: e1a0e420 lsr lr, r0, #8
  2888. } else {
  2889. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2890.  
  2891. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2892. data = priv->read_reg(priv, dreg);
  2893. frame->data[i] = data;
  2894. fdc: e081c004 add ip, r1, r4
  2895. if (arb & IF_ARB_TRANSMIT) {
  2896. frame->can_id |= CAN_RTR_FLAG;
  2897. } else {
  2898. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2899.  
  2900. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2901. fe0: e2844002 add r4, r4, #2
  2902. data = priv->read_reg(priv, dreg);
  2903. frame->data[i] = data;
  2904. frame->data[i + 1] = data >> 8;
  2905. fe4: e5cce009 strb lr, [ip, #9]
  2906. } else {
  2907. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2908.  
  2909. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2910. data = priv->read_reg(priv, dreg);
  2911. frame->data[i] = data;
  2912. fe8: e5cc0008 strb r0, [ip, #8]
  2913. if (arb & IF_ARB_TRANSMIT) {
  2914. frame->can_id |= CAN_RTR_FLAG;
  2915. } else {
  2916. int i, dreg = C_CAN_IFACE(DATA1_REG, iface);
  2917.  
  2918. for (i = 0; i < frame->can_dlc; i += 2, dreg ++) {
  2919. fec: e5d10004 ldrb r0, [r1, #4]
  2920. ff0: e1540000 cmp r4, r0
  2921. ff4: bafffff1 blt fc0 <c_can_poll+0x224>
  2922. ff8: e1a04005 mov r4, r5
  2923. ffc: e51b6048 ldr r6, [fp, #-72] ; 0x48
  2924. 1000: e51b5044 ldr r5, [fp, #-68] ; 0x44
  2925. data = priv->read_reg(priv, dreg);
  2926. frame->data[i] = data;
  2927. 1004: e1a00001 mov r0, r1
  2928. frame->data[i + 1] = data >> 8;
  2929. }
  2930. }
  2931.  
  2932. stats->rx_packets++;
  2933. 1008: e59430c0 ldr r3, [r4, #192] ; 0xc0
  2934. stats->rx_bytes += frame->can_dlc;
  2935. 100c: e59420c8 ldr r2, [r4, #200] ; 0xc8
  2936. int netif_rx(struct sk_buff *skb);
  2937. int netif_rx_ni(struct sk_buff *skb);
  2938. int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb);
  2939. static inline int netif_receive_skb(struct sk_buff *skb)
  2940. {
  2941. return netif_receive_skb_sk(skb->sk, skb);
  2942. 1010: e51b103c ldr r1, [fp, #-60] ; 0x3c
  2943. frame->data[i] = data;
  2944. frame->data[i + 1] = data >> 8;
  2945. }
  2946. }
  2947.  
  2948. stats->rx_packets++;
  2949. 1014: e2833001 add r3, r3, #1
  2950. 1018: e58430c0 str r3, [r4, #192] ; 0xc0
  2951. stats->rx_bytes += frame->can_dlc;
  2952. 101c: e5d03004 ldrb r3, [r0, #4]
  2953. 1020: e0823003 add r3, r2, r3
  2954. 1024: e58430c8 str r3, [r4, #200] ; 0xc8
  2955. 1028: e5910010 ldr r0, [r1, #16]
  2956. 102c: ebfffffe bl 0 <netif_receive_skb_sk>
  2957. }
  2958.  
  2959. static inline void c_can_rx_finalize(struct net_device *dev,
  2960. struct c_can_priv *priv, u32 obj)
  2961. {
  2962. if (priv->type != BOSCH_D_CAN)
  2963. 1030: e5943610 ldr r3, [r4, #1552] ; 0x610
  2964. 1034: e3530002 cmp r3, #2
  2965. 1038: 0a000004 beq 1050 <c_can_poll+0x2b4>
  2966. }
  2967.  
  2968. static inline void c_can_object_get(struct net_device *dev, int iface,
  2969. u32 obj, u32 cmd)
  2970. {
  2971. c_can_obj_update(dev, iface, cmd, obj);
  2972. 103c: e1a03006 mov r3, r6
  2973. 1040: e1a00004 mov r0, r4
  2974. 1044: e3a01000 mov r1, #0
  2975. 1048: e3a02004 mov r2, #4
  2976. 104c: ebfffc48 bl 174 <c_can_obj_update>
  2977. /* read the data from the message object */
  2978. c_can_read_msg_object(dev, IF_RX, ctrl);
  2979.  
  2980. c_can_rx_finalize(dev, priv, obj);
  2981.  
  2982. pkts++;
  2983. 1050: e2899001 add r9, r9, #1
  2984. quota--;
  2985. 1054: e2477001 sub r7, r7, #1
  2986. 1058: eaffff9e b ed8 <c_can_poll+0x13c>
  2987. struct c_can_priv *priv = netdev_priv(dev);
  2988. struct can_frame *frame;
  2989. struct sk_buff *skb;
  2990.  
  2991. ctrl &= ~(IF_MCONT_MSGLST | IF_MCONT_INTPND | IF_MCONT_NEWDAT);
  2992. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  2993. 105c: e7ec2050 ubfx r2, r0, #0, #13
  2994. 1060: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  2995. 1064: e1a00008 mov r0, r8
  2996. 1068: e3a0100e mov r1, #14
  2997. 106c: e12fff33 blx r3
  2998. }
  2999.  
  3000. static inline void c_can_object_put(struct net_device *dev, int iface,
  3001. u32 obj, u32 cmd)
  3002. {
  3003. c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj);
  3004. 1070: e1a00004 mov r0, r4
  3005. 1074: e1a03006 mov r3, r6
  3006. 1078: e3a01000 mov r1, #0
  3007. 107c: e3a02090 mov r2, #144 ; 0x90
  3008. 1080: ebfffc3b bl 174 <c_can_obj_update>
  3009.  
  3010. ctrl &= ~(IF_MCONT_MSGLST | IF_MCONT_INTPND | IF_MCONT_NEWDAT);
  3011. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  3012. c_can_object_put(dev, iface, objno, IF_COMM_CONTROL);
  3013.  
  3014. stats->rx_errors++;
  3015. 1084: e59420d0 ldr r2, [r4, #208] ; 0xd0
  3016. stats->rx_over_errors++;
  3017.  
  3018. /* create an error msg */
  3019. skb = alloc_can_err_skb(dev, &frame);
  3020. 1088: e1a00004 mov r0, r4
  3021. ctrl &= ~(IF_MCONT_MSGLST | IF_MCONT_INTPND | IF_MCONT_NEWDAT);
  3022. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  3023. c_can_object_put(dev, iface, objno, IF_COMM_CONTROL);
  3024.  
  3025. stats->rx_errors++;
  3026. stats->rx_over_errors++;
  3027. 108c: e59430ec ldr r3, [r4, #236] ; 0xec
  3028.  
  3029. /* create an error msg */
  3030. skb = alloc_can_err_skb(dev, &frame);
  3031. 1090: e24b1030 sub r1, fp, #48 ; 0x30
  3032.  
  3033. ctrl &= ~(IF_MCONT_MSGLST | IF_MCONT_INTPND | IF_MCONT_NEWDAT);
  3034. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  3035. c_can_object_put(dev, iface, objno, IF_COMM_CONTROL);
  3036.  
  3037. stats->rx_errors++;
  3038. 1094: e2822001 add r2, r2, #1
  3039. stats->rx_over_errors++;
  3040. 1098: e2833001 add r3, r3, #1
  3041.  
  3042. ctrl &= ~(IF_MCONT_MSGLST | IF_MCONT_INTPND | IF_MCONT_NEWDAT);
  3043. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  3044. c_can_object_put(dev, iface, objno, IF_COMM_CONTROL);
  3045.  
  3046. stats->rx_errors++;
  3047. 109c: e58420d0 str r2, [r4, #208] ; 0xd0
  3048. stats->rx_over_errors++;
  3049. 10a0: e58430ec str r3, [r4, #236] ; 0xec
  3050.  
  3051. /* create an error msg */
  3052. skb = alloc_can_err_skb(dev, &frame);
  3053. 10a4: ebfffffe bl 0 <alloc_can_err_skb>
  3054. if (unlikely(!skb))
  3055. 10a8: e3500000 cmp r0, #0
  3056. 10ac: 0a000138 beq 1594 <c_can_poll+0x7f8>
  3057. return 0;
  3058.  
  3059. frame->can_id |= CAN_ERR_CRTL;
  3060. 10b0: e51b3030 ldr r3, [fp, #-48] ; 0x30
  3061. 10b4: e1a01000 mov r1, r0
  3062. 10b8: e5932000 ldr r2, [r3]
  3063. 10bc: e3822004 orr r2, r2, #4
  3064. 10c0: e5832000 str r2, [r3]
  3065. frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
  3066. 10c4: e51b3030 ldr r3, [fp, #-48] ; 0x30
  3067. 10c8: e5c3a009 strb sl, [r3, #9]
  3068. 10cc: e5900010 ldr r0, [r0, #16]
  3069. 10d0: ebfffffe bl 0 <netif_receive_skb_sk>
  3070. 10d4: e3a03001 mov r3, #1
  3071.  
  3072. netif_receive_skb(skb);
  3073. return 1;
  3074. 10d8: e1a02003 mov r2, r3
  3075. ctrl = priv->read_reg(priv, C_CAN_IFACE(MSGCTRL_REG, IF_RX));
  3076.  
  3077. if (ctrl & IF_MCONT_MSGLST) {
  3078. int n = c_can_handle_lost_msg_obj(dev, IF_RX, obj, ctrl);
  3079.  
  3080. pkts += n;
  3081. 10dc: e0899003 add r9, r9, r3
  3082. quota -= n;
  3083. 10e0: e0627007 rsb r7, r2, r7
  3084. 10e4: eaffff7b b ed8 <c_can_poll+0x13c>
  3085. frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG;
  3086. else
  3087. frame->can_id = (arb >> 18) & CAN_SFF_MASK;
  3088.  
  3089. if (arb & IF_ARB_TRANSMIT) {
  3090. frame->can_id |= CAN_RTR_FLAG;
  3091. 10e8: e51b3030 ldr r3, [fp, #-48] ; 0x30
  3092. 10ec: e5932000 ldr r2, [r3]
  3093. 10f0: e3822101 orr r2, r2, #1073741824 ; 0x40000000
  3094. 10f4: e5832000 str r2, [r3]
  3095. 10f8: e51b0030 ldr r0, [fp, #-48] ; 0x30
  3096. 10fc: eaffffc1 b 1008 <c_can_poll+0x26c>
  3097. return pkts;
  3098. }
  3099.  
  3100. static inline u32 c_can_get_pending(struct c_can_priv *priv)
  3101. {
  3102. u32 pend = priv->read_reg(priv, C_CAN_NEWDAT1_REG);
  3103. 1100: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  3104. 1104: e1a00008 mov r0, r8
  3105. 1108: e3a01020 mov r1, #32
  3106. 110c: e12fff33 blx r3
  3107. "Implementation does not support more message objects than 16");
  3108.  
  3109. while (quota > 0) {
  3110. if (!pend) {
  3111. pend = c_can_get_pending(priv);
  3112. if (!pend)
  3113. 1110: e3500000 cmp r0, #0
  3114. return pkts;
  3115. }
  3116.  
  3117. static inline u32 c_can_get_pending(struct c_can_priv *priv)
  3118. {
  3119. u32 pend = priv->read_reg(priv, C_CAN_NEWDAT1_REG);
  3120. 1114: e50b0038 str r0, [fp, #-56] ; 0x38
  3121. 1118: e1a06000 mov r6, r0
  3122. "Implementation does not support more message objects than 16");
  3123.  
  3124. while (quota > 0) {
  3125. if (!pend) {
  3126. pend = c_can_get_pending(priv);
  3127. if (!pend)
  3128. 111c: 0a00001d beq 1198 <c_can_poll+0x3fc>
  3129. */
  3130. static u32 c_can_adjust_pending(u32 pend)
  3131. {
  3132. u32 weight, lasts;
  3133.  
  3134. if (pend == RECEIVE_OBJECT_BITS)
  3135. 1120: e51b2038 ldr r2, [fp, #-56] ; 0x38
  3136. 1124: e30f3fff movw r3, #65535 ; 0xffff
  3137. 1128: e1520003 cmp r2, r3
  3138. 112c: 0a000052 beq 127c <c_can_poll+0x4e0>
  3139.  
  3140. #include <asm/types.h>
  3141.  
  3142. static inline unsigned int __arch_hweight32(unsigned int w)
  3143. {
  3144. return __sw_hweight32(w);
  3145. 1130: ebfffffe bl 0 <__sw_hweight32>
  3146. 1134: e51b3038 ldr r3, [fp, #-56] ; 0x38
  3147. 1138: e16f2f13 clz r2, r3
  3148. static inline int fls(int x)
  3149. {
  3150. if (__builtin_constant_p(x))
  3151. return constant_fls(x);
  3152.  
  3153. return 32 - __clz(x);
  3154. 113c: e2623020 rsb r3, r2, #32
  3155. */
  3156. weight = hweight32(pend);
  3157. lasts = fls(pend);
  3158.  
  3159. /* If the bits are linear, nothing to do */
  3160. if (lasts == weight)
  3161. 1140: e1500003 cmp r0, r3
  3162.  
  3163. /*
  3164. * Find the first set bit after the gap. We walk backwards
  3165. * from the last set bit.
  3166. */
  3167. for (lasts--; pend & (1 << (lasts - 1)); lasts--);
  3168. 1144: 1262201f rsbne r2, r2, #31
  3169. */
  3170. weight = hweight32(pend);
  3171. lasts = fls(pend);
  3172.  
  3173. /* If the bits are linear, nothing to do */
  3174. if (lasts == weight)
  3175. 1148: 1a000001 bne 1154 <c_can_poll+0x3b8>
  3176. 114c: ea00004e b 128c <c_can_poll+0x4f0>
  3177.  
  3178. /*
  3179. * Find the first set bit after the gap. We walk backwards
  3180. * from the last set bit.
  3181. */
  3182. for (lasts--; pend & (1 << (lasts - 1)); lasts--);
  3183. 1150: e1a02003 mov r2, r3
  3184. 1154: e2423001 sub r3, r2, #1
  3185. 1158: e3a01001 mov r1, #1
  3186. 115c: e016031a ands r0, r6, sl, lsl r3
  3187. 1160: 1afffffa bne 1150 <c_can_poll+0x3b4>
  3188.  
  3189. return pend & ~((1 << lasts) - 1);
  3190. 1164: e1a05211 lsl r5, r1, r2
  3191. 1168: e2655000 rsb r5, r5, #0
  3192. 116c: e0055006 and r5, r5, r6
  3193. 1170: e1e03005 mvn r3, r5
  3194. 1174: eaffff52 b ec4 <c_can_poll+0x128>
  3195. /* Remove the bits from pend */
  3196. pend &= ~toread;
  3197. /* Read the objects */
  3198. n = c_can_read_objects(dev, priv, toread, quota);
  3199. pkts += n;
  3200. quota -= n;
  3201. 1178: e51b0040 ldr r0, [fp, #-64] ; 0x40
  3202. }
  3203. /* Remove the bits from pend */
  3204. pend &= ~toread;
  3205. /* Read the objects */
  3206. n = c_can_read_objects(dev, priv, toread, quota);
  3207. pkts += n;
  3208. 117c: e51b204c ldr r2, [fp, #-76] ; 0x4c
  3209. quota -= n;
  3210. 1180: e0690000 rsb r0, r9, r0
  3211. * for a maximum number of 16 objects.
  3212. */
  3213. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  3214. "Implementation does not support more message objects than 16");
  3215.  
  3216. while (quota > 0) {
  3217. 1184: e3500000 cmp r0, #0
  3218. }
  3219. /* Remove the bits from pend */
  3220. pend &= ~toread;
  3221. /* Read the objects */
  3222. n = c_can_read_objects(dev, priv, toread, quota);
  3223. pkts += n;
  3224. 1188: e0822009 add r2, r2, r9
  3225. quota -= n;
  3226. 118c: e50b0040 str r0, [fp, #-64] ; 0x40
  3227. }
  3228. /* Remove the bits from pend */
  3229. pend &= ~toread;
  3230. /* Read the objects */
  3231. n = c_can_read_objects(dev, priv, toread, quota);
  3232. pkts += n;
  3233. 1190: e50b204c str r2, [fp, #-76] ; 0x4c
  3234. * for a maximum number of 16 objects.
  3235. */
  3236. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  3237. "Implementation does not support more message objects than 16");
  3238.  
  3239. while (quota > 0) {
  3240. 1194: caffff45 bgt eb0 <c_can_poll+0x114>
  3241. 1198: e51ba04c ldr sl, [fp, #-76] ; 0x4c
  3242.  
  3243. /* handle lec errors on the bus */
  3244. work_done += c_can_handle_bus_err(dev, curr & LEC_MASK);
  3245.  
  3246. /* Handle Tx/Rx events. We do this unconditionally */
  3247. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  3248. 119c: e51b2054 ldr r2, [fp, #-84] ; 0x54
  3249. {
  3250. struct c_can_priv *priv = netdev_priv(dev);
  3251. struct net_device_stats *stats = &dev->stats;
  3252. u32 idx, obj, pkts = 0, bytes = 0, pend, clr;
  3253.  
  3254. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3255. 11a0: e1a00008 mov r0, r8
  3256. 11a4: e59435f4 ldr r3, [r4, #1524] ; 0x5f4
  3257. 11a8: e3a01023 mov r1, #35 ; 0x23
  3258.  
  3259. static void c_can_do_tx(struct net_device *dev)
  3260. {
  3261. struct c_can_priv *priv = netdev_priv(dev);
  3262. struct net_device_stats *stats = &dev->stats;
  3263. u32 idx, obj, pkts = 0, bytes = 0, pend, clr;
  3264. 11ac: e3a09000 mov r9, #0
  3265.  
  3266. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3267.  
  3268. while ((idx = ffs(pend))) {
  3269. idx--;
  3270. pend &= ~(1 << idx);
  3271. 11b0: e3a07001 mov r7, #1
  3272.  
  3273. /* handle lec errors on the bus */
  3274. work_done += c_can_handle_bus_err(dev, curr & LEC_MASK);
  3275.  
  3276. /* Handle Tx/Rx events. We do this unconditionally */
  3277. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  3278. 11b4: e082a00a add sl, r2, sl
  3279. 11b8: e50ba03c str sl, [fp, #-60] ; 0x3c
  3280.  
  3281. static void c_can_do_tx(struct net_device *dev)
  3282. {
  3283. struct c_can_priv *priv = netdev_priv(dev);
  3284. struct net_device_stats *stats = &dev->stats;
  3285. u32 idx, obj, pkts = 0, bytes = 0, pend, clr;
  3286. 11bc: e1a0a009 mov sl, r9
  3287.  
  3288. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3289. 11c0: e12fff33 blx r3
  3290. 11c4: e50b0038 str r0, [fp, #-56] ; 0x38
  3291. 11c8: e1a05000 mov r5, r0
  3292. 11cc: ea000007 b 11f0 <c_can_poll+0x454>
  3293.  
  3294. while ((idx = ffs(pend))) {
  3295. idx--;
  3296. pend &= ~(1 << idx);
  3297. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3298. c_can_inval_tx_object(dev, IF_RX, obj);
  3299. 11d0: ebfffc0a bl 200 <c_can_inval_tx_object>
  3300. can_get_echo_skb(dev, idx);
  3301. 11d4: e1a01006 mov r1, r6
  3302. bytes += priv->dlc[idx];
  3303. 11d8: e0846106 add r6, r4, r6, lsl #2
  3304. while ((idx = ffs(pend))) {
  3305. idx--;
  3306. pend &= ~(1 << idx);
  3307. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3308. c_can_inval_tx_object(dev, IF_RX, obj);
  3309. can_get_echo_skb(dev, idx);
  3310. 11dc: e1a00004 mov r0, r4
  3311. 11e0: ebfffffe bl 0 <can_get_echo_skb>
  3312. bytes += priv->dlc[idx];
  3313. 11e4: e596362c ldr r3, [r6, #1580] ; 0x62c
  3314. pkts++;
  3315. 11e8: e28aa001 add sl, sl, #1
  3316. idx--;
  3317. pend &= ~(1 << idx);
  3318. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3319. c_can_inval_tx_object(dev, IF_RX, obj);
  3320. can_get_echo_skb(dev, idx);
  3321. bytes += priv->dlc[idx];
  3322. 11ec: e0899003 add r9, r9, r3
  3323. * ffs() returns zero if the input was zero, otherwise returns the bit
  3324. * position of the first set bit, where the LSB is 1 and MSB is 32.
  3325. */
  3326. static inline int ffs(int x)
  3327. {
  3328. return fls(x & -x);
  3329. 11f0: e2653000 rsb r3, r5, #0
  3330.  
  3331. while ((idx = ffs(pend))) {
  3332. idx--;
  3333. pend &= ~(1 << idx);
  3334. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3335. c_can_inval_tx_object(dev, IF_RX, obj);
  3336. 11f4: e1a00004 mov r0, r4
  3337. 11f8: e0033005 and r3, r3, r5
  3338. 11fc: e3a01000 mov r1, #0
  3339. */
  3340. static inline unsigned int __clz(unsigned int x)
  3341. {
  3342. unsigned int ret;
  3343.  
  3344. asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
  3345. 1200: e16f3f13 clz r3, r3
  3346. struct net_device_stats *stats = &dev->stats;
  3347. u32 idx, obj, pkts = 0, bytes = 0, pend, clr;
  3348.  
  3349. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3350.  
  3351. while ((idx = ffs(pend))) {
  3352. 1204: e3530020 cmp r3, #32
  3353. idx--;
  3354. 1208: e263601f rsb r6, r3, #31
  3355. pend &= ~(1 << idx);
  3356. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3357. c_can_inval_tx_object(dev, IF_RX, obj);
  3358. 120c: e2632030 rsb r2, r3, #48 ; 0x30
  3359.  
  3360. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3361.  
  3362. while ((idx = ffs(pend))) {
  3363. idx--;
  3364. pend &= ~(1 << idx);
  3365. 1210: e1c55617 bic r5, r5, r7, lsl r6
  3366. struct net_device_stats *stats = &dev->stats;
  3367. u32 idx, obj, pkts = 0, bytes = 0, pend, clr;
  3368.  
  3369. clr = pend = priv->read_reg(priv, C_CAN_INTPND2_REG);
  3370.  
  3371. while ((idx = ffs(pend))) {
  3372. 1214: 1affffed bne 11d0 <c_can_poll+0x434>
  3373. bytes += priv->dlc[idx];
  3374. pkts++;
  3375. }
  3376.  
  3377. /* Clear the bits in the tx_active mask */
  3378. atomic_sub(clr, &priv->tx_active);
  3379. 1218: e2882f4a add r2, r8, #296 ; 0x128
  3380.  
  3381. #if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
  3382. #define ARCH_HAS_PREFETCHW
  3383. static inline void prefetchw(const void *ptr)
  3384. {
  3385. __asm__ __volatile__(
  3386. 121c: f592f000 pldw [r2]
  3387. #define ATOMIC_OPS(op, c_op, asm_op) \
  3388. ATOMIC_OP(op, c_op, asm_op) \
  3389. ATOMIC_OP_RETURN(op, c_op, asm_op)
  3390.  
  3391. ATOMIC_OPS(add, +=, add)
  3392. ATOMIC_OPS(sub, -=, sub)
  3393. 1220: e51b3038 ldr r3, [fp, #-56] ; 0x38
  3394. 1224: e1921f9f ldrex r1, [r2]
  3395. 1228: e0411003 sub r1, r1, r3
  3396. 122c: e1820f91 strex r0, r1, [r2]
  3397. 1230: e3300000 teq r0, #0
  3398. 1234: 1afffffa bne 1224 <c_can_poll+0x488>
  3399.  
  3400. if (clr & (1 << (C_CAN_MSG_OBJ_TX_NUM - 1)))
  3401. 1238: e3130902 tst r3, #32768 ; 0x8000
  3402. 123c: 1a00005a bne 13ac <c_can_poll+0x610>
  3403. netif_wake_queue(dev);
  3404.  
  3405. if (pkts) {
  3406. 1240: e35a0000 cmp sl, #0
  3407. 1244: 0a000005 beq 1260 <c_can_poll+0x4c4>
  3408. stats->tx_bytes += bytes;
  3409. 1248: e59410cc ldr r1, [r4, #204] ; 0xcc
  3410. stats->tx_packets += pkts;
  3411. 124c: e59420c4 ldr r2, [r4, #196] ; 0xc4
  3412.  
  3413. if (clr & (1 << (C_CAN_MSG_OBJ_TX_NUM - 1)))
  3414. netif_wake_queue(dev);
  3415.  
  3416. if (pkts) {
  3417. stats->tx_bytes += bytes;
  3418. 1250: e081c009 add ip, r1, r9
  3419. stats->tx_packets += pkts;
  3420. 1254: e082300a add r3, r2, sl
  3421.  
  3422. if (clr & (1 << (C_CAN_MSG_OBJ_TX_NUM - 1)))
  3423. netif_wake_queue(dev);
  3424.  
  3425. if (pkts) {
  3426. stats->tx_bytes += bytes;
  3427. 1258: e584c0cc str ip, [r4, #204] ; 0xcc
  3428. stats->tx_packets += pkts;
  3429. 125c: e58430c4 str r3, [r4, #196] ; 0xc4
  3430. /* Handle Tx/Rx events. We do this unconditionally */
  3431. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  3432. c_can_do_tx(dev);
  3433.  
  3434. end:
  3435. if (work_done < quota) {
  3436. 1260: e51b303c ldr r3, [fp, #-60] ; 0x3c
  3437. 1264: e51b0050 ldr r0, [fp, #-80] ; 0x50
  3438. 1268: e1530000 cmp r3, r0
  3439. 126c: ba00001b blt 12e0 <c_can_poll+0x544>
  3440. if (priv->can.state != CAN_STATE_BUS_OFF)
  3441. c_can_irq_control(priv, true);
  3442. }
  3443.  
  3444. return work_done;
  3445. }
  3446. 1270: e51b003c ldr r0, [fp, #-60] ; 0x3c
  3447. 1274: e24bd028 sub sp, fp, #40 ; 0x28
  3448. 1278: e89daff0 ldm sp, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
  3449. */
  3450. static u32 c_can_adjust_pending(u32 pend)
  3451. {
  3452. u32 weight, lasts;
  3453.  
  3454. if (pend == RECEIVE_OBJECT_BITS)
  3455. 127c: e51b5038 ldr r5, [fp, #-56] ; 0x38
  3456. 1280: e3a03000 mov r3, #0
  3457. 1284: e7df3815 bfi r3, r5, #16, #16
  3458. 1288: eaffff0d b ec4 <c_can_poll+0x128>
  3459. 128c: e51b0038 ldr r0, [fp, #-56] ; 0x38
  3460. 1290: e1e03000 mvn r3, r0
  3461. */
  3462. weight = hweight32(pend);
  3463. lasts = fls(pend);
  3464.  
  3465. /* If the bits are linear, nothing to do */
  3466. if (lasts == weight)
  3467. 1294: e1a05000 mov r5, r0
  3468. 1298: eaffff09 b ec4 <c_can_poll+0x128>
  3469. if ((curr & STATUS_EPASS) && (!(last & STATUS_EPASS))) {
  3470. netdev_dbg(dev, "entered error passive state\n");
  3471. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_PASSIVE);
  3472. }
  3473.  
  3474. if ((curr & STATUS_BOFF) && (!(last & STATUS_BOFF))) {
  3475. 129c: e3170080 tst r7, #128 ; 0x80
  3476. 12a0: 1afffeea bne e50 <c_can_poll+0xb4>
  3477. netdev_dbg(dev, "entered bus off state\n");
  3478. 12a4: e3000000 movw r0, #0
  3479. 12a8: e3002000 movw r2, #0
  3480. 12ac: e3400000 movt r0, #0
  3481. 12b0: e3402000 movt r2, #0
  3482. 12b4: e1a01004 mov r1, r4
  3483. 12b8: ebfffffe bl 0 <netdev_printk>
  3484. work_done += c_can_handle_state_change(dev, C_CAN_BUS_OFF);
  3485. 12bc: e1a00004 mov r0, r4
  3486. 12c0: e3a01001 mov r1, #1
  3487. 12c4: ebfffc1d bl 340 <c_can_handle_state_change>
  3488. 12c8: e080a00a add sl, r0, sl
  3489. /* Handle Tx/Rx events. We do this unconditionally */
  3490. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  3491. c_can_do_tx(dev);
  3492.  
  3493. end:
  3494. if (work_done < quota) {
  3495. 12cc: e51b0050 ldr r0, [fp, #-80] ; 0x50
  3496. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_PASSIVE);
  3497. }
  3498.  
  3499. if ((curr & STATUS_BOFF) && (!(last & STATUS_BOFF))) {
  3500. netdev_dbg(dev, "entered bus off state\n");
  3501. work_done += c_can_handle_state_change(dev, C_CAN_BUS_OFF);
  3502. 12d0: e50ba03c str sl, [fp, #-60] ; 0x3c
  3503. /* Handle Tx/Rx events. We do this unconditionally */
  3504. work_done += c_can_do_rx_poll(dev, (quota - work_done));
  3505. c_can_do_tx(dev);
  3506.  
  3507. end:
  3508. if (work_done < quota) {
  3509. 12d4: e51b303c ldr r3, [fp, #-60] ; 0x3c
  3510. 12d8: e1530000 cmp r3, r0
  3511. 12dc: aaffffe3 bge 1270 <c_can_poll+0x4d4>
  3512. * Mark NAPI processing as complete.
  3513. * Consider using napi_complete_done() instead.
  3514. */
  3515. static inline void napi_complete(struct napi_struct *n)
  3516. {
  3517. return napi_complete_done(n, 0);
  3518. 12e0: e51b0058 ldr r0, [fp, #-88] ; 0x58
  3519. 12e4: e3a01000 mov r1, #0
  3520. 12e8: ebfffffe bl 0 <napi_complete_done>
  3521. napi_complete(napi);
  3522. /* enable all IRQs if we are not in bus off state */
  3523. if (priv->can.state != CAN_STATE_BUS_OFF)
  3524. 12ec: e5943524 ldr r3, [r4, #1316] ; 0x524
  3525. 12f0: e3530003 cmp r3, #3
  3526. 12f4: 0affffdd beq 1270 <c_can_poll+0x4d4>
  3527. c_can_irq_control(priv, true);
  3528. 12f8: e1a00008 mov r0, r8
  3529. 12fc: e3a01001 mov r1, #1
  3530. 1300: ebfffb3e bl 0 <c_can_irq_control>
  3531. }
  3532.  
  3533. return work_done;
  3534. }
  3535. 1304: e51b003c ldr r0, [fp, #-60] ; 0x3c
  3536. 1308: e24bd028 sub sp, fp, #40 ; 0x28
  3537. 130c: e89daff0 ldm sp, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
  3538. /* handle bus recovery events */
  3539. if ((!(curr & STATUS_BOFF)) && (last & STATUS_BOFF)) {
  3540. netdev_dbg(dev, "left bus off state\n");
  3541. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  3542. }
  3543. if ((!(curr & STATUS_EPASS)) && (last & STATUS_EPASS)) {
  3544. 1310: e3170020 tst r7, #32
  3545. 1314: 0afffecf beq e58 <c_can_poll+0xbc>
  3546. netdev_dbg(dev, "left error passive state\n");
  3547. 1318: e3000000 movw r0, #0
  3548. 131c: e3002000 movw r2, #0
  3549. 1320: e3400000 movt r0, #0
  3550. 1324: e3402000 movt r2, #0
  3551. 1328: e1a01004 mov r1, r4
  3552. 132c: ebfffffe bl 0 <netdev_printk>
  3553. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  3554. 1330: e5846524 str r6, [r4, #1316] ; 0x524
  3555. 1334: eafffec7 b e58 <c_can_poll+0xbc>
  3556.  
  3557. if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
  3558. return 0;
  3559.  
  3560. /* common for all type of bus errors */
  3561. priv->can.can_stats.bus_error++;
  3562. 1338: e59424c0 ldr r2, [r4, #1216] ; 0x4c0
  3563. stats->rx_errors++;
  3564.  
  3565. /* propagate the error condition to the CAN stack */
  3566. skb = alloc_can_err_skb(dev, &cf);
  3567. 133c: e1a00004 mov r0, r4
  3568. if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
  3569. return 0;
  3570.  
  3571. /* common for all type of bus errors */
  3572. priv->can.can_stats.bus_error++;
  3573. stats->rx_errors++;
  3574. 1340: e59430d0 ldr r3, [r4, #208] ; 0xd0
  3575.  
  3576. /* propagate the error condition to the CAN stack */
  3577. skb = alloc_can_err_skb(dev, &cf);
  3578. 1344: e24b1030 sub r1, fp, #48 ; 0x30
  3579.  
  3580. if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
  3581. return 0;
  3582.  
  3583. /* common for all type of bus errors */
  3584. priv->can.can_stats.bus_error++;
  3585. 1348: e2822001 add r2, r2, #1
  3586. stats->rx_errors++;
  3587. 134c: e2833001 add r3, r3, #1
  3588.  
  3589. if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING))
  3590. return 0;
  3591.  
  3592. /* common for all type of bus errors */
  3593. priv->can.can_stats.bus_error++;
  3594. 1350: e58424c0 str r2, [r4, #1216] ; 0x4c0
  3595. stats->rx_errors++;
  3596. 1354: e58430d0 str r3, [r4, #208] ; 0xd0
  3597.  
  3598. /* propagate the error condition to the CAN stack */
  3599. skb = alloc_can_err_skb(dev, &cf);
  3600. 1358: ebfffffe bl 0 <alloc_can_err_skb>
  3601. if (unlikely(!skb))
  3602. 135c: e2506000 subs r6, r0, #0
  3603. 1360: 0afffec6 beq e80 <c_can_poll+0xe4>
  3604.  
  3605. /*
  3606. * check for 'last error code' which tells us the
  3607. * type of the last error to occur on the CAN bus
  3608. */
  3609. cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
  3610. 1364: e51b3030 ldr r3, [fp, #-48] ; 0x30
  3611. cf->data[2] |= CAN_ERR_PROT_UNSPEC;
  3612.  
  3613. switch (lec_type) {
  3614. 1368: e2455001 sub r5, r5, #1
  3615.  
  3616. /*
  3617. * check for 'last error code' which tells us the
  3618. * type of the last error to occur on the CAN bus
  3619. */
  3620. cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
  3621. 136c: e5932000 ldr r2, [r3]
  3622. 1370: e3822088 orr r2, r2, #136 ; 0x88
  3623. 1374: e5832000 str r2, [r3]
  3624. cf->data[2] |= CAN_ERR_PROT_UNSPEC;
  3625.  
  3626. switch (lec_type) {
  3627. 1378: e3550005 cmp r5, #5
  3628. 137c: 979ff105 ldrls pc, [pc, r5, lsl #2]
  3629. 1380: ea000081 b 158c <c_can_poll+0x7f0>
  3630. 1384: 0000155c .word 0x0000155c
  3631. 1388: 0000149c .word 0x0000149c
  3632. 138c: 000014cc .word 0x000014cc
  3633. 1390: 000014fc .word 0x000014fc
  3634. 1394: 0000152c .word 0x0000152c
  3635. 1398: 00001440 .word 0x00001440
  3636. struct sk_buff *skb;
  3637. u32 arb, data;
  3638.  
  3639. skb = alloc_can_skb(dev, &frame);
  3640. if (!skb) {
  3641. stats->rx_dropped++;
  3642. 139c: e59430d8 ldr r3, [r4, #216] ; 0xd8
  3643. 13a0: e2833001 add r3, r3, #1
  3644. 13a4: e58430d8 str r3, [r4, #216] ; 0xd8
  3645. 13a8: eaffff20 b 1030 <c_can_poll+0x294>
  3646. * Allow upper layers to call the device hard_start_xmit routine.
  3647. * Used for flow control when transmit resources are available.
  3648. */
  3649. static inline void netif_wake_queue(struct net_device *dev)
  3650. {
  3651. netif_tx_wake_queue(netdev_get_tx_queue(dev, 0));
  3652. 13ac: e5940240 ldr r0, [r4, #576] ; 0x240
  3653. 13b0: ebfffffe bl 0 <netif_tx_wake_queue>
  3654. 13b4: eaffffa1 b 1240 <c_can_poll+0x4a4>
  3655. netdev_dbg(dev, "entered error warning state\n");
  3656. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_WARNING);
  3657. }
  3658.  
  3659. if ((curr & STATUS_EPASS) && (!(last & STATUS_EPASS))) {
  3660. netdev_dbg(dev, "entered error passive state\n");
  3661. 13b8: e3000000 movw r0, #0
  3662. 13bc: e3002000 movw r2, #0
  3663. 13c0: e3400000 movt r0, #0
  3664. 13c4: e3402000 movt r2, #0
  3665. 13c8: e1a01004 mov r1, r4
  3666. 13cc: ebfffffe bl 0 <netdev_printk>
  3667. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_PASSIVE);
  3668. 13d0: e1a00004 mov r0, r4
  3669. 13d4: e3a01003 mov r1, #3
  3670. 13d8: ebfffbd8 bl 340 <c_can_handle_state_change>
  3671. 13dc: e08aa000 add sl, sl, r0
  3672. 13e0: eafffe94 b e38 <c_can_poll+0x9c>
  3673. if (priv->type != BOSCH_D_CAN)
  3674. priv->write_reg(priv, C_CAN_STS_REG, LEC_UNUSED);
  3675.  
  3676. /* handle state changes */
  3677. if ((curr & STATUS_EWARN) && (!(last & STATUS_EWARN))) {
  3678. netdev_dbg(dev, "entered error warning state\n");
  3679. 13e4: e3000000 movw r0, #0
  3680. 13e8: e3002000 movw r2, #0
  3681. 13ec: e3400000 movt r0, #0
  3682. 13f0: e3402000 movt r2, #0
  3683. 13f4: e1a01004 mov r1, r4
  3684. 13f8: ebfffffe bl 0 <netdev_printk>
  3685. work_done += c_can_handle_state_change(dev, C_CAN_ERROR_WARNING);
  3686. 13fc: e1a00004 mov r0, r4
  3687. 1400: e3a01002 mov r1, #2
  3688. 1404: ebfffbcd bl 340 <c_can_handle_state_change>
  3689. 1408: e1a0a000 mov sl, r0
  3690. 140c: eafffe83 b e20 <c_can_poll+0x84>
  3691. goto end;
  3692. }
  3693.  
  3694. /* handle bus recovery events */
  3695. if ((!(curr & STATUS_BOFF)) && (last & STATUS_BOFF)) {
  3696. netdev_dbg(dev, "left bus off state\n");
  3697. 1410: e3000000 movw r0, #0
  3698. 1414: e3002000 movw r2, #0
  3699. 1418: e3400000 movt r0, #0
  3700. 141c: e3402000 movt r2, #0
  3701. 1420: e1a01004 mov r1, r4
  3702. 1424: ebfffffe bl 0 <netdev_printk>
  3703. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  3704. }
  3705. if ((!(curr & STATUS_EPASS)) && (last & STATUS_EPASS)) {
  3706. 1428: e3560000 cmp r6, #0
  3707. }
  3708.  
  3709. /* handle bus recovery events */
  3710. if ((!(curr & STATUS_BOFF)) && (last & STATUS_BOFF)) {
  3711. netdev_dbg(dev, "left bus off state\n");
  3712. priv->can.state = CAN_STATE_ERROR_ACTIVE;
  3713. 142c: e5849524 str r9, [r4, #1316] ; 0x524
  3714. }
  3715. if ((!(curr & STATUS_EPASS)) && (last & STATUS_EPASS)) {
  3716. 1430: 1afffe88 bne e58 <c_can_poll+0xbc>
  3717. 1434: eaffffb5 b 1310 <c_can_poll+0x574>
  3718. * for a maximum number of 16 objects.
  3719. */
  3720. BUILD_BUG_ON_MSG(C_CAN_MSG_OBJ_RX_LAST > 16,
  3721. "Implementation does not support more message objects than 16");
  3722.  
  3723. while (quota > 0) {
  3724. 1438: e3a0a000 mov sl, #0
  3725. 143c: eaffff56 b 119c <c_can_poll+0x400>
  3726. case LEC_BIT0_ERROR:
  3727. netdev_dbg(dev, "bit0 error\n");
  3728. cf->data[2] |= CAN_ERR_PROT_BIT0;
  3729. break;
  3730. case LEC_CRC_ERROR:
  3731. netdev_dbg(dev, "CRC error\n");
  3732. 1440: e3000000 movw r0, #0
  3733. 1444: e3002000 movw r2, #0
  3734. 1448: e3402000 movt r2, #0
  3735. 144c: e1a01004 mov r1, r4
  3736. 1450: e3400000 movt r0, #0
  3737. 1454: ebfffffe bl 0 <netdev_printk>
  3738. cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ |
  3739. 1458: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3740. 145c: e5d2100b ldrb r1, [r2, #11]
  3741. 1460: e1a03002 mov r3, r2
  3742. 1464: e3811018 orr r1, r1, #24
  3743. 1468: e5c2100b strb r1, [r2, #11]
  3744. break;
  3745. default:
  3746. break;
  3747. }
  3748.  
  3749. stats->rx_packets++;
  3750. 146c: e59400c0 ldr r0, [r4, #192] ; 0xc0
  3751. int netif_rx(struct sk_buff *skb);
  3752. int netif_rx_ni(struct sk_buff *skb);
  3753. int netif_receive_skb_sk(struct sock *sk, struct sk_buff *skb);
  3754. static inline int netif_receive_skb(struct sk_buff *skb)
  3755. {
  3756. return netif_receive_skb_sk(skb->sk, skb);
  3757. 1470: e1a01006 mov r1, r6
  3758. stats->rx_bytes += cf->can_dlc;
  3759. 1474: e59420c8 ldr r2, [r4, #200] ; 0xc8
  3760. break;
  3761. default:
  3762. break;
  3763. }
  3764.  
  3765. stats->rx_packets++;
  3766. 1478: e2800001 add r0, r0, #1
  3767. 147c: e58400c0 str r0, [r4, #192] ; 0xc0
  3768. stats->rx_bytes += cf->can_dlc;
  3769. 1480: e5d33004 ldrb r3, [r3, #4]
  3770. 1484: e0823003 add r3, r2, r3
  3771. 1488: e58430c8 str r3, [r4, #200] ; 0xc8
  3772. 148c: e5960010 ldr r0, [r6, #16]
  3773. 1490: ebfffffe bl 0 <netif_receive_skb_sk>
  3774. netif_receive_skb(skb);
  3775. return 1;
  3776. 1494: e3a03001 mov r3, #1
  3777. 1498: eafffe79 b e84 <c_can_poll+0xe8>
  3778. case LEC_STUFF_ERROR:
  3779. netdev_dbg(dev, "stuff error\n");
  3780. cf->data[2] |= CAN_ERR_PROT_STUFF;
  3781. break;
  3782. case LEC_FORM_ERROR:
  3783. netdev_dbg(dev, "form error\n");
  3784. 149c: e3000000 movw r0, #0
  3785. 14a0: e3002000 movw r2, #0
  3786. 14a4: e3402000 movt r2, #0
  3787. 14a8: e1a01004 mov r1, r4
  3788. 14ac: e3400000 movt r0, #0
  3789. 14b0: ebfffffe bl 0 <netdev_printk>
  3790. cf->data[2] |= CAN_ERR_PROT_FORM;
  3791. 14b4: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3792. 14b8: e5d2100a ldrb r1, [r2, #10]
  3793. 14bc: e1a03002 mov r3, r2
  3794. 14c0: e3811002 orr r1, r1, #2
  3795. 14c4: e5c2100a strb r1, [r2, #10]
  3796. 14c8: eaffffe7 b 146c <c_can_poll+0x6d0>
  3797. break;
  3798. case LEC_ACK_ERROR:
  3799. netdev_dbg(dev, "ack error\n");
  3800. 14cc: e3000000 movw r0, #0
  3801. 14d0: e3002000 movw r2, #0
  3802. 14d4: e3402000 movt r2, #0
  3803. 14d8: e1a01004 mov r1, r4
  3804. 14dc: e3400000 movt r0, #0
  3805. 14e0: ebfffffe bl 0 <netdev_printk>
  3806. cf->data[3] |= (CAN_ERR_PROT_LOC_ACK |
  3807. 14e4: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3808. 14e8: e5d2100b ldrb r1, [r2, #11]
  3809. 14ec: e1a03002 mov r3, r2
  3810. 14f0: e381101b orr r1, r1, #27
  3811. 14f4: e5c2100b strb r1, [r2, #11]
  3812. 14f8: eaffffdb b 146c <c_can_poll+0x6d0>
  3813. CAN_ERR_PROT_LOC_ACK_DEL);
  3814. break;
  3815. case LEC_BIT1_ERROR:
  3816. netdev_dbg(dev, "bit1 error\n");
  3817. 14fc: e3000000 movw r0, #0
  3818. 1500: e3002000 movw r2, #0
  3819. 1504: e3402000 movt r2, #0
  3820. 1508: e1a01004 mov r1, r4
  3821. 150c: e3400000 movt r0, #0
  3822. 1510: ebfffffe bl 0 <netdev_printk>
  3823. cf->data[2] |= CAN_ERR_PROT_BIT1;
  3824. 1514: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3825. 1518: e5d2100a ldrb r1, [r2, #10]
  3826. 151c: e1a03002 mov r3, r2
  3827. 1520: e3811010 orr r1, r1, #16
  3828. 1524: e5c2100a strb r1, [r2, #10]
  3829. 1528: eaffffcf b 146c <c_can_poll+0x6d0>
  3830. break;
  3831. case LEC_BIT0_ERROR:
  3832. netdev_dbg(dev, "bit0 error\n");
  3833. 152c: e3000000 movw r0, #0
  3834. 1530: e3002000 movw r2, #0
  3835. 1534: e3402000 movt r2, #0
  3836. 1538: e1a01004 mov r1, r4
  3837. 153c: e3400000 movt r0, #0
  3838. 1540: ebfffffe bl 0 <netdev_printk>
  3839. cf->data[2] |= CAN_ERR_PROT_BIT0;
  3840. 1544: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3841. 1548: e5d2100a ldrb r1, [r2, #10]
  3842. 154c: e1a03002 mov r3, r2
  3843. 1550: e3811008 orr r1, r1, #8
  3844. 1554: e5c2100a strb r1, [r2, #10]
  3845. 1558: eaffffc3 b 146c <c_can_poll+0x6d0>
  3846. cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
  3847. cf->data[2] |= CAN_ERR_PROT_UNSPEC;
  3848.  
  3849. switch (lec_type) {
  3850. case LEC_STUFF_ERROR:
  3851. netdev_dbg(dev, "stuff error\n");
  3852. 155c: e3000000 movw r0, #0
  3853. 1560: e3002000 movw r2, #0
  3854. 1564: e3402000 movt r2, #0
  3855. 1568: e1a01004 mov r1, r4
  3856. 156c: e3400000 movt r0, #0
  3857. 1570: ebfffffe bl 0 <netdev_printk>
  3858. cf->data[2] |= CAN_ERR_PROT_STUFF;
  3859. 1574: e51b2030 ldr r2, [fp, #-48] ; 0x30
  3860. 1578: e5d2100a ldrb r1, [r2, #10]
  3861. 157c: e1a03002 mov r3, r2
  3862. 1580: e3811004 orr r1, r1, #4
  3863. 1584: e5c2100a strb r1, [r2, #10]
  3864. 1588: eaffffb7 b 146c <c_can_poll+0x6d0>
  3865. 158c: e51b3030 ldr r3, [fp, #-48] ; 0x30
  3866. 1590: eaffffb5 b 146c <c_can_poll+0x6d0>
  3867. stats->rx_errors++;
  3868. stats->rx_over_errors++;
  3869.  
  3870. /* create an error msg */
  3871. skb = alloc_can_err_skb(dev, &frame);
  3872. if (unlikely(!skb))
  3873. 1594: e1a03000 mov r3, r0
  3874. return 0;
  3875. 1598: e1a02000 mov r2, r0
  3876. 159c: eafffece b 10dc <c_can_poll+0x340>
  3877.  
  3878. 000015a0 <c_can_start_xmit>:
  3879. c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP);
  3880. }
  3881.  
  3882. static netdev_tx_t c_can_start_xmit(struct sk_buff *skb,
  3883. struct net_device *dev)
  3884. {
  3885. 15a0: e1a0c00d mov ip, sp
  3886. 15a4: e92ddff0 push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
  3887. 15a8: e24cb004 sub fp, ip, #4
  3888. 15ac: e24dd00c sub sp, sp, #12
  3889. 15b0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
  3890. 15b4: ebfffffe bl 0 <__gnu_mcount_nc>
  3891. static inline int can_dropped_invalid_skb(struct net_device *dev,
  3892. struct sk_buff *skb)
  3893. {
  3894. const struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
  3895.  
  3896. if (skb->protocol == htons(ETH_P_CAN)) {
  3897. 15b8: e1d038bc ldrh r3, [r0, #140] ; 0x8c
  3898. 15bc: e1a09000 mov r9, r0
  3899. 15c0: e1a04001 mov r4, r1
  3900. struct can_frame *frame = (struct can_frame *)skb->data;
  3901. 15c4: e59060a0 ldr r6, [r0, #160] ; 0xa0
  3902. 15c8: e3530b03 cmp r3, #3072 ; 0xc00
  3903. 15cc: 0a000009 beq 15f8 <c_can_start_xmit+0x58>
  3904. if (unlikely(skb->len != CAN_MTU ||
  3905. cfd->len > CAN_MAX_DLEN))
  3906. goto inval_skb;
  3907. } else if (skb->protocol == htons(ETH_P_CANFD)) {
  3908. 15d0: e3530c0d cmp r3, #3328 ; 0xd00
  3909. 15d4: 0a000068 beq 177c <c_can_start_xmit+0x1dc>
  3910. goto inval_skb;
  3911.  
  3912. return 0;
  3913.  
  3914. inval_skb:
  3915. kfree_skb(skb);
  3916. 15d8: e1a00009 mov r0, r9
  3917. 15dc: ebfffffe bl 0 <kfree_skb>
  3918. dev->stats.tx_dropped++;
  3919. 15e0: e59430dc ldr r3, [r4, #220] ; 0xdc
  3920. atomic_add((1 << idx), &priv->tx_active);
  3921. /* Start transmission */
  3922. c_can_object_put(dev, IF_TX, obj, IF_COMM_TX);
  3923.  
  3924. return NETDEV_TX_OK;
  3925. }
  3926. 15e4: e3a00000 mov r0, #0
  3927. 15e8: e2833001 add r3, r3, #1
  3928. 15ec: e58430dc str r3, [r4, #220] ; 0xdc
  3929. 15f0: e24bd028 sub sp, fp, #40 ; 0x28
  3930. 15f4: e89daff0 ldm sp, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
  3931. struct sk_buff *skb)
  3932. {
  3933. const struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
  3934.  
  3935. if (skb->protocol == htons(ETH_P_CAN)) {
  3936. if (unlikely(skb->len != CAN_MTU ||
  3937. 15f8: e5903054 ldr r3, [r0, #84] ; 0x54
  3938. 15fc: e3530010 cmp r3, #16
  3939. 1600: 1afffff4 bne 15d8 <c_can_start_xmit+0x38>
  3940. 1604: e5d63004 ldrb r3, [r6, #4]
  3941. 1608: e3530008 cmp r3, #8
  3942. 160c: 8afffff1 bhi 15d8 <c_can_start_xmit+0x38>
  3943. return NETDEV_TX_OK;
  3944. /*
  3945. * This is not a FIFO. C/D_CAN sends out the buffers
  3946. * prioritized. The lowest buffer number wins.
  3947. */
  3948. idx = fls(atomic_read(&priv->tx_active));
  3949. 1610: e594a5e8 ldr sl, [r4, #1512] ; 0x5e8
  3950. 1614: e16faf1a clz sl, sl
  3951. static inline int fls(int x)
  3952. {
  3953. if (__builtin_constant_p(x))
  3954. return constant_fls(x);
  3955.  
  3956. return 32 - __clz(x);
  3957. 1618: e26a7020 rsb r7, sl, #32
  3958. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3959. 161c: e26aa031 rsb sl, sl, #49 ; 0x31
  3960.  
  3961. /* If this is the last buffer, stop the xmit queue */
  3962. if (idx == C_CAN_MSG_OBJ_TX_NUM - 1)
  3963. 1620: e357000f cmp r7, #15
  3964. /*
  3965. * This is not a FIFO. C/D_CAN sends out the buffers
  3966. * prioritized. The lowest buffer number wins.
  3967. */
  3968. idx = fls(atomic_read(&priv->tx_active));
  3969. obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  3970. 1624: e50ba030 str sl, [fp, #-48] ; 0x30
  3971.  
  3972. /* If this is the last buffer, stop the xmit queue */
  3973. if (idx == C_CAN_MSG_OBJ_TX_NUM - 1)
  3974. 1628: 0a00005a beq 1798 <c_can_start_xmit+0x1f8>
  3975. static void c_can_setup_tx_object(struct net_device *dev, int iface,
  3976. struct can_frame *frame, int idx)
  3977. {
  3978. struct c_can_priv *priv = netdev_priv(dev);
  3979. u16 ctrl = IF_MCONT_TX | frame->can_dlc;
  3980. bool rtr = frame->can_id & CAN_RTR_FLAG;
  3981. 162c: e5963000 ldr r3, [r6]
  3982. 1630: e287001f add r0, r7, #31
  3983. }
  3984.  
  3985. static void c_can_setup_tx_object(struct net_device *dev, int iface,
  3986. struct can_frame *frame, int idx)
  3987. {
  3988. struct c_can_priv *priv = netdev_priv(dev);
  3989. 1634: e2848d13 add r8, r4, #1216 ; 0x4c0
  3990. 1638: e207101f and r1, r7, #31
  3991.  
  3992. /*
  3993. * If we change the DIR bit, we need to invalidate the buffer
  3994. * first, i.e. clear the MSGVAL flag in the arbiter.
  3995. */
  3996. if (rtr != (bool)test_bit(idx, &priv->tx_dir)) {
  3997. 163c: e288cf4b add ip, r8, #300 ; 0x12c
  3998.  
  3999. static void c_can_setup_tx_object(struct net_device *dev, int iface,
  4000. struct can_frame *frame, int idx)
  4001. {
  4002. struct c_can_priv *priv = netdev_priv(dev);
  4003. u16 ctrl = IF_MCONT_TX | frame->can_dlc;
  4004. 1640: e5d65004 ldrb r5, [r6, #4]
  4005. bool rtr = frame->can_id & CAN_RTR_FLAG;
  4006. u32 arb = IF_ARB_MSGVAL;
  4007. int i;
  4008.  
  4009. if (frame->can_id & CAN_EFF_FLAG) {
  4010. 1644: e3530000 cmp r3, #0
  4011. static void c_can_setup_tx_object(struct net_device *dev, int iface,
  4012. struct can_frame *frame, int idx)
  4013. {
  4014. struct c_can_priv *priv = netdev_priv(dev);
  4015. u16 ctrl = IF_MCONT_TX | frame->can_dlc;
  4016. bool rtr = frame->can_id & CAN_RTR_FLAG;
  4017. 1648: e7e02f53 ubfx r2, r3, #30, #1
  4018.  
  4019. if (frame->can_id & CAN_EFF_FLAG) {
  4020. arb |= frame->can_id & CAN_EFF_MASK;
  4021. arb |= IF_ARB_MSGXTD;
  4022. } else {
  4023. arb |= (frame->can_id & CAN_SFF_MASK) << 18;
  4024. 164c: a7ea3053 ubfxge r3, r3, #0, #11
  4025. bool rtr = frame->can_id & CAN_RTR_FLAG;
  4026. u32 arb = IF_ARB_MSGVAL;
  4027. int i;
  4028.  
  4029. if (frame->can_id & CAN_EFF_FLAG) {
  4030. arb |= frame->can_id & CAN_EFF_MASK;
  4031. 1650: b3c3320e biclt r3, r3, #-536870912 ; 0xe0000000
  4032. arb |= IF_ARB_MSGXTD;
  4033. } else {
  4034. arb |= (frame->can_id & CAN_SFF_MASK) << 18;
  4035. 1654: a1a03903 lslge r3, r3, #18
  4036. u32 arb = IF_ARB_MSGVAL;
  4037. int i;
  4038.  
  4039. if (frame->can_id & CAN_EFF_FLAG) {
  4040. arb |= frame->can_id & CAN_EFF_MASK;
  4041. arb |= IF_ARB_MSGXTD;
  4042. 1658: b383a103 orrlt sl, r3, #-1073741824 ; 0xc0000000
  4043.  
  4044. static void c_can_setup_tx_object(struct net_device *dev, int iface,
  4045. struct can_frame *frame, int idx)
  4046. {
  4047. struct c_can_priv *priv = netdev_priv(dev);
  4048. u16 ctrl = IF_MCONT_TX | frame->can_dlc;
  4049. 165c: e3855d22 orr r5, r5, #2176 ; 0x880
  4050.  
  4051. if (frame->can_id & CAN_EFF_FLAG) {
  4052. arb |= frame->can_id & CAN_EFF_MASK;
  4053. arb |= IF_ARB_MSGXTD;
  4054. } else {
  4055. arb |= (frame->can_id & CAN_SFF_MASK) << 18;
  4056. 1660: a383a102 orrge sl, r3, #-2147483648 ; 0x80000000
  4057. }
  4058.  
  4059. if (!rtr)
  4060. 1664: e3520000 cmp r2, #0
  4061. arb |= IF_ARB_TRANSMIT;
  4062. 1668: 038aa202 orreq sl, sl, #536870912 ; 0x20000000
  4063. 166c: e3570000 cmp r7, #0
  4064. 1670: a1a00007 movge r0, r7
  4065. 1674: e1a002c0 asr r0, r0, #5
  4066. 1678: e79c0100 ldr r0, [ip, r0, lsl #2]
  4067. 167c: e1a01130 lsr r1, r0, r1
  4068. 1680: e2011001 and r1, r1, #1
  4069.  
  4070. /*
  4071. * If we change the DIR bit, we need to invalidate the buffer
  4072. * first, i.e. clear the MSGVAL flag in the arbiter.
  4073. */
  4074. if (rtr != (bool)test_bit(idx, &priv->tx_dir)) {
  4075. 1684: e1520001 cmp r2, r1
  4076. 1688: 0a000008 beq 16b0 <c_can_start_xmit+0x110>
  4077. u32 obj = idx + C_CAN_MSG_OBJ_TX_FIRST;
  4078.  
  4079. c_can_inval_msg_object(dev, iface, obj);
  4080. 168c: e1a00004 mov r0, r4
  4081. 1690: e3a01001 mov r1, #1
  4082. 1694: e2872011 add r2, r7, #17
  4083. 1698: e50bc034 str ip, [fp, #-52] ; 0x34
  4084. 169c: ebfffaec bl 254 <c_can_inval_msg_object>
  4085. change_bit(idx, &priv->tx_dir);
  4086. 16a0: e51bc034 ldr ip, [fp, #-52] ; 0x34
  4087. 16a4: e1a00007 mov r0, r7
  4088. 16a8: e1a0100c mov r1, ip
  4089. 16ac: ebfffffe bl 0 <_change_bit>
  4090. }
  4091.  
  4092. priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
  4093. 16b0: e1a0200a mov r2, sl
  4094. 16b4: e5943600 ldr r3, [r4, #1536] ; 0x600
  4095. 16b8: e1a00008 mov r0, r8
  4096. 16bc: e3a01017 mov r1, #23
  4097. 16c0: e12fff33 blx r3
  4098.  
  4099. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  4100. 16c4: e1a02005 mov r2, r5
  4101. 16c8: e59435f8 ldr r3, [r4, #1528] ; 0x5f8
  4102. 16cc: e1a00008 mov r0, r8
  4103. 16d0: e3a01019 mov r1, #25
  4104. 16d4: e12fff33 blx r3
  4105.  
  4106. for (i = 0; i < frame->can_dlc; i += 2) {
  4107. 16d8: e5d62004 ldrb r2, [r6, #4]
  4108. 16dc: e3520000 cmp r2, #0
  4109. 16e0: 0a00000e beq 1720 <c_can_start_xmit+0x180>
  4110. 16e4: e1a0a006 mov sl, r6
  4111. 16e8: e3a05000 mov r5, #0
  4112. priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2,
  4113. frame->data[i] | (frame->data[i + 1] << 8));
  4114. 16ec: e5dae009 ldrb lr, [sl, #9]
  4115. priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
  4116.  
  4117. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  4118.  
  4119. for (i = 0; i < frame->can_dlc; i += 2) {
  4120. priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2,
  4121. 16f0: e1a010c5 asr r1, r5, #1
  4122. 16f4: e5da2008 ldrb r2, [sl, #8]
  4123. 16f8: e1a00008 mov r0, r8
  4124. 16fc: e281101a add r1, r1, #26
  4125. 1700: e594c5f8 ldr ip, [r4, #1528] ; 0x5f8
  4126.  
  4127. priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
  4128.  
  4129. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  4130.  
  4131. for (i = 0; i < frame->can_dlc; i += 2) {
  4132. 1704: e2855002 add r5, r5, #2
  4133. 1708: e28aa002 add sl, sl, #2
  4134. priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2,
  4135. 170c: e182240e orr r2, r2, lr, lsl #8
  4136. 1710: e12fff3c blx ip
  4137.  
  4138. priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
  4139.  
  4140. priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
  4141.  
  4142. for (i = 0; i < frame->can_dlc; i += 2) {
  4143. 1714: e5d62004 ldrb r2, [r6, #4]
  4144. 1718: e1550002 cmp r5, r2
  4145. 171c: bafffff2 blt 16ec <c_can_start_xmit+0x14c>
  4146. * Store the message in the interface so we can call
  4147. * can_put_echo_skb(). We must do this before we enable
  4148. * transmit as we might race against do_tx().
  4149. */
  4150. c_can_setup_tx_object(dev, IF_TX, frame, idx);
  4151. priv->dlc[idx] = frame->can_dlc;
  4152. 1720: e0843107 add r3, r4, r7, lsl #2
  4153. can_put_echo_skb(skb, dev, idx);
  4154. 1724: e1a00009 mov r0, r9
  4155. 1728: e1a01004 mov r1, r4
  4156. * Store the message in the interface so we can call
  4157. * can_put_echo_skb(). We must do this before we enable
  4158. * transmit as we might race against do_tx().
  4159. */
  4160. c_can_setup_tx_object(dev, IF_TX, frame, idx);
  4161. priv->dlc[idx] = frame->can_dlc;
  4162. 172c: e583262c str r2, [r3, #1580] ; 0x62c
  4163. can_put_echo_skb(skb, dev, idx);
  4164. 1730: e1a02007 mov r2, r7
  4165. 1734: ebfffffe bl 0 <can_put_echo_skb>
  4166.  
  4167. /* Update the active bits */
  4168. atomic_add((1 << idx), &priv->tx_active);
  4169. 1738: e2888f4a add r8, r8, #296 ; 0x128
  4170. 173c: f598f000 pldw [r8]
  4171. 1740: e3a03001 mov r3, #1
  4172. 1744: e1a07713 lsl r7, r3, r7
  4173.  
  4174. #define ATOMIC_OPS(op, c_op, asm_op) \
  4175. ATOMIC_OP(op, c_op, asm_op) \
  4176. ATOMIC_OP_RETURN(op, c_op, asm_op)
  4177.  
  4178. ATOMIC_OPS(add, +=, add)
  4179. 1748: e1983f9f ldrex r3, [r8]
  4180. 174c: e0833007 add r3, r3, r7
  4181. 1750: e1882f93 strex r2, r3, [r8]
  4182. 1754: e3320000 teq r2, #0
  4183. 1758: 1afffffa bne 1748 <c_can_start_xmit+0x1a8>
  4184. }
  4185.  
  4186. static inline void c_can_object_put(struct net_device *dev, int iface,
  4187. u32 obj, u32 cmd)
  4188. {
  4189. c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj);
  4190. 175c: e3a01001 mov r1, #1
  4191. 1760: e1a00004 mov r0, r4
  4192. 1764: e51b3030 ldr r3, [fp, #-48] ; 0x30
  4193. 1768: e3a020b7 mov r2, #183 ; 0xb7
  4194. 176c: ebfffa80 bl 174 <c_can_obj_update>
  4195. atomic_add((1 << idx), &priv->tx_active);
  4196. /* Start transmission */
  4197. c_can_object_put(dev, IF_TX, obj, IF_COMM_TX);
  4198.  
  4199. return NETDEV_TX_OK;
  4200. }
  4201. 1770: e3a00000 mov r0, #0
  4202. 1774: e24bd028 sub sp, fp, #40 ; 0x28
  4203. 1778: e89daff0 ldm sp, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
  4204. cfd->len > CAN_MAX_DLEN))
  4205. goto inval_skb;
  4206. } else if (skb->protocol == htons(ETH_P_CANFD)) {
  4207. if (unlikely(skb->len != CANFD_MTU ||
  4208. 177c: e5903054 ldr r3, [r0, #84] ; 0x54
  4209. 1780: e3530048 cmp r3, #72 ; 0x48
  4210. 1784: 1affff93 bne 15d8 <c_can_start_xmit+0x38>
  4211. 1788: e5d63004 ldrb r3, [r6, #4]
  4212. 178c: e3530040 cmp r3, #64 ; 0x40
  4213. 1790: 9affff9e bls 1610 <c_can_start_xmit+0x70>
  4214. 1794: eaffff8f b 15d8 <c_can_start_xmit+0x38>
  4215. }
  4216. }
  4217.  
  4218. static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
  4219. {
  4220. set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
  4221. 1798: e5941240 ldr r1, [r4, #576] ; 0x240
  4222. 179c: e3a00000 mov r0, #0
  4223. 17a0: e2811050 add r1, r1, #80 ; 0x50
  4224. 17a4: ebfffffe bl 0 <_set_bit>
  4225. 17a8: eaffff9f b 162c <c_can_start_xmit+0x8c>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement