sja1105_spi.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. /* Copyright 2016-2018 NXP
  3. * Copyright (c) 2018, Sensor-Technik Wiedemann GmbH
  4. * Copyright (c) 2018-2019, Vladimir Oltean <[email protected]>
  5. */
  6. #include <linux/spi/spi.h>
  7. #include <linux/packing.h>
  8. #include "sja1105.h"
  9. struct sja1105_chunk {
  10. u8 *buf;
  11. size_t len;
  12. u64 reg_addr;
  13. };
  14. static void
  15. sja1105_spi_message_pack(void *buf, const struct sja1105_spi_message *msg)
  16. {
  17. const int size = SJA1105_SIZE_SPI_MSG_HEADER;
  18. memset(buf, 0, size);
  19. sja1105_pack(buf, &msg->access, 31, 31, size);
  20. sja1105_pack(buf, &msg->read_count, 30, 25, size);
  21. sja1105_pack(buf, &msg->address, 24, 4, size);
  22. }
  23. /* If @rw is:
  24. * - SPI_WRITE: creates and sends an SPI write message at absolute
  25. * address reg_addr, taking @len bytes from *buf
  26. * - SPI_READ: creates and sends an SPI read message from absolute
  27. * address reg_addr, writing @len bytes into *buf
  28. */
  29. static int sja1105_xfer(const struct sja1105_private *priv,
  30. sja1105_spi_rw_mode_t rw, u64 reg_addr, u8 *buf,
  31. size_t len, struct ptp_system_timestamp *ptp_sts)
  32. {
  33. u8 hdr_buf[SJA1105_SIZE_SPI_MSG_HEADER] = {0};
  34. struct spi_device *spi = priv->spidev;
  35. struct spi_transfer xfers[2] = {0};
  36. struct spi_transfer *chunk_xfer;
  37. struct spi_transfer *hdr_xfer;
  38. struct sja1105_chunk chunk;
  39. int num_chunks;
  40. int rc, i = 0;
  41. num_chunks = DIV_ROUND_UP(len, priv->max_xfer_len);
  42. chunk.reg_addr = reg_addr;
  43. chunk.buf = buf;
  44. chunk.len = min_t(size_t, len, priv->max_xfer_len);
  45. hdr_xfer = &xfers[0];
  46. chunk_xfer = &xfers[1];
  47. for (i = 0; i < num_chunks; i++) {
  48. struct spi_transfer *ptp_sts_xfer;
  49. struct sja1105_spi_message msg;
  50. /* Populate the transfer's header buffer */
  51. msg.address = chunk.reg_addr;
  52. msg.access = rw;
  53. if (rw == SPI_READ)
  54. msg.read_count = chunk.len / 4;
  55. else
  56. /* Ignored */
  57. msg.read_count = 0;
  58. sja1105_spi_message_pack(hdr_buf, &msg);
  59. hdr_xfer->tx_buf = hdr_buf;
  60. hdr_xfer->len = SJA1105_SIZE_SPI_MSG_HEADER;
  61. /* Populate the transfer's data buffer */
  62. if (rw == SPI_READ)
  63. chunk_xfer->rx_buf = chunk.buf;
  64. else
  65. chunk_xfer->tx_buf = chunk.buf;
  66. chunk_xfer->len = chunk.len;
  67. /* Request timestamping for the transfer. Instead of letting
  68. * callers specify which byte they want to timestamp, we can
  69. * make certain assumptions:
  70. * - A read operation will request a software timestamp when
  71. * what's being read is the PTP time. That is snapshotted by
  72. * the switch hardware at the end of the command portion
  73. * (hdr_xfer).
  74. * - A write operation will request a software timestamp on
  75. * actions that modify the PTP time. Taking clock stepping as
  76. * an example, the switch writes the PTP time at the end of
  77. * the data portion (chunk_xfer).
  78. */
  79. if (rw == SPI_READ)
  80. ptp_sts_xfer = hdr_xfer;
  81. else
  82. ptp_sts_xfer = chunk_xfer;
  83. ptp_sts_xfer->ptp_sts_word_pre = ptp_sts_xfer->len - 1;
  84. ptp_sts_xfer->ptp_sts_word_post = ptp_sts_xfer->len - 1;
  85. ptp_sts_xfer->ptp_sts = ptp_sts;
  86. /* Calculate next chunk */
  87. chunk.buf += chunk.len;
  88. chunk.reg_addr += chunk.len / 4;
  89. chunk.len = min_t(size_t, (ptrdiff_t)(buf + len - chunk.buf),
  90. priv->max_xfer_len);
  91. rc = spi_sync_transfer(spi, xfers, 2);
  92. if (rc < 0) {
  93. dev_err(&spi->dev, "SPI transfer failed: %d\n", rc);
  94. return rc;
  95. }
  96. }
  97. return 0;
  98. }
  99. int sja1105_xfer_buf(const struct sja1105_private *priv,
  100. sja1105_spi_rw_mode_t rw, u64 reg_addr,
  101. u8 *buf, size_t len)
  102. {
  103. return sja1105_xfer(priv, rw, reg_addr, buf, len, NULL);
  104. }
  105. /* If @rw is:
  106. * - SPI_WRITE: creates and sends an SPI write message at absolute
  107. * address reg_addr
  108. * - SPI_READ: creates and sends an SPI read message from absolute
  109. * address reg_addr
  110. *
  111. * The u64 *value is unpacked, meaning that it's stored in the native
  112. * CPU endianness and directly usable by software running on the core.
  113. */
  114. int sja1105_xfer_u64(const struct sja1105_private *priv,
  115. sja1105_spi_rw_mode_t rw, u64 reg_addr, u64 *value,
  116. struct ptp_system_timestamp *ptp_sts)
  117. {
  118. u8 packed_buf[8];
  119. int rc;
  120. if (rw == SPI_WRITE)
  121. sja1105_pack(packed_buf, value, 63, 0, 8);
  122. rc = sja1105_xfer(priv, rw, reg_addr, packed_buf, 8, ptp_sts);
  123. if (rw == SPI_READ)
  124. sja1105_unpack(packed_buf, value, 63, 0, 8);
  125. return rc;
  126. }
  127. /* Same as above, but transfers only a 4 byte word */
  128. int sja1105_xfer_u32(const struct sja1105_private *priv,
  129. sja1105_spi_rw_mode_t rw, u64 reg_addr, u32 *value,
  130. struct ptp_system_timestamp *ptp_sts)
  131. {
  132. u8 packed_buf[4];
  133. u64 tmp;
  134. int rc;
  135. if (rw == SPI_WRITE) {
  136. /* The packing API only supports u64 as CPU word size,
  137. * so we need to convert.
  138. */
  139. tmp = *value;
  140. sja1105_pack(packed_buf, &tmp, 31, 0, 4);
  141. }
  142. rc = sja1105_xfer(priv, rw, reg_addr, packed_buf, 4, ptp_sts);
  143. if (rw == SPI_READ) {
  144. sja1105_unpack(packed_buf, &tmp, 31, 0, 4);
  145. *value = tmp;
  146. }
  147. return rc;
  148. }
  149. static int sja1105et_reset_cmd(struct dsa_switch *ds)
  150. {
  151. struct sja1105_private *priv = ds->priv;
  152. const struct sja1105_regs *regs = priv->info->regs;
  153. u32 cold_reset = BIT(3);
  154. /* Cold reset */
  155. return sja1105_xfer_u32(priv, SPI_WRITE, regs->rgu, &cold_reset, NULL);
  156. }
  157. static int sja1105pqrs_reset_cmd(struct dsa_switch *ds)
  158. {
  159. struct sja1105_private *priv = ds->priv;
  160. const struct sja1105_regs *regs = priv->info->regs;
  161. u32 cold_reset = BIT(2);
  162. /* Cold reset */
  163. return sja1105_xfer_u32(priv, SPI_WRITE, regs->rgu, &cold_reset, NULL);
  164. }
  165. static int sja1110_reset_cmd(struct dsa_switch *ds)
  166. {
  167. struct sja1105_private *priv = ds->priv;
  168. const struct sja1105_regs *regs = priv->info->regs;
  169. u32 switch_reset = BIT(20);
  170. /* Only reset the switch core.
  171. * A full cold reset would re-enable the BASE_MCSS_CLOCK PLL which
  172. * would turn on the microcontroller, potentially letting it execute
  173. * code which could interfere with our configuration.
  174. */
  175. return sja1105_xfer_u32(priv, SPI_WRITE, regs->rgu, &switch_reset, NULL);
  176. }
  177. int sja1105_inhibit_tx(const struct sja1105_private *priv,
  178. unsigned long port_bitmap, bool tx_inhibited)
  179. {
  180. const struct sja1105_regs *regs = priv->info->regs;
  181. u32 inhibit_cmd;
  182. int rc;
  183. rc = sja1105_xfer_u32(priv, SPI_READ, regs->port_control,
  184. &inhibit_cmd, NULL);
  185. if (rc < 0)
  186. return rc;
  187. if (tx_inhibited)
  188. inhibit_cmd |= port_bitmap;
  189. else
  190. inhibit_cmd &= ~port_bitmap;
  191. return sja1105_xfer_u32(priv, SPI_WRITE, regs->port_control,
  192. &inhibit_cmd, NULL);
  193. }
  194. struct sja1105_status {
  195. u64 configs;
  196. u64 crcchkl;
  197. u64 ids;
  198. u64 crcchkg;
  199. };
  200. /* This is not reading the entire General Status area, which is also
  201. * divergent between E/T and P/Q/R/S, but only the relevant bits for
  202. * ensuring that the static config upload procedure was successful.
  203. */
  204. static void sja1105_status_unpack(void *buf, struct sja1105_status *status)
  205. {
  206. /* So that addition translates to 4 bytes */
  207. u32 *p = buf;
  208. /* device_id is missing from the buffer, but we don't
  209. * want to diverge from the manual definition of the
  210. * register addresses, so we'll back off one step with
  211. * the register pointer, and never access p[0].
  212. */
  213. p--;
  214. sja1105_unpack(p + 0x1, &status->configs, 31, 31, 4);
  215. sja1105_unpack(p + 0x1, &status->crcchkl, 30, 30, 4);
  216. sja1105_unpack(p + 0x1, &status->ids, 29, 29, 4);
  217. sja1105_unpack(p + 0x1, &status->crcchkg, 28, 28, 4);
  218. }
  219. static int sja1105_status_get(struct sja1105_private *priv,
  220. struct sja1105_status *status)
  221. {
  222. const struct sja1105_regs *regs = priv->info->regs;
  223. u8 packed_buf[4];
  224. int rc;
  225. rc = sja1105_xfer_buf(priv, SPI_READ, regs->status, packed_buf, 4);
  226. if (rc < 0)
  227. return rc;
  228. sja1105_status_unpack(packed_buf, status);
  229. return 0;
  230. }
  231. /* Not const because unpacking priv->static_config into buffers and preparing
  232. * for upload requires the recalculation of table CRCs and updating the
  233. * structures with these.
  234. */
  235. int static_config_buf_prepare_for_upload(struct sja1105_private *priv,
  236. void *config_buf, int buf_len)
  237. {
  238. struct sja1105_static_config *config = &priv->static_config;
  239. struct sja1105_table_header final_header;
  240. sja1105_config_valid_t valid;
  241. char *final_header_ptr;
  242. int crc_len;
  243. valid = sja1105_static_config_check_valid(config,
  244. priv->info->max_frame_mem);
  245. if (valid != SJA1105_CONFIG_OK) {
  246. dev_err(&priv->spidev->dev,
  247. sja1105_static_config_error_msg[valid]);
  248. return -EINVAL;
  249. }
  250. /* Write Device ID and config tables to config_buf */
  251. sja1105_static_config_pack(config_buf, config);
  252. /* Recalculate CRC of the last header (right now 0xDEADBEEF).
  253. * Don't include the CRC field itself.
  254. */
  255. crc_len = buf_len - 4;
  256. /* Read the whole table header */
  257. final_header_ptr = config_buf + buf_len - SJA1105_SIZE_TABLE_HEADER;
  258. sja1105_table_header_packing(final_header_ptr, &final_header, UNPACK);
  259. /* Modify */
  260. final_header.crc = sja1105_crc32(config_buf, crc_len);
  261. /* Rewrite */
  262. sja1105_table_header_packing(final_header_ptr, &final_header, PACK);
  263. return 0;
  264. }
  265. #define RETRIES 10
  266. int sja1105_static_config_upload(struct sja1105_private *priv)
  267. {
  268. struct sja1105_static_config *config = &priv->static_config;
  269. const struct sja1105_regs *regs = priv->info->regs;
  270. struct device *dev = &priv->spidev->dev;
  271. struct dsa_switch *ds = priv->ds;
  272. struct sja1105_status status;
  273. int rc, retries = RETRIES;
  274. u8 *config_buf;
  275. int buf_len;
  276. buf_len = sja1105_static_config_get_length(config);
  277. config_buf = kcalloc(buf_len, sizeof(char), GFP_KERNEL);
  278. if (!config_buf)
  279. return -ENOMEM;
  280. rc = static_config_buf_prepare_for_upload(priv, config_buf, buf_len);
  281. if (rc < 0) {
  282. dev_err(dev, "Invalid config, cannot upload\n");
  283. rc = -EINVAL;
  284. goto out;
  285. }
  286. /* Prevent PHY jabbering during switch reset by inhibiting
  287. * Tx on all ports and waiting for current packet to drain.
  288. * Otherwise, the PHY will see an unterminated Ethernet packet.
  289. */
  290. rc = sja1105_inhibit_tx(priv, GENMASK_ULL(ds->num_ports - 1, 0), true);
  291. if (rc < 0) {
  292. dev_err(dev, "Failed to inhibit Tx on ports\n");
  293. rc = -ENXIO;
  294. goto out;
  295. }
  296. /* Wait for an eventual egress packet to finish transmission
  297. * (reach IFG). It is guaranteed that a second one will not
  298. * follow, and that switch cold reset is thus safe
  299. */
  300. usleep_range(500, 1000);
  301. do {
  302. /* Put the SJA1105 in programming mode */
  303. rc = priv->info->reset_cmd(priv->ds);
  304. if (rc < 0) {
  305. dev_err(dev, "Failed to reset switch, retrying...\n");
  306. continue;
  307. }
  308. /* Wait for the switch to come out of reset */
  309. usleep_range(1000, 5000);
  310. /* Upload the static config to the device */
  311. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->config,
  312. config_buf, buf_len);
  313. if (rc < 0) {
  314. dev_err(dev, "Failed to upload config, retrying...\n");
  315. continue;
  316. }
  317. /* Check that SJA1105 responded well to the config upload */
  318. rc = sja1105_status_get(priv, &status);
  319. if (rc < 0)
  320. continue;
  321. if (status.ids == 1) {
  322. dev_err(dev, "Mismatch between hardware and static config "
  323. "device id. Wrote 0x%llx, wants 0x%llx\n",
  324. config->device_id, priv->info->device_id);
  325. continue;
  326. }
  327. if (status.crcchkl == 1) {
  328. dev_err(dev, "Switch reported invalid local CRC on "
  329. "the uploaded config, retrying...\n");
  330. continue;
  331. }
  332. if (status.crcchkg == 1) {
  333. dev_err(dev, "Switch reported invalid global CRC on "
  334. "the uploaded config, retrying...\n");
  335. continue;
  336. }
  337. if (status.configs == 0) {
  338. dev_err(dev, "Switch reported that configuration is "
  339. "invalid, retrying...\n");
  340. continue;
  341. }
  342. /* Success! */
  343. break;
  344. } while (--retries);
  345. if (!retries) {
  346. rc = -EIO;
  347. dev_err(dev, "Failed to upload config to device, giving up\n");
  348. goto out;
  349. } else if (retries != RETRIES) {
  350. dev_info(dev, "Succeeded after %d tried\n", RETRIES - retries);
  351. }
  352. out:
  353. kfree(config_buf);
  354. return rc;
  355. }
  356. static const struct sja1105_regs sja1105et_regs = {
  357. .device_id = 0x0,
  358. .prod_id = 0x100BC3,
  359. .status = 0x1,
  360. .port_control = 0x11,
  361. .vl_status = 0x10000,
  362. .config = 0x020000,
  363. .rgu = 0x100440,
  364. /* UM10944.pdf, Table 86, ACU Register overview */
  365. .pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
  366. .pad_mii_rx = {0x100801, 0x100803, 0x100805, 0x100807, 0x100809},
  367. .rmii_pll1 = 0x10000A,
  368. .cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
  369. .stats[MAC] = {0x200, 0x202, 0x204, 0x206, 0x208},
  370. .stats[HL1] = {0x400, 0x410, 0x420, 0x430, 0x440},
  371. .stats[HL2] = {0x600, 0x610, 0x620, 0x630, 0x640},
  372. /* UM10944.pdf, Table 78, CGU Register overview */
  373. .mii_tx_clk = {0x100013, 0x10001A, 0x100021, 0x100028, 0x10002F},
  374. .mii_rx_clk = {0x100014, 0x10001B, 0x100022, 0x100029, 0x100030},
  375. .mii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
  376. .mii_ext_rx_clk = {0x100019, 0x100020, 0x100027, 0x10002E, 0x100035},
  377. .rgmii_tx_clk = {0x100016, 0x10001D, 0x100024, 0x10002B, 0x100032},
  378. .rmii_ref_clk = {0x100015, 0x10001C, 0x100023, 0x10002A, 0x100031},
  379. .rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
  380. .ptpegr_ts = {0xC0, 0xC2, 0xC4, 0xC6, 0xC8},
  381. .ptpschtm = 0x12, /* Spans 0x12 to 0x13 */
  382. .ptppinst = 0x14,
  383. .ptppindur = 0x16,
  384. .ptp_control = 0x17,
  385. .ptpclkval = 0x18, /* Spans 0x18 to 0x19 */
  386. .ptpclkrate = 0x1A,
  387. .ptpclkcorp = 0x1D,
  388. .mdio_100base_tx = SJA1105_RSV_ADDR,
  389. .mdio_100base_t1 = SJA1105_RSV_ADDR,
  390. };
  391. static const struct sja1105_regs sja1105pqrs_regs = {
  392. .device_id = 0x0,
  393. .prod_id = 0x100BC3,
  394. .status = 0x1,
  395. .port_control = 0x12,
  396. .vl_status = 0x10000,
  397. .config = 0x020000,
  398. .rgu = 0x100440,
  399. /* UM10944.pdf, Table 86, ACU Register overview */
  400. .pad_mii_tx = {0x100800, 0x100802, 0x100804, 0x100806, 0x100808},
  401. .pad_mii_rx = {0x100801, 0x100803, 0x100805, 0x100807, 0x100809},
  402. .pad_mii_id = {0x100810, 0x100811, 0x100812, 0x100813, 0x100814},
  403. .rmii_pll1 = 0x10000A,
  404. .cgu_idiv = {0x10000B, 0x10000C, 0x10000D, 0x10000E, 0x10000F},
  405. .stats[MAC] = {0x200, 0x202, 0x204, 0x206, 0x208},
  406. .stats[HL1] = {0x400, 0x410, 0x420, 0x430, 0x440},
  407. .stats[HL2] = {0x600, 0x610, 0x620, 0x630, 0x640},
  408. .stats[ETHER] = {0x1400, 0x1418, 0x1430, 0x1448, 0x1460},
  409. /* UM11040.pdf, Table 114 */
  410. .mii_tx_clk = {0x100013, 0x100019, 0x10001F, 0x100025, 0x10002B},
  411. .mii_rx_clk = {0x100014, 0x10001A, 0x100020, 0x100026, 0x10002C},
  412. .mii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
  413. .mii_ext_rx_clk = {0x100018, 0x10001E, 0x100024, 0x10002A, 0x100030},
  414. .rgmii_tx_clk = {0x100016, 0x10001C, 0x100022, 0x100028, 0x10002E},
  415. .rmii_ref_clk = {0x100015, 0x10001B, 0x100021, 0x100027, 0x10002D},
  416. .rmii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},
  417. .ptpegr_ts = {0xC0, 0xC4, 0xC8, 0xCC, 0xD0},
  418. .ptpschtm = 0x13, /* Spans 0x13 to 0x14 */
  419. .ptppinst = 0x15,
  420. .ptppindur = 0x17,
  421. .ptp_control = 0x18,
  422. .ptpclkval = 0x19,
  423. .ptpclkrate = 0x1B,
  424. .ptpclkcorp = 0x1E,
  425. .ptpsyncts = 0x1F,
  426. .mdio_100base_tx = SJA1105_RSV_ADDR,
  427. .mdio_100base_t1 = SJA1105_RSV_ADDR,
  428. };
  429. static const struct sja1105_regs sja1110_regs = {
  430. .device_id = SJA1110_SPI_ADDR(0x0),
  431. .prod_id = SJA1110_ACU_ADDR(0xf00),
  432. .status = SJA1110_SPI_ADDR(0x4),
  433. .port_control = SJA1110_SPI_ADDR(0x50), /* actually INHIB_TX */
  434. .vl_status = 0x10000,
  435. .config = 0x020000,
  436. .rgu = SJA1110_RGU_ADDR(0x100), /* Reset Control Register 0 */
  437. /* Ports 2 and 3 are capable of xMII, but there isn't anything to
  438. * configure in the CGU/ACU for them.
  439. */
  440. .pad_mii_tx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  441. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  442. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  443. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  444. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  445. SJA1105_RSV_ADDR},
  446. .pad_mii_rx = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  447. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  448. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  449. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  450. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  451. SJA1105_RSV_ADDR},
  452. .pad_mii_id = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  453. SJA1110_ACU_ADDR(0x18), SJA1110_ACU_ADDR(0x28),
  454. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  455. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  456. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  457. SJA1105_RSV_ADDR},
  458. .rmii_pll1 = SJA1105_RSV_ADDR,
  459. .cgu_idiv = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  460. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  461. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  462. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  463. .stats[MAC] = {0x200, 0x202, 0x204, 0x206, 0x208, 0x20a,
  464. 0x20c, 0x20e, 0x210, 0x212, 0x214},
  465. .stats[HL1] = {0x400, 0x410, 0x420, 0x430, 0x440, 0x450,
  466. 0x460, 0x470, 0x480, 0x490, 0x4a0},
  467. .stats[HL2] = {0x600, 0x610, 0x620, 0x630, 0x640, 0x650,
  468. 0x660, 0x670, 0x680, 0x690, 0x6a0},
  469. .stats[ETHER] = {0x1400, 0x1418, 0x1430, 0x1448, 0x1460, 0x1478,
  470. 0x1490, 0x14a8, 0x14c0, 0x14d8, 0x14f0},
  471. .mii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  472. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  473. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  474. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  475. .mii_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  476. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  477. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  478. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  479. .mii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  480. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  481. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  482. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  483. .mii_ext_rx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  484. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  485. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  486. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  487. .rgmii_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  488. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  489. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  490. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  491. .rmii_ref_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  492. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  493. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  494. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  495. .rmii_ext_tx_clk = {SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  496. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  497. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  498. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  499. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  500. SJA1105_RSV_ADDR},
  501. .ptpschtm = SJA1110_SPI_ADDR(0x54),
  502. .ptppinst = SJA1110_SPI_ADDR(0x5c),
  503. .ptppindur = SJA1110_SPI_ADDR(0x64),
  504. .ptp_control = SJA1110_SPI_ADDR(0x68),
  505. .ptpclkval = SJA1110_SPI_ADDR(0x6c),
  506. .ptpclkrate = SJA1110_SPI_ADDR(0x74),
  507. .ptpclkcorp = SJA1110_SPI_ADDR(0x80),
  508. .ptpsyncts = SJA1110_SPI_ADDR(0x84),
  509. .mdio_100base_tx = 0x1c2400,
  510. .mdio_100base_t1 = 0x1c1000,
  511. .pcs_base = {SJA1105_RSV_ADDR, 0x1c1400, 0x1c1800, 0x1c1c00, 0x1c2000,
  512. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR,
  513. SJA1105_RSV_ADDR, SJA1105_RSV_ADDR, SJA1105_RSV_ADDR},
  514. };
  515. const struct sja1105_info sja1105e_info = {
  516. .device_id = SJA1105E_DEVICE_ID,
  517. .part_no = SJA1105ET_PART_NO,
  518. .static_ops = sja1105e_table_ops,
  519. .dyn_ops = sja1105et_dyn_ops,
  520. .tag_proto = DSA_TAG_PROTO_SJA1105,
  521. .can_limit_mcast_flood = false,
  522. .ptp_ts_bits = 24,
  523. .ptpegr_ts_bytes = 4,
  524. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  525. .num_ports = SJA1105_NUM_PORTS,
  526. .num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT,
  527. .reset_cmd = sja1105et_reset_cmd,
  528. .fdb_add_cmd = sja1105et_fdb_add,
  529. .fdb_del_cmd = sja1105et_fdb_del,
  530. .ptp_cmd_packing = sja1105et_ptp_cmd_packing,
  531. .rxtstamp = sja1105_rxtstamp,
  532. .clocking_setup = sja1105_clocking_setup,
  533. .regs = &sja1105et_regs,
  534. .port_speed = {
  535. [SJA1105_SPEED_AUTO] = 0,
  536. [SJA1105_SPEED_10MBPS] = 3,
  537. [SJA1105_SPEED_100MBPS] = 2,
  538. [SJA1105_SPEED_1000MBPS] = 1,
  539. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  540. },
  541. .supports_mii = {true, true, true, true, true},
  542. .supports_rmii = {true, true, true, true, true},
  543. .supports_rgmii = {true, true, true, true, true},
  544. .name = "SJA1105E",
  545. };
  546. const struct sja1105_info sja1105t_info = {
  547. .device_id = SJA1105T_DEVICE_ID,
  548. .part_no = SJA1105ET_PART_NO,
  549. .static_ops = sja1105t_table_ops,
  550. .dyn_ops = sja1105et_dyn_ops,
  551. .tag_proto = DSA_TAG_PROTO_SJA1105,
  552. .can_limit_mcast_flood = false,
  553. .ptp_ts_bits = 24,
  554. .ptpegr_ts_bytes = 4,
  555. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  556. .num_ports = SJA1105_NUM_PORTS,
  557. .num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT,
  558. .reset_cmd = sja1105et_reset_cmd,
  559. .fdb_add_cmd = sja1105et_fdb_add,
  560. .fdb_del_cmd = sja1105et_fdb_del,
  561. .ptp_cmd_packing = sja1105et_ptp_cmd_packing,
  562. .rxtstamp = sja1105_rxtstamp,
  563. .clocking_setup = sja1105_clocking_setup,
  564. .regs = &sja1105et_regs,
  565. .port_speed = {
  566. [SJA1105_SPEED_AUTO] = 0,
  567. [SJA1105_SPEED_10MBPS] = 3,
  568. [SJA1105_SPEED_100MBPS] = 2,
  569. [SJA1105_SPEED_1000MBPS] = 1,
  570. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  571. },
  572. .supports_mii = {true, true, true, true, true},
  573. .supports_rmii = {true, true, true, true, true},
  574. .supports_rgmii = {true, true, true, true, true},
  575. .name = "SJA1105T",
  576. };
  577. const struct sja1105_info sja1105p_info = {
  578. .device_id = SJA1105PR_DEVICE_ID,
  579. .part_no = SJA1105P_PART_NO,
  580. .static_ops = sja1105p_table_ops,
  581. .dyn_ops = sja1105pqrs_dyn_ops,
  582. .tag_proto = DSA_TAG_PROTO_SJA1105,
  583. .can_limit_mcast_flood = true,
  584. .ptp_ts_bits = 32,
  585. .ptpegr_ts_bytes = 8,
  586. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  587. .num_ports = SJA1105_NUM_PORTS,
  588. .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
  589. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  590. .reset_cmd = sja1105pqrs_reset_cmd,
  591. .fdb_add_cmd = sja1105pqrs_fdb_add,
  592. .fdb_del_cmd = sja1105pqrs_fdb_del,
  593. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  594. .rxtstamp = sja1105_rxtstamp,
  595. .clocking_setup = sja1105_clocking_setup,
  596. .regs = &sja1105pqrs_regs,
  597. .port_speed = {
  598. [SJA1105_SPEED_AUTO] = 0,
  599. [SJA1105_SPEED_10MBPS] = 3,
  600. [SJA1105_SPEED_100MBPS] = 2,
  601. [SJA1105_SPEED_1000MBPS] = 1,
  602. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  603. },
  604. .supports_mii = {true, true, true, true, true},
  605. .supports_rmii = {true, true, true, true, true},
  606. .supports_rgmii = {true, true, true, true, true},
  607. .name = "SJA1105P",
  608. };
  609. const struct sja1105_info sja1105q_info = {
  610. .device_id = SJA1105QS_DEVICE_ID,
  611. .part_no = SJA1105Q_PART_NO,
  612. .static_ops = sja1105q_table_ops,
  613. .dyn_ops = sja1105pqrs_dyn_ops,
  614. .tag_proto = DSA_TAG_PROTO_SJA1105,
  615. .can_limit_mcast_flood = true,
  616. .ptp_ts_bits = 32,
  617. .ptpegr_ts_bytes = 8,
  618. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  619. .num_ports = SJA1105_NUM_PORTS,
  620. .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
  621. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  622. .reset_cmd = sja1105pqrs_reset_cmd,
  623. .fdb_add_cmd = sja1105pqrs_fdb_add,
  624. .fdb_del_cmd = sja1105pqrs_fdb_del,
  625. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  626. .rxtstamp = sja1105_rxtstamp,
  627. .clocking_setup = sja1105_clocking_setup,
  628. .regs = &sja1105pqrs_regs,
  629. .port_speed = {
  630. [SJA1105_SPEED_AUTO] = 0,
  631. [SJA1105_SPEED_10MBPS] = 3,
  632. [SJA1105_SPEED_100MBPS] = 2,
  633. [SJA1105_SPEED_1000MBPS] = 1,
  634. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  635. },
  636. .supports_mii = {true, true, true, true, true},
  637. .supports_rmii = {true, true, true, true, true},
  638. .supports_rgmii = {true, true, true, true, true},
  639. .name = "SJA1105Q",
  640. };
  641. const struct sja1105_info sja1105r_info = {
  642. .device_id = SJA1105PR_DEVICE_ID,
  643. .part_no = SJA1105R_PART_NO,
  644. .static_ops = sja1105r_table_ops,
  645. .dyn_ops = sja1105pqrs_dyn_ops,
  646. .tag_proto = DSA_TAG_PROTO_SJA1105,
  647. .can_limit_mcast_flood = true,
  648. .ptp_ts_bits = 32,
  649. .ptpegr_ts_bytes = 8,
  650. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  651. .num_ports = SJA1105_NUM_PORTS,
  652. .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
  653. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  654. .reset_cmd = sja1105pqrs_reset_cmd,
  655. .fdb_add_cmd = sja1105pqrs_fdb_add,
  656. .fdb_del_cmd = sja1105pqrs_fdb_del,
  657. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  658. .rxtstamp = sja1105_rxtstamp,
  659. .clocking_setup = sja1105_clocking_setup,
  660. .pcs_mdio_read = sja1105_pcs_mdio_read,
  661. .pcs_mdio_write = sja1105_pcs_mdio_write,
  662. .regs = &sja1105pqrs_regs,
  663. .port_speed = {
  664. [SJA1105_SPEED_AUTO] = 0,
  665. [SJA1105_SPEED_10MBPS] = 3,
  666. [SJA1105_SPEED_100MBPS] = 2,
  667. [SJA1105_SPEED_1000MBPS] = 1,
  668. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  669. },
  670. .supports_mii = {true, true, true, true, true},
  671. .supports_rmii = {true, true, true, true, true},
  672. .supports_rgmii = {true, true, true, true, true},
  673. .supports_sgmii = {false, false, false, false, true},
  674. .name = "SJA1105R",
  675. };
  676. const struct sja1105_info sja1105s_info = {
  677. .device_id = SJA1105QS_DEVICE_ID,
  678. .part_no = SJA1105S_PART_NO,
  679. .static_ops = sja1105s_table_ops,
  680. .dyn_ops = sja1105pqrs_dyn_ops,
  681. .regs = &sja1105pqrs_regs,
  682. .tag_proto = DSA_TAG_PROTO_SJA1105,
  683. .can_limit_mcast_flood = true,
  684. .ptp_ts_bits = 32,
  685. .ptpegr_ts_bytes = 8,
  686. .max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
  687. .num_ports = SJA1105_NUM_PORTS,
  688. .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
  689. .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
  690. .reset_cmd = sja1105pqrs_reset_cmd,
  691. .fdb_add_cmd = sja1105pqrs_fdb_add,
  692. .fdb_del_cmd = sja1105pqrs_fdb_del,
  693. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  694. .rxtstamp = sja1105_rxtstamp,
  695. .clocking_setup = sja1105_clocking_setup,
  696. .pcs_mdio_read = sja1105_pcs_mdio_read,
  697. .pcs_mdio_write = sja1105_pcs_mdio_write,
  698. .port_speed = {
  699. [SJA1105_SPEED_AUTO] = 0,
  700. [SJA1105_SPEED_10MBPS] = 3,
  701. [SJA1105_SPEED_100MBPS] = 2,
  702. [SJA1105_SPEED_1000MBPS] = 1,
  703. [SJA1105_SPEED_2500MBPS] = 0, /* Not supported */
  704. },
  705. .supports_mii = {true, true, true, true, true},
  706. .supports_rmii = {true, true, true, true, true},
  707. .supports_rgmii = {true, true, true, true, true},
  708. .supports_sgmii = {false, false, false, false, true},
  709. .name = "SJA1105S",
  710. };
  711. const struct sja1105_info sja1110a_info = {
  712. .device_id = SJA1110_DEVICE_ID,
  713. .part_no = SJA1110A_PART_NO,
  714. .static_ops = sja1110_table_ops,
  715. .dyn_ops = sja1110_dyn_ops,
  716. .regs = &sja1110_regs,
  717. .tag_proto = DSA_TAG_PROTO_SJA1110,
  718. .can_limit_mcast_flood = true,
  719. .multiple_cascade_ports = true,
  720. .fixed_cbs_mapping = true,
  721. .ptp_ts_bits = 32,
  722. .ptpegr_ts_bytes = 8,
  723. .max_frame_mem = SJA1110_MAX_FRAME_MEMORY,
  724. .num_ports = SJA1110_NUM_PORTS,
  725. .num_cbs_shapers = SJA1110_MAX_CBS_COUNT,
  726. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  727. .reset_cmd = sja1110_reset_cmd,
  728. .fdb_add_cmd = sja1105pqrs_fdb_add,
  729. .fdb_del_cmd = sja1105pqrs_fdb_del,
  730. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  731. .rxtstamp = sja1110_rxtstamp,
  732. .txtstamp = sja1110_txtstamp,
  733. .disable_microcontroller = sja1110_disable_microcontroller,
  734. .pcs_mdio_read = sja1110_pcs_mdio_read,
  735. .pcs_mdio_write = sja1110_pcs_mdio_write,
  736. .port_speed = {
  737. [SJA1105_SPEED_AUTO] = 0,
  738. [SJA1105_SPEED_10MBPS] = 4,
  739. [SJA1105_SPEED_100MBPS] = 3,
  740. [SJA1105_SPEED_1000MBPS] = 2,
  741. [SJA1105_SPEED_2500MBPS] = 1,
  742. },
  743. .supports_mii = {true, true, true, true, false,
  744. true, true, true, true, true, true},
  745. .supports_rmii = {false, false, true, true, false,
  746. false, false, false, false, false, false},
  747. .supports_rgmii = {false, false, true, true, false,
  748. false, false, false, false, false, false},
  749. .supports_sgmii = {false, true, true, true, true,
  750. false, false, false, false, false, false},
  751. .supports_2500basex = {false, false, false, true, true,
  752. false, false, false, false, false, false},
  753. .internal_phy = {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX,
  754. SJA1105_NO_PHY, SJA1105_NO_PHY,
  755. SJA1105_NO_PHY, SJA1105_PHY_BASE_T1,
  756. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  757. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  758. SJA1105_PHY_BASE_T1},
  759. .name = "SJA1110A",
  760. };
  761. const struct sja1105_info sja1110b_info = {
  762. .device_id = SJA1110_DEVICE_ID,
  763. .part_no = SJA1110B_PART_NO,
  764. .static_ops = sja1110_table_ops,
  765. .dyn_ops = sja1110_dyn_ops,
  766. .regs = &sja1110_regs,
  767. .tag_proto = DSA_TAG_PROTO_SJA1110,
  768. .can_limit_mcast_flood = true,
  769. .multiple_cascade_ports = true,
  770. .fixed_cbs_mapping = true,
  771. .ptp_ts_bits = 32,
  772. .ptpegr_ts_bytes = 8,
  773. .max_frame_mem = SJA1110_MAX_FRAME_MEMORY,
  774. .num_ports = SJA1110_NUM_PORTS,
  775. .num_cbs_shapers = SJA1110_MAX_CBS_COUNT,
  776. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  777. .reset_cmd = sja1110_reset_cmd,
  778. .fdb_add_cmd = sja1105pqrs_fdb_add,
  779. .fdb_del_cmd = sja1105pqrs_fdb_del,
  780. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  781. .rxtstamp = sja1110_rxtstamp,
  782. .txtstamp = sja1110_txtstamp,
  783. .disable_microcontroller = sja1110_disable_microcontroller,
  784. .pcs_mdio_read = sja1110_pcs_mdio_read,
  785. .pcs_mdio_write = sja1110_pcs_mdio_write,
  786. .port_speed = {
  787. [SJA1105_SPEED_AUTO] = 0,
  788. [SJA1105_SPEED_10MBPS] = 4,
  789. [SJA1105_SPEED_100MBPS] = 3,
  790. [SJA1105_SPEED_1000MBPS] = 2,
  791. [SJA1105_SPEED_2500MBPS] = 1,
  792. },
  793. .supports_mii = {true, true, true, true, false,
  794. true, true, true, true, true, false},
  795. .supports_rmii = {false, false, true, true, false,
  796. false, false, false, false, false, false},
  797. .supports_rgmii = {false, false, true, true, false,
  798. false, false, false, false, false, false},
  799. .supports_sgmii = {false, false, false, true, true,
  800. false, false, false, false, false, false},
  801. .supports_2500basex = {false, false, false, true, true,
  802. false, false, false, false, false, false},
  803. .internal_phy = {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX,
  804. SJA1105_NO_PHY, SJA1105_NO_PHY,
  805. SJA1105_NO_PHY, SJA1105_PHY_BASE_T1,
  806. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  807. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  808. SJA1105_NO_PHY},
  809. .name = "SJA1110B",
  810. };
  811. const struct sja1105_info sja1110c_info = {
  812. .device_id = SJA1110_DEVICE_ID,
  813. .part_no = SJA1110C_PART_NO,
  814. .static_ops = sja1110_table_ops,
  815. .dyn_ops = sja1110_dyn_ops,
  816. .regs = &sja1110_regs,
  817. .tag_proto = DSA_TAG_PROTO_SJA1110,
  818. .can_limit_mcast_flood = true,
  819. .multiple_cascade_ports = true,
  820. .fixed_cbs_mapping = true,
  821. .ptp_ts_bits = 32,
  822. .ptpegr_ts_bytes = 8,
  823. .max_frame_mem = SJA1110_MAX_FRAME_MEMORY,
  824. .num_ports = SJA1110_NUM_PORTS,
  825. .num_cbs_shapers = SJA1110_MAX_CBS_COUNT,
  826. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  827. .reset_cmd = sja1110_reset_cmd,
  828. .fdb_add_cmd = sja1105pqrs_fdb_add,
  829. .fdb_del_cmd = sja1105pqrs_fdb_del,
  830. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  831. .rxtstamp = sja1110_rxtstamp,
  832. .txtstamp = sja1110_txtstamp,
  833. .disable_microcontroller = sja1110_disable_microcontroller,
  834. .pcs_mdio_read = sja1110_pcs_mdio_read,
  835. .pcs_mdio_write = sja1110_pcs_mdio_write,
  836. .port_speed = {
  837. [SJA1105_SPEED_AUTO] = 0,
  838. [SJA1105_SPEED_10MBPS] = 4,
  839. [SJA1105_SPEED_100MBPS] = 3,
  840. [SJA1105_SPEED_1000MBPS] = 2,
  841. [SJA1105_SPEED_2500MBPS] = 1,
  842. },
  843. .supports_mii = {true, true, true, true, false,
  844. true, true, true, false, false, false},
  845. .supports_rmii = {false, false, true, true, false,
  846. false, false, false, false, false, false},
  847. .supports_rgmii = {false, false, true, true, false,
  848. false, false, false, false, false, false},
  849. .supports_sgmii = {false, false, false, false, true,
  850. false, false, false, false, false, false},
  851. .supports_2500basex = {false, false, false, false, true,
  852. false, false, false, false, false, false},
  853. .internal_phy = {SJA1105_NO_PHY, SJA1105_PHY_BASE_TX,
  854. SJA1105_NO_PHY, SJA1105_NO_PHY,
  855. SJA1105_NO_PHY, SJA1105_PHY_BASE_T1,
  856. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  857. SJA1105_NO_PHY, SJA1105_NO_PHY,
  858. SJA1105_NO_PHY},
  859. .name = "SJA1110C",
  860. };
  861. const struct sja1105_info sja1110d_info = {
  862. .device_id = SJA1110_DEVICE_ID,
  863. .part_no = SJA1110D_PART_NO,
  864. .static_ops = sja1110_table_ops,
  865. .dyn_ops = sja1110_dyn_ops,
  866. .regs = &sja1110_regs,
  867. .tag_proto = DSA_TAG_PROTO_SJA1110,
  868. .can_limit_mcast_flood = true,
  869. .multiple_cascade_ports = true,
  870. .fixed_cbs_mapping = true,
  871. .ptp_ts_bits = 32,
  872. .ptpegr_ts_bytes = 8,
  873. .max_frame_mem = SJA1110_MAX_FRAME_MEMORY,
  874. .num_ports = SJA1110_NUM_PORTS,
  875. .num_cbs_shapers = SJA1110_MAX_CBS_COUNT,
  876. .setup_rgmii_delay = sja1110_setup_rgmii_delay,
  877. .reset_cmd = sja1110_reset_cmd,
  878. .fdb_add_cmd = sja1105pqrs_fdb_add,
  879. .fdb_del_cmd = sja1105pqrs_fdb_del,
  880. .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing,
  881. .rxtstamp = sja1110_rxtstamp,
  882. .txtstamp = sja1110_txtstamp,
  883. .disable_microcontroller = sja1110_disable_microcontroller,
  884. .pcs_mdio_read = sja1110_pcs_mdio_read,
  885. .pcs_mdio_write = sja1110_pcs_mdio_write,
  886. .port_speed = {
  887. [SJA1105_SPEED_AUTO] = 0,
  888. [SJA1105_SPEED_10MBPS] = 4,
  889. [SJA1105_SPEED_100MBPS] = 3,
  890. [SJA1105_SPEED_1000MBPS] = 2,
  891. [SJA1105_SPEED_2500MBPS] = 1,
  892. },
  893. .supports_mii = {true, false, true, false, false,
  894. true, true, true, false, false, false},
  895. .supports_rmii = {false, false, true, false, false,
  896. false, false, false, false, false, false},
  897. .supports_rgmii = {false, false, true, false, false,
  898. false, false, false, false, false, false},
  899. .supports_sgmii = {false, true, true, true, true,
  900. false, false, false, false, false, false},
  901. .supports_2500basex = {false, false, false, true, true,
  902. false, false, false, false, false, false},
  903. .internal_phy = {SJA1105_NO_PHY, SJA1105_NO_PHY,
  904. SJA1105_NO_PHY, SJA1105_NO_PHY,
  905. SJA1105_NO_PHY, SJA1105_PHY_BASE_T1,
  906. SJA1105_PHY_BASE_T1, SJA1105_PHY_BASE_T1,
  907. SJA1105_NO_PHY, SJA1105_NO_PHY,
  908. SJA1105_NO_PHY},
  909. .name = "SJA1110D",
  910. };