sli4.h 94 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
  4. * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
  5. *
  6. */
  7. /*
  8. * All common SLI-4 structures and function prototypes.
  9. */
  10. #ifndef _SLI4_H
  11. #define _SLI4_H
  12. #include <linux/pci.h>
  13. #include <linux/delay.h>
  14. #include "scsi/fc/fc_els.h"
  15. #include "scsi/fc/fc_fs.h"
  16. #include "../include/efc_common.h"
  17. /*************************************************************************
  18. * Common SLI-4 register offsets and field definitions
  19. */
  20. /* SLI_INTF - SLI Interface Definition Register */
  21. #define SLI4_INTF_REG 0x0058
  22. enum sli4_intf {
  23. SLI4_INTF_REV_SHIFT = 4,
  24. SLI4_INTF_REV_MASK = 0xf0,
  25. SLI4_INTF_REV_S3 = 0x30,
  26. SLI4_INTF_REV_S4 = 0x40,
  27. SLI4_INTF_FAMILY_SHIFT = 8,
  28. SLI4_INTF_FAMILY_MASK = 0x0f00,
  29. SLI4_FAMILY_CHECK_ASIC_TYPE = 0x0f00,
  30. SLI4_INTF_IF_TYPE_SHIFT = 12,
  31. SLI4_INTF_IF_TYPE_MASK = 0xf000,
  32. SLI4_INTF_IF_TYPE_2 = 0x2000,
  33. SLI4_INTF_IF_TYPE_6 = 0x6000,
  34. SLI4_INTF_VALID_SHIFT = 29,
  35. SLI4_INTF_VALID_MASK = 0xe0000000,
  36. SLI4_INTF_VALID_VALUE = 0xc0000000,
  37. };
  38. /* ASIC_ID - SLI ASIC Type and Revision Register */
  39. #define SLI4_ASIC_ID_REG 0x009c
  40. enum sli4_asic {
  41. SLI4_ASIC_GEN_SHIFT = 8,
  42. SLI4_ASIC_GEN_MASK = 0xff00,
  43. SLI4_ASIC_GEN_5 = 0x0b00,
  44. SLI4_ASIC_GEN_6 = 0x0c00,
  45. SLI4_ASIC_GEN_7 = 0x0d00,
  46. };
  47. enum sli4_acic_revisions {
  48. SLI4_ASIC_REV_A0 = 0x00,
  49. SLI4_ASIC_REV_A1 = 0x01,
  50. SLI4_ASIC_REV_A2 = 0x02,
  51. SLI4_ASIC_REV_A3 = 0x03,
  52. SLI4_ASIC_REV_B0 = 0x10,
  53. SLI4_ASIC_REV_B1 = 0x11,
  54. SLI4_ASIC_REV_B2 = 0x12,
  55. SLI4_ASIC_REV_C0 = 0x20,
  56. SLI4_ASIC_REV_C1 = 0x21,
  57. SLI4_ASIC_REV_C2 = 0x22,
  58. SLI4_ASIC_REV_D0 = 0x30,
  59. };
  60. struct sli4_asic_entry_t {
  61. u32 rev_id;
  62. u32 family;
  63. };
  64. /* BMBX - Bootstrap Mailbox Register */
  65. #define SLI4_BMBX_REG 0x0160
  66. enum sli4_bmbx {
  67. SLI4_BMBX_MASK_HI = 0x3,
  68. SLI4_BMBX_MASK_LO = 0xf,
  69. SLI4_BMBX_RDY = 1 << 0,
  70. SLI4_BMBX_HI = 1 << 1,
  71. SLI4_BMBX_SIZE = 256,
  72. };
  73. static inline u32
  74. sli_bmbx_write_hi(u64 addr) {
  75. u32 val;
  76. val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI;
  77. val |= SLI4_BMBX_HI;
  78. return val;
  79. }
  80. static inline u32
  81. sli_bmbx_write_lo(u64 addr) {
  82. u32 val;
  83. val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30;
  84. val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2;
  85. return val;
  86. }
  87. /* SLIPORT_CONTROL - SLI Port Control Register */
  88. #define SLI4_PORT_CTRL_REG 0x0408
  89. enum sli4_port_ctrl {
  90. SLI4_PORT_CTRL_IP = 1u << 27,
  91. SLI4_PORT_CTRL_IDIS = 1u << 22,
  92. SLI4_PORT_CTRL_FDD = 1u << 31,
  93. };
  94. /* SLI4_SLIPORT_ERROR - SLI Port Error Register */
  95. #define SLI4_PORT_ERROR1 0x040c
  96. #define SLI4_PORT_ERROR2 0x0410
  97. /* EQCQ_DOORBELL - EQ and CQ Doorbell Register */
  98. #define SLI4_EQCQ_DB_REG 0x120
  99. enum sli4_eqcq_e {
  100. SLI4_EQ_ID_LO_MASK = 0x01ff,
  101. SLI4_CQ_ID_LO_MASK = 0x03ff,
  102. SLI4_EQCQ_CI_EQ = 0x0200,
  103. SLI4_EQCQ_QT_EQ = 0x00000400,
  104. SLI4_EQCQ_QT_CQ = 0x00000000,
  105. SLI4_EQCQ_ID_HI_SHIFT = 11,
  106. SLI4_EQCQ_ID_HI_MASK = 0xf800,
  107. SLI4_EQCQ_NUM_SHIFT = 16,
  108. SLI4_EQCQ_NUM_MASK = 0x1fff0000,
  109. SLI4_EQCQ_ARM = 0x20000000,
  110. SLI4_EQCQ_UNARM = 0x00000000,
  111. };
  112. static inline u32
  113. sli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) {
  114. u32 reg;
  115. reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ;
  116. reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
  117. reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
  118. reg |= arm | SLI4_EQCQ_CI_EQ;
  119. return reg;
  120. }
  121. static inline u32
  122. sli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) {
  123. u32 reg;
  124. reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ;
  125. reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
  126. reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
  127. reg |= arm;
  128. return reg;
  129. }
  130. /* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/
  131. #define SLI4_IF6_EQ_DB_REG 0x120
  132. enum sli4_eq_e {
  133. SLI4_IF6_EQ_ID_MASK = 0x0fff,
  134. SLI4_IF6_EQ_NUM_SHIFT = 16,
  135. SLI4_IF6_EQ_NUM_MASK = 0x1fff0000,
  136. };
  137. static inline u32
  138. sli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) {
  139. u32 reg;
  140. reg = id & SLI4_IF6_EQ_ID_MASK;
  141. reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK;
  142. reg |= arm;
  143. return reg;
  144. }
  145. /* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */
  146. #define SLI4_IF6_CQ_DB_REG 0xc0
  147. enum sli4_cq_e {
  148. SLI4_IF6_CQ_ID_MASK = 0xffff,
  149. SLI4_IF6_CQ_NUM_SHIFT = 16,
  150. SLI4_IF6_CQ_NUM_MASK = 0x1fff0000,
  151. };
  152. static inline u32
  153. sli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) {
  154. u32 reg;
  155. reg = id & SLI4_IF6_CQ_ID_MASK;
  156. reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK;
  157. reg |= arm;
  158. return reg;
  159. }
  160. /* MQ_DOORBELL - MQ Doorbell Register */
  161. #define SLI4_MQ_DB_REG 0x0140
  162. #define SLI4_IF6_MQ_DB_REG 0x0160
  163. enum sli4_mq_e {
  164. SLI4_MQ_ID_MASK = 0xffff,
  165. SLI4_MQ_NUM_SHIFT = 16,
  166. SLI4_MQ_NUM_MASK = 0x3fff0000,
  167. };
  168. static inline u32
  169. sli_format_mq_db_data(u16 id) {
  170. u32 reg;
  171. reg = id & SLI4_MQ_ID_MASK;
  172. reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK;
  173. return reg;
  174. }
  175. /* RQ_DOORBELL - RQ Doorbell Register */
  176. #define SLI4_RQ_DB_REG 0x0a0
  177. #define SLI4_IF6_RQ_DB_REG 0x0080
  178. enum sli4_rq_e {
  179. SLI4_RQ_DB_ID_MASK = 0xffff,
  180. SLI4_RQ_DB_NUM_SHIFT = 16,
  181. SLI4_RQ_DB_NUM_MASK = 0x3fff0000,
  182. };
  183. static inline u32
  184. sli_format_rq_db_data(u16 id) {
  185. u32 reg;
  186. reg = id & SLI4_RQ_DB_ID_MASK;
  187. reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK;
  188. return reg;
  189. }
  190. /* WQ_DOORBELL - WQ Doorbell Register */
  191. #define SLI4_IO_WQ_DB_REG 0x040
  192. #define SLI4_IF6_WQ_DB_REG 0x040
  193. enum sli4_wq_e {
  194. SLI4_WQ_ID_MASK = 0xffff,
  195. SLI4_WQ_IDX_SHIFT = 16,
  196. SLI4_WQ_IDX_MASK = 0xff0000,
  197. SLI4_WQ_NUM_SHIFT = 24,
  198. SLI4_WQ_NUM_MASK = 0x0ff00000,
  199. };
  200. static inline u32
  201. sli_format_wq_db_data(u16 id) {
  202. u32 reg;
  203. reg = id & SLI4_WQ_ID_MASK;
  204. reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK;
  205. return reg;
  206. }
  207. /* SLIPORT_STATUS - SLI Port Status Register */
  208. #define SLI4_PORT_STATUS_REGOFF 0x0404
  209. enum sli4_port_status {
  210. SLI4_PORT_STATUS_FDP = 1u << 21,
  211. SLI4_PORT_STATUS_RDY = 1u << 23,
  212. SLI4_PORT_STATUS_RN = 1u << 24,
  213. SLI4_PORT_STATUS_DIP = 1u << 25,
  214. SLI4_PORT_STATUS_OTI = 1u << 29,
  215. SLI4_PORT_STATUS_ERR = 1u << 31,
  216. };
  217. #define SLI4_PHYDEV_CTRL_REG 0x0414
  218. #define SLI4_PHYDEV_CTRL_FRST (1 << 1)
  219. #define SLI4_PHYDEV_CTRL_DD (1 << 2)
  220. /* Register name enums */
  221. enum sli4_regname_en {
  222. SLI4_REG_BMBX,
  223. SLI4_REG_EQ_DOORBELL,
  224. SLI4_REG_CQ_DOORBELL,
  225. SLI4_REG_RQ_DOORBELL,
  226. SLI4_REG_IO_WQ_DOORBELL,
  227. SLI4_REG_MQ_DOORBELL,
  228. SLI4_REG_PHYSDEV_CONTROL,
  229. SLI4_REG_PORT_CONTROL,
  230. SLI4_REG_PORT_ERROR1,
  231. SLI4_REG_PORT_ERROR2,
  232. SLI4_REG_PORT_SEMAPHORE,
  233. SLI4_REG_PORT_STATUS,
  234. SLI4_REG_UNKWOWN /* must be last */
  235. };
  236. struct sli4_reg {
  237. u32 rset;
  238. u32 off;
  239. };
  240. struct sli4_dmaaddr {
  241. __le32 low;
  242. __le32 high;
  243. };
  244. /*
  245. * a 3-word Buffer Descriptor Entry with
  246. * address 1st 2 words, length last word
  247. */
  248. struct sli4_bufptr {
  249. struct sli4_dmaaddr addr;
  250. __le32 length;
  251. };
  252. /* Buffer Descriptor Entry (BDE) */
  253. enum sli4_bde_e {
  254. SLI4_BDE_LEN_MASK = 0x00ffffff,
  255. SLI4_BDE_TYPE_MASK = 0xff000000,
  256. };
  257. struct sli4_bde {
  258. __le32 bde_type_buflen;
  259. union {
  260. struct sli4_dmaaddr data;
  261. struct {
  262. __le32 offset;
  263. __le32 rsvd2;
  264. } imm;
  265. struct sli4_dmaaddr blp;
  266. } u;
  267. };
  268. /* Buffer Descriptors */
  269. enum sli4_bde_type {
  270. SLI4_BDE_TYPE_SHIFT = 24,
  271. SLI4_BDE_TYPE_64 = 0x00, /* Generic 64-bit data */
  272. SLI4_BDE_TYPE_IMM = 0x01, /* Immediate data */
  273. SLI4_BDE_TYPE_BLP = 0x40, /* Buffer List Pointer */
  274. };
  275. #define SLI4_BDE_TYPE_VAL(type) \
  276. (SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
  277. /* Scatter-Gather Entry (SGE) */
  278. #define SLI4_SGE_MAX_RESERVED 3
  279. enum sli4_sge_type {
  280. /* DW2 */
  281. SLI4_SGE_DATA_OFFSET_MASK = 0x07ffffff,
  282. /*DW2W1*/
  283. SLI4_SGE_TYPE_SHIFT = 27,
  284. SLI4_SGE_TYPE_MASK = 0x78000000,
  285. /*SGE Types*/
  286. SLI4_SGE_TYPE_DATA = 0x00,
  287. SLI4_SGE_TYPE_DIF = 0x04, /* Data Integrity Field */
  288. SLI4_SGE_TYPE_LSP = 0x05, /* List Segment Pointer */
  289. SLI4_SGE_TYPE_PEDIF = 0x06, /* Post Encryption Engine DIF */
  290. SLI4_SGE_TYPE_PESEED = 0x07, /* Post Encryption DIF Seed */
  291. SLI4_SGE_TYPE_DISEED = 0x08, /* DIF Seed */
  292. SLI4_SGE_TYPE_ENC = 0x09, /* Encryption */
  293. SLI4_SGE_TYPE_ATM = 0x0a, /* DIF Application Tag Mask */
  294. SLI4_SGE_TYPE_SKIP = 0x0c, /* SKIP */
  295. SLI4_SGE_LAST = 1u << 31,
  296. };
  297. struct sli4_sge {
  298. __le32 buffer_address_high;
  299. __le32 buffer_address_low;
  300. __le32 dw2_flags;
  301. __le32 buffer_length;
  302. };
  303. /* T10 DIF Scatter-Gather Entry (SGE) */
  304. struct sli4_dif_sge {
  305. __le32 buffer_address_high;
  306. __le32 buffer_address_low;
  307. __le32 dw2_flags;
  308. __le32 rsvd12;
  309. };
  310. /* Data Integrity Seed (DISEED) SGE */
  311. enum sli4_diseed_sge_flags {
  312. /* DW2W1 */
  313. SLI4_DISEED_SGE_HS = 1 << 2,
  314. SLI4_DISEED_SGE_WS = 1 << 3,
  315. SLI4_DISEED_SGE_IC = 1 << 4,
  316. SLI4_DISEED_SGE_ICS = 1 << 5,
  317. SLI4_DISEED_SGE_ATRT = 1 << 6,
  318. SLI4_DISEED_SGE_AT = 1 << 7,
  319. SLI4_DISEED_SGE_FAT = 1 << 8,
  320. SLI4_DISEED_SGE_NA = 1 << 9,
  321. SLI4_DISEED_SGE_HI = 1 << 10,
  322. /* DW3W1 */
  323. SLI4_DISEED_SGE_BS_MASK = 0x0007,
  324. SLI4_DISEED_SGE_AI = 1 << 3,
  325. SLI4_DISEED_SGE_ME = 1 << 4,
  326. SLI4_DISEED_SGE_RE = 1 << 5,
  327. SLI4_DISEED_SGE_CE = 1 << 6,
  328. SLI4_DISEED_SGE_NR = 1 << 7,
  329. SLI4_DISEED_SGE_OP_RX_SHIFT = 8,
  330. SLI4_DISEED_SGE_OP_RX_MASK = 0x0f00,
  331. SLI4_DISEED_SGE_OP_TX_SHIFT = 12,
  332. SLI4_DISEED_SGE_OP_TX_MASK = 0xf000,
  333. };
  334. /* Opcode values */
  335. enum sli4_diseed_sge_opcodes {
  336. SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CRC,
  337. SLI4_DISEED_SGE_OP_IN_CRC_OUT_NODIF,
  338. SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
  339. SLI4_DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
  340. SLI4_DISEED_SGE_OP_IN_CRC_OUT_CRC,
  341. SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
  342. SLI4_DISEED_SGE_OP_IN_CRC_OUT_CSUM,
  343. SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CRC,
  344. SLI4_DISEED_SGE_OP_IN_RAW_OUT_RAW,
  345. };
  346. #define SLI4_DISEED_SGE_OP_RX_VALUE(stype) \
  347. (SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_RX_SHIFT)
  348. #define SLI4_DISEED_SGE_OP_TX_VALUE(stype) \
  349. (SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_TX_SHIFT)
  350. struct sli4_diseed_sge {
  351. __le32 ref_tag_cmp;
  352. __le32 ref_tag_repl;
  353. __le16 app_tag_repl;
  354. __le16 dw2w1_flags;
  355. __le16 app_tag_cmp;
  356. __le16 dw3w1_flags;
  357. };
  358. /* List Segment Pointer Scatter-Gather Entry (SGE) */
  359. #define SLI4_LSP_SGE_SEGLEN 0x00ffffff
  360. struct sli4_lsp_sge {
  361. __le32 buffer_address_high;
  362. __le32 buffer_address_low;
  363. __le32 dw2_flags;
  364. __le32 dw3_seglen;
  365. };
  366. enum sli4_eqe_e {
  367. SLI4_EQE_VALID = 1,
  368. SLI4_EQE_MJCODE = 0xe,
  369. SLI4_EQE_MNCODE = 0xfff0,
  370. };
  371. struct sli4_eqe {
  372. __le16 dw0w0_flags;
  373. __le16 resource_id;
  374. };
  375. #define SLI4_MAJOR_CODE_STANDARD 0
  376. #define SLI4_MAJOR_CODE_SENTINEL 1
  377. /* Sentinel EQE indicating the EQ is full */
  378. #define SLI4_EQE_STATUS_EQ_FULL 2
  379. enum sli4_mcqe_e {
  380. SLI4_MCQE_CONSUMED = 1u << 27,
  381. SLI4_MCQE_COMPLETED = 1u << 28,
  382. SLI4_MCQE_AE = 1u << 30,
  383. SLI4_MCQE_VALID = 1u << 31,
  384. };
  385. /* Entry was consumed but not completed */
  386. #define SLI4_MCQE_STATUS_NOT_COMPLETED -2
  387. struct sli4_mcqe {
  388. __le16 completion_status;
  389. __le16 extended_status;
  390. __le32 mqe_tag_low;
  391. __le32 mqe_tag_high;
  392. __le32 dw3_flags;
  393. };
  394. enum sli4_acqe_e {
  395. SLI4_ACQE_AE = 1 << 6, /* async event - this is an ACQE */
  396. SLI4_ACQE_VAL = 1 << 7, /* valid - contents of CQE are valid */
  397. };
  398. struct sli4_acqe {
  399. __le32 event_data[3];
  400. u8 rsvd12;
  401. u8 event_code;
  402. u8 event_type;
  403. u8 ae_val;
  404. };
  405. enum sli4_acqe_event_code {
  406. SLI4_ACQE_EVENT_CODE_LINK_STATE = 0x01,
  407. SLI4_ACQE_EVENT_CODE_FIP = 0x02,
  408. SLI4_ACQE_EVENT_CODE_DCBX = 0x03,
  409. SLI4_ACQE_EVENT_CODE_ISCSI = 0x04,
  410. SLI4_ACQE_EVENT_CODE_GRP_5 = 0x05,
  411. SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT = 0x10,
  412. SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT = 0x11,
  413. SLI4_ACQE_EVENT_CODE_VF_EVENT = 0x12,
  414. SLI4_ACQE_EVENT_CODE_MR_EVENT = 0x13,
  415. };
  416. enum sli4_qtype {
  417. SLI4_QTYPE_EQ,
  418. SLI4_QTYPE_CQ,
  419. SLI4_QTYPE_MQ,
  420. SLI4_QTYPE_WQ,
  421. SLI4_QTYPE_RQ,
  422. SLI4_QTYPE_MAX, /* must be last */
  423. };
  424. #define SLI4_USER_MQ_COUNT 1
  425. #define SLI4_MAX_CQ_SET_COUNT 16
  426. #define SLI4_MAX_RQ_SET_COUNT 16
  427. enum sli4_qentry {
  428. SLI4_QENTRY_ASYNC,
  429. SLI4_QENTRY_MQ,
  430. SLI4_QENTRY_RQ,
  431. SLI4_QENTRY_WQ,
  432. SLI4_QENTRY_WQ_RELEASE,
  433. SLI4_QENTRY_OPT_WRITE_CMD,
  434. SLI4_QENTRY_OPT_WRITE_DATA,
  435. SLI4_QENTRY_XABT,
  436. SLI4_QENTRY_MAX /* must be last */
  437. };
  438. enum sli4_queue_flags {
  439. SLI4_QUEUE_FLAG_MQ = 1 << 0, /* CQ has MQ/Async completion */
  440. SLI4_QUEUE_FLAG_HDR = 1 << 1, /* RQ for packet headers */
  441. SLI4_QUEUE_FLAG_RQBATCH = 1 << 2, /* RQ index increment by 8 */
  442. };
  443. /* Generic Command Request header */
  444. enum sli4_cmd_version {
  445. CMD_V0,
  446. CMD_V1,
  447. CMD_V2,
  448. };
  449. struct sli4_rqst_hdr {
  450. u8 opcode;
  451. u8 subsystem;
  452. __le16 rsvd2;
  453. __le32 timeout;
  454. __le32 request_length;
  455. __le32 dw3_version;
  456. };
  457. /* Generic Command Response header */
  458. struct sli4_rsp_hdr {
  459. u8 opcode;
  460. u8 subsystem;
  461. __le16 rsvd2;
  462. u8 status;
  463. u8 additional_status;
  464. __le16 rsvd6;
  465. __le32 response_length;
  466. __le32 actual_response_length;
  467. };
  468. #define SLI4_QUEUE_RQ_BATCH 8
  469. #define SZ_DMAADDR sizeof(struct sli4_dmaaddr)
  470. #define SLI4_RQST_CMDSZ(stype) sizeof(struct sli4_rqst_##stype)
  471. #define SLI4_RQST_PYLD_LEN(stype) \
  472. cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
  473. sizeof(struct sli4_rqst_hdr))
  474. #define SLI4_RQST_PYLD_LEN_VAR(stype, varpyld) \
  475. cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
  476. varpyld) - sizeof(struct sli4_rqst_hdr))
  477. #define SLI4_CFG_PYLD_LENGTH(stype) \
  478. max(sizeof(struct sli4_rqst_##stype), \
  479. sizeof(struct sli4_rsp_##stype))
  480. enum sli4_create_cqv2_e {
  481. /* DW5_flags values*/
  482. SLI4_CREATE_CQV2_CLSWM_MASK = 0x00003000,
  483. SLI4_CREATE_CQV2_NODELAY = 0x00004000,
  484. SLI4_CREATE_CQV2_AUTOVALID = 0x00008000,
  485. SLI4_CREATE_CQV2_CQECNT_MASK = 0x18000000,
  486. SLI4_CREATE_CQV2_VALID = 0x20000000,
  487. SLI4_CREATE_CQV2_EVT = 0x80000000,
  488. /* DW6W1_flags values*/
  489. SLI4_CREATE_CQV2_ARM = 0x8000,
  490. };
  491. struct sli4_rqst_cmn_create_cq_v2 {
  492. struct sli4_rqst_hdr hdr;
  493. __le16 num_pages;
  494. u8 page_size;
  495. u8 rsvd19;
  496. __le32 dw5_flags;
  497. __le16 eq_id;
  498. __le16 dw6w1_arm;
  499. __le16 cqe_count;
  500. __le16 rsvd30;
  501. __le32 rsvd32;
  502. struct sli4_dmaaddr page_phys_addr[];
  503. };
  504. enum sli4_create_cqset_e {
  505. /* DW5_flags values*/
  506. SLI4_CREATE_CQSETV0_CLSWM_MASK = 0x00003000,
  507. SLI4_CREATE_CQSETV0_NODELAY = 0x00004000,
  508. SLI4_CREATE_CQSETV0_AUTOVALID = 0x00008000,
  509. SLI4_CREATE_CQSETV0_CQECNT_MASK = 0x18000000,
  510. SLI4_CREATE_CQSETV0_VALID = 0x20000000,
  511. SLI4_CREATE_CQSETV0_EVT = 0x80000000,
  512. /* DW5W1_flags values */
  513. SLI4_CREATE_CQSETV0_CQE_COUNT = 0x7fff,
  514. SLI4_CREATE_CQSETV0_ARM = 0x8000,
  515. };
  516. struct sli4_rqst_cmn_create_cq_set_v0 {
  517. struct sli4_rqst_hdr hdr;
  518. __le16 num_pages;
  519. u8 page_size;
  520. u8 rsvd19;
  521. __le32 dw5_flags;
  522. __le16 num_cq_req;
  523. __le16 dw6w1_flags;
  524. __le16 eq_id[16];
  525. struct sli4_dmaaddr page_phys_addr[];
  526. };
  527. /* CQE count */
  528. enum sli4_cq_cnt {
  529. SLI4_CQ_CNT_256,
  530. SLI4_CQ_CNT_512,
  531. SLI4_CQ_CNT_1024,
  532. SLI4_CQ_CNT_LARGE,
  533. };
  534. #define SLI4_CQ_CNT_SHIFT 27
  535. #define SLI4_CQ_CNT_VAL(type) (SLI4_CQ_CNT_##type << SLI4_CQ_CNT_SHIFT)
  536. #define SLI4_CQE_BYTES (4 * sizeof(u32))
  537. #define SLI4_CREATE_CQV2_MAX_PAGES 8
  538. /* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
  539. struct sli4_rsp_cmn_create_queue {
  540. struct sli4_rsp_hdr hdr;
  541. __le16 q_id;
  542. u8 rsvd18;
  543. u8 ulp;
  544. __le32 db_offset;
  545. __le16 db_rs;
  546. __le16 db_fmt;
  547. };
  548. struct sli4_rsp_cmn_create_queue_set {
  549. struct sli4_rsp_hdr hdr;
  550. __le16 q_id;
  551. __le16 num_q_allocated;
  552. };
  553. /* Common Destroy Queue */
  554. struct sli4_rqst_cmn_destroy_q {
  555. struct sli4_rqst_hdr hdr;
  556. __le16 q_id;
  557. __le16 rsvd;
  558. };
  559. struct sli4_rsp_cmn_destroy_q {
  560. struct sli4_rsp_hdr hdr;
  561. };
  562. /* Modify the delay multiplier for EQs */
  563. struct sli4_eqdelay_rec {
  564. __le32 eq_id;
  565. __le32 phase;
  566. __le32 delay_multiplier;
  567. };
  568. struct sli4_rqst_cmn_modify_eq_delay {
  569. struct sli4_rqst_hdr hdr;
  570. __le32 num_eq;
  571. struct sli4_eqdelay_rec eq_delay_record[8];
  572. };
  573. struct sli4_rsp_cmn_modify_eq_delay {
  574. struct sli4_rsp_hdr hdr;
  575. };
  576. enum sli4_create_cq_e {
  577. /* DW5 */
  578. SLI4_CREATE_EQ_AUTOVALID = 1u << 28,
  579. SLI4_CREATE_EQ_VALID = 1u << 29,
  580. SLI4_CREATE_EQ_EQESZ = 1u << 31,
  581. /* DW6 */
  582. SLI4_CREATE_EQ_COUNT = 7 << 26,
  583. SLI4_CREATE_EQ_ARM = 1u << 31,
  584. /* DW7 */
  585. SLI4_CREATE_EQ_DELAYMULTI_SHIFT = 13,
  586. SLI4_CREATE_EQ_DELAYMULTI_MASK = 0x007fe000,
  587. SLI4_CREATE_EQ_DELAYMULTI = 0x00040000,
  588. };
  589. struct sli4_rqst_cmn_create_eq {
  590. struct sli4_rqst_hdr hdr;
  591. __le16 num_pages;
  592. __le16 rsvd18;
  593. __le32 dw5_flags;
  594. __le32 dw6_flags;
  595. __le32 dw7_delaymulti;
  596. __le32 rsvd32;
  597. struct sli4_dmaaddr page_address[8];
  598. };
  599. struct sli4_rsp_cmn_create_eq {
  600. struct sli4_rsp_cmn_create_queue q_rsp;
  601. };
  602. /* EQ count */
  603. enum sli4_eq_cnt {
  604. SLI4_EQ_CNT_256,
  605. SLI4_EQ_CNT_512,
  606. SLI4_EQ_CNT_1024,
  607. SLI4_EQ_CNT_2048,
  608. SLI4_EQ_CNT_4096 = 3,
  609. };
  610. #define SLI4_EQ_CNT_SHIFT 26
  611. #define SLI4_EQ_CNT_VAL(type) (SLI4_EQ_CNT_##type << SLI4_EQ_CNT_SHIFT)
  612. #define SLI4_EQE_SIZE_4 0
  613. #define SLI4_EQE_SIZE_16 1
  614. /* Create a Mailbox Queue; accommodate v0 and v1 forms. */
  615. enum sli4_create_mq_flags {
  616. /* DW6W1 */
  617. SLI4_CREATE_MQEXT_RINGSIZE = 0xf,
  618. SLI4_CREATE_MQEXT_CQID_SHIFT = 6,
  619. SLI4_CREATE_MQEXT_CQIDV0_MASK = 0xffc0,
  620. /* DW7 */
  621. SLI4_CREATE_MQEXT_VAL = 1u << 31,
  622. /* DW8 */
  623. SLI4_CREATE_MQEXT_ACQV = 1u << 0,
  624. SLI4_CREATE_MQEXT_ASYNC_CQIDV0 = 0x7fe,
  625. };
  626. struct sli4_rqst_cmn_create_mq_ext {
  627. struct sli4_rqst_hdr hdr;
  628. __le16 num_pages;
  629. __le16 cq_id_v1;
  630. __le32 async_event_bitmap;
  631. __le16 async_cq_id_v1;
  632. __le16 dw6w1_flags;
  633. __le32 dw7_val;
  634. __le32 dw8_flags;
  635. __le32 rsvd36;
  636. struct sli4_dmaaddr page_phys_addr[];
  637. };
  638. struct sli4_rsp_cmn_create_mq_ext {
  639. struct sli4_rsp_cmn_create_queue q_rsp;
  640. };
  641. enum sli4_mqe_size {
  642. SLI4_MQE_SIZE_16 = 0x05,
  643. SLI4_MQE_SIZE_32,
  644. SLI4_MQE_SIZE_64,
  645. SLI4_MQE_SIZE_128,
  646. };
  647. enum sli4_async_evt {
  648. SLI4_ASYNC_EVT_LINK_STATE = 1 << 1,
  649. SLI4_ASYNC_EVT_FIP = 1 << 2,
  650. SLI4_ASYNC_EVT_GRP5 = 1 << 5,
  651. SLI4_ASYNC_EVT_FC = 1 << 16,
  652. SLI4_ASYNC_EVT_SLI_PORT = 1 << 17,
  653. };
  654. #define SLI4_ASYNC_EVT_FC_ALL \
  655. (SLI4_ASYNC_EVT_LINK_STATE | \
  656. SLI4_ASYNC_EVT_FIP | \
  657. SLI4_ASYNC_EVT_GRP5 | \
  658. SLI4_ASYNC_EVT_FC | \
  659. SLI4_ASYNC_EVT_SLI_PORT)
  660. /* Create a Completion Queue. */
  661. struct sli4_rqst_cmn_create_cq_v0 {
  662. struct sli4_rqst_hdr hdr;
  663. __le16 num_pages;
  664. __le16 rsvd18;
  665. __le32 dw5_flags;
  666. __le32 dw6_flags;
  667. __le32 rsvd28;
  668. __le32 rsvd32;
  669. struct sli4_dmaaddr page_phys_addr[];
  670. };
  671. enum sli4_create_rq_e {
  672. SLI4_RQ_CREATE_DUA = 0x1,
  673. SLI4_RQ_CREATE_BQU = 0x2,
  674. SLI4_RQE_SIZE = 8,
  675. SLI4_RQE_SIZE_8 = 0x2,
  676. SLI4_RQE_SIZE_16 = 0x3,
  677. SLI4_RQE_SIZE_32 = 0x4,
  678. SLI4_RQE_SIZE_64 = 0x5,
  679. SLI4_RQE_SIZE_128 = 0x6,
  680. SLI4_RQ_PAGE_SIZE_4096 = 0x1,
  681. SLI4_RQ_PAGE_SIZE_8192 = 0x2,
  682. SLI4_RQ_PAGE_SIZE_16384 = 0x4,
  683. SLI4_RQ_PAGE_SIZE_32768 = 0x8,
  684. SLI4_RQ_PAGE_SIZE_64536 = 0x10,
  685. SLI4_RQ_CREATE_V0_MAX_PAGES = 8,
  686. SLI4_RQ_CREATE_V0_MIN_BUF_SIZE = 128,
  687. SLI4_RQ_CREATE_V0_MAX_BUF_SIZE = 2048,
  688. };
  689. struct sli4_rqst_rq_create {
  690. struct sli4_rqst_hdr hdr;
  691. __le16 num_pages;
  692. u8 dua_bqu_byte;
  693. u8 ulp;
  694. __le16 rsvd16;
  695. u8 rqe_count_byte;
  696. u8 rsvd19;
  697. __le32 rsvd20;
  698. __le16 buffer_size;
  699. __le16 cq_id;
  700. __le32 rsvd28;
  701. struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
  702. };
  703. struct sli4_rsp_rq_create {
  704. struct sli4_rsp_cmn_create_queue rsp;
  705. };
  706. enum sli4_create_rqv1_e {
  707. SLI4_RQ_CREATE_V1_DNB = 0x80,
  708. SLI4_RQ_CREATE_V1_MAX_PAGES = 8,
  709. SLI4_RQ_CREATE_V1_MIN_BUF_SIZE = 64,
  710. SLI4_RQ_CREATE_V1_MAX_BUF_SIZE = 2048,
  711. };
  712. struct sli4_rqst_rq_create_v1 {
  713. struct sli4_rqst_hdr hdr;
  714. __le16 num_pages;
  715. u8 rsvd14;
  716. u8 dim_dfd_dnb;
  717. u8 page_size;
  718. u8 rqe_size_byte;
  719. __le16 rqe_count;
  720. __le32 rsvd20;
  721. __le16 rsvd24;
  722. __le16 cq_id;
  723. __le32 buffer_size;
  724. struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
  725. };
  726. struct sli4_rsp_rq_create_v1 {
  727. struct sli4_rsp_cmn_create_queue rsp;
  728. };
  729. #define SLI4_RQCREATEV2_DNB 0x80
  730. struct sli4_rqst_rq_create_v2 {
  731. struct sli4_rqst_hdr hdr;
  732. __le16 num_pages;
  733. u8 rq_count;
  734. u8 dim_dfd_dnb;
  735. u8 page_size;
  736. u8 rqe_size_byte;
  737. __le16 rqe_count;
  738. __le16 hdr_buffer_size;
  739. __le16 payload_buffer_size;
  740. __le16 base_cq_id;
  741. __le16 rsvd26;
  742. __le32 rsvd42;
  743. struct sli4_dmaaddr page_phys_addr[];
  744. };
  745. struct sli4_rsp_rq_create_v2 {
  746. struct sli4_rsp_cmn_create_queue rsp;
  747. };
  748. #define SLI4_CQE_CODE_OFFSET 14
  749. enum sli4_cqe_code {
  750. SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
  751. SLI4_CQE_CODE_RELEASE_WQE,
  752. SLI4_CQE_CODE_RSVD,
  753. SLI4_CQE_CODE_RQ_ASYNC,
  754. SLI4_CQE_CODE_XRI_ABORTED,
  755. SLI4_CQE_CODE_RQ_COALESCING,
  756. SLI4_CQE_CODE_RQ_CONSUMPTION,
  757. SLI4_CQE_CODE_MEASUREMENT_REPORTING,
  758. SLI4_CQE_CODE_RQ_ASYNC_V1,
  759. SLI4_CQE_CODE_RQ_COALESCING_V1,
  760. SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
  761. SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
  762. };
  763. #define SLI4_WQ_CREATE_MAX_PAGES 8
  764. struct sli4_rqst_wq_create {
  765. struct sli4_rqst_hdr hdr;
  766. __le16 num_pages;
  767. __le16 cq_id;
  768. u8 page_size;
  769. u8 wqe_size_byte;
  770. __le16 wqe_count;
  771. __le32 rsvd;
  772. struct sli4_dmaaddr page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
  773. };
  774. struct sli4_rsp_wq_create {
  775. struct sli4_rsp_cmn_create_queue rsp;
  776. };
  777. enum sli4_link_attention_flags {
  778. SLI4_LNK_ATTN_TYPE_LINK_UP = 0x01,
  779. SLI4_LNK_ATTN_TYPE_LINK_DOWN = 0x02,
  780. SLI4_LNK_ATTN_TYPE_NO_HARD_ALPA = 0x03,
  781. SLI4_LNK_ATTN_P2P = 0x01,
  782. SLI4_LNK_ATTN_FC_AL = 0x02,
  783. SLI4_LNK_ATTN_INTERNAL_LOOPBACK = 0x03,
  784. SLI4_LNK_ATTN_SERDES_LOOPBACK = 0x04,
  785. };
  786. struct sli4_link_attention {
  787. u8 link_number;
  788. u8 attn_type;
  789. u8 topology;
  790. u8 port_speed;
  791. u8 port_fault;
  792. u8 shared_link_status;
  793. __le16 logical_link_speed;
  794. __le32 event_tag;
  795. u8 rsvd12;
  796. u8 event_code;
  797. u8 event_type;
  798. u8 flags;
  799. };
  800. enum sli4_link_event_type {
  801. SLI4_EVENT_LINK_ATTENTION = 0x01,
  802. SLI4_EVENT_SHARED_LINK_ATTENTION = 0x02,
  803. };
  804. enum sli4_wcqe_flags {
  805. SLI4_WCQE_XB = 0x10,
  806. SLI4_WCQE_QX = 0x80,
  807. };
  808. struct sli4_fc_wcqe {
  809. u8 hw_status;
  810. u8 status;
  811. __le16 request_tag;
  812. __le32 wqe_specific_1;
  813. __le32 wqe_specific_2;
  814. u8 rsvd12;
  815. u8 qx_byte;
  816. u8 code;
  817. u8 flags;
  818. };
  819. /* FC WQ consumed CQ queue entry */
  820. struct sli4_fc_wqec {
  821. __le32 rsvd0;
  822. __le32 rsvd1;
  823. __le16 wqe_index;
  824. __le16 wq_id;
  825. __le16 rsvd12;
  826. u8 code;
  827. u8 vld_byte;
  828. };
  829. /* FC Completion Status Codes. */
  830. enum sli4_wcqe_status {
  831. SLI4_FC_WCQE_STATUS_SUCCESS,
  832. SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
  833. SLI4_FC_WCQE_STATUS_REMOTE_STOP,
  834. SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
  835. SLI4_FC_WCQE_STATUS_NPORT_RJT,
  836. SLI4_FC_WCQE_STATUS_FABRIC_RJT,
  837. SLI4_FC_WCQE_STATUS_NPORT_BSY,
  838. SLI4_FC_WCQE_STATUS_FABRIC_BSY,
  839. SLI4_FC_WCQE_STATUS_RSVD,
  840. SLI4_FC_WCQE_STATUS_LS_RJT,
  841. SLI4_FC_WCQE_STATUS_RX_BUF_OVERRUN,
  842. SLI4_FC_WCQE_STATUS_CMD_REJECT,
  843. SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK,
  844. SLI4_FC_WCQE_STATUS_RSVD1,
  845. SLI4_FC_WCQE_STATUS_ELS_CMPLT_NO_AUTOREG,
  846. SLI4_FC_WCQE_STATUS_RSVD2,
  847. SLI4_FC_WCQE_STATUS_RQ_SUCCESS,
  848. SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED,
  849. SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED,
  850. SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC,
  851. SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE,
  852. SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE,
  853. SLI4_FC_WCQE_STATUS_DI_ERROR,
  854. SLI4_FC_WCQE_STATUS_BA_RJT,
  855. SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED,
  856. SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC,
  857. SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT,
  858. SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST,
  859. /* driver generated status codes */
  860. SLI4_FC_WCQE_STATUS_DISPATCH_ERROR = 0xfd,
  861. SLI4_FC_WCQE_STATUS_SHUTDOWN = 0xfe,
  862. SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT = 0xff,
  863. };
  864. /* DI_ERROR Extended Status */
  865. enum sli4_fc_di_error_status {
  866. SLI4_FC_DI_ERROR_GE = 1 << 0,
  867. SLI4_FC_DI_ERROR_AE = 1 << 1,
  868. SLI4_FC_DI_ERROR_RE = 1 << 2,
  869. SLI4_FC_DI_ERROR_TDPV = 1 << 3,
  870. SLI4_FC_DI_ERROR_UDB = 1 << 4,
  871. SLI4_FC_DI_ERROR_EDIR = 1 << 5,
  872. };
  873. /* WQE DIF field contents */
  874. enum sli4_dif_fields {
  875. SLI4_DIF_DISABLED,
  876. SLI4_DIF_PASS_THROUGH,
  877. SLI4_DIF_STRIP,
  878. SLI4_DIF_INSERT,
  879. };
  880. /* Work Queue Entry (WQE) types */
  881. enum sli4_wqe_types {
  882. SLI4_WQE_ABORT = 0x0f,
  883. SLI4_WQE_ELS_REQUEST64 = 0x8a,
  884. SLI4_WQE_FCP_IBIDIR64 = 0xac,
  885. SLI4_WQE_FCP_IREAD64 = 0x9a,
  886. SLI4_WQE_FCP_IWRITE64 = 0x98,
  887. SLI4_WQE_FCP_ICMND64 = 0x9c,
  888. SLI4_WQE_FCP_TRECEIVE64 = 0xa1,
  889. SLI4_WQE_FCP_CONT_TRECEIVE64 = 0xe5,
  890. SLI4_WQE_FCP_TRSP64 = 0xa3,
  891. SLI4_WQE_FCP_TSEND64 = 0x9f,
  892. SLI4_WQE_GEN_REQUEST64 = 0xc2,
  893. SLI4_WQE_SEND_FRAME = 0xe1,
  894. SLI4_WQE_XMIT_BCAST64 = 0x84,
  895. SLI4_WQE_XMIT_BLS_RSP = 0x97,
  896. SLI4_WQE_ELS_RSP64 = 0x95,
  897. SLI4_WQE_XMIT_SEQUENCE64 = 0x82,
  898. SLI4_WQE_REQUEUE_XRI = 0x93,
  899. };
  900. /* WQE command types */
  901. enum sli4_wqe_cmds {
  902. SLI4_CMD_FCP_IREAD64_WQE = 0x00,
  903. SLI4_CMD_FCP_ICMND64_WQE = 0x00,
  904. SLI4_CMD_FCP_IWRITE64_WQE = 0x01,
  905. SLI4_CMD_FCP_TRECEIVE64_WQE = 0x02,
  906. SLI4_CMD_FCP_TRSP64_WQE = 0x03,
  907. SLI4_CMD_FCP_TSEND64_WQE = 0x07,
  908. SLI4_CMD_GEN_REQUEST64_WQE = 0x08,
  909. SLI4_CMD_XMIT_BCAST64_WQE = 0x08,
  910. SLI4_CMD_XMIT_BLS_RSP64_WQE = 0x08,
  911. SLI4_CMD_ABORT_WQE = 0x08,
  912. SLI4_CMD_XMIT_SEQUENCE64_WQE = 0x08,
  913. SLI4_CMD_REQUEUE_XRI_WQE = 0x0a,
  914. SLI4_CMD_SEND_FRAME_WQE = 0x0a,
  915. };
  916. #define SLI4_WQE_SIZE 0x05
  917. #define SLI4_WQE_EXT_SIZE 0x06
  918. #define SLI4_WQE_BYTES (16 * sizeof(u32))
  919. #define SLI4_WQE_EXT_BYTES (32 * sizeof(u32))
  920. /* Mask for ccp (CS_CTL) */
  921. #define SLI4_MASK_CCP 0xfe
  922. /* Generic WQE */
  923. enum sli4_gen_wqe_flags {
  924. SLI4_GEN_WQE_EBDECNT = 0xf,
  925. SLI4_GEN_WQE_LEN_LOC = 0x3 << 7,
  926. SLI4_GEN_WQE_QOSD = 1 << 9,
  927. SLI4_GEN_WQE_XBL = 1 << 11,
  928. SLI4_GEN_WQE_HLM = 1 << 12,
  929. SLI4_GEN_WQE_IOD = 1 << 13,
  930. SLI4_GEN_WQE_DBDE = 1 << 14,
  931. SLI4_GEN_WQE_WQES = 1 << 15,
  932. SLI4_GEN_WQE_PRI = 0x7,
  933. SLI4_GEN_WQE_PV = 1 << 3,
  934. SLI4_GEN_WQE_EAT = 1 << 4,
  935. SLI4_GEN_WQE_XC = 1 << 5,
  936. SLI4_GEN_WQE_CCPE = 1 << 7,
  937. SLI4_GEN_WQE_CMDTYPE = 0xf,
  938. SLI4_GEN_WQE_WQEC = 1 << 7,
  939. };
  940. struct sli4_generic_wqe {
  941. __le32 cmd_spec0_5[6];
  942. __le16 xri_tag;
  943. __le16 context_tag;
  944. u8 ct_byte;
  945. u8 command;
  946. u8 class_byte;
  947. u8 timer;
  948. __le32 abort_tag;
  949. __le16 request_tag;
  950. __le16 rsvd34;
  951. __le16 dw10w0_flags;
  952. u8 eat_xc_ccpe;
  953. u8 ccp;
  954. u8 cmdtype_wqec_byte;
  955. u8 rsvd41;
  956. __le16 cq_id;
  957. };
  958. /* WQE used to abort exchanges. */
  959. enum sli4_abort_wqe_flags {
  960. SLI4_ABRT_WQE_IR = 0x02,
  961. SLI4_ABRT_WQE_EBDECNT = 0xf,
  962. SLI4_ABRT_WQE_LEN_LOC = 0x3 << 7,
  963. SLI4_ABRT_WQE_QOSD = 1 << 9,
  964. SLI4_ABRT_WQE_XBL = 1 << 11,
  965. SLI4_ABRT_WQE_IOD = 1 << 13,
  966. SLI4_ABRT_WQE_DBDE = 1 << 14,
  967. SLI4_ABRT_WQE_WQES = 1 << 15,
  968. SLI4_ABRT_WQE_PRI = 0x7,
  969. SLI4_ABRT_WQE_PV = 1 << 3,
  970. SLI4_ABRT_WQE_EAT = 1 << 4,
  971. SLI4_ABRT_WQE_XC = 1 << 5,
  972. SLI4_ABRT_WQE_CCPE = 1 << 7,
  973. SLI4_ABRT_WQE_CMDTYPE = 0xf,
  974. SLI4_ABRT_WQE_WQEC = 1 << 7,
  975. };
  976. struct sli4_abort_wqe {
  977. __le32 rsvd0;
  978. __le32 rsvd4;
  979. __le32 ext_t_tag;
  980. u8 ia_ir_byte;
  981. u8 criteria;
  982. __le16 rsvd10;
  983. __le32 ext_t_mask;
  984. __le32 t_mask;
  985. __le16 xri_tag;
  986. __le16 context_tag;
  987. u8 ct_byte;
  988. u8 command;
  989. u8 class_byte;
  990. u8 timer;
  991. __le32 t_tag;
  992. __le16 request_tag;
  993. __le16 rsvd34;
  994. __le16 dw10w0_flags;
  995. u8 eat_xc_ccpe;
  996. u8 ccp;
  997. u8 cmdtype_wqec_byte;
  998. u8 rsvd41;
  999. __le16 cq_id;
  1000. };
  1001. enum sli4_abort_criteria {
  1002. SLI4_ABORT_CRITERIA_XRI_TAG = 0x01,
  1003. SLI4_ABORT_CRITERIA_ABORT_TAG,
  1004. SLI4_ABORT_CRITERIA_REQUEST_TAG,
  1005. SLI4_ABORT_CRITERIA_EXT_ABORT_TAG,
  1006. };
  1007. enum sli4_abort_type {
  1008. SLI4_ABORT_XRI,
  1009. SLI4_ABORT_ABORT_ID,
  1010. SLI4_ABORT_REQUEST_ID,
  1011. SLI4_ABORT_MAX, /* must be last */
  1012. };
  1013. /* WQE used to create an ELS request. */
  1014. enum sli4_els_req_wqe_flags {
  1015. SLI4_REQ_WQE_QOSD = 0x2,
  1016. SLI4_REQ_WQE_DBDE = 0x40,
  1017. SLI4_REQ_WQE_XBL = 0x8,
  1018. SLI4_REQ_WQE_XC = 0x20,
  1019. SLI4_REQ_WQE_IOD = 0x20,
  1020. SLI4_REQ_WQE_HLM = 0x10,
  1021. SLI4_REQ_WQE_CCPE = 0x80,
  1022. SLI4_REQ_WQE_EAT = 0x10,
  1023. SLI4_REQ_WQE_WQES = 0x80,
  1024. SLI4_REQ_WQE_PU_SHFT = 4,
  1025. SLI4_REQ_WQE_CT_SHFT = 2,
  1026. SLI4_REQ_WQE_CT = 0xc,
  1027. SLI4_REQ_WQE_ELSID_SHFT = 4,
  1028. SLI4_REQ_WQE_SP_SHFT = 24,
  1029. SLI4_REQ_WQE_LEN_LOC_BIT1 = 0x80,
  1030. SLI4_REQ_WQE_LEN_LOC_BIT2 = 0x1,
  1031. };
  1032. struct sli4_els_request64_wqe {
  1033. struct sli4_bde els_request_payload;
  1034. __le32 els_request_payload_length;
  1035. __le32 sid_sp_dword;
  1036. __le32 remote_id_dword;
  1037. __le16 xri_tag;
  1038. __le16 context_tag;
  1039. u8 ct_byte;
  1040. u8 command;
  1041. u8 class_byte;
  1042. u8 timer;
  1043. __le32 abort_tag;
  1044. __le16 request_tag;
  1045. __le16 temporary_rpi;
  1046. u8 len_loc1_byte;
  1047. u8 qosd_xbl_hlm_iod_dbde_wqes;
  1048. u8 eat_xc_ccpe;
  1049. u8 ccp;
  1050. u8 cmdtype_elsid_byte;
  1051. u8 rsvd41;
  1052. __le16 cq_id;
  1053. struct sli4_bde els_response_payload_bde;
  1054. __le32 max_response_payload_length;
  1055. };
  1056. /* WQE used to create an FCP initiator no data command. */
  1057. enum sli4_icmd_wqe_flags {
  1058. SLI4_ICMD_WQE_DBDE = 0x40,
  1059. SLI4_ICMD_WQE_XBL = 0x8,
  1060. SLI4_ICMD_WQE_XC = 0x20,
  1061. SLI4_ICMD_WQE_IOD = 0x20,
  1062. SLI4_ICMD_WQE_HLM = 0x10,
  1063. SLI4_ICMD_WQE_CCPE = 0x80,
  1064. SLI4_ICMD_WQE_EAT = 0x10,
  1065. SLI4_ICMD_WQE_APPID = 0x10,
  1066. SLI4_ICMD_WQE_WQES = 0x80,
  1067. SLI4_ICMD_WQE_PU_SHFT = 4,
  1068. SLI4_ICMD_WQE_CT_SHFT = 2,
  1069. SLI4_ICMD_WQE_BS_SHFT = 4,
  1070. SLI4_ICMD_WQE_LEN_LOC_BIT1 = 0x80,
  1071. SLI4_ICMD_WQE_LEN_LOC_BIT2 = 0x1,
  1072. };
  1073. struct sli4_fcp_icmnd64_wqe {
  1074. struct sli4_bde bde;
  1075. __le16 payload_offset_length;
  1076. __le16 fcp_cmd_buffer_length;
  1077. __le32 rsvd12;
  1078. __le32 remote_n_port_id_dword;
  1079. __le16 xri_tag;
  1080. __le16 context_tag;
  1081. u8 dif_ct_bs_byte;
  1082. u8 command;
  1083. u8 class_pu_byte;
  1084. u8 timer;
  1085. __le32 abort_tag;
  1086. __le16 request_tag;
  1087. __le16 rsvd34;
  1088. u8 len_loc1_byte;
  1089. u8 qosd_xbl_hlm_iod_dbde_wqes;
  1090. u8 eat_xc_ccpe;
  1091. u8 ccp;
  1092. u8 cmd_type_byte;
  1093. u8 rsvd41;
  1094. __le16 cq_id;
  1095. __le32 rsvd44;
  1096. __le32 rsvd48;
  1097. __le32 rsvd52;
  1098. __le32 rsvd56;
  1099. };
  1100. /* WQE used to create an FCP initiator read. */
  1101. enum sli4_ir_wqe_flags {
  1102. SLI4_IR_WQE_DBDE = 0x40,
  1103. SLI4_IR_WQE_XBL = 0x8,
  1104. SLI4_IR_WQE_XC = 0x20,
  1105. SLI4_IR_WQE_IOD = 0x20,
  1106. SLI4_IR_WQE_HLM = 0x10,
  1107. SLI4_IR_WQE_CCPE = 0x80,
  1108. SLI4_IR_WQE_EAT = 0x10,
  1109. SLI4_IR_WQE_APPID = 0x10,
  1110. SLI4_IR_WQE_WQES = 0x80,
  1111. SLI4_IR_WQE_PU_SHFT = 4,
  1112. SLI4_IR_WQE_CT_SHFT = 2,
  1113. SLI4_IR_WQE_BS_SHFT = 4,
  1114. SLI4_IR_WQE_LEN_LOC_BIT1 = 0x80,
  1115. SLI4_IR_WQE_LEN_LOC_BIT2 = 0x1,
  1116. };
  1117. struct sli4_fcp_iread64_wqe {
  1118. struct sli4_bde bde;
  1119. __le16 payload_offset_length;
  1120. __le16 fcp_cmd_buffer_length;
  1121. __le32 total_transfer_length;
  1122. __le32 remote_n_port_id_dword;
  1123. __le16 xri_tag;
  1124. __le16 context_tag;
  1125. u8 dif_ct_bs_byte;
  1126. u8 command;
  1127. u8 class_pu_byte;
  1128. u8 timer;
  1129. __le32 abort_tag;
  1130. __le16 request_tag;
  1131. __le16 rsvd34;
  1132. u8 len_loc1_byte;
  1133. u8 qosd_xbl_hlm_iod_dbde_wqes;
  1134. u8 eat_xc_ccpe;
  1135. u8 ccp;
  1136. u8 cmd_type_byte;
  1137. u8 rsvd41;
  1138. __le16 cq_id;
  1139. __le32 rsvd44;
  1140. struct sli4_bde first_data_bde;
  1141. };
  1142. /* WQE used to create an FCP initiator write. */
  1143. enum sli4_iwr_wqe_flags {
  1144. SLI4_IWR_WQE_DBDE = 0x40,
  1145. SLI4_IWR_WQE_XBL = 0x8,
  1146. SLI4_IWR_WQE_XC = 0x20,
  1147. SLI4_IWR_WQE_IOD = 0x20,
  1148. SLI4_IWR_WQE_HLM = 0x10,
  1149. SLI4_IWR_WQE_DNRX = 0x10,
  1150. SLI4_IWR_WQE_CCPE = 0x80,
  1151. SLI4_IWR_WQE_EAT = 0x10,
  1152. SLI4_IWR_WQE_APPID = 0x10,
  1153. SLI4_IWR_WQE_WQES = 0x80,
  1154. SLI4_IWR_WQE_PU_SHFT = 4,
  1155. SLI4_IWR_WQE_CT_SHFT = 2,
  1156. SLI4_IWR_WQE_BS_SHFT = 4,
  1157. SLI4_IWR_WQE_LEN_LOC_BIT1 = 0x80,
  1158. SLI4_IWR_WQE_LEN_LOC_BIT2 = 0x1,
  1159. };
  1160. struct sli4_fcp_iwrite64_wqe {
  1161. struct sli4_bde bde;
  1162. __le16 payload_offset_length;
  1163. __le16 fcp_cmd_buffer_length;
  1164. __le16 total_transfer_length;
  1165. __le16 initial_transfer_length;
  1166. __le16 xri_tag;
  1167. __le16 context_tag;
  1168. u8 dif_ct_bs_byte;
  1169. u8 command;
  1170. u8 class_pu_byte;
  1171. u8 timer;
  1172. __le32 abort_tag;
  1173. __le16 request_tag;
  1174. __le16 rsvd34;
  1175. u8 len_loc1_byte;
  1176. u8 qosd_xbl_hlm_iod_dbde_wqes;
  1177. u8 eat_xc_ccpe;
  1178. u8 ccp;
  1179. u8 cmd_type_byte;
  1180. u8 rsvd41;
  1181. __le16 cq_id;
  1182. __le32 remote_n_port_id_dword;
  1183. struct sli4_bde first_data_bde;
  1184. };
  1185. struct sli4_fcp_128byte_wqe {
  1186. u32 dw[32];
  1187. };
  1188. /* WQE used to create an FCP target receive */
  1189. enum sli4_trcv_wqe_flags {
  1190. SLI4_TRCV_WQE_DBDE = 0x40,
  1191. SLI4_TRCV_WQE_XBL = 0x8,
  1192. SLI4_TRCV_WQE_AR = 0x8,
  1193. SLI4_TRCV_WQE_XC = 0x20,
  1194. SLI4_TRCV_WQE_IOD = 0x20,
  1195. SLI4_TRCV_WQE_HLM = 0x10,
  1196. SLI4_TRCV_WQE_DNRX = 0x10,
  1197. SLI4_TRCV_WQE_CCPE = 0x80,
  1198. SLI4_TRCV_WQE_EAT = 0x10,
  1199. SLI4_TRCV_WQE_APPID = 0x10,
  1200. SLI4_TRCV_WQE_WQES = 0x80,
  1201. SLI4_TRCV_WQE_PU_SHFT = 4,
  1202. SLI4_TRCV_WQE_CT_SHFT = 2,
  1203. SLI4_TRCV_WQE_BS_SHFT = 4,
  1204. SLI4_TRCV_WQE_LEN_LOC_BIT2 = 0x1,
  1205. };
  1206. struct sli4_fcp_treceive64_wqe {
  1207. struct sli4_bde bde;
  1208. __le32 payload_offset_length;
  1209. __le32 relative_offset;
  1210. union {
  1211. __le16 sec_xri_tag;
  1212. __le16 rsvd;
  1213. __le32 dword;
  1214. } dword5;
  1215. __le16 xri_tag;
  1216. __le16 context_tag;
  1217. u8 dif_ct_bs_byte;
  1218. u8 command;
  1219. u8 class_ar_pu_byte;
  1220. u8 timer;
  1221. __le32 abort_tag;
  1222. __le16 request_tag;
  1223. __le16 remote_xid;
  1224. u8 lloc1_appid;
  1225. u8 qosd_xbl_hlm_iod_dbde_wqes;
  1226. u8 eat_xc_ccpe;
  1227. u8 ccp;
  1228. u8 cmd_type_byte;
  1229. u8 rsvd41;
  1230. __le16 cq_id;
  1231. __le32 fcp_data_receive_length;
  1232. struct sli4_bde first_data_bde;
  1233. };
  1234. /* WQE used to create an FCP target response */
  1235. enum sli4_trsp_wqe_flags {
  1236. SLI4_TRSP_WQE_AG = 0x8,
  1237. SLI4_TRSP_WQE_DBDE = 0x40,
  1238. SLI4_TRSP_WQE_XBL = 0x8,
  1239. SLI4_TRSP_WQE_XC = 0x20,
  1240. SLI4_TRSP_WQE_HLM = 0x10,
  1241. SLI4_TRSP_WQE_DNRX = 0x10,
  1242. SLI4_TRSP_WQE_CCPE = 0x80,
  1243. SLI4_TRSP_WQE_EAT = 0x10,
  1244. SLI4_TRSP_WQE_APPID = 0x10,
  1245. SLI4_TRSP_WQE_WQES = 0x80,
  1246. };
  1247. struct sli4_fcp_trsp64_wqe {
  1248. struct sli4_bde bde;
  1249. __le32 fcp_response_length;
  1250. __le32 rsvd12;
  1251. __le32 dword5;
  1252. __le16 xri_tag;
  1253. __le16 rpi;
  1254. u8 ct_dnrx_byte;
  1255. u8 command;
  1256. u8 class_ag_byte;
  1257. u8 timer;
  1258. __le32 abort_tag;
  1259. __le16 request_tag;
  1260. __le16 remote_xid;
  1261. u8 lloc1_appid;
  1262. u8 qosd_xbl_hlm_dbde_wqes;
  1263. u8 eat_xc_ccpe;
  1264. u8 ccp;
  1265. u8 cmd_type_byte;
  1266. u8 rsvd41;
  1267. __le16 cq_id;
  1268. __le32 rsvd44;
  1269. __le32 rsvd48;
  1270. __le32 rsvd52;
  1271. __le32 rsvd56;
  1272. };
  1273. /* WQE used to create an FCP target send (DATA IN). */
  1274. enum sli4_tsend_wqe_flags {
  1275. SLI4_TSEND_WQE_XBL = 0x8,
  1276. SLI4_TSEND_WQE_DBDE = 0x40,
  1277. SLI4_TSEND_WQE_IOD = 0x20,
  1278. SLI4_TSEND_WQE_QOSD = 0x2,
  1279. SLI4_TSEND_WQE_HLM = 0x10,
  1280. SLI4_TSEND_WQE_PU_SHFT = 4,
  1281. SLI4_TSEND_WQE_AR = 0x8,
  1282. SLI4_TSEND_CT_SHFT = 2,
  1283. SLI4_TSEND_BS_SHFT = 4,
  1284. SLI4_TSEND_LEN_LOC_BIT2 = 0x1,
  1285. SLI4_TSEND_CCPE = 0x80,
  1286. SLI4_TSEND_APPID_VALID = 0x20,
  1287. SLI4_TSEND_WQES = 0x80,
  1288. SLI4_TSEND_XC = 0x20,
  1289. SLI4_TSEND_EAT = 0x10,
  1290. };
  1291. struct sli4_fcp_tsend64_wqe {
  1292. struct sli4_bde bde;
  1293. __le32 payload_offset_length;
  1294. __le32 relative_offset;
  1295. __le32 dword5;
  1296. __le16 xri_tag;
  1297. __le16 rpi;
  1298. u8 ct_byte;
  1299. u8 command;
  1300. u8 class_pu_ar_byte;
  1301. u8 timer;
  1302. __le32 abort_tag;
  1303. __le16 request_tag;
  1304. __le16 remote_xid;
  1305. u8 dw10byte0;
  1306. u8 ll_qd_xbl_hlm_iod_dbde;
  1307. u8 dw10byte2;
  1308. u8 ccp;
  1309. u8 cmd_type_byte;
  1310. u8 rsvd45;
  1311. __le16 cq_id;
  1312. __le32 fcp_data_transmit_length;
  1313. struct sli4_bde first_data_bde;
  1314. };
  1315. /* WQE used to create a general request. */
  1316. enum sli4_gen_req_wqe_flags {
  1317. SLI4_GEN_REQ64_WQE_XBL = 0x8,
  1318. SLI4_GEN_REQ64_WQE_DBDE = 0x40,
  1319. SLI4_GEN_REQ64_WQE_IOD = 0x20,
  1320. SLI4_GEN_REQ64_WQE_QOSD = 0x2,
  1321. SLI4_GEN_REQ64_WQE_HLM = 0x10,
  1322. SLI4_GEN_REQ64_CT_SHFT = 2,
  1323. };
  1324. struct sli4_gen_request64_wqe {
  1325. struct sli4_bde bde;
  1326. __le32 request_payload_length;
  1327. __le32 relative_offset;
  1328. u8 rsvd17;
  1329. u8 df_ctl;
  1330. u8 type;
  1331. u8 r_ctl;
  1332. __le16 xri_tag;
  1333. __le16 context_tag;
  1334. u8 ct_byte;
  1335. u8 command;
  1336. u8 class_byte;
  1337. u8 timer;
  1338. __le32 abort_tag;
  1339. __le16 request_tag;
  1340. __le16 rsvd34;
  1341. u8 dw10flags0;
  1342. u8 dw10flags1;
  1343. u8 dw10flags2;
  1344. u8 ccp;
  1345. u8 cmd_type_byte;
  1346. u8 rsvd41;
  1347. __le16 cq_id;
  1348. __le32 remote_n_port_id_dword;
  1349. __le32 rsvd48;
  1350. __le32 rsvd52;
  1351. __le32 max_response_payload_length;
  1352. };
  1353. /* WQE used to create a send frame request */
  1354. enum sli4_sf_wqe_flags {
  1355. SLI4_SF_WQE_DBDE = 0x40,
  1356. SLI4_SF_PU = 0x30,
  1357. SLI4_SF_CT = 0xc,
  1358. SLI4_SF_QOSD = 0x2,
  1359. SLI4_SF_LEN_LOC_BIT1 = 0x80,
  1360. SLI4_SF_LEN_LOC_BIT2 = 0x1,
  1361. SLI4_SF_XC = 0x20,
  1362. SLI4_SF_XBL = 0x8,
  1363. };
  1364. struct sli4_send_frame_wqe {
  1365. struct sli4_bde bde;
  1366. __le32 frame_length;
  1367. __le32 fc_header_0_1[2];
  1368. __le16 xri_tag;
  1369. __le16 context_tag;
  1370. u8 ct_byte;
  1371. u8 command;
  1372. u8 dw7flags0;
  1373. u8 timer;
  1374. __le32 abort_tag;
  1375. __le16 request_tag;
  1376. u8 eof;
  1377. u8 sof;
  1378. u8 dw10flags0;
  1379. u8 dw10flags1;
  1380. u8 dw10flags2;
  1381. u8 ccp;
  1382. u8 cmd_type_byte;
  1383. u8 rsvd41;
  1384. __le16 cq_id;
  1385. __le32 fc_header_2_5[4];
  1386. };
  1387. /* WQE used to create a transmit sequence */
  1388. enum sli4_seq_wqe_flags {
  1389. SLI4_SEQ_WQE_DBDE = 0x4000,
  1390. SLI4_SEQ_WQE_XBL = 0x800,
  1391. SLI4_SEQ_WQE_SI = 0x4,
  1392. SLI4_SEQ_WQE_FT = 0x8,
  1393. SLI4_SEQ_WQE_XO = 0x40,
  1394. SLI4_SEQ_WQE_LS = 0x80,
  1395. SLI4_SEQ_WQE_DIF = 0x3,
  1396. SLI4_SEQ_WQE_BS = 0x70,
  1397. SLI4_SEQ_WQE_PU = 0x30,
  1398. SLI4_SEQ_WQE_HLM = 0x1000,
  1399. SLI4_SEQ_WQE_IOD_SHIFT = 13,
  1400. SLI4_SEQ_WQE_CT_SHIFT = 2,
  1401. SLI4_SEQ_WQE_LEN_LOC_SHIFT = 7,
  1402. };
  1403. struct sli4_xmit_sequence64_wqe {
  1404. struct sli4_bde bde;
  1405. __le32 remote_n_port_id_dword;
  1406. __le32 relative_offset;
  1407. u8 dw5flags0;
  1408. u8 df_ctl;
  1409. u8 type;
  1410. u8 r_ctl;
  1411. __le16 xri_tag;
  1412. __le16 context_tag;
  1413. u8 dw7flags0;
  1414. u8 command;
  1415. u8 dw7flags1;
  1416. u8 timer;
  1417. __le32 abort_tag;
  1418. __le16 request_tag;
  1419. __le16 remote_xid;
  1420. __le16 dw10w0;
  1421. u8 dw10flags0;
  1422. u8 ccp;
  1423. u8 cmd_type_wqec_byte;
  1424. u8 rsvd45;
  1425. __le16 cq_id;
  1426. __le32 sequence_payload_len;
  1427. __le32 rsvd48;
  1428. __le32 rsvd52;
  1429. __le32 rsvd56;
  1430. };
  1431. /*
  1432. * WQE used unblock the specified XRI and to release
  1433. * it to the SLI Port's free pool.
  1434. */
  1435. enum sli4_requeue_wqe_flags {
  1436. SLI4_REQU_XRI_WQE_XC = 0x20,
  1437. SLI4_REQU_XRI_WQE_QOSD = 0x2,
  1438. };
  1439. struct sli4_requeue_xri_wqe {
  1440. __le32 rsvd0;
  1441. __le32 rsvd4;
  1442. __le32 rsvd8;
  1443. __le32 rsvd12;
  1444. __le32 rsvd16;
  1445. __le32 rsvd20;
  1446. __le16 xri_tag;
  1447. __le16 context_tag;
  1448. u8 ct_byte;
  1449. u8 command;
  1450. u8 class_byte;
  1451. u8 timer;
  1452. __le32 rsvd32;
  1453. __le16 request_tag;
  1454. __le16 rsvd34;
  1455. __le16 flags0;
  1456. __le16 flags1;
  1457. __le16 flags2;
  1458. u8 ccp;
  1459. u8 cmd_type_wqec_byte;
  1460. u8 rsvd42;
  1461. __le16 cq_id;
  1462. __le32 rsvd44;
  1463. __le32 rsvd48;
  1464. __le32 rsvd52;
  1465. __le32 rsvd56;
  1466. };
  1467. /* WQE used to create a BLS response */
  1468. enum sli4_bls_rsp_wqe_flags {
  1469. SLI4_BLS_RSP_RID = 0xffffff,
  1470. SLI4_BLS_RSP_WQE_AR = 0x40000000,
  1471. SLI4_BLS_RSP_WQE_CT_SHFT = 2,
  1472. SLI4_BLS_RSP_WQE_QOSD = 0x2,
  1473. SLI4_BLS_RSP_WQE_HLM = 0x10,
  1474. };
  1475. struct sli4_xmit_bls_rsp_wqe {
  1476. __le32 payload_word0;
  1477. __le16 rx_id;
  1478. __le16 ox_id;
  1479. __le16 high_seq_cnt;
  1480. __le16 low_seq_cnt;
  1481. __le32 rsvd12;
  1482. __le32 local_n_port_id_dword;
  1483. __le32 remote_id_dword;
  1484. __le16 xri_tag;
  1485. __le16 context_tag;
  1486. u8 dw8flags0;
  1487. u8 command;
  1488. u8 dw8flags1;
  1489. u8 timer;
  1490. __le32 abort_tag;
  1491. __le16 request_tag;
  1492. __le16 rsvd38;
  1493. u8 dw11flags0;
  1494. u8 dw11flags1;
  1495. u8 dw11flags2;
  1496. u8 ccp;
  1497. u8 dw12flags0;
  1498. u8 rsvd45;
  1499. __le16 cq_id;
  1500. __le16 temporary_rpi;
  1501. u8 rsvd50;
  1502. u8 rsvd51;
  1503. __le32 rsvd52;
  1504. __le32 rsvd56;
  1505. __le32 rsvd60;
  1506. };
  1507. enum sli_bls_type {
  1508. SLI4_SLI_BLS_ACC,
  1509. SLI4_SLI_BLS_RJT,
  1510. SLI4_SLI_BLS_MAX
  1511. };
  1512. struct sli_bls_payload {
  1513. enum sli_bls_type type;
  1514. __le16 ox_id;
  1515. __le16 rx_id;
  1516. union {
  1517. struct {
  1518. u8 seq_id_validity;
  1519. u8 seq_id_last;
  1520. u8 rsvd2;
  1521. u8 rsvd3;
  1522. u16 ox_id;
  1523. u16 rx_id;
  1524. __le16 low_seq_cnt;
  1525. __le16 high_seq_cnt;
  1526. } acc;
  1527. struct {
  1528. u8 vendor_unique;
  1529. u8 reason_explanation;
  1530. u8 reason_code;
  1531. u8 rsvd3;
  1532. } rjt;
  1533. } u;
  1534. };
  1535. /* WQE used to create an ELS response */
  1536. enum sli4_els_rsp_flags {
  1537. SLI4_ELS_SID = 0xffffff,
  1538. SLI4_ELS_RID = 0xffffff,
  1539. SLI4_ELS_DBDE = 0x40,
  1540. SLI4_ELS_XBL = 0x8,
  1541. SLI4_ELS_IOD = 0x20,
  1542. SLI4_ELS_QOSD = 0x2,
  1543. SLI4_ELS_XC = 0x20,
  1544. SLI4_ELS_CT_OFFSET = 0X2,
  1545. SLI4_ELS_SP = 0X1000000,
  1546. SLI4_ELS_HLM = 0X10,
  1547. };
  1548. struct sli4_xmit_els_rsp64_wqe {
  1549. struct sli4_bde els_response_payload;
  1550. __le32 els_response_payload_length;
  1551. __le32 sid_dw;
  1552. __le32 rid_dw;
  1553. __le16 xri_tag;
  1554. __le16 context_tag;
  1555. u8 ct_byte;
  1556. u8 command;
  1557. u8 class_byte;
  1558. u8 timer;
  1559. __le32 abort_tag;
  1560. __le16 request_tag;
  1561. __le16 ox_id;
  1562. u8 flags1;
  1563. u8 flags2;
  1564. u8 flags3;
  1565. u8 flags4;
  1566. u8 cmd_type_wqec;
  1567. u8 rsvd34;
  1568. __le16 cq_id;
  1569. __le16 temporary_rpi;
  1570. __le16 rsvd38;
  1571. u32 rsvd40;
  1572. u32 rsvd44;
  1573. u32 rsvd48;
  1574. };
  1575. /* Local Reject Reason Codes */
  1576. enum sli4_fc_local_rej_codes {
  1577. SLI4_FC_LOCAL_REJECT_UNKNOWN,
  1578. SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE,
  1579. SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT,
  1580. SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR,
  1581. SLI4_FC_LOCAL_REJECT_INVALID_RPI,
  1582. SLI4_FC_LOCAL_REJECT_NO_XRI,
  1583. SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND,
  1584. SLI4_FC_LOCAL_REJECT_XCHG_DROPPED,
  1585. SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD,
  1586. SLI4_FC_LOCAL_REJECT_RPI_SUSPENDED,
  1587. SLI4_FC_LOCAL_REJECT_RSVD,
  1588. SLI4_FC_LOCAL_REJECT_RSVD1,
  1589. SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH,
  1590. SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED,
  1591. SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED,
  1592. SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME,
  1593. SLI4_FC_LOCAL_REJECT_RSVD2,
  1594. SLI4_FC_LOCAL_REJECT_NO_RESOURCES, //0x11
  1595. SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE,
  1596. SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH,
  1597. SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE,
  1598. SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS,
  1599. SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED,
  1600. SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT,
  1601. SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE,
  1602. SLI4_FC_LOCAL_REJECT_RSVD3,
  1603. SLI4_FC_LOCAL_REJECT_LINK_DOWN,
  1604. SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA,
  1605. SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI,
  1606. SLI4_FC_LOCAL_REJECT_OUTOFORDER_DATA,
  1607. SLI4_FC_LOCAL_REJECT_OUTOFORDER_ACK,
  1608. SLI4_FC_LOCAL_REJECT_DUP_FRAME,
  1609. SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME, //0x20
  1610. SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS,
  1611. SLI4_FC_LOCAL_REJECT_RSVD4,
  1612. SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER,
  1613. SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED,
  1614. SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED,
  1615. SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE = 0x28,
  1616. SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING,
  1617. SLI4_FC_LOCAL_REJECT_INVALID_VPI = 0x2e,
  1618. SLI4_FC_LOCAL_REJECT_NO_FPORT_DETECTED,
  1619. SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF,
  1620. SLI4_FC_LOCAL_REJECT_RSVD5,
  1621. SLI4_FC_LOCAL_REJECT_INVALID_XRI,
  1622. SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET = 0x40,
  1623. SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET,
  1624. SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE,
  1625. SLI4_FC_LOCAL_REJECT_MISSING_SI,
  1626. SLI4_FC_LOCAL_REJECT_MISSING_ES,
  1627. SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER,
  1628. SLI4_FC_LOCAL_REJECT_SLER_FAILURE,
  1629. SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE,
  1630. SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR,
  1631. SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR,
  1632. SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR,
  1633. SLI4_FC_LOCAL_REJECT_RSVD6,
  1634. SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR,
  1635. SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR,
  1636. SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR,
  1637. };
  1638. enum sli4_async_rcqe_flags {
  1639. SLI4_RACQE_RQ_EL_INDX = 0xfff,
  1640. SLI4_RACQE_FCFI = 0x3f,
  1641. SLI4_RACQE_HDPL = 0x3f,
  1642. SLI4_RACQE_RQ_ID = 0xffc0,
  1643. };
  1644. struct sli4_fc_async_rcqe {
  1645. u8 rsvd0;
  1646. u8 status;
  1647. __le16 rq_elmt_indx_word;
  1648. __le32 rsvd4;
  1649. __le16 fcfi_rq_id_word;
  1650. __le16 data_placement_length;
  1651. u8 sof_byte;
  1652. u8 eof_byte;
  1653. u8 code;
  1654. u8 hdpl_byte;
  1655. };
  1656. struct sli4_fc_async_rcqe_v1 {
  1657. u8 rsvd0;
  1658. u8 status;
  1659. __le16 rq_elmt_indx_word;
  1660. u8 fcfi_byte;
  1661. u8 rsvd5;
  1662. __le16 rsvd6;
  1663. __le16 rq_id;
  1664. __le16 data_placement_length;
  1665. u8 sof_byte;
  1666. u8 eof_byte;
  1667. u8 code;
  1668. u8 hdpl_byte;
  1669. };
  1670. enum sli4_fc_async_rq_status {
  1671. SLI4_FC_ASYNC_RQ_SUCCESS = 0x10,
  1672. SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED,
  1673. SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED,
  1674. SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC,
  1675. SLI4_FC_ASYNC_RQ_DMA_FAILURE,
  1676. };
  1677. #define SLI4_RCQE_RQ_EL_INDX 0xfff
  1678. struct sli4_fc_coalescing_rcqe {
  1679. u8 rsvd0;
  1680. u8 status;
  1681. __le16 rq_elmt_indx_word;
  1682. __le32 rsvd4;
  1683. __le16 rq_id;
  1684. __le16 seq_placement_length;
  1685. __le16 rsvd14;
  1686. u8 code;
  1687. u8 vld_byte;
  1688. };
  1689. #define SLI4_FC_COALESCE_RQ_SUCCESS 0x10
  1690. #define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED 0x18
  1691. enum sli4_optimized_write_cmd_cqe_flags {
  1692. SLI4_OCQE_RQ_EL_INDX = 0x7f, /* DW0 bits 16:30 */
  1693. SLI4_OCQE_FCFI = 0x3f, /* DW1 bits 0:6 */
  1694. SLI4_OCQE_OOX = 1 << 6, /* DW1 bit 15 */
  1695. SLI4_OCQE_AGXR = 1 << 7, /* DW1 bit 16 */
  1696. SLI4_OCQE_HDPL = 0x3f, /* DW3 bits 24:29*/
  1697. };
  1698. struct sli4_fc_optimized_write_cmd_cqe {
  1699. u8 rsvd0;
  1700. u8 status;
  1701. __le16 w1;
  1702. u8 flags0;
  1703. u8 flags1;
  1704. __le16 xri;
  1705. __le16 rq_id;
  1706. __le16 data_placement_length;
  1707. __le16 rpi;
  1708. u8 code;
  1709. u8 hdpl_vld;
  1710. };
  1711. #define SLI4_OCQE_XB 0x10
  1712. struct sli4_fc_optimized_write_data_cqe {
  1713. u8 hw_status;
  1714. u8 status;
  1715. __le16 xri;
  1716. __le32 total_data_placed;
  1717. __le32 extended_status;
  1718. __le16 rsvd12;
  1719. u8 code;
  1720. u8 flags;
  1721. };
  1722. struct sli4_fc_xri_aborted_cqe {
  1723. u8 rsvd0;
  1724. u8 status;
  1725. __le16 rsvd2;
  1726. __le32 extended_status;
  1727. __le16 xri;
  1728. __le16 remote_xid;
  1729. __le16 rsvd12;
  1730. u8 code;
  1731. u8 flags;
  1732. };
  1733. enum sli4_generic_ctx {
  1734. SLI4_GENERIC_CONTEXT_RPI,
  1735. SLI4_GENERIC_CONTEXT_VPI,
  1736. SLI4_GENERIC_CONTEXT_VFI,
  1737. SLI4_GENERIC_CONTEXT_FCFI,
  1738. };
  1739. #define SLI4_GENERIC_CLASS_CLASS_2 0x1
  1740. #define SLI4_GENERIC_CLASS_CLASS_3 0x2
  1741. #define SLI4_ELS_REQUEST64_DIR_WRITE 0x0
  1742. #define SLI4_ELS_REQUEST64_DIR_READ 0x1
  1743. enum sli4_els_request {
  1744. SLI4_ELS_REQUEST64_OTHER,
  1745. SLI4_ELS_REQUEST64_LOGO,
  1746. SLI4_ELS_REQUEST64_FDISC,
  1747. SLI4_ELS_REQUEST64_FLOGIN,
  1748. SLI4_ELS_REQUEST64_PLOGI,
  1749. };
  1750. enum sli4_els_cmd_type {
  1751. SLI4_ELS_REQUEST64_CMD_GEN = 0x08,
  1752. SLI4_ELS_REQUEST64_CMD_NON_FABRIC = 0x0c,
  1753. SLI4_ELS_REQUEST64_CMD_FABRIC = 0x0d,
  1754. };
  1755. #define SLI_PAGE_SIZE SZ_4K
  1756. #define SLI4_BMBX_TIMEOUT_MSEC 30000
  1757. #define SLI4_FW_READY_TIMEOUT_MSEC 30000
  1758. #define SLI4_BMBX_DELAY_US 1000 /* 1 ms */
  1759. #define SLI4_INIT_PORT_DELAY_US 10000 /* 10 ms */
  1760. static inline u32
  1761. sli_page_count(size_t bytes, u32 page_size)
  1762. {
  1763. if (!page_size)
  1764. return 0;
  1765. return (bytes + (page_size - 1)) >> __ffs(page_size);
  1766. }
  1767. /*************************************************************************
  1768. * SLI-4 mailbox command formats and definitions
  1769. */
  1770. struct sli4_mbox_command_header {
  1771. u8 resvd0;
  1772. u8 command;
  1773. __le16 status; /* Port writes to indicate success/fail */
  1774. };
  1775. enum sli4_mbx_cmd_value {
  1776. SLI4_MBX_CMD_CONFIG_LINK = 0x07,
  1777. SLI4_MBX_CMD_DUMP = 0x17,
  1778. SLI4_MBX_CMD_DOWN_LINK = 0x06,
  1779. SLI4_MBX_CMD_INIT_LINK = 0x05,
  1780. SLI4_MBX_CMD_INIT_VFI = 0xa3,
  1781. SLI4_MBX_CMD_INIT_VPI = 0xa4,
  1782. SLI4_MBX_CMD_POST_XRI = 0xa7,
  1783. SLI4_MBX_CMD_RELEASE_XRI = 0xac,
  1784. SLI4_MBX_CMD_READ_CONFIG = 0x0b,
  1785. SLI4_MBX_CMD_READ_STATUS = 0x0e,
  1786. SLI4_MBX_CMD_READ_NVPARMS = 0x02,
  1787. SLI4_MBX_CMD_READ_REV = 0x11,
  1788. SLI4_MBX_CMD_READ_LNK_STAT = 0x12,
  1789. SLI4_MBX_CMD_READ_SPARM64 = 0x8d,
  1790. SLI4_MBX_CMD_READ_TOPOLOGY = 0x95,
  1791. SLI4_MBX_CMD_REG_FCFI = 0xa0,
  1792. SLI4_MBX_CMD_REG_FCFI_MRQ = 0xaf,
  1793. SLI4_MBX_CMD_REG_RPI = 0x93,
  1794. SLI4_MBX_CMD_REG_RX_RQ = 0xa6,
  1795. SLI4_MBX_CMD_REG_VFI = 0x9f,
  1796. SLI4_MBX_CMD_REG_VPI = 0x96,
  1797. SLI4_MBX_CMD_RQST_FEATURES = 0x9d,
  1798. SLI4_MBX_CMD_SLI_CONFIG = 0x9b,
  1799. SLI4_MBX_CMD_UNREG_FCFI = 0xa2,
  1800. SLI4_MBX_CMD_UNREG_RPI = 0x14,
  1801. SLI4_MBX_CMD_UNREG_VFI = 0xa1,
  1802. SLI4_MBX_CMD_UNREG_VPI = 0x97,
  1803. SLI4_MBX_CMD_WRITE_NVPARMS = 0x03,
  1804. SLI4_MBX_CMD_CFG_AUTO_XFER_RDY = 0xad,
  1805. };
  1806. enum sli4_mbx_status {
  1807. SLI4_MBX_STATUS_SUCCESS = 0x0000,
  1808. SLI4_MBX_STATUS_FAILURE = 0x0001,
  1809. SLI4_MBX_STATUS_RPI_NOT_REG = 0x1400,
  1810. };
  1811. /* CONFIG_LINK - configure link-oriented parameters,
  1812. * such as default N_Port_ID address and various timers
  1813. */
  1814. enum sli4_cmd_config_link_flags {
  1815. SLI4_CFG_LINK_BBSCN = 0xf00,
  1816. SLI4_CFG_LINK_CSCN = 0x1000,
  1817. };
  1818. struct sli4_cmd_config_link {
  1819. struct sli4_mbox_command_header hdr;
  1820. u8 maxbbc;
  1821. u8 rsvd5;
  1822. u8 rsvd6;
  1823. u8 rsvd7;
  1824. u8 alpa;
  1825. __le16 n_port_id;
  1826. u8 rsvd11;
  1827. __le32 rsvd12;
  1828. __le32 e_d_tov;
  1829. __le32 lp_tov;
  1830. __le32 r_a_tov;
  1831. __le32 r_t_tov;
  1832. __le32 al_tov;
  1833. __le32 rsvd36;
  1834. __le32 bbscn_dword;
  1835. };
  1836. #define SLI4_DUMP4_TYPE 0xf
  1837. #define SLI4_WKI_TAG_SAT_TEM 0x1040
  1838. struct sli4_cmd_dump4 {
  1839. struct sli4_mbox_command_header hdr;
  1840. __le32 type_dword;
  1841. __le16 wki_selection;
  1842. __le16 rsvd10;
  1843. __le32 rsvd12;
  1844. __le32 returned_byte_cnt;
  1845. __le32 resp_data[59];
  1846. };
  1847. /* INIT_LINK - initialize the link for a FC port */
  1848. enum sli4_init_link_flags {
  1849. SLI4_INIT_LINK_F_LOOPBACK = 1 << 0,
  1850. SLI4_INIT_LINK_F_P2P_ONLY = 1 << 1,
  1851. SLI4_INIT_LINK_F_FCAL_ONLY = 2 << 1,
  1852. SLI4_INIT_LINK_F_FCAL_FAIL_OVER = 0 << 1,
  1853. SLI4_INIT_LINK_F_P2P_FAIL_OVER = 1 << 1,
  1854. SLI4_INIT_LINK_F_UNFAIR = 1 << 6,
  1855. SLI4_INIT_LINK_F_NO_LIRP = 1 << 7,
  1856. SLI4_INIT_LINK_F_LOOP_VALID_CHK = 1 << 8,
  1857. SLI4_INIT_LINK_F_NO_LISA = 1 << 9,
  1858. SLI4_INIT_LINK_F_FAIL_OVER = 1 << 10,
  1859. SLI4_INIT_LINK_F_FIXED_SPEED = 1 << 11,
  1860. SLI4_INIT_LINK_F_PICK_HI_ALPA = 1 << 15,
  1861. };
  1862. enum sli4_fc_link_speed {
  1863. SLI4_LINK_SPEED_1G = 1,
  1864. SLI4_LINK_SPEED_2G,
  1865. SLI4_LINK_SPEED_AUTO_1_2,
  1866. SLI4_LINK_SPEED_4G,
  1867. SLI4_LINK_SPEED_AUTO_4_1,
  1868. SLI4_LINK_SPEED_AUTO_4_2,
  1869. SLI4_LINK_SPEED_AUTO_4_2_1,
  1870. SLI4_LINK_SPEED_8G,
  1871. SLI4_LINK_SPEED_AUTO_8_1,
  1872. SLI4_LINK_SPEED_AUTO_8_2,
  1873. SLI4_LINK_SPEED_AUTO_8_2_1,
  1874. SLI4_LINK_SPEED_AUTO_8_4,
  1875. SLI4_LINK_SPEED_AUTO_8_4_1,
  1876. SLI4_LINK_SPEED_AUTO_8_4_2,
  1877. SLI4_LINK_SPEED_10G,
  1878. SLI4_LINK_SPEED_16G,
  1879. SLI4_LINK_SPEED_AUTO_16_8_4,
  1880. SLI4_LINK_SPEED_AUTO_16_8,
  1881. SLI4_LINK_SPEED_32G,
  1882. SLI4_LINK_SPEED_AUTO_32_16_8,
  1883. SLI4_LINK_SPEED_AUTO_32_16,
  1884. SLI4_LINK_SPEED_64G,
  1885. SLI4_LINK_SPEED_AUTO_64_32_16,
  1886. SLI4_LINK_SPEED_AUTO_64_32,
  1887. SLI4_LINK_SPEED_128G,
  1888. SLI4_LINK_SPEED_AUTO_128_64_32,
  1889. SLI4_LINK_SPEED_AUTO_128_64,
  1890. };
  1891. struct sli4_cmd_init_link {
  1892. struct sli4_mbox_command_header hdr;
  1893. __le32 sel_reset_al_pa_dword;
  1894. __le32 flags0;
  1895. __le32 link_speed_sel_code;
  1896. };
  1897. /* INIT_VFI - initialize the VFI resource */
  1898. enum sli4_init_vfi_flags {
  1899. SLI4_INIT_VFI_FLAG_VP = 0x1000,
  1900. SLI4_INIT_VFI_FLAG_VF = 0x2000,
  1901. SLI4_INIT_VFI_FLAG_VT = 0x4000,
  1902. SLI4_INIT_VFI_FLAG_VR = 0x8000,
  1903. SLI4_INIT_VFI_VFID = 0x1fff,
  1904. SLI4_INIT_VFI_PRI = 0xe000,
  1905. SLI4_INIT_VFI_HOP_COUNT = 0xff000000,
  1906. };
  1907. struct sli4_cmd_init_vfi {
  1908. struct sli4_mbox_command_header hdr;
  1909. __le16 vfi;
  1910. __le16 flags0_word;
  1911. __le16 fcfi;
  1912. __le16 vpi;
  1913. __le32 vf_id_pri_dword;
  1914. __le32 hop_cnt_dword;
  1915. };
  1916. /* INIT_VPI - initialize the VPI resource */
  1917. struct sli4_cmd_init_vpi {
  1918. struct sli4_mbox_command_header hdr;
  1919. __le16 vpi;
  1920. __le16 vfi;
  1921. };
  1922. /* POST_XRI - post XRI resources to the SLI Port */
  1923. enum sli4_post_xri_flags {
  1924. SLI4_POST_XRI_COUNT = 0xfff,
  1925. SLI4_POST_XRI_FLAG_ENX = 0x1000,
  1926. SLI4_POST_XRI_FLAG_DL = 0x2000,
  1927. SLI4_POST_XRI_FLAG_DI = 0x4000,
  1928. SLI4_POST_XRI_FLAG_VAL = 0x8000,
  1929. };
  1930. struct sli4_cmd_post_xri {
  1931. struct sli4_mbox_command_header hdr;
  1932. __le16 xri_base;
  1933. __le16 xri_count_flags;
  1934. };
  1935. /* RELEASE_XRI - Release XRI resources from the SLI Port */
  1936. enum sli4_release_xri_flags {
  1937. SLI4_RELEASE_XRI_REL_XRI_CNT = 0x1f,
  1938. SLI4_RELEASE_XRI_COUNT = 0x1f,
  1939. };
  1940. struct sli4_cmd_release_xri {
  1941. struct sli4_mbox_command_header hdr;
  1942. __le16 rel_xri_count_word;
  1943. __le16 xri_count_word;
  1944. struct {
  1945. __le16 xri_tag0;
  1946. __le16 xri_tag1;
  1947. } xri_tbl[62];
  1948. };
  1949. /* READ_CONFIG - read SLI port configuration parameters */
  1950. struct sli4_cmd_read_config {
  1951. struct sli4_mbox_command_header hdr;
  1952. };
  1953. enum sli4_read_cfg_resp_flags {
  1954. SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000, /* DW1 */
  1955. SLI4_READ_CFG_RESP_TOPOLOGY = 0xff000000, /* DW2 */
  1956. };
  1957. enum sli4_read_cfg_topo {
  1958. SLI4_READ_CFG_TOPO_FC = 0x1, /* FC topology unknown */
  1959. SLI4_READ_CFG_TOPO_NON_FC_AL = 0x2, /* FC point-to-point or fabric */
  1960. SLI4_READ_CFG_TOPO_FC_AL = 0x3, /* FC-AL topology */
  1961. };
  1962. /* Link Module Type */
  1963. enum sli4_read_cfg_lmt {
  1964. SLI4_LINK_MODULE_TYPE_1GB = 0x0004,
  1965. SLI4_LINK_MODULE_TYPE_2GB = 0x0008,
  1966. SLI4_LINK_MODULE_TYPE_4GB = 0x0040,
  1967. SLI4_LINK_MODULE_TYPE_8GB = 0x0080,
  1968. SLI4_LINK_MODULE_TYPE_16GB = 0x0200,
  1969. SLI4_LINK_MODULE_TYPE_32GB = 0x0400,
  1970. SLI4_LINK_MODULE_TYPE_64GB = 0x0800,
  1971. SLI4_LINK_MODULE_TYPE_128GB = 0x1000,
  1972. };
  1973. struct sli4_rsp_read_config {
  1974. struct sli4_mbox_command_header hdr;
  1975. __le32 ext_dword;
  1976. __le32 topology_dword;
  1977. __le32 resvd8;
  1978. __le16 e_d_tov;
  1979. __le16 resvd14;
  1980. __le32 resvd16;
  1981. __le16 r_a_tov;
  1982. __le16 resvd22;
  1983. __le32 resvd24;
  1984. __le32 resvd28;
  1985. __le16 lmt;
  1986. __le16 resvd34;
  1987. __le32 resvd36;
  1988. __le32 resvd40;
  1989. __le16 xri_base;
  1990. __le16 xri_count;
  1991. __le16 rpi_base;
  1992. __le16 rpi_count;
  1993. __le16 vpi_base;
  1994. __le16 vpi_count;
  1995. __le16 vfi_base;
  1996. __le16 vfi_count;
  1997. __le16 resvd60;
  1998. __le16 fcfi_count;
  1999. __le16 rq_count;
  2000. __le16 eq_count;
  2001. __le16 wq_count;
  2002. __le16 cq_count;
  2003. __le32 pad[45];
  2004. };
  2005. /* READ_NVPARMS - read SLI port configuration parameters */
  2006. enum sli4_read_nvparms_flags {
  2007. SLI4_READ_NVPARAMS_HARD_ALPA = 0xff,
  2008. SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
  2009. };
  2010. struct sli4_cmd_read_nvparms {
  2011. struct sli4_mbox_command_header hdr;
  2012. __le32 resvd0;
  2013. __le32 resvd4;
  2014. __le32 resvd8;
  2015. __le32 resvd12;
  2016. u8 wwpn[8];
  2017. u8 wwnn[8];
  2018. __le32 hard_alpa_d_id;
  2019. };
  2020. /* WRITE_NVPARMS - write SLI port configuration parameters */
  2021. struct sli4_cmd_write_nvparms {
  2022. struct sli4_mbox_command_header hdr;
  2023. __le32 resvd0;
  2024. __le32 resvd4;
  2025. __le32 resvd8;
  2026. __le32 resvd12;
  2027. u8 wwpn[8];
  2028. u8 wwnn[8];
  2029. __le32 hard_alpa_d_id;
  2030. };
  2031. /* READ_REV - read the Port revision levels */
  2032. enum {
  2033. SLI4_READ_REV_FLAG_SLI_LEVEL = 0xf,
  2034. SLI4_READ_REV_FLAG_FCOEM = 0x10,
  2035. SLI4_READ_REV_FLAG_CEEV = 0x60,
  2036. SLI4_READ_REV_FLAG_VPD = 0x2000,
  2037. SLI4_READ_REV_AVAILABLE_LENGTH = 0xffffff,
  2038. };
  2039. struct sli4_cmd_read_rev {
  2040. struct sli4_mbox_command_header hdr;
  2041. __le16 resvd0;
  2042. __le16 flags0_word;
  2043. __le32 first_hw_rev;
  2044. __le32 second_hw_rev;
  2045. __le32 resvd12;
  2046. __le32 third_hw_rev;
  2047. u8 fc_ph_low;
  2048. u8 fc_ph_high;
  2049. u8 feature_level_low;
  2050. u8 feature_level_high;
  2051. __le32 resvd24;
  2052. __le32 first_fw_id;
  2053. u8 first_fw_name[16];
  2054. __le32 second_fw_id;
  2055. u8 second_fw_name[16];
  2056. __le32 rsvd18[30];
  2057. __le32 available_length_dword;
  2058. struct sli4_dmaaddr hostbuf;
  2059. __le32 returned_vpd_length;
  2060. __le32 actual_vpd_length;
  2061. };
  2062. /* READ_SPARM64 - read the Port service parameters */
  2063. #define SLI4_READ_SPARM64_WWPN_OFFSET (4 * sizeof(u32))
  2064. #define SLI4_READ_SPARM64_WWNN_OFFSET (6 * sizeof(u32))
  2065. struct sli4_cmd_read_sparm64 {
  2066. struct sli4_mbox_command_header hdr;
  2067. __le32 resvd0;
  2068. __le32 resvd4;
  2069. struct sli4_bde bde_64;
  2070. __le16 vpi;
  2071. __le16 resvd22;
  2072. __le16 port_name_start;
  2073. __le16 port_name_len;
  2074. __le16 node_name_start;
  2075. __le16 node_name_len;
  2076. };
  2077. /* READ_TOPOLOGY - read the link event information */
  2078. enum sli4_read_topo_e {
  2079. SLI4_READTOPO_ATTEN_TYPE = 0xff,
  2080. SLI4_READTOPO_FLAG_IL = 0x100,
  2081. SLI4_READTOPO_FLAG_PB_RECVD = 0x200,
  2082. SLI4_READTOPO_LINKSTATE_RECV = 0x3,
  2083. SLI4_READTOPO_LINKSTATE_TRANS = 0xc,
  2084. SLI4_READTOPO_LINKSTATE_MACHINE = 0xf0,
  2085. SLI4_READTOPO_LINKSTATE_SPEED = 0xff00,
  2086. SLI4_READTOPO_LINKSTATE_TF = 0x40000000,
  2087. SLI4_READTOPO_LINKSTATE_LU = 0x80000000,
  2088. SLI4_READTOPO_SCN_BBSCN = 0xf,
  2089. SLI4_READTOPO_SCN_CBBSCN = 0xf0,
  2090. SLI4_READTOPO_R_T_TOV = 0x1ff,
  2091. SLI4_READTOPO_AL_TOV = 0xf000,
  2092. SLI4_READTOPO_PB_FLAG = 0x80,
  2093. SLI4_READTOPO_INIT_N_PORTID = 0xffffff,
  2094. };
  2095. #define SLI4_MIN_LOOP_MAP_BYTES 128
  2096. struct sli4_cmd_read_topology {
  2097. struct sli4_mbox_command_header hdr;
  2098. __le32 event_tag;
  2099. __le32 dw2_attentype;
  2100. u8 topology;
  2101. u8 lip_type;
  2102. u8 lip_al_ps;
  2103. u8 al_pa_granted;
  2104. struct sli4_bde bde_loop_map;
  2105. __le32 linkdown_state;
  2106. __le32 currlink_state;
  2107. u8 max_bbc;
  2108. u8 init_bbc;
  2109. u8 scn_flags;
  2110. u8 rsvd39;
  2111. __le16 dw10w0_al_rt_tov;
  2112. __le16 lp_tov;
  2113. u8 acquired_al_pa;
  2114. u8 pb_flags;
  2115. __le16 specified_al_pa;
  2116. __le32 dw12_init_n_port_id;
  2117. };
  2118. enum sli4_read_topo_link {
  2119. SLI4_READ_TOPOLOGY_LINK_UP = 0x1,
  2120. SLI4_READ_TOPOLOGY_LINK_DOWN,
  2121. SLI4_READ_TOPOLOGY_LINK_NO_ALPA,
  2122. };
  2123. enum sli4_read_topo {
  2124. SLI4_READ_TOPO_UNKNOWN = 0x0,
  2125. SLI4_READ_TOPO_NON_FC_AL,
  2126. SLI4_READ_TOPO_FC_AL,
  2127. };
  2128. enum sli4_read_topo_speed {
  2129. SLI4_READ_TOPOLOGY_SPEED_NONE = 0x00,
  2130. SLI4_READ_TOPOLOGY_SPEED_1G = 0x04,
  2131. SLI4_READ_TOPOLOGY_SPEED_2G = 0x08,
  2132. SLI4_READ_TOPOLOGY_SPEED_4G = 0x10,
  2133. SLI4_READ_TOPOLOGY_SPEED_8G = 0x20,
  2134. SLI4_READ_TOPOLOGY_SPEED_10G = 0x40,
  2135. SLI4_READ_TOPOLOGY_SPEED_16G = 0x80,
  2136. SLI4_READ_TOPOLOGY_SPEED_32G = 0x90,
  2137. SLI4_READ_TOPOLOGY_SPEED_64G = 0xa0,
  2138. SLI4_READ_TOPOLOGY_SPEED_128G = 0xb0,
  2139. };
  2140. /* REG_FCFI - activate a FC Forwarder */
  2141. struct sli4_cmd_reg_fcfi_rq_cfg {
  2142. u8 r_ctl_mask;
  2143. u8 r_ctl_match;
  2144. u8 type_mask;
  2145. u8 type_match;
  2146. };
  2147. enum sli4_regfcfi_tag {
  2148. SLI4_REGFCFI_VLAN_TAG = 0xfff,
  2149. SLI4_REGFCFI_VLANTAG_VALID = 0x1000,
  2150. };
  2151. #define SLI4_CMD_REG_FCFI_NUM_RQ_CFG 4
  2152. struct sli4_cmd_reg_fcfi {
  2153. struct sli4_mbox_command_header hdr;
  2154. __le16 fcf_index;
  2155. __le16 fcfi;
  2156. __le16 rqid1;
  2157. __le16 rqid0;
  2158. __le16 rqid3;
  2159. __le16 rqid2;
  2160. struct sli4_cmd_reg_fcfi_rq_cfg
  2161. rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
  2162. __le32 dw8_vlan;
  2163. };
  2164. #define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG 4
  2165. #define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ 32
  2166. #define SLI4_CMD_REG_FCFI_SET_FCFI_MODE 0
  2167. #define SLI4_CMD_REG_FCFI_SET_MRQ_MODE 1
  2168. enum sli4_reg_fcfi_mrq {
  2169. SLI4_REGFCFI_MRQ_VLAN_TAG = 0xfff,
  2170. SLI4_REGFCFI_MRQ_VLANTAG_VALID = 0x1000,
  2171. SLI4_REGFCFI_MRQ_MODE = 0x2000,
  2172. SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS = 0xff,
  2173. SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,
  2174. SLI4_REGFCFI_MRQ_RQ_SEL_POLICY = 0xf000,
  2175. };
  2176. struct sli4_cmd_reg_fcfi_mrq {
  2177. struct sli4_mbox_command_header hdr;
  2178. __le16 fcf_index;
  2179. __le16 fcfi;
  2180. __le16 rqid1;
  2181. __le16 rqid0;
  2182. __le16 rqid3;
  2183. __le16 rqid2;
  2184. struct sli4_cmd_reg_fcfi_rq_cfg
  2185. rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
  2186. __le32 dw8_vlan;
  2187. __le32 dw9_mrqflags;
  2188. };
  2189. struct sli4_cmd_rq_cfg {
  2190. __le16 rq_id;
  2191. u8 r_ctl_mask;
  2192. u8 r_ctl_match;
  2193. u8 type_mask;
  2194. u8 type_match;
  2195. };
  2196. /* REG_RPI - register a Remote Port Indicator */
  2197. enum sli4_reg_rpi {
  2198. SLI4_REGRPI_REMOTE_N_PORTID = 0xffffff, /* DW2 */
  2199. SLI4_REGRPI_UPD = 0x1000000,
  2200. SLI4_REGRPI_ETOW = 0x8000000,
  2201. SLI4_REGRPI_TERP = 0x20000000,
  2202. SLI4_REGRPI_CI = 0x80000000,
  2203. };
  2204. struct sli4_cmd_reg_rpi {
  2205. struct sli4_mbox_command_header hdr;
  2206. __le16 rpi;
  2207. __le16 rsvd2;
  2208. __le32 dw2_rportid_flags;
  2209. struct sli4_bde bde_64;
  2210. __le16 vpi;
  2211. __le16 rsvd26;
  2212. };
  2213. #define SLI4_REG_RPI_BUF_LEN 0x70
  2214. /* REG_VFI - register a Virtual Fabric Indicator */
  2215. enum sli_reg_vfi {
  2216. SLI4_REGVFI_VP = 0x1000, /* DW1 */
  2217. SLI4_REGVFI_UPD = 0x2000,
  2218. SLI4_REGVFI_LOCAL_N_PORTID = 0xffffff, /* DW10 */
  2219. };
  2220. struct sli4_cmd_reg_vfi {
  2221. struct sli4_mbox_command_header hdr;
  2222. __le16 vfi;
  2223. __le16 dw0w1_flags;
  2224. __le16 fcfi;
  2225. __le16 vpi;
  2226. u8 wwpn[8];
  2227. struct sli4_bde sparm;
  2228. __le32 e_d_tov;
  2229. __le32 r_a_tov;
  2230. __le32 dw10_lportid_flags;
  2231. };
  2232. /* REG_VPI - register a Virtual Port Indicator */
  2233. enum sli4_reg_vpi {
  2234. SLI4_REGVPI_LOCAL_N_PORTID = 0xffffff,
  2235. SLI4_REGVPI_UPD = 0x1000000,
  2236. };
  2237. struct sli4_cmd_reg_vpi {
  2238. struct sli4_mbox_command_header hdr;
  2239. __le32 rsvd0;
  2240. __le32 dw2_lportid_flags;
  2241. u8 wwpn[8];
  2242. __le32 rsvd12;
  2243. __le16 vpi;
  2244. __le16 vfi;
  2245. };
  2246. /* REQUEST_FEATURES - request / query SLI features */
  2247. enum sli4_req_features_flags {
  2248. SLI4_REQFEAT_QRY = 0x1, /* Dw1 */
  2249. SLI4_REQFEAT_IAAB = 1 << 0, /* DW2 & DW3 */
  2250. SLI4_REQFEAT_NPIV = 1 << 1,
  2251. SLI4_REQFEAT_DIF = 1 << 2,
  2252. SLI4_REQFEAT_VF = 1 << 3,
  2253. SLI4_REQFEAT_FCPI = 1 << 4,
  2254. SLI4_REQFEAT_FCPT = 1 << 5,
  2255. SLI4_REQFEAT_FCPC = 1 << 6,
  2256. SLI4_REQFEAT_RSVD = 1 << 7,
  2257. SLI4_REQFEAT_RQD = 1 << 8,
  2258. SLI4_REQFEAT_IAAR = 1 << 9,
  2259. SLI4_REQFEAT_HLM = 1 << 10,
  2260. SLI4_REQFEAT_PERFH = 1 << 11,
  2261. SLI4_REQFEAT_RXSEQ = 1 << 12,
  2262. SLI4_REQFEAT_RXRI = 1 << 13,
  2263. SLI4_REQFEAT_DCL2 = 1 << 14,
  2264. SLI4_REQFEAT_RSCO = 1 << 15,
  2265. SLI4_REQFEAT_MRQP = 1 << 16,
  2266. };
  2267. struct sli4_cmd_request_features {
  2268. struct sli4_mbox_command_header hdr;
  2269. __le32 dw1_qry;
  2270. __le32 cmd;
  2271. __le32 resp;
  2272. };
  2273. /*
  2274. * SLI_CONFIG - submit a configuration command to Port
  2275. *
  2276. * Command is either embedded as part of the payload (embed) or located
  2277. * in a separate memory buffer (mem)
  2278. */
  2279. enum sli4_sli_config {
  2280. SLI4_SLICONF_EMB = 0x1, /* DW1 */
  2281. SLI4_SLICONF_PMDCMD_SHIFT = 3,
  2282. SLI4_SLICONF_PMDCMD_MASK = 0xf8,
  2283. SLI4_SLICONF_PMDCMD_VAL_1 = 8,
  2284. SLI4_SLICONF_PMDCNT = 0xf8,
  2285. SLI4_SLICONF_PMD_LEN = 0x00ffffff,
  2286. };
  2287. struct sli4_cmd_sli_config {
  2288. struct sli4_mbox_command_header hdr;
  2289. __le32 dw1_flags;
  2290. __le32 payload_len;
  2291. __le32 rsvd12[3];
  2292. union {
  2293. u8 embed[58 * sizeof(u32)];
  2294. struct sli4_bufptr mem;
  2295. } payload;
  2296. };
  2297. /* READ_STATUS - read tx/rx status of a particular port */
  2298. #define SLI4_READSTATUS_CLEAR_COUNTERS 0x1
  2299. struct sli4_cmd_read_status {
  2300. struct sli4_mbox_command_header hdr;
  2301. __le32 dw1_flags;
  2302. __le32 rsvd4;
  2303. __le32 trans_kbyte_cnt;
  2304. __le32 recv_kbyte_cnt;
  2305. __le32 trans_frame_cnt;
  2306. __le32 recv_frame_cnt;
  2307. __le32 trans_seq_cnt;
  2308. __le32 recv_seq_cnt;
  2309. __le32 tot_exchanges_orig;
  2310. __le32 tot_exchanges_resp;
  2311. __le32 recv_p_bsy_cnt;
  2312. __le32 recv_f_bsy_cnt;
  2313. __le32 no_rq_buf_dropped_frames_cnt;
  2314. __le32 empty_rq_timeout_cnt;
  2315. __le32 no_xri_dropped_frames_cnt;
  2316. __le32 empty_xri_pool_cnt;
  2317. };
  2318. /* READ_LNK_STAT - read link status of a particular port */
  2319. enum sli4_read_link_stats_flags {
  2320. SLI4_READ_LNKSTAT_REC = 1u << 0,
  2321. SLI4_READ_LNKSTAT_GEC = 1u << 1,
  2322. SLI4_READ_LNKSTAT_W02OF = 1u << 2,
  2323. SLI4_READ_LNKSTAT_W03OF = 1u << 3,
  2324. SLI4_READ_LNKSTAT_W04OF = 1u << 4,
  2325. SLI4_READ_LNKSTAT_W05OF = 1u << 5,
  2326. SLI4_READ_LNKSTAT_W06OF = 1u << 6,
  2327. SLI4_READ_LNKSTAT_W07OF = 1u << 7,
  2328. SLI4_READ_LNKSTAT_W08OF = 1u << 8,
  2329. SLI4_READ_LNKSTAT_W09OF = 1u << 9,
  2330. SLI4_READ_LNKSTAT_W10OF = 1u << 10,
  2331. SLI4_READ_LNKSTAT_W11OF = 1u << 11,
  2332. SLI4_READ_LNKSTAT_W12OF = 1u << 12,
  2333. SLI4_READ_LNKSTAT_W13OF = 1u << 13,
  2334. SLI4_READ_LNKSTAT_W14OF = 1u << 14,
  2335. SLI4_READ_LNKSTAT_W15OF = 1u << 15,
  2336. SLI4_READ_LNKSTAT_W16OF = 1u << 16,
  2337. SLI4_READ_LNKSTAT_W17OF = 1u << 17,
  2338. SLI4_READ_LNKSTAT_W18OF = 1u << 18,
  2339. SLI4_READ_LNKSTAT_W19OF = 1u << 19,
  2340. SLI4_READ_LNKSTAT_W20OF = 1u << 20,
  2341. SLI4_READ_LNKSTAT_W21OF = 1u << 21,
  2342. SLI4_READ_LNKSTAT_CLRC = 1u << 30,
  2343. SLI4_READ_LNKSTAT_CLOF = 1u << 31,
  2344. };
  2345. struct sli4_cmd_read_link_stats {
  2346. struct sli4_mbox_command_header hdr;
  2347. __le32 dw1_flags;
  2348. __le32 linkfail_errcnt;
  2349. __le32 losssync_errcnt;
  2350. __le32 losssignal_errcnt;
  2351. __le32 primseq_errcnt;
  2352. __le32 inval_txword_errcnt;
  2353. __le32 crc_errcnt;
  2354. __le32 primseq_eventtimeout_cnt;
  2355. __le32 elastic_bufoverrun_errcnt;
  2356. __le32 arbit_fc_al_timeout_cnt;
  2357. __le32 adv_rx_buftor_to_buf_credit;
  2358. __le32 curr_rx_buf_to_buf_credit;
  2359. __le32 adv_tx_buf_to_buf_credit;
  2360. __le32 curr_tx_buf_to_buf_credit;
  2361. __le32 rx_eofa_cnt;
  2362. __le32 rx_eofdti_cnt;
  2363. __le32 rx_eofni_cnt;
  2364. __le32 rx_soff_cnt;
  2365. __le32 rx_dropped_no_aer_cnt;
  2366. __le32 rx_dropped_no_avail_rpi_rescnt;
  2367. __le32 rx_dropped_no_avail_xri_rescnt;
  2368. };
  2369. /* Format a WQE with WQ_ID Association performance hint */
  2370. static inline void
  2371. sli_set_wq_id_association(void *entry, u16 q_id)
  2372. {
  2373. u32 *wqe = entry;
  2374. /*
  2375. * Set Word 10, bit 0 to zero
  2376. * Set Word 10, bits 15:1 to the WQ ID
  2377. */
  2378. wqe[10] &= ~0xffff;
  2379. wqe[10] |= q_id << 1;
  2380. }
  2381. /* UNREG_FCFI - unregister a FCFI */
  2382. struct sli4_cmd_unreg_fcfi {
  2383. struct sli4_mbox_command_header hdr;
  2384. __le32 rsvd0;
  2385. __le16 fcfi;
  2386. __le16 rsvd6;
  2387. };
  2388. /* UNREG_RPI - unregister one or more RPI */
  2389. enum sli4_unreg_rpi {
  2390. SLI4_UNREG_RPI_DP = 0x2000,
  2391. SLI4_UNREG_RPI_II_SHIFT = 14,
  2392. SLI4_UNREG_RPI_II_MASK = 0xc000,
  2393. SLI4_UNREG_RPI_II_RPI = 0x0000,
  2394. SLI4_UNREG_RPI_II_VPI = 0x4000,
  2395. SLI4_UNREG_RPI_II_VFI = 0x8000,
  2396. SLI4_UNREG_RPI_II_FCFI = 0xc000,
  2397. SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,
  2398. };
  2399. struct sli4_cmd_unreg_rpi {
  2400. struct sli4_mbox_command_header hdr;
  2401. __le16 index;
  2402. __le16 dw1w1_flags;
  2403. __le32 dw2_dest_n_portid;
  2404. };
  2405. /* UNREG_VFI - unregister one or more VFI */
  2406. enum sli4_unreg_vfi {
  2407. SLI4_UNREG_VFI_II_SHIFT = 14,
  2408. SLI4_UNREG_VFI_II_MASK = 0xc000,
  2409. SLI4_UNREG_VFI_II_VFI = 0x0000,
  2410. SLI4_UNREG_VFI_II_FCFI = 0xc000,
  2411. };
  2412. struct sli4_cmd_unreg_vfi {
  2413. struct sli4_mbox_command_header hdr;
  2414. __le32 rsvd0;
  2415. __le16 index;
  2416. __le16 dw2_flags;
  2417. };
  2418. enum sli4_unreg_type {
  2419. SLI4_UNREG_TYPE_PORT,
  2420. SLI4_UNREG_TYPE_DOMAIN,
  2421. SLI4_UNREG_TYPE_FCF,
  2422. SLI4_UNREG_TYPE_ALL
  2423. };
  2424. /* UNREG_VPI - unregister one or more VPI */
  2425. enum sli4_unreg_vpi {
  2426. SLI4_UNREG_VPI_II_SHIFT = 14,
  2427. SLI4_UNREG_VPI_II_MASK = 0xc000,
  2428. SLI4_UNREG_VPI_II_VPI = 0x0000,
  2429. SLI4_UNREG_VPI_II_VFI = 0x8000,
  2430. SLI4_UNREG_VPI_II_FCFI = 0xc000,
  2431. };
  2432. struct sli4_cmd_unreg_vpi {
  2433. struct sli4_mbox_command_header hdr;
  2434. __le32 rsvd0;
  2435. __le16 index;
  2436. __le16 dw2w0_flags;
  2437. };
  2438. /* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */
  2439. struct sli4_cmd_config_auto_xfer_rdy {
  2440. struct sli4_mbox_command_header hdr;
  2441. __le32 rsvd0;
  2442. __le32 max_burst_len;
  2443. };
  2444. #define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE 0xffff
  2445. struct sli4_cmd_config_auto_xfer_rdy_hp {
  2446. struct sli4_mbox_command_header hdr;
  2447. __le32 rsvd0;
  2448. __le32 max_burst_len;
  2449. __le32 dw3_esoc_flags;
  2450. __le16 block_size;
  2451. __le16 rsvd14;
  2452. };
  2453. /*************************************************************************
  2454. * SLI-4 common configuration command formats and definitions
  2455. */
  2456. /*
  2457. * Subsystem values.
  2458. */
  2459. enum sli4_subsystem {
  2460. SLI4_SUBSYSTEM_COMMON = 0x01,
  2461. SLI4_SUBSYSTEM_LOWLEVEL = 0x0b,
  2462. SLI4_SUBSYSTEM_FC = 0x0c,
  2463. SLI4_SUBSYSTEM_DMTF = 0x11,
  2464. };
  2465. #define SLI4_OPC_LOWLEVEL_SET_WATCHDOG 0X36
  2466. /*
  2467. * Common opcode (OPC) values.
  2468. */
  2469. enum sli4_cmn_opcode {
  2470. SLI4_CMN_FUNCTION_RESET = 0x3d,
  2471. SLI4_CMN_CREATE_CQ = 0x0c,
  2472. SLI4_CMN_CREATE_CQ_SET = 0x1d,
  2473. SLI4_CMN_DESTROY_CQ = 0x36,
  2474. SLI4_CMN_MODIFY_EQ_DELAY = 0x29,
  2475. SLI4_CMN_CREATE_EQ = 0x0d,
  2476. SLI4_CMN_DESTROY_EQ = 0x37,
  2477. SLI4_CMN_CREATE_MQ_EXT = 0x5a,
  2478. SLI4_CMN_DESTROY_MQ = 0x35,
  2479. SLI4_CMN_GET_CNTL_ATTRIBUTES = 0x20,
  2480. SLI4_CMN_NOP = 0x21,
  2481. SLI4_CMN_GET_RSC_EXTENT_INFO = 0x9a,
  2482. SLI4_CMN_GET_SLI4_PARAMS = 0xb5,
  2483. SLI4_CMN_QUERY_FW_CONFIG = 0x3a,
  2484. SLI4_CMN_GET_PORT_NAME = 0x4d,
  2485. SLI4_CMN_WRITE_FLASHROM = 0x07,
  2486. /* TRANSCEIVER Data */
  2487. SLI4_CMN_READ_TRANS_DATA = 0x49,
  2488. SLI4_CMN_GET_CNTL_ADDL_ATTRS = 0x79,
  2489. SLI4_CMN_GET_FUNCTION_CFG = 0xa0,
  2490. SLI4_CMN_GET_PROFILE_CFG = 0xa4,
  2491. SLI4_CMN_SET_PROFILE_CFG = 0xa5,
  2492. SLI4_CMN_GET_PROFILE_LIST = 0xa6,
  2493. SLI4_CMN_GET_ACTIVE_PROFILE = 0xa7,
  2494. SLI4_CMN_SET_ACTIVE_PROFILE = 0xa8,
  2495. SLI4_CMN_READ_OBJECT = 0xab,
  2496. SLI4_CMN_WRITE_OBJECT = 0xac,
  2497. SLI4_CMN_DELETE_OBJECT = 0xae,
  2498. SLI4_CMN_READ_OBJECT_LIST = 0xad,
  2499. SLI4_CMN_SET_DUMP_LOCATION = 0xb8,
  2500. SLI4_CMN_SET_FEATURES = 0xbf,
  2501. SLI4_CMN_GET_RECFG_LINK_INFO = 0xc9,
  2502. SLI4_CMN_SET_RECNG_LINK_ID = 0xca,
  2503. };
  2504. /* DMTF opcode (OPC) values */
  2505. #define DMTF_EXEC_CLP_CMD 0x01
  2506. /*
  2507. * COMMON_FUNCTION_RESET
  2508. *
  2509. * Resets the Port, returning it to a power-on state. This configuration
  2510. * command does not have a payload and should set/expect the lengths to
  2511. * be zero.
  2512. */
  2513. struct sli4_rqst_cmn_function_reset {
  2514. struct sli4_rqst_hdr hdr;
  2515. };
  2516. struct sli4_rsp_cmn_function_reset {
  2517. struct sli4_rsp_hdr hdr;
  2518. };
  2519. /*
  2520. * COMMON_GET_CNTL_ATTRIBUTES
  2521. *
  2522. * Query for information about the SLI Port
  2523. */
  2524. enum sli4_cntrl_attr_flags {
  2525. SLI4_CNTL_ATTR_PORTNUM = 0x3f,
  2526. SLI4_CNTL_ATTR_PORTTYPE = 0xc0,
  2527. };
  2528. struct sli4_rsp_cmn_get_cntl_attributes {
  2529. struct sli4_rsp_hdr hdr;
  2530. u8 version_str[32];
  2531. u8 manufacturer_name[32];
  2532. __le32 supported_modes;
  2533. u8 eprom_version_lo;
  2534. u8 eprom_version_hi;
  2535. __le16 rsvd17;
  2536. __le32 mbx_ds_version;
  2537. __le32 ep_fw_ds_version;
  2538. u8 ncsi_version_str[12];
  2539. __le32 def_extended_timeout;
  2540. u8 model_number[32];
  2541. u8 description[64];
  2542. u8 serial_number[32];
  2543. u8 ip_version_str[32];
  2544. u8 fw_version_str[32];
  2545. u8 bios_version_str[32];
  2546. u8 redboot_version_str[32];
  2547. u8 driver_version_str[32];
  2548. u8 fw_on_flash_version_str[32];
  2549. __le32 functionalities_supported;
  2550. __le16 max_cdb_length;
  2551. u8 asic_revision;
  2552. u8 generational_guid0;
  2553. __le32 generational_guid1_12[3];
  2554. __le16 generational_guid13_14;
  2555. u8 generational_guid15;
  2556. u8 hba_port_count;
  2557. __le16 default_link_down_timeout;
  2558. u8 iscsi_version_min_max;
  2559. u8 multifunctional_device;
  2560. u8 cache_valid;
  2561. u8 hba_status;
  2562. u8 max_domains_supported;
  2563. u8 port_num_type_flags;
  2564. __le32 firmware_post_status;
  2565. __le32 hba_mtu;
  2566. u8 iscsi_features;
  2567. u8 rsvd121[3];
  2568. __le16 pci_vendor_id;
  2569. __le16 pci_device_id;
  2570. __le16 pci_sub_vendor_id;
  2571. __le16 pci_sub_system_id;
  2572. u8 pci_bus_number;
  2573. u8 pci_device_number;
  2574. u8 pci_function_number;
  2575. u8 interface_type;
  2576. __le64 unique_identifier;
  2577. u8 number_of_netfilters;
  2578. u8 rsvd122[3];
  2579. };
  2580. /*
  2581. * COMMON_GET_CNTL_ATTRIBUTES
  2582. *
  2583. * This command queries the controller information from the Flash ROM.
  2584. */
  2585. struct sli4_rqst_cmn_get_cntl_addl_attributes {
  2586. struct sli4_rqst_hdr hdr;
  2587. };
  2588. struct sli4_rsp_cmn_get_cntl_addl_attributes {
  2589. struct sli4_rsp_hdr hdr;
  2590. __le16 ipl_file_number;
  2591. u8 ipl_file_version;
  2592. u8 rsvd4;
  2593. u8 on_die_temperature;
  2594. u8 rsvd5[3];
  2595. __le32 driver_advanced_features_supported;
  2596. __le32 rsvd7[4];
  2597. char universal_bios_version[32];
  2598. char x86_bios_version[32];
  2599. char efi_bios_version[32];
  2600. char fcode_version[32];
  2601. char uefi_bios_version[32];
  2602. char uefi_nic_version[32];
  2603. char uefi_fcode_version[32];
  2604. char uefi_iscsi_version[32];
  2605. char iscsi_x86_bios_version[32];
  2606. char pxe_x86_bios_version[32];
  2607. u8 default_wwpn[8];
  2608. u8 ext_phy_version[32];
  2609. u8 fc_universal_bios_version[32];
  2610. u8 fc_x86_bios_version[32];
  2611. u8 fc_efi_bios_version[32];
  2612. u8 fc_fcode_version[32];
  2613. u8 ext_phy_crc_label[8];
  2614. u8 ipl_file_name[16];
  2615. u8 rsvd139[72];
  2616. };
  2617. /*
  2618. * COMMON_NOP
  2619. *
  2620. * This command does not do anything; it only returns
  2621. * the payload in the completion.
  2622. */
  2623. struct sli4_rqst_cmn_nop {
  2624. struct sli4_rqst_hdr hdr;
  2625. __le32 context[2];
  2626. };
  2627. struct sli4_rsp_cmn_nop {
  2628. struct sli4_rsp_hdr hdr;
  2629. __le32 context[2];
  2630. };
  2631. struct sli4_rqst_cmn_get_resource_extent_info {
  2632. struct sli4_rqst_hdr hdr;
  2633. __le16 resource_type;
  2634. __le16 rsvd16;
  2635. };
  2636. enum sli4_rsc_type {
  2637. SLI4_RSC_TYPE_VFI = 0x20,
  2638. SLI4_RSC_TYPE_VPI = 0x21,
  2639. SLI4_RSC_TYPE_RPI = 0x22,
  2640. SLI4_RSC_TYPE_XRI = 0x23,
  2641. };
  2642. struct sli4_rsp_cmn_get_resource_extent_info {
  2643. struct sli4_rsp_hdr hdr;
  2644. __le16 resource_extent_count;
  2645. __le16 resource_extent_size;
  2646. };
  2647. #define SLI4_128BYTE_WQE_SUPPORT 0x02
  2648. #define GET_Q_CNT_METHOD(m) \
  2649. (((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)
  2650. #define GET_Q_CREATE_VERSION(v) \
  2651. (((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)
  2652. enum sli4_rsp_get_params_e {
  2653. /*GENERIC*/
  2654. SLI4_PARAM_Q_CNT_MTHD_SHFT = 24,
  2655. SLI4_PARAM_Q_CNT_MTHD_MASK = 0xf << 24,
  2656. SLI4_PARAM_QV_SHIFT = 14,
  2657. SLI4_PARAM_QV_MASK = 3 << 14,
  2658. /* DW4 */
  2659. SLI4_PARAM_PROTO_TYPE_MASK = 0xff,
  2660. /* DW5 */
  2661. SLI4_PARAM_FT = 1 << 0,
  2662. SLI4_PARAM_SLI_REV_MASK = 0xf << 4,
  2663. SLI4_PARAM_SLI_FAM_MASK = 0xf << 8,
  2664. SLI4_PARAM_IF_TYPE_MASK = 0xf << 12,
  2665. SLI4_PARAM_SLI_HINT1_MASK = 0xff << 16,
  2666. SLI4_PARAM_SLI_HINT2_MASK = 0x1f << 24,
  2667. /* DW6 */
  2668. SLI4_PARAM_EQ_PAGE_CNT_MASK = 0xf << 0,
  2669. SLI4_PARAM_EQE_SZS_MASK = 0xf << 8,
  2670. SLI4_PARAM_EQ_PAGE_SZS_MASK = 0xff << 16,
  2671. /* DW8 */
  2672. SLI4_PARAM_CQ_PAGE_CNT_MASK = 0xf << 0,
  2673. SLI4_PARAM_CQE_SZS_MASK = 0xf << 8,
  2674. SLI4_PARAM_CQ_PAGE_SZS_MASK = 0xff << 16,
  2675. /* DW10 */
  2676. SLI4_PARAM_MQ_PAGE_CNT_MASK = 0xf << 0,
  2677. SLI4_PARAM_MQ_PAGE_SZS_MASK = 0xff << 16,
  2678. /* DW12 */
  2679. SLI4_PARAM_WQ_PAGE_CNT_MASK = 0xf << 0,
  2680. SLI4_PARAM_WQE_SZS_MASK = 0xf << 8,
  2681. SLI4_PARAM_WQ_PAGE_SZS_MASK = 0xff << 16,
  2682. /* DW14 */
  2683. SLI4_PARAM_RQ_PAGE_CNT_MASK = 0xf << 0,
  2684. SLI4_PARAM_RQE_SZS_MASK = 0xf << 8,
  2685. SLI4_PARAM_RQ_PAGE_SZS_MASK = 0xff << 16,
  2686. /* DW15W1*/
  2687. SLI4_PARAM_RQ_DB_WINDOW_MASK = 0xf000,
  2688. /* DW16 */
  2689. SLI4_PARAM_FC = 1 << 0,
  2690. SLI4_PARAM_EXT = 1 << 1,
  2691. SLI4_PARAM_HDRR = 1 << 2,
  2692. SLI4_PARAM_SGLR = 1 << 3,
  2693. SLI4_PARAM_FBRR = 1 << 4,
  2694. SLI4_PARAM_AREG = 1 << 5,
  2695. SLI4_PARAM_TGT = 1 << 6,
  2696. SLI4_PARAM_TERP = 1 << 7,
  2697. SLI4_PARAM_ASSI = 1 << 8,
  2698. SLI4_PARAM_WCHN = 1 << 9,
  2699. SLI4_PARAM_TCCA = 1 << 10,
  2700. SLI4_PARAM_TRTY = 1 << 11,
  2701. SLI4_PARAM_TRIR = 1 << 12,
  2702. SLI4_PARAM_PHOFF = 1 << 13,
  2703. SLI4_PARAM_PHON = 1 << 14,
  2704. SLI4_PARAM_PHWQ = 1 << 15,
  2705. SLI4_PARAM_BOUND_4GA = 1 << 16,
  2706. SLI4_PARAM_RXC = 1 << 17,
  2707. SLI4_PARAM_HLM = 1 << 18,
  2708. SLI4_PARAM_IPR = 1 << 19,
  2709. SLI4_PARAM_RXRI = 1 << 20,
  2710. SLI4_PARAM_SGLC = 1 << 21,
  2711. SLI4_PARAM_TIMM = 1 << 22,
  2712. SLI4_PARAM_TSMM = 1 << 23,
  2713. SLI4_PARAM_OAS = 1 << 25,
  2714. SLI4_PARAM_LC = 1 << 26,
  2715. SLI4_PARAM_AGXF = 1 << 27,
  2716. SLI4_PARAM_LOOPBACK_MASK = 0xf << 28,
  2717. /* DW18 */
  2718. SLI4_PARAM_SGL_PAGE_CNT_MASK = 0xf << 0,
  2719. SLI4_PARAM_SGL_PAGE_SZS_MASK = 0xff << 8,
  2720. SLI4_PARAM_SGL_PP_ALIGN_MASK = 0xff << 16,
  2721. };
  2722. struct sli4_rqst_cmn_get_sli4_params {
  2723. struct sli4_rqst_hdr hdr;
  2724. };
  2725. struct sli4_rsp_cmn_get_sli4_params {
  2726. struct sli4_rsp_hdr hdr;
  2727. __le32 dw4_protocol_type;
  2728. __le32 dw5_sli;
  2729. __le32 dw6_eq_page_cnt;
  2730. __le16 eqe_count_mask;
  2731. __le16 rsvd26;
  2732. __le32 dw8_cq_page_cnt;
  2733. __le16 cqe_count_mask;
  2734. __le16 rsvd34;
  2735. __le32 dw10_mq_page_cnt;
  2736. __le16 mqe_count_mask;
  2737. __le16 rsvd42;
  2738. __le32 dw12_wq_page_cnt;
  2739. __le16 wqe_count_mask;
  2740. __le16 rsvd50;
  2741. __le32 dw14_rq_page_cnt;
  2742. __le16 rqe_count_mask;
  2743. __le16 dw15w1_rq_db_window;
  2744. __le32 dw16_loopback_scope;
  2745. __le32 sge_supported_length;
  2746. __le32 dw18_sgl_page_cnt;
  2747. __le16 min_rq_buffer_size;
  2748. __le16 rsvd75;
  2749. __le32 max_rq_buffer_size;
  2750. __le16 physical_xri_max;
  2751. __le16 physical_rpi_max;
  2752. __le16 physical_vpi_max;
  2753. __le16 physical_vfi_max;
  2754. __le32 rsvd88;
  2755. __le16 frag_num_field_offset;
  2756. __le16 frag_num_field_size;
  2757. __le16 sgl_index_field_offset;
  2758. __le16 sgl_index_field_size;
  2759. __le32 chain_sge_initial_value_lo;
  2760. __le32 chain_sge_initial_value_hi;
  2761. };
  2762. /*Port Types*/
  2763. enum sli4_port_types {
  2764. SLI4_PORT_TYPE_ETH = 0,
  2765. SLI4_PORT_TYPE_FC = 1,
  2766. };
  2767. struct sli4_rqst_cmn_get_port_name {
  2768. struct sli4_rqst_hdr hdr;
  2769. u8 port_type;
  2770. u8 rsvd4[3];
  2771. };
  2772. struct sli4_rsp_cmn_get_port_name {
  2773. struct sli4_rsp_hdr hdr;
  2774. char port_name[4];
  2775. };
  2776. struct sli4_rqst_cmn_write_flashrom {
  2777. struct sli4_rqst_hdr hdr;
  2778. __le32 flash_rom_access_opcode;
  2779. __le32 flash_rom_access_operation_type;
  2780. __le32 data_buffer_size;
  2781. __le32 offset;
  2782. u8 data_buffer[4];
  2783. };
  2784. /*
  2785. * COMMON_READ_TRANSCEIVER_DATA
  2786. *
  2787. * This command reads SFF transceiver data(Format is defined
  2788. * by the SFF-8472 specification).
  2789. */
  2790. struct sli4_rqst_cmn_read_transceiver_data {
  2791. struct sli4_rqst_hdr hdr;
  2792. __le32 page_number;
  2793. __le32 port;
  2794. };
  2795. struct sli4_rsp_cmn_read_transceiver_data {
  2796. struct sli4_rsp_hdr hdr;
  2797. __le32 page_number;
  2798. __le32 port;
  2799. u8 page_data[128];
  2800. u8 page_data_2[128];
  2801. };
  2802. #define SLI4_REQ_DESIRE_READLEN 0xffffff
  2803. struct sli4_rqst_cmn_read_object {
  2804. struct sli4_rqst_hdr hdr;
  2805. __le32 desired_read_length_dword;
  2806. __le32 read_offset;
  2807. u8 object_name[104];
  2808. __le32 host_buffer_descriptor_count;
  2809. struct sli4_bde host_buffer_descriptor[];
  2810. };
  2811. #define RSP_COM_READ_OBJ_EOF 0x80000000
  2812. struct sli4_rsp_cmn_read_object {
  2813. struct sli4_rsp_hdr hdr;
  2814. __le32 actual_read_length;
  2815. __le32 eof_dword;
  2816. };
  2817. enum sli4_rqst_write_object_flags {
  2818. SLI4_RQ_DES_WRITE_LEN = 0xffffff,
  2819. SLI4_RQ_DES_WRITE_LEN_NOC = 0x40000000,
  2820. SLI4_RQ_DES_WRITE_LEN_EOF = 0x80000000,
  2821. };
  2822. struct sli4_rqst_cmn_write_object {
  2823. struct sli4_rqst_hdr hdr;
  2824. __le32 desired_write_len_dword;
  2825. __le32 write_offset;
  2826. u8 object_name[104];
  2827. __le32 host_buffer_descriptor_count;
  2828. struct sli4_bde host_buffer_descriptor[];
  2829. };
  2830. #define RSP_CHANGE_STATUS 0xff
  2831. struct sli4_rsp_cmn_write_object {
  2832. struct sli4_rsp_hdr hdr;
  2833. __le32 actual_write_length;
  2834. __le32 change_status_dword;
  2835. };
  2836. struct sli4_rqst_cmn_delete_object {
  2837. struct sli4_rqst_hdr hdr;
  2838. __le32 rsvd4;
  2839. __le32 rsvd5;
  2840. u8 object_name[104];
  2841. };
  2842. #define SLI4_RQ_OBJ_LIST_READ_LEN 0xffffff
  2843. struct sli4_rqst_cmn_read_object_list {
  2844. struct sli4_rqst_hdr hdr;
  2845. __le32 desired_read_length_dword;
  2846. __le32 read_offset;
  2847. u8 object_name[104];
  2848. __le32 host_buffer_descriptor_count;
  2849. struct sli4_bde host_buffer_descriptor[];
  2850. };
  2851. enum sli4_rqst_set_dump_flags {
  2852. SLI4_CMN_SET_DUMP_BUFFER_LEN = 0xffffff,
  2853. SLI4_CMN_SET_DUMP_FDB = 0x20000000,
  2854. SLI4_CMN_SET_DUMP_BLP = 0x40000000,
  2855. SLI4_CMN_SET_DUMP_QRY = 0x80000000,
  2856. };
  2857. struct sli4_rqst_cmn_set_dump_location {
  2858. struct sli4_rqst_hdr hdr;
  2859. __le32 buffer_length_dword;
  2860. __le32 buf_addr_low;
  2861. __le32 buf_addr_high;
  2862. };
  2863. struct sli4_rsp_cmn_set_dump_location {
  2864. struct sli4_rsp_hdr hdr;
  2865. __le32 buffer_length_dword;
  2866. };
  2867. enum sli4_dump_level {
  2868. SLI4_DUMP_LEVEL_NONE,
  2869. SLI4_CHIP_LEVEL_DUMP,
  2870. SLI4_FUNC_DESC_DUMP,
  2871. };
  2872. enum sli4_dump_state {
  2873. SLI4_DUMP_STATE_NONE,
  2874. SLI4_CHIP_DUMP_STATE_VALID,
  2875. SLI4_FUNC_DUMP_STATE_VALID,
  2876. };
  2877. enum sli4_dump_status {
  2878. SLI4_DUMP_READY_STATUS_NOT_READY,
  2879. SLI4_DUMP_READY_STATUS_DD_PRESENT,
  2880. SLI4_DUMP_READY_STATUS_FDB_PRESENT,
  2881. SLI4_DUMP_READY_STATUS_SKIP_DUMP,
  2882. SLI4_DUMP_READY_STATUS_FAILED = -1,
  2883. };
  2884. enum sli4_set_features {
  2885. SLI4_SET_FEATURES_DIF_SEED = 0x01,
  2886. SLI4_SET_FEATURES_XRI_TIMER = 0x03,
  2887. SLI4_SET_FEATURES_MAX_PCIE_SPEED = 0x04,
  2888. SLI4_SET_FEATURES_FCTL_CHECK = 0x05,
  2889. SLI4_SET_FEATURES_FEC = 0x06,
  2890. SLI4_SET_FEATURES_PCIE_RECV_DETECT = 0x07,
  2891. SLI4_SET_FEATURES_DIF_MEMORY_MODE = 0x08,
  2892. SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE = 0x09,
  2893. SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS = 0x0a,
  2894. SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI = 0x0c,
  2895. SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE = 0x0d,
  2896. SLI4_SET_FEATURES_SET_FTD_XFER_HINT = 0x0f,
  2897. SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK = 0x11,
  2898. };
  2899. struct sli4_rqst_cmn_set_features {
  2900. struct sli4_rqst_hdr hdr;
  2901. __le32 feature;
  2902. __le32 param_len;
  2903. __le32 params[8];
  2904. };
  2905. struct sli4_rqst_cmn_set_features_dif_seed {
  2906. __le16 seed;
  2907. __le16 rsvd16;
  2908. };
  2909. enum sli4_rqst_set_mrq_features {
  2910. SLI4_RQ_MULTIRQ_ISR = 0x1,
  2911. SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,
  2912. SLI4_RQ_MULTIRQ_NUM_RQS = 0xff,
  2913. SLI4_RQ_MULTIRQ_RQ_SELECT = 0xf00,
  2914. };
  2915. struct sli4_rqst_cmn_set_features_multirq {
  2916. __le32 auto_gen_xfer_dword;
  2917. __le32 num_rqs_dword;
  2918. };
  2919. enum sli4_rqst_health_check_flags {
  2920. SLI4_RQ_HEALTH_CHECK_ENABLE = 0x1,
  2921. SLI4_RQ_HEALTH_CHECK_QUERY = 0x2,
  2922. };
  2923. struct sli4_rqst_cmn_set_features_health_check {
  2924. __le32 health_check_dword;
  2925. };
  2926. struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
  2927. __le32 fdt_xfer_hint;
  2928. };
  2929. struct sli4_rqst_dmtf_exec_clp_cmd {
  2930. struct sli4_rqst_hdr hdr;
  2931. __le32 cmd_buf_length;
  2932. __le32 resp_buf_length;
  2933. __le32 cmd_buf_addr_low;
  2934. __le32 cmd_buf_addr_high;
  2935. __le32 resp_buf_addr_low;
  2936. __le32 resp_buf_addr_high;
  2937. };
  2938. struct sli4_rsp_dmtf_exec_clp_cmd {
  2939. struct sli4_rsp_hdr hdr;
  2940. __le32 rsvd4;
  2941. __le32 resp_length;
  2942. __le32 rsvd6;
  2943. __le32 rsvd7;
  2944. __le32 rsvd8;
  2945. __le32 rsvd9;
  2946. __le32 clp_status;
  2947. __le32 clp_detailed_status;
  2948. };
  2949. #define SLI4_PROTOCOL_FC 0x10
  2950. #define SLI4_PROTOCOL_DEFAULT 0xff
  2951. struct sli4_rspource_descriptor_v1 {
  2952. u8 descriptor_type;
  2953. u8 descriptor_length;
  2954. __le16 rsvd16;
  2955. __le32 type_specific[];
  2956. };
  2957. enum sli4_pcie_desc_flags {
  2958. SLI4_PCIE_DESC_IMM = 0x4000,
  2959. SLI4_PCIE_DESC_NOSV = 0x8000,
  2960. SLI4_PCIE_DESC_PF_NO = 0x3ff0000,
  2961. SLI4_PCIE_DESC_MISSN_ROLE = 0xff,
  2962. SLI4_PCIE_DESC_PCHG = 0x8000000,
  2963. SLI4_PCIE_DESC_SCHG = 0x10000000,
  2964. SLI4_PCIE_DESC_XCHG = 0x20000000,
  2965. SLI4_PCIE_DESC_XROM = 0xc0000000
  2966. };
  2967. struct sli4_pcie_resource_descriptor_v1 {
  2968. u8 descriptor_type;
  2969. u8 descriptor_length;
  2970. __le16 imm_nosv_dword;
  2971. __le32 pf_number_dword;
  2972. __le32 rsvd3;
  2973. u8 sriov_state;
  2974. u8 pf_state;
  2975. u8 pf_type;
  2976. u8 rsvd4;
  2977. __le16 number_of_vfs;
  2978. __le16 rsvd5;
  2979. __le32 mission_roles_dword;
  2980. __le32 rsvd7[16];
  2981. };
  2982. struct sli4_rqst_cmn_get_function_config {
  2983. struct sli4_rqst_hdr hdr;
  2984. };
  2985. struct sli4_rsp_cmn_get_function_config {
  2986. struct sli4_rsp_hdr hdr;
  2987. __le32 desc_count;
  2988. __le32 desc[54];
  2989. };
  2990. /* Link Config Descriptor for link config functions */
  2991. struct sli4_link_config_descriptor {
  2992. u8 link_config_id;
  2993. u8 rsvd1[3];
  2994. __le32 config_description[8];
  2995. };
  2996. #define MAX_LINK_DES 10
  2997. struct sli4_rqst_cmn_get_reconfig_link_info {
  2998. struct sli4_rqst_hdr hdr;
  2999. };
  3000. struct sli4_rsp_cmn_get_reconfig_link_info {
  3001. struct sli4_rsp_hdr hdr;
  3002. u8 active_link_config_id;
  3003. u8 rsvd17;
  3004. u8 next_link_config_id;
  3005. u8 rsvd19;
  3006. __le32 link_configuration_descriptor_count;
  3007. struct sli4_link_config_descriptor
  3008. desc[MAX_LINK_DES];
  3009. };
  3010. enum sli4_set_reconfig_link_flags {
  3011. SLI4_SET_RECONFIG_LINKID_NEXT = 0xff,
  3012. SLI4_SET_RECONFIG_LINKID_FD = 1u << 31,
  3013. };
  3014. struct sli4_rqst_cmn_set_reconfig_link_id {
  3015. struct sli4_rqst_hdr hdr;
  3016. __le32 dw4_flags;
  3017. };
  3018. struct sli4_rsp_cmn_set_reconfig_link_id {
  3019. struct sli4_rsp_hdr hdr;
  3020. };
  3021. struct sli4_rqst_lowlevel_set_watchdog {
  3022. struct sli4_rqst_hdr hdr;
  3023. __le16 watchdog_timeout;
  3024. __le16 rsvd18;
  3025. };
  3026. struct sli4_rsp_lowlevel_set_watchdog {
  3027. struct sli4_rsp_hdr hdr;
  3028. __le32 rsvd;
  3029. };
  3030. /* FC opcode (OPC) values */
  3031. enum sli4_fc_opcodes {
  3032. SLI4_OPC_WQ_CREATE = 0x1,
  3033. SLI4_OPC_WQ_DESTROY = 0x2,
  3034. SLI4_OPC_POST_SGL_PAGES = 0x3,
  3035. SLI4_OPC_RQ_CREATE = 0x5,
  3036. SLI4_OPC_RQ_DESTROY = 0x6,
  3037. SLI4_OPC_READ_FCF_TABLE = 0x8,
  3038. SLI4_OPC_POST_HDR_TEMPLATES = 0xb,
  3039. SLI4_OPC_REDISCOVER_FCF = 0x10,
  3040. };
  3041. /* Use the default CQ associated with the WQ */
  3042. #define SLI4_CQ_DEFAULT 0xffff
  3043. /*
  3044. * POST_SGL_PAGES
  3045. *
  3046. * Register the scatter gather list (SGL) memory and
  3047. * associate it with an XRI.
  3048. */
  3049. struct sli4_rqst_post_sgl_pages {
  3050. struct sli4_rqst_hdr hdr;
  3051. __le16 xri_start;
  3052. __le16 xri_count;
  3053. struct {
  3054. __le32 page0_low;
  3055. __le32 page0_high;
  3056. __le32 page1_low;
  3057. __le32 page1_high;
  3058. } page_set[10];
  3059. };
  3060. struct sli4_rsp_post_sgl_pages {
  3061. struct sli4_rsp_hdr hdr;
  3062. };
  3063. struct sli4_rqst_post_hdr_templates {
  3064. struct sli4_rqst_hdr hdr;
  3065. __le16 rpi_offset;
  3066. __le16 page_count;
  3067. struct sli4_dmaaddr page_descriptor[];
  3068. };
  3069. #define SLI4_HDR_TEMPLATE_SIZE 64
  3070. enum sli4_io_flags {
  3071. /* The XRI associated with this IO is already active */
  3072. SLI4_IO_CONTINUATION = 1 << 0,
  3073. /* Automatically generate a good RSP frame */
  3074. SLI4_IO_AUTO_GOOD_RESPONSE = 1 << 1,
  3075. SLI4_IO_NO_ABORT = 1 << 2,
  3076. /* Set the DNRX bit because no auto xref rdy buffer is posted */
  3077. SLI4_IO_DNRX = 1 << 3,
  3078. };
  3079. enum sli4_callback {
  3080. SLI4_CB_LINK,
  3081. SLI4_CB_MAX,
  3082. };
  3083. enum sli4_link_status {
  3084. SLI4_LINK_STATUS_UP,
  3085. SLI4_LINK_STATUS_DOWN,
  3086. SLI4_LINK_STATUS_NO_ALPA,
  3087. SLI4_LINK_STATUS_MAX,
  3088. };
  3089. enum sli4_link_topology {
  3090. SLI4_LINK_TOPO_NON_FC_AL = 1,
  3091. SLI4_LINK_TOPO_FC_AL,
  3092. SLI4_LINK_TOPO_LOOPBACK_INTERNAL,
  3093. SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,
  3094. SLI4_LINK_TOPO_NONE,
  3095. SLI4_LINK_TOPO_MAX,
  3096. };
  3097. enum sli4_link_medium {
  3098. SLI4_LINK_MEDIUM_ETHERNET,
  3099. SLI4_LINK_MEDIUM_FC,
  3100. SLI4_LINK_MEDIUM_MAX,
  3101. };
  3102. /******Driver specific structures******/
  3103. struct sli4_queue {
  3104. /* Common to all queue types */
  3105. struct efc_dma dma;
  3106. spinlock_t lock; /* Lock to protect the doorbell register
  3107. * writes and queue reads
  3108. */
  3109. u32 index; /* current host entry index */
  3110. u16 size; /* entry size */
  3111. u16 length; /* number of entries */
  3112. u16 n_posted; /* number entries posted for CQ, EQ */
  3113. u16 id; /* Port assigned xQ_ID */
  3114. u8 type; /* queue type ie EQ, CQ, ... */
  3115. void __iomem *db_regaddr; /* register address for the doorbell */
  3116. u16 phase; /* For if_type = 6, this value toggle
  3117. * for each iteration of the queue,
  3118. * a queue entry is valid when a cqe
  3119. * valid bit matches this value
  3120. */
  3121. u32 proc_limit; /* limit CQE processed per iteration */
  3122. u32 posted_limit; /* CQE/EQE process before ring db */
  3123. u32 max_num_processed;
  3124. u64 max_process_time;
  3125. union {
  3126. u32 r_idx; /* "read" index (MQ only) */
  3127. u32 flag;
  3128. } u;
  3129. };
  3130. /* Parameters used to populate WQE*/
  3131. struct sli_bls_params {
  3132. u32 s_id;
  3133. u32 d_id;
  3134. u16 ox_id;
  3135. u16 rx_id;
  3136. u32 rpi;
  3137. u32 vpi;
  3138. bool rpi_registered;
  3139. u8 payload[12];
  3140. u16 xri;
  3141. u16 tag;
  3142. };
  3143. struct sli_els_params {
  3144. u32 s_id;
  3145. u32 d_id;
  3146. u16 ox_id;
  3147. u32 rpi;
  3148. u32 vpi;
  3149. bool rpi_registered;
  3150. u32 xmit_len;
  3151. u32 rsp_len;
  3152. u8 timeout;
  3153. u8 cmd;
  3154. u16 xri;
  3155. u16 tag;
  3156. };
  3157. struct sli_ct_params {
  3158. u8 r_ctl;
  3159. u8 type;
  3160. u8 df_ctl;
  3161. u8 timeout;
  3162. u16 ox_id;
  3163. u32 d_id;
  3164. u32 rpi;
  3165. u32 vpi;
  3166. bool rpi_registered;
  3167. u32 xmit_len;
  3168. u32 rsp_len;
  3169. u16 xri;
  3170. u16 tag;
  3171. };
  3172. struct sli_fcp_tgt_params {
  3173. u32 s_id;
  3174. u32 d_id;
  3175. u32 rpi;
  3176. u32 vpi;
  3177. u32 offset;
  3178. u16 ox_id;
  3179. u16 flags;
  3180. u8 cs_ctl;
  3181. u8 timeout;
  3182. u32 app_id;
  3183. u32 xmit_len;
  3184. u16 xri;
  3185. u16 tag;
  3186. };
  3187. struct sli4_link_event {
  3188. enum sli4_link_status status;
  3189. enum sli4_link_topology topology;
  3190. enum sli4_link_medium medium;
  3191. u32 speed;
  3192. u8 *loop_map;
  3193. u32 fc_id;
  3194. };
  3195. enum sli4_resource {
  3196. SLI4_RSRC_VFI,
  3197. SLI4_RSRC_VPI,
  3198. SLI4_RSRC_RPI,
  3199. SLI4_RSRC_XRI,
  3200. SLI4_RSRC_FCFI,
  3201. SLI4_RSRC_MAX,
  3202. };
  3203. struct sli4_extent {
  3204. u32 number;
  3205. u32 size;
  3206. u32 n_alloc;
  3207. u32 *base;
  3208. unsigned long *use_map;
  3209. u32 map_size;
  3210. };
  3211. struct sli4_queue_info {
  3212. u16 max_qcount[SLI4_QTYPE_MAX];
  3213. u32 max_qentries[SLI4_QTYPE_MAX];
  3214. u16 count_mask[SLI4_QTYPE_MAX];
  3215. u16 count_method[SLI4_QTYPE_MAX];
  3216. u32 qpage_count[SLI4_QTYPE_MAX];
  3217. };
  3218. struct sli4_params {
  3219. u8 has_extents;
  3220. u8 auto_reg;
  3221. u8 auto_xfer_rdy;
  3222. u8 hdr_template_req;
  3223. u8 perf_hint;
  3224. u8 perf_wq_id_association;
  3225. u8 cq_create_version;
  3226. u8 mq_create_version;
  3227. u8 high_login_mode;
  3228. u8 sgl_pre_registered;
  3229. u8 sgl_pre_reg_required;
  3230. u8 t10_dif_inline_capable;
  3231. u8 t10_dif_separate_capable;
  3232. };
  3233. struct sli4 {
  3234. void *os;
  3235. struct pci_dev *pci;
  3236. void __iomem *reg[PCI_STD_NUM_BARS];
  3237. u32 sli_rev;
  3238. u32 sli_family;
  3239. u32 if_type;
  3240. u16 asic_type;
  3241. u16 asic_rev;
  3242. u16 e_d_tov;
  3243. u16 r_a_tov;
  3244. struct sli4_queue_info qinfo;
  3245. u16 link_module_type;
  3246. u8 rq_batch;
  3247. u8 port_number;
  3248. char port_name[2];
  3249. u16 rq_min_buf_size;
  3250. u32 rq_max_buf_size;
  3251. u8 topology;
  3252. u8 wwpn[8];
  3253. u8 wwnn[8];
  3254. u32 fw_rev[2];
  3255. u8 fw_name[2][16];
  3256. char ipl_name[16];
  3257. u32 hw_rev[3];
  3258. char modeldesc[64];
  3259. char bios_version_string[32];
  3260. u32 wqe_size;
  3261. u32 vpd_length;
  3262. /*
  3263. * Tracks the port resources using extents metaphor. For
  3264. * devices that don't implement extents (i.e.
  3265. * has_extents == FALSE), the code models each resource as
  3266. * a single large extent.
  3267. */
  3268. struct sli4_extent ext[SLI4_RSRC_MAX];
  3269. u32 features;
  3270. struct sli4_params params;
  3271. u32 sge_supported_length;
  3272. u32 sgl_page_sizes;
  3273. u32 max_sgl_pages;
  3274. /*
  3275. * Callback functions
  3276. */
  3277. int (*link)(void *ctx, void *event);
  3278. void *link_arg;
  3279. struct efc_dma bmbx;
  3280. /* Save pointer to physical memory descriptor for non-embedded
  3281. * SLI_CONFIG commands for BMBX dumping purposes
  3282. */
  3283. struct efc_dma *bmbx_non_emb_pmd;
  3284. struct efc_dma vpd_data;
  3285. };
  3286. static inline void
  3287. sli_cmd_fill_hdr(struct sli4_rqst_hdr *hdr, u8 opc, u8 sub, u32 ver, __le32 len)
  3288. {
  3289. hdr->opcode = opc;
  3290. hdr->subsystem = sub;
  3291. hdr->dw3_version = cpu_to_le32(ver);
  3292. hdr->request_length = len;
  3293. }
  3294. /**
  3295. * Get / set parameter functions
  3296. */
  3297. static inline u32
  3298. sli_get_max_sge(struct sli4 *sli4)
  3299. {
  3300. return sli4->sge_supported_length;
  3301. }
  3302. static inline u32
  3303. sli_get_max_sgl(struct sli4 *sli4)
  3304. {
  3305. if (sli4->sgl_page_sizes != 1) {
  3306. efc_log_err(sli4, "unsupported SGL page sizes %#x\n",
  3307. sli4->sgl_page_sizes);
  3308. return 0;
  3309. }
  3310. return (sli4->max_sgl_pages * SLI_PAGE_SIZE) / sizeof(struct sli4_sge);
  3311. }
  3312. static inline enum sli4_link_medium
  3313. sli_get_medium(struct sli4 *sli4)
  3314. {
  3315. switch (sli4->topology) {
  3316. case SLI4_READ_CFG_TOPO_FC:
  3317. case SLI4_READ_CFG_TOPO_FC_AL:
  3318. case SLI4_READ_CFG_TOPO_NON_FC_AL:
  3319. return SLI4_LINK_MEDIUM_FC;
  3320. default:
  3321. return SLI4_LINK_MEDIUM_MAX;
  3322. }
  3323. }
  3324. static inline u32
  3325. sli_get_lmt(struct sli4 *sli4)
  3326. {
  3327. return sli4->link_module_type;
  3328. }
  3329. static inline int
  3330. sli_set_topology(struct sli4 *sli4, u32 value)
  3331. {
  3332. int rc = 0;
  3333. switch (value) {
  3334. case SLI4_READ_CFG_TOPO_FC:
  3335. case SLI4_READ_CFG_TOPO_FC_AL:
  3336. case SLI4_READ_CFG_TOPO_NON_FC_AL:
  3337. sli4->topology = value;
  3338. break;
  3339. default:
  3340. efc_log_err(sli4, "unsupported topology %#x\n", value);
  3341. rc = -1;
  3342. }
  3343. return rc;
  3344. }
  3345. static inline u32
  3346. sli_convert_mask_to_count(u32 method, u32 mask)
  3347. {
  3348. u32 count = 0;
  3349. if (method) {
  3350. count = 1 << (31 - __builtin_clz(mask));
  3351. count *= 16;
  3352. } else {
  3353. count = mask;
  3354. }
  3355. return count;
  3356. }
  3357. static inline u32
  3358. sli_reg_read_status(struct sli4 *sli)
  3359. {
  3360. return readl(sli->reg[0] + SLI4_PORT_STATUS_REGOFF);
  3361. }
  3362. static inline int
  3363. sli_fw_error_status(struct sli4 *sli4)
  3364. {
  3365. return (sli_reg_read_status(sli4) & SLI4_PORT_STATUS_ERR) ? 1 : 0;
  3366. }
  3367. static inline u32
  3368. sli_reg_read_err1(struct sli4 *sli)
  3369. {
  3370. return readl(sli->reg[0] + SLI4_PORT_ERROR1);
  3371. }
  3372. static inline u32
  3373. sli_reg_read_err2(struct sli4 *sli)
  3374. {
  3375. return readl(sli->reg[0] + SLI4_PORT_ERROR2);
  3376. }
  3377. static inline int
  3378. sli_fc_rqe_length(struct sli4 *sli4, void *cqe, u32 *len_hdr,
  3379. u32 *len_data)
  3380. {
  3381. struct sli4_fc_async_rcqe *rcqe = cqe;
  3382. *len_hdr = *len_data = 0;
  3383. if (rcqe->status == SLI4_FC_ASYNC_RQ_SUCCESS) {
  3384. *len_hdr = rcqe->hdpl_byte & SLI4_RACQE_HDPL;
  3385. *len_data = le16_to_cpu(rcqe->data_placement_length);
  3386. return 0;
  3387. } else {
  3388. return -1;
  3389. }
  3390. }
  3391. static inline u8
  3392. sli_fc_rqe_fcfi(struct sli4 *sli4, void *cqe)
  3393. {
  3394. u8 code = ((u8 *)cqe)[SLI4_CQE_CODE_OFFSET];
  3395. u8 fcfi = U8_MAX;
  3396. switch (code) {
  3397. case SLI4_CQE_CODE_RQ_ASYNC: {
  3398. struct sli4_fc_async_rcqe *rcqe = cqe;
  3399. fcfi = le16_to_cpu(rcqe->fcfi_rq_id_word) & SLI4_RACQE_FCFI;
  3400. break;
  3401. }
  3402. case SLI4_CQE_CODE_RQ_ASYNC_V1: {
  3403. struct sli4_fc_async_rcqe_v1 *rcqev1 = cqe;
  3404. fcfi = rcqev1->fcfi_byte & SLI4_RACQE_FCFI;
  3405. break;
  3406. }
  3407. case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
  3408. struct sli4_fc_optimized_write_cmd_cqe *opt_wr = cqe;
  3409. fcfi = opt_wr->flags0 & SLI4_OCQE_FCFI;
  3410. break;
  3411. }
  3412. }
  3413. return fcfi;
  3414. }
  3415. /****************************************************************************
  3416. * Function prototypes
  3417. */
  3418. int
  3419. sli_cmd_config_link(struct sli4 *sli4, void *buf);
  3420. int
  3421. sli_cmd_down_link(struct sli4 *sli4, void *buf);
  3422. int
  3423. sli_cmd_dump_type4(struct sli4 *sli4, void *buf, u16 wki);
  3424. int
  3425. sli_cmd_common_read_transceiver_data(struct sli4 *sli4, void *buf,
  3426. u32 page_num, struct efc_dma *dma);
  3427. int
  3428. sli_cmd_read_link_stats(struct sli4 *sli4, void *buf, u8 req_stats,
  3429. u8 clear_overflow_flags, u8 clear_all_counters);
  3430. int
  3431. sli_cmd_read_status(struct sli4 *sli4, void *buf, u8 clear);
  3432. int
  3433. sli_cmd_init_link(struct sli4 *sli4, void *buf, u32 speed,
  3434. u8 reset_alpa);
  3435. int
  3436. sli_cmd_init_vfi(struct sli4 *sli4, void *buf, u16 vfi, u16 fcfi,
  3437. u16 vpi);
  3438. int
  3439. sli_cmd_init_vpi(struct sli4 *sli4, void *buf, u16 vpi, u16 vfi);
  3440. int
  3441. sli_cmd_post_xri(struct sli4 *sli4, void *buf, u16 base, u16 cnt);
  3442. int
  3443. sli_cmd_release_xri(struct sli4 *sli4, void *buf, u8 num_xri);
  3444. int
  3445. sli_cmd_read_sparm64(struct sli4 *sli4, void *buf,
  3446. struct efc_dma *dma, u16 vpi);
  3447. int
  3448. sli_cmd_read_topology(struct sli4 *sli4, void *buf, struct efc_dma *dma);
  3449. int
  3450. sli_cmd_read_nvparms(struct sli4 *sli4, void *buf);
  3451. int
  3452. sli_cmd_write_nvparms(struct sli4 *sli4, void *buf, u8 *wwpn,
  3453. u8 *wwnn, u8 hard_alpa, u32 preferred_d_id);
  3454. int
  3455. sli_cmd_reg_fcfi(struct sli4 *sli4, void *buf, u16 index,
  3456. struct sli4_cmd_rq_cfg *rq_cfg);
  3457. int
  3458. sli_cmd_reg_fcfi_mrq(struct sli4 *sli4, void *buf, u8 mode, u16 index,
  3459. u8 rq_selection_policy, u8 mrq_bit_mask, u16 num_mrqs,
  3460. struct sli4_cmd_rq_cfg *rq_cfg);
  3461. int
  3462. sli_cmd_reg_rpi(struct sli4 *sli4, void *buf, u32 rpi, u32 vpi, u32 fc_id,
  3463. struct efc_dma *dma, u8 update, u8 enable_t10_pi);
  3464. int
  3465. sli_cmd_unreg_fcfi(struct sli4 *sli4, void *buf, u16 indicator);
  3466. int
  3467. sli_cmd_unreg_rpi(struct sli4 *sli4, void *buf, u16 indicator,
  3468. enum sli4_resource which, u32 fc_id);
  3469. int
  3470. sli_cmd_reg_vpi(struct sli4 *sli4, void *buf, u32 fc_id,
  3471. __be64 sli_wwpn, u16 vpi, u16 vfi, bool update);
  3472. int
  3473. sli_cmd_reg_vfi(struct sli4 *sli4, void *buf, size_t size,
  3474. u16 vfi, u16 fcfi, struct efc_dma dma,
  3475. u16 vpi, __be64 sli_wwpn, u32 fc_id);
  3476. int
  3477. sli_cmd_unreg_vpi(struct sli4 *sli4, void *buf, u16 id, u32 type);
  3478. int
  3479. sli_cmd_unreg_vfi(struct sli4 *sli4, void *buf, u16 idx, u32 type);
  3480. int
  3481. sli_cmd_common_nop(struct sli4 *sli4, void *buf, uint64_t context);
  3482. int
  3483. sli_cmd_common_get_resource_extent_info(struct sli4 *sli4, void *buf,
  3484. u16 rtype);
  3485. int
  3486. sli_cmd_common_get_sli4_parameters(struct sli4 *sli4, void *buf);
  3487. int
  3488. sli_cmd_common_write_object(struct sli4 *sli4, void *buf, u16 noc,
  3489. u16 eof, u32 len, u32 offset, char *name, struct efc_dma *dma);
  3490. int
  3491. sli_cmd_common_delete_object(struct sli4 *sli4, void *buf, char *object_name);
  3492. int
  3493. sli_cmd_common_read_object(struct sli4 *sli4, void *buf,
  3494. u32 length, u32 offset, char *name, struct efc_dma *dma);
  3495. int
  3496. sli_cmd_dmtf_exec_clp_cmd(struct sli4 *sli4, void *buf,
  3497. struct efc_dma *cmd, struct efc_dma *resp);
  3498. int
  3499. sli_cmd_common_set_dump_location(struct sli4 *sli4, void *buf,
  3500. bool query, bool is_buffer_list, struct efc_dma *dma, u8 fdb);
  3501. int
  3502. sli_cmd_common_set_features(struct sli4 *sli4, void *buf,
  3503. u32 feature, u32 param_len, void *parameter);
  3504. int sli_cqe_mq(struct sli4 *sli4, void *buf);
  3505. int sli_cqe_async(struct sli4 *sli4, void *buf);
  3506. int
  3507. sli_setup(struct sli4 *sli4, void *os, struct pci_dev *pdev, void __iomem *r[]);
  3508. void sli_calc_max_qentries(struct sli4 *sli4);
  3509. int sli_init(struct sli4 *sli4);
  3510. int sli_reset(struct sli4 *sli4);
  3511. int sli_fw_reset(struct sli4 *sli4);
  3512. void sli_teardown(struct sli4 *sli4);
  3513. int
  3514. sli_callback(struct sli4 *sli4, enum sli4_callback cb, void *func, void *arg);
  3515. int
  3516. sli_bmbx_command(struct sli4 *sli4);
  3517. int
  3518. __sli_queue_init(struct sli4 *sli4, struct sli4_queue *q, u32 qtype,
  3519. size_t size, u32 n_entries, u32 align);
  3520. int
  3521. __sli_create_queue(struct sli4 *sli4, struct sli4_queue *q);
  3522. int
  3523. sli_eq_modify_delay(struct sli4 *sli4, struct sli4_queue *eq, u32 num_eq,
  3524. u32 shift, u32 delay_mult);
  3525. int
  3526. sli_queue_alloc(struct sli4 *sli4, u32 qtype, struct sli4_queue *q,
  3527. u32 n_entries, struct sli4_queue *assoc);
  3528. int
  3529. sli_cq_alloc_set(struct sli4 *sli4, struct sli4_queue *qs[], u32 num_cqs,
  3530. u32 n_entries, struct sli4_queue *eqs[]);
  3531. int
  3532. sli_get_queue_entry_size(struct sli4 *sli4, u32 qtype);
  3533. int
  3534. sli_queue_free(struct sli4 *sli4, struct sli4_queue *q, u32 destroy_queues,
  3535. u32 free_memory);
  3536. int
  3537. sli_queue_eq_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
  3538. int
  3539. sli_queue_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
  3540. int
  3541. sli_wq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3542. int
  3543. sli_mq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3544. int
  3545. sli_rq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3546. int
  3547. sli_eq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3548. int
  3549. sli_cq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3550. int
  3551. sli_mq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
  3552. int
  3553. sli_resource_alloc(struct sli4 *sli4, enum sli4_resource rtype, u32 *rid,
  3554. u32 *index);
  3555. int
  3556. sli_resource_free(struct sli4 *sli4, enum sli4_resource rtype, u32 rid);
  3557. int
  3558. sli_resource_reset(struct sli4 *sli4, enum sli4_resource rtype);
  3559. int
  3560. sli_eq_parse(struct sli4 *sli4, u8 *buf, u16 *cq_id);
  3561. int
  3562. sli_cq_parse(struct sli4 *sli4, struct sli4_queue *cq, u8 *cqe,
  3563. enum sli4_qentry *etype, u16 *q_id);
  3564. int sli_raise_ue(struct sli4 *sli4, u8 dump);
  3565. int sli_dump_is_ready(struct sli4 *sli4);
  3566. bool sli_reset_required(struct sli4 *sli4);
  3567. bool sli_fw_ready(struct sli4 *sli4);
  3568. int
  3569. sli_fc_process_link_attention(struct sli4 *sli4, void *acqe);
  3570. int
  3571. sli_fc_cqe_parse(struct sli4 *sli4, struct sli4_queue *cq,
  3572. u8 *cqe, enum sli4_qentry *etype,
  3573. u16 *rid);
  3574. u32 sli_fc_response_length(struct sli4 *sli4, u8 *cqe);
  3575. u32 sli_fc_io_length(struct sli4 *sli4, u8 *cqe);
  3576. int sli_fc_els_did(struct sli4 *sli4, u8 *cqe, u32 *d_id);
  3577. u32 sli_fc_ext_status(struct sli4 *sli4, u8 *cqe);
  3578. int
  3579. sli_fc_rqe_rqid_and_index(struct sli4 *sli4, u8 *cqe, u16 *rq_id, u32 *index);
  3580. int
  3581. sli_cmd_wq_create(struct sli4 *sli4, void *buf,
  3582. struct efc_dma *qmem, u16 cq_id);
  3583. int sli_cmd_post_sgl_pages(struct sli4 *sli4, void *buf, u16 xri,
  3584. u32 xri_count, struct efc_dma *page0[], struct efc_dma *page1[],
  3585. struct efc_dma *dma);
  3586. int
  3587. sli_cmd_post_hdr_templates(struct sli4 *sli4, void *buf,
  3588. struct efc_dma *dma, u16 rpi, struct efc_dma *payload_dma);
  3589. int
  3590. sli_fc_rq_alloc(struct sli4 *sli4, struct sli4_queue *q, u32 n_entries,
  3591. u32 buffer_size, struct sli4_queue *cq, bool is_hdr);
  3592. int
  3593. sli_fc_rq_set_alloc(struct sli4 *sli4, u32 num_rq_pairs, struct sli4_queue *q[],
  3594. u32 base_cq_id, u32 num, u32 hdr_buf_size, u32 data_buf_size);
  3595. u32 sli_fc_get_rpi_requirements(struct sli4 *sli4, u32 n_rpi);
  3596. int
  3597. sli_abort_wqe(struct sli4 *sli4, void *buf, enum sli4_abort_type type,
  3598. bool send_abts, u32 ids, u32 mask, u16 tag, u16 cq_id);
  3599. int
  3600. sli_send_frame_wqe(struct sli4 *sli4, void *buf, u8 sof, u8 eof,
  3601. u32 *hdr, struct efc_dma *payload, u32 req_len, u8 timeout,
  3602. u16 xri, u16 req_tag);
  3603. int
  3604. sli_xmit_els_rsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *rsp,
  3605. struct sli_els_params *params);
  3606. int
  3607. sli_els_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3608. struct sli_els_params *params);
  3609. int
  3610. sli_fcp_icmnd64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl, u16 xri,
  3611. u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 timeout);
  3612. int
  3613. sli_fcp_iread64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3614. u32 first_data_sge, u32 xfer_len, u16 xri,
  3615. u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 dif, u8 bs,
  3616. u8 timeout);
  3617. int
  3618. sli_fcp_iwrite64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3619. u32 first_data_sge, u32 xfer_len,
  3620. u32 first_burst, u16 xri, u16 tag, u16 cq_id, u32 rpi,
  3621. u32 rnode_fcid, u8 dif, u8 bs, u8 timeout);
  3622. int
  3623. sli_fcp_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
  3624. u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
  3625. struct sli_fcp_tgt_params *params);
  3626. int
  3627. sli_fcp_cont_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
  3628. u32 first_data_sge, u16 sec_xri, u16 cq_id, u8 dif,
  3629. u8 bs, struct sli_fcp_tgt_params *params);
  3630. int
  3631. sli_fcp_trsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3632. u16 cq_id, u8 port_owned, struct sli_fcp_tgt_params *params);
  3633. int
  3634. sli_fcp_tsend64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3635. u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
  3636. struct sli_fcp_tgt_params *params);
  3637. int
  3638. sli_gen_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
  3639. struct sli_ct_params *params);
  3640. int
  3641. sli_xmit_bls_rsp64_wqe(struct sli4 *sli4, void *buf,
  3642. struct sli_bls_payload *payload, struct sli_bls_params *params);
  3643. int
  3644. sli_xmit_sequence64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *payload,
  3645. struct sli_ct_params *params);
  3646. int
  3647. sli_requeue_xri_wqe(struct sli4 *sli4, void *buf, u16 xri, u16 tag, u16 cq_id);
  3648. void
  3649. sli4_cmd_lowlevel_set_watchdog(struct sli4 *sli4, void *buf, size_t size,
  3650. u16 timeout);
  3651. const char *sli_fc_get_status_string(u32 status);
  3652. #endif /* !_SLI4_H */