ixgbe_ethtool.c 104 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 1999 - 2018 Intel Corporation. */
  3. /* ethtool support for ixgbe */
  4. #include <linux/interrupt.h>
  5. #include <linux/types.h>
  6. #include <linux/module.h>
  7. #include <linux/slab.h>
  8. #include <linux/pci.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/ethtool.h>
  11. #include <linux/vmalloc.h>
  12. #include <linux/highmem.h>
  13. #include <linux/uaccess.h>
  14. #include "ixgbe.h"
  15. #include "ixgbe_phy.h"
  16. enum {NETDEV_STATS, IXGBE_STATS};
  17. struct ixgbe_stats {
  18. char stat_string[ETH_GSTRING_LEN];
  19. int type;
  20. int sizeof_stat;
  21. int stat_offset;
  22. };
  23. #define IXGBE_STAT(m) IXGBE_STATS, \
  24. sizeof(((struct ixgbe_adapter *)0)->m), \
  25. offsetof(struct ixgbe_adapter, m)
  26. #define IXGBE_NETDEV_STAT(m) NETDEV_STATS, \
  27. sizeof(((struct rtnl_link_stats64 *)0)->m), \
  28. offsetof(struct rtnl_link_stats64, m)
  29. static const struct ixgbe_stats ixgbe_gstrings_stats[] = {
  30. {"rx_packets", IXGBE_NETDEV_STAT(rx_packets)},
  31. {"tx_packets", IXGBE_NETDEV_STAT(tx_packets)},
  32. {"rx_bytes", IXGBE_NETDEV_STAT(rx_bytes)},
  33. {"tx_bytes", IXGBE_NETDEV_STAT(tx_bytes)},
  34. {"rx_pkts_nic", IXGBE_STAT(stats.gprc)},
  35. {"tx_pkts_nic", IXGBE_STAT(stats.gptc)},
  36. {"rx_bytes_nic", IXGBE_STAT(stats.gorc)},
  37. {"tx_bytes_nic", IXGBE_STAT(stats.gotc)},
  38. {"lsc_int", IXGBE_STAT(lsc_int)},
  39. {"tx_busy", IXGBE_STAT(tx_busy)},
  40. {"non_eop_descs", IXGBE_STAT(non_eop_descs)},
  41. {"rx_errors", IXGBE_NETDEV_STAT(rx_errors)},
  42. {"tx_errors", IXGBE_NETDEV_STAT(tx_errors)},
  43. {"rx_dropped", IXGBE_NETDEV_STAT(rx_dropped)},
  44. {"tx_dropped", IXGBE_NETDEV_STAT(tx_dropped)},
  45. {"multicast", IXGBE_NETDEV_STAT(multicast)},
  46. {"broadcast", IXGBE_STAT(stats.bprc)},
  47. {"rx_no_buffer_count", IXGBE_STAT(stats.rnbc[0]) },
  48. {"collisions", IXGBE_NETDEV_STAT(collisions)},
  49. {"rx_over_errors", IXGBE_NETDEV_STAT(rx_over_errors)},
  50. {"rx_crc_errors", IXGBE_NETDEV_STAT(rx_crc_errors)},
  51. {"rx_frame_errors", IXGBE_NETDEV_STAT(rx_frame_errors)},
  52. {"hw_rsc_aggregated", IXGBE_STAT(rsc_total_count)},
  53. {"hw_rsc_flushed", IXGBE_STAT(rsc_total_flush)},
  54. {"fdir_match", IXGBE_STAT(stats.fdirmatch)},
  55. {"fdir_miss", IXGBE_STAT(stats.fdirmiss)},
  56. {"fdir_overflow", IXGBE_STAT(fdir_overflow)},
  57. {"rx_fifo_errors", IXGBE_NETDEV_STAT(rx_fifo_errors)},
  58. {"rx_missed_errors", IXGBE_NETDEV_STAT(rx_missed_errors)},
  59. {"tx_aborted_errors", IXGBE_NETDEV_STAT(tx_aborted_errors)},
  60. {"tx_carrier_errors", IXGBE_NETDEV_STAT(tx_carrier_errors)},
  61. {"tx_fifo_errors", IXGBE_NETDEV_STAT(tx_fifo_errors)},
  62. {"tx_heartbeat_errors", IXGBE_NETDEV_STAT(tx_heartbeat_errors)},
  63. {"tx_timeout_count", IXGBE_STAT(tx_timeout_count)},
  64. {"tx_restart_queue", IXGBE_STAT(restart_queue)},
  65. {"rx_length_errors", IXGBE_STAT(stats.rlec)},
  66. {"rx_long_length_errors", IXGBE_STAT(stats.roc)},
  67. {"rx_short_length_errors", IXGBE_STAT(stats.ruc)},
  68. {"tx_flow_control_xon", IXGBE_STAT(stats.lxontxc)},
  69. {"rx_flow_control_xon", IXGBE_STAT(stats.lxonrxc)},
  70. {"tx_flow_control_xoff", IXGBE_STAT(stats.lxofftxc)},
  71. {"rx_flow_control_xoff", IXGBE_STAT(stats.lxoffrxc)},
  72. {"rx_csum_offload_errors", IXGBE_STAT(hw_csum_rx_error)},
  73. {"alloc_rx_page", IXGBE_STAT(alloc_rx_page)},
  74. {"alloc_rx_page_failed", IXGBE_STAT(alloc_rx_page_failed)},
  75. {"alloc_rx_buff_failed", IXGBE_STAT(alloc_rx_buff_failed)},
  76. {"rx_no_dma_resources", IXGBE_STAT(hw_rx_no_dma_resources)},
  77. {"os2bmc_rx_by_bmc", IXGBE_STAT(stats.o2bgptc)},
  78. {"os2bmc_tx_by_bmc", IXGBE_STAT(stats.b2ospc)},
  79. {"os2bmc_tx_by_host", IXGBE_STAT(stats.o2bspc)},
  80. {"os2bmc_rx_by_host", IXGBE_STAT(stats.b2ogprc)},
  81. {"tx_hwtstamp_timeouts", IXGBE_STAT(tx_hwtstamp_timeouts)},
  82. {"tx_hwtstamp_skipped", IXGBE_STAT(tx_hwtstamp_skipped)},
  83. {"rx_hwtstamp_cleared", IXGBE_STAT(rx_hwtstamp_cleared)},
  84. {"tx_ipsec", IXGBE_STAT(tx_ipsec)},
  85. {"rx_ipsec", IXGBE_STAT(rx_ipsec)},
  86. #ifdef IXGBE_FCOE
  87. {"fcoe_bad_fccrc", IXGBE_STAT(stats.fccrc)},
  88. {"rx_fcoe_dropped", IXGBE_STAT(stats.fcoerpdc)},
  89. {"rx_fcoe_packets", IXGBE_STAT(stats.fcoeprc)},
  90. {"rx_fcoe_dwords", IXGBE_STAT(stats.fcoedwrc)},
  91. {"fcoe_noddp", IXGBE_STAT(stats.fcoe_noddp)},
  92. {"fcoe_noddp_ext_buff", IXGBE_STAT(stats.fcoe_noddp_ext_buff)},
  93. {"tx_fcoe_packets", IXGBE_STAT(stats.fcoeptc)},
  94. {"tx_fcoe_dwords", IXGBE_STAT(stats.fcoedwtc)},
  95. #endif /* IXGBE_FCOE */
  96. };
  97. /* ixgbe allocates num_tx_queues and num_rx_queues symmetrically so
  98. * we set the num_rx_queues to evaluate to num_tx_queues. This is
  99. * used because we do not have a good way to get the max number of
  100. * rx queues with CONFIG_RPS disabled.
  101. */
  102. #define IXGBE_NUM_RX_QUEUES netdev->num_tx_queues
  103. #define IXGBE_QUEUE_STATS_LEN ( \
  104. (netdev->num_tx_queues + IXGBE_NUM_RX_QUEUES) * \
  105. (sizeof(struct ixgbe_queue_stats) / sizeof(u64)))
  106. #define IXGBE_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbe_gstrings_stats)
  107. #define IXGBE_PB_STATS_LEN ( \
  108. (sizeof(((struct ixgbe_adapter *)0)->stats.pxonrxc) + \
  109. sizeof(((struct ixgbe_adapter *)0)->stats.pxontxc) + \
  110. sizeof(((struct ixgbe_adapter *)0)->stats.pxoffrxc) + \
  111. sizeof(((struct ixgbe_adapter *)0)->stats.pxofftxc)) \
  112. / sizeof(u64))
  113. #define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + \
  114. IXGBE_PB_STATS_LEN + \
  115. IXGBE_QUEUE_STATS_LEN)
  116. static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {
  117. "Register test (offline)", "Eeprom test (offline)",
  118. "Interrupt test (offline)", "Loopback test (offline)",
  119. "Link test (on/offline)"
  120. };
  121. #define IXGBE_TEST_LEN sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN
  122. static const char ixgbe_priv_flags_strings[][ETH_GSTRING_LEN] = {
  123. #define IXGBE_PRIV_FLAGS_LEGACY_RX BIT(0)
  124. "legacy-rx",
  125. #define IXGBE_PRIV_FLAGS_VF_IPSEC_EN BIT(1)
  126. "vf-ipsec",
  127. #define IXGBE_PRIV_FLAGS_AUTO_DISABLE_VF BIT(2)
  128. "mdd-disable-vf",
  129. };
  130. #define IXGBE_PRIV_FLAGS_STR_LEN ARRAY_SIZE(ixgbe_priv_flags_strings)
  131. #define ixgbe_isbackplane(type) ((type) == ixgbe_media_type_backplane)
  132. static void ixgbe_set_supported_10gtypes(struct ixgbe_hw *hw,
  133. struct ethtool_link_ksettings *cmd)
  134. {
  135. if (!ixgbe_isbackplane(hw->phy.media_type)) {
  136. ethtool_link_ksettings_add_link_mode(cmd, supported,
  137. 10000baseT_Full);
  138. return;
  139. }
  140. switch (hw->device_id) {
  141. case IXGBE_DEV_ID_82598:
  142. case IXGBE_DEV_ID_82599_KX4:
  143. case IXGBE_DEV_ID_82599_KX4_MEZZ:
  144. case IXGBE_DEV_ID_X550EM_X_KX4:
  145. ethtool_link_ksettings_add_link_mode
  146. (cmd, supported, 10000baseKX4_Full);
  147. break;
  148. case IXGBE_DEV_ID_82598_BX:
  149. case IXGBE_DEV_ID_82599_KR:
  150. case IXGBE_DEV_ID_X550EM_X_KR:
  151. case IXGBE_DEV_ID_X550EM_X_XFI:
  152. ethtool_link_ksettings_add_link_mode
  153. (cmd, supported, 10000baseKR_Full);
  154. break;
  155. default:
  156. ethtool_link_ksettings_add_link_mode
  157. (cmd, supported, 10000baseKX4_Full);
  158. ethtool_link_ksettings_add_link_mode
  159. (cmd, supported, 10000baseKR_Full);
  160. break;
  161. }
  162. }
  163. static void ixgbe_set_advertising_10gtypes(struct ixgbe_hw *hw,
  164. struct ethtool_link_ksettings *cmd)
  165. {
  166. if (!ixgbe_isbackplane(hw->phy.media_type)) {
  167. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  168. 10000baseT_Full);
  169. return;
  170. }
  171. switch (hw->device_id) {
  172. case IXGBE_DEV_ID_82598:
  173. case IXGBE_DEV_ID_82599_KX4:
  174. case IXGBE_DEV_ID_82599_KX4_MEZZ:
  175. case IXGBE_DEV_ID_X550EM_X_KX4:
  176. ethtool_link_ksettings_add_link_mode
  177. (cmd, advertising, 10000baseKX4_Full);
  178. break;
  179. case IXGBE_DEV_ID_82598_BX:
  180. case IXGBE_DEV_ID_82599_KR:
  181. case IXGBE_DEV_ID_X550EM_X_KR:
  182. case IXGBE_DEV_ID_X550EM_X_XFI:
  183. ethtool_link_ksettings_add_link_mode
  184. (cmd, advertising, 10000baseKR_Full);
  185. break;
  186. default:
  187. ethtool_link_ksettings_add_link_mode
  188. (cmd, advertising, 10000baseKX4_Full);
  189. ethtool_link_ksettings_add_link_mode
  190. (cmd, advertising, 10000baseKR_Full);
  191. break;
  192. }
  193. }
  194. static int ixgbe_get_link_ksettings(struct net_device *netdev,
  195. struct ethtool_link_ksettings *cmd)
  196. {
  197. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  198. struct ixgbe_hw *hw = &adapter->hw;
  199. ixgbe_link_speed supported_link;
  200. bool autoneg = false;
  201. ethtool_link_ksettings_zero_link_mode(cmd, supported);
  202. ethtool_link_ksettings_zero_link_mode(cmd, advertising);
  203. hw->mac.ops.get_link_capabilities(hw, &supported_link, &autoneg);
  204. /* set the supported link speeds */
  205. if (supported_link & IXGBE_LINK_SPEED_10GB_FULL) {
  206. ixgbe_set_supported_10gtypes(hw, cmd);
  207. ixgbe_set_advertising_10gtypes(hw, cmd);
  208. }
  209. if (supported_link & IXGBE_LINK_SPEED_5GB_FULL)
  210. ethtool_link_ksettings_add_link_mode(cmd, supported,
  211. 5000baseT_Full);
  212. if (supported_link & IXGBE_LINK_SPEED_2_5GB_FULL)
  213. ethtool_link_ksettings_add_link_mode(cmd, supported,
  214. 2500baseT_Full);
  215. if (supported_link & IXGBE_LINK_SPEED_1GB_FULL) {
  216. if (ixgbe_isbackplane(hw->phy.media_type)) {
  217. ethtool_link_ksettings_add_link_mode(cmd, supported,
  218. 1000baseKX_Full);
  219. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  220. 1000baseKX_Full);
  221. } else {
  222. ethtool_link_ksettings_add_link_mode(cmd, supported,
  223. 1000baseT_Full);
  224. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  225. 1000baseT_Full);
  226. }
  227. }
  228. if (supported_link & IXGBE_LINK_SPEED_100_FULL) {
  229. ethtool_link_ksettings_add_link_mode(cmd, supported,
  230. 100baseT_Full);
  231. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  232. 100baseT_Full);
  233. }
  234. if (supported_link & IXGBE_LINK_SPEED_10_FULL) {
  235. ethtool_link_ksettings_add_link_mode(cmd, supported,
  236. 10baseT_Full);
  237. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  238. 10baseT_Full);
  239. }
  240. /* set the advertised speeds */
  241. if (hw->phy.autoneg_advertised) {
  242. ethtool_link_ksettings_zero_link_mode(cmd, advertising);
  243. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10_FULL)
  244. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  245. 10baseT_Full);
  246. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
  247. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  248. 100baseT_Full);
  249. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
  250. ixgbe_set_advertising_10gtypes(hw, cmd);
  251. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) {
  252. if (ethtool_link_ksettings_test_link_mode
  253. (cmd, supported, 1000baseKX_Full))
  254. ethtool_link_ksettings_add_link_mode
  255. (cmd, advertising, 1000baseKX_Full);
  256. else
  257. ethtool_link_ksettings_add_link_mode
  258. (cmd, advertising, 1000baseT_Full);
  259. }
  260. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL)
  261. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  262. 5000baseT_Full);
  263. if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL)
  264. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  265. 2500baseT_Full);
  266. } else {
  267. if (hw->phy.multispeed_fiber && !autoneg) {
  268. if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
  269. ethtool_link_ksettings_add_link_mode
  270. (cmd, advertising, 10000baseT_Full);
  271. }
  272. }
  273. if (autoneg) {
  274. ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg);
  275. ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
  276. cmd->base.autoneg = AUTONEG_ENABLE;
  277. } else
  278. cmd->base.autoneg = AUTONEG_DISABLE;
  279. /* Determine the remaining settings based on the PHY type. */
  280. switch (adapter->hw.phy.type) {
  281. case ixgbe_phy_tn:
  282. case ixgbe_phy_aq:
  283. case ixgbe_phy_x550em_ext_t:
  284. case ixgbe_phy_fw:
  285. case ixgbe_phy_cu_unknown:
  286. ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
  287. ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
  288. cmd->base.port = PORT_TP;
  289. break;
  290. case ixgbe_phy_qt:
  291. ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
  292. ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
  293. cmd->base.port = PORT_FIBRE;
  294. break;
  295. case ixgbe_phy_nl:
  296. case ixgbe_phy_sfp_passive_tyco:
  297. case ixgbe_phy_sfp_passive_unknown:
  298. case ixgbe_phy_sfp_ftl:
  299. case ixgbe_phy_sfp_avago:
  300. case ixgbe_phy_sfp_intel:
  301. case ixgbe_phy_sfp_unknown:
  302. case ixgbe_phy_qsfp_passive_unknown:
  303. case ixgbe_phy_qsfp_active_unknown:
  304. case ixgbe_phy_qsfp_intel:
  305. case ixgbe_phy_qsfp_unknown:
  306. /* SFP+ devices, further checking needed */
  307. switch (adapter->hw.phy.sfp_type) {
  308. case ixgbe_sfp_type_da_cu:
  309. case ixgbe_sfp_type_da_cu_core0:
  310. case ixgbe_sfp_type_da_cu_core1:
  311. ethtool_link_ksettings_add_link_mode(cmd, supported,
  312. FIBRE);
  313. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  314. FIBRE);
  315. cmd->base.port = PORT_DA;
  316. break;
  317. case ixgbe_sfp_type_sr:
  318. case ixgbe_sfp_type_lr:
  319. case ixgbe_sfp_type_srlr_core0:
  320. case ixgbe_sfp_type_srlr_core1:
  321. case ixgbe_sfp_type_1g_sx_core0:
  322. case ixgbe_sfp_type_1g_sx_core1:
  323. case ixgbe_sfp_type_1g_lx_core0:
  324. case ixgbe_sfp_type_1g_lx_core1:
  325. case ixgbe_sfp_type_1g_bx_core0:
  326. case ixgbe_sfp_type_1g_bx_core1:
  327. ethtool_link_ksettings_add_link_mode(cmd, supported,
  328. FIBRE);
  329. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  330. FIBRE);
  331. cmd->base.port = PORT_FIBRE;
  332. break;
  333. case ixgbe_sfp_type_not_present:
  334. ethtool_link_ksettings_add_link_mode(cmd, supported,
  335. FIBRE);
  336. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  337. FIBRE);
  338. cmd->base.port = PORT_NONE;
  339. break;
  340. case ixgbe_sfp_type_1g_cu_core0:
  341. case ixgbe_sfp_type_1g_cu_core1:
  342. ethtool_link_ksettings_add_link_mode(cmd, supported,
  343. TP);
  344. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  345. TP);
  346. cmd->base.port = PORT_TP;
  347. break;
  348. case ixgbe_sfp_type_unknown:
  349. default:
  350. ethtool_link_ksettings_add_link_mode(cmd, supported,
  351. FIBRE);
  352. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  353. FIBRE);
  354. cmd->base.port = PORT_OTHER;
  355. break;
  356. }
  357. break;
  358. case ixgbe_phy_xaui:
  359. ethtool_link_ksettings_add_link_mode(cmd, supported,
  360. FIBRE);
  361. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  362. FIBRE);
  363. cmd->base.port = PORT_NONE;
  364. break;
  365. case ixgbe_phy_unknown:
  366. case ixgbe_phy_generic:
  367. case ixgbe_phy_sfp_unsupported:
  368. default:
  369. ethtool_link_ksettings_add_link_mode(cmd, supported,
  370. FIBRE);
  371. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  372. FIBRE);
  373. cmd->base.port = PORT_OTHER;
  374. break;
  375. }
  376. /* Indicate pause support */
  377. ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
  378. switch (hw->fc.requested_mode) {
  379. case ixgbe_fc_full:
  380. ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
  381. break;
  382. case ixgbe_fc_rx_pause:
  383. ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
  384. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  385. Asym_Pause);
  386. break;
  387. case ixgbe_fc_tx_pause:
  388. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  389. Asym_Pause);
  390. break;
  391. default:
  392. ethtool_link_ksettings_del_link_mode(cmd, advertising, Pause);
  393. ethtool_link_ksettings_del_link_mode(cmd, advertising,
  394. Asym_Pause);
  395. }
  396. if (netif_carrier_ok(netdev)) {
  397. switch (adapter->link_speed) {
  398. case IXGBE_LINK_SPEED_10GB_FULL:
  399. cmd->base.speed = SPEED_10000;
  400. break;
  401. case IXGBE_LINK_SPEED_5GB_FULL:
  402. cmd->base.speed = SPEED_5000;
  403. break;
  404. case IXGBE_LINK_SPEED_2_5GB_FULL:
  405. cmd->base.speed = SPEED_2500;
  406. break;
  407. case IXGBE_LINK_SPEED_1GB_FULL:
  408. cmd->base.speed = SPEED_1000;
  409. break;
  410. case IXGBE_LINK_SPEED_100_FULL:
  411. cmd->base.speed = SPEED_100;
  412. break;
  413. case IXGBE_LINK_SPEED_10_FULL:
  414. cmd->base.speed = SPEED_10;
  415. break;
  416. default:
  417. break;
  418. }
  419. cmd->base.duplex = DUPLEX_FULL;
  420. } else {
  421. cmd->base.speed = SPEED_UNKNOWN;
  422. cmd->base.duplex = DUPLEX_UNKNOWN;
  423. }
  424. return 0;
  425. }
  426. static int ixgbe_set_link_ksettings(struct net_device *netdev,
  427. const struct ethtool_link_ksettings *cmd)
  428. {
  429. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  430. struct ixgbe_hw *hw = &adapter->hw;
  431. u32 advertised, old;
  432. int err = 0;
  433. if ((hw->phy.media_type == ixgbe_media_type_copper) ||
  434. (hw->phy.multispeed_fiber)) {
  435. /*
  436. * this function does not support duplex forcing, but can
  437. * limit the advertising of the adapter to the specified speed
  438. */
  439. if (!linkmode_subset(cmd->link_modes.advertising,
  440. cmd->link_modes.supported))
  441. return -EINVAL;
  442. /* only allow one speed at a time if no autoneg */
  443. if (!cmd->base.autoneg && hw->phy.multispeed_fiber) {
  444. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  445. 10000baseT_Full) &&
  446. ethtool_link_ksettings_test_link_mode(cmd, advertising,
  447. 1000baseT_Full))
  448. return -EINVAL;
  449. }
  450. old = hw->phy.autoneg_advertised;
  451. advertised = 0;
  452. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  453. 10000baseT_Full))
  454. advertised |= IXGBE_LINK_SPEED_10GB_FULL;
  455. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  456. 5000baseT_Full))
  457. advertised |= IXGBE_LINK_SPEED_5GB_FULL;
  458. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  459. 2500baseT_Full))
  460. advertised |= IXGBE_LINK_SPEED_2_5GB_FULL;
  461. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  462. 1000baseT_Full))
  463. advertised |= IXGBE_LINK_SPEED_1GB_FULL;
  464. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  465. 100baseT_Full))
  466. advertised |= IXGBE_LINK_SPEED_100_FULL;
  467. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  468. 10baseT_Full))
  469. advertised |= IXGBE_LINK_SPEED_10_FULL;
  470. if (old == advertised)
  471. return err;
  472. /* this sets the link speed and restarts auto-neg */
  473. while (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
  474. usleep_range(1000, 2000);
  475. hw->mac.autotry_restart = true;
  476. err = hw->mac.ops.setup_link(hw, advertised, true);
  477. if (err) {
  478. e_info(probe, "setup link failed with code %d\n", err);
  479. hw->mac.ops.setup_link(hw, old, true);
  480. }
  481. clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);
  482. } else {
  483. /* in this case we currently only support 10Gb/FULL */
  484. u32 speed = cmd->base.speed;
  485. if ((cmd->base.autoneg == AUTONEG_ENABLE) ||
  486. (!ethtool_link_ksettings_test_link_mode(cmd, advertising,
  487. 10000baseT_Full)) ||
  488. (speed + cmd->base.duplex != SPEED_10000 + DUPLEX_FULL))
  489. return -EINVAL;
  490. }
  491. return err;
  492. }
  493. static void ixgbe_get_pause_stats(struct net_device *netdev,
  494. struct ethtool_pause_stats *stats)
  495. {
  496. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  497. struct ixgbe_hw_stats *hwstats = &adapter->stats;
  498. stats->tx_pause_frames = hwstats->lxontxc + hwstats->lxofftxc;
  499. stats->rx_pause_frames = hwstats->lxonrxc + hwstats->lxoffrxc;
  500. }
  501. static void ixgbe_get_pauseparam(struct net_device *netdev,
  502. struct ethtool_pauseparam *pause)
  503. {
  504. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  505. struct ixgbe_hw *hw = &adapter->hw;
  506. if (ixgbe_device_supports_autoneg_fc(hw) &&
  507. !hw->fc.disable_fc_autoneg)
  508. pause->autoneg = 1;
  509. else
  510. pause->autoneg = 0;
  511. if (hw->fc.current_mode == ixgbe_fc_rx_pause) {
  512. pause->rx_pause = 1;
  513. } else if (hw->fc.current_mode == ixgbe_fc_tx_pause) {
  514. pause->tx_pause = 1;
  515. } else if (hw->fc.current_mode == ixgbe_fc_full) {
  516. pause->rx_pause = 1;
  517. pause->tx_pause = 1;
  518. }
  519. }
  520. static int ixgbe_set_pauseparam(struct net_device *netdev,
  521. struct ethtool_pauseparam *pause)
  522. {
  523. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  524. struct ixgbe_hw *hw = &adapter->hw;
  525. struct ixgbe_fc_info fc = hw->fc;
  526. /* 82598 does no support link flow control with DCB enabled */
  527. if ((hw->mac.type == ixgbe_mac_82598EB) &&
  528. (adapter->flags & IXGBE_FLAG_DCB_ENABLED))
  529. return -EINVAL;
  530. /* some devices do not support autoneg of link flow control */
  531. if ((pause->autoneg == AUTONEG_ENABLE) &&
  532. !ixgbe_device_supports_autoneg_fc(hw))
  533. return -EINVAL;
  534. fc.disable_fc_autoneg = (pause->autoneg != AUTONEG_ENABLE);
  535. if ((pause->rx_pause && pause->tx_pause) || pause->autoneg)
  536. fc.requested_mode = ixgbe_fc_full;
  537. else if (pause->rx_pause && !pause->tx_pause)
  538. fc.requested_mode = ixgbe_fc_rx_pause;
  539. else if (!pause->rx_pause && pause->tx_pause)
  540. fc.requested_mode = ixgbe_fc_tx_pause;
  541. else
  542. fc.requested_mode = ixgbe_fc_none;
  543. /* if the thing changed then we'll update and use new autoneg */
  544. if (memcmp(&fc, &hw->fc, sizeof(struct ixgbe_fc_info))) {
  545. hw->fc = fc;
  546. if (netif_running(netdev))
  547. ixgbe_reinit_locked(adapter);
  548. else
  549. ixgbe_reset(adapter);
  550. }
  551. return 0;
  552. }
  553. static u32 ixgbe_get_msglevel(struct net_device *netdev)
  554. {
  555. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  556. return adapter->msg_enable;
  557. }
  558. static void ixgbe_set_msglevel(struct net_device *netdev, u32 data)
  559. {
  560. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  561. adapter->msg_enable = data;
  562. }
  563. static int ixgbe_get_regs_len(struct net_device *netdev)
  564. {
  565. #define IXGBE_REGS_LEN 1145
  566. return IXGBE_REGS_LEN * sizeof(u32);
  567. }
  568. #define IXGBE_GET_STAT(_A_, _R_) _A_->stats._R_
  569. static void ixgbe_get_regs(struct net_device *netdev,
  570. struct ethtool_regs *regs, void *p)
  571. {
  572. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  573. struct ixgbe_hw *hw = &adapter->hw;
  574. u32 *regs_buff = p;
  575. u8 i;
  576. memset(p, 0, IXGBE_REGS_LEN * sizeof(u32));
  577. regs->version = hw->mac.type << 24 | hw->revision_id << 16 |
  578. hw->device_id;
  579. /* General Registers */
  580. regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_CTRL);
  581. regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_STATUS);
  582. regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
  583. regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_ESDP);
  584. regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_EODSDP);
  585. regs_buff[5] = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
  586. regs_buff[6] = IXGBE_READ_REG(hw, IXGBE_FRTIMER);
  587. regs_buff[7] = IXGBE_READ_REG(hw, IXGBE_TCPTIMER);
  588. /* NVM Register */
  589. regs_buff[8] = IXGBE_READ_REG(hw, IXGBE_EEC(hw));
  590. regs_buff[9] = IXGBE_READ_REG(hw, IXGBE_EERD);
  591. regs_buff[10] = IXGBE_READ_REG(hw, IXGBE_FLA(hw));
  592. regs_buff[11] = IXGBE_READ_REG(hw, IXGBE_EEMNGCTL);
  593. regs_buff[12] = IXGBE_READ_REG(hw, IXGBE_EEMNGDATA);
  594. regs_buff[13] = IXGBE_READ_REG(hw, IXGBE_FLMNGCTL);
  595. regs_buff[14] = IXGBE_READ_REG(hw, IXGBE_FLMNGDATA);
  596. regs_buff[15] = IXGBE_READ_REG(hw, IXGBE_FLMNGCNT);
  597. regs_buff[16] = IXGBE_READ_REG(hw, IXGBE_FLOP);
  598. regs_buff[17] = IXGBE_READ_REG(hw, IXGBE_GRC(hw));
  599. /* Interrupt */
  600. /* don't read EICR because it can clear interrupt causes, instead
  601. * read EICS which is a shadow but doesn't clear EICR */
  602. regs_buff[18] = IXGBE_READ_REG(hw, IXGBE_EICS);
  603. regs_buff[19] = IXGBE_READ_REG(hw, IXGBE_EICS);
  604. regs_buff[20] = IXGBE_READ_REG(hw, IXGBE_EIMS);
  605. regs_buff[21] = IXGBE_READ_REG(hw, IXGBE_EIMC);
  606. regs_buff[22] = IXGBE_READ_REG(hw, IXGBE_EIAC);
  607. regs_buff[23] = IXGBE_READ_REG(hw, IXGBE_EIAM);
  608. regs_buff[24] = IXGBE_READ_REG(hw, IXGBE_EITR(0));
  609. regs_buff[25] = IXGBE_READ_REG(hw, IXGBE_IVAR(0));
  610. regs_buff[26] = IXGBE_READ_REG(hw, IXGBE_MSIXT);
  611. regs_buff[27] = IXGBE_READ_REG(hw, IXGBE_MSIXPBA);
  612. regs_buff[28] = IXGBE_READ_REG(hw, IXGBE_PBACL(0));
  613. regs_buff[29] = IXGBE_READ_REG(hw, IXGBE_GPIE);
  614. /* Flow Control */
  615. regs_buff[30] = IXGBE_READ_REG(hw, IXGBE_PFCTOP);
  616. for (i = 0; i < 4; i++)
  617. regs_buff[31 + i] = IXGBE_READ_REG(hw, IXGBE_FCTTV(i));
  618. for (i = 0; i < 8; i++) {
  619. switch (hw->mac.type) {
  620. case ixgbe_mac_82598EB:
  621. regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTL(i));
  622. regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTH(i));
  623. break;
  624. case ixgbe_mac_82599EB:
  625. case ixgbe_mac_X540:
  626. case ixgbe_mac_X550:
  627. case ixgbe_mac_X550EM_x:
  628. case ixgbe_mac_x550em_a:
  629. regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTL_82599(i));
  630. regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_FCRTH_82599(i));
  631. break;
  632. default:
  633. break;
  634. }
  635. }
  636. regs_buff[51] = IXGBE_READ_REG(hw, IXGBE_FCRTV);
  637. regs_buff[52] = IXGBE_READ_REG(hw, IXGBE_TFCS);
  638. /* Receive DMA */
  639. for (i = 0; i < 64; i++)
  640. regs_buff[53 + i] = IXGBE_READ_REG(hw, IXGBE_RDBAL(i));
  641. for (i = 0; i < 64; i++)
  642. regs_buff[117 + i] = IXGBE_READ_REG(hw, IXGBE_RDBAH(i));
  643. for (i = 0; i < 64; i++)
  644. regs_buff[181 + i] = IXGBE_READ_REG(hw, IXGBE_RDLEN(i));
  645. for (i = 0; i < 64; i++)
  646. regs_buff[245 + i] = IXGBE_READ_REG(hw, IXGBE_RDH(i));
  647. for (i = 0; i < 64; i++)
  648. regs_buff[309 + i] = IXGBE_READ_REG(hw, IXGBE_RDT(i));
  649. for (i = 0; i < 64; i++)
  650. regs_buff[373 + i] = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
  651. for (i = 0; i < 16; i++)
  652. regs_buff[437 + i] = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i));
  653. for (i = 0; i < 16; i++)
  654. regs_buff[453 + i] = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
  655. regs_buff[469] = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
  656. for (i = 0; i < 8; i++)
  657. regs_buff[470 + i] = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
  658. regs_buff[478] = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
  659. regs_buff[479] = IXGBE_READ_REG(hw, IXGBE_DROPEN);
  660. /* Receive */
  661. regs_buff[480] = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
  662. regs_buff[481] = IXGBE_READ_REG(hw, IXGBE_RFCTL);
  663. for (i = 0; i < 16; i++)
  664. regs_buff[482 + i] = IXGBE_READ_REG(hw, IXGBE_RAL(i));
  665. for (i = 0; i < 16; i++)
  666. regs_buff[498 + i] = IXGBE_READ_REG(hw, IXGBE_RAH(i));
  667. regs_buff[514] = IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0));
  668. regs_buff[515] = IXGBE_READ_REG(hw, IXGBE_FCTRL);
  669. regs_buff[516] = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
  670. regs_buff[517] = IXGBE_READ_REG(hw, IXGBE_MCSTCTRL);
  671. regs_buff[518] = IXGBE_READ_REG(hw, IXGBE_MRQC);
  672. regs_buff[519] = IXGBE_READ_REG(hw, IXGBE_VMD_CTL);
  673. for (i = 0; i < 8; i++)
  674. regs_buff[520 + i] = IXGBE_READ_REG(hw, IXGBE_IMIR(i));
  675. for (i = 0; i < 8; i++)
  676. regs_buff[528 + i] = IXGBE_READ_REG(hw, IXGBE_IMIREXT(i));
  677. regs_buff[536] = IXGBE_READ_REG(hw, IXGBE_IMIRVP);
  678. /* Transmit */
  679. for (i = 0; i < 32; i++)
  680. regs_buff[537 + i] = IXGBE_READ_REG(hw, IXGBE_TDBAL(i));
  681. for (i = 0; i < 32; i++)
  682. regs_buff[569 + i] = IXGBE_READ_REG(hw, IXGBE_TDBAH(i));
  683. for (i = 0; i < 32; i++)
  684. regs_buff[601 + i] = IXGBE_READ_REG(hw, IXGBE_TDLEN(i));
  685. for (i = 0; i < 32; i++)
  686. regs_buff[633 + i] = IXGBE_READ_REG(hw, IXGBE_TDH(i));
  687. for (i = 0; i < 32; i++)
  688. regs_buff[665 + i] = IXGBE_READ_REG(hw, IXGBE_TDT(i));
  689. for (i = 0; i < 32; i++)
  690. regs_buff[697 + i] = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
  691. for (i = 0; i < 32; i++)
  692. regs_buff[729 + i] = IXGBE_READ_REG(hw, IXGBE_TDWBAL(i));
  693. for (i = 0; i < 32; i++)
  694. regs_buff[761 + i] = IXGBE_READ_REG(hw, IXGBE_TDWBAH(i));
  695. regs_buff[793] = IXGBE_READ_REG(hw, IXGBE_DTXCTL);
  696. for (i = 0; i < 16; i++)
  697. regs_buff[794 + i] = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
  698. regs_buff[810] = IXGBE_READ_REG(hw, IXGBE_TIPG);
  699. for (i = 0; i < 8; i++)
  700. regs_buff[811 + i] = IXGBE_READ_REG(hw, IXGBE_TXPBSIZE(i));
  701. regs_buff[819] = IXGBE_READ_REG(hw, IXGBE_MNGTXMAP);
  702. /* Wake Up */
  703. regs_buff[820] = IXGBE_READ_REG(hw, IXGBE_WUC);
  704. regs_buff[821] = IXGBE_READ_REG(hw, IXGBE_WUFC);
  705. regs_buff[822] = IXGBE_READ_REG(hw, IXGBE_WUS);
  706. regs_buff[823] = IXGBE_READ_REG(hw, IXGBE_IPAV);
  707. regs_buff[824] = IXGBE_READ_REG(hw, IXGBE_IP4AT);
  708. regs_buff[825] = IXGBE_READ_REG(hw, IXGBE_IP6AT);
  709. regs_buff[826] = IXGBE_READ_REG(hw, IXGBE_WUPL);
  710. regs_buff[827] = IXGBE_READ_REG(hw, IXGBE_WUPM);
  711. regs_buff[828] = IXGBE_READ_REG(hw, IXGBE_FHFT(0));
  712. /* DCB */
  713. regs_buff[829] = IXGBE_READ_REG(hw, IXGBE_RMCS); /* same as FCCFG */
  714. regs_buff[831] = IXGBE_READ_REG(hw, IXGBE_PDPMCS); /* same as RTTPCS */
  715. switch (hw->mac.type) {
  716. case ixgbe_mac_82598EB:
  717. regs_buff[830] = IXGBE_READ_REG(hw, IXGBE_DPMCS);
  718. regs_buff[832] = IXGBE_READ_REG(hw, IXGBE_RUPPBMR);
  719. for (i = 0; i < 8; i++)
  720. regs_buff[833 + i] =
  721. IXGBE_READ_REG(hw, IXGBE_RT2CR(i));
  722. for (i = 0; i < 8; i++)
  723. regs_buff[841 + i] =
  724. IXGBE_READ_REG(hw, IXGBE_RT2SR(i));
  725. for (i = 0; i < 8; i++)
  726. regs_buff[849 + i] =
  727. IXGBE_READ_REG(hw, IXGBE_TDTQ2TCCR(i));
  728. for (i = 0; i < 8; i++)
  729. regs_buff[857 + i] =
  730. IXGBE_READ_REG(hw, IXGBE_TDTQ2TCSR(i));
  731. break;
  732. case ixgbe_mac_82599EB:
  733. case ixgbe_mac_X540:
  734. case ixgbe_mac_X550:
  735. case ixgbe_mac_X550EM_x:
  736. case ixgbe_mac_x550em_a:
  737. regs_buff[830] = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
  738. regs_buff[832] = IXGBE_READ_REG(hw, IXGBE_RTRPCS);
  739. for (i = 0; i < 8; i++)
  740. regs_buff[833 + i] =
  741. IXGBE_READ_REG(hw, IXGBE_RTRPT4C(i));
  742. for (i = 0; i < 8; i++)
  743. regs_buff[841 + i] =
  744. IXGBE_READ_REG(hw, IXGBE_RTRPT4S(i));
  745. for (i = 0; i < 8; i++)
  746. regs_buff[849 + i] =
  747. IXGBE_READ_REG(hw, IXGBE_RTTDT2C(i));
  748. for (i = 0; i < 8; i++)
  749. regs_buff[857 + i] =
  750. IXGBE_READ_REG(hw, IXGBE_RTTDT2S(i));
  751. break;
  752. default:
  753. break;
  754. }
  755. for (i = 0; i < 8; i++)
  756. regs_buff[865 + i] =
  757. IXGBE_READ_REG(hw, IXGBE_TDPT2TCCR(i)); /* same as RTTPT2C */
  758. for (i = 0; i < 8; i++)
  759. regs_buff[873 + i] =
  760. IXGBE_READ_REG(hw, IXGBE_TDPT2TCSR(i)); /* same as RTTPT2S */
  761. /* Statistics */
  762. regs_buff[881] = IXGBE_GET_STAT(adapter, crcerrs);
  763. regs_buff[882] = IXGBE_GET_STAT(adapter, illerrc);
  764. regs_buff[883] = IXGBE_GET_STAT(adapter, errbc);
  765. regs_buff[884] = IXGBE_GET_STAT(adapter, mspdc);
  766. for (i = 0; i < 8; i++)
  767. regs_buff[885 + i] = IXGBE_GET_STAT(adapter, mpc[i]);
  768. regs_buff[893] = IXGBE_GET_STAT(adapter, mlfc);
  769. regs_buff[894] = IXGBE_GET_STAT(adapter, mrfc);
  770. regs_buff[895] = IXGBE_GET_STAT(adapter, rlec);
  771. regs_buff[896] = IXGBE_GET_STAT(adapter, lxontxc);
  772. regs_buff[897] = IXGBE_GET_STAT(adapter, lxonrxc);
  773. regs_buff[898] = IXGBE_GET_STAT(adapter, lxofftxc);
  774. regs_buff[899] = IXGBE_GET_STAT(adapter, lxoffrxc);
  775. for (i = 0; i < 8; i++)
  776. regs_buff[900 + i] = IXGBE_GET_STAT(adapter, pxontxc[i]);
  777. for (i = 0; i < 8; i++)
  778. regs_buff[908 + i] = IXGBE_GET_STAT(adapter, pxonrxc[i]);
  779. for (i = 0; i < 8; i++)
  780. regs_buff[916 + i] = IXGBE_GET_STAT(adapter, pxofftxc[i]);
  781. for (i = 0; i < 8; i++)
  782. regs_buff[924 + i] = IXGBE_GET_STAT(adapter, pxoffrxc[i]);
  783. regs_buff[932] = IXGBE_GET_STAT(adapter, prc64);
  784. regs_buff[933] = IXGBE_GET_STAT(adapter, prc127);
  785. regs_buff[934] = IXGBE_GET_STAT(adapter, prc255);
  786. regs_buff[935] = IXGBE_GET_STAT(adapter, prc511);
  787. regs_buff[936] = IXGBE_GET_STAT(adapter, prc1023);
  788. regs_buff[937] = IXGBE_GET_STAT(adapter, prc1522);
  789. regs_buff[938] = IXGBE_GET_STAT(adapter, gprc);
  790. regs_buff[939] = IXGBE_GET_STAT(adapter, bprc);
  791. regs_buff[940] = IXGBE_GET_STAT(adapter, mprc);
  792. regs_buff[941] = IXGBE_GET_STAT(adapter, gptc);
  793. regs_buff[942] = (u32)IXGBE_GET_STAT(adapter, gorc);
  794. regs_buff[943] = (u32)(IXGBE_GET_STAT(adapter, gorc) >> 32);
  795. regs_buff[944] = (u32)IXGBE_GET_STAT(adapter, gotc);
  796. regs_buff[945] = (u32)(IXGBE_GET_STAT(adapter, gotc) >> 32);
  797. for (i = 0; i < 8; i++)
  798. regs_buff[946 + i] = IXGBE_GET_STAT(adapter, rnbc[i]);
  799. regs_buff[954] = IXGBE_GET_STAT(adapter, ruc);
  800. regs_buff[955] = IXGBE_GET_STAT(adapter, rfc);
  801. regs_buff[956] = IXGBE_GET_STAT(adapter, roc);
  802. regs_buff[957] = IXGBE_GET_STAT(adapter, rjc);
  803. regs_buff[958] = IXGBE_GET_STAT(adapter, mngprc);
  804. regs_buff[959] = IXGBE_GET_STAT(adapter, mngpdc);
  805. regs_buff[960] = IXGBE_GET_STAT(adapter, mngptc);
  806. regs_buff[961] = (u32)IXGBE_GET_STAT(adapter, tor);
  807. regs_buff[962] = (u32)(IXGBE_GET_STAT(adapter, tor) >> 32);
  808. regs_buff[963] = IXGBE_GET_STAT(adapter, tpr);
  809. regs_buff[964] = IXGBE_GET_STAT(adapter, tpt);
  810. regs_buff[965] = IXGBE_GET_STAT(adapter, ptc64);
  811. regs_buff[966] = IXGBE_GET_STAT(adapter, ptc127);
  812. regs_buff[967] = IXGBE_GET_STAT(adapter, ptc255);
  813. regs_buff[968] = IXGBE_GET_STAT(adapter, ptc511);
  814. regs_buff[969] = IXGBE_GET_STAT(adapter, ptc1023);
  815. regs_buff[970] = IXGBE_GET_STAT(adapter, ptc1522);
  816. regs_buff[971] = IXGBE_GET_STAT(adapter, mptc);
  817. regs_buff[972] = IXGBE_GET_STAT(adapter, bptc);
  818. regs_buff[973] = IXGBE_GET_STAT(adapter, xec);
  819. for (i = 0; i < 16; i++)
  820. regs_buff[974 + i] = IXGBE_GET_STAT(adapter, qprc[i]);
  821. for (i = 0; i < 16; i++)
  822. regs_buff[990 + i] = IXGBE_GET_STAT(adapter, qptc[i]);
  823. for (i = 0; i < 16; i++)
  824. regs_buff[1006 + i] = IXGBE_GET_STAT(adapter, qbrc[i]);
  825. for (i = 0; i < 16; i++)
  826. regs_buff[1022 + i] = IXGBE_GET_STAT(adapter, qbtc[i]);
  827. /* MAC */
  828. regs_buff[1038] = IXGBE_READ_REG(hw, IXGBE_PCS1GCFIG);
  829. regs_buff[1039] = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL);
  830. regs_buff[1040] = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA);
  831. regs_buff[1041] = IXGBE_READ_REG(hw, IXGBE_PCS1GDBG0);
  832. regs_buff[1042] = IXGBE_READ_REG(hw, IXGBE_PCS1GDBG1);
  833. regs_buff[1043] = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
  834. regs_buff[1044] = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
  835. regs_buff[1045] = IXGBE_READ_REG(hw, IXGBE_PCS1GANNP);
  836. regs_buff[1046] = IXGBE_READ_REG(hw, IXGBE_PCS1GANLPNP);
  837. regs_buff[1047] = IXGBE_READ_REG(hw, IXGBE_HLREG0);
  838. regs_buff[1048] = IXGBE_READ_REG(hw, IXGBE_HLREG1);
  839. regs_buff[1049] = IXGBE_READ_REG(hw, IXGBE_PAP);
  840. regs_buff[1050] = IXGBE_READ_REG(hw, IXGBE_MACA);
  841. regs_buff[1051] = IXGBE_READ_REG(hw, IXGBE_APAE);
  842. regs_buff[1052] = IXGBE_READ_REG(hw, IXGBE_ARD);
  843. regs_buff[1053] = IXGBE_READ_REG(hw, IXGBE_AIS);
  844. regs_buff[1054] = IXGBE_READ_REG(hw, IXGBE_MSCA);
  845. regs_buff[1055] = IXGBE_READ_REG(hw, IXGBE_MSRWD);
  846. regs_buff[1056] = IXGBE_READ_REG(hw, IXGBE_MLADD);
  847. regs_buff[1057] = IXGBE_READ_REG(hw, IXGBE_MHADD);
  848. regs_buff[1058] = IXGBE_READ_REG(hw, IXGBE_TREG);
  849. regs_buff[1059] = IXGBE_READ_REG(hw, IXGBE_PCSS1);
  850. regs_buff[1060] = IXGBE_READ_REG(hw, IXGBE_PCSS2);
  851. regs_buff[1061] = IXGBE_READ_REG(hw, IXGBE_XPCSS);
  852. regs_buff[1062] = IXGBE_READ_REG(hw, IXGBE_SERDESC);
  853. regs_buff[1063] = IXGBE_READ_REG(hw, IXGBE_MACS);
  854. regs_buff[1064] = IXGBE_READ_REG(hw, IXGBE_AUTOC);
  855. regs_buff[1065] = IXGBE_READ_REG(hw, IXGBE_LINKS);
  856. regs_buff[1066] = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
  857. regs_buff[1067] = IXGBE_READ_REG(hw, IXGBE_AUTOC3);
  858. regs_buff[1068] = IXGBE_READ_REG(hw, IXGBE_ANLP1);
  859. regs_buff[1069] = IXGBE_READ_REG(hw, IXGBE_ANLP2);
  860. regs_buff[1070] = IXGBE_READ_REG(hw, IXGBE_ATLASCTL);
  861. /* Diagnostic */
  862. regs_buff[1071] = IXGBE_READ_REG(hw, IXGBE_RDSTATCTL);
  863. for (i = 0; i < 8; i++)
  864. regs_buff[1072 + i] = IXGBE_READ_REG(hw, IXGBE_RDSTAT(i));
  865. regs_buff[1080] = IXGBE_READ_REG(hw, IXGBE_RDHMPN);
  866. for (i = 0; i < 4; i++)
  867. regs_buff[1081 + i] = IXGBE_READ_REG(hw, IXGBE_RIC_DW(i));
  868. regs_buff[1085] = IXGBE_READ_REG(hw, IXGBE_RDPROBE);
  869. regs_buff[1086] = IXGBE_READ_REG(hw, IXGBE_TDSTATCTL);
  870. for (i = 0; i < 8; i++)
  871. regs_buff[1087 + i] = IXGBE_READ_REG(hw, IXGBE_TDSTAT(i));
  872. regs_buff[1095] = IXGBE_READ_REG(hw, IXGBE_TDHMPN);
  873. for (i = 0; i < 4; i++)
  874. regs_buff[1096 + i] = IXGBE_READ_REG(hw, IXGBE_TIC_DW(i));
  875. regs_buff[1100] = IXGBE_READ_REG(hw, IXGBE_TDPROBE);
  876. regs_buff[1101] = IXGBE_READ_REG(hw, IXGBE_TXBUFCTRL);
  877. for (i = 0; i < 4; i++)
  878. regs_buff[1102 + i] = IXGBE_READ_REG(hw, IXGBE_TXBUFDATA(i));
  879. regs_buff[1106] = IXGBE_READ_REG(hw, IXGBE_RXBUFCTRL);
  880. for (i = 0; i < 4; i++)
  881. regs_buff[1107 + i] = IXGBE_READ_REG(hw, IXGBE_RXBUFDATA(i));
  882. for (i = 0; i < 8; i++)
  883. regs_buff[1111 + i] = IXGBE_READ_REG(hw, IXGBE_PCIE_DIAG(i));
  884. regs_buff[1119] = IXGBE_READ_REG(hw, IXGBE_RFVAL);
  885. regs_buff[1120] = IXGBE_READ_REG(hw, IXGBE_MDFTC1);
  886. regs_buff[1121] = IXGBE_READ_REG(hw, IXGBE_MDFTC2);
  887. regs_buff[1122] = IXGBE_READ_REG(hw, IXGBE_MDFTFIFO1);
  888. regs_buff[1123] = IXGBE_READ_REG(hw, IXGBE_MDFTFIFO2);
  889. regs_buff[1124] = IXGBE_READ_REG(hw, IXGBE_MDFTS);
  890. regs_buff[1125] = IXGBE_READ_REG(hw, IXGBE_PCIEECCCTL);
  891. regs_buff[1126] = IXGBE_READ_REG(hw, IXGBE_PBTXECC);
  892. regs_buff[1127] = IXGBE_READ_REG(hw, IXGBE_PBRXECC);
  893. /* 82599 X540 specific registers */
  894. regs_buff[1128] = IXGBE_READ_REG(hw, IXGBE_MFLCN);
  895. /* 82599 X540 specific DCB registers */
  896. regs_buff[1129] = IXGBE_READ_REG(hw, IXGBE_RTRUP2TC);
  897. regs_buff[1130] = IXGBE_READ_REG(hw, IXGBE_RTTUP2TC);
  898. for (i = 0; i < 4; i++)
  899. regs_buff[1131 + i] = IXGBE_READ_REG(hw, IXGBE_TXLLQ(i));
  900. regs_buff[1135] = IXGBE_READ_REG(hw, IXGBE_RTTBCNRM);
  901. /* same as RTTQCNRM */
  902. regs_buff[1136] = IXGBE_READ_REG(hw, IXGBE_RTTBCNRD);
  903. /* same as RTTQCNRR */
  904. /* X540 specific DCB registers */
  905. regs_buff[1137] = IXGBE_READ_REG(hw, IXGBE_RTTQCNCR);
  906. regs_buff[1138] = IXGBE_READ_REG(hw, IXGBE_RTTQCNTG);
  907. /* Security config registers */
  908. regs_buff[1139] = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
  909. regs_buff[1140] = IXGBE_READ_REG(hw, IXGBE_SECTXSTAT);
  910. regs_buff[1141] = IXGBE_READ_REG(hw, IXGBE_SECTXBUFFAF);
  911. regs_buff[1142] = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
  912. regs_buff[1143] = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL);
  913. regs_buff[1144] = IXGBE_READ_REG(hw, IXGBE_SECRXSTAT);
  914. }
  915. static int ixgbe_get_eeprom_len(struct net_device *netdev)
  916. {
  917. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  918. return adapter->hw.eeprom.word_size * 2;
  919. }
  920. static int ixgbe_get_eeprom(struct net_device *netdev,
  921. struct ethtool_eeprom *eeprom, u8 *bytes)
  922. {
  923. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  924. struct ixgbe_hw *hw = &adapter->hw;
  925. u16 *eeprom_buff;
  926. int first_word, last_word, eeprom_len;
  927. int ret_val = 0;
  928. u16 i;
  929. if (eeprom->len == 0)
  930. return -EINVAL;
  931. eeprom->magic = hw->vendor_id | (hw->device_id << 16);
  932. first_word = eeprom->offset >> 1;
  933. last_word = (eeprom->offset + eeprom->len - 1) >> 1;
  934. eeprom_len = last_word - first_word + 1;
  935. eeprom_buff = kmalloc_array(eeprom_len, sizeof(u16), GFP_KERNEL);
  936. if (!eeprom_buff)
  937. return -ENOMEM;
  938. ret_val = hw->eeprom.ops.read_buffer(hw, first_word, eeprom_len,
  939. eeprom_buff);
  940. /* Device's eeprom is always little-endian, word addressable */
  941. for (i = 0; i < eeprom_len; i++)
  942. le16_to_cpus(&eeprom_buff[i]);
  943. memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len);
  944. kfree(eeprom_buff);
  945. return ret_val;
  946. }
  947. static int ixgbe_set_eeprom(struct net_device *netdev,
  948. struct ethtool_eeprom *eeprom, u8 *bytes)
  949. {
  950. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  951. struct ixgbe_hw *hw = &adapter->hw;
  952. u16 *eeprom_buff;
  953. void *ptr;
  954. int max_len, first_word, last_word, ret_val = 0;
  955. u16 i;
  956. if (eeprom->len == 0)
  957. return -EINVAL;
  958. if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
  959. return -EINVAL;
  960. max_len = hw->eeprom.word_size * 2;
  961. first_word = eeprom->offset >> 1;
  962. last_word = (eeprom->offset + eeprom->len - 1) >> 1;
  963. eeprom_buff = kmalloc(max_len, GFP_KERNEL);
  964. if (!eeprom_buff)
  965. return -ENOMEM;
  966. ptr = eeprom_buff;
  967. if (eeprom->offset & 1) {
  968. /*
  969. * need read/modify/write of first changed EEPROM word
  970. * only the second byte of the word is being modified
  971. */
  972. ret_val = hw->eeprom.ops.read(hw, first_word, &eeprom_buff[0]);
  973. if (ret_val)
  974. goto err;
  975. ptr++;
  976. }
  977. if ((eeprom->offset + eeprom->len) & 1) {
  978. /*
  979. * need read/modify/write of last changed EEPROM word
  980. * only the first byte of the word is being modified
  981. */
  982. ret_val = hw->eeprom.ops.read(hw, last_word,
  983. &eeprom_buff[last_word - first_word]);
  984. if (ret_val)
  985. goto err;
  986. }
  987. /* Device's eeprom is always little-endian, word addressable */
  988. for (i = 0; i < last_word - first_word + 1; i++)
  989. le16_to_cpus(&eeprom_buff[i]);
  990. memcpy(ptr, bytes, eeprom->len);
  991. for (i = 0; i < last_word - first_word + 1; i++)
  992. cpu_to_le16s(&eeprom_buff[i]);
  993. ret_val = hw->eeprom.ops.write_buffer(hw, first_word,
  994. last_word - first_word + 1,
  995. eeprom_buff);
  996. /* Update the checksum */
  997. if (ret_val == 0)
  998. hw->eeprom.ops.update_checksum(hw);
  999. err:
  1000. kfree(eeprom_buff);
  1001. return ret_val;
  1002. }
  1003. static void ixgbe_get_drvinfo(struct net_device *netdev,
  1004. struct ethtool_drvinfo *drvinfo)
  1005. {
  1006. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1007. strscpy(drvinfo->driver, ixgbe_driver_name, sizeof(drvinfo->driver));
  1008. strscpy(drvinfo->fw_version, adapter->eeprom_id,
  1009. sizeof(drvinfo->fw_version));
  1010. strscpy(drvinfo->bus_info, pci_name(adapter->pdev),
  1011. sizeof(drvinfo->bus_info));
  1012. drvinfo->n_priv_flags = IXGBE_PRIV_FLAGS_STR_LEN;
  1013. }
  1014. static u32 ixgbe_get_max_rxd(struct ixgbe_adapter *adapter)
  1015. {
  1016. switch (adapter->hw.mac.type) {
  1017. case ixgbe_mac_82598EB:
  1018. return IXGBE_MAX_RXD_82598;
  1019. case ixgbe_mac_82599EB:
  1020. return IXGBE_MAX_RXD_82599;
  1021. case ixgbe_mac_X540:
  1022. return IXGBE_MAX_RXD_X540;
  1023. case ixgbe_mac_X550:
  1024. case ixgbe_mac_X550EM_x:
  1025. case ixgbe_mac_x550em_a:
  1026. return IXGBE_MAX_RXD_X550;
  1027. default:
  1028. return IXGBE_MAX_RXD_82598;
  1029. }
  1030. }
  1031. static u32 ixgbe_get_max_txd(struct ixgbe_adapter *adapter)
  1032. {
  1033. switch (adapter->hw.mac.type) {
  1034. case ixgbe_mac_82598EB:
  1035. return IXGBE_MAX_TXD_82598;
  1036. case ixgbe_mac_82599EB:
  1037. return IXGBE_MAX_TXD_82599;
  1038. case ixgbe_mac_X540:
  1039. return IXGBE_MAX_TXD_X540;
  1040. case ixgbe_mac_X550:
  1041. case ixgbe_mac_X550EM_x:
  1042. case ixgbe_mac_x550em_a:
  1043. return IXGBE_MAX_TXD_X550;
  1044. default:
  1045. return IXGBE_MAX_TXD_82598;
  1046. }
  1047. }
  1048. static void ixgbe_get_ringparam(struct net_device *netdev,
  1049. struct ethtool_ringparam *ring,
  1050. struct kernel_ethtool_ringparam *kernel_ring,
  1051. struct netlink_ext_ack *extack)
  1052. {
  1053. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1054. struct ixgbe_ring *tx_ring = adapter->tx_ring[0];
  1055. struct ixgbe_ring *rx_ring = adapter->rx_ring[0];
  1056. ring->rx_max_pending = ixgbe_get_max_rxd(adapter);
  1057. ring->tx_max_pending = ixgbe_get_max_txd(adapter);
  1058. ring->rx_pending = rx_ring->count;
  1059. ring->tx_pending = tx_ring->count;
  1060. }
  1061. static int ixgbe_set_ringparam(struct net_device *netdev,
  1062. struct ethtool_ringparam *ring,
  1063. struct kernel_ethtool_ringparam *kernel_ring,
  1064. struct netlink_ext_ack *extack)
  1065. {
  1066. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1067. struct ixgbe_ring *temp_ring;
  1068. int i, j, err = 0;
  1069. u32 new_rx_count, new_tx_count;
  1070. if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
  1071. return -EINVAL;
  1072. new_tx_count = clamp_t(u32, ring->tx_pending,
  1073. IXGBE_MIN_TXD, ixgbe_get_max_txd(adapter));
  1074. new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE);
  1075. new_rx_count = clamp_t(u32, ring->rx_pending,
  1076. IXGBE_MIN_RXD, ixgbe_get_max_rxd(adapter));
  1077. new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE);
  1078. if ((new_tx_count == adapter->tx_ring_count) &&
  1079. (new_rx_count == adapter->rx_ring_count)) {
  1080. /* nothing to do */
  1081. return 0;
  1082. }
  1083. while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
  1084. usleep_range(1000, 2000);
  1085. if (!netif_running(adapter->netdev)) {
  1086. for (i = 0; i < adapter->num_tx_queues; i++)
  1087. adapter->tx_ring[i]->count = new_tx_count;
  1088. for (i = 0; i < adapter->num_xdp_queues; i++)
  1089. adapter->xdp_ring[i]->count = new_tx_count;
  1090. for (i = 0; i < adapter->num_rx_queues; i++)
  1091. adapter->rx_ring[i]->count = new_rx_count;
  1092. adapter->tx_ring_count = new_tx_count;
  1093. adapter->xdp_ring_count = new_tx_count;
  1094. adapter->rx_ring_count = new_rx_count;
  1095. goto clear_reset;
  1096. }
  1097. /* allocate temporary buffer to store rings in */
  1098. i = max_t(int, adapter->num_tx_queues + adapter->num_xdp_queues,
  1099. adapter->num_rx_queues);
  1100. temp_ring = vmalloc(array_size(i, sizeof(struct ixgbe_ring)));
  1101. if (!temp_ring) {
  1102. err = -ENOMEM;
  1103. goto clear_reset;
  1104. }
  1105. ixgbe_down(adapter);
  1106. /*
  1107. * Setup new Tx resources and free the old Tx resources in that order.
  1108. * We can then assign the new resources to the rings via a memcpy.
  1109. * The advantage to this approach is that we are guaranteed to still
  1110. * have resources even in the case of an allocation failure.
  1111. */
  1112. if (new_tx_count != adapter->tx_ring_count) {
  1113. for (i = 0; i < adapter->num_tx_queues; i++) {
  1114. memcpy(&temp_ring[i], adapter->tx_ring[i],
  1115. sizeof(struct ixgbe_ring));
  1116. temp_ring[i].count = new_tx_count;
  1117. err = ixgbe_setup_tx_resources(&temp_ring[i]);
  1118. if (err) {
  1119. while (i) {
  1120. i--;
  1121. ixgbe_free_tx_resources(&temp_ring[i]);
  1122. }
  1123. goto err_setup;
  1124. }
  1125. }
  1126. for (j = 0; j < adapter->num_xdp_queues; j++, i++) {
  1127. memcpy(&temp_ring[i], adapter->xdp_ring[j],
  1128. sizeof(struct ixgbe_ring));
  1129. temp_ring[i].count = new_tx_count;
  1130. err = ixgbe_setup_tx_resources(&temp_ring[i]);
  1131. if (err) {
  1132. while (i) {
  1133. i--;
  1134. ixgbe_free_tx_resources(&temp_ring[i]);
  1135. }
  1136. goto err_setup;
  1137. }
  1138. }
  1139. for (i = 0; i < adapter->num_tx_queues; i++) {
  1140. ixgbe_free_tx_resources(adapter->tx_ring[i]);
  1141. memcpy(adapter->tx_ring[i], &temp_ring[i],
  1142. sizeof(struct ixgbe_ring));
  1143. }
  1144. for (j = 0; j < adapter->num_xdp_queues; j++, i++) {
  1145. ixgbe_free_tx_resources(adapter->xdp_ring[j]);
  1146. memcpy(adapter->xdp_ring[j], &temp_ring[i],
  1147. sizeof(struct ixgbe_ring));
  1148. }
  1149. adapter->tx_ring_count = new_tx_count;
  1150. }
  1151. /* Repeat the process for the Rx rings if needed */
  1152. if (new_rx_count != adapter->rx_ring_count) {
  1153. for (i = 0; i < adapter->num_rx_queues; i++) {
  1154. memcpy(&temp_ring[i], adapter->rx_ring[i],
  1155. sizeof(struct ixgbe_ring));
  1156. /* Clear copied XDP RX-queue info */
  1157. memset(&temp_ring[i].xdp_rxq, 0,
  1158. sizeof(temp_ring[i].xdp_rxq));
  1159. temp_ring[i].count = new_rx_count;
  1160. err = ixgbe_setup_rx_resources(adapter, &temp_ring[i]);
  1161. if (err) {
  1162. while (i) {
  1163. i--;
  1164. ixgbe_free_rx_resources(&temp_ring[i]);
  1165. }
  1166. goto err_setup;
  1167. }
  1168. }
  1169. for (i = 0; i < adapter->num_rx_queues; i++) {
  1170. ixgbe_free_rx_resources(adapter->rx_ring[i]);
  1171. memcpy(adapter->rx_ring[i], &temp_ring[i],
  1172. sizeof(struct ixgbe_ring));
  1173. }
  1174. adapter->rx_ring_count = new_rx_count;
  1175. }
  1176. err_setup:
  1177. ixgbe_up(adapter);
  1178. vfree(temp_ring);
  1179. clear_reset:
  1180. clear_bit(__IXGBE_RESETTING, &adapter->state);
  1181. return err;
  1182. }
  1183. static int ixgbe_get_sset_count(struct net_device *netdev, int sset)
  1184. {
  1185. switch (sset) {
  1186. case ETH_SS_TEST:
  1187. return IXGBE_TEST_LEN;
  1188. case ETH_SS_STATS:
  1189. return IXGBE_STATS_LEN;
  1190. case ETH_SS_PRIV_FLAGS:
  1191. return IXGBE_PRIV_FLAGS_STR_LEN;
  1192. default:
  1193. return -EOPNOTSUPP;
  1194. }
  1195. }
  1196. static void ixgbe_get_ethtool_stats(struct net_device *netdev,
  1197. struct ethtool_stats *stats, u64 *data)
  1198. {
  1199. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1200. struct rtnl_link_stats64 temp;
  1201. const struct rtnl_link_stats64 *net_stats;
  1202. unsigned int start;
  1203. struct ixgbe_ring *ring;
  1204. int i, j;
  1205. char *p = NULL;
  1206. ixgbe_update_stats(adapter);
  1207. net_stats = dev_get_stats(netdev, &temp);
  1208. for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
  1209. switch (ixgbe_gstrings_stats[i].type) {
  1210. case NETDEV_STATS:
  1211. p = (char *) net_stats +
  1212. ixgbe_gstrings_stats[i].stat_offset;
  1213. break;
  1214. case IXGBE_STATS:
  1215. p = (char *) adapter +
  1216. ixgbe_gstrings_stats[i].stat_offset;
  1217. break;
  1218. default:
  1219. data[i] = 0;
  1220. continue;
  1221. }
  1222. data[i] = (ixgbe_gstrings_stats[i].sizeof_stat ==
  1223. sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
  1224. }
  1225. for (j = 0; j < netdev->num_tx_queues; j++) {
  1226. ring = adapter->tx_ring[j];
  1227. if (!ring) {
  1228. data[i] = 0;
  1229. data[i+1] = 0;
  1230. i += 2;
  1231. continue;
  1232. }
  1233. do {
  1234. start = u64_stats_fetch_begin(&ring->syncp);
  1235. data[i] = ring->stats.packets;
  1236. data[i+1] = ring->stats.bytes;
  1237. } while (u64_stats_fetch_retry(&ring->syncp, start));
  1238. i += 2;
  1239. }
  1240. for (j = 0; j < IXGBE_NUM_RX_QUEUES; j++) {
  1241. ring = adapter->rx_ring[j];
  1242. if (!ring) {
  1243. data[i] = 0;
  1244. data[i+1] = 0;
  1245. i += 2;
  1246. continue;
  1247. }
  1248. do {
  1249. start = u64_stats_fetch_begin(&ring->syncp);
  1250. data[i] = ring->stats.packets;
  1251. data[i+1] = ring->stats.bytes;
  1252. } while (u64_stats_fetch_retry(&ring->syncp, start));
  1253. i += 2;
  1254. }
  1255. for (j = 0; j < IXGBE_MAX_PACKET_BUFFERS; j++) {
  1256. data[i++] = adapter->stats.pxontxc[j];
  1257. data[i++] = adapter->stats.pxofftxc[j];
  1258. }
  1259. for (j = 0; j < IXGBE_MAX_PACKET_BUFFERS; j++) {
  1260. data[i++] = adapter->stats.pxonrxc[j];
  1261. data[i++] = adapter->stats.pxoffrxc[j];
  1262. }
  1263. }
  1264. static void ixgbe_get_strings(struct net_device *netdev, u32 stringset,
  1265. u8 *data)
  1266. {
  1267. unsigned int i;
  1268. u8 *p = data;
  1269. switch (stringset) {
  1270. case ETH_SS_TEST:
  1271. for (i = 0; i < IXGBE_TEST_LEN; i++)
  1272. ethtool_puts(&p, ixgbe_gstrings_test[i]);
  1273. break;
  1274. case ETH_SS_STATS:
  1275. for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++)
  1276. ethtool_puts(&p, ixgbe_gstrings_stats[i].stat_string);
  1277. for (i = 0; i < netdev->num_tx_queues; i++) {
  1278. ethtool_sprintf(&p, "tx_queue_%u_packets", i);
  1279. ethtool_sprintf(&p, "tx_queue_%u_bytes", i);
  1280. }
  1281. for (i = 0; i < IXGBE_NUM_RX_QUEUES; i++) {
  1282. ethtool_sprintf(&p, "rx_queue_%u_packets", i);
  1283. ethtool_sprintf(&p, "rx_queue_%u_bytes", i);
  1284. }
  1285. for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) {
  1286. ethtool_sprintf(&p, "tx_pb_%u_pxon", i);
  1287. ethtool_sprintf(&p, "tx_pb_%u_pxoff", i);
  1288. }
  1289. for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) {
  1290. ethtool_sprintf(&p, "rx_pb_%u_pxon", i);
  1291. ethtool_sprintf(&p, "rx_pb_%u_pxoff", i);
  1292. }
  1293. /* BUG_ON(p - data != IXGBE_STATS_LEN * ETH_GSTRING_LEN); */
  1294. break;
  1295. case ETH_SS_PRIV_FLAGS:
  1296. memcpy(data, ixgbe_priv_flags_strings,
  1297. IXGBE_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN);
  1298. }
  1299. }
  1300. static int ixgbe_link_test(struct ixgbe_adapter *adapter, u64 *data)
  1301. {
  1302. struct ixgbe_hw *hw = &adapter->hw;
  1303. bool link_up;
  1304. u32 link_speed = 0;
  1305. if (ixgbe_removed(hw->hw_addr)) {
  1306. *data = 1;
  1307. return 1;
  1308. }
  1309. *data = 0;
  1310. hw->mac.ops.check_link(hw, &link_speed, &link_up, true);
  1311. if (link_up)
  1312. return *data;
  1313. else
  1314. *data = 1;
  1315. return *data;
  1316. }
  1317. /* ethtool register test data */
  1318. struct ixgbe_reg_test {
  1319. u16 reg;
  1320. u8 array_len;
  1321. u8 test_type;
  1322. u32 mask;
  1323. u32 write;
  1324. };
  1325. /* In the hardware, registers are laid out either singly, in arrays
  1326. * spaced 0x40 bytes apart, or in contiguous tables. We assume
  1327. * most tests take place on arrays or single registers (handled
  1328. * as a single-element array) and special-case the tables.
  1329. * Table tests are always pattern tests.
  1330. *
  1331. * We also make provision for some required setup steps by specifying
  1332. * registers to be written without any read-back testing.
  1333. */
  1334. #define PATTERN_TEST 1
  1335. #define SET_READ_TEST 2
  1336. #define WRITE_NO_TEST 3
  1337. #define TABLE32_TEST 4
  1338. #define TABLE64_TEST_LO 5
  1339. #define TABLE64_TEST_HI 6
  1340. /* default 82599 register test */
  1341. static const struct ixgbe_reg_test reg_test_82599[] = {
  1342. { IXGBE_FCRTL_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1343. { IXGBE_FCRTH_82599(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1344. { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1345. { IXGBE_VLNCTRL, 1, PATTERN_TEST, 0x00000000, 0x00000000 },
  1346. { IXGBE_RDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
  1347. { IXGBE_RDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1348. { IXGBE_RDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
  1349. { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
  1350. { IXGBE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
  1351. { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, 0 },
  1352. { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1353. { IXGBE_FCTTV(0), 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1354. { IXGBE_TDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
  1355. { IXGBE_TDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1356. { IXGBE_TDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
  1357. { IXGBE_RXCTRL, 1, SET_READ_TEST, 0x00000001, 0x00000001 },
  1358. { IXGBE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF },
  1359. { IXGBE_RAL(0), 16, TABLE64_TEST_HI, 0x8001FFFF, 0x800CFFFF },
  1360. { IXGBE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1361. { .reg = 0 }
  1362. };
  1363. /* default 82598 register test */
  1364. static const struct ixgbe_reg_test reg_test_82598[] = {
  1365. { IXGBE_FCRTL(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1366. { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1367. { IXGBE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1368. { IXGBE_VLNCTRL, 1, PATTERN_TEST, 0x00000000, 0x00000000 },
  1369. { IXGBE_RDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
  1370. { IXGBE_RDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1371. { IXGBE_RDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
  1372. /* Enable all four RX queues before testing. */
  1373. { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
  1374. /* RDH is read-only for 82598, only test RDT. */
  1375. { IXGBE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
  1376. { IXGBE_RXDCTL(0), 4, WRITE_NO_TEST, 0, 0 },
  1377. { IXGBE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFF0, 0x8007FFF0 },
  1378. { IXGBE_FCTTV(0), 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1379. { IXGBE_TIPG, 1, PATTERN_TEST, 0x000000FF, 0x000000FF },
  1380. { IXGBE_TDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
  1381. { IXGBE_TDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1382. { IXGBE_TDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
  1383. { IXGBE_RXCTRL, 1, SET_READ_TEST, 0x00000003, 0x00000003 },
  1384. { IXGBE_DTXCTL, 1, SET_READ_TEST, 0x00000005, 0x00000005 },
  1385. { IXGBE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF },
  1386. { IXGBE_RAL(0), 16, TABLE64_TEST_HI, 0x800CFFFF, 0x800CFFFF },
  1387. { IXGBE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
  1388. { .reg = 0 }
  1389. };
  1390. static bool reg_pattern_test(struct ixgbe_adapter *adapter, u64 *data, int reg,
  1391. u32 mask, u32 write)
  1392. {
  1393. u32 pat, val, before;
  1394. static const u32 test_pattern[] = {
  1395. 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF};
  1396. if (ixgbe_removed(adapter->hw.hw_addr)) {
  1397. *data = 1;
  1398. return true;
  1399. }
  1400. for (pat = 0; pat < ARRAY_SIZE(test_pattern); pat++) {
  1401. before = ixgbe_read_reg(&adapter->hw, reg);
  1402. ixgbe_write_reg(&adapter->hw, reg, test_pattern[pat] & write);
  1403. val = ixgbe_read_reg(&adapter->hw, reg);
  1404. if (val != (test_pattern[pat] & write & mask)) {
  1405. e_err(drv, "pattern test reg %04X failed: got 0x%08X expected 0x%08X\n",
  1406. reg, val, (test_pattern[pat] & write & mask));
  1407. *data = reg;
  1408. ixgbe_write_reg(&adapter->hw, reg, before);
  1409. return true;
  1410. }
  1411. ixgbe_write_reg(&adapter->hw, reg, before);
  1412. }
  1413. return false;
  1414. }
  1415. static bool reg_set_and_check(struct ixgbe_adapter *adapter, u64 *data, int reg,
  1416. u32 mask, u32 write)
  1417. {
  1418. u32 val, before;
  1419. if (ixgbe_removed(adapter->hw.hw_addr)) {
  1420. *data = 1;
  1421. return true;
  1422. }
  1423. before = ixgbe_read_reg(&adapter->hw, reg);
  1424. ixgbe_write_reg(&adapter->hw, reg, write & mask);
  1425. val = ixgbe_read_reg(&adapter->hw, reg);
  1426. if ((write & mask) != (val & mask)) {
  1427. e_err(drv, "set/check reg %04X test failed: got 0x%08X expected 0x%08X\n",
  1428. reg, (val & mask), (write & mask));
  1429. *data = reg;
  1430. ixgbe_write_reg(&adapter->hw, reg, before);
  1431. return true;
  1432. }
  1433. ixgbe_write_reg(&adapter->hw, reg, before);
  1434. return false;
  1435. }
  1436. static int ixgbe_reg_test(struct ixgbe_adapter *adapter, u64 *data)
  1437. {
  1438. const struct ixgbe_reg_test *test;
  1439. u32 value, before, after;
  1440. u32 i, toggle;
  1441. if (ixgbe_removed(adapter->hw.hw_addr)) {
  1442. e_err(drv, "Adapter removed - register test blocked\n");
  1443. *data = 1;
  1444. return 1;
  1445. }
  1446. switch (adapter->hw.mac.type) {
  1447. case ixgbe_mac_82598EB:
  1448. toggle = 0x7FFFF3FF;
  1449. test = reg_test_82598;
  1450. break;
  1451. case ixgbe_mac_82599EB:
  1452. case ixgbe_mac_X540:
  1453. case ixgbe_mac_X550:
  1454. case ixgbe_mac_X550EM_x:
  1455. case ixgbe_mac_x550em_a:
  1456. toggle = 0x7FFFF30F;
  1457. test = reg_test_82599;
  1458. break;
  1459. default:
  1460. *data = 1;
  1461. return 1;
  1462. }
  1463. /*
  1464. * Because the status register is such a special case,
  1465. * we handle it separately from the rest of the register
  1466. * tests. Some bits are read-only, some toggle, and some
  1467. * are writeable on newer MACs.
  1468. */
  1469. before = ixgbe_read_reg(&adapter->hw, IXGBE_STATUS);
  1470. value = (ixgbe_read_reg(&adapter->hw, IXGBE_STATUS) & toggle);
  1471. ixgbe_write_reg(&adapter->hw, IXGBE_STATUS, toggle);
  1472. after = ixgbe_read_reg(&adapter->hw, IXGBE_STATUS) & toggle;
  1473. if (value != after) {
  1474. e_err(drv, "failed STATUS register test got: 0x%08X expected: 0x%08X\n",
  1475. after, value);
  1476. *data = 1;
  1477. return 1;
  1478. }
  1479. /* restore previous status */
  1480. ixgbe_write_reg(&adapter->hw, IXGBE_STATUS, before);
  1481. /*
  1482. * Perform the remainder of the register test, looping through
  1483. * the test table until we either fail or reach the null entry.
  1484. */
  1485. while (test->reg) {
  1486. for (i = 0; i < test->array_len; i++) {
  1487. bool b = false;
  1488. switch (test->test_type) {
  1489. case PATTERN_TEST:
  1490. b = reg_pattern_test(adapter, data,
  1491. test->reg + (i * 0x40),
  1492. test->mask,
  1493. test->write);
  1494. break;
  1495. case SET_READ_TEST:
  1496. b = reg_set_and_check(adapter, data,
  1497. test->reg + (i * 0x40),
  1498. test->mask,
  1499. test->write);
  1500. break;
  1501. case WRITE_NO_TEST:
  1502. ixgbe_write_reg(&adapter->hw,
  1503. test->reg + (i * 0x40),
  1504. test->write);
  1505. break;
  1506. case TABLE32_TEST:
  1507. b = reg_pattern_test(adapter, data,
  1508. test->reg + (i * 4),
  1509. test->mask,
  1510. test->write);
  1511. break;
  1512. case TABLE64_TEST_LO:
  1513. b = reg_pattern_test(adapter, data,
  1514. test->reg + (i * 8),
  1515. test->mask,
  1516. test->write);
  1517. break;
  1518. case TABLE64_TEST_HI:
  1519. b = reg_pattern_test(adapter, data,
  1520. (test->reg + 4) + (i * 8),
  1521. test->mask,
  1522. test->write);
  1523. break;
  1524. }
  1525. if (b)
  1526. return 1;
  1527. }
  1528. test++;
  1529. }
  1530. *data = 0;
  1531. return 0;
  1532. }
  1533. static int ixgbe_eeprom_test(struct ixgbe_adapter *adapter, u64 *data)
  1534. {
  1535. struct ixgbe_hw *hw = &adapter->hw;
  1536. if (hw->eeprom.ops.validate_checksum(hw, NULL))
  1537. *data = 1;
  1538. else
  1539. *data = 0;
  1540. return *data;
  1541. }
  1542. static irqreturn_t ixgbe_test_intr(int irq, void *data)
  1543. {
  1544. struct net_device *netdev = (struct net_device *) data;
  1545. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1546. adapter->test_icr |= IXGBE_READ_REG(&adapter->hw, IXGBE_EICR);
  1547. return IRQ_HANDLED;
  1548. }
  1549. static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data)
  1550. {
  1551. struct net_device *netdev = adapter->netdev;
  1552. u32 mask, i = 0, shared_int = true;
  1553. u32 irq = adapter->pdev->irq;
  1554. *data = 0;
  1555. /* Hook up test interrupt handler just for this test */
  1556. if (adapter->msix_entries) {
  1557. /* NOTE: we don't test MSI-X interrupts here, yet */
  1558. return 0;
  1559. } else if (adapter->flags & IXGBE_FLAG_MSI_ENABLED) {
  1560. shared_int = false;
  1561. if (request_irq(irq, ixgbe_test_intr, 0, netdev->name,
  1562. netdev)) {
  1563. *data = 1;
  1564. return -1;
  1565. }
  1566. } else if (!request_irq(irq, ixgbe_test_intr, IRQF_PROBE_SHARED,
  1567. netdev->name, netdev)) {
  1568. shared_int = false;
  1569. } else if (request_irq(irq, ixgbe_test_intr, IRQF_SHARED,
  1570. netdev->name, netdev)) {
  1571. *data = 1;
  1572. return -1;
  1573. }
  1574. e_info(hw, "testing %s interrupt\n", shared_int ?
  1575. "shared" : "unshared");
  1576. /* Disable all the interrupts */
  1577. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF);
  1578. IXGBE_WRITE_FLUSH(&adapter->hw);
  1579. usleep_range(10000, 20000);
  1580. /* Test each interrupt */
  1581. for (; i < 10; i++) {
  1582. /* Interrupt to test */
  1583. mask = BIT(i);
  1584. if (!shared_int) {
  1585. /*
  1586. * Disable the interrupts to be reported in
  1587. * the cause register and then force the same
  1588. * interrupt and see if one gets posted. If
  1589. * an interrupt was posted to the bus, the
  1590. * test failed.
  1591. */
  1592. adapter->test_icr = 0;
  1593. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC,
  1594. ~mask & 0x00007FFF);
  1595. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS,
  1596. ~mask & 0x00007FFF);
  1597. IXGBE_WRITE_FLUSH(&adapter->hw);
  1598. usleep_range(10000, 20000);
  1599. if (adapter->test_icr & mask) {
  1600. *data = 3;
  1601. break;
  1602. }
  1603. }
  1604. /*
  1605. * Enable the interrupt to be reported in the cause
  1606. * register and then force the same interrupt and see
  1607. * if one gets posted. If an interrupt was not posted
  1608. * to the bus, the test failed.
  1609. */
  1610. adapter->test_icr = 0;
  1611. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
  1612. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
  1613. IXGBE_WRITE_FLUSH(&adapter->hw);
  1614. usleep_range(10000, 20000);
  1615. if (!(adapter->test_icr & mask)) {
  1616. *data = 4;
  1617. break;
  1618. }
  1619. if (!shared_int) {
  1620. /*
  1621. * Disable the other interrupts to be reported in
  1622. * the cause register and then force the other
  1623. * interrupts and see if any get posted. If
  1624. * an interrupt was posted to the bus, the
  1625. * test failed.
  1626. */
  1627. adapter->test_icr = 0;
  1628. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC,
  1629. ~mask & 0x00007FFF);
  1630. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS,
  1631. ~mask & 0x00007FFF);
  1632. IXGBE_WRITE_FLUSH(&adapter->hw);
  1633. usleep_range(10000, 20000);
  1634. if (adapter->test_icr) {
  1635. *data = 5;
  1636. break;
  1637. }
  1638. }
  1639. }
  1640. /* Disable all the interrupts */
  1641. IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF);
  1642. IXGBE_WRITE_FLUSH(&adapter->hw);
  1643. usleep_range(10000, 20000);
  1644. /* Unhook test interrupt handler */
  1645. free_irq(irq, netdev);
  1646. return *data;
  1647. }
  1648. static void ixgbe_free_desc_rings(struct ixgbe_adapter *adapter)
  1649. {
  1650. /* Shut down the DMA engines now so they can be reinitialized later,
  1651. * since the test rings and normally used rings should overlap on
  1652. * queue 0 we can just use the standard disable Rx/Tx calls and they
  1653. * will take care of disabling the test rings for us.
  1654. */
  1655. /* first Rx */
  1656. ixgbe_disable_rx(adapter);
  1657. /* now Tx */
  1658. ixgbe_disable_tx(adapter);
  1659. ixgbe_reset(adapter);
  1660. ixgbe_free_tx_resources(&adapter->test_tx_ring);
  1661. ixgbe_free_rx_resources(&adapter->test_rx_ring);
  1662. }
  1663. static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)
  1664. {
  1665. struct ixgbe_ring *tx_ring = &adapter->test_tx_ring;
  1666. struct ixgbe_ring *rx_ring = &adapter->test_rx_ring;
  1667. struct ixgbe_hw *hw = &adapter->hw;
  1668. u32 rctl, reg_data;
  1669. int ret_val;
  1670. int err;
  1671. /* Setup Tx descriptor ring and Tx buffers */
  1672. tx_ring->count = IXGBE_DEFAULT_TXD;
  1673. tx_ring->queue_index = 0;
  1674. tx_ring->dev = &adapter->pdev->dev;
  1675. tx_ring->netdev = adapter->netdev;
  1676. tx_ring->reg_idx = adapter->tx_ring[0]->reg_idx;
  1677. err = ixgbe_setup_tx_resources(tx_ring);
  1678. if (err)
  1679. return 1;
  1680. switch (adapter->hw.mac.type) {
  1681. case ixgbe_mac_82599EB:
  1682. case ixgbe_mac_X540:
  1683. case ixgbe_mac_X550:
  1684. case ixgbe_mac_X550EM_x:
  1685. case ixgbe_mac_x550em_a:
  1686. reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_DMATXCTL);
  1687. reg_data |= IXGBE_DMATXCTL_TE;
  1688. IXGBE_WRITE_REG(&adapter->hw, IXGBE_DMATXCTL, reg_data);
  1689. break;
  1690. default:
  1691. break;
  1692. }
  1693. ixgbe_configure_tx_ring(adapter, tx_ring);
  1694. /* Setup Rx Descriptor ring and Rx buffers */
  1695. rx_ring->count = IXGBE_DEFAULT_RXD;
  1696. rx_ring->queue_index = 0;
  1697. rx_ring->dev = &adapter->pdev->dev;
  1698. rx_ring->netdev = adapter->netdev;
  1699. rx_ring->reg_idx = adapter->rx_ring[0]->reg_idx;
  1700. err = ixgbe_setup_rx_resources(adapter, rx_ring);
  1701. if (err) {
  1702. ret_val = 4;
  1703. goto err_nomem;
  1704. }
  1705. hw->mac.ops.disable_rx(hw);
  1706. ixgbe_configure_rx_ring(adapter, rx_ring);
  1707. rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_RXCTRL);
  1708. rctl |= IXGBE_RXCTRL_DMBYPS;
  1709. IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXCTRL, rctl);
  1710. hw->mac.ops.enable_rx(hw);
  1711. return 0;
  1712. err_nomem:
  1713. ixgbe_free_desc_rings(adapter);
  1714. return ret_val;
  1715. }
  1716. static int ixgbe_setup_loopback_test(struct ixgbe_adapter *adapter)
  1717. {
  1718. struct ixgbe_hw *hw = &adapter->hw;
  1719. u32 reg_data;
  1720. /* Setup MAC loopback */
  1721. reg_data = IXGBE_READ_REG(hw, IXGBE_HLREG0);
  1722. reg_data |= IXGBE_HLREG0_LPBK;
  1723. IXGBE_WRITE_REG(hw, IXGBE_HLREG0, reg_data);
  1724. reg_data = IXGBE_READ_REG(hw, IXGBE_FCTRL);
  1725. reg_data |= IXGBE_FCTRL_BAM | IXGBE_FCTRL_SBP | IXGBE_FCTRL_MPE;
  1726. IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg_data);
  1727. /* X540 and X550 needs to set the MACC.FLU bit to force link up */
  1728. switch (adapter->hw.mac.type) {
  1729. case ixgbe_mac_X540:
  1730. case ixgbe_mac_X550:
  1731. case ixgbe_mac_X550EM_x:
  1732. case ixgbe_mac_x550em_a:
  1733. reg_data = IXGBE_READ_REG(hw, IXGBE_MACC);
  1734. reg_data |= IXGBE_MACC_FLU;
  1735. IXGBE_WRITE_REG(hw, IXGBE_MACC, reg_data);
  1736. break;
  1737. default:
  1738. if (hw->mac.orig_autoc) {
  1739. reg_data = hw->mac.orig_autoc | IXGBE_AUTOC_FLU;
  1740. IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_data);
  1741. } else {
  1742. return 10;
  1743. }
  1744. }
  1745. IXGBE_WRITE_FLUSH(hw);
  1746. usleep_range(10000, 20000);
  1747. /* Disable Atlas Tx lanes; re-enabled in reset path */
  1748. if (hw->mac.type == ixgbe_mac_82598EB) {
  1749. u8 atlas;
  1750. hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &atlas);
  1751. atlas |= IXGBE_ATLAS_PDN_TX_REG_EN;
  1752. hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, atlas);
  1753. hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, &atlas);
  1754. atlas |= IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
  1755. hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G, atlas);
  1756. hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, &atlas);
  1757. atlas |= IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
  1758. hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G, atlas);
  1759. hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, &atlas);
  1760. atlas |= IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
  1761. hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN, atlas);
  1762. }
  1763. return 0;
  1764. }
  1765. static void ixgbe_loopback_cleanup(struct ixgbe_adapter *adapter)
  1766. {
  1767. u32 reg_data;
  1768. reg_data = IXGBE_READ_REG(&adapter->hw, IXGBE_HLREG0);
  1769. reg_data &= ~IXGBE_HLREG0_LPBK;
  1770. IXGBE_WRITE_REG(&adapter->hw, IXGBE_HLREG0, reg_data);
  1771. }
  1772. static void ixgbe_create_lbtest_frame(struct sk_buff *skb,
  1773. unsigned int frame_size)
  1774. {
  1775. memset(skb->data, 0xFF, frame_size);
  1776. frame_size >>= 1;
  1777. memset(&skb->data[frame_size], 0xAA, frame_size / 2 - 1);
  1778. skb->data[frame_size + 10] = 0xBE;
  1779. skb->data[frame_size + 12] = 0xAF;
  1780. }
  1781. static bool ixgbe_check_lbtest_frame(struct ixgbe_rx_buffer *rx_buffer,
  1782. unsigned int frame_size)
  1783. {
  1784. unsigned char *data;
  1785. frame_size >>= 1;
  1786. data = page_address(rx_buffer->page) + rx_buffer->page_offset;
  1787. return data[3] == 0xFF && data[frame_size + 10] == 0xBE &&
  1788. data[frame_size + 12] == 0xAF;
  1789. }
  1790. static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
  1791. struct ixgbe_ring *tx_ring,
  1792. unsigned int size)
  1793. {
  1794. union ixgbe_adv_rx_desc *rx_desc;
  1795. u16 rx_ntc, tx_ntc, count = 0;
  1796. /* initialize next to clean and descriptor values */
  1797. rx_ntc = rx_ring->next_to_clean;
  1798. tx_ntc = tx_ring->next_to_clean;
  1799. rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
  1800. while (tx_ntc != tx_ring->next_to_use) {
  1801. union ixgbe_adv_tx_desc *tx_desc;
  1802. struct ixgbe_tx_buffer *tx_buffer;
  1803. tx_desc = IXGBE_TX_DESC(tx_ring, tx_ntc);
  1804. /* if DD is not set transmit has not completed */
  1805. if (!(tx_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD)))
  1806. return count;
  1807. /* unmap buffer on Tx side */
  1808. tx_buffer = &tx_ring->tx_buffer_info[tx_ntc];
  1809. /* Free all the Tx ring sk_buffs */
  1810. dev_kfree_skb_any(tx_buffer->skb);
  1811. /* unmap skb header data */
  1812. dma_unmap_single(tx_ring->dev,
  1813. dma_unmap_addr(tx_buffer, dma),
  1814. dma_unmap_len(tx_buffer, len),
  1815. DMA_TO_DEVICE);
  1816. dma_unmap_len_set(tx_buffer, len, 0);
  1817. /* increment Tx next to clean counter */
  1818. tx_ntc++;
  1819. if (tx_ntc == tx_ring->count)
  1820. tx_ntc = 0;
  1821. }
  1822. while (rx_desc->wb.upper.length) {
  1823. struct ixgbe_rx_buffer *rx_buffer;
  1824. /* check Rx buffer */
  1825. rx_buffer = &rx_ring->rx_buffer_info[rx_ntc];
  1826. /* sync Rx buffer for CPU read */
  1827. dma_sync_single_for_cpu(rx_ring->dev,
  1828. rx_buffer->dma,
  1829. ixgbe_rx_bufsz(rx_ring),
  1830. DMA_FROM_DEVICE);
  1831. /* verify contents of skb */
  1832. if (ixgbe_check_lbtest_frame(rx_buffer, size))
  1833. count++;
  1834. else
  1835. break;
  1836. /* sync Rx buffer for device write */
  1837. dma_sync_single_for_device(rx_ring->dev,
  1838. rx_buffer->dma,
  1839. ixgbe_rx_bufsz(rx_ring),
  1840. DMA_FROM_DEVICE);
  1841. /* increment Rx next to clean counter */
  1842. rx_ntc++;
  1843. if (rx_ntc == rx_ring->count)
  1844. rx_ntc = 0;
  1845. /* fetch next descriptor */
  1846. rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
  1847. }
  1848. netdev_tx_reset_queue(txring_txq(tx_ring));
  1849. /* re-map buffers to ring, store next to clean values */
  1850. ixgbe_alloc_rx_buffers(rx_ring, count);
  1851. rx_ring->next_to_clean = rx_ntc;
  1852. tx_ring->next_to_clean = tx_ntc;
  1853. return count;
  1854. }
  1855. static int ixgbe_run_loopback_test(struct ixgbe_adapter *adapter)
  1856. {
  1857. struct ixgbe_ring *tx_ring = &adapter->test_tx_ring;
  1858. struct ixgbe_ring *rx_ring = &adapter->test_rx_ring;
  1859. int i, j, lc, good_cnt, ret_val = 0;
  1860. unsigned int size = 1024;
  1861. netdev_tx_t tx_ret_val;
  1862. struct sk_buff *skb;
  1863. u32 flags_orig = adapter->flags;
  1864. /* DCB can modify the frames on Tx */
  1865. adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
  1866. /* allocate test skb */
  1867. skb = alloc_skb(size, GFP_KERNEL);
  1868. if (!skb)
  1869. return 11;
  1870. /* place data into test skb */
  1871. ixgbe_create_lbtest_frame(skb, size);
  1872. skb_put(skb, size);
  1873. /*
  1874. * Calculate the loop count based on the largest descriptor ring
  1875. * The idea is to wrap the largest ring a number of times using 64
  1876. * send/receive pairs during each loop
  1877. */
  1878. if (rx_ring->count <= tx_ring->count)
  1879. lc = ((tx_ring->count / 64) * 2) + 1;
  1880. else
  1881. lc = ((rx_ring->count / 64) * 2) + 1;
  1882. for (j = 0; j <= lc; j++) {
  1883. /* reset count of good packets */
  1884. good_cnt = 0;
  1885. /* place 64 packets on the transmit queue*/
  1886. for (i = 0; i < 64; i++) {
  1887. skb_get(skb);
  1888. tx_ret_val = ixgbe_xmit_frame_ring(skb,
  1889. adapter,
  1890. tx_ring);
  1891. if (tx_ret_val == NETDEV_TX_OK)
  1892. good_cnt++;
  1893. }
  1894. if (good_cnt != 64) {
  1895. ret_val = 12;
  1896. break;
  1897. }
  1898. /* allow 200 milliseconds for packets to go from Tx to Rx */
  1899. msleep(200);
  1900. good_cnt = ixgbe_clean_test_rings(rx_ring, tx_ring, size);
  1901. if (good_cnt != 64) {
  1902. ret_val = 13;
  1903. break;
  1904. }
  1905. }
  1906. /* free the original skb */
  1907. kfree_skb(skb);
  1908. adapter->flags = flags_orig;
  1909. return ret_val;
  1910. }
  1911. static int ixgbe_loopback_test(struct ixgbe_adapter *adapter, u64 *data)
  1912. {
  1913. *data = ixgbe_setup_desc_rings(adapter);
  1914. if (*data)
  1915. goto out;
  1916. *data = ixgbe_setup_loopback_test(adapter);
  1917. if (*data)
  1918. goto err_loopback;
  1919. *data = ixgbe_run_loopback_test(adapter);
  1920. ixgbe_loopback_cleanup(adapter);
  1921. err_loopback:
  1922. ixgbe_free_desc_rings(adapter);
  1923. out:
  1924. return *data;
  1925. }
  1926. static void ixgbe_diag_test(struct net_device *netdev,
  1927. struct ethtool_test *eth_test, u64 *data)
  1928. {
  1929. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  1930. bool if_running = netif_running(netdev);
  1931. if (ixgbe_removed(adapter->hw.hw_addr)) {
  1932. e_err(hw, "Adapter removed - test blocked\n");
  1933. data[0] = 1;
  1934. data[1] = 1;
  1935. data[2] = 1;
  1936. data[3] = 1;
  1937. data[4] = 1;
  1938. eth_test->flags |= ETH_TEST_FL_FAILED;
  1939. return;
  1940. }
  1941. set_bit(__IXGBE_TESTING, &adapter->state);
  1942. if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
  1943. struct ixgbe_hw *hw = &adapter->hw;
  1944. if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
  1945. int i;
  1946. for (i = 0; i < adapter->num_vfs; i++) {
  1947. if (adapter->vfinfo[i].clear_to_send) {
  1948. netdev_warn(netdev, "offline diagnostic is not supported when VFs are present\n");
  1949. data[0] = 1;
  1950. data[1] = 1;
  1951. data[2] = 1;
  1952. data[3] = 1;
  1953. data[4] = 1;
  1954. eth_test->flags |= ETH_TEST_FL_FAILED;
  1955. clear_bit(__IXGBE_TESTING,
  1956. &adapter->state);
  1957. return;
  1958. }
  1959. }
  1960. }
  1961. /* Offline tests */
  1962. e_info(hw, "offline testing starting\n");
  1963. /* Link test performed before hardware reset so autoneg doesn't
  1964. * interfere with test result
  1965. */
  1966. if (ixgbe_link_test(adapter, &data[4]))
  1967. eth_test->flags |= ETH_TEST_FL_FAILED;
  1968. if (if_running)
  1969. /* indicate we're in test mode */
  1970. ixgbe_close(netdev);
  1971. else
  1972. ixgbe_reset(adapter);
  1973. e_info(hw, "register testing starting\n");
  1974. if (ixgbe_reg_test(adapter, &data[0]))
  1975. eth_test->flags |= ETH_TEST_FL_FAILED;
  1976. ixgbe_reset(adapter);
  1977. e_info(hw, "eeprom testing starting\n");
  1978. if (ixgbe_eeprom_test(adapter, &data[1]))
  1979. eth_test->flags |= ETH_TEST_FL_FAILED;
  1980. ixgbe_reset(adapter);
  1981. e_info(hw, "interrupt testing starting\n");
  1982. if (ixgbe_intr_test(adapter, &data[2]))
  1983. eth_test->flags |= ETH_TEST_FL_FAILED;
  1984. /* If SRIOV or VMDq is enabled then skip MAC
  1985. * loopback diagnostic. */
  1986. if (adapter->flags & (IXGBE_FLAG_SRIOV_ENABLED |
  1987. IXGBE_FLAG_VMDQ_ENABLED)) {
  1988. e_info(hw, "Skip MAC loopback diagnostic in VT mode\n");
  1989. data[3] = 0;
  1990. goto skip_loopback;
  1991. }
  1992. ixgbe_reset(adapter);
  1993. e_info(hw, "loopback testing starting\n");
  1994. if (ixgbe_loopback_test(adapter, &data[3]))
  1995. eth_test->flags |= ETH_TEST_FL_FAILED;
  1996. skip_loopback:
  1997. ixgbe_reset(adapter);
  1998. /* clear testing bit and return adapter to previous state */
  1999. clear_bit(__IXGBE_TESTING, &adapter->state);
  2000. if (if_running)
  2001. ixgbe_open(netdev);
  2002. else if (hw->mac.ops.disable_tx_laser)
  2003. hw->mac.ops.disable_tx_laser(hw);
  2004. } else {
  2005. e_info(hw, "online testing starting\n");
  2006. /* Online tests */
  2007. if (ixgbe_link_test(adapter, &data[4]))
  2008. eth_test->flags |= ETH_TEST_FL_FAILED;
  2009. /* Offline tests aren't run; pass by default */
  2010. data[0] = 0;
  2011. data[1] = 0;
  2012. data[2] = 0;
  2013. data[3] = 0;
  2014. clear_bit(__IXGBE_TESTING, &adapter->state);
  2015. }
  2016. }
  2017. static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
  2018. struct ethtool_wolinfo *wol)
  2019. {
  2020. struct ixgbe_hw *hw = &adapter->hw;
  2021. int retval = 0;
  2022. /* WOL not supported for all devices */
  2023. if (!ixgbe_wol_supported(adapter, hw->device_id,
  2024. hw->subsystem_device_id)) {
  2025. retval = 1;
  2026. wol->supported = 0;
  2027. }
  2028. return retval;
  2029. }
  2030. static void ixgbe_get_wol(struct net_device *netdev,
  2031. struct ethtool_wolinfo *wol)
  2032. {
  2033. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2034. wol->supported = WAKE_UCAST | WAKE_MCAST |
  2035. WAKE_BCAST | WAKE_MAGIC;
  2036. wol->wolopts = 0;
  2037. if (ixgbe_wol_exclusion(adapter, wol) ||
  2038. !device_can_wakeup(&adapter->pdev->dev))
  2039. return;
  2040. if (adapter->wol & IXGBE_WUFC_EX)
  2041. wol->wolopts |= WAKE_UCAST;
  2042. if (adapter->wol & IXGBE_WUFC_MC)
  2043. wol->wolopts |= WAKE_MCAST;
  2044. if (adapter->wol & IXGBE_WUFC_BC)
  2045. wol->wolopts |= WAKE_BCAST;
  2046. if (adapter->wol & IXGBE_WUFC_MAG)
  2047. wol->wolopts |= WAKE_MAGIC;
  2048. }
  2049. static int ixgbe_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
  2050. {
  2051. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2052. if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE |
  2053. WAKE_FILTER))
  2054. return -EOPNOTSUPP;
  2055. if (ixgbe_wol_exclusion(adapter, wol))
  2056. return wol->wolopts ? -EOPNOTSUPP : 0;
  2057. adapter->wol = 0;
  2058. if (wol->wolopts & WAKE_UCAST)
  2059. adapter->wol |= IXGBE_WUFC_EX;
  2060. if (wol->wolopts & WAKE_MCAST)
  2061. adapter->wol |= IXGBE_WUFC_MC;
  2062. if (wol->wolopts & WAKE_BCAST)
  2063. adapter->wol |= IXGBE_WUFC_BC;
  2064. if (wol->wolopts & WAKE_MAGIC)
  2065. adapter->wol |= IXGBE_WUFC_MAG;
  2066. device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
  2067. return 0;
  2068. }
  2069. static int ixgbe_nway_reset(struct net_device *netdev)
  2070. {
  2071. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2072. if (netif_running(netdev))
  2073. ixgbe_reinit_locked(adapter);
  2074. return 0;
  2075. }
  2076. static int ixgbe_set_phys_id(struct net_device *netdev,
  2077. enum ethtool_phys_id_state state)
  2078. {
  2079. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2080. struct ixgbe_hw *hw = &adapter->hw;
  2081. if (!hw->mac.ops.led_on || !hw->mac.ops.led_off)
  2082. return -EOPNOTSUPP;
  2083. switch (state) {
  2084. case ETHTOOL_ID_ACTIVE:
  2085. adapter->led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
  2086. return 2;
  2087. case ETHTOOL_ID_ON:
  2088. hw->mac.ops.led_on(hw, hw->mac.led_link_act);
  2089. break;
  2090. case ETHTOOL_ID_OFF:
  2091. hw->mac.ops.led_off(hw, hw->mac.led_link_act);
  2092. break;
  2093. case ETHTOOL_ID_INACTIVE:
  2094. /* Restore LED settings */
  2095. IXGBE_WRITE_REG(&adapter->hw, IXGBE_LEDCTL, adapter->led_reg);
  2096. break;
  2097. }
  2098. return 0;
  2099. }
  2100. static int ixgbe_get_coalesce(struct net_device *netdev,
  2101. struct ethtool_coalesce *ec,
  2102. struct kernel_ethtool_coalesce *kernel_coal,
  2103. struct netlink_ext_ack *extack)
  2104. {
  2105. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2106. /* only valid if in constant ITR mode */
  2107. if (adapter->rx_itr_setting <= 1)
  2108. ec->rx_coalesce_usecs = adapter->rx_itr_setting;
  2109. else
  2110. ec->rx_coalesce_usecs = adapter->rx_itr_setting >> 2;
  2111. /* if in mixed tx/rx queues per vector mode, report only rx settings */
  2112. if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count)
  2113. return 0;
  2114. /* only valid if in constant ITR mode */
  2115. if (adapter->tx_itr_setting <= 1)
  2116. ec->tx_coalesce_usecs = adapter->tx_itr_setting;
  2117. else
  2118. ec->tx_coalesce_usecs = adapter->tx_itr_setting >> 2;
  2119. return 0;
  2120. }
  2121. /*
  2122. * this function must be called before setting the new value of
  2123. * rx_itr_setting
  2124. */
  2125. static bool ixgbe_update_rsc(struct ixgbe_adapter *adapter)
  2126. {
  2127. struct net_device *netdev = adapter->netdev;
  2128. /* nothing to do if LRO or RSC are not enabled */
  2129. if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE) ||
  2130. !(netdev->features & NETIF_F_LRO))
  2131. return false;
  2132. /* check the feature flag value and enable RSC if necessary */
  2133. if (adapter->rx_itr_setting == 1 ||
  2134. adapter->rx_itr_setting > IXGBE_MIN_RSC_ITR) {
  2135. if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)) {
  2136. adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
  2137. e_info(probe, "rx-usecs value high enough to re-enable RSC\n");
  2138. return true;
  2139. }
  2140. /* if interrupt rate is too high then disable RSC */
  2141. } else if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) {
  2142. adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED;
  2143. e_info(probe, "rx-usecs set too low, disabling RSC\n");
  2144. return true;
  2145. }
  2146. return false;
  2147. }
  2148. static int ixgbe_set_coalesce(struct net_device *netdev,
  2149. struct ethtool_coalesce *ec,
  2150. struct kernel_ethtool_coalesce *kernel_coal,
  2151. struct netlink_ext_ack *extack)
  2152. {
  2153. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2154. struct ixgbe_q_vector *q_vector;
  2155. int i;
  2156. u16 tx_itr_param, rx_itr_param, tx_itr_prev;
  2157. bool need_reset = false;
  2158. if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count) {
  2159. /* reject Tx specific changes in case of mixed RxTx vectors */
  2160. if (ec->tx_coalesce_usecs)
  2161. return -EINVAL;
  2162. tx_itr_prev = adapter->rx_itr_setting;
  2163. } else {
  2164. tx_itr_prev = adapter->tx_itr_setting;
  2165. }
  2166. if ((ec->rx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)) ||
  2167. (ec->tx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)))
  2168. return -EINVAL;
  2169. if (ec->rx_coalesce_usecs > 1)
  2170. adapter->rx_itr_setting = ec->rx_coalesce_usecs << 2;
  2171. else
  2172. adapter->rx_itr_setting = ec->rx_coalesce_usecs;
  2173. if (adapter->rx_itr_setting == 1)
  2174. rx_itr_param = IXGBE_20K_ITR;
  2175. else
  2176. rx_itr_param = adapter->rx_itr_setting;
  2177. if (ec->tx_coalesce_usecs > 1)
  2178. adapter->tx_itr_setting = ec->tx_coalesce_usecs << 2;
  2179. else
  2180. adapter->tx_itr_setting = ec->tx_coalesce_usecs;
  2181. if (adapter->tx_itr_setting == 1)
  2182. tx_itr_param = IXGBE_12K_ITR;
  2183. else
  2184. tx_itr_param = adapter->tx_itr_setting;
  2185. /* mixed Rx/Tx */
  2186. if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count)
  2187. adapter->tx_itr_setting = adapter->rx_itr_setting;
  2188. /* detect ITR changes that require update of TXDCTL.WTHRESH */
  2189. if ((adapter->tx_itr_setting != 1) &&
  2190. (adapter->tx_itr_setting < IXGBE_100K_ITR)) {
  2191. if ((tx_itr_prev == 1) ||
  2192. (tx_itr_prev >= IXGBE_100K_ITR))
  2193. need_reset = true;
  2194. } else {
  2195. if ((tx_itr_prev != 1) &&
  2196. (tx_itr_prev < IXGBE_100K_ITR))
  2197. need_reset = true;
  2198. }
  2199. /* check the old value and enable RSC if necessary */
  2200. need_reset |= ixgbe_update_rsc(adapter);
  2201. for (i = 0; i < adapter->num_q_vectors; i++) {
  2202. q_vector = adapter->q_vector[i];
  2203. if (q_vector->tx.count && !q_vector->rx.count)
  2204. /* tx only */
  2205. q_vector->itr = tx_itr_param;
  2206. else
  2207. /* rx only or mixed */
  2208. q_vector->itr = rx_itr_param;
  2209. ixgbe_write_eitr(q_vector);
  2210. }
  2211. /*
  2212. * do reset here at the end to make sure EITR==0 case is handled
  2213. * correctly w.r.t stopping tx, and changing TXDCTL.WTHRESH settings
  2214. * also locks in RSC enable/disable which requires reset
  2215. */
  2216. if (need_reset)
  2217. ixgbe_do_reset(netdev);
  2218. return 0;
  2219. }
  2220. static int ixgbe_get_ethtool_fdir_entry(struct ixgbe_adapter *adapter,
  2221. struct ethtool_rxnfc *cmd)
  2222. {
  2223. union ixgbe_atr_input *mask = &adapter->fdir_mask;
  2224. struct ethtool_rx_flow_spec *fsp =
  2225. (struct ethtool_rx_flow_spec *)&cmd->fs;
  2226. struct hlist_node *node2;
  2227. struct ixgbe_fdir_filter *rule = NULL;
  2228. /* report total rule count */
  2229. cmd->data = (1024 << adapter->fdir_pballoc) - 2;
  2230. hlist_for_each_entry_safe(rule, node2,
  2231. &adapter->fdir_filter_list, fdir_node) {
  2232. if (fsp->location <= rule->sw_idx)
  2233. break;
  2234. }
  2235. if (!rule || fsp->location != rule->sw_idx)
  2236. return -EINVAL;
  2237. /* fill out the flow spec entry */
  2238. /* set flow type field */
  2239. switch (rule->filter.formatted.flow_type) {
  2240. case IXGBE_ATR_FLOW_TYPE_TCPV4:
  2241. fsp->flow_type = TCP_V4_FLOW;
  2242. break;
  2243. case IXGBE_ATR_FLOW_TYPE_UDPV4:
  2244. fsp->flow_type = UDP_V4_FLOW;
  2245. break;
  2246. case IXGBE_ATR_FLOW_TYPE_SCTPV4:
  2247. fsp->flow_type = SCTP_V4_FLOW;
  2248. break;
  2249. case IXGBE_ATR_FLOW_TYPE_IPV4:
  2250. fsp->flow_type = IP_USER_FLOW;
  2251. fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4;
  2252. fsp->h_u.usr_ip4_spec.proto = 0;
  2253. fsp->m_u.usr_ip4_spec.proto = 0;
  2254. break;
  2255. default:
  2256. return -EINVAL;
  2257. }
  2258. fsp->h_u.tcp_ip4_spec.psrc = rule->filter.formatted.src_port;
  2259. fsp->m_u.tcp_ip4_spec.psrc = mask->formatted.src_port;
  2260. fsp->h_u.tcp_ip4_spec.pdst = rule->filter.formatted.dst_port;
  2261. fsp->m_u.tcp_ip4_spec.pdst = mask->formatted.dst_port;
  2262. fsp->h_u.tcp_ip4_spec.ip4src = rule->filter.formatted.src_ip[0];
  2263. fsp->m_u.tcp_ip4_spec.ip4src = mask->formatted.src_ip[0];
  2264. fsp->h_u.tcp_ip4_spec.ip4dst = rule->filter.formatted.dst_ip[0];
  2265. fsp->m_u.tcp_ip4_spec.ip4dst = mask->formatted.dst_ip[0];
  2266. fsp->h_ext.vlan_tci = rule->filter.formatted.vlan_id;
  2267. fsp->m_ext.vlan_tci = mask->formatted.vlan_id;
  2268. fsp->h_ext.vlan_etype = rule->filter.formatted.flex_bytes;
  2269. fsp->m_ext.vlan_etype = mask->formatted.flex_bytes;
  2270. fsp->h_ext.data[1] = htonl(rule->filter.formatted.vm_pool);
  2271. fsp->m_ext.data[1] = htonl(mask->formatted.vm_pool);
  2272. fsp->flow_type |= FLOW_EXT;
  2273. /* record action */
  2274. if (rule->action == IXGBE_FDIR_DROP_QUEUE)
  2275. fsp->ring_cookie = RX_CLS_FLOW_DISC;
  2276. else
  2277. fsp->ring_cookie = rule->action;
  2278. return 0;
  2279. }
  2280. static int ixgbe_get_ethtool_fdir_all(struct ixgbe_adapter *adapter,
  2281. struct ethtool_rxnfc *cmd,
  2282. u32 *rule_locs)
  2283. {
  2284. struct hlist_node *node2;
  2285. struct ixgbe_fdir_filter *rule;
  2286. int cnt = 0;
  2287. /* report total rule count */
  2288. cmd->data = (1024 << adapter->fdir_pballoc) - 2;
  2289. hlist_for_each_entry_safe(rule, node2,
  2290. &adapter->fdir_filter_list, fdir_node) {
  2291. if (cnt == cmd->rule_cnt)
  2292. return -EMSGSIZE;
  2293. rule_locs[cnt] = rule->sw_idx;
  2294. cnt++;
  2295. }
  2296. cmd->rule_cnt = cnt;
  2297. return 0;
  2298. }
  2299. static int ixgbe_get_rss_hash_opts(struct ixgbe_adapter *adapter,
  2300. struct ethtool_rxnfc *cmd)
  2301. {
  2302. cmd->data = 0;
  2303. /* Report default options for RSS on ixgbe */
  2304. switch (cmd->flow_type) {
  2305. case TCP_V4_FLOW:
  2306. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  2307. fallthrough;
  2308. case UDP_V4_FLOW:
  2309. if (adapter->flags2 & IXGBE_FLAG2_RSS_FIELD_IPV4_UDP)
  2310. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  2311. fallthrough;
  2312. case SCTP_V4_FLOW:
  2313. case AH_ESP_V4_FLOW:
  2314. case AH_V4_FLOW:
  2315. case ESP_V4_FLOW:
  2316. case IPV4_FLOW:
  2317. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  2318. break;
  2319. case TCP_V6_FLOW:
  2320. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  2321. fallthrough;
  2322. case UDP_V6_FLOW:
  2323. if (adapter->flags2 & IXGBE_FLAG2_RSS_FIELD_IPV6_UDP)
  2324. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  2325. fallthrough;
  2326. case SCTP_V6_FLOW:
  2327. case AH_ESP_V6_FLOW:
  2328. case AH_V6_FLOW:
  2329. case ESP_V6_FLOW:
  2330. case IPV6_FLOW:
  2331. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  2332. break;
  2333. default:
  2334. return -EINVAL;
  2335. }
  2336. return 0;
  2337. }
  2338. static int ixgbe_rss_indir_tbl_max(struct ixgbe_adapter *adapter)
  2339. {
  2340. if (adapter->hw.mac.type < ixgbe_mac_X550)
  2341. return 16;
  2342. else
  2343. return 64;
  2344. }
  2345. static int ixgbe_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
  2346. u32 *rule_locs)
  2347. {
  2348. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2349. int ret = -EOPNOTSUPP;
  2350. switch (cmd->cmd) {
  2351. case ETHTOOL_GRXRINGS:
  2352. cmd->data = min_t(int, adapter->num_rx_queues,
  2353. ixgbe_rss_indir_tbl_max(adapter));
  2354. ret = 0;
  2355. break;
  2356. case ETHTOOL_GRXCLSRLCNT:
  2357. cmd->rule_cnt = adapter->fdir_filter_count;
  2358. ret = 0;
  2359. break;
  2360. case ETHTOOL_GRXCLSRULE:
  2361. ret = ixgbe_get_ethtool_fdir_entry(adapter, cmd);
  2362. break;
  2363. case ETHTOOL_GRXCLSRLALL:
  2364. ret = ixgbe_get_ethtool_fdir_all(adapter, cmd, rule_locs);
  2365. break;
  2366. case ETHTOOL_GRXFH:
  2367. ret = ixgbe_get_rss_hash_opts(adapter, cmd);
  2368. break;
  2369. default:
  2370. break;
  2371. }
  2372. return ret;
  2373. }
  2374. int ixgbe_update_ethtool_fdir_entry(struct ixgbe_adapter *adapter,
  2375. struct ixgbe_fdir_filter *input,
  2376. u16 sw_idx)
  2377. {
  2378. struct ixgbe_hw *hw = &adapter->hw;
  2379. struct hlist_node *node2;
  2380. struct ixgbe_fdir_filter *rule, *parent;
  2381. int err = -EINVAL;
  2382. parent = NULL;
  2383. rule = NULL;
  2384. hlist_for_each_entry_safe(rule, node2,
  2385. &adapter->fdir_filter_list, fdir_node) {
  2386. /* hash found, or no matching entry */
  2387. if (rule->sw_idx >= sw_idx)
  2388. break;
  2389. parent = rule;
  2390. }
  2391. /* if there is an old rule occupying our place remove it */
  2392. if (rule && (rule->sw_idx == sw_idx)) {
  2393. if (!input || (rule->filter.formatted.bkt_hash !=
  2394. input->filter.formatted.bkt_hash)) {
  2395. err = ixgbe_fdir_erase_perfect_filter_82599(hw,
  2396. &rule->filter,
  2397. sw_idx);
  2398. }
  2399. hlist_del(&rule->fdir_node);
  2400. kfree(rule);
  2401. adapter->fdir_filter_count--;
  2402. }
  2403. /*
  2404. * If no input this was a delete, err should be 0 if a rule was
  2405. * successfully found and removed from the list else -EINVAL
  2406. */
  2407. if (!input)
  2408. return err;
  2409. /* initialize node and set software index */
  2410. INIT_HLIST_NODE(&input->fdir_node);
  2411. /* add filter to the list */
  2412. if (parent)
  2413. hlist_add_behind(&input->fdir_node, &parent->fdir_node);
  2414. else
  2415. hlist_add_head(&input->fdir_node,
  2416. &adapter->fdir_filter_list);
  2417. /* update counts */
  2418. adapter->fdir_filter_count++;
  2419. return 0;
  2420. }
  2421. static int ixgbe_flowspec_to_flow_type(struct ethtool_rx_flow_spec *fsp,
  2422. u8 *flow_type)
  2423. {
  2424. switch (fsp->flow_type & ~FLOW_EXT) {
  2425. case TCP_V4_FLOW:
  2426. *flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4;
  2427. break;
  2428. case UDP_V4_FLOW:
  2429. *flow_type = IXGBE_ATR_FLOW_TYPE_UDPV4;
  2430. break;
  2431. case SCTP_V4_FLOW:
  2432. *flow_type = IXGBE_ATR_FLOW_TYPE_SCTPV4;
  2433. break;
  2434. case IP_USER_FLOW:
  2435. switch (fsp->h_u.usr_ip4_spec.proto) {
  2436. case IPPROTO_TCP:
  2437. *flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4;
  2438. break;
  2439. case IPPROTO_UDP:
  2440. *flow_type = IXGBE_ATR_FLOW_TYPE_UDPV4;
  2441. break;
  2442. case IPPROTO_SCTP:
  2443. *flow_type = IXGBE_ATR_FLOW_TYPE_SCTPV4;
  2444. break;
  2445. case 0:
  2446. if (!fsp->m_u.usr_ip4_spec.proto) {
  2447. *flow_type = IXGBE_ATR_FLOW_TYPE_IPV4;
  2448. break;
  2449. }
  2450. fallthrough;
  2451. default:
  2452. return 0;
  2453. }
  2454. break;
  2455. default:
  2456. return 0;
  2457. }
  2458. return 1;
  2459. }
  2460. static int ixgbe_add_ethtool_fdir_entry(struct ixgbe_adapter *adapter,
  2461. struct ethtool_rxnfc *cmd)
  2462. {
  2463. struct ethtool_rx_flow_spec *fsp =
  2464. (struct ethtool_rx_flow_spec *)&cmd->fs;
  2465. struct ixgbe_hw *hw = &adapter->hw;
  2466. struct ixgbe_fdir_filter *input;
  2467. union ixgbe_atr_input mask;
  2468. u8 queue;
  2469. int err;
  2470. if (!(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
  2471. return -EOPNOTSUPP;
  2472. /* ring_cookie is a masked into a set of queues and ixgbe pools or
  2473. * we use the drop index.
  2474. */
  2475. if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
  2476. queue = IXGBE_FDIR_DROP_QUEUE;
  2477. } else {
  2478. u32 ring = ethtool_get_flow_spec_ring(fsp->ring_cookie);
  2479. u8 vf = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
  2480. if (!vf && (ring >= adapter->num_rx_queues))
  2481. return -EINVAL;
  2482. else if (vf &&
  2483. ((vf > adapter->num_vfs) ||
  2484. ring >= adapter->num_rx_queues_per_pool))
  2485. return -EINVAL;
  2486. /* Map the ring onto the absolute queue index */
  2487. if (!vf)
  2488. queue = adapter->rx_ring[ring]->reg_idx;
  2489. else
  2490. queue = ((vf - 1) *
  2491. adapter->num_rx_queues_per_pool) + ring;
  2492. }
  2493. /* Don't allow indexes to exist outside of available space */
  2494. if (fsp->location >= ((1024 << adapter->fdir_pballoc) - 2)) {
  2495. e_err(drv, "Location out of range\n");
  2496. return -EINVAL;
  2497. }
  2498. input = kzalloc(sizeof(*input), GFP_ATOMIC);
  2499. if (!input)
  2500. return -ENOMEM;
  2501. memset(&mask, 0, sizeof(union ixgbe_atr_input));
  2502. /* set SW index */
  2503. input->sw_idx = fsp->location;
  2504. /* record flow type */
  2505. if (!ixgbe_flowspec_to_flow_type(fsp,
  2506. &input->filter.formatted.flow_type)) {
  2507. e_err(drv, "Unrecognized flow type\n");
  2508. goto err_out;
  2509. }
  2510. mask.formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK |
  2511. IXGBE_ATR_L4TYPE_MASK;
  2512. if (input->filter.formatted.flow_type == IXGBE_ATR_FLOW_TYPE_IPV4)
  2513. mask.formatted.flow_type &= IXGBE_ATR_L4TYPE_IPV6_MASK;
  2514. /* Copy input into formatted structures */
  2515. input->filter.formatted.src_ip[0] = fsp->h_u.tcp_ip4_spec.ip4src;
  2516. mask.formatted.src_ip[0] = fsp->m_u.tcp_ip4_spec.ip4src;
  2517. input->filter.formatted.dst_ip[0] = fsp->h_u.tcp_ip4_spec.ip4dst;
  2518. mask.formatted.dst_ip[0] = fsp->m_u.tcp_ip4_spec.ip4dst;
  2519. input->filter.formatted.src_port = fsp->h_u.tcp_ip4_spec.psrc;
  2520. mask.formatted.src_port = fsp->m_u.tcp_ip4_spec.psrc;
  2521. input->filter.formatted.dst_port = fsp->h_u.tcp_ip4_spec.pdst;
  2522. mask.formatted.dst_port = fsp->m_u.tcp_ip4_spec.pdst;
  2523. if (fsp->flow_type & FLOW_EXT) {
  2524. input->filter.formatted.vm_pool =
  2525. (unsigned char)ntohl(fsp->h_ext.data[1]);
  2526. mask.formatted.vm_pool =
  2527. (unsigned char)ntohl(fsp->m_ext.data[1]);
  2528. input->filter.formatted.vlan_id = fsp->h_ext.vlan_tci;
  2529. mask.formatted.vlan_id = fsp->m_ext.vlan_tci;
  2530. input->filter.formatted.flex_bytes =
  2531. fsp->h_ext.vlan_etype;
  2532. mask.formatted.flex_bytes = fsp->m_ext.vlan_etype;
  2533. }
  2534. /* determine if we need to drop or route the packet */
  2535. if (fsp->ring_cookie == RX_CLS_FLOW_DISC)
  2536. input->action = IXGBE_FDIR_DROP_QUEUE;
  2537. else
  2538. input->action = fsp->ring_cookie;
  2539. spin_lock(&adapter->fdir_perfect_lock);
  2540. if (hlist_empty(&adapter->fdir_filter_list)) {
  2541. /* save mask and program input mask into HW */
  2542. memcpy(&adapter->fdir_mask, &mask, sizeof(mask));
  2543. err = ixgbe_fdir_set_input_mask_82599(hw, &mask);
  2544. if (err) {
  2545. e_err(drv, "Error writing mask\n");
  2546. goto err_out_w_lock;
  2547. }
  2548. } else if (memcmp(&adapter->fdir_mask, &mask, sizeof(mask))) {
  2549. e_err(drv, "Only one mask supported per port\n");
  2550. goto err_out_w_lock;
  2551. }
  2552. /* apply mask and compute/store hash */
  2553. ixgbe_atr_compute_perfect_hash_82599(&input->filter, &mask);
  2554. /* program filters to filter memory */
  2555. err = ixgbe_fdir_write_perfect_filter_82599(hw,
  2556. &input->filter, input->sw_idx, queue);
  2557. if (err)
  2558. goto err_out_w_lock;
  2559. ixgbe_update_ethtool_fdir_entry(adapter, input, input->sw_idx);
  2560. spin_unlock(&adapter->fdir_perfect_lock);
  2561. return err;
  2562. err_out_w_lock:
  2563. spin_unlock(&adapter->fdir_perfect_lock);
  2564. err_out:
  2565. kfree(input);
  2566. return -EINVAL;
  2567. }
  2568. static int ixgbe_del_ethtool_fdir_entry(struct ixgbe_adapter *adapter,
  2569. struct ethtool_rxnfc *cmd)
  2570. {
  2571. struct ethtool_rx_flow_spec *fsp =
  2572. (struct ethtool_rx_flow_spec *)&cmd->fs;
  2573. int err;
  2574. spin_lock(&adapter->fdir_perfect_lock);
  2575. err = ixgbe_update_ethtool_fdir_entry(adapter, NULL, fsp->location);
  2576. spin_unlock(&adapter->fdir_perfect_lock);
  2577. return err;
  2578. }
  2579. #define UDP_RSS_FLAGS (IXGBE_FLAG2_RSS_FIELD_IPV4_UDP | \
  2580. IXGBE_FLAG2_RSS_FIELD_IPV6_UDP)
  2581. static int ixgbe_set_rss_hash_opt(struct ixgbe_adapter *adapter,
  2582. struct ethtool_rxnfc *nfc)
  2583. {
  2584. u32 flags2 = adapter->flags2;
  2585. /*
  2586. * RSS does not support anything other than hashing
  2587. * to queues on src and dst IPs and ports
  2588. */
  2589. if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
  2590. RXH_L4_B_0_1 | RXH_L4_B_2_3))
  2591. return -EINVAL;
  2592. switch (nfc->flow_type) {
  2593. case TCP_V4_FLOW:
  2594. case TCP_V6_FLOW:
  2595. if (!(nfc->data & RXH_IP_SRC) ||
  2596. !(nfc->data & RXH_IP_DST) ||
  2597. !(nfc->data & RXH_L4_B_0_1) ||
  2598. !(nfc->data & RXH_L4_B_2_3))
  2599. return -EINVAL;
  2600. break;
  2601. case UDP_V4_FLOW:
  2602. if (!(nfc->data & RXH_IP_SRC) ||
  2603. !(nfc->data & RXH_IP_DST))
  2604. return -EINVAL;
  2605. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  2606. case 0:
  2607. flags2 &= ~IXGBE_FLAG2_RSS_FIELD_IPV4_UDP;
  2608. break;
  2609. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  2610. flags2 |= IXGBE_FLAG2_RSS_FIELD_IPV4_UDP;
  2611. break;
  2612. default:
  2613. return -EINVAL;
  2614. }
  2615. break;
  2616. case UDP_V6_FLOW:
  2617. if (!(nfc->data & RXH_IP_SRC) ||
  2618. !(nfc->data & RXH_IP_DST))
  2619. return -EINVAL;
  2620. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  2621. case 0:
  2622. flags2 &= ~IXGBE_FLAG2_RSS_FIELD_IPV6_UDP;
  2623. break;
  2624. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  2625. flags2 |= IXGBE_FLAG2_RSS_FIELD_IPV6_UDP;
  2626. break;
  2627. default:
  2628. return -EINVAL;
  2629. }
  2630. break;
  2631. case AH_ESP_V4_FLOW:
  2632. case AH_V4_FLOW:
  2633. case ESP_V4_FLOW:
  2634. case SCTP_V4_FLOW:
  2635. case AH_ESP_V6_FLOW:
  2636. case AH_V6_FLOW:
  2637. case ESP_V6_FLOW:
  2638. case SCTP_V6_FLOW:
  2639. if (!(nfc->data & RXH_IP_SRC) ||
  2640. !(nfc->data & RXH_IP_DST) ||
  2641. (nfc->data & RXH_L4_B_0_1) ||
  2642. (nfc->data & RXH_L4_B_2_3))
  2643. return -EINVAL;
  2644. break;
  2645. default:
  2646. return -EINVAL;
  2647. }
  2648. /* if we changed something we need to update flags */
  2649. if (flags2 != adapter->flags2) {
  2650. struct ixgbe_hw *hw = &adapter->hw;
  2651. u32 mrqc;
  2652. unsigned int pf_pool = adapter->num_vfs;
  2653. if ((hw->mac.type >= ixgbe_mac_X550) &&
  2654. (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
  2655. mrqc = IXGBE_READ_REG(hw, IXGBE_PFVFMRQC(pf_pool));
  2656. else
  2657. mrqc = IXGBE_READ_REG(hw, IXGBE_MRQC);
  2658. if ((flags2 & UDP_RSS_FLAGS) &&
  2659. !(adapter->flags2 & UDP_RSS_FLAGS))
  2660. e_warn(drv, "enabling UDP RSS: fragmented packets may arrive out of order to the stack above\n");
  2661. adapter->flags2 = flags2;
  2662. /* Perform hash on these packet types */
  2663. mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4
  2664. | IXGBE_MRQC_RSS_FIELD_IPV4_TCP
  2665. | IXGBE_MRQC_RSS_FIELD_IPV6
  2666. | IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
  2667. mrqc &= ~(IXGBE_MRQC_RSS_FIELD_IPV4_UDP |
  2668. IXGBE_MRQC_RSS_FIELD_IPV6_UDP);
  2669. if (flags2 & IXGBE_FLAG2_RSS_FIELD_IPV4_UDP)
  2670. mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
  2671. if (flags2 & IXGBE_FLAG2_RSS_FIELD_IPV6_UDP)
  2672. mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
  2673. if ((hw->mac.type >= ixgbe_mac_X550) &&
  2674. (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
  2675. IXGBE_WRITE_REG(hw, IXGBE_PFVFMRQC(pf_pool), mrqc);
  2676. else
  2677. IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
  2678. }
  2679. return 0;
  2680. }
  2681. static int ixgbe_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
  2682. {
  2683. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2684. int ret = -EOPNOTSUPP;
  2685. switch (cmd->cmd) {
  2686. case ETHTOOL_SRXCLSRLINS:
  2687. ret = ixgbe_add_ethtool_fdir_entry(adapter, cmd);
  2688. break;
  2689. case ETHTOOL_SRXCLSRLDEL:
  2690. ret = ixgbe_del_ethtool_fdir_entry(adapter, cmd);
  2691. break;
  2692. case ETHTOOL_SRXFH:
  2693. ret = ixgbe_set_rss_hash_opt(adapter, cmd);
  2694. break;
  2695. default:
  2696. break;
  2697. }
  2698. return ret;
  2699. }
  2700. static u32 ixgbe_get_rxfh_key_size(struct net_device *netdev)
  2701. {
  2702. return IXGBE_RSS_KEY_SIZE;
  2703. }
  2704. static u32 ixgbe_rss_indir_size(struct net_device *netdev)
  2705. {
  2706. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2707. return ixgbe_rss_indir_tbl_entries(adapter);
  2708. }
  2709. static void ixgbe_get_reta(struct ixgbe_adapter *adapter, u32 *indir)
  2710. {
  2711. int i, reta_size = ixgbe_rss_indir_tbl_entries(adapter);
  2712. u16 rss_m = adapter->ring_feature[RING_F_RSS].mask;
  2713. if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
  2714. rss_m = adapter->ring_feature[RING_F_RSS].indices - 1;
  2715. for (i = 0; i < reta_size; i++)
  2716. indir[i] = adapter->rss_indir_tbl[i] & rss_m;
  2717. }
  2718. static int ixgbe_get_rxfh(struct net_device *netdev,
  2719. struct ethtool_rxfh_param *rxfh)
  2720. {
  2721. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2722. rxfh->hfunc = ETH_RSS_HASH_TOP;
  2723. if (rxfh->indir)
  2724. ixgbe_get_reta(adapter, rxfh->indir);
  2725. if (rxfh->key)
  2726. memcpy(rxfh->key, adapter->rss_key,
  2727. ixgbe_get_rxfh_key_size(netdev));
  2728. return 0;
  2729. }
  2730. static int ixgbe_set_rxfh(struct net_device *netdev,
  2731. struct ethtool_rxfh_param *rxfh,
  2732. struct netlink_ext_ack *extack)
  2733. {
  2734. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  2735. int i;
  2736. u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
  2737. if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
  2738. rxfh->hfunc != ETH_RSS_HASH_TOP)
  2739. return -EOPNOTSUPP;
  2740. /* Fill out the redirection table */
  2741. if (rxfh->indir) {
  2742. int max_queues = min_t(int, adapter->num_rx_queues,
  2743. ixgbe_rss_indir_tbl_max(adapter));
  2744. /*Allow at least 2 queues w/ SR-IOV.*/
  2745. if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) &&
  2746. (max_queues < 2))
  2747. max_queues = 2;
  2748. /* Verify user input. */
  2749. for (i = 0; i < reta_entries; i++)
  2750. if (rxfh->indir[i] >= max_queues)
  2751. return -EINVAL;
  2752. for (i = 0; i < reta_entries; i++)
  2753. adapter->rss_indir_tbl[i] = rxfh->indir[i];
  2754. ixgbe_store_reta(adapter);
  2755. }
  2756. /* Fill out the rss hash key */
  2757. if (rxfh->key) {
  2758. memcpy(adapter->rss_key, rxfh->key,
  2759. ixgbe_get_rxfh_key_size(netdev));
  2760. ixgbe_store_key(adapter);
  2761. }
  2762. return 0;
  2763. }
  2764. static int ixgbe_get_ts_info(struct net_device *dev,
  2765. struct kernel_ethtool_ts_info *info)
  2766. {
  2767. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2768. /* we always support timestamping disabled */
  2769. info->rx_filters = BIT(HWTSTAMP_FILTER_NONE);
  2770. switch (adapter->hw.mac.type) {
  2771. case ixgbe_mac_X550:
  2772. case ixgbe_mac_X550EM_x:
  2773. case ixgbe_mac_x550em_a:
  2774. info->rx_filters |= BIT(HWTSTAMP_FILTER_ALL);
  2775. break;
  2776. case ixgbe_mac_X540:
  2777. case ixgbe_mac_82599EB:
  2778. info->rx_filters |=
  2779. BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
  2780. BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
  2781. BIT(HWTSTAMP_FILTER_PTP_V2_EVENT);
  2782. break;
  2783. default:
  2784. return ethtool_op_get_ts_info(dev, info);
  2785. }
  2786. info->so_timestamping =
  2787. SOF_TIMESTAMPING_TX_SOFTWARE |
  2788. SOF_TIMESTAMPING_TX_HARDWARE |
  2789. SOF_TIMESTAMPING_RX_HARDWARE |
  2790. SOF_TIMESTAMPING_RAW_HARDWARE;
  2791. if (adapter->ptp_clock)
  2792. info->phc_index = ptp_clock_index(adapter->ptp_clock);
  2793. info->tx_types =
  2794. BIT(HWTSTAMP_TX_OFF) |
  2795. BIT(HWTSTAMP_TX_ON);
  2796. return 0;
  2797. }
  2798. static unsigned int ixgbe_max_channels(struct ixgbe_adapter *adapter)
  2799. {
  2800. unsigned int max_combined;
  2801. u8 tcs = adapter->hw_tcs;
  2802. if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
  2803. /* We only support one q_vector without MSI-X */
  2804. max_combined = 1;
  2805. } else if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
  2806. /* Limit value based on the queue mask */
  2807. max_combined = adapter->ring_feature[RING_F_RSS].mask + 1;
  2808. } else if (tcs > 1) {
  2809. /* For DCB report channels per traffic class */
  2810. if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
  2811. /* 8 TC w/ 4 queues per TC */
  2812. max_combined = 4;
  2813. } else if (tcs > 4) {
  2814. /* 8 TC w/ 8 queues per TC */
  2815. max_combined = 8;
  2816. } else {
  2817. /* 4 TC w/ 16 queues per TC */
  2818. max_combined = 16;
  2819. }
  2820. } else if (adapter->atr_sample_rate) {
  2821. /* support up to 64 queues with ATR */
  2822. max_combined = IXGBE_MAX_FDIR_INDICES;
  2823. } else {
  2824. /* support up to 16 queues with RSS */
  2825. max_combined = ixgbe_max_rss_indices(adapter);
  2826. }
  2827. return min_t(int, max_combined, num_online_cpus());
  2828. }
  2829. static void ixgbe_get_channels(struct net_device *dev,
  2830. struct ethtool_channels *ch)
  2831. {
  2832. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2833. /* report maximum channels */
  2834. ch->max_combined = ixgbe_max_channels(adapter);
  2835. /* report info for other vector */
  2836. if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
  2837. ch->max_other = NON_Q_VECTORS;
  2838. ch->other_count = NON_Q_VECTORS;
  2839. }
  2840. /* record RSS queues */
  2841. ch->combined_count = adapter->ring_feature[RING_F_RSS].indices;
  2842. /* nothing else to report if RSS is disabled */
  2843. if (ch->combined_count == 1)
  2844. return;
  2845. /* we do not support ATR queueing if SR-IOV is enabled */
  2846. if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
  2847. return;
  2848. /* same thing goes for being DCB enabled */
  2849. if (adapter->hw_tcs > 1)
  2850. return;
  2851. /* if ATR is disabled we can exit */
  2852. if (!adapter->atr_sample_rate)
  2853. return;
  2854. /* report flow director queues as maximum channels */
  2855. ch->combined_count = adapter->ring_feature[RING_F_FDIR].indices;
  2856. }
  2857. static int ixgbe_set_channels(struct net_device *dev,
  2858. struct ethtool_channels *ch)
  2859. {
  2860. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2861. unsigned int count = ch->combined_count;
  2862. u8 max_rss_indices = ixgbe_max_rss_indices(adapter);
  2863. /* verify they are not requesting separate vectors */
  2864. if (!count || ch->rx_count || ch->tx_count)
  2865. return -EINVAL;
  2866. /* verify other_count has not changed */
  2867. if (ch->other_count != NON_Q_VECTORS)
  2868. return -EINVAL;
  2869. /* verify the number of channels does not exceed hardware limits */
  2870. if (count > ixgbe_max_channels(adapter))
  2871. return -EINVAL;
  2872. /* update feature limits from largest to smallest supported values */
  2873. adapter->ring_feature[RING_F_FDIR].limit = count;
  2874. /* cap RSS limit */
  2875. if (count > max_rss_indices)
  2876. count = max_rss_indices;
  2877. adapter->ring_feature[RING_F_RSS].limit = count;
  2878. #ifdef IXGBE_FCOE
  2879. /* cap FCoE limit at 8 */
  2880. if (count > IXGBE_FCRETA_SIZE)
  2881. count = IXGBE_FCRETA_SIZE;
  2882. adapter->ring_feature[RING_F_FCOE].limit = count;
  2883. #endif
  2884. /* use setup TC to update any traffic class queue mapping */
  2885. return ixgbe_setup_tc(dev, adapter->hw_tcs);
  2886. }
  2887. static int ixgbe_get_module_info(struct net_device *dev,
  2888. struct ethtool_modinfo *modinfo)
  2889. {
  2890. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2891. struct ixgbe_hw *hw = &adapter->hw;
  2892. u8 sff8472_rev, addr_mode;
  2893. bool page_swap = false;
  2894. int status;
  2895. if (hw->phy.type == ixgbe_phy_fw)
  2896. return -ENXIO;
  2897. /* Check whether we support SFF-8472 or not */
  2898. status = hw->phy.ops.read_i2c_eeprom(hw,
  2899. IXGBE_SFF_SFF_8472_COMP,
  2900. &sff8472_rev);
  2901. if (status)
  2902. return -EIO;
  2903. /* addressing mode is not supported */
  2904. status = hw->phy.ops.read_i2c_eeprom(hw,
  2905. IXGBE_SFF_SFF_8472_SWAP,
  2906. &addr_mode);
  2907. if (status)
  2908. return -EIO;
  2909. if (addr_mode & IXGBE_SFF_ADDRESSING_MODE) {
  2910. e_err(drv, "Address change required to access page 0xA2, but not supported. Please report the module type to the driver maintainers.\n");
  2911. page_swap = true;
  2912. }
  2913. if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap ||
  2914. !(addr_mode & IXGBE_SFF_DDM_IMPLEMENTED)) {
  2915. /* We have a SFP, but it does not support SFF-8472 */
  2916. modinfo->type = ETH_MODULE_SFF_8079;
  2917. modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
  2918. } else {
  2919. /* We have a SFP which supports a revision of SFF-8472. */
  2920. modinfo->type = ETH_MODULE_SFF_8472;
  2921. modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
  2922. }
  2923. return 0;
  2924. }
  2925. static int ixgbe_get_module_eeprom(struct net_device *dev,
  2926. struct ethtool_eeprom *ee,
  2927. u8 *data)
  2928. {
  2929. struct ixgbe_adapter *adapter = netdev_priv(dev);
  2930. struct ixgbe_hw *hw = &adapter->hw;
  2931. int status = -EFAULT;
  2932. u8 databyte = 0xFF;
  2933. int i = 0;
  2934. if (ee->len == 0)
  2935. return -EINVAL;
  2936. if (hw->phy.type == ixgbe_phy_fw)
  2937. return -ENXIO;
  2938. for (i = ee->offset; i < ee->offset + ee->len; i++) {
  2939. /* I2C reads can take long time */
  2940. if (test_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
  2941. return -EBUSY;
  2942. if (i < ETH_MODULE_SFF_8079_LEN)
  2943. status = hw->phy.ops.read_i2c_eeprom(hw, i, &databyte);
  2944. else
  2945. status = hw->phy.ops.read_i2c_sff8472(hw, i, &databyte);
  2946. if (status)
  2947. return -EIO;
  2948. data[i - ee->offset] = databyte;
  2949. }
  2950. return 0;
  2951. }
  2952. static const struct {
  2953. ixgbe_link_speed mac_speed;
  2954. u32 link_mode;
  2955. } ixgbe_ls_map[] = {
  2956. { IXGBE_LINK_SPEED_10_FULL, ETHTOOL_LINK_MODE_10baseT_Full_BIT },
  2957. { IXGBE_LINK_SPEED_100_FULL, ETHTOOL_LINK_MODE_100baseT_Full_BIT },
  2958. { IXGBE_LINK_SPEED_1GB_FULL, ETHTOOL_LINK_MODE_1000baseT_Full_BIT },
  2959. { IXGBE_LINK_SPEED_2_5GB_FULL, ETHTOOL_LINK_MODE_2500baseX_Full_BIT },
  2960. { IXGBE_LINK_SPEED_10GB_FULL, ETHTOOL_LINK_MODE_10000baseT_Full_BIT },
  2961. };
  2962. static const struct {
  2963. u32 lp_advertised;
  2964. u32 link_mode;
  2965. } ixgbe_lp_map[] = {
  2966. { FW_PHY_ACT_UD_2_100M_TX_EEE, ETHTOOL_LINK_MODE_100baseT_Full_BIT },
  2967. { FW_PHY_ACT_UD_2_1G_T_EEE, ETHTOOL_LINK_MODE_1000baseT_Full_BIT },
  2968. { FW_PHY_ACT_UD_2_10G_T_EEE, ETHTOOL_LINK_MODE_10000baseT_Full_BIT },
  2969. { FW_PHY_ACT_UD_2_1G_KX_EEE, ETHTOOL_LINK_MODE_1000baseKX_Full_BIT },
  2970. { FW_PHY_ACT_UD_2_10G_KX4_EEE, ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT },
  2971. { FW_PHY_ACT_UD_2_10G_KR_EEE, ETHTOOL_LINK_MODE_10000baseKR_Full_BIT},
  2972. };
  2973. static int
  2974. ixgbe_get_eee_fw(struct ixgbe_adapter *adapter, struct ethtool_keee *edata)
  2975. {
  2976. __ETHTOOL_DECLARE_LINK_MODE_MASK(common);
  2977. u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
  2978. struct ixgbe_hw *hw = &adapter->hw;
  2979. int rc;
  2980. u16 i;
  2981. rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_UD_2, &info);
  2982. if (rc)
  2983. return rc;
  2984. for (i = 0; i < ARRAY_SIZE(ixgbe_lp_map); ++i) {
  2985. if (info[0] & ixgbe_lp_map[i].lp_advertised)
  2986. linkmode_set_bit(ixgbe_lp_map[i].link_mode,
  2987. edata->lp_advertised);
  2988. }
  2989. for (i = 0; i < ARRAY_SIZE(ixgbe_ls_map); ++i) {
  2990. if (hw->phy.eee_speeds_supported & ixgbe_ls_map[i].mac_speed)
  2991. linkmode_set_bit(ixgbe_ls_map[i].link_mode,
  2992. edata->supported);
  2993. }
  2994. for (i = 0; i < ARRAY_SIZE(ixgbe_ls_map); ++i) {
  2995. if (hw->phy.eee_speeds_advertised & ixgbe_ls_map[i].mac_speed)
  2996. linkmode_set_bit(ixgbe_ls_map[i].link_mode,
  2997. edata->advertised);
  2998. }
  2999. edata->eee_enabled = !linkmode_empty(edata->advertised);
  3000. edata->tx_lpi_enabled = edata->eee_enabled;
  3001. linkmode_and(common, edata->advertised, edata->lp_advertised);
  3002. edata->eee_active = !linkmode_empty(common);
  3003. return 0;
  3004. }
  3005. static int ixgbe_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
  3006. {
  3007. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  3008. struct ixgbe_hw *hw = &adapter->hw;
  3009. if (!(adapter->flags2 & IXGBE_FLAG2_EEE_CAPABLE))
  3010. return -EOPNOTSUPP;
  3011. if (hw->phy.eee_speeds_supported && hw->phy.type == ixgbe_phy_fw)
  3012. return ixgbe_get_eee_fw(adapter, edata);
  3013. return -EOPNOTSUPP;
  3014. }
  3015. static int ixgbe_set_eee(struct net_device *netdev, struct ethtool_keee *edata)
  3016. {
  3017. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  3018. struct ixgbe_hw *hw = &adapter->hw;
  3019. struct ethtool_keee eee_data;
  3020. int ret_val;
  3021. if (!(adapter->flags2 & IXGBE_FLAG2_EEE_CAPABLE))
  3022. return -EOPNOTSUPP;
  3023. memset(&eee_data, 0, sizeof(struct ethtool_keee));
  3024. ret_val = ixgbe_get_eee(netdev, &eee_data);
  3025. if (ret_val)
  3026. return ret_val;
  3027. if (eee_data.eee_enabled && !edata->eee_enabled) {
  3028. if (eee_data.tx_lpi_enabled != edata->tx_lpi_enabled) {
  3029. e_err(drv, "Setting EEE tx-lpi is not supported\n");
  3030. return -EINVAL;
  3031. }
  3032. if (eee_data.tx_lpi_timer != edata->tx_lpi_timer) {
  3033. e_err(drv,
  3034. "Setting EEE Tx LPI timer is not supported\n");
  3035. return -EINVAL;
  3036. }
  3037. if (!linkmode_equal(eee_data.advertised, edata->advertised)) {
  3038. e_err(drv,
  3039. "Setting EEE advertised speeds is not supported\n");
  3040. return -EINVAL;
  3041. }
  3042. }
  3043. if (eee_data.eee_enabled != edata->eee_enabled) {
  3044. if (edata->eee_enabled) {
  3045. adapter->flags2 |= IXGBE_FLAG2_EEE_ENABLED;
  3046. hw->phy.eee_speeds_advertised =
  3047. hw->phy.eee_speeds_supported;
  3048. } else {
  3049. adapter->flags2 &= ~IXGBE_FLAG2_EEE_ENABLED;
  3050. hw->phy.eee_speeds_advertised = 0;
  3051. }
  3052. /* reset link */
  3053. if (netif_running(netdev))
  3054. ixgbe_reinit_locked(adapter);
  3055. else
  3056. ixgbe_reset(adapter);
  3057. }
  3058. return 0;
  3059. }
  3060. static u32 ixgbe_get_priv_flags(struct net_device *netdev)
  3061. {
  3062. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  3063. u32 priv_flags = 0;
  3064. if (adapter->flags2 & IXGBE_FLAG2_RX_LEGACY)
  3065. priv_flags |= IXGBE_PRIV_FLAGS_LEGACY_RX;
  3066. if (adapter->flags2 & IXGBE_FLAG2_VF_IPSEC_ENABLED)
  3067. priv_flags |= IXGBE_PRIV_FLAGS_VF_IPSEC_EN;
  3068. if (adapter->flags2 & IXGBE_FLAG2_AUTO_DISABLE_VF)
  3069. priv_flags |= IXGBE_PRIV_FLAGS_AUTO_DISABLE_VF;
  3070. return priv_flags;
  3071. }
  3072. static int ixgbe_set_priv_flags(struct net_device *netdev, u32 priv_flags)
  3073. {
  3074. struct ixgbe_adapter *adapter = netdev_priv(netdev);
  3075. unsigned int flags2 = adapter->flags2;
  3076. unsigned int i;
  3077. flags2 &= ~IXGBE_FLAG2_RX_LEGACY;
  3078. if (priv_flags & IXGBE_PRIV_FLAGS_LEGACY_RX)
  3079. flags2 |= IXGBE_FLAG2_RX_LEGACY;
  3080. flags2 &= ~IXGBE_FLAG2_VF_IPSEC_ENABLED;
  3081. if (priv_flags & IXGBE_PRIV_FLAGS_VF_IPSEC_EN)
  3082. flags2 |= IXGBE_FLAG2_VF_IPSEC_ENABLED;
  3083. flags2 &= ~IXGBE_FLAG2_AUTO_DISABLE_VF;
  3084. if (priv_flags & IXGBE_PRIV_FLAGS_AUTO_DISABLE_VF) {
  3085. if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
  3086. /* Reset primary abort counter */
  3087. for (i = 0; i < adapter->num_vfs; i++)
  3088. adapter->vfinfo[i].primary_abort_count = 0;
  3089. flags2 |= IXGBE_FLAG2_AUTO_DISABLE_VF;
  3090. } else {
  3091. e_info(probe,
  3092. "Cannot set private flags: Operation not supported\n");
  3093. return -EOPNOTSUPP;
  3094. }
  3095. }
  3096. if (flags2 != adapter->flags2) {
  3097. adapter->flags2 = flags2;
  3098. /* reset interface to repopulate queues */
  3099. if (netif_running(netdev))
  3100. ixgbe_reinit_locked(adapter);
  3101. }
  3102. return 0;
  3103. }
  3104. static const struct ethtool_ops ixgbe_ethtool_ops = {
  3105. .supported_coalesce_params = ETHTOOL_COALESCE_USECS,
  3106. .get_drvinfo = ixgbe_get_drvinfo,
  3107. .get_regs_len = ixgbe_get_regs_len,
  3108. .get_regs = ixgbe_get_regs,
  3109. .get_wol = ixgbe_get_wol,
  3110. .set_wol = ixgbe_set_wol,
  3111. .nway_reset = ixgbe_nway_reset,
  3112. .get_link = ethtool_op_get_link,
  3113. .get_eeprom_len = ixgbe_get_eeprom_len,
  3114. .get_eeprom = ixgbe_get_eeprom,
  3115. .set_eeprom = ixgbe_set_eeprom,
  3116. .get_ringparam = ixgbe_get_ringparam,
  3117. .set_ringparam = ixgbe_set_ringparam,
  3118. .get_pause_stats = ixgbe_get_pause_stats,
  3119. .get_pauseparam = ixgbe_get_pauseparam,
  3120. .set_pauseparam = ixgbe_set_pauseparam,
  3121. .get_msglevel = ixgbe_get_msglevel,
  3122. .set_msglevel = ixgbe_set_msglevel,
  3123. .self_test = ixgbe_diag_test,
  3124. .get_strings = ixgbe_get_strings,
  3125. .set_phys_id = ixgbe_set_phys_id,
  3126. .get_sset_count = ixgbe_get_sset_count,
  3127. .get_ethtool_stats = ixgbe_get_ethtool_stats,
  3128. .get_coalesce = ixgbe_get_coalesce,
  3129. .set_coalesce = ixgbe_set_coalesce,
  3130. .get_rxnfc = ixgbe_get_rxnfc,
  3131. .set_rxnfc = ixgbe_set_rxnfc,
  3132. .get_rxfh_indir_size = ixgbe_rss_indir_size,
  3133. .get_rxfh_key_size = ixgbe_get_rxfh_key_size,
  3134. .get_rxfh = ixgbe_get_rxfh,
  3135. .set_rxfh = ixgbe_set_rxfh,
  3136. .get_eee = ixgbe_get_eee,
  3137. .set_eee = ixgbe_set_eee,
  3138. .get_channels = ixgbe_get_channels,
  3139. .set_channels = ixgbe_set_channels,
  3140. .get_priv_flags = ixgbe_get_priv_flags,
  3141. .set_priv_flags = ixgbe_set_priv_flags,
  3142. .get_ts_info = ixgbe_get_ts_info,
  3143. .get_module_info = ixgbe_get_module_info,
  3144. .get_module_eeprom = ixgbe_get_module_eeprom,
  3145. .get_link_ksettings = ixgbe_get_link_ksettings,
  3146. .set_link_ksettings = ixgbe_set_link_ksettings,
  3147. };
  3148. void ixgbe_set_ethtool_ops(struct net_device *netdev)
  3149. {
  3150. netdev->ethtool_ops = &ixgbe_ethtool_ops;
  3151. }