oa_tc6.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * OPEN Alliance 10BASE‑T1x MAC‑PHY Serial Interface framework
  4. *
  5. * Author: Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/iopoll.h>
  9. #include <linux/mdio.h>
  10. #include <linux/phy.h>
  11. #include <linux/oa_tc6.h>
  12. /* OPEN Alliance TC6 registers */
  13. /* Standard Capabilities Register */
  14. #define OA_TC6_REG_STDCAP 0x0002
  15. #define STDCAP_DIRECT_PHY_REG_ACCESS BIT(8)
  16. /* Reset Control and Status Register */
  17. #define OA_TC6_REG_RESET 0x0003
  18. #define RESET_SWRESET BIT(0) /* Software Reset */
  19. /* Configuration Register #0 */
  20. #define OA_TC6_REG_CONFIG0 0x0004
  21. #define CONFIG0_SYNC BIT(15)
  22. #define CONFIG0_ZARFE_ENABLE BIT(12)
  23. /* Status Register #0 */
  24. #define OA_TC6_REG_STATUS0 0x0008
  25. #define STATUS0_RESETC BIT(6) /* Reset Complete */
  26. #define STATUS0_HEADER_ERROR BIT(5)
  27. #define STATUS0_LOSS_OF_FRAME_ERROR BIT(4)
  28. #define STATUS0_RX_BUFFER_OVERFLOW_ERROR BIT(3)
  29. #define STATUS0_TX_PROTOCOL_ERROR BIT(0)
  30. /* Buffer Status Register */
  31. #define OA_TC6_REG_BUFFER_STATUS 0x000B
  32. #define BUFFER_STATUS_TX_CREDITS_AVAILABLE GENMASK(15, 8)
  33. #define BUFFER_STATUS_RX_CHUNKS_AVAILABLE GENMASK(7, 0)
  34. /* Interrupt Mask Register #0 */
  35. #define OA_TC6_REG_INT_MASK0 0x000C
  36. #define INT_MASK0_HEADER_ERR_MASK BIT(5)
  37. #define INT_MASK0_LOSS_OF_FRAME_ERR_MASK BIT(4)
  38. #define INT_MASK0_RX_BUFFER_OVERFLOW_ERR_MASK BIT(3)
  39. #define INT_MASK0_TX_PROTOCOL_ERR_MASK BIT(0)
  40. /* PHY Clause 22 registers base address and mask */
  41. #define OA_TC6_PHY_STD_REG_ADDR_BASE 0xFF00
  42. #define OA_TC6_PHY_STD_REG_ADDR_MASK 0x1F
  43. /* Control command header */
  44. #define OA_TC6_CTRL_HEADER_DATA_NOT_CTRL BIT(31)
  45. #define OA_TC6_CTRL_HEADER_WRITE_NOT_READ BIT(29)
  46. #define OA_TC6_CTRL_HEADER_MEM_MAP_SELECTOR GENMASK(27, 24)
  47. #define OA_TC6_CTRL_HEADER_ADDR GENMASK(23, 8)
  48. #define OA_TC6_CTRL_HEADER_LENGTH GENMASK(7, 1)
  49. #define OA_TC6_CTRL_HEADER_PARITY BIT(0)
  50. /* Data header */
  51. #define OA_TC6_DATA_HEADER_DATA_NOT_CTRL BIT(31)
  52. #define OA_TC6_DATA_HEADER_DATA_VALID BIT(21)
  53. #define OA_TC6_DATA_HEADER_START_VALID BIT(20)
  54. #define OA_TC6_DATA_HEADER_START_WORD_OFFSET GENMASK(19, 16)
  55. #define OA_TC6_DATA_HEADER_END_VALID BIT(14)
  56. #define OA_TC6_DATA_HEADER_END_BYTE_OFFSET GENMASK(13, 8)
  57. #define OA_TC6_DATA_HEADER_PARITY BIT(0)
  58. /* Data footer */
  59. #define OA_TC6_DATA_FOOTER_EXTENDED_STS BIT(31)
  60. #define OA_TC6_DATA_FOOTER_RXD_HEADER_BAD BIT(30)
  61. #define OA_TC6_DATA_FOOTER_CONFIG_SYNC BIT(29)
  62. #define OA_TC6_DATA_FOOTER_RX_CHUNKS GENMASK(28, 24)
  63. #define OA_TC6_DATA_FOOTER_DATA_VALID BIT(21)
  64. #define OA_TC6_DATA_FOOTER_START_VALID BIT(20)
  65. #define OA_TC6_DATA_FOOTER_START_WORD_OFFSET GENMASK(19, 16)
  66. #define OA_TC6_DATA_FOOTER_END_VALID BIT(14)
  67. #define OA_TC6_DATA_FOOTER_END_BYTE_OFFSET GENMASK(13, 8)
  68. #define OA_TC6_DATA_FOOTER_TX_CREDITS GENMASK(5, 1)
  69. /* PHY – Clause 45 registers memory map selector (MMS) as per table 6 in the
  70. * OPEN Alliance specification.
  71. */
  72. #define OA_TC6_PHY_C45_PCS_MMS2 2 /* MMD 3 */
  73. #define OA_TC6_PHY_C45_PMA_PMD_MMS3 3 /* MMD 1 */
  74. #define OA_TC6_PHY_C45_VS_PLCA_MMS4 4 /* MMD 31 */
  75. #define OA_TC6_PHY_C45_AUTO_NEG_MMS5 5 /* MMD 7 */
  76. #define OA_TC6_PHY_C45_POWER_UNIT_MMS6 6 /* MMD 13 */
  77. #define OA_TC6_CTRL_HEADER_SIZE 4
  78. #define OA_TC6_CTRL_REG_VALUE_SIZE 4
  79. #define OA_TC6_CTRL_IGNORED_SIZE 4
  80. #define OA_TC6_CTRL_MAX_REGISTERS 128
  81. #define OA_TC6_CTRL_SPI_BUF_SIZE (OA_TC6_CTRL_HEADER_SIZE +\
  82. (OA_TC6_CTRL_MAX_REGISTERS *\
  83. OA_TC6_CTRL_REG_VALUE_SIZE) +\
  84. OA_TC6_CTRL_IGNORED_SIZE)
  85. #define OA_TC6_CHUNK_PAYLOAD_SIZE 64
  86. #define OA_TC6_DATA_HEADER_SIZE 4
  87. #define OA_TC6_CHUNK_SIZE (OA_TC6_DATA_HEADER_SIZE +\
  88. OA_TC6_CHUNK_PAYLOAD_SIZE)
  89. #define OA_TC6_MAX_TX_CHUNKS 48
  90. #define OA_TC6_SPI_DATA_BUF_SIZE (OA_TC6_MAX_TX_CHUNKS *\
  91. OA_TC6_CHUNK_SIZE)
  92. #define STATUS0_RESETC_POLL_DELAY 1000
  93. #define STATUS0_RESETC_POLL_TIMEOUT 1000000
  94. /* Internal structure for MAC-PHY drivers */
  95. struct oa_tc6 {
  96. struct device *dev;
  97. struct net_device *netdev;
  98. struct phy_device *phydev;
  99. struct mii_bus *mdiobus;
  100. struct spi_device *spi;
  101. struct mutex spi_ctrl_lock; /* Protects spi control transfer */
  102. spinlock_t tx_skb_lock; /* Protects tx skb handling */
  103. void *spi_ctrl_tx_buf;
  104. void *spi_ctrl_rx_buf;
  105. void *spi_data_tx_buf;
  106. void *spi_data_rx_buf;
  107. struct sk_buff *ongoing_tx_skb;
  108. struct sk_buff *waiting_tx_skb;
  109. struct sk_buff *rx_skb;
  110. struct task_struct *spi_thread;
  111. wait_queue_head_t spi_wq;
  112. u16 tx_skb_offset;
  113. u16 spi_data_tx_buf_offset;
  114. u16 tx_credits;
  115. u8 rx_chunks_available;
  116. bool rx_buf_overflow;
  117. bool int_flag;
  118. };
  119. enum oa_tc6_header_type {
  120. OA_TC6_CTRL_HEADER,
  121. OA_TC6_DATA_HEADER,
  122. };
  123. enum oa_tc6_register_op {
  124. OA_TC6_CTRL_REG_READ = 0,
  125. OA_TC6_CTRL_REG_WRITE = 1,
  126. };
  127. enum oa_tc6_data_valid_info {
  128. OA_TC6_DATA_INVALID,
  129. OA_TC6_DATA_VALID,
  130. };
  131. enum oa_tc6_data_start_valid_info {
  132. OA_TC6_DATA_START_INVALID,
  133. OA_TC6_DATA_START_VALID,
  134. };
  135. enum oa_tc6_data_end_valid_info {
  136. OA_TC6_DATA_END_INVALID,
  137. OA_TC6_DATA_END_VALID,
  138. };
  139. static int oa_tc6_spi_transfer(struct oa_tc6 *tc6,
  140. enum oa_tc6_header_type header_type, u16 length)
  141. {
  142. struct spi_transfer xfer = { 0 };
  143. struct spi_message msg;
  144. if (header_type == OA_TC6_DATA_HEADER) {
  145. xfer.tx_buf = tc6->spi_data_tx_buf;
  146. xfer.rx_buf = tc6->spi_data_rx_buf;
  147. } else {
  148. xfer.tx_buf = tc6->spi_ctrl_tx_buf;
  149. xfer.rx_buf = tc6->spi_ctrl_rx_buf;
  150. }
  151. xfer.len = length;
  152. spi_message_init(&msg);
  153. spi_message_add_tail(&xfer, &msg);
  154. return spi_sync(tc6->spi, &msg);
  155. }
  156. static int oa_tc6_get_parity(u32 p)
  157. {
  158. /* Public domain code snippet, lifted from
  159. * http://www-graphics.stanford.edu/~seander/bithacks.html
  160. */
  161. p ^= p >> 1;
  162. p ^= p >> 2;
  163. p = (p & 0x11111111U) * 0x11111111U;
  164. /* Odd parity is used here */
  165. return !((p >> 28) & 1);
  166. }
  167. static __be32 oa_tc6_prepare_ctrl_header(u32 addr, u8 length,
  168. enum oa_tc6_register_op reg_op)
  169. {
  170. u32 header;
  171. header = FIELD_PREP(OA_TC6_CTRL_HEADER_DATA_NOT_CTRL,
  172. OA_TC6_CTRL_HEADER) |
  173. FIELD_PREP(OA_TC6_CTRL_HEADER_WRITE_NOT_READ, reg_op) |
  174. FIELD_PREP(OA_TC6_CTRL_HEADER_MEM_MAP_SELECTOR, addr >> 16) |
  175. FIELD_PREP(OA_TC6_CTRL_HEADER_ADDR, addr) |
  176. FIELD_PREP(OA_TC6_CTRL_HEADER_LENGTH, length - 1);
  177. header |= FIELD_PREP(OA_TC6_CTRL_HEADER_PARITY,
  178. oa_tc6_get_parity(header));
  179. return cpu_to_be32(header);
  180. }
  181. static void oa_tc6_update_ctrl_write_data(struct oa_tc6 *tc6, u32 value[],
  182. u8 length)
  183. {
  184. __be32 *tx_buf = tc6->spi_ctrl_tx_buf + OA_TC6_CTRL_HEADER_SIZE;
  185. for (int i = 0; i < length; i++)
  186. *tx_buf++ = cpu_to_be32(value[i]);
  187. }
  188. static u16 oa_tc6_calculate_ctrl_buf_size(u8 length)
  189. {
  190. /* Control command consists 4 bytes header + 4 bytes register value for
  191. * each register + 4 bytes ignored value.
  192. */
  193. return OA_TC6_CTRL_HEADER_SIZE + OA_TC6_CTRL_REG_VALUE_SIZE * length +
  194. OA_TC6_CTRL_IGNORED_SIZE;
  195. }
  196. static void oa_tc6_prepare_ctrl_spi_buf(struct oa_tc6 *tc6, u32 address,
  197. u32 value[], u8 length,
  198. enum oa_tc6_register_op reg_op)
  199. {
  200. __be32 *tx_buf = tc6->spi_ctrl_tx_buf;
  201. *tx_buf = oa_tc6_prepare_ctrl_header(address, length, reg_op);
  202. if (reg_op == OA_TC6_CTRL_REG_WRITE)
  203. oa_tc6_update_ctrl_write_data(tc6, value, length);
  204. }
  205. static int oa_tc6_check_ctrl_write_reply(struct oa_tc6 *tc6, u8 size)
  206. {
  207. u8 *tx_buf = tc6->spi_ctrl_tx_buf;
  208. u8 *rx_buf = tc6->spi_ctrl_rx_buf;
  209. rx_buf += OA_TC6_CTRL_IGNORED_SIZE;
  210. /* The echoed control write must match with the one that was
  211. * transmitted.
  212. */
  213. if (memcmp(tx_buf, rx_buf, size - OA_TC6_CTRL_IGNORED_SIZE))
  214. return -EPROTO;
  215. return 0;
  216. }
  217. static int oa_tc6_check_ctrl_read_reply(struct oa_tc6 *tc6, u8 size)
  218. {
  219. u32 *rx_buf = tc6->spi_ctrl_rx_buf + OA_TC6_CTRL_IGNORED_SIZE;
  220. u32 *tx_buf = tc6->spi_ctrl_tx_buf;
  221. /* The echoed control read header must match with the one that was
  222. * transmitted.
  223. */
  224. if (*tx_buf != *rx_buf)
  225. return -EPROTO;
  226. return 0;
  227. }
  228. static void oa_tc6_copy_ctrl_read_data(struct oa_tc6 *tc6, u32 value[],
  229. u8 length)
  230. {
  231. __be32 *rx_buf = tc6->spi_ctrl_rx_buf + OA_TC6_CTRL_IGNORED_SIZE +
  232. OA_TC6_CTRL_HEADER_SIZE;
  233. for (int i = 0; i < length; i++)
  234. value[i] = be32_to_cpu(*rx_buf++);
  235. }
  236. static int oa_tc6_perform_ctrl(struct oa_tc6 *tc6, u32 address, u32 value[],
  237. u8 length, enum oa_tc6_register_op reg_op)
  238. {
  239. u16 size;
  240. int ret;
  241. /* Prepare control command and copy to SPI control buffer */
  242. oa_tc6_prepare_ctrl_spi_buf(tc6, address, value, length, reg_op);
  243. size = oa_tc6_calculate_ctrl_buf_size(length);
  244. /* Perform SPI transfer */
  245. ret = oa_tc6_spi_transfer(tc6, OA_TC6_CTRL_HEADER, size);
  246. if (ret) {
  247. dev_err(&tc6->spi->dev, "SPI transfer failed for control: %d\n",
  248. ret);
  249. return ret;
  250. }
  251. /* Check echoed/received control write command reply for errors */
  252. if (reg_op == OA_TC6_CTRL_REG_WRITE)
  253. return oa_tc6_check_ctrl_write_reply(tc6, size);
  254. /* Check echoed/received control read command reply for errors */
  255. ret = oa_tc6_check_ctrl_read_reply(tc6, size);
  256. if (ret)
  257. return ret;
  258. oa_tc6_copy_ctrl_read_data(tc6, value, length);
  259. return 0;
  260. }
  261. /**
  262. * oa_tc6_read_registers - function for reading multiple consecutive registers.
  263. * @tc6: oa_tc6 struct.
  264. * @address: address of the first register to be read in the MAC-PHY.
  265. * @value: values to be read from the starting register address @address.
  266. * @length: number of consecutive registers to be read from @address.
  267. *
  268. * Maximum of 128 consecutive registers can be read starting at @address.
  269. *
  270. * Return: 0 on success otherwise failed.
  271. */
  272. int oa_tc6_read_registers(struct oa_tc6 *tc6, u32 address, u32 value[],
  273. u8 length)
  274. {
  275. int ret;
  276. if (!length || length > OA_TC6_CTRL_MAX_REGISTERS) {
  277. dev_err(&tc6->spi->dev, "Invalid register length parameter\n");
  278. return -EINVAL;
  279. }
  280. mutex_lock(&tc6->spi_ctrl_lock);
  281. ret = oa_tc6_perform_ctrl(tc6, address, value, length,
  282. OA_TC6_CTRL_REG_READ);
  283. mutex_unlock(&tc6->spi_ctrl_lock);
  284. return ret;
  285. }
  286. EXPORT_SYMBOL_GPL(oa_tc6_read_registers);
  287. /**
  288. * oa_tc6_read_register - function for reading a MAC-PHY register.
  289. * @tc6: oa_tc6 struct.
  290. * @address: register address of the MAC-PHY to be read.
  291. * @value: value read from the @address register address of the MAC-PHY.
  292. *
  293. * Return: 0 on success otherwise failed.
  294. */
  295. int oa_tc6_read_register(struct oa_tc6 *tc6, u32 address, u32 *value)
  296. {
  297. return oa_tc6_read_registers(tc6, address, value, 1);
  298. }
  299. EXPORT_SYMBOL_GPL(oa_tc6_read_register);
  300. /**
  301. * oa_tc6_write_registers - function for writing multiple consecutive registers.
  302. * @tc6: oa_tc6 struct.
  303. * @address: address of the first register to be written in the MAC-PHY.
  304. * @value: values to be written from the starting register address @address.
  305. * @length: number of consecutive registers to be written from @address.
  306. *
  307. * Maximum of 128 consecutive registers can be written starting at @address.
  308. *
  309. * Return: 0 on success otherwise failed.
  310. */
  311. int oa_tc6_write_registers(struct oa_tc6 *tc6, u32 address, u32 value[],
  312. u8 length)
  313. {
  314. int ret;
  315. if (!length || length > OA_TC6_CTRL_MAX_REGISTERS) {
  316. dev_err(&tc6->spi->dev, "Invalid register length parameter\n");
  317. return -EINVAL;
  318. }
  319. mutex_lock(&tc6->spi_ctrl_lock);
  320. ret = oa_tc6_perform_ctrl(tc6, address, value, length,
  321. OA_TC6_CTRL_REG_WRITE);
  322. mutex_unlock(&tc6->spi_ctrl_lock);
  323. return ret;
  324. }
  325. EXPORT_SYMBOL_GPL(oa_tc6_write_registers);
  326. /**
  327. * oa_tc6_write_register - function for writing a MAC-PHY register.
  328. * @tc6: oa_tc6 struct.
  329. * @address: register address of the MAC-PHY to be written.
  330. * @value: value to be written in the @address register address of the MAC-PHY.
  331. *
  332. * Return: 0 on success otherwise failed.
  333. */
  334. int oa_tc6_write_register(struct oa_tc6 *tc6, u32 address, u32 value)
  335. {
  336. return oa_tc6_write_registers(tc6, address, &value, 1);
  337. }
  338. EXPORT_SYMBOL_GPL(oa_tc6_write_register);
  339. static int oa_tc6_check_phy_reg_direct_access_capability(struct oa_tc6 *tc6)
  340. {
  341. u32 regval;
  342. int ret;
  343. ret = oa_tc6_read_register(tc6, OA_TC6_REG_STDCAP, &regval);
  344. if (ret)
  345. return ret;
  346. if (!(regval & STDCAP_DIRECT_PHY_REG_ACCESS))
  347. return -ENODEV;
  348. return 0;
  349. }
  350. static void oa_tc6_handle_link_change(struct net_device *netdev)
  351. {
  352. phy_print_status(netdev->phydev);
  353. }
  354. static int oa_tc6_mdiobus_read(struct mii_bus *bus, int addr, int regnum)
  355. {
  356. struct oa_tc6 *tc6 = bus->priv;
  357. u32 regval;
  358. bool ret;
  359. ret = oa_tc6_read_register(tc6, OA_TC6_PHY_STD_REG_ADDR_BASE |
  360. (regnum & OA_TC6_PHY_STD_REG_ADDR_MASK),
  361. &regval);
  362. if (ret)
  363. return ret;
  364. return regval;
  365. }
  366. static int oa_tc6_mdiobus_write(struct mii_bus *bus, int addr, int regnum,
  367. u16 val)
  368. {
  369. struct oa_tc6 *tc6 = bus->priv;
  370. return oa_tc6_write_register(tc6, OA_TC6_PHY_STD_REG_ADDR_BASE |
  371. (regnum & OA_TC6_PHY_STD_REG_ADDR_MASK),
  372. val);
  373. }
  374. static int oa_tc6_get_phy_c45_mms(int devnum)
  375. {
  376. switch (devnum) {
  377. case MDIO_MMD_PCS:
  378. return OA_TC6_PHY_C45_PCS_MMS2;
  379. case MDIO_MMD_PMAPMD:
  380. return OA_TC6_PHY_C45_PMA_PMD_MMS3;
  381. case MDIO_MMD_VEND2:
  382. return OA_TC6_PHY_C45_VS_PLCA_MMS4;
  383. case MDIO_MMD_AN:
  384. return OA_TC6_PHY_C45_AUTO_NEG_MMS5;
  385. case MDIO_MMD_POWER_UNIT:
  386. return OA_TC6_PHY_C45_POWER_UNIT_MMS6;
  387. default:
  388. return -EOPNOTSUPP;
  389. }
  390. }
  391. static int oa_tc6_mdiobus_read_c45(struct mii_bus *bus, int addr, int devnum,
  392. int regnum)
  393. {
  394. struct oa_tc6 *tc6 = bus->priv;
  395. u32 regval;
  396. int ret;
  397. ret = oa_tc6_get_phy_c45_mms(devnum);
  398. if (ret < 0)
  399. return ret;
  400. ret = oa_tc6_read_register(tc6, (ret << 16) | regnum, &regval);
  401. if (ret)
  402. return ret;
  403. return regval;
  404. }
  405. static int oa_tc6_mdiobus_write_c45(struct mii_bus *bus, int addr, int devnum,
  406. int regnum, u16 val)
  407. {
  408. struct oa_tc6 *tc6 = bus->priv;
  409. int ret;
  410. ret = oa_tc6_get_phy_c45_mms(devnum);
  411. if (ret < 0)
  412. return ret;
  413. return oa_tc6_write_register(tc6, (ret << 16) | regnum, val);
  414. }
  415. static int oa_tc6_mdiobus_register(struct oa_tc6 *tc6)
  416. {
  417. int ret;
  418. tc6->mdiobus = mdiobus_alloc();
  419. if (!tc6->mdiobus) {
  420. netdev_err(tc6->netdev, "MDIO bus alloc failed\n");
  421. return -ENOMEM;
  422. }
  423. tc6->mdiobus->priv = tc6;
  424. tc6->mdiobus->read = oa_tc6_mdiobus_read;
  425. tc6->mdiobus->write = oa_tc6_mdiobus_write;
  426. /* OPEN Alliance 10BASE-T1x compliance MAC-PHYs will have both C22 and
  427. * C45 registers space. If the PHY is discovered via C22 bus protocol it
  428. * assumes it uses C22 protocol and always uses C22 registers indirect
  429. * access to access C45 registers. This is because, we don't have a
  430. * clean separation between C22/C45 register space and C22/C45 MDIO bus
  431. * protocols. Resulting, PHY C45 registers direct access can't be used
  432. * which can save multiple SPI bus access. To support this feature, PHY
  433. * drivers can set .read_mmd/.write_mmd in the PHY driver to call
  434. * .read_c45/.write_c45. Ex: drivers/net/phy/microchip_t1s.c
  435. */
  436. tc6->mdiobus->read_c45 = oa_tc6_mdiobus_read_c45;
  437. tc6->mdiobus->write_c45 = oa_tc6_mdiobus_write_c45;
  438. tc6->mdiobus->name = "oa-tc6-mdiobus";
  439. tc6->mdiobus->parent = tc6->dev;
  440. snprintf(tc6->mdiobus->id, ARRAY_SIZE(tc6->mdiobus->id), "%s",
  441. dev_name(&tc6->spi->dev));
  442. ret = mdiobus_register(tc6->mdiobus);
  443. if (ret) {
  444. netdev_err(tc6->netdev, "Could not register MDIO bus\n");
  445. mdiobus_free(tc6->mdiobus);
  446. return ret;
  447. }
  448. return 0;
  449. }
  450. static void oa_tc6_mdiobus_unregister(struct oa_tc6 *tc6)
  451. {
  452. mdiobus_unregister(tc6->mdiobus);
  453. mdiobus_free(tc6->mdiobus);
  454. }
  455. static int oa_tc6_phy_init(struct oa_tc6 *tc6)
  456. {
  457. int ret;
  458. ret = oa_tc6_check_phy_reg_direct_access_capability(tc6);
  459. if (ret) {
  460. netdev_err(tc6->netdev,
  461. "Direct PHY register access is not supported by the MAC-PHY\n");
  462. return ret;
  463. }
  464. ret = oa_tc6_mdiobus_register(tc6);
  465. if (ret)
  466. return ret;
  467. tc6->phydev = phy_find_first(tc6->mdiobus);
  468. if (!tc6->phydev) {
  469. netdev_err(tc6->netdev, "No PHY found\n");
  470. oa_tc6_mdiobus_unregister(tc6);
  471. return -ENODEV;
  472. }
  473. tc6->phydev->is_internal = true;
  474. ret = phy_connect_direct(tc6->netdev, tc6->phydev,
  475. &oa_tc6_handle_link_change,
  476. PHY_INTERFACE_MODE_INTERNAL);
  477. if (ret) {
  478. netdev_err(tc6->netdev, "Can't attach PHY to %s\n",
  479. tc6->mdiobus->id);
  480. oa_tc6_mdiobus_unregister(tc6);
  481. return ret;
  482. }
  483. phy_attached_info(tc6->netdev->phydev);
  484. return 0;
  485. }
  486. static void oa_tc6_phy_exit(struct oa_tc6 *tc6)
  487. {
  488. phy_disconnect(tc6->phydev);
  489. oa_tc6_mdiobus_unregister(tc6);
  490. }
  491. static int oa_tc6_read_status0(struct oa_tc6 *tc6)
  492. {
  493. u32 regval;
  494. int ret;
  495. ret = oa_tc6_read_register(tc6, OA_TC6_REG_STATUS0, &regval);
  496. if (ret) {
  497. dev_err(&tc6->spi->dev, "STATUS0 register read failed: %d\n",
  498. ret);
  499. return 0;
  500. }
  501. return regval;
  502. }
  503. static int oa_tc6_sw_reset_macphy(struct oa_tc6 *tc6)
  504. {
  505. u32 regval = RESET_SWRESET;
  506. int ret;
  507. ret = oa_tc6_write_register(tc6, OA_TC6_REG_RESET, regval);
  508. if (ret)
  509. return ret;
  510. /* Poll for soft reset complete for every 1ms until 1s timeout */
  511. ret = readx_poll_timeout(oa_tc6_read_status0, tc6, regval,
  512. regval & STATUS0_RESETC,
  513. STATUS0_RESETC_POLL_DELAY,
  514. STATUS0_RESETC_POLL_TIMEOUT);
  515. if (ret)
  516. return -ENODEV;
  517. /* Clear the reset complete status */
  518. return oa_tc6_write_register(tc6, OA_TC6_REG_STATUS0, regval);
  519. }
  520. static int oa_tc6_unmask_macphy_error_interrupts(struct oa_tc6 *tc6)
  521. {
  522. u32 regval;
  523. int ret;
  524. ret = oa_tc6_read_register(tc6, OA_TC6_REG_INT_MASK0, &regval);
  525. if (ret)
  526. return ret;
  527. regval &= ~(INT_MASK0_TX_PROTOCOL_ERR_MASK |
  528. INT_MASK0_RX_BUFFER_OVERFLOW_ERR_MASK |
  529. INT_MASK0_LOSS_OF_FRAME_ERR_MASK |
  530. INT_MASK0_HEADER_ERR_MASK);
  531. return oa_tc6_write_register(tc6, OA_TC6_REG_INT_MASK0, regval);
  532. }
  533. static int oa_tc6_enable_data_transfer(struct oa_tc6 *tc6)
  534. {
  535. u32 value;
  536. int ret;
  537. ret = oa_tc6_read_register(tc6, OA_TC6_REG_CONFIG0, &value);
  538. if (ret)
  539. return ret;
  540. /* Enable configuration synchronization for data transfer */
  541. value |= CONFIG0_SYNC;
  542. return oa_tc6_write_register(tc6, OA_TC6_REG_CONFIG0, value);
  543. }
  544. static void oa_tc6_cleanup_ongoing_rx_skb(struct oa_tc6 *tc6)
  545. {
  546. if (tc6->rx_skb) {
  547. tc6->netdev->stats.rx_dropped++;
  548. kfree_skb(tc6->rx_skb);
  549. tc6->rx_skb = NULL;
  550. }
  551. }
  552. static void oa_tc6_cleanup_ongoing_tx_skb(struct oa_tc6 *tc6)
  553. {
  554. if (tc6->ongoing_tx_skb) {
  555. tc6->netdev->stats.tx_dropped++;
  556. kfree_skb(tc6->ongoing_tx_skb);
  557. tc6->ongoing_tx_skb = NULL;
  558. }
  559. }
  560. static int oa_tc6_process_extended_status(struct oa_tc6 *tc6)
  561. {
  562. u32 value;
  563. int ret;
  564. ret = oa_tc6_read_register(tc6, OA_TC6_REG_STATUS0, &value);
  565. if (ret) {
  566. netdev_err(tc6->netdev, "STATUS0 register read failed: %d\n",
  567. ret);
  568. return ret;
  569. }
  570. /* Clear the error interrupts status */
  571. ret = oa_tc6_write_register(tc6, OA_TC6_REG_STATUS0, value);
  572. if (ret) {
  573. netdev_err(tc6->netdev, "STATUS0 register write failed: %d\n",
  574. ret);
  575. return ret;
  576. }
  577. if (FIELD_GET(STATUS0_RX_BUFFER_OVERFLOW_ERROR, value)) {
  578. tc6->rx_buf_overflow = true;
  579. oa_tc6_cleanup_ongoing_rx_skb(tc6);
  580. net_err_ratelimited("%s: Receive buffer overflow error\n",
  581. tc6->netdev->name);
  582. return -EAGAIN;
  583. }
  584. if (FIELD_GET(STATUS0_TX_PROTOCOL_ERROR, value)) {
  585. netdev_err(tc6->netdev, "Transmit protocol error\n");
  586. return -ENODEV;
  587. }
  588. /* TODO: Currently loss of frame and header errors are treated as
  589. * non-recoverable errors. They will be handled in the next version.
  590. */
  591. if (FIELD_GET(STATUS0_LOSS_OF_FRAME_ERROR, value)) {
  592. netdev_err(tc6->netdev, "Loss of frame error\n");
  593. return -ENODEV;
  594. }
  595. if (FIELD_GET(STATUS0_HEADER_ERROR, value)) {
  596. netdev_err(tc6->netdev, "Header error\n");
  597. return -ENODEV;
  598. }
  599. return 0;
  600. }
  601. static int oa_tc6_process_rx_chunk_footer(struct oa_tc6 *tc6, u32 footer)
  602. {
  603. /* Process rx chunk footer for the following,
  604. * 1. tx credits
  605. * 2. errors if any from MAC-PHY
  606. * 3. receive chunks available
  607. */
  608. tc6->tx_credits = FIELD_GET(OA_TC6_DATA_FOOTER_TX_CREDITS, footer);
  609. tc6->rx_chunks_available = FIELD_GET(OA_TC6_DATA_FOOTER_RX_CHUNKS,
  610. footer);
  611. if (FIELD_GET(OA_TC6_DATA_FOOTER_EXTENDED_STS, footer)) {
  612. int ret = oa_tc6_process_extended_status(tc6);
  613. if (ret)
  614. return ret;
  615. }
  616. /* TODO: Currently received header bad and configuration unsync errors
  617. * are treated as non-recoverable errors. They will be handled in the
  618. * next version.
  619. */
  620. if (FIELD_GET(OA_TC6_DATA_FOOTER_RXD_HEADER_BAD, footer)) {
  621. netdev_err(tc6->netdev, "Rxd header bad error\n");
  622. return -ENODEV;
  623. }
  624. if (!FIELD_GET(OA_TC6_DATA_FOOTER_CONFIG_SYNC, footer)) {
  625. netdev_err(tc6->netdev, "Config unsync error\n");
  626. return -ENODEV;
  627. }
  628. return 0;
  629. }
  630. static void oa_tc6_submit_rx_skb(struct oa_tc6 *tc6)
  631. {
  632. tc6->rx_skb->protocol = eth_type_trans(tc6->rx_skb, tc6->netdev);
  633. tc6->netdev->stats.rx_packets++;
  634. tc6->netdev->stats.rx_bytes += tc6->rx_skb->len;
  635. netif_rx(tc6->rx_skb);
  636. tc6->rx_skb = NULL;
  637. }
  638. static void oa_tc6_update_rx_skb(struct oa_tc6 *tc6, u8 *payload, u8 length)
  639. {
  640. memcpy(skb_put(tc6->rx_skb, length), payload, length);
  641. }
  642. static int oa_tc6_allocate_rx_skb(struct oa_tc6 *tc6)
  643. {
  644. tc6->rx_skb = netdev_alloc_skb_ip_align(tc6->netdev, tc6->netdev->mtu +
  645. ETH_HLEN + ETH_FCS_LEN);
  646. if (!tc6->rx_skb) {
  647. tc6->netdev->stats.rx_dropped++;
  648. return -ENOMEM;
  649. }
  650. return 0;
  651. }
  652. static int oa_tc6_prcs_complete_rx_frame(struct oa_tc6 *tc6, u8 *payload,
  653. u16 size)
  654. {
  655. int ret;
  656. ret = oa_tc6_allocate_rx_skb(tc6);
  657. if (ret)
  658. return ret;
  659. oa_tc6_update_rx_skb(tc6, payload, size);
  660. oa_tc6_submit_rx_skb(tc6);
  661. return 0;
  662. }
  663. static int oa_tc6_prcs_rx_frame_start(struct oa_tc6 *tc6, u8 *payload, u16 size)
  664. {
  665. int ret;
  666. ret = oa_tc6_allocate_rx_skb(tc6);
  667. if (ret)
  668. return ret;
  669. oa_tc6_update_rx_skb(tc6, payload, size);
  670. return 0;
  671. }
  672. static void oa_tc6_prcs_rx_frame_end(struct oa_tc6 *tc6, u8 *payload, u16 size)
  673. {
  674. oa_tc6_update_rx_skb(tc6, payload, size);
  675. oa_tc6_submit_rx_skb(tc6);
  676. }
  677. static void oa_tc6_prcs_ongoing_rx_frame(struct oa_tc6 *tc6, u8 *payload,
  678. u32 footer)
  679. {
  680. oa_tc6_update_rx_skb(tc6, payload, OA_TC6_CHUNK_PAYLOAD_SIZE);
  681. }
  682. static int oa_tc6_prcs_rx_chunk_payload(struct oa_tc6 *tc6, u8 *data,
  683. u32 footer)
  684. {
  685. u8 start_byte_offset = FIELD_GET(OA_TC6_DATA_FOOTER_START_WORD_OFFSET,
  686. footer) * sizeof(u32);
  687. u8 end_byte_offset = FIELD_GET(OA_TC6_DATA_FOOTER_END_BYTE_OFFSET,
  688. footer);
  689. bool start_valid = FIELD_GET(OA_TC6_DATA_FOOTER_START_VALID, footer);
  690. bool end_valid = FIELD_GET(OA_TC6_DATA_FOOTER_END_VALID, footer);
  691. u16 size;
  692. /* Restart the new rx frame after receiving rx buffer overflow error */
  693. if (start_valid && tc6->rx_buf_overflow)
  694. tc6->rx_buf_overflow = false;
  695. if (tc6->rx_buf_overflow)
  696. return 0;
  697. /* Process the chunk with complete rx frame */
  698. if (start_valid && end_valid && start_byte_offset < end_byte_offset) {
  699. size = end_byte_offset + 1 - start_byte_offset;
  700. return oa_tc6_prcs_complete_rx_frame(tc6,
  701. &data[start_byte_offset],
  702. size);
  703. }
  704. /* Process the chunk with only rx frame start */
  705. if (start_valid && !end_valid) {
  706. size = OA_TC6_CHUNK_PAYLOAD_SIZE - start_byte_offset;
  707. return oa_tc6_prcs_rx_frame_start(tc6,
  708. &data[start_byte_offset],
  709. size);
  710. }
  711. /* Process the chunk with only rx frame end */
  712. if (end_valid && !start_valid) {
  713. size = end_byte_offset + 1;
  714. oa_tc6_prcs_rx_frame_end(tc6, data, size);
  715. return 0;
  716. }
  717. /* Process the chunk with previous rx frame end and next rx frame
  718. * start.
  719. */
  720. if (start_valid && end_valid && start_byte_offset > end_byte_offset) {
  721. /* After rx buffer overflow error received, there might be a
  722. * possibility of getting an end valid of a previously
  723. * incomplete rx frame along with the new rx frame start valid.
  724. */
  725. if (tc6->rx_skb) {
  726. size = end_byte_offset + 1;
  727. oa_tc6_prcs_rx_frame_end(tc6, data, size);
  728. }
  729. size = OA_TC6_CHUNK_PAYLOAD_SIZE - start_byte_offset;
  730. return oa_tc6_prcs_rx_frame_start(tc6,
  731. &data[start_byte_offset],
  732. size);
  733. }
  734. /* Process the chunk with ongoing rx frame data */
  735. oa_tc6_prcs_ongoing_rx_frame(tc6, data, footer);
  736. return 0;
  737. }
  738. static u32 oa_tc6_get_rx_chunk_footer(struct oa_tc6 *tc6, u16 footer_offset)
  739. {
  740. u8 *rx_buf = tc6->spi_data_rx_buf;
  741. __be32 footer;
  742. footer = *((__be32 *)&rx_buf[footer_offset]);
  743. return be32_to_cpu(footer);
  744. }
  745. static int oa_tc6_process_spi_data_rx_buf(struct oa_tc6 *tc6, u16 length)
  746. {
  747. u16 no_of_rx_chunks = length / OA_TC6_CHUNK_SIZE;
  748. u32 footer;
  749. int ret;
  750. /* All the rx chunks in the receive SPI data buffer are examined here */
  751. for (int i = 0; i < no_of_rx_chunks; i++) {
  752. /* Last 4 bytes in each received chunk consist footer info */
  753. footer = oa_tc6_get_rx_chunk_footer(tc6, i * OA_TC6_CHUNK_SIZE +
  754. OA_TC6_CHUNK_PAYLOAD_SIZE);
  755. ret = oa_tc6_process_rx_chunk_footer(tc6, footer);
  756. if (ret)
  757. return ret;
  758. /* If there is a data valid chunks then process it for the
  759. * information needed to determine the validity and the location
  760. * of the receive frame data.
  761. */
  762. if (FIELD_GET(OA_TC6_DATA_FOOTER_DATA_VALID, footer)) {
  763. u8 *payload = tc6->spi_data_rx_buf + i *
  764. OA_TC6_CHUNK_SIZE;
  765. ret = oa_tc6_prcs_rx_chunk_payload(tc6, payload,
  766. footer);
  767. if (ret)
  768. return ret;
  769. }
  770. }
  771. return 0;
  772. }
  773. static __be32 oa_tc6_prepare_data_header(bool data_valid, bool start_valid,
  774. bool end_valid, u8 end_byte_offset)
  775. {
  776. u32 header = FIELD_PREP(OA_TC6_DATA_HEADER_DATA_NOT_CTRL,
  777. OA_TC6_DATA_HEADER) |
  778. FIELD_PREP(OA_TC6_DATA_HEADER_DATA_VALID, data_valid) |
  779. FIELD_PREP(OA_TC6_DATA_HEADER_START_VALID, start_valid) |
  780. FIELD_PREP(OA_TC6_DATA_HEADER_END_VALID, end_valid) |
  781. FIELD_PREP(OA_TC6_DATA_HEADER_END_BYTE_OFFSET,
  782. end_byte_offset);
  783. header |= FIELD_PREP(OA_TC6_DATA_HEADER_PARITY,
  784. oa_tc6_get_parity(header));
  785. return cpu_to_be32(header);
  786. }
  787. static void oa_tc6_add_tx_skb_to_spi_buf(struct oa_tc6 *tc6)
  788. {
  789. enum oa_tc6_data_end_valid_info end_valid = OA_TC6_DATA_END_INVALID;
  790. __be32 *tx_buf = tc6->spi_data_tx_buf + tc6->spi_data_tx_buf_offset;
  791. u16 remaining_len = tc6->ongoing_tx_skb->len - tc6->tx_skb_offset;
  792. u8 *tx_skb_data = tc6->ongoing_tx_skb->data + tc6->tx_skb_offset;
  793. enum oa_tc6_data_start_valid_info start_valid;
  794. u8 end_byte_offset = 0;
  795. u16 length_to_copy;
  796. /* Initial value is assigned here to avoid more than 80 characters in
  797. * the declaration place.
  798. */
  799. start_valid = OA_TC6_DATA_START_INVALID;
  800. /* Set start valid if the current tx chunk contains the start of the tx
  801. * ethernet frame.
  802. */
  803. if (!tc6->tx_skb_offset)
  804. start_valid = OA_TC6_DATA_START_VALID;
  805. /* If the remaining tx skb length is more than the chunk payload size of
  806. * 64 bytes then copy only 64 bytes and leave the ongoing tx skb for
  807. * next tx chunk.
  808. */
  809. length_to_copy = min_t(u16, remaining_len, OA_TC6_CHUNK_PAYLOAD_SIZE);
  810. /* Copy the tx skb data to the tx chunk payload buffer */
  811. memcpy(tx_buf + 1, tx_skb_data, length_to_copy);
  812. tc6->tx_skb_offset += length_to_copy;
  813. /* Set end valid if the current tx chunk contains the end of the tx
  814. * ethernet frame.
  815. */
  816. if (tc6->ongoing_tx_skb->len == tc6->tx_skb_offset) {
  817. end_valid = OA_TC6_DATA_END_VALID;
  818. end_byte_offset = length_to_copy - 1;
  819. tc6->tx_skb_offset = 0;
  820. tc6->netdev->stats.tx_bytes += tc6->ongoing_tx_skb->len;
  821. tc6->netdev->stats.tx_packets++;
  822. kfree_skb(tc6->ongoing_tx_skb);
  823. tc6->ongoing_tx_skb = NULL;
  824. }
  825. *tx_buf = oa_tc6_prepare_data_header(OA_TC6_DATA_VALID, start_valid,
  826. end_valid, end_byte_offset);
  827. tc6->spi_data_tx_buf_offset += OA_TC6_CHUNK_SIZE;
  828. }
  829. static u16 oa_tc6_prepare_spi_tx_buf_for_tx_skbs(struct oa_tc6 *tc6)
  830. {
  831. u16 used_tx_credits;
  832. /* Get tx skbs and convert them into tx chunks based on the tx credits
  833. * available.
  834. */
  835. for (used_tx_credits = 0; used_tx_credits < tc6->tx_credits;
  836. used_tx_credits++) {
  837. if (!tc6->ongoing_tx_skb) {
  838. spin_lock_bh(&tc6->tx_skb_lock);
  839. tc6->ongoing_tx_skb = tc6->waiting_tx_skb;
  840. tc6->waiting_tx_skb = NULL;
  841. spin_unlock_bh(&tc6->tx_skb_lock);
  842. }
  843. if (!tc6->ongoing_tx_skb)
  844. break;
  845. oa_tc6_add_tx_skb_to_spi_buf(tc6);
  846. }
  847. return used_tx_credits * OA_TC6_CHUNK_SIZE;
  848. }
  849. static void oa_tc6_add_empty_chunks_to_spi_buf(struct oa_tc6 *tc6,
  850. u16 needed_empty_chunks)
  851. {
  852. __be32 header;
  853. header = oa_tc6_prepare_data_header(OA_TC6_DATA_INVALID,
  854. OA_TC6_DATA_START_INVALID,
  855. OA_TC6_DATA_END_INVALID, 0);
  856. while (needed_empty_chunks--) {
  857. __be32 *tx_buf = tc6->spi_data_tx_buf +
  858. tc6->spi_data_tx_buf_offset;
  859. *tx_buf = header;
  860. tc6->spi_data_tx_buf_offset += OA_TC6_CHUNK_SIZE;
  861. }
  862. }
  863. static u16 oa_tc6_prepare_spi_tx_buf_for_rx_chunks(struct oa_tc6 *tc6, u16 len)
  864. {
  865. u16 tx_chunks = len / OA_TC6_CHUNK_SIZE;
  866. u16 needed_empty_chunks;
  867. /* If there are more chunks to receive than to transmit, we need to add
  868. * enough empty tx chunks to allow the reception of the excess rx
  869. * chunks.
  870. */
  871. if (tx_chunks >= tc6->rx_chunks_available)
  872. return len;
  873. needed_empty_chunks = tc6->rx_chunks_available - tx_chunks;
  874. oa_tc6_add_empty_chunks_to_spi_buf(tc6, needed_empty_chunks);
  875. return needed_empty_chunks * OA_TC6_CHUNK_SIZE + len;
  876. }
  877. static int oa_tc6_try_spi_transfer(struct oa_tc6 *tc6)
  878. {
  879. int ret;
  880. while (true) {
  881. u16 spi_len = 0;
  882. tc6->spi_data_tx_buf_offset = 0;
  883. if (tc6->ongoing_tx_skb || tc6->waiting_tx_skb)
  884. spi_len = oa_tc6_prepare_spi_tx_buf_for_tx_skbs(tc6);
  885. spi_len = oa_tc6_prepare_spi_tx_buf_for_rx_chunks(tc6, spi_len);
  886. if (tc6->int_flag) {
  887. tc6->int_flag = false;
  888. if (spi_len == 0) {
  889. oa_tc6_add_empty_chunks_to_spi_buf(tc6, 1);
  890. spi_len = OA_TC6_CHUNK_SIZE;
  891. }
  892. }
  893. if (spi_len == 0)
  894. break;
  895. ret = oa_tc6_spi_transfer(tc6, OA_TC6_DATA_HEADER, spi_len);
  896. if (ret) {
  897. netdev_err(tc6->netdev, "SPI data transfer failed: %d\n",
  898. ret);
  899. return ret;
  900. }
  901. ret = oa_tc6_process_spi_data_rx_buf(tc6, spi_len);
  902. if (ret) {
  903. if (ret == -EAGAIN)
  904. continue;
  905. oa_tc6_cleanup_ongoing_tx_skb(tc6);
  906. oa_tc6_cleanup_ongoing_rx_skb(tc6);
  907. netdev_err(tc6->netdev, "Device error: %d\n", ret);
  908. return ret;
  909. }
  910. if (!tc6->waiting_tx_skb && netif_queue_stopped(tc6->netdev))
  911. netif_wake_queue(tc6->netdev);
  912. }
  913. return 0;
  914. }
  915. static int oa_tc6_spi_thread_handler(void *data)
  916. {
  917. struct oa_tc6 *tc6 = data;
  918. int ret;
  919. while (likely(!kthread_should_stop())) {
  920. /* This kthread will be waken up if there is a tx skb or mac-phy
  921. * interrupt to perform spi transfer with tx chunks.
  922. */
  923. wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
  924. (tc6->waiting_tx_skb &&
  925. tc6->tx_credits) ||
  926. kthread_should_stop());
  927. if (kthread_should_stop())
  928. break;
  929. ret = oa_tc6_try_spi_transfer(tc6);
  930. if (ret)
  931. return ret;
  932. }
  933. return 0;
  934. }
  935. static int oa_tc6_update_buffer_status_from_register(struct oa_tc6 *tc6)
  936. {
  937. u32 value;
  938. int ret;
  939. /* Initially tx credits and rx chunks available to be updated from the
  940. * register as there is no data transfer performed yet. Later they will
  941. * be updated from the rx footer.
  942. */
  943. ret = oa_tc6_read_register(tc6, OA_TC6_REG_BUFFER_STATUS, &value);
  944. if (ret)
  945. return ret;
  946. tc6->tx_credits = FIELD_GET(BUFFER_STATUS_TX_CREDITS_AVAILABLE, value);
  947. tc6->rx_chunks_available = FIELD_GET(BUFFER_STATUS_RX_CHUNKS_AVAILABLE,
  948. value);
  949. return 0;
  950. }
  951. static irqreturn_t oa_tc6_macphy_isr(int irq, void *data)
  952. {
  953. struct oa_tc6 *tc6 = data;
  954. /* MAC-PHY interrupt can occur for the following reasons.
  955. * - availability of tx credits if it was 0 before and not reported in
  956. * the previous rx footer.
  957. * - availability of rx chunks if it was 0 before and not reported in
  958. * the previous rx footer.
  959. * - extended status event not reported in the previous rx footer.
  960. */
  961. tc6->int_flag = true;
  962. /* Wake spi kthread to perform spi transfer */
  963. wake_up_interruptible(&tc6->spi_wq);
  964. return IRQ_HANDLED;
  965. }
  966. /**
  967. * oa_tc6_zero_align_receive_frame_enable - function to enable zero align
  968. * receive frame feature.
  969. * @tc6: oa_tc6 struct.
  970. *
  971. * Return: 0 on success otherwise failed.
  972. */
  973. int oa_tc6_zero_align_receive_frame_enable(struct oa_tc6 *tc6)
  974. {
  975. u32 regval;
  976. int ret;
  977. ret = oa_tc6_read_register(tc6, OA_TC6_REG_CONFIG0, &regval);
  978. if (ret)
  979. return ret;
  980. /* Set Zero-Align Receive Frame Enable */
  981. regval |= CONFIG0_ZARFE_ENABLE;
  982. return oa_tc6_write_register(tc6, OA_TC6_REG_CONFIG0, regval);
  983. }
  984. EXPORT_SYMBOL_GPL(oa_tc6_zero_align_receive_frame_enable);
  985. /**
  986. * oa_tc6_start_xmit - function for sending the tx skb which consists ethernet
  987. * frame.
  988. * @tc6: oa_tc6 struct.
  989. * @skb: socket buffer in which the ethernet frame is stored.
  990. *
  991. * Return: NETDEV_TX_OK if the transmit ethernet frame skb added in the tx_skb_q
  992. * otherwise returns NETDEV_TX_BUSY.
  993. */
  994. netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
  995. {
  996. if (tc6->waiting_tx_skb) {
  997. netif_stop_queue(tc6->netdev);
  998. return NETDEV_TX_BUSY;
  999. }
  1000. if (skb_linearize(skb)) {
  1001. dev_kfree_skb_any(skb);
  1002. tc6->netdev->stats.tx_dropped++;
  1003. return NETDEV_TX_OK;
  1004. }
  1005. spin_lock_bh(&tc6->tx_skb_lock);
  1006. tc6->waiting_tx_skb = skb;
  1007. spin_unlock_bh(&tc6->tx_skb_lock);
  1008. /* Wake spi kthread to perform spi transfer */
  1009. wake_up_interruptible(&tc6->spi_wq);
  1010. return NETDEV_TX_OK;
  1011. }
  1012. EXPORT_SYMBOL_GPL(oa_tc6_start_xmit);
  1013. /**
  1014. * oa_tc6_init - allocates and initializes oa_tc6 structure.
  1015. * @spi: device with which data will be exchanged.
  1016. * @netdev: network device interface structure.
  1017. *
  1018. * Return: pointer reference to the oa_tc6 structure if the MAC-PHY
  1019. * initialization is successful otherwise NULL.
  1020. */
  1021. struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
  1022. {
  1023. struct oa_tc6 *tc6;
  1024. int ret;
  1025. tc6 = devm_kzalloc(&spi->dev, sizeof(*tc6), GFP_KERNEL);
  1026. if (!tc6)
  1027. return NULL;
  1028. tc6->spi = spi;
  1029. tc6->netdev = netdev;
  1030. SET_NETDEV_DEV(netdev, &spi->dev);
  1031. mutex_init(&tc6->spi_ctrl_lock);
  1032. spin_lock_init(&tc6->tx_skb_lock);
  1033. /* Set the SPI controller to pump at realtime priority */
  1034. tc6->spi->rt = true;
  1035. if (spi_setup(tc6->spi) < 0)
  1036. return NULL;
  1037. tc6->spi_ctrl_tx_buf = devm_kzalloc(&tc6->spi->dev,
  1038. OA_TC6_CTRL_SPI_BUF_SIZE,
  1039. GFP_KERNEL);
  1040. if (!tc6->spi_ctrl_tx_buf)
  1041. return NULL;
  1042. tc6->spi_ctrl_rx_buf = devm_kzalloc(&tc6->spi->dev,
  1043. OA_TC6_CTRL_SPI_BUF_SIZE,
  1044. GFP_KERNEL);
  1045. if (!tc6->spi_ctrl_rx_buf)
  1046. return NULL;
  1047. tc6->spi_data_tx_buf = devm_kzalloc(&tc6->spi->dev,
  1048. OA_TC6_SPI_DATA_BUF_SIZE,
  1049. GFP_KERNEL);
  1050. if (!tc6->spi_data_tx_buf)
  1051. return NULL;
  1052. tc6->spi_data_rx_buf = devm_kzalloc(&tc6->spi->dev,
  1053. OA_TC6_SPI_DATA_BUF_SIZE,
  1054. GFP_KERNEL);
  1055. if (!tc6->spi_data_rx_buf)
  1056. return NULL;
  1057. ret = oa_tc6_sw_reset_macphy(tc6);
  1058. if (ret) {
  1059. dev_err(&tc6->spi->dev,
  1060. "MAC-PHY software reset failed: %d\n", ret);
  1061. return NULL;
  1062. }
  1063. ret = oa_tc6_unmask_macphy_error_interrupts(tc6);
  1064. if (ret) {
  1065. dev_err(&tc6->spi->dev,
  1066. "MAC-PHY error interrupts unmask failed: %d\n", ret);
  1067. return NULL;
  1068. }
  1069. ret = oa_tc6_phy_init(tc6);
  1070. if (ret) {
  1071. dev_err(&tc6->spi->dev,
  1072. "MAC internal PHY initialization failed: %d\n", ret);
  1073. return NULL;
  1074. }
  1075. ret = oa_tc6_enable_data_transfer(tc6);
  1076. if (ret) {
  1077. dev_err(&tc6->spi->dev, "Failed to enable data transfer: %d\n",
  1078. ret);
  1079. goto phy_exit;
  1080. }
  1081. ret = oa_tc6_update_buffer_status_from_register(tc6);
  1082. if (ret) {
  1083. dev_err(&tc6->spi->dev,
  1084. "Failed to update buffer status: %d\n", ret);
  1085. goto phy_exit;
  1086. }
  1087. init_waitqueue_head(&tc6->spi_wq);
  1088. tc6->spi_thread = kthread_run(oa_tc6_spi_thread_handler, tc6,
  1089. "oa-tc6-spi-thread");
  1090. if (IS_ERR(tc6->spi_thread)) {
  1091. dev_err(&tc6->spi->dev, "Failed to create SPI thread\n");
  1092. goto phy_exit;
  1093. }
  1094. sched_set_fifo(tc6->spi_thread);
  1095. ret = devm_request_irq(&tc6->spi->dev, tc6->spi->irq, oa_tc6_macphy_isr,
  1096. IRQF_TRIGGER_FALLING, dev_name(&tc6->spi->dev),
  1097. tc6);
  1098. if (ret) {
  1099. dev_err(&tc6->spi->dev, "Failed to request macphy isr %d\n",
  1100. ret);
  1101. goto kthread_stop;
  1102. }
  1103. /* oa_tc6_sw_reset_macphy() function resets and clears the MAC-PHY reset
  1104. * complete status. IRQ is also asserted on reset completion and it is
  1105. * remain asserted until MAC-PHY receives a data chunk. So performing an
  1106. * empty data chunk transmission will deassert the IRQ. Refer section
  1107. * 7.7 and 9.2.8.8 in the OPEN Alliance specification for more details.
  1108. */
  1109. tc6->int_flag = true;
  1110. wake_up_interruptible(&tc6->spi_wq);
  1111. return tc6;
  1112. kthread_stop:
  1113. kthread_stop(tc6->spi_thread);
  1114. phy_exit:
  1115. oa_tc6_phy_exit(tc6);
  1116. return NULL;
  1117. }
  1118. EXPORT_SYMBOL_GPL(oa_tc6_init);
  1119. /**
  1120. * oa_tc6_exit - exit function.
  1121. * @tc6: oa_tc6 struct.
  1122. */
  1123. void oa_tc6_exit(struct oa_tc6 *tc6)
  1124. {
  1125. oa_tc6_phy_exit(tc6);
  1126. kthread_stop(tc6->spi_thread);
  1127. dev_kfree_skb_any(tc6->ongoing_tx_skb);
  1128. dev_kfree_skb_any(tc6->waiting_tx_skb);
  1129. dev_kfree_skb_any(tc6->rx_skb);
  1130. }
  1131. EXPORT_SYMBOL_GPL(oa_tc6_exit);
  1132. MODULE_DESCRIPTION("OPEN Alliance 10BASE‑T1x MAC‑PHY Serial Interface Lib");
  1133. MODULE_AUTHOR("Parthiban Veerasooran <parthiban.veerasooran@microchip.com>");
  1134. MODULE_LICENSE("GPL");