chip.c 90 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785
  1. /*
  2. * Marvell 88e6xxx Ethernet switch single-chip support
  3. *
  4. * Copyright (c) 2008 Marvell Semiconductor
  5. *
  6. * Copyright (c) 2015 CMC Electronics, Inc.
  7. * Added support for VLAN Table Unit operations
  8. *
  9. * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. */
  16. #include <linux/delay.h>
  17. #include <linux/etherdevice.h>
  18. #include <linux/ethtool.h>
  19. #include <linux/if_bridge.h>
  20. #include <linux/jiffies.h>
  21. #include <linux/list.h>
  22. #include <linux/mdio.h>
  23. #include <linux/module.h>
  24. #include <linux/of_device.h>
  25. #include <linux/of_mdio.h>
  26. #include <linux/netdevice.h>
  27. #include <linux/gpio/consumer.h>
  28. #include <linux/phy.h>
  29. #include <net/dsa.h>
  30. #include <net/switchdev.h>
  31. #include "mv88e6xxx.h"
  32. #include "global2.h"
  33. static void assert_reg_lock(struct mv88e6xxx_chip *chip)
  34. {
  35. if (unlikely(!mutex_is_locked(&chip->reg_lock))) {
  36. dev_err(chip->dev, "Switch registers lock not held!\n");
  37. dump_stack();
  38. }
  39. }
  40. /* The switch ADDR[4:1] configuration pins define the chip SMI device address
  41. * (ADDR[0] is always zero, thus only even SMI addresses can be strapped).
  42. *
  43. * When ADDR is all zero, the chip uses Single-chip Addressing Mode, assuming it
  44. * is the only device connected to the SMI master. In this mode it responds to
  45. * all 32 possible SMI addresses, and thus maps directly the internal devices.
  46. *
  47. * When ADDR is non-zero, the chip uses Multi-chip Addressing Mode, allowing
  48. * multiple devices to share the SMI interface. In this mode it responds to only
  49. * 2 registers, used to indirectly access the internal SMI devices.
  50. */
  51. static int mv88e6xxx_smi_read(struct mv88e6xxx_chip *chip,
  52. int addr, int reg, u16 *val)
  53. {
  54. if (!chip->smi_ops)
  55. return -EOPNOTSUPP;
  56. return chip->smi_ops->read(chip, addr, reg, val);
  57. }
  58. static int mv88e6xxx_smi_write(struct mv88e6xxx_chip *chip,
  59. int addr, int reg, u16 val)
  60. {
  61. if (!chip->smi_ops)
  62. return -EOPNOTSUPP;
  63. return chip->smi_ops->write(chip, addr, reg, val);
  64. }
  65. static int mv88e6xxx_smi_single_chip_read(struct mv88e6xxx_chip *chip,
  66. int addr, int reg, u16 *val)
  67. {
  68. int ret;
  69. ret = mdiobus_read_nested(chip->bus, addr, reg);
  70. if (ret < 0)
  71. return ret;
  72. *val = ret & 0xffff;
  73. return 0;
  74. }
  75. static int mv88e6xxx_smi_single_chip_write(struct mv88e6xxx_chip *chip,
  76. int addr, int reg, u16 val)
  77. {
  78. int ret;
  79. ret = mdiobus_write_nested(chip->bus, addr, reg, val);
  80. if (ret < 0)
  81. return ret;
  82. return 0;
  83. }
  84. static const struct mv88e6xxx_ops mv88e6xxx_smi_single_chip_ops = {
  85. .read = mv88e6xxx_smi_single_chip_read,
  86. .write = mv88e6xxx_smi_single_chip_write,
  87. };
  88. static int mv88e6xxx_smi_multi_chip_wait(struct mv88e6xxx_chip *chip)
  89. {
  90. int ret;
  91. int i;
  92. for (i = 0; i < 16; i++) {
  93. ret = mdiobus_read_nested(chip->bus, chip->sw_addr, SMI_CMD);
  94. if (ret < 0)
  95. return ret;
  96. if ((ret & SMI_CMD_BUSY) == 0)
  97. return 0;
  98. }
  99. return -ETIMEDOUT;
  100. }
  101. static int mv88e6xxx_smi_multi_chip_read(struct mv88e6xxx_chip *chip,
  102. int addr, int reg, u16 *val)
  103. {
  104. int ret;
  105. /* Wait for the bus to become free. */
  106. ret = mv88e6xxx_smi_multi_chip_wait(chip);
  107. if (ret < 0)
  108. return ret;
  109. /* Transmit the read command. */
  110. ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_CMD,
  111. SMI_CMD_OP_22_READ | (addr << 5) | reg);
  112. if (ret < 0)
  113. return ret;
  114. /* Wait for the read command to complete. */
  115. ret = mv88e6xxx_smi_multi_chip_wait(chip);
  116. if (ret < 0)
  117. return ret;
  118. /* Read the data. */
  119. ret = mdiobus_read_nested(chip->bus, chip->sw_addr, SMI_DATA);
  120. if (ret < 0)
  121. return ret;
  122. *val = ret & 0xffff;
  123. return 0;
  124. }
  125. static int mv88e6xxx_smi_multi_chip_write(struct mv88e6xxx_chip *chip,
  126. int addr, int reg, u16 val)
  127. {
  128. int ret;
  129. /* Wait for the bus to become free. */
  130. ret = mv88e6xxx_smi_multi_chip_wait(chip);
  131. if (ret < 0)
  132. return ret;
  133. /* Transmit the data to write. */
  134. ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_DATA, val);
  135. if (ret < 0)
  136. return ret;
  137. /* Transmit the write command. */
  138. ret = mdiobus_write_nested(chip->bus, chip->sw_addr, SMI_CMD,
  139. SMI_CMD_OP_22_WRITE | (addr << 5) | reg);
  140. if (ret < 0)
  141. return ret;
  142. /* Wait for the write command to complete. */
  143. ret = mv88e6xxx_smi_multi_chip_wait(chip);
  144. if (ret < 0)
  145. return ret;
  146. return 0;
  147. }
  148. static const struct mv88e6xxx_ops mv88e6xxx_smi_multi_chip_ops = {
  149. .read = mv88e6xxx_smi_multi_chip_read,
  150. .write = mv88e6xxx_smi_multi_chip_write,
  151. };
  152. int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val)
  153. {
  154. int err;
  155. assert_reg_lock(chip);
  156. err = mv88e6xxx_smi_read(chip, addr, reg, val);
  157. if (err)
  158. return err;
  159. dev_dbg(chip->dev, "<- addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n",
  160. addr, reg, *val);
  161. return 0;
  162. }
  163. int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val)
  164. {
  165. int err;
  166. assert_reg_lock(chip);
  167. err = mv88e6xxx_smi_write(chip, addr, reg, val);
  168. if (err)
  169. return err;
  170. dev_dbg(chip->dev, "-> addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n",
  171. addr, reg, val);
  172. return 0;
  173. }
  174. static int mv88e6xxx_phy_read(struct mv88e6xxx_chip *chip, int phy,
  175. int reg, u16 *val)
  176. {
  177. int addr = phy; /* PHY devices addresses start at 0x0 */
  178. if (!chip->phy_ops)
  179. return -EOPNOTSUPP;
  180. return chip->phy_ops->read(chip, addr, reg, val);
  181. }
  182. static int mv88e6xxx_phy_write(struct mv88e6xxx_chip *chip, int phy,
  183. int reg, u16 val)
  184. {
  185. int addr = phy; /* PHY devices addresses start at 0x0 */
  186. if (!chip->phy_ops)
  187. return -EOPNOTSUPP;
  188. return chip->phy_ops->write(chip, addr, reg, val);
  189. }
  190. static int mv88e6xxx_phy_page_get(struct mv88e6xxx_chip *chip, int phy, u8 page)
  191. {
  192. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_PHY_PAGE))
  193. return -EOPNOTSUPP;
  194. return mv88e6xxx_phy_write(chip, phy, PHY_PAGE, page);
  195. }
  196. static void mv88e6xxx_phy_page_put(struct mv88e6xxx_chip *chip, int phy)
  197. {
  198. int err;
  199. /* Restore PHY page Copper 0x0 for access via the registered MDIO bus */
  200. err = mv88e6xxx_phy_write(chip, phy, PHY_PAGE, PHY_PAGE_COPPER);
  201. if (unlikely(err)) {
  202. dev_err(chip->dev, "failed to restore PHY %d page Copper (%d)\n",
  203. phy, err);
  204. }
  205. }
  206. static int mv88e6xxx_phy_page_read(struct mv88e6xxx_chip *chip, int phy,
  207. u8 page, int reg, u16 *val)
  208. {
  209. int err;
  210. /* There is no paging for registers 22 */
  211. if (reg == PHY_PAGE)
  212. return -EINVAL;
  213. err = mv88e6xxx_phy_page_get(chip, phy, page);
  214. if (!err) {
  215. err = mv88e6xxx_phy_read(chip, phy, reg, val);
  216. mv88e6xxx_phy_page_put(chip, phy);
  217. }
  218. return err;
  219. }
  220. static int mv88e6xxx_phy_page_write(struct mv88e6xxx_chip *chip, int phy,
  221. u8 page, int reg, u16 val)
  222. {
  223. int err;
  224. /* There is no paging for registers 22 */
  225. if (reg == PHY_PAGE)
  226. return -EINVAL;
  227. err = mv88e6xxx_phy_page_get(chip, phy, page);
  228. if (!err) {
  229. err = mv88e6xxx_phy_write(chip, phy, PHY_PAGE, page);
  230. mv88e6xxx_phy_page_put(chip, phy);
  231. }
  232. return err;
  233. }
  234. static int mv88e6xxx_serdes_read(struct mv88e6xxx_chip *chip, int reg, u16 *val)
  235. {
  236. return mv88e6xxx_phy_page_read(chip, ADDR_SERDES, SERDES_PAGE_FIBER,
  237. reg, val);
  238. }
  239. static int mv88e6xxx_serdes_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
  240. {
  241. return mv88e6xxx_phy_page_write(chip, ADDR_SERDES, SERDES_PAGE_FIBER,
  242. reg, val);
  243. }
  244. int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, u16 mask)
  245. {
  246. int i;
  247. for (i = 0; i < 16; i++) {
  248. u16 val;
  249. int err;
  250. err = mv88e6xxx_read(chip, addr, reg, &val);
  251. if (err)
  252. return err;
  253. if (!(val & mask))
  254. return 0;
  255. usleep_range(1000, 2000);
  256. }
  257. dev_err(chip->dev, "Timeout while waiting for switch\n");
  258. return -ETIMEDOUT;
  259. }
  260. /* Indirect write to single pointer-data register with an Update bit */
  261. int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, u16 update)
  262. {
  263. u16 val;
  264. int err;
  265. /* Wait until the previous operation is completed */
  266. err = mv88e6xxx_wait(chip, addr, reg, BIT(15));
  267. if (err)
  268. return err;
  269. /* Set the Update bit to trigger a write operation */
  270. val = BIT(15) | update;
  271. return mv88e6xxx_write(chip, addr, reg, val);
  272. }
  273. static int _mv88e6xxx_reg_read(struct mv88e6xxx_chip *chip, int addr, int reg)
  274. {
  275. u16 val;
  276. int err;
  277. err = mv88e6xxx_read(chip, addr, reg, &val);
  278. if (err)
  279. return err;
  280. return val;
  281. }
  282. static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
  283. int reg, u16 val)
  284. {
  285. return mv88e6xxx_write(chip, addr, reg, val);
  286. }
  287. static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
  288. {
  289. int ret;
  290. int i;
  291. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
  292. if (ret < 0)
  293. return ret;
  294. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
  295. ret & ~GLOBAL_CONTROL_PPU_ENABLE);
  296. if (ret)
  297. return ret;
  298. for (i = 0; i < 16; i++) {
  299. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
  300. if (ret < 0)
  301. return ret;
  302. usleep_range(1000, 2000);
  303. if ((ret & GLOBAL_STATUS_PPU_MASK) !=
  304. GLOBAL_STATUS_PPU_POLLING)
  305. return 0;
  306. }
  307. return -ETIMEDOUT;
  308. }
  309. static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
  310. {
  311. int ret, err, i;
  312. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
  313. if (ret < 0)
  314. return ret;
  315. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL,
  316. ret | GLOBAL_CONTROL_PPU_ENABLE);
  317. if (err)
  318. return err;
  319. for (i = 0; i < 16; i++) {
  320. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
  321. if (ret < 0)
  322. return ret;
  323. usleep_range(1000, 2000);
  324. if ((ret & GLOBAL_STATUS_PPU_MASK) ==
  325. GLOBAL_STATUS_PPU_POLLING)
  326. return 0;
  327. }
  328. return -ETIMEDOUT;
  329. }
  330. static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
  331. {
  332. struct mv88e6xxx_chip *chip;
  333. chip = container_of(ugly, struct mv88e6xxx_chip, ppu_work);
  334. mutex_lock(&chip->reg_lock);
  335. if (mutex_trylock(&chip->ppu_mutex)) {
  336. if (mv88e6xxx_ppu_enable(chip) == 0)
  337. chip->ppu_disabled = 0;
  338. mutex_unlock(&chip->ppu_mutex);
  339. }
  340. mutex_unlock(&chip->reg_lock);
  341. }
  342. static void mv88e6xxx_ppu_reenable_timer(unsigned long _ps)
  343. {
  344. struct mv88e6xxx_chip *chip = (void *)_ps;
  345. schedule_work(&chip->ppu_work);
  346. }
  347. static int mv88e6xxx_ppu_access_get(struct mv88e6xxx_chip *chip)
  348. {
  349. int ret;
  350. mutex_lock(&chip->ppu_mutex);
  351. /* If the PHY polling unit is enabled, disable it so that
  352. * we can access the PHY registers. If it was already
  353. * disabled, cancel the timer that is going to re-enable
  354. * it.
  355. */
  356. if (!chip->ppu_disabled) {
  357. ret = mv88e6xxx_ppu_disable(chip);
  358. if (ret < 0) {
  359. mutex_unlock(&chip->ppu_mutex);
  360. return ret;
  361. }
  362. chip->ppu_disabled = 1;
  363. } else {
  364. del_timer(&chip->ppu_timer);
  365. ret = 0;
  366. }
  367. return ret;
  368. }
  369. static void mv88e6xxx_ppu_access_put(struct mv88e6xxx_chip *chip)
  370. {
  371. /* Schedule a timer to re-enable the PHY polling unit. */
  372. mod_timer(&chip->ppu_timer, jiffies + msecs_to_jiffies(10));
  373. mutex_unlock(&chip->ppu_mutex);
  374. }
  375. static void mv88e6xxx_ppu_state_init(struct mv88e6xxx_chip *chip)
  376. {
  377. mutex_init(&chip->ppu_mutex);
  378. INIT_WORK(&chip->ppu_work, mv88e6xxx_ppu_reenable_work);
  379. init_timer(&chip->ppu_timer);
  380. chip->ppu_timer.data = (unsigned long)chip;
  381. chip->ppu_timer.function = mv88e6xxx_ppu_reenable_timer;
  382. }
  383. static void mv88e6xxx_ppu_state_destroy(struct mv88e6xxx_chip *chip)
  384. {
  385. del_timer_sync(&chip->ppu_timer);
  386. }
  387. static int mv88e6xxx_phy_ppu_read(struct mv88e6xxx_chip *chip, int addr,
  388. int reg, u16 *val)
  389. {
  390. int err;
  391. err = mv88e6xxx_ppu_access_get(chip);
  392. if (!err) {
  393. err = mv88e6xxx_read(chip, addr, reg, val);
  394. mv88e6xxx_ppu_access_put(chip);
  395. }
  396. return err;
  397. }
  398. static int mv88e6xxx_phy_ppu_write(struct mv88e6xxx_chip *chip, int addr,
  399. int reg, u16 val)
  400. {
  401. int err;
  402. err = mv88e6xxx_ppu_access_get(chip);
  403. if (!err) {
  404. err = mv88e6xxx_write(chip, addr, reg, val);
  405. mv88e6xxx_ppu_access_put(chip);
  406. }
  407. return err;
  408. }
  409. static const struct mv88e6xxx_ops mv88e6xxx_phy_ppu_ops = {
  410. .read = mv88e6xxx_phy_ppu_read,
  411. .write = mv88e6xxx_phy_ppu_write,
  412. };
  413. static bool mv88e6xxx_6065_family(struct mv88e6xxx_chip *chip)
  414. {
  415. return chip->info->family == MV88E6XXX_FAMILY_6065;
  416. }
  417. static bool mv88e6xxx_6095_family(struct mv88e6xxx_chip *chip)
  418. {
  419. return chip->info->family == MV88E6XXX_FAMILY_6095;
  420. }
  421. static bool mv88e6xxx_6097_family(struct mv88e6xxx_chip *chip)
  422. {
  423. return chip->info->family == MV88E6XXX_FAMILY_6097;
  424. }
  425. static bool mv88e6xxx_6165_family(struct mv88e6xxx_chip *chip)
  426. {
  427. return chip->info->family == MV88E6XXX_FAMILY_6165;
  428. }
  429. static bool mv88e6xxx_6185_family(struct mv88e6xxx_chip *chip)
  430. {
  431. return chip->info->family == MV88E6XXX_FAMILY_6185;
  432. }
  433. static bool mv88e6xxx_6320_family(struct mv88e6xxx_chip *chip)
  434. {
  435. return chip->info->family == MV88E6XXX_FAMILY_6320;
  436. }
  437. static bool mv88e6xxx_6351_family(struct mv88e6xxx_chip *chip)
  438. {
  439. return chip->info->family == MV88E6XXX_FAMILY_6351;
  440. }
  441. static bool mv88e6xxx_6352_family(struct mv88e6xxx_chip *chip)
  442. {
  443. return chip->info->family == MV88E6XXX_FAMILY_6352;
  444. }
  445. static unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
  446. {
  447. return chip->info->num_databases;
  448. }
  449. static bool mv88e6xxx_has_fid_reg(struct mv88e6xxx_chip *chip)
  450. {
  451. /* Does the device have dedicated FID registers for ATU and VTU ops? */
  452. if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
  453. mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip))
  454. return true;
  455. return false;
  456. }
  457. /* We expect the switch to perform auto negotiation if there is a real
  458. * phy. However, in the case of a fixed link phy, we force the port
  459. * settings from the fixed link settings.
  460. */
  461. static void mv88e6xxx_adjust_link(struct dsa_switch *ds, int port,
  462. struct phy_device *phydev)
  463. {
  464. struct mv88e6xxx_chip *chip = ds->priv;
  465. u32 reg;
  466. int ret;
  467. if (!phy_is_pseudo_fixed_link(phydev))
  468. return;
  469. mutex_lock(&chip->reg_lock);
  470. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
  471. if (ret < 0)
  472. goto out;
  473. reg = ret & ~(PORT_PCS_CTRL_LINK_UP |
  474. PORT_PCS_CTRL_FORCE_LINK |
  475. PORT_PCS_CTRL_DUPLEX_FULL |
  476. PORT_PCS_CTRL_FORCE_DUPLEX |
  477. PORT_PCS_CTRL_UNFORCED);
  478. reg |= PORT_PCS_CTRL_FORCE_LINK;
  479. if (phydev->link)
  480. reg |= PORT_PCS_CTRL_LINK_UP;
  481. if (mv88e6xxx_6065_family(chip) && phydev->speed > SPEED_100)
  482. goto out;
  483. switch (phydev->speed) {
  484. case SPEED_1000:
  485. reg |= PORT_PCS_CTRL_1000;
  486. break;
  487. case SPEED_100:
  488. reg |= PORT_PCS_CTRL_100;
  489. break;
  490. case SPEED_10:
  491. reg |= PORT_PCS_CTRL_10;
  492. break;
  493. default:
  494. pr_info("Unknown speed");
  495. goto out;
  496. }
  497. reg |= PORT_PCS_CTRL_FORCE_DUPLEX;
  498. if (phydev->duplex == DUPLEX_FULL)
  499. reg |= PORT_PCS_CTRL_DUPLEX_FULL;
  500. if ((mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip)) &&
  501. (port >= chip->info->num_ports - 2)) {
  502. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
  503. reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK;
  504. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
  505. reg |= PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
  506. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
  507. reg |= (PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
  508. PORT_PCS_CTRL_RGMII_DELAY_TXCLK);
  509. }
  510. _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_PCS_CTRL, reg);
  511. out:
  512. mutex_unlock(&chip->reg_lock);
  513. }
  514. static int _mv88e6xxx_stats_wait(struct mv88e6xxx_chip *chip)
  515. {
  516. int ret;
  517. int i;
  518. for (i = 0; i < 10; i++) {
  519. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_OP);
  520. if ((ret & GLOBAL_STATS_OP_BUSY) == 0)
  521. return 0;
  522. }
  523. return -ETIMEDOUT;
  524. }
  525. static int _mv88e6xxx_stats_snapshot(struct mv88e6xxx_chip *chip, int port)
  526. {
  527. int ret;
  528. if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
  529. port = (port + 1) << 5;
  530. /* Snapshot the hardware statistics counters for this port. */
  531. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
  532. GLOBAL_STATS_OP_CAPTURE_PORT |
  533. GLOBAL_STATS_OP_HIST_RX_TX | port);
  534. if (ret < 0)
  535. return ret;
  536. /* Wait for the snapshotting to complete. */
  537. ret = _mv88e6xxx_stats_wait(chip);
  538. if (ret < 0)
  539. return ret;
  540. return 0;
  541. }
  542. static void _mv88e6xxx_stats_read(struct mv88e6xxx_chip *chip,
  543. int stat, u32 *val)
  544. {
  545. u32 _val;
  546. int ret;
  547. *val = 0;
  548. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
  549. GLOBAL_STATS_OP_READ_CAPTURED |
  550. GLOBAL_STATS_OP_HIST_RX_TX | stat);
  551. if (ret < 0)
  552. return;
  553. ret = _mv88e6xxx_stats_wait(chip);
  554. if (ret < 0)
  555. return;
  556. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_32);
  557. if (ret < 0)
  558. return;
  559. _val = ret << 16;
  560. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATS_COUNTER_01);
  561. if (ret < 0)
  562. return;
  563. *val = _val | ret;
  564. }
  565. static struct mv88e6xxx_hw_stat mv88e6xxx_hw_stats[] = {
  566. { "in_good_octets", 8, 0x00, BANK0, },
  567. { "in_bad_octets", 4, 0x02, BANK0, },
  568. { "in_unicast", 4, 0x04, BANK0, },
  569. { "in_broadcasts", 4, 0x06, BANK0, },
  570. { "in_multicasts", 4, 0x07, BANK0, },
  571. { "in_pause", 4, 0x16, BANK0, },
  572. { "in_undersize", 4, 0x18, BANK0, },
  573. { "in_fragments", 4, 0x19, BANK0, },
  574. { "in_oversize", 4, 0x1a, BANK0, },
  575. { "in_jabber", 4, 0x1b, BANK0, },
  576. { "in_rx_error", 4, 0x1c, BANK0, },
  577. { "in_fcs_error", 4, 0x1d, BANK0, },
  578. { "out_octets", 8, 0x0e, BANK0, },
  579. { "out_unicast", 4, 0x10, BANK0, },
  580. { "out_broadcasts", 4, 0x13, BANK0, },
  581. { "out_multicasts", 4, 0x12, BANK0, },
  582. { "out_pause", 4, 0x15, BANK0, },
  583. { "excessive", 4, 0x11, BANK0, },
  584. { "collisions", 4, 0x1e, BANK0, },
  585. { "deferred", 4, 0x05, BANK0, },
  586. { "single", 4, 0x14, BANK0, },
  587. { "multiple", 4, 0x17, BANK0, },
  588. { "out_fcs_error", 4, 0x03, BANK0, },
  589. { "late", 4, 0x1f, BANK0, },
  590. { "hist_64bytes", 4, 0x08, BANK0, },
  591. { "hist_65_127bytes", 4, 0x09, BANK0, },
  592. { "hist_128_255bytes", 4, 0x0a, BANK0, },
  593. { "hist_256_511bytes", 4, 0x0b, BANK0, },
  594. { "hist_512_1023bytes", 4, 0x0c, BANK0, },
  595. { "hist_1024_max_bytes", 4, 0x0d, BANK0, },
  596. { "sw_in_discards", 4, 0x10, PORT, },
  597. { "sw_in_filtered", 2, 0x12, PORT, },
  598. { "sw_out_filtered", 2, 0x13, PORT, },
  599. { "in_discards", 4, 0x00 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  600. { "in_filtered", 4, 0x01 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  601. { "in_accepted", 4, 0x02 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  602. { "in_bad_accepted", 4, 0x03 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  603. { "in_good_avb_class_a", 4, 0x04 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  604. { "in_good_avb_class_b", 4, 0x05 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  605. { "in_bad_avb_class_a", 4, 0x06 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  606. { "in_bad_avb_class_b", 4, 0x07 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  607. { "tcam_counter_0", 4, 0x08 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  608. { "tcam_counter_1", 4, 0x09 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  609. { "tcam_counter_2", 4, 0x0a | GLOBAL_STATS_OP_BANK_1, BANK1, },
  610. { "tcam_counter_3", 4, 0x0b | GLOBAL_STATS_OP_BANK_1, BANK1, },
  611. { "in_da_unknown", 4, 0x0e | GLOBAL_STATS_OP_BANK_1, BANK1, },
  612. { "in_management", 4, 0x0f | GLOBAL_STATS_OP_BANK_1, BANK1, },
  613. { "out_queue_0", 4, 0x10 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  614. { "out_queue_1", 4, 0x11 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  615. { "out_queue_2", 4, 0x12 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  616. { "out_queue_3", 4, 0x13 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  617. { "out_queue_4", 4, 0x14 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  618. { "out_queue_5", 4, 0x15 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  619. { "out_queue_6", 4, 0x16 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  620. { "out_queue_7", 4, 0x17 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  621. { "out_cut_through", 4, 0x18 | GLOBAL_STATS_OP_BANK_1, BANK1, },
  622. { "out_octets_a", 4, 0x1a | GLOBAL_STATS_OP_BANK_1, BANK1, },
  623. { "out_octets_b", 4, 0x1b | GLOBAL_STATS_OP_BANK_1, BANK1, },
  624. { "out_management", 4, 0x1f | GLOBAL_STATS_OP_BANK_1, BANK1, },
  625. };
  626. static bool mv88e6xxx_has_stat(struct mv88e6xxx_chip *chip,
  627. struct mv88e6xxx_hw_stat *stat)
  628. {
  629. switch (stat->type) {
  630. case BANK0:
  631. return true;
  632. case BANK1:
  633. return mv88e6xxx_6320_family(chip);
  634. case PORT:
  635. return mv88e6xxx_6095_family(chip) ||
  636. mv88e6xxx_6185_family(chip) ||
  637. mv88e6xxx_6097_family(chip) ||
  638. mv88e6xxx_6165_family(chip) ||
  639. mv88e6xxx_6351_family(chip) ||
  640. mv88e6xxx_6352_family(chip);
  641. }
  642. return false;
  643. }
  644. static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
  645. struct mv88e6xxx_hw_stat *s,
  646. int port)
  647. {
  648. u32 low;
  649. u32 high = 0;
  650. int ret;
  651. u64 value;
  652. switch (s->type) {
  653. case PORT:
  654. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), s->reg);
  655. if (ret < 0)
  656. return UINT64_MAX;
  657. low = ret;
  658. if (s->sizeof_stat == 4) {
  659. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port),
  660. s->reg + 1);
  661. if (ret < 0)
  662. return UINT64_MAX;
  663. high = ret;
  664. }
  665. break;
  666. case BANK0:
  667. case BANK1:
  668. _mv88e6xxx_stats_read(chip, s->reg, &low);
  669. if (s->sizeof_stat == 8)
  670. _mv88e6xxx_stats_read(chip, s->reg + 1, &high);
  671. }
  672. value = (((u64)high) << 16) | low;
  673. return value;
  674. }
  675. static void mv88e6xxx_get_strings(struct dsa_switch *ds, int port,
  676. uint8_t *data)
  677. {
  678. struct mv88e6xxx_chip *chip = ds->priv;
  679. struct mv88e6xxx_hw_stat *stat;
  680. int i, j;
  681. for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
  682. stat = &mv88e6xxx_hw_stats[i];
  683. if (mv88e6xxx_has_stat(chip, stat)) {
  684. memcpy(data + j * ETH_GSTRING_LEN, stat->string,
  685. ETH_GSTRING_LEN);
  686. j++;
  687. }
  688. }
  689. }
  690. static int mv88e6xxx_get_sset_count(struct dsa_switch *ds)
  691. {
  692. struct mv88e6xxx_chip *chip = ds->priv;
  693. struct mv88e6xxx_hw_stat *stat;
  694. int i, j;
  695. for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
  696. stat = &mv88e6xxx_hw_stats[i];
  697. if (mv88e6xxx_has_stat(chip, stat))
  698. j++;
  699. }
  700. return j;
  701. }
  702. static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
  703. uint64_t *data)
  704. {
  705. struct mv88e6xxx_chip *chip = ds->priv;
  706. struct mv88e6xxx_hw_stat *stat;
  707. int ret;
  708. int i, j;
  709. mutex_lock(&chip->reg_lock);
  710. ret = _mv88e6xxx_stats_snapshot(chip, port);
  711. if (ret < 0) {
  712. mutex_unlock(&chip->reg_lock);
  713. return;
  714. }
  715. for (i = 0, j = 0; i < ARRAY_SIZE(mv88e6xxx_hw_stats); i++) {
  716. stat = &mv88e6xxx_hw_stats[i];
  717. if (mv88e6xxx_has_stat(chip, stat)) {
  718. data[j] = _mv88e6xxx_get_ethtool_stat(chip, stat, port);
  719. j++;
  720. }
  721. }
  722. mutex_unlock(&chip->reg_lock);
  723. }
  724. static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
  725. {
  726. return 32 * sizeof(u16);
  727. }
  728. static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
  729. struct ethtool_regs *regs, void *_p)
  730. {
  731. struct mv88e6xxx_chip *chip = ds->priv;
  732. u16 *p = _p;
  733. int i;
  734. regs->version = 0;
  735. memset(p, 0xff, 32 * sizeof(u16));
  736. mutex_lock(&chip->reg_lock);
  737. for (i = 0; i < 32; i++) {
  738. int ret;
  739. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), i);
  740. if (ret >= 0)
  741. p[i] = ret;
  742. }
  743. mutex_unlock(&chip->reg_lock);
  744. }
  745. static int _mv88e6xxx_atu_wait(struct mv88e6xxx_chip *chip)
  746. {
  747. return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_ATU_OP,
  748. GLOBAL_ATU_OP_BUSY);
  749. }
  750. static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
  751. struct ethtool_eee *e)
  752. {
  753. struct mv88e6xxx_chip *chip = ds->priv;
  754. u16 reg;
  755. int err;
  756. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
  757. return -EOPNOTSUPP;
  758. mutex_lock(&chip->reg_lock);
  759. err = mv88e6xxx_phy_read(chip, port, 16, &reg);
  760. if (err)
  761. goto out;
  762. e->eee_enabled = !!(reg & 0x0200);
  763. e->tx_lpi_enabled = !!(reg & 0x0100);
  764. err = mv88e6xxx_read(chip, REG_PORT(port), PORT_STATUS, &reg);
  765. if (err)
  766. goto out;
  767. e->eee_active = !!(reg & PORT_STATUS_EEE);
  768. out:
  769. mutex_unlock(&chip->reg_lock);
  770. return err;
  771. }
  772. static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
  773. struct phy_device *phydev, struct ethtool_eee *e)
  774. {
  775. struct mv88e6xxx_chip *chip = ds->priv;
  776. u16 reg;
  777. int err;
  778. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_EEE))
  779. return -EOPNOTSUPP;
  780. mutex_lock(&chip->reg_lock);
  781. err = mv88e6xxx_phy_read(chip, port, 16, &reg);
  782. if (err)
  783. goto out;
  784. reg &= ~0x0300;
  785. if (e->eee_enabled)
  786. reg |= 0x0200;
  787. if (e->tx_lpi_enabled)
  788. reg |= 0x0100;
  789. err = mv88e6xxx_phy_write(chip, port, 16, reg);
  790. out:
  791. mutex_unlock(&chip->reg_lock);
  792. return err;
  793. }
  794. static int _mv88e6xxx_atu_cmd(struct mv88e6xxx_chip *chip, u16 fid, u16 cmd)
  795. {
  796. int ret;
  797. if (mv88e6xxx_has_fid_reg(chip)) {
  798. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_FID,
  799. fid);
  800. if (ret < 0)
  801. return ret;
  802. } else if (mv88e6xxx_num_databases(chip) == 256) {
  803. /* ATU DBNum[7:4] are located in ATU Control 15:12 */
  804. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL);
  805. if (ret < 0)
  806. return ret;
  807. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
  808. (ret & 0xfff) |
  809. ((fid << 8) & 0xf000));
  810. if (ret < 0)
  811. return ret;
  812. /* ATU DBNum[3:0] are located in ATU Operation 3:0 */
  813. cmd |= fid & 0xf;
  814. }
  815. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_OP, cmd);
  816. if (ret < 0)
  817. return ret;
  818. return _mv88e6xxx_atu_wait(chip);
  819. }
  820. static int _mv88e6xxx_atu_data_write(struct mv88e6xxx_chip *chip,
  821. struct mv88e6xxx_atu_entry *entry)
  822. {
  823. u16 data = entry->state & GLOBAL_ATU_DATA_STATE_MASK;
  824. if (entry->state != GLOBAL_ATU_DATA_STATE_UNUSED) {
  825. unsigned int mask, shift;
  826. if (entry->trunk) {
  827. data |= GLOBAL_ATU_DATA_TRUNK;
  828. mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK;
  829. shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT;
  830. } else {
  831. mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK;
  832. shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT;
  833. }
  834. data |= (entry->portv_trunkid << shift) & mask;
  835. }
  836. return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_ATU_DATA, data);
  837. }
  838. static int _mv88e6xxx_atu_flush_move(struct mv88e6xxx_chip *chip,
  839. struct mv88e6xxx_atu_entry *entry,
  840. bool static_too)
  841. {
  842. int op;
  843. int err;
  844. err = _mv88e6xxx_atu_wait(chip);
  845. if (err)
  846. return err;
  847. err = _mv88e6xxx_atu_data_write(chip, entry);
  848. if (err)
  849. return err;
  850. if (entry->fid) {
  851. op = static_too ? GLOBAL_ATU_OP_FLUSH_MOVE_ALL_DB :
  852. GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC_DB;
  853. } else {
  854. op = static_too ? GLOBAL_ATU_OP_FLUSH_MOVE_ALL :
  855. GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC;
  856. }
  857. return _mv88e6xxx_atu_cmd(chip, entry->fid, op);
  858. }
  859. static int _mv88e6xxx_atu_flush(struct mv88e6xxx_chip *chip,
  860. u16 fid, bool static_too)
  861. {
  862. struct mv88e6xxx_atu_entry entry = {
  863. .fid = fid,
  864. .state = 0, /* EntryState bits must be 0 */
  865. };
  866. return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
  867. }
  868. static int _mv88e6xxx_atu_move(struct mv88e6xxx_chip *chip, u16 fid,
  869. int from_port, int to_port, bool static_too)
  870. {
  871. struct mv88e6xxx_atu_entry entry = {
  872. .trunk = false,
  873. .fid = fid,
  874. };
  875. /* EntryState bits must be 0xF */
  876. entry.state = GLOBAL_ATU_DATA_STATE_MASK;
  877. /* ToPort and FromPort are respectively in PortVec bits 7:4 and 3:0 */
  878. entry.portv_trunkid = (to_port & 0x0f) << 4;
  879. entry.portv_trunkid |= from_port & 0x0f;
  880. return _mv88e6xxx_atu_flush_move(chip, &entry, static_too);
  881. }
  882. static int _mv88e6xxx_atu_remove(struct mv88e6xxx_chip *chip, u16 fid,
  883. int port, bool static_too)
  884. {
  885. /* Destination port 0xF means remove the entries */
  886. return _mv88e6xxx_atu_move(chip, fid, port, 0x0f, static_too);
  887. }
  888. static const char * const mv88e6xxx_port_state_names[] = {
  889. [PORT_CONTROL_STATE_DISABLED] = "Disabled",
  890. [PORT_CONTROL_STATE_BLOCKING] = "Blocking/Listening",
  891. [PORT_CONTROL_STATE_LEARNING] = "Learning",
  892. [PORT_CONTROL_STATE_FORWARDING] = "Forwarding",
  893. };
  894. static int _mv88e6xxx_port_state(struct mv88e6xxx_chip *chip, int port,
  895. u8 state)
  896. {
  897. struct dsa_switch *ds = chip->ds;
  898. int reg, ret = 0;
  899. u8 oldstate;
  900. reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL);
  901. if (reg < 0)
  902. return reg;
  903. oldstate = reg & PORT_CONTROL_STATE_MASK;
  904. if (oldstate != state) {
  905. /* Flush forwarding database if we're moving a port
  906. * from Learning or Forwarding state to Disabled or
  907. * Blocking or Listening state.
  908. */
  909. if ((oldstate == PORT_CONTROL_STATE_LEARNING ||
  910. oldstate == PORT_CONTROL_STATE_FORWARDING) &&
  911. (state == PORT_CONTROL_STATE_DISABLED ||
  912. state == PORT_CONTROL_STATE_BLOCKING)) {
  913. ret = _mv88e6xxx_atu_remove(chip, 0, port, false);
  914. if (ret)
  915. return ret;
  916. }
  917. reg = (reg & ~PORT_CONTROL_STATE_MASK) | state;
  918. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL,
  919. reg);
  920. if (ret)
  921. return ret;
  922. netdev_dbg(ds->ports[port].netdev, "PortState %s (was %s)\n",
  923. mv88e6xxx_port_state_names[state],
  924. mv88e6xxx_port_state_names[oldstate]);
  925. }
  926. return ret;
  927. }
  928. static int _mv88e6xxx_port_based_vlan_map(struct mv88e6xxx_chip *chip, int port)
  929. {
  930. struct net_device *bridge = chip->ports[port].bridge_dev;
  931. const u16 mask = (1 << chip->info->num_ports) - 1;
  932. struct dsa_switch *ds = chip->ds;
  933. u16 output_ports = 0;
  934. int reg;
  935. int i;
  936. /* allow CPU port or DSA link(s) to send frames to every port */
  937. if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
  938. output_ports = mask;
  939. } else {
  940. for (i = 0; i < chip->info->num_ports; ++i) {
  941. /* allow sending frames to every group member */
  942. if (bridge && chip->ports[i].bridge_dev == bridge)
  943. output_ports |= BIT(i);
  944. /* allow sending frames to CPU port and DSA link(s) */
  945. if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
  946. output_ports |= BIT(i);
  947. }
  948. }
  949. /* prevent frames from going back out of the port they came in on */
  950. output_ports &= ~BIT(port);
  951. reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
  952. if (reg < 0)
  953. return reg;
  954. reg &= ~mask;
  955. reg |= output_ports & mask;
  956. return _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN, reg);
  957. }
  958. static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
  959. u8 state)
  960. {
  961. struct mv88e6xxx_chip *chip = ds->priv;
  962. int stp_state;
  963. int err;
  964. switch (state) {
  965. case BR_STATE_DISABLED:
  966. stp_state = PORT_CONTROL_STATE_DISABLED;
  967. break;
  968. case BR_STATE_BLOCKING:
  969. case BR_STATE_LISTENING:
  970. stp_state = PORT_CONTROL_STATE_BLOCKING;
  971. break;
  972. case BR_STATE_LEARNING:
  973. stp_state = PORT_CONTROL_STATE_LEARNING;
  974. break;
  975. case BR_STATE_FORWARDING:
  976. default:
  977. stp_state = PORT_CONTROL_STATE_FORWARDING;
  978. break;
  979. }
  980. mutex_lock(&chip->reg_lock);
  981. err = _mv88e6xxx_port_state(chip, port, stp_state);
  982. mutex_unlock(&chip->reg_lock);
  983. if (err)
  984. netdev_err(ds->ports[port].netdev,
  985. "failed to update state to %s\n",
  986. mv88e6xxx_port_state_names[stp_state]);
  987. }
  988. static int _mv88e6xxx_port_pvid(struct mv88e6xxx_chip *chip, int port,
  989. u16 *new, u16 *old)
  990. {
  991. struct dsa_switch *ds = chip->ds;
  992. u16 pvid;
  993. int ret;
  994. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_DEFAULT_VLAN);
  995. if (ret < 0)
  996. return ret;
  997. pvid = ret & PORT_DEFAULT_VLAN_MASK;
  998. if (new) {
  999. ret &= ~PORT_DEFAULT_VLAN_MASK;
  1000. ret |= *new & PORT_DEFAULT_VLAN_MASK;
  1001. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  1002. PORT_DEFAULT_VLAN, ret);
  1003. if (ret < 0)
  1004. return ret;
  1005. netdev_dbg(ds->ports[port].netdev,
  1006. "DefaultVID %d (was %d)\n", *new, pvid);
  1007. }
  1008. if (old)
  1009. *old = pvid;
  1010. return 0;
  1011. }
  1012. static int _mv88e6xxx_port_pvid_get(struct mv88e6xxx_chip *chip,
  1013. int port, u16 *pvid)
  1014. {
  1015. return _mv88e6xxx_port_pvid(chip, port, NULL, pvid);
  1016. }
  1017. static int _mv88e6xxx_port_pvid_set(struct mv88e6xxx_chip *chip,
  1018. int port, u16 pvid)
  1019. {
  1020. return _mv88e6xxx_port_pvid(chip, port, &pvid, NULL);
  1021. }
  1022. static int _mv88e6xxx_vtu_wait(struct mv88e6xxx_chip *chip)
  1023. {
  1024. return mv88e6xxx_wait(chip, REG_GLOBAL, GLOBAL_VTU_OP,
  1025. GLOBAL_VTU_OP_BUSY);
  1026. }
  1027. static int _mv88e6xxx_vtu_cmd(struct mv88e6xxx_chip *chip, u16 op)
  1028. {
  1029. int ret;
  1030. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_OP, op);
  1031. if (ret < 0)
  1032. return ret;
  1033. return _mv88e6xxx_vtu_wait(chip);
  1034. }
  1035. static int _mv88e6xxx_vtu_stu_flush(struct mv88e6xxx_chip *chip)
  1036. {
  1037. int ret;
  1038. ret = _mv88e6xxx_vtu_wait(chip);
  1039. if (ret < 0)
  1040. return ret;
  1041. return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_FLUSH_ALL);
  1042. }
  1043. static int _mv88e6xxx_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
  1044. struct mv88e6xxx_vtu_stu_entry *entry,
  1045. unsigned int nibble_offset)
  1046. {
  1047. u16 regs[3];
  1048. int i;
  1049. int ret;
  1050. for (i = 0; i < 3; ++i) {
  1051. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
  1052. GLOBAL_VTU_DATA_0_3 + i);
  1053. if (ret < 0)
  1054. return ret;
  1055. regs[i] = ret;
  1056. }
  1057. for (i = 0; i < chip->info->num_ports; ++i) {
  1058. unsigned int shift = (i % 4) * 4 + nibble_offset;
  1059. u16 reg = regs[i / 4];
  1060. entry->data[i] = (reg >> shift) & GLOBAL_VTU_STU_DATA_MASK;
  1061. }
  1062. return 0;
  1063. }
  1064. static int mv88e6xxx_vtu_data_read(struct mv88e6xxx_chip *chip,
  1065. struct mv88e6xxx_vtu_stu_entry *entry)
  1066. {
  1067. return _mv88e6xxx_vtu_stu_data_read(chip, entry, 0);
  1068. }
  1069. static int mv88e6xxx_stu_data_read(struct mv88e6xxx_chip *chip,
  1070. struct mv88e6xxx_vtu_stu_entry *entry)
  1071. {
  1072. return _mv88e6xxx_vtu_stu_data_read(chip, entry, 2);
  1073. }
  1074. static int _mv88e6xxx_vtu_stu_data_write(struct mv88e6xxx_chip *chip,
  1075. struct mv88e6xxx_vtu_stu_entry *entry,
  1076. unsigned int nibble_offset)
  1077. {
  1078. u16 regs[3] = { 0 };
  1079. int i;
  1080. int ret;
  1081. for (i = 0; i < chip->info->num_ports; ++i) {
  1082. unsigned int shift = (i % 4) * 4 + nibble_offset;
  1083. u8 data = entry->data[i];
  1084. regs[i / 4] |= (data & GLOBAL_VTU_STU_DATA_MASK) << shift;
  1085. }
  1086. for (i = 0; i < 3; ++i) {
  1087. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL,
  1088. GLOBAL_VTU_DATA_0_3 + i, regs[i]);
  1089. if (ret < 0)
  1090. return ret;
  1091. }
  1092. return 0;
  1093. }
  1094. static int mv88e6xxx_vtu_data_write(struct mv88e6xxx_chip *chip,
  1095. struct mv88e6xxx_vtu_stu_entry *entry)
  1096. {
  1097. return _mv88e6xxx_vtu_stu_data_write(chip, entry, 0);
  1098. }
  1099. static int mv88e6xxx_stu_data_write(struct mv88e6xxx_chip *chip,
  1100. struct mv88e6xxx_vtu_stu_entry *entry)
  1101. {
  1102. return _mv88e6xxx_vtu_stu_data_write(chip, entry, 2);
  1103. }
  1104. static int _mv88e6xxx_vtu_vid_write(struct mv88e6xxx_chip *chip, u16 vid)
  1105. {
  1106. return _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID,
  1107. vid & GLOBAL_VTU_VID_MASK);
  1108. }
  1109. static int _mv88e6xxx_vtu_getnext(struct mv88e6xxx_chip *chip,
  1110. struct mv88e6xxx_vtu_stu_entry *entry)
  1111. {
  1112. struct mv88e6xxx_vtu_stu_entry next = { 0 };
  1113. int ret;
  1114. ret = _mv88e6xxx_vtu_wait(chip);
  1115. if (ret < 0)
  1116. return ret;
  1117. ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_VTU_GET_NEXT);
  1118. if (ret < 0)
  1119. return ret;
  1120. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
  1121. if (ret < 0)
  1122. return ret;
  1123. next.vid = ret & GLOBAL_VTU_VID_MASK;
  1124. next.valid = !!(ret & GLOBAL_VTU_VID_VALID);
  1125. if (next.valid) {
  1126. ret = mv88e6xxx_vtu_data_read(chip, &next);
  1127. if (ret < 0)
  1128. return ret;
  1129. if (mv88e6xxx_has_fid_reg(chip)) {
  1130. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
  1131. GLOBAL_VTU_FID);
  1132. if (ret < 0)
  1133. return ret;
  1134. next.fid = ret & GLOBAL_VTU_FID_MASK;
  1135. } else if (mv88e6xxx_num_databases(chip) == 256) {
  1136. /* VTU DBNum[7:4] are located in VTU Operation 11:8, and
  1137. * VTU DBNum[3:0] are located in VTU Operation 3:0
  1138. */
  1139. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
  1140. GLOBAL_VTU_OP);
  1141. if (ret < 0)
  1142. return ret;
  1143. next.fid = (ret & 0xf00) >> 4;
  1144. next.fid |= ret & 0xf;
  1145. }
  1146. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
  1147. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
  1148. GLOBAL_VTU_SID);
  1149. if (ret < 0)
  1150. return ret;
  1151. next.sid = ret & GLOBAL_VTU_SID_MASK;
  1152. }
  1153. }
  1154. *entry = next;
  1155. return 0;
  1156. }
  1157. static int mv88e6xxx_port_vlan_dump(struct dsa_switch *ds, int port,
  1158. struct switchdev_obj_port_vlan *vlan,
  1159. int (*cb)(struct switchdev_obj *obj))
  1160. {
  1161. struct mv88e6xxx_chip *chip = ds->priv;
  1162. struct mv88e6xxx_vtu_stu_entry next;
  1163. u16 pvid;
  1164. int err;
  1165. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
  1166. return -EOPNOTSUPP;
  1167. mutex_lock(&chip->reg_lock);
  1168. err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
  1169. if (err)
  1170. goto unlock;
  1171. err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
  1172. if (err)
  1173. goto unlock;
  1174. do {
  1175. err = _mv88e6xxx_vtu_getnext(chip, &next);
  1176. if (err)
  1177. break;
  1178. if (!next.valid)
  1179. break;
  1180. if (next.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
  1181. continue;
  1182. /* reinit and dump this VLAN obj */
  1183. vlan->vid_begin = next.vid;
  1184. vlan->vid_end = next.vid;
  1185. vlan->flags = 0;
  1186. if (next.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED)
  1187. vlan->flags |= BRIDGE_VLAN_INFO_UNTAGGED;
  1188. if (next.vid == pvid)
  1189. vlan->flags |= BRIDGE_VLAN_INFO_PVID;
  1190. err = cb(&vlan->obj);
  1191. if (err)
  1192. break;
  1193. } while (next.vid < GLOBAL_VTU_VID_MASK);
  1194. unlock:
  1195. mutex_unlock(&chip->reg_lock);
  1196. return err;
  1197. }
  1198. static int _mv88e6xxx_vtu_loadpurge(struct mv88e6xxx_chip *chip,
  1199. struct mv88e6xxx_vtu_stu_entry *entry)
  1200. {
  1201. u16 op = GLOBAL_VTU_OP_VTU_LOAD_PURGE;
  1202. u16 reg = 0;
  1203. int ret;
  1204. ret = _mv88e6xxx_vtu_wait(chip);
  1205. if (ret < 0)
  1206. return ret;
  1207. if (!entry->valid)
  1208. goto loadpurge;
  1209. /* Write port member tags */
  1210. ret = mv88e6xxx_vtu_data_write(chip, entry);
  1211. if (ret < 0)
  1212. return ret;
  1213. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_STU)) {
  1214. reg = entry->sid & GLOBAL_VTU_SID_MASK;
  1215. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
  1216. reg);
  1217. if (ret < 0)
  1218. return ret;
  1219. }
  1220. if (mv88e6xxx_has_fid_reg(chip)) {
  1221. reg = entry->fid & GLOBAL_VTU_FID_MASK;
  1222. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_FID,
  1223. reg);
  1224. if (ret < 0)
  1225. return ret;
  1226. } else if (mv88e6xxx_num_databases(chip) == 256) {
  1227. /* VTU DBNum[7:4] are located in VTU Operation 11:8, and
  1228. * VTU DBNum[3:0] are located in VTU Operation 3:0
  1229. */
  1230. op |= (entry->fid & 0xf0) << 8;
  1231. op |= entry->fid & 0xf;
  1232. }
  1233. reg = GLOBAL_VTU_VID_VALID;
  1234. loadpurge:
  1235. reg |= entry->vid & GLOBAL_VTU_VID_MASK;
  1236. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
  1237. if (ret < 0)
  1238. return ret;
  1239. return _mv88e6xxx_vtu_cmd(chip, op);
  1240. }
  1241. static int _mv88e6xxx_stu_getnext(struct mv88e6xxx_chip *chip, u8 sid,
  1242. struct mv88e6xxx_vtu_stu_entry *entry)
  1243. {
  1244. struct mv88e6xxx_vtu_stu_entry next = { 0 };
  1245. int ret;
  1246. ret = _mv88e6xxx_vtu_wait(chip);
  1247. if (ret < 0)
  1248. return ret;
  1249. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID,
  1250. sid & GLOBAL_VTU_SID_MASK);
  1251. if (ret < 0)
  1252. return ret;
  1253. ret = _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_GET_NEXT);
  1254. if (ret < 0)
  1255. return ret;
  1256. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_SID);
  1257. if (ret < 0)
  1258. return ret;
  1259. next.sid = ret & GLOBAL_VTU_SID_MASK;
  1260. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_VTU_VID);
  1261. if (ret < 0)
  1262. return ret;
  1263. next.valid = !!(ret & GLOBAL_VTU_VID_VALID);
  1264. if (next.valid) {
  1265. ret = mv88e6xxx_stu_data_read(chip, &next);
  1266. if (ret < 0)
  1267. return ret;
  1268. }
  1269. *entry = next;
  1270. return 0;
  1271. }
  1272. static int _mv88e6xxx_stu_loadpurge(struct mv88e6xxx_chip *chip,
  1273. struct mv88e6xxx_vtu_stu_entry *entry)
  1274. {
  1275. u16 reg = 0;
  1276. int ret;
  1277. ret = _mv88e6xxx_vtu_wait(chip);
  1278. if (ret < 0)
  1279. return ret;
  1280. if (!entry->valid)
  1281. goto loadpurge;
  1282. /* Write port states */
  1283. ret = mv88e6xxx_stu_data_write(chip, entry);
  1284. if (ret < 0)
  1285. return ret;
  1286. reg = GLOBAL_VTU_VID_VALID;
  1287. loadpurge:
  1288. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_VID, reg);
  1289. if (ret < 0)
  1290. return ret;
  1291. reg = entry->sid & GLOBAL_VTU_SID_MASK;
  1292. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_VTU_SID, reg);
  1293. if (ret < 0)
  1294. return ret;
  1295. return _mv88e6xxx_vtu_cmd(chip, GLOBAL_VTU_OP_STU_LOAD_PURGE);
  1296. }
  1297. static int _mv88e6xxx_port_fid(struct mv88e6xxx_chip *chip, int port,
  1298. u16 *new, u16 *old)
  1299. {
  1300. struct dsa_switch *ds = chip->ds;
  1301. u16 upper_mask;
  1302. u16 fid;
  1303. int ret;
  1304. if (mv88e6xxx_num_databases(chip) == 4096)
  1305. upper_mask = 0xff;
  1306. else if (mv88e6xxx_num_databases(chip) == 256)
  1307. upper_mask = 0xf;
  1308. else
  1309. return -EOPNOTSUPP;
  1310. /* Port's default FID bits 3:0 are located in reg 0x06, offset 12 */
  1311. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_BASE_VLAN);
  1312. if (ret < 0)
  1313. return ret;
  1314. fid = (ret & PORT_BASE_VLAN_FID_3_0_MASK) >> 12;
  1315. if (new) {
  1316. ret &= ~PORT_BASE_VLAN_FID_3_0_MASK;
  1317. ret |= (*new << 12) & PORT_BASE_VLAN_FID_3_0_MASK;
  1318. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_BASE_VLAN,
  1319. ret);
  1320. if (ret < 0)
  1321. return ret;
  1322. }
  1323. /* Port's default FID bits 11:4 are located in reg 0x05, offset 0 */
  1324. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_1);
  1325. if (ret < 0)
  1326. return ret;
  1327. fid |= (ret & upper_mask) << 4;
  1328. if (new) {
  1329. ret &= ~upper_mask;
  1330. ret |= (*new >> 4) & upper_mask;
  1331. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
  1332. ret);
  1333. if (ret < 0)
  1334. return ret;
  1335. netdev_dbg(ds->ports[port].netdev,
  1336. "FID %d (was %d)\n", *new, fid);
  1337. }
  1338. if (old)
  1339. *old = fid;
  1340. return 0;
  1341. }
  1342. static int _mv88e6xxx_port_fid_get(struct mv88e6xxx_chip *chip,
  1343. int port, u16 *fid)
  1344. {
  1345. return _mv88e6xxx_port_fid(chip, port, NULL, fid);
  1346. }
  1347. static int _mv88e6xxx_port_fid_set(struct mv88e6xxx_chip *chip,
  1348. int port, u16 fid)
  1349. {
  1350. return _mv88e6xxx_port_fid(chip, port, &fid, NULL);
  1351. }
  1352. static int _mv88e6xxx_fid_new(struct mv88e6xxx_chip *chip, u16 *fid)
  1353. {
  1354. DECLARE_BITMAP(fid_bitmap, MV88E6XXX_N_FID);
  1355. struct mv88e6xxx_vtu_stu_entry vlan;
  1356. int i, err;
  1357. bitmap_zero(fid_bitmap, MV88E6XXX_N_FID);
  1358. /* Set every FID bit used by the (un)bridged ports */
  1359. for (i = 0; i < chip->info->num_ports; ++i) {
  1360. err = _mv88e6xxx_port_fid_get(chip, i, fid);
  1361. if (err)
  1362. return err;
  1363. set_bit(*fid, fid_bitmap);
  1364. }
  1365. /* Set every FID bit used by the VLAN entries */
  1366. err = _mv88e6xxx_vtu_vid_write(chip, GLOBAL_VTU_VID_MASK);
  1367. if (err)
  1368. return err;
  1369. do {
  1370. err = _mv88e6xxx_vtu_getnext(chip, &vlan);
  1371. if (err)
  1372. return err;
  1373. if (!vlan.valid)
  1374. break;
  1375. set_bit(vlan.fid, fid_bitmap);
  1376. } while (vlan.vid < GLOBAL_VTU_VID_MASK);
  1377. /* The reset value 0x000 is used to indicate that multiple address
  1378. * databases are not needed. Return the next positive available.
  1379. */
  1380. *fid = find_next_zero_bit(fid_bitmap, MV88E6XXX_N_FID, 1);
  1381. if (unlikely(*fid >= mv88e6xxx_num_databases(chip)))
  1382. return -ENOSPC;
  1383. /* Clear the database */
  1384. return _mv88e6xxx_atu_flush(chip, *fid, true);
  1385. }
  1386. static int _mv88e6xxx_vtu_new(struct mv88e6xxx_chip *chip, u16 vid,
  1387. struct mv88e6xxx_vtu_stu_entry *entry)
  1388. {
  1389. struct dsa_switch *ds = chip->ds;
  1390. struct mv88e6xxx_vtu_stu_entry vlan = {
  1391. .valid = true,
  1392. .vid = vid,
  1393. };
  1394. int i, err;
  1395. err = _mv88e6xxx_fid_new(chip, &vlan.fid);
  1396. if (err)
  1397. return err;
  1398. /* exclude all ports except the CPU and DSA ports */
  1399. for (i = 0; i < chip->info->num_ports; ++i)
  1400. vlan.data[i] = dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i)
  1401. ? GLOBAL_VTU_DATA_MEMBER_TAG_UNMODIFIED
  1402. : GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;
  1403. if (mv88e6xxx_6097_family(chip) || mv88e6xxx_6165_family(chip) ||
  1404. mv88e6xxx_6351_family(chip) || mv88e6xxx_6352_family(chip)) {
  1405. struct mv88e6xxx_vtu_stu_entry vstp;
  1406. /* Adding a VTU entry requires a valid STU entry. As VSTP is not
  1407. * implemented, only one STU entry is needed to cover all VTU
  1408. * entries. Thus, validate the SID 0.
  1409. */
  1410. vlan.sid = 0;
  1411. err = _mv88e6xxx_stu_getnext(chip, GLOBAL_VTU_SID_MASK, &vstp);
  1412. if (err)
  1413. return err;
  1414. if (vstp.sid != vlan.sid || !vstp.valid) {
  1415. memset(&vstp, 0, sizeof(vstp));
  1416. vstp.valid = true;
  1417. vstp.sid = vlan.sid;
  1418. err = _mv88e6xxx_stu_loadpurge(chip, &vstp);
  1419. if (err)
  1420. return err;
  1421. }
  1422. }
  1423. *entry = vlan;
  1424. return 0;
  1425. }
  1426. static int _mv88e6xxx_vtu_get(struct mv88e6xxx_chip *chip, u16 vid,
  1427. struct mv88e6xxx_vtu_stu_entry *entry, bool creat)
  1428. {
  1429. int err;
  1430. if (!vid)
  1431. return -EINVAL;
  1432. err = _mv88e6xxx_vtu_vid_write(chip, vid - 1);
  1433. if (err)
  1434. return err;
  1435. err = _mv88e6xxx_vtu_getnext(chip, entry);
  1436. if (err)
  1437. return err;
  1438. if (entry->vid != vid || !entry->valid) {
  1439. if (!creat)
  1440. return -EOPNOTSUPP;
  1441. /* -ENOENT would've been more appropriate, but switchdev expects
  1442. * -EOPNOTSUPP to inform bridge about an eventual software VLAN.
  1443. */
  1444. err = _mv88e6xxx_vtu_new(chip, vid, entry);
  1445. }
  1446. return err;
  1447. }
  1448. static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
  1449. u16 vid_begin, u16 vid_end)
  1450. {
  1451. struct mv88e6xxx_chip *chip = ds->priv;
  1452. struct mv88e6xxx_vtu_stu_entry vlan;
  1453. int i, err;
  1454. if (!vid_begin)
  1455. return -EOPNOTSUPP;
  1456. mutex_lock(&chip->reg_lock);
  1457. err = _mv88e6xxx_vtu_vid_write(chip, vid_begin - 1);
  1458. if (err)
  1459. goto unlock;
  1460. do {
  1461. err = _mv88e6xxx_vtu_getnext(chip, &vlan);
  1462. if (err)
  1463. goto unlock;
  1464. if (!vlan.valid)
  1465. break;
  1466. if (vlan.vid > vid_end)
  1467. break;
  1468. for (i = 0; i < chip->info->num_ports; ++i) {
  1469. if (dsa_is_dsa_port(ds, i) || dsa_is_cpu_port(ds, i))
  1470. continue;
  1471. if (vlan.data[i] ==
  1472. GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
  1473. continue;
  1474. if (chip->ports[i].bridge_dev ==
  1475. chip->ports[port].bridge_dev)
  1476. break; /* same bridge, check next VLAN */
  1477. netdev_warn(ds->ports[port].netdev,
  1478. "hardware VLAN %d already used by %s\n",
  1479. vlan.vid,
  1480. netdev_name(chip->ports[i].bridge_dev));
  1481. err = -EOPNOTSUPP;
  1482. goto unlock;
  1483. }
  1484. } while (vlan.vid < vid_end);
  1485. unlock:
  1486. mutex_unlock(&chip->reg_lock);
  1487. return err;
  1488. }
  1489. static const char * const mv88e6xxx_port_8021q_mode_names[] = {
  1490. [PORT_CONTROL_2_8021Q_DISABLED] = "Disabled",
  1491. [PORT_CONTROL_2_8021Q_FALLBACK] = "Fallback",
  1492. [PORT_CONTROL_2_8021Q_CHECK] = "Check",
  1493. [PORT_CONTROL_2_8021Q_SECURE] = "Secure",
  1494. };
  1495. static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
  1496. bool vlan_filtering)
  1497. {
  1498. struct mv88e6xxx_chip *chip = ds->priv;
  1499. u16 old, new = vlan_filtering ? PORT_CONTROL_2_8021Q_SECURE :
  1500. PORT_CONTROL_2_8021Q_DISABLED;
  1501. int ret;
  1502. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
  1503. return -EOPNOTSUPP;
  1504. mutex_lock(&chip->reg_lock);
  1505. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_CONTROL_2);
  1506. if (ret < 0)
  1507. goto unlock;
  1508. old = ret & PORT_CONTROL_2_8021Q_MASK;
  1509. if (new != old) {
  1510. ret &= ~PORT_CONTROL_2_8021Q_MASK;
  1511. ret |= new & PORT_CONTROL_2_8021Q_MASK;
  1512. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_2,
  1513. ret);
  1514. if (ret < 0)
  1515. goto unlock;
  1516. netdev_dbg(ds->ports[port].netdev, "802.1Q Mode %s (was %s)\n",
  1517. mv88e6xxx_port_8021q_mode_names[new],
  1518. mv88e6xxx_port_8021q_mode_names[old]);
  1519. }
  1520. ret = 0;
  1521. unlock:
  1522. mutex_unlock(&chip->reg_lock);
  1523. return ret;
  1524. }
  1525. static int
  1526. mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
  1527. const struct switchdev_obj_port_vlan *vlan,
  1528. struct switchdev_trans *trans)
  1529. {
  1530. struct mv88e6xxx_chip *chip = ds->priv;
  1531. int err;
  1532. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
  1533. return -EOPNOTSUPP;
  1534. /* If the requested port doesn't belong to the same bridge as the VLAN
  1535. * members, do not support it (yet) and fallback to software VLAN.
  1536. */
  1537. err = mv88e6xxx_port_check_hw_vlan(ds, port, vlan->vid_begin,
  1538. vlan->vid_end);
  1539. if (err)
  1540. return err;
  1541. /* We don't need any dynamic resource from the kernel (yet),
  1542. * so skip the prepare phase.
  1543. */
  1544. return 0;
  1545. }
  1546. static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
  1547. u16 vid, bool untagged)
  1548. {
  1549. struct mv88e6xxx_vtu_stu_entry vlan;
  1550. int err;
  1551. err = _mv88e6xxx_vtu_get(chip, vid, &vlan, true);
  1552. if (err)
  1553. return err;
  1554. vlan.data[port] = untagged ?
  1555. GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED :
  1556. GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED;
  1557. return _mv88e6xxx_vtu_loadpurge(chip, &vlan);
  1558. }
  1559. static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
  1560. const struct switchdev_obj_port_vlan *vlan,
  1561. struct switchdev_trans *trans)
  1562. {
  1563. struct mv88e6xxx_chip *chip = ds->priv;
  1564. bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
  1565. bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
  1566. u16 vid;
  1567. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
  1568. return;
  1569. mutex_lock(&chip->reg_lock);
  1570. for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
  1571. if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
  1572. netdev_err(ds->ports[port].netdev,
  1573. "failed to add VLAN %d%c\n",
  1574. vid, untagged ? 'u' : 't');
  1575. if (pvid && _mv88e6xxx_port_pvid_set(chip, port, vlan->vid_end))
  1576. netdev_err(ds->ports[port].netdev, "failed to set PVID %d\n",
  1577. vlan->vid_end);
  1578. mutex_unlock(&chip->reg_lock);
  1579. }
  1580. static int _mv88e6xxx_port_vlan_del(struct mv88e6xxx_chip *chip,
  1581. int port, u16 vid)
  1582. {
  1583. struct dsa_switch *ds = chip->ds;
  1584. struct mv88e6xxx_vtu_stu_entry vlan;
  1585. int i, err;
  1586. err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
  1587. if (err)
  1588. return err;
  1589. /* Tell switchdev if this VLAN is handled in software */
  1590. if (vlan.data[port] == GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER)
  1591. return -EOPNOTSUPP;
  1592. vlan.data[port] = GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER;
  1593. /* keep the VLAN unless all ports are excluded */
  1594. vlan.valid = false;
  1595. for (i = 0; i < chip->info->num_ports; ++i) {
  1596. if (dsa_is_cpu_port(ds, i) || dsa_is_dsa_port(ds, i))
  1597. continue;
  1598. if (vlan.data[i] != GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER) {
  1599. vlan.valid = true;
  1600. break;
  1601. }
  1602. }
  1603. err = _mv88e6xxx_vtu_loadpurge(chip, &vlan);
  1604. if (err)
  1605. return err;
  1606. return _mv88e6xxx_atu_remove(chip, vlan.fid, port, false);
  1607. }
  1608. static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
  1609. const struct switchdev_obj_port_vlan *vlan)
  1610. {
  1611. struct mv88e6xxx_chip *chip = ds->priv;
  1612. u16 pvid, vid;
  1613. int err = 0;
  1614. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_VTU))
  1615. return -EOPNOTSUPP;
  1616. mutex_lock(&chip->reg_lock);
  1617. err = _mv88e6xxx_port_pvid_get(chip, port, &pvid);
  1618. if (err)
  1619. goto unlock;
  1620. for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
  1621. err = _mv88e6xxx_port_vlan_del(chip, port, vid);
  1622. if (err)
  1623. goto unlock;
  1624. if (vid == pvid) {
  1625. err = _mv88e6xxx_port_pvid_set(chip, port, 0);
  1626. if (err)
  1627. goto unlock;
  1628. }
  1629. }
  1630. unlock:
  1631. mutex_unlock(&chip->reg_lock);
  1632. return err;
  1633. }
  1634. static int _mv88e6xxx_atu_mac_write(struct mv88e6xxx_chip *chip,
  1635. const unsigned char *addr)
  1636. {
  1637. int i, ret;
  1638. for (i = 0; i < 3; i++) {
  1639. ret = _mv88e6xxx_reg_write(
  1640. chip, REG_GLOBAL, GLOBAL_ATU_MAC_01 + i,
  1641. (addr[i * 2] << 8) | addr[i * 2 + 1]);
  1642. if (ret < 0)
  1643. return ret;
  1644. }
  1645. return 0;
  1646. }
  1647. static int _mv88e6xxx_atu_mac_read(struct mv88e6xxx_chip *chip,
  1648. unsigned char *addr)
  1649. {
  1650. int i, ret;
  1651. for (i = 0; i < 3; i++) {
  1652. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL,
  1653. GLOBAL_ATU_MAC_01 + i);
  1654. if (ret < 0)
  1655. return ret;
  1656. addr[i * 2] = ret >> 8;
  1657. addr[i * 2 + 1] = ret & 0xff;
  1658. }
  1659. return 0;
  1660. }
  1661. static int _mv88e6xxx_atu_load(struct mv88e6xxx_chip *chip,
  1662. struct mv88e6xxx_atu_entry *entry)
  1663. {
  1664. int ret;
  1665. ret = _mv88e6xxx_atu_wait(chip);
  1666. if (ret < 0)
  1667. return ret;
  1668. ret = _mv88e6xxx_atu_mac_write(chip, entry->mac);
  1669. if (ret < 0)
  1670. return ret;
  1671. ret = _mv88e6xxx_atu_data_write(chip, entry);
  1672. if (ret < 0)
  1673. return ret;
  1674. return _mv88e6xxx_atu_cmd(chip, entry->fid, GLOBAL_ATU_OP_LOAD_DB);
  1675. }
  1676. static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
  1677. const unsigned char *addr, u16 vid,
  1678. u8 state)
  1679. {
  1680. struct mv88e6xxx_atu_entry entry = { 0 };
  1681. struct mv88e6xxx_vtu_stu_entry vlan;
  1682. int err;
  1683. /* Null VLAN ID corresponds to the port private database */
  1684. if (vid == 0)
  1685. err = _mv88e6xxx_port_fid_get(chip, port, &vlan.fid);
  1686. else
  1687. err = _mv88e6xxx_vtu_get(chip, vid, &vlan, false);
  1688. if (err)
  1689. return err;
  1690. entry.fid = vlan.fid;
  1691. entry.state = state;
  1692. ether_addr_copy(entry.mac, addr);
  1693. if (state != GLOBAL_ATU_DATA_STATE_UNUSED) {
  1694. entry.trunk = false;
  1695. entry.portv_trunkid = BIT(port);
  1696. }
  1697. return _mv88e6xxx_atu_load(chip, &entry);
  1698. }
  1699. static int mv88e6xxx_port_fdb_prepare(struct dsa_switch *ds, int port,
  1700. const struct switchdev_obj_port_fdb *fdb,
  1701. struct switchdev_trans *trans)
  1702. {
  1703. /* We don't need any dynamic resource from the kernel (yet),
  1704. * so skip the prepare phase.
  1705. */
  1706. return 0;
  1707. }
  1708. static void mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
  1709. const struct switchdev_obj_port_fdb *fdb,
  1710. struct switchdev_trans *trans)
  1711. {
  1712. struct mv88e6xxx_chip *chip = ds->priv;
  1713. mutex_lock(&chip->reg_lock);
  1714. if (mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
  1715. GLOBAL_ATU_DATA_STATE_UC_STATIC))
  1716. netdev_err(ds->ports[port].netdev, "failed to load unicast MAC address\n");
  1717. mutex_unlock(&chip->reg_lock);
  1718. }
  1719. static int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
  1720. const struct switchdev_obj_port_fdb *fdb)
  1721. {
  1722. struct mv88e6xxx_chip *chip = ds->priv;
  1723. int err;
  1724. mutex_lock(&chip->reg_lock);
  1725. err = mv88e6xxx_port_db_load_purge(chip, port, fdb->addr, fdb->vid,
  1726. GLOBAL_ATU_DATA_STATE_UNUSED);
  1727. mutex_unlock(&chip->reg_lock);
  1728. return err;
  1729. }
  1730. static int _mv88e6xxx_atu_getnext(struct mv88e6xxx_chip *chip, u16 fid,
  1731. struct mv88e6xxx_atu_entry *entry)
  1732. {
  1733. struct mv88e6xxx_atu_entry next = { 0 };
  1734. int ret;
  1735. next.fid = fid;
  1736. ret = _mv88e6xxx_atu_wait(chip);
  1737. if (ret < 0)
  1738. return ret;
  1739. ret = _mv88e6xxx_atu_cmd(chip, fid, GLOBAL_ATU_OP_GET_NEXT_DB);
  1740. if (ret < 0)
  1741. return ret;
  1742. ret = _mv88e6xxx_atu_mac_read(chip, next.mac);
  1743. if (ret < 0)
  1744. return ret;
  1745. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_ATU_DATA);
  1746. if (ret < 0)
  1747. return ret;
  1748. next.state = ret & GLOBAL_ATU_DATA_STATE_MASK;
  1749. if (next.state != GLOBAL_ATU_DATA_STATE_UNUSED) {
  1750. unsigned int mask, shift;
  1751. if (ret & GLOBAL_ATU_DATA_TRUNK) {
  1752. next.trunk = true;
  1753. mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK;
  1754. shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT;
  1755. } else {
  1756. next.trunk = false;
  1757. mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK;
  1758. shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT;
  1759. }
  1760. next.portv_trunkid = (ret & mask) >> shift;
  1761. }
  1762. *entry = next;
  1763. return 0;
  1764. }
  1765. static int mv88e6xxx_port_db_dump_fid(struct mv88e6xxx_chip *chip,
  1766. u16 fid, u16 vid, int port,
  1767. struct switchdev_obj *obj,
  1768. int (*cb)(struct switchdev_obj *obj))
  1769. {
  1770. struct mv88e6xxx_atu_entry addr = {
  1771. .mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
  1772. };
  1773. int err;
  1774. err = _mv88e6xxx_atu_mac_write(chip, addr.mac);
  1775. if (err)
  1776. return err;
  1777. do {
  1778. err = _mv88e6xxx_atu_getnext(chip, fid, &addr);
  1779. if (err)
  1780. return err;
  1781. if (addr.state == GLOBAL_ATU_DATA_STATE_UNUSED)
  1782. break;
  1783. if (addr.trunk || (addr.portv_trunkid & BIT(port)) == 0)
  1784. continue;
  1785. if (obj->id == SWITCHDEV_OBJ_ID_PORT_FDB) {
  1786. struct switchdev_obj_port_fdb *fdb;
  1787. if (!is_unicast_ether_addr(addr.mac))
  1788. continue;
  1789. fdb = SWITCHDEV_OBJ_PORT_FDB(obj);
  1790. fdb->vid = vid;
  1791. ether_addr_copy(fdb->addr, addr.mac);
  1792. if (addr.state == GLOBAL_ATU_DATA_STATE_UC_STATIC)
  1793. fdb->ndm_state = NUD_NOARP;
  1794. else
  1795. fdb->ndm_state = NUD_REACHABLE;
  1796. } else if (obj->id == SWITCHDEV_OBJ_ID_PORT_MDB) {
  1797. struct switchdev_obj_port_mdb *mdb;
  1798. if (!is_multicast_ether_addr(addr.mac))
  1799. continue;
  1800. mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
  1801. mdb->vid = vid;
  1802. ether_addr_copy(mdb->addr, addr.mac);
  1803. } else {
  1804. return -EOPNOTSUPP;
  1805. }
  1806. err = cb(obj);
  1807. if (err)
  1808. return err;
  1809. } while (!is_broadcast_ether_addr(addr.mac));
  1810. return err;
  1811. }
  1812. static int mv88e6xxx_port_db_dump(struct mv88e6xxx_chip *chip, int port,
  1813. struct switchdev_obj *obj,
  1814. int (*cb)(struct switchdev_obj *obj))
  1815. {
  1816. struct mv88e6xxx_vtu_stu_entry vlan = {
  1817. .vid = GLOBAL_VTU_VID_MASK, /* all ones */
  1818. };
  1819. u16 fid;
  1820. int err;
  1821. /* Dump port's default Filtering Information Database (VLAN ID 0) */
  1822. err = _mv88e6xxx_port_fid_get(chip, port, &fid);
  1823. if (err)
  1824. return err;
  1825. err = mv88e6xxx_port_db_dump_fid(chip, fid, 0, port, obj, cb);
  1826. if (err)
  1827. return err;
  1828. /* Dump VLANs' Filtering Information Databases */
  1829. err = _mv88e6xxx_vtu_vid_write(chip, vlan.vid);
  1830. if (err)
  1831. return err;
  1832. do {
  1833. err = _mv88e6xxx_vtu_getnext(chip, &vlan);
  1834. if (err)
  1835. return err;
  1836. if (!vlan.valid)
  1837. break;
  1838. err = mv88e6xxx_port_db_dump_fid(chip, vlan.fid, vlan.vid, port,
  1839. obj, cb);
  1840. if (err)
  1841. return err;
  1842. } while (vlan.vid < GLOBAL_VTU_VID_MASK);
  1843. return err;
  1844. }
  1845. static int mv88e6xxx_port_fdb_dump(struct dsa_switch *ds, int port,
  1846. struct switchdev_obj_port_fdb *fdb,
  1847. int (*cb)(struct switchdev_obj *obj))
  1848. {
  1849. struct mv88e6xxx_chip *chip = ds->priv;
  1850. int err;
  1851. mutex_lock(&chip->reg_lock);
  1852. err = mv88e6xxx_port_db_dump(chip, port, &fdb->obj, cb);
  1853. mutex_unlock(&chip->reg_lock);
  1854. return err;
  1855. }
  1856. static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
  1857. struct net_device *bridge)
  1858. {
  1859. struct mv88e6xxx_chip *chip = ds->priv;
  1860. int i, err = 0;
  1861. mutex_lock(&chip->reg_lock);
  1862. /* Assign the bridge and remap each port's VLANTable */
  1863. chip->ports[port].bridge_dev = bridge;
  1864. for (i = 0; i < chip->info->num_ports; ++i) {
  1865. if (chip->ports[i].bridge_dev == bridge) {
  1866. err = _mv88e6xxx_port_based_vlan_map(chip, i);
  1867. if (err)
  1868. break;
  1869. }
  1870. }
  1871. mutex_unlock(&chip->reg_lock);
  1872. return err;
  1873. }
  1874. static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
  1875. {
  1876. struct mv88e6xxx_chip *chip = ds->priv;
  1877. struct net_device *bridge = chip->ports[port].bridge_dev;
  1878. int i;
  1879. mutex_lock(&chip->reg_lock);
  1880. /* Unassign the bridge and remap each port's VLANTable */
  1881. chip->ports[port].bridge_dev = NULL;
  1882. for (i = 0; i < chip->info->num_ports; ++i)
  1883. if (i == port || chip->ports[i].bridge_dev == bridge)
  1884. if (_mv88e6xxx_port_based_vlan_map(chip, i))
  1885. netdev_warn(ds->ports[i].netdev,
  1886. "failed to remap\n");
  1887. mutex_unlock(&chip->reg_lock);
  1888. }
  1889. static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
  1890. {
  1891. bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
  1892. u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
  1893. struct gpio_desc *gpiod = chip->reset;
  1894. unsigned long timeout;
  1895. int ret;
  1896. int i;
  1897. /* Set all ports to the disabled state. */
  1898. for (i = 0; i < chip->info->num_ports; i++) {
  1899. ret = _mv88e6xxx_reg_read(chip, REG_PORT(i), PORT_CONTROL);
  1900. if (ret < 0)
  1901. return ret;
  1902. ret = _mv88e6xxx_reg_write(chip, REG_PORT(i), PORT_CONTROL,
  1903. ret & 0xfffc);
  1904. if (ret)
  1905. return ret;
  1906. }
  1907. /* Wait for transmit queues to drain. */
  1908. usleep_range(2000, 4000);
  1909. /* If there is a gpio connected to the reset pin, toggle it */
  1910. if (gpiod) {
  1911. gpiod_set_value_cansleep(gpiod, 1);
  1912. usleep_range(10000, 20000);
  1913. gpiod_set_value_cansleep(gpiod, 0);
  1914. usleep_range(10000, 20000);
  1915. }
  1916. /* Reset the switch. Keep the PPU active if requested. The PPU
  1917. * needs to be active to support indirect phy register access
  1918. * through global registers 0x18 and 0x19.
  1919. */
  1920. if (ppu_active)
  1921. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc000);
  1922. else
  1923. ret = _mv88e6xxx_reg_write(chip, REG_GLOBAL, 0x04, 0xc400);
  1924. if (ret)
  1925. return ret;
  1926. /* Wait up to one second for reset to complete. */
  1927. timeout = jiffies + 1 * HZ;
  1928. while (time_before(jiffies, timeout)) {
  1929. ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, 0x00);
  1930. if (ret < 0)
  1931. return ret;
  1932. if ((ret & is_reset) == is_reset)
  1933. break;
  1934. usleep_range(1000, 2000);
  1935. }
  1936. if (time_after(jiffies, timeout))
  1937. ret = -ETIMEDOUT;
  1938. else
  1939. ret = 0;
  1940. return ret;
  1941. }
  1942. static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
  1943. {
  1944. u16 val;
  1945. int err;
  1946. /* Clear Power Down bit */
  1947. err = mv88e6xxx_serdes_read(chip, MII_BMCR, &val);
  1948. if (err)
  1949. return err;
  1950. if (val & BMCR_PDOWN) {
  1951. val &= ~BMCR_PDOWN;
  1952. err = mv88e6xxx_serdes_write(chip, MII_BMCR, val);
  1953. }
  1954. return err;
  1955. }
  1956. static int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port,
  1957. int reg, u16 *val)
  1958. {
  1959. int addr = chip->info->port_base_addr + port;
  1960. if (port >= chip->info->num_ports)
  1961. return -EINVAL;
  1962. return mv88e6xxx_read(chip, addr, reg, val);
  1963. }
  1964. static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port)
  1965. {
  1966. struct dsa_switch *ds = chip->ds;
  1967. int ret;
  1968. u16 reg;
  1969. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  1970. mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
  1971. mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip) ||
  1972. mv88e6xxx_6065_family(chip) || mv88e6xxx_6320_family(chip)) {
  1973. /* MAC Forcing register: don't force link, speed,
  1974. * duplex or flow control state to any particular
  1975. * values on physical ports, but force the CPU port
  1976. * and all DSA ports to their maximum bandwidth and
  1977. * full duplex.
  1978. */
  1979. reg = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_PCS_CTRL);
  1980. if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) {
  1981. reg &= ~PORT_PCS_CTRL_UNFORCED;
  1982. reg |= PORT_PCS_CTRL_FORCE_LINK |
  1983. PORT_PCS_CTRL_LINK_UP |
  1984. PORT_PCS_CTRL_DUPLEX_FULL |
  1985. PORT_PCS_CTRL_FORCE_DUPLEX;
  1986. if (mv88e6xxx_6065_family(chip))
  1987. reg |= PORT_PCS_CTRL_100;
  1988. else
  1989. reg |= PORT_PCS_CTRL_1000;
  1990. } else {
  1991. reg |= PORT_PCS_CTRL_UNFORCED;
  1992. }
  1993. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  1994. PORT_PCS_CTRL, reg);
  1995. if (ret)
  1996. return ret;
  1997. }
  1998. /* Port Control: disable Drop-on-Unlock, disable Drop-on-Lock,
  1999. * disable Header mode, enable IGMP/MLD snooping, disable VLAN
  2000. * tunneling, determine priority by looking at 802.1p and IP
  2001. * priority fields (IP prio has precedence), and set STP state
  2002. * to Forwarding.
  2003. *
  2004. * If this is the CPU link, use DSA or EDSA tagging depending
  2005. * on which tagging mode was configured.
  2006. *
  2007. * If this is a link to another switch, use DSA tagging mode.
  2008. *
  2009. * If this is the upstream port for this switch, enable
  2010. * forwarding of unknown unicasts and multicasts.
  2011. */
  2012. reg = 0;
  2013. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  2014. mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
  2015. mv88e6xxx_6095_family(chip) || mv88e6xxx_6065_family(chip) ||
  2016. mv88e6xxx_6185_family(chip) || mv88e6xxx_6320_family(chip))
  2017. reg = PORT_CONTROL_IGMP_MLD_SNOOP |
  2018. PORT_CONTROL_USE_TAG | PORT_CONTROL_USE_IP |
  2019. PORT_CONTROL_STATE_FORWARDING;
  2020. if (dsa_is_cpu_port(ds, port)) {
  2021. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA))
  2022. reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA |
  2023. PORT_CONTROL_FORWARD_UNKNOWN_MC;
  2024. else
  2025. reg |= PORT_CONTROL_DSA_TAG;
  2026. reg |= PORT_CONTROL_EGRESS_ADD_TAG |
  2027. PORT_CONTROL_FORWARD_UNKNOWN;
  2028. }
  2029. if (dsa_is_dsa_port(ds, port)) {
  2030. if (mv88e6xxx_6095_family(chip) ||
  2031. mv88e6xxx_6185_family(chip))
  2032. reg |= PORT_CONTROL_DSA_TAG;
  2033. if (mv88e6xxx_6352_family(chip) ||
  2034. mv88e6xxx_6351_family(chip) ||
  2035. mv88e6xxx_6165_family(chip) ||
  2036. mv88e6xxx_6097_family(chip) ||
  2037. mv88e6xxx_6320_family(chip)) {
  2038. reg |= PORT_CONTROL_FRAME_MODE_DSA;
  2039. }
  2040. if (port == dsa_upstream_port(ds))
  2041. reg |= PORT_CONTROL_FORWARD_UNKNOWN |
  2042. PORT_CONTROL_FORWARD_UNKNOWN_MC;
  2043. }
  2044. if (reg) {
  2045. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2046. PORT_CONTROL, reg);
  2047. if (ret)
  2048. return ret;
  2049. }
  2050. /* If this port is connected to a SerDes, make sure the SerDes is not
  2051. * powered down.
  2052. */
  2053. if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_SERDES)) {
  2054. ret = _mv88e6xxx_reg_read(chip, REG_PORT(port), PORT_STATUS);
  2055. if (ret < 0)
  2056. return ret;
  2057. ret &= PORT_STATUS_CMODE_MASK;
  2058. if ((ret == PORT_STATUS_CMODE_100BASE_X) ||
  2059. (ret == PORT_STATUS_CMODE_1000BASE_X) ||
  2060. (ret == PORT_STATUS_CMODE_SGMII)) {
  2061. ret = mv88e6xxx_serdes_power_on(chip);
  2062. if (ret < 0)
  2063. return ret;
  2064. }
  2065. }
  2066. /* Port Control 2: don't force a good FCS, set the maximum frame size to
  2067. * 10240 bytes, disable 802.1q tags checking, don't discard tagged or
  2068. * untagged frames on this port, do a destination address lookup on all
  2069. * received packets as usual, disable ARP mirroring and don't send a
  2070. * copy of all transmitted/received frames on this port to the CPU.
  2071. */
  2072. reg = 0;
  2073. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  2074. mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
  2075. mv88e6xxx_6095_family(chip) || mv88e6xxx_6320_family(chip) ||
  2076. mv88e6xxx_6185_family(chip))
  2077. reg = PORT_CONTROL_2_MAP_DA;
  2078. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  2079. mv88e6xxx_6165_family(chip) || mv88e6xxx_6320_family(chip))
  2080. reg |= PORT_CONTROL_2_JUMBO_10240;
  2081. if (mv88e6xxx_6095_family(chip) || mv88e6xxx_6185_family(chip)) {
  2082. /* Set the upstream port this port should use */
  2083. reg |= dsa_upstream_port(ds);
  2084. /* enable forwarding of unknown multicast addresses to
  2085. * the upstream port
  2086. */
  2087. if (port == dsa_upstream_port(ds))
  2088. reg |= PORT_CONTROL_2_FORWARD_UNKNOWN;
  2089. }
  2090. reg |= PORT_CONTROL_2_8021Q_DISABLED;
  2091. if (reg) {
  2092. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2093. PORT_CONTROL_2, reg);
  2094. if (ret)
  2095. return ret;
  2096. }
  2097. /* Port Association Vector: when learning source addresses
  2098. * of packets, add the address to the address database using
  2099. * a port bitmap that has only the bit for this port set and
  2100. * the other bits clear.
  2101. */
  2102. reg = 1 << port;
  2103. /* Disable learning for CPU port */
  2104. if (dsa_is_cpu_port(ds, port))
  2105. reg = 0;
  2106. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_ASSOC_VECTOR,
  2107. reg);
  2108. if (ret)
  2109. return ret;
  2110. /* Egress rate control 2: disable egress rate control. */
  2111. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_RATE_CONTROL_2,
  2112. 0x0000);
  2113. if (ret)
  2114. return ret;
  2115. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  2116. mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
  2117. mv88e6xxx_6320_family(chip)) {
  2118. /* Do not limit the period of time that this port can
  2119. * be paused for by the remote end or the period of
  2120. * time that this port can pause the remote end.
  2121. */
  2122. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2123. PORT_PAUSE_CTRL, 0x0000);
  2124. if (ret)
  2125. return ret;
  2126. /* Port ATU control: disable limiting the number of
  2127. * address database entries that this port is allowed
  2128. * to use.
  2129. */
  2130. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2131. PORT_ATU_CONTROL, 0x0000);
  2132. /* Priority Override: disable DA, SA and VTU priority
  2133. * override.
  2134. */
  2135. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2136. PORT_PRI_OVERRIDE, 0x0000);
  2137. if (ret)
  2138. return ret;
  2139. /* Port Ethertype: use the Ethertype DSA Ethertype
  2140. * value.
  2141. */
  2142. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA)) {
  2143. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2144. PORT_ETH_TYPE, ETH_P_EDSA);
  2145. if (ret)
  2146. return ret;
  2147. }
  2148. /* Tag Remap: use an identity 802.1p prio -> switch
  2149. * prio mapping.
  2150. */
  2151. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2152. PORT_TAG_REGMAP_0123, 0x3210);
  2153. if (ret)
  2154. return ret;
  2155. /* Tag Remap 2: use an identity 802.1p prio -> switch
  2156. * prio mapping.
  2157. */
  2158. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2159. PORT_TAG_REGMAP_4567, 0x7654);
  2160. if (ret)
  2161. return ret;
  2162. }
  2163. /* Rate Control: disable ingress rate limiting. */
  2164. if (mv88e6xxx_6352_family(chip) || mv88e6xxx_6351_family(chip) ||
  2165. mv88e6xxx_6165_family(chip) || mv88e6xxx_6097_family(chip) ||
  2166. mv88e6xxx_6320_family(chip)) {
  2167. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2168. PORT_RATE_CONTROL, 0x0001);
  2169. if (ret)
  2170. return ret;
  2171. } else if (mv88e6xxx_6185_family(chip) || mv88e6xxx_6095_family(chip)) {
  2172. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port),
  2173. PORT_RATE_CONTROL, 0x0000);
  2174. if (ret)
  2175. return ret;
  2176. }
  2177. /* Port Control 1: disable trunking, disable sending
  2178. * learning messages to this port.
  2179. */
  2180. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_CONTROL_1,
  2181. 0x0000);
  2182. if (ret)
  2183. return ret;
  2184. /* Port based VLAN map: give each port the same default address
  2185. * database, and allow bidirectional communication between the
  2186. * CPU and DSA port(s), and the other ports.
  2187. */
  2188. ret = _mv88e6xxx_port_fid_set(chip, port, 0);
  2189. if (ret)
  2190. return ret;
  2191. ret = _mv88e6xxx_port_based_vlan_map(chip, port);
  2192. if (ret)
  2193. return ret;
  2194. /* Default VLAN ID and priority: don't set a default VLAN
  2195. * ID, and set the default packet priority to zero.
  2196. */
  2197. ret = _mv88e6xxx_reg_write(chip, REG_PORT(port), PORT_DEFAULT_VLAN,
  2198. 0x0000);
  2199. if (ret)
  2200. return ret;
  2201. return 0;
  2202. }
  2203. static int mv88e6xxx_g1_set_switch_mac(struct mv88e6xxx_chip *chip, u8 *addr)
  2204. {
  2205. int err;
  2206. err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_01,
  2207. (addr[0] << 8) | addr[1]);
  2208. if (err)
  2209. return err;
  2210. err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_23,
  2211. (addr[2] << 8) | addr[3]);
  2212. if (err)
  2213. return err;
  2214. return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_MAC_45,
  2215. (addr[4] << 8) | addr[5]);
  2216. }
  2217. static int mv88e6xxx_g1_set_age_time(struct mv88e6xxx_chip *chip,
  2218. unsigned int msecs)
  2219. {
  2220. const unsigned int coeff = chip->info->age_time_coeff;
  2221. const unsigned int min = 0x01 * coeff;
  2222. const unsigned int max = 0xff * coeff;
  2223. u8 age_time;
  2224. u16 val;
  2225. int err;
  2226. if (msecs < min || msecs > max)
  2227. return -ERANGE;
  2228. /* Round to nearest multiple of coeff */
  2229. age_time = (msecs + coeff / 2) / coeff;
  2230. err = mv88e6xxx_read(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, &val);
  2231. if (err)
  2232. return err;
  2233. /* AgeTime is 11:4 bits */
  2234. val &= ~0xff0;
  2235. val |= age_time << 4;
  2236. return mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL, val);
  2237. }
  2238. static int mv88e6xxx_set_ageing_time(struct dsa_switch *ds,
  2239. unsigned int ageing_time)
  2240. {
  2241. struct mv88e6xxx_chip *chip = ds->priv;
  2242. int err;
  2243. mutex_lock(&chip->reg_lock);
  2244. err = mv88e6xxx_g1_set_age_time(chip, ageing_time);
  2245. mutex_unlock(&chip->reg_lock);
  2246. return err;
  2247. }
  2248. static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
  2249. {
  2250. struct dsa_switch *ds = chip->ds;
  2251. u32 upstream_port = dsa_upstream_port(ds);
  2252. u16 reg;
  2253. int err;
  2254. /* Enable the PHY Polling Unit if present, don't discard any packets,
  2255. * and mask all interrupt sources.
  2256. */
  2257. reg = 0;
  2258. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
  2259. mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
  2260. reg |= GLOBAL_CONTROL_PPU_ENABLE;
  2261. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL, reg);
  2262. if (err)
  2263. return err;
  2264. /* Configure the upstream port, and configure it as the port to which
  2265. * ingress and egress and ARP monitor frames are to be sent.
  2266. */
  2267. reg = upstream_port << GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT |
  2268. upstream_port << GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT |
  2269. upstream_port << GLOBAL_MONITOR_CONTROL_ARP_SHIFT;
  2270. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_MONITOR_CONTROL,
  2271. reg);
  2272. if (err)
  2273. return err;
  2274. /* Disable remote management, and set the switch's DSA device number. */
  2275. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_CONTROL_2,
  2276. GLOBAL_CONTROL_2_MULTIPLE_CASCADE |
  2277. (ds->index & 0x1f));
  2278. if (err)
  2279. return err;
  2280. /* Clear all the VTU and STU entries */
  2281. err = _mv88e6xxx_vtu_stu_flush(chip);
  2282. if (err < 0)
  2283. return err;
  2284. /* Set the default address aging time to 5 minutes, and
  2285. * enable address learn messages to be sent to all message
  2286. * ports.
  2287. */
  2288. err = mv88e6xxx_write(chip, REG_GLOBAL, GLOBAL_ATU_CONTROL,
  2289. GLOBAL_ATU_CONTROL_LEARN2ALL);
  2290. if (err)
  2291. return err;
  2292. err = mv88e6xxx_g1_set_age_time(chip, 300000);
  2293. if (err)
  2294. return err;
  2295. /* Clear all ATU entries */
  2296. err = _mv88e6xxx_atu_flush(chip, 0, true);
  2297. if (err)
  2298. return err;
  2299. /* Configure the IP ToS mapping registers. */
  2300. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_0, 0x0000);
  2301. if (err)
  2302. return err;
  2303. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_1, 0x0000);
  2304. if (err)
  2305. return err;
  2306. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_2, 0x5555);
  2307. if (err)
  2308. return err;
  2309. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_3, 0x5555);
  2310. if (err)
  2311. return err;
  2312. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_4, 0xaaaa);
  2313. if (err)
  2314. return err;
  2315. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_5, 0xaaaa);
  2316. if (err)
  2317. return err;
  2318. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_6, 0xffff);
  2319. if (err)
  2320. return err;
  2321. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IP_PRI_7, 0xffff);
  2322. if (err)
  2323. return err;
  2324. /* Configure the IEEE 802.1p priority mapping register. */
  2325. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_IEEE_PRI, 0xfa41);
  2326. if (err)
  2327. return err;
  2328. /* Clear the statistics counters for all ports */
  2329. err = _mv88e6xxx_reg_write(chip, REG_GLOBAL, GLOBAL_STATS_OP,
  2330. GLOBAL_STATS_OP_FLUSH_ALL);
  2331. if (err)
  2332. return err;
  2333. /* Wait for the flush to complete. */
  2334. err = _mv88e6xxx_stats_wait(chip);
  2335. if (err)
  2336. return err;
  2337. return 0;
  2338. }
  2339. static int mv88e6xxx_setup(struct dsa_switch *ds)
  2340. {
  2341. struct mv88e6xxx_chip *chip = ds->priv;
  2342. int err;
  2343. int i;
  2344. chip->ds = ds;
  2345. ds->slave_mii_bus = chip->mdio_bus;
  2346. mutex_lock(&chip->reg_lock);
  2347. err = mv88e6xxx_switch_reset(chip);
  2348. if (err)
  2349. goto unlock;
  2350. /* Setup Switch Port Registers */
  2351. for (i = 0; i < chip->info->num_ports; i++) {
  2352. err = mv88e6xxx_setup_port(chip, i);
  2353. if (err)
  2354. goto unlock;
  2355. }
  2356. /* Setup Switch Global 1 Registers */
  2357. err = mv88e6xxx_g1_setup(chip);
  2358. if (err)
  2359. goto unlock;
  2360. /* Setup Switch Global 2 Registers */
  2361. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
  2362. err = mv88e6xxx_g2_setup(chip);
  2363. if (err)
  2364. goto unlock;
  2365. }
  2366. unlock:
  2367. mutex_unlock(&chip->reg_lock);
  2368. return err;
  2369. }
  2370. static int mv88e6xxx_set_addr(struct dsa_switch *ds, u8 *addr)
  2371. {
  2372. struct mv88e6xxx_chip *chip = ds->priv;
  2373. int err;
  2374. mutex_lock(&chip->reg_lock);
  2375. /* Has an indirect Switch MAC/WoL/WoF register in Global 2? */
  2376. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_SWITCH_MAC))
  2377. err = mv88e6xxx_g2_set_switch_mac(chip, addr);
  2378. else
  2379. err = mv88e6xxx_g1_set_switch_mac(chip, addr);
  2380. mutex_unlock(&chip->reg_lock);
  2381. return err;
  2382. }
  2383. static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg)
  2384. {
  2385. struct mv88e6xxx_chip *chip = bus->priv;
  2386. u16 val;
  2387. int err;
  2388. if (phy >= chip->info->num_ports)
  2389. return 0xffff;
  2390. mutex_lock(&chip->reg_lock);
  2391. err = mv88e6xxx_phy_read(chip, phy, reg, &val);
  2392. mutex_unlock(&chip->reg_lock);
  2393. return err ? err : val;
  2394. }
  2395. static int mv88e6xxx_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val)
  2396. {
  2397. struct mv88e6xxx_chip *chip = bus->priv;
  2398. int err;
  2399. if (phy >= chip->info->num_ports)
  2400. return 0xffff;
  2401. mutex_lock(&chip->reg_lock);
  2402. err = mv88e6xxx_phy_write(chip, phy, reg, val);
  2403. mutex_unlock(&chip->reg_lock);
  2404. return err;
  2405. }
  2406. static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
  2407. struct device_node *np)
  2408. {
  2409. static int index;
  2410. struct mii_bus *bus;
  2411. int err;
  2412. if (np)
  2413. chip->mdio_np = of_get_child_by_name(np, "mdio");
  2414. bus = devm_mdiobus_alloc(chip->dev);
  2415. if (!bus)
  2416. return -ENOMEM;
  2417. bus->priv = (void *)chip;
  2418. if (np) {
  2419. bus->name = np->full_name;
  2420. snprintf(bus->id, MII_BUS_ID_SIZE, "%s", np->full_name);
  2421. } else {
  2422. bus->name = "mv88e6xxx SMI";
  2423. snprintf(bus->id, MII_BUS_ID_SIZE, "mv88e6xxx-%d", index++);
  2424. }
  2425. bus->read = mv88e6xxx_mdio_read;
  2426. bus->write = mv88e6xxx_mdio_write;
  2427. bus->parent = chip->dev;
  2428. if (chip->mdio_np)
  2429. err = of_mdiobus_register(bus, chip->mdio_np);
  2430. else
  2431. err = mdiobus_register(bus);
  2432. if (err) {
  2433. dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
  2434. goto out;
  2435. }
  2436. chip->mdio_bus = bus;
  2437. return 0;
  2438. out:
  2439. if (chip->mdio_np)
  2440. of_node_put(chip->mdio_np);
  2441. return err;
  2442. }
  2443. static void mv88e6xxx_mdio_unregister(struct mv88e6xxx_chip *chip)
  2444. {
  2445. struct mii_bus *bus = chip->mdio_bus;
  2446. mdiobus_unregister(bus);
  2447. if (chip->mdio_np)
  2448. of_node_put(chip->mdio_np);
  2449. }
  2450. #ifdef CONFIG_NET_DSA_HWMON
  2451. static int mv88e61xx_get_temp(struct dsa_switch *ds, int *temp)
  2452. {
  2453. struct mv88e6xxx_chip *chip = ds->priv;
  2454. u16 val;
  2455. int ret;
  2456. *temp = 0;
  2457. mutex_lock(&chip->reg_lock);
  2458. ret = mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x6);
  2459. if (ret < 0)
  2460. goto error;
  2461. /* Enable temperature sensor */
  2462. ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
  2463. if (ret < 0)
  2464. goto error;
  2465. ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val | (1 << 5));
  2466. if (ret < 0)
  2467. goto error;
  2468. /* Wait for temperature to stabilize */
  2469. usleep_range(10000, 12000);
  2470. ret = mv88e6xxx_phy_read(chip, 0x0, 0x1a, &val);
  2471. if (ret < 0)
  2472. goto error;
  2473. /* Disable temperature sensor */
  2474. ret = mv88e6xxx_phy_write(chip, 0x0, 0x1a, val & ~(1 << 5));
  2475. if (ret < 0)
  2476. goto error;
  2477. *temp = ((val & 0x1f) - 5) * 5;
  2478. error:
  2479. mv88e6xxx_phy_write(chip, 0x0, 0x16, 0x0);
  2480. mutex_unlock(&chip->reg_lock);
  2481. return ret;
  2482. }
  2483. static int mv88e63xx_get_temp(struct dsa_switch *ds, int *temp)
  2484. {
  2485. struct mv88e6xxx_chip *chip = ds->priv;
  2486. int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
  2487. u16 val;
  2488. int ret;
  2489. *temp = 0;
  2490. mutex_lock(&chip->reg_lock);
  2491. ret = mv88e6xxx_phy_page_read(chip, phy, 6, 27, &val);
  2492. mutex_unlock(&chip->reg_lock);
  2493. if (ret < 0)
  2494. return ret;
  2495. *temp = (val & 0xff) - 25;
  2496. return 0;
  2497. }
  2498. static int mv88e6xxx_get_temp(struct dsa_switch *ds, int *temp)
  2499. {
  2500. struct mv88e6xxx_chip *chip = ds->priv;
  2501. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP))
  2502. return -EOPNOTSUPP;
  2503. if (mv88e6xxx_6320_family(chip) || mv88e6xxx_6352_family(chip))
  2504. return mv88e63xx_get_temp(ds, temp);
  2505. return mv88e61xx_get_temp(ds, temp);
  2506. }
  2507. static int mv88e6xxx_get_temp_limit(struct dsa_switch *ds, int *temp)
  2508. {
  2509. struct mv88e6xxx_chip *chip = ds->priv;
  2510. int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
  2511. u16 val;
  2512. int ret;
  2513. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
  2514. return -EOPNOTSUPP;
  2515. *temp = 0;
  2516. mutex_lock(&chip->reg_lock);
  2517. ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
  2518. mutex_unlock(&chip->reg_lock);
  2519. if (ret < 0)
  2520. return ret;
  2521. *temp = (((val >> 8) & 0x1f) * 5) - 25;
  2522. return 0;
  2523. }
  2524. static int mv88e6xxx_set_temp_limit(struct dsa_switch *ds, int temp)
  2525. {
  2526. struct mv88e6xxx_chip *chip = ds->priv;
  2527. int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
  2528. u16 val;
  2529. int err;
  2530. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
  2531. return -EOPNOTSUPP;
  2532. mutex_lock(&chip->reg_lock);
  2533. err = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
  2534. if (err)
  2535. goto unlock;
  2536. temp = clamp_val(DIV_ROUND_CLOSEST(temp, 5) + 5, 0, 0x1f);
  2537. err = mv88e6xxx_phy_page_write(chip, phy, 6, 26,
  2538. (val & 0xe0ff) | (temp << 8));
  2539. unlock:
  2540. mutex_unlock(&chip->reg_lock);
  2541. return err;
  2542. }
  2543. static int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
  2544. {
  2545. struct mv88e6xxx_chip *chip = ds->priv;
  2546. int phy = mv88e6xxx_6320_family(chip) ? 3 : 0;
  2547. u16 val;
  2548. int ret;
  2549. if (!mv88e6xxx_has(chip, MV88E6XXX_FLAG_TEMP_LIMIT))
  2550. return -EOPNOTSUPP;
  2551. *alarm = false;
  2552. mutex_lock(&chip->reg_lock);
  2553. ret = mv88e6xxx_phy_page_read(chip, phy, 6, 26, &val);
  2554. mutex_unlock(&chip->reg_lock);
  2555. if (ret < 0)
  2556. return ret;
  2557. *alarm = !!(val & 0x40);
  2558. return 0;
  2559. }
  2560. #endif /* CONFIG_NET_DSA_HWMON */
  2561. static int mv88e6xxx_get_eeprom_len(struct dsa_switch *ds)
  2562. {
  2563. struct mv88e6xxx_chip *chip = ds->priv;
  2564. return chip->eeprom_len;
  2565. }
  2566. static int mv88e6xxx_get_eeprom(struct dsa_switch *ds,
  2567. struct ethtool_eeprom *eeprom, u8 *data)
  2568. {
  2569. struct mv88e6xxx_chip *chip = ds->priv;
  2570. int err;
  2571. mutex_lock(&chip->reg_lock);
  2572. if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
  2573. err = mv88e6xxx_g2_get_eeprom16(chip, eeprom, data);
  2574. else
  2575. err = -EOPNOTSUPP;
  2576. mutex_unlock(&chip->reg_lock);
  2577. if (err)
  2578. return err;
  2579. eeprom->magic = 0xc3ec4951;
  2580. return 0;
  2581. }
  2582. static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,
  2583. struct ethtool_eeprom *eeprom, u8 *data)
  2584. {
  2585. struct mv88e6xxx_chip *chip = ds->priv;
  2586. int err;
  2587. if (eeprom->magic != 0xc3ec4951)
  2588. return -EINVAL;
  2589. mutex_lock(&chip->reg_lock);
  2590. if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16))
  2591. err = mv88e6xxx_g2_set_eeprom16(chip, eeprom, data);
  2592. else
  2593. err = -EOPNOTSUPP;
  2594. mutex_unlock(&chip->reg_lock);
  2595. return err;
  2596. }
  2597. static const struct mv88e6xxx_info mv88e6xxx_table[] = {
  2598. [MV88E6085] = {
  2599. .prod_num = PORT_SWITCH_ID_PROD_NUM_6085,
  2600. .family = MV88E6XXX_FAMILY_6097,
  2601. .name = "Marvell 88E6085",
  2602. .num_databases = 4096,
  2603. .num_ports = 10,
  2604. .port_base_addr = 0x10,
  2605. .age_time_coeff = 15000,
  2606. .flags = MV88E6XXX_FLAGS_FAMILY_6097,
  2607. },
  2608. [MV88E6095] = {
  2609. .prod_num = PORT_SWITCH_ID_PROD_NUM_6095,
  2610. .family = MV88E6XXX_FAMILY_6095,
  2611. .name = "Marvell 88E6095/88E6095F",
  2612. .num_databases = 256,
  2613. .num_ports = 11,
  2614. .port_base_addr = 0x10,
  2615. .age_time_coeff = 15000,
  2616. .flags = MV88E6XXX_FLAGS_FAMILY_6095,
  2617. },
  2618. [MV88E6123] = {
  2619. .prod_num = PORT_SWITCH_ID_PROD_NUM_6123,
  2620. .family = MV88E6XXX_FAMILY_6165,
  2621. .name = "Marvell 88E6123",
  2622. .num_databases = 4096,
  2623. .num_ports = 3,
  2624. .port_base_addr = 0x10,
  2625. .age_time_coeff = 15000,
  2626. .flags = MV88E6XXX_FLAGS_FAMILY_6165,
  2627. },
  2628. [MV88E6131] = {
  2629. .prod_num = PORT_SWITCH_ID_PROD_NUM_6131,
  2630. .family = MV88E6XXX_FAMILY_6185,
  2631. .name = "Marvell 88E6131",
  2632. .num_databases = 256,
  2633. .num_ports = 8,
  2634. .port_base_addr = 0x10,
  2635. .age_time_coeff = 15000,
  2636. .flags = MV88E6XXX_FLAGS_FAMILY_6185,
  2637. },
  2638. [MV88E6161] = {
  2639. .prod_num = PORT_SWITCH_ID_PROD_NUM_6161,
  2640. .family = MV88E6XXX_FAMILY_6165,
  2641. .name = "Marvell 88E6161",
  2642. .num_databases = 4096,
  2643. .num_ports = 6,
  2644. .port_base_addr = 0x10,
  2645. .age_time_coeff = 15000,
  2646. .flags = MV88E6XXX_FLAGS_FAMILY_6165,
  2647. },
  2648. [MV88E6165] = {
  2649. .prod_num = PORT_SWITCH_ID_PROD_NUM_6165,
  2650. .family = MV88E6XXX_FAMILY_6165,
  2651. .name = "Marvell 88E6165",
  2652. .num_databases = 4096,
  2653. .num_ports = 6,
  2654. .port_base_addr = 0x10,
  2655. .age_time_coeff = 15000,
  2656. .flags = MV88E6XXX_FLAGS_FAMILY_6165,
  2657. },
  2658. [MV88E6171] = {
  2659. .prod_num = PORT_SWITCH_ID_PROD_NUM_6171,
  2660. .family = MV88E6XXX_FAMILY_6351,
  2661. .name = "Marvell 88E6171",
  2662. .num_databases = 4096,
  2663. .num_ports = 7,
  2664. .port_base_addr = 0x10,
  2665. .age_time_coeff = 15000,
  2666. .flags = MV88E6XXX_FLAGS_FAMILY_6351,
  2667. },
  2668. [MV88E6172] = {
  2669. .prod_num = PORT_SWITCH_ID_PROD_NUM_6172,
  2670. .family = MV88E6XXX_FAMILY_6352,
  2671. .name = "Marvell 88E6172",
  2672. .num_databases = 4096,
  2673. .num_ports = 7,
  2674. .port_base_addr = 0x10,
  2675. .age_time_coeff = 15000,
  2676. .flags = MV88E6XXX_FLAGS_FAMILY_6352,
  2677. },
  2678. [MV88E6175] = {
  2679. .prod_num = PORT_SWITCH_ID_PROD_NUM_6175,
  2680. .family = MV88E6XXX_FAMILY_6351,
  2681. .name = "Marvell 88E6175",
  2682. .num_databases = 4096,
  2683. .num_ports = 7,
  2684. .port_base_addr = 0x10,
  2685. .age_time_coeff = 15000,
  2686. .flags = MV88E6XXX_FLAGS_FAMILY_6351,
  2687. },
  2688. [MV88E6176] = {
  2689. .prod_num = PORT_SWITCH_ID_PROD_NUM_6176,
  2690. .family = MV88E6XXX_FAMILY_6352,
  2691. .name = "Marvell 88E6176",
  2692. .num_databases = 4096,
  2693. .num_ports = 7,
  2694. .port_base_addr = 0x10,
  2695. .age_time_coeff = 15000,
  2696. .flags = MV88E6XXX_FLAGS_FAMILY_6352,
  2697. },
  2698. [MV88E6185] = {
  2699. .prod_num = PORT_SWITCH_ID_PROD_NUM_6185,
  2700. .family = MV88E6XXX_FAMILY_6185,
  2701. .name = "Marvell 88E6185",
  2702. .num_databases = 256,
  2703. .num_ports = 10,
  2704. .port_base_addr = 0x10,
  2705. .age_time_coeff = 15000,
  2706. .flags = MV88E6XXX_FLAGS_FAMILY_6185,
  2707. },
  2708. [MV88E6240] = {
  2709. .prod_num = PORT_SWITCH_ID_PROD_NUM_6240,
  2710. .family = MV88E6XXX_FAMILY_6352,
  2711. .name = "Marvell 88E6240",
  2712. .num_databases = 4096,
  2713. .num_ports = 7,
  2714. .port_base_addr = 0x10,
  2715. .age_time_coeff = 15000,
  2716. .flags = MV88E6XXX_FLAGS_FAMILY_6352,
  2717. },
  2718. [MV88E6320] = {
  2719. .prod_num = PORT_SWITCH_ID_PROD_NUM_6320,
  2720. .family = MV88E6XXX_FAMILY_6320,
  2721. .name = "Marvell 88E6320",
  2722. .num_databases = 4096,
  2723. .num_ports = 7,
  2724. .port_base_addr = 0x10,
  2725. .age_time_coeff = 15000,
  2726. .flags = MV88E6XXX_FLAGS_FAMILY_6320,
  2727. },
  2728. [MV88E6321] = {
  2729. .prod_num = PORT_SWITCH_ID_PROD_NUM_6321,
  2730. .family = MV88E6XXX_FAMILY_6320,
  2731. .name = "Marvell 88E6321",
  2732. .num_databases = 4096,
  2733. .num_ports = 7,
  2734. .port_base_addr = 0x10,
  2735. .age_time_coeff = 15000,
  2736. .flags = MV88E6XXX_FLAGS_FAMILY_6320,
  2737. },
  2738. [MV88E6350] = {
  2739. .prod_num = PORT_SWITCH_ID_PROD_NUM_6350,
  2740. .family = MV88E6XXX_FAMILY_6351,
  2741. .name = "Marvell 88E6350",
  2742. .num_databases = 4096,
  2743. .num_ports = 7,
  2744. .port_base_addr = 0x10,
  2745. .age_time_coeff = 15000,
  2746. .flags = MV88E6XXX_FLAGS_FAMILY_6351,
  2747. },
  2748. [MV88E6351] = {
  2749. .prod_num = PORT_SWITCH_ID_PROD_NUM_6351,
  2750. .family = MV88E6XXX_FAMILY_6351,
  2751. .name = "Marvell 88E6351",
  2752. .num_databases = 4096,
  2753. .num_ports = 7,
  2754. .port_base_addr = 0x10,
  2755. .age_time_coeff = 15000,
  2756. .flags = MV88E6XXX_FLAGS_FAMILY_6351,
  2757. },
  2758. [MV88E6352] = {
  2759. .prod_num = PORT_SWITCH_ID_PROD_NUM_6352,
  2760. .family = MV88E6XXX_FAMILY_6352,
  2761. .name = "Marvell 88E6352",
  2762. .num_databases = 4096,
  2763. .num_ports = 7,
  2764. .port_base_addr = 0x10,
  2765. .age_time_coeff = 15000,
  2766. .flags = MV88E6XXX_FLAGS_FAMILY_6352,
  2767. },
  2768. };
  2769. static const struct mv88e6xxx_info *mv88e6xxx_lookup_info(unsigned int prod_num)
  2770. {
  2771. int i;
  2772. for (i = 0; i < ARRAY_SIZE(mv88e6xxx_table); ++i)
  2773. if (mv88e6xxx_table[i].prod_num == prod_num)
  2774. return &mv88e6xxx_table[i];
  2775. return NULL;
  2776. }
  2777. static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip)
  2778. {
  2779. const struct mv88e6xxx_info *info;
  2780. unsigned int prod_num, rev;
  2781. u16 id;
  2782. int err;
  2783. mutex_lock(&chip->reg_lock);
  2784. err = mv88e6xxx_port_read(chip, 0, PORT_SWITCH_ID, &id);
  2785. mutex_unlock(&chip->reg_lock);
  2786. if (err)
  2787. return err;
  2788. prod_num = (id & 0xfff0) >> 4;
  2789. rev = id & 0x000f;
  2790. info = mv88e6xxx_lookup_info(prod_num);
  2791. if (!info)
  2792. return -ENODEV;
  2793. /* Update the compatible info with the probed one */
  2794. chip->info = info;
  2795. err = mv88e6xxx_g2_require(chip);
  2796. if (err)
  2797. return err;
  2798. dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n",
  2799. chip->info->prod_num, chip->info->name, rev);
  2800. return 0;
  2801. }
  2802. static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
  2803. {
  2804. struct mv88e6xxx_chip *chip;
  2805. chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
  2806. if (!chip)
  2807. return NULL;
  2808. chip->dev = dev;
  2809. mutex_init(&chip->reg_lock);
  2810. return chip;
  2811. }
  2812. static const struct mv88e6xxx_ops mv88e6xxx_g2_smi_phy_ops = {
  2813. .read = mv88e6xxx_g2_smi_phy_read,
  2814. .write = mv88e6xxx_g2_smi_phy_write,
  2815. };
  2816. static const struct mv88e6xxx_ops mv88e6xxx_phy_ops = {
  2817. .read = mv88e6xxx_read,
  2818. .write = mv88e6xxx_write,
  2819. };
  2820. static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip)
  2821. {
  2822. if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_SMI_PHY)) {
  2823. chip->phy_ops = &mv88e6xxx_g2_smi_phy_ops;
  2824. } else if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
  2825. chip->phy_ops = &mv88e6xxx_phy_ppu_ops;
  2826. mv88e6xxx_ppu_state_init(chip);
  2827. } else {
  2828. chip->phy_ops = &mv88e6xxx_phy_ops;
  2829. }
  2830. }
  2831. static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
  2832. {
  2833. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU)) {
  2834. mv88e6xxx_ppu_state_destroy(chip);
  2835. }
  2836. }
  2837. static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
  2838. struct mii_bus *bus, int sw_addr)
  2839. {
  2840. /* ADDR[0] pin is unavailable externally and considered zero */
  2841. if (sw_addr & 0x1)
  2842. return -EINVAL;
  2843. if (sw_addr == 0)
  2844. chip->smi_ops = &mv88e6xxx_smi_single_chip_ops;
  2845. else if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_MULTI_CHIP))
  2846. chip->smi_ops = &mv88e6xxx_smi_multi_chip_ops;
  2847. else
  2848. return -EINVAL;
  2849. chip->bus = bus;
  2850. chip->sw_addr = sw_addr;
  2851. return 0;
  2852. }
  2853. static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds)
  2854. {
  2855. struct mv88e6xxx_chip *chip = ds->priv;
  2856. if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_EDSA))
  2857. return DSA_TAG_PROTO_EDSA;
  2858. return DSA_TAG_PROTO_DSA;
  2859. }
  2860. static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
  2861. struct device *host_dev, int sw_addr,
  2862. void **priv)
  2863. {
  2864. struct mv88e6xxx_chip *chip;
  2865. struct mii_bus *bus;
  2866. int err;
  2867. bus = dsa_host_dev_to_mii_bus(host_dev);
  2868. if (!bus)
  2869. return NULL;
  2870. chip = mv88e6xxx_alloc_chip(dsa_dev);
  2871. if (!chip)
  2872. return NULL;
  2873. /* Legacy SMI probing will only support chips similar to 88E6085 */
  2874. chip->info = &mv88e6xxx_table[MV88E6085];
  2875. err = mv88e6xxx_smi_init(chip, bus, sw_addr);
  2876. if (err)
  2877. goto free;
  2878. err = mv88e6xxx_detect(chip);
  2879. if (err)
  2880. goto free;
  2881. mv88e6xxx_phy_init(chip);
  2882. err = mv88e6xxx_mdio_register(chip, NULL);
  2883. if (err)
  2884. goto free;
  2885. *priv = chip;
  2886. return chip->info->name;
  2887. free:
  2888. devm_kfree(dsa_dev, chip);
  2889. return NULL;
  2890. }
  2891. static int mv88e6xxx_port_mdb_prepare(struct dsa_switch *ds, int port,
  2892. const struct switchdev_obj_port_mdb *mdb,
  2893. struct switchdev_trans *trans)
  2894. {
  2895. /* We don't need any dynamic resource from the kernel (yet),
  2896. * so skip the prepare phase.
  2897. */
  2898. return 0;
  2899. }
  2900. static void mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
  2901. const struct switchdev_obj_port_mdb *mdb,
  2902. struct switchdev_trans *trans)
  2903. {
  2904. struct mv88e6xxx_chip *chip = ds->priv;
  2905. mutex_lock(&chip->reg_lock);
  2906. if (mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
  2907. GLOBAL_ATU_DATA_STATE_MC_STATIC))
  2908. netdev_err(ds->ports[port].netdev, "failed to load multicast MAC address\n");
  2909. mutex_unlock(&chip->reg_lock);
  2910. }
  2911. static int mv88e6xxx_port_mdb_del(struct dsa_switch *ds, int port,
  2912. const struct switchdev_obj_port_mdb *mdb)
  2913. {
  2914. struct mv88e6xxx_chip *chip = ds->priv;
  2915. int err;
  2916. mutex_lock(&chip->reg_lock);
  2917. err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
  2918. GLOBAL_ATU_DATA_STATE_UNUSED);
  2919. mutex_unlock(&chip->reg_lock);
  2920. return err;
  2921. }
  2922. static int mv88e6xxx_port_mdb_dump(struct dsa_switch *ds, int port,
  2923. struct switchdev_obj_port_mdb *mdb,
  2924. int (*cb)(struct switchdev_obj *obj))
  2925. {
  2926. struct mv88e6xxx_chip *chip = ds->priv;
  2927. int err;
  2928. mutex_lock(&chip->reg_lock);
  2929. err = mv88e6xxx_port_db_dump(chip, port, &mdb->obj, cb);
  2930. mutex_unlock(&chip->reg_lock);
  2931. return err;
  2932. }
  2933. static struct dsa_switch_ops mv88e6xxx_switch_ops = {
  2934. .probe = mv88e6xxx_drv_probe,
  2935. .get_tag_protocol = mv88e6xxx_get_tag_protocol,
  2936. .setup = mv88e6xxx_setup,
  2937. .set_addr = mv88e6xxx_set_addr,
  2938. .adjust_link = mv88e6xxx_adjust_link,
  2939. .get_strings = mv88e6xxx_get_strings,
  2940. .get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
  2941. .get_sset_count = mv88e6xxx_get_sset_count,
  2942. .set_eee = mv88e6xxx_set_eee,
  2943. .get_eee = mv88e6xxx_get_eee,
  2944. #ifdef CONFIG_NET_DSA_HWMON
  2945. .get_temp = mv88e6xxx_get_temp,
  2946. .get_temp_limit = mv88e6xxx_get_temp_limit,
  2947. .set_temp_limit = mv88e6xxx_set_temp_limit,
  2948. .get_temp_alarm = mv88e6xxx_get_temp_alarm,
  2949. #endif
  2950. .get_eeprom_len = mv88e6xxx_get_eeprom_len,
  2951. .get_eeprom = mv88e6xxx_get_eeprom,
  2952. .set_eeprom = mv88e6xxx_set_eeprom,
  2953. .get_regs_len = mv88e6xxx_get_regs_len,
  2954. .get_regs = mv88e6xxx_get_regs,
  2955. .set_ageing_time = mv88e6xxx_set_ageing_time,
  2956. .port_bridge_join = mv88e6xxx_port_bridge_join,
  2957. .port_bridge_leave = mv88e6xxx_port_bridge_leave,
  2958. .port_stp_state_set = mv88e6xxx_port_stp_state_set,
  2959. .port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
  2960. .port_vlan_prepare = mv88e6xxx_port_vlan_prepare,
  2961. .port_vlan_add = mv88e6xxx_port_vlan_add,
  2962. .port_vlan_del = mv88e6xxx_port_vlan_del,
  2963. .port_vlan_dump = mv88e6xxx_port_vlan_dump,
  2964. .port_fdb_prepare = mv88e6xxx_port_fdb_prepare,
  2965. .port_fdb_add = mv88e6xxx_port_fdb_add,
  2966. .port_fdb_del = mv88e6xxx_port_fdb_del,
  2967. .port_fdb_dump = mv88e6xxx_port_fdb_dump,
  2968. .port_mdb_prepare = mv88e6xxx_port_mdb_prepare,
  2969. .port_mdb_add = mv88e6xxx_port_mdb_add,
  2970. .port_mdb_del = mv88e6xxx_port_mdb_del,
  2971. .port_mdb_dump = mv88e6xxx_port_mdb_dump,
  2972. };
  2973. static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip,
  2974. struct device_node *np)
  2975. {
  2976. struct device *dev = chip->dev;
  2977. struct dsa_switch *ds;
  2978. ds = devm_kzalloc(dev, sizeof(*ds), GFP_KERNEL);
  2979. if (!ds)
  2980. return -ENOMEM;
  2981. ds->dev = dev;
  2982. ds->priv = chip;
  2983. ds->ops = &mv88e6xxx_switch_ops;
  2984. dev_set_drvdata(dev, ds);
  2985. return dsa_register_switch(ds, np);
  2986. }
  2987. static void mv88e6xxx_unregister_switch(struct mv88e6xxx_chip *chip)
  2988. {
  2989. dsa_unregister_switch(chip->ds);
  2990. }
  2991. static int mv88e6xxx_probe(struct mdio_device *mdiodev)
  2992. {
  2993. struct device *dev = &mdiodev->dev;
  2994. struct device_node *np = dev->of_node;
  2995. const struct mv88e6xxx_info *compat_info;
  2996. struct mv88e6xxx_chip *chip;
  2997. u32 eeprom_len;
  2998. int err;
  2999. compat_info = of_device_get_match_data(dev);
  3000. if (!compat_info)
  3001. return -EINVAL;
  3002. chip = mv88e6xxx_alloc_chip(dev);
  3003. if (!chip)
  3004. return -ENOMEM;
  3005. chip->info = compat_info;
  3006. err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr);
  3007. if (err)
  3008. return err;
  3009. err = mv88e6xxx_detect(chip);
  3010. if (err)
  3011. return err;
  3012. mv88e6xxx_phy_init(chip);
  3013. chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
  3014. if (IS_ERR(chip->reset))
  3015. return PTR_ERR(chip->reset);
  3016. if (mv88e6xxx_has(chip, MV88E6XXX_FLAGS_EEPROM16) &&
  3017. !of_property_read_u32(np, "eeprom-length", &eeprom_len))
  3018. chip->eeprom_len = eeprom_len;
  3019. err = mv88e6xxx_mdio_register(chip, np);
  3020. if (err)
  3021. return err;
  3022. err = mv88e6xxx_register_switch(chip, np);
  3023. if (err) {
  3024. mv88e6xxx_mdio_unregister(chip);
  3025. return err;
  3026. }
  3027. return 0;
  3028. }
  3029. static void mv88e6xxx_remove(struct mdio_device *mdiodev)
  3030. {
  3031. struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev);
  3032. struct mv88e6xxx_chip *chip = ds->priv;
  3033. mv88e6xxx_phy_destroy(chip);
  3034. mv88e6xxx_unregister_switch(chip);
  3035. mv88e6xxx_mdio_unregister(chip);
  3036. }
  3037. static const struct of_device_id mv88e6xxx_of_match[] = {
  3038. {
  3039. .compatible = "marvell,mv88e6085",
  3040. .data = &mv88e6xxx_table[MV88E6085],
  3041. },
  3042. { /* sentinel */ },
  3043. };
  3044. MODULE_DEVICE_TABLE(of, mv88e6xxx_of_match);
  3045. static struct mdio_driver mv88e6xxx_driver = {
  3046. .probe = mv88e6xxx_probe,
  3047. .remove = mv88e6xxx_remove,
  3048. .mdiodrv.driver = {
  3049. .name = "mv88e6085",
  3050. .of_match_table = mv88e6xxx_of_match,
  3051. },
  3052. };
  3053. static int __init mv88e6xxx_init(void)
  3054. {
  3055. register_switch_driver(&mv88e6xxx_switch_ops);
  3056. return mdio_driver_register(&mv88e6xxx_driver);
  3057. }
  3058. module_init(mv88e6xxx_init);
  3059. static void __exit mv88e6xxx_cleanup(void)
  3060. {
  3061. mdio_driver_unregister(&mv88e6xxx_driver);
  3062. unregister_switch_driver(&mv88e6xxx_switch_ops);
  3063. }
  3064. module_exit(mv88e6xxx_cleanup);
  3065. MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
  3066. MODULE_DESCRIPTION("Driver for Marvell 88E6XXX ethernet switch chips");
  3067. MODULE_LICENSE("GPL");