ksz_common.c 81 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Microchip switch driver main logic
  4. *
  5. * Copyright (C) 2017-2019 Microchip Technology Inc.
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/export.h>
  9. #include <linux/gpio/consumer.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/platform_data/microchip-ksz.h>
  13. #include <linux/phy.h>
  14. #include <linux/etherdevice.h>
  15. #include <linux/if_bridge.h>
  16. #include <linux/irq.h>
  17. #include <linux/irqdomain.h>
  18. #include <linux/of_mdio.h>
  19. #include <linux/of_device.h>
  20. #include <linux/of_net.h>
  21. #include <linux/micrel_phy.h>
  22. #include <net/dsa.h>
  23. #include <net/switchdev.h>
  24. #include "ksz_common.h"
  25. #include "ksz8.h"
  26. #include "ksz9477.h"
  27. #include "lan937x.h"
  28. #define MIB_COUNTER_NUM 0x20
  29. struct ksz_stats_raw {
  30. u64 rx_hi;
  31. u64 rx_undersize;
  32. u64 rx_fragments;
  33. u64 rx_oversize;
  34. u64 rx_jabbers;
  35. u64 rx_symbol_err;
  36. u64 rx_crc_err;
  37. u64 rx_align_err;
  38. u64 rx_mac_ctrl;
  39. u64 rx_pause;
  40. u64 rx_bcast;
  41. u64 rx_mcast;
  42. u64 rx_ucast;
  43. u64 rx_64_or_less;
  44. u64 rx_65_127;
  45. u64 rx_128_255;
  46. u64 rx_256_511;
  47. u64 rx_512_1023;
  48. u64 rx_1024_1522;
  49. u64 rx_1523_2000;
  50. u64 rx_2001;
  51. u64 tx_hi;
  52. u64 tx_late_col;
  53. u64 tx_pause;
  54. u64 tx_bcast;
  55. u64 tx_mcast;
  56. u64 tx_ucast;
  57. u64 tx_deferred;
  58. u64 tx_total_col;
  59. u64 tx_exc_col;
  60. u64 tx_single_col;
  61. u64 tx_mult_col;
  62. u64 rx_total;
  63. u64 tx_total;
  64. u64 rx_discards;
  65. u64 tx_discards;
  66. };
  67. static const struct ksz_mib_names ksz88xx_mib_names[] = {
  68. { 0x00, "rx" },
  69. { 0x01, "rx_hi" },
  70. { 0x02, "rx_undersize" },
  71. { 0x03, "rx_fragments" },
  72. { 0x04, "rx_oversize" },
  73. { 0x05, "rx_jabbers" },
  74. { 0x06, "rx_symbol_err" },
  75. { 0x07, "rx_crc_err" },
  76. { 0x08, "rx_align_err" },
  77. { 0x09, "rx_mac_ctrl" },
  78. { 0x0a, "rx_pause" },
  79. { 0x0b, "rx_bcast" },
  80. { 0x0c, "rx_mcast" },
  81. { 0x0d, "rx_ucast" },
  82. { 0x0e, "rx_64_or_less" },
  83. { 0x0f, "rx_65_127" },
  84. { 0x10, "rx_128_255" },
  85. { 0x11, "rx_256_511" },
  86. { 0x12, "rx_512_1023" },
  87. { 0x13, "rx_1024_1522" },
  88. { 0x14, "tx" },
  89. { 0x15, "tx_hi" },
  90. { 0x16, "tx_late_col" },
  91. { 0x17, "tx_pause" },
  92. { 0x18, "tx_bcast" },
  93. { 0x19, "tx_mcast" },
  94. { 0x1a, "tx_ucast" },
  95. { 0x1b, "tx_deferred" },
  96. { 0x1c, "tx_total_col" },
  97. { 0x1d, "tx_exc_col" },
  98. { 0x1e, "tx_single_col" },
  99. { 0x1f, "tx_mult_col" },
  100. { 0x100, "rx_discards" },
  101. { 0x101, "tx_discards" },
  102. };
  103. static const struct ksz_mib_names ksz9477_mib_names[] = {
  104. { 0x00, "rx_hi" },
  105. { 0x01, "rx_undersize" },
  106. { 0x02, "rx_fragments" },
  107. { 0x03, "rx_oversize" },
  108. { 0x04, "rx_jabbers" },
  109. { 0x05, "rx_symbol_err" },
  110. { 0x06, "rx_crc_err" },
  111. { 0x07, "rx_align_err" },
  112. { 0x08, "rx_mac_ctrl" },
  113. { 0x09, "rx_pause" },
  114. { 0x0A, "rx_bcast" },
  115. { 0x0B, "rx_mcast" },
  116. { 0x0C, "rx_ucast" },
  117. { 0x0D, "rx_64_or_less" },
  118. { 0x0E, "rx_65_127" },
  119. { 0x0F, "rx_128_255" },
  120. { 0x10, "rx_256_511" },
  121. { 0x11, "rx_512_1023" },
  122. { 0x12, "rx_1024_1522" },
  123. { 0x13, "rx_1523_2000" },
  124. { 0x14, "rx_2001" },
  125. { 0x15, "tx_hi" },
  126. { 0x16, "tx_late_col" },
  127. { 0x17, "tx_pause" },
  128. { 0x18, "tx_bcast" },
  129. { 0x19, "tx_mcast" },
  130. { 0x1A, "tx_ucast" },
  131. { 0x1B, "tx_deferred" },
  132. { 0x1C, "tx_total_col" },
  133. { 0x1D, "tx_exc_col" },
  134. { 0x1E, "tx_single_col" },
  135. { 0x1F, "tx_mult_col" },
  136. { 0x80, "rx_total" },
  137. { 0x81, "tx_total" },
  138. { 0x82, "rx_discards" },
  139. { 0x83, "tx_discards" },
  140. };
  141. static const struct ksz_dev_ops ksz8_dev_ops = {
  142. .setup = ksz8_setup,
  143. .get_port_addr = ksz8_get_port_addr,
  144. .cfg_port_member = ksz8_cfg_port_member,
  145. .flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
  146. .port_setup = ksz8_port_setup,
  147. .r_phy = ksz8_r_phy,
  148. .w_phy = ksz8_w_phy,
  149. .r_mib_cnt = ksz8_r_mib_cnt,
  150. .r_mib_pkt = ksz8_r_mib_pkt,
  151. .freeze_mib = ksz8_freeze_mib,
  152. .port_init_cnt = ksz8_port_init_cnt,
  153. .fdb_dump = ksz8_fdb_dump,
  154. .mdb_add = ksz8_mdb_add,
  155. .mdb_del = ksz8_mdb_del,
  156. .vlan_filtering = ksz8_port_vlan_filtering,
  157. .vlan_add = ksz8_port_vlan_add,
  158. .vlan_del = ksz8_port_vlan_del,
  159. .mirror_add = ksz8_port_mirror_add,
  160. .mirror_del = ksz8_port_mirror_del,
  161. .get_caps = ksz8_get_caps,
  162. .config_cpu_port = ksz8_config_cpu_port,
  163. .enable_stp_addr = ksz8_enable_stp_addr,
  164. .reset = ksz8_reset_switch,
  165. .init = ksz8_switch_init,
  166. .exit = ksz8_switch_exit,
  167. };
  168. static void ksz9477_phylink_mac_link_up(struct ksz_device *dev, int port,
  169. unsigned int mode,
  170. phy_interface_t interface,
  171. struct phy_device *phydev, int speed,
  172. int duplex, bool tx_pause,
  173. bool rx_pause);
  174. static const struct ksz_dev_ops ksz9477_dev_ops = {
  175. .setup = ksz9477_setup,
  176. .get_port_addr = ksz9477_get_port_addr,
  177. .cfg_port_member = ksz9477_cfg_port_member,
  178. .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
  179. .port_setup = ksz9477_port_setup,
  180. .set_ageing_time = ksz9477_set_ageing_time,
  181. .r_phy = ksz9477_r_phy,
  182. .w_phy = ksz9477_w_phy,
  183. .r_mib_cnt = ksz9477_r_mib_cnt,
  184. .r_mib_pkt = ksz9477_r_mib_pkt,
  185. .r_mib_stat64 = ksz_r_mib_stats64,
  186. .freeze_mib = ksz9477_freeze_mib,
  187. .port_init_cnt = ksz9477_port_init_cnt,
  188. .vlan_filtering = ksz9477_port_vlan_filtering,
  189. .vlan_add = ksz9477_port_vlan_add,
  190. .vlan_del = ksz9477_port_vlan_del,
  191. .mirror_add = ksz9477_port_mirror_add,
  192. .mirror_del = ksz9477_port_mirror_del,
  193. .get_caps = ksz9477_get_caps,
  194. .fdb_dump = ksz9477_fdb_dump,
  195. .fdb_add = ksz9477_fdb_add,
  196. .fdb_del = ksz9477_fdb_del,
  197. .mdb_add = ksz9477_mdb_add,
  198. .mdb_del = ksz9477_mdb_del,
  199. .change_mtu = ksz9477_change_mtu,
  200. .max_mtu = ksz9477_max_mtu,
  201. .phylink_mac_link_up = ksz9477_phylink_mac_link_up,
  202. .config_cpu_port = ksz9477_config_cpu_port,
  203. .enable_stp_addr = ksz9477_enable_stp_addr,
  204. .reset = ksz9477_reset_switch,
  205. .init = ksz9477_switch_init,
  206. .exit = ksz9477_switch_exit,
  207. };
  208. static const struct ksz_dev_ops lan937x_dev_ops = {
  209. .setup = lan937x_setup,
  210. .teardown = lan937x_teardown,
  211. .get_port_addr = ksz9477_get_port_addr,
  212. .cfg_port_member = ksz9477_cfg_port_member,
  213. .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
  214. .port_setup = lan937x_port_setup,
  215. .set_ageing_time = lan937x_set_ageing_time,
  216. .r_phy = lan937x_r_phy,
  217. .w_phy = lan937x_w_phy,
  218. .r_mib_cnt = ksz9477_r_mib_cnt,
  219. .r_mib_pkt = ksz9477_r_mib_pkt,
  220. .r_mib_stat64 = ksz_r_mib_stats64,
  221. .freeze_mib = ksz9477_freeze_mib,
  222. .port_init_cnt = ksz9477_port_init_cnt,
  223. .vlan_filtering = ksz9477_port_vlan_filtering,
  224. .vlan_add = ksz9477_port_vlan_add,
  225. .vlan_del = ksz9477_port_vlan_del,
  226. .mirror_add = ksz9477_port_mirror_add,
  227. .mirror_del = ksz9477_port_mirror_del,
  228. .get_caps = lan937x_phylink_get_caps,
  229. .setup_rgmii_delay = lan937x_setup_rgmii_delay,
  230. .fdb_dump = ksz9477_fdb_dump,
  231. .fdb_add = ksz9477_fdb_add,
  232. .fdb_del = ksz9477_fdb_del,
  233. .mdb_add = ksz9477_mdb_add,
  234. .mdb_del = ksz9477_mdb_del,
  235. .change_mtu = lan937x_change_mtu,
  236. .max_mtu = ksz9477_max_mtu,
  237. .phylink_mac_link_up = ksz9477_phylink_mac_link_up,
  238. .config_cpu_port = lan937x_config_cpu_port,
  239. .enable_stp_addr = ksz9477_enable_stp_addr,
  240. .reset = lan937x_reset_switch,
  241. .init = lan937x_switch_init,
  242. .exit = lan937x_switch_exit,
  243. };
  244. static const u16 ksz8795_regs[] = {
  245. [REG_IND_CTRL_0] = 0x6E,
  246. [REG_IND_DATA_8] = 0x70,
  247. [REG_IND_DATA_CHECK] = 0x72,
  248. [REG_IND_DATA_HI] = 0x71,
  249. [REG_IND_DATA_LO] = 0x75,
  250. [REG_IND_MIB_CHECK] = 0x74,
  251. [REG_IND_BYTE] = 0xA0,
  252. [P_FORCE_CTRL] = 0x0C,
  253. [P_LINK_STATUS] = 0x0E,
  254. [P_LOCAL_CTRL] = 0x07,
  255. [P_NEG_RESTART_CTRL] = 0x0D,
  256. [P_REMOTE_STATUS] = 0x08,
  257. [P_SPEED_STATUS] = 0x09,
  258. [S_TAIL_TAG_CTRL] = 0x0C,
  259. [P_STP_CTRL] = 0x02,
  260. [S_START_CTRL] = 0x01,
  261. [S_BROADCAST_CTRL] = 0x06,
  262. [S_MULTICAST_CTRL] = 0x04,
  263. [P_XMII_CTRL_0] = 0x06,
  264. [P_XMII_CTRL_1] = 0x06,
  265. };
  266. static const u32 ksz8795_masks[] = {
  267. [PORT_802_1P_REMAPPING] = BIT(7),
  268. [SW_TAIL_TAG_ENABLE] = BIT(1),
  269. [MIB_COUNTER_OVERFLOW] = BIT(6),
  270. [MIB_COUNTER_VALID] = BIT(5),
  271. [VLAN_TABLE_FID] = GENMASK(6, 0),
  272. [VLAN_TABLE_MEMBERSHIP] = GENMASK(11, 7),
  273. [VLAN_TABLE_VALID] = BIT(12),
  274. [STATIC_MAC_TABLE_VALID] = BIT(21),
  275. [STATIC_MAC_TABLE_USE_FID] = BIT(23),
  276. [STATIC_MAC_TABLE_FID] = GENMASK(30, 24),
  277. [STATIC_MAC_TABLE_OVERRIDE] = BIT(22),
  278. [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(20, 16),
  279. [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(6, 0),
  280. [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(7),
  281. [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
  282. [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 29),
  283. [DYNAMIC_MAC_TABLE_FID] = GENMASK(22, 16),
  284. [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(26, 24),
  285. [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(28, 27),
  286. [P_MII_TX_FLOW_CTRL] = BIT(5),
  287. [P_MII_RX_FLOW_CTRL] = BIT(5),
  288. };
  289. static const u8 ksz8795_xmii_ctrl0[] = {
  290. [P_MII_100MBIT] = 0,
  291. [P_MII_10MBIT] = 1,
  292. [P_MII_FULL_DUPLEX] = 0,
  293. [P_MII_HALF_DUPLEX] = 1,
  294. };
  295. static const u8 ksz8795_xmii_ctrl1[] = {
  296. [P_RGMII_SEL] = 3,
  297. [P_GMII_SEL] = 2,
  298. [P_RMII_SEL] = 1,
  299. [P_MII_SEL] = 0,
  300. [P_GMII_1GBIT] = 1,
  301. [P_GMII_NOT_1GBIT] = 0,
  302. };
  303. static const u8 ksz8795_shifts[] = {
  304. [VLAN_TABLE_MEMBERSHIP_S] = 7,
  305. [VLAN_TABLE] = 16,
  306. [STATIC_MAC_FWD_PORTS] = 16,
  307. [STATIC_MAC_FID] = 24,
  308. [DYNAMIC_MAC_ENTRIES_H] = 3,
  309. [DYNAMIC_MAC_ENTRIES] = 29,
  310. [DYNAMIC_MAC_FID] = 16,
  311. [DYNAMIC_MAC_TIMESTAMP] = 27,
  312. [DYNAMIC_MAC_SRC_PORT] = 24,
  313. };
  314. static const u16 ksz8863_regs[] = {
  315. [REG_IND_CTRL_0] = 0x79,
  316. [REG_IND_DATA_8] = 0x7B,
  317. [REG_IND_DATA_CHECK] = 0x7B,
  318. [REG_IND_DATA_HI] = 0x7C,
  319. [REG_IND_DATA_LO] = 0x80,
  320. [REG_IND_MIB_CHECK] = 0x80,
  321. [P_FORCE_CTRL] = 0x0C,
  322. [P_LINK_STATUS] = 0x0E,
  323. [P_LOCAL_CTRL] = 0x0C,
  324. [P_NEG_RESTART_CTRL] = 0x0D,
  325. [P_REMOTE_STATUS] = 0x0E,
  326. [P_SPEED_STATUS] = 0x0F,
  327. [S_TAIL_TAG_CTRL] = 0x03,
  328. [P_STP_CTRL] = 0x02,
  329. [S_START_CTRL] = 0x01,
  330. [S_BROADCAST_CTRL] = 0x06,
  331. [S_MULTICAST_CTRL] = 0x04,
  332. };
  333. static const u32 ksz8863_masks[] = {
  334. [PORT_802_1P_REMAPPING] = BIT(3),
  335. [SW_TAIL_TAG_ENABLE] = BIT(6),
  336. [MIB_COUNTER_OVERFLOW] = BIT(7),
  337. [MIB_COUNTER_VALID] = BIT(6),
  338. [VLAN_TABLE_FID] = GENMASK(15, 12),
  339. [VLAN_TABLE_MEMBERSHIP] = GENMASK(18, 16),
  340. [VLAN_TABLE_VALID] = BIT(19),
  341. [STATIC_MAC_TABLE_VALID] = BIT(19),
  342. [STATIC_MAC_TABLE_USE_FID] = BIT(21),
  343. [STATIC_MAC_TABLE_FID] = GENMASK(25, 22),
  344. [STATIC_MAC_TABLE_OVERRIDE] = BIT(20),
  345. [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(18, 16),
  346. [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(1, 0),
  347. [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(2),
  348. [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
  349. [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 24),
  350. [DYNAMIC_MAC_TABLE_FID] = GENMASK(19, 16),
  351. [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(21, 20),
  352. [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(23, 22),
  353. };
  354. static u8 ksz8863_shifts[] = {
  355. [VLAN_TABLE_MEMBERSHIP_S] = 16,
  356. [STATIC_MAC_FWD_PORTS] = 16,
  357. [STATIC_MAC_FID] = 22,
  358. [DYNAMIC_MAC_ENTRIES_H] = 8,
  359. [DYNAMIC_MAC_ENTRIES] = 24,
  360. [DYNAMIC_MAC_FID] = 16,
  361. [DYNAMIC_MAC_TIMESTAMP] = 22,
  362. [DYNAMIC_MAC_SRC_PORT] = 20,
  363. };
  364. static const u16 ksz9477_regs[] = {
  365. [P_STP_CTRL] = 0x0B04,
  366. [S_START_CTRL] = 0x0300,
  367. [S_BROADCAST_CTRL] = 0x0332,
  368. [S_MULTICAST_CTRL] = 0x0331,
  369. [P_XMII_CTRL_0] = 0x0300,
  370. [P_XMII_CTRL_1] = 0x0301,
  371. };
  372. static const u32 ksz9477_masks[] = {
  373. [ALU_STAT_WRITE] = 0,
  374. [ALU_STAT_READ] = 1,
  375. [P_MII_TX_FLOW_CTRL] = BIT(5),
  376. [P_MII_RX_FLOW_CTRL] = BIT(3),
  377. };
  378. static const u8 ksz9477_shifts[] = {
  379. [ALU_STAT_INDEX] = 16,
  380. };
  381. static const u8 ksz9477_xmii_ctrl0[] = {
  382. [P_MII_100MBIT] = 1,
  383. [P_MII_10MBIT] = 0,
  384. [P_MII_FULL_DUPLEX] = 1,
  385. [P_MII_HALF_DUPLEX] = 0,
  386. };
  387. static const u8 ksz9477_xmii_ctrl1[] = {
  388. [P_RGMII_SEL] = 0,
  389. [P_RMII_SEL] = 1,
  390. [P_GMII_SEL] = 2,
  391. [P_MII_SEL] = 3,
  392. [P_GMII_1GBIT] = 0,
  393. [P_GMII_NOT_1GBIT] = 1,
  394. };
  395. static const u32 lan937x_masks[] = {
  396. [ALU_STAT_WRITE] = 1,
  397. [ALU_STAT_READ] = 2,
  398. [P_MII_TX_FLOW_CTRL] = BIT(5),
  399. [P_MII_RX_FLOW_CTRL] = BIT(3),
  400. };
  401. static const u8 lan937x_shifts[] = {
  402. [ALU_STAT_INDEX] = 8,
  403. };
  404. static const struct regmap_range ksz8563_valid_regs[] = {
  405. regmap_reg_range(0x0000, 0x0003),
  406. regmap_reg_range(0x0006, 0x0006),
  407. regmap_reg_range(0x000f, 0x001f),
  408. regmap_reg_range(0x0100, 0x0100),
  409. regmap_reg_range(0x0104, 0x0107),
  410. regmap_reg_range(0x010d, 0x010d),
  411. regmap_reg_range(0x0110, 0x0113),
  412. regmap_reg_range(0x0120, 0x012b),
  413. regmap_reg_range(0x0201, 0x0201),
  414. regmap_reg_range(0x0210, 0x0213),
  415. regmap_reg_range(0x0300, 0x0300),
  416. regmap_reg_range(0x0302, 0x031b),
  417. regmap_reg_range(0x0320, 0x032b),
  418. regmap_reg_range(0x0330, 0x0336),
  419. regmap_reg_range(0x0338, 0x033e),
  420. regmap_reg_range(0x0340, 0x035f),
  421. regmap_reg_range(0x0370, 0x0370),
  422. regmap_reg_range(0x0378, 0x0378),
  423. regmap_reg_range(0x037c, 0x037d),
  424. regmap_reg_range(0x0390, 0x0393),
  425. regmap_reg_range(0x0400, 0x040e),
  426. regmap_reg_range(0x0410, 0x042f),
  427. regmap_reg_range(0x0500, 0x0519),
  428. regmap_reg_range(0x0520, 0x054b),
  429. regmap_reg_range(0x0550, 0x05b3),
  430. /* port 1 */
  431. regmap_reg_range(0x1000, 0x1001),
  432. regmap_reg_range(0x1004, 0x100b),
  433. regmap_reg_range(0x1013, 0x1013),
  434. regmap_reg_range(0x1017, 0x1017),
  435. regmap_reg_range(0x101b, 0x101b),
  436. regmap_reg_range(0x101f, 0x1021),
  437. regmap_reg_range(0x1030, 0x1030),
  438. regmap_reg_range(0x1100, 0x1111),
  439. regmap_reg_range(0x111a, 0x111d),
  440. regmap_reg_range(0x1122, 0x1127),
  441. regmap_reg_range(0x112a, 0x112b),
  442. regmap_reg_range(0x1136, 0x1139),
  443. regmap_reg_range(0x113e, 0x113f),
  444. regmap_reg_range(0x1400, 0x1401),
  445. regmap_reg_range(0x1403, 0x1403),
  446. regmap_reg_range(0x1410, 0x1417),
  447. regmap_reg_range(0x1420, 0x1423),
  448. regmap_reg_range(0x1500, 0x1507),
  449. regmap_reg_range(0x1600, 0x1612),
  450. regmap_reg_range(0x1800, 0x180f),
  451. regmap_reg_range(0x1900, 0x1907),
  452. regmap_reg_range(0x1914, 0x191b),
  453. regmap_reg_range(0x1a00, 0x1a03),
  454. regmap_reg_range(0x1a04, 0x1a08),
  455. regmap_reg_range(0x1b00, 0x1b01),
  456. regmap_reg_range(0x1b04, 0x1b04),
  457. regmap_reg_range(0x1c00, 0x1c05),
  458. regmap_reg_range(0x1c08, 0x1c1b),
  459. /* port 2 */
  460. regmap_reg_range(0x2000, 0x2001),
  461. regmap_reg_range(0x2004, 0x200b),
  462. regmap_reg_range(0x2013, 0x2013),
  463. regmap_reg_range(0x2017, 0x2017),
  464. regmap_reg_range(0x201b, 0x201b),
  465. regmap_reg_range(0x201f, 0x2021),
  466. regmap_reg_range(0x2030, 0x2030),
  467. regmap_reg_range(0x2100, 0x2111),
  468. regmap_reg_range(0x211a, 0x211d),
  469. regmap_reg_range(0x2122, 0x2127),
  470. regmap_reg_range(0x212a, 0x212b),
  471. regmap_reg_range(0x2136, 0x2139),
  472. regmap_reg_range(0x213e, 0x213f),
  473. regmap_reg_range(0x2400, 0x2401),
  474. regmap_reg_range(0x2403, 0x2403),
  475. regmap_reg_range(0x2410, 0x2417),
  476. regmap_reg_range(0x2420, 0x2423),
  477. regmap_reg_range(0x2500, 0x2507),
  478. regmap_reg_range(0x2600, 0x2612),
  479. regmap_reg_range(0x2800, 0x280f),
  480. regmap_reg_range(0x2900, 0x2907),
  481. regmap_reg_range(0x2914, 0x291b),
  482. regmap_reg_range(0x2a00, 0x2a03),
  483. regmap_reg_range(0x2a04, 0x2a08),
  484. regmap_reg_range(0x2b00, 0x2b01),
  485. regmap_reg_range(0x2b04, 0x2b04),
  486. regmap_reg_range(0x2c00, 0x2c05),
  487. regmap_reg_range(0x2c08, 0x2c1b),
  488. /* port 3 */
  489. regmap_reg_range(0x3000, 0x3001),
  490. regmap_reg_range(0x3004, 0x300b),
  491. regmap_reg_range(0x3013, 0x3013),
  492. regmap_reg_range(0x3017, 0x3017),
  493. regmap_reg_range(0x301b, 0x301b),
  494. regmap_reg_range(0x301f, 0x3021),
  495. regmap_reg_range(0x3030, 0x3030),
  496. regmap_reg_range(0x3300, 0x3301),
  497. regmap_reg_range(0x3303, 0x3303),
  498. regmap_reg_range(0x3400, 0x3401),
  499. regmap_reg_range(0x3403, 0x3403),
  500. regmap_reg_range(0x3410, 0x3417),
  501. regmap_reg_range(0x3420, 0x3423),
  502. regmap_reg_range(0x3500, 0x3507),
  503. regmap_reg_range(0x3600, 0x3612),
  504. regmap_reg_range(0x3800, 0x380f),
  505. regmap_reg_range(0x3900, 0x3907),
  506. regmap_reg_range(0x3914, 0x391b),
  507. regmap_reg_range(0x3a00, 0x3a03),
  508. regmap_reg_range(0x3a04, 0x3a08),
  509. regmap_reg_range(0x3b00, 0x3b01),
  510. regmap_reg_range(0x3b04, 0x3b04),
  511. regmap_reg_range(0x3c00, 0x3c05),
  512. regmap_reg_range(0x3c08, 0x3c1b),
  513. };
  514. static const struct regmap_access_table ksz8563_register_set = {
  515. .yes_ranges = ksz8563_valid_regs,
  516. .n_yes_ranges = ARRAY_SIZE(ksz8563_valid_regs),
  517. };
  518. static const struct regmap_range ksz9477_valid_regs[] = {
  519. regmap_reg_range(0x0000, 0x0003),
  520. regmap_reg_range(0x0006, 0x0006),
  521. regmap_reg_range(0x0010, 0x001f),
  522. regmap_reg_range(0x0100, 0x0100),
  523. regmap_reg_range(0x0103, 0x0107),
  524. regmap_reg_range(0x010d, 0x010d),
  525. regmap_reg_range(0x0110, 0x0113),
  526. regmap_reg_range(0x0120, 0x012b),
  527. regmap_reg_range(0x0201, 0x0201),
  528. regmap_reg_range(0x0210, 0x0213),
  529. regmap_reg_range(0x0300, 0x0300),
  530. regmap_reg_range(0x0302, 0x031b),
  531. regmap_reg_range(0x0320, 0x032b),
  532. regmap_reg_range(0x0330, 0x0336),
  533. regmap_reg_range(0x0338, 0x033b),
  534. regmap_reg_range(0x033e, 0x033e),
  535. regmap_reg_range(0x0340, 0x035f),
  536. regmap_reg_range(0x0370, 0x0370),
  537. regmap_reg_range(0x0378, 0x0378),
  538. regmap_reg_range(0x037c, 0x037d),
  539. regmap_reg_range(0x0390, 0x0393),
  540. regmap_reg_range(0x0400, 0x040e),
  541. regmap_reg_range(0x0410, 0x042f),
  542. regmap_reg_range(0x0444, 0x044b),
  543. regmap_reg_range(0x0450, 0x046f),
  544. regmap_reg_range(0x0500, 0x0519),
  545. regmap_reg_range(0x0520, 0x054b),
  546. regmap_reg_range(0x0550, 0x05b3),
  547. regmap_reg_range(0x0604, 0x060b),
  548. regmap_reg_range(0x0610, 0x0612),
  549. regmap_reg_range(0x0614, 0x062c),
  550. regmap_reg_range(0x0640, 0x0645),
  551. regmap_reg_range(0x0648, 0x064d),
  552. /* port 1 */
  553. regmap_reg_range(0x1000, 0x1001),
  554. regmap_reg_range(0x1013, 0x1013),
  555. regmap_reg_range(0x1017, 0x1017),
  556. regmap_reg_range(0x101b, 0x101b),
  557. regmap_reg_range(0x101f, 0x1020),
  558. regmap_reg_range(0x1030, 0x1030),
  559. regmap_reg_range(0x1100, 0x1115),
  560. regmap_reg_range(0x111a, 0x111f),
  561. regmap_reg_range(0x1120, 0x112b),
  562. regmap_reg_range(0x1134, 0x113b),
  563. regmap_reg_range(0x113c, 0x113f),
  564. regmap_reg_range(0x1400, 0x1401),
  565. regmap_reg_range(0x1403, 0x1403),
  566. regmap_reg_range(0x1410, 0x1417),
  567. regmap_reg_range(0x1420, 0x1423),
  568. regmap_reg_range(0x1500, 0x1507),
  569. regmap_reg_range(0x1600, 0x1613),
  570. regmap_reg_range(0x1800, 0x180f),
  571. regmap_reg_range(0x1820, 0x1827),
  572. regmap_reg_range(0x1830, 0x1837),
  573. regmap_reg_range(0x1840, 0x184b),
  574. regmap_reg_range(0x1900, 0x1907),
  575. regmap_reg_range(0x1914, 0x191b),
  576. regmap_reg_range(0x1920, 0x1920),
  577. regmap_reg_range(0x1923, 0x1927),
  578. regmap_reg_range(0x1a00, 0x1a03),
  579. regmap_reg_range(0x1a04, 0x1a07),
  580. regmap_reg_range(0x1b00, 0x1b01),
  581. regmap_reg_range(0x1b04, 0x1b04),
  582. regmap_reg_range(0x1c00, 0x1c05),
  583. regmap_reg_range(0x1c08, 0x1c1b),
  584. /* port 2 */
  585. regmap_reg_range(0x2000, 0x2001),
  586. regmap_reg_range(0x2013, 0x2013),
  587. regmap_reg_range(0x2017, 0x2017),
  588. regmap_reg_range(0x201b, 0x201b),
  589. regmap_reg_range(0x201f, 0x2020),
  590. regmap_reg_range(0x2030, 0x2030),
  591. regmap_reg_range(0x2100, 0x2115),
  592. regmap_reg_range(0x211a, 0x211f),
  593. regmap_reg_range(0x2120, 0x212b),
  594. regmap_reg_range(0x2134, 0x213b),
  595. regmap_reg_range(0x213c, 0x213f),
  596. regmap_reg_range(0x2400, 0x2401),
  597. regmap_reg_range(0x2403, 0x2403),
  598. regmap_reg_range(0x2410, 0x2417),
  599. regmap_reg_range(0x2420, 0x2423),
  600. regmap_reg_range(0x2500, 0x2507),
  601. regmap_reg_range(0x2600, 0x2613),
  602. regmap_reg_range(0x2800, 0x280f),
  603. regmap_reg_range(0x2820, 0x2827),
  604. regmap_reg_range(0x2830, 0x2837),
  605. regmap_reg_range(0x2840, 0x284b),
  606. regmap_reg_range(0x2900, 0x2907),
  607. regmap_reg_range(0x2914, 0x291b),
  608. regmap_reg_range(0x2920, 0x2920),
  609. regmap_reg_range(0x2923, 0x2927),
  610. regmap_reg_range(0x2a00, 0x2a03),
  611. regmap_reg_range(0x2a04, 0x2a07),
  612. regmap_reg_range(0x2b00, 0x2b01),
  613. regmap_reg_range(0x2b04, 0x2b04),
  614. regmap_reg_range(0x2c00, 0x2c05),
  615. regmap_reg_range(0x2c08, 0x2c1b),
  616. /* port 3 */
  617. regmap_reg_range(0x3000, 0x3001),
  618. regmap_reg_range(0x3013, 0x3013),
  619. regmap_reg_range(0x3017, 0x3017),
  620. regmap_reg_range(0x301b, 0x301b),
  621. regmap_reg_range(0x301f, 0x3020),
  622. regmap_reg_range(0x3030, 0x3030),
  623. regmap_reg_range(0x3100, 0x3115),
  624. regmap_reg_range(0x311a, 0x311f),
  625. regmap_reg_range(0x3120, 0x312b),
  626. regmap_reg_range(0x3134, 0x313b),
  627. regmap_reg_range(0x313c, 0x313f),
  628. regmap_reg_range(0x3400, 0x3401),
  629. regmap_reg_range(0x3403, 0x3403),
  630. regmap_reg_range(0x3410, 0x3417),
  631. regmap_reg_range(0x3420, 0x3423),
  632. regmap_reg_range(0x3500, 0x3507),
  633. regmap_reg_range(0x3600, 0x3613),
  634. regmap_reg_range(0x3800, 0x380f),
  635. regmap_reg_range(0x3820, 0x3827),
  636. regmap_reg_range(0x3830, 0x3837),
  637. regmap_reg_range(0x3840, 0x384b),
  638. regmap_reg_range(0x3900, 0x3907),
  639. regmap_reg_range(0x3914, 0x391b),
  640. regmap_reg_range(0x3920, 0x3920),
  641. regmap_reg_range(0x3923, 0x3927),
  642. regmap_reg_range(0x3a00, 0x3a03),
  643. regmap_reg_range(0x3a04, 0x3a07),
  644. regmap_reg_range(0x3b00, 0x3b01),
  645. regmap_reg_range(0x3b04, 0x3b04),
  646. regmap_reg_range(0x3c00, 0x3c05),
  647. regmap_reg_range(0x3c08, 0x3c1b),
  648. /* port 4 */
  649. regmap_reg_range(0x4000, 0x4001),
  650. regmap_reg_range(0x4013, 0x4013),
  651. regmap_reg_range(0x4017, 0x4017),
  652. regmap_reg_range(0x401b, 0x401b),
  653. regmap_reg_range(0x401f, 0x4020),
  654. regmap_reg_range(0x4030, 0x4030),
  655. regmap_reg_range(0x4100, 0x4115),
  656. regmap_reg_range(0x411a, 0x411f),
  657. regmap_reg_range(0x4120, 0x412b),
  658. regmap_reg_range(0x4134, 0x413b),
  659. regmap_reg_range(0x413c, 0x413f),
  660. regmap_reg_range(0x4400, 0x4401),
  661. regmap_reg_range(0x4403, 0x4403),
  662. regmap_reg_range(0x4410, 0x4417),
  663. regmap_reg_range(0x4420, 0x4423),
  664. regmap_reg_range(0x4500, 0x4507),
  665. regmap_reg_range(0x4600, 0x4613),
  666. regmap_reg_range(0x4800, 0x480f),
  667. regmap_reg_range(0x4820, 0x4827),
  668. regmap_reg_range(0x4830, 0x4837),
  669. regmap_reg_range(0x4840, 0x484b),
  670. regmap_reg_range(0x4900, 0x4907),
  671. regmap_reg_range(0x4914, 0x491b),
  672. regmap_reg_range(0x4920, 0x4920),
  673. regmap_reg_range(0x4923, 0x4927),
  674. regmap_reg_range(0x4a00, 0x4a03),
  675. regmap_reg_range(0x4a04, 0x4a07),
  676. regmap_reg_range(0x4b00, 0x4b01),
  677. regmap_reg_range(0x4b04, 0x4b04),
  678. regmap_reg_range(0x4c00, 0x4c05),
  679. regmap_reg_range(0x4c08, 0x4c1b),
  680. /* port 5 */
  681. regmap_reg_range(0x5000, 0x5001),
  682. regmap_reg_range(0x5013, 0x5013),
  683. regmap_reg_range(0x5017, 0x5017),
  684. regmap_reg_range(0x501b, 0x501b),
  685. regmap_reg_range(0x501f, 0x5020),
  686. regmap_reg_range(0x5030, 0x5030),
  687. regmap_reg_range(0x5100, 0x5115),
  688. regmap_reg_range(0x511a, 0x511f),
  689. regmap_reg_range(0x5120, 0x512b),
  690. regmap_reg_range(0x5134, 0x513b),
  691. regmap_reg_range(0x513c, 0x513f),
  692. regmap_reg_range(0x5400, 0x5401),
  693. regmap_reg_range(0x5403, 0x5403),
  694. regmap_reg_range(0x5410, 0x5417),
  695. regmap_reg_range(0x5420, 0x5423),
  696. regmap_reg_range(0x5500, 0x5507),
  697. regmap_reg_range(0x5600, 0x5613),
  698. regmap_reg_range(0x5800, 0x580f),
  699. regmap_reg_range(0x5820, 0x5827),
  700. regmap_reg_range(0x5830, 0x5837),
  701. regmap_reg_range(0x5840, 0x584b),
  702. regmap_reg_range(0x5900, 0x5907),
  703. regmap_reg_range(0x5914, 0x591b),
  704. regmap_reg_range(0x5920, 0x5920),
  705. regmap_reg_range(0x5923, 0x5927),
  706. regmap_reg_range(0x5a00, 0x5a03),
  707. regmap_reg_range(0x5a04, 0x5a07),
  708. regmap_reg_range(0x5b00, 0x5b01),
  709. regmap_reg_range(0x5b04, 0x5b04),
  710. regmap_reg_range(0x5c00, 0x5c05),
  711. regmap_reg_range(0x5c08, 0x5c1b),
  712. /* port 6 */
  713. regmap_reg_range(0x6000, 0x6001),
  714. regmap_reg_range(0x6013, 0x6013),
  715. regmap_reg_range(0x6017, 0x6017),
  716. regmap_reg_range(0x601b, 0x601b),
  717. regmap_reg_range(0x601f, 0x6020),
  718. regmap_reg_range(0x6030, 0x6030),
  719. regmap_reg_range(0x6300, 0x6301),
  720. regmap_reg_range(0x6400, 0x6401),
  721. regmap_reg_range(0x6403, 0x6403),
  722. regmap_reg_range(0x6410, 0x6417),
  723. regmap_reg_range(0x6420, 0x6423),
  724. regmap_reg_range(0x6500, 0x6507),
  725. regmap_reg_range(0x6600, 0x6613),
  726. regmap_reg_range(0x6800, 0x680f),
  727. regmap_reg_range(0x6820, 0x6827),
  728. regmap_reg_range(0x6830, 0x6837),
  729. regmap_reg_range(0x6840, 0x684b),
  730. regmap_reg_range(0x6900, 0x6907),
  731. regmap_reg_range(0x6914, 0x691b),
  732. regmap_reg_range(0x6920, 0x6920),
  733. regmap_reg_range(0x6923, 0x6927),
  734. regmap_reg_range(0x6a00, 0x6a03),
  735. regmap_reg_range(0x6a04, 0x6a07),
  736. regmap_reg_range(0x6b00, 0x6b01),
  737. regmap_reg_range(0x6b04, 0x6b04),
  738. regmap_reg_range(0x6c00, 0x6c05),
  739. regmap_reg_range(0x6c08, 0x6c1b),
  740. /* port 7 */
  741. regmap_reg_range(0x7000, 0x7001),
  742. regmap_reg_range(0x7013, 0x7013),
  743. regmap_reg_range(0x7017, 0x7017),
  744. regmap_reg_range(0x701b, 0x701b),
  745. regmap_reg_range(0x701f, 0x7020),
  746. regmap_reg_range(0x7030, 0x7030),
  747. regmap_reg_range(0x7200, 0x7203),
  748. regmap_reg_range(0x7206, 0x7207),
  749. regmap_reg_range(0x7300, 0x7301),
  750. regmap_reg_range(0x7400, 0x7401),
  751. regmap_reg_range(0x7403, 0x7403),
  752. regmap_reg_range(0x7410, 0x7417),
  753. regmap_reg_range(0x7420, 0x7423),
  754. regmap_reg_range(0x7500, 0x7507),
  755. regmap_reg_range(0x7600, 0x7613),
  756. regmap_reg_range(0x7800, 0x780f),
  757. regmap_reg_range(0x7820, 0x7827),
  758. regmap_reg_range(0x7830, 0x7837),
  759. regmap_reg_range(0x7840, 0x784b),
  760. regmap_reg_range(0x7900, 0x7907),
  761. regmap_reg_range(0x7914, 0x791b),
  762. regmap_reg_range(0x7920, 0x7920),
  763. regmap_reg_range(0x7923, 0x7927),
  764. regmap_reg_range(0x7a00, 0x7a03),
  765. regmap_reg_range(0x7a04, 0x7a07),
  766. regmap_reg_range(0x7b00, 0x7b01),
  767. regmap_reg_range(0x7b04, 0x7b04),
  768. regmap_reg_range(0x7c00, 0x7c05),
  769. regmap_reg_range(0x7c08, 0x7c1b),
  770. };
  771. static const struct regmap_access_table ksz9477_register_set = {
  772. .yes_ranges = ksz9477_valid_regs,
  773. .n_yes_ranges = ARRAY_SIZE(ksz9477_valid_regs),
  774. };
  775. static const struct regmap_range ksz9896_valid_regs[] = {
  776. regmap_reg_range(0x0000, 0x0003),
  777. regmap_reg_range(0x0006, 0x0006),
  778. regmap_reg_range(0x0010, 0x001f),
  779. regmap_reg_range(0x0100, 0x0100),
  780. regmap_reg_range(0x0103, 0x0107),
  781. regmap_reg_range(0x010d, 0x010d),
  782. regmap_reg_range(0x0110, 0x0113),
  783. regmap_reg_range(0x0120, 0x0127),
  784. regmap_reg_range(0x0201, 0x0201),
  785. regmap_reg_range(0x0210, 0x0213),
  786. regmap_reg_range(0x0300, 0x0300),
  787. regmap_reg_range(0x0302, 0x030b),
  788. regmap_reg_range(0x0310, 0x031b),
  789. regmap_reg_range(0x0320, 0x032b),
  790. regmap_reg_range(0x0330, 0x0336),
  791. regmap_reg_range(0x0338, 0x033b),
  792. regmap_reg_range(0x033e, 0x033e),
  793. regmap_reg_range(0x0340, 0x035f),
  794. regmap_reg_range(0x0370, 0x0370),
  795. regmap_reg_range(0x0378, 0x0378),
  796. regmap_reg_range(0x037c, 0x037d),
  797. regmap_reg_range(0x0390, 0x0393),
  798. regmap_reg_range(0x0400, 0x040e),
  799. regmap_reg_range(0x0410, 0x042f),
  800. /* port 1 */
  801. regmap_reg_range(0x1000, 0x1001),
  802. regmap_reg_range(0x1013, 0x1013),
  803. regmap_reg_range(0x1017, 0x1017),
  804. regmap_reg_range(0x101b, 0x101b),
  805. regmap_reg_range(0x101f, 0x1020),
  806. regmap_reg_range(0x1030, 0x1030),
  807. regmap_reg_range(0x1100, 0x1115),
  808. regmap_reg_range(0x111a, 0x111f),
  809. regmap_reg_range(0x1122, 0x1127),
  810. regmap_reg_range(0x112a, 0x112b),
  811. regmap_reg_range(0x1136, 0x1139),
  812. regmap_reg_range(0x113e, 0x113f),
  813. regmap_reg_range(0x1400, 0x1401),
  814. regmap_reg_range(0x1403, 0x1403),
  815. regmap_reg_range(0x1410, 0x1417),
  816. regmap_reg_range(0x1420, 0x1423),
  817. regmap_reg_range(0x1500, 0x1507),
  818. regmap_reg_range(0x1600, 0x1612),
  819. regmap_reg_range(0x1800, 0x180f),
  820. regmap_reg_range(0x1820, 0x1827),
  821. regmap_reg_range(0x1830, 0x1837),
  822. regmap_reg_range(0x1840, 0x184b),
  823. regmap_reg_range(0x1900, 0x1907),
  824. regmap_reg_range(0x1914, 0x1915),
  825. regmap_reg_range(0x1a00, 0x1a03),
  826. regmap_reg_range(0x1a04, 0x1a07),
  827. regmap_reg_range(0x1b00, 0x1b01),
  828. regmap_reg_range(0x1b04, 0x1b04),
  829. /* port 2 */
  830. regmap_reg_range(0x2000, 0x2001),
  831. regmap_reg_range(0x2013, 0x2013),
  832. regmap_reg_range(0x2017, 0x2017),
  833. regmap_reg_range(0x201b, 0x201b),
  834. regmap_reg_range(0x201f, 0x2020),
  835. regmap_reg_range(0x2030, 0x2030),
  836. regmap_reg_range(0x2100, 0x2115),
  837. regmap_reg_range(0x211a, 0x211f),
  838. regmap_reg_range(0x2122, 0x2127),
  839. regmap_reg_range(0x212a, 0x212b),
  840. regmap_reg_range(0x2136, 0x2139),
  841. regmap_reg_range(0x213e, 0x213f),
  842. regmap_reg_range(0x2400, 0x2401),
  843. regmap_reg_range(0x2403, 0x2403),
  844. regmap_reg_range(0x2410, 0x2417),
  845. regmap_reg_range(0x2420, 0x2423),
  846. regmap_reg_range(0x2500, 0x2507),
  847. regmap_reg_range(0x2600, 0x2612),
  848. regmap_reg_range(0x2800, 0x280f),
  849. regmap_reg_range(0x2820, 0x2827),
  850. regmap_reg_range(0x2830, 0x2837),
  851. regmap_reg_range(0x2840, 0x284b),
  852. regmap_reg_range(0x2900, 0x2907),
  853. regmap_reg_range(0x2914, 0x2915),
  854. regmap_reg_range(0x2a00, 0x2a03),
  855. regmap_reg_range(0x2a04, 0x2a07),
  856. regmap_reg_range(0x2b00, 0x2b01),
  857. regmap_reg_range(0x2b04, 0x2b04),
  858. /* port 3 */
  859. regmap_reg_range(0x3000, 0x3001),
  860. regmap_reg_range(0x3013, 0x3013),
  861. regmap_reg_range(0x3017, 0x3017),
  862. regmap_reg_range(0x301b, 0x301b),
  863. regmap_reg_range(0x301f, 0x3020),
  864. regmap_reg_range(0x3030, 0x3030),
  865. regmap_reg_range(0x3100, 0x3115),
  866. regmap_reg_range(0x311a, 0x311f),
  867. regmap_reg_range(0x3122, 0x3127),
  868. regmap_reg_range(0x312a, 0x312b),
  869. regmap_reg_range(0x3136, 0x3139),
  870. regmap_reg_range(0x313e, 0x313f),
  871. regmap_reg_range(0x3400, 0x3401),
  872. regmap_reg_range(0x3403, 0x3403),
  873. regmap_reg_range(0x3410, 0x3417),
  874. regmap_reg_range(0x3420, 0x3423),
  875. regmap_reg_range(0x3500, 0x3507),
  876. regmap_reg_range(0x3600, 0x3612),
  877. regmap_reg_range(0x3800, 0x380f),
  878. regmap_reg_range(0x3820, 0x3827),
  879. regmap_reg_range(0x3830, 0x3837),
  880. regmap_reg_range(0x3840, 0x384b),
  881. regmap_reg_range(0x3900, 0x3907),
  882. regmap_reg_range(0x3914, 0x3915),
  883. regmap_reg_range(0x3a00, 0x3a03),
  884. regmap_reg_range(0x3a04, 0x3a07),
  885. regmap_reg_range(0x3b00, 0x3b01),
  886. regmap_reg_range(0x3b04, 0x3b04),
  887. /* port 4 */
  888. regmap_reg_range(0x4000, 0x4001),
  889. regmap_reg_range(0x4013, 0x4013),
  890. regmap_reg_range(0x4017, 0x4017),
  891. regmap_reg_range(0x401b, 0x401b),
  892. regmap_reg_range(0x401f, 0x4020),
  893. regmap_reg_range(0x4030, 0x4030),
  894. regmap_reg_range(0x4100, 0x4115),
  895. regmap_reg_range(0x411a, 0x411f),
  896. regmap_reg_range(0x4122, 0x4127),
  897. regmap_reg_range(0x412a, 0x412b),
  898. regmap_reg_range(0x4136, 0x4139),
  899. regmap_reg_range(0x413e, 0x413f),
  900. regmap_reg_range(0x4400, 0x4401),
  901. regmap_reg_range(0x4403, 0x4403),
  902. regmap_reg_range(0x4410, 0x4417),
  903. regmap_reg_range(0x4420, 0x4423),
  904. regmap_reg_range(0x4500, 0x4507),
  905. regmap_reg_range(0x4600, 0x4612),
  906. regmap_reg_range(0x4800, 0x480f),
  907. regmap_reg_range(0x4820, 0x4827),
  908. regmap_reg_range(0x4830, 0x4837),
  909. regmap_reg_range(0x4840, 0x484b),
  910. regmap_reg_range(0x4900, 0x4907),
  911. regmap_reg_range(0x4914, 0x4915),
  912. regmap_reg_range(0x4a00, 0x4a03),
  913. regmap_reg_range(0x4a04, 0x4a07),
  914. regmap_reg_range(0x4b00, 0x4b01),
  915. regmap_reg_range(0x4b04, 0x4b04),
  916. /* port 5 */
  917. regmap_reg_range(0x5000, 0x5001),
  918. regmap_reg_range(0x5013, 0x5013),
  919. regmap_reg_range(0x5017, 0x5017),
  920. regmap_reg_range(0x501b, 0x501b),
  921. regmap_reg_range(0x501f, 0x5020),
  922. regmap_reg_range(0x5030, 0x5030),
  923. regmap_reg_range(0x5100, 0x5115),
  924. regmap_reg_range(0x511a, 0x511f),
  925. regmap_reg_range(0x5122, 0x5127),
  926. regmap_reg_range(0x512a, 0x512b),
  927. regmap_reg_range(0x5136, 0x5139),
  928. regmap_reg_range(0x513e, 0x513f),
  929. regmap_reg_range(0x5400, 0x5401),
  930. regmap_reg_range(0x5403, 0x5403),
  931. regmap_reg_range(0x5410, 0x5417),
  932. regmap_reg_range(0x5420, 0x5423),
  933. regmap_reg_range(0x5500, 0x5507),
  934. regmap_reg_range(0x5600, 0x5612),
  935. regmap_reg_range(0x5800, 0x580f),
  936. regmap_reg_range(0x5820, 0x5827),
  937. regmap_reg_range(0x5830, 0x5837),
  938. regmap_reg_range(0x5840, 0x584b),
  939. regmap_reg_range(0x5900, 0x5907),
  940. regmap_reg_range(0x5914, 0x5915),
  941. regmap_reg_range(0x5a00, 0x5a03),
  942. regmap_reg_range(0x5a04, 0x5a07),
  943. regmap_reg_range(0x5b00, 0x5b01),
  944. regmap_reg_range(0x5b04, 0x5b04),
  945. /* port 6 */
  946. regmap_reg_range(0x6000, 0x6001),
  947. regmap_reg_range(0x6013, 0x6013),
  948. regmap_reg_range(0x6017, 0x6017),
  949. regmap_reg_range(0x601b, 0x601b),
  950. regmap_reg_range(0x601f, 0x6020),
  951. regmap_reg_range(0x6030, 0x6030),
  952. regmap_reg_range(0x6100, 0x6115),
  953. regmap_reg_range(0x611a, 0x611f),
  954. regmap_reg_range(0x6122, 0x6127),
  955. regmap_reg_range(0x612a, 0x612b),
  956. regmap_reg_range(0x6136, 0x6139),
  957. regmap_reg_range(0x613e, 0x613f),
  958. regmap_reg_range(0x6300, 0x6301),
  959. regmap_reg_range(0x6400, 0x6401),
  960. regmap_reg_range(0x6403, 0x6403),
  961. regmap_reg_range(0x6410, 0x6417),
  962. regmap_reg_range(0x6420, 0x6423),
  963. regmap_reg_range(0x6500, 0x6507),
  964. regmap_reg_range(0x6600, 0x6612),
  965. regmap_reg_range(0x6800, 0x680f),
  966. regmap_reg_range(0x6820, 0x6827),
  967. regmap_reg_range(0x6830, 0x6837),
  968. regmap_reg_range(0x6840, 0x684b),
  969. regmap_reg_range(0x6900, 0x6907),
  970. regmap_reg_range(0x6914, 0x6915),
  971. regmap_reg_range(0x6a00, 0x6a03),
  972. regmap_reg_range(0x6a04, 0x6a07),
  973. regmap_reg_range(0x6b00, 0x6b01),
  974. regmap_reg_range(0x6b04, 0x6b04),
  975. };
  976. static const struct regmap_access_table ksz9896_register_set = {
  977. .yes_ranges = ksz9896_valid_regs,
  978. .n_yes_ranges = ARRAY_SIZE(ksz9896_valid_regs),
  979. };
  980. const struct ksz_chip_data ksz_switch_chips[] = {
  981. [KSZ8563] = {
  982. .chip_id = KSZ8563_CHIP_ID,
  983. .dev_name = "KSZ8563",
  984. .num_vlans = 4096,
  985. .num_alus = 4096,
  986. .num_statics = 16,
  987. .cpu_ports = 0x07, /* can be configured as cpu port */
  988. .port_cnt = 3, /* total port count */
  989. .ops = &ksz9477_dev_ops,
  990. .mib_names = ksz9477_mib_names,
  991. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  992. .reg_mib_cnt = MIB_COUNTER_NUM,
  993. .regs = ksz9477_regs,
  994. .masks = ksz9477_masks,
  995. .shifts = ksz9477_shifts,
  996. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  997. .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
  998. .supports_mii = {false, false, true},
  999. .supports_rmii = {false, false, true},
  1000. .supports_rgmii = {false, false, true},
  1001. .internal_phy = {true, true, false},
  1002. .gbit_capable = {false, false, true},
  1003. .wr_table = &ksz8563_register_set,
  1004. .rd_table = &ksz8563_register_set,
  1005. },
  1006. [KSZ8795] = {
  1007. .chip_id = KSZ8795_CHIP_ID,
  1008. .dev_name = "KSZ8795",
  1009. .num_vlans = 4096,
  1010. .num_alus = 0,
  1011. .num_statics = 8,
  1012. .cpu_ports = 0x10, /* can be configured as cpu port */
  1013. .port_cnt = 5, /* total cpu and user ports */
  1014. .ops = &ksz8_dev_ops,
  1015. .ksz87xx_eee_link_erratum = true,
  1016. .mib_names = ksz9477_mib_names,
  1017. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1018. .reg_mib_cnt = MIB_COUNTER_NUM,
  1019. .regs = ksz8795_regs,
  1020. .masks = ksz8795_masks,
  1021. .shifts = ksz8795_shifts,
  1022. .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  1023. .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  1024. .supports_mii = {false, false, false, false, true},
  1025. .supports_rmii = {false, false, false, false, true},
  1026. .supports_rgmii = {false, false, false, false, true},
  1027. .internal_phy = {true, true, true, true, false},
  1028. },
  1029. [KSZ8794] = {
  1030. /* WARNING
  1031. * =======
  1032. * KSZ8794 is similar to KSZ8795, except the port map
  1033. * contains a gap between external and CPU ports, the
  1034. * port map is NOT continuous. The per-port register
  1035. * map is shifted accordingly too, i.e. registers at
  1036. * offset 0x40 are NOT used on KSZ8794 and they ARE
  1037. * used on KSZ8795 for external port 3.
  1038. * external cpu
  1039. * KSZ8794 0,1,2 4
  1040. * KSZ8795 0,1,2,3 4
  1041. * KSZ8765 0,1,2,3 4
  1042. * port_cnt is configured as 5, even though it is 4
  1043. */
  1044. .chip_id = KSZ8794_CHIP_ID,
  1045. .dev_name = "KSZ8794",
  1046. .num_vlans = 4096,
  1047. .num_alus = 0,
  1048. .num_statics = 8,
  1049. .cpu_ports = 0x10, /* can be configured as cpu port */
  1050. .port_cnt = 5, /* total cpu and user ports */
  1051. .ops = &ksz8_dev_ops,
  1052. .ksz87xx_eee_link_erratum = true,
  1053. .mib_names = ksz9477_mib_names,
  1054. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1055. .reg_mib_cnt = MIB_COUNTER_NUM,
  1056. .regs = ksz8795_regs,
  1057. .masks = ksz8795_masks,
  1058. .shifts = ksz8795_shifts,
  1059. .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  1060. .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  1061. .supports_mii = {false, false, false, false, true},
  1062. .supports_rmii = {false, false, false, false, true},
  1063. .supports_rgmii = {false, false, false, false, true},
  1064. .internal_phy = {true, true, true, false, false},
  1065. },
  1066. [KSZ8765] = {
  1067. .chip_id = KSZ8765_CHIP_ID,
  1068. .dev_name = "KSZ8765",
  1069. .num_vlans = 4096,
  1070. .num_alus = 0,
  1071. .num_statics = 8,
  1072. .cpu_ports = 0x10, /* can be configured as cpu port */
  1073. .port_cnt = 5, /* total cpu and user ports */
  1074. .ops = &ksz8_dev_ops,
  1075. .ksz87xx_eee_link_erratum = true,
  1076. .mib_names = ksz9477_mib_names,
  1077. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1078. .reg_mib_cnt = MIB_COUNTER_NUM,
  1079. .regs = ksz8795_regs,
  1080. .masks = ksz8795_masks,
  1081. .shifts = ksz8795_shifts,
  1082. .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  1083. .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  1084. .supports_mii = {false, false, false, false, true},
  1085. .supports_rmii = {false, false, false, false, true},
  1086. .supports_rgmii = {false, false, false, false, true},
  1087. .internal_phy = {true, true, true, true, false},
  1088. },
  1089. [KSZ8830] = {
  1090. .chip_id = KSZ8830_CHIP_ID,
  1091. .dev_name = "KSZ8863/KSZ8873",
  1092. .num_vlans = 16,
  1093. .num_alus = 0,
  1094. .num_statics = 8,
  1095. .cpu_ports = 0x4, /* can be configured as cpu port */
  1096. .port_cnt = 3,
  1097. .ops = &ksz8_dev_ops,
  1098. .mib_names = ksz88xx_mib_names,
  1099. .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
  1100. .reg_mib_cnt = MIB_COUNTER_NUM,
  1101. .regs = ksz8863_regs,
  1102. .masks = ksz8863_masks,
  1103. .shifts = ksz8863_shifts,
  1104. .supports_mii = {false, false, true},
  1105. .supports_rmii = {false, false, true},
  1106. .internal_phy = {true, true, false},
  1107. },
  1108. [KSZ9477] = {
  1109. .chip_id = KSZ9477_CHIP_ID,
  1110. .dev_name = "KSZ9477",
  1111. .num_vlans = 4096,
  1112. .num_alus = 4096,
  1113. .num_statics = 16,
  1114. .cpu_ports = 0x7F, /* can be configured as cpu port */
  1115. .port_cnt = 7, /* total physical port count */
  1116. .port_nirqs = 4,
  1117. .ops = &ksz9477_dev_ops,
  1118. .phy_errata_9477 = true,
  1119. .mib_names = ksz9477_mib_names,
  1120. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1121. .reg_mib_cnt = MIB_COUNTER_NUM,
  1122. .regs = ksz9477_regs,
  1123. .masks = ksz9477_masks,
  1124. .shifts = ksz9477_shifts,
  1125. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1126. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1127. .supports_mii = {false, false, false, false,
  1128. false, true, false},
  1129. .supports_rmii = {false, false, false, false,
  1130. false, true, false},
  1131. .supports_rgmii = {false, false, false, false,
  1132. false, true, false},
  1133. .internal_phy = {true, true, true, true,
  1134. true, false, false},
  1135. .gbit_capable = {true, true, true, true, true, true, true},
  1136. .wr_table = &ksz9477_register_set,
  1137. .rd_table = &ksz9477_register_set,
  1138. },
  1139. [KSZ9896] = {
  1140. .chip_id = KSZ9896_CHIP_ID,
  1141. .dev_name = "KSZ9896",
  1142. .num_vlans = 4096,
  1143. .num_alus = 4096,
  1144. .num_statics = 16,
  1145. .cpu_ports = 0x3F, /* can be configured as cpu port */
  1146. .port_cnt = 6, /* total physical port count */
  1147. .port_nirqs = 2,
  1148. .ops = &ksz9477_dev_ops,
  1149. .phy_errata_9477 = true,
  1150. .mib_names = ksz9477_mib_names,
  1151. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1152. .reg_mib_cnt = MIB_COUNTER_NUM,
  1153. .regs = ksz9477_regs,
  1154. .masks = ksz9477_masks,
  1155. .shifts = ksz9477_shifts,
  1156. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1157. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1158. .supports_mii = {false, false, false, false,
  1159. false, true},
  1160. .supports_rmii = {false, false, false, false,
  1161. false, true},
  1162. .supports_rgmii = {false, false, false, false,
  1163. false, true},
  1164. .internal_phy = {true, true, true, true,
  1165. true, false},
  1166. .gbit_capable = {true, true, true, true, true, true},
  1167. .wr_table = &ksz9896_register_set,
  1168. .rd_table = &ksz9896_register_set,
  1169. },
  1170. [KSZ9897] = {
  1171. .chip_id = KSZ9897_CHIP_ID,
  1172. .dev_name = "KSZ9897",
  1173. .num_vlans = 4096,
  1174. .num_alus = 4096,
  1175. .num_statics = 16,
  1176. .cpu_ports = 0x7F, /* can be configured as cpu port */
  1177. .port_cnt = 7, /* total physical port count */
  1178. .port_nirqs = 2,
  1179. .ops = &ksz9477_dev_ops,
  1180. .phy_errata_9477 = true,
  1181. .mib_names = ksz9477_mib_names,
  1182. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1183. .reg_mib_cnt = MIB_COUNTER_NUM,
  1184. .regs = ksz9477_regs,
  1185. .masks = ksz9477_masks,
  1186. .shifts = ksz9477_shifts,
  1187. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1188. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1189. .supports_mii = {false, false, false, false,
  1190. false, true, true},
  1191. .supports_rmii = {false, false, false, false,
  1192. false, true, true},
  1193. .supports_rgmii = {false, false, false, false,
  1194. false, true, true},
  1195. .internal_phy = {true, true, true, true,
  1196. true, false, false},
  1197. .gbit_capable = {true, true, true, true, true, true, true},
  1198. },
  1199. [KSZ9893] = {
  1200. .chip_id = KSZ9893_CHIP_ID,
  1201. .dev_name = "KSZ9893",
  1202. .num_vlans = 4096,
  1203. .num_alus = 4096,
  1204. .num_statics = 16,
  1205. .cpu_ports = 0x07, /* can be configured as cpu port */
  1206. .port_cnt = 3, /* total port count */
  1207. .port_nirqs = 2,
  1208. .ops = &ksz9477_dev_ops,
  1209. .mib_names = ksz9477_mib_names,
  1210. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1211. .reg_mib_cnt = MIB_COUNTER_NUM,
  1212. .regs = ksz9477_regs,
  1213. .masks = ksz9477_masks,
  1214. .shifts = ksz9477_shifts,
  1215. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1216. .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
  1217. .supports_mii = {false, false, true},
  1218. .supports_rmii = {false, false, true},
  1219. .supports_rgmii = {false, false, true},
  1220. .internal_phy = {true, true, false},
  1221. .gbit_capable = {true, true, true},
  1222. },
  1223. [KSZ9567] = {
  1224. .chip_id = KSZ9567_CHIP_ID,
  1225. .dev_name = "KSZ9567",
  1226. .num_vlans = 4096,
  1227. .num_alus = 4096,
  1228. .num_statics = 16,
  1229. .cpu_ports = 0x7F, /* can be configured as cpu port */
  1230. .port_cnt = 7, /* total physical port count */
  1231. .port_nirqs = 3,
  1232. .ops = &ksz9477_dev_ops,
  1233. .phy_errata_9477 = true,
  1234. .mib_names = ksz9477_mib_names,
  1235. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1236. .reg_mib_cnt = MIB_COUNTER_NUM,
  1237. .regs = ksz9477_regs,
  1238. .masks = ksz9477_masks,
  1239. .shifts = ksz9477_shifts,
  1240. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1241. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1242. .supports_mii = {false, false, false, false,
  1243. false, true, true},
  1244. .supports_rmii = {false, false, false, false,
  1245. false, true, true},
  1246. .supports_rgmii = {false, false, false, false,
  1247. false, true, true},
  1248. .internal_phy = {true, true, true, true,
  1249. true, false, false},
  1250. .gbit_capable = {true, true, true, true, true, true, true},
  1251. },
  1252. [LAN9370] = {
  1253. .chip_id = LAN9370_CHIP_ID,
  1254. .dev_name = "LAN9370",
  1255. .num_vlans = 4096,
  1256. .num_alus = 1024,
  1257. .num_statics = 256,
  1258. .cpu_ports = 0x10, /* can be configured as cpu port */
  1259. .port_cnt = 5, /* total physical port count */
  1260. .port_nirqs = 6,
  1261. .ops = &lan937x_dev_ops,
  1262. .mib_names = ksz9477_mib_names,
  1263. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1264. .reg_mib_cnt = MIB_COUNTER_NUM,
  1265. .regs = ksz9477_regs,
  1266. .masks = lan937x_masks,
  1267. .shifts = lan937x_shifts,
  1268. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1269. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1270. .supports_mii = {false, false, false, false, true},
  1271. .supports_rmii = {false, false, false, false, true},
  1272. .supports_rgmii = {false, false, false, false, true},
  1273. .internal_phy = {true, true, true, true, false},
  1274. },
  1275. [LAN9371] = {
  1276. .chip_id = LAN9371_CHIP_ID,
  1277. .dev_name = "LAN9371",
  1278. .num_vlans = 4096,
  1279. .num_alus = 1024,
  1280. .num_statics = 256,
  1281. .cpu_ports = 0x30, /* can be configured as cpu port */
  1282. .port_cnt = 6, /* total physical port count */
  1283. .port_nirqs = 6,
  1284. .ops = &lan937x_dev_ops,
  1285. .mib_names = ksz9477_mib_names,
  1286. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1287. .reg_mib_cnt = MIB_COUNTER_NUM,
  1288. .regs = ksz9477_regs,
  1289. .masks = lan937x_masks,
  1290. .shifts = lan937x_shifts,
  1291. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1292. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1293. .supports_mii = {false, false, false, false, true, true},
  1294. .supports_rmii = {false, false, false, false, true, true},
  1295. .supports_rgmii = {false, false, false, false, true, true},
  1296. .internal_phy = {true, true, true, true, false, false},
  1297. },
  1298. [LAN9372] = {
  1299. .chip_id = LAN9372_CHIP_ID,
  1300. .dev_name = "LAN9372",
  1301. .num_vlans = 4096,
  1302. .num_alus = 1024,
  1303. .num_statics = 256,
  1304. .cpu_ports = 0x30, /* can be configured as cpu port */
  1305. .port_cnt = 8, /* total physical port count */
  1306. .port_nirqs = 6,
  1307. .ops = &lan937x_dev_ops,
  1308. .mib_names = ksz9477_mib_names,
  1309. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1310. .reg_mib_cnt = MIB_COUNTER_NUM,
  1311. .regs = ksz9477_regs,
  1312. .masks = lan937x_masks,
  1313. .shifts = lan937x_shifts,
  1314. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1315. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1316. .supports_mii = {false, false, false, false,
  1317. true, true, false, false},
  1318. .supports_rmii = {false, false, false, false,
  1319. true, true, false, false},
  1320. .supports_rgmii = {false, false, false, false,
  1321. true, true, false, false},
  1322. .internal_phy = {true, true, true, true,
  1323. false, false, true, true},
  1324. },
  1325. [LAN9373] = {
  1326. .chip_id = LAN9373_CHIP_ID,
  1327. .dev_name = "LAN9373",
  1328. .num_vlans = 4096,
  1329. .num_alus = 1024,
  1330. .num_statics = 256,
  1331. .cpu_ports = 0x38, /* can be configured as cpu port */
  1332. .port_cnt = 5, /* total physical port count */
  1333. .port_nirqs = 6,
  1334. .ops = &lan937x_dev_ops,
  1335. .mib_names = ksz9477_mib_names,
  1336. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1337. .reg_mib_cnt = MIB_COUNTER_NUM,
  1338. .regs = ksz9477_regs,
  1339. .masks = lan937x_masks,
  1340. .shifts = lan937x_shifts,
  1341. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1342. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1343. .supports_mii = {false, false, false, false,
  1344. true, true, false, false},
  1345. .supports_rmii = {false, false, false, false,
  1346. true, true, false, false},
  1347. .supports_rgmii = {false, false, false, false,
  1348. true, true, false, false},
  1349. .internal_phy = {true, true, true, false,
  1350. false, false, true, true},
  1351. },
  1352. [LAN9374] = {
  1353. .chip_id = LAN9374_CHIP_ID,
  1354. .dev_name = "LAN9374",
  1355. .num_vlans = 4096,
  1356. .num_alus = 1024,
  1357. .num_statics = 256,
  1358. .cpu_ports = 0x30, /* can be configured as cpu port */
  1359. .port_cnt = 8, /* total physical port count */
  1360. .port_nirqs = 6,
  1361. .ops = &lan937x_dev_ops,
  1362. .mib_names = ksz9477_mib_names,
  1363. .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  1364. .reg_mib_cnt = MIB_COUNTER_NUM,
  1365. .regs = ksz9477_regs,
  1366. .masks = lan937x_masks,
  1367. .shifts = lan937x_shifts,
  1368. .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  1369. .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  1370. .supports_mii = {false, false, false, false,
  1371. true, true, false, false},
  1372. .supports_rmii = {false, false, false, false,
  1373. true, true, false, false},
  1374. .supports_rgmii = {false, false, false, false,
  1375. true, true, false, false},
  1376. .internal_phy = {true, true, true, true,
  1377. false, false, true, true},
  1378. },
  1379. };
  1380. EXPORT_SYMBOL_GPL(ksz_switch_chips);
  1381. static const struct ksz_chip_data *ksz_lookup_info(unsigned int prod_num)
  1382. {
  1383. int i;
  1384. for (i = 0; i < ARRAY_SIZE(ksz_switch_chips); i++) {
  1385. const struct ksz_chip_data *chip = &ksz_switch_chips[i];
  1386. if (chip->chip_id == prod_num)
  1387. return chip;
  1388. }
  1389. return NULL;
  1390. }
  1391. static int ksz_check_device_id(struct ksz_device *dev)
  1392. {
  1393. const struct ksz_chip_data *dt_chip_data;
  1394. dt_chip_data = of_device_get_match_data(dev->dev);
  1395. /* Check for Device Tree and Chip ID */
  1396. if (dt_chip_data->chip_id != dev->chip_id) {
  1397. dev_err(dev->dev,
  1398. "Device tree specifies chip %s but found %s, please fix it!\n",
  1399. dt_chip_data->dev_name, dev->info->dev_name);
  1400. return -ENODEV;
  1401. }
  1402. return 0;
  1403. }
  1404. static void ksz_phylink_get_caps(struct dsa_switch *ds, int port,
  1405. struct phylink_config *config)
  1406. {
  1407. struct ksz_device *dev = ds->priv;
  1408. config->legacy_pre_march2020 = false;
  1409. if (dev->info->supports_mii[port])
  1410. __set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces);
  1411. if (dev->info->supports_rmii[port])
  1412. __set_bit(PHY_INTERFACE_MODE_RMII,
  1413. config->supported_interfaces);
  1414. if (dev->info->supports_rgmii[port])
  1415. phy_interface_set_rgmii(config->supported_interfaces);
  1416. if (dev->info->internal_phy[port]) {
  1417. __set_bit(PHY_INTERFACE_MODE_INTERNAL,
  1418. config->supported_interfaces);
  1419. /* Compatibility for phylib's default interface type when the
  1420. * phy-mode property is absent
  1421. */
  1422. __set_bit(PHY_INTERFACE_MODE_GMII,
  1423. config->supported_interfaces);
  1424. }
  1425. if (dev->dev_ops->get_caps)
  1426. dev->dev_ops->get_caps(dev, port, config);
  1427. }
  1428. void ksz_r_mib_stats64(struct ksz_device *dev, int port)
  1429. {
  1430. struct ethtool_pause_stats *pstats;
  1431. struct rtnl_link_stats64 *stats;
  1432. struct ksz_stats_raw *raw;
  1433. struct ksz_port_mib *mib;
  1434. mib = &dev->ports[port].mib;
  1435. stats = &mib->stats64;
  1436. pstats = &mib->pause_stats;
  1437. raw = (struct ksz_stats_raw *)mib->counters;
  1438. spin_lock(&mib->stats64_lock);
  1439. stats->rx_packets = raw->rx_bcast + raw->rx_mcast + raw->rx_ucast +
  1440. raw->rx_pause;
  1441. stats->tx_packets = raw->tx_bcast + raw->tx_mcast + raw->tx_ucast +
  1442. raw->tx_pause;
  1443. /* HW counters are counting bytes + FCS which is not acceptable
  1444. * for rtnl_link_stats64 interface
  1445. */
  1446. stats->rx_bytes = raw->rx_total - stats->rx_packets * ETH_FCS_LEN;
  1447. stats->tx_bytes = raw->tx_total - stats->tx_packets * ETH_FCS_LEN;
  1448. stats->rx_length_errors = raw->rx_undersize + raw->rx_fragments +
  1449. raw->rx_oversize;
  1450. stats->rx_crc_errors = raw->rx_crc_err;
  1451. stats->rx_frame_errors = raw->rx_align_err;
  1452. stats->rx_dropped = raw->rx_discards;
  1453. stats->rx_errors = stats->rx_length_errors + stats->rx_crc_errors +
  1454. stats->rx_frame_errors + stats->rx_dropped;
  1455. stats->tx_window_errors = raw->tx_late_col;
  1456. stats->tx_fifo_errors = raw->tx_discards;
  1457. stats->tx_aborted_errors = raw->tx_exc_col;
  1458. stats->tx_errors = stats->tx_window_errors + stats->tx_fifo_errors +
  1459. stats->tx_aborted_errors;
  1460. stats->multicast = raw->rx_mcast;
  1461. stats->collisions = raw->tx_total_col;
  1462. pstats->tx_pause_frames = raw->tx_pause;
  1463. pstats->rx_pause_frames = raw->rx_pause;
  1464. spin_unlock(&mib->stats64_lock);
  1465. }
  1466. static void ksz_get_stats64(struct dsa_switch *ds, int port,
  1467. struct rtnl_link_stats64 *s)
  1468. {
  1469. struct ksz_device *dev = ds->priv;
  1470. struct ksz_port_mib *mib;
  1471. mib = &dev->ports[port].mib;
  1472. spin_lock(&mib->stats64_lock);
  1473. memcpy(s, &mib->stats64, sizeof(*s));
  1474. spin_unlock(&mib->stats64_lock);
  1475. }
  1476. static void ksz_get_pause_stats(struct dsa_switch *ds, int port,
  1477. struct ethtool_pause_stats *pause_stats)
  1478. {
  1479. struct ksz_device *dev = ds->priv;
  1480. struct ksz_port_mib *mib;
  1481. mib = &dev->ports[port].mib;
  1482. spin_lock(&mib->stats64_lock);
  1483. memcpy(pause_stats, &mib->pause_stats, sizeof(*pause_stats));
  1484. spin_unlock(&mib->stats64_lock);
  1485. }
  1486. static void ksz_get_strings(struct dsa_switch *ds, int port,
  1487. u32 stringset, uint8_t *buf)
  1488. {
  1489. struct ksz_device *dev = ds->priv;
  1490. int i;
  1491. if (stringset != ETH_SS_STATS)
  1492. return;
  1493. for (i = 0; i < dev->info->mib_cnt; i++) {
  1494. memcpy(buf + i * ETH_GSTRING_LEN,
  1495. dev->info->mib_names[i].string, ETH_GSTRING_LEN);
  1496. }
  1497. }
  1498. static void ksz_update_port_member(struct ksz_device *dev, int port)
  1499. {
  1500. struct ksz_port *p = &dev->ports[port];
  1501. struct dsa_switch *ds = dev->ds;
  1502. u8 port_member = 0, cpu_port;
  1503. const struct dsa_port *dp;
  1504. int i, j;
  1505. if (!dsa_is_user_port(ds, port))
  1506. return;
  1507. dp = dsa_to_port(ds, port);
  1508. cpu_port = BIT(dsa_upstream_port(ds, port));
  1509. for (i = 0; i < ds->num_ports; i++) {
  1510. const struct dsa_port *other_dp = dsa_to_port(ds, i);
  1511. struct ksz_port *other_p = &dev->ports[i];
  1512. u8 val = 0;
  1513. if (!dsa_is_user_port(ds, i))
  1514. continue;
  1515. if (port == i)
  1516. continue;
  1517. if (!dsa_port_bridge_same(dp, other_dp))
  1518. continue;
  1519. if (other_p->stp_state != BR_STATE_FORWARDING)
  1520. continue;
  1521. if (p->stp_state == BR_STATE_FORWARDING) {
  1522. val |= BIT(port);
  1523. port_member |= BIT(i);
  1524. }
  1525. /* Retain port [i]'s relationship to other ports than [port] */
  1526. for (j = 0; j < ds->num_ports; j++) {
  1527. const struct dsa_port *third_dp;
  1528. struct ksz_port *third_p;
  1529. if (j == i)
  1530. continue;
  1531. if (j == port)
  1532. continue;
  1533. if (!dsa_is_user_port(ds, j))
  1534. continue;
  1535. third_p = &dev->ports[j];
  1536. if (third_p->stp_state != BR_STATE_FORWARDING)
  1537. continue;
  1538. third_dp = dsa_to_port(ds, j);
  1539. if (dsa_port_bridge_same(other_dp, third_dp))
  1540. val |= BIT(j);
  1541. }
  1542. dev->dev_ops->cfg_port_member(dev, i, val | cpu_port);
  1543. }
  1544. dev->dev_ops->cfg_port_member(dev, port, port_member | cpu_port);
  1545. }
  1546. static int ksz_sw_mdio_read(struct mii_bus *bus, int addr, int regnum)
  1547. {
  1548. struct ksz_device *dev = bus->priv;
  1549. u16 val;
  1550. int ret;
  1551. if (regnum & MII_ADDR_C45)
  1552. return -EOPNOTSUPP;
  1553. ret = dev->dev_ops->r_phy(dev, addr, regnum, &val);
  1554. if (ret < 0)
  1555. return ret;
  1556. return val;
  1557. }
  1558. static int ksz_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,
  1559. u16 val)
  1560. {
  1561. struct ksz_device *dev = bus->priv;
  1562. if (regnum & MII_ADDR_C45)
  1563. return -EOPNOTSUPP;
  1564. return dev->dev_ops->w_phy(dev, addr, regnum, val);
  1565. }
  1566. static int ksz_irq_phy_setup(struct ksz_device *dev)
  1567. {
  1568. struct dsa_switch *ds = dev->ds;
  1569. int phy;
  1570. int irq;
  1571. int ret;
  1572. for (phy = 0; phy < KSZ_MAX_NUM_PORTS; phy++) {
  1573. if (BIT(phy) & ds->phys_mii_mask) {
  1574. irq = irq_find_mapping(dev->ports[phy].pirq.domain,
  1575. PORT_SRC_PHY_INT);
  1576. if (irq < 0) {
  1577. ret = irq;
  1578. goto out;
  1579. }
  1580. ds->slave_mii_bus->irq[phy] = irq;
  1581. }
  1582. }
  1583. return 0;
  1584. out:
  1585. while (phy--)
  1586. if (BIT(phy) & ds->phys_mii_mask)
  1587. irq_dispose_mapping(ds->slave_mii_bus->irq[phy]);
  1588. return ret;
  1589. }
  1590. static void ksz_irq_phy_free(struct ksz_device *dev)
  1591. {
  1592. struct dsa_switch *ds = dev->ds;
  1593. int phy;
  1594. for (phy = 0; phy < KSZ_MAX_NUM_PORTS; phy++)
  1595. if (BIT(phy) & ds->phys_mii_mask)
  1596. irq_dispose_mapping(ds->slave_mii_bus->irq[phy]);
  1597. }
  1598. static int ksz_mdio_register(struct ksz_device *dev)
  1599. {
  1600. struct dsa_switch *ds = dev->ds;
  1601. struct device_node *mdio_np;
  1602. struct mii_bus *bus;
  1603. int ret;
  1604. mdio_np = of_get_child_by_name(dev->dev->of_node, "mdio");
  1605. if (!mdio_np)
  1606. return 0;
  1607. bus = devm_mdiobus_alloc(ds->dev);
  1608. if (!bus) {
  1609. of_node_put(mdio_np);
  1610. return -ENOMEM;
  1611. }
  1612. bus->priv = dev;
  1613. bus->read = ksz_sw_mdio_read;
  1614. bus->write = ksz_sw_mdio_write;
  1615. bus->name = "ksz slave smi";
  1616. snprintf(bus->id, MII_BUS_ID_SIZE, "SMI-%d", ds->index);
  1617. bus->parent = ds->dev;
  1618. bus->phy_mask = ~ds->phys_mii_mask;
  1619. ds->slave_mii_bus = bus;
  1620. if (dev->irq > 0) {
  1621. ret = ksz_irq_phy_setup(dev);
  1622. if (ret) {
  1623. of_node_put(mdio_np);
  1624. return ret;
  1625. }
  1626. }
  1627. ret = devm_of_mdiobus_register(ds->dev, bus, mdio_np);
  1628. if (ret) {
  1629. dev_err(ds->dev, "unable to register MDIO bus %s\n",
  1630. bus->id);
  1631. if (dev->irq > 0)
  1632. ksz_irq_phy_free(dev);
  1633. }
  1634. of_node_put(mdio_np);
  1635. return ret;
  1636. }
  1637. static void ksz_irq_mask(struct irq_data *d)
  1638. {
  1639. struct ksz_irq *kirq = irq_data_get_irq_chip_data(d);
  1640. kirq->masked |= BIT(d->hwirq);
  1641. }
  1642. static void ksz_irq_unmask(struct irq_data *d)
  1643. {
  1644. struct ksz_irq *kirq = irq_data_get_irq_chip_data(d);
  1645. kirq->masked &= ~BIT(d->hwirq);
  1646. }
  1647. static void ksz_irq_bus_lock(struct irq_data *d)
  1648. {
  1649. struct ksz_irq *kirq = irq_data_get_irq_chip_data(d);
  1650. mutex_lock(&kirq->dev->lock_irq);
  1651. }
  1652. static void ksz_irq_bus_sync_unlock(struct irq_data *d)
  1653. {
  1654. struct ksz_irq *kirq = irq_data_get_irq_chip_data(d);
  1655. struct ksz_device *dev = kirq->dev;
  1656. int ret;
  1657. ret = ksz_write32(dev, kirq->reg_mask, kirq->masked);
  1658. if (ret)
  1659. dev_err(dev->dev, "failed to change IRQ mask\n");
  1660. mutex_unlock(&dev->lock_irq);
  1661. }
  1662. static const struct irq_chip ksz_irq_chip = {
  1663. .name = "ksz-irq",
  1664. .irq_mask = ksz_irq_mask,
  1665. .irq_unmask = ksz_irq_unmask,
  1666. .irq_bus_lock = ksz_irq_bus_lock,
  1667. .irq_bus_sync_unlock = ksz_irq_bus_sync_unlock,
  1668. };
  1669. static int ksz_irq_domain_map(struct irq_domain *d,
  1670. unsigned int irq, irq_hw_number_t hwirq)
  1671. {
  1672. irq_set_chip_data(irq, d->host_data);
  1673. irq_set_chip_and_handler(irq, &ksz_irq_chip, handle_level_irq);
  1674. irq_set_noprobe(irq);
  1675. return 0;
  1676. }
  1677. static const struct irq_domain_ops ksz_irq_domain_ops = {
  1678. .map = ksz_irq_domain_map,
  1679. .xlate = irq_domain_xlate_twocell,
  1680. };
  1681. static void ksz_irq_free(struct ksz_irq *kirq)
  1682. {
  1683. int irq, virq;
  1684. free_irq(kirq->irq_num, kirq);
  1685. for (irq = 0; irq < kirq->nirqs; irq++) {
  1686. virq = irq_find_mapping(kirq->domain, irq);
  1687. irq_dispose_mapping(virq);
  1688. }
  1689. irq_domain_remove(kirq->domain);
  1690. }
  1691. static irqreturn_t ksz_irq_thread_fn(int irq, void *dev_id)
  1692. {
  1693. struct ksz_irq *kirq = dev_id;
  1694. unsigned int nhandled = 0;
  1695. struct ksz_device *dev;
  1696. unsigned int sub_irq;
  1697. u8 data;
  1698. int ret;
  1699. u8 n;
  1700. dev = kirq->dev;
  1701. /* Read interrupt status register */
  1702. ret = ksz_read8(dev, kirq->reg_status, &data);
  1703. if (ret)
  1704. goto out;
  1705. for (n = 0; n < kirq->nirqs; ++n) {
  1706. if (data & BIT(n)) {
  1707. sub_irq = irq_find_mapping(kirq->domain, n);
  1708. handle_nested_irq(sub_irq);
  1709. ++nhandled;
  1710. }
  1711. }
  1712. out:
  1713. return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
  1714. }
  1715. static int ksz_irq_common_setup(struct ksz_device *dev, struct ksz_irq *kirq)
  1716. {
  1717. int ret, n;
  1718. kirq->dev = dev;
  1719. kirq->masked = ~0;
  1720. kirq->domain = irq_domain_add_simple(dev->dev->of_node, kirq->nirqs, 0,
  1721. &ksz_irq_domain_ops, kirq);
  1722. if (!kirq->domain)
  1723. return -ENOMEM;
  1724. for (n = 0; n < kirq->nirqs; n++)
  1725. irq_create_mapping(kirq->domain, n);
  1726. ret = request_threaded_irq(kirq->irq_num, NULL, ksz_irq_thread_fn,
  1727. IRQF_ONESHOT, kirq->name, kirq);
  1728. if (ret)
  1729. goto out;
  1730. return 0;
  1731. out:
  1732. ksz_irq_free(kirq);
  1733. return ret;
  1734. }
  1735. static int ksz_girq_setup(struct ksz_device *dev)
  1736. {
  1737. struct ksz_irq *girq = &dev->girq;
  1738. girq->nirqs = dev->info->port_cnt;
  1739. girq->reg_mask = REG_SW_PORT_INT_MASK__1;
  1740. girq->reg_status = REG_SW_PORT_INT_STATUS__1;
  1741. snprintf(girq->name, sizeof(girq->name), "global_port_irq");
  1742. girq->irq_num = dev->irq;
  1743. return ksz_irq_common_setup(dev, girq);
  1744. }
  1745. static int ksz_pirq_setup(struct ksz_device *dev, u8 p)
  1746. {
  1747. struct ksz_irq *pirq = &dev->ports[p].pirq;
  1748. pirq->nirqs = dev->info->port_nirqs;
  1749. pirq->reg_mask = dev->dev_ops->get_port_addr(p, REG_PORT_INT_MASK);
  1750. pirq->reg_status = dev->dev_ops->get_port_addr(p, REG_PORT_INT_STATUS);
  1751. snprintf(pirq->name, sizeof(pirq->name), "port_irq-%d", p);
  1752. pirq->irq_num = irq_find_mapping(dev->girq.domain, p);
  1753. if (pirq->irq_num < 0)
  1754. return pirq->irq_num;
  1755. return ksz_irq_common_setup(dev, pirq);
  1756. }
  1757. static int ksz_setup(struct dsa_switch *ds)
  1758. {
  1759. struct ksz_device *dev = ds->priv;
  1760. struct dsa_port *dp;
  1761. struct ksz_port *p;
  1762. const u16 *regs;
  1763. int ret;
  1764. regs = dev->info->regs;
  1765. dev->vlan_cache = devm_kcalloc(dev->dev, sizeof(struct vlan_table),
  1766. dev->info->num_vlans, GFP_KERNEL);
  1767. if (!dev->vlan_cache)
  1768. return -ENOMEM;
  1769. ret = dev->dev_ops->reset(dev);
  1770. if (ret) {
  1771. dev_err(ds->dev, "failed to reset switch\n");
  1772. return ret;
  1773. }
  1774. /* set broadcast storm protection 10% rate */
  1775. regmap_update_bits(dev->regmap[1], regs[S_BROADCAST_CTRL],
  1776. BROADCAST_STORM_RATE,
  1777. (BROADCAST_STORM_VALUE *
  1778. BROADCAST_STORM_PROT_RATE) / 100);
  1779. dev->dev_ops->config_cpu_port(ds);
  1780. dev->dev_ops->enable_stp_addr(dev);
  1781. regmap_update_bits(dev->regmap[0], regs[S_MULTICAST_CTRL],
  1782. MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE);
  1783. ksz_init_mib_timer(dev);
  1784. ds->configure_vlan_while_not_filtering = false;
  1785. if (dev->dev_ops->setup) {
  1786. ret = dev->dev_ops->setup(ds);
  1787. if (ret)
  1788. return ret;
  1789. }
  1790. /* Start with learning disabled on standalone user ports, and enabled
  1791. * on the CPU port. In lack of other finer mechanisms, learning on the
  1792. * CPU port will avoid flooding bridge local addresses on the network
  1793. * in some cases.
  1794. */
  1795. p = &dev->ports[dev->cpu_port];
  1796. p->learning = true;
  1797. if (dev->irq > 0) {
  1798. ret = ksz_girq_setup(dev);
  1799. if (ret)
  1800. return ret;
  1801. dsa_switch_for_each_user_port(dp, dev->ds) {
  1802. ret = ksz_pirq_setup(dev, dp->index);
  1803. if (ret)
  1804. goto out_girq;
  1805. }
  1806. }
  1807. ret = ksz_mdio_register(dev);
  1808. if (ret < 0) {
  1809. dev_err(dev->dev, "failed to register the mdio");
  1810. goto out_pirq;
  1811. }
  1812. /* start switch */
  1813. regmap_update_bits(dev->regmap[0], regs[S_START_CTRL],
  1814. SW_START, SW_START);
  1815. return 0;
  1816. out_pirq:
  1817. if (dev->irq > 0)
  1818. dsa_switch_for_each_user_port(dp, dev->ds)
  1819. ksz_irq_free(&dev->ports[dp->index].pirq);
  1820. out_girq:
  1821. if (dev->irq > 0)
  1822. ksz_irq_free(&dev->girq);
  1823. return ret;
  1824. }
  1825. static void ksz_teardown(struct dsa_switch *ds)
  1826. {
  1827. struct ksz_device *dev = ds->priv;
  1828. struct dsa_port *dp;
  1829. if (dev->irq > 0) {
  1830. dsa_switch_for_each_user_port(dp, dev->ds)
  1831. ksz_irq_free(&dev->ports[dp->index].pirq);
  1832. ksz_irq_free(&dev->girq);
  1833. }
  1834. if (dev->dev_ops->teardown)
  1835. dev->dev_ops->teardown(ds);
  1836. }
  1837. static void port_r_cnt(struct ksz_device *dev, int port)
  1838. {
  1839. struct ksz_port_mib *mib = &dev->ports[port].mib;
  1840. u64 *dropped;
  1841. /* Some ports may not have MIB counters before SWITCH_COUNTER_NUM. */
  1842. while (mib->cnt_ptr < dev->info->reg_mib_cnt) {
  1843. dev->dev_ops->r_mib_cnt(dev, port, mib->cnt_ptr,
  1844. &mib->counters[mib->cnt_ptr]);
  1845. ++mib->cnt_ptr;
  1846. }
  1847. /* last one in storage */
  1848. dropped = &mib->counters[dev->info->mib_cnt];
  1849. /* Some ports may not have MIB counters after SWITCH_COUNTER_NUM. */
  1850. while (mib->cnt_ptr < dev->info->mib_cnt) {
  1851. dev->dev_ops->r_mib_pkt(dev, port, mib->cnt_ptr,
  1852. dropped, &mib->counters[mib->cnt_ptr]);
  1853. ++mib->cnt_ptr;
  1854. }
  1855. mib->cnt_ptr = 0;
  1856. }
  1857. static void ksz_mib_read_work(struct work_struct *work)
  1858. {
  1859. struct ksz_device *dev = container_of(work, struct ksz_device,
  1860. mib_read.work);
  1861. struct ksz_port_mib *mib;
  1862. struct ksz_port *p;
  1863. int i;
  1864. for (i = 0; i < dev->info->port_cnt; i++) {
  1865. if (dsa_is_unused_port(dev->ds, i))
  1866. continue;
  1867. p = &dev->ports[i];
  1868. mib = &p->mib;
  1869. mutex_lock(&mib->cnt_mutex);
  1870. /* Only read MIB counters when the port is told to do.
  1871. * If not, read only dropped counters when link is not up.
  1872. */
  1873. if (!p->read) {
  1874. const struct dsa_port *dp = dsa_to_port(dev->ds, i);
  1875. if (!netif_carrier_ok(dp->slave))
  1876. mib->cnt_ptr = dev->info->reg_mib_cnt;
  1877. }
  1878. port_r_cnt(dev, i);
  1879. p->read = false;
  1880. if (dev->dev_ops->r_mib_stat64)
  1881. dev->dev_ops->r_mib_stat64(dev, i);
  1882. mutex_unlock(&mib->cnt_mutex);
  1883. }
  1884. schedule_delayed_work(&dev->mib_read, dev->mib_read_interval);
  1885. }
  1886. void ksz_init_mib_timer(struct ksz_device *dev)
  1887. {
  1888. int i;
  1889. INIT_DELAYED_WORK(&dev->mib_read, ksz_mib_read_work);
  1890. for (i = 0; i < dev->info->port_cnt; i++) {
  1891. struct ksz_port_mib *mib = &dev->ports[i].mib;
  1892. dev->dev_ops->port_init_cnt(dev, i);
  1893. mib->cnt_ptr = 0;
  1894. memset(mib->counters, 0, dev->info->mib_cnt * sizeof(u64));
  1895. }
  1896. }
  1897. static int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg)
  1898. {
  1899. struct ksz_device *dev = ds->priv;
  1900. u16 val = 0xffff;
  1901. int ret;
  1902. ret = dev->dev_ops->r_phy(dev, addr, reg, &val);
  1903. if (ret)
  1904. return ret;
  1905. return val;
  1906. }
  1907. static int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val)
  1908. {
  1909. struct ksz_device *dev = ds->priv;
  1910. int ret;
  1911. ret = dev->dev_ops->w_phy(dev, addr, reg, val);
  1912. if (ret)
  1913. return ret;
  1914. return 0;
  1915. }
  1916. static u32 ksz_get_phy_flags(struct dsa_switch *ds, int port)
  1917. {
  1918. struct ksz_device *dev = ds->priv;
  1919. if (dev->chip_id == KSZ8830_CHIP_ID) {
  1920. /* Silicon Errata Sheet (DS80000830A):
  1921. * Port 1 does not work with LinkMD Cable-Testing.
  1922. * Port 1 does not respond to received PAUSE control frames.
  1923. */
  1924. if (!port)
  1925. return MICREL_KSZ8_P1_ERRATA;
  1926. }
  1927. return 0;
  1928. }
  1929. static void ksz_mac_link_down(struct dsa_switch *ds, int port,
  1930. unsigned int mode, phy_interface_t interface)
  1931. {
  1932. struct ksz_device *dev = ds->priv;
  1933. struct ksz_port *p = &dev->ports[port];
  1934. /* Read all MIB counters when the link is going down. */
  1935. p->read = true;
  1936. /* timer started */
  1937. if (dev->mib_read_interval)
  1938. schedule_delayed_work(&dev->mib_read, 0);
  1939. }
  1940. static int ksz_sset_count(struct dsa_switch *ds, int port, int sset)
  1941. {
  1942. struct ksz_device *dev = ds->priv;
  1943. if (sset != ETH_SS_STATS)
  1944. return 0;
  1945. return dev->info->mib_cnt;
  1946. }
  1947. static void ksz_get_ethtool_stats(struct dsa_switch *ds, int port,
  1948. uint64_t *buf)
  1949. {
  1950. const struct dsa_port *dp = dsa_to_port(ds, port);
  1951. struct ksz_device *dev = ds->priv;
  1952. struct ksz_port_mib *mib;
  1953. mib = &dev->ports[port].mib;
  1954. mutex_lock(&mib->cnt_mutex);
  1955. /* Only read dropped counters if no link. */
  1956. if (!netif_carrier_ok(dp->slave))
  1957. mib->cnt_ptr = dev->info->reg_mib_cnt;
  1958. port_r_cnt(dev, port);
  1959. memcpy(buf, mib->counters, dev->info->mib_cnt * sizeof(u64));
  1960. mutex_unlock(&mib->cnt_mutex);
  1961. }
  1962. static int ksz_port_bridge_join(struct dsa_switch *ds, int port,
  1963. struct dsa_bridge bridge,
  1964. bool *tx_fwd_offload,
  1965. struct netlink_ext_ack *extack)
  1966. {
  1967. /* port_stp_state_set() will be called after to put the port in
  1968. * appropriate state so there is no need to do anything.
  1969. */
  1970. return 0;
  1971. }
  1972. static void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
  1973. struct dsa_bridge bridge)
  1974. {
  1975. /* port_stp_state_set() will be called after to put the port in
  1976. * forwarding state so there is no need to do anything.
  1977. */
  1978. }
  1979. static void ksz_port_fast_age(struct dsa_switch *ds, int port)
  1980. {
  1981. struct ksz_device *dev = ds->priv;
  1982. dev->dev_ops->flush_dyn_mac_table(dev, port);
  1983. }
  1984. static int ksz_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
  1985. {
  1986. struct ksz_device *dev = ds->priv;
  1987. if (!dev->dev_ops->set_ageing_time)
  1988. return -EOPNOTSUPP;
  1989. return dev->dev_ops->set_ageing_time(dev, msecs);
  1990. }
  1991. static int ksz_port_fdb_add(struct dsa_switch *ds, int port,
  1992. const unsigned char *addr, u16 vid,
  1993. struct dsa_db db)
  1994. {
  1995. struct ksz_device *dev = ds->priv;
  1996. if (!dev->dev_ops->fdb_add)
  1997. return -EOPNOTSUPP;
  1998. return dev->dev_ops->fdb_add(dev, port, addr, vid, db);
  1999. }
  2000. static int ksz_port_fdb_del(struct dsa_switch *ds, int port,
  2001. const unsigned char *addr,
  2002. u16 vid, struct dsa_db db)
  2003. {
  2004. struct ksz_device *dev = ds->priv;
  2005. if (!dev->dev_ops->fdb_del)
  2006. return -EOPNOTSUPP;
  2007. return dev->dev_ops->fdb_del(dev, port, addr, vid, db);
  2008. }
  2009. static int ksz_port_fdb_dump(struct dsa_switch *ds, int port,
  2010. dsa_fdb_dump_cb_t *cb, void *data)
  2011. {
  2012. struct ksz_device *dev = ds->priv;
  2013. if (!dev->dev_ops->fdb_dump)
  2014. return -EOPNOTSUPP;
  2015. return dev->dev_ops->fdb_dump(dev, port, cb, data);
  2016. }
  2017. static int ksz_port_mdb_add(struct dsa_switch *ds, int port,
  2018. const struct switchdev_obj_port_mdb *mdb,
  2019. struct dsa_db db)
  2020. {
  2021. struct ksz_device *dev = ds->priv;
  2022. if (!dev->dev_ops->mdb_add)
  2023. return -EOPNOTSUPP;
  2024. return dev->dev_ops->mdb_add(dev, port, mdb, db);
  2025. }
  2026. static int ksz_port_mdb_del(struct dsa_switch *ds, int port,
  2027. const struct switchdev_obj_port_mdb *mdb,
  2028. struct dsa_db db)
  2029. {
  2030. struct ksz_device *dev = ds->priv;
  2031. if (!dev->dev_ops->mdb_del)
  2032. return -EOPNOTSUPP;
  2033. return dev->dev_ops->mdb_del(dev, port, mdb, db);
  2034. }
  2035. static int ksz_enable_port(struct dsa_switch *ds, int port,
  2036. struct phy_device *phy)
  2037. {
  2038. struct ksz_device *dev = ds->priv;
  2039. if (!dsa_is_user_port(ds, port))
  2040. return 0;
  2041. /* setup slave port */
  2042. dev->dev_ops->port_setup(dev, port, false);
  2043. /* port_stp_state_set() will be called after to enable the port so
  2044. * there is no need to do anything.
  2045. */
  2046. return 0;
  2047. }
  2048. void ksz_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
  2049. {
  2050. struct ksz_device *dev = ds->priv;
  2051. struct ksz_port *p;
  2052. const u16 *regs;
  2053. u8 data;
  2054. regs = dev->info->regs;
  2055. ksz_pread8(dev, port, regs[P_STP_CTRL], &data);
  2056. data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
  2057. p = &dev->ports[port];
  2058. switch (state) {
  2059. case BR_STATE_DISABLED:
  2060. data |= PORT_LEARN_DISABLE;
  2061. break;
  2062. case BR_STATE_LISTENING:
  2063. data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
  2064. break;
  2065. case BR_STATE_LEARNING:
  2066. data |= PORT_RX_ENABLE;
  2067. if (!p->learning)
  2068. data |= PORT_LEARN_DISABLE;
  2069. break;
  2070. case BR_STATE_FORWARDING:
  2071. data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
  2072. if (!p->learning)
  2073. data |= PORT_LEARN_DISABLE;
  2074. break;
  2075. case BR_STATE_BLOCKING:
  2076. data |= PORT_LEARN_DISABLE;
  2077. break;
  2078. default:
  2079. dev_err(ds->dev, "invalid STP state: %d\n", state);
  2080. return;
  2081. }
  2082. ksz_pwrite8(dev, port, regs[P_STP_CTRL], data);
  2083. p->stp_state = state;
  2084. ksz_update_port_member(dev, port);
  2085. }
  2086. static int ksz_port_pre_bridge_flags(struct dsa_switch *ds, int port,
  2087. struct switchdev_brport_flags flags,
  2088. struct netlink_ext_ack *extack)
  2089. {
  2090. if (flags.mask & ~BR_LEARNING)
  2091. return -EINVAL;
  2092. return 0;
  2093. }
  2094. static int ksz_port_bridge_flags(struct dsa_switch *ds, int port,
  2095. struct switchdev_brport_flags flags,
  2096. struct netlink_ext_ack *extack)
  2097. {
  2098. struct ksz_device *dev = ds->priv;
  2099. struct ksz_port *p = &dev->ports[port];
  2100. if (flags.mask & BR_LEARNING) {
  2101. p->learning = !!(flags.val & BR_LEARNING);
  2102. /* Make the change take effect immediately */
  2103. ksz_port_stp_state_set(ds, port, p->stp_state);
  2104. }
  2105. return 0;
  2106. }
  2107. static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
  2108. int port,
  2109. enum dsa_tag_protocol mp)
  2110. {
  2111. struct ksz_device *dev = ds->priv;
  2112. enum dsa_tag_protocol proto = DSA_TAG_PROTO_NONE;
  2113. if (dev->chip_id == KSZ8795_CHIP_ID ||
  2114. dev->chip_id == KSZ8794_CHIP_ID ||
  2115. dev->chip_id == KSZ8765_CHIP_ID)
  2116. proto = DSA_TAG_PROTO_KSZ8795;
  2117. if (dev->chip_id == KSZ8830_CHIP_ID ||
  2118. dev->chip_id == KSZ8563_CHIP_ID ||
  2119. dev->chip_id == KSZ9893_CHIP_ID)
  2120. proto = DSA_TAG_PROTO_KSZ9893;
  2121. if (dev->chip_id == KSZ9477_CHIP_ID ||
  2122. dev->chip_id == KSZ9896_CHIP_ID ||
  2123. dev->chip_id == KSZ9897_CHIP_ID ||
  2124. dev->chip_id == KSZ9567_CHIP_ID)
  2125. proto = DSA_TAG_PROTO_KSZ9477;
  2126. if (is_lan937x(dev))
  2127. proto = DSA_TAG_PROTO_LAN937X_VALUE;
  2128. return proto;
  2129. }
  2130. static int ksz_port_vlan_filtering(struct dsa_switch *ds, int port,
  2131. bool flag, struct netlink_ext_ack *extack)
  2132. {
  2133. struct ksz_device *dev = ds->priv;
  2134. if (!dev->dev_ops->vlan_filtering)
  2135. return -EOPNOTSUPP;
  2136. return dev->dev_ops->vlan_filtering(dev, port, flag, extack);
  2137. }
  2138. static int ksz_port_vlan_add(struct dsa_switch *ds, int port,
  2139. const struct switchdev_obj_port_vlan *vlan,
  2140. struct netlink_ext_ack *extack)
  2141. {
  2142. struct ksz_device *dev = ds->priv;
  2143. if (!dev->dev_ops->vlan_add)
  2144. return -EOPNOTSUPP;
  2145. return dev->dev_ops->vlan_add(dev, port, vlan, extack);
  2146. }
  2147. static int ksz_port_vlan_del(struct dsa_switch *ds, int port,
  2148. const struct switchdev_obj_port_vlan *vlan)
  2149. {
  2150. struct ksz_device *dev = ds->priv;
  2151. if (!dev->dev_ops->vlan_del)
  2152. return -EOPNOTSUPP;
  2153. return dev->dev_ops->vlan_del(dev, port, vlan);
  2154. }
  2155. static int ksz_port_mirror_add(struct dsa_switch *ds, int port,
  2156. struct dsa_mall_mirror_tc_entry *mirror,
  2157. bool ingress, struct netlink_ext_ack *extack)
  2158. {
  2159. struct ksz_device *dev = ds->priv;
  2160. if (!dev->dev_ops->mirror_add)
  2161. return -EOPNOTSUPP;
  2162. return dev->dev_ops->mirror_add(dev, port, mirror, ingress, extack);
  2163. }
  2164. static void ksz_port_mirror_del(struct dsa_switch *ds, int port,
  2165. struct dsa_mall_mirror_tc_entry *mirror)
  2166. {
  2167. struct ksz_device *dev = ds->priv;
  2168. if (dev->dev_ops->mirror_del)
  2169. dev->dev_ops->mirror_del(dev, port, mirror);
  2170. }
  2171. static int ksz_change_mtu(struct dsa_switch *ds, int port, int mtu)
  2172. {
  2173. struct ksz_device *dev = ds->priv;
  2174. if (!dev->dev_ops->change_mtu)
  2175. return -EOPNOTSUPP;
  2176. return dev->dev_ops->change_mtu(dev, port, mtu);
  2177. }
  2178. static int ksz_max_mtu(struct dsa_switch *ds, int port)
  2179. {
  2180. struct ksz_device *dev = ds->priv;
  2181. if (!dev->dev_ops->max_mtu)
  2182. return -EOPNOTSUPP;
  2183. return dev->dev_ops->max_mtu(dev, port);
  2184. }
  2185. static void ksz_set_xmii(struct ksz_device *dev, int port,
  2186. phy_interface_t interface)
  2187. {
  2188. const u8 *bitval = dev->info->xmii_ctrl1;
  2189. struct ksz_port *p = &dev->ports[port];
  2190. const u16 *regs = dev->info->regs;
  2191. u8 data8;
  2192. ksz_pread8(dev, port, regs[P_XMII_CTRL_1], &data8);
  2193. data8 &= ~(P_MII_SEL_M | P_RGMII_ID_IG_ENABLE |
  2194. P_RGMII_ID_EG_ENABLE);
  2195. switch (interface) {
  2196. case PHY_INTERFACE_MODE_MII:
  2197. data8 |= bitval[P_MII_SEL];
  2198. break;
  2199. case PHY_INTERFACE_MODE_RMII:
  2200. data8 |= bitval[P_RMII_SEL];
  2201. break;
  2202. case PHY_INTERFACE_MODE_GMII:
  2203. data8 |= bitval[P_GMII_SEL];
  2204. break;
  2205. case PHY_INTERFACE_MODE_RGMII:
  2206. case PHY_INTERFACE_MODE_RGMII_ID:
  2207. case PHY_INTERFACE_MODE_RGMII_TXID:
  2208. case PHY_INTERFACE_MODE_RGMII_RXID:
  2209. data8 |= bitval[P_RGMII_SEL];
  2210. /* On KSZ9893, disable RGMII in-band status support */
  2211. if (dev->chip_id == KSZ9893_CHIP_ID ||
  2212. dev->chip_id == KSZ8563_CHIP_ID)
  2213. data8 &= ~P_MII_MAC_MODE;
  2214. break;
  2215. default:
  2216. dev_err(dev->dev, "Unsupported interface '%s' for port %d\n",
  2217. phy_modes(interface), port);
  2218. return;
  2219. }
  2220. if (p->rgmii_tx_val)
  2221. data8 |= P_RGMII_ID_EG_ENABLE;
  2222. if (p->rgmii_rx_val)
  2223. data8 |= P_RGMII_ID_IG_ENABLE;
  2224. /* Write the updated value */
  2225. ksz_pwrite8(dev, port, regs[P_XMII_CTRL_1], data8);
  2226. }
  2227. phy_interface_t ksz_get_xmii(struct ksz_device *dev, int port, bool gbit)
  2228. {
  2229. const u8 *bitval = dev->info->xmii_ctrl1;
  2230. const u16 *regs = dev->info->regs;
  2231. phy_interface_t interface;
  2232. u8 data8;
  2233. u8 val;
  2234. ksz_pread8(dev, port, regs[P_XMII_CTRL_1], &data8);
  2235. val = FIELD_GET(P_MII_SEL_M, data8);
  2236. if (val == bitval[P_MII_SEL]) {
  2237. if (gbit)
  2238. interface = PHY_INTERFACE_MODE_GMII;
  2239. else
  2240. interface = PHY_INTERFACE_MODE_MII;
  2241. } else if (val == bitval[P_RMII_SEL]) {
  2242. interface = PHY_INTERFACE_MODE_RGMII;
  2243. } else {
  2244. interface = PHY_INTERFACE_MODE_RGMII;
  2245. if (data8 & P_RGMII_ID_EG_ENABLE)
  2246. interface = PHY_INTERFACE_MODE_RGMII_TXID;
  2247. if (data8 & P_RGMII_ID_IG_ENABLE) {
  2248. interface = PHY_INTERFACE_MODE_RGMII_RXID;
  2249. if (data8 & P_RGMII_ID_EG_ENABLE)
  2250. interface = PHY_INTERFACE_MODE_RGMII_ID;
  2251. }
  2252. }
  2253. return interface;
  2254. }
  2255. static void ksz_phylink_mac_config(struct dsa_switch *ds, int port,
  2256. unsigned int mode,
  2257. const struct phylink_link_state *state)
  2258. {
  2259. struct ksz_device *dev = ds->priv;
  2260. if (ksz_is_ksz88x3(dev))
  2261. return;
  2262. /* Internal PHYs */
  2263. if (dev->info->internal_phy[port])
  2264. return;
  2265. if (phylink_autoneg_inband(mode)) {
  2266. dev_err(dev->dev, "In-band AN not supported!\n");
  2267. return;
  2268. }
  2269. ksz_set_xmii(dev, port, state->interface);
  2270. if (dev->dev_ops->phylink_mac_config)
  2271. dev->dev_ops->phylink_mac_config(dev, port, mode, state);
  2272. if (dev->dev_ops->setup_rgmii_delay)
  2273. dev->dev_ops->setup_rgmii_delay(dev, port);
  2274. }
  2275. bool ksz_get_gbit(struct ksz_device *dev, int port)
  2276. {
  2277. const u8 *bitval = dev->info->xmii_ctrl1;
  2278. const u16 *regs = dev->info->regs;
  2279. bool gbit = false;
  2280. u8 data8;
  2281. bool val;
  2282. ksz_pread8(dev, port, regs[P_XMII_CTRL_1], &data8);
  2283. val = FIELD_GET(P_GMII_1GBIT_M, data8);
  2284. if (val == bitval[P_GMII_1GBIT])
  2285. gbit = true;
  2286. return gbit;
  2287. }
  2288. static void ksz_set_gbit(struct ksz_device *dev, int port, bool gbit)
  2289. {
  2290. const u8 *bitval = dev->info->xmii_ctrl1;
  2291. const u16 *regs = dev->info->regs;
  2292. u8 data8;
  2293. ksz_pread8(dev, port, regs[P_XMII_CTRL_1], &data8);
  2294. data8 &= ~P_GMII_1GBIT_M;
  2295. if (gbit)
  2296. data8 |= FIELD_PREP(P_GMII_1GBIT_M, bitval[P_GMII_1GBIT]);
  2297. else
  2298. data8 |= FIELD_PREP(P_GMII_1GBIT_M, bitval[P_GMII_NOT_1GBIT]);
  2299. /* Write the updated value */
  2300. ksz_pwrite8(dev, port, regs[P_XMII_CTRL_1], data8);
  2301. }
  2302. static void ksz_set_100_10mbit(struct ksz_device *dev, int port, int speed)
  2303. {
  2304. const u8 *bitval = dev->info->xmii_ctrl0;
  2305. const u16 *regs = dev->info->regs;
  2306. u8 data8;
  2307. ksz_pread8(dev, port, regs[P_XMII_CTRL_0], &data8);
  2308. data8 &= ~P_MII_100MBIT_M;
  2309. if (speed == SPEED_100)
  2310. data8 |= FIELD_PREP(P_MII_100MBIT_M, bitval[P_MII_100MBIT]);
  2311. else
  2312. data8 |= FIELD_PREP(P_MII_100MBIT_M, bitval[P_MII_10MBIT]);
  2313. /* Write the updated value */
  2314. ksz_pwrite8(dev, port, regs[P_XMII_CTRL_0], data8);
  2315. }
  2316. static void ksz_port_set_xmii_speed(struct ksz_device *dev, int port, int speed)
  2317. {
  2318. if (speed == SPEED_1000)
  2319. ksz_set_gbit(dev, port, true);
  2320. else
  2321. ksz_set_gbit(dev, port, false);
  2322. if (speed == SPEED_100 || speed == SPEED_10)
  2323. ksz_set_100_10mbit(dev, port, speed);
  2324. }
  2325. static void ksz_duplex_flowctrl(struct ksz_device *dev, int port, int duplex,
  2326. bool tx_pause, bool rx_pause)
  2327. {
  2328. const u8 *bitval = dev->info->xmii_ctrl0;
  2329. const u32 *masks = dev->info->masks;
  2330. const u16 *regs = dev->info->regs;
  2331. u8 mask;
  2332. u8 val;
  2333. mask = P_MII_DUPLEX_M | masks[P_MII_TX_FLOW_CTRL] |
  2334. masks[P_MII_RX_FLOW_CTRL];
  2335. if (duplex == DUPLEX_FULL)
  2336. val = FIELD_PREP(P_MII_DUPLEX_M, bitval[P_MII_FULL_DUPLEX]);
  2337. else
  2338. val = FIELD_PREP(P_MII_DUPLEX_M, bitval[P_MII_HALF_DUPLEX]);
  2339. if (tx_pause)
  2340. val |= masks[P_MII_TX_FLOW_CTRL];
  2341. if (rx_pause)
  2342. val |= masks[P_MII_RX_FLOW_CTRL];
  2343. ksz_prmw8(dev, port, regs[P_XMII_CTRL_0], mask, val);
  2344. }
  2345. static void ksz9477_phylink_mac_link_up(struct ksz_device *dev, int port,
  2346. unsigned int mode,
  2347. phy_interface_t interface,
  2348. struct phy_device *phydev, int speed,
  2349. int duplex, bool tx_pause,
  2350. bool rx_pause)
  2351. {
  2352. struct ksz_port *p;
  2353. p = &dev->ports[port];
  2354. /* Internal PHYs */
  2355. if (dev->info->internal_phy[port])
  2356. return;
  2357. p->phydev.speed = speed;
  2358. ksz_port_set_xmii_speed(dev, port, speed);
  2359. ksz_duplex_flowctrl(dev, port, duplex, tx_pause, rx_pause);
  2360. }
  2361. static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port,
  2362. unsigned int mode,
  2363. phy_interface_t interface,
  2364. struct phy_device *phydev, int speed,
  2365. int duplex, bool tx_pause, bool rx_pause)
  2366. {
  2367. struct ksz_device *dev = ds->priv;
  2368. if (dev->dev_ops->phylink_mac_link_up)
  2369. dev->dev_ops->phylink_mac_link_up(dev, port, mode, interface,
  2370. phydev, speed, duplex,
  2371. tx_pause, rx_pause);
  2372. }
  2373. static int ksz_switch_detect(struct ksz_device *dev)
  2374. {
  2375. u8 id1, id2, id4;
  2376. u16 id16;
  2377. u32 id32;
  2378. int ret;
  2379. /* read chip id */
  2380. ret = ksz_read16(dev, REG_CHIP_ID0, &id16);
  2381. if (ret)
  2382. return ret;
  2383. id1 = FIELD_GET(SW_FAMILY_ID_M, id16);
  2384. id2 = FIELD_GET(SW_CHIP_ID_M, id16);
  2385. switch (id1) {
  2386. case KSZ87_FAMILY_ID:
  2387. if (id2 == KSZ87_CHIP_ID_95) {
  2388. u8 val;
  2389. dev->chip_id = KSZ8795_CHIP_ID;
  2390. ksz_read8(dev, KSZ8_PORT_STATUS_0, &val);
  2391. if (val & KSZ8_PORT_FIBER_MODE)
  2392. dev->chip_id = KSZ8765_CHIP_ID;
  2393. } else if (id2 == KSZ87_CHIP_ID_94) {
  2394. dev->chip_id = KSZ8794_CHIP_ID;
  2395. } else {
  2396. return -ENODEV;
  2397. }
  2398. break;
  2399. case KSZ88_FAMILY_ID:
  2400. if (id2 == KSZ88_CHIP_ID_63)
  2401. dev->chip_id = KSZ8830_CHIP_ID;
  2402. else
  2403. return -ENODEV;
  2404. break;
  2405. default:
  2406. ret = ksz_read32(dev, REG_CHIP_ID0, &id32);
  2407. if (ret)
  2408. return ret;
  2409. dev->chip_rev = FIELD_GET(SW_REV_ID_M, id32);
  2410. id32 &= ~0xFF;
  2411. switch (id32) {
  2412. case KSZ9477_CHIP_ID:
  2413. case KSZ9896_CHIP_ID:
  2414. case KSZ9897_CHIP_ID:
  2415. case KSZ9567_CHIP_ID:
  2416. case LAN9370_CHIP_ID:
  2417. case LAN9371_CHIP_ID:
  2418. case LAN9372_CHIP_ID:
  2419. case LAN9373_CHIP_ID:
  2420. case LAN9374_CHIP_ID:
  2421. dev->chip_id = id32;
  2422. break;
  2423. case KSZ9893_CHIP_ID:
  2424. ret = ksz_read8(dev, REG_CHIP_ID4,
  2425. &id4);
  2426. if (ret)
  2427. return ret;
  2428. if (id4 == SKU_ID_KSZ8563)
  2429. dev->chip_id = KSZ8563_CHIP_ID;
  2430. else
  2431. dev->chip_id = KSZ9893_CHIP_ID;
  2432. break;
  2433. default:
  2434. dev_err(dev->dev,
  2435. "unsupported switch detected %x)\n", id32);
  2436. return -ENODEV;
  2437. }
  2438. }
  2439. return 0;
  2440. }
  2441. static const struct dsa_switch_ops ksz_switch_ops = {
  2442. .get_tag_protocol = ksz_get_tag_protocol,
  2443. .get_phy_flags = ksz_get_phy_flags,
  2444. .setup = ksz_setup,
  2445. .teardown = ksz_teardown,
  2446. .phy_read = ksz_phy_read16,
  2447. .phy_write = ksz_phy_write16,
  2448. .phylink_get_caps = ksz_phylink_get_caps,
  2449. .phylink_mac_config = ksz_phylink_mac_config,
  2450. .phylink_mac_link_up = ksz_phylink_mac_link_up,
  2451. .phylink_mac_link_down = ksz_mac_link_down,
  2452. .port_enable = ksz_enable_port,
  2453. .set_ageing_time = ksz_set_ageing_time,
  2454. .get_strings = ksz_get_strings,
  2455. .get_ethtool_stats = ksz_get_ethtool_stats,
  2456. .get_sset_count = ksz_sset_count,
  2457. .port_bridge_join = ksz_port_bridge_join,
  2458. .port_bridge_leave = ksz_port_bridge_leave,
  2459. .port_stp_state_set = ksz_port_stp_state_set,
  2460. .port_pre_bridge_flags = ksz_port_pre_bridge_flags,
  2461. .port_bridge_flags = ksz_port_bridge_flags,
  2462. .port_fast_age = ksz_port_fast_age,
  2463. .port_vlan_filtering = ksz_port_vlan_filtering,
  2464. .port_vlan_add = ksz_port_vlan_add,
  2465. .port_vlan_del = ksz_port_vlan_del,
  2466. .port_fdb_dump = ksz_port_fdb_dump,
  2467. .port_fdb_add = ksz_port_fdb_add,
  2468. .port_fdb_del = ksz_port_fdb_del,
  2469. .port_mdb_add = ksz_port_mdb_add,
  2470. .port_mdb_del = ksz_port_mdb_del,
  2471. .port_mirror_add = ksz_port_mirror_add,
  2472. .port_mirror_del = ksz_port_mirror_del,
  2473. .get_stats64 = ksz_get_stats64,
  2474. .get_pause_stats = ksz_get_pause_stats,
  2475. .port_change_mtu = ksz_change_mtu,
  2476. .port_max_mtu = ksz_max_mtu,
  2477. };
  2478. struct ksz_device *ksz_switch_alloc(struct device *base, void *priv)
  2479. {
  2480. struct dsa_switch *ds;
  2481. struct ksz_device *swdev;
  2482. ds = devm_kzalloc(base, sizeof(*ds), GFP_KERNEL);
  2483. if (!ds)
  2484. return NULL;
  2485. ds->dev = base;
  2486. ds->num_ports = DSA_MAX_PORTS;
  2487. ds->ops = &ksz_switch_ops;
  2488. swdev = devm_kzalloc(base, sizeof(*swdev), GFP_KERNEL);
  2489. if (!swdev)
  2490. return NULL;
  2491. ds->priv = swdev;
  2492. swdev->dev = base;
  2493. swdev->ds = ds;
  2494. swdev->priv = priv;
  2495. return swdev;
  2496. }
  2497. EXPORT_SYMBOL(ksz_switch_alloc);
  2498. static void ksz_parse_rgmii_delay(struct ksz_device *dev, int port_num,
  2499. struct device_node *port_dn)
  2500. {
  2501. phy_interface_t phy_mode = dev->ports[port_num].interface;
  2502. int rx_delay = -1, tx_delay = -1;
  2503. if (!phy_interface_mode_is_rgmii(phy_mode))
  2504. return;
  2505. of_property_read_u32(port_dn, "rx-internal-delay-ps", &rx_delay);
  2506. of_property_read_u32(port_dn, "tx-internal-delay-ps", &tx_delay);
  2507. if (rx_delay == -1 && tx_delay == -1) {
  2508. dev_warn(dev->dev,
  2509. "Port %d interpreting RGMII delay settings based on \"phy-mode\" property, "
  2510. "please update device tree to specify \"rx-internal-delay-ps\" and "
  2511. "\"tx-internal-delay-ps\"",
  2512. port_num);
  2513. if (phy_mode == PHY_INTERFACE_MODE_RGMII_RXID ||
  2514. phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
  2515. rx_delay = 2000;
  2516. if (phy_mode == PHY_INTERFACE_MODE_RGMII_TXID ||
  2517. phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
  2518. tx_delay = 2000;
  2519. }
  2520. if (rx_delay < 0)
  2521. rx_delay = 0;
  2522. if (tx_delay < 0)
  2523. tx_delay = 0;
  2524. dev->ports[port_num].rgmii_rx_val = rx_delay;
  2525. dev->ports[port_num].rgmii_tx_val = tx_delay;
  2526. }
  2527. int ksz_switch_register(struct ksz_device *dev)
  2528. {
  2529. const struct ksz_chip_data *info;
  2530. struct device_node *port, *ports;
  2531. phy_interface_t interface;
  2532. unsigned int port_num;
  2533. int ret;
  2534. int i;
  2535. if (dev->pdata)
  2536. dev->chip_id = dev->pdata->chip_id;
  2537. dev->reset_gpio = devm_gpiod_get_optional(dev->dev, "reset",
  2538. GPIOD_OUT_LOW);
  2539. if (IS_ERR(dev->reset_gpio))
  2540. return PTR_ERR(dev->reset_gpio);
  2541. if (dev->reset_gpio) {
  2542. gpiod_set_value_cansleep(dev->reset_gpio, 1);
  2543. usleep_range(10000, 12000);
  2544. gpiod_set_value_cansleep(dev->reset_gpio, 0);
  2545. msleep(100);
  2546. }
  2547. mutex_init(&dev->dev_mutex);
  2548. mutex_init(&dev->regmap_mutex);
  2549. mutex_init(&dev->alu_mutex);
  2550. mutex_init(&dev->vlan_mutex);
  2551. ret = ksz_switch_detect(dev);
  2552. if (ret)
  2553. return ret;
  2554. info = ksz_lookup_info(dev->chip_id);
  2555. if (!info)
  2556. return -ENODEV;
  2557. /* Update the compatible info with the probed one */
  2558. dev->info = info;
  2559. dev_info(dev->dev, "found switch: %s, rev %i\n",
  2560. dev->info->dev_name, dev->chip_rev);
  2561. ret = ksz_check_device_id(dev);
  2562. if (ret)
  2563. return ret;
  2564. dev->dev_ops = dev->info->ops;
  2565. ret = dev->dev_ops->init(dev);
  2566. if (ret)
  2567. return ret;
  2568. dev->ports = devm_kzalloc(dev->dev,
  2569. dev->info->port_cnt * sizeof(struct ksz_port),
  2570. GFP_KERNEL);
  2571. if (!dev->ports)
  2572. return -ENOMEM;
  2573. for (i = 0; i < dev->info->port_cnt; i++) {
  2574. spin_lock_init(&dev->ports[i].mib.stats64_lock);
  2575. mutex_init(&dev->ports[i].mib.cnt_mutex);
  2576. dev->ports[i].mib.counters =
  2577. devm_kzalloc(dev->dev,
  2578. sizeof(u64) * (dev->info->mib_cnt + 1),
  2579. GFP_KERNEL);
  2580. if (!dev->ports[i].mib.counters)
  2581. return -ENOMEM;
  2582. dev->ports[i].ksz_dev = dev;
  2583. dev->ports[i].num = i;
  2584. }
  2585. /* set the real number of ports */
  2586. dev->ds->num_ports = dev->info->port_cnt;
  2587. /* Host port interface will be self detected, or specifically set in
  2588. * device tree.
  2589. */
  2590. for (port_num = 0; port_num < dev->info->port_cnt; ++port_num)
  2591. dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
  2592. if (dev->dev->of_node) {
  2593. ret = of_get_phy_mode(dev->dev->of_node, &interface);
  2594. if (ret == 0)
  2595. dev->compat_interface = interface;
  2596. ports = of_get_child_by_name(dev->dev->of_node, "ethernet-ports");
  2597. if (!ports)
  2598. ports = of_get_child_by_name(dev->dev->of_node, "ports");
  2599. if (ports) {
  2600. for_each_available_child_of_node(ports, port) {
  2601. if (of_property_read_u32(port, "reg",
  2602. &port_num))
  2603. continue;
  2604. if (!(dev->port_mask & BIT(port_num))) {
  2605. of_node_put(port);
  2606. of_node_put(ports);
  2607. return -EINVAL;
  2608. }
  2609. of_get_phy_mode(port,
  2610. &dev->ports[port_num].interface);
  2611. ksz_parse_rgmii_delay(dev, port_num, port);
  2612. }
  2613. of_node_put(ports);
  2614. }
  2615. dev->synclko_125 = of_property_read_bool(dev->dev->of_node,
  2616. "microchip,synclko-125");
  2617. dev->synclko_disable = of_property_read_bool(dev->dev->of_node,
  2618. "microchip,synclko-disable");
  2619. if (dev->synclko_125 && dev->synclko_disable) {
  2620. dev_err(dev->dev, "inconsistent synclko settings\n");
  2621. return -EINVAL;
  2622. }
  2623. }
  2624. ret = dsa_register_switch(dev->ds);
  2625. if (ret) {
  2626. dev->dev_ops->exit(dev);
  2627. return ret;
  2628. }
  2629. /* Read MIB counters every 30 seconds to avoid overflow. */
  2630. dev->mib_read_interval = msecs_to_jiffies(5000);
  2631. /* Start the MIB timer. */
  2632. schedule_delayed_work(&dev->mib_read, 0);
  2633. return ret;
  2634. }
  2635. EXPORT_SYMBOL(ksz_switch_register);
  2636. void ksz_switch_remove(struct ksz_device *dev)
  2637. {
  2638. /* timer started */
  2639. if (dev->mib_read_interval) {
  2640. dev->mib_read_interval = 0;
  2641. cancel_delayed_work_sync(&dev->mib_read);
  2642. }
  2643. dev->dev_ops->exit(dev);
  2644. dsa_unregister_switch(dev->ds);
  2645. if (dev->reset_gpio)
  2646. gpiod_set_value_cansleep(dev->reset_gpio, 1);
  2647. }
  2648. EXPORT_SYMBOL(ksz_switch_remove);
  2649. MODULE_AUTHOR("Woojung Huh <[email protected]>");
  2650. MODULE_DESCRIPTION("Microchip KSZ Series Switch DSA Driver");
  2651. MODULE_LICENSE("GPL");