adin1110.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
  2. /* ADIN1110 Low Power 10BASE-T1L Ethernet MAC-PHY
  3. * ADIN2111 2-Port Ethernet Switch with Integrated 10BASE-T1L PHY
  4. *
  5. * Copyright 2021 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bits.h>
  9. #include <linux/cache.h>
  10. #include <linux/crc8.h>
  11. #include <linux/etherdevice.h>
  12. #include <linux/ethtool.h>
  13. #include <linux/gpio/consumer.h>
  14. #include <linux/if_bridge.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/iopoll.h>
  17. #include <linux/kernel.h>
  18. #include <linux/mii.h>
  19. #include <linux/module.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/regulator/consumer.h>
  22. #include <linux/phy.h>
  23. #include <linux/property.h>
  24. #include <linux/spi/spi.h>
  25. #include <net/switchdev.h>
  26. #include <linux/unaligned.h>
  27. #define ADIN1110_PHY_ID 0x1
  28. #define ADIN1110_RESET 0x03
  29. #define ADIN1110_SWRESET BIT(0)
  30. #define ADIN1110_CONFIG1 0x04
  31. #define ADIN1110_CONFIG1_SYNC BIT(15)
  32. #define ADIN1110_CONFIG2 0x06
  33. #define ADIN2111_P2_FWD_UNK2HOST BIT(12)
  34. #define ADIN2111_PORT_CUT_THRU_EN BIT(11)
  35. #define ADIN1110_CRC_APPEND BIT(5)
  36. #define ADIN1110_FWD_UNK2HOST BIT(2)
  37. #define ADIN1110_STATUS0 0x08
  38. #define ADIN1110_STATUS1 0x09
  39. #define ADIN2111_P2_RX_RDY BIT(17)
  40. #define ADIN1110_SPI_ERR BIT(10)
  41. #define ADIN1110_RX_RDY BIT(4)
  42. #define ADIN1110_IMASK1 0x0D
  43. #define ADIN2111_RX_RDY_IRQ BIT(17)
  44. #define ADIN1110_SPI_ERR_IRQ BIT(10)
  45. #define ADIN1110_RX_RDY_IRQ BIT(4)
  46. #define ADIN1110_TX_RDY_IRQ BIT(3)
  47. #define ADIN1110_MDIOACC 0x20
  48. #define ADIN1110_MDIO_TRDONE BIT(31)
  49. #define ADIN1110_MDIO_ST GENMASK(29, 28)
  50. #define ADIN1110_MDIO_OP GENMASK(27, 26)
  51. #define ADIN1110_MDIO_PRTAD GENMASK(25, 21)
  52. #define ADIN1110_MDIO_DEVAD GENMASK(20, 16)
  53. #define ADIN1110_MDIO_DATA GENMASK(15, 0)
  54. #define ADIN1110_TX_FSIZE 0x30
  55. #define ADIN1110_TX 0x31
  56. #define ADIN1110_TX_SPACE 0x32
  57. #define ADIN1110_MAC_ADDR_FILTER_UPR 0x50
  58. #define ADIN2111_MAC_ADDR_APPLY2PORT2 BIT(31)
  59. #define ADIN1110_MAC_ADDR_APPLY2PORT BIT(30)
  60. #define ADIN2111_MAC_ADDR_TO_OTHER_PORT BIT(17)
  61. #define ADIN1110_MAC_ADDR_TO_HOST BIT(16)
  62. #define ADIN1110_MAC_ADDR_FILTER_LWR 0x51
  63. #define ADIN1110_MAC_ADDR_MASK_UPR 0x70
  64. #define ADIN1110_MAC_ADDR_MASK_LWR 0x71
  65. #define ADIN1110_RX_FSIZE 0x90
  66. #define ADIN1110_RX 0x91
  67. #define ADIN2111_RX_P2_FSIZE 0xC0
  68. #define ADIN2111_RX_P2 0xC1
  69. #define ADIN1110_CLEAR_STATUS0 0xFFF
  70. /* MDIO_OP codes */
  71. #define ADIN1110_MDIO_OP_WR 0x1
  72. #define ADIN1110_MDIO_OP_RD 0x3
  73. #define ADIN1110_CD BIT(7)
  74. #define ADIN1110_WRITE BIT(5)
  75. #define ADIN1110_MAX_BUFF 2048
  76. #define ADIN1110_MAX_FRAMES_READ 64
  77. #define ADIN1110_WR_HEADER_LEN 2
  78. #define ADIN1110_FRAME_HEADER_LEN 2
  79. #define ADIN1110_INTERNAL_SIZE_HEADER_LEN 2
  80. #define ADIN1110_RD_HEADER_LEN 3
  81. #define ADIN1110_REG_LEN 4
  82. #define ADIN1110_FEC_LEN 4
  83. #define ADIN1110_PHY_ID_VAL 0x0283BC91
  84. #define ADIN2111_PHY_ID_VAL 0x0283BCA1
  85. #define ADIN_MAC_MAX_PORTS 2
  86. #define ADIN_MAC_MAX_ADDR_SLOTS 16
  87. #define ADIN_MAC_MULTICAST_ADDR_SLOT 0
  88. #define ADIN_MAC_BROADCAST_ADDR_SLOT 1
  89. #define ADIN_MAC_P1_ADDR_SLOT 2
  90. #define ADIN_MAC_P2_ADDR_SLOT 3
  91. #define ADIN_MAC_FDB_ADDR_SLOT 4
  92. DECLARE_CRC8_TABLE(adin1110_crc_table);
  93. enum adin1110_chips_id {
  94. ADIN1110_MAC = 0,
  95. ADIN2111_MAC,
  96. };
  97. struct adin1110_cfg {
  98. enum adin1110_chips_id id;
  99. const char *name;
  100. u32 phy_ids[PHY_MAX_ADDR];
  101. u32 ports_nr;
  102. u32 phy_id_val;
  103. };
  104. struct adin1110_port_priv {
  105. struct adin1110_priv *priv;
  106. struct net_device *netdev;
  107. struct net_device *bridge;
  108. struct phy_device *phydev;
  109. struct work_struct tx_work;
  110. u64 rx_packets;
  111. u64 tx_packets;
  112. u64 rx_bytes;
  113. u64 tx_bytes;
  114. struct work_struct rx_mode_work;
  115. u32 flags;
  116. struct sk_buff_head txq;
  117. u32 nr;
  118. u32 state;
  119. struct adin1110_cfg *cfg;
  120. };
  121. struct adin1110_priv {
  122. struct mutex lock; /* protect spi */
  123. spinlock_t state_lock; /* protect RX mode */
  124. struct mii_bus *mii_bus;
  125. struct spi_device *spidev;
  126. bool append_crc;
  127. struct adin1110_cfg *cfg;
  128. u32 tx_space;
  129. u32 irq_mask;
  130. bool forwarding;
  131. int irq;
  132. struct adin1110_port_priv *ports[ADIN_MAC_MAX_PORTS];
  133. char mii_bus_name[MII_BUS_ID_SIZE];
  134. u8 data[ADIN1110_MAX_BUFF] ____cacheline_aligned;
  135. };
  136. struct adin1110_switchdev_event_work {
  137. struct work_struct work;
  138. struct switchdev_notifier_fdb_info fdb_info;
  139. struct adin1110_port_priv *port_priv;
  140. unsigned long event;
  141. };
  142. static struct adin1110_cfg adin1110_cfgs[] = {
  143. {
  144. .id = ADIN1110_MAC,
  145. .name = "adin1110",
  146. .phy_ids = {1},
  147. .ports_nr = 1,
  148. .phy_id_val = ADIN1110_PHY_ID_VAL,
  149. },
  150. {
  151. .id = ADIN2111_MAC,
  152. .name = "adin2111",
  153. .phy_ids = {1, 2},
  154. .ports_nr = 2,
  155. .phy_id_val = ADIN2111_PHY_ID_VAL,
  156. },
  157. };
  158. static u8 adin1110_crc_data(u8 *data, u32 len)
  159. {
  160. return crc8(adin1110_crc_table, data, len, 0);
  161. }
  162. static int adin1110_read_reg(struct adin1110_priv *priv, u16 reg, u32 *val)
  163. {
  164. u32 header_len = ADIN1110_RD_HEADER_LEN;
  165. u32 read_len = ADIN1110_REG_LEN;
  166. struct spi_transfer t = {0};
  167. int ret;
  168. priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg);
  169. priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
  170. priv->data[2] = 0x00;
  171. if (priv->append_crc) {
  172. priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
  173. priv->data[3] = 0x00;
  174. header_len++;
  175. }
  176. if (priv->append_crc)
  177. read_len++;
  178. memset(&priv->data[header_len], 0, read_len);
  179. t.tx_buf = &priv->data[0];
  180. t.rx_buf = &priv->data[0];
  181. t.len = read_len + header_len;
  182. ret = spi_sync_transfer(priv->spidev, &t, 1);
  183. if (ret)
  184. return ret;
  185. if (priv->append_crc) {
  186. u8 recv_crc;
  187. u8 crc;
  188. crc = adin1110_crc_data(&priv->data[header_len],
  189. ADIN1110_REG_LEN);
  190. recv_crc = priv->data[header_len + ADIN1110_REG_LEN];
  191. if (crc != recv_crc) {
  192. dev_err_ratelimited(&priv->spidev->dev, "CRC error.");
  193. return -EBADMSG;
  194. }
  195. }
  196. *val = get_unaligned_be32(&priv->data[header_len]);
  197. return ret;
  198. }
  199. static int adin1110_write_reg(struct adin1110_priv *priv, u16 reg, u32 val)
  200. {
  201. u32 header_len = ADIN1110_WR_HEADER_LEN;
  202. u32 write_len = ADIN1110_REG_LEN;
  203. priv->data[0] = ADIN1110_CD | ADIN1110_WRITE | FIELD_GET(GENMASK(12, 8), reg);
  204. priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
  205. if (priv->append_crc) {
  206. priv->data[2] = adin1110_crc_data(&priv->data[0], header_len);
  207. header_len++;
  208. }
  209. put_unaligned_be32(val, &priv->data[header_len]);
  210. if (priv->append_crc) {
  211. priv->data[header_len + write_len] = adin1110_crc_data(&priv->data[header_len],
  212. write_len);
  213. write_len++;
  214. }
  215. return spi_write(priv->spidev, &priv->data[0], header_len + write_len);
  216. }
  217. static int adin1110_set_bits(struct adin1110_priv *priv, u16 reg,
  218. unsigned long mask, unsigned long val)
  219. {
  220. u32 write_val;
  221. int ret;
  222. ret = adin1110_read_reg(priv, reg, &write_val);
  223. if (ret < 0)
  224. return ret;
  225. set_mask_bits(&write_val, mask, val);
  226. return adin1110_write_reg(priv, reg, write_val);
  227. }
  228. static int adin1110_round_len(int len)
  229. {
  230. /* can read/write only mutiples of 4 bytes of payload */
  231. len = ALIGN(len, 4);
  232. /* NOTE: ADIN1110_WR_HEADER_LEN should be used for write ops. */
  233. if (len + ADIN1110_RD_HEADER_LEN > ADIN1110_MAX_BUFF)
  234. return -EINVAL;
  235. return len;
  236. }
  237. static int adin1110_read_fifo(struct adin1110_port_priv *port_priv)
  238. {
  239. struct adin1110_priv *priv = port_priv->priv;
  240. u32 header_len = ADIN1110_RD_HEADER_LEN;
  241. struct spi_transfer t = {0};
  242. u32 frame_size_no_fcs;
  243. struct sk_buff *rxb;
  244. u32 frame_size;
  245. int round_len;
  246. u16 reg;
  247. int ret;
  248. if (!port_priv->nr) {
  249. reg = ADIN1110_RX;
  250. ret = adin1110_read_reg(priv, ADIN1110_RX_FSIZE, &frame_size);
  251. } else {
  252. reg = ADIN2111_RX_P2;
  253. ret = adin1110_read_reg(priv, ADIN2111_RX_P2_FSIZE,
  254. &frame_size);
  255. }
  256. if (ret < 0)
  257. return ret;
  258. /* The read frame size includes the extra 2 bytes
  259. * from the ADIN1110 frame header.
  260. */
  261. if (frame_size < ADIN1110_FRAME_HEADER_LEN + ADIN1110_FEC_LEN)
  262. return -EINVAL;
  263. round_len = adin1110_round_len(frame_size);
  264. if (round_len < 0)
  265. return -EINVAL;
  266. frame_size_no_fcs = frame_size - ADIN1110_FRAME_HEADER_LEN - ADIN1110_FEC_LEN;
  267. memset(priv->data, 0, ADIN1110_RD_HEADER_LEN);
  268. priv->data[0] = ADIN1110_CD | FIELD_GET(GENMASK(12, 8), reg);
  269. priv->data[1] = FIELD_GET(GENMASK(7, 0), reg);
  270. if (priv->append_crc) {
  271. priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
  272. header_len++;
  273. }
  274. rxb = netdev_alloc_skb(port_priv->netdev, round_len + header_len);
  275. if (!rxb)
  276. return -ENOMEM;
  277. skb_put(rxb, frame_size_no_fcs + header_len + ADIN1110_FRAME_HEADER_LEN);
  278. t.tx_buf = &priv->data[0];
  279. t.rx_buf = &rxb->data[0];
  280. t.len = header_len + round_len;
  281. ret = spi_sync_transfer(priv->spidev, &t, 1);
  282. if (ret) {
  283. kfree_skb(rxb);
  284. return ret;
  285. }
  286. skb_pull(rxb, header_len + ADIN1110_FRAME_HEADER_LEN);
  287. rxb->protocol = eth_type_trans(rxb, port_priv->netdev);
  288. if ((port_priv->flags & IFF_ALLMULTI && rxb->pkt_type == PACKET_MULTICAST) ||
  289. (port_priv->flags & IFF_BROADCAST && rxb->pkt_type == PACKET_BROADCAST))
  290. rxb->offload_fwd_mark = port_priv->priv->forwarding;
  291. netif_rx(rxb);
  292. port_priv->rx_bytes += frame_size - ADIN1110_FRAME_HEADER_LEN;
  293. port_priv->rx_packets++;
  294. return 0;
  295. }
  296. static int adin1110_write_fifo(struct adin1110_port_priv *port_priv,
  297. struct sk_buff *txb)
  298. {
  299. struct adin1110_priv *priv = port_priv->priv;
  300. u32 header_len = ADIN1110_WR_HEADER_LEN;
  301. __be16 frame_header;
  302. int padding = 0;
  303. int padded_len;
  304. int round_len;
  305. int ret;
  306. /* Pad frame to 64 byte length,
  307. * MAC nor PHY will otherwise add the
  308. * required padding.
  309. * The FEC will be added by the MAC internally.
  310. */
  311. if (txb->len + ADIN1110_FEC_LEN < 64)
  312. padding = 64 - (txb->len + ADIN1110_FEC_LEN);
  313. padded_len = txb->len + padding + ADIN1110_FRAME_HEADER_LEN;
  314. round_len = adin1110_round_len(padded_len);
  315. if (round_len < 0)
  316. return round_len;
  317. ret = adin1110_write_reg(priv, ADIN1110_TX_FSIZE, padded_len);
  318. if (ret < 0)
  319. return ret;
  320. memset(priv->data, 0, round_len + ADIN1110_WR_HEADER_LEN);
  321. priv->data[0] = ADIN1110_CD | ADIN1110_WRITE;
  322. priv->data[0] |= FIELD_GET(GENMASK(12, 8), ADIN1110_TX);
  323. priv->data[1] = FIELD_GET(GENMASK(7, 0), ADIN1110_TX);
  324. if (priv->append_crc) {
  325. priv->data[2] = adin1110_crc_data(&priv->data[0], 2);
  326. header_len++;
  327. }
  328. /* mention the port on which to send the frame in the frame header */
  329. frame_header = cpu_to_be16(port_priv->nr);
  330. memcpy(&priv->data[header_len], &frame_header,
  331. ADIN1110_FRAME_HEADER_LEN);
  332. memcpy(&priv->data[header_len + ADIN1110_FRAME_HEADER_LEN],
  333. txb->data, txb->len);
  334. ret = spi_write(priv->spidev, &priv->data[0], round_len + header_len);
  335. if (ret < 0)
  336. return ret;
  337. port_priv->tx_bytes += txb->len;
  338. port_priv->tx_packets++;
  339. return 0;
  340. }
  341. static int adin1110_read_mdio_acc(struct adin1110_priv *priv)
  342. {
  343. u32 val;
  344. int ret;
  345. mutex_lock(&priv->lock);
  346. ret = adin1110_read_reg(priv, ADIN1110_MDIOACC, &val);
  347. mutex_unlock(&priv->lock);
  348. if (ret < 0)
  349. return 0;
  350. return val;
  351. }
  352. static int adin1110_mdio_read(struct mii_bus *bus, int phy_id, int reg)
  353. {
  354. struct adin1110_priv *priv = bus->priv;
  355. u32 val = 0;
  356. int ret;
  357. if (mdio_phy_id_is_c45(phy_id))
  358. return -EOPNOTSUPP;
  359. val |= FIELD_PREP(ADIN1110_MDIO_OP, ADIN1110_MDIO_OP_RD);
  360. val |= FIELD_PREP(ADIN1110_MDIO_ST, 0x1);
  361. val |= FIELD_PREP(ADIN1110_MDIO_PRTAD, phy_id);
  362. val |= FIELD_PREP(ADIN1110_MDIO_DEVAD, reg);
  363. /* write the clause 22 read command to the chip */
  364. mutex_lock(&priv->lock);
  365. ret = adin1110_write_reg(priv, ADIN1110_MDIOACC, val);
  366. mutex_unlock(&priv->lock);
  367. if (ret < 0)
  368. return ret;
  369. /* ADIN1110_MDIO_TRDONE BIT of the ADIN1110_MDIOACC
  370. * register is set when the read is done.
  371. * After the transaction is done, ADIN1110_MDIO_DATA
  372. * bitfield of ADIN1110_MDIOACC register will contain
  373. * the requested register value.
  374. */
  375. ret = readx_poll_timeout_atomic(adin1110_read_mdio_acc, priv, val,
  376. (val & ADIN1110_MDIO_TRDONE),
  377. 100, 30000);
  378. if (ret < 0)
  379. return ret;
  380. return (val & ADIN1110_MDIO_DATA);
  381. }
  382. static int adin1110_mdio_write(struct mii_bus *bus, int phy_id,
  383. int reg, u16 reg_val)
  384. {
  385. struct adin1110_priv *priv = bus->priv;
  386. u32 val = 0;
  387. int ret;
  388. if (mdio_phy_id_is_c45(phy_id))
  389. return -EOPNOTSUPP;
  390. val |= FIELD_PREP(ADIN1110_MDIO_OP, ADIN1110_MDIO_OP_WR);
  391. val |= FIELD_PREP(ADIN1110_MDIO_ST, 0x1);
  392. val |= FIELD_PREP(ADIN1110_MDIO_PRTAD, phy_id);
  393. val |= FIELD_PREP(ADIN1110_MDIO_DEVAD, reg);
  394. val |= FIELD_PREP(ADIN1110_MDIO_DATA, reg_val);
  395. /* write the clause 22 write command to the chip */
  396. mutex_lock(&priv->lock);
  397. ret = adin1110_write_reg(priv, ADIN1110_MDIOACC, val);
  398. mutex_unlock(&priv->lock);
  399. if (ret < 0)
  400. return ret;
  401. return readx_poll_timeout_atomic(adin1110_read_mdio_acc, priv, val,
  402. (val & ADIN1110_MDIO_TRDONE),
  403. 100, 30000);
  404. }
  405. /* ADIN1110 MAC-PHY contains an ADIN1100 PHY.
  406. * ADIN2111 MAC-PHY contains two ADIN1100 PHYs.
  407. * By registering a new MDIO bus we allow the PAL to discover
  408. * the encapsulated PHY and probe the ADIN1100 driver.
  409. */
  410. static int adin1110_register_mdiobus(struct adin1110_priv *priv,
  411. struct device *dev)
  412. {
  413. struct mii_bus *mii_bus;
  414. int ret;
  415. mii_bus = devm_mdiobus_alloc(dev);
  416. if (!mii_bus)
  417. return -ENOMEM;
  418. snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u",
  419. priv->cfg->name, spi_get_chipselect(priv->spidev, 0));
  420. mii_bus->name = priv->mii_bus_name;
  421. mii_bus->read = adin1110_mdio_read;
  422. mii_bus->write = adin1110_mdio_write;
  423. mii_bus->priv = priv;
  424. mii_bus->parent = dev;
  425. mii_bus->phy_mask = ~((u32)GENMASK(2, 0));
  426. snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
  427. ret = devm_mdiobus_register(dev, mii_bus);
  428. if (ret)
  429. return ret;
  430. priv->mii_bus = mii_bus;
  431. return 0;
  432. }
  433. static bool adin1110_port_rx_ready(struct adin1110_port_priv *port_priv,
  434. u32 status)
  435. {
  436. if (!netif_oper_up(port_priv->netdev))
  437. return false;
  438. if (!port_priv->nr)
  439. return !!(status & ADIN1110_RX_RDY);
  440. else
  441. return !!(status & ADIN2111_P2_RX_RDY);
  442. }
  443. static void adin1110_read_frames(struct adin1110_port_priv *port_priv,
  444. unsigned int budget)
  445. {
  446. struct adin1110_priv *priv = port_priv->priv;
  447. u32 status1;
  448. int ret;
  449. while (budget) {
  450. ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
  451. if (ret < 0)
  452. return;
  453. if (!adin1110_port_rx_ready(port_priv, status1))
  454. break;
  455. ret = adin1110_read_fifo(port_priv);
  456. if (ret < 0)
  457. return;
  458. budget--;
  459. }
  460. }
  461. static void adin1110_wake_queues(struct adin1110_priv *priv)
  462. {
  463. int i;
  464. for (i = 0; i < priv->cfg->ports_nr; i++)
  465. netif_wake_queue(priv->ports[i]->netdev);
  466. }
  467. static irqreturn_t adin1110_irq(int irq, void *p)
  468. {
  469. struct adin1110_priv *priv = p;
  470. u32 status1;
  471. u32 val;
  472. int ret;
  473. int i;
  474. mutex_lock(&priv->lock);
  475. ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
  476. if (ret < 0)
  477. goto out;
  478. if (priv->append_crc && (status1 & ADIN1110_SPI_ERR))
  479. dev_warn_ratelimited(&priv->spidev->dev,
  480. "SPI CRC error on write.\n");
  481. ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
  482. if (ret < 0)
  483. goto out;
  484. /* TX FIFO space is expressed in half-words */
  485. priv->tx_space = 2 * val;
  486. for (i = 0; i < priv->cfg->ports_nr; i++) {
  487. if (adin1110_port_rx_ready(priv->ports[i], status1))
  488. adin1110_read_frames(priv->ports[i],
  489. ADIN1110_MAX_FRAMES_READ);
  490. }
  491. /* clear IRQ sources */
  492. adin1110_write_reg(priv, ADIN1110_STATUS0, ADIN1110_CLEAR_STATUS0);
  493. adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask);
  494. out:
  495. mutex_unlock(&priv->lock);
  496. if (priv->tx_space > 0 && ret >= 0)
  497. adin1110_wake_queues(priv);
  498. return IRQ_HANDLED;
  499. }
  500. /* ADIN1110 can filter up to 16 MAC addresses, mac_nr here is the slot used */
  501. static int adin1110_write_mac_address(struct adin1110_port_priv *port_priv,
  502. int mac_nr, const u8 *addr,
  503. u8 *mask, u32 port_rules)
  504. {
  505. struct adin1110_priv *priv = port_priv->priv;
  506. u32 offset = mac_nr * 2;
  507. u32 port_rules_mask;
  508. int ret;
  509. u32 val;
  510. if (!port_priv->nr)
  511. port_rules_mask = ADIN1110_MAC_ADDR_APPLY2PORT;
  512. else
  513. port_rules_mask = ADIN2111_MAC_ADDR_APPLY2PORT2;
  514. if (port_rules & port_rules_mask)
  515. port_rules_mask |= ADIN1110_MAC_ADDR_TO_HOST | ADIN2111_MAC_ADDR_TO_OTHER_PORT;
  516. port_rules_mask |= GENMASK(15, 0);
  517. val = port_rules | get_unaligned_be16(&addr[0]);
  518. ret = adin1110_set_bits(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset,
  519. port_rules_mask, val);
  520. if (ret < 0)
  521. return ret;
  522. val = get_unaligned_be32(&addr[2]);
  523. ret = adin1110_write_reg(priv,
  524. ADIN1110_MAC_ADDR_FILTER_LWR + offset, val);
  525. if (ret < 0)
  526. return ret;
  527. /* Only the first two MAC address slots support masking. */
  528. if (mac_nr < ADIN_MAC_P1_ADDR_SLOT) {
  529. val = get_unaligned_be16(&mask[0]);
  530. ret = adin1110_write_reg(priv,
  531. ADIN1110_MAC_ADDR_MASK_UPR + offset,
  532. val);
  533. if (ret < 0)
  534. return ret;
  535. val = get_unaligned_be32(&mask[2]);
  536. return adin1110_write_reg(priv,
  537. ADIN1110_MAC_ADDR_MASK_LWR + offset,
  538. val);
  539. }
  540. return 0;
  541. }
  542. static int adin1110_clear_mac_address(struct adin1110_priv *priv, int mac_nr)
  543. {
  544. u32 offset = mac_nr * 2;
  545. int ret;
  546. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset, 0);
  547. if (ret < 0)
  548. return ret;
  549. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + offset, 0);
  550. if (ret < 0)
  551. return ret;
  552. /* only the first two MAC address slots are maskable */
  553. if (mac_nr <= 1) {
  554. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_UPR + offset, 0);
  555. if (ret < 0)
  556. return ret;
  557. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_LWR + offset, 0);
  558. }
  559. return ret;
  560. }
  561. static u32 adin1110_port_rules(struct adin1110_port_priv *port_priv,
  562. bool fw_to_host,
  563. bool fw_to_other_port)
  564. {
  565. u32 port_rules = 0;
  566. if (!port_priv->nr)
  567. port_rules |= ADIN1110_MAC_ADDR_APPLY2PORT;
  568. else
  569. port_rules |= ADIN2111_MAC_ADDR_APPLY2PORT2;
  570. if (fw_to_host)
  571. port_rules |= ADIN1110_MAC_ADDR_TO_HOST;
  572. if (fw_to_other_port && port_priv->priv->forwarding)
  573. port_rules |= ADIN2111_MAC_ADDR_TO_OTHER_PORT;
  574. return port_rules;
  575. }
  576. static int adin1110_multicast_filter(struct adin1110_port_priv *port_priv,
  577. int mac_nr, bool accept_multicast)
  578. {
  579. u8 mask[ETH_ALEN] = {0};
  580. u8 mac[ETH_ALEN] = {0};
  581. u32 port_rules = 0;
  582. mask[0] = BIT(0);
  583. mac[0] = BIT(0);
  584. if (accept_multicast && port_priv->state == BR_STATE_FORWARDING)
  585. port_rules = adin1110_port_rules(port_priv, true, true);
  586. return adin1110_write_mac_address(port_priv, mac_nr, mac,
  587. mask, port_rules);
  588. }
  589. static int adin1110_broadcasts_filter(struct adin1110_port_priv *port_priv,
  590. int mac_nr, bool accept_broadcast)
  591. {
  592. u32 port_rules = 0;
  593. u8 mask[ETH_ALEN];
  594. eth_broadcast_addr(mask);
  595. if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING)
  596. port_rules = adin1110_port_rules(port_priv, true, true);
  597. return adin1110_write_mac_address(port_priv, mac_nr, mask,
  598. mask, port_rules);
  599. }
  600. static int adin1110_set_mac_address(struct net_device *netdev,
  601. const unsigned char *dev_addr)
  602. {
  603. struct adin1110_port_priv *port_priv = netdev_priv(netdev);
  604. u8 mask[ETH_ALEN];
  605. u32 port_rules;
  606. u32 mac_slot;
  607. if (!is_valid_ether_addr(dev_addr))
  608. return -EADDRNOTAVAIL;
  609. eth_hw_addr_set(netdev, dev_addr);
  610. eth_broadcast_addr(mask);
  611. mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
  612. port_rules = adin1110_port_rules(port_priv, true, false);
  613. return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr,
  614. mask, port_rules);
  615. }
  616. static int adin1110_ndo_set_mac_address(struct net_device *netdev, void *addr)
  617. {
  618. struct sockaddr *sa = addr;
  619. int ret;
  620. ret = eth_prepare_mac_addr_change(netdev, addr);
  621. if (ret < 0)
  622. return ret;
  623. return adin1110_set_mac_address(netdev, sa->sa_data);
  624. }
  625. static int adin1110_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
  626. {
  627. if (!netif_running(netdev))
  628. return -EINVAL;
  629. return phy_do_ioctl(netdev, rq, cmd);
  630. }
  631. static int adin1110_set_promisc_mode(struct adin1110_port_priv *port_priv,
  632. bool promisc)
  633. {
  634. struct adin1110_priv *priv = port_priv->priv;
  635. u32 mask;
  636. if (port_priv->state != BR_STATE_FORWARDING)
  637. promisc = false;
  638. if (!port_priv->nr)
  639. mask = ADIN1110_FWD_UNK2HOST;
  640. else
  641. mask = ADIN2111_P2_FWD_UNK2HOST;
  642. return adin1110_set_bits(priv, ADIN1110_CONFIG2,
  643. mask, promisc ? mask : 0);
  644. }
  645. static int adin1110_setup_rx_mode(struct adin1110_port_priv *port_priv)
  646. {
  647. int ret;
  648. ret = adin1110_set_promisc_mode(port_priv,
  649. !!(port_priv->flags & IFF_PROMISC));
  650. if (ret < 0)
  651. return ret;
  652. ret = adin1110_multicast_filter(port_priv, ADIN_MAC_MULTICAST_ADDR_SLOT,
  653. !!(port_priv->flags & IFF_ALLMULTI));
  654. if (ret < 0)
  655. return ret;
  656. ret = adin1110_broadcasts_filter(port_priv,
  657. ADIN_MAC_BROADCAST_ADDR_SLOT,
  658. !!(port_priv->flags & IFF_BROADCAST));
  659. if (ret < 0)
  660. return ret;
  661. return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1,
  662. ADIN1110_CONFIG1_SYNC, ADIN1110_CONFIG1_SYNC);
  663. }
  664. static bool adin1110_can_offload_forwarding(struct adin1110_priv *priv)
  665. {
  666. int i;
  667. if (priv->cfg->id != ADIN2111_MAC)
  668. return false;
  669. /* Can't enable forwarding if ports do not belong to the same bridge */
  670. if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge)
  671. return false;
  672. /* Can't enable forwarding if there is a port
  673. * that has been blocked by STP.
  674. */
  675. for (i = 0; i < priv->cfg->ports_nr; i++) {
  676. if (priv->ports[i]->state != BR_STATE_FORWARDING)
  677. return false;
  678. }
  679. return true;
  680. }
  681. static void adin1110_rx_mode_work(struct work_struct *work)
  682. {
  683. struct adin1110_port_priv *port_priv;
  684. struct adin1110_priv *priv;
  685. port_priv = container_of(work, struct adin1110_port_priv, rx_mode_work);
  686. priv = port_priv->priv;
  687. mutex_lock(&priv->lock);
  688. adin1110_setup_rx_mode(port_priv);
  689. mutex_unlock(&priv->lock);
  690. }
  691. static void adin1110_set_rx_mode(struct net_device *dev)
  692. {
  693. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  694. struct adin1110_priv *priv = port_priv->priv;
  695. spin_lock(&priv->state_lock);
  696. port_priv->flags = dev->flags;
  697. schedule_work(&port_priv->rx_mode_work);
  698. spin_unlock(&priv->state_lock);
  699. }
  700. static int adin1110_net_open(struct net_device *net_dev)
  701. {
  702. struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
  703. struct adin1110_priv *priv = port_priv->priv;
  704. u32 val;
  705. int ret;
  706. mutex_lock(&priv->lock);
  707. /* Configure MAC to compute and append the FCS itself. */
  708. ret = adin1110_write_reg(priv, ADIN1110_CONFIG2, ADIN1110_CRC_APPEND);
  709. if (ret < 0)
  710. goto out;
  711. val = ADIN1110_TX_RDY_IRQ | ADIN1110_RX_RDY_IRQ | ADIN1110_SPI_ERR_IRQ;
  712. if (priv->cfg->id == ADIN2111_MAC)
  713. val |= ADIN2111_RX_RDY_IRQ;
  714. priv->irq_mask = val;
  715. ret = adin1110_write_reg(priv, ADIN1110_IMASK1, ~val);
  716. if (ret < 0) {
  717. netdev_err(net_dev, "Failed to enable chip IRQs: %d\n", ret);
  718. goto out;
  719. }
  720. ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
  721. if (ret < 0) {
  722. netdev_err(net_dev, "Failed to read TX FIFO space: %d\n", ret);
  723. goto out;
  724. }
  725. priv->tx_space = 2 * val;
  726. port_priv->state = BR_STATE_FORWARDING;
  727. ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr);
  728. if (ret < 0) {
  729. netdev_err(net_dev, "Could not set MAC address: %pM, %d\n",
  730. net_dev->dev_addr, ret);
  731. goto out;
  732. }
  733. ret = adin1110_set_bits(priv, ADIN1110_CONFIG1, ADIN1110_CONFIG1_SYNC,
  734. ADIN1110_CONFIG1_SYNC);
  735. out:
  736. mutex_unlock(&priv->lock);
  737. if (ret < 0)
  738. return ret;
  739. phy_start(port_priv->phydev);
  740. netif_start_queue(net_dev);
  741. return 0;
  742. }
  743. static int adin1110_net_stop(struct net_device *net_dev)
  744. {
  745. struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
  746. struct adin1110_priv *priv = port_priv->priv;
  747. u32 mask;
  748. int ret;
  749. mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ;
  750. /* Disable RX RDY IRQs */
  751. mutex_lock(&priv->lock);
  752. ret = adin1110_set_bits(priv, ADIN1110_IMASK1, mask, mask);
  753. mutex_unlock(&priv->lock);
  754. if (ret < 0)
  755. return ret;
  756. netif_stop_queue(port_priv->netdev);
  757. flush_work(&port_priv->tx_work);
  758. phy_stop(port_priv->phydev);
  759. return 0;
  760. }
  761. static void adin1110_tx_work(struct work_struct *work)
  762. {
  763. struct adin1110_port_priv *port_priv;
  764. struct adin1110_priv *priv;
  765. struct sk_buff *txb;
  766. int ret;
  767. port_priv = container_of(work, struct adin1110_port_priv, tx_work);
  768. priv = port_priv->priv;
  769. mutex_lock(&priv->lock);
  770. while ((txb = skb_dequeue(&port_priv->txq))) {
  771. ret = adin1110_write_fifo(port_priv, txb);
  772. if (ret < 0)
  773. dev_err_ratelimited(&priv->spidev->dev,
  774. "Frame write error: %d\n", ret);
  775. dev_kfree_skb(txb);
  776. }
  777. mutex_unlock(&priv->lock);
  778. }
  779. static netdev_tx_t adin1110_start_xmit(struct sk_buff *skb, struct net_device *dev)
  780. {
  781. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  782. struct adin1110_priv *priv = port_priv->priv;
  783. netdev_tx_t netdev_ret = NETDEV_TX_OK;
  784. u32 tx_space_needed;
  785. tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN;
  786. if (tx_space_needed > priv->tx_space) {
  787. netif_stop_queue(dev);
  788. netdev_ret = NETDEV_TX_BUSY;
  789. } else {
  790. priv->tx_space -= tx_space_needed;
  791. skb_queue_tail(&port_priv->txq, skb);
  792. }
  793. schedule_work(&port_priv->tx_work);
  794. return netdev_ret;
  795. }
  796. static void adin1110_ndo_get_stats64(struct net_device *dev,
  797. struct rtnl_link_stats64 *storage)
  798. {
  799. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  800. storage->rx_packets = port_priv->rx_packets;
  801. storage->tx_packets = port_priv->tx_packets;
  802. storage->rx_bytes = port_priv->rx_bytes;
  803. storage->tx_bytes = port_priv->tx_bytes;
  804. }
  805. static int adin1110_port_get_port_parent_id(struct net_device *dev,
  806. struct netdev_phys_item_id *ppid)
  807. {
  808. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  809. struct adin1110_priv *priv = port_priv->priv;
  810. ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN);
  811. memcpy(ppid->id, priv->mii_bus_name, ppid->id_len);
  812. return 0;
  813. }
  814. static int adin1110_ndo_get_phys_port_name(struct net_device *dev,
  815. char *name, size_t len)
  816. {
  817. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  818. int err;
  819. err = snprintf(name, len, "p%d", port_priv->nr);
  820. if (err >= len)
  821. return -EINVAL;
  822. return 0;
  823. }
  824. static const struct net_device_ops adin1110_netdev_ops = {
  825. .ndo_open = adin1110_net_open,
  826. .ndo_stop = adin1110_net_stop,
  827. .ndo_eth_ioctl = adin1110_ioctl,
  828. .ndo_start_xmit = adin1110_start_xmit,
  829. .ndo_set_mac_address = adin1110_ndo_set_mac_address,
  830. .ndo_set_rx_mode = adin1110_set_rx_mode,
  831. .ndo_validate_addr = eth_validate_addr,
  832. .ndo_get_stats64 = adin1110_ndo_get_stats64,
  833. .ndo_get_port_parent_id = adin1110_port_get_port_parent_id,
  834. .ndo_get_phys_port_name = adin1110_ndo_get_phys_port_name,
  835. };
  836. static void adin1110_get_drvinfo(struct net_device *dev,
  837. struct ethtool_drvinfo *di)
  838. {
  839. strscpy(di->driver, "ADIN1110", sizeof(di->driver));
  840. strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info));
  841. }
  842. static const struct ethtool_ops adin1110_ethtool_ops = {
  843. .get_drvinfo = adin1110_get_drvinfo,
  844. .get_link = ethtool_op_get_link,
  845. .get_link_ksettings = phy_ethtool_get_link_ksettings,
  846. .set_link_ksettings = phy_ethtool_set_link_ksettings,
  847. };
  848. static void adin1110_adjust_link(struct net_device *dev)
  849. {
  850. struct phy_device *phydev = dev->phydev;
  851. if (!phydev->link)
  852. phy_print_status(phydev);
  853. }
  854. /* PHY ID is stored in the MAC registers too,
  855. * check spi connection by reading it.
  856. */
  857. static int adin1110_check_spi(struct adin1110_priv *priv)
  858. {
  859. struct gpio_desc *reset_gpio;
  860. int ret;
  861. u32 val;
  862. reset_gpio = devm_gpiod_get_optional(&priv->spidev->dev, "reset",
  863. GPIOD_OUT_LOW);
  864. if (IS_ERR(reset_gpio))
  865. return dev_err_probe(&priv->spidev->dev, PTR_ERR(reset_gpio),
  866. "failed to get reset gpio\n");
  867. if (reset_gpio) {
  868. /* MISO pin is used for internal configuration, can't have
  869. * anyone else disturbing the SDO line.
  870. */
  871. spi_bus_lock(priv->spidev->controller);
  872. gpiod_set_value(reset_gpio, 1);
  873. fsleep(10000);
  874. gpiod_set_value(reset_gpio, 0);
  875. /* Need to wait 90 ms before interacting with
  876. * the MAC after a HW reset.
  877. */
  878. fsleep(90000);
  879. spi_bus_unlock(priv->spidev->controller);
  880. }
  881. ret = adin1110_read_reg(priv, ADIN1110_PHY_ID, &val);
  882. if (ret < 0)
  883. return ret;
  884. if (val != priv->cfg->phy_id_val) {
  885. dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n",
  886. priv->cfg->phy_id_val, val);
  887. return -EIO;
  888. }
  889. return 0;
  890. }
  891. static int adin1110_hw_forwarding(struct adin1110_priv *priv, bool enable)
  892. {
  893. int ret;
  894. int i;
  895. priv->forwarding = enable;
  896. if (!priv->forwarding) {
  897. for (i = ADIN_MAC_FDB_ADDR_SLOT; i < ADIN_MAC_MAX_ADDR_SLOTS; i++) {
  898. ret = adin1110_clear_mac_address(priv, i);
  899. if (ret < 0)
  900. return ret;
  901. }
  902. }
  903. /* Forwarding is optimised when MAC runs in Cut Through mode. */
  904. ret = adin1110_set_bits(priv, ADIN1110_CONFIG2,
  905. ADIN2111_PORT_CUT_THRU_EN,
  906. priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0);
  907. if (ret < 0)
  908. return ret;
  909. for (i = 0; i < priv->cfg->ports_nr; i++) {
  910. ret = adin1110_setup_rx_mode(priv->ports[i]);
  911. if (ret < 0)
  912. return ret;
  913. }
  914. return ret;
  915. }
  916. static int adin1110_port_bridge_join(struct adin1110_port_priv *port_priv,
  917. struct net_device *bridge)
  918. {
  919. struct adin1110_priv *priv = port_priv->priv;
  920. int ret;
  921. port_priv->bridge = bridge;
  922. if (adin1110_can_offload_forwarding(priv)) {
  923. mutex_lock(&priv->lock);
  924. ret = adin1110_hw_forwarding(priv, true);
  925. mutex_unlock(&priv->lock);
  926. if (ret < 0)
  927. return ret;
  928. }
  929. return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr);
  930. }
  931. static int adin1110_port_bridge_leave(struct adin1110_port_priv *port_priv,
  932. struct net_device *bridge)
  933. {
  934. struct adin1110_priv *priv = port_priv->priv;
  935. int ret;
  936. port_priv->bridge = NULL;
  937. mutex_lock(&priv->lock);
  938. ret = adin1110_hw_forwarding(priv, false);
  939. mutex_unlock(&priv->lock);
  940. return ret;
  941. }
  942. static bool adin1110_port_dev_check(const struct net_device *dev)
  943. {
  944. return dev->netdev_ops == &adin1110_netdev_ops;
  945. }
  946. static int adin1110_netdevice_event(struct notifier_block *unused,
  947. unsigned long event, void *ptr)
  948. {
  949. struct net_device *dev = netdev_notifier_info_to_dev(ptr);
  950. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  951. struct netdev_notifier_changeupper_info *info = ptr;
  952. int ret = 0;
  953. if (!adin1110_port_dev_check(dev))
  954. return NOTIFY_DONE;
  955. switch (event) {
  956. case NETDEV_CHANGEUPPER:
  957. if (netif_is_bridge_master(info->upper_dev)) {
  958. if (info->linking)
  959. ret = adin1110_port_bridge_join(port_priv, info->upper_dev);
  960. else
  961. ret = adin1110_port_bridge_leave(port_priv, info->upper_dev);
  962. }
  963. break;
  964. default:
  965. break;
  966. }
  967. return notifier_from_errno(ret);
  968. }
  969. static struct notifier_block adin1110_netdevice_nb = {
  970. .notifier_call = adin1110_netdevice_event,
  971. };
  972. static void adin1110_disconnect_phy(void *data)
  973. {
  974. phy_disconnect(data);
  975. }
  976. static int adin1110_port_set_forwarding_state(struct adin1110_port_priv *port_priv)
  977. {
  978. struct adin1110_priv *priv = port_priv->priv;
  979. int ret;
  980. port_priv->state = BR_STATE_FORWARDING;
  981. mutex_lock(&priv->lock);
  982. ret = adin1110_set_mac_address(port_priv->netdev,
  983. port_priv->netdev->dev_addr);
  984. if (ret < 0)
  985. goto out;
  986. if (adin1110_can_offload_forwarding(priv))
  987. ret = adin1110_hw_forwarding(priv, true);
  988. else
  989. ret = adin1110_setup_rx_mode(port_priv);
  990. out:
  991. mutex_unlock(&priv->lock);
  992. return ret;
  993. }
  994. static int adin1110_port_set_blocking_state(struct adin1110_port_priv *port_priv)
  995. {
  996. u8 mac[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x00};
  997. struct adin1110_priv *priv = port_priv->priv;
  998. u8 mask[ETH_ALEN];
  999. u32 port_rules;
  1000. int mac_slot;
  1001. int ret;
  1002. port_priv->state = BR_STATE_BLOCKING;
  1003. mutex_lock(&priv->lock);
  1004. mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
  1005. ret = adin1110_clear_mac_address(priv, mac_slot);
  1006. if (ret < 0)
  1007. goto out;
  1008. ret = adin1110_hw_forwarding(priv, false);
  1009. if (ret < 0)
  1010. goto out;
  1011. /* Allow only BPDUs to be passed to the CPU */
  1012. eth_broadcast_addr(mask);
  1013. port_rules = adin1110_port_rules(port_priv, true, false);
  1014. ret = adin1110_write_mac_address(port_priv, mac_slot, mac,
  1015. mask, port_rules);
  1016. out:
  1017. mutex_unlock(&priv->lock);
  1018. return ret;
  1019. }
  1020. /* ADIN1110/2111 does not have any native STP support.
  1021. * Listen for bridge core state changes and
  1022. * allow all frames to pass or only the BPDUs.
  1023. */
  1024. static int adin1110_port_attr_stp_state_set(struct adin1110_port_priv *port_priv,
  1025. u8 state)
  1026. {
  1027. switch (state) {
  1028. case BR_STATE_FORWARDING:
  1029. return adin1110_port_set_forwarding_state(port_priv);
  1030. case BR_STATE_LEARNING:
  1031. case BR_STATE_LISTENING:
  1032. case BR_STATE_DISABLED:
  1033. case BR_STATE_BLOCKING:
  1034. return adin1110_port_set_blocking_state(port_priv);
  1035. default:
  1036. return -EINVAL;
  1037. }
  1038. }
  1039. static int adin1110_port_attr_set(struct net_device *dev, const void *ctx,
  1040. const struct switchdev_attr *attr,
  1041. struct netlink_ext_ack *extack)
  1042. {
  1043. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  1044. switch (attr->id) {
  1045. case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
  1046. return adin1110_port_attr_stp_state_set(port_priv,
  1047. attr->u.stp_state);
  1048. default:
  1049. return -EOPNOTSUPP;
  1050. }
  1051. }
  1052. static int adin1110_switchdev_blocking_event(struct notifier_block *unused,
  1053. unsigned long event,
  1054. void *ptr)
  1055. {
  1056. struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
  1057. int ret;
  1058. if (event == SWITCHDEV_PORT_ATTR_SET) {
  1059. ret = switchdev_handle_port_attr_set(netdev, ptr,
  1060. adin1110_port_dev_check,
  1061. adin1110_port_attr_set);
  1062. return notifier_from_errno(ret);
  1063. }
  1064. return NOTIFY_DONE;
  1065. }
  1066. static struct notifier_block adin1110_switchdev_blocking_notifier = {
  1067. .notifier_call = adin1110_switchdev_blocking_event,
  1068. };
  1069. static void adin1110_fdb_offload_notify(struct net_device *netdev,
  1070. struct switchdev_notifier_fdb_info *rcv)
  1071. {
  1072. struct switchdev_notifier_fdb_info info = {};
  1073. info.addr = rcv->addr;
  1074. info.vid = rcv->vid;
  1075. info.offloaded = true;
  1076. call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
  1077. netdev, &info.info, NULL);
  1078. }
  1079. static int adin1110_fdb_add(struct adin1110_port_priv *port_priv,
  1080. struct switchdev_notifier_fdb_info *fdb)
  1081. {
  1082. struct adin1110_priv *priv = port_priv->priv;
  1083. struct adin1110_port_priv *other_port;
  1084. u8 mask[ETH_ALEN];
  1085. u32 port_rules;
  1086. int mac_nr;
  1087. u32 val;
  1088. int ret;
  1089. netdev_dbg(port_priv->netdev,
  1090. "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
  1091. __func__, fdb->addr, fdb->vid, fdb->added_by_user,
  1092. fdb->offloaded, port_priv->nr);
  1093. if (!priv->forwarding)
  1094. return 0;
  1095. if (fdb->is_local)
  1096. return -EINVAL;
  1097. /* Find free FDB slot on device. */
  1098. for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
  1099. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
  1100. if (ret < 0)
  1101. return ret;
  1102. if (!val)
  1103. break;
  1104. }
  1105. if (mac_nr == ADIN_MAC_MAX_ADDR_SLOTS)
  1106. return -ENOMEM;
  1107. other_port = priv->ports[!port_priv->nr];
  1108. port_rules = adin1110_port_rules(other_port, false, true);
  1109. eth_broadcast_addr(mask);
  1110. return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr,
  1111. mask, port_rules);
  1112. }
  1113. static int adin1110_read_mac(struct adin1110_priv *priv, int mac_nr, u8 *addr)
  1114. {
  1115. u32 val;
  1116. int ret;
  1117. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
  1118. if (ret < 0)
  1119. return ret;
  1120. put_unaligned_be16(val, addr);
  1121. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + (mac_nr * 2), &val);
  1122. if (ret < 0)
  1123. return ret;
  1124. put_unaligned_be32(val, addr + 2);
  1125. return 0;
  1126. }
  1127. static int adin1110_fdb_del(struct adin1110_port_priv *port_priv,
  1128. struct switchdev_notifier_fdb_info *fdb)
  1129. {
  1130. struct adin1110_priv *priv = port_priv->priv;
  1131. u8 addr[ETH_ALEN];
  1132. int mac_nr;
  1133. int ret;
  1134. netdev_dbg(port_priv->netdev,
  1135. "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
  1136. __func__, fdb->addr, fdb->vid, fdb->added_by_user,
  1137. fdb->offloaded, port_priv->nr);
  1138. if (fdb->is_local)
  1139. return -EINVAL;
  1140. for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
  1141. ret = adin1110_read_mac(priv, mac_nr, addr);
  1142. if (ret < 0)
  1143. return ret;
  1144. if (ether_addr_equal(addr, fdb->addr)) {
  1145. ret = adin1110_clear_mac_address(priv, mac_nr);
  1146. if (ret < 0)
  1147. return ret;
  1148. }
  1149. }
  1150. return 0;
  1151. }
  1152. static void adin1110_switchdev_event_work(struct work_struct *work)
  1153. {
  1154. struct adin1110_switchdev_event_work *switchdev_work;
  1155. struct adin1110_port_priv *port_priv;
  1156. int ret;
  1157. switchdev_work = container_of(work, struct adin1110_switchdev_event_work, work);
  1158. port_priv = switchdev_work->port_priv;
  1159. mutex_lock(&port_priv->priv->lock);
  1160. switch (switchdev_work->event) {
  1161. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1162. ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info);
  1163. if (!ret)
  1164. adin1110_fdb_offload_notify(port_priv->netdev,
  1165. &switchdev_work->fdb_info);
  1166. break;
  1167. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1168. adin1110_fdb_del(port_priv, &switchdev_work->fdb_info);
  1169. break;
  1170. default:
  1171. break;
  1172. }
  1173. mutex_unlock(&port_priv->priv->lock);
  1174. kfree(switchdev_work->fdb_info.addr);
  1175. kfree(switchdev_work);
  1176. dev_put(port_priv->netdev);
  1177. }
  1178. /* called under rcu_read_lock() */
  1179. static int adin1110_switchdev_event(struct notifier_block *unused,
  1180. unsigned long event, void *ptr)
  1181. {
  1182. struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
  1183. struct adin1110_port_priv *port_priv = netdev_priv(netdev);
  1184. struct adin1110_switchdev_event_work *switchdev_work;
  1185. struct switchdev_notifier_fdb_info *fdb_info = ptr;
  1186. if (!adin1110_port_dev_check(netdev))
  1187. return NOTIFY_DONE;
  1188. switchdev_work = kzalloc_obj(*switchdev_work, GFP_ATOMIC);
  1189. if (WARN_ON(!switchdev_work))
  1190. return NOTIFY_BAD;
  1191. INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work);
  1192. switchdev_work->port_priv = port_priv;
  1193. switchdev_work->event = event;
  1194. switch (event) {
  1195. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1196. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1197. memcpy(&switchdev_work->fdb_info, ptr,
  1198. sizeof(switchdev_work->fdb_info));
  1199. switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
  1200. if (!switchdev_work->fdb_info.addr)
  1201. goto err_addr_alloc;
  1202. ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
  1203. fdb_info->addr);
  1204. dev_hold(netdev);
  1205. break;
  1206. default:
  1207. kfree(switchdev_work);
  1208. return NOTIFY_DONE;
  1209. }
  1210. queue_work(system_long_wq, &switchdev_work->work);
  1211. return NOTIFY_DONE;
  1212. err_addr_alloc:
  1213. kfree(switchdev_work);
  1214. return NOTIFY_BAD;
  1215. }
  1216. static struct notifier_block adin1110_switchdev_notifier = {
  1217. .notifier_call = adin1110_switchdev_event,
  1218. };
  1219. static void adin1110_unregister_notifiers(void)
  1220. {
  1221. unregister_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
  1222. unregister_switchdev_notifier(&adin1110_switchdev_notifier);
  1223. unregister_netdevice_notifier(&adin1110_netdevice_nb);
  1224. }
  1225. static int adin1110_setup_notifiers(void)
  1226. {
  1227. int ret;
  1228. ret = register_netdevice_notifier(&adin1110_netdevice_nb);
  1229. if (ret < 0)
  1230. return ret;
  1231. ret = register_switchdev_notifier(&adin1110_switchdev_notifier);
  1232. if (ret < 0)
  1233. goto err_netdev;
  1234. ret = register_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
  1235. if (ret < 0)
  1236. goto err_sdev;
  1237. return 0;
  1238. err_sdev:
  1239. unregister_switchdev_notifier(&adin1110_switchdev_notifier);
  1240. err_netdev:
  1241. unregister_netdevice_notifier(&adin1110_netdevice_nb);
  1242. return ret;
  1243. }
  1244. static int adin1110_probe_netdevs(struct adin1110_priv *priv)
  1245. {
  1246. struct device *dev = &priv->spidev->dev;
  1247. struct adin1110_port_priv *port_priv;
  1248. struct net_device *netdev;
  1249. int ret;
  1250. int i;
  1251. for (i = 0; i < priv->cfg->ports_nr; i++) {
  1252. netdev = devm_alloc_etherdev(dev, sizeof(*port_priv));
  1253. if (!netdev)
  1254. return -ENOMEM;
  1255. port_priv = netdev_priv(netdev);
  1256. port_priv->netdev = netdev;
  1257. port_priv->priv = priv;
  1258. port_priv->cfg = priv->cfg;
  1259. port_priv->nr = i;
  1260. priv->ports[i] = port_priv;
  1261. SET_NETDEV_DEV(netdev, dev);
  1262. ret = device_get_ethdev_address(dev, netdev);
  1263. if (ret < 0)
  1264. return ret;
  1265. netdev->irq = priv->spidev->irq;
  1266. INIT_WORK(&port_priv->tx_work, adin1110_tx_work);
  1267. INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work);
  1268. skb_queue_head_init(&port_priv->txq);
  1269. netif_carrier_off(netdev);
  1270. netdev->if_port = IF_PORT_10BASET;
  1271. netdev->netdev_ops = &adin1110_netdev_ops;
  1272. netdev->ethtool_ops = &adin1110_ethtool_ops;
  1273. netdev->priv_flags |= IFF_UNICAST_FLT;
  1274. netdev->netns_immutable = true;
  1275. port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
  1276. if (IS_ERR(port_priv->phydev)) {
  1277. netdev_err(netdev, "Could not find PHY with device address: %d.\n", i);
  1278. return PTR_ERR(port_priv->phydev);
  1279. }
  1280. port_priv->phydev = phy_connect(netdev,
  1281. phydev_name(port_priv->phydev),
  1282. adin1110_adjust_link,
  1283. PHY_INTERFACE_MODE_INTERNAL);
  1284. if (IS_ERR(port_priv->phydev)) {
  1285. netdev_err(netdev, "Could not connect PHY with device address: %d.\n", i);
  1286. return PTR_ERR(port_priv->phydev);
  1287. }
  1288. ret = devm_add_action_or_reset(dev, adin1110_disconnect_phy,
  1289. port_priv->phydev);
  1290. if (ret < 0)
  1291. return ret;
  1292. }
  1293. /* ADIN1110 INT_N pin will be used to signal the host */
  1294. ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL,
  1295. adin1110_irq,
  1296. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  1297. dev_name(dev), priv);
  1298. if (ret < 0)
  1299. return ret;
  1300. for (i = 0; i < priv->cfg->ports_nr; i++) {
  1301. ret = devm_register_netdev(dev, priv->ports[i]->netdev);
  1302. if (ret < 0) {
  1303. dev_err(dev, "Failed to register network device.\n");
  1304. return ret;
  1305. }
  1306. }
  1307. return 0;
  1308. }
  1309. static int adin1110_probe(struct spi_device *spi)
  1310. {
  1311. const struct spi_device_id *dev_id = spi_get_device_id(spi);
  1312. struct device *dev = &spi->dev;
  1313. struct adin1110_priv *priv;
  1314. int ret;
  1315. priv = devm_kzalloc(dev, sizeof(struct adin1110_priv), GFP_KERNEL);
  1316. if (!priv)
  1317. return -ENOMEM;
  1318. priv->spidev = spi;
  1319. priv->cfg = &adin1110_cfgs[dev_id->driver_data];
  1320. spi->bits_per_word = 8;
  1321. spi->mode = SPI_MODE_0;
  1322. mutex_init(&priv->lock);
  1323. spin_lock_init(&priv->state_lock);
  1324. /* use of CRC on control and data transactions is pin dependent */
  1325. priv->append_crc = device_property_read_bool(dev, "adi,spi-crc");
  1326. if (priv->append_crc)
  1327. crc8_populate_msb(adin1110_crc_table, 0x7);
  1328. ret = adin1110_check_spi(priv);
  1329. if (ret < 0) {
  1330. dev_err(dev, "Probe SPI Read check failed: %d\n", ret);
  1331. return ret;
  1332. }
  1333. ret = adin1110_write_reg(priv, ADIN1110_RESET, ADIN1110_SWRESET);
  1334. if (ret < 0)
  1335. return ret;
  1336. ret = adin1110_register_mdiobus(priv, dev);
  1337. if (ret < 0) {
  1338. dev_err(dev, "Could not register MDIO bus %d\n", ret);
  1339. return ret;
  1340. }
  1341. return adin1110_probe_netdevs(priv);
  1342. }
  1343. static const struct of_device_id adin1110_match_table[] = {
  1344. { .compatible = "adi,adin1110" },
  1345. { .compatible = "adi,adin2111" },
  1346. { }
  1347. };
  1348. MODULE_DEVICE_TABLE(of, adin1110_match_table);
  1349. static const struct spi_device_id adin1110_spi_id[] = {
  1350. { .name = "adin1110", .driver_data = ADIN1110_MAC },
  1351. { .name = "adin2111", .driver_data = ADIN2111_MAC },
  1352. { }
  1353. };
  1354. MODULE_DEVICE_TABLE(spi, adin1110_spi_id);
  1355. static struct spi_driver adin1110_driver = {
  1356. .driver = {
  1357. .name = "adin1110",
  1358. .of_match_table = adin1110_match_table,
  1359. },
  1360. .probe = adin1110_probe,
  1361. .id_table = adin1110_spi_id,
  1362. };
  1363. static int __init adin1110_driver_init(void)
  1364. {
  1365. int ret;
  1366. ret = adin1110_setup_notifiers();
  1367. if (ret < 0)
  1368. return ret;
  1369. ret = spi_register_driver(&adin1110_driver);
  1370. if (ret < 0) {
  1371. adin1110_unregister_notifiers();
  1372. return ret;
  1373. }
  1374. return 0;
  1375. }
  1376. static void __exit adin1110_exit(void)
  1377. {
  1378. adin1110_unregister_notifiers();
  1379. spi_unregister_driver(&adin1110_driver);
  1380. }
  1381. module_init(adin1110_driver_init);
  1382. module_exit(adin1110_exit);
  1383. MODULE_DESCRIPTION("ADIN1110 Network driver");
  1384. MODULE_AUTHOR("Alexandru Tachici <alexandru.tachici@analog.com>");
  1385. MODULE_LICENSE("Dual BSD/GPL");