0052-net-out-of-tree-fixes.patch 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409
  1. From 242801fc94db9ceb1e3e2a8b19fb2c57122e53f3 Mon Sep 17 00:00:00 2001
  2. From: John Crispin <[email protected]>
  3. Date: Mon, 21 Mar 2016 16:36:22 +0100
  4. Subject: [PATCH] net: out of tree fixes
  5. Signed-off-by: John Crispin <[email protected]>
  6. ---
  7. arch/arm/boot/dts/mt7623-evb.dts | 1 -
  8. arch/arm/boot/dts/mt7623.dtsi | 40 +-
  9. drivers/net/ethernet/mediatek/Makefile | 2 +-
  10. drivers/net/ethernet/mediatek/gsw_mt7620.h | 250 +++++++
  11. drivers/net/ethernet/mediatek/gsw_mt7623.c | 966 +++++++++++++++++++++++++++
  12. drivers/net/ethernet/mediatek/mt7530.c | 808 ++++++++++++++++++++++
  13. drivers/net/ethernet/mediatek/mt7530.h | 20 +
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 59 +-
  15. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 +
  16. lib/dynamic_queue_limits.c | 6 +-
  17. 10 files changed, 2110 insertions(+), 47 deletions(-)
  18. create mode 100644 drivers/net/ethernet/mediatek/gsw_mt7620.h
  19. create mode 100644 drivers/net/ethernet/mediatek/gsw_mt7623.c
  20. create mode 100644 drivers/net/ethernet/mediatek/mt7530.c
  21. create mode 100644 drivers/net/ethernet/mediatek/mt7530.h
  22. diff --git a/arch/arm/boot/dts/mt7623-evb.dts b/arch/arm/boot/dts/mt7623-evb.dts
  23. index 5e9381d..bc2b3f1 100644
  24. --- a/arch/arm/boot/dts/mt7623-evb.dts
  25. +++ b/arch/arm/boot/dts/mt7623-evb.dts
  26. @@ -425,7 +425,6 @@
  27. &usb1 {
  28. vusb33-supply = <&mt6323_vusb_reg>;
  29. vbus-supply = <&usb_p1_vbus>;
  30. -// mediatek,wakeup-src = <1>;
  31. status = "okay";
  32. };
  33. diff --git a/arch/arm/boot/dts/mt7623.dtsi b/arch/arm/boot/dts/mt7623.dtsi
  34. index 1ba7790..5926e14 100644
  35. --- a/arch/arm/boot/dts/mt7623.dtsi
  36. +++ b/arch/arm/boot/dts/mt7623.dtsi
  37. @@ -440,23 +440,30 @@
  38. };
  39. ethsys: syscon@1b000000 {
  40. - #address-cells = <1>;
  41. - #size-cells = <1>;
  42. compatible = "mediatek,mt2701-ethsys", "syscon";
  43. reg = <0 0x1b000000 0 0x1000>;
  44. + #reset-cells = <1>;
  45. #clock-cells = <1>;
  46. };
  47. eth: ethernet@1b100000 {
  48. compatible = "mediatek,mt7623-eth";
  49. - reg = <0 0x1b100000 0 0x10000>;
  50. + reg = <0 0x1b100000 0 0x20000>;
  51. - clocks = <&topckgen CLK_TOP_ETHIF_SEL>;
  52. - clock-names = "ethif";
  53. + clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
  54. + <&ethsys CLK_ETHSYS_ESW>,
  55. + <&ethsys CLK_ETHSYS_GP2>,
  56. + <&ethsys CLK_ETHSYS_GP1>;
  57. + clock-names = "ethif", "esw", "gp2", "gp1";
  58. interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_LOW>;
  59. power-domains = <&scpsys MT2701_POWER_DOMAIN_ETH>;
  60. + resets = <&ethsys 6>;
  61. + reset-names = "eth";
  62. +
  63. mediatek,ethsys = <&ethsys>;
  64. + mediatek,pctl = <&syscfg_pctl_a>;
  65. +
  66. mediatek,switch = <&gsw>;
  67. #address-cells = <1>;
  68. @@ -468,6 +475,8 @@
  69. compatible = "mediatek,eth-mac";
  70. reg = <0>;
  71. + phy-handle = <&phy4>;
  72. +
  73. status = "disabled";
  74. };
  75. @@ -475,6 +484,7 @@
  76. compatible = "mediatek,eth-mac";
  77. reg = <1>;
  78. + phy-handle = <&phy5>;
  79. status = "disabled";
  80. };
  81. @@ -482,6 +492,16 @@
  82. #address-cells = <1>;
  83. #size-cells = <0>;
  84. + phy4: ethernet-phy@4 {
  85. + reg = <4>;
  86. + phy-mode = "rgmii";
  87. + };
  88. +
  89. + phy5: ethernet-phy@5 {
  90. + reg = <5>;
  91. + phy-mode = "rgmii";
  92. + };
  93. +
  94. phy1f: ethernet-phy@1f {
  95. reg = <0x1f>;
  96. phy-mode = "rgmii";
  97. @@ -491,14 +511,12 @@
  98. gsw: switch@1b100000 {
  99. compatible = "mediatek,mt7623-gsw";
  100. - reg = <0 0x1b110000 0 0x300000>;
  101. interrupt-parent = <&pio>;
  102. interrupts = <168 IRQ_TYPE_EDGE_RISING>;
  103. - clocks = <&apmixedsys CLK_APMIXED_TRGPLL>,
  104. - <&ethsys CLK_ETHSYS_ESW>,
  105. - <&ethsys CLK_ETHSYS_GP2>,
  106. - <&ethsys CLK_ETHSYS_GP1>;
  107. - clock-names = "trgpll", "esw", "gp2", "gp1";
  108. + resets = <&ethsys 2>;
  109. + reset-names = "eth";
  110. + clocks = <&apmixedsys CLK_APMIXED_TRGPLL>;
  111. + clock-names = "trgpll";
  112. mt7530-supply = <&mt6323_vpa_reg>;
  113. mediatek,pctl-regmap = <&syscfg_pctl_a>;
  114. mediatek,ethsys = <&ethsys>;
  115. diff --git a/drivers/net/ethernet/mediatek/Makefile b/drivers/net/ethernet/mediatek/Makefile
  116. index aa3f1c8..82001c4 100644
  117. --- a/drivers/net/ethernet/mediatek/Makefile
  118. +++ b/drivers/net/ethernet/mediatek/Makefile
  119. @@ -2,4 +2,4 @@
  120. # Makefile for the Mediatek SoCs built-in ethernet macs
  121. #
  122. -obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth_soc.o
  123. +obj-$(CONFIG_NET_MEDIATEK_SOC) += mt7530.o gsw_mt7623.o mtk_eth_soc.o
  124. diff --git a/drivers/net/ethernet/mediatek/gsw_mt7620.h b/drivers/net/ethernet/mediatek/gsw_mt7620.h
  125. new file mode 100644
  126. index 0000000..7013803
  127. --- /dev/null
  128. +++ b/drivers/net/ethernet/mediatek/gsw_mt7620.h
  129. @@ -0,0 +1,250 @@
  130. +/* This program is free software; you can redistribute it and/or modify
  131. + * it under the terms of the GNU General Public License as published by
  132. + * the Free Software Foundation; version 2 of the License
  133. + *
  134. + * This program is distributed in the hope that it will be useful,
  135. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  136. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  137. + * GNU General Public License for more details.
  138. + *
  139. + * Copyright (C) 2009-2016 John Crispin <[email protected]>
  140. + * Copyright (C) 2009-2016 Felix Fietkau <[email protected]>
  141. + * Copyright (C) 2013-2016 Michael Lee <[email protected]>
  142. + */
  143. +
  144. +#ifndef _RALINK_GSW_MT7620_H__
  145. +#define _RALINK_GSW_MT7620_H__
  146. +
  147. +#define GSW_REG_PHY_TIMEOUT (5 * HZ)
  148. +
  149. +#define MT7620_GSW_REG_PIAC 0x0004
  150. +
  151. +#define GSW_NUM_VLANS 16
  152. +#define GSW_NUM_VIDS 4096
  153. +#define GSW_NUM_PORTS 7
  154. +#define GSW_PORT6 6
  155. +
  156. +#define GSW_MDIO_ACCESS BIT(31)
  157. +#define GSW_MDIO_READ BIT(19)
  158. +#define GSW_MDIO_WRITE BIT(18)
  159. +#define GSW_MDIO_START BIT(16)
  160. +#define GSW_MDIO_ADDR_SHIFT 20
  161. +#define GSW_MDIO_REG_SHIFT 25
  162. +
  163. +#define GSW_REG_PORT_PMCR(x) (0x3000 + (x * 0x100))
  164. +#define GSW_REG_PORT_STATUS(x) (0x3008 + (x * 0x100))
  165. +#define GSW_REG_SMACCR0 0x3fE4
  166. +#define GSW_REG_SMACCR1 0x3fE8
  167. +#define GSW_REG_CKGCR 0x3ff0
  168. +
  169. +#define GSW_REG_IMR 0x7008
  170. +#define GSW_REG_ISR 0x700c
  171. +#define GSW_REG_GPC1 0x7014
  172. +
  173. +#define SYSC_REG_CHIP_REV_ID 0x0c
  174. +#define SYSC_REG_CFG 0x10
  175. +#define SYSC_REG_CFG1 0x14
  176. +#define RST_CTRL_MCM BIT(2)
  177. +#define SYSC_PAD_RGMII2_MDIO 0x58
  178. +#define SYSC_GPIO_MODE 0x60
  179. +
  180. +#define PORT_IRQ_ST_CHG 0x7f
  181. +
  182. +#define MT7621_ESW_PHY_POLLING 0x0000
  183. +#define MT7620_ESW_PHY_POLLING 0x7000
  184. +
  185. +#define PMCR_IPG BIT(18)
  186. +#define PMCR_MAC_MODE BIT(16)
  187. +#define PMCR_FORCE BIT(15)
  188. +#define PMCR_TX_EN BIT(14)
  189. +#define PMCR_RX_EN BIT(13)
  190. +#define PMCR_BACKOFF BIT(9)
  191. +#define PMCR_BACKPRES BIT(8)
  192. +#define PMCR_RX_FC BIT(5)
  193. +#define PMCR_TX_FC BIT(4)
  194. +#define PMCR_SPEED(_x) (_x << 2)
  195. +#define PMCR_DUPLEX BIT(1)
  196. +#define PMCR_LINK BIT(0)
  197. +
  198. +#define PHY_AN_EN BIT(31)
  199. +#define PHY_PRE_EN BIT(30)
  200. +#define PMY_MDC_CONF(_x) ((_x & 0x3f) << 24)
  201. +
  202. +/* ethernet subsystem config register */
  203. +#define ETHSYS_SYSCFG0 0x14
  204. +/* ethernet subsystem clock register */
  205. +#define ETHSYS_CLKCFG0 0x2c
  206. +#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
  207. +
  208. +/* p5 RGMII wrapper TX clock control register */
  209. +#define MT7530_P5RGMIITXCR 0x7b04
  210. +/* p5 RGMII wrapper RX clock control register */
  211. +#define MT7530_P5RGMIIRXCR 0x7b00
  212. +/* TRGMII TDX ODT registers */
  213. +#define MT7530_TRGMII_TD0_ODT 0x7a54
  214. +#define MT7530_TRGMII_TD1_ODT 0x7a5c
  215. +#define MT7530_TRGMII_TD2_ODT 0x7a64
  216. +#define MT7530_TRGMII_TD3_ODT 0x7a6c
  217. +#define MT7530_TRGMII_TD4_ODT 0x7a74
  218. +#define MT7530_TRGMII_TD5_ODT 0x7a7c
  219. +/* TRGMII TCK ctrl register */
  220. +#define MT7530_TRGMII_TCK_CTRL 0x7a78
  221. +/* TRGMII Tx ctrl register */
  222. +#define MT7530_TRGMII_TXCTRL 0x7a40
  223. +/* port 6 extended control register */
  224. +#define MT7530_P6ECR 0x7830
  225. +/* IO driver control register */
  226. +#define MT7530_IO_DRV_CR 0x7810
  227. +/* top signal control register */
  228. +#define MT7530_TOP_SIG_CTRL 0x7808
  229. +/* modified hwtrap register */
  230. +#define MT7530_MHWTRAP 0x7804
  231. +/* hwtrap status register */
  232. +#define MT7530_HWTRAP 0x7800
  233. +/* status interrupt register */
  234. +#define MT7530_SYS_INT_STS 0x700c
  235. +/* system nterrupt register */
  236. +#define MT7530_SYS_INT_EN 0x7008
  237. +/* system control register */
  238. +#define MT7530_SYS_CTRL 0x7000
  239. +/* port MAC status register */
  240. +#define MT7530_PMSR_P(x) (0x3008 + (x * 0x100))
  241. +/* port MAC control register */
  242. +#define MT7530_PMCR_P(x) (0x3000 + (x * 0x100))
  243. +
  244. +#define MT7621_XTAL_SHIFT 6
  245. +#define MT7621_XTAL_MASK 0x7
  246. +#define MT7621_XTAL_25 6
  247. +#define MT7621_XTAL_40 3
  248. +#define MT7621_MDIO_DRV_MASK (3 << 4)
  249. +#define MT7621_GE1_MODE_MASK (3 << 12)
  250. +
  251. +#define TRGMII_TXCTRL_TXC_INV BIT(30)
  252. +#define P6ECR_INTF_MODE_RGMII BIT(1)
  253. +#define P5RGMIIRXCR_C_ALIGN BIT(8)
  254. +#define P5RGMIIRXCR_DELAY_2 BIT(1)
  255. +#define P5RGMIITXCR_DELAY_2 (BIT(8) | BIT(2))
  256. +
  257. +/* TOP_SIG_CTRL bits */
  258. +#define TOP_SIG_CTRL_NORMAL (BIT(17) | BIT(16))
  259. +
  260. +/* MHWTRAP bits */
  261. +#define MHWTRAP_MANUAL BIT(16)
  262. +#define MHWTRAP_P5_MAC_SEL BIT(13)
  263. +#define MHWTRAP_P6_DIS BIT(8)
  264. +#define MHWTRAP_P5_RGMII_MODE BIT(7)
  265. +#define MHWTRAP_P5_DIS BIT(6)
  266. +#define MHWTRAP_PHY_ACCESS BIT(5)
  267. +
  268. +/* HWTRAP bits */
  269. +#define HWTRAP_XTAL_SHIFT 9
  270. +#define HWTRAP_XTAL_MASK 0x3
  271. +
  272. +/* SYS_CTRL bits */
  273. +#define SYS_CTRL_SW_RST BIT(1)
  274. +#define SYS_CTRL_REG_RST BIT(0)
  275. +
  276. +/* PMCR bits */
  277. +#define PMCR_IFG_XMIT_96 BIT(18)
  278. +#define PMCR_MAC_MODE BIT(16)
  279. +#define PMCR_FORCE_MODE BIT(15)
  280. +#define PMCR_TX_EN BIT(14)
  281. +#define PMCR_RX_EN BIT(13)
  282. +#define PMCR_BACK_PRES_EN BIT(9)
  283. +#define PMCR_BACKOFF_EN BIT(8)
  284. +#define PMCR_TX_FC_EN BIT(5)
  285. +#define PMCR_RX_FC_EN BIT(4)
  286. +#define PMCR_FORCE_SPEED_1000 BIT(3)
  287. +#define PMCR_FORCE_FDX BIT(1)
  288. +#define PMCR_FORCE_LNK BIT(0)
  289. +#define PMCR_FIXED_LINK (PMCR_IFG_XMIT_96 | PMCR_MAC_MODE | \
  290. + PMCR_FORCE_MODE | PMCR_TX_EN | PMCR_RX_EN | \
  291. + PMCR_BACK_PRES_EN | PMCR_BACKOFF_EN | \
  292. + PMCR_FORCE_SPEED_1000 | PMCR_FORCE_FDX | \
  293. + PMCR_FORCE_LNK)
  294. +
  295. +#define PMCR_FIXED_LINK_FC (PMCR_FIXED_LINK | \
  296. + PMCR_TX_FC_EN | PMCR_RX_FC_EN)
  297. +
  298. +/* TRGMII control registers */
  299. +#define GSW_INTF_MODE 0x390
  300. +#define GSW_TRGMII_TD0_ODT 0x354
  301. +#define GSW_TRGMII_TD1_ODT 0x35c
  302. +#define GSW_TRGMII_TD2_ODT 0x364
  303. +#define GSW_TRGMII_TD3_ODT 0x36c
  304. +#define GSW_TRGMII_TXCTL_ODT 0x374
  305. +#define GSW_TRGMII_TCK_ODT 0x37c
  306. +#define GSW_TRGMII_RCK_CTRL 0x300
  307. +
  308. +#define INTF_MODE_TRGMII BIT(1)
  309. +#define TRGMII_RCK_CTRL_RX_RST BIT(31)
  310. +
  311. +
  312. +/* possible XTAL speed */
  313. +#define MT7623_XTAL_40 0
  314. +#define MT7623_XTAL_20 1
  315. +#define MT7623_XTAL_25 3
  316. +
  317. +/* GPIO port control registers */
  318. +#define GPIO_OD33_CTRL8 0x4c0
  319. +#define GPIO_BIAS_CTRL 0xed0
  320. +#define GPIO_DRV_SEL10 0xf00
  321. +
  322. +/* on MT7620 the functio of port 4 can be software configured */
  323. +enum {
  324. + PORT4_EPHY = 0,
  325. + PORT4_EXT,
  326. +};
  327. +
  328. +/* struct mt7620_gsw - the structure that holds the SoC specific data
  329. + * @dev: The Device struct
  330. + * @base: The base address
  331. + * @piac_offset: The PIAC base may change depending on SoC
  332. + * @irq: The IRQ we are using
  333. + * @port4: The port4 mode on MT7620
  334. + * @autopoll: Is MDIO autopolling enabled
  335. + * @ethsys: The ethsys register map
  336. + * @pctl: The pin control register map
  337. + * @clk_trgpll: The trgmii pll clock
  338. + */
  339. +struct mt7620_gsw {
  340. + struct mtk_eth *eth;
  341. + struct device *dev;
  342. + void __iomem *base;
  343. + u32 piac_offset;
  344. + int irq;
  345. + int port4;
  346. + unsigned long int autopoll;
  347. +
  348. + struct regmap *ethsys;
  349. + struct regmap *pctl;
  350. +
  351. + struct clk *clk_trgpll;
  352. +
  353. + int trgmii_force;
  354. +};
  355. +
  356. +/* switch register I/O wrappers */
  357. +void mtk_switch_w32(struct mt7620_gsw *gsw, u32 val, unsigned reg);
  358. +u32 mtk_switch_r32(struct mt7620_gsw *gsw, unsigned reg);
  359. +
  360. +/* the callback used by the driver core to bringup the switch */
  361. +int mtk_gsw_init(struct mtk_eth *eth);
  362. +
  363. +/* MDIO access wrappers */
  364. +int mt7620_mdio_write(struct mii_bus *bus, int phy_addr, int phy_reg, u16 val);
  365. +int mt7620_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg);
  366. +void mt7620_mdio_link_adjust(struct mtk_eth *eth, int port);
  367. +int mt7620_has_carrier(struct mtk_eth *eth);
  368. +void mt7620_print_link_state(struct mtk_eth *eth, int port, int link,
  369. + int speed, int duplex);
  370. +void mt7530_mdio_w32(struct mt7620_gsw *gsw, u32 reg, u32 val);
  371. +u32 mt7530_mdio_r32(struct mt7620_gsw *gsw, u32 reg);
  372. +void mt7530_mdio_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, u32 reg);
  373. +
  374. +u32 _mtk_mdio_write(struct mtk_eth *eth, u32 phy_addr,
  375. + u32 phy_register, u32 write_data);
  376. +u32 _mtk_mdio_read(struct mtk_eth *eth, int phy_addr, int phy_reg);
  377. +void mt7620_handle_carrier(struct mtk_eth *eth);
  378. +
  379. +#endif
  380. diff --git a/drivers/net/ethernet/mediatek/gsw_mt7623.c b/drivers/net/ethernet/mediatek/gsw_mt7623.c
  381. new file mode 100644
  382. index 0000000..78c36c7
  383. --- /dev/null
  384. +++ b/drivers/net/ethernet/mediatek/gsw_mt7623.c
  385. @@ -0,0 +1,966 @@
  386. +/* This program is free software; you can redistribute it and/or modify
  387. + * it under the terms of the GNU General Public License as published by
  388. + * the Free Software Foundation; version 2 of the License
  389. + *
  390. + * This program is distributed in the hope that it will be useful,
  391. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  392. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  393. + * GNU General Public License for more details.
  394. + *
  395. + * Copyright (C) 2009-2016 John Crispin <[email protected]>
  396. + * Copyright (C) 2009-2016 Felix Fietkau <[email protected]>
  397. + * Copyright (C) 2013-2016 Michael Lee <[email protected]>
  398. + */
  399. +
  400. +#include <linux/module.h>
  401. +#include <linux/kernel.h>
  402. +#include <linux/types.h>
  403. +#include <linux/platform_device.h>
  404. +#include <linux/of_device.h>
  405. +#include <linux/of_irq.h>
  406. +#include <linux/of_gpio.h>
  407. +#include <linux/clk.h>
  408. +#include <linux/mfd/syscon.h>
  409. +#include <linux/regulator/consumer.h>
  410. +#include <linux/pm_runtime.h>
  411. +#include <linux/regmap.h>
  412. +#include <linux/reset.h>
  413. +#include <linux/mii.h>
  414. +#include <linux/interrupt.h>
  415. +#include <linux/netdevice.h>
  416. +#include <linux/dma-mapping.h>
  417. +#include <linux/phy.h>
  418. +#include <linux/ethtool.h>
  419. +#include <linux/version.h>
  420. +#include <linux/atomic.h>
  421. +
  422. +#include "mtk_eth_soc.h"
  423. +#include "gsw_mt7620.h"
  424. +#include "mt7530.h"
  425. +
  426. +void mt7530_mdio_w32(struct mt7620_gsw *gsw, u32 reg, u32 val)
  427. +{
  428. + _mtk_mdio_write(gsw->eth, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
  429. + _mtk_mdio_write(gsw->eth, 0x1f, (reg >> 2) & 0xf, val & 0xffff);
  430. + _mtk_mdio_write(gsw->eth, 0x1f, 0x10, val >> 16);
  431. +}
  432. +
  433. +u32 mt7530_mdio_r32(struct mt7620_gsw *gsw, u32 reg)
  434. +{
  435. + u16 high, low;
  436. +
  437. + _mtk_mdio_write(gsw->eth, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
  438. + low = _mtk_mdio_read(gsw->eth, 0x1f, (reg >> 2) & 0xf);
  439. + high = _mtk_mdio_read(gsw->eth, 0x1f, 0x10);
  440. +
  441. + return (high << 16) | (low & 0xffff);
  442. +}
  443. +
  444. +void mt7530_mdio_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, u32 reg)
  445. +{
  446. + u32 val = mt7530_mdio_r32(gsw, reg);
  447. +
  448. + val &= mask;
  449. + val |= set;
  450. + mt7530_mdio_w32(gsw, reg, val);
  451. +}
  452. +
  453. +void mtk_switch_w32(struct mt7620_gsw *gsw, u32 val, unsigned reg)
  454. +{
  455. + mtk_w32(gsw->eth, val, reg + 0x10000);
  456. +}
  457. +
  458. +u32 mtk_switch_r32(struct mt7620_gsw *gsw, unsigned reg)
  459. +{
  460. + return mtk_r32(gsw->eth, reg + 0x10000);
  461. +}
  462. +
  463. +void mtk_switch_m32(struct mt7620_gsw *gsw, u32 mask, u32 set, unsigned reg)
  464. +{
  465. + u32 val = mtk_switch_r32(gsw, reg);
  466. +
  467. + val &= mask;
  468. + val |= set;
  469. +
  470. + mtk_switch_w32(gsw, val, reg);
  471. +}
  472. +
  473. +static irqreturn_t gsw_interrupt_mt7623(int irq, void *_eth)
  474. +{
  475. + struct mtk_eth *eth = (struct mtk_eth *)_eth;
  476. + struct mt7620_gsw *gsw = (struct mt7620_gsw *)eth->sw_priv;
  477. + u32 reg, i;
  478. +
  479. + reg = mt7530_mdio_r32(gsw, MT7530_SYS_INT_STS);
  480. +
  481. + for (i = 0; i < 5; i++) {
  482. + unsigned int link;
  483. +
  484. + if ((reg & BIT(i)) == 0)
  485. + continue;
  486. +
  487. + link = mt7530_mdio_r32(gsw, MT7530_PMSR_P(i)) & 0x1;
  488. +
  489. + if (link)
  490. + dev_info(gsw->dev, "port %d link up\n", i);
  491. + else
  492. + dev_info(gsw->dev, "port %d link down\n", i);
  493. + }
  494. +
  495. + mt7530_mdio_w32(gsw, MT7530_SYS_INT_STS, 0x1f);
  496. +
  497. + return IRQ_HANDLED;
  498. +}
  499. +
  500. +static void wait_loop(struct mt7620_gsw *gsw)
  501. +{
  502. + int i;
  503. + int read_data;
  504. +
  505. + for (i = 0; i < 320; i = i + 1)
  506. + read_data = mtk_switch_r32(gsw, 0x610);
  507. +}
  508. +
  509. +int mt7623_gsw_config(struct mtk_eth *eth)
  510. +{
  511. + if (eth->mii_bus && eth->mii_bus->phy_map[0x1f])
  512. + mt7530_probe(eth->dev, NULL, eth->mii_bus, 1);
  513. +
  514. + return 0;
  515. +}
  516. +
  517. +static void trgmii_calibration_7623(struct mt7620_gsw *gsw)
  518. +{
  519. +
  520. + unsigned int tap_a[5] = { 0, 0, 0, 0, 0 }; /* minumum delay for all correct */
  521. + unsigned int tap_b[5] = { 0, 0, 0, 0, 0 }; /* maximum delay for all correct */
  522. + unsigned int final_tap[5];
  523. + unsigned int rxc_step_size;
  524. + unsigned int rxd_step_size;
  525. + unsigned int read_data;
  526. + unsigned int tmp;
  527. + unsigned int rd_wd;
  528. + int i;
  529. + unsigned int err_cnt[5];
  530. + unsigned int init_toggle_data;
  531. + unsigned int err_flag[5];
  532. + unsigned int err_total_flag;
  533. + unsigned int training_word;
  534. + unsigned int rd_tap;
  535. + u32 val;
  536. +
  537. + u32 TRGMII_7623_base;
  538. + u32 TRGMII_7623_RD_0;
  539. + u32 TRGMII_RCK_CTRL;
  540. +
  541. + TRGMII_7623_base = 0x300; /* 0xFB110300 */
  542. + TRGMII_7623_RD_0 = TRGMII_7623_base + 0x10;
  543. + TRGMII_RCK_CTRL = TRGMII_7623_base;
  544. + rxd_step_size = 0x1;
  545. + rxc_step_size = 0x4;
  546. + init_toggle_data = 0x00000055;
  547. + training_word = 0x000000AC;
  548. +
  549. + /* RX clock gating in MT7623 */
  550. + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x04);
  551. +
  552. + /* Assert RX reset in MT7623 */
  553. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_base + 0x00);
  554. +
  555. + /* Set TX OE edge in MT7623 */
  556. + mtk_switch_m32(gsw, 0, 0x00002000, TRGMII_7623_base + 0x78);
  557. +
  558. + /* Disable RX clock gating in MT7623 */
  559. + mtk_switch_m32(gsw, 0, 0xC0000000, TRGMII_7623_base + 0x04);
  560. +
  561. + /* Release RX reset in MT7623 */
  562. + mtk_switch_m32(gsw, 0x7fffffff, 0, TRGMII_7623_base);
  563. +
  564. + for (i = 0; i < 5; i++)
  565. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_RD_0 + i * 8);
  566. +
  567. + /* Enable Training Mode in MT7530 */
  568. + mt7530_mdio_m32(gsw, 0, 0xC0000000, 0x7A40);
  569. +
  570. + /* Adjust RXC delay in MT7623 */
  571. + read_data = 0x0;
  572. + err_total_flag = 0;
  573. + while (err_total_flag == 0 && read_data != 0x68) {
  574. + /* Enable EDGE CHK in MT7623 */
  575. + for (i = 0; i < 5; i++)
  576. + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
  577. +
  578. + wait_loop(gsw);
  579. + err_total_flag = 1;
  580. + for (i = 0; i < 5; i++) {
  581. + err_cnt[i] =
  582. + mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) >> 8;
  583. + err_cnt[i] &= 0x0000000f;
  584. + rd_wd = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) >> 16;
  585. + rd_wd &= 0x000000ff;
  586. + val = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
  587. + pr_err("ERR_CNT = %d, RD_WD =%x, TRGMII_7623_RD_0=%x\n",
  588. + err_cnt[i], rd_wd, val);
  589. + if (err_cnt[i] != 0) {
  590. + err_flag[i] = 1;
  591. + } else if (rd_wd != 0x55) {
  592. + err_flag[i] = 1;
  593. + } else {
  594. + err_flag[i] = 0;
  595. + }
  596. + err_total_flag = err_flag[i] & err_total_flag;
  597. + }
  598. +
  599. + pr_err("2nd Disable EDGE CHK in MT7623\n");
  600. + /* Disable EDGE CHK in MT7623 */
  601. + for (i = 0; i < 5; i++)
  602. + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
  603. + wait_loop(gsw);
  604. + pr_err("2nd Disable EDGE CHK in MT7623\n");
  605. + /* Adjust RXC delay */
  606. + /* RX clock gating in MT7623 */
  607. + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x04);
  608. + read_data = mtk_switch_r32(gsw, TRGMII_7623_base);
  609. + if (err_total_flag == 0) {
  610. + tmp = (read_data & 0x0000007f) + rxc_step_size;
  611. + pr_err(" RXC delay = %d\n", tmp);
  612. + read_data >>= 8;
  613. + read_data &= 0xffffff80;
  614. + read_data |= tmp;
  615. + read_data <<= 8;
  616. + read_data &= 0xffffff80;
  617. + read_data |= tmp;
  618. + mtk_switch_w32(gsw, read_data, TRGMII_7623_base);
  619. + } else {
  620. + tmp = (read_data & 0x0000007f) + 16;
  621. + pr_err(" RXC delay = %d\n", tmp);
  622. + read_data >>= 8;
  623. + read_data &= 0xffffff80;
  624. + read_data |= tmp;
  625. + read_data <<= 8;
  626. + read_data &= 0xffffff80;
  627. + read_data |= tmp;
  628. + mtk_switch_w32(gsw, read_data, TRGMII_7623_base);
  629. + }
  630. + read_data &= 0x000000ff;
  631. +
  632. + /* Disable RX clock gating in MT7623 */
  633. + mtk_switch_m32(gsw, 0, 0xC0000000, TRGMII_7623_base + 0x04);
  634. + for (i = 0; i < 5; i++)
  635. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_RD_0 + i * 8);
  636. + }
  637. +
  638. + /* Read RD_WD MT7623 */
  639. + for (i = 0; i < 5; i++) {
  640. + rd_tap = 0;
  641. + while (err_flag[i] != 0 && rd_tap != 128) {
  642. + /* Enable EDGE CHK in MT7623 */
  643. + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
  644. + wait_loop(gsw);
  645. +
  646. + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
  647. + err_cnt[i] = (read_data >> 8) & 0x0000000f; /* Read MT7623 Errcnt */
  648. + rd_wd = (read_data >> 16) & 0x000000ff;
  649. + if (err_cnt[i] != 0 || rd_wd != 0x55) {
  650. + err_flag[i] = 1;
  651. + } else {
  652. + err_flag[i] = 0;
  653. + }
  654. + /* Disable EDGE CHK in MT7623 */
  655. + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
  656. + wait_loop(gsw);
  657. + if (err_flag[i] != 0) {
  658. + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7623 */
  659. + read_data = (read_data & 0xffffff80) | rd_tap;
  660. + mtk_switch_w32(gsw, read_data,
  661. + TRGMII_7623_RD_0 + i * 8);
  662. + tap_a[i] = rd_tap;
  663. + } else {
  664. + rd_tap = (read_data & 0x0000007f) + 48;
  665. + read_data = (read_data & 0xffffff80) | rd_tap;
  666. + mtk_switch_w32(gsw, read_data,
  667. + TRGMII_7623_RD_0 + i * 8);
  668. + }
  669. +
  670. + }
  671. + pr_err("MT7623 %dth bit Tap_a = %d\n", i, tap_a[i]);
  672. + }
  673. + /* pr_err("Last While Loop\n"); */
  674. + for (i = 0; i < 5; i++) {
  675. + while ((err_flag[i] == 0) && (rd_tap != 128)) {
  676. + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
  677. + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7623 */
  678. + read_data = (read_data & 0xffffff80) | rd_tap;
  679. + mtk_switch_w32(gsw, read_data, TRGMII_7623_RD_0 + i * 8);
  680. + /* Enable EDGE CHK in MT7623 */
  681. + val =
  682. + mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8) | 0x40000000;
  683. + val &= 0x4fffffff;
  684. + mtk_switch_w32(gsw, val, TRGMII_7623_RD_0 + i * 8);
  685. + wait_loop(gsw);
  686. + read_data = mtk_switch_r32(gsw, TRGMII_7623_RD_0 + i * 8);
  687. + err_cnt[i] = (read_data >> 8) & 0x0000000f; /* Read MT7623 Errcnt */
  688. + rd_wd = (read_data >> 16) & 0x000000ff;
  689. + if (err_cnt[i] != 0 || rd_wd != 0x55) {
  690. + err_flag[i] = 1;
  691. + } else {
  692. + err_flag[i] = 0;
  693. + }
  694. +
  695. + /* Disable EDGE CHK in MT7623 */
  696. + mtk_switch_m32(gsw, 0x4fffffff, 0x40000000, TRGMII_7623_RD_0 + i * 8);
  697. + wait_loop(gsw);
  698. +
  699. + }
  700. +
  701. + tap_b[i] = rd_tap; /* -rxd_step_size; */
  702. + pr_err("MT7623 %dth bit Tap_b = %d\n", i, tap_b[i]);
  703. + final_tap[i] = (tap_a[i] + tap_b[i]) / 2; /* Calculate RXD delay = (TAP_A + TAP_B)/2 */
  704. + read_data = (read_data & 0xffffff80) | final_tap[i];
  705. + mtk_switch_w32(gsw, read_data, TRGMII_7623_RD_0 + i * 8);
  706. + }
  707. +
  708. + read_data = mt7530_mdio_r32(gsw, 0x7A40);
  709. + read_data &= 0x3fffffff;
  710. + mt7530_mdio_w32(gsw, 0x7A40, read_data);
  711. +}
  712. +
  713. +static void trgmii_calibration_7530(struct mt7620_gsw *gsw)
  714. +{
  715. +
  716. + unsigned int tap_a[5] = { 0, 0, 0, 0, 0 };
  717. + unsigned int tap_b[5] = { 0, 0, 0, 0, 0 };
  718. + unsigned int final_tap[5];
  719. + unsigned int rxc_step_size;
  720. + unsigned int rxd_step_size;
  721. + unsigned int read_data;
  722. + unsigned int tmp = 0;
  723. + int i;
  724. + unsigned int err_cnt[5];
  725. + unsigned int rd_wd;
  726. + unsigned int init_toggle_data;
  727. + unsigned int err_flag[5];
  728. + unsigned int err_total_flag;
  729. + unsigned int training_word;
  730. + unsigned int rd_tap;
  731. +
  732. + u32 TRGMII_7623_base;
  733. + u32 TRGMII_7530_RD_0;
  734. + u32 TRGMII_RCK_CTRL;
  735. + u32 TRGMII_7530_base;
  736. + u32 TRGMII_7530_TX_base;
  737. +
  738. + TRGMII_7623_base = 0x300;
  739. + TRGMII_7530_base = 0x7A00;
  740. + TRGMII_7530_RD_0 = TRGMII_7530_base + 0x10;
  741. + TRGMII_RCK_CTRL = TRGMII_7623_base;
  742. + rxd_step_size = 0x1;
  743. + rxc_step_size = 0x8;
  744. + init_toggle_data = 0x00000055;
  745. + training_word = 0x000000AC;
  746. +
  747. + TRGMII_7530_TX_base = TRGMII_7530_base + 0x50;
  748. +
  749. + /* Calibration begin */
  750. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_base + 0x40);
  751. +
  752. + /* RX clock gating in MT7530 */
  753. + mt7530_mdio_m32(gsw, 0x3fffffff, 0, TRGMII_7530_base + 0x04);
  754. +
  755. + /* Set TX OE edge in MT7530 */
  756. + mt7530_mdio_m32(gsw, 0, 0x2000, TRGMII_7530_base + 0x78);
  757. +
  758. + /* Assert RX reset in MT7530 */
  759. + mt7530_mdio_m32(gsw, 0, 0x80000000, TRGMII_7530_base);
  760. +
  761. + /* Release RX reset in MT7530 */
  762. + mt7530_mdio_m32(gsw, 0x7fffffff, 0, TRGMII_7530_base);
  763. +
  764. + /* Disable RX clock gating in MT7530 */
  765. + mt7530_mdio_m32(gsw, 0, 0xC0000000, TRGMII_7530_base + 0x04);
  766. +
  767. + /* Enable Training Mode in MT7623 */
  768. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_base + 0x40);
  769. + if (gsw->trgmii_force == 2000)
  770. + mtk_switch_m32(gsw, 0, 0xC0000000, TRGMII_7623_base + 0x40);
  771. + else
  772. + mtk_switch_m32(gsw, 0, 0x80000000, TRGMII_7623_base + 0x40);
  773. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x078);
  774. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x50);
  775. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x58);
  776. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x60);
  777. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x68);
  778. + mtk_switch_m32(gsw, 0xfffff0ff, 0, TRGMII_7623_base + 0x70);
  779. + mtk_switch_m32(gsw, 0x00000800, 0, TRGMII_7623_base + 0x78);
  780. +
  781. + /* Adjust RXC delay in MT7530 */
  782. + err_total_flag = 0;
  783. + read_data = 0x0;
  784. + while (err_total_flag == 0 && (read_data != 0x68)) {
  785. + /* Enable EDGE CHK in MT7530 */
  786. + for (i = 0; i < 5; i++) {
  787. + mt7530_mdio_m32(gsw, 0x4fffffff, 0x40000000,
  788. + TRGMII_7530_RD_0 + i * 8);
  789. + wait_loop(gsw);
  790. +
  791. + /* 2nd Disable EDGE CHK in MT7530 */
  792. + err_cnt[i] = mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
  793. + err_cnt[i] >>= 8;
  794. + err_cnt[i] &= 0x0000ff0f;
  795. +
  796. + rd_wd = err_cnt[i] >> 8;
  797. + rd_wd &= 0x000000ff;
  798. +
  799. + err_cnt[i] &= 0x0000000f;
  800. + if (err_cnt[i] != 0)
  801. + err_flag[i] = 1;
  802. + else if (rd_wd != 0x55)
  803. + err_flag[i] = 1;
  804. + else
  805. + err_flag[i] = 0;
  806. + if (i == 0)
  807. + err_total_flag = err_flag[i];
  808. + else
  809. + err_total_flag = err_flag[i] & err_total_flag;
  810. +
  811. + /* Disable EDGE CHK in MT7530 */
  812. + mt7530_mdio_m32(gsw, 0x4fffffff, 0x40000000,
  813. + TRGMII_7530_RD_0 + i * 8);
  814. + wait_loop(gsw);
  815. + }
  816. +
  817. + /* Adjust RXC delay */
  818. + if (err_total_flag == 0) {
  819. + /* Assert RX reset in MT7530 */
  820. + mt7530_mdio_m32(gsw, 0, 0x80000000, TRGMII_7530_base);
  821. +
  822. + /* RX clock gating in MT7530 */
  823. + mt7530_mdio_m32(gsw, 0x3fffffff, 0, TRGMII_7530_base + 0x04);
  824. +
  825. + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
  826. + tmp = read_data;
  827. + tmp &= 0x0000007f;
  828. + tmp += rxc_step_size;
  829. + /* pr_err("Current rxc delay = %d\n", tmp); */
  830. + read_data &= 0xffffff80;
  831. + read_data |= tmp;
  832. + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data);
  833. + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
  834. + /* pr_err("Current RXC delay = %x\n", read_data); */
  835. +
  836. + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_base);
  837. + read_data &= 0x7fffffff;
  838. + mt7530_mdio_w32(gsw, TRGMII_7530_base, read_data); /* Release RX reset in MT7530 */
  839. +
  840. + read_data =
  841. + mt7530_mdio_r32(gsw, TRGMII_7530_base + 0x04);
  842. + read_data |= 0xc0000000;
  843. + mt7530_mdio_w32(gsw, TRGMII_7530_base + 0x04, read_data); /* Disable RX clock gating in MT7530 */
  844. + pr_err("####### MT7530 RXC delay is %d\n", tmp);
  845. + }
  846. + read_data = tmp;
  847. + }
  848. + pr_err("Finish RXC Adjustment while loop\n");
  849. +
  850. + /* pr_err("Read RD_WD MT7530\n"); */
  851. + /* Read RD_WD MT7530 */
  852. + for (i = 0; i < 5; i++) {
  853. + rd_tap = 0;
  854. + while (err_flag[i] != 0 && rd_tap != 128) {
  855. + /* Enable EDGE CHK in MT7530 */
  856. + read_data =
  857. + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
  858. + read_data |= 0x40000000;
  859. + read_data &= 0x4fffffff;
  860. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  861. + read_data);
  862. + wait_loop(gsw);
  863. + err_cnt[i] = (read_data >> 8) & 0x0000000f;
  864. + rd_wd = (read_data >> 16) & 0x000000ff;
  865. + if (err_cnt[i] != 0 || rd_wd != 0x55) {
  866. + err_flag[i] = 1;
  867. + } else {
  868. + err_flag[i] = 0;
  869. + }
  870. + if (err_flag[i] != 0) {
  871. + rd_tap = (read_data & 0x0000007f) + rxd_step_size; /* Add RXD delay in MT7530 */
  872. + read_data = (read_data & 0xffffff80) | rd_tap;
  873. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  874. + read_data);
  875. + tap_a[i] = rd_tap;
  876. + } else {
  877. + tap_a[i] = (read_data & 0x0000007f); /* Record the min delay TAP_A */
  878. + rd_tap = tap_a[i] + 0x4;
  879. + read_data = (read_data & 0xffffff80) | rd_tap;
  880. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  881. + read_data);
  882. + }
  883. +
  884. + /* Disable EDGE CHK in MT7530 */
  885. + read_data =
  886. + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
  887. + read_data |= 0x40000000;
  888. + read_data &= 0x4fffffff;
  889. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  890. + read_data);
  891. + wait_loop(gsw);
  892. +
  893. + }
  894. + pr_err("MT7530 %dth bit Tap_a = %d\n", i, tap_a[i]);
  895. + }
  896. +
  897. + /* pr_err("Last While Loop\n"); */
  898. + for (i = 0; i < 5; i++) {
  899. + rd_tap = 0;
  900. + while (err_flag[i] == 0 && (rd_tap != 128)) {
  901. + /* Enable EDGE CHK in MT7530 */
  902. + read_data = mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
  903. + read_data |= 0x40000000;
  904. + read_data &= 0x4fffffff;
  905. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  906. + read_data);
  907. + wait_loop(gsw);
  908. + err_cnt[i] = (read_data >> 8) & 0x0000000f;
  909. + rd_wd = (read_data >> 16) & 0x000000ff;
  910. + if (err_cnt[i] != 0 || rd_wd != 0x55)
  911. + err_flag[i] = 1;
  912. + else
  913. + err_flag[i] = 0;
  914. +
  915. + if (err_flag[i] == 0 && (rd_tap != 128)) {
  916. + /* Add RXD delay in MT7530 */
  917. + rd_tap = (read_data & 0x0000007f) + rxd_step_size;
  918. + read_data = (read_data & 0xffffff80) | rd_tap;
  919. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  920. + read_data);
  921. + }
  922. + /* Disable EDGE CHK in MT7530 */
  923. + read_data =
  924. + mt7530_mdio_r32(gsw, TRGMII_7530_RD_0 + i * 8);
  925. + read_data |= 0x40000000;
  926. + read_data &= 0x4fffffff;
  927. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8,
  928. + read_data);
  929. + wait_loop(gsw);
  930. + }
  931. + tap_b[i] = rd_tap; /* - rxd_step_size; */
  932. + pr_err("MT7530 %dth bit Tap_b = %d\n", i, tap_b[i]);
  933. + final_tap[i] = (tap_a[i] + tap_b[i]) / 2;
  934. +
  935. + read_data = (read_data & 0xffffff80) | final_tap[i];
  936. + mt7530_mdio_w32(gsw, TRGMII_7530_RD_0 + i * 8, read_data);
  937. + }
  938. +
  939. + if (gsw->trgmii_force == 2000)
  940. + mtk_switch_m32(gsw, 0x7fffffff, 0, TRGMII_7623_base + 0x40);
  941. + else
  942. + mtk_switch_m32(gsw, 0x3fffffff, 0, TRGMII_7623_base + 0x40);
  943. +
  944. +}
  945. +
  946. +static void mt7530_trgmii_clock_setting(struct mt7620_gsw *gsw, u32 xtal_mode)
  947. +{
  948. + /* TRGMII Clock */
  949. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  950. + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
  951. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  952. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1);
  953. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  954. + _mtk_mdio_write(gsw->eth, 0, 14, 0x404);
  955. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  956. +
  957. + if (xtal_mode == 1) {
  958. + /* 25MHz */
  959. + if (gsw->trgmii_force == 2600)
  960. + /* 325MHz */
  961. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1a00);
  962. + else if (gsw->trgmii_force == 2000)
  963. + /* 250MHz */
  964. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1400);
  965. + } else if (xtal_mode == 2) {
  966. + /* 40MHz */
  967. + if (gsw->trgmii_force == 2600)
  968. + /* 325MHz */
  969. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1040);
  970. + else if (gsw->trgmii_force == 2000)
  971. + /* 250MHz */
  972. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0c80);
  973. + }
  974. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  975. + _mtk_mdio_write(gsw->eth, 0, 14, 0x405);
  976. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  977. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0);
  978. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  979. + _mtk_mdio_write(gsw->eth, 0, 14, 0x409);
  980. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  981. + if (xtal_mode == 1)
  982. + /* 25MHz */
  983. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0057);
  984. + else
  985. + /* 40MHz */
  986. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0087);
  987. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  988. + _mtk_mdio_write(gsw->eth, 0, 14, 0x40a);
  989. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  990. + if (xtal_mode == 1)
  991. + /* 25MHz */
  992. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0057);
  993. + else
  994. + /* 40MHz */
  995. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0087);
  996. +
  997. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  998. + _mtk_mdio_write(gsw->eth, 0, 14, 0x403);
  999. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1000. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1800);
  1001. +
  1002. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1003. + _mtk_mdio_write(gsw->eth, 0, 14, 0x403);
  1004. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1005. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1c00);
  1006. +
  1007. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1008. + _mtk_mdio_write(gsw->eth, 0, 14, 0x401);
  1009. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1010. + _mtk_mdio_write(gsw->eth, 0, 14, 0xc020);
  1011. +
  1012. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1013. + _mtk_mdio_write(gsw->eth, 0, 14, 0x406);
  1014. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1015. + _mtk_mdio_write(gsw->eth, 0, 14, 0xa030);
  1016. +
  1017. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1018. + _mtk_mdio_write(gsw->eth, 0, 14, 0x406);
  1019. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1020. + _mtk_mdio_write(gsw->eth, 0, 14, 0xa038);
  1021. +
  1022. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1023. + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
  1024. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1025. + _mtk_mdio_write(gsw->eth, 0, 14, 0x3);
  1026. +
  1027. + mt7530_mdio_m32(gsw, 0xfffffffc, 0x1, 0x7830);
  1028. + mt7530_mdio_m32(gsw, 0xcfffffff, 0, 0x7a40);
  1029. + mt7530_mdio_w32(gsw, 0x7a78, 0x55);
  1030. + mtk_switch_m32(gsw, 0x7fffffff, 0, 0x300);
  1031. +
  1032. + trgmii_calibration_7623(gsw);
  1033. + trgmii_calibration_7530(gsw);
  1034. +
  1035. + mtk_switch_m32(gsw, 0, 0x80000000, 0x300);
  1036. + mtk_switch_m32(gsw, 0, 0x7fffffff, 0x300);
  1037. +
  1038. + /* MT7530 RXC reset */
  1039. + mt7530_mdio_m32(gsw, 0, BIT(31), 0x7a00);
  1040. + mdelay(1);
  1041. +
  1042. + mt7530_mdio_m32(gsw, ~BIT(31), 0, 0x7a00);
  1043. + mdelay(100);
  1044. +}
  1045. +
  1046. +static void mt7623_hw_init(struct mtk_eth *eth, struct mt7620_gsw *gsw,
  1047. + struct device_node *np)
  1048. +{
  1049. + u32 i;
  1050. + u32 val;
  1051. + u32 xtal_mode;
  1052. +
  1053. + regmap_update_bits(gsw->ethsys, ETHSYS_CLKCFG0,
  1054. + ETHSYS_TRGMII_CLK_SEL362_5,
  1055. + ETHSYS_TRGMII_CLK_SEL362_5);
  1056. +
  1057. + /* reset the TRGMII core */
  1058. + mtk_switch_m32(gsw, 0, INTF_MODE_TRGMII, GSW_INTF_MODE);
  1059. + mtk_switch_m32(gsw, 0, TRGMII_RCK_CTRL_RX_RST, GSW_TRGMII_RCK_CTRL);
  1060. +
  1061. + /* Hardware reset Switch */
  1062. + //device_reset(eth->dev);
  1063. + printk("%s:%s[%d]reset_switch\n", __FILE__, __func__, __LINE__);
  1064. +
  1065. + /* Wait for Switch Reset Completed*/
  1066. + for (i = 0; i < 100; i++) {
  1067. + mdelay(10);
  1068. + if (mt7530_mdio_r32(gsw, MT7530_HWTRAP))
  1069. + break;
  1070. + }
  1071. +
  1072. + /* turn off all PHYs */
  1073. + for (i = 0; i <= 4; i++) {
  1074. + val = _mtk_mdio_read(gsw->eth, i, 0x0);
  1075. + val |= BIT(11);
  1076. + _mtk_mdio_write(gsw->eth, i, 0x0, val);
  1077. + }
  1078. +
  1079. + /* reset the switch */
  1080. + mt7530_mdio_w32(gsw, MT7530_SYS_CTRL,
  1081. + SYS_CTRL_SW_RST | SYS_CTRL_REG_RST);
  1082. + udelay(100);
  1083. +
  1084. + /* GE1, Force 1000M/FD, FC ON */
  1085. + mt7530_mdio_w32(gsw, MT7530_PMCR_P(6), PMCR_FIXED_LINK_FC);
  1086. +
  1087. + /* GE2, Force 1000M/FD, FC ON */
  1088. + mt7530_mdio_w32(gsw, MT7530_PMCR_P(5), PMCR_FIXED_LINK_FC);
  1089. +
  1090. + /* Enable Port 6, P5 as GMAC5, P5 disable */
  1091. + val = mt7530_mdio_r32(gsw, MT7530_MHWTRAP);
  1092. + /* Enable Port 6 */
  1093. + val &= ~MHWTRAP_P6_DIS;
  1094. + /* Enable Port 5 */
  1095. + val &= ~MHWTRAP_P5_DIS;
  1096. + /* Port 5 as GMAC */
  1097. + val |= MHWTRAP_P5_MAC_SEL;
  1098. + /* Port 5 Interface mode */
  1099. + val |= MHWTRAP_P5_RGMII_MODE;
  1100. + /* Set MT7530 phy direct access mode**/
  1101. + val &= ~MHWTRAP_PHY_ACCESS;
  1102. + /* manual override of HW-Trap */
  1103. + val |= MHWTRAP_MANUAL;
  1104. + mt7530_mdio_w32(gsw, MT7530_MHWTRAP, val);
  1105. +
  1106. + xtal_mode = mt7530_mdio_r32(gsw, MT7530_HWTRAP);
  1107. + xtal_mode >>= HWTRAP_XTAL_SHIFT;
  1108. + xtal_mode &= HWTRAP_XTAL_MASK;
  1109. + if (xtal_mode == MT7623_XTAL_40) {
  1110. + /* disable MT7530 core clock */
  1111. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1112. + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
  1113. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1114. + _mtk_mdio_write(gsw->eth, 0, 14, 0x0);
  1115. +
  1116. + /* disable MT7530 PLL */
  1117. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1118. + _mtk_mdio_write(gsw->eth, 0, 14, 0x40d);
  1119. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1120. + _mtk_mdio_write(gsw->eth, 0, 14, 0x2020);
  1121. +
  1122. + /* for MT7530 core clock = 500Mhz */
  1123. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1124. + _mtk_mdio_write(gsw->eth, 0, 14, 0x40e);
  1125. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1126. + _mtk_mdio_write(gsw->eth, 0, 14, 0x119);
  1127. +
  1128. + /* enable MT7530 PLL */
  1129. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1130. + _mtk_mdio_write(gsw->eth, 0, 14, 0x40d);
  1131. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1132. + _mtk_mdio_write(gsw->eth, 0, 14, 0x2820);
  1133. +
  1134. + udelay(20);
  1135. +
  1136. + /* enable MT7530 core clock */
  1137. + _mtk_mdio_write(gsw->eth, 0, 13, 0x1f);
  1138. + _mtk_mdio_write(gsw->eth, 0, 14, 0x410);
  1139. + _mtk_mdio_write(gsw->eth, 0, 13, 0x401f);
  1140. + }
  1141. +
  1142. + /* RGMII */
  1143. + _mtk_mdio_write(gsw->eth, 0, 14, 0x1);
  1144. +
  1145. + /* set MT7530 central align */
  1146. + mt7530_mdio_m32(gsw, ~BIT(0), BIT(1), MT7530_P6ECR);
  1147. + mt7530_mdio_m32(gsw, ~BIT(30), 0, MT7530_TRGMII_TXCTRL);
  1148. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TCK_CTRL, 0x855);
  1149. +
  1150. + /* delay setting for 10/1000M */
  1151. + mt7530_mdio_w32(gsw, MT7530_P5RGMIIRXCR, 0x104);
  1152. + mt7530_mdio_w32(gsw, MT7530_P5RGMIITXCR, 0x10);
  1153. +
  1154. + /* lower Tx Driving */
  1155. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD0_ODT, 0x88);
  1156. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD1_ODT, 0x88);
  1157. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD2_ODT, 0x88);
  1158. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD3_ODT, 0x88);
  1159. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD4_ODT, 0x88);
  1160. + mt7530_mdio_w32(gsw, MT7530_TRGMII_TD5_ODT, 0x88);
  1161. + mt7530_mdio_w32(gsw, MT7530_IO_DRV_CR, 0x11);
  1162. +
  1163. + /* Set MT7623/MT7683 TX Driving */
  1164. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TD0_ODT);
  1165. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TD0_ODT);
  1166. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TD0_ODT);
  1167. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TD0_ODT);
  1168. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TXCTL_ODT);
  1169. + mtk_switch_w32(gsw, 0x88, GSW_TRGMII_TCK_ODT);
  1170. +
  1171. +// mt7530_trgmii_clock_setting(gsw, xtal_mode);
  1172. +
  1173. + /* disable EEE */
  1174. + for (i = 0; i <= 4; i++) {
  1175. + _mtk_mdio_write(gsw->eth, i, 13, 0x7);
  1176. + _mtk_mdio_write(gsw->eth, i, 14, 0x3C);
  1177. + _mtk_mdio_write(gsw->eth, i, 13, 0x4007);
  1178. + _mtk_mdio_write(gsw->eth, i, 14, 0x0);
  1179. +
  1180. + /* Increase SlvDPSready time */
  1181. + _mtk_mdio_write(gsw->eth, i, 31, 0x52b5);
  1182. + _mtk_mdio_write(gsw->eth, i, 16, 0xafae);
  1183. + _mtk_mdio_write(gsw->eth, i, 18, 0x2f);
  1184. + _mtk_mdio_write(gsw->eth, i, 16, 0x8fae);
  1185. +
  1186. + /* Incease post_update_timer */
  1187. + _mtk_mdio_write(gsw->eth, i, 31, 0x3);
  1188. + _mtk_mdio_write(gsw->eth, i, 17, 0x4b);
  1189. +
  1190. + /* Adjust 100_mse_threshold */
  1191. + _mtk_mdio_write(gsw->eth, i, 13, 0x1e);
  1192. + _mtk_mdio_write(gsw->eth, i, 14, 0x123);
  1193. + _mtk_mdio_write(gsw->eth, i, 13, 0x401e);
  1194. + _mtk_mdio_write(gsw->eth, i, 14, 0xffff);
  1195. +
  1196. + /* Disable mcc */
  1197. + _mtk_mdio_write(gsw->eth, i, 13, 0x1e);
  1198. + _mtk_mdio_write(gsw->eth, i, 14, 0xa6);
  1199. + _mtk_mdio_write(gsw->eth, i, 13, 0x401e);
  1200. + _mtk_mdio_write(gsw->eth, i, 14, 0x300);
  1201. +
  1202. + /* Disable HW auto downshift*/
  1203. + _mtk_mdio_write(gsw->eth, i, 31, 0x1);
  1204. + val = _mtk_mdio_read(gsw->eth, i, 0x14);
  1205. + val &= ~BIT(4);
  1206. + _mtk_mdio_write(gsw->eth, i, 0x14, val);
  1207. + }
  1208. +
  1209. + /* turn on all PHYs */
  1210. + for (i = 0; i <= 4; i++) {
  1211. + val = _mtk_mdio_read(gsw->eth, i, 0);
  1212. + val &= ~BIT(11);
  1213. + _mtk_mdio_write(gsw->eth, i, 0, val);
  1214. + }
  1215. +
  1216. + /* enable irq */
  1217. + mt7530_mdio_m32(gsw, 0, TOP_SIG_CTRL_NORMAL, MT7530_TOP_SIG_CTRL);
  1218. +}
  1219. +
  1220. +static const struct of_device_id mediatek_gsw_match[] = {
  1221. + { .compatible = "mediatek,mt7623-gsw" },
  1222. + {},
  1223. +};
  1224. +MODULE_DEVICE_TABLE(of, mediatek_gsw_match);
  1225. +
  1226. +int mtk_gsw_init(struct mtk_eth *eth)
  1227. +{
  1228. + struct device_node *np = eth->switch_np;
  1229. + struct platform_device *pdev = of_find_device_by_node(np);
  1230. + struct mt7620_gsw *gsw;
  1231. +
  1232. + if (!pdev)
  1233. + return -ENODEV;
  1234. +
  1235. + if (!of_device_is_compatible(np, mediatek_gsw_match->compatible))
  1236. + return -EINVAL;
  1237. +
  1238. + gsw = platform_get_drvdata(pdev);
  1239. + if (!gsw)
  1240. + return -ENODEV;
  1241. + eth->sw_priv = gsw;
  1242. + gsw->eth = eth;
  1243. +
  1244. + mt7623_hw_init(eth, gsw, np);
  1245. +
  1246. + request_threaded_irq(gsw->irq, gsw_interrupt_mt7623, NULL, 0,
  1247. + "gsw", eth);
  1248. + mt7530_mdio_w32(gsw, MT7530_SYS_INT_EN, 0x1f);
  1249. +
  1250. + return 0;
  1251. +}
  1252. +
  1253. +static int mt7623_gsw_probe(struct platform_device *pdev)
  1254. +{
  1255. + struct device_node *np = pdev->dev.of_node;
  1256. + struct device_node *pctl;
  1257. + int reset_pin, ret;
  1258. + struct mt7620_gsw *gsw;
  1259. + struct regulator *supply;
  1260. +
  1261. + gsw = devm_kzalloc(&pdev->dev, sizeof(struct mt7620_gsw), GFP_KERNEL);
  1262. + if (!gsw)
  1263. + return -ENOMEM;
  1264. +
  1265. + gsw->dev = &pdev->dev;
  1266. + gsw->irq = irq_of_parse_and_map(np, 0);
  1267. + if (gsw->irq < 0)
  1268. + return -EINVAL;
  1269. +
  1270. + gsw->ethsys = syscon_regmap_lookup_by_phandle(np, "mediatek,ethsys");
  1271. + if (IS_ERR(gsw->ethsys))
  1272. + return PTR_ERR(gsw->ethsys);
  1273. +
  1274. + reset_pin = of_get_named_gpio(np, "mediatek,reset-pin", 0);
  1275. + if (reset_pin < 0)
  1276. + return reset_pin;
  1277. +
  1278. + pctl = of_parse_phandle(np, "mediatek,pctl-regmap", 0);
  1279. + if (IS_ERR(pctl))
  1280. + return PTR_ERR(pctl);
  1281. +
  1282. + gsw->pctl = syscon_node_to_regmap(pctl);
  1283. + if (IS_ERR(pctl))
  1284. + return PTR_ERR(pctl);
  1285. +
  1286. + ret = devm_gpio_request(&pdev->dev, reset_pin, "mt7530-reset");
  1287. + if (ret)
  1288. + return ret;
  1289. +
  1290. + gsw->clk_trgpll = devm_clk_get(&pdev->dev, "trgpll");
  1291. + if (IS_ERR(gsw->clk_trgpll))
  1292. + return -ENODEV;
  1293. +
  1294. + supply = devm_regulator_get(&pdev->dev, "mt7530");
  1295. + if (IS_ERR(supply))
  1296. + return PTR_ERR(supply);
  1297. +
  1298. + regulator_set_voltage(supply, 1000000, 1000000);
  1299. + ret = regulator_enable(supply);
  1300. + if (ret) {
  1301. + dev_err(&pdev->dev, "Failed to enable reg-7530: %d\n", ret);
  1302. + return ret;
  1303. + }
  1304. + pm_runtime_enable(&pdev->dev);
  1305. + pm_runtime_get_sync(&pdev->dev);
  1306. +
  1307. + ret = clk_set_rate(gsw->clk_trgpll, 500000000);
  1308. + if (ret)
  1309. + return ret;
  1310. +
  1311. + clk_prepare_enable(gsw->clk_trgpll);
  1312. +
  1313. + gpio_direction_output(reset_pin, 0);
  1314. + udelay(1000);
  1315. + gpio_set_value(reset_pin, 1);
  1316. + mdelay(100);
  1317. +
  1318. + platform_set_drvdata(pdev, gsw);
  1319. +
  1320. + return 0;
  1321. +}
  1322. +
  1323. +static int mt7623_gsw_remove(struct platform_device *pdev)
  1324. +{
  1325. + struct mt7620_gsw *gsw = platform_get_drvdata(pdev);
  1326. +
  1327. + clk_disable_unprepare(gsw->clk_trgpll);
  1328. +
  1329. + pm_runtime_put_sync(&pdev->dev);
  1330. + pm_runtime_disable(&pdev->dev);
  1331. +
  1332. + platform_set_drvdata(pdev, NULL);
  1333. +
  1334. + return 0;
  1335. +}
  1336. +
  1337. +static struct platform_driver gsw_driver = {
  1338. + .probe = mt7623_gsw_probe,
  1339. + .remove = mt7623_gsw_remove,
  1340. + .driver = {
  1341. + .name = "mt7623-gsw",
  1342. + .owner = THIS_MODULE,
  1343. + .of_match_table = mediatek_gsw_match,
  1344. + },
  1345. +};
  1346. +
  1347. +module_platform_driver(gsw_driver);
  1348. +
  1349. +MODULE_LICENSE("GPL");
  1350. +MODULE_AUTHOR("John Crispin <[email protected]>");
  1351. +MODULE_DESCRIPTION("GBit switch driver for Mediatek MT7623 SoC");
  1352. diff --git a/drivers/net/ethernet/mediatek/mt7530.c b/drivers/net/ethernet/mediatek/mt7530.c
  1353. new file mode 100644
  1354. index 0000000..2e9d280
  1355. --- /dev/null
  1356. +++ b/drivers/net/ethernet/mediatek/mt7530.c
  1357. @@ -0,0 +1,808 @@
  1358. +/*
  1359. + * This program is free software; you can redistribute it and/or
  1360. + * modify it under the terms of the GNU General Public License
  1361. + * as published by the Free Software Foundation; either version 2
  1362. + * of the License, or (at your option) any later version.
  1363. + *
  1364. + * This program is distributed in the hope that it will be useful,
  1365. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1366. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1367. + * GNU General Public License for more details.
  1368. + *
  1369. + * Copyright (C) 2013 John Crispin <[email protected]>
  1370. + */
  1371. +
  1372. +#include <linux/if.h>
  1373. +#include <linux/module.h>
  1374. +#include <linux/init.h>
  1375. +#include <linux/list.h>
  1376. +#include <linux/if_ether.h>
  1377. +#include <linux/skbuff.h>
  1378. +#include <linux/netdevice.h>
  1379. +#include <linux/netlink.h>
  1380. +#include <linux/bitops.h>
  1381. +#include <net/genetlink.h>
  1382. +#include <linux/switch.h>
  1383. +#include <linux/delay.h>
  1384. +#include <linux/phy.h>
  1385. +#include <linux/netdevice.h>
  1386. +#include <linux/etherdevice.h>
  1387. +#include <linux/lockdep.h>
  1388. +#include <linux/workqueue.h>
  1389. +#include <linux/of_device.h>
  1390. +
  1391. +#include "mt7530.h"
  1392. +
  1393. +#define MT7530_CPU_PORT 6
  1394. +#define MT7530_NUM_PORTS 8
  1395. +#define MT7530_NUM_VLANS 16
  1396. +#define MT7530_MAX_VID 4095
  1397. +#define MT7530_MIN_VID 0
  1398. +
  1399. +/* registers */
  1400. +#define REG_ESW_VLAN_VTCR 0x90
  1401. +#define REG_ESW_VLAN_VAWD1 0x94
  1402. +#define REG_ESW_VLAN_VAWD2 0x98
  1403. +#define REG_ESW_VLAN_VTIM(x) (0x100 + 4 * ((x) / 2))
  1404. +
  1405. +#define REG_ESW_VLAN_VAWD1_IVL_MAC BIT(30)
  1406. +#define REG_ESW_VLAN_VAWD1_VTAG_EN BIT(28)
  1407. +#define REG_ESW_VLAN_VAWD1_VALID BIT(0)
  1408. +
  1409. +/* vlan egress mode */
  1410. +enum {
  1411. + ETAG_CTRL_UNTAG = 0,
  1412. + ETAG_CTRL_TAG = 2,
  1413. + ETAG_CTRL_SWAP = 1,
  1414. + ETAG_CTRL_STACK = 3,
  1415. +};
  1416. +
  1417. +#define REG_ESW_PORT_PCR(x) (0x2004 | ((x) << 8))
  1418. +#define REG_ESW_PORT_PVC(x) (0x2010 | ((x) << 8))
  1419. +#define REG_ESW_PORT_PPBV1(x) (0x2014 | ((x) << 8))
  1420. +
  1421. +#define REG_HWTRAP 0x7804
  1422. +
  1423. +#define MIB_DESC(_s , _o, _n) \
  1424. + { \
  1425. + .size = (_s), \
  1426. + .offset = (_o), \
  1427. + .name = (_n), \
  1428. + }
  1429. +
  1430. +struct mt7xxx_mib_desc {
  1431. + unsigned int size;
  1432. + unsigned int offset;
  1433. + const char *name;
  1434. +};
  1435. +
  1436. +#define MT7621_MIB_COUNTER_BASE 0x4000
  1437. +#define MT7621_MIB_COUNTER_PORT_OFFSET 0x100
  1438. +#define MT7621_STATS_TDPC 0x00
  1439. +#define MT7621_STATS_TCRC 0x04
  1440. +#define MT7621_STATS_TUPC 0x08
  1441. +#define MT7621_STATS_TMPC 0x0C
  1442. +#define MT7621_STATS_TBPC 0x10
  1443. +#define MT7621_STATS_TCEC 0x14
  1444. +#define MT7621_STATS_TSCEC 0x18
  1445. +#define MT7621_STATS_TMCEC 0x1C
  1446. +#define MT7621_STATS_TDEC 0x20
  1447. +#define MT7621_STATS_TLCEC 0x24
  1448. +#define MT7621_STATS_TXCEC 0x28
  1449. +#define MT7621_STATS_TPPC 0x2C
  1450. +#define MT7621_STATS_TL64PC 0x30
  1451. +#define MT7621_STATS_TL65PC 0x34
  1452. +#define MT7621_STATS_TL128PC 0x38
  1453. +#define MT7621_STATS_TL256PC 0x3C
  1454. +#define MT7621_STATS_TL512PC 0x40
  1455. +#define MT7621_STATS_TL1024PC 0x44
  1456. +#define MT7621_STATS_TOC 0x48
  1457. +#define MT7621_STATS_RDPC 0x60
  1458. +#define MT7621_STATS_RFPC 0x64
  1459. +#define MT7621_STATS_RUPC 0x68
  1460. +#define MT7621_STATS_RMPC 0x6C
  1461. +#define MT7621_STATS_RBPC 0x70
  1462. +#define MT7621_STATS_RAEPC 0x74
  1463. +#define MT7621_STATS_RCEPC 0x78
  1464. +#define MT7621_STATS_RUSPC 0x7C
  1465. +#define MT7621_STATS_RFEPC 0x80
  1466. +#define MT7621_STATS_ROSPC 0x84
  1467. +#define MT7621_STATS_RJEPC 0x88
  1468. +#define MT7621_STATS_RPPC 0x8C
  1469. +#define MT7621_STATS_RL64PC 0x90
  1470. +#define MT7621_STATS_RL65PC 0x94
  1471. +#define MT7621_STATS_RL128PC 0x98
  1472. +#define MT7621_STATS_RL256PC 0x9C
  1473. +#define MT7621_STATS_RL512PC 0xA0
  1474. +#define MT7621_STATS_RL1024PC 0xA4
  1475. +#define MT7621_STATS_ROC 0xA8
  1476. +#define MT7621_STATS_RDPC_CTRL 0xB0
  1477. +#define MT7621_STATS_RDPC_ING 0xB4
  1478. +#define MT7621_STATS_RDPC_ARL 0xB8
  1479. +
  1480. +static const struct mt7xxx_mib_desc mt7621_mibs[] = {
  1481. + MIB_DESC(1, MT7621_STATS_TDPC, "TxDrop"),
  1482. + MIB_DESC(1, MT7621_STATS_TCRC, "TxCRC"),
  1483. + MIB_DESC(1, MT7621_STATS_TUPC, "TxUni"),
  1484. + MIB_DESC(1, MT7621_STATS_TMPC, "TxMulti"),
  1485. + MIB_DESC(1, MT7621_STATS_TBPC, "TxBroad"),
  1486. + MIB_DESC(1, MT7621_STATS_TCEC, "TxCollision"),
  1487. + MIB_DESC(1, MT7621_STATS_TSCEC, "TxSingleCol"),
  1488. + MIB_DESC(1, MT7621_STATS_TMCEC, "TxMultiCol"),
  1489. + MIB_DESC(1, MT7621_STATS_TDEC, "TxDefer"),
  1490. + MIB_DESC(1, MT7621_STATS_TLCEC, "TxLateCol"),
  1491. + MIB_DESC(1, MT7621_STATS_TXCEC, "TxExcCol"),
  1492. + MIB_DESC(1, MT7621_STATS_TPPC, "TxPause"),
  1493. + MIB_DESC(1, MT7621_STATS_TL64PC, "Tx64Byte"),
  1494. + MIB_DESC(1, MT7621_STATS_TL65PC, "Tx65Byte"),
  1495. + MIB_DESC(1, MT7621_STATS_TL128PC, "Tx128Byte"),
  1496. + MIB_DESC(1, MT7621_STATS_TL256PC, "Tx256Byte"),
  1497. + MIB_DESC(1, MT7621_STATS_TL512PC, "Tx512Byte"),
  1498. + MIB_DESC(1, MT7621_STATS_TL1024PC, "Tx1024Byte"),
  1499. + MIB_DESC(2, MT7621_STATS_TOC, "TxByte"),
  1500. + MIB_DESC(1, MT7621_STATS_RDPC, "RxDrop"),
  1501. + MIB_DESC(1, MT7621_STATS_RFPC, "RxFiltered"),
  1502. + MIB_DESC(1, MT7621_STATS_RUPC, "RxUni"),
  1503. + MIB_DESC(1, MT7621_STATS_RMPC, "RxMulti"),
  1504. + MIB_DESC(1, MT7621_STATS_RBPC, "RxBroad"),
  1505. + MIB_DESC(1, MT7621_STATS_RAEPC, "RxAlignErr"),
  1506. + MIB_DESC(1, MT7621_STATS_RCEPC, "RxCRC"),
  1507. + MIB_DESC(1, MT7621_STATS_RUSPC, "RxUnderSize"),
  1508. + MIB_DESC(1, MT7621_STATS_RFEPC, "RxFragment"),
  1509. + MIB_DESC(1, MT7621_STATS_ROSPC, "RxOverSize"),
  1510. + MIB_DESC(1, MT7621_STATS_RJEPC, "RxJabber"),
  1511. + MIB_DESC(1, MT7621_STATS_RPPC, "RxPause"),
  1512. + MIB_DESC(1, MT7621_STATS_RL64PC, "Rx64Byte"),
  1513. + MIB_DESC(1, MT7621_STATS_RL65PC, "Rx65Byte"),
  1514. + MIB_DESC(1, MT7621_STATS_RL128PC, "Rx128Byte"),
  1515. + MIB_DESC(1, MT7621_STATS_RL256PC, "Rx256Byte"),
  1516. + MIB_DESC(1, MT7621_STATS_RL512PC, "Rx512Byte"),
  1517. + MIB_DESC(1, MT7621_STATS_RL1024PC, "Rx1024Byte"),
  1518. + MIB_DESC(2, MT7621_STATS_ROC, "RxByte"),
  1519. + MIB_DESC(1, MT7621_STATS_RDPC_CTRL, "RxCtrlDrop"),
  1520. + MIB_DESC(1, MT7621_STATS_RDPC_ING, "RxIngDrop"),
  1521. + MIB_DESC(1, MT7621_STATS_RDPC_ARL, "RxARLDrop")
  1522. +};
  1523. +
  1524. +enum {
  1525. + /* Global attributes. */
  1526. + MT7530_ATTR_ENABLE_VLAN,
  1527. +};
  1528. +
  1529. +struct mt7530_port_entry {
  1530. + u16 pvid;
  1531. +};
  1532. +
  1533. +struct mt7530_vlan_entry {
  1534. + u16 vid;
  1535. + u8 member;
  1536. + u8 etags;
  1537. +};
  1538. +
  1539. +struct mt7530_priv {
  1540. + void __iomem *base;
  1541. + struct mii_bus *bus;
  1542. + struct switch_dev swdev;
  1543. +
  1544. + bool global_vlan_enable;
  1545. + struct mt7530_vlan_entry vlan_entries[MT7530_NUM_VLANS];
  1546. + struct mt7530_port_entry port_entries[MT7530_NUM_PORTS];
  1547. +};
  1548. +
  1549. +struct mt7530_mapping {
  1550. + char *name;
  1551. + u16 pvids[MT7530_NUM_PORTS];
  1552. + u8 members[MT7530_NUM_VLANS];
  1553. + u8 etags[MT7530_NUM_VLANS];
  1554. + u16 vids[MT7530_NUM_VLANS];
  1555. +} mt7530_defaults[] = {
  1556. + {
  1557. + .name = "llllw",
  1558. + .pvids = { 1, 1, 1, 1, 2, 1, 1 },
  1559. + .members = { 0, 0x6f, 0x50 },
  1560. + .etags = { 0, 0x40, 0x40 },
  1561. + .vids = { 0, 1, 2 },
  1562. + }, {
  1563. + .name = "wllll",
  1564. + .pvids = { 2, 1, 1, 1, 1, 1, 1 },
  1565. + .members = { 0, 0x7e, 0x41 },
  1566. + .etags = { 0, 0x40, 0x40 },
  1567. + .vids = { 0, 1, 2 },
  1568. + },
  1569. +};
  1570. +
  1571. +struct mt7530_mapping*
  1572. +mt7530_find_mapping(struct device_node *np)
  1573. +{
  1574. + const char *map;
  1575. + int i;
  1576. +
  1577. + if (of_property_read_string(np, "mediatek,portmap", &map))
  1578. + return NULL;
  1579. +
  1580. + for (i = 0; i < ARRAY_SIZE(mt7530_defaults); i++)
  1581. + if (!strcmp(map, mt7530_defaults[i].name))
  1582. + return &mt7530_defaults[i];
  1583. +
  1584. + return NULL;
  1585. +}
  1586. +
  1587. +static void
  1588. +mt7530_apply_mapping(struct mt7530_priv *mt7530, struct mt7530_mapping *map)
  1589. +{
  1590. + int i = 0;
  1591. +
  1592. + for (i = 0; i < MT7530_NUM_PORTS; i++)
  1593. + mt7530->port_entries[i].pvid = map->pvids[i];
  1594. +
  1595. + for (i = 0; i < MT7530_NUM_VLANS; i++) {
  1596. + mt7530->vlan_entries[i].member = map->members[i];
  1597. + mt7530->vlan_entries[i].etags = map->etags[i];
  1598. + mt7530->vlan_entries[i].vid = map->vids[i];
  1599. + }
  1600. +}
  1601. +
  1602. +static int
  1603. +mt7530_reset_switch(struct switch_dev *dev)
  1604. +{
  1605. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1606. + int i;
  1607. +
  1608. + memset(eth->port_entries, 0, sizeof(eth->port_entries));
  1609. + memset(eth->vlan_entries, 0, sizeof(eth->vlan_entries));
  1610. +
  1611. + /* set default vid of each vlan to the same number of vlan, so the vid
  1612. + * won't need be set explicitly.
  1613. + */
  1614. + for (i = 0; i < MT7530_NUM_VLANS; i++) {
  1615. + eth->vlan_entries[i].vid = i;
  1616. + }
  1617. +
  1618. + return 0;
  1619. +}
  1620. +
  1621. +static int
  1622. +mt7530_get_vlan_enable(struct switch_dev *dev,
  1623. + const struct switch_attr *attr,
  1624. + struct switch_val *val)
  1625. +{
  1626. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1627. +
  1628. + val->value.i = eth->global_vlan_enable;
  1629. +
  1630. + return 0;
  1631. +}
  1632. +
  1633. +static int
  1634. +mt7530_set_vlan_enable(struct switch_dev *dev,
  1635. + const struct switch_attr *attr,
  1636. + struct switch_val *val)
  1637. +{
  1638. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1639. +
  1640. + eth->global_vlan_enable = val->value.i != 0;
  1641. +
  1642. + return 0;
  1643. +}
  1644. +
  1645. +static u32
  1646. +mt7530_r32(struct mt7530_priv *eth, u32 reg)
  1647. +{
  1648. + u32 val;
  1649. + if (eth->bus) {
  1650. + u16 high, low;
  1651. +
  1652. + mdiobus_write(eth->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
  1653. + low = mdiobus_read(eth->bus, 0x1f, (reg >> 2) & 0xf);
  1654. + high = mdiobus_read(eth->bus, 0x1f, 0x10);
  1655. +
  1656. + return (high << 16) | (low & 0xffff);
  1657. + }
  1658. +
  1659. + val = ioread32(eth->base + reg);
  1660. + pr_debug("MT7530 MDIO Read [%04x]=%08x\n", reg, val);
  1661. +
  1662. + return val;
  1663. +}
  1664. +
  1665. +static void
  1666. +mt7530_w32(struct mt7530_priv *eth, u32 reg, u32 val)
  1667. +{
  1668. + if (eth->bus) {
  1669. + mdiobus_write(eth->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
  1670. + mdiobus_write(eth->bus, 0x1f, (reg >> 2) & 0xf, val & 0xffff);
  1671. + mdiobus_write(eth->bus, 0x1f, 0x10, val >> 16);
  1672. + return;
  1673. + }
  1674. +
  1675. + pr_debug("MT7530 MDIO Write[%04x]=%08x\n", reg, val);
  1676. + iowrite32(val, eth->base + reg);
  1677. +}
  1678. +
  1679. +static void
  1680. +mt7530_vtcr(struct mt7530_priv *eth, u32 cmd, u32 val)
  1681. +{
  1682. + int i;
  1683. +
  1684. + mt7530_w32(eth, REG_ESW_VLAN_VTCR, BIT(31) | (cmd << 12) | val);
  1685. +
  1686. + for (i = 0; i < 20; i++) {
  1687. + u32 val = mt7530_r32(eth, REG_ESW_VLAN_VTCR);
  1688. +
  1689. + if ((val & BIT(31)) == 0)
  1690. + break;
  1691. +
  1692. + udelay(1000);
  1693. + }
  1694. + if (i == 20)
  1695. + printk("mt7530: vtcr timeout\n");
  1696. +}
  1697. +
  1698. +static int
  1699. +mt7530_get_port_pvid(struct switch_dev *dev, int port, int *val)
  1700. +{
  1701. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1702. +
  1703. + if (port >= MT7530_NUM_PORTS)
  1704. + return -EINVAL;
  1705. +
  1706. + *val = mt7530_r32(eth, REG_ESW_PORT_PPBV1(port));
  1707. + *val &= 0xfff;
  1708. +
  1709. + return 0;
  1710. +}
  1711. +
  1712. +static int
  1713. +mt7530_set_port_pvid(struct switch_dev *dev, int port, int pvid)
  1714. +{
  1715. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1716. +
  1717. + if (port >= MT7530_NUM_PORTS)
  1718. + return -EINVAL;
  1719. +
  1720. + if (pvid < MT7530_MIN_VID || pvid > MT7530_MAX_VID)
  1721. + return -EINVAL;
  1722. +
  1723. + eth->port_entries[port].pvid = pvid;
  1724. +
  1725. + return 0;
  1726. +}
  1727. +
  1728. +static int
  1729. +mt7530_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  1730. +{
  1731. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1732. + u32 member;
  1733. + u32 etags;
  1734. + int i;
  1735. +
  1736. + val->len = 0;
  1737. +
  1738. + if (val->port_vlan < 0 || val->port_vlan >= MT7530_NUM_VLANS)
  1739. + return -EINVAL;
  1740. +
  1741. + mt7530_vtcr(eth, 0, val->port_vlan);
  1742. +
  1743. + member = mt7530_r32(eth, REG_ESW_VLAN_VAWD1);
  1744. + member >>= 16;
  1745. + member &= 0xff;
  1746. +
  1747. + etags = mt7530_r32(eth, REG_ESW_VLAN_VAWD2);
  1748. +
  1749. + for (i = 0; i < MT7530_NUM_PORTS; i++) {
  1750. + struct switch_port *p;
  1751. + int etag;
  1752. +
  1753. + if (!(member & BIT(i)))
  1754. + continue;
  1755. +
  1756. + p = &val->value.ports[val->len++];
  1757. + p->id = i;
  1758. +
  1759. + etag = (etags >> (i * 2)) & 0x3;
  1760. +
  1761. + if (etag == ETAG_CTRL_TAG)
  1762. + p->flags |= BIT(SWITCH_PORT_FLAG_TAGGED);
  1763. + else if (etag != ETAG_CTRL_UNTAG)
  1764. + printk("vlan egress tag control neither untag nor tag.\n");
  1765. + }
  1766. +
  1767. + return 0;
  1768. +}
  1769. +
  1770. +static int
  1771. +mt7530_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  1772. +{
  1773. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1774. + u8 member = 0;
  1775. + u8 etags = 0;
  1776. + int i;
  1777. +
  1778. + if (val->port_vlan < 0 || val->port_vlan >= MT7530_NUM_VLANS ||
  1779. + val->len > MT7530_NUM_PORTS)
  1780. + return -EINVAL;
  1781. +
  1782. + for (i = 0; i < val->len; i++) {
  1783. + struct switch_port *p = &val->value.ports[i];
  1784. +
  1785. + if (p->id >= MT7530_NUM_PORTS)
  1786. + return -EINVAL;
  1787. +
  1788. + member |= BIT(p->id);
  1789. +
  1790. + if (p->flags & BIT(SWITCH_PORT_FLAG_TAGGED))
  1791. + etags |= BIT(p->id);
  1792. + }
  1793. + eth->vlan_entries[val->port_vlan].member = member;
  1794. + eth->vlan_entries[val->port_vlan].etags = etags;
  1795. +
  1796. + return 0;
  1797. +}
  1798. +
  1799. +static int
  1800. +mt7530_set_vid(struct switch_dev *dev, const struct switch_attr *attr,
  1801. + struct switch_val *val)
  1802. +{
  1803. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1804. + int vlan;
  1805. + u16 vid;
  1806. +
  1807. + vlan = val->port_vlan;
  1808. + vid = (u16)val->value.i;
  1809. +
  1810. + if (vlan < 0 || vlan >= MT7530_NUM_VLANS)
  1811. + return -EINVAL;
  1812. +
  1813. + if (vid < MT7530_MIN_VID || vid > MT7530_MAX_VID)
  1814. + return -EINVAL;
  1815. +
  1816. + eth->vlan_entries[vlan].vid = vid;
  1817. + return 0;
  1818. +}
  1819. +
  1820. +static int
  1821. +mt7530_get_vid(struct switch_dev *dev, const struct switch_attr *attr,
  1822. + struct switch_val *val)
  1823. +{
  1824. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1825. + u32 vid;
  1826. + int vlan;
  1827. +
  1828. + vlan = val->port_vlan;
  1829. +
  1830. + vid = mt7530_r32(eth, REG_ESW_VLAN_VTIM(vlan));
  1831. + if (vlan & 1)
  1832. + vid = vid >> 12;
  1833. + vid &= 0xfff;
  1834. +
  1835. + val->value.i = vid;
  1836. + return 0;
  1837. +}
  1838. +
  1839. +static int
  1840. +mt7530_apply_config(struct switch_dev *dev)
  1841. +{
  1842. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1843. + int i, j;
  1844. + u8 tag_ports;
  1845. + u8 untag_ports;
  1846. +
  1847. + if (!eth->global_vlan_enable) {
  1848. + for (i = 0; i < MT7530_NUM_PORTS; i++)
  1849. + mt7530_w32(eth, REG_ESW_PORT_PCR(i), 0x00ff0000);
  1850. +
  1851. + for (i = 0; i < MT7530_NUM_PORTS; i++)
  1852. + mt7530_w32(eth, REG_ESW_PORT_PVC(i), 0x810000c0);
  1853. +
  1854. + return 0;
  1855. + }
  1856. +
  1857. + /* set all ports as security mode */
  1858. + for (i = 0; i < MT7530_NUM_PORTS; i++)
  1859. + mt7530_w32(eth, REG_ESW_PORT_PCR(i), 0x00ff0003);
  1860. +
  1861. + /* check if a port is used in tag/untag vlan egress mode */
  1862. + tag_ports = 0;
  1863. + untag_ports = 0;
  1864. +
  1865. + for (i = 0; i < MT7530_NUM_VLANS; i++) {
  1866. + u8 member = eth->vlan_entries[i].member;
  1867. + u8 etags = eth->vlan_entries[i].etags;
  1868. +
  1869. + if (!member)
  1870. + continue;
  1871. +
  1872. + for (j = 0; j < MT7530_NUM_PORTS; j++) {
  1873. + if (!(member & BIT(j)))
  1874. + continue;
  1875. +
  1876. + if (etags & BIT(j))
  1877. + tag_ports |= 1u << j;
  1878. + else
  1879. + untag_ports |= 1u << j;
  1880. + }
  1881. + }
  1882. +
  1883. + /* set all untag-only ports as transparent and the rest as user port */
  1884. + for (i = 0; i < MT7530_NUM_PORTS; i++) {
  1885. + u32 pvc_mode = 0x81000000;
  1886. +
  1887. + if (untag_ports & BIT(i) && !(tag_ports & BIT(i)))
  1888. + pvc_mode = 0x810000c0;
  1889. +
  1890. + mt7530_w32(eth, REG_ESW_PORT_PVC(i), pvc_mode);
  1891. + }
  1892. +
  1893. + for (i = 0; i < MT7530_NUM_VLANS; i++) {
  1894. + u16 vid = eth->vlan_entries[i].vid;
  1895. + u8 member = eth->vlan_entries[i].member;
  1896. + u8 etags = eth->vlan_entries[i].etags;
  1897. + u32 val;
  1898. +
  1899. + /* vid of vlan */
  1900. + val = mt7530_r32(eth, REG_ESW_VLAN_VTIM(i));
  1901. + if (i % 2 == 0) {
  1902. + val &= 0xfff000;
  1903. + val |= vid;
  1904. + } else {
  1905. + val &= 0xfff;
  1906. + val |= (vid << 12);
  1907. + }
  1908. + mt7530_w32(eth, REG_ESW_VLAN_VTIM(i), val);
  1909. +
  1910. + /* vlan port membership */
  1911. + if (member)
  1912. + mt7530_w32(eth, REG_ESW_VLAN_VAWD1, REG_ESW_VLAN_VAWD1_IVL_MAC |
  1913. + REG_ESW_VLAN_VAWD1_VTAG_EN | (member << 16) |
  1914. + REG_ESW_VLAN_VAWD1_VALID);
  1915. + else
  1916. + mt7530_w32(eth, REG_ESW_VLAN_VAWD1, 0);
  1917. +
  1918. + /* egress mode */
  1919. + val = 0;
  1920. + for (j = 0; j < MT7530_NUM_PORTS; j++) {
  1921. + if (etags & BIT(j))
  1922. + val |= ETAG_CTRL_TAG << (j * 2);
  1923. + else
  1924. + val |= ETAG_CTRL_UNTAG << (j * 2);
  1925. + }
  1926. + mt7530_w32(eth, REG_ESW_VLAN_VAWD2, val);
  1927. +
  1928. + /* write to vlan table */
  1929. + mt7530_vtcr(eth, 1, i);
  1930. + }
  1931. +
  1932. + /* Port Default PVID */
  1933. + for (i = 0; i < MT7530_NUM_PORTS; i++) {
  1934. + u32 val;
  1935. + val = mt7530_r32(eth, REG_ESW_PORT_PPBV1(i));
  1936. + val &= ~0xfff;
  1937. + val |= eth->port_entries[i].pvid;
  1938. + mt7530_w32(eth, REG_ESW_PORT_PPBV1(i), val);
  1939. + }
  1940. +
  1941. + return 0;
  1942. +}
  1943. +
  1944. +static int
  1945. +mt7530_get_port_link(struct switch_dev *dev, int port,
  1946. + struct switch_port_link *link)
  1947. +{
  1948. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  1949. + u32 speed, pmsr;
  1950. +
  1951. + if (port < 0 || port >= MT7530_NUM_PORTS)
  1952. + return -EINVAL;
  1953. +
  1954. + pmsr = mt7530_r32(eth, 0x3008 + (0x100 * port));
  1955. +
  1956. + link->link = pmsr & 1;
  1957. + link->duplex = (pmsr >> 1) & 1;
  1958. + speed = (pmsr >> 2) & 3;
  1959. +
  1960. + switch (speed) {
  1961. + case 0:
  1962. + link->speed = SWITCH_PORT_SPEED_10;
  1963. + break;
  1964. + case 1:
  1965. + link->speed = SWITCH_PORT_SPEED_100;
  1966. + break;
  1967. + case 2:
  1968. + case 3: /* forced gige speed can be 2 or 3 */
  1969. + link->speed = SWITCH_PORT_SPEED_1000;
  1970. + break;
  1971. + default:
  1972. + link->speed = SWITCH_PORT_SPEED_UNKNOWN;
  1973. + break;
  1974. + }
  1975. +
  1976. + return 0;
  1977. +}
  1978. +
  1979. +static const struct switch_attr mt7530_global[] = {
  1980. + {
  1981. + .type = SWITCH_TYPE_INT,
  1982. + .name = "enable_vlan",
  1983. + .description = "VLAN mode (1:enabled)",
  1984. + .max = 1,
  1985. + .id = MT7530_ATTR_ENABLE_VLAN,
  1986. + .get = mt7530_get_vlan_enable,
  1987. + .set = mt7530_set_vlan_enable,
  1988. + },
  1989. +};
  1990. +
  1991. +static u64 get_mib_counter(struct mt7530_priv *eth, int i, int port)
  1992. +{
  1993. + unsigned int port_base;
  1994. + u64 t;
  1995. +
  1996. + port_base = MT7621_MIB_COUNTER_BASE +
  1997. + MT7621_MIB_COUNTER_PORT_OFFSET * port;
  1998. +
  1999. + t = mt7530_r32(eth, port_base + mt7621_mibs[i].offset);
  2000. + if (mt7621_mibs[i].size == 2) {
  2001. + u64 hi;
  2002. +
  2003. + hi = mt7530_r32(eth, port_base + mt7621_mibs[i].offset + 4);
  2004. + t |= hi << 32;
  2005. + }
  2006. +
  2007. + return t;
  2008. +}
  2009. +
  2010. +static int mt7621_sw_get_port_mib(struct switch_dev *dev,
  2011. + const struct switch_attr *attr,
  2012. + struct switch_val *val)
  2013. +{
  2014. + static char buf[4096];
  2015. + struct mt7530_priv *eth = container_of(dev, struct mt7530_priv, swdev);
  2016. + int i, len = 0;
  2017. +
  2018. + if (val->port_vlan >= MT7530_NUM_PORTS)
  2019. + return -EINVAL;
  2020. +
  2021. + len += snprintf(buf + len, sizeof(buf) - len,
  2022. + "Port %d MIB counters\n", val->port_vlan);
  2023. +
  2024. + for (i = 0; i < sizeof(mt7621_mibs) / sizeof(*mt7621_mibs); ++i) {
  2025. + u64 counter;
  2026. + len += snprintf(buf + len, sizeof(buf) - len,
  2027. + "%-11s: ", mt7621_mibs[i].name);
  2028. + counter = get_mib_counter(eth, i, val->port_vlan);
  2029. + len += snprintf(buf + len, sizeof(buf) - len, "%llu\n",
  2030. + counter);
  2031. + }
  2032. +
  2033. + val->value.s = buf;
  2034. + val->len = len;
  2035. + return 0;
  2036. +}
  2037. +
  2038. +static const struct switch_attr mt7621_port[] = {
  2039. + {
  2040. + .type = SWITCH_TYPE_STRING,
  2041. + .name = "mib",
  2042. + .description = "Get MIB counters for port",
  2043. + .get = mt7621_sw_get_port_mib,
  2044. + .set = NULL,
  2045. + },
  2046. +};
  2047. +
  2048. +static const struct switch_attr mt7530_port[] = {
  2049. +};
  2050. +
  2051. +static const struct switch_attr mt7530_vlan[] = {
  2052. + {
  2053. + .type = SWITCH_TYPE_INT,
  2054. + .name = "vid",
  2055. + .description = "VLAN ID (0-4094)",
  2056. + .set = mt7530_set_vid,
  2057. + .get = mt7530_get_vid,
  2058. + .max = 4094,
  2059. + },
  2060. +};
  2061. +
  2062. +static const struct switch_dev_ops mt7621_ops = {
  2063. + .attr_global = {
  2064. + .attr = mt7530_global,
  2065. + .n_attr = ARRAY_SIZE(mt7530_global),
  2066. + },
  2067. +/* .attr_port = {
  2068. + .attr = mt7621_port,
  2069. + .n_attr = ARRAY_SIZE(mt7621_port),
  2070. + },*/
  2071. + .attr_vlan = {
  2072. + .attr = mt7530_vlan,
  2073. + .n_attr = ARRAY_SIZE(mt7530_vlan),
  2074. + },
  2075. + .get_vlan_ports = mt7530_get_vlan_ports,
  2076. + .set_vlan_ports = mt7530_set_vlan_ports,
  2077. + .get_port_pvid = mt7530_get_port_pvid,
  2078. + .set_port_pvid = mt7530_set_port_pvid,
  2079. + .get_port_link = mt7530_get_port_link,
  2080. + .apply_config = mt7530_apply_config,
  2081. + .reset_switch = mt7530_reset_switch,
  2082. +};
  2083. +
  2084. +static const struct switch_dev_ops mt7530_ops = {
  2085. + .attr_global = {
  2086. + .attr = mt7530_global,
  2087. + .n_attr = ARRAY_SIZE(mt7530_global),
  2088. + },
  2089. + .attr_port = {
  2090. + .attr = mt7530_port,
  2091. + .n_attr = ARRAY_SIZE(mt7530_port),
  2092. + },
  2093. + .attr_vlan = {
  2094. + .attr = mt7530_vlan,
  2095. + .n_attr = ARRAY_SIZE(mt7530_vlan),
  2096. + },
  2097. + .get_vlan_ports = mt7530_get_vlan_ports,
  2098. + .set_vlan_ports = mt7530_set_vlan_ports,
  2099. + .get_port_pvid = mt7530_get_port_pvid,
  2100. + .set_port_pvid = mt7530_set_port_pvid,
  2101. + .get_port_link = mt7530_get_port_link,
  2102. + .apply_config = mt7530_apply_config,
  2103. + .reset_switch = mt7530_reset_switch,
  2104. +};
  2105. +
  2106. +int
  2107. +mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan)
  2108. +{
  2109. + struct switch_dev *swdev;
  2110. + struct mt7530_priv *mt7530;
  2111. + struct mt7530_mapping *map;
  2112. + int ret;
  2113. +
  2114. + mt7530 = devm_kzalloc(dev, sizeof(struct mt7530_priv), GFP_KERNEL);
  2115. + if (!mt7530)
  2116. + return -ENOMEM;
  2117. +
  2118. + mt7530->base = base;
  2119. + mt7530->bus = bus;
  2120. + mt7530->global_vlan_enable = vlan;
  2121. +
  2122. + swdev = &mt7530->swdev;
  2123. + if (bus) {
  2124. + swdev->alias = "mt7530";
  2125. + swdev->name = "mt7530";
  2126. + } else if (IS_ENABLED(CONFIG_MACH_MT7623)) {
  2127. + swdev->alias = "mt7623";
  2128. + swdev->name = "mt7623";
  2129. + } else if (IS_ENABLED(CONFIG_SOC_MT7621)) {
  2130. + swdev->alias = "mt7621";
  2131. + swdev->name = "mt7621";
  2132. + } else {
  2133. + swdev->alias = "mt7620";
  2134. + swdev->name = "mt7620";
  2135. + }
  2136. + swdev->cpu_port = MT7530_CPU_PORT;
  2137. + swdev->ports = MT7530_NUM_PORTS;
  2138. + swdev->vlans = MT7530_NUM_VLANS;
  2139. + if (IS_ENABLED(CONFIG_SOC_MT7621) || IS_ENABLED(CONFIG_MACH_MT7623))
  2140. + swdev->ops = &mt7621_ops;
  2141. + else
  2142. + swdev->ops = &mt7530_ops;
  2143. +
  2144. + ret = register_switch(swdev, NULL);
  2145. + if (ret) {
  2146. + dev_err(dev, "failed to register mt7530\n");
  2147. + return ret;
  2148. + }
  2149. +
  2150. + mt7530_reset_switch(swdev);
  2151. +
  2152. + map = mt7530_find_mapping(dev->of_node);
  2153. + if (map)
  2154. + mt7530_apply_mapping(mt7530, map);
  2155. + mt7530_apply_config(swdev);
  2156. +
  2157. + /* magic vodoo */
  2158. + if (!(IS_ENABLED(CONFIG_SOC_MT7621) || IS_ENABLED(CONFIG_MACH_MT7623)) && bus && mt7530_r32(mt7530, REG_HWTRAP) != 0x1117edf) {
  2159. + dev_info(dev, "fixing up MHWTRAP register - bootloader probably played with it\n");
  2160. + mt7530_w32(mt7530, REG_HWTRAP, 0x1117edf);
  2161. + }
  2162. + dev_info(dev, "loaded %s driver\n", swdev->name);
  2163. +
  2164. + return 0;
  2165. +}
  2166. diff --git a/drivers/net/ethernet/mediatek/mt7530.h b/drivers/net/ethernet/mediatek/mt7530.h
  2167. new file mode 100644
  2168. index 0000000..1fc8c62
  2169. --- /dev/null
  2170. +++ b/drivers/net/ethernet/mediatek/mt7530.h
  2171. @@ -0,0 +1,20 @@
  2172. +/*
  2173. + * This program is free software; you can redistribute it and/or
  2174. + * modify it under the terms of the GNU General Public License
  2175. + * as published by the Free Software Foundation; either version 2
  2176. + * of the License, or (at your option) any later version.
  2177. + *
  2178. + * This program is distributed in the hope that it will be useful,
  2179. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  2180. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  2181. + * GNU General Public License for more details.
  2182. + *
  2183. + * Copyright (C) 2013 John Crispin <[email protected]>
  2184. + */
  2185. +
  2186. +#ifndef _MT7530_H__
  2187. +#define _MT7530_H__
  2188. +
  2189. +int mt7530_probe(struct device *dev, void __iomem *base, struct mii_bus *bus, int vlan);
  2190. +
  2191. +#endif
  2192. diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  2193. index ba3afa5..62058a2 100644
  2194. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  2195. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  2196. @@ -24,6 +24,9 @@
  2197. #include "mtk_eth_soc.h"
  2198. +/* the callback used by the driver core to bringup the switch */
  2199. +int mtk_gsw_init(struct mtk_eth *eth);
  2200. +
  2201. static int mtk_msg_level = -1;
  2202. module_param_named(msg_level, mtk_msg_level, int, 0);
  2203. MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
  2204. @@ -69,7 +72,7 @@ static int mtk_mdio_busy_wait(struct mtk_eth *eth)
  2205. return 0;
  2206. if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT))
  2207. break;
  2208. - usleep_range(10, 20);
  2209. +// usleep_range(10, 20);
  2210. }
  2211. dev_err(eth->dev, "mdio: MDIO timeout\n");
  2212. @@ -132,36 +135,20 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
  2213. static void mtk_phy_link_adjust(struct net_device *dev)
  2214. {
  2215. + return;
  2216. +
  2217. struct mtk_mac *mac = netdev_priv(dev);
  2218. u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
  2219. MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
  2220. MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
  2221. MAC_MCR_BACKPR_EN;
  2222. - switch (mac->phy_dev->speed) {
  2223. - case SPEED_1000:
  2224. - mcr |= MAC_MCR_SPEED_1000;
  2225. - break;
  2226. - case SPEED_100:
  2227. - mcr |= MAC_MCR_SPEED_100;
  2228. - break;
  2229. - };
  2230. -
  2231. - if (mac->phy_dev->link)
  2232. - mcr |= MAC_MCR_FORCE_LINK;
  2233. -
  2234. - if (mac->phy_dev->duplex)
  2235. - mcr |= MAC_MCR_FORCE_DPX;
  2236. -
  2237. - if (mac->phy_dev->pause)
  2238. - mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
  2239. -
  2240. + mcr |= MAC_MCR_SPEED_1000;
  2241. + mcr |= MAC_MCR_FORCE_LINK;
  2242. + mcr |= MAC_MCR_FORCE_DPX;
  2243. + mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
  2244. mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
  2245. -
  2246. - if (mac->phy_dev->link)
  2247. - netif_carrier_on(dev);
  2248. - else
  2249. - netif_carrier_off(dev);
  2250. + return;
  2251. }
  2252. static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac,
  2253. @@ -193,7 +180,7 @@ static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac,
  2254. dev_info(eth->dev,
  2255. "connected mac %d to PHY at %s [uid=%08x, driver=%s]\n",
  2256. - mac->id, phydev_name(phydev), phydev->phy_id,
  2257. + mac->id, dev_name(&phydev->dev), phydev->phy_id,
  2258. phydev->drv->name);
  2259. mac->phy_dev = phydev;
  2260. @@ -634,7 +621,6 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
  2261. spin_unlock_irqrestore(&eth->page_lock, flags);
  2262. - netdev_sent_queue(dev, skb->len);
  2263. skb_tx_timestamp(skb);
  2264. ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
  2265. @@ -882,7 +868,6 @@ static int mtk_poll_tx(struct mtk_eth *eth, int budget, bool *tx_again)
  2266. for (i = 0; i < MTK_MAC_COUNT; i++) {
  2267. if (!eth->netdev[i] || !done[i])
  2268. continue;
  2269. - netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
  2270. total += done[i];
  2271. }
  2272. @@ -1249,6 +1234,8 @@ static int mtk_open(struct net_device *dev)
  2273. phy_start(mac->phy_dev);
  2274. netif_start_queue(dev);
  2275. + netif_carrier_on(dev);
  2276. +
  2277. return 0;
  2278. }
  2279. @@ -1281,6 +1268,7 @@ static int mtk_stop(struct net_device *dev)
  2280. struct mtk_mac *mac = netdev_priv(dev);
  2281. struct mtk_eth *eth = mac->hw;
  2282. + netif_carrier_off(dev);
  2283. netif_tx_disable(dev);
  2284. phy_stop(mac->phy_dev);
  2285. @@ -1326,6 +1314,7 @@ static int __init mtk_hw_init(struct mtk_eth *eth)
  2286. /* Enable RX VLan Offloading */
  2287. mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
  2288. + mtk_gsw_init(eth);
  2289. err = devm_request_irq(eth->dev, eth->irq, mtk_handle_irq, 0,
  2290. dev_name(eth->dev), eth);
  2291. if (err)
  2292. @@ -1358,6 +1347,8 @@ static int __init mtk_hw_init(struct mtk_eth *eth)
  2293. mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
  2294. }
  2295. + mt7623_gsw_config(eth);
  2296. +
  2297. return 0;
  2298. }
  2299. @@ -1464,11 +1455,13 @@ static int mtk_set_settings(struct net_device *dev,
  2300. {
  2301. struct mtk_mac *mac = netdev_priv(dev);
  2302. - if (cmd->phy_address != mac->phy_dev->mdio.addr) {
  2303. - mac->phy_dev = mdiobus_get_phy(mac->hw->mii_bus,
  2304. - cmd->phy_address);
  2305. - if (!mac->phy_dev)
  2306. + if (cmd->phy_address != mac->phy_dev->addr) {
  2307. + if (mac->hw->mii_bus->phy_map[cmd->phy_address]) {
  2308. + mac->phy_dev =
  2309. + mac->hw->mii_bus->phy_map[cmd->phy_address];
  2310. + } else {
  2311. return -ENODEV;
  2312. + }
  2313. }
  2314. return phy_ethtool_sset(mac->phy_dev, cmd);
  2315. @@ -1561,7 +1554,6 @@ static void mtk_get_ethtool_stats(struct net_device *dev,
  2316. data_src = (u64*)hwstats;
  2317. data_dst = data;
  2318. start = u64_stats_fetch_begin_irq(&hwstats->syncp);
  2319. -
  2320. for (i = 0; i < ARRAY_SIZE(mtk_ethtool_stats); i++)
  2321. *data_dst++ = *(data_src + mtk_ethtool_stats[i].offset);
  2322. } while (u64_stats_fetch_retry_irq(&hwstats->syncp, start));
  2323. @@ -1733,6 +1725,9 @@ static int mtk_probe(struct platform_device *pdev)
  2324. clk_prepare_enable(eth->clk_gp1);
  2325. clk_prepare_enable(eth->clk_gp2);
  2326. + eth->switch_np = of_parse_phandle(pdev->dev.of_node,
  2327. + "mediatek,switch", 0);
  2328. +
  2329. eth->dev = &pdev->dev;
  2330. eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
  2331. diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  2332. index 48a5292..d737d61 100644
  2333. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  2334. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  2335. @@ -389,6 +389,9 @@ struct mtk_eth {
  2336. struct clk *clk_gp1;
  2337. struct clk *clk_gp2;
  2338. struct mii_bus *mii_bus;
  2339. +
  2340. + struct device_node *switch_np;
  2341. + void *sw_priv;
  2342. };
  2343. /* struct mtk_mac - the structure that holds the info about the MACs of the
  2344. @@ -418,4 +421,6 @@ void mtk_stats_update_mac(struct mtk_mac *mac);
  2345. void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
  2346. u32 mtk_r32(struct mtk_eth *eth, unsigned reg);
  2347. +int mt7623_gsw_config(struct mtk_eth *eth);
  2348. +
  2349. #endif /* MTK_ETH_H */
  2350. diff --git a/lib/dynamic_queue_limits.c b/lib/dynamic_queue_limits.c
  2351. index f346715..b04f8e6 100644
  2352. --- a/lib/dynamic_queue_limits.c
  2353. +++ b/lib/dynamic_queue_limits.c
  2354. @@ -23,8 +23,10 @@ void dql_completed(struct dql *dql, unsigned int count)
  2355. num_queued = ACCESS_ONCE(dql->num_queued);
  2356. /* Can't complete more than what's in queue */
  2357. - BUG_ON(count > num_queued - dql->num_completed);
  2358. -
  2359. + if (count > num_queued - dql->num_completed) {
  2360. + printk("%s:%s[%d]\n", __FILE__, __func__, __LINE__);
  2361. + count = 0;
  2362. + }
  2363. completed = dql->num_completed + count;
  2364. limit = dql->limit;
  2365. ovlimit = POSDIFF(num_queued - dql->num_completed, limit);
  2366. --
  2367. 1.7.10.4