adin1110.c 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715
  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/if_bridge.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/iopoll.h>
  16. #include <linux/gpio.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 <asm/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. char name[MDIO_NAME_SIZE];
  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 ret;
  263. round_len = adin1110_round_len(frame_size);
  264. if (round_len < 0)
  265. return ret;
  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(adin1110_read_mdio_acc, priv, val,
  376. (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
  377. if (ret < 0)
  378. return ret;
  379. return (val & ADIN1110_MDIO_DATA);
  380. }
  381. static int adin1110_mdio_write(struct mii_bus *bus, int phy_id,
  382. int reg, u16 reg_val)
  383. {
  384. struct adin1110_priv *priv = bus->priv;
  385. u32 val = 0;
  386. int ret;
  387. if (mdio_phy_id_is_c45(phy_id))
  388. return -EOPNOTSUPP;
  389. val |= FIELD_PREP(ADIN1110_MDIO_OP, ADIN1110_MDIO_OP_WR);
  390. val |= FIELD_PREP(ADIN1110_MDIO_ST, 0x1);
  391. val |= FIELD_PREP(ADIN1110_MDIO_PRTAD, phy_id);
  392. val |= FIELD_PREP(ADIN1110_MDIO_DEVAD, reg);
  393. val |= FIELD_PREP(ADIN1110_MDIO_DATA, reg_val);
  394. /* write the clause 22 write command to the chip */
  395. mutex_lock(&priv->lock);
  396. ret = adin1110_write_reg(priv, ADIN1110_MDIOACC, val);
  397. mutex_unlock(&priv->lock);
  398. if (ret < 0)
  399. return ret;
  400. return readx_poll_timeout(adin1110_read_mdio_acc, priv, val,
  401. (val & ADIN1110_MDIO_TRDONE), 10000, 30000);
  402. }
  403. /* ADIN1110 MAC-PHY contains an ADIN1100 PHY.
  404. * ADIN2111 MAC-PHY contains two ADIN1100 PHYs.
  405. * By registering a new MDIO bus we allow the PAL to discover
  406. * the encapsulated PHY and probe the ADIN1100 driver.
  407. */
  408. static int adin1110_register_mdiobus(struct adin1110_priv *priv,
  409. struct device *dev)
  410. {
  411. struct mii_bus *mii_bus;
  412. int ret;
  413. mii_bus = devm_mdiobus_alloc(dev);
  414. if (!mii_bus)
  415. return -ENOMEM;
  416. snprintf(priv->mii_bus_name, MII_BUS_ID_SIZE, "%s-%u",
  417. priv->cfg->name, priv->spidev->chip_select);
  418. mii_bus->name = priv->mii_bus_name;
  419. mii_bus->read = adin1110_mdio_read;
  420. mii_bus->write = adin1110_mdio_write;
  421. mii_bus->priv = priv;
  422. mii_bus->parent = dev;
  423. mii_bus->phy_mask = ~((u32)GENMASK(2, 0));
  424. mii_bus->probe_capabilities = MDIOBUS_C22;
  425. snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
  426. ret = devm_mdiobus_register(dev, mii_bus);
  427. if (ret)
  428. return ret;
  429. priv->mii_bus = mii_bus;
  430. return 0;
  431. }
  432. static bool adin1110_port_rx_ready(struct adin1110_port_priv *port_priv,
  433. u32 status)
  434. {
  435. if (!netif_oper_up(port_priv->netdev))
  436. return false;
  437. if (!port_priv->nr)
  438. return !!(status & ADIN1110_RX_RDY);
  439. else
  440. return !!(status & ADIN2111_P2_RX_RDY);
  441. }
  442. static void adin1110_read_frames(struct adin1110_port_priv *port_priv,
  443. unsigned int budget)
  444. {
  445. struct adin1110_priv *priv = port_priv->priv;
  446. u32 status1;
  447. int ret;
  448. while (budget) {
  449. ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
  450. if (ret < 0)
  451. return;
  452. if (!adin1110_port_rx_ready(port_priv, status1))
  453. break;
  454. ret = adin1110_read_fifo(port_priv);
  455. if (ret < 0)
  456. return;
  457. budget--;
  458. }
  459. }
  460. static void adin1110_wake_queues(struct adin1110_priv *priv)
  461. {
  462. int i;
  463. for (i = 0; i < priv->cfg->ports_nr; i++)
  464. netif_wake_queue(priv->ports[i]->netdev);
  465. }
  466. static irqreturn_t adin1110_irq(int irq, void *p)
  467. {
  468. struct adin1110_priv *priv = p;
  469. u32 status1;
  470. u32 val;
  471. int ret;
  472. int i;
  473. mutex_lock(&priv->lock);
  474. ret = adin1110_read_reg(priv, ADIN1110_STATUS1, &status1);
  475. if (ret < 0)
  476. goto out;
  477. if (priv->append_crc && (status1 & ADIN1110_SPI_ERR))
  478. dev_warn_ratelimited(&priv->spidev->dev,
  479. "SPI CRC error on write.\n");
  480. ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
  481. if (ret < 0)
  482. goto out;
  483. /* TX FIFO space is expressed in half-words */
  484. priv->tx_space = 2 * val;
  485. for (i = 0; i < priv->cfg->ports_nr; i++) {
  486. if (adin1110_port_rx_ready(priv->ports[i], status1))
  487. adin1110_read_frames(priv->ports[i],
  488. ADIN1110_MAX_FRAMES_READ);
  489. }
  490. /* clear IRQ sources */
  491. adin1110_write_reg(priv, ADIN1110_STATUS0, ADIN1110_CLEAR_STATUS0);
  492. adin1110_write_reg(priv, ADIN1110_STATUS1, priv->irq_mask);
  493. out:
  494. mutex_unlock(&priv->lock);
  495. if (priv->tx_space > 0 && ret >= 0)
  496. adin1110_wake_queues(priv);
  497. return IRQ_HANDLED;
  498. }
  499. /* ADIN1110 can filter up to 16 MAC addresses, mac_nr here is the slot used */
  500. static int adin1110_write_mac_address(struct adin1110_port_priv *port_priv,
  501. int mac_nr, const u8 *addr,
  502. u8 *mask, u32 port_rules)
  503. {
  504. struct adin1110_priv *priv = port_priv->priv;
  505. u32 offset = mac_nr * 2;
  506. u32 port_rules_mask;
  507. int ret;
  508. u32 val;
  509. if (!port_priv->nr)
  510. port_rules_mask = ADIN1110_MAC_ADDR_APPLY2PORT;
  511. else
  512. port_rules_mask = ADIN2111_MAC_ADDR_APPLY2PORT2;
  513. if (port_rules & port_rules_mask)
  514. port_rules_mask |= ADIN1110_MAC_ADDR_TO_HOST | ADIN2111_MAC_ADDR_TO_OTHER_PORT;
  515. port_rules_mask |= GENMASK(15, 0);
  516. val = port_rules | get_unaligned_be16(&addr[0]);
  517. ret = adin1110_set_bits(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset,
  518. port_rules_mask, val);
  519. if (ret < 0)
  520. return ret;
  521. val = get_unaligned_be32(&addr[2]);
  522. ret = adin1110_write_reg(priv,
  523. ADIN1110_MAC_ADDR_FILTER_LWR + offset, val);
  524. if (ret < 0)
  525. return ret;
  526. /* Only the first two MAC address slots support masking. */
  527. if (mac_nr < ADIN_MAC_P1_ADDR_SLOT) {
  528. val = get_unaligned_be16(&mask[0]);
  529. ret = adin1110_write_reg(priv,
  530. ADIN1110_MAC_ADDR_MASK_UPR + offset,
  531. val);
  532. if (ret < 0)
  533. return ret;
  534. val = get_unaligned_be32(&mask[2]);
  535. return adin1110_write_reg(priv,
  536. ADIN1110_MAC_ADDR_MASK_LWR + offset,
  537. val);
  538. }
  539. return 0;
  540. }
  541. static int adin1110_clear_mac_address(struct adin1110_priv *priv, int mac_nr)
  542. {
  543. u32 offset = mac_nr * 2;
  544. int ret;
  545. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + offset, 0);
  546. if (ret < 0)
  547. return ret;
  548. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + offset, 0);
  549. if (ret < 0)
  550. return ret;
  551. /* only the first two MAC address slots are maskable */
  552. if (mac_nr <= 1) {
  553. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_UPR + offset, 0);
  554. if (ret < 0)
  555. return ret;
  556. ret = adin1110_write_reg(priv, ADIN1110_MAC_ADDR_MASK_LWR + offset, 0);
  557. }
  558. return ret;
  559. }
  560. static u32 adin1110_port_rules(struct adin1110_port_priv *port_priv,
  561. bool fw_to_host,
  562. bool fw_to_other_port)
  563. {
  564. u32 port_rules = 0;
  565. if (!port_priv->nr)
  566. port_rules |= ADIN1110_MAC_ADDR_APPLY2PORT;
  567. else
  568. port_rules |= ADIN2111_MAC_ADDR_APPLY2PORT2;
  569. if (fw_to_host)
  570. port_rules |= ADIN1110_MAC_ADDR_TO_HOST;
  571. if (fw_to_other_port && port_priv->priv->forwarding)
  572. port_rules |= ADIN2111_MAC_ADDR_TO_OTHER_PORT;
  573. return port_rules;
  574. }
  575. static int adin1110_multicast_filter(struct adin1110_port_priv *port_priv,
  576. int mac_nr, bool accept_multicast)
  577. {
  578. u8 mask[ETH_ALEN] = {0};
  579. u8 mac[ETH_ALEN] = {0};
  580. u32 port_rules = 0;
  581. mask[0] = BIT(0);
  582. mac[0] = BIT(0);
  583. if (accept_multicast && port_priv->state == BR_STATE_FORWARDING)
  584. port_rules = adin1110_port_rules(port_priv, true, true);
  585. return adin1110_write_mac_address(port_priv, mac_nr, mac,
  586. mask, port_rules);
  587. }
  588. static int adin1110_broadcasts_filter(struct adin1110_port_priv *port_priv,
  589. int mac_nr, bool accept_broadcast)
  590. {
  591. u32 port_rules = 0;
  592. u8 mask[ETH_ALEN];
  593. eth_broadcast_addr(mask);
  594. if (accept_broadcast && port_priv->state == BR_STATE_FORWARDING)
  595. port_rules = adin1110_port_rules(port_priv, true, true);
  596. return adin1110_write_mac_address(port_priv, mac_nr, mask,
  597. mask, port_rules);
  598. }
  599. static int adin1110_set_mac_address(struct net_device *netdev,
  600. const unsigned char *dev_addr)
  601. {
  602. struct adin1110_port_priv *port_priv = netdev_priv(netdev);
  603. u8 mask[ETH_ALEN];
  604. u32 port_rules;
  605. u32 mac_slot;
  606. if (!is_valid_ether_addr(dev_addr))
  607. return -EADDRNOTAVAIL;
  608. eth_hw_addr_set(netdev, dev_addr);
  609. eth_broadcast_addr(mask);
  610. mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
  611. port_rules = adin1110_port_rules(port_priv, true, false);
  612. return adin1110_write_mac_address(port_priv, mac_slot, netdev->dev_addr,
  613. mask, port_rules);
  614. }
  615. static int adin1110_ndo_set_mac_address(struct net_device *netdev, void *addr)
  616. {
  617. struct sockaddr *sa = addr;
  618. int ret;
  619. ret = eth_prepare_mac_addr_change(netdev, addr);
  620. if (ret < 0)
  621. return ret;
  622. return adin1110_set_mac_address(netdev, sa->sa_data);
  623. }
  624. static int adin1110_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
  625. {
  626. if (!netif_running(netdev))
  627. return -EINVAL;
  628. return phy_do_ioctl(netdev, rq, cmd);
  629. }
  630. static int adin1110_set_promisc_mode(struct adin1110_port_priv *port_priv,
  631. bool promisc)
  632. {
  633. struct adin1110_priv *priv = port_priv->priv;
  634. u32 mask;
  635. if (port_priv->state != BR_STATE_FORWARDING)
  636. promisc = false;
  637. if (!port_priv->nr)
  638. mask = ADIN1110_FWD_UNK2HOST;
  639. else
  640. mask = ADIN2111_P2_FWD_UNK2HOST;
  641. return adin1110_set_bits(priv, ADIN1110_CONFIG2,
  642. mask, promisc ? mask : 0);
  643. }
  644. static int adin1110_setup_rx_mode(struct adin1110_port_priv *port_priv)
  645. {
  646. int ret;
  647. ret = adin1110_set_promisc_mode(port_priv,
  648. !!(port_priv->flags & IFF_PROMISC));
  649. if (ret < 0)
  650. return ret;
  651. ret = adin1110_multicast_filter(port_priv, ADIN_MAC_MULTICAST_ADDR_SLOT,
  652. !!(port_priv->flags & IFF_ALLMULTI));
  653. if (ret < 0)
  654. return ret;
  655. ret = adin1110_broadcasts_filter(port_priv,
  656. ADIN_MAC_BROADCAST_ADDR_SLOT,
  657. !!(port_priv->flags & IFF_BROADCAST));
  658. if (ret < 0)
  659. return ret;
  660. return adin1110_set_bits(port_priv->priv, ADIN1110_CONFIG1,
  661. ADIN1110_CONFIG1_SYNC, ADIN1110_CONFIG1_SYNC);
  662. }
  663. static bool adin1110_can_offload_forwarding(struct adin1110_priv *priv)
  664. {
  665. int i;
  666. if (priv->cfg->id != ADIN2111_MAC)
  667. return false;
  668. /* Can't enable forwarding if ports do not belong to the same bridge */
  669. if (priv->ports[0]->bridge != priv->ports[1]->bridge || !priv->ports[0]->bridge)
  670. return false;
  671. /* Can't enable forwarding if there is a port
  672. * that has been blocked by STP.
  673. */
  674. for (i = 0; i < priv->cfg->ports_nr; i++) {
  675. if (priv->ports[i]->state != BR_STATE_FORWARDING)
  676. return false;
  677. }
  678. return true;
  679. }
  680. static void adin1110_rx_mode_work(struct work_struct *work)
  681. {
  682. struct adin1110_port_priv *port_priv;
  683. struct adin1110_priv *priv;
  684. port_priv = container_of(work, struct adin1110_port_priv, rx_mode_work);
  685. priv = port_priv->priv;
  686. mutex_lock(&priv->lock);
  687. adin1110_setup_rx_mode(port_priv);
  688. mutex_unlock(&priv->lock);
  689. }
  690. static void adin1110_set_rx_mode(struct net_device *dev)
  691. {
  692. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  693. struct adin1110_priv *priv = port_priv->priv;
  694. spin_lock(&priv->state_lock);
  695. port_priv->flags = dev->flags;
  696. schedule_work(&port_priv->rx_mode_work);
  697. spin_unlock(&priv->state_lock);
  698. }
  699. static int adin1110_net_open(struct net_device *net_dev)
  700. {
  701. struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
  702. struct adin1110_priv *priv = port_priv->priv;
  703. u32 val;
  704. int ret;
  705. mutex_lock(&priv->lock);
  706. /* Configure MAC to compute and append the FCS itself. */
  707. ret = adin1110_write_reg(priv, ADIN1110_CONFIG2, ADIN1110_CRC_APPEND);
  708. if (ret < 0)
  709. goto out;
  710. val = ADIN1110_TX_RDY_IRQ | ADIN1110_RX_RDY_IRQ | ADIN1110_SPI_ERR_IRQ;
  711. if (priv->cfg->id == ADIN2111_MAC)
  712. val |= ADIN2111_RX_RDY_IRQ;
  713. priv->irq_mask = val;
  714. ret = adin1110_write_reg(priv, ADIN1110_IMASK1, ~val);
  715. if (ret < 0) {
  716. netdev_err(net_dev, "Failed to enable chip IRQs: %d\n", ret);
  717. goto out;
  718. }
  719. ret = adin1110_read_reg(priv, ADIN1110_TX_SPACE, &val);
  720. if (ret < 0) {
  721. netdev_err(net_dev, "Failed to read TX FIFO space: %d\n", ret);
  722. goto out;
  723. }
  724. priv->tx_space = 2 * val;
  725. port_priv->state = BR_STATE_FORWARDING;
  726. ret = adin1110_set_mac_address(net_dev, net_dev->dev_addr);
  727. if (ret < 0) {
  728. netdev_err(net_dev, "Could not set MAC address: %pM, %d\n",
  729. net_dev->dev_addr, ret);
  730. goto out;
  731. }
  732. ret = adin1110_set_bits(priv, ADIN1110_CONFIG1, ADIN1110_CONFIG1_SYNC,
  733. ADIN1110_CONFIG1_SYNC);
  734. out:
  735. mutex_unlock(&priv->lock);
  736. if (ret < 0)
  737. return ret;
  738. phy_start(port_priv->phydev);
  739. netif_start_queue(net_dev);
  740. return 0;
  741. }
  742. static int adin1110_net_stop(struct net_device *net_dev)
  743. {
  744. struct adin1110_port_priv *port_priv = netdev_priv(net_dev);
  745. struct adin1110_priv *priv = port_priv->priv;
  746. u32 mask;
  747. int ret;
  748. mask = !port_priv->nr ? ADIN2111_RX_RDY_IRQ : ADIN1110_RX_RDY_IRQ;
  749. /* Disable RX RDY IRQs */
  750. mutex_lock(&priv->lock);
  751. ret = adin1110_set_bits(priv, ADIN1110_IMASK1, mask, mask);
  752. mutex_unlock(&priv->lock);
  753. if (ret < 0)
  754. return ret;
  755. netif_stop_queue(port_priv->netdev);
  756. flush_work(&port_priv->tx_work);
  757. phy_stop(port_priv->phydev);
  758. return 0;
  759. }
  760. static void adin1110_tx_work(struct work_struct *work)
  761. {
  762. struct adin1110_port_priv *port_priv;
  763. struct adin1110_priv *priv;
  764. struct sk_buff *txb;
  765. int ret;
  766. port_priv = container_of(work, struct adin1110_port_priv, tx_work);
  767. priv = port_priv->priv;
  768. mutex_lock(&priv->lock);
  769. while ((txb = skb_dequeue(&port_priv->txq))) {
  770. ret = adin1110_write_fifo(port_priv, txb);
  771. if (ret < 0)
  772. dev_err_ratelimited(&priv->spidev->dev,
  773. "Frame write error: %d\n", ret);
  774. dev_kfree_skb(txb);
  775. }
  776. mutex_unlock(&priv->lock);
  777. }
  778. static netdev_tx_t adin1110_start_xmit(struct sk_buff *skb, struct net_device *dev)
  779. {
  780. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  781. struct adin1110_priv *priv = port_priv->priv;
  782. netdev_tx_t netdev_ret = NETDEV_TX_OK;
  783. u32 tx_space_needed;
  784. tx_space_needed = skb->len + ADIN1110_FRAME_HEADER_LEN + ADIN1110_INTERNAL_SIZE_HEADER_LEN;
  785. if (tx_space_needed > priv->tx_space) {
  786. netif_stop_queue(dev);
  787. netdev_ret = NETDEV_TX_BUSY;
  788. } else {
  789. priv->tx_space -= tx_space_needed;
  790. skb_queue_tail(&port_priv->txq, skb);
  791. }
  792. schedule_work(&port_priv->tx_work);
  793. return netdev_ret;
  794. }
  795. static void adin1110_ndo_get_stats64(struct net_device *dev,
  796. struct rtnl_link_stats64 *storage)
  797. {
  798. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  799. storage->rx_packets = port_priv->rx_packets;
  800. storage->tx_packets = port_priv->tx_packets;
  801. storage->rx_bytes = port_priv->rx_bytes;
  802. storage->tx_bytes = port_priv->tx_bytes;
  803. }
  804. static int adin1110_port_get_port_parent_id(struct net_device *dev,
  805. struct netdev_phys_item_id *ppid)
  806. {
  807. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  808. struct adin1110_priv *priv = port_priv->priv;
  809. ppid->id_len = strnlen(priv->mii_bus_name, MAX_PHYS_ITEM_ID_LEN);
  810. memcpy(ppid->id, priv->mii_bus_name, ppid->id_len);
  811. return 0;
  812. }
  813. static int adin1110_ndo_get_phys_port_name(struct net_device *dev,
  814. char *name, size_t len)
  815. {
  816. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  817. int err;
  818. err = snprintf(name, len, "p%d", port_priv->nr);
  819. if (err >= len)
  820. return -EINVAL;
  821. return 0;
  822. }
  823. static const struct net_device_ops adin1110_netdev_ops = {
  824. .ndo_open = adin1110_net_open,
  825. .ndo_stop = adin1110_net_stop,
  826. .ndo_eth_ioctl = adin1110_ioctl,
  827. .ndo_start_xmit = adin1110_start_xmit,
  828. .ndo_set_mac_address = adin1110_ndo_set_mac_address,
  829. .ndo_set_rx_mode = adin1110_set_rx_mode,
  830. .ndo_validate_addr = eth_validate_addr,
  831. .ndo_get_stats64 = adin1110_ndo_get_stats64,
  832. .ndo_get_port_parent_id = adin1110_port_get_port_parent_id,
  833. .ndo_get_phys_port_name = adin1110_ndo_get_phys_port_name,
  834. };
  835. static void adin1110_get_drvinfo(struct net_device *dev,
  836. struct ethtool_drvinfo *di)
  837. {
  838. strscpy(di->driver, "ADIN1110", sizeof(di->driver));
  839. strscpy(di->bus_info, dev_name(dev->dev.parent), sizeof(di->bus_info));
  840. }
  841. static const struct ethtool_ops adin1110_ethtool_ops = {
  842. .get_drvinfo = adin1110_get_drvinfo,
  843. .get_link = ethtool_op_get_link,
  844. .get_link_ksettings = phy_ethtool_get_link_ksettings,
  845. .set_link_ksettings = phy_ethtool_set_link_ksettings,
  846. };
  847. static void adin1110_adjust_link(struct net_device *dev)
  848. {
  849. struct phy_device *phydev = dev->phydev;
  850. if (!phydev->link)
  851. phy_print_status(phydev);
  852. }
  853. /* PHY ID is stored in the MAC registers too,
  854. * check spi connection by reading it.
  855. */
  856. static int adin1110_check_spi(struct adin1110_priv *priv)
  857. {
  858. int ret;
  859. u32 val;
  860. ret = adin1110_read_reg(priv, ADIN1110_PHY_ID, &val);
  861. if (ret < 0)
  862. return ret;
  863. if (val != priv->cfg->phy_id_val) {
  864. dev_err(&priv->spidev->dev, "PHY ID expected: %x, read: %x\n",
  865. priv->cfg->phy_id_val, val);
  866. return -EIO;
  867. }
  868. return 0;
  869. }
  870. static int adin1110_hw_forwarding(struct adin1110_priv *priv, bool enable)
  871. {
  872. int ret;
  873. int i;
  874. priv->forwarding = enable;
  875. if (!priv->forwarding) {
  876. for (i = ADIN_MAC_FDB_ADDR_SLOT; i < ADIN_MAC_MAX_ADDR_SLOTS; i++) {
  877. ret = adin1110_clear_mac_address(priv, i);
  878. if (ret < 0)
  879. return ret;
  880. }
  881. }
  882. /* Forwarding is optimised when MAC runs in Cut Through mode. */
  883. ret = adin1110_set_bits(priv, ADIN1110_CONFIG2,
  884. ADIN2111_PORT_CUT_THRU_EN,
  885. priv->forwarding ? ADIN2111_PORT_CUT_THRU_EN : 0);
  886. if (ret < 0)
  887. return ret;
  888. for (i = 0; i < priv->cfg->ports_nr; i++) {
  889. ret = adin1110_setup_rx_mode(priv->ports[i]);
  890. if (ret < 0)
  891. return ret;
  892. }
  893. return ret;
  894. }
  895. static int adin1110_port_bridge_join(struct adin1110_port_priv *port_priv,
  896. struct net_device *bridge)
  897. {
  898. struct adin1110_priv *priv = port_priv->priv;
  899. int ret;
  900. port_priv->bridge = bridge;
  901. if (adin1110_can_offload_forwarding(priv)) {
  902. mutex_lock(&priv->lock);
  903. ret = adin1110_hw_forwarding(priv, true);
  904. mutex_unlock(&priv->lock);
  905. if (ret < 0)
  906. return ret;
  907. }
  908. return adin1110_set_mac_address(port_priv->netdev, bridge->dev_addr);
  909. }
  910. static int adin1110_port_bridge_leave(struct adin1110_port_priv *port_priv,
  911. struct net_device *bridge)
  912. {
  913. struct adin1110_priv *priv = port_priv->priv;
  914. int ret;
  915. port_priv->bridge = NULL;
  916. mutex_lock(&priv->lock);
  917. ret = adin1110_hw_forwarding(priv, false);
  918. mutex_unlock(&priv->lock);
  919. return ret;
  920. }
  921. static bool adin1110_port_dev_check(const struct net_device *dev)
  922. {
  923. return dev->netdev_ops == &adin1110_netdev_ops;
  924. }
  925. static int adin1110_netdevice_event(struct notifier_block *unused,
  926. unsigned long event, void *ptr)
  927. {
  928. struct net_device *dev = netdev_notifier_info_to_dev(ptr);
  929. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  930. struct netdev_notifier_changeupper_info *info = ptr;
  931. int ret = 0;
  932. if (!adin1110_port_dev_check(dev))
  933. return NOTIFY_DONE;
  934. switch (event) {
  935. case NETDEV_CHANGEUPPER:
  936. if (netif_is_bridge_master(info->upper_dev)) {
  937. if (info->linking)
  938. ret = adin1110_port_bridge_join(port_priv, info->upper_dev);
  939. else
  940. ret = adin1110_port_bridge_leave(port_priv, info->upper_dev);
  941. }
  942. break;
  943. default:
  944. break;
  945. }
  946. return notifier_from_errno(ret);
  947. }
  948. static struct notifier_block adin1110_netdevice_nb = {
  949. .notifier_call = adin1110_netdevice_event,
  950. };
  951. static void adin1110_disconnect_phy(void *data)
  952. {
  953. phy_disconnect(data);
  954. }
  955. static int adin1110_port_set_forwarding_state(struct adin1110_port_priv *port_priv)
  956. {
  957. struct adin1110_priv *priv = port_priv->priv;
  958. int ret;
  959. port_priv->state = BR_STATE_FORWARDING;
  960. mutex_lock(&priv->lock);
  961. ret = adin1110_set_mac_address(port_priv->netdev,
  962. port_priv->netdev->dev_addr);
  963. if (ret < 0)
  964. goto out;
  965. if (adin1110_can_offload_forwarding(priv))
  966. ret = adin1110_hw_forwarding(priv, true);
  967. else
  968. ret = adin1110_setup_rx_mode(port_priv);
  969. out:
  970. mutex_unlock(&priv->lock);
  971. return ret;
  972. }
  973. static int adin1110_port_set_blocking_state(struct adin1110_port_priv *port_priv)
  974. {
  975. u8 mac[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x00};
  976. struct adin1110_priv *priv = port_priv->priv;
  977. u8 mask[ETH_ALEN];
  978. u32 port_rules;
  979. int mac_slot;
  980. int ret;
  981. port_priv->state = BR_STATE_BLOCKING;
  982. mutex_lock(&priv->lock);
  983. mac_slot = (!port_priv->nr) ? ADIN_MAC_P1_ADDR_SLOT : ADIN_MAC_P2_ADDR_SLOT;
  984. ret = adin1110_clear_mac_address(priv, mac_slot);
  985. if (ret < 0)
  986. goto out;
  987. ret = adin1110_hw_forwarding(priv, false);
  988. if (ret < 0)
  989. goto out;
  990. /* Allow only BPDUs to be passed to the CPU */
  991. eth_broadcast_addr(mask);
  992. port_rules = adin1110_port_rules(port_priv, true, false);
  993. ret = adin1110_write_mac_address(port_priv, mac_slot, mac,
  994. mask, port_rules);
  995. out:
  996. mutex_unlock(&priv->lock);
  997. return ret;
  998. }
  999. /* ADIN1110/2111 does not have any native STP support.
  1000. * Listen for bridge core state changes and
  1001. * allow all frames to pass or only the BPDUs.
  1002. */
  1003. static int adin1110_port_attr_stp_state_set(struct adin1110_port_priv *port_priv,
  1004. u8 state)
  1005. {
  1006. switch (state) {
  1007. case BR_STATE_FORWARDING:
  1008. return adin1110_port_set_forwarding_state(port_priv);
  1009. case BR_STATE_LEARNING:
  1010. case BR_STATE_LISTENING:
  1011. case BR_STATE_DISABLED:
  1012. case BR_STATE_BLOCKING:
  1013. return adin1110_port_set_blocking_state(port_priv);
  1014. default:
  1015. return -EINVAL;
  1016. }
  1017. }
  1018. static int adin1110_port_attr_set(struct net_device *dev, const void *ctx,
  1019. const struct switchdev_attr *attr,
  1020. struct netlink_ext_ack *extack)
  1021. {
  1022. struct adin1110_port_priv *port_priv = netdev_priv(dev);
  1023. switch (attr->id) {
  1024. case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
  1025. return adin1110_port_attr_stp_state_set(port_priv,
  1026. attr->u.stp_state);
  1027. default:
  1028. return -EOPNOTSUPP;
  1029. }
  1030. }
  1031. static int adin1110_switchdev_blocking_event(struct notifier_block *unused,
  1032. unsigned long event,
  1033. void *ptr)
  1034. {
  1035. struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
  1036. int ret;
  1037. if (event == SWITCHDEV_PORT_ATTR_SET) {
  1038. ret = switchdev_handle_port_attr_set(netdev, ptr,
  1039. adin1110_port_dev_check,
  1040. adin1110_port_attr_set);
  1041. return notifier_from_errno(ret);
  1042. }
  1043. return NOTIFY_DONE;
  1044. }
  1045. static struct notifier_block adin1110_switchdev_blocking_notifier = {
  1046. .notifier_call = adin1110_switchdev_blocking_event,
  1047. };
  1048. static void adin1110_fdb_offload_notify(struct net_device *netdev,
  1049. struct switchdev_notifier_fdb_info *rcv)
  1050. {
  1051. struct switchdev_notifier_fdb_info info = {};
  1052. info.addr = rcv->addr;
  1053. info.vid = rcv->vid;
  1054. info.offloaded = true;
  1055. call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
  1056. netdev, &info.info, NULL);
  1057. }
  1058. static int adin1110_fdb_add(struct adin1110_port_priv *port_priv,
  1059. struct switchdev_notifier_fdb_info *fdb)
  1060. {
  1061. struct adin1110_priv *priv = port_priv->priv;
  1062. struct adin1110_port_priv *other_port;
  1063. u8 mask[ETH_ALEN];
  1064. u32 port_rules;
  1065. int mac_nr;
  1066. u32 val;
  1067. int ret;
  1068. netdev_dbg(port_priv->netdev,
  1069. "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
  1070. __func__, fdb->addr, fdb->vid, fdb->added_by_user,
  1071. fdb->offloaded, port_priv->nr);
  1072. if (!priv->forwarding)
  1073. return 0;
  1074. if (fdb->is_local)
  1075. return -EINVAL;
  1076. /* Find free FDB slot on device. */
  1077. for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
  1078. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
  1079. if (ret < 0)
  1080. return ret;
  1081. if (!val)
  1082. break;
  1083. }
  1084. if (mac_nr == ADIN_MAC_MAX_ADDR_SLOTS)
  1085. return -ENOMEM;
  1086. other_port = priv->ports[!port_priv->nr];
  1087. port_rules = adin1110_port_rules(other_port, false, true);
  1088. eth_broadcast_addr(mask);
  1089. return adin1110_write_mac_address(other_port, mac_nr, (u8 *)fdb->addr,
  1090. mask, port_rules);
  1091. }
  1092. static int adin1110_read_mac(struct adin1110_priv *priv, int mac_nr, u8 *addr)
  1093. {
  1094. u32 val;
  1095. int ret;
  1096. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_UPR + (mac_nr * 2), &val);
  1097. if (ret < 0)
  1098. return ret;
  1099. put_unaligned_be16(val, addr);
  1100. ret = adin1110_read_reg(priv, ADIN1110_MAC_ADDR_FILTER_LWR + (mac_nr * 2), &val);
  1101. if (ret < 0)
  1102. return ret;
  1103. put_unaligned_be32(val, addr + 2);
  1104. return 0;
  1105. }
  1106. static int adin1110_fdb_del(struct adin1110_port_priv *port_priv,
  1107. struct switchdev_notifier_fdb_info *fdb)
  1108. {
  1109. struct adin1110_priv *priv = port_priv->priv;
  1110. u8 addr[ETH_ALEN];
  1111. int mac_nr;
  1112. int ret;
  1113. netdev_dbg(port_priv->netdev,
  1114. "DEBUG: %s: MACID = %pM vid = %u flags = %u %u -- port %d\n",
  1115. __func__, fdb->addr, fdb->vid, fdb->added_by_user,
  1116. fdb->offloaded, port_priv->nr);
  1117. if (fdb->is_local)
  1118. return -EINVAL;
  1119. for (mac_nr = ADIN_MAC_FDB_ADDR_SLOT; mac_nr < ADIN_MAC_MAX_ADDR_SLOTS; mac_nr++) {
  1120. ret = adin1110_read_mac(priv, mac_nr, addr);
  1121. if (ret < 0)
  1122. return ret;
  1123. if (ether_addr_equal(addr, fdb->addr)) {
  1124. ret = adin1110_clear_mac_address(priv, mac_nr);
  1125. if (ret < 0)
  1126. return ret;
  1127. }
  1128. }
  1129. return 0;
  1130. }
  1131. static void adin1110_switchdev_event_work(struct work_struct *work)
  1132. {
  1133. struct adin1110_switchdev_event_work *switchdev_work;
  1134. struct adin1110_port_priv *port_priv;
  1135. int ret;
  1136. switchdev_work = container_of(work, struct adin1110_switchdev_event_work, work);
  1137. port_priv = switchdev_work->port_priv;
  1138. mutex_lock(&port_priv->priv->lock);
  1139. switch (switchdev_work->event) {
  1140. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1141. ret = adin1110_fdb_add(port_priv, &switchdev_work->fdb_info);
  1142. if (!ret)
  1143. adin1110_fdb_offload_notify(port_priv->netdev,
  1144. &switchdev_work->fdb_info);
  1145. break;
  1146. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1147. adin1110_fdb_del(port_priv, &switchdev_work->fdb_info);
  1148. break;
  1149. default:
  1150. break;
  1151. }
  1152. mutex_unlock(&port_priv->priv->lock);
  1153. kfree(switchdev_work->fdb_info.addr);
  1154. kfree(switchdev_work);
  1155. dev_put(port_priv->netdev);
  1156. }
  1157. /* called under rcu_read_lock() */
  1158. static int adin1110_switchdev_event(struct notifier_block *unused,
  1159. unsigned long event, void *ptr)
  1160. {
  1161. struct net_device *netdev = switchdev_notifier_info_to_dev(ptr);
  1162. struct adin1110_port_priv *port_priv = netdev_priv(netdev);
  1163. struct adin1110_switchdev_event_work *switchdev_work;
  1164. struct switchdev_notifier_fdb_info *fdb_info = ptr;
  1165. if (!adin1110_port_dev_check(netdev))
  1166. return NOTIFY_DONE;
  1167. switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
  1168. if (WARN_ON(!switchdev_work))
  1169. return NOTIFY_BAD;
  1170. INIT_WORK(&switchdev_work->work, adin1110_switchdev_event_work);
  1171. switchdev_work->port_priv = port_priv;
  1172. switchdev_work->event = event;
  1173. switch (event) {
  1174. case SWITCHDEV_FDB_ADD_TO_DEVICE:
  1175. case SWITCHDEV_FDB_DEL_TO_DEVICE:
  1176. memcpy(&switchdev_work->fdb_info, ptr,
  1177. sizeof(switchdev_work->fdb_info));
  1178. switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
  1179. if (!switchdev_work->fdb_info.addr)
  1180. goto err_addr_alloc;
  1181. ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
  1182. fdb_info->addr);
  1183. dev_hold(netdev);
  1184. break;
  1185. default:
  1186. kfree(switchdev_work);
  1187. return NOTIFY_DONE;
  1188. }
  1189. queue_work(system_long_wq, &switchdev_work->work);
  1190. return NOTIFY_DONE;
  1191. err_addr_alloc:
  1192. kfree(switchdev_work);
  1193. return NOTIFY_BAD;
  1194. }
  1195. static struct notifier_block adin1110_switchdev_notifier = {
  1196. .notifier_call = adin1110_switchdev_event,
  1197. };
  1198. static void adin1110_unregister_notifiers(void)
  1199. {
  1200. unregister_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
  1201. unregister_switchdev_notifier(&adin1110_switchdev_notifier);
  1202. unregister_netdevice_notifier(&adin1110_netdevice_nb);
  1203. }
  1204. static int adin1110_setup_notifiers(void)
  1205. {
  1206. int ret;
  1207. ret = register_netdevice_notifier(&adin1110_netdevice_nb);
  1208. if (ret < 0)
  1209. return ret;
  1210. ret = register_switchdev_notifier(&adin1110_switchdev_notifier);
  1211. if (ret < 0)
  1212. goto err_netdev;
  1213. ret = register_switchdev_blocking_notifier(&adin1110_switchdev_blocking_notifier);
  1214. if (ret < 0)
  1215. goto err_sdev;
  1216. return 0;
  1217. err_sdev:
  1218. unregister_switchdev_notifier(&adin1110_switchdev_notifier);
  1219. err_netdev:
  1220. unregister_netdevice_notifier(&adin1110_netdevice_nb);
  1221. return ret;
  1222. }
  1223. static int adin1110_probe_netdevs(struct adin1110_priv *priv)
  1224. {
  1225. struct device *dev = &priv->spidev->dev;
  1226. struct adin1110_port_priv *port_priv;
  1227. struct net_device *netdev;
  1228. int ret;
  1229. int i;
  1230. for (i = 0; i < priv->cfg->ports_nr; i++) {
  1231. netdev = devm_alloc_etherdev(dev, sizeof(*port_priv));
  1232. if (!netdev)
  1233. return -ENOMEM;
  1234. port_priv = netdev_priv(netdev);
  1235. port_priv->netdev = netdev;
  1236. port_priv->priv = priv;
  1237. port_priv->cfg = priv->cfg;
  1238. port_priv->nr = i;
  1239. priv->ports[i] = port_priv;
  1240. SET_NETDEV_DEV(netdev, dev);
  1241. ret = device_get_ethdev_address(dev, netdev);
  1242. if (ret < 0)
  1243. return ret;
  1244. netdev->irq = priv->spidev->irq;
  1245. INIT_WORK(&port_priv->tx_work, adin1110_tx_work);
  1246. INIT_WORK(&port_priv->rx_mode_work, adin1110_rx_mode_work);
  1247. skb_queue_head_init(&port_priv->txq);
  1248. netif_carrier_off(netdev);
  1249. netdev->if_port = IF_PORT_10BASET;
  1250. netdev->netdev_ops = &adin1110_netdev_ops;
  1251. netdev->ethtool_ops = &adin1110_ethtool_ops;
  1252. netdev->priv_flags |= IFF_UNICAST_FLT;
  1253. netdev->features |= NETIF_F_NETNS_LOCAL;
  1254. port_priv->phydev = get_phy_device(priv->mii_bus, i + 1, false);
  1255. if (IS_ERR(port_priv->phydev)) {
  1256. netdev_err(netdev, "Could not find PHY with device address: %d.\n", i);
  1257. return PTR_ERR(port_priv->phydev);
  1258. }
  1259. port_priv->phydev = phy_connect(netdev,
  1260. phydev_name(port_priv->phydev),
  1261. adin1110_adjust_link,
  1262. PHY_INTERFACE_MODE_INTERNAL);
  1263. if (IS_ERR(port_priv->phydev)) {
  1264. netdev_err(netdev, "Could not connect PHY with device address: %d.\n", i);
  1265. return PTR_ERR(port_priv->phydev);
  1266. }
  1267. ret = devm_add_action_or_reset(dev, adin1110_disconnect_phy,
  1268. port_priv->phydev);
  1269. if (ret < 0)
  1270. return ret;
  1271. }
  1272. /* ADIN1110 INT_N pin will be used to signal the host */
  1273. ret = devm_request_threaded_irq(dev, priv->spidev->irq, NULL,
  1274. adin1110_irq,
  1275. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  1276. dev_name(dev), priv);
  1277. if (ret < 0)
  1278. return ret;
  1279. for (i = 0; i < priv->cfg->ports_nr; i++) {
  1280. ret = devm_register_netdev(dev, priv->ports[i]->netdev);
  1281. if (ret < 0) {
  1282. dev_err(dev, "Failed to register network device.\n");
  1283. return ret;
  1284. }
  1285. }
  1286. return 0;
  1287. }
  1288. static int adin1110_probe(struct spi_device *spi)
  1289. {
  1290. const struct spi_device_id *dev_id = spi_get_device_id(spi);
  1291. struct device *dev = &spi->dev;
  1292. struct adin1110_priv *priv;
  1293. int ret;
  1294. priv = devm_kzalloc(dev, sizeof(struct adin1110_priv), GFP_KERNEL);
  1295. if (!priv)
  1296. return -ENOMEM;
  1297. priv->spidev = spi;
  1298. priv->cfg = &adin1110_cfgs[dev_id->driver_data];
  1299. spi->bits_per_word = 8;
  1300. spi->mode = SPI_MODE_0;
  1301. mutex_init(&priv->lock);
  1302. spin_lock_init(&priv->state_lock);
  1303. /* use of CRC on control and data transactions is pin dependent */
  1304. priv->append_crc = device_property_read_bool(dev, "adi,spi-crc");
  1305. if (priv->append_crc)
  1306. crc8_populate_msb(adin1110_crc_table, 0x7);
  1307. ret = adin1110_check_spi(priv);
  1308. if (ret < 0) {
  1309. dev_err(dev, "Probe SPI Read check failed: %d\n", ret);
  1310. return ret;
  1311. }
  1312. ret = adin1110_write_reg(priv, ADIN1110_RESET, ADIN1110_SWRESET);
  1313. if (ret < 0)
  1314. return ret;
  1315. ret = adin1110_register_mdiobus(priv, dev);
  1316. if (ret < 0) {
  1317. dev_err(dev, "Could not register MDIO bus %d\n", ret);
  1318. return ret;
  1319. }
  1320. return adin1110_probe_netdevs(priv);
  1321. }
  1322. static const struct of_device_id adin1110_match_table[] = {
  1323. { .compatible = "adi,adin1110" },
  1324. { .compatible = "adi,adin2111" },
  1325. { }
  1326. };
  1327. MODULE_DEVICE_TABLE(of, adin1110_match_table);
  1328. static const struct spi_device_id adin1110_spi_id[] = {
  1329. { .name = "adin1110", .driver_data = ADIN1110_MAC },
  1330. { .name = "adin2111", .driver_data = ADIN2111_MAC },
  1331. { }
  1332. };
  1333. MODULE_DEVICE_TABLE(spi, adin1110_spi_id);
  1334. static struct spi_driver adin1110_driver = {
  1335. .driver = {
  1336. .name = "adin1110",
  1337. .of_match_table = adin1110_match_table,
  1338. },
  1339. .probe = adin1110_probe,
  1340. .id_table = adin1110_spi_id,
  1341. };
  1342. static int __init adin1110_driver_init(void)
  1343. {
  1344. int ret;
  1345. ret = adin1110_setup_notifiers();
  1346. if (ret < 0)
  1347. return ret;
  1348. ret = spi_register_driver(&adin1110_driver);
  1349. if (ret < 0) {
  1350. adin1110_unregister_notifiers();
  1351. return ret;
  1352. }
  1353. return 0;
  1354. }
  1355. static void __exit adin1110_exit(void)
  1356. {
  1357. adin1110_unregister_notifiers();
  1358. spi_unregister_driver(&adin1110_driver);
  1359. }
  1360. module_init(adin1110_driver_init);
  1361. module_exit(adin1110_exit);
  1362. MODULE_DESCRIPTION("ADIN1110 Network driver");
  1363. MODULE_AUTHOR("Alexandru Tachici <[email protected]>");
  1364. MODULE_LICENSE("Dual BSD/GPL");